["<!-- Facebook Pixel Code -->\n    <script>\n        function getFBCookie(cname) {\n            let name = cname + \"=\";\n            let decodedCookie = decodeURIComponent(document.cookie);\n            let ca = decodedCookie.split(';');\n            for(let i = 0; i <ca.length; i++) {\n                let c = ca[i];\n                while (c.charAt(0) == ' ') {\n                    c = c.substring(1);\n                }\n                if (c.indexOf(name) == 0) {\n                    return c.substring(name.length, c.length);\n                }\n            }\n            return \"\";\n        }\n\n        function getUrlParameter(param) {\n            const urlParams = new URLSearchParams(window.location.search);\n            return urlParams.get(param);\n        }\n\n                \n        !function(f, b, e, v, n, t, s) {\n          if (f.fbq) return;\n          n = f.fbq = function() {\n            n.callMethod ?\n              n.callMethod.apply(n, arguments) : n.queue.push(arguments);\n          };\n          if (!f._fbq) f._fbq = n;\n          n.push = n;\n          n.loaded = !0;\n          n.version = \"2.0\";\n          n.queue = [];\n          t = b.createElement(e);\n          t.async = !0;\n          t.src = v;\n          s = b.getElementsByTagName(e)[0];\n          s.parentNode.insertBefore(t, s);\n        }(window, document, \"script\",\n            \"https://connect.facebook.net/en_US/fbevents.js\");\n\n        fbq(\"init\", '591808503997362');\n        let eventTime = Date.now();\n        let fbp = getFBCookie('_fbp');\n        let fbc = getFBCookie('_fbc');\n\n                        let txId = getUrlParameter('form_submission_id') ?? eventTime;\n\n                    let event = getUrlParameter('form_submission_id') ? 'Lead' : 'PageView';\n        \n                     eventID = `page.${event}.tx_${txId}`;\n        \n                    let post = {\n              domain: 'ta-network.nl',\n              conversion_type: 'PageView',\n              url: window.location.href,\n              event_id: eventID,\n              event_time: eventTime,\n            };\n\n            if (getUrlParameter(\"pagese\")) {\n              post.email = getUrlParameter(\"pagese\");\n            }\n\n            if (getUrlParameter(\"pagesf\")) {\n              post.first_name = getUrlParameter(\"pagesf\");\n            }\n\n            if (getUrlParameter(\"pagesl\")) {\n              post.last_name = getUrlParameter(\"pagesl\");\n            }\n\n            if (fbp !== \"\") {\n              post.fbp = fbp;\n            }\n\n            if (fbc !== \"\") {\n              post.fbc = fbc;\n            }\n\n            const url = 'https://ta-network.nl/client/facebook-conversion/events';\n            let xhr = new XMLHttpRequest();\n            xhr.open(\"POST\", url, true);\n            xhr.setRequestHeader(\"Content-type\", \"application/json; charset=UTF-8\");\n            xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n            xhr.send(JSON.stringify(post));\n        \n        if (event) {\n            let fbData = {  };\n\n            if (fbp !== \"\") {\n                fbData.fbp = fbp;\n            }\n\n            if (fbc !== \"\") {\n                fbData.fbc = fbc;\n            }\n\n            \n            fbq(\"track\", 'PageView', fbData, { eventID: eventID });\n        }\n\n    </script>\n    <!-- End Facebook Pixel Code -->\n",{"name":"fb","location":"head","consentType":"statistical","content":"<!-- Facebook Pixel Code -->\n    <script>\n        function getFBCookie(cname) {\n            let name = cname + \"=\";\n            let decodedCookie = decodeURIComponent(document.cookie);\n            let ca = decodedCookie.split(';');\n            for(let i = 0; i <ca.length; i++) {\n                let c = ca[i];\n                while (c.charAt(0) == ' ') {\n                    c = c.substring(1);\n                }\n                if (c.indexOf(name) == 0) {\n                    return c.substring(name.length, c.length);\n                }\n            }\n            return \"\";\n        }\n\n        function getUrlParameter(param) {\n            const urlParams = new URLSearchParams(window.location.search);\n            return urlParams.get(param);\n        }\n\n                \n        !function(f, b, e, v, n, t, s) {\n          if (f.fbq) return;\n          n = f.fbq = function() {\n            n.callMethod ?\n              n.callMethod.apply(n, arguments) : n.queue.push(arguments);\n          };\n          if (!f._fbq) f._fbq = n;\n          n.push = n;\n          n.loaded = !0;\n          n.version = \"2.0\";\n          n.queue = [];\n          t = b.createElement(e);\n          t.async = !0;\n          t.src = v;\n          s = b.getElementsByTagName(e)[0];\n          s.parentNode.insertBefore(t, s);\n        }(window, document, \"script\",\n            \"https://connect.facebook.net/en_US/fbevents.js\");\n\n        fbq(\"init\", '591808503997362');\n        let eventTime = Date.now();\n        let fbp = getFBCookie('_fbp');\n        let fbc = getFBCookie('_fbc');\n\n                        let txId = getUrlParameter('form_submission_id') ?? eventTime;\n\n                    let event = getUrlParameter('form_submission_id') ? 'Lead' : 'PageView';\n        \n                     eventID = `page.${event}.tx_${txId}`;\n        \n                    let post = {\n              domain: 'ta-network.nl',\n              conversion_type: 'PageView',\n              url: window.location.href,\n              event_id: eventID,\n              event_time: eventTime,\n            };\n\n            if (getUrlParameter(\"pagese\")) {\n              post.email = getUrlParameter(\"pagese\");\n            }\n\n            if (getUrlParameter(\"pagesf\")) {\n              post.first_name = getUrlParameter(\"pagesf\");\n            }\n\n            if (getUrlParameter(\"pagesl\")) {\n              post.last_name = getUrlParameter(\"pagesl\");\n            }\n\n            if (fbp !== \"\") {\n              post.fbp = fbp;\n            }\n\n            if (fbc !== \"\") {\n              post.fbc = fbc;\n            }\n\n            const url = 'https://ta-network.nl/client/facebook-conversion/events';\n            let xhr = new XMLHttpRequest();\n            xhr.open(\"POST\", url, true);\n            xhr.setRequestHeader(\"Content-type\", \"application/json; charset=UTF-8\");\n            xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n            xhr.send(JSON.stringify(post));\n        \n        if (event) {\n            let fbData = {  };\n\n            if (fbp !== \"\") {\n                fbData.fbp = fbp;\n            }\n\n            if (fbc !== \"\") {\n                fbData.fbc = fbc;\n            }\n\n            \n            fbq(\"track\", 'PageView', fbData, { eventID: eventID });\n        }\n\n    </script>\n    <!-- End Facebook Pixel Code -->\n","attributes":null}]