{"id":2878,"date":"2022-08-18T15:06:36","date_gmt":"2022-08-18T13:06:36","guid":{"rendered":"https:\/\/www.nettipuhelinkauppa.fi\/?page_id=2878"},"modified":"2022-08-18T15:12:21","modified_gmt":"2022-08-18T13:12:21","slug":"gxv3380","status":"publish","type":"page","link":"https:\/\/www.perustele.fi\/index.php\/gxv3380\/","title":{"rendered":"GXV3380 VIDEOPUHELIN"},"content":{"rendered":"<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2719\" src=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/04\/GXV3380-front-2-300x160.png\" alt=\"Videopuhelin GXV3380\" width=\"300\" height=\"160\" data-wp-pid=\"2719\" srcset=\"https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/04\/GXV3380-front-2-300x160.png 300w, https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/04\/GXV3380-front-2-1024x547.png 1024w, https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/04\/GXV3380-front-2-768x411.png 768w, https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/04\/GXV3380-front-2-1536x821.png 1536w, https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/04\/GXV3380-front-2-2048x1095.png 2048w, https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/04\/GXV3380-front-2-1320x706.png 1320w, https:\/\/www.perustele.fi\/wp-content\/uploads\/2022\/04\/GXV3380-front-2-600x321.png 600w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>GXV3380<\/p>\n<p>GXV3380 on tehokas huippuluokan \u00e4lyk\u00e4s videopuhelin Androidille, joka yhdist\u00e4\u00e4 16-linjaisen IP-puhelimen usean alustan videoyhteisty\u00f6ratkaisuun ja Android-tabletin toiminnallisuuden tarjoamaan all-in-one-viestint\u00e4ratkaisun. Se on ihanteellinen p\u00f6yt\u00e4kone kiireisille ammattilaisille ja johtajille, ja se tarjoaa my\u00f6s tehokkaan mutta kustannustehokkaan laitteen mihin tahansa konferenssihuoneeseen. 8\u201d n\u00e4ytt\u00f6.<\/p>\n<p>&nbsp;<\/p>\n<p>Androidille tarkoitettu GXV3380 IP -videopuhelin yhdist\u00e4\u00e4 16-linjaisen IP-videopuhelimen usean alustan videoyhteisty\u00f6ratkaisuun ja Android-tabletin toiminnallisuuden tarjoamaan all-in-one-viestint\u00e4ratkaisun. T\u00e4m\u00e4 IP-videopuhelin tarjoaa tehokkaan kokemuksen sen 8 tuuman 1280&#215;800 kapasitiivisen kosketusn\u00e4yt\u00f6n, 2 megapikselin kameran, sis\u00e4ll\u00f6n jakamiseen tarkoitetun HDMI-tulon\/-ulostulon, kahden mikrofonin ja 1080p HD-videon tuen ansiosta. GXV3380:ssa on kaksi Gigabit-porttia, joissa on PoE\/PoE+, integroitu Wi-Fi (802.11ac) ja Bluetooth-tuki. Se k\u00e4ytt\u00e4\u00e4 my\u00f6s Android 7.x -k\u00e4ytt\u00f6j\u00e4rjestelm\u00e4\u00e4 ja tarjoaa v\u00e4litt\u00f6m\u00e4n p\u00e4\u00e4syn satoihin tuhansiin Android-sovelluksiin. Yhdist\u00e4m\u00e4ll\u00e4 huippuluokan IP-videopuhelimen, edistyneen videoyhteisty\u00f6ratkaisun ja Android-tabletin toiminnallisuuden GXV3380 tarjoaa yrityksille kaikkialla maailmassa tehokkaan ty\u00f6p\u00f6yt\u00e4viestint\u00e4- ja tuottavuusratkaisun.<\/p>\n<p style=\"text-align: center;\">Ominaisuuksia<\/p>\n<p style=\"text-align: center;\">16 linjaa<\/p>\n<p style=\"text-align: center;\">16 SIP-tilill\u00e4<\/p>\n<p style=\"text-align: center;\">Sis\u00e4\u00e4nrakennettu 2 megapikselin kamera videopuheluihin yksityisyyden sulkimen kanssa<\/p>\n<p style=\"text-align: center;\">Toimii Android 7.x -k\u00e4ytt\u00f6j\u00e4rjestelm\u00e4ss\u00e4<\/p>\n<p style=\"text-align: center;\">Sis\u00e4\u00e4nrakennettu Bluetooth synkronointia mobiililaitteiden kanssa ja Bluetooth-kuulokkeiden liitt\u00e4mist\u00e4 varten<\/p>\n<p style=\"text-align: center;\">Kaksoiskytkent\u00e4iset automaattisesti tunnistavat 10\/100\/1000 Mbps verkkoportit<\/p>\n<p style=\"text-align: center;\">Integroitu kaksikaistainen Wi-Fi (2,4 GHz ja 5 GHz)<\/p>\n<p style=\"text-align: center;\">Sis\u00e4\u00e4nrakennettu PoE\/PoE+ virta- ja verkkoyhteyksi\u00e4 varten<\/p>\n<p style=\"text-align: center;\">Kahden mikrofonin HD-kaiutinpuhelin<\/p>\n<p style=\"text-align: center;\">64-bittinen neliytiminen prosessori, 2 Gt RAM-muistia ja 16 Gt Flash<\/p>\n<p style=\"text-align: center;\"><strong>8 tuuman (1280&#215;800) kapasitiivinen 10 pisteen kosketusn\u00e4ytt\u00f6 IPS LCD<\/strong><\/p>\n<p style=\"text-align: center;\">Oheislaitteita varten ovat HDMI-in\/out, USB, Micro SD, kuulokeliit\u00e4nt\u00e4, EHS (Plantronics-kuulokkeet) portit<\/p>\n<p style=\"text-align: center;\">7-suuntainen HD-tason \u00e4\u00e4nineuvottelu ja 3-suuntainen 1080p 30 fps HD-videoominaisuus<\/p>\n<p>Lis\u00e4tietopyynt\u00f6<br \/>\n<form class=\"accua-form __accua-form__1 accua-form-view-sidebyside\" novalidate=\"novalidate\" action=\"https:\/\/www.perustele.fi:443\/index.php\/wp-json\/wp\/v2\/pages\/2878\" id=\"accua-form___accua-form__1_6af1f3cd3cdd0\" method=\"post\"><input type=\"hidden\" name=\"_AccuaForm_ID\" value=\"__accua-form__1\" id=\"accua-form___accua-form__1_6af1f3cd3cdd0-element-0\"\/><input type=\"hidden\" name=\"_AccuaForm_buildID\" value=\"accua-form___accua-form__1_6af1f3cd3cdd0\" id=\"accua-form___accua-form__1_6af1f3cd3cdd0-element-1\"\/><input type=\"hidden\" name=\"_AccuaForm_wpnonce\" value=\"3dda25f5ee\" id=\"accua-form___accua-form__1_6af1f3cd3cdd0-element-2\"\/><input type=\"hidden\" name=\"_AccuaForm_jsuuid\" id=\"accua-form___accua-form__1_6af1f3cd3cdd0-element-3\"\/><input type=\"hidden\" name=\"_AccuaForm_referrer\" id=\"accua-form___accua-form__1_6af1f3cd3cdd0-element-4\"\/><input type=\"hidden\" name=\"_AccuaForm_user_agent\" id=\"accua-form___accua-form__1_6af1f3cd3cdd0-element-5\"\/><input type=\"hidden\" name=\"_AccuaForm_platform\" id=\"accua-form___accua-form__1_6af1f3cd3cdd0-element-6\"\/><input type=\"hidden\" name=\"_AccuaForm_tentatives\" id=\"accua-form___accua-form__1_6af1f3cd3cdd0-element-7\"\/><input type=\"hidden\" name=\"_AccuaForm_submit_method\" value=\"normal\" id=\"accua-form___accua-form__1_6af1f3cd3cdd0-element-8\"\/><input type=\"hidden\" name=\"_AccuaForm_hash\" id=\"accua-form___accua-form__1_6af1f3cd3cdd0-element-9\" value=\"yMlD62Uco4tpWhYvyXRCJRwxotI=\"\/><input type=\"hidden\" name=\"_AccuaForm_iv\" id=\"accua-form___accua-form__1_6af1f3cd3cdd0-element-10\" value=\"P2EpNlUsd191SVskNmZBfHIsRWIzODIlZkhDdSxeNUhDflJtPVhWIyUreUwrNWBvPkx2azU8QEIyNWp0ciEhaQ==\"\/><input type=\"hidden\" name=\"_AccuaForm_data\" id=\"accua-form___accua-form__1_6af1f3cd3cdd0-element-11\" value=\"gxsZER4C0yYx7TGd8zt3YV0uDyjNjYNgHV29b69UQw2WuYxOKP\/8Wn6tma01ScjnvDOM9QNNuSin9yL4A7CYXQXZUz5PWoCEQQeFkvL6gYHZd0SzP0yiuo0pVPe3OdpyaExSk1FhjBKX9shlrTMU\/YhI3LaywZAq3E07EvwKOcf3o4gULl\/OfU0v+ebOe8NfsdywbG5MYEfeDdTP6zVtYf22rboQtsmDfI9yi0vYyib\/wm0nSkVHxU4ZFcg\/NKsLxc5gYnWlSewiSqvi80c9vbMlLKY999MxUIT9kjfzbGzfoBS3Mp0h5EkADSl+wMAqxDyluRc2+vit6wtUj82FSf31gojuq8kJAdVreKcto0CpT5FrsK5SBoGz+BZOwmF3E2kXJGaAeTuyeC+vEJc8fYsgKbxeqnQ5Wzoj2pHWKd5KP1+nKw3E6FdGAMnk2vomSqoCbNZfGe\/XpPEIKv3SB662uGOrJ7Ce4n1t4jhBZKaCdBCafkdAbqjlFIE+osVQoGe315kkKwMPnepj0TGV3DoZMkZUTvZ+BB6E3ZPFJ+6hYySITEWCzhQopmSMtd4uVRA9ZmaaMsJTya70VjNoe2dWEZjWodrVup\/alBG5O8ZWCOCtiKgMELxXMR9OVYJNHWmJbfRIcbmV5mjBU9+oqfH57bepc9LxrhDLymhY2AeBTg2OdSWeqjbL6XbOyfUhYTQx1KtAJ42Z1wUZcZWH+jCaZ6DL54SwruiZbUnHE+cVfhYClgyAkEk5RCAdaUCeRbo++2YBW+c0P7tFXoV9KpsuMzJLmuwDuLLTu7X3MAXFmqZEy04MFiI0RqiwgAVorr0mkgIQskLG6m4V\/pqDzSmsrIgW04Npg9Iq\/vbWP8OKlDnF9BajGOhsIpfq\/48Rqb6OA8V+zx\/jrDQHUMse0rXBENjdlIMtBgnBLBMhAkd1boNf6QzjrWE31XlWKOoKdNxftWR6hFHl0cI+erdBEQHBZrWAlVPPYaESr\/aM2RQprTdHDBSX6U98cOVEJkA09I0nWN\/La9CLgQhLgAlXGsw19\/1Qq7KJhwQwy3wlBrzEOBhQPnvypvMIMxWTiRDWQ0IE8JKv7CLHhx1lOkWLtOCvOvkmgpK6PXfbgP4i3YD9nnWYefepCaf1F1Xth31WEUIe5OZexi8ttWwfkdypcVs3FRjjf5esnd7cc0vp9kT6k68egKY7Du0PenEvLn56dNiCdPr7rdAIsgEpPnmtMDNx2bC32b6ltrqcLuSlndt\/sU3EcbVw5UeIzwYNoKw2bmtoyZGGkVi8mrvH+By1Ib5RCui0rrCaaFuWWi\/NNevIpQF02vweNyh7C75ZdrTlPGpcMt2ZGphDI36jQCGtDSvT5zgLdp3PkRvAYkzG9ZhgIT+WpDw92aG6ncUBIg18crEhbOBw3WvDC7aFmceuoeWnGd\/RpWFy9l3szS+SLyd5JcfsEG7IZQey+mL7oFO230SvPbUMexTqiFqpDz2LtwA4kbms\/TU6SYCRiZ8vli5t9dFisn4XALddHild3b9bb3tl9u8PwLU9VtGwEoXXpDAEgd6FDUx4TWEncZt34fcNhAcAXYRVfK4InWZlpBTkygYonx0Bf8ZLktzOWCWKt1ZLvJdbHB16Y6WSWUM8ACHDWtwLOSio1z6y8rlI\/\/K7OpKrJ3s+7EH54SMKlcPnwrnUee\/nkWu4sQJVsq89pnQYQEOkfsSTA5l1H6Nl\/81thiOthvTCq7\/Yrfahf+PQ6vnzloss1AwG+j1HTR+XiwqUF55g6rCp\/BFF5dIJaFbo\/SepKRkE8wq+EOmyMEfrpZNCbn+1yN3NJRXsIIXRcwklo35\/c98E4Zf64SaGGmxTv4fUSQBuMcVFqDOPYy7PdXxr5aDgALxD2kMVoCtcly8t7GFtd69whaV8Y4a+xVqyospAczIv+RdAg9bgjxe6l8YimSl6B\/p\/WuTmJkdupxxJlPlI75Fx9vMwuv9y7AaIdU9JV0YQpLMcEtfZuts282grLv6+IJAGu+0RCw9+\/TBgTkeT4Y2qtlo+EqKr34sAyNvzxQSURoZOjWiFcYie0rDjenKYd5EqUW69VwIvrnQYC\/9tHOekuNFiyus8Qme8t9VhafmGqhp5IZgrkfGsmv7duS4GskIiTMVZDY9\/iU8RI5kxtohaRmS\/nvg3+Q4ttgfu4mEa93uoDmnJRL3C+c2kxE8CkAfKu55lcHOm8qtElavhIhNJmBJ6HSRghMAmohBELv4SkpULPdd3MIzXAukcarVxYxcsioarByIMpTfX8ScuB1k7qCd2uRueFfgiNOfK28J3MajVWibds2hi9JKPwcyFfIBhe1EC6jN8HisM\/DhWSfYZywZ3b\/qoBmuio52DydYQOyIifJ+5kTlnhP0iYVst4ia9n4VzN4SxdMSMuUvbHtFJvD60t2NNLeQMsCD23aLjdZEFueqn9U\/qT6g0hYq732WxOgICowAB\/U1HwqqfPjq8mvUPvR0I0nHah326BwhcqVAY9pwCcnxZpBZLLPH9aQPrB4E6Y7oHoGVaXS5\/r+OpyDYLnAZgP0VPSLYZWfmo3D4CA36d+x1QwzERxq2Hxa4erCNPse5\/RsiCTk1SkGA8zqa0dzsyFaWVpUkiDr0XZk67inlBdM9QVlwPCbYz3HpXhAbg0+kqzpUJN+q3zkNwKTlN2+Tditm3WN0e9oiSEUoiBsllqCBt+8rNt8kpName49gLtrPwTHpHcojo9IFYhCG1vvTXgH7EKTjBOw1soSXFYwLA9k6Hauw2seIlGC+Cv0pZ6rug0CJ5J73Z8fTYqJj1nTYha5QKSUxhOe83JVk3k2wnCMlHbvwo4410n8ayyB746qzL7wYatyWWn8kb4e\/QI7u15LL4cZSWwoN89DCdrg5Tw5ahfQpCH\/zPDeNxsW8OFbqSRbZe3LUUiwvFpPz2I\/mZ\/k2Qq4QvZH0DQNtjsW9PvKsZmnpKqgpSSglNXrRuzAzu0KJRsZUHgHcJm7HU03aymxCkm7UpxzqoksNsbVKlH9Lyvf9EzKUWrfuhRO8smk\/NpWplGef\/Au00Y6jAlHoopaF5kavHkYOJEiHhiGSpB6TjK9EdBOrGVbnQ8QwkpvnPqX3ur1hVfLnaSEeOSLhPSTjWlNcc7h6t0v8dfxmecqlw996u6hYrHW1X0S4p32dfKAG5AdUPsPGU6am4hMm9OOjZ5m2mtmR1ILoaIm7tDeDQymBpSjmNeenJyYL4KJKYfW\/mUZ9qtvQ5L4YoFa8b8ABoWyTWsL+brzoFFrP3IJ1WKR3v4VrhzESwho17vl3ZNi6N35Mpo5f02w8CbeJ2OIDskvF5yf4CRCcO7yehsmwEztwy78FgnBQr6Egt5EK6oqTWDOWT0TlXvZnlqNKXtSb2nlifoj3tG1UYwTuZgopF1ksdu2WFJ9qeBPInSkHNWtjwIeFEMWeqpV6AvXQBkceYiehikn0URI8FV7TQwJUUXqZh3s9hnPVFFlRs3iUThCeYIYTH1c2Q77HwYG3y6zhtCmgF5NtgG1tp1eDJZuxSZ5jVvTKwGPrnCYSezEndgfX2WTfKogdqiIxGDS6jO2kFtRgMD\/paNlcBQrFIsjhv8JhMcUoekI3s+023nY6q\/aOFDCUq1W2GY6iuSosI9wZ8CiYsVXysMjmgTgrTv4flZWcfsP\/C8rHWBseo82OTuwfzbwydwke8t3gGjCANo4WeGsn7XZiJre2KEn5JcFo\/6EIElVO9PAQ4ulcGQsVlqIMaNlEFChHRQt\/phrkiTeFTHZU02wuKwCoa7GQrAV87EQq+W3YMsd42h2LTyuXj7EpfsamDbbfbOUDWSjO7QPM4C423r4yIwctmC12ksxSd2h86ZHeVKtb19DoxwL7tBn3sm7kWZjG7FG7XeD3zxYXkQ1r\/MOAbkGm0Z9\/kCFJQwtbHvxBNt1OI2\/a2qH5NeisF7j1EIch4dWWKRsE43K9189qPg83qCSZKUBwVf9n3VkmaFoZq6OJITrrd7VrPFRTi5hoW4jHijF08D+KUQC3VCCuowuAEz2KlBJzD0iptnGoIRDNiQNCZofCTrF0gSqDIkhEdoufcNhky0201Nlde8fsNsisfRVKLRancB5WSlUEEOoFlziXOeYCgXhn7yMspkr+TzgYtTqgPP1bCeeNzsstBt64MOjhopdKJSWqS14MuPDN\/tr2tqKSSPm\/pDlX7MZvWNdOU4Fk3SJbV8v4oDGvrxd5i7hyeR\/9Tez4TvzOdH0HVlvYq+9P7iKW\/MLrLHyb7Z\/OAaw5su7ctSeFI65WDJile7mhRXHWGr4Bf72nQ+WDA4jMl\/NHBOD9L6E\/q2YqKtkiXmSVwmQgm+HevdY9jKoT1cCs34mojgnOnxX\/n2bjnCbxvOme03AWDNxmMh3KlEm3pejkikpkro91UIMgDpPhmUT7fN9gNVw6oJmIQmQXVovvrz1TyQVVjZ61UHQSav3mMTOUrP1WrG\/2m5cZJ3I2W\/QOJwNAZydx+UEmV7QT5u28VjmumJ29gIkMAYR5dOM4AwskeZ6DC5ASODFB2XJq1FM8cGCoxmvZmuJlaIdHXde+R1nif\/XVPOZFtUvcSbo0GPaoJZFBd+mRlnGMkg22gmr5Vf\/PQfns06KDNZjxXdShVwqJIkxvqeHGsw4I6uYETcsgSJrtPy1ogS\/nGShRuTVVSUcgH43I2prYuHkBDJaaTojy0LO00yS3WSUSaywuAtcmK5Zhp9oPXCVcho5qXjM9aS7wr2HAsv9fpAGsGTkpwl3CF18xBzVIVtZJGauQJYXSa+TkQJrXc3pt0Pa7kvOoOhYriP+FQTRWVqVBRZtLuQHTZnL6a0N9OlT42Pz+0MheyB3rVlfMt2zE+zmneO9ka\/\/lCR6RV2iV5CA1u5eqJ179fG\/r4g33leLUo1wXrVNnG6vk0geSo72rHjIF15BydRjEuvwV8DVQi8Z7RCAhLfDshb5yzbehD\/PgMIf833Zkxj4AqBoNnns2kjhHZpiEA3lElzgWNLi4XfXPY\/bxy2\/8vaqw\/Dx93QVcJ+ctIKX37zHC\/Sl54Sk8ZHBxlP4iEVP8CfV5E3vDEVSn\/wflLtCYxAfbCbS0p1pd4uY8TulWW6E6oL8w+e1kGfgDE533WFpvxrHJ6AVFjmO+ZFRfmZQ613pTBRUDRsJadaaTfcRMUWvJM2AJSUnzTBoERaQJX\/VDQF7KWyBBM0ZKa4jIWRrn0PXceIDVIDppm2gXXS5HRbaMn9x9kHLkyoC0S6XoS06Wf3DtwqVmrd3FEmWYtmp9L4E0Zmrwg\/EKeKXJcLwDI3NN6AzCWdvXOjEgW5emqRmLD3+ACqGNl1LvXDXWivTNbcVmRVt3ZVXvlpOON9YgElnqa4GQvxfMn6mJVZuxxgrNyraYn9H\/xS9HJ++XQaPtoDzNDA3WxZgunQpNZiMLAmsYTz1cObmqygoqtXzVMAmml9hGHQH197HJjcokIUGBGcIIjKN3OljtMxavjiNYicnsb4shd13f0u55R+aChH1+9GYnWLq7Ba869NcMpt8BSKCGy0rABlKHl26lLtHpDkiXu0fkQGkGS2sSqkcAIOtmu5rTC8I+keD6Kb22JywLaKfauHMY5XsqHRYmPpnG2iwyPZo91A3UYsjOH6IYekipjinyyhsv8PUesaRiE\/\/m08olVc8LskbPbHxK54FxPyoBYKeBniaswWLClVDkryS9N\/63WzglvnghRS84bjlwxB+DbS+6FvQS+iML4fPa49PcmDNtjP1SSNcve5HcX9H9feaHp+GBbwn8TLcJBFe4de1IarpVvTaoT197umaKM143Y1FZVqjZtjbXoYSTk7oH02zvLTiYzZ+EDhnvYW5C7BZkqJyFBs4uIh1lXwxgr3iurhEHklR3dfAAYekVYhkruRG8RIhvp9lg7jDEOkRQFILroHAYFsdvnxm76PTTSt\/GuzuAI+SkRhico88hTWQhE4QQJNsjXDGr4DcTM3cbVOXOebSthsW8\/Vf5iOYNNAD2eGMz0DmfoCWzT3BqI3IMaui7A5BJWEFgx1ZmT33RDvIkTnAoLhTlmPmelwJVVotkhR17O\/ZfkAguDztcOTimYVd3ekpUmrkSzCHApP2NklV1bTgwAGpiI+\/QA7L1ZDQnwLWZcDRAc1foKfOak55kj0c4QJq\/6ri8AlAcr51VKD4wqwYy+ZhEajyhZWBwzNUzpXkFcz6UdWv7SlSqUiD3V+1DSEOgUBTeKMQg\/QBA\/2YudFtutwbtriAF5cmXHfJSXTMhgP3A1W1sOT7jk+itNTR0ibLjPghyDxPzBjCxIds\/fSIt9BZQJoLh\/eBMFNNihNrAnhkKCOSRAsouOOtRZUGfrIfzJuPD2jS6q1zZVdhGNLcWeEdhB8W2QlMWR5laZZ6L8\/GH1Vy0AV1qlDGmDSdfrUpf+giEwIhWnn+MuRroRt6k9Zq0NRGd6tlkICYXkC0bW6NeN4Zt4E2b8jmPG4zsHwWVlmCWOtui2eyH4D4oR5y9ZYJTyi4nGlZGjZN\/o4Z6yzd+9FLsAS5LiSNVxBXc1KnSTDZE05PdqFZB6VDWeVIZg5FveX\/\/fYOqoZT171jC9CpsysFJrag9qovO8qPKkpqEodHqYwObtsZwAlPOPDhGlSj2eel5P2IfqiNdgUbr4N7PXpSUB+1AzIiNkt72GjAqeMq\/6DrDCiyfPVSyso1xaBIjAv5aJNrr9EO7E0vPLoYwEfIDd0zPTIXtXKRBlNu77Y89q0d0j0Nj+ZIWwZ1yW8MNLTQumOzewIRAtD6336AkhTKHZLTkoEsIvoHbCfESA6K8dS1Px\/xC8gRjoWWk9d9mmemEDPV93OE7vXmJ8CaK+SPyxZxCQfSb3OogUdFnQFiRgk1b7RTWGXEuecprBkKDueUbybk90SRKQbHit2kZ4kTbwLMMC0T8SdrN7GlVAc1PiCDLtMQjx90CszV68hXd5cNHNW5\/LeHVLSc0GRE7gvTbU6XoXpPxqSwvCVI4S6m40s3mJzVORdI+08\/c7t99u3cGuCXoVWuJ1K8eINwH0eNuTCagY57La547bZMJykWAl\/1vlkAOu\/uSGXPAXHbTsKr4NtGZtvD9C8JTiBuuv4y7Bu\/vJtCBIprpq3Upg6ElHR4WkoruRHPBEjOmIcSPPBD6742hhRstlV0y4KFA5CXCujNhBlz7ircrWxSeFtK1kugNmQoPzNC18pNwdK3g7TDsMi2FN3Gcv6Ho8xCBJZ1h1Zfqj\/dYyXWIkAve+UEqNDDfqG4DvQNBLidgxfH6Y6YhSg1vOzMkgIH86mcrvIqZ5ppFE+p7oK5XkXacqKY\/TEYS8gAKX\/zIjlJ2q4qsWPKeYTpvpD5psLm63Z3PCpi5Edgjfct\/88t9\/kPozl2sOR83d9YLiO55EpuCPHskiYop3toct8E6CE77U1xqxJGac+J9RYl5M2yVh6BYO0wy1YpKeejsAjN8mOLwR1LSXGl\/H7pK87GUMxCg3jlU79imuuNfJo6x9iPhjh9fSJkw7zLJs+Se88Twts54mQK8jp2RVdcGm6ts6NkW21tgLnWIhEHSXBOzYTldGBH+C49sdA+owsMmIRyHib\/uPUMJAxB7RSfux2ezWqfE08bzJU+z2seXFCayGGP13Bqcwc41w4d14M336nOeihBYjHq5s41s4tLf209THA3Gyk6kWz4SPqnmtPnBBUa7KCONP6gb5oelYSi8umcLhMTbmKhwYdHHnePJLZ\/DKtMpT5Tgf22IYkVjXpM2sBJhtaQStJr+IiG3i9YWoAF6WbCkD+RVZgJ1shu\/kyb7jqI8FrcsT1DevJRz1bpNxVWF5gICaXGhUrGCDbauxAQumRDVrxP9IMudJEXXxdobuG9rirBOkuwTcmgAtE7QXxfJNAtknieBYxq+oFTkkq6VO3qj5ZJVk2wR6fAt4KH1lZvuMfZjvQ8nDcROZjB36pWRYry5sV5W33Rh806SzlkvoFPcXsgzky89dxtM3OqHhAGqQJRtDZiFwjlHVxR1GbhX+oGU5hVaWnu5p1JBPzZjmD56mJRWNpVeokki6LITUadBqVSWBLyLKDHJOyoaz6DgSlcGGJ4i2MkJbFTy0e+Kb8aDmqTFJeDpmcS0St8ZTGC5b1o31woiqKjdaWOPRA1dhgn4L4gnvCmO84JQLMfLuF8M1QhK1kKnkVsW5P\/u+HMMrA+G6JwIrQOqF3kr1VJ74PA52rjkQOk3AhQYNruXLLmKrSt+nwWhF5JG80j2V0Ieb4AmdA9Eu+XMfH8dVc9lW3Ew4VXoOeMQSl6d74+gUvsoh8kFMZO+yoFqAipop6CdFkHyZw\/qBwbFE3Z8V0Ccn2MJf8jUx5eRP7yf0oNGu5Srxb6AAR7Xl0hpJDXpbUneFN69q\/Zb2x9Cj56DZOJap\/RC9q4wtzSHZeH+5K6dFp71CaIdVnV5KR+if0reBwQfJI1OQaXdyeJBKAkH06TWSAodibT7vavVf+5M7lb9fWPmzmEX0gG2xBiRIRwf0iOMxDI2tOfHLRBp4B1qOurT0Uj4yOVe+iwgG6tHzK73O7MMMQpZzhCBnBM24QHE2v3JCLnYrScuOlt5WpX9QaZ\/GYzUb5YAagHyeaJajM3tH4OGzsHchblA6guSn+968VxD4F2J49cyTeHuLz7GlzNHIIgOe0VVxLzs3QTGVZfNDqBzk\/gwxjQGO2AOdwntVPZ0AP8wM8UZEm7\/yA+gZTlsdrJtUywA7DuCdCmf+3yX2NJtItWFfpRKc+A8LzVo00XPpnP0rMN9PbCnJ8ytiAP2M70dK3M1FGVfTfDxmF+PwqUgL\/QwIxQdN3kwidu4Ep1DQoJnaATaqz3\/Wr2IRKW6e+2+tdOYeG+UCN0xdTJ9xNBuhKjqDolamV\/uxqT5YutJFl+ILJyykig7npLGfOgxGPMxMMRB4\/FADpvAzosn6V0eTjWBHkapMVsks8RJoLMonCJyb77Ohntf7Qm4QzY0pviBC3apiws8yxfRMLbFMWNwgWWlwzh2I8AWlSUTHYnTzLdUTSlP8FPZ4tQRJn7eeh+jI6NZQBUWOqR6SNBLz2ToLHzY7ksYr9oCDQJ9S3K\/1uPLOlGRvthf5NEfYcMn8Q+DBLiyvkTvKsqFDzIo0JdlMUAgjloxdzgXqdMq101Hp\/nZFqY1hkNq0C9GS9QntYizRknA2GPnC\/8iqHdAWD9CMcEduFMZSyFnGvyMGjV5M7OitAd0P\/ljp+Mun3Tjt6psdkLpLhes1qJM0K+T4pmInDL2XAKWb0fJiF9medKvqjqC51IwCufc3JzIS5bXSemADB0ztQa41re1FzmXizuvjw2tbX8+U9qnj5dSDONvcnLIrIWljGbFiadATXeO8OyKPCbhIpp4SL80SuJ0Xz8k\/AnQ00nGGKElwimEg2hTA35M138NdCq7gGUIn2KvkAL+DiHwC4FDzHRivXZy8R7cILsln\/teU4kw0b6FFhrmNXjkhBBKhbN4m8rRe+XU100OTOOFe9Fnyi\/gB0ZTODzR5SMMeemxsgu9oIDnPPx0miQonz9oPaD4+fBS5n+TBnYYgoQouIw0wYcCT0WxdFZw6TsqXapNHhATKmNNdjWGec4tk8bfi+EBIlTDgtOQHKdd17+H0wuNuN6TopREcty3C\/QFMo0jhgTywyd0rhAkpyRzRNtQE+EioAlTf2R5GDbndQGAh3crA\/RLAfoXqYCR3qBPfHag2716dgKDteK2sOyK5pznp+QGgaqBbJF3z0P3bJ+EhlIY3ZbGWsYFsuxffS1Hm1f2Iq5RzygNkddLyWrP6DD5H0yq4jHZeZ17TV\/PJxZ3PNj3SzRCZWXABw+khdEnETaIGBouwElJiaZAJGllHB9yf9zsoWXemuWnqEU5Xosr1zrFGoS+j4J1lO\/pY9Gd7K1zTUw6WNESFjLQmcpmu66Tlu1Q0WVMU3Sgi\/BnuhogrSnmI+MJtFISJYtLTrBE28TGnHIQOCM+IU83d4OMMfrSQM9oLSK4na8PfTZpKuhYreteL4oMLEnPqShYcwCvofu4pNHnRim8xd\/Wjbv5Uv797M2HrgiOaWZdteL+U4Cm6\/fu+J\/FIpZ8I4A8xJekXobfbIm4n6dG0GbwiKavSOqZGYJ29Uhmjqh2zHP6vKrn74yNtQzKiFNe4YbAmOVrj5FolTQdqWoZSKp9MqkPlChtc1PAnZKKeQ6\/yiDMCAcT2sObtRCYlOeLQR4rbCflwflyx+Gkl67aUzdIfGKTBZ9Q425fWKfFU6HZcWPN26gJe\/WVl9f\/G5UrpwgqI1XMPeqYVRwDs3VD3f2vAvsKch6f75TLOopxr59E4DfKMRKZIrhF966kz8Ml3E4W6LWaQRxwFjtfZPb8pka8zWo8A5oGy1HaDwtj7frd5J+toVe6tdd0y7qpxiDHiFv5ogDMfOUI2bmXJthp5rlrS0hqIHRdLIo46IcN8hSz64Gs\/v9cO3qfxcbCuhGuC4a2ShXco\/CPYbxiVF6VCuutiMgYulOe1VvBGnZ6jmyY5FGvsb\/lgWrtkjeYht3P8cZWwUfSQAOJi7RGXKeGJaQGLPsqFKjSOKHQ2GmCPeZIvt1K0t3GSyv+68QKm71gIJPdGEw4RpsTIyQuSvX50Usns5ccjv+pgibWE6K4ZpJgRID2pRSHYmpgZ\/FzUa0h40eFUqOyrhy6ppeXHQJhMceffk8f\/I\/Y4zIRE4O4JctIWn0igZstYWrkQGuIp3EoEeQB+wyttnA\/9Y0fO+ztFOGvJiX6D\/zzOd3I1NJ29UW6uGb2LWEQE9HFE6PrIpYlEl\/iiYMef88FYfsAZh7Hgm28emFAC1obi70SuQ\/YbsXEZSy1ucK\/lPnQncrXZHqZCmH7BHUmZhELvUp\/943k8hq9MNNqiAyQKnBDTLlmlnwF3EhV9efr1Hmd8MiexYiqItF8nDyMJtWkeCgWrosJeiiPB8IQyI9DW2jB5+s4BXyNcAqrwcwmbFGj3xJQBqUnBNay4UWMYcjHGnPvK5WuKNQk5NQMLcnkwhkhHHrh2ShEKvmvuVc3tMJCnwkLA\/8QeM6VIchYyf0LoOmAWhgQbLI2aiUlcdAUTmes84VEJ+dBPgaLJtgQ0hgiQGbUbM2L7beIY6ApMOl+47nATCRQgq3KDpmRUmSfvkrbCGi+L6K6I4G8ddQLH3tVOrV6IbAei9zIWYLju4wJUutQG2Ge\/ri6MDBzdarrG7bd94VwjDdrMfZHsDtAi5L+O+NtwtRodtxbuXXlEAx0CpvRa6Vkfm7t8dfOhbfum8MRFcACox\/azL2Veoqp\/rteK\/X8EMrgIeK45IpzysnLsSoVjSaIjaMzUJMUCtPaOFp2X2sj0ZKSTP7p+T+2G\/mRqseXaICnyro+lDuScFDFjCTwlJcoesVXN3Jf4M4ObBg2xMdNxkuikkBZo6X5FS4iTA806YOgXKnUS9c1ZC\/bZg5hxX8Fft3B3r38qhP+No1P\/AtlMq5Ta413NMALndXcV7ics7HPwKp0dLDWGyrilVnBdUwhT6PGGlKMl2DtX6L47uDBCYx7Bdg==\"\/><div class=\"pfbc-element-0 pfbc-element\"><div class=\"pfbc-label\"><label for=\"accua-form___accua-form__1_6af1f3cd3cdd0-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_6af1f3cd3cdd0-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_6af1f3cd3cdd0-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_6af1f3cd3cdd0-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_6af1f3cd3cdd0-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_6af1f3cd3cdd0-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_6af1f3cd3cdd0-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_6af1f3cd3cdd0-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_6af1f3cd3cdd0-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_6af1f3cd3cdd0-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_6af1f3cd3cdd0-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_6af1f3cd3cdd0-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_6af1f3cd3cdd0-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_6af1f3cd3cdd0').length > 0) {\r\n      setTimeout(function() {\r\n        var errorContainer = jQuery('.pfbc-error', '#accua-form___accua-form__1_6af1f3cd3cdd0').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_6af1f3cd3cdd0').length > 0) {\r\n      setTimeout(function() {\r\n        var firstInvalidField = jQuery('.pfbc-element-has-error :input:visible:enabled:first', '#accua-form___accua-form__1_6af1f3cd3cdd0').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_6af1f3cd3cdd0 .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_6af1f3cd3cdd0 = function() {return true;}\r\nvar _handle_ajax_submit_complete_accua_form___accua_form__1_6af1f3cd3cdd0 = function() {return false;}\r\nvar _handle_ajax_submit_timeout_accua_form___accua_form__1_6af1f3cd3cdd0 = function() {return false;}\r\nvar _handle_ajax_submit_message_accua_form___accua_form__1_6af1f3cd3cdd0 = function() {}\r\nvar _handle_ajax_submit_response_accua_form___accua_form__1_6af1f3cd3cdd0 = function() {}\r\n\r\njQuery(function($) {\r\n  var thisform = $(\"#accua-form___accua-form__1_6af1f3cd3cdd0\");\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_6af1f3cd3cdd0\");\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_6af1f3cd3cdd0\" class=\"accua-form-messages\"\\x3E\\x3C\/div\\x3E');\r\n    thisform.before(response_messages);\r\n  }\r\n  \r\n  \/\/ Smooth scroll helper function\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    }\r\n  };\r\n\r\n  var _ajax_submitting_accua_form___accua_form__1_6af1f3cd3cdd0 = 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 - 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_6af1f3cd3cdd0 .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_6af1f3cd3cdd0-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_6af1f3cd3cdd0-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=\"#' + err.fieldId + '\" class=\"pfbc-summary-link\" data-field-id=\"' + err.fieldId + '\">' + err.label + '<\/a> - ' + 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        if (!field.length) {\r\n          \/\/ Elements with no named input in the DOM (e.g. reCAPTCHA v2) expose\r\n          \/\/ their name on the widget container via data-accua-name\r\n          field = jQuery('[data-accua-name=\"' + fieldName + '\"]', thisform);\r\n        }\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_6af1f3cd3cdd0 = function() {\r\n    if (_ajax_submitting_accua_form___accua_form__1_6af1f3cd3cdd0) {\r\n      return false;\r\n    }\r\njQuery(\"#accua-form___accua-form__1_6af1f3cd3cdd0 .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_6af1f3cd3cdd0 .pfbc-element\").removeClass('pfbc-invalid');\r\n    $(\"#accua-form___accua-form__1_6af1f3cd3cdd0 .pfbc-element\").removeClass('pfbc-element-has-error');\r\n    $(\"#accua-form___accua-form__1_6af1f3cd3cdd0 input, #accua-form___accua-form__1_6af1f3cd3cdd0 textarea, #accua-form___accua-form__1_6af1f3cd3cdd0 select\").attr('aria-invalid', 'false');\r\n    $(\"#accua-form___accua-form__1_6af1f3cd3cdd0 .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_6af1f3cd3cdd0\").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_6af1f3cd3cdd0\").last();\r\n        \r\n        \/\/ Apply ARIA attributes to all inputs in the group\r\n        $(\"[name='\"+fieldName+\"']\", \"#accua-form___accua-form__1_6af1f3cd3cdd0\").attr('aria-invalid', 'true');\r\n        $(\"[name='\"+fieldName+\"']\", \"#accua-form___accua-form__1_6af1f3cd3cdd0\").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_6af1f3cd3cdd0\").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\") - 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      \/\/ reCAPTCHA v3: tokens are fetched asynchronously at submit time (they\r\n      \/\/ are single-use and expire after ~2 minutes). Cancel this submit, get\r\n      \/\/ a fresh token, then re-trigger: the re-entered handler finds the\r\n      \/\/ token in place (needsToken() false) and proceeds normally. On token\r\n      \/\/ failure the submit proceeds anyway - the server rejects it (fail-closed).\r\n      if (((typeof accuaformRecaptcha3) != 'undefined') && accuaformRecaptcha3.needsToken(thisform[0])) {\r\n        accuaformRecaptcha3.getToken(thisform[0]).then(\r\n          function(){ thisform.trigger('submit'); },\r\n          function(){ thisform.trigger('submit'); }\r\n        );\r\n        return false;\r\n      }\r\n\r\n      _ajax_submitting_accua_form___accua_form__1_6af1f3cd3cdd0 = 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_6af1f3cd3cdd0\").attr('src','').removeAttr('src');\r\n        timeout_handler = setTimeout(_handle_ajax_submit_timeout_accua_form___accua_form__1_6af1f3cd3cdd0, 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_6af1f3cd3cdd0 = function() {\r\n    if (_ajax_submitting_accua_form___accua_form__1_6af1f3cd3cdd0) {\r\n      if (timeout_count < 60) {\r\n        timeout_count++;\r\n        timeout_handler = setTimeout(_handle_ajax_submit_timeout_accua_form___accua_form__1_6af1f3cd3cdd0, 500);\r\n        _handle_ajax_submit_complete_accua_form___accua_form__1_6af1f3cd3cdd0();\r\n      } else {\r\n        timeout_handler = false;\r\n        _handle_ajax_submit_complete_accua_form___accua_form__1_6af1f3cd3cdd0();\r\n        if (_ajax_submitting_accua_form___accua_form__1_6af1f3cd3cdd0) {\r\n          _handle_ajax_submit_response_accua_form___accua_form__1_6af1f3cd3cdd0(false);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  _handle_ajax_submit_complete_accua_form___accua_form__1_6af1f3cd3cdd0 = function() {\r\n    if (_ajax_submitting_accua_form___accua_form__1_6af1f3cd3cdd0) {\r\n      var response = false;\r\n      try {\r\n        var responsedoc = frames['submit_target_accua_form___accua_form__1_6af1f3cd3cdd0'].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_6af1f3cd3cdd0 (response);\r\n      }\r\n    }\r\n  }\r\n\r\n  _handle_ajax_submit_message_accua_form___accua_form__1_6af1f3cd3cdd0 = function(message) {\r\n    if (_ajax_submitting_accua_form___accua_form__1_6af1f3cd3cdd0) {\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_6af1f3cd3cdd0\")) {\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_6af1f3cd3cdd0 (response);\r\n      }\r\n    }\r\n  }\r\n\r\n  _handle_ajax_submit_response_accua_form___accua_form__1_6af1f3cd3cdd0 = function(response) {\r\n    if (_ajax_submitting_accua_form___accua_form__1_6af1f3cd3cdd0) {\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_6af1f3cd3cdd0').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      \/* Elements with no named input in the DOM (e.g. reCAPTCHA v2) expose their name via data-accua-name *\/\r\n      field = jQuery('[data-accua-name=\"' + fieldName + '\"]');\r\n    }\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\\\/2878\" );\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\\\/2878\" );\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      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      if ((typeof accuaformRecaptcha3) != 'undefined') {\r\n        \/\/ v3 tokens are single-use: clear them so a retry fetches a fresh one\r\n        accuaformRecaptcha3.reset(thisform[0]);\r\n      }\r\n      if ((typeof accuaformCap) != 'undefined') {\r\n        \/\/ Cap tokens are single-use too: clear them and reset the widget\r\n        accuaformCap.reset(thisform[0]);\r\n      }\r\n      if ((typeof turnstile) != 'undefined') {\r\n        \/\/ Turnstile tokens are single-use too: reset each widget so a retry gets a fresh one\r\n        \/\/ (.cf-turnstile is the widget div rendered by the Simple Cloudflare Turnstile plugin)\r\n        $('.accua-forms-turnstile-container .cf-turnstile', thisform).each(function(){\r\n          try { turnstile.reset('#' + $(this).attr('id')); } catch (e) { }\r\n        });\r\n      }\r\n      _ajax_submitting_accua_form___accua_form__1_6af1f3cd3cdd0 = 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_6af1f3cd3cdd0\");\r\n    try {\r\n      window.addEventListener('message', _handle_ajax_submit_message_accua_form___accua_form__1_6af1f3cd3cdd0, 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\\\/2878\" );\r\n  }\r\n  thisform.attr(\"onsubmit\",\"return _handle_ajax_submit_accua_form___accua_form__1_6af1f3cd3cdd0()\");\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 - 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 (!$('#' + errorId + ':not(.pfbc-error-removing)').length) {\r\n        $('#' + errorId).remove();\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_6af1f3cd3cdd0\" title=\"Notification Message\" name=\"submit_target_accua_form___accua_form__1_6af1f3cd3cdd0\" onload=\"_handle_ajax_submit_complete_accua_form___accua_form__1_6af1f3cd3cdd0()\" onerror=\"_handle_ajax_submit_complete_accua_form___accua_form__1_6af1f3cd3cdd0()\" 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_6af1f3cd3cdd0 input[name='_AccuaForm_referrer']\");\r\n  if (referrerfield.val() == '') {\r\n    referrerfield.val(document.referrer);\r\n  }\r\n  $(\"#accua-form___accua-form__1_6af1f3cd3cdd0 input[name='_AccuaForm_user_agent']\").val(navigator.userAgent);\r\n  $(\"#accua-form___accua-form__1_6af1f3cd3cdd0 input[name='_AccuaForm_platform']\").val(navigator.platform);\r\n});\r\n\/\/ -->\r\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>GXV3380 GXV3380 on tehokas huippuluokan \u00e4lyk\u00e4s videopuhelin Androidille, joka yhdist\u00e4\u00e4 16-linjaisen IP-puhelimen usean alustan videoyhteisty\u00f6ratkaisuun ja Android-tabletin toiminnallisuuden tarjoamaan all-in-one-viestint\u00e4ratkaisun. Se on ihanteellinen p\u00f6yt\u00e4kone kiireisille ammattilaisille ja johtajille, ja se tarjoaa my\u00f6s tehokkaan mutta kustannustehokkaan laitteen mihin tahansa konferenssihuoneeseen. 8\u201d n\u00e4ytt\u00f6. &nbsp; Androidille tarkoitettu GXV3380 IP -videopuhelin yhdist\u00e4\u00e4 16-linjaisen IP-videopuhelimen usean alustan videoyhteisty\u00f6ratkaisuun ja Android-tabletin [&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-2878","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/pages\/2878","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=2878"}],"version-history":[{"count":3,"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/pages\/2878\/revisions"}],"predecessor-version":[{"id":2884,"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/pages\/2878\/revisions\/2884"}],"wp:attachment":[{"href":"https:\/\/www.perustele.fi\/index.php\/wp-json\/wp\/v2\/media?parent=2878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}