{"id":2578,"date":"2022-02-18T11:42:28","date_gmt":"2022-02-18T09:42:28","guid":{"rendered":"https:\/\/www.nettipuhelinkauppa.fi\/?page_id=2578"},"modified":"2022-08-15T10:25:55","modified_gmt":"2022-08-15T08:25:55","slug":"sms-viestit-katevasti","status":"publish","type":"page","link":"https:\/\/www.perustele.fi\/index.php\/sms-viestit-katevasti\/","title":{"rendered":"SMS-VIESTIT K\u00c4TEV\u00c4STI"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2588\" src=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/all_communications_slider-300x184.webp\" alt=\"\" width=\"300\" height=\"184\" \/>K\u00e4ytt\u00e4v\u00e4tk\u00f6 ty\u00f6ntekij\u00e4si edelleen omaa numeroa yritysten tekstiviestien l\u00e4hett\u00e4miseen ja vastaanottamiseen?<\/p>\n<p>Antavatko he WhatsAppia ja henkil\u00f6kohtaisia \u200b\u200byhteystietoja keskustellakseen kollegoiden ja asiakkaiden kanssa?<\/p>\n<p><strong>T\u00e4m\u00e4 on hyvin henkil\u00f6kohtainen ja valvomaton, se on my\u00f6s ep\u00e4ammattimaista<\/strong>.<\/p>\n<p>iOS:n ja Androidin 3CX-mobiilisovelluksilla k\u00e4ytt\u00e4j\u00e4t voivat l\u00e4hett\u00e4\u00e4 ja vastaanottaa pikaviestej\u00e4 yrityksen puhelinnumerolla antamatta henkil\u00f6kohtaista matkapuhelinnumeroaan.<\/p>\n<p>Saapuvat tekstiviestit voidaan m\u00e4\u00e4ritt\u00e4\u00e4 jonoihin, joten sinun ei tarvitse luottaa siihen, ett\u00e4 yksi vain agentti vastaa. T\u00e4m\u00e4 tarkoittaa, ett\u00e4 mik\u00e4\u00e4n viesti ei j\u00e4\u00e4 vastaamatta, vaikka agentti olisi poissa tai lomalla \u2013 vastausprosentti kasvaa, kuten my\u00f6s asiakaspalvelusi tyytyv\u00e4isyys! Vastaa saapuviin viesteihin, l\u00e4het\u00e4 tapaamismuistutuksia ja k\u00e4yt\u00e4 tekstiviestimarkkinointia liiketoiminnan tehostamiseen ja asiakkaiden sitoutumiseen. K\u00e4ytt\u00f6\u00f6notto 3CX-hallintakonsolissa kest\u00e4\u00e4 vain minuutteja!<\/p>\n<h2><\/h2>\n<h2><\/h2>\n<h2 style=\"text-align: center;\"><strong>L\u00c4HET\u00c4 SMS-VIESTIT YRITYKSEN NUMEROSTA<\/strong><\/h2>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-2590\" src=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/sms-business-number-1-300x165.png\" alt=\"\" width=\"300\" height=\"165\" srcset=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/sms-business-number-1-300x165.png 300w, https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/sms-business-number-1.png 401w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>L\u00e4het\u00e4 ja vastaanota SMS\/MMS-viestej\u00e4 verkosta ja \u00e4lypuhelinsovelluksista.Ohjaa saapuvat tekstiviestit suoraan jonoihin, ei henkil\u00f6ille.L\u00e4het\u00e4 kampanjatekstit uusimpien tarjousten ja tarjousten kanssa.Yksisuuntainen tekstiviesti yrityksen nimell\u00e4 ilmoituksia varten<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2 style=\"text-align: center;\"><strong>PID\u00c4 OMA NUMEROSI YKSITYISEN\u00c4<\/strong><\/h2>\n<p>L\u00e4het\u00e4 asiakkaille viesti\u00e4 yritystekstiviestill\u00e4, ei henkil\u00f6kohtaisilla sovelluksilla.<\/p>\n<p>L\u00e4het\u00e4 tekstiviestej\u00e4, linkkej\u00e4 ja muuta ilman lis\u00e4kustannuksia.<\/p>\n<p>BYOD, mutta tekstiviesti k\u00e4ytt\u00e4en yrityksen numeroa.<\/p>\n<p>Yksinkertainen k\u00e4ytt\u00e4\u00e4.<\/p>\n<p>S\u00e4\u00e4st\u00e4 rahaa kolmannen osapuolen palveluissa.<\/p>\n<h2 style=\"text-align: center;\"><\/h2>\n<h2 style=\"text-align: center;\"><strong>HALLINNOI VIESTEJ\u00c4 JA LIS\u00c4\u00c4 TUOTTAVUUTTA<\/strong><\/h2>\n<p>SMS-, Facebook- ja Live Chat -viestej\u00e4 hallitaan keskitetysti.<img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-2579\" src=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/chats-management-300x182.png\" alt=\"\" width=\"300\" height=\"182\" srcset=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/chats-management-300x182.png 300w, https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/chats-management-390x238.png 390w, https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/02\/chats-management.png 393w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Priorisoi viestit jonossa.<\/p>\n<p>Varmista oikea-aikainen vastaus.<\/p>\n<p>Sis\u00e4lt\u00e4\u00e4 raportteja tekstiviestien tehokkuudesta.<\/p>\n<p>Yhdist\u00e4 yhteystiedot integroituun CRM:\u00e4\u00e4n yleist\u00e4 kontaktien seurantaa varten.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>PYYD\u00c4 LIS\u00c4TIETOA:<\/strong><\/p>\n<form class=\"accua-form __accua-form__1 accua-form-view-sidebyside\" novalidate=\"novalidate\" action=\"#\" id=\"accua-form___accua-form__1_69e9dbf079be4\" method=\"post\"><input type=\"hidden\" name=\"_AccuaForm_ID\" value=\"__accua-form__1\" id=\"accua-form___accua-form__1_69e9dbf079be4-element-0\"\/><input type=\"hidden\" name=\"_AccuaForm_buildID\" value=\"accua-form___accua-form__1_69e9dbf079be4\" id=\"accua-form___accua-form__1_69e9dbf079be4-element-1\"\/><input type=\"hidden\" name=\"_AccuaForm_wpnonce\" value=\"fe37af1c30\" id=\"accua-form___accua-form__1_69e9dbf079be4-element-2\"\/><input type=\"hidden\" name=\"_AccuaForm_jsuuid\" id=\"accua-form___accua-form__1_69e9dbf079be4-element-3\"\/><input type=\"hidden\" name=\"_AccuaForm_referrer\" id=\"accua-form___accua-form__1_69e9dbf079be4-element-4\"\/><input type=\"hidden\" name=\"_AccuaForm_user_agent\" id=\"accua-form___accua-form__1_69e9dbf079be4-element-5\"\/><input type=\"hidden\" name=\"_AccuaForm_platform\" id=\"accua-form___accua-form__1_69e9dbf079be4-element-6\"\/><input type=\"hidden\" name=\"_AccuaForm_tentatives\" id=\"accua-form___accua-form__1_69e9dbf079be4-element-7\"\/><input type=\"hidden\" name=\"_AccuaForm_submit_method\" value=\"normal\" id=\"accua-form___accua-form__1_69e9dbf079be4-element-8\"\/><input type=\"hidden\" name=\"_AccuaForm_hash\" id=\"accua-form___accua-form__1_69e9dbf079be4-element-9\" value=\"8Dm+XonrsG0uML1dLIXZxy\/NGNs=\"\/><input type=\"hidden\" name=\"_AccuaForm_iv\" id=\"accua-form___accua-form__1_69e9dbf079be4-element-10\" value=\"QUw7eGFiX0JWU1o1TGByMSRaNG5tXlB3NH1ReyNbUVdVKnRRLkhffi5zRW0pampYPGVKNUh+Q19leCQmKnVUdw==\"\/><input type=\"hidden\" name=\"_AccuaForm_data\" id=\"accua-form___accua-form__1_69e9dbf079be4-element-11\" value=\"01QpZsq5HbX0u2gX0cQrDvDdOBqlQmhPF4PzzX65yUfVxE87ctbj5dfP1ghWa6SoQSQCKQ47S+DhFbfC8OcZXSnaCrmSiJN6dsTbKjHETTuDbvZUukN05Q1I2Jgy4hmjWtNzZkgGr3kuWptNIwRdGs6ANvYQ9f0WlBeZNDomP2JgkmLJIyfsTLBN43OukuOdCtCI6quZ9Vmbos4hFQUhcf17j8k\/G0ZAJAEnSs2HPdWuB2WzwiMmtI7EN48Nprqk\/XVHqGaggmhemMbF1sgCDz7mMvdC2aktwlRLxGSOzdZkTNzc1VvrftK++VhA9GKix41AcxOBymuSmOyZzdArSg5ehh7JJrEolnwi\/XTvfeOhx6YPyI9rqYz\/BqH9OtOJ0\/nYnW0w3eWMxWiXaE+yiiWg98W6yf2xjPQ93BGPBp8frnqmN1cGUC\/LeEycy47vbcRa+B4pfeEq4VXW2vnzh9wCvuZu\/GBunutgCirw4SIKqCFZ9HQDI6HyHTPDfM3FhxqcK0N8i1raKkUhpqRMAU6fmoJZRvHKgudeFYHK53VxFluRf7Kv5oWI1W4XRIqTp7B3DxFjZrHT3Z7+S373C3ZJx4XLP33JN1J3YSQmrOZwYf+N+rUUt0UswnhUp62xKfS2XDLeFVYO47AmF3a1VAGUWd+Ghf9uRy2hbsbiTxp5N0PLQP9gfsqV2NvJMBZ8q903clXAHAy9oSN8cmZNC4TMHKdjDQguTiV+LOnKIJN6a+JVdT76XRDNVcf\/xXfgj\/Sf4VFY7G4o51FakfF8y6J9AiB70rd30Oohfv\/KvDqhdIIiNDcto7OqnEnpr4zM2ogmr8UYthDHYANDCOAvHPHLtMx02BVV+yO\/BpbYzBMgjVGn9h+Hdw9oUkQgbzuFGbpQjDADyrPXO2ihc38bhn0zpMIJc145CvwJHlk9JgYCAtrV6zQDO2wiVG7NOH4HVMurP2ibgb0wg+tOcj8WCLitCYuaL0\/\/534E6MMWNL9gI6vce7+WSmbRYwVD+KAXJxbB6eZHWeu5+rhKxP6N7I40wSzgcSadA+LjzYkfTRrAcU23cJnAAUZ4N2hZN5ib+01p3evTpI+uGVYnGIVDjjBP7gjOgnF+wHkCUFus\/KbLUSZbShAaDNAVNfb5qYucEymicV+0XPwECt+rjYaQtzwQbRN32wrzHSe+ewVR3LEW78yrhp8ERBzzpYx80MrfL+jz3Fl0NS5MzdWj8u0vgb5xLegKRtjsjYBqhs5c6LEdB99sBXeYIaOR0V7lqLzUHVEOCtMF0g+NPOpYiKURAxl\/+UXK4vd\/IAnIH3alv+6TvGbM3wfUwqJ9Q5m0r4heKsNmBSgdDekrwj2Y4vu+KhEDgJRG0CN1ZnEYgGq1ZSGOxL0dSbN9Uyn42XwXEUxY8jXLddhFK3mn1Xxb1Kh1\/CYGhXX42kZIsBNL59d997jHaunqOwoM0EASqWNnIp31+dyp6CM6eo5kgoBeB0295jmu3EzV\/HoZQ\/FoU7tRUht2NvbfSPCp81b9KkTw+1oZ4DNXlIOXJErKOrgV2lNse2aBn2IBA+PaxXoQazyWHenxtT1NSSuaPfWmEYgjIq7xLH\/qELwzRQjqrfWoZOIM53pINg21nGHGqUi2C+srGPgCyRiBywibmLy0jZK0SXwgElgSMU3tfipikOfEdm+xzvjNRlphUhxsePDBMkup\/AJZDycJovNJCG6k2ujehc2+S\/8yXxKkAvpnYbdwJvKcpjjO9mQT\/PMnbEVzqe9LBLPlOrsyK3I92a8Z7lJAvNLk8zPCYU++qDazAK247lyW2DjrkuGol8TtEZ0QgibTYF6n4Pee\/pCbWqYlQS\/nsg5iWeaV2e0H92osium1g21rkeuhQqog97C7MVFT9lYsvRtUisf1fnREggU1zxfnBpElFA2rXuG3J9hBbsGgKcnWVqi0EbQIPidh\/KfXe\/VkR0XGY4KNF\/gGDKm5YKe9kmPpag40bF4c+w\/y7IQg\/XVY93pkpBnxiLgJyQ2TRfcEMJNHn73QooB9RWV099hiXKcuAL3SnTZSsInvOMHWHPEgA\/2t2ghXIIM7FxMGTJH2VR68WYK8azec0BvsPS7E7M4L6Q0\/3PiBmMTTZm1JkkGs9CtQF5eKxR8hmva25wIIiSPMqILu5eg+245JpEpOWQZPGqnHuzueFSZ+Vy7JkNp+Fyw5VPqpD4CoiGfh5VlDOU184PUD+jz9TYushaT5yaGQw1I2ABwfYdn\/5MT2zqI\/FnXRvDjZ+0ikIpjR11noLX\/IWGcwBxeJM\/NyDchLuPb6Z3r+8FdEZtP0Ijo\/VhATlYCBBP7irsGqlf2nlGfAYvaSMZctTjggkl18MUclOVnmDAELD+wvss\/sIMhMMXIDdflplQgyzBOYgCiLQ\/brszIA9Vq30N6\/VHWyZYDWQttzj3HgAAcQ2RzBJokiTS7HrvoaRH1iLIZyi2q7iDr9LshthyNQnjabmsKg13iEojHUj42DJRPec70xw3HUz7DaQIZkY3lmvafEB9V2CIoOei1MrIHplR\/Ic56LPPL+puBhu5k2WZvtiB5KySS1CTCRlHObAtHbe10bU+eAii3WJwzKcytnd92WnYiohIIMty0JLHNiPl1MkK63h9FYMGYg1l\/+Bx13ZvkU3WoGuurpT3dYjRfsp3Bnp8sZvbF8FIAakblRP\/hF4pME4jwo2IyvRoRw9aPxhz8NPm+XMQG7ZXqTPEO1uRZ\/odowqdrPr29Ysg5WZnjxeqP62O6grxHat7O\/rPtmnIBHVESpKvGDy3BMWlgGw8E47SBoZj3x49DiBWBPFOHUvkMThEJqUaiu7oRXUoX1g0avBZoMM5M3TsBG1UzJseN8M5pmAToNPG3T3Bf\/IshV0B2StoErUfN1o0VqYUGcxgttZATDrRWc2d61LkoZGRHJU1lHzL5hqCbgfP3ElbAIR23pdCgFinHvdDkXTabH9N1nS2YhqgUtnbAFJSneiEU7DTSSSMvVuQx3S0aHKXAc\/MbIfM76DpdhGCLPZo8sb+Hi6DGMowf3IUnoipmQzDTm4M\/vkdsnSOP\/Xy5xxu2rpffPylgt1738Z+S\/sxU+GfZ0PhKAiKkXtK4H6I\/S0OnwZvuPC49gueDs6TtMf6rk94RIvqb4jYPn\/tgEt+WBjaWl7qRlSSncXJou3e+PEmteVne21EH8F4mkWkIlpmznzNA+NZIAbaZOty320sSuZznzyd8iyrXevdidlYPU4S0LNuJNff7P2udwP93CKuaBGYL6BY13Jn6NWQnrnUazI9XlHCyZPVxTrDn7NmWgWD7b8ekt9iqoBKGEOtjedwAFbWKn8HraGXELlR5TDNwRY8pR60QdA\/U1l5o5NP66sWEbFXJT+VtBdw7z7AxhBaoyxwZhYck7zxHNjkIuDaYFHxrYQ9msQh8s2htuLP7WTke0IOcvgGLpLPf7i50lHg\/GtM3FgkzZwBDtVGIet3DHWLckoJT\/4SxVDFnOY0FnDb8ioK0yddJjwU7o28pL2TsLi\/zWKKRMTJ3AMdfhZm4mBNaRqrxvRPK8zmQSyBQhq7fyh5NzLdXjkBf7jDoN1U5BU\/3lUFovsI4ONCnIAMf03Ld8yHdVsNWftOWrAEdpzS4CmV9sLWzsmShRZQYImjzt0pJLuz\/JRGp8cHz7cJ91UiZz624hBVxpwmqrpdn4QT1465t0AJyA72TMLx3brAjggJ5CWey1gCJNGTfAWVxGNMRbOnbifUsxYVdVFAiYIBQkIfWun0EohVRPwPlPcba1a9dRemPi7t6xaKD79EzbyM1QyXbcdzk4A1JYbFO+EB00V3BF6D7y5LL6dGEDJf5dqS2Cjo+c34yve0WQiO5N+R9hqGpiBv9QCbYuPNeEUbiKrOitegjIsaPrvCTZkQLzCCvtLeA1JnZvoW1gDUjLJ5jJNT7o0+W9xssNKWEk4BbYAAxGGXGr5KcHyq3hQumRLKiaTOdoIJFtKCQIKhWulPlWV8CC89VYlCEwGvQxUC4o2aFKTZV0OWqo7nhjPkDpIixXDo0FTzsEMav+ytfpQM4HjzHBzSyQ7H5oBVa536+5ixGls\/4UkOf+YeHu1rS6wLmSHB3V1R6\/hLgGmna9rf6NfTKaEbhLAfZO18ARfCZCVmhW99a3g3a0cl+xhv9I1Z3OtghpdELMVSAJt\/9POCupNGA51+yS6xz03\/ylk2Da7rJb1FA50JiqGQMGhEUgQKxxlJUybltCzv0cKtj2u9Dw\/XwRiHnildNjtFsX2jGN2dXjPswYL\/IBxdwXGbo9GCTKtE8q0DBwLiWhAqPhZzIwJ+emzzT8msGwiwfvhkEg7bm6AipCY7Rlz5pZdRb1Qm78bee8g0tF6BbFIdYdjnfLWOxeUzKKDp6+EZxlYvkXP57zv30oSnSFqHGvXxt+Uu\/CHgfmWz28uwNTTdJngfrFFF4fc7X3ttg1\/oxnFbsSRQjT\/+ky6Ro6LJiIEX+JlNuw1PVlC+Om4ZtLGVamv3BNrn1uL8sSEp0bujVYLlzqNUHyVT2PVH5DUBFaqrij4P8iA\/svwNMXiAKJjEJAJ7tji5S1vocvaz6c38m1QGUW9z46XpjWY3sO5jy9YdcbEZgKh9rzlKFx7gKIJ+xlrS7RwX7ltBWn3aM1I9hygk7jigTD3Xorf5bpJZFMLFwiOJGer93MgyvqtRR2VX6FAtJPeqZrJgBwS\/A94hWDbXXyhKP9PGjTZ6oK7oz0tp3cw00fsbG6vn65sBu5aVsF5e2XmoiCDwu4LIBitC6WZLVo+0VoAsx+bqItFxpRhJxebJk1OfhHx8oVU9sW2uqDDP90Gs3gJHXbOImc491vZjojyJKToRIJHsNk+UIeVYICnMnLsx9Dw49E5sFLTqmhgozi6ZjnCCqGLOMgdG2eqi+G4rWMdMYkAj7pgA\/1wZW+Ktgtx2hOpb+omhdoXHu\/0pXCZwPXKnb6DLl6Z0dNZn6mIHtEsZhYPoOmFEs7X0P7EKJCTNZRWfvxe3cy1sZ5CVma6LAtfwM6kswVOp29kXYdL2DL8O7bzfuXtnzML68l85BSfAbmirl91BAoXzR1S4wMCbGhxlOJjZxnbqcjOkyUYqTSL9wCTPqLYwMnFlhZgFy2wQo3T5FljYOL4gOVisIvHPajEDkERFTzAWD1TiCue4wA4+dE3UasYFnWkPhGaMaO+TD24np5W8vPydGRXlvpIRHtZYrMxcdjKssJLtAX4kobaM3B2b6UjlALnNOAD4HPJSylLg+pYUbPNNH4QU59ufB6TtZ4VE6YI3gZyd4wy0rzxrQvLYIU22NV\/jUTDHdI712I3SliZF+NEKXMRTDXAC0JQNQaymj++hsfO7uC\/AXLcV50IHtXWb\/gcJLTLR3ESc\/fHcNEXiuioQ7xX0LJ04Lre6D5g9U39YtDnla7THSqmV9eaNzQNaCVEZILy1m14u91cOkDgj9QJ13qtu9yhMomm22YVqmwOpJ0ovNarssstYhO+xJq25bRjIeG5YTsRj+hfmBXP4N84GKZWqmQeT\/HlFVLmbS3vjSvVA810IoFWPr2S0grOPYBbu4D3dCJLtrznlIL2yKX7IQoQPF\/A+41tHEOFwgUgBHUHu649e3P2cT70PChJ2DNg9FbFTkQbm5Q2TXp0uFOBHbIAEeHSSg+WziwI1lAUkPQOgzLTPT6WCJOytdLoLCWq1Xb\/iXvH8zqOXHCB9GD5Ee3jo0C4WW+DEh0g1wBZCYg9pyIPzT53qVjZGiasINsLzNzXAfxQHceVPZZ6HoZeFh6beqs\/xug9VlhjlK9nbA8ZG1kBMPsfXw5AC0spErMF+VwzJBOpo623Cqfur0VCdlapSOXhsNewbELnPigwiBNzd9u8baN5i2\/IukSOXLpa3jc8urIOitQN0RpZ\/MTULE+VlpdfFI9i5wdv54tiG+AeqzKhJ\/ITHpEt0zMStRtTD0DGVqtO\/CrjnTuJgY8TjuiwaqqsYbZUk7UvmC6Nv5B51eo0qalVA61VlldT80pcX+A5Gbuc\/tHX7gvcFBDHF33faW5v14CDybY1mMuzFxAjWW5uR4cHyK5gTTjlSVxyHEc6jmGVfXfEbbalIEoB+4O9MXu92ECoDHHjBQlT+yoGoOUmt\/u8mRs5ik530LwY4W36jPuszdgf9lRnBaprOQ9KodE4TKL4N4fL+Stg\/z2M75sD2XwqL9ctwvZNHOEXK1Tbi9xuVQOPhGATrXxbW0dKOM1q2h\/\/T9KrKVAZkPoEhUcbPLEHIOvuF2Cu8LR5KQ4VF7w8pdpLDCL9mKurQNxceQ39g9Nj\/Votj24oSQUZ\/mqSateQJOkmgBvJCby7Xr2cZk29aVDWuuxZlQWBSRkvNxHWw8rxW+HtqRwR1Xb4OSWeREJFrDFbV2Cbn9yHXnnlJHBzw7dTcHiNvxW0ScFMtSrsLXB8aYzEoJLEVxPqzOWefAf5D89W\/08fsOeUNB7AMncREKuiMXPK\/IYuiBwjTguYEwRMRy0RD5TZq76zmjYR3GuSkmqRk4\/pycoCXKJp7KZeYiPjjWEv5+UBxPZUXvFxpJDFucyhPGKtS2SRW8JmjAbfxShwPLktQn6hkcjteXyVVb+htF4c4TssfyEewzM2fTtyaeqrjhTAUUrEw5y5PH\/rXriZDqSwazteX6ecEDEmlFHkkv81+ydpoUyJ2uQPSu\/yiswjL6ITF8d6p\/cHZy6yBlsLuwyFKTw6rk7pgI5a1BYcxcfOl4GZHxzk0wReAR+UXN0RET2AjJKwk4+5ZGUgN67LzsA3bhwlOqPeYVMHD98Xd52i5YEP\/1EBkInHrtye9coEmsiF+ASL+hALLuq0LSx6Zu8XfzHtmxqcNWRVI57BXLy6XUkt3N3CoXGe7soYRn4qvL3PwcZvQ\/4drTU2nS1IIxh3\/\/tln9fy8K7SWmMoOB3OcPjqpZpQZgZpyMOtz2FYxeiwVtodlQAzOU2viBfP7HbSvs7lOHDL0A66NOGPAmQEQfWL+vTyFPIb4YDqip3Y3ywQCKOpgndxV97KKuefTWTN98M00GzFnHJF0UEgo3cVAgCXW5Wiwc1ft\/+W4iMvLe12Ycd0DClm6sLkZ1dMWI7ukyu7dZN1Gms+z1lIuHpg1oaBbBYMRvpeP6DPfJWcFMA7a1IRwKy6QRIH8i20vnoKr4RUX31IMs\/AHNvd6tGvLx193pJYz6e\/y0T7zHawxizd4cphdHLzhZzcQwX7\/lMMi4IanKlUJ4QhoVf0utbjwOzp\/84gEnk9tm6sxqjk1V9hcCNqWzT1zY3zLJ6txnxcuiOa43vBYr6dQNGzGE3koqlwptgZeVfuxN9Xee+n8s3VPB8af\/1f7Zq+quJg+7soxo4u404w59AAe8DKqiTDdzYUyzi4VNWJVF+3DDS3sDT8TLmIr94Hp4DS+RP2Sy4rffi5Ldcpl6UWZWALgrVZLBsza08bDIWsaTRjb\/+lqvEzqVQ7vBaCElSuunSPKHM3HA0pjj2qwqEamNNLoENa3ZjS\/tl2ovZSzBz\/qD7zRUQIziyt2DnpVv80q4iqmObTcYmv8\/dEt4SPrju4W7WlcLierH66\/TM46Az2xcx8fHq+Bpf90upryqrw24EjIY3g7H5rl54Q9rXxXFjNQ2hF9neUWndyN\/qiOSR5+DOY3KP3iOT3K3zhcaN7EBe5dekUnMgl5Ze0LXyVDRscKHq6I7DM5v9N8YMR9NeafAQ6qkGEJRvdugozRQXgkeWiE4kQ9cCzGyo1fQ9fHDs7NLTLPssKK9e29RLRNp81XlX6kNDJjCCEEK18Tc3fqYXFALAeoDbUowCC7rQDLJru+mKhN70i8yySci54FJFWv5qd04nqnC77U\/EJvK6qItRjTsl6+8zyQeFT+u8GHOO8pGS07xogu7FaV+aS27wb\/HF5z\/6XItkq\/XkCEWbs89ma6bxITm6XLQw+l6noBxbNfCIiCA3fWkAz9bgmbZYRxqjuUn\/NozcyAXFjUbiNY7v7n3KoqOxB3KyGeYkZoupPoMcDIg0FWXDNOVhb80t6BkNYD091pxvpmUj3tp9cv6LCg2oZQWDbmicl3YvfaY1\/pOWygqfcN\/p6DIqcOiq6TqqCnNNiPMf7yjVtZFUxpmI+zQxO2ktqU2ThIH\/YFHg\/e6PHMCdUW46vKqjUf9XAvboMr1yTWZNC\/kB10fP9uLF2isLznY0tkcmpfp0hEXtccB++cd2cJMgUzgLXyNV5mx0wpyntU79zup4+D91ciazKZzMaaBSMFwljhZzJ69CS\/v1W8pyl6qJBvSaajbSbh+K7KIunYE+UuqJykAK6525zxOYa0RqfsXArFEVNJ04w8p2iHqDB3kRziH9\/H+ZHghgdg2Y625LqibkxSsGEFfkLIP\/wSFK3c5GCt92mOczujEd64aiC2So2Pk7FtB4VDXzpE7VImOWFvxGQcH2Xpu575S9\/Wb96SOaHvz6AesSXl1+jJ8RInzb5gSPxsVBNZ7LCFQ4GDsi4x29R7foCQW78+yMHdRz2JXiXYcDFvBrtJVfwcV2+urBFB2Nq7BYkxWNQHl7yPooUGNQF9A0prSc6gkMDA0EnlGGZdmewxggyLCPTiNOA28Kf33fquaBaErmKv+2V83xuGQigo0gjQAo0\/HG6D9FOYldbSB3hDv66nQXGsUc4jg2k6zdUSgjtLy5ulSAqWNH1fBXrnjQ3Dfms82dJR5kqARjo6Zq4SgRyUKzWto+SBYBfBcoG+XEWkba5KwG8fZK\/CDf97XPlE7nbzsodIgzAMdKOpfdCXhzDxJyGDxqwC714qnMoFVpgvz5amwFXiez5C6z3Gcb00fMmdEOdch9WIBkNzPf2dwujrtZYtVpqIS1MCyc\/VckBnG49EVx5\/CMPUxraLCj3Fkyg0wNHRjNDrLcFdiunY8K+mjKjva7BHJz2R2BOoph4ql57nv1w00OxyhPJgOcEMBXPpEirHpQLebkfQI1g+KDhDvQ024malVPj7nAaoifL1xzkWOHmv3M4UAYuBbl7RpBLeObXeB4tPAKgsVIiqQ0+StSd6LMXBet708J2+rrc7GG+0IS\/dfsJalNXDen6rr8eK+89G7ypBLd3oFdnKQ3sMwkc5Q+U9KFpxgFdfenkCOblb+ZzYlazrA3qE0Ym24xUZAnVOCk+J332Sk7N1Is77KNi\/No37lyM4pQmV0q0mP\/S9KoS\/KYxRKATRJSvqQaR5KuikMEmxRLdURVNxrEju+FpGy\/rpYmIAAWTOmAJtem7vr5Plyz0dQBQViwOOXhNJVqdlus9ogBTtRO77OHsuOQMCmvh3S6YllnnPMeJ28TKidjA8tYaNdXDM+YtiU0LnUtUwKQrDhiQS93+dbHC+dMrF5S+xV8zpoWey3GOub1LrR7vIg2+JABgjRmq2+O6867HaNuWPEDta31mEyxjdIJa9cmRPk6TEJd\/5KkOjasRMigeWJvWTYf3KmdcYZ2mv2+pPbS8sjepmhqi3lAIzNajkuTScmnNSpkJuRNwLr8gEHrBc7dl56x8Ck2jTtf5r29POJ6zXTKdxtjeTo2uPM2uluHBpy6TbQyduAq6L6n91hIaHWiucNOO3KOxGsu6D8hytzjLNUkEC+FKX5vR9MWLl8nZB6\/MIKsoSa1EUnavbSIxbypn6xMEeHHfrbvUtvfrH6o59+fc1eToEXmnQC4kfWpxYDpKYSHE3iQA+KsIVdrf9g\/eFHqqcQPUi\/uEpTp83LZ3Luqg7vavKvai+g3cJ9EScDKzFKa6\/5EowFqEb1Ox+t8UdCA1os+brr4+tkuewxC+01Ndz8jwbf7PoKRBKENV3YKRwgZn\/aLFf8epYb9\/IfbS3JTY5KQB1NKaKmyNARfNWHUhoXmBv4ABpG7xuiPYtD3VdnxrqCTK5xX0CZjVKpK+KZ1C7VuAXOV00NZl8B15\/TmrVtnlMOp\/ZRPP0kjqnUEqc4aXTcVUddrSPMUB8Ly+TtcdrguUszQ1AGfTEWZ+CN1itojFvZS3ZPM\/H2TUene7YClvV6ypiHzhgdBkwHvjDhPJTDHJx6Xnl8WFO9P8t0BHGibTL5j5VVHjvokFH0qt+XLW3qDCg+y1Gm5\/YgMVx+UDxcu0v1cLJ3sINRTCgig+wWhkGoNvQ6l2WX\/F51ocfatwairh4Y6BtZKZUW7Hb6oo5LZPgsE8FsaH4GJeKq3cx2\/ucfvlgNTIo7jpKBIphmXj0KLLgydhGRDt7oyQIvPg1XlENIdHivgvp2D1p2xIsrc\/h7hdmCGX0gjtN9E5WDvK3HRbrtaLPmUL+00XzGMq1f6Kt9fNq5V15gT9Wf3fdrYmCExWIp3jd+6AxbbBabz9vBpl0X+\/bdNXOcuwgyMzZ2nYuCQ73cMALFaqwhgn12rQcNytDBl7MG1xxuY5Rzu5mqezUEWfdxoJ26XTUoDDV3BuJ3PX+bNtulEa9Hce9u89kuM1yrTL\/bzeMEPfb6S3ToQtk96rEEJcsjjX4ifF3E9lLVak5qy7mDkhvDjdB\/X7Nfubr9AZAbvvfksGosAvWs\/My4J5MFFGOHcm3ojKrJu6zGRppbMXto4djcJPNsHHpvZ9\/L7V2GenfGV1Qzwg64KkM7FjpUO6wibp6bVhKLNeoNZj1bsFiX4fBnwfqsRl+Aez8j6ah1HKNHbqOPJ+CPYD8ZoBitv2VjsatTXnuDXM7baz7Lh\/OCZ5RJYgw70W9aEuoTjvJutFdG0Gy31Hmqj3doYJXCEjBjjxjTsGkqDL5iZbfJgglSJv8mErztv81cx3cVUu\/sdcfko+i54Oj3P8xYFFuYX3svnjM1Y3VyE+jDLVL+09FyMGMBL\/Gh2ul63FW07TXR\/4BwSplkmx2zRcJ0bVKXe9uqkAtTsbEPK+r2PdObMWaSlYsyJHcysBcg3ntIN7mJLXNxyiHwCaG54Kr8OAoVYfnZ9+Ps9OXI9j296ksJccuIwvHbkjyyzUP0LJXjdgJuc6rSLAf5yMhkD53e3PBfL+q\/\/hlbqaoWET7uXzAA1OnR+Z5GXvPAj06rPGl45\/1W8ZE\/pq7sGuEcc0V7UmwvsraOQ+xeVAvezCUkgGb8EKCu5tnuJrwnp1L5uB\/Jl5DAn2JstUUp9kCx1Z1VgHjLgn4O\/DQFD3TqyczNOz6bXLvew7EKGcapPxcifzTuoqzwR0iTjsVK5cQ3JN9Nw0VYIAt6xSMojWbdxzFdJDs60q2QFJSWgHZuhp5Trsm4w\/kMs6JEYBE\/VwwnedOTSq76xtksAGA0pYe8l9QO2sGV12jdqHqNYPgBh0GedqSAzi1clhsnEZ2lhBOICIRarX5KfQNnM5KlWpJLft9j1Fzx+y9YuI1bWAnxtXdTEsTeLiX+7hptWCKvOeePEN88tw6WI+sDwi2zWOVMbJTKkNN7QI+FvobNxlR2XXYLhxEjdmMJa06HXtuSUYMxRK+WO7T9ruQZ4+1sljaFTcQpue\/mf\"\/><div class=\"pfbc-element-0 pfbc-element\"><div class=\"pfbc-label\"><label for=\"accua-form___accua-form__1_69e9dbf079be4-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_69e9dbf079be4-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_69e9dbf079be4-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_69e9dbf079be4-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_69e9dbf079be4-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_69e9dbf079be4-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_69e9dbf079be4-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_69e9dbf079be4-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_69e9dbf079be4-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_69e9dbf079be4-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_69e9dbf079be4-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_69e9dbf079be4-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_69e9dbf079be4-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_69e9dbf079be4').length > 0) {\r\n      setTimeout(function() {\r\n        var errorContainer = jQuery('.pfbc-error', '#accua-form___accua-form__1_69e9dbf079be4').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_69e9dbf079be4').length > 0) {\r\n      setTimeout(function() {\r\n        var firstInvalidField = jQuery('.pfbc-element-has-error :input:visible:enabled:first', '#accua-form___accua-form__1_69e9dbf079be4').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_69e9dbf079be4 .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_69e9dbf079be4 = function() {return true;}\r\nvar _handle_ajax_submit_complete_accua_form___accua_form__1_69e9dbf079be4 = function() {return false;}\r\nvar _handle_ajax_submit_timeout_accua_form___accua_form__1_69e9dbf079be4 = function() {return false;}\r\nvar _handle_ajax_submit_message_accua_form___accua_form__1_69e9dbf079be4 = function() {}\r\nvar _handle_ajax_submit_response_accua_form___accua_form__1_69e9dbf079be4 = function() {}\r\n\r\njQuery(function($) {\r\n  var thisform = $(\"#accua-form___accua-form__1_69e9dbf079be4\");\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_69e9dbf079be4\");\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_69e9dbf079be4\" 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_69e9dbf079be4 = 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_69e9dbf079be4 .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_69e9dbf079be4-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_69e9dbf079be4-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_69e9dbf079be4 = function() {\r\n    if (_ajax_submitting_accua_form___accua_form__1_69e9dbf079be4) {\r\n      return false;\r\n    }\r\njQuery(\"#accua-form___accua-form__1_69e9dbf079be4 .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_69e9dbf079be4 .pfbc-element\").removeClass('pfbc-invalid');\r\n    $(\"#accua-form___accua-form__1_69e9dbf079be4 .pfbc-element\").removeClass('pfbc-element-has-error');\r\n    $(\"#accua-form___accua-form__1_69e9dbf079be4 input, #accua-form___accua-form__1_69e9dbf079be4 textarea, #accua-form___accua-form__1_69e9dbf079be4 select\").attr('aria-invalid', 'false');\r\n    $(\"#accua-form___accua-form__1_69e9dbf079be4 .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_69e9dbf079be4\").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_69e9dbf079be4\").last();\r\n        \r\n        \/\/ Apply ARIA attributes to all inputs in the group\r\n        $(\"[name='\"+fieldName+\"']\", \"#accua-form___accua-form__1_69e9dbf079be4\").attr('aria-invalid', 'true');\r\n        $(\"[name='\"+fieldName+\"']\", \"#accua-form___accua-form__1_69e9dbf079be4\").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_69e9dbf079be4\").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_69e9dbf079be4 = 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_69e9dbf079be4\").attr('src','').removeAttr('src');\r\n        timeout_handler = setTimeout(_handle_ajax_submit_timeout_accua_form___accua_form__1_69e9dbf079be4, 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_69e9dbf079be4 = function() {\r\n    if (_ajax_submitting_accua_form___accua_form__1_69e9dbf079be4) {\r\n      if (timeout_count < 60) {\r\n        timeout_count++;\r\n        timeout_handler = setTimeout(_handle_ajax_submit_timeout_accua_form___accua_form__1_69e9dbf079be4, 500);\r\n        _handle_ajax_submit_complete_accua_form___accua_form__1_69e9dbf079be4();\r\n      } else {\r\n        timeout_handler = false;\r\n        _handle_ajax_submit_complete_accua_form___accua_form__1_69e9dbf079be4();\r\n        if (_ajax_submitting_accua_form___accua_form__1_69e9dbf079be4) {\r\n          _handle_ajax_submit_response_accua_form___accua_form__1_69e9dbf079be4(false);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  _handle_ajax_submit_complete_accua_form___accua_form__1_69e9dbf079be4 = function() {\r\n    if (_ajax_submitting_accua_form___accua_form__1_69e9dbf079be4) {\r\n      var response = false;\r\n      try {\r\n        var responsedoc = frames['submit_target_accua_form___accua_form__1_69e9dbf079be4'].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_69e9dbf079be4 (response);\r\n      }\r\n    }\r\n  }\r\n\r\n  _handle_ajax_submit_message_accua_form___accua_form__1_69e9dbf079be4 = function(message) {\r\n    if (_ajax_submitting_accua_form___accua_form__1_69e9dbf079be4) {\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_69e9dbf079be4\")) {\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_69e9dbf079be4 (response);\r\n      }\r\n    }\r\n  }\r\n\r\n  _handle_ajax_submit_response_accua_form___accua_form__1_69e9dbf079be4 = function(response) {\r\n    if (_ajax_submitting_accua_form___accua_form__1_69e9dbf079be4) {\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_69e9dbf079be4').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\\\/2578\" );\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\\\/2578\" );\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_69e9dbf079be4 = 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_69e9dbf079be4\");\r\n    try {\r\n      window.addEventListener('message', _handle_ajax_submit_message_accua_form___accua_form__1_69e9dbf079be4, 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\\\/2578\" );\r\n  }\r\n  thisform.attr(\"onsubmit\",\"return _handle_ajax_submit_accua_form___accua_form__1_69e9dbf079be4()\");\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_69e9dbf079be4\" title=\"Notification Message\" name=\"submit_target_accua_form___accua_form__1_69e9dbf079be4\" onload=\"_handle_ajax_submit_complete_accua_form___accua_form__1_69e9dbf079be4()\" onerror=\"_handle_ajax_submit_complete_accua_form___accua_form__1_69e9dbf079be4()\" 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_69e9dbf079be4 input[name='_AccuaForm_referrer']\");\r\n  if (referrerfield.val() == '') {\r\n    referrerfield.val(document.referrer);\r\n  }\r\n  $(\"#accua-form___accua-form__1_69e9dbf079be4 input[name='_AccuaForm_user_agent']\").val(navigator.userAgent);\r\n  $(\"#accua-form___accua-form__1_69e9dbf079be4 input[name='_AccuaForm_platform']\").val(navigator.platform);\r\n});\r\n\/\/ -->\r\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>K\u00e4ytt\u00e4v\u00e4tk\u00f6 ty\u00f6ntekij\u00e4si edelleen omaa numeroa yritysten tekstiviestien l\u00e4hett\u00e4miseen ja vastaanottamiseen? Antavatko he WhatsAppia ja henkil\u00f6kohtaisia \u200b\u200byhteystietoja keskustellakseen kollegoiden ja asiakkaiden kanssa? T\u00e4m\u00e4 on hyvin henkil\u00f6kohtainen ja valvomaton, se on my\u00f6s ep\u00e4ammattimaista. iOS:n ja Androidin 3CX-mobiilisovelluksilla k\u00e4ytt\u00e4j\u00e4t voivat l\u00e4hett\u00e4\u00e4 ja vastaanottaa pikaviestej\u00e4 yrityksen puhelinnumerolla antamatta henkil\u00f6kohtaista matkapuhelinnumeroaan. Saapuvat tekstiviestit voidaan m\u00e4\u00e4ritt\u00e4\u00e4 jonoihin, joten sinun ei tarvitse [&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-2578","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/pages\/2578","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=2578"}],"version-history":[{"count":12,"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/pages\/2578\/revisions"}],"predecessor-version":[{"id":2835,"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/pages\/2578\/revisions\/2835"}],"wp:attachment":[{"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/media?parent=2578"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}