{"id":2600,"date":"2022-02-18T14:28:38","date_gmt":"2022-02-18T12:28:38","guid":{"rendered":"https:\/\/www.nettipuhelinkauppa.fi\/?page_id=2600"},"modified":"2022-08-09T13:44:59","modified_gmt":"2022-08-09T11:44:59","slug":"integroitu-call-center-ratkaisu","status":"publish","type":"page","link":"https:\/\/www.perustele.fi\/index.php\/integroitu-call-center-ratkaisu\/","title":{"rendered":"INTEGROITU CALL-CENTER RATKAISU"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-2544\" src=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/01\/all_communications_slider-300x184.webp\" alt=\"\" width=\"300\" height=\"184\" srcset=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/01\/all_communications_slider-300x184.webp 300w, https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/01\/all_communications_slider.webp 391w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>Asiakkaat haluavat, ett\u00e4 heid\u00e4n puheluihinsa vastataan nopeasti. He odottavat sinun tiet\u00e4v\u00e4n, keit\u00e4 he ovat ja mit\u00e4 sanottiin viime kerralla, kun he soittivat ilman, ett\u00e4 heit\u00e4 siirret\u00e4\u00e4n useita kertoja. Palkinto tehokkaan asiakaskokemuksen tarjoamisesta &#8211; enemm\u00e4n myynti\u00e4, tyytyv\u00e4isi\u00e4 asiakkaita ja parempia arvosteluja! Viestint\u00e4 ei ole en\u00e4\u00e4 kalliiden vanhanaikaisten toimistopuhelinj\u00e4rjestelmien alaa. 3CX integroi puhelinkeskuksen ohjelmisto-ominaisuudet, jotka auttavat sinua tyydytt\u00e4m\u00e4\u00e4n vaativimmankin asiakkaan call center-tarpeet. Lis\u00e4ksi 3CX:n CRM-integraatio ja puheluty\u00f6nkulku eliminoivat ik\u00e4vystytt\u00e4v\u00e4t ja aikaa viev\u00e4t teht\u00e4v\u00e4t agenteiltasi, jolloin he voivat keskitty\u00e4 olennaiseen. Valitsetpa paikallisen tai pilviratkaisun, voit helposti yhdist\u00e4\u00e4 paikan p\u00e4\u00e4ll\u00e4 olevat ja virtuaaliset asiakaspalvelutiimit. Lis\u00e4\u00e4 asiakastyytyv\u00e4isyytt\u00e4 paikallisen tuen ja aikavy\u00f6hykkeiden avulla ja hy\u00f6dynn\u00e4 maailmanlaajuista ty\u00f6voimaa, joka on aina yhteydess\u00e4.<\/p>\n<h2><strong>PUHELUJONOT-\u00c4L\u00c4 MISSAA PUHELUA<\/strong><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-2601\" src=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/call-queue-handling-300x158.png\" alt=\"\" width=\"300\" height=\"158\" srcset=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/call-queue-handling-300x158.png 300w, https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/call-queue-handling.png 460w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>Puhelujonot henkil\u00f6ille tai ryhmille.<\/p>\n<p>Takuu, ettei puheluita j\u00e4\u00e4 vastaamatta.<\/p>\n<p>Kehittyneet jonostrategiat, kuten Round Robin,Hunt ja Osaamistaso.<\/p>\n<p>Agentit voivat vastata puheluihin mist\u00e4 tahansa &#8211; toimistosta tai et\u00e4yhteydest\u00e4.<\/p>\n<p>Takaisinsoittovaihtoehto ylivuotona kiireisin\u00e4 aikoina.<\/p>\n<h2><strong>PUHELUN TALLENNUS JA HENKIL\u00d6ST\u00d6N KOULUTUS<\/strong><\/h2>\n<p>Kouluta agentteja suoran puhelun aikana kuuntelemalla ja kuiskaamalla. <img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-2602\" src=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/call-reporting-300x206.png\" alt=\"\" width=\"300\" height=\"206\" srcset=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/call-reporting-300x206.png 300w, https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/call-reporting-100x70.png 100w, https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/call-reporting.png 429w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Ota puhelu haltuusi tarvittaessa.<\/p>\n<p>Tikettivastauksia voidaan seurata keskitetysti.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>TARKISTA PALVELUN TASO<\/strong><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-2603\" src=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/wallboard-report-300x158.png\" alt=\"\" width=\"300\" height=\"158\" srcset=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/wallboard-report-300x158.png 300w, https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/wallboard-report.png 421w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>Tarkista agentin suorituskyky sis\u00e4\u00e4nrakennettujen raporttien avulla.<\/p>\n<p>Katso pisin odotusaika ja hyl\u00e4tyt puhelut.<\/p>\n<p>Hanki SLA-raportteja ja takaisinsoittotilastoja.<\/p>\n<p>Vaihde\/sein\u00e4taulu jonojen reaaliaikaiseen seurantaan.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>PYYD\u00c4 LIS\u00c4TIETOJA:<\/strong><\/p>\n<form class=\"accua-form __accua-form__1 accua-form-view-sidebyside\" novalidate=\"novalidate\" action=\"#\" id=\"accua-form___accua-form__1_69e9da2985c2c\" method=\"post\"><input type=\"hidden\" name=\"_AccuaForm_ID\" value=\"__accua-form__1\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-0\"\/><input type=\"hidden\" name=\"_AccuaForm_buildID\" value=\"accua-form___accua-form__1_69e9da2985c2c\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-1\"\/><input type=\"hidden\" name=\"_AccuaForm_wpnonce\" value=\"66654f0378\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-2\"\/><input type=\"hidden\" name=\"_AccuaForm_jsuuid\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-3\"\/><input type=\"hidden\" name=\"_AccuaForm_referrer\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-4\"\/><input type=\"hidden\" name=\"_AccuaForm_user_agent\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-5\"\/><input type=\"hidden\" name=\"_AccuaForm_platform\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-6\"\/><input type=\"hidden\" name=\"_AccuaForm_tentatives\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-7\"\/><input type=\"hidden\" name=\"_AccuaForm_submit_method\" value=\"normal\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-8\"\/><input type=\"hidden\" name=\"_AccuaForm_hash\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-9\" value=\"pGMJptpBDApLMh9nGdhaqiJlP70=\"\/><input type=\"hidden\" name=\"_AccuaForm_iv\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-10\" value=\"W3hfNilFPGhra0NGOlVAUyEjXzA0fWRMYipxRyB6I1l6VSZzP1tWNkUxQjovQVkvLHpSbTg2KXJiMF1tLHx4PQ==\"\/><input type=\"hidden\" name=\"_AccuaForm_data\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-11\" value=\"DPi1hT5s+bzYQ33ArXyPkwuVODzMAcZ1z8Lf\/fDzOYhhu\/A8xDjCa\/ZXnrPA9hzNM6ctsX+kD6bFNJRsoDL4JrrLAZ7XxO9pi8lB1Z78MvpW244qnd\/zQhJHDt96HX+tqdKp24Lzmr9ouPJGFZF6bwYhqK3k3VjCs2d5NY4Y\/zCKgEFjYjiQWjl\/sNjF\/jxtgLJghRvAsah5TeU\/CPY9RCbZ+nWmCI1GDMZuEeJ3asxb+eaPdPWviq5MHhXsPdtzwAORGmIYbqBR1oCqmLs+W4eLQ7gwESfxIi5rx312e+1jdk8SczN0UT51ZdPQ6bT2dobVJ5DLJNJFyAVCVVU2NnodwTkdbVz0KPI4mgg25r8Gx9k6sB+eS\/1hroTvtLqBexP1ipGZ4AnZUciqxbMpfL2D\/Oekv8Up9NLxM55z3CQ7mv9z5whz5s\/MDBYThTyivpjUeeyqzHh8poTenmOLJmrbC6xS\/vPO7Ve0SGCcHjrQaopy\/DVlEKJMe\/Ao8gvQk4ZCJHymRh\/4RVnQzMpmtPfNogT4iYn4szZj0R1bv8Vb44BCX9TdTgkh\/a2GTpDW7GLX4vEu6coGyYE0TxszgWMHr9d6oRDr1LCdYE7HIzZbC9zhVxaxLrDSSGL6py9Br7Sz+CKuExYwVQnO0nkqgYoMg8hFXvQypleinrrnxTNXOo4IKYLqVyg0g6rJXbTmvPA3tjCLkBdpf9D8UE4slOxP6Pcvs7l3HuDX7MgXWE7EiEgNoaTVEVoimaE\/gganQgQsGxoXYYk6uhFBtb\/q+LAIBxxnw7r\/u2RbLq845680yBVz3pYO+0Vqr+vAiCQbbekMJOS+6Sz7w+B0XCM8H7ADUzFGW+KlMpOys3XefnfeWnpvmqSIGRKiQRZVW8XbBnzTIydN3R1ESN4QTydE\/jkiIgoV\/OKIbM20IykGckxRNH17DamyScP9yHwmhkAsbXUdhBHinGhrV7ofnQmBKkcADUywyB\/nKnzYR+7MdI\/y66Vw+poTKW7C9PqhP3qiY4A5W7R6bcMkTcO1d4eIPtpdbchcXTlAvipz2cZVTh1l9oPbhHWoB2NJV5ydCQ6XfKURWED3aEH\/CCn1oBNofh+ugtOG\/MLlcLp65VvSBM0cbh4C8kCFBVNp6EMfq0EjNPSwt4shxyayosDtWMpxTzafIULWahT1EA2sAgMCnBixSNqmI1hKgIPXdRelTU61lERIwmjT9Ge5UulvlSnvm81Zr8w9k\/YMxmLMPAkg0vLl8U74ukW08hLJLqM5+Y1bRF7Pi9SKMgLekE0ieHjff\/zxXlzpZ7GLRVPWuj8Mavb3I3QBUQcjfJdn3l+27uc6\/gGGDbuTRZW7+1\/vLNhmWpaujkZM0r\/8dKIlUBbedheTjJGW7vLq9mv3DkDxHIzfSCWtU6e1IkgNqmAjTtO4BgblPHZh07EOhlcrmqxBz\/6KJMgxsugvRpV6vZ7MhXN\/iruhjcJXqgn9lsZMHfuDVgrzN8bkGdu3HlR2h79zFi3ZO\/7NRT0Y\/eKCR1j+EpONdIqdskb0EbLW\/S9TF1OI\/ko+7jttETqHNOO6MB008PwVZbukcZcemMkw0hWpnJ0fa7878ojbPT8gYAx2autYJBr0eHkTgp7UKw2rG6H5TzbDE4YjW4nmxwkEw+zf7EbUFoDOFup8+bdUxQeIzlL\/WVGsPe19fmaVhjj9lbC3t7jHvOv0wUstiHIRJbik2KmW7+TB5gMXPnH58PgLE+NsslRRJm+bHepH7ecWDgwA6LcEnw8voUQppZrd73s69gJX5BOuwnfZZE2ZXIaZQ9sS\/OhsXx1fOPwkTCWQWtiHi4Q07efBEsd\/cosM2X4eT3OEXSiA8YvAEqltBbeS+U2wkqhfwoT5mpeO0QHa5xLT3Q\/yyi3nAtfLOP8p+x2q4DDm\/RoPR+GZcZ4X8SEvB6YARtj4Pqk9YB0SzryX03JBA1CNTGQc+oR0KrFHw8uhWh8yJP6sriDJsiSrw+YcNhGyj1FVuKpoz90GnSPDpyJb26Sx9Sckn3Uh4ucmM7vhdCpuE1Z4J2xeqRDQQt1Ic26J56sglz4LfgQD1SHRgBchEgDGVeEo0XexLIxT3zFXFDWTyWwHIbvtaZ0UWVX4DcdSAogA43VA1R2QKiR8ohhAj7Lgmr8P291quFQvvN1dhZVJDCCf9IywW9H+fBn9dPFz75QkCemgzcaI+SrTTwdRYauj+IRiHi378c+++2viqBMdhcWYU3SzpyFs1G9fayrhneZQLrDxLftw9i0Xj8rbGxDAGcEhTysEqOZ1Vg37oiXFnJiEVqO659CzIPev5SbhySr5ydI+aAyviki\/AM9lVeYGEhnYp0o9ktf6zcBpI6msjFXl52WB0rHIYN0oQuOFITaGejuYgIS4DIt7U11SyROAX4xqp1e\/EnbRLSIpIGgN2DTlKoMacnvB9qjMzXz2PNxuwwFhQz0moi\/IW51ZZwCCbySGIqsARfNRhLNicwKicdGqeR\/owwiGwm2J4mHnR9axuULCIABn+kNobQ2R2rHVQwfno93wckcJ6kWJrsccEhUi2vaABb\/2O8CnftslnqML5i5UHOrQPo15xNg0mgpRdethMRmCPwB02thh+e\/HVZbFdhf7LLfHxwvkTi5nnYCGKlKaH8+Q1nzOpOt3aPy4FwpRbCx+NKIq2q\/qYCpHxGtSdZ8uPN7eB9veJUmmeBQjLVEeiMCpqytTHspckQJwS3jW6YCP+KgHzOjmJYxjojKjbixS0r3WjYJmPsqfHmFXgUVOdRyM3p+inn6cr5+3fE9BQhBzveTlhPMakj5As9a7FtQXCndgXHPOgrutzexXHjmdblCzpuzjN7wzb5IbgHad5QitgbP5fBD7ZZm2MEeTUGVzSXrClELCuGOqLo3N8xC49JKe1LbmUW+wi3WkQ6GSL6lLv6kX5TynTyJr12GXO4EsCN2fUnntrIH5qwkAqRPjAXY+6lzG8GZaGvXTUaVfR8QLBRdmENSeNeMKc9Sy9O9bfuQjZnS83ra9gFgiVJREygGdqNWMiwR8tqe6GNR6rpmbjWn0nHd1aNdQZfwONqivQJFFJLXbfgXqQ98\/FEzSx4RC9dxSvLVLfCy+aeBJworKeHHZsFzoI2KIEC4QmUR\/UjADKInCY7HGkXhHt1q9r+MYnYbegyESYfYgSroNaRUI0qUyGJEFqiNJF48kgI+3dX7utPRrosMonVj2m+5LePJUCe7wk52kop9Pb4vw2crZWdqhYercG1OIREPfXbPgnBDyxOCUYSXmiJIfenr0Mk5KX5uKwKu\/icIBCJiW5+90XdXhARREgMlnH6SB0GBA4+PdfVYtCyMCtgEyDgnWjsj7hyInUXnFJTd5yjFdlV8sfNzjvsPXsuypjMN9t0d+3m4QXnNustAtf5k1QuZ1kt7bSYD90VjtY+ah6FhUTjdewl3vQnULAKh70eQ8XSuNGsZ82772nLqSnYPcCMcOqHB1lKNJ14n\/Z0pktlVl\/TPUyBKAVqGgeVjNzkEpoYxVMQZvtYOHXcRJrU281VVaazQ80+uIyTX7Hb1\/vOJNB2O7PcHC9zVqY0919cEd8xYtROElc6SKRYZ7MqE3MAlw9OmPF2QnMAmgEhBqnusY1UaEpbsomQ67DOHIs5DRURk3\/C7IuJp4rbFExH7aHgKlNbQHEPfUh6m5iWbwIw+OK4P1moZr6GlcLcPU0AGV3XulWlXaWGAqy6sEWmhSdX0nI9wWpY9BQVXu2aZzYKnlsYrEdvCAz+4L9yTFAqDQwcLLGqvCsaVzTaL8LuXC\/hjfocuOR7RZl30dZ3QlYcyT36r9lzFGwGz\/R54kOuR33vAEblt5u\/TrU1dTG5NSkPGsGyMx7Hd23MWZihMAg2vwzsYeXU\/e+tHFrVG\/v7kEFsjkLObvuqGoCth2GNJOS8S0nePkYUpv\/nDhSHW4q5ESu+w+V+ZELBvwUXdvOdNQWpbslVnJPcZU0Qzwq\/WmH0fwRqivVNUt+rGvTNJpQaX9dA+GbObRhXnn5mO4PdH+4V3VVHbkbVQb73FBWeV5c5pNaU1qDFJK8Pv1URMExOJAIhf6mp6MqcbV1ctcJThnNTp2Kgtpm+GqWnki44YTdHlMkrCXCrGM\/6kfEdIdNa6F\/rccL3DixEL1Vz32xCZBwR0K0L\/3XP3bQICygRJLK\/Y0zwwzG+Rgwqz6CfGxXo+aICU3vinttwT7c+DWQR1Xs2uDOh\/uu83E7cO+3KkV5t7afXGFps21n2f7poC5g+RTuE2+QqPbpSG+N9rLK6MR0AjcSLTSJ+U7l0wSQ0NOotvFrsGauFOnKj2OKm7GH8XnCXMXvhyAOhlWNCC0iZ5CDci3RLZXLewrPMpzhPVyuGfc22hnjra+MqWLKV0\/jZoMtq5MhpYYJ3A0p1F+pk1zt+WmMM\/yYp+HW0DbNbYdqaT+t1QcqI4w8rtlLTplNHSN\/MVVGeFB5a23dtCRSXy5gw27GNe0fpWjBUq4ZtRPHvwnbvLxHvq6Zj6yBuFkaZgpATjnhADfETkvZ4B82aQLVL5\/i0LnjhgU2cZhYyMaqL+\/Dn0m3XMTCuiFTMoPXXXzayXPavHZmgjq2UNsDfvtUb6MP5hDajHKsmEreB1C6UoRN8Hww0tTmn3BgL4\/IF3knnIrXJdWAp5H0U6CXI\/o\/O\/m6I9ouJBNXgdCY6L42jU2GCttxYuTCqleB1LPTc0cH0rDthEYbPNQd0B\/zvVV9HwLcLaz6J5O177S9s4SiPixupjCj9bAKOc06Rx+Dk7sM7pHQ1yNDXdSV3xhbeVmyIhA70K1h9vsOlLtGTKypdJ5yeqN29asLKzMMFrEJhI3yEiUTw5BvETP7GIOjSyYkGxdYgmXd79jOcSN\/KEKy2vb5R+DNTSE3+HvMymK8maQmfF6CaR+I5xZTBolt23nxrFCLBFMjgJMbVWbDNJ\/QsXXmAoHmQtckXmQtz9mzz\/fE5lnmH7HOePuK9LP+rmX29wpOJUK3+OGuM6EVTko1GZfoOhvWTTCFq2njGr56+jo78Zgqlf\/pjXW7rfTEhRSSUn+DZG5AhlHJVgH\/yTE14Ds9iDGaXm7ZJLV6aQE+ZG65NafeUedOWeHdns02GsdgOPZhG8qmJfGzYaA+0kz2R627rO9O21mWHfz9l9Pvy0s5ruFuWCNVP2dQBdX2mrGs3VWO0B3mlDa7Z\/56UCm+cDltzd2TcsX0+\/c9DtcZfi70aI+aRjndI5cUAIk9xwvLa2UrZV5K3r1IKR3y45NWgYKeApjTUGC7M9mUxxCcWAO4Di0d3dfXdMcFZam1YYSWkFr2AV0Gfv3vrPRULGFV7IX4YbyhSq7ou+nipwFObtzlluOOWVenYxE\/OWB5ktg5LnbpBG2MrGIKKpz7uCh7vQsbBSrtCE6UxwKUKvoNe6th03CHjLiX8ufULh9igOQOrbTGoK2KR2tDcR0Ts+fp5TkU0HHLxZkz8mBkfPgJe8v6qPRzDYiyQmjQp0ZKGfeZA8REQC2lDJzWoGtuRy1LT9qbBnCKOGAkBAX\/JblUC0vqBiR+5DwpS6CokdII5hjiWwNB0lU51141RYiVkl2yDedG+0ZbFx1WvRbLtzyD0KjTnQbblO2Ugb4DiDxveAwtoNwKJ7wOR\/dWJwX+ggopCtuXKm2k4XMwLJcFwcZhZjQ9LDdrBKwYL\/k7CdY\/dhZTjKXH0v7tDZ37S0KAgCZ5Y8vjS1PlveO+EoPYB2lm5OIv4cuWpaXDab9Ccxk6rDRv2gjVbENTrtqedVWC2jjVIFM2wxa1G3AI\/kheFRKEar+73RtykgqHdv4L4qV1vL\/Y8g+01qKPPpUiyHlzTGPR6O4Uy1bKreHwTTz3iCoqVc\/Ken5rCTNuisr6yl4Mme3m29B7GFt3Dx4fEgGPdtV8Mltn5ClKjmcpv5O7xSLvRE5sQJNPh0NlQz1Usex\/7i3ypFYYdwPy4nllrmT5\/HytbKNm7AgvevXEXhO6abL5Hkpg8eKQQa63t4m7aIs0UJ4IIXRWd3n4lcTFvES8mDspZxpvya1mxFXhNOW5Da5LKhdKtAYT+WpvobXWH9QY1P\/dHe2T9Is6hYRDsfEE+HZ1Geeu5+dKtUZmMC0y4K6cI8BHxIF0cpmC4e7BQhb8V0A57e\/a8AAeNFveZBfRTSiEyaPnuu2x0HzjlFFRd6JemI4Bixi1NgEiw8BdFhp37WtWI0S5om+sFYEs9RMXukv6RguRXcnxwjMZvIHaBEKhXmMvwKbm0TYivwjjubCfm75Ieqj2oyfjGxz5ruB3T8aASnpOaDEo7Dr2tv+Lx\/U+Ym8cS+dIUpELVbYhwd2yhfhdlqTwuJiBHjGDNpnWGnSPnyuig8ERP0pI9OwbqVAnJ43K6tKrj+13ONO8uYhUyL2YA\/m9u2xtdbu29lCaeYWM1wY4L1J9ao+4\/5GilyXHy\/zzo3JJJCtap9dVHIw+eC+NzSkEglFwu3qF2TjngfGcGSrxkGHHhUQA2ghSPzbGlhxYDz1\/thlrQpExxNqc0+9MMOUN60fOU6ihcHEeXEcokjUmFdBE29n\/j7MXunc7TG0mN9tIH5pLA0HBvDFkB3P3xfMHxk40E3RQMuUqwwl0jGWTNh829A531lnJXlMTtsj7MqKA5XYW\/xUy7D7V2+dRwjL7+rSrXPnw4q6wstPQs5iwSq8E+Q6Ql2p0gHRL3VfUNJ0rA7seq2D5b754BhuTmah4\/a\/Vpnx2TVR7amFSSRCZ6gSxsZ230pKgPbrTC8rn3nvBUgG9y+xIiEzuMsMlNAXUZ8GfJRr9ikfzkWtoKuknNghZ8yRc\/L7VoYhlOerWPzdur5wrHOdFOldDOQVuLjMOhuSrdTHe\/ATWKU7oYD8Ib4ApsiixgG\/rj0Cgm\/dc8YVrdosusqh0LzAz+lfMI9GDoMJJRnWjDN6JMa0nfKPfRvnuKB7V11HToWJh0HXQwCzut+2VsqbS5ni+F2A0ybs\/Q6Mq9yqyBwZcoqUe\/u1GtCg5RFJXCMmsx47e9e7X6Sr\/nMCwMcdtNrgeMF3zNGuaBiYJnFfT0gc6odnqdw\/\/c4+B+lV5XP1WW0f\/yyxEsoDFFJ\/J3DzrI+dufQQGeD4Pc\/C+mEE4Lqds91AKOgdtFQy2cGuZjCb\/P6beo2V\/f3QsKArg2XQqUG8gB537bLh3lG5C86jcviUAREsyvcVo6SY\/eDyJEtNTRvq69ONaVi+5WD2iZtM0fbTcDaL+E2iVbe\/bFuvSpu4bFy1M0iXxKvLXz9XTjTBTzOWR3fN7pSAcw1A0TbHPqZ70kjeM4VBbEPuP3yNhEDXViMsBCGWjTUzBMNbLqFu3RSnMmQMI71jpjWXODX3JfOXXL3cleRZ2heqwh0suJV9FNoWJvQaKEkjMiUrgOGKBB5ZHkvEVDKkuHhjfl4HwElcO5MvD4CnWVSMB3+wfR7l5VHjK3zkiw15U\/i52V9yi+vfCz9LsV8Ch6jK4l15F\/5TWO9nXuiqLuehd1ep0kBy2fPLhAvHNWcgx\/l4Dfo+WDIejXXGIOIBPqZZdZH\/5y3+eFvPWrCKG4icwnmkoRFY1JHgr8gtNKo8ZI7uBWhT0PuS2edsFKVNTDcFGHv+pAKJS6LHjpyg1PkwTgtVmRRhDl528yNpiA5QK3SLcc7K9amCkfE0HhqkxAKat6LfLyJRg29jXR7ULTl5gD3U9UcsoOgVRelfIXaKO3TSUv3oyrn7\/xgDr3FOfz2t8j7Yo4iRlivAP0x8BdS+hfuIGIwhuXXffMB6ocF3j9Lgizbud6RSaABe+W4pyZ1u05xWGBkO0sTCt52NmZo\/PZdkLzOuSbHXnYdoroWfDi8n3yyxWzT71KdrnefG99WAdOcuuzPrd\/EGE9dNxMjx1HiUyO\/yEHOkqa\/mP52+V7+d9WUzYzxpbcAH\/q2mnfFwOHT0PTtP2Z0H7VPGlyWUYZoCuHxUx8hUNNLb77S1AASHR0bBy4j93ruyteuZn4RqLlZiUGwvYrWtQVlSN\/yzNOXhChKBDs0O32mr9DcZ0LnyGp\/A+B\/E2WQcUVete5QwxSi6nK8YSOU6KAw5hNxYfwGIVLre2Tk74eTd\/ZoDDALNEc872Zb9wH+L4SsnwQzXv69D5+LfOr7bUujrTEGOX6P6Wkye2jqNfTSvGGh14BC3n2bJkhZHJk1TQcJwKds4OCdVhrVyjx3TzTNTGAyWC5DHafMQoHPUNqBle8kNqoiseDPxKE1l10kl8Joa7LkBXWCO8rS4HAbLjkjfSZlfX2YFlK016PVt\/2qgTpmqwmu9DsLzXlJ+oj15zXtT9cCSi3I2TJqSqjfaBQBRY1JmuX\/kt\/YQkQ6zw+7ojnAjEziF71asEmGsS5YAx1tBVzPlhIYZ9cRsf0glITB4fGwCnWxUo0BOWTlGUEUcpne+UUmzwk9emPierfoKMdOciXhP8YzbYhKgM5LQyo1bFFkHIqt\/T1jzYk4maqO0GOJCeKdwI7fgG27T8JnF2\/m0vS0cnZ5b6GrOwflryJ5Kj33ZeJowz9PjQWZOg0MwRNOCG6EQrs\/d1KgJLTHiXX0AlVklRPj6uyhJ92TE1+Z+uQr4JCQ7lhX+iOy5tCzZm8ikV9a656GFO3LrkZZB22N1JM\/7mltMKERx3nnEIWRFfimwajKr84l7ZPoSet\/vjf3K7ZddihtTFXJAQleumTOFyOcQRQF0FTfVgHA5PiluP38chgj2OPZ0eszQBM6Ngc4JLMIZz6D2L8vAxcFqcleG+qYirsOy0tnpoTUmbuG0A227FaGAl5Hv4vaIZu7PxgxmtWGulVMvK8bh3c6Ehj5EmOsBc5KqmMK+j1sBAJK55sT17KpetqLL\/rOsuEdbp1AKpYMv33v8jhXBBTOhRZS2oj115AHL9ijxHJeMh6vGxlr5Y8dG98am1cGffhZe3n0i11KUylgPW3kWreTnKQDPdBFIGWdZuZcBu9IzpgBTuR5yTEvoo95H3O02seBBUZ\/uh+s4FAuDYuMn2C0P2f3nV+Pve2RAc8U+r6audoOTt0Qx+RlrgBninawTMbVgv06VcrQNcDjHmehnBdB2t96dgjvqJ83Ls+0DZ3gGd1nBPCkzunHJ1rkvO6+cJnB1DwcC9IgFDS06sWfOu4s6lrmXKgZIk2tIUT0iBe0bFw93Ne9Xc0ckUQV8URtOO+fVkeUTb1RHXqaVfNnVlePhjYx1M9mJh24g4r1jqTnWXDI+CK7WcsFHhgGrQ3SIKyg5Cl2mdSh8UIvxuFDjHBijnHKTBjXK+RGl1AkaqCsuIUu10WvWDDDNZB\/JMwthjyxmmuH5hYsB97gUaKokCG\/IX8LZwEu68ofTn5eUB9+fn9PkMa8El0Vs6MQ3\/gVNcA+FK5OkA3fjrdw6qNGA9i2eoatxUmnCp4M1r+1\/tLo+MMa9EbMUD874nlwj2LBLgdOEXr1YljlusXb+R+D3zhhXVLJrwlAkWBBztgtXAJSHtfEduA3tVB6MKELS8ObqiKkm2zlhIy9axcY\/O1LYKaobJ87LDPXEGxMNihvwFOPxcPBauB62plETnbb8lJu22A1TDlBdaxC+QzssOvx8vJKZK56VmJR7h7iGEMJSgcREqWsKyZD+MbBbXNn6YiXDAEZloL4VrD4CCct1HOcriJ\/xmU21laOLu28nB0iQTFm8ZRg3NRG7b49jPAUpNNZ88uB5vQYJFwOb4rQtDNS9jzZmNmsuImuoZpB9B8AbKrH8YJItll0tTpdfXNwO7NXF3P6JtCGVoQ4ehHMbtpewa7OoulLm5O0\/VzknbYY66\/ppptfZwQugWgEL26VwntDnXvEvJmvjrUXPGTuUg+xVKex7Ny2Owjr9Ef\/CP\/Nwdz4SVV89kjvnw2CH2zhhpRBo374JmtZqW4IohRWzp3uHooAMsScrKnZHrM5v9wLQmzHFVYu7UrtYemgCplEXsm+1ditxZbDEO4MHB\/aujoVjAz75t2CDUph1arC1v\/Md7sUjuG0rL5fb8iPDw0IUyWSyQWGYHy0pZY7d68j7sPE5bv33v4nTjpoOtthalaAPEZH4vhMow0nBYRVzGRTqDiQLNMwUw89V41roA3nXhNnF0I4+W8OMHBokXFmNOpe1rhKw0KzZm3i9dxPgjsc48bl3BQB19DlM9sJyRbL0If4zznDpraM7gghozfi222Byc0VkWuFx7xGh5MI1b3w7ZHxR6qzwYzABOLfJx77atwjsYhtRP17xencMXVYFsOocXQxmMaF69E6y3B7NVJvflBQATIfCoZ8gbv2lnIVQAsxaWoWR3dAG97Cf3SODOjx18wx7aq\/CMuZYQzjVrsEobg6tQQf9Wd58WTo8FZe8LqUTU\/me4EOWY6v3l14NPV8+mI\/uvF3YAi0dUvvEag9A+vFzJqIUn01APGVx4LRxZAS4+wTmVawDL0JqE1zbjPpl+5XntoSWgrCP3q6cwfxUtYRQv4qsxHKSLVwmz37ia2d\/sBKB+Mnsr0cd0WCPNn2W14F5AEqlYHKXya7ImZf3NiOwAECtS3eFULlkfQZ9XJ0fWKlrbwbPAXhzUBnwI1C7Sw2RmR+9omG1H7Kg7OCQHBe7tzYVKVAYsu8FxNphwtQei1A4akaZCgAQ+SUOPwWVCEWQq\/3tXSY1a5zCg0hXeBzkf0zCCvGyBDH7KkSt4GZ8ZKg\/Zv4WvGmkKaqFW\/jVHJcxeLTX1DYY8UrGodeId\/MTL6VbC4xmduBMW+GpsBNAJxKh6Qzms9M2SwUm1rIuSVxj8Xth6ivZghCFUqSPQls1C\/MpFbe3GyES5niKS8zPzF8hGxIQ3qDZLvZ34QTTjXZnf6h3+dWZNOi0tWarhNuFZRHCPCtk+gBHYFjeEtYAVTPvWwvpX1tfrRWrGul\/PNyWhYjx7pd6yWPspTRgyzciV2yxU\/3nCSCjUkfjZus6iIQJAZqCkXAbpwDtiV2\/CIpmg6vz\/pY3VMJYGeZofPU6vVQpbTefWGrbpqR54M1KwEHTU7fv8zCwgCiJ7edIb6J1xCi7wJhWO6i1Jf407T66B0tSiGB+6XAlQrYNgytbgCpwb+4dC7qN8E9f3O8Ne5kUmsAQ4yU7vNUnod5WcI+rnyqK3xllmPjCXhoIL9sCvj\/6cO8YYhfsXaaBRQiR5Cs8OqZ4LqnN4vAuxvtRe0AHxASZvPWcnl6wgvtq\/VGrizglGxI1pSiQt9z6BOfOGzzwVuFRiVCVRULs66iKnSBZkC57RPl\/e76LMfGeYjasdlWSyv89jfBj2D0aYU4vAdVIDIiVAlJdRkVX5hbRIaYFypUE5lpQrpEqb7VZtqOCPy\/M6CbhwCOj2xQ4c6eU5OA2NdI6qBIPW45PleckwFkTnMqwRH1GAFWAHNTPrHebKG6K2pKCJ+mjyL7qTjF94LIZIQVS+xtPKZdfivZ8Z4AOTXj\/vc2iF4zDk01VD+iFBMGTqBisuvEbiROL6vds\"\/><div class=\"pfbc-element-0 pfbc-element\"><div class=\"pfbc-label\"><label for=\"accua-form___accua-form__1_69e9da2985c2c-element-12\">Etunimi <span class=\"pfbc-required\" aria-label=\"required\">*<\/span><\/label><\/div><div class=\"pfbc-fieldwrap\"><input type=\"text\" class=\"pfbc-textbox accuaforms-field-required accuaform-fieldname-first_name accuaform-fieldtype-textfield\" name=\"first_name\" value=\"\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-12\" required=\"required\" aria-required=\"true\"\/><\/div><div class=\"pfbc-elementbottom\"><\/div><\/div><div class=\"pfbc-element-1 pfbc-element\"><div class=\"pfbc-label\"><label for=\"accua-form___accua-form__1_69e9da2985c2c-element-13\">Sukunimi <span class=\"pfbc-required\" aria-label=\"required\">*<\/span><\/label><\/div><div class=\"pfbc-fieldwrap\"><input type=\"text\" class=\"pfbc-textbox accuaforms-field-required accuaform-fieldname-last_name accuaform-fieldtype-textfield\" name=\"last_name\" value=\"\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-13\" required=\"required\" aria-required=\"true\"\/><\/div><div class=\"pfbc-elementbottom\"><\/div><\/div><div class=\"pfbc-element-2 pfbc-element\"><div class=\"pfbc-label\"><label for=\"accua-form___accua-form__1_69e9da2985c2c-element-14\">S\u00e4hk\u00f6postiosoite <span class=\"pfbc-required\" aria-label=\"required\">*<\/span><\/label><\/div><div class=\"pfbc-fieldwrap\"><input type=\"email\" class=\"pfbc-textbox accuaforms-field-required accuaform-fieldname-email accuaform-fieldtype-autoreply_email\" name=\"email\" value=\"\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-14\" required=\"required\" aria-required=\"true\"\/><\/div><div class=\"pfbc-elementbottom\"><\/div><\/div><div class=\"pfbc-element-3 pfbc-element\"><div class=\"pfbc-label\"><label for=\"accua-form___accua-form__1_69e9da2985c2c-element-15\">Puhelinnumero<\/label><\/div><div class=\"pfbc-fieldwrap\"><input type=\"text\" class=\"pfbc-textbox accuaform-fieldname-puhelinnumero accuaform-fieldtype-textfield\" name=\"puhelinnumero\" value=\"\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-15\"\/><\/div><div class=\"pfbc-elementbottom\"><\/div><\/div><div class=\"pfbc-element-4 pfbc-element\"><div class=\"pfbc-label\"><label for=\"accua-form___accua-form__1_69e9da2985c2c-element-16\">Yritys<\/label><\/div><div class=\"pfbc-fieldwrap\"><input type=\"text\" class=\"pfbc-textbox accuaform-fieldname-yritys accuaform-fieldtype-textfield\" name=\"yritys\" value=\"\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-16\"\/><\/div><div class=\"pfbc-elementbottom\"><\/div><\/div><div class=\"pfbc-element-5 pfbc-element\"><div class=\"pfbc-label\"><label for=\"accua-form___accua-form__1_69e9da2985c2c-element-17\">Viesti <span class=\"pfbc-required\" aria-label=\"required\">*<\/span><\/label><\/div><div class=\"pfbc-fieldwrap\"><textarea class=\"pfbc-textarea accuaforms-field-required accuaform-fieldname-message accuaform-fieldtype-textarea\" rows=\"5\" name=\"message\" cols=\"50\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-17\" required=\"required\" aria-required=\"true\"><\/textarea><\/div><div class=\"pfbc-elementbottom\"><\/div><\/div><div class=\"pfbc-element-6 pfbc-element\">\n\n<!-- ReCaptcha 1 is discontinued, please go to Contact Forms settings page and set reCaptcha v2 keys -->\n\n<div class=\"pfbc-elementbottom\"><\/div><\/div><div class=\"pfbc-element pfbc-buttons\"><button type=\"submit\" value=\"L\u00e4het\u00e4\" name=\"laheta\" class=\"accuaform-fieldname-laheta accuaform-fieldtype-submit\" id=\"accua-form___accua-form__1_69e9da2985c2c-element-19\">L\u00e4het\u00e4<\/button><\/div><\/form><script type=\"text\/javascript\">\r\n<!-- \r\njQuery(document).ready(function() {    \r\n    \/\/ If there are errors on page load, focus the error summary or first invalid field\r\n    if (jQuery('.pfbc-error', '#accua-form___accua-form__1_69e9da2985c2c').length > 0) {\r\n      setTimeout(function() {\r\n        var errorContainer = jQuery('.pfbc-error', '#accua-form___accua-form__1_69e9da2985c2c').first();\r\n        errorContainer.attr('tabindex', '-1').focus();\r\n      }, 100);\r\n    } else if (jQuery('.pfbc-element-has-error', '#accua-form___accua-form__1_69e9da2985c2c').length > 0) {\r\n      setTimeout(function() {\r\n        var firstInvalidField = jQuery('.pfbc-element-has-error :input:visible:enabled:first', '#accua-form___accua-form__1_69e9da2985c2c').first();\r\n        if (firstInvalidField.length) {\r\n          firstInvalidField.focus();\r\n        }\r\n      }, 100);\r\n    }\r\n    jQuery(\"#accua-form___accua-form__1_69e9da2985c2c .pfbc-element:last\").css({ \"margin-bottom\": \"0\", \"padding-bottom\": \"0\", \"border-bottom\": \"none\" });\t});\r\n\/\/ -->\r\n<\/script><script type=\"text\/javascript\">\r\n<!--\r\nvar _handle_ajax_submit_accua_form___accua_form__1_69e9da2985c2c = function() {return true;}\r\nvar _handle_ajax_submit_complete_accua_form___accua_form__1_69e9da2985c2c = function() {return false;}\r\nvar _handle_ajax_submit_timeout_accua_form___accua_form__1_69e9da2985c2c = function() {return false;}\r\nvar _handle_ajax_submit_message_accua_form___accua_form__1_69e9da2985c2c = function() {}\r\nvar _handle_ajax_submit_response_accua_form___accua_form__1_69e9da2985c2c = function() {}\r\n\r\njQuery(function($) {\r\n  var thisform = $(\"#accua-form___accua-form__1_69e9da2985c2c\");\r\n  var ajax_enabled = \"www.perustele.fi\" == location.hostname ;\r\n  var anchor_id = \"1\" ;\r\n\r\n  var response_messages = $(\"#_response_messages_accua-form___accua-form__1_69e9da2985c2c\");\r\n  if (! response_messages.length) {\r\n    \/\/ Create all three anchors for success, invalid, and error states\r\n    thisform.before('\\x3Ca id=\"formSubmitSuccess-'+anchor_id+'\" name=\"formSubmitSuccess-'+anchor_id+'\" class=\"accua-form-anchor\" \/\\x3E');\r\n    thisform.before('\\x3Ca id=\"formSubmitInvalid-'+anchor_id+'\" name=\"formSubmitInvalid-'+anchor_id+'\" class=\"accua-form-anchor\" \/\\x3E');\r\n    thisform.before('\\x3Ca id=\"formSubmitError-'+anchor_id+'\" name=\"formSubmitError-'+anchor_id+'\" class=\"accua-form-anchor\" \/\\x3E');\r\n    response_messages = $('\\x3Cdiv id=\"_response_messages_accua-form___accua-form__1_69e9da2985c2c\" class=\"accua-form-messages\"\\x3E\\x3C\/div\\x3E');\r\n    thisform.before(response_messages);\r\n  }\r\n  \r\n  \/\/ Smooth scroll helper function - also updates URL hash for GA tracking and bookmarkability\r\n  var smoothScrollToElement = function(elementId) {\r\n    var target = document.getElementById(elementId);\r\n    if (target) {\r\n      target.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n      \/\/ Update URL hash without adding a browser history entry (replaceState prevents instant jump)\r\n      if (history.replaceState) {\r\n        history.replaceState(null, '', '#' + elementId);\r\n      }\r\n    }\r\n  };\r\n\r\n  var _ajax_submitting_accua_form___accua_form__1_69e9da2985c2c = false;\r\n  var timeout_handler = false;\r\n  var timeout_count = 0;\r\n  var fail_count = 0;\r\n  var disabled_fields = false;\r\n  var submitBtn = $('button[type=\"submit\"]', thisform);\r\n  var submitBtnOriginalText = submitBtn.text();\r\n  var submitBtnSendingText = \"Sending...\";\r\n\r\n  var jsuuid_field = $('input[name=\"_AccuaForm_jsuuid\"]', thisform);\r\n  var jsuuid = jsuuid_field.val();\r\n  if (jsuuid == '') {\r\n    var chars = '0123456789abcdefghijklmnopqrstuvwxyz'.split('');\r\n    var radix = chars.length\r\n    for (i = 0; i < 25; i++) {\r\n      jsuuid += chars[0 | Math.random()*radix];\r\n    }\r\n    jsuuid_field.val(jsuuid);\r\n  }\r\n\r\n  var ga_track = {\"title\":\"Lis\\u00e4tietoja\",\"track_submit\":false,\"track_fields\":false} ;\r\n  var ga_event, ga_submit_event, ga_field_event, ga_field_events_fired = {};\r\n  ga_event = function(eventCategory, eventAction){\r\n    \/* matomo *\/ \r\n    if (window._mtm && (typeof window._mtm.push == 'function')) {\r\n      window._mtm.push({'event': 'ContactForms', 'eventAction': eventAction, 'eventCategory': eventCategory, 'eventLabel': ga_track.title});\r\n    }\r\n      \r\n    if (typeof window.gtag == 'function') {\r\n      window.gtag('event', eventAction, {'event_category': eventCategory, 'event_label': ga_track.title});\r\n    } else if (window.dataLayer && (typeof window.dataLayer.push == 'function')) {\r\n      dataLayer.push({'event': 'ContactForms', 'eventAction': eventAction, 'eventCategory': eventCategory, 'eventLabel': ga_track.title});\r\n      \/\/backward compatibility\r\n      var gtag = function(){window.dataLayer.push(arguments);}\r\n      gtag('event', eventAction, {'event_category': eventCategory, 'event_label': ga_track.title});\r\n    } else if (typeof window.ga == 'function') {\r\n      window.ga('send', 'event', eventCategory, eventAction, ga_track.title);\r\n    } else if (window._gaq && (typeof window._gaq.push == 'function')) {\r\n      window._gaq.push(['_trackEvent', eventCategory, eventAction, ga_track.title]);\r\n    } else if (window.gaq && (typeof window.gaq.push == 'function')) {\r\n      window.gaq.push(['_trackEvent', eventCategory, eventAction, ga_track.title]);\r\n    } else if (window.pageTracker && (typeof window.pageTracker._trackEvent == 'function')) {\r\n      window.pageTracker._trackEvent(eventCategory, eventAction, ga_track.title);\r\n    }\r\n  }\r\n  ga_submit_event = function(eventAction){\r\n    if (ga_track.track_submit) {\r\n      ga_event('ContactFormsSubmit', eventAction);\r\n    }\r\n    thisform.trigger('ContactFormsSubmit', [eventAction]);\r\n  }\r\n  ga_field_event = function(field_name){\r\n    if (!ga_field_events_fired[field_name]){\r\n      if (ga_track.track_fields) {\r\n        ga_event('ContactFormsFieldFilledIn', field_name);\r\n        ga_field_events_fired[field_name] = true;\r\n      }\r\n      thisform.trigger('ContactFormsFieldFilledIn', [field_name]);\r\n    }\r\n  }\r\n  $('input, textarea, select', thisform).change(function(){\r\n    ga_field_event($(this).attr('name'));\r\n  });\r\n  \r\n  \/\/ Disable submit button during form submission\r\n  var disableSubmitButton = function() {\r\n    submitBtn.prop('disabled', true).attr('aria-busy', 'true').text(submitBtnSendingText);\r\n  };\r\n  \r\n  \/\/ Re-enable submit button (on failure or completion)\r\n  var enableSubmitButton = function() {\r\n    submitBtn.prop('disabled', false).removeAttr('aria-busy').text(submitBtnOriginalText);\r\n  };\r\n  \r\n  \/\/ Get field label from the field's container element\r\n  var getFieldLabel = function(field) {\r\n    var container = field.closest('.pfbc-element');\r\n    if (!container.length) {\r\n      return '';\r\n    }\r\n    \r\n    \/\/ Try floating label first (inline labels mode)\r\n    var label = container.find('.pfbc-floating-label').first();\r\n    if (!label.length) {\r\n      \/\/ Try standard label in .pfbc-label\r\n      label = container.find('.pfbc-label label').first();\r\n    }\r\n    if (!label.length) {\r\n      \/\/ Try any label element\r\n      label = container.find('label').first();\r\n    }\r\n    \r\n    if (label.length) {\r\n      \/\/ Get text content, removing the required asterisk\r\n      var text = label.clone().find('.pfbc-required').remove().end().text().trim();\r\n      return text;\r\n    }\r\n    \r\n    return '';\r\n  };\r\n  \r\n  \/\/ Build required field error message with field name\r\n  \/\/ Checks per-field data-custom-required-msg attribute first, then falls back to global template\r\n  var getRequiredMessage = function(fieldLabel, field) {\r\n    var template = \"%s is a required field\";\r\n    if (field) {\r\n      var custom = field.attr('data-custom-required-msg');\r\n      if (custom) {\r\n        template = custom;\r\n      }\r\n    }\r\n    if (fieldLabel) {\r\n      return template.replace('%s', fieldLabel);\r\n    }\r\n    return template.replace('%s', '');\r\n  };\r\n  \r\n  \/\/ Build email validation error message with field name\r\n  \/\/ Checks per-field data-custom-format-msg attribute first, then falls back to global template\r\n  var getEmailMessage = function(fieldLabel, field) {\r\n    var template = \"%s: please enter a valid email address\";\r\n    if (field) {\r\n      var custom = field.attr('data-custom-format-msg');\r\n      if (custom) {\r\n        template = custom;\r\n      }\r\n    }\r\n    if (fieldLabel) {\r\n      return template.replace('%s', fieldLabel);\r\n    }\r\n    return template.replace('%s', '');\r\n  };\r\n  \r\n  \/\/ Build phone validation error message with field name\r\n  \/\/ Checks per-field data-custom-format-msg attribute first, then falls back to global template\r\n  var getPhoneMessage = function(fieldLabel, field) {\r\n    var template = \"%s: please enter a valid phone number (e.g. +39 333 1234567)\";\r\n    if (field) {\r\n      var custom = field.attr('data-custom-format-msg');\r\n      if (custom) {\r\n        template = custom;\r\n      }\r\n    }\r\n    if (fieldLabel) {\r\n      return template.replace('%s', fieldLabel);\r\n    }\r\n    return template.replace('%s', '');\r\n  };\r\n  \r\n  \/\/ Check if a telephone field contains only a country prefix (e.g. \"+39\")\r\n  \/\/ These values should be treated as empty \u2014 the user hasn't entered a real number.\r\n  var isTelephonePrefixOnly = function(field) {\r\n    if (!field.hasClass('accuaform-telephone')) return false;\r\n    var val = field.val();\r\n    if (!val) return false;\r\n    val = val.trim();\r\n    if (val === '' || val.charAt(0) !== '+') return false;\r\n    return val.replace(\/\\D\/g, '').length <= 4;\r\n  };\r\n  \r\n  \/\/ Scroll to first invalid field, then focus after scroll completes\r\n  var focusFirstInvalidField = function() {\r\n    var firstInvalidContainer = $('#accua-form___accua-form__1_69e9da2985c2c .pfbc-element-has-error').first();\r\n    if (!firstInvalidContainer.length) {\r\n      return;\r\n    }\r\n    \r\n    \/\/ Try to find a focusable element in the invalid container\r\n    var focusTarget = null;\r\n    \r\n    \/\/ Check for radio\/checkbox groups first\r\n    var radioOrCheckbox = firstInvalidContainer.find('input[type=\"radio\"], input[type=\"checkbox\"]').first();\r\n    if (radioOrCheckbox.length) {\r\n      focusTarget = radioOrCheckbox;\r\n    }\r\n    \r\n    \/\/ Check for file input (focus the dropzone button if available)\r\n    if (!focusTarget) {\r\n      var fileDropzone = firstInvalidContainer.find('.accua-file-dropzone');\r\n      if (fileDropzone.length) {\r\n        focusTarget = fileDropzone;\r\n      } else {\r\n        var fileInput = firstInvalidContainer.find('input[type=\"file\"]');\r\n        if (fileInput.length) {\r\n          focusTarget = fileInput;\r\n        }\r\n      }\r\n    }\r\n    \r\n    \/\/ Check for custom select buttons (post select, etc.)\r\n    if (!focusTarget) {\r\n      var customSelectBtn = firstInvalidContainer.find('.pfbc-post-select-trigger, button[aria-haspopup=\"listbox\"]').first();\r\n      if (customSelectBtn.length) {\r\n        focusTarget = customSelectBtn;\r\n      }\r\n    }\r\n    \r\n    \/\/ Standard inputs (text, email, select, textarea)\r\n    if (!focusTarget) {\r\n      focusTarget = firstInvalidContainer.find('input:not([type=\"hidden\"]), textarea, select').first();\r\n    }\r\n    \r\n    if (focusTarget && focusTarget.length) {\r\n      \/\/ Scroll into view first with smooth animation\r\n      if (focusTarget[0].scrollIntoView) {\r\n        focusTarget[0].scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n      }\r\n      \/\/ Focus after scroll animation completes (typical scroll animation is ~300-500ms)\r\n      setTimeout(function() {\r\n        focusTarget.focus();\r\n      }, 500);\r\n    }\r\n  };\r\n  \r\n  \/\/ Scroll to a specific field by ID and focus it\r\n  var scrollToFieldAndFocus = function(fieldId) {\r\n    var element = $('#' + fieldId);\r\n    if (!element.length) {\r\n      return;\r\n    }\r\n    \r\n    var focusTarget = element;\r\n    \r\n    \/\/ If it's already an input\/select\/textarea, use it directly\r\n    if (element.is('input, select, textarea')) {\r\n      focusTarget = element;\r\n    }\r\n    \/\/ For containers (pfbc-element), find the first focusable element\r\n    else if (element.hasClass('pfbc-element')) {\r\n      var radioOrCheckbox = element.find('input[type=\"radio\"], input[type=\"checkbox\"]').first();\r\n      if (radioOrCheckbox.length) {\r\n        focusTarget = radioOrCheckbox;\r\n      } else {\r\n        var fileDropzone = element.find('.accua-file-dropzone');\r\n        if (fileDropzone.length) {\r\n          focusTarget = fileDropzone;\r\n        } else {\r\n          focusTarget = element.find('input:not([type=\"hidden\"]), textarea, select').first();\r\n        }\r\n      }\r\n    }\r\n    \/\/ For file dropzone wrapper, focus the dropzone\r\n    else if (element.find('.accua-file-dropzone').length) {\r\n      focusTarget = element.find('.accua-file-dropzone').first();\r\n    }\r\n    \r\n    if (focusTarget && focusTarget.length) {\r\n      if (focusTarget[0].scrollIntoView) {\r\n        focusTarget[0].scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n      }\r\n      setTimeout(function() {\r\n        focusTarget.focus();\r\n      }, 500);\r\n    }\r\n  };\r\n  \r\n  \/\/ Track if form submission has been attempted\r\n  var submitAttempted = false;\r\n  \r\n  \/\/ Array to collect field errors for summary\r\n  var fieldErrorsList = [];\r\n  \r\n  \/\/ Get the error ID for a radio\/checkbox group (DRY helper)\r\n  var getGroupErrorId = function(field) {\r\n    var groupWrapper = field.closest('.pfbc-radio-buttons, .pfbc-checkboxes').parent();\r\n    var groupId = groupWrapper.attr('id') || field.attr('id');\r\n    return groupId + '-error';\r\n  };\r\n  \r\n  \/\/ Remove an error element with smooth animation (generic helper for any field type)\r\n  var removeErrorAnimated = function(errorId) {\r\n    var errorEl = $('#' + errorId);\r\n    if (errorEl.length) {\r\n      errorEl.addClass('pfbc-error-removing');\r\n      setTimeout(function() {\r\n        errorEl.remove();\r\n      }, 150); \/\/ Match CSS animation duration\r\n    }\r\n  };\r\n  \r\n  \/\/ Remove all existing errors for a group with smooth fade-out (handles both potential IDs)\r\n  var removeGroupErrors = function(field, fieldName, animate) {\r\n    var groupContainer = field.closest('.pfbc-element, .pfbc-fieldwrap');\r\n    var errors = groupContainer.find('.pfbc-inline-error');\r\n    \r\n    \/\/ Also collect errors by potential IDs\r\n    var groupWrapper = field.closest('.pfbc-radio-buttons, .pfbc-checkboxes').parent();\r\n    var wrapperId = groupWrapper.attr('id');\r\n    if (wrapperId) {\r\n      errors = errors.add($('#' + wrapperId + '-error'));\r\n    }\r\n    var firstField = $(\"[name='\"+fieldName+\"']\", thisform).first();\r\n    if (firstField.attr('id')) {\r\n      errors = errors.add($('#' + firstField.attr('id') + '-error'));\r\n    }\r\n    \r\n    if (animate && errors.length) {\r\n      \/\/ Smooth fade-out animation\r\n      errors.addClass('pfbc-error-removing');\r\n      setTimeout(function() {\r\n        errors.remove();\r\n      }, 150); \/\/ Match CSS transition duration\r\n    } else {\r\n      errors.remove();\r\n    }\r\n  };\r\n  \r\n  \/\/ Show or update the error\/success\/loading summary area\r\n  \/\/ state: true (success), false (error), 'loading' (submitting)\r\n  var updateSummaryArea = function(state) {\r\n    var summaryArea = $('#accua-form___accua-form__1_69e9da2985c2c-validation-summary');\r\n    \r\n    if (!submitAttempted && state !== 'loading') {\r\n      summaryArea.remove();\r\n      return;\r\n    }\r\n    \r\n    \/\/ Ensure summary area exists\r\n    if (!summaryArea.length) {\r\n      summaryArea = $('<div id=\"accua-form___accua-form__1_69e9da2985c2c-validation-summary\" class=\"pfbc-validation-summary\" role=\"status\" aria-live=\"polite\"><\/div>');\r\n      thisform.find('.pfbc-error').remove();\r\n      thisform.append(summaryArea);\r\n    }\r\n    \r\n    if (state === 'loading') {\r\n      \/\/ Show loading state - neutral blue with spinner and text\r\n      summaryArea\r\n        .removeClass('pfbc-validation-error pfbc-validation-success')\r\n        .addClass('pfbc-validation-loading')\r\n        .attr('role', 'status')\r\n        .attr('aria-live', 'polite')\r\n        .attr('aria-busy', 'true')\r\n        .html('<span class=\"pfbc-summary-spinner\" aria-hidden=\"true\"><\/span>' + \"Submitting your form, please wait...\");\r\n    } else if (state === true) {\r\n      \/\/ Show success state\r\n      summaryArea\r\n        .removeClass('pfbc-validation-error pfbc-validation-loading')\r\n        .addClass('pfbc-validation-success')\r\n        .attr('role', 'status')\r\n        .attr('aria-live', 'polite')\r\n        .removeAttr('aria-busy')\r\n        .html('<span class=\"pfbc-summary-icon\">\u2713<\/span> ' + \"All fields are valid. Ready to submit!\");\r\n    } else {\r\n      \/\/ Show error state with field list\r\n      summaryArea\r\n        .removeClass('pfbc-validation-success pfbc-validation-loading')\r\n        .addClass('pfbc-validation-error')\r\n        .attr('role', 'alert')\r\n        .attr('aria-live', 'assertive')\r\n        .removeAttr('aria-busy');\r\n      \r\n      var html = '<p class=\"pfbc-summary-header\">' + \"Check the following fields to continue:\" + '<\/p><ul class=\"pfbc-summary-list\">';\r\n      for (var i = 0; i < fieldErrorsList.length; i++) {\r\n        var err = fieldErrorsList[i];\r\n        html += '<li><a href=\"#\" class=\"pfbc-summary-link\" data-field-id=\"' + err.fieldId + '\">' + err.label + '<\/a> \u2013 ' + err.errorType + '<\/li>';\r\n      }\r\n      html += '<\/ul>';\r\n      summaryArea.html(html);\r\n      \r\n      \/\/ Attach click handlers to links\r\n      summaryArea.find('.pfbc-summary-link').on('click', function(e) {\r\n        e.preventDefault();\r\n        var fieldId = $(this).data('field-id');\r\n        scrollToFieldAndFocus(fieldId);\r\n      });\r\n    }\r\n  };\r\n  \r\n  var show_error_messages = function(message) {\r\n    \/\/ Show error message in the validation summary area\r\n    \/\/ Used when AJAX submission fails (network error, server error, etc.)\r\n    var summaryArea = thisform.find('.pfbc-validation-summary');\r\n    if (summaryArea.length) {\r\n      summaryArea.html('<div class=\"pfbc-validation-error\" role=\"alert\"><strong>' + accua_forms_i18n.check_fields + '<\/strong><ul>' + message + '<\/ul><\/div>').show();\r\n    }\r\n  }\r\n  \r\n  \/\/ Update summary area with server-side errors (called from AJAX error response)\r\n  var updateSummaryWithServerErrors = function(errors, elementErrors) {\r\n    \/\/ Collect server errors for the summary\r\n    fieldErrorsList = [];\r\n    \r\n    if (elementErrors) {\r\n      jQuery.each(elementErrors, function(fieldName, fieldErrors) {\r\n        var field = jQuery('[name=\"' + fieldName + '\"]', thisform);\r\n        var fieldId = field.attr('id') || fieldName;\r\n        var fieldLabel = getFieldLabel(field);\r\n        \r\n        \/\/ If no label found, try to get from the field container or use field name\r\n        if (!fieldLabel || fieldLabel === fieldName) {\r\n          var container = field.closest('.pfbc-element, .pfbc-fieldwrap');\r\n          fieldLabel = container.find('label').first().text().replace(\/\\s*\\*\\s*$\/, '').trim();\r\n          if (!fieldLabel) {\r\n            \/\/ Fallback: humanize the field name\r\n            fieldLabel = fieldName.replace(\/[-_]\/g, ' ').replace(\/\\b\\w\/g, function(l){ return l.toUpperCase(); });\r\n          }\r\n        }\r\n        \r\n        for (var i = 0; i < fieldErrors.length; i++) {\r\n          fieldErrorsList.push({\r\n            fieldId: fieldId,\r\n            label: fieldLabel,\r\n            errorType: fieldErrors[i]\r\n          });\r\n        }\r\n      });\r\n    }\r\n    \r\n    \/\/ Also add any general errors from the errors array\r\n    if (errors && errors.length > 0) {\r\n      for (var i = 0; i < errors.length; i++) {\r\n        \/\/ Check if this error is already in fieldErrorsList\r\n        var alreadyAdded = false;\r\n        for (var j = 0; j < fieldErrorsList.length; j++) {\r\n          if (fieldErrorsList[j].errorType === errors[i]) {\r\n            alreadyAdded = true;\r\n            break;\r\n          }\r\n        }\r\n        if (!alreadyAdded) {\r\n          fieldErrorsList.push({\r\n            fieldId: '',\r\n            label: '',\r\n            errorType: errors[i]\r\n          });\r\n        }\r\n      }\r\n    }\r\n    \r\n    \/\/ Update the summary area to show errors\r\n    if (fieldErrorsList.length > 0) {\r\n      updateSummaryArea(false);\r\n    }\r\n  }\r\n\r\n  _handle_ajax_submit_accua_form___accua_form__1_69e9da2985c2c = function() {\r\n    if (_ajax_submitting_accua_form___accua_form__1_69e9da2985c2c) {\r\n      return false;\r\n    }\r\njQuery(\"#accua-form___accua-form__1_69e9da2985c2c .pfbc-error\").remove();\r\n    \/\/ Mark that submit was attempted\r\n    submitAttempted = true;\r\n    \r\n    var valid_empty = true;\r\n    var valid_mail = true;\r\n    var valid_phone = true;\r\n    var fieldErrors = {};\r\n    \r\n    \/\/ Reset field errors list for summary\r\n    fieldErrorsList = [];\r\n\r\n    $(\"#accua-form___accua-form__1_69e9da2985c2c .pfbc-element\").removeClass('pfbc-invalid');\r\n    $(\"#accua-form___accua-form__1_69e9da2985c2c .pfbc-element\").removeClass('pfbc-element-has-error');\r\n    $(\"#accua-form___accua-form__1_69e9da2985c2c input, #accua-form___accua-form__1_69e9da2985c2c textarea, #accua-form___accua-form__1_69e9da2985c2c select\").attr('aria-invalid', 'false');\r\n    $(\"#accua-form___accua-form__1_69e9da2985c2c .pfbc-inline-error\").remove();\r\n\r\n    var processedGroups = {}; \/\/ Track radio\/checkbox groups to avoid duplicate errors\r\n\r\n    $('.accuaforms-field-required', thisform).each(function(){\r\n      var field = $(this);\r\n      var type = field.attr('type');\r\n      var fieldName = field.attr('name');\r\n\r\n      if (type === 'checkbox' || type === 'radio') {\r\n        \/\/ Skip if we've already processed this group\r\n        if (processedGroups[fieldName]) {\r\n          return true;\r\n        }\r\n        processedGroups[fieldName] = true;\r\n\r\n        if ($(\"[name='\"+fieldName+\"']:checked\", \"#accua-form___accua-form__1_69e9da2985c2c\").length > 0) {\r\n          return true;\r\n        }\r\n\r\n        valid_empty = false;\r\n        \r\n        \/\/ Find the container for the radio\/checkbox group\r\n        var groupContainer = field.closest('.pfbc-element, .pfbc-fieldwrap');\r\n        groupContainer.addClass('pfbc-invalid pfbc-element-has-error');\r\n        \r\n        \/\/ Remove any existing errors before adding new one (prevents duplicates)\r\n        removeGroupErrors(field, fieldName);\r\n        \r\n        \/\/ Get consistent error ID using helper\r\n        var errorId = getGroupErrorId(field);\r\n        \r\n        \/\/ Find the last radio\/checkbox in the group\r\n        var lastInGroup = $(\"[name='\"+fieldName+\"']\", \"#accua-form___accua-form__1_69e9da2985c2c\").last();\r\n        \r\n        \/\/ Apply ARIA attributes to all inputs in the group\r\n        $(\"[name='\"+fieldName+\"']\", \"#accua-form___accua-form__1_69e9da2985c2c\").attr('aria-invalid', 'true');\r\n        $(\"[name='\"+fieldName+\"']\", \"#accua-form___accua-form__1_69e9da2985c2c\").attr('aria-describedby', errorId);\r\n        \r\n        \/\/ Get field label and build error message\r\n        var fieldLabel = getFieldLabel(field);\r\n        var firstInput = $(\"[name='\"+fieldName+\"']\", \"#accua-form___accua-form__1_69e9da2985c2c\").first();\r\n        var errorMessage = getRequiredMessage(fieldLabel, firstInput);\r\n        \r\n        \/\/ Add to field errors list for summary (use first input ID for focusing)\r\n        fieldErrorsList.push({\r\n          fieldId: firstInput.attr('id'),\r\n          label: fieldLabel,\r\n          errorType: \"required field\"\r\n        });\r\n        \r\n        \/\/ Add error message after the last item in the group\r\n        var inlineError = $('<div class=\"pfbc-inline-error\" id=\"' + errorId + '\" role=\"alert\" aria-live=\"polite\"><div class=\"pfbc-error-message\">' + errorMessage + '<\/div><\/div>');\r\n        \r\n        \/\/ Insert after the last radio\/checkbox wrapper\r\n        var lastWrapper = lastInGroup.closest('.pfbc-radio, .pfbc-checkbox');\r\n        if (lastWrapper.length) {\r\n          lastWrapper.after(inlineError);\r\n        } else {\r\n          lastInGroup.after(inlineError);\r\n        }\r\n      } else {\r\n        var val = field.val();\r\n        if (typeof(val) == \"string\") {\r\n          \/\/ Treat \"-\" and \"Select...\" as invalid only for dropdowns\r\n          \/\/ For telephone fields, prefix-only values (e.g. \"+39\") are also empty\r\n          var isSelect = field.is('select');\r\n          if (! val.match(\/^\\s*$\/) && (!isSelect || (val !== \"Select...\" && val !== \"-\")) && !isTelephonePrefixOnly(field)) {\r\n            return true;\r\n          }\r\n        } else if (Array.isArray(val)) {\r\n          \/\/ Multiselect: empty array means no selection\r\n          if (val.length > 0) {\r\n            return true;\r\n          }\r\n        } else if (val) {\r\n          return true;\r\n        }\r\n\r\n        valid_empty = false;\r\n        var parent = field.closest('.pfbc-element, .pfbc-fieldwrap');\r\n        parent.addClass('pfbc-invalid pfbc-element-has-error');\r\n        \r\n        \/\/ Apply ARIA attributes\r\n        field.attr('aria-invalid', 'true');\r\n        var errorId = field.attr('id') + '-error';\r\n        field.attr('aria-describedby', errorId);\r\n        \r\n        \/\/ Get field label and build error message\r\n        var fieldLabel = getFieldLabel(field);\r\n        var errorMessage = getRequiredMessage(fieldLabel, field);\r\n        fieldErrorsList.push({\r\n          fieldId: field.attr('id'),\r\n          label: fieldLabel,\r\n          errorType: \"required field\"\r\n        });\r\n        \r\n        var inlineError = $('<div class=\"pfbc-inline-error\" id=\"' + errorId + '\" role=\"alert\" aria-live=\"polite\"><div class=\"pfbc-error-message\">' + errorMessage + '<\/div><\/div>');\r\n        \r\n        \/\/ For file inputs with help text, insert error after help text\r\n        var helpText = field.siblings('.pfbc-help').last();\r\n        if (field.is('[type=\"file\"]') && helpText.length) {\r\n          helpText.after(inlineError);\r\n        } else {\r\n          field.after(inlineError);\r\n        }\r\n      }\r\n    });\r\n\r\n    $('.pfbc-textbox[type=\"email\"]', thisform).each(function(){\r\n      var field = $(this);\r\n\r\n      if (field.val().match(\/^\\s*$\/)) {\r\n        return true;\r\n      }\r\n\r\n      if (field.val().match( \/^([a-zA-Z0-9_.+%-])+@(([a-zA-Z0-9-])+\\.)+([a-zA-Z0-9])+$\/ )) {\r\n        return true;\r\n      }\r\n\r\n      valid_mail = false;\r\n      var parent = field.closest('.pfbc-element, .pfbc-fieldwrap');\r\n      parent.addClass('pfbc-invalid pfbc-element-has-error');\r\n      \r\n      \/\/ Apply ARIA attributes\r\n      field.attr('aria-invalid', 'true');\r\n      var errorId = field.attr('id') + '-error';\r\n      field.attr('aria-describedby', errorId);\r\n      \r\n      \/\/ Get field label and build error message\r\n      var fieldLabel = getFieldLabel(field);\r\n      var errorMessage = getEmailMessage(fieldLabel, field);\r\n      \r\n      \/\/ Add to field errors list for summary (use field ID for focusing)\r\n      fieldErrorsList.push({\r\n        fieldId: field.attr('id'),\r\n        label: fieldLabel,\r\n        errorType: \"invalid email address\"\r\n      });\r\n      \r\n      var inlineError = $('<div class=\\\"pfbc-inline-error\\\" id=\\\"' + errorId + '\\\" role=\\\"alert\\\" aria-live=\\\"polite\\\"><div class=\\\"pfbc-error-message\\\">' + errorMessage + '<\/div><\/div>');\r\n      \r\n      \/\/ For file inputs with help text, insert error after help text\r\n      var helpText = field.siblings('.pfbc-help').last();\r\n      if (field.is('[type=\\\"file\\\"]') && helpText.length) {\r\n        helpText.after(inlineError);\r\n      } else {\r\n        field.after(inlineError);\r\n      }\r\n\r\n    });\r\n\r\n    \/\/ Phone validation - runs for all non-empty phone fields\r\n    $('.accuaform-telephone', thisform).each(function(){\r\n        var field = $(this);\r\n        var value = field.val();\r\n        \r\n        \/\/ Skip empty fields (Required validation handles mandatory)\r\n        if (!value || value.trim() === '') {\r\n          return true;\r\n        }\r\n        \r\n        \/\/ Skip prefix-only values (e.g. \"+39\") \u2014 treated as empty\r\n        var phoneTrimmed = value.trim();\r\n        if (phoneTrimmed.charAt(0) === '+' && phoneTrimmed.replace(\/\\D\/g, '').length <= 4) {\r\n          return true;\r\n        }\r\n        \r\n        \/\/ Get country code from data attribute\r\n        var countryCode = field.attr('data-country') || 'IT';\r\n        \r\n        \/\/ Use AccuaPhoneValidation if available, otherwise skip validation\r\n        if (typeof window.AccuaPhoneValidation !== 'undefined' && window.AccuaPhoneValidation.isValid) {\r\n          if (window.AccuaPhoneValidation.isValid(value, countryCode)) {\r\n            return true;\r\n          }\r\n        } else {\r\n          \/\/ Fallback: basic validation matching server-side Phone.php\r\n          var trimmed = value.trim();\r\n          \/\/ Check for invalid characters\r\n          if (!\/^[\\d\\s\\-\\.\\\/\\(\\)\\+]+$\/.test(trimmed)) {\r\n            \/\/ Invalid characters - fail validation\r\n          } else {\r\n            var plusIndex = trimmed.indexOf('+');\r\n            if (plusIndex > 0 || (trimmed.match(\/\\+\/g) || []).length > 1) {\r\n              \/\/ Plus in wrong position or multiple plus signs - fail validation\r\n            } else {\r\n              var digitCount = trimmed.replace(\/\\D\/g, '').length;\r\n              \/\/ Prefix-only (1-4 digits with +) treated as empty\r\n              if (trimmed.charAt(0) === '+' && digitCount <= 4) {\r\n                return true;\r\n              }\r\n              \/\/ Valid if 5-15 digits (matches server-side Phone.php)\r\n              if (digitCount >= 5 && digitCount <= 15) {\r\n                return true;\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        valid_phone = false;\r\n        var parent = field.closest('.pfbc-element, .pfbc-fieldwrap');\r\n        parent.addClass('pfbc-invalid pfbc-element-has-error');\r\n        \r\n        \/\/ Remove any existing blur validation error to avoid duplicates\r\n        $('#' + field.attr('id') + '-phone-error').remove();\r\n        \r\n        \/\/ Apply ARIA attributes\r\n        field.attr('aria-invalid', 'true');\r\n        var errorId = field.attr('id') + '-error';\r\n        field.attr('aria-describedby', errorId);\r\n        \r\n        \/\/ Get field label and build error message\r\n        var fieldLabel = getFieldLabel(field);\r\n        var errorMessage = getPhoneMessage(fieldLabel, field);\r\n        \r\n        \/\/ Add to field errors list for summary\r\n        fieldErrorsList.push({\r\n          fieldId: field.attr('id'),\r\n          label: fieldLabel,\r\n          errorType: \"invalid phone number\"\r\n        });\r\n        \r\n        var inlineError = $('<div class=\"pfbc-inline-error pfbc-phone-format-error\" id=\"' + errorId + '\" role=\"alert\" aria-live=\"polite\"><div class=\"pfbc-error-message\">' + errorMessage + '<\/div><\/div>');\r\n        \r\n        var helpText = field.siblings('.pfbc-help').last();\r\n        if (helpText.length) {\r\n          helpText.after(inlineError);\r\n        } else {\r\n          field.after(inlineError);\r\n        }\r\n      });\r\n\r\n    if (valid_empty && valid_mail && valid_phone) {\r\n      \/\/ Show loading state in summary during AJAX submission\r\n      updateSummaryArea('loading');\r\n      \r\n      _ajax_submitting_accua_form___accua_form__1_69e9da2985c2c = true;\r\n      disableSubmitButton();\r\n      $('input[name=\"_AccuaForm_tentatives\"]', thisform).val(fail_count);\r\n      disabled_fields = $(\"input, textarea, button, select\", thisform).not('[type=\"submit\"]').not(':disabled');\r\n      disabled_fields.attr('readonly','readonly');\r\n      timeout_count = 0;\r\n      if (ajax_enabled) {\r\n        $(\"#submit_target_accua_form___accua_form__1_69e9da2985c2c\").attr('src','').removeAttr('src');\r\n        timeout_handler = setTimeout(_handle_ajax_submit_timeout_accua_form___accua_form__1_69e9da2985c2c, 5000);\r\n      }\r\n      return true;\r\n    } else {\r\n      ga_submit_event('formSubmitInvalid');\r\n      \r\n      \/\/ Update URL hash to reflect invalid state (for GA tracking and bookmarkability)\r\n      if (history.replaceState) {\r\n        history.replaceState(null, '', '#formSubmitInvalid-'+anchor_id);\r\n      }\r\n      \r\n      \/\/ Update summary area with error list\r\n      updateSummaryArea(false);\r\n      \r\n      \/\/ Focus on first invalid field for accessibility\r\n      focusFirstInvalidField();\r\n      \r\n      return false;\r\n    }\r\n  }\r\n\r\n\r\n  _handle_ajax_submit_timeout_accua_form___accua_form__1_69e9da2985c2c = function() {\r\n    if (_ajax_submitting_accua_form___accua_form__1_69e9da2985c2c) {\r\n      if (timeout_count < 60) {\r\n        timeout_count++;\r\n        timeout_handler = setTimeout(_handle_ajax_submit_timeout_accua_form___accua_form__1_69e9da2985c2c, 500);\r\n        _handle_ajax_submit_complete_accua_form___accua_form__1_69e9da2985c2c();\r\n      } else {\r\n        timeout_handler = false;\r\n        _handle_ajax_submit_complete_accua_form___accua_form__1_69e9da2985c2c();\r\n        if (_ajax_submitting_accua_form___accua_form__1_69e9da2985c2c) {\r\n          _handle_ajax_submit_response_accua_form___accua_form__1_69e9da2985c2c(false);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  _handle_ajax_submit_complete_accua_form___accua_form__1_69e9da2985c2c = function() {\r\n    if (_ajax_submitting_accua_form___accua_form__1_69e9da2985c2c) {\r\n      var response = false;\r\n      try {\r\n        var responsedoc = frames['submit_target_accua_form___accua_form__1_69e9da2985c2c'].document;\r\n        if (responsedoc.getElementById(\"accua-form-ajax-response-loaded\")) {\r\n          response = $.parseJSON(responsedoc.getElementById(\"accua-form-ajax-response\").innerHTML);\r\n        }\r\n      } catch (err) {\r\n        response = false;\r\n      }\r\n      if (response) {\r\n        return _handle_ajax_submit_response_accua_form___accua_form__1_69e9da2985c2c (response);\r\n      }\r\n    }\r\n  }\r\n\r\n  _handle_ajax_submit_message_accua_form___accua_form__1_69e9da2985c2c = function(message) {\r\n    if (_ajax_submitting_accua_form___accua_form__1_69e9da2985c2c) {\r\n      var response = false;\r\n      try {\r\n        response = $.parseJSON(message.data);\r\n        \/\/ Accept response if jsuuid matches AND buildID matches or is null (server rejection)\r\n        if (response.jsuuid != jsuuid || (response.buildID != null && response.buildID != \"accua-form___accua-form__1_69e9da2985c2c\")) {\r\n          response = false;\r\n        }\r\n      } catch (err) {\r\n        response = false;\r\n      }\r\n      if (response) {\r\n        return _handle_ajax_submit_response_accua_form___accua_form__1_69e9da2985c2c (response);\r\n      }\r\n    }\r\n  }\r\n\r\n  _handle_ajax_submit_response_accua_form___accua_form__1_69e9da2985c2c = function(response) {\r\n    if (_ajax_submitting_accua_form___accua_form__1_69e9da2985c2c) {\r\n      if(response && typeof(response) == \"object\" && typeof(response.submitted) == \"boolean\") {\r\n        \/\/ Only show message container if there's actual content\r\n        if (response.messages && response.messages.trim() !== '') {\r\n          response_messages.html(response.messages).show();\r\n        } else {\r\n          response_messages.empty().hide();\r\n        }\r\n        if (response.submitted) {\r\n          if (response.valid) {\r\n            var gads_track_code = \"\";\r\n            if(gads_track_code != ''){            \r\n              gtag('event', 'conversion', {'send_to': gads_track_code});\r\n            }\r\n            \r\n            ga_submit_event('formSubmitSuccess');\r\n            smoothScrollToElement('formSubmitSuccess-'+anchor_id);\r\n            \r\n            $('#accua-form___accua-form__1_69e9da2985c2c').hide();          } else {\r\n            ga_submit_event('formSubmitInvalid');\r\n            smoothScrollToElement('formSubmitInvalid-'+anchor_id);var errorSize = response.errors.length;\r\nvar errorHTML = '';\r\nfor(e = 0; e < errorSize; ++e) {\r\n  errorHTML += '\\x3Cli\\x3E' + response.errors[e] + '\\x3C\/li\\x3E';\r\n}\r\n\r\n\/* Update summary area with server-side errors *\/\r\nif (typeof updateSummaryWithServerErrors === 'function') {\r\n  updateSummaryWithServerErrors(response.errors, response.elementErrors);\r\n}\r\n\r\n\/* Apply ARIA attributes and inline errors for accessibility *\/\r\nif (response.elementErrors) {\r\n  jQuery.each(response.elementErrors, function(fieldName, fieldErrors) {\r\n    var field = jQuery('[name=\"' + fieldName + '\"]');\r\n    if (field.length) {\r\n      var parent = field.closest('.pfbc-element, .pfbc-fieldwrap');\r\n      var errorId = field.attr('id') + '-error';\r\n      \r\n      \/* Add ARIA attributes *\/\r\n      field.attr('aria-invalid', 'true');\r\n      field.attr('aria-describedby', errorId);\r\n      \r\n      \/* Add error class to parent *\/\r\n      parent.addClass('pfbc-element-has-error');\r\n      \r\n      \/* Remove existing inline error if any *\/\r\n      parent.find('.pfbc-inline-error').remove();\r\n      \r\n      \/* Add inline error message *\/\r\n      var inlineErrorHTML = '<div class=\\\"pfbc-inline-error\\\" id=\\\"' + errorId + '\\\" role=\\\"alert\\\" aria-live=\\\"polite\\\">';\r\n      for (var i = 0; i < fieldErrors.length; i++) {\r\n        inlineErrorHTML += '<div class=\\\"pfbc-error-message\\\">' + fieldErrors[i] + '<\/div>';\r\n      }\r\n      inlineErrorHTML += '<\/div>';\r\n      \r\n      \/* For file inputs with help text, insert error after help text *\/\r\n      var helpText = field.siblings('.pfbc-help').last();\r\n      if (field.is('[type=\\\"file\\\"]') && helpText.length) {\r\n        helpText.after(inlineErrorHTML);\r\n      } else {\r\n        field.after(inlineErrorHTML);\r\n      }\r\n    }\r\n  });\r\n}\r\n            for (var name in response.files) {\r\n              $(\".pfbc-fieldwrap:has(input[type='file'][name='\"+name+\"'])\", thisform).html(response.files[name]);\r\n            }\r\n\r\n            $(\"input[name='_AccuaForm_hash']\",thisform).val(response._AccuaForm_hash);\r\n            $(\"input[name='_AccuaForm_iv']\",  thisform).val(response._AccuaForm_iv);\r\n            $(\"input[name='_AccuaForm_data']\",thisform).val(response._AccuaForm_data);\r\n\r\n            disabled_fields.removeAttr('readonly');\r\n            enableSubmitButton();\r\n          }\r\n        } else {\r\n          \/\/ Server did not recognize the form submission (e.g. expired nonce, stale cached page)\r\n          ga_submit_event('formSubmitError');\r\n          smoothScrollToElement('formSubmitError-'+anchor_id);\r\n          fail_count++;\r\n          if (fail_count > 2) {\r\n            ajax_enabled = false;\r\n            thisform.attr(\"action\", \"https:\\\/\\\/www.perustele.fi:443\\\/index.php\\\/wp-json\\\/wp\\\/v2\\\/pages\\\/2600\" );\r\n            thisform.removeAttr(\"target\");\r\n            $('input[name=\"_AccuaForm_submit_method\"]', thisform).val('fallback');\r\n          }\r\n          show_error_messages( \"\\u003Cli\\u003EForm submission failed. Please try again.\\u003C\\\/li\\u003E\" );\r\n          disabled_fields.removeAttr('readonly');\r\n          enableSubmitButton();\r\n        }\r\n      } else {\r\n        ga_submit_event('formSubmitError');\r\n        smoothScrollToElement('formSubmitError-'+anchor_id);\r\n        fail_count++;\r\n        if (fail_count > 2) {\r\n          ajax_enabled = false;\r\n          thisform.attr(\"action\", \"https:\\\/\\\/www.perustele.fi:443\\\/index.php\\\/wp-json\\\/wp\\\/v2\\\/pages\\\/2600\" );\r\n          thisform.removeAttr(\"target\");\r\n          $('input[name=\"_AccuaForm_submit_method\"]', thisform).val('fallback');\r\n        }\r\n        show_error_messages( \"\\u003Cli\\u003EForm submission failed. Please try again.\\u003C\\\/li\\u003E\" );\r\n        enableSubmitButton();\r\n      }\r\n      $('.accua_forms_show_recaptcha_button', thisform).click();\r\n      if (((typeof accuaform_recaptcha2_initialized) != 'undefined') && accuaform_recaptcha2_initialized) {\r\n        $('.accua_forms_recaptcha2_container', thisform).each(function(){\r\n          accua_forms_reload_recaptcha2($(this).attr('id'));\r\n        });\r\n      }\r\n      _ajax_submitting_accua_form___accua_form__1_69e9da2985c2c = false;\r\n      if (timeout_handler) {\r\n        clearTimeout(timeout_handler);\r\n        timeout_handler = false;\r\n      }\r\n    }\r\n  }\r\n\r\n  if (ajax_enabled) {\r\n    thisform.attr(\"action\", \"https:\\\/\\\/www.perustele.fi\\\/wp-admin\\\/admin-ajax.php?action=accua_form_submit\" );\r\n    thisform.attr(\"target\",\"submit_target_accua_form___accua_form__1_69e9da2985c2c\");\r\n    try {\r\n      window.addEventListener('message', _handle_ajax_submit_message_accua_form___accua_form__1_69e9da2985c2c, false);\r\n    } catch (e) { }\r\n    $('input[name=\"_AccuaForm_submit_method\"]', thisform).val('iframe');\r\n  } else {\r\n    thisform.attr(\"action\", \"https:\\\/\\\/www.perustele.fi:443\\\/index.php\\\/wp-json\\\/wp\\\/v2\\\/pages\\\/2600\" );\r\n  }\r\n  thisform.attr(\"onsubmit\",\"return _handle_ajax_submit_accua_form___accua_form__1_69e9da2985c2c()\");\r\n  \r\n  \/\/ Real-time validation for better UX - use change only for checkbox\/radio to avoid double-firing\r\n  $('.accuaforms-field-required', thisform).on('change', function() {\r\n    var field = $(this);\r\n    var type = field.attr('type');\r\n    if (type !== 'checkbox' && type !== 'radio') return; \/\/ Only handle checkbox\/radio on change\r\n    \r\n    var fieldName = field.attr('name');\r\n    var isChecked = $(\"[name='\"+fieldName+\"']:checked\", thisform).length > 0;\r\n    var groupContainer = field.closest('.pfbc-element, .pfbc-fieldwrap');\r\n    var hasError = groupContainer.hasClass('pfbc-element-has-error');\r\n    \r\n    \/\/ Only act if state actually changed to avoid flashing\r\n    if (isChecked && hasError) {\r\n      \/\/ Valid now - remove error with animation\r\n      groupContainer.removeClass('pfbc-invalid pfbc-element-has-error');\r\n      $(\"[name='\"+fieldName+\"']\", thisform).attr('aria-invalid', 'false');\r\n      $(\"[name='\"+fieldName+\"']\", thisform).removeAttr('aria-describedby');\r\n      removeGroupErrors(field, fieldName, true); \/\/ animate=true\r\n    } else if (!isChecked && !hasError && submitAttempted) {\r\n      \/\/ Invalid now and we've attempted submit - show error\r\n      var errorId = getGroupErrorId(field);\r\n      groupContainer.addClass('pfbc-invalid pfbc-element-has-error');\r\n      $(\"[name='\"+fieldName+\"']\", thisform).attr('aria-invalid', 'true');\r\n      $(\"[name='\"+fieldName+\"']\", thisform).attr('aria-describedby', errorId);\r\n      \r\n      var fieldLabel = getFieldLabel(groupContainer);\r\n      var firstField = $(\"[name='\"+fieldName+\"']\", thisform).first();\r\n      var errorMessage = getRequiredMessage(fieldLabel, firstField);\r\n      var inlineError = $('<div class=\"pfbc-inline-error\" id=\"' + errorId + '\" role=\"alert\" aria-live=\"polite\"><div class=\"pfbc-error-message\">' + errorMessage + '<\/div><\/div>');\r\n      \r\n      var lastInGroup = $(\"[name='\"+fieldName+\"']\", thisform).last();\r\n      var lastWrapper = lastInGroup.closest('.pfbc-radio, .pfbc-checkbox');\r\n      if (lastWrapper.length) {\r\n        lastWrapper.after(inlineError);\r\n      } else {\r\n        lastInGroup.after(inlineError);\r\n      }\r\n    }\r\n  });\r\n  \r\n  \/\/ Blur handler for text-like fields only\r\n  $('.accuaforms-field-required', thisform).on('blur', function() {\r\n    var field = $(this);\r\n    var type = field.attr('type');\r\n    var fieldName = field.attr('name');\r\n    var isEmpty = false;\r\n    \r\n    \/\/ Skip checkbox\/radio - handled by change event above\r\n    if (type === 'checkbox' || type === 'radio') return;\r\n    \r\n    var val = field.val();\r\n      if (typeof(val) == \"string\") {\r\n        \/\/ Treat \"-\" and \"Select...\" as invalid only for dropdowns\r\n        \/\/ For telephone fields, prefix-only values (e.g. \"+39\") are also empty\r\n        var isSelect = field.is('select');\r\n        isEmpty = val.match(\/^\\s*$\/) || (isSelect && (val === \"Select...\" || val === \"-\")) || isTelephonePrefixOnly(field);\r\n      } else if (typeof(val) == \"object\") {\r\n        isEmpty = !val || val.length === 0;\r\n      } else {\r\n        isEmpty = !val;\r\n      }\r\n      \r\n      var parent = field.closest('.pfbc-element, .pfbc-fieldwrap');\r\n      var errorId = field.attr('id') + '-error';\r\n      \r\n      if (isEmpty) {\r\n        \/\/ For telephone: phone-validation.js blur handler runs AFTER this one and may\r\n        \/\/ still have pfbc-element-has-error set from a previous format error. Check for\r\n        \/\/ the specific required error div instead of the parent class to avoid skipping.\r\n        var alreadyHasError = field.hasClass('accuaform-telephone')\r\n          ? $('#' + errorId).length > 0\r\n          : parent.hasClass('pfbc-element-has-error');\r\n        if (!alreadyHasError) {\r\n          \/\/ For telephone: remove leftover phone format error since the field is now\r\n          \/\/ empty (required error takes priority). phone-validation.js will also clean\r\n          \/\/ up on its blur, but this handler runs first.\r\n          if (field.hasClass('accuaform-telephone')) {\r\n            $('#' + field.attr('id') + '-phone-error').remove();\r\n          }\r\n          parent.addClass('pfbc-invalid pfbc-element-has-error');\r\n          field.attr('aria-invalid', 'true');\r\n          field.attr('aria-describedby', errorId);\r\n          \r\n          \/\/ Get field label for error message\r\n          var fieldLabel = getFieldLabel(parent);\r\n          var errorMessage = getRequiredMessage(fieldLabel, field);\r\n          var inlineError = $('<div class=\"pfbc-inline-error\" id=\"' + errorId + '\" role=\"alert\" aria-live=\"polite\"><div class=\"pfbc-error-message\">' + errorMessage + '<\/div><\/div>');\r\n          \r\n          \/\/ For file inputs with help text, insert error after help text\r\n          var helpText = field.siblings('.pfbc-help').last();\r\n          if (field.is('[type=\"file\"]') && helpText.length) {\r\n            helpText.after(inlineError);\r\n          } else {\r\n            field.after(inlineError);\r\n          }\r\n        }\r\n      } else {\r\n        \/\/ Field is not empty \u2014 clear required-related errors.\r\n        if (field.hasClass('accuaform-telephone')) {\r\n          \/\/ For telephone fields: clear only the required error ({id}-error).\r\n          \/\/ phone-validation.js has already run on this same blur event and set the\r\n          \/\/ correct error state (phone-error or clean). We must not undo its work.\r\n          \/\/ Only remove the required-error div; preserve phone-validation.js state.\r\n          $('#' + errorId).remove();\r\n          \/\/ If phone-validation.js left no errors, clear the container state too\r\n          if (!parent.find('.pfbc-inline-error').length) {\r\n            parent.removeClass('pfbc-invalid pfbc-element-has-error');\r\n            field.attr('aria-invalid', 'false');\r\n            field.removeAttr('aria-describedby');\r\n          }\r\n        } else {\r\n          \/\/ For non-telephone fields: animated removal for smoother UX\r\n          removeErrorAnimated(errorId);\r\n          parent.removeClass('pfbc-invalid pfbc-element-has-error');\r\n          field.attr('aria-invalid', 'false');\r\n          field.removeAttr('aria-describedby');\r\n        }\r\n      }\r\n  });\r\n  \r\n  $('.pfbc-textbox[type=\"email\"]', thisform).on('blur change', function() {\r\n    var field = $(this);\r\n    var val = field.val();\r\n    \r\n    if (val.match(\/^\\s*$\/)) {\r\n      return; \/\/ Empty is handled by required validation\r\n    }\r\n    \r\n    var isValid = val.match(\/^([a-zA-Z0-9_.+%-])+@(([a-zA-Z0-9-])+\\.)+([a-zA-Z0-9])+$\/);\r\n    var parent = field.closest('.pfbc-element, .pfbc-fieldwrap');\r\n    var errorId = field.attr('id') + '-error';\r\n    \r\n    if (!isValid) {\r\n      if (!parent.hasClass('pfbc-element-has-error')) {\r\n        parent.addClass('pfbc-invalid pfbc-element-has-error');\r\n        field.attr('aria-invalid', 'true');\r\n        field.attr('aria-describedby', errorId);\r\n        \r\n        \/\/ Get field label for error message\r\n        var fieldLabel = getFieldLabel(parent);\r\n        var errorMessage = getEmailMessage(fieldLabel, field);\r\n        var inlineError = $('<div class=\\\"pfbc-inline-error\\\" id=\\\"' + errorId + '\\\" role=\\\"alert\\\" aria-live=\\\"polite\\\"><div class=\\\"pfbc-error-message\\\">' + errorMessage + '<\/div><\/div>');\r\n        \r\n        \/\/ For file inputs with help text, insert error after help text\r\n        var helpText = field.siblings('.pfbc-help').last();\r\n        if (field.is('[type=\\\"file\\\"]') && helpText.length) {\r\n          helpText.after(inlineError);\r\n        } else {\r\n          field.after(inlineError);\r\n        }\r\n      }\r\n    } else {\r\n      parent.removeClass('pfbc-invalid pfbc-element-has-error');\r\n      field.attr('aria-invalid', 'false');\r\n      field.removeAttr('aria-describedby');\r\n      removeErrorAnimated(errorId);\r\n    }\r\n  });\r\n});\r\n\/\/ -->\r\n<\/script>\r\n<iframe id=\"submit_target_accua_form___accua_form__1_69e9da2985c2c\" title=\"Notification Message\" name=\"submit_target_accua_form___accua_form__1_69e9da2985c2c\" onload=\"_handle_ajax_submit_complete_accua_form___accua_form__1_69e9da2985c2c()\" onerror=\"_handle_ajax_submit_complete_accua_form___accua_form__1_69e9da2985c2c()\" style=\"width:0;height:0;border:0px solid #fff\"><\/iframe><script type=\"text\/javascript\">\r\n<!--\r\njQuery(function($){\r\n  var referrerfield = $(\"#accua-form___accua-form__1_69e9da2985c2c input[name='_AccuaForm_referrer']\");\r\n  if (referrerfield.val() == '') {\r\n    referrerfield.val(document.referrer);\r\n  }\r\n  $(\"#accua-form___accua-form__1_69e9da2985c2c input[name='_AccuaForm_user_agent']\").val(navigator.userAgent);\r\n  $(\"#accua-form___accua-form__1_69e9da2985c2c input[name='_AccuaForm_platform']\").val(navigator.platform);\r\n});\r\n\/\/ -->\r\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Asiakkaat haluavat, ett\u00e4 heid\u00e4n puheluihinsa vastataan nopeasti. He odottavat sinun tiet\u00e4v\u00e4n, keit\u00e4 he ovat ja mit\u00e4 sanottiin viime kerralla, kun he soittivat ilman, ett\u00e4 heit\u00e4 siirret\u00e4\u00e4n useita kertoja. Palkinto tehokkaan asiakaskokemuksen tarjoamisesta &#8211; enemm\u00e4n myynti\u00e4, tyytyv\u00e4isi\u00e4 asiakkaita ja parempia arvosteluja! Viestint\u00e4 ei ole en\u00e4\u00e4 kalliiden vanhanaikaisten toimistopuhelinj\u00e4rjestelmien alaa. 3CX integroi puhelinkeskuksen ohjelmisto-ominaisuudet, jotka auttavat sinua [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2600","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/pages\/2600","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/comments?post=2600"}],"version-history":[{"count":3,"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/pages\/2600\/revisions"}],"predecessor-version":[{"id":2824,"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/pages\/2600\/revisions\/2824"}],"wp:attachment":[{"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/media?parent=2600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}