{"id":15381,"date":"2026-09-08T09:22:26","date_gmt":"2026-09-08T17:22:26","guid":{"rendered":"https:\/\/botiscorp.com\/?page_id=15381"},"modified":"2026-09-09T08:55:40","modified_gmt":"2026-09-09T16:55:40","slug":"request-a-quote","status":"publish","type":"page","link":"https:\/\/botiscorp.com\/es\/request-a-quote\/","title":{"rendered":"Solicitar una cotizaci\u00f3n"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"15381\" class=\"elementor elementor-15381\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-75daaa4 e-flex e-con-boxed e-con e-parent\" data-id=\"75daaa4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-65c9332 elementor-widget elementor-widget-html\" data-id=\"65c9332\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- BOTI'S UNIVERSAL REQUEST A QUOTE FORM -->\r\n<div id=\"botisQuoteApp\">\r\n<style>\r\n#botisQuoteApp{\r\n  --navy:#14203a;\r\n  --navy2:#0d172b;\r\n  --red:#c62828;\r\n  --red2:#a91f1f;\r\n  --paper:#ffffff;\r\n  --soft:#f4f6f9;\r\n  --line:#d8dee8;\r\n  --text:#172033;\r\n  --muted:#647087;\r\n  --ok:#147a44;\r\n  font-family:Arial,Helvetica,sans-serif;\r\n  color:var(--text);\r\n  max-width:1100px;\r\n  margin:0 auto;\r\n}\r\n#botisQuoteApp *{box-sizing:border-box}\r\n#botisQuoteApp .quote-shell{\r\n  background:#fff;\r\n  border:1px solid var(--line);\r\n  border-radius:18px;\r\n  overflow:hidden;\r\n  box-shadow:0 8px 30px rgba(20,32,58,.10);\r\n}\r\n#botisQuoteApp .quote-hero{\r\n  background:linear-gradient(135deg,var(--navy2),var(--navy));\r\n  color:#fff;\r\n  padding:28px 34px;\r\n  border-bottom:6px solid var(--red);\r\n}\r\n#botisQuoteApp .brand{\r\n  font-size:34px;\r\n  font-weight:900;\r\n  letter-spacing:.5px;\r\n  line-height:1;\r\n  margin-bottom:8px;\r\n}\r\n#botisQuoteApp .entities{\r\n  font-size:13px;\r\n  opacity:.86;\r\n  margin-bottom:22px;\r\n}\r\n#botisQuoteApp h1{\r\n  color:#fff;\r\n  margin:0 0 8px;\r\n  font-size:34px;\r\n  line-height:1.15;\r\n}\r\n#botisQuoteApp .hero-copy{\r\n  margin:0;\r\n  max-width:780px;\r\n  font-size:16px;\r\n  line-height:1.55;\r\n  color:#e7edf8;\r\n}\r\n#botisQuoteApp .progress-wrap{\r\n  padding:18px 30px 0;\r\n  background:#fff;\r\n}\r\n#botisQuoteApp .progress-top{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  gap:15px;\r\n  font-size:12px;\r\n  color:var(--muted);\r\n  margin-bottom:8px;\r\n  font-weight:700;\r\n}\r\n#botisQuoteApp .bar{\r\n  height:8px;\r\n  background:#e8edf4;\r\n  border-radius:30px;\r\n  overflow:hidden;\r\n}\r\n#botisQuoteApp .bar > div{\r\n  height:100%;\r\n  width:12.5%;\r\n  background:var(--red);\r\n  transition:width .2s ease;\r\n}\r\n#botisQuoteApp .screen{\r\n  display:none;\r\n  padding:32px;\r\n}\r\n#botisQuoteApp .screen.active{display:block}\r\n#botisQuoteApp .step-title{\r\n  margin:0 0 7px;\r\n  font-size:27px;\r\n  color:var(--navy);\r\n}\r\n#botisQuoteApp .step-copy{\r\n  margin:0 0 24px;\r\n  color:var(--muted);\r\n  font-size:15px;\r\n  line-height:1.5;\r\n}\r\n#botisQuoteApp .choices{\r\n  display:grid;\r\n  grid-template-columns:repeat(2,minmax(0,1fr));\r\n  gap:12px;\r\n}\r\n#botisQuoteApp .choice{\r\n  display:flex;\r\n  align-items:center;\r\n  min-height:68px;\r\n  padding:15px 17px;\r\n  border:2px solid var(--line);\r\n  border-radius:12px;\r\n  background:#fff;\r\n  color:var(--navy);\r\n  font-weight:800;\r\n  cursor:pointer;\r\n  transition:.15s ease;\r\n  text-align:left;\r\n  width:100%;\r\n}\r\n#botisQuoteApp .choice:hover,\r\n#botisQuoteApp .choice.selected{\r\n  border-color:var(--red);\r\n  background:#fff7f7;\r\n}\r\n#botisQuoteApp .choice small{\r\n  display:block;\r\n  color:var(--muted);\r\n  font-weight:500;\r\n  margin-top:3px;\r\n}\r\n#botisQuoteApp .grid2{\r\n  display:grid;\r\n  grid-template-columns:1fr 1fr;\r\n  gap:16px;\r\n}\r\n#botisQuoteApp .grid3{\r\n  display:grid;\r\n  grid-template-columns:2fr 1fr 1fr;\r\n  gap:16px;\r\n}\r\n#botisQuoteApp .field{\r\n  margin-bottom:16px;\r\n}\r\n#botisQuoteApp label{\r\n  display:block;\r\n  font-weight:800;\r\n  color:var(--navy);\r\n  margin-bottom:7px;\r\n  font-size:14px;\r\n}\r\n#botisQuoteApp .req{color:var(--red)}\r\n#botisQuoteApp input,\r\n#botisQuoteApp select,\r\n#botisQuoteApp textarea{\r\n  width:100%;\r\n  border:1px solid #bcc6d5;\r\n  border-radius:9px;\r\n  padding:12px 13px;\r\n  font:inherit;\r\n  font-size:16px;\r\n  background:#fff;\r\n  color:var(--text);\r\n}\r\n#botisQuoteApp textarea{min-height:105px;resize:vertical}\r\n#botisQuoteApp input:focus,\r\n#botisQuoteApp select:focus,\r\n#botisQuoteApp textarea:focus{\r\n  outline:2px solid rgba(198,40,40,.15);\r\n  border-color:var(--red);\r\n}\r\n#botisQuoteApp .hint{\r\n  margin-top:6px;\r\n  color:var(--muted);\r\n  font-size:12px;\r\n  line-height:1.4;\r\n}\r\n#botisQuoteApp .section-box{\r\n  border:1px solid var(--line);\r\n  background:var(--soft);\r\n  border-radius:12px;\r\n  padding:20px;\r\n  margin:18px 0;\r\n}\r\n#botisQuoteApp .section-box h3{\r\n  margin:0 0 15px;\r\n  color:var(--navy);\r\n  font-size:18px;\r\n}\r\n#botisQuoteApp .navrow{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  align-items:center;\r\n  gap:12px;\r\n  margin-top:26px;\r\n  padding-top:20px;\r\n  border-top:1px solid var(--line);\r\n}\r\n#botisQuoteApp .btn{\r\n  border:0;\r\n  border-radius:9px;\r\n  padding:13px 22px;\r\n  font-weight:900;\r\n  font-size:15px;\r\n  cursor:pointer;\r\n}\r\n#botisQuoteApp .next,\r\n#botisQuoteApp .submit{\r\n  background:var(--red);\r\n  color:#fff;\r\n}\r\n#botisQuoteApp .next:hover,\r\n#botisQuoteApp .submit:hover{background:var(--red2)}\r\n#botisQuoteApp .back{\r\n  background:#edf1f6;\r\n  color:var(--navy);\r\n}\r\n#botisQuoteApp .error{\r\n  display:none;\r\n  color:#9e1b1b;\r\n  background:#fff0f0;\r\n  border:1px solid #efb7b7;\r\n  border-radius:8px;\r\n  padding:10px 12px;\r\n  margin-top:15px;\r\n  font-size:14px;\r\n  font-weight:700;\r\n}\r\n#botisQuoteApp .upload{\r\n  padding:20px;\r\n  border:2px dashed #aeb9c9;\r\n  border-radius:12px;\r\n  background:#fafbfd;\r\n}\r\n#botisQuoteApp .file-list{\r\n  margin-top:10px;\r\n  font-size:13px;\r\n  color:var(--muted);\r\n}\r\n#botisQuoteApp .review{\r\n  border:1px solid var(--line);\r\n  border-radius:12px;\r\n  overflow:hidden;\r\n}\r\n#botisQuoteApp .review-row{\r\n  display:grid;\r\n  grid-template-columns:210px 1fr;\r\n  border-bottom:1px solid var(--line);\r\n}\r\n#botisQuoteApp .review-row:last-child{border-bottom:0}\r\n#botisQuoteApp .review-label{\r\n  padding:12px;\r\n  background:#f5f7fa;\r\n  font-weight:800;\r\n  color:var(--navy);\r\n}\r\n#botisQuoteApp .review-value{\r\n  padding:12px;\r\n  white-space:pre-wrap;\r\n  word-break:break-word;\r\n}\r\n#botisQuoteApp .consent{\r\n  display:flex;\r\n  gap:10px;\r\n  align-items:flex-start;\r\n  margin-top:18px;\r\n  padding:14px;\r\n  border-radius:10px;\r\n  background:#f7f9fc;\r\n}\r\n#botisQuoteApp .consent input{\r\n  width:auto;\r\n  margin-top:2px;\r\n}\r\n#botisQuoteApp .done{\r\n  text-align:center;\r\n  padding:52px 30px;\r\n}\r\n#botisQuoteApp .check{\r\n  width:68px;\r\n  height:68px;\r\n  border-radius:50%;\r\n  background:#eaf7ef;\r\n  color:var(--ok);\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  font-size:38px;\r\n  font-weight:900;\r\n  margin:0 auto 18px;\r\n}\r\n#botisQuoteApp .done h2{\r\n  color:var(--navy);\r\n  font-size:30px;\r\n  margin:0 0 10px;\r\n}\r\n#botisQuoteApp .done p{\r\n  color:var(--muted);\r\n  font-size:16px;\r\n  line-height:1.55;\r\n  max-width:680px;\r\n  margin:0 auto;\r\n}\r\n#botisQuoteApp .hidden-hp{\r\n  position:absolute !important;\r\n  left:-99999px !important;\r\n  width:1px !important;\r\n  height:1px !important;\r\n  overflow:hidden !important;\r\n}\r\n@media(max-width:700px){\r\n  #botisQuoteApp .quote-hero{padding:24px 20px}\r\n  #botisQuoteApp .brand{font-size:30px}\r\n  #botisQuoteApp h1{font-size:29px}\r\n  #botisQuoteApp .progress-wrap{padding:16px 18px 0}\r\n  #botisQuoteApp .screen{padding:24px 18px}\r\n  #botisQuoteApp .choices,\r\n  #botisQuoteApp .grid2,\r\n  #botisQuoteApp .grid3{grid-template-columns:1fr}\r\n  #botisQuoteApp .review-row{grid-template-columns:1fr}\r\n  #botisQuoteApp .review-label{padding-bottom:5px}\r\n  #botisQuoteApp .review-value{padding-top:5px}\r\n}\r\n<\/style>\r\n\r\n<div class=\"quote-shell\">\r\n  <div class=\"quote-hero\">\r\n    <div class=\"brand\">Boti's<\/div>\r\n    <div class=\"entities\">Boti's Corporation &nbsp;|&nbsp; Boti's Industrial Systems LLC<\/div>\r\n    <h1>Request a Quote<\/h1>\r\n    <p class=\"hero-copy\">Tell us what you need and provide as much information as you have. Photos, equipment information, plans and specifications help us prepare an accurate quote.<\/p>\r\n  <\/div>\r\n\r\n  <div class=\"progress-wrap\" id=\"progressWrap\">\r\n    <div class=\"progress-top\">\r\n      <span id=\"stepText\">Step 1 of 8<\/span>\r\n      <span id=\"stepName\">Service Category<\/span>\r\n    <\/div>\r\n    <div class=\"bar\"><div id=\"progressBar\"><\/div><\/div>\r\n  <\/div>\r\n\r\n  <!-- STEP 1 -->\r\n  <div class=\"screen active\" id=\"q1\">\r\n    <h2 class=\"step-title\">What do you need quoted?<\/h2>\r\n    <p class=\"step-copy\">Choose the category that best matches the project or equipment.<\/p>\r\n    <div class=\"choices\" id=\"categoryChoices\"><\/div>\r\n    <div class=\"error\" id=\"err1\"><\/div>\r\n  <\/div>\r\n\r\n  <!-- STEP 2 -->\r\n  <div class=\"screen\" id=\"q2\">\r\n    <h2 class=\"step-title\">What type of quote do you need?<\/h2>\r\n    <p class=\"step-copy\">Choose the option that best describes what you are planning.<\/p>\r\n    <div class=\"choices\" id=\"quoteTypeChoices\"><\/div>\r\n    <div class=\"error\" id=\"err2\"><\/div>\r\n    <div class=\"navrow\">\r\n      <button class=\"btn back\" type=\"button\" onclick=\"goBack()\">Back<\/button>\r\n      <span><\/span>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- STEP 3 -->\r\n  <div class=\"screen\" id=\"q3\">\r\n    <h2 class=\"step-title\">Your contact information<\/h2>\r\n    <p class=\"step-copy\">We will use this information only to respond to your quote request.<\/p>\r\n    <div class=\"grid2\">\r\n      <div class=\"field\"><label>Your name <span class=\"req\">*<\/span><\/label><input id=\"f_name\" autocomplete=\"name\"><\/div>\r\n      <div class=\"field\"><label>Company<\/label><input id=\"f_company\" autocomplete=\"organization\"><\/div>\r\n      <div class=\"field\"><label>Phone <span class=\"req\">*<\/span><\/label><input id=\"f_phone\" type=\"tel\" autocomplete=\"tel\"><\/div>\r\n      <div class=\"field\"><label>Email <span class=\"req\">*<\/span><\/label><input id=\"f_email\" type=\"email\" autocomplete=\"email\"><\/div>\r\n    <\/div>\r\n    <div class=\"grid2\">\r\n      <div class=\"field\">\r\n        <label>Are you already a Boti's customer?<\/label>\r\n        <select id=\"existing_customer\">\r\n          <option value=\"\">Select<\/option>\r\n          <option>Yes<\/option>\r\n          <option>No<\/option>\r\n          <option>Not sure<\/option>\r\n        <\/select>\r\n      <\/div>\r\n      <div class=\"field\">\r\n        <label>Preferred contact method<\/label>\r\n        <select id=\"contact_method\">\r\n          <option value=\"\">No preference<\/option>\r\n          <option>Phone<\/option>\r\n          <option>Email<\/option>\r\n          <option>Text message<\/option>\r\n        <\/select>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"error\" id=\"err3\"><\/div>\r\n    <div class=\"navrow\">\r\n      <button class=\"btn back\" type=\"button\" onclick=\"goBack()\">Back<\/button>\r\n      <button class=\"btn next\" type=\"button\" onclick=\"contactNext()\">Continue<\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- STEP 4 -->\r\n  <div class=\"screen\" id=\"q4\">\r\n    <h2 class=\"step-title\">Project or equipment details<\/h2>\r\n    <p class=\"step-copy\">These questions change based on the category you selected. Fill in what you know; leave unknown items blank.<\/p>\r\n    <div id=\"dynFields\"><\/div>\r\n    <div class=\"error\" id=\"err4\"><\/div>\r\n    <div class=\"navrow\">\r\n      <button class=\"btn back\" type=\"button\" onclick=\"goBack()\">Back<\/button>\r\n      <button class=\"btn next\" type=\"button\" onclick=\"showScreen('q5')\">Continue<\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- STEP 5 -->\r\n  <div class=\"screen\" id=\"q5\">\r\n    <h2 class=\"step-title\">Site or delivery location<\/h2>\r\n    <p class=\"step-copy\">For equipment purchases or rentals, use the delivery location. For projects, use the job-site location.<\/p>\r\n    <div class=\"field\"><label>Street address<\/label><input id=\"site_address\" autocomplete=\"street-address\"><\/div>\r\n    <div class=\"grid3\">\r\n      <div class=\"field\"><label>City<\/label><input id=\"site_city\" autocomplete=\"address-level2\"><\/div>\r\n      <div class=\"field\"><label>State<\/label><input id=\"site_state\" value=\"CA\" autocomplete=\"address-level1\"><\/div>\r\n      <div class=\"field\"><label>ZIP<\/label><input id=\"site_zip\" inputmode=\"numeric\" autocomplete=\"postal-code\"><\/div>\r\n    <\/div>\r\n    <div class=\"grid2\">\r\n      <div class=\"field\"><label>On-site contact<\/label><input id=\"site_contact\"><\/div>\r\n      <div class=\"field\"><label>On-site phone<\/label><input id=\"site_phone\" type=\"tel\"><\/div>\r\n    <\/div>\r\n    <div class=\"field\"><label>Access or delivery instructions<\/label><textarea id=\"site_access\" placeholder=\"Gate codes, dock instructions, receiving hours, access restrictions, etc.\"><\/textarea><\/div>\r\n    <div class=\"navrow\">\r\n      <button class=\"btn back\" type=\"button\" onclick=\"goBack()\">Back<\/button>\r\n      <button class=\"btn next\" type=\"button\" onclick=\"showScreen('q6')\">Continue<\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- STEP 6 -->\r\n  <div class=\"screen\" id=\"q6\">\r\n    <h2 class=\"step-title\">Timing<\/h2>\r\n    <p class=\"step-copy\">Let us know where this project is in your planning process.<\/p>\r\n    <div class=\"choices\" id=\"timeChoices\"><\/div>\r\n    <div class=\"section-box\">\r\n      <div class=\"field\"><label>Preferred date, if known<\/label><input id=\"preferred_date\" type=\"date\"><\/div>\r\n      <div class=\"field\"><label>Timing or scheduling notes<\/label><textarea id=\"schedule_notes\" placeholder=\"Shutdown windows, target completion date, delivery restrictions, budget cycle, etc.\"><\/textarea><\/div>\r\n    <\/div>\r\n    <div class=\"error\" id=\"err6\"><\/div>\r\n    <div class=\"navrow\">\r\n      <button class=\"btn back\" type=\"button\" onclick=\"goBack()\">Back<\/button>\r\n      <button class=\"btn next\" type=\"button\" onclick=\"timingNext()\">Continue<\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- STEP 7 -->\r\n  <div class=\"screen\" id=\"q7\">\r\n    <h2 class=\"step-title\">Photos, plans and documents<\/h2>\r\n    <p class=\"step-copy\">Upload anything that will help us understand the project: equipment data plates, site photos, plans, specifications, an existing proposal or a short video.<\/p>\r\n    <div class=\"upload\">\r\n      <div class=\"field\">\r\n        <label>Attachments<\/label>\r\n        <input id=\"attachments\" type=\"file\" multiple accept=\".jpg,.jpeg,.png,.gif,.webp,.pdf,.mp4,.m4v,.mov,image\/*,video\/mp4,video\/quicktime,application\/pdf\">\r\n        <div class=\"hint\">Up to 8 files. Maximum 12 MB per file.<\/div>\r\n        <div class=\"file-list\" id=\"fileList\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"field\" style=\"margin-top:18px\">\r\n      <label>Anything else we should know?<\/label>\r\n      <textarea id=\"final_notes\" placeholder=\"Describe the project, goals, known problems, special requirements, preferred products, budget information, or anything else that will help us quote accurately.\"><\/textarea>\r\n    <\/div>\r\n    <div class=\"error\" id=\"err7\"><\/div>\r\n    <div class=\"navrow\">\r\n      <button class=\"btn back\" type=\"button\" onclick=\"goBack()\">Back<\/button>\r\n      <button class=\"btn next\" type=\"button\" onclick=\"reviewNext()\">Review Request<\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- STEP 8 -->\r\n  <div class=\"screen\" id=\"q8\">\r\n    <h2 class=\"step-title\">Review your quote request<\/h2>\r\n    <p class=\"step-copy\">Confirm the information below, then submit it to Boti's.<\/p>\r\n    <div class=\"review\" id=\"reviewBox\"><\/div>\r\n    <div class=\"consent\">\r\n      <input id=\"consent\" type=\"checkbox\">\r\n      <label for=\"consent\" style=\"margin:0;font-weight:600\">I confirm that the information above is accurate to the best of my knowledge and authorize Boti's to contact me regarding this quote request.<\/label>\r\n    <\/div>\r\n    <div class=\"error\" id=\"err8\"><\/div>\r\n    <div class=\"navrow\">\r\n      <button class=\"btn back\" type=\"button\" onclick=\"goBack()\">Back<\/button>\r\n      <button class=\"btn submit\" type=\"button\" onclick=\"finalSubmit()\">REQUEST MY QUOTE<\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- DONE -->\r\n  <div class=\"screen\" id=\"q9\">\r\n    <div class=\"done\">\r\n      <div class=\"check\">\u2713<\/div>\r\n      <h2>Quote request received<\/h2>\r\n      <p id=\"doneMsg\">Your information has been received. A member of the Boti's team will review your request and contact you regarding your quote.<\/p>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"hidden-hp\" aria-hidden=\"true\">\r\n    <label>Website<input id=\"website\" tabindex=\"-1\" autocomplete=\"off\"><\/label>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n  const categories = [\r\n    {id:'forklift', name:'Forklift & Material Handling'},\r\n    {id:'rental', name:'Forklift \/ Equipment Rental'},\r\n    {id:'new_equipment', name:'New Equipment Purchase'},\r\n    {id:'used_equipment', name:'Used Equipment Purchase'},\r\n    {id:'battery', name:'Batteries & Charging Systems'},\r\n    {id:'dock', name:'Dock Equipment'},\r\n    {id:'door', name:'Roll-Up & Commercial Doors'},\r\n    {id:'gate', name:'Automatic Gates & Operators'},\r\n    {id:'access', name:'Access Control & Intercom'},\r\n    {id:'cctv', name:'CCTV & Security Cameras'},\r\n    {id:'fire', name:'Fire Alarm & Life Safety'},\r\n    {id:'monitoring', name:'Alarm Monitoring'},\r\n    {id:'electrical', name:'Electrical & Power'},\r\n    {id:'fabrication', name:'Fabrication, Rails & Protection'},\r\n    {id:'other', name:'Other Facility \/ Industrial Project'}\r\n  ];\r\n\r\n  const quoteTypesByCategory = {\r\n    forklift: [\r\n      'Repair Estimate',\r\n      'Preventive Maintenance Program',\r\n      'Rental',\r\n      'Purchase',\r\n      'Replacement',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ],\r\n    rental: [\r\n      'Rental',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ],\r\n    new_equipment: [\r\n      'Purchase',\r\n      'New Installation \/ New Equipment',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ],\r\n    used_equipment: [\r\n      'Purchase',\r\n      'Replacement',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ],\r\n    battery: [\r\n      'New Installation \/ New Equipment',\r\n      'Replacement',\r\n      'Upgrade \/ Expansion',\r\n      'Repair Estimate',\r\n      'Preventive Maintenance Program',\r\n      'Purchase',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ],\r\n    dock: [\r\n      'New Installation \/ New Equipment',\r\n      'Replacement',\r\n      'Upgrade \/ Expansion',\r\n      'Repair Estimate',\r\n      'Preventive Maintenance Program',\r\n      'Project \/ Construction',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ],\r\n    door: [\r\n      'New Installation \/ New Equipment',\r\n      'Replacement',\r\n      'Upgrade \/ Expansion',\r\n      'Repair Estimate',\r\n      'Preventive Maintenance Program',\r\n      'Project \/ Construction',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ],\r\n    gate: [\r\n      'New Installation \/ New Equipment',\r\n      'Replacement',\r\n      'Upgrade \/ Expansion',\r\n      'Repair Estimate',\r\n      'Preventive Maintenance Program',\r\n      'Project \/ Construction',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ],\r\n    access: [\r\n      'New Installation \/ New Equipment',\r\n      'Replacement',\r\n      'Upgrade \/ Expansion',\r\n      'Repair Estimate',\r\n      'Preventive Maintenance Program',\r\n      'Project \/ Construction',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ],\r\n    cctv: [\r\n      'New Installation \/ New Equipment',\r\n      'Replacement',\r\n      'Upgrade \/ Expansion',\r\n      'Repair Estimate',\r\n      'Preventive Maintenance Program',\r\n      'Project \/ Construction',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ],\r\n    fire: [\r\n      'New Installation \/ New Equipment',\r\n      'Replacement',\r\n      'Upgrade \/ Expansion',\r\n      'Repair Estimate',\r\n      'Preventive Maintenance Program',\r\n      'Project \/ Construction',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ],\r\n    monitoring: [\r\n      'New Installation \/ New Equipment',\r\n      'Replacement',\r\n      'Upgrade \/ Expansion',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ],\r\n    electrical: [\r\n      'New Installation \/ New Equipment',\r\n      'Replacement',\r\n      'Upgrade \/ Expansion',\r\n      'Repair Estimate',\r\n      'Preventive Maintenance Program',\r\n      'Project \/ Construction',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ],\r\n    fabrication: [\r\n      'New Installation \/ New Equipment',\r\n      'Replacement',\r\n      'Upgrade \/ Expansion',\r\n      'Repair Estimate',\r\n      'Project \/ Construction',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ],\r\n    other: [\r\n      'New Installation \/ New Equipment',\r\n      'Replacement',\r\n      'Upgrade \/ Expansion',\r\n      'Repair Estimate',\r\n      'Preventive Maintenance Program',\r\n      'Project \/ Construction',\r\n      'Budgetary Quote',\r\n      'Other'\r\n    ]\r\n  };\r\n\r\n  const timeframes = [\r\n    'As soon as possible',\r\n    'Within 30 days',\r\n    '1\u20133 months',\r\n    '3\u20136 months',\r\n    'Planning \/ budgeting only',\r\n    'Not sure yet'\r\n  ];\r\n\r\n  window.quoteState = {\r\n    cat:null,\r\n    quoteType:'',\r\n    timeframe:''\r\n  };\r\n  window.historyStack = [];\r\n\r\n  \/\/ Deep-link support: \/request-a-quote\/?category=gate\r\n  const deepLinkCategory = new URLSearchParams(window.location.search).get('category');\r\n\r\n  const categoryChoices = document.getElementById('categoryChoices');\r\n  categories.forEach(cat=>{\r\n    const b=document.createElement('button');\r\n    b.type='button';\r\n    b.className='choice';\r\n    b.textContent=cat.name;\r\n    b.onclick=()=>{\r\n      quoteState.cat=cat;\r\n      quoteState.quoteType='';\r\n      buildQuoteTypes(cat.id);\r\n      buildDynamicFields();\r\n      showScreen('q2');\r\n    };\r\n    categoryChoices.appendChild(b);\r\n  });\r\n\r\n  const quoteTypeChoices = document.getElementById('quoteTypeChoices');\r\n\r\n  function buildQuoteTypes(catId){\r\n    quoteTypeChoices.innerHTML='';\r\n    const types = quoteTypesByCategory[catId] || quoteTypesByCategory.other;\r\n\r\n    types.forEach(v=>{\r\n      const b=document.createElement('button');\r\n      b.type='button';\r\n      b.className='choice';\r\n      b.textContent=v;\r\n      b.onclick=()=>{\r\n        quoteState.quoteType=v;\r\n        showScreen('q3');\r\n      };\r\n      quoteTypeChoices.appendChild(b);\r\n    });\r\n  }\r\n\r\n  const timeChoices = document.getElementById('timeChoices');\r\n  timeframes.forEach(v=>{\r\n    const b=document.createElement('button');\r\n    b.type='button';\r\n    b.className='choice';\r\n    b.textContent=v;\r\n    b.onclick=()=>{\r\n      quoteState.timeframe=v;\r\n      [...timeChoices.querySelectorAll('.choice')].forEach(x=>x.classList.remove('selected'));\r\n      b.classList.add('selected');\r\n    };\r\n    timeChoices.appendChild(b);\r\n  });\r\n\r\n  \/\/ Keep attachments selected across multiple trips into the file picker.\r\n  const attachmentInput = document.getElementById('attachments');\r\n  const attachmentStore = new DataTransfer();\r\n\r\n  attachmentInput.addEventListener('change', function(){\r\n    const incoming = Array.from(this.files || []);\r\n\r\n    incoming.forEach(file => {\r\n      const duplicate = Array.from(attachmentStore.files).some(existing =>\r\n        existing.name === file.name &&\r\n        existing.size === file.size &&\r\n        existing.lastModified === file.lastModified\r\n      );\r\n\r\n      if (!duplicate && attachmentStore.files.length < 8) {\r\n        attachmentStore.items.add(file);\r\n      }\r\n    });\r\n\r\n    this.files = attachmentStore.files;\r\n    renderAttachmentList();\r\n  });\r\n\r\n  function renderAttachmentList(){\r\n    const list = document.getElementById('fileList');\r\n    const files = Array.from(attachmentStore.files);\r\n\r\n    if (!files.length) {\r\n      list.innerHTML = '';\r\n      return;\r\n    }\r\n\r\n    list.innerHTML = files.map((file, index) =>\r\n      '<div style=\"display:flex;justify-content:space-between;align-items:center;gap:10px;padding:5px 0;\">' +\r\n        '<span>' + escapeHtml(file.name) + '<\/span>' +\r\n        '<button type=\"button\" data-remove-file=\"' + index + '\" ' +\r\n          'style=\"border:0;background:#edf1f6;color:#14203a;border-radius:6px;padding:5px 8px;cursor:pointer;font-weight:700;\">Remove<\/button>' +\r\n      '<\/div>'\r\n    ).join('');\r\n\r\n    list.querySelectorAll('[data-remove-file]').forEach(btn => {\r\n      btn.addEventListener('click', () => {\r\n        const removeIndex = Number(btn.getAttribute('data-remove-file'));\r\n        const remaining = Array.from(attachmentStore.files).filter((_, i) => i !== removeIndex);\r\n\r\n        while (attachmentStore.items.length) {\r\n          attachmentStore.items.remove(0);\r\n        }\r\n        remaining.forEach(file => attachmentStore.items.add(file));\r\n\r\n        attachmentInput.files = attachmentStore.files;\r\n        renderAttachmentList();\r\n      });\r\n    });\r\n  }\r\n\r\n  window.value=function(id){\r\n    const el=document.getElementById(id);\r\n    return el ? (el.value||'').trim() : '';\r\n  };\r\n\r\n  window.showError=function(id,msg){\r\n    const el=document.getElementById(id);\r\n    if(!el)return;\r\n    el.textContent=msg;\r\n    el.style.display='block';\r\n  };\r\n\r\n  window.clearError=function(id){\r\n    const el=document.getElementById(id);\r\n    if(!el)return;\r\n    el.textContent='';\r\n    el.style.display='none';\r\n  };\r\n\r\n  const names={\r\n    q1:'Service Category',\r\n    q2:'Quote Type',\r\n    q3:'Contact Information',\r\n    q4:'Project Details',\r\n    q5:'Location',\r\n    q6:'Timing',\r\n    q7:'Attachments',\r\n    q8:'Review'\r\n  };\r\n\r\n  window.showScreen=function(id,push=true){\r\n    const current=document.querySelector('#botisQuoteApp .screen.active');\r\n    if(push && current && current.id!==id){\r\n      historyStack.push(current.id);\r\n    }\r\n    document.querySelectorAll('#botisQuoteApp .screen').forEach(s=>s.classList.remove('active'));\r\n    document.getElementById(id).classList.add('active');\r\n\r\n    const n=parseInt(id.replace('q',''),10);\r\n    const wrap=document.getElementById('progressWrap');\r\n    if(n>=1 && n<=8){\r\n      wrap.style.display='block';\r\n      document.getElementById('stepText').textContent='Step '+n+' of 8';\r\n      document.getElementById('stepName').textContent=names[id]||'';\r\n      document.getElementById('progressBar').style.width=(n\/8*100)+'%';\r\n    } else {\r\n      wrap.style.display='none';\r\n    }\r\n    document.getElementById('botisQuoteApp').scrollIntoView({behavior:'smooth',block:'start'});\r\n  };\r\n\r\n  window.goBack=function(){\r\n    const prev=historyStack.pop();\r\n    if(prev)showScreen(prev,false);\r\n  };\r\n\r\n  window.contactNext=function(){\r\n    clearError('err3');\r\n    const name=value('f_name');\r\n    const phone=value('f_phone');\r\n    const email=value('f_email');\r\n    if(!name || !phone || !email){\r\n      showError('err3','Please enter your name, phone number and email address.');\r\n      return;\r\n    }\r\n    if(!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(email)){\r\n      showError('err3','Please enter a valid email address.');\r\n      return;\r\n    }\r\n    showScreen('q4');\r\n  };\r\n\r\n  window.timingNext=function(){\r\n    clearError('err6');\r\n    if(!quoteState.timeframe){\r\n      showError('err6','Please choose the timeframe that best fits your project.');\r\n      return;\r\n    }\r\n    showScreen('q7');\r\n  };\r\n\r\n  const detailMap={\r\n    forklift:[\r\n      ['Equipment type','text','Forklift, reach truck, pallet jack, order picker, telehandler, aerial lift, etc.'],\r\n      ['Make','text',''],\r\n      ['Model','text',''],\r\n      ['Serial number','text',''],\r\n      ['Capacity','text','Example: 5,000 lb'],\r\n      ['Power \/ fuel type','select',['Electric - Lithium','Electric - Lead Acid','LPG \/ Propane','Gasoline','Diesel','Unknown']],\r\n      ['Quantity','number',''],\r\n      ['What would you like quoted?','textarea','Describe the equipment, repair estimate, planned work or fleet requirement.']\r\n    ],\r\n    rental:[\r\n      ['Equipment needed','text','Forklift, reach truck, telehandler, scissor lift, etc.'],\r\n      ['Required capacity \/ height','text',''],\r\n      ['Power \/ fuel preference','select',['Electric - Lithium','Electric - Lead Acid','LPG \/ Propane','Diesel','No preference']],\r\n      ['Quantity','number',''],\r\n      ['Rental duration','text','Example: 1 day, 2 weeks, 3 months'],\r\n      ['Indoor \/ outdoor use','select',['Indoor','Outdoor','Both']],\r\n      ['Application \/ load details','textarea','What will the equipment be lifting or doing?']\r\n    ],\r\n    new_equipment:[\r\n      ['Equipment type','text',''],\r\n      ['Required capacity','text',''],\r\n      ['Required lift height','text',''],\r\n      ['Power \/ fuel preference','select',['Electric - Lithium','Electric - Lead Acid','LPG \/ Propane','Diesel','No preference']],\r\n      ['Quantity','number',''],\r\n      ['Application','textarea','Describe loads, aisle width, operating environment, attachments or other requirements.']\r\n    ],\r\n    used_equipment:[\r\n      ['Equipment type','text',''],\r\n      ['Preferred make \/ model','text',''],\r\n      ['Required capacity','text',''],\r\n      ['Required lift height','text',''],\r\n      ['Power \/ fuel preference','select',['Electric','LPG \/ Propane','Diesel','No preference']],\r\n      ['Quantity','number',''],\r\n      ['Application \/ preferences','textarea','Describe what you need and any age, hour, price or condition preferences.']\r\n    ],\r\n    battery:[\r\n      ['Equipment make \/ model','text',''],\r\n      ['Battery voltage','text','Example: 24V, 36V, 48V, 80V'],\r\n      ['Battery information','text','Model, amp-hour rating or data plate information'],\r\n      ['Charger information','text','Voltage, phase, model or existing charger information'],\r\n      ['Battery type','select',['Lithium','Lead Acid','Not sure']],\r\n      ['Quantity','number',''],\r\n      ['What is needed?','textarea','New battery, charger, charging-room layout, repair, replacement, cable work, etc.']\r\n    ],\r\n    dock:[\r\n      ['Dock equipment type','select',['Dock leveler','Edge-of-dock leveler','Vehicle restraint','Dock seal \/ shelter','Dock bumper','Dock lift','Other']],\r\n      ['Manufacturer','text',''],\r\n      ['Model','text',''],\r\n      ['Quantity','number',''],\r\n      ['Existing equipment?','select',['Yes','No','Not sure']],\r\n      ['Project description','textarea','Describe the existing condition, size, capacity, replacement or new-installation requirement.']\r\n    ],\r\n    door:[\r\n      ['Door type','select',['Roll-up steel door','Sectional overhead door','High-speed door','Fire door','Other']],\r\n      ['Approximate opening size','text','Width x height'],\r\n      ['Manufacturer \/ model','text',''],\r\n      ['Quantity','number',''],\r\n      ['Motorized or manual','select',['Motorized','Manual','Not sure']],\r\n      ['Project description','textarea','New door, replacement, operator, controls, safety devices, repair estimate, etc.']\r\n    ],\r\n    gate:[\r\n      ['Gate type','select',['Slide gate','Swing gate','Vertical lift gate','Barrier arm','Not sure \/ new design']],\r\n      ['Approximate opening width','text',''],\r\n      ['Existing gate?','select',['Yes','No','Not sure']],\r\n      ['Operator manufacturer \/ model','text',''],\r\n      ['Quantity','number',''],\r\n      ['Access requirements','textarea','Keypads, card readers, remotes, loops, intercom, vehicle detection, schedules, etc.'],\r\n      ['Project description','textarea','Describe the existing gate or desired new system.']\r\n    ],\r\n    access:[\r\n      ['System type','select',['Card \/ credential access','Video intercom','Keypad \/ PIN access','Door control','Gate access','Integrated system','Not sure']],\r\n      ['Number of doors \/ gates','number',''],\r\n      ['Existing system \/ manufacturer','text',''],\r\n      ['Credential preference','text','Cards, fobs, mobile credentials, PIN, etc.'],\r\n      ['Project description','textarea','Describe locations, users, schedules, integrations and desired operation.']\r\n    ],\r\n    cctv:[\r\n      ['Number of cameras','number',''],\r\n      ['Indoor \/ outdoor','select',['Indoor','Outdoor','Both']],\r\n      ['Existing system \/ manufacturer','text',''],\r\n      ['Recording requirement','text','Example: 30 days'],\r\n      ['Remote viewing required?','select',['Yes','No','Not sure']],\r\n      ['Project description','textarea','Describe areas to cover, analytics, audio, verification, monitoring or network requirements.']\r\n    ],\r\n    fire:[\r\n      ['System \/ project type','select',['New fire alarm system','Panel replacement','Device addition \/ expansion','Inspection \/ testing','As-built \/ documentation','Monitoring connection','Other']],\r\n      ['Existing panel manufacturer \/ model','text',''],\r\n      ['Building type \/ size','text',''],\r\n      ['Number of buildings','number',''],\r\n      ['Project description','textarea','Describe the project, AHJ requirements, plans, existing system or known deficiencies.']\r\n    ],\r\n    monitoring:[\r\n      ['Monitoring type','select',['Intrusion','Fire alarm','Intrusion + Fire','Elevator \/ specialty','Other']],\r\n      ['Existing panel manufacturer \/ model','text',''],\r\n      ['Existing monitoring provider','text',''],\r\n      ['Number of locations','number',''],\r\n      ['Project description','textarea','Takeover, communicator replacement, new monitoring, app access or other requirements.']\r\n    ],\r\n    electrical:[\r\n      ['System voltage','text','Example: 120\/208V, 277\/480V'],\r\n      ['Phase','select',['Single phase','Three phase','Not sure']],\r\n      ['Existing panel \/ breaker information','text',''],\r\n      ['Equipment being powered','text',''],\r\n      ['Approximate run distance','text',''],\r\n      ['Project description','textarea','Describe feeders, circuits, panels, chargers, lighting, controls, disconnects or other electrical work.']\r\n    ],\r\n    fabrication:[\r\n      ['Fabrication type','select',['Guardrail','Handrail','Bollards','Equipment guard \/ barrier','Gate \/ fence fabrication','Stairs \/ platforms','Custom iron \/ steel','Other']],\r\n      ['Approximate dimensions \/ quantity','text',''],\r\n      ['Indoor \/ outdoor','select',['Indoor','Outdoor','Both']],\r\n      ['Finish','select',['Painted','Powder coated','Galvanized','Stainless','Not sure']],\r\n      ['Project description','textarea','Describe what needs to be fabricated, modified, repaired or installed.']\r\n    ],\r\n    other:[\r\n      ['Project \/ equipment type','text',''],\r\n      ['Quantity','text',''],\r\n      ['Existing equipment \/ system','text',''],\r\n      ['Project description','textarea','Describe what you need quoted and any important requirements.']\r\n    ]\r\n  };\r\n\r\n  function escapeHtml(s){\r\n    return String(s||'').replace(\/[&<>\"']\/g,m=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#039;'}[m]));\r\n  }\r\n\r\n  window.buildDynamicFields=function(){\r\n    const wrap=document.getElementById('dynFields');\r\n    wrap.innerHTML='';\r\n    if(!quoteState.cat)return;\r\n    const defs=detailMap[quoteState.cat.id]||detailMap.other;\r\n\r\n    defs.forEach((d,i)=>{\r\n      const field=document.createElement('div');\r\n      field.className='field';\r\n      field.dataset.label=d[0];\r\n\r\n      const label=document.createElement('label');\r\n      label.textContent=d[0];\r\n      field.appendChild(label);\r\n\r\n      let input;\r\n      if(d[1]==='textarea'){\r\n        input=document.createElement('textarea');\r\n        input.placeholder=d[2]||'';\r\n      } else if(d[1]==='select'){\r\n        input=document.createElement('select');\r\n        const first=document.createElement('option');\r\n        first.value='';\r\n        first.textContent='Select';\r\n        input.appendChild(first);\r\n        d[2].forEach(v=>{\r\n          const o=document.createElement('option');\r\n          o.value=v;o.textContent=v;\r\n          input.appendChild(o);\r\n        });\r\n      } else {\r\n        input=document.createElement('input');\r\n        input.type=d[1]||'text';\r\n        input.placeholder=typeof d[2]==='string'?d[2]:'';\r\n        if(input.type==='number')input.min='1';\r\n      }\r\n      input.id='dyn_'+i;\r\n      field.appendChild(input);\r\n      wrap.appendChild(field);\r\n    });\r\n  };\r\n\r\n  window.collectQuoteDetailsObject=function(){\r\n    const details={};\r\n    document.querySelectorAll('#dynFields .field').forEach(field=>{\r\n      const label=field.dataset.label;\r\n      const input=field.querySelector('input,select,textarea');\r\n      if(label && input && input.value.trim()){\r\n        details[label]=input.value.trim();\r\n      }\r\n    });\r\n    return details;\r\n  };\r\n\r\n  function addReview(label,val){\r\n    if(!val)return '';\r\n    return '<div class=\"review-row\"><div class=\"review-label\">'+escapeHtml(label)+'<\/div><div class=\"review-value\">'+escapeHtml(val)+'<\/div><\/div>';\r\n  }\r\n\r\n  window.reviewNext=function(){\r\n    clearError('err7');\r\n    const files=Array.from(document.getElementById('attachments').files||[]);\r\n    if(files.length>8){\r\n      showError('err7','Please select no more than 8 attachments.');\r\n      return;\r\n    }\r\n    for(const f of files){\r\n      if(f.size>12*1024*1024){\r\n        showError('err7','Each attachment must be 12 MB or smaller. \"'+f.name+'\" is too large.');\r\n        return;\r\n      }\r\n    }\r\n\r\n    const details=collectQuoteDetailsObject();\r\n    let detailText=Object.keys(details).map(k=>k+': '+details[k]).join('\\n');\r\n\r\n    let site=[value('site_address'),value('site_city'),value('site_state'),value('site_zip')].filter(Boolean).join(', ');\r\n    let review='';\r\n    review+=addReview('Category',quoteState.cat?quoteState.cat.name:'');\r\n    review+=addReview('Quote type',quoteState.quoteType);\r\n    review+=addReview('Timeframe',quoteState.timeframe);\r\n    review+=addReview('Name',value('f_name'));\r\n    review+=addReview('Company',value('f_company'));\r\n    review+=addReview('Phone',value('f_phone'));\r\n    review+=addReview('Email',value('f_email'));\r\n    review+=addReview('Project details',detailText);\r\n    review+=addReview('Site \/ delivery location',site);\r\n    review+=addReview('On-site contact',value('site_contact'));\r\n    review+=addReview('Preferred date',value('preferred_date'));\r\n    review+=addReview('Timing notes',value('schedule_notes'));\r\n    review+=addReview('Attachments',files.length?files.map(f=>f.name).join(', '):'None');\r\n    review+=addReview('Additional notes',value('final_notes'));\r\n\r\n    document.getElementById('reviewBox').innerHTML=review;\r\n    showScreen('q8');\r\n  };\r\n\r\n  window.finalSubmit=async function(){\r\n    clearError('err8');\r\n\r\n    if(!document.getElementById('consent').checked){\r\n      showError('err8','Please confirm the information before submitting.');\r\n      return;\r\n    }\r\n\r\n    const btn=document.querySelector('#q8 .submit');\r\n    const original=btn.textContent;\r\n    btn.disabled=true;\r\n    btn.textContent='Sending\u2026';\r\n\r\n    try{\r\n      const data=new FormData();\r\n      data.append('website',value('website'));\r\n      data.append('category',quoteState.cat?quoteState.cat.name:'');\r\n      data.append('category_id',quoteState.cat?quoteState.cat.id:'');\r\n      data.append('quote_type',quoteState.quoteType||'');\r\n      data.append('timeframe',quoteState.timeframe||'');\r\n\r\n      data.append('name',value('f_name'));\r\n      data.append('phone',value('f_phone'));\r\n      data.append('company',value('f_company'));\r\n      data.append('email',value('f_email'));\r\n      data.append('existing_customer',value('existing_customer'));\r\n      data.append('contact_method',value('contact_method'));\r\n\r\n      data.append('site_address',value('site_address'));\r\n      data.append('site_city',value('site_city'));\r\n      data.append('site_state',value('site_state'));\r\n      data.append('site_zip',value('site_zip'));\r\n      data.append('site_contact',value('site_contact'));\r\n      data.append('site_phone',value('site_phone'));\r\n      data.append('site_access',value('site_access'));\r\n\r\n      data.append('preferred_date',value('preferred_date'));\r\n      data.append('schedule_notes',value('schedule_notes'));\r\n      data.append('final_notes',value('final_notes'));\r\n\r\n      data.append('quote_details',JSON.stringify(collectQuoteDetailsObject()));\r\n\r\n      const input=document.getElementById('attachments');\r\n      Array.from(input.files||[]).forEach(file=>data.append('attachments[]',file));\r\n\r\n      const response=await fetch('\/wp-json\/botis\/v1\/quote-request',{\r\n        method:'POST',\r\n        body:data,\r\n        credentials:'same-origin'\r\n      });\r\n\r\n      let result={};\r\n      try{result=await response.json();}catch(e){}\r\n\r\n      if(!response.ok || result.success!==true){\r\n        throw new Error(result.message||'We could not send your quote request. Please try again or call us.');\r\n      }\r\n\r\n      document.getElementById('doneMsg').textContent=\r\n        result.message||\r\n        \"Your quote request was received. A member of our team will review it and contact you regarding your quote.\";\r\n\r\n      historyStack=[];\r\n      showScreen('q9',false);\r\n    }catch(error){\r\n      showError('err8',error.message||'We could not send your quote request. Please try again or call us.');\r\n    }finally{\r\n      btn.disabled=false;\r\n      btn.textContent=original;\r\n    }\r\n  };\r\n  \/\/ Deep-link initialization must run only after all form functions exist.\r\n  if (deepLinkCategory) {\r\n    const requested = deepLinkCategory.toLowerCase().trim();\r\n\r\n    const aliases = {\r\n      forklift: 'forklift',\r\n      material: 'forklift',\r\n      materialhandling: 'forklift',\r\n\r\n      rental: 'rental',\r\n      rent: 'rental',\r\n\r\n      new: 'new_equipment',\r\n      newequipment: 'new_equipment',\r\n\r\n      used: 'used_equipment',\r\n      usedequipment: 'used_equipment',\r\n\r\n      battery: 'battery',\r\n      batteries: 'battery',\r\n      charger: 'battery',\r\n      charging: 'battery',\r\n\r\n      dock: 'dock',\r\n\r\n      door: 'door',\r\n      doors: 'door',\r\n\r\n      gate: 'gate',\r\n      gates: 'gate',\r\n      operator: 'gate',\r\n\r\n      access: 'access',\r\n      accesscontrol: 'access',\r\n      security: 'access',\r\n      intrusion: 'access',\r\n      intercom: 'access',\r\n\r\n      cctv: 'cctv',\r\n      camera: 'cctv',\r\n      cameras: 'cctv',\r\n      surveillance: 'cctv',\r\n\r\n      fire: 'fire',\r\n      firealarm: 'fire',\r\n      lifesafety: 'fire',\r\n\r\n      monitoring: 'monitoring',\r\n      alarmmonitoring: 'monitoring',\r\n\r\n      electrical: 'electrical',\r\n      electric: 'electrical',\r\n      power: 'electrical',\r\n\r\n      fabrication: 'fabrication',\r\n      guardrail: 'fabrication',\r\n      rails: 'fabrication',\r\n\r\n      other: 'other'\r\n    };\r\n\r\n    const normalized = requested.replace(\/[^a-z0-9]\/g, '');\r\n    const categoryId = aliases[normalized] || requested;\r\n\r\n    const matchedCategory = categories.find(cat => cat.id === categoryId);\r\n\r\n    if (matchedCategory) {\r\n      quoteState.cat = matchedCategory;\r\n      quoteState.quoteType = '';\r\n      buildQuoteTypes(matchedCategory.id);\r\n      buildDynamicFields();\r\n      showScreen('q2', false);\r\n    }\r\n  }\r\n\r\n})();\r\n<\/script>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3e81b39 elementor-widget elementor-widget-text-editor\" data-id=\"3e81b39\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Tell us about your facility, existing access-control equipment, and the areas you need to protect. We can help with new installations, takeovers, upgrades, troubleshooting, and monitored intrusion protection.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Boti&#8217;s Boti&#8217;s Corporation &nbsp;|&nbsp; Boti&#8217;s Industrial Systems LLC Request a Quote Tell us what you need and provide as much information as you have. Photos, equipment information, plans and specifications help us prepare an accurate quote. Step 1 of 8 Service Category What do you need quoted? Choose the category that best matches the project [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-15381","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Request a Quote | Boti&#039;s Corporation<\/title>\n<meta name=\"description\" content=\"Request a quote from Boti&#039;s for forklifts, rentals, dock equipment, gates, access control, CCTV, fire alarm, electrical, &amp; facility services.\" \/>\n<meta name=\"robots\" content=\"noindex, nofollow\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Request a Quote | Boti&#039;s Corporation\" \/>\n<meta property=\"og:description\" content=\"Request a quote from Boti&#039;s for forklifts, rentals, dock equipment, gates, access control, CCTV, fire alarm, electrical, &amp; facility services.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/botiscorp.com\/es\/request-a-quote\/\" \/>\n<meta property=\"og:site_name\" content=\"Boti&#039;s Corp\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-09T16:55:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/botiscorp.com\/wp-content\/uploads\/2025\/01\/Botis_Logo-e1736684009823.png\" \/>\n\t<meta property=\"og:image:width\" content=\"200\" \/>\n\t<meta property=\"og:image:height\" content=\"54\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/botiscorp.com\\\/request-a-quote\\\/\",\"url\":\"https:\\\/\\\/botiscorp.com\\\/request-a-quote\\\/\",\"name\":\"Request a Quote | Boti's Corporation\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/botiscorp.com\\\/#website\"},\"datePublished\":\"2026-09-08T17:22:26+00:00\",\"dateModified\":\"2026-09-09T16:55:40+00:00\",\"description\":\"Request a quote from Boti's for forklifts, rentals, dock equipment, gates, access control, CCTV, fire alarm, electrical, & facility services.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/botiscorp.com\\\/request-a-quote\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/botiscorp.com\\\/request-a-quote\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/botiscorp.com\\\/request-a-quote\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/botiscorp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Request A Quote\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/botiscorp.com\\\/#website\",\"url\":\"https:\\\/\\\/botiscorp.com\\\/\",\"name\":\"BOTIS Corp\",\"description\":\"Forklifts, Lifts &amp; Trailers for Sale &amp; Rent | BOTIS Corp\",\"publisher\":{\"@id\":\"https:\\\/\\\/botiscorp.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/botiscorp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/botiscorp.com\\\/#organization\",\"name\":\"BOTIS Corp\",\"url\":\"https:\\\/\\\/botiscorp.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/botiscorp.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/botiscorp.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/logoW_botiscorp.png\",\"contentUrl\":\"https:\\\/\\\/botiscorp.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/logoW_botiscorp.png\",\"width\":2449,\"height\":758,\"caption\":\"BOTIS Corp\"},\"image\":{\"@id\":\"https:\\\/\\\/botiscorp.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Request a Quote | Boti's Corporation","description":"Request a quote from Boti's for forklifts, rentals, dock equipment, gates, access control, CCTV, fire alarm, electrical, & facility services.","robots":{"index":"noindex","follow":"nofollow"},"og_locale":"es_MX","og_type":"article","og_title":"Request a Quote | Boti's Corporation","og_description":"Request a quote from Boti's for forklifts, rentals, dock equipment, gates, access control, CCTV, fire alarm, electrical, & facility services.","og_url":"https:\/\/botiscorp.com\/es\/request-a-quote\/","og_site_name":"Boti&#039;s Corp","article_modified_time":"2026-09-09T16:55:40+00:00","og_image":[{"width":200,"height":54,"url":"https:\/\/botiscorp.com\/wp-content\/uploads\/2025\/01\/Botis_Logo-e1736684009823.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Tiempo de lectura":"2 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/botiscorp.com\/request-a-quote\/","url":"https:\/\/botiscorp.com\/request-a-quote\/","name":"Request a Quote | Boti's Corporation","isPartOf":{"@id":"https:\/\/botiscorp.com\/#website"},"datePublished":"2026-09-08T17:22:26+00:00","dateModified":"2026-09-09T16:55:40+00:00","description":"Request a quote from Boti's for forklifts, rentals, dock equipment, gates, access control, CCTV, fire alarm, electrical, & facility services.","breadcrumb":{"@id":"https:\/\/botiscorp.com\/request-a-quote\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/botiscorp.com\/request-a-quote\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/botiscorp.com\/request-a-quote\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/botiscorp.com\/"},{"@type":"ListItem","position":2,"name":"Request A Quote"}]},{"@type":"WebSite","@id":"https:\/\/botiscorp.com\/#website","url":"https:\/\/botiscorp.com\/","name":"BOTIS Corp","description":"Forklifts, Lifts &amp; Trailers for Sale &amp; Rent | BOTIS Corp","publisher":{"@id":"https:\/\/botiscorp.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/botiscorp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/botiscorp.com\/#organization","name":"BOTIS Corp","url":"https:\/\/botiscorp.com\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/botiscorp.com\/#\/schema\/logo\/image\/","url":"https:\/\/botiscorp.com\/wp-content\/uploads\/2025\/10\/logoW_botiscorp.png","contentUrl":"https:\/\/botiscorp.com\/wp-content\/uploads\/2025\/10\/logoW_botiscorp.png","width":2449,"height":758,"caption":"BOTIS Corp"},"image":{"@id":"https:\/\/botiscorp.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/botiscorp.com\/es\/wp-json\/wp\/v2\/pages\/15381","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/botiscorp.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/botiscorp.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/botiscorp.com\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/botiscorp.com\/es\/wp-json\/wp\/v2\/comments?post=15381"}],"version-history":[{"count":34,"href":"https:\/\/botiscorp.com\/es\/wp-json\/wp\/v2\/pages\/15381\/revisions"}],"predecessor-version":[{"id":15523,"href":"https:\/\/botiscorp.com\/es\/wp-json\/wp\/v2\/pages\/15381\/revisions\/15523"}],"wp:attachment":[{"href":"https:\/\/botiscorp.com\/es\/wp-json\/wp\/v2\/media?parent=15381"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}