Changeset 3310697
- Timestamp:
- 06/12/2025 07:47:50 PM (10 months ago)
- Location:
- bin-tracker-online
- Files:
-
- 8 edited
- 10 copied
-
tags/1.2.8 (copied) (copied from bin-tracker-online/trunk)
-
tags/1.2.8/bin-tracker-online.php (copied) (copied from bin-tracker-online/trunk/bin-tracker-online.php) (1 diff)
-
tags/1.2.8/includes/base/activate.php (copied) (copied from bin-tracker-online/trunk/includes/base/activate.php)
-
tags/1.2.8/includes/base/ajax-control.php (copied) (copied from bin-tracker-online/trunk/includes/base/ajax-control.php)
-
tags/1.2.8/includes/base/enqueue.php (modified) (1 diff)
-
tags/1.2.8/includes/base/server-calls.php (copied) (copied from bin-tracker-online/trunk/includes/base/server-calls.php)
-
tags/1.2.8/javascript/address-validation-script.js (modified) (10 diffs)
-
tags/1.2.8/javascript/front-house-script.js (copied) (copied from bin-tracker-online/trunk/javascript/front-house-script.js)
-
tags/1.2.8/readme.txt (copied) (copied from bin-tracker-online/trunk/readme.txt) (1 diff)
-
tags/1.2.8/styles/front-house-styles.css (copied) (copied from bin-tracker-online/trunk/styles/front-house-styles.css)
-
tags/1.2.8/templates/front-house-step-one-template.php (modified) (1 diff)
-
tags/1.2.8/templates/front-house-step-three-template.php (copied) (copied from bin-tracker-online/trunk/templates/front-house-step-three-template.php)
-
tags/1.2.8/uninstall.php (copied) (copied from bin-tracker-online/trunk/uninstall.php)
-
trunk/bin-tracker-online.php (modified) (1 diff)
-
trunk/includes/base/enqueue.php (modified) (1 diff)
-
trunk/javascript/address-validation-script.js (modified) (10 diffs)
-
trunk/readme.txt (modified) (1 diff)
-
trunk/templates/front-house-step-one-template.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
bin-tracker-online/tags/1.2.8/bin-tracker-online.php
r3292696 r3310697 8 8 Plugin URI: https://www.bintracker.software/api/word-press-plugin.html 9 9 Description: The plug in provides integration with a private web application for Bin their Dump That, a franchisor in the waste hauling industry 10 Version: 1.2. 710 Version: 1.2.8 11 11 Author: Cairn Applications Inc 12 12 Author URI: https://www.cloud-computing.rocks/ -
bin-tracker-online/tags/1.2.8/includes/base/enqueue.php
r3105698 r3310697 41 41 42 42 //google places api, provides a service. 43 wp_enqueue_script('b1nT-google-maps', "https://maps.googleapis.com/maps/api/js?key=$b1nT_google_api_key&l ibraries=places", '', '', 'all');43 wp_enqueue_script('b1nT-google-maps', "https://maps.googleapis.com/maps/api/js?key=$b1nT_google_api_key&loading=async&&libraries=places", '', '', 'all'); 44 44 45 45 //localize -
bin-tracker-online/tags/1.2.8/javascript/address-validation-script.js
r3105698 r3310697 2 2 var b1nT_address_data = this; 3 3 b1nT_address_data.config = b1nT_arg_config; 4 var b1nT_place_auto_complete; 5 6 this._b1nT_init = function() { 7 //setup google places address autocomplete 8 var b1nT_search = b1nT_address_data.config.searchCtrl; 9 b1nT_place_auto_complete = new google.maps.places.Autocomplete( 4 5 this._b1nT_init = async function() { 6 let b1nT_waitForGoogle = async function() { 7 return new Promise(function(b1nT_resolve) { 8 async function b1nT_isItReady() { 9 if(typeof(google.maps.places) !== "undefined") { 10 try { //make a call to make sure the api is included in the key. 11 //this call is not included in billing because the get details never 12 //never gets called. 13 const b1nT_token = new google.maps.places.AutocompleteSessionToken(); 14 const b1nT_suggestions = await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions({ 15 sessionToken: b1nT_token, 16 input: "588", 17 language: "en-US", 18 includedRegionCodes: ["us", "ca"] 19 }); 20 } catch(e) { 21 b1nT_resolve(1); 22 } 23 b1nT_resolve(0); 24 } else { 25 setTimeout(b1nT_isItReady, 50); 26 } 27 } 28 b1nT_isItReady(); 29 }); 30 }; 31 32 let b1nT_legacy_check = await b1nT_waitForGoogle(); 33 34 if(b1nT_legacy_check) { 35 b1nT_address_data._b1nT_init_legacy(); 36 return; 37 } 38 39 let b1nT_address_suggestion_wrap = document.createElement("div"); 40 b1nT_address_suggestion_wrap.style.maxHeight = "300px"; 41 b1nT_address_suggestion_wrap.style.overflowY = "auto"; 42 b1nT_address_suggestion_wrap.style.position = "absolute"; 43 b1nT_address_suggestion_wrap.style.marginTop = "1px"; 44 b1nT_address_suggestion_wrap.style.marginLeft = "1px"; 45 b1nT_address_suggestion_wrap.style.borderRadius = "1px"; 46 b1nT_address_suggestion_wrap.style.width = b1nT_address_data.config.searchCtrl.clientWidth+"px"; 47 b1nT_address_data.address_suggestion_wrap = b1nT_address_suggestion_wrap; 48 b1nT_address_data.config.searchCtrl.after(b1nT_address_suggestion_wrap); 49 50 //setup event listensers on fields 51 b1nT_address_data.config.searchCtrl.addEventListener("keyup", function(b1nT_e) { 52 clearTimeout(b1nT_address_data.searchTimeOut); 53 b1nT_address_data.searchTimeOut = setTimeout(function() { 54 if(!String(b1nT_address_data.config.searchCtrl.value).trim()) { return; } 55 56 //if we are using the search bar to act as the address bar aswell. then trigger the address changed 57 if(b1nT_address_data.config.addressCtrl && (b1nT_address_data.config.addressCtrl == b1nT_address_data.config.searchCtrl)) { 58 b1nT_address_data._b1nT_address_changed(); 59 } 60 61 b1nT_address_data._b1nT_get_suggestions(b1nT_address_data.config.searchCtrl.value); 62 }, 500); 63 }); 64 65 b1nT_address_data.config.searchCtrl.addEventListener("focus", function(b1nT_e) { 66 clearTimeout(b1nT_address_data.searchTimeOut); 67 b1nT_address_data.searchTimeOut = setTimeout(function() { 68 if(!String(b1nT_address_data.config.searchCtrl.value).trim()) { return; } 69 b1nT_address_data._b1nT_get_suggestions(b1nT_address_data.config.searchCtrl.value); 70 }, 500); 71 }); 72 73 b1nT_address_data.config.searchCtrl.addEventListener("blur", function(b1nT_e) { 74 clearTimeout(b1nT_address_data.blurTimeOut); 75 b1nT_address_data.blurTimeOut = setTimeout(function() { 76 b1nT_address_data.address_suggestion_wrap.innerHTML = ""; 77 }, 500); 78 }); 79 80 //if we are not using the search bar to act as the address bar, then set an onchange handler. Otherwise skip it 81 if(b1nT_address_data.config.addressCtrl && (b1nT_address_data.config.addressCtrl != b1nT_address_data.config.searchCtrl)) { 82 b1nT_address_data.config.addressCtrl = b1nT_address_data._b1nT_address_changed; 83 } 84 85 b1nT_address_data.config.cityCtrl.onchange = b1nT_address_data._b1nT_address_changed; 86 b1nT_address_data.config.stateCtrl.onchange = b1nT_address_data._b1nT_address_changed; 87 b1nT_address_data.config.postalCtrl.onchange = b1nT_address_data._b1nT_address_changed; 88 }; 89 90 this._b1nT_init_legacy = function() { 91 let b1nT_search = b1nT_address_data.config.searchCtrl; 92 let b1nT_place_auto_complete = new google.maps.places.Autocomplete( 10 93 b1nT_search, { 11 94 fields: ['geometry', 'address_component', 'type'] … … 13 96 ); 14 97 15 varb1nT_call_back = function () {16 b1nT_address_data._b1nT_fill_in_address ();17 } 18 19 b1nT_place_auto_complete.addListener( 'place_changed', b1nT_call_back);20 b1nT_address_data.placeautocomplete = b1nT_place_auto_complete;98 let b1nT_call_back = function () { 99 b1nT_address_data._b1nT_fill_in_address_legacy(); 100 } 101 102 b1nT_place_auto_complete.addListener('place_changed', b1nT_call_back); 103 b1nT_address_data.placeautocomplete_legacy = b1nT_place_auto_complete; 21 104 22 105 //limit the counties to usa and canada … … 26 109 27 110 //setup event listensers on fields 28 b1nT_address_data.config.addressCtrl.onchange = b1nT_address_data._b1nT_address_changed; 29 b1nT_address_data.config.cityCtrl.onchange = b1nT_address_data._b1nT_address_changed; 30 b1nT_address_data.config.stateCtrl.onchange = b1nT_address_data._b1nT_address_changed; 31 b1nT_address_data.config.postalCtrl.onchange = b1nT_address_data._b1nT_address_changed; 32 }; 33 34 this._b1nT_fill_in_address = function () { 35 var b1nT_place = b1nT_address_data.placeautocomplete.getPlace(); 111 b1nT_address_data.config.addressCtrl.onchange = function() { b1nT_address_data._b1nT_address_changed(1); } 112 b1nT_address_data.config.cityCtrl.onchange = function() { b1nT_address_data._b1nT_address_changed(1); } 113 b1nT_address_data.config.stateCtrl.onchange = function() { b1nT_address_data._b1nT_address_changed(1); } 114 b1nT_address_data.config.postalCtrl.onchange = function() { b1nT_address_data._b1nT_address_changed(1); } 115 } 116 117 this._b1nT_get_suggestions = async function(b1nT_v) { 118 //creating a new session if it does not exist. 119 const b1nT_token = b1nT_address_data.token_session ? b1nT_address_data.token_session : new google.maps.places.AutocompleteSessionToken(); 120 b1nT_address_data.token_session = b1nT_token; 121 122 let b1nT_options = { 123 sessionToken: b1nT_token, 124 input: b1nT_v, 125 language: "en-US", 126 includedRegionCodes: ["us", "ca"] 127 }; 128 129 const b1nT_suggestions = await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions(b1nT_options); 130 const b1nT_suggestions_array = b1nT_suggestions.suggestions; 131 132 b1nT_address_data.address_suggestion_wrap.innerHTML = ""; 133 let b1nT_address_suggestion_wrap = document.createElement("div"); 134 b1nT_address_suggestion_wrap.style.border = "1px solid #d1cfcf"; 135 136 b1nT_suggestions_array.forEach(function(b1nT_suggestion, b1nT_index) { 137 const b1nT_place_prediction = b1nT_suggestion.placePrediction; 138 let b1nT_input_wrap = document.createElement("div"); 139 let b1nT_input = document.createElement("input"); 140 b1nT_input.setAttribute("type", "text"); 141 b1nT_input.style.width = "100%"; 142 b1nT_input.style.border = "0px"; 143 b1nT_input.style.padding = "10px"; 144 b1nT_input.style.cursor = "pointer"; 145 b1nT_input.style.color = "#000000"; 146 147 if(b1nT_index < b1nT_suggestions_array.length) { 148 b1nT_input.style.borderBottom = "1px solid #d1cfcf"; 149 } 150 151 b1nT_input.readOnly = true; 152 b1nT_input.value = b1nT_place_prediction.text.toString(); 153 154 b1nT_input.onmouseover = function() { 155 this.style.color = "#0174ab"; 156 this.style.backgroundColor = "#dddddd"; 157 }; 158 b1nT_input.onmouseout = function() { 159 this.style.removeProperty("color"); 160 this.style.removeProperty("background-color"); 161 } 162 b1nT_input.onclick = function() { 163 clearTimeout(b1nT_address_data.blurTimeOut); 164 clearTimeout(b1nT_address_data.searchTimeOut); 165 b1nT_address_data._b1nT_fill_in_address(b1nT_place_prediction); 166 b1nT_address_data.address_suggestion_wrap.innerHTML = ""; 167 } 168 169 b1nT_input_wrap.appendChild(b1nT_input); 170 b1nT_address_suggestion_wrap.appendChild(b1nT_input_wrap); 171 }); 172 173 let b1nT_powered_by_wrap = document.createElement("div"); 174 let b1nT_powered_by = document.createElement("input"); 175 b1nT_powered_by.setAttribute("type", "text"); 176 b1nT_powered_by.style.border = "0px"; 177 b1nT_powered_by.style.padding = "5px"; 178 b1nT_powered_by.style.width = "100%"; 179 b1nT_powered_by.style.textAlign = "right"; 180 b1nT_powered_by.style.fontWeight = "bold"; 181 b1nT_powered_by.style.color = "#000000"; 182 b1nT_powered_by.style.pointerEvents = "none"; 183 b1nT_powered_by.value = "powered by Google"; 184 185 b1nT_powered_by_wrap.appendChild(b1nT_powered_by); 186 b1nT_address_suggestion_wrap.appendChild(b1nT_powered_by_wrap); 187 b1nT_address_data.address_suggestion_wrap.appendChild(b1nT_address_suggestion_wrap); 188 }; 189 190 this._b1nT_fill_in_address = async function (b1nT_place_prediction) { 191 var b1nT_place = b1nT_place_prediction.toPlace(); 192 193 await b1nT_place.fetchFields({fields: ['location', 'addressComponents', 'types', 'displayName']}); 194 195 //clear session token, this way we create a 196 //new one when the suggestion triggers again 197 b1nT_address_data.token_session = undefined; 198 199 if (!b1nT_place.location) { 200 b1nT_address_data.b1nT_refresh_google_verification(); 201 202 if(b1nT_address_data.dBox) { 203 b1nT_address_data.dBox.b1nT_open_dialog("WARNING!!", 'No details available for input: '+b1nT_place.displayName); 204 } 205 return; 206 } 207 208 //get autocompleted address 209 let b1nT_street_number = b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'street_number' ); 210 b1nT_street_number.shortText = b1nT_street_number.shortText ? b1nT_street_number.shortText : b1nT_address_data.config.searchCtrl.value.split(' ')[0].replaceAll(/\D/g, ''); 211 212 let b1nT_street_name = b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'street_address' ); 213 b1nT_street_name = b1nT_street_name.longText ? b1nT_street_name : b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'route' ); 214 b1nT_street_name = b1nT_street_name.longText ? b1nT_street_name : b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'intersection' ); 215 216 let b1nT_city = b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'locality' ); 217 b1nT_city = b1nT_city.longText ? b1nT_city : b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'administrative_area_level_3' ); 218 b1nT_city = b1nT_city.longText ? b1nT_city : b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'sublocality_level_1' ); 219 220 let b1nT_state = b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'administrative_area_level_1' ); 221 let b1nT_postal = b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'postal_code' ); 222 let b1nT_postal_suffix = b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'postal_code_suffix' ); 223 224 //we are done, clear address field 225 b1nT_address_data.config.addressCtrl.value = ""; 226 227 //however, is state part of the selected country ? 228 //if not we dont want to go any further than this 229 var found_state = 0; 230 for(var option of b1nT_address_data.config.stateCtrl.options) { 231 if(option.value == b1nT_state.shortText) { 232 found_state++; 233 } 234 } 235 236 if(!found_state) { 237 b1nT_address_data.b1nT_refresh_google_verification(); 238 239 if(b1nT_address_data.dBox) { 240 b1nT_address_data.dBox.b1nT_open_dialog("WARNING!!", "This address appears to reside in a country that is not accepted by this company"); 241 } 242 return; 243 } 244 245 b1nT_address_data.config.addressCtrl.value = `${b1nT_street_number.shortText} ${b1nT_street_name.shortText}`; 246 b1nT_address_data.config.cityCtrl.value = b1nT_city.longText; 247 b1nT_address_data.config.stateCtrl.value = b1nT_state.shortText; 248 b1nT_address_data.config.postalCtrl.value = b1nT_postal.shortText; 249 250 //check if the address is rooftop 251 let b1nT_verified = 0; 252 if(b1nT_place.types.includes('premise') || b1nT_place.location.location_type == 'ROOFTOP' || b1nT_postal_suffix.shortText.length) { 253 //TODO:: 254 b1nT_verified = 1; 255 } else if(document.getElementById("b1nT_google_status_bypass").value == "On") { 256 //we are going to check for valid cordinates 257 let b1nT_coordinate_validate = function() { 258 let b1nT_pattern = new RegExp("^-?[1-9]\\d{1,2}($|\.\\d+$)"); 259 260 if(!b1nT_place.location) { return 0; } 261 if(!b1nT_place.location.location) { return 0; } 262 263 let b1nT_lat = b1nT_place.location.location.lat() * 1; 264 let b1nT_lng = b1nT_place.location.location.lng() * 1; 265 266 if(!b1nT_pattern.exec(b1nT_lat)) { return 0; } 267 if(!b1nT_pattern.exec(b1nT_lng)) { return 0; } 268 269 if(!(b1nT_lat <= 90 && b1nT_lat >= -90)) { return 0; } 270 if(!(b1nT_lng <= 180 && b1nT_lng >= -180)) { return 0; } 271 return 2; 272 } 273 274 b1nT_verified = b1nT_coordinate_validate(); 275 } 276 277 b1nT_address_data.b1nT_refresh_google_verification(b1nT_verified); 278 }; 279 280 this._b1nT_fill_in_address_legacy = function() { 281 var b1nT_place = b1nT_address_data.placeautocomplete_legacy.getPlace(); 36 282 37 283 if (!b1nT_place.geometry) { 38 39 284 b1nT_address_data.b1nT_refresh_google_verification(); 40 285 … … 46 291 47 292 //get autocompleted address 48 let b1nT_street_number = b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'street_number');293 let b1nT_street_number = b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'street_number', 1); 49 294 b1nT_street_number.short_name = b1nT_street_number.short_name ? b1nT_street_number.short_name : b1nT_address_data.config.searchCtrl.value.split(' ')[0].replaceAll(/\D/g, ''); 50 295 51 let b1nT_street_name = b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'street_address' );52 b1nT_street_name = b1nT_street_name.long_name ? b1nT_street_name : b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'route');53 b1nT_street_name = b1nT_street_name.long_name ? b1nT_street_name : b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'intersection');54 55 let b1nT_city = b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'locality');56 b1nT_city = b1nT_city.long_name ? b1nT_city : b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'administrative_area_level_3');57 b1nT_city = b1nT_city.long_name ? b1nT_city : b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'sublocality_level_1');58 59 let b1nT_state = b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'administrative_area_level_1');60 let b1nT_postal = b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'postal_code');61 let b1nT_postal_suffix = b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'postal_code_suffix');296 let b1nT_street_name = b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'street_address' ); 297 b1nT_street_name = b1nT_street_name.long_name ? b1nT_street_name : b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'route', 1); 298 b1nT_street_name = b1nT_street_name.long_name ? b1nT_street_name : b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'intersection', 1); 299 300 let b1nT_city = b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'locality', 1); 301 b1nT_city = b1nT_city.long_name ? b1nT_city : b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'administrative_area_level_3', 1); 302 b1nT_city = b1nT_city.long_name ? b1nT_city : b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'sublocality_level_1', 1); 303 304 let b1nT_state = b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'administrative_area_level_1', 1); 305 let b1nT_postal = b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'postal_code', 1); 306 let b1nT_postal_suffix = b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'postal_code_suffix', 1); 62 307 63 308 //we are done, clear address field … … 74 319 75 320 if(!found_state) { 76 77 321 b1nT_address_data.b1nT_refresh_google_verification(); 78 79 322 if(b1nT_address_data.dBox) { 80 323 b1nT_address_data.dBox.b1nT_open_dialog("WARNING!!", "This address appears to reside in a country that is not accepted by this company"); … … 84 327 85 328 b1nT_address_data.config.addressCtrl.value = `${b1nT_street_number.short_name} ${b1nT_street_name.short_name}`; 86 b1nT_address_data.config.cityCtrl.value = b1nT_city.long_name;87 b1nT_address_data.config.stateCtrl.value = b1nT_state.short_name;88 b1nT_address_data.config.postalCtrl.value = b1nT_postal.short_name;329 b1nT_address_data.config.cityCtrl.value = b1nT_city.long_name; 330 b1nT_address_data.config.stateCtrl.value = b1nT_state.short_name; 331 b1nT_address_data.config.postalCtrl.value = b1nT_postal.short_name; 89 332 90 333 //check if the address is rooftop … … 116 359 117 360 b1nT_address_data.b1nT_refresh_google_verification(b1nT_verified); 118 } ;119 120 this._b1nT_find_address_component = function( b1nT_address_array, b1nT_search) {361 } 362 363 this._b1nT_find_address_component = function(b1nT_address_array, b1nT_search, b1nT_arg_legacy) { 121 364 for( let i = 0; i < b1nT_address_array.length; i++ ) { 122 365 if ( b1nT_address_array[i].types[0] == b1nT_search ) { … … 124 367 } 125 368 } 126 return { long_name: '', short_name: '', types: [ b1nT_search ] }; 369 if(b1nT_arg_legacy) { 370 return { long_name: '', short_name: '', types: [ b1nT_search ] }; 371 } 372 return { longText: '', shortText: '', types: [ b1nT_search ] }; 127 373 }; 128 374 … … 144 390 }; 145 391 146 this._b1nT_address_changed = function() { 147 if(b1nT_address_data.config.validateCtrl.className != 'b1nT_verify_error') { 148 b1nT_address_data.b1nT_refresh_google_verification(); 149 } 150 151 //reset error div if its present 152 if(document.getElementsByClassName("b1nT-error-msg") && document.getElementsByClassName("b1nT-error-msg")[0]) { 153 document.getElementsByClassName("b1nT-error-msg")[0].remove(); 154 } 392 this._b1nT_address_changed = function(b1nT_arg_legacy) { 393 let b1nT_the_work = function() { 394 if(b1nT_address_data.config.validateCtrl.className != 'b1nT_verify_error') { 395 b1nT_address_data.b1nT_refresh_google_verification(); 396 } 397 //reset error div if its present 398 if(document.getElementsByClassName("b1nT-error-msg") && document.getElementsByClassName("b1nT-error-msg")[0]) { 399 document.getElementsByClassName("b1nT-error-msg")[0].remove(); 400 } 401 }; 402 403 if(b1nT_arg_legacy) { 404 b1nT_the_work(); 405 return; 406 } 407 408 clearTimeout(b1nT_address_data.changeTimeout); 409 b1nT_address_data.changeTimeout = setTimeout(function() { 410 b1nT_the_work(); 411 }, 500); 155 412 }; 156 413 … … 181 438 return this; 182 439 } 183 184 185 -
bin-tracker-online/tags/1.2.8/readme.txt
r3292696 r3310697 4 4 Requires PHP: 5.6.4 5 5 Tested up to: 6.8 6 Stable tag: 1.2. 76 Stable tag: 1.2.8 7 7 License: GPLv2 or later 8 8 License URI: http://www.gnu.org/licenses/gpl-2.0.html -
bin-tracker-online/tags/1.2.8/templates/front-house-step-one-template.php
r3245949 r3310697 17 17 <div class="b1nT_field-row"> 18 18 <label>Job Address:<span style="color: red">*</span></label> 19 <input type="text" id="b1nT_job_address" class="b1nT_form-input " name="b1nT_job_address" value=""/> 19 <div> 20 <input type="text" id="b1nT_job_address" class="b1nT_form-input " name="b1nT_job_address" value="" placeholder="Search Address"/> 21 </div> 20 22 <div style="padding-top: 5px; font-size: 90%;"> 21 23 <strong> -
bin-tracker-online/trunk/bin-tracker-online.php
r3292696 r3310697 8 8 Plugin URI: https://www.bintracker.software/api/word-press-plugin.html 9 9 Description: The plug in provides integration with a private web application for Bin their Dump That, a franchisor in the waste hauling industry 10 Version: 1.2. 710 Version: 1.2.8 11 11 Author: Cairn Applications Inc 12 12 Author URI: https://www.cloud-computing.rocks/ -
bin-tracker-online/trunk/includes/base/enqueue.php
r3105698 r3310697 41 41 42 42 //google places api, provides a service. 43 wp_enqueue_script('b1nT-google-maps', "https://maps.googleapis.com/maps/api/js?key=$b1nT_google_api_key&l ibraries=places", '', '', 'all');43 wp_enqueue_script('b1nT-google-maps', "https://maps.googleapis.com/maps/api/js?key=$b1nT_google_api_key&loading=async&&libraries=places", '', '', 'all'); 44 44 45 45 //localize -
bin-tracker-online/trunk/javascript/address-validation-script.js
r3105698 r3310697 2 2 var b1nT_address_data = this; 3 3 b1nT_address_data.config = b1nT_arg_config; 4 var b1nT_place_auto_complete; 5 6 this._b1nT_init = function() { 7 //setup google places address autocomplete 8 var b1nT_search = b1nT_address_data.config.searchCtrl; 9 b1nT_place_auto_complete = new google.maps.places.Autocomplete( 4 5 this._b1nT_init = async function() { 6 let b1nT_waitForGoogle = async function() { 7 return new Promise(function(b1nT_resolve) { 8 async function b1nT_isItReady() { 9 if(typeof(google.maps.places) !== "undefined") { 10 try { //make a call to make sure the api is included in the key. 11 //this call is not included in billing because the get details never 12 //never gets called. 13 const b1nT_token = new google.maps.places.AutocompleteSessionToken(); 14 const b1nT_suggestions = await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions({ 15 sessionToken: b1nT_token, 16 input: "588", 17 language: "en-US", 18 includedRegionCodes: ["us", "ca"] 19 }); 20 } catch(e) { 21 b1nT_resolve(1); 22 } 23 b1nT_resolve(0); 24 } else { 25 setTimeout(b1nT_isItReady, 50); 26 } 27 } 28 b1nT_isItReady(); 29 }); 30 }; 31 32 let b1nT_legacy_check = await b1nT_waitForGoogle(); 33 34 if(b1nT_legacy_check) { 35 b1nT_address_data._b1nT_init_legacy(); 36 return; 37 } 38 39 let b1nT_address_suggestion_wrap = document.createElement("div"); 40 b1nT_address_suggestion_wrap.style.maxHeight = "300px"; 41 b1nT_address_suggestion_wrap.style.overflowY = "auto"; 42 b1nT_address_suggestion_wrap.style.position = "absolute"; 43 b1nT_address_suggestion_wrap.style.marginTop = "1px"; 44 b1nT_address_suggestion_wrap.style.marginLeft = "1px"; 45 b1nT_address_suggestion_wrap.style.borderRadius = "1px"; 46 b1nT_address_suggestion_wrap.style.width = b1nT_address_data.config.searchCtrl.clientWidth+"px"; 47 b1nT_address_data.address_suggestion_wrap = b1nT_address_suggestion_wrap; 48 b1nT_address_data.config.searchCtrl.after(b1nT_address_suggestion_wrap); 49 50 //setup event listensers on fields 51 b1nT_address_data.config.searchCtrl.addEventListener("keyup", function(b1nT_e) { 52 clearTimeout(b1nT_address_data.searchTimeOut); 53 b1nT_address_data.searchTimeOut = setTimeout(function() { 54 if(!String(b1nT_address_data.config.searchCtrl.value).trim()) { return; } 55 56 //if we are using the search bar to act as the address bar aswell. then trigger the address changed 57 if(b1nT_address_data.config.addressCtrl && (b1nT_address_data.config.addressCtrl == b1nT_address_data.config.searchCtrl)) { 58 b1nT_address_data._b1nT_address_changed(); 59 } 60 61 b1nT_address_data._b1nT_get_suggestions(b1nT_address_data.config.searchCtrl.value); 62 }, 500); 63 }); 64 65 b1nT_address_data.config.searchCtrl.addEventListener("focus", function(b1nT_e) { 66 clearTimeout(b1nT_address_data.searchTimeOut); 67 b1nT_address_data.searchTimeOut = setTimeout(function() { 68 if(!String(b1nT_address_data.config.searchCtrl.value).trim()) { return; } 69 b1nT_address_data._b1nT_get_suggestions(b1nT_address_data.config.searchCtrl.value); 70 }, 500); 71 }); 72 73 b1nT_address_data.config.searchCtrl.addEventListener("blur", function(b1nT_e) { 74 clearTimeout(b1nT_address_data.blurTimeOut); 75 b1nT_address_data.blurTimeOut = setTimeout(function() { 76 b1nT_address_data.address_suggestion_wrap.innerHTML = ""; 77 }, 500); 78 }); 79 80 //if we are not using the search bar to act as the address bar, then set an onchange handler. Otherwise skip it 81 if(b1nT_address_data.config.addressCtrl && (b1nT_address_data.config.addressCtrl != b1nT_address_data.config.searchCtrl)) { 82 b1nT_address_data.config.addressCtrl = b1nT_address_data._b1nT_address_changed; 83 } 84 85 b1nT_address_data.config.cityCtrl.onchange = b1nT_address_data._b1nT_address_changed; 86 b1nT_address_data.config.stateCtrl.onchange = b1nT_address_data._b1nT_address_changed; 87 b1nT_address_data.config.postalCtrl.onchange = b1nT_address_data._b1nT_address_changed; 88 }; 89 90 this._b1nT_init_legacy = function() { 91 let b1nT_search = b1nT_address_data.config.searchCtrl; 92 let b1nT_place_auto_complete = new google.maps.places.Autocomplete( 10 93 b1nT_search, { 11 94 fields: ['geometry', 'address_component', 'type'] … … 13 96 ); 14 97 15 varb1nT_call_back = function () {16 b1nT_address_data._b1nT_fill_in_address ();17 } 18 19 b1nT_place_auto_complete.addListener( 'place_changed', b1nT_call_back);20 b1nT_address_data.placeautocomplete = b1nT_place_auto_complete;98 let b1nT_call_back = function () { 99 b1nT_address_data._b1nT_fill_in_address_legacy(); 100 } 101 102 b1nT_place_auto_complete.addListener('place_changed', b1nT_call_back); 103 b1nT_address_data.placeautocomplete_legacy = b1nT_place_auto_complete; 21 104 22 105 //limit the counties to usa and canada … … 26 109 27 110 //setup event listensers on fields 28 b1nT_address_data.config.addressCtrl.onchange = b1nT_address_data._b1nT_address_changed; 29 b1nT_address_data.config.cityCtrl.onchange = b1nT_address_data._b1nT_address_changed; 30 b1nT_address_data.config.stateCtrl.onchange = b1nT_address_data._b1nT_address_changed; 31 b1nT_address_data.config.postalCtrl.onchange = b1nT_address_data._b1nT_address_changed; 32 }; 33 34 this._b1nT_fill_in_address = function () { 35 var b1nT_place = b1nT_address_data.placeautocomplete.getPlace(); 111 b1nT_address_data.config.addressCtrl.onchange = function() { b1nT_address_data._b1nT_address_changed(1); } 112 b1nT_address_data.config.cityCtrl.onchange = function() { b1nT_address_data._b1nT_address_changed(1); } 113 b1nT_address_data.config.stateCtrl.onchange = function() { b1nT_address_data._b1nT_address_changed(1); } 114 b1nT_address_data.config.postalCtrl.onchange = function() { b1nT_address_data._b1nT_address_changed(1); } 115 } 116 117 this._b1nT_get_suggestions = async function(b1nT_v) { 118 //creating a new session if it does not exist. 119 const b1nT_token = b1nT_address_data.token_session ? b1nT_address_data.token_session : new google.maps.places.AutocompleteSessionToken(); 120 b1nT_address_data.token_session = b1nT_token; 121 122 let b1nT_options = { 123 sessionToken: b1nT_token, 124 input: b1nT_v, 125 language: "en-US", 126 includedRegionCodes: ["us", "ca"] 127 }; 128 129 const b1nT_suggestions = await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions(b1nT_options); 130 const b1nT_suggestions_array = b1nT_suggestions.suggestions; 131 132 b1nT_address_data.address_suggestion_wrap.innerHTML = ""; 133 let b1nT_address_suggestion_wrap = document.createElement("div"); 134 b1nT_address_suggestion_wrap.style.border = "1px solid #d1cfcf"; 135 136 b1nT_suggestions_array.forEach(function(b1nT_suggestion, b1nT_index) { 137 const b1nT_place_prediction = b1nT_suggestion.placePrediction; 138 let b1nT_input_wrap = document.createElement("div"); 139 let b1nT_input = document.createElement("input"); 140 b1nT_input.setAttribute("type", "text"); 141 b1nT_input.style.width = "100%"; 142 b1nT_input.style.border = "0px"; 143 b1nT_input.style.padding = "10px"; 144 b1nT_input.style.cursor = "pointer"; 145 b1nT_input.style.color = "#000000"; 146 147 if(b1nT_index < b1nT_suggestions_array.length) { 148 b1nT_input.style.borderBottom = "1px solid #d1cfcf"; 149 } 150 151 b1nT_input.readOnly = true; 152 b1nT_input.value = b1nT_place_prediction.text.toString(); 153 154 b1nT_input.onmouseover = function() { 155 this.style.color = "#0174ab"; 156 this.style.backgroundColor = "#dddddd"; 157 }; 158 b1nT_input.onmouseout = function() { 159 this.style.removeProperty("color"); 160 this.style.removeProperty("background-color"); 161 } 162 b1nT_input.onclick = function() { 163 clearTimeout(b1nT_address_data.blurTimeOut); 164 clearTimeout(b1nT_address_data.searchTimeOut); 165 b1nT_address_data._b1nT_fill_in_address(b1nT_place_prediction); 166 b1nT_address_data.address_suggestion_wrap.innerHTML = ""; 167 } 168 169 b1nT_input_wrap.appendChild(b1nT_input); 170 b1nT_address_suggestion_wrap.appendChild(b1nT_input_wrap); 171 }); 172 173 let b1nT_powered_by_wrap = document.createElement("div"); 174 let b1nT_powered_by = document.createElement("input"); 175 b1nT_powered_by.setAttribute("type", "text"); 176 b1nT_powered_by.style.border = "0px"; 177 b1nT_powered_by.style.padding = "5px"; 178 b1nT_powered_by.style.width = "100%"; 179 b1nT_powered_by.style.textAlign = "right"; 180 b1nT_powered_by.style.fontWeight = "bold"; 181 b1nT_powered_by.style.color = "#000000"; 182 b1nT_powered_by.style.pointerEvents = "none"; 183 b1nT_powered_by.value = "powered by Google"; 184 185 b1nT_powered_by_wrap.appendChild(b1nT_powered_by); 186 b1nT_address_suggestion_wrap.appendChild(b1nT_powered_by_wrap); 187 b1nT_address_data.address_suggestion_wrap.appendChild(b1nT_address_suggestion_wrap); 188 }; 189 190 this._b1nT_fill_in_address = async function (b1nT_place_prediction) { 191 var b1nT_place = b1nT_place_prediction.toPlace(); 192 193 await b1nT_place.fetchFields({fields: ['location', 'addressComponents', 'types', 'displayName']}); 194 195 //clear session token, this way we create a 196 //new one when the suggestion triggers again 197 b1nT_address_data.token_session = undefined; 198 199 if (!b1nT_place.location) { 200 b1nT_address_data.b1nT_refresh_google_verification(); 201 202 if(b1nT_address_data.dBox) { 203 b1nT_address_data.dBox.b1nT_open_dialog("WARNING!!", 'No details available for input: '+b1nT_place.displayName); 204 } 205 return; 206 } 207 208 //get autocompleted address 209 let b1nT_street_number = b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'street_number' ); 210 b1nT_street_number.shortText = b1nT_street_number.shortText ? b1nT_street_number.shortText : b1nT_address_data.config.searchCtrl.value.split(' ')[0].replaceAll(/\D/g, ''); 211 212 let b1nT_street_name = b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'street_address' ); 213 b1nT_street_name = b1nT_street_name.longText ? b1nT_street_name : b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'route' ); 214 b1nT_street_name = b1nT_street_name.longText ? b1nT_street_name : b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'intersection' ); 215 216 let b1nT_city = b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'locality' ); 217 b1nT_city = b1nT_city.longText ? b1nT_city : b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'administrative_area_level_3' ); 218 b1nT_city = b1nT_city.longText ? b1nT_city : b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'sublocality_level_1' ); 219 220 let b1nT_state = b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'administrative_area_level_1' ); 221 let b1nT_postal = b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'postal_code' ); 222 let b1nT_postal_suffix = b1nT_address_data._b1nT_find_address_component( b1nT_place.addressComponents, 'postal_code_suffix' ); 223 224 //we are done, clear address field 225 b1nT_address_data.config.addressCtrl.value = ""; 226 227 //however, is state part of the selected country ? 228 //if not we dont want to go any further than this 229 var found_state = 0; 230 for(var option of b1nT_address_data.config.stateCtrl.options) { 231 if(option.value == b1nT_state.shortText) { 232 found_state++; 233 } 234 } 235 236 if(!found_state) { 237 b1nT_address_data.b1nT_refresh_google_verification(); 238 239 if(b1nT_address_data.dBox) { 240 b1nT_address_data.dBox.b1nT_open_dialog("WARNING!!", "This address appears to reside in a country that is not accepted by this company"); 241 } 242 return; 243 } 244 245 b1nT_address_data.config.addressCtrl.value = `${b1nT_street_number.shortText} ${b1nT_street_name.shortText}`; 246 b1nT_address_data.config.cityCtrl.value = b1nT_city.longText; 247 b1nT_address_data.config.stateCtrl.value = b1nT_state.shortText; 248 b1nT_address_data.config.postalCtrl.value = b1nT_postal.shortText; 249 250 //check if the address is rooftop 251 let b1nT_verified = 0; 252 if(b1nT_place.types.includes('premise') || b1nT_place.location.location_type == 'ROOFTOP' || b1nT_postal_suffix.shortText.length) { 253 //TODO:: 254 b1nT_verified = 1; 255 } else if(document.getElementById("b1nT_google_status_bypass").value == "On") { 256 //we are going to check for valid cordinates 257 let b1nT_coordinate_validate = function() { 258 let b1nT_pattern = new RegExp("^-?[1-9]\\d{1,2}($|\.\\d+$)"); 259 260 if(!b1nT_place.location) { return 0; } 261 if(!b1nT_place.location.location) { return 0; } 262 263 let b1nT_lat = b1nT_place.location.location.lat() * 1; 264 let b1nT_lng = b1nT_place.location.location.lng() * 1; 265 266 if(!b1nT_pattern.exec(b1nT_lat)) { return 0; } 267 if(!b1nT_pattern.exec(b1nT_lng)) { return 0; } 268 269 if(!(b1nT_lat <= 90 && b1nT_lat >= -90)) { return 0; } 270 if(!(b1nT_lng <= 180 && b1nT_lng >= -180)) { return 0; } 271 return 2; 272 } 273 274 b1nT_verified = b1nT_coordinate_validate(); 275 } 276 277 b1nT_address_data.b1nT_refresh_google_verification(b1nT_verified); 278 }; 279 280 this._b1nT_fill_in_address_legacy = function() { 281 var b1nT_place = b1nT_address_data.placeautocomplete_legacy.getPlace(); 36 282 37 283 if (!b1nT_place.geometry) { 38 39 284 b1nT_address_data.b1nT_refresh_google_verification(); 40 285 … … 46 291 47 292 //get autocompleted address 48 let b1nT_street_number = b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'street_number');293 let b1nT_street_number = b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'street_number', 1); 49 294 b1nT_street_number.short_name = b1nT_street_number.short_name ? b1nT_street_number.short_name : b1nT_address_data.config.searchCtrl.value.split(' ')[0].replaceAll(/\D/g, ''); 50 295 51 let b1nT_street_name = b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'street_address' );52 b1nT_street_name = b1nT_street_name.long_name ? b1nT_street_name : b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'route');53 b1nT_street_name = b1nT_street_name.long_name ? b1nT_street_name : b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'intersection');54 55 let b1nT_city = b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'locality');56 b1nT_city = b1nT_city.long_name ? b1nT_city : b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'administrative_area_level_3');57 b1nT_city = b1nT_city.long_name ? b1nT_city : b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'sublocality_level_1');58 59 let b1nT_state = b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'administrative_area_level_1');60 let b1nT_postal = b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'postal_code');61 let b1nT_postal_suffix = b1nT_address_data._b1nT_find_address_component( b1nT_place.address_components, 'postal_code_suffix');296 let b1nT_street_name = b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'street_address' ); 297 b1nT_street_name = b1nT_street_name.long_name ? b1nT_street_name : b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'route', 1); 298 b1nT_street_name = b1nT_street_name.long_name ? b1nT_street_name : b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'intersection', 1); 299 300 let b1nT_city = b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'locality', 1); 301 b1nT_city = b1nT_city.long_name ? b1nT_city : b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'administrative_area_level_3', 1); 302 b1nT_city = b1nT_city.long_name ? b1nT_city : b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'sublocality_level_1', 1); 303 304 let b1nT_state = b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'administrative_area_level_1', 1); 305 let b1nT_postal = b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'postal_code', 1); 306 let b1nT_postal_suffix = b1nT_address_data._b1nT_find_address_component(b1nT_place.address_components, 'postal_code_suffix', 1); 62 307 63 308 //we are done, clear address field … … 74 319 75 320 if(!found_state) { 76 77 321 b1nT_address_data.b1nT_refresh_google_verification(); 78 79 322 if(b1nT_address_data.dBox) { 80 323 b1nT_address_data.dBox.b1nT_open_dialog("WARNING!!", "This address appears to reside in a country that is not accepted by this company"); … … 84 327 85 328 b1nT_address_data.config.addressCtrl.value = `${b1nT_street_number.short_name} ${b1nT_street_name.short_name}`; 86 b1nT_address_data.config.cityCtrl.value = b1nT_city.long_name;87 b1nT_address_data.config.stateCtrl.value = b1nT_state.short_name;88 b1nT_address_data.config.postalCtrl.value = b1nT_postal.short_name;329 b1nT_address_data.config.cityCtrl.value = b1nT_city.long_name; 330 b1nT_address_data.config.stateCtrl.value = b1nT_state.short_name; 331 b1nT_address_data.config.postalCtrl.value = b1nT_postal.short_name; 89 332 90 333 //check if the address is rooftop … … 116 359 117 360 b1nT_address_data.b1nT_refresh_google_verification(b1nT_verified); 118 } ;119 120 this._b1nT_find_address_component = function( b1nT_address_array, b1nT_search) {361 } 362 363 this._b1nT_find_address_component = function(b1nT_address_array, b1nT_search, b1nT_arg_legacy) { 121 364 for( let i = 0; i < b1nT_address_array.length; i++ ) { 122 365 if ( b1nT_address_array[i].types[0] == b1nT_search ) { … … 124 367 } 125 368 } 126 return { long_name: '', short_name: '', types: [ b1nT_search ] }; 369 if(b1nT_arg_legacy) { 370 return { long_name: '', short_name: '', types: [ b1nT_search ] }; 371 } 372 return { longText: '', shortText: '', types: [ b1nT_search ] }; 127 373 }; 128 374 … … 144 390 }; 145 391 146 this._b1nT_address_changed = function() { 147 if(b1nT_address_data.config.validateCtrl.className != 'b1nT_verify_error') { 148 b1nT_address_data.b1nT_refresh_google_verification(); 149 } 150 151 //reset error div if its present 152 if(document.getElementsByClassName("b1nT-error-msg") && document.getElementsByClassName("b1nT-error-msg")[0]) { 153 document.getElementsByClassName("b1nT-error-msg")[0].remove(); 154 } 392 this._b1nT_address_changed = function(b1nT_arg_legacy) { 393 let b1nT_the_work = function() { 394 if(b1nT_address_data.config.validateCtrl.className != 'b1nT_verify_error') { 395 b1nT_address_data.b1nT_refresh_google_verification(); 396 } 397 //reset error div if its present 398 if(document.getElementsByClassName("b1nT-error-msg") && document.getElementsByClassName("b1nT-error-msg")[0]) { 399 document.getElementsByClassName("b1nT-error-msg")[0].remove(); 400 } 401 }; 402 403 if(b1nT_arg_legacy) { 404 b1nT_the_work(); 405 return; 406 } 407 408 clearTimeout(b1nT_address_data.changeTimeout); 409 b1nT_address_data.changeTimeout = setTimeout(function() { 410 b1nT_the_work(); 411 }, 500); 155 412 }; 156 413 … … 181 438 return this; 182 439 } 183 184 185 -
bin-tracker-online/trunk/readme.txt
r3292696 r3310697 4 4 Requires PHP: 5.6.4 5 5 Tested up to: 6.8 6 Stable tag: 1.2. 76 Stable tag: 1.2.8 7 7 License: GPLv2 or later 8 8 License URI: http://www.gnu.org/licenses/gpl-2.0.html -
bin-tracker-online/trunk/templates/front-house-step-one-template.php
r3245949 r3310697 17 17 <div class="b1nT_field-row"> 18 18 <label>Job Address:<span style="color: red">*</span></label> 19 <input type="text" id="b1nT_job_address" class="b1nT_form-input " name="b1nT_job_address" value=""/> 19 <div> 20 <input type="text" id="b1nT_job_address" class="b1nT_form-input " name="b1nT_job_address" value="" placeholder="Search Address"/> 21 </div> 20 22 <div style="padding-top: 5px; font-size: 90%;"> 21 23 <strong>
Note: See TracChangeset
for help on using the changeset viewer.