<script> (function () { var fillScript = document.createElement('script'), // the LI autofill script (client-side) iframeHolderDiv = document.createElement('div'), // so we can style location of button autoFillLocation = document.querySelector("form[id^='mktoForm_']"), // will only find first Marketo form on a page firstRow = document.querySelector('form .mktoFormRow'), hiddenLinkedInInputs = document.createDocumentFragment(), // since we're creating multiple nodes, just do the add once hiddenInputCreator = function (tagName, onChangeHandler) { var newInput = document.createElement('input'); newInput.style.position = 'absolute'; newInput.style.left = '-999em'; newInput.setAttribute('name', tagName + '-flag'); newInput.setAttribute('type', 'text'); newInput.setAttribute('id', tagName + '-flag'); newInput.style.display = 'none'; newInput._value = newInput.value; Object.defineProperty(newInput, "value", { get: function() { return this._value; }, set: function(v) { this._value = v; onChangeHandler(v); } }); hiddenLinkedInInputs.appendChild(newInput); fillScript.setAttribute('data-field-' + tagName, tagName + '-flag'); }; // style the holder div iframeHolderDiv.style.textAlign = 'center'; iframeHolderDiv.style.margin = '10px 0px'; // required by LinkedIn fillScript.setAttribute('type', 'IN/Form2'); // turns out you don't need any of these fields if they're // named the same thing as the ones returned from LinkedIn. // Unfortunately means you can't disable them, either... /*fillScript.setAttribute('data-field-firstname', 'FirstName'); fillScript.setAttribute('data-field-lastname', 'LastName'); fillScript.setAttribute('data-field-phone', 'Phone'); fillScript.setAttribute('data-field-company', 'Company'); fillScript.setAttribute('data-field-title', 'Title');*/ // 'Pseudo-hide' input fields to give us a place to store // the email address and country LI provides to us. We do this for 2 // reasons: // [1] To keep the main email field from being filled // We *could* autofill email, but if they don't use a business // address (few do) then submit will reject it. Better to make them // just fill it to start with. We will also use this to trigger the GA // autofill event. // [2] To allow us to map the ISO country code LinkedIn provides us // to the [sigh] full-text version of the country our select element // requires hiddenInputCreator('email', function (newValue) { // fire the GA event for autofill console.log("%s value changed to %s", this.ID, newValue); }); hiddenInputCreator('country', function (newValue) { console.log("%s value changed to %s", this.ID, newValue); // map to the country we have in our select dropdown var countries = { US: 'United States', GB: 'United Kingdom', AE: 'United Arab Emirates', CA: 'Canada', IN: 'India', AF: 'Afghanistan', AL: 'Albania', DZ: 'Algeria', AD: 'Andorra', AO: 'Angola', AG: 'Antigua and Barbuda', AR: 'Argentina', AM: 'Armenia', AU: 'Australia', AT: 'Austria', AZ: 'Azerbaijan', BH: 'Bahrain', BD: 'Bangladesh', BB: 'Barbados', BY: 'Belarus', BE: 'Belgium', BZ: 'Belize', BJ: 'Benin', BM: 'Bermuda', BT: 'Bhutan', BO: 'Bolivia', BA: 'Bosnia and Herzegovina', BW: 'Botswana', BR: 'Brazil', BN: 'Brunei', BG: 'Bulgaria', BF: 'Burkina Faso', BI: 'Burundi', KH: 'Cambodia', CM: 'Cameroon', CV: 'Cape Verde', CF: 'Central African Republic', TD: 'Chad', CL: 'Chile', CN: 'China', CO: 'Colombia', KM: 'Comoros', CD: 'Congo Democratic Republic of the', CG: 'Congo', CR: 'Costa Rica', HR: 'Croatia', CU: 'Cuba', CY: 'Cyprus', CZ: 'Czech Republic', DK: 'Denmark', DJ: 'Djibouti', DM: 'Dominica', DO: 'Dominican Republic', TL: 'East Timor', EC: 'Ecuador', EG: 'Egypt', SV: 'El Salvador', GQ: 'Equatorial Guinea', ER: 'Eritrea', EE: 'Estonia', ET: 'Ethiopia', FJ: 'Fiji', FI: 'Finland', FR: 'France', GA: 'Gabon', GE: 'Georgia', DE: 'Germany', GH: 'Ghana', GR: 'Greece', GL: 'Greenland', GD: 'Grenada', GT: 'Guatemala', GW: 'Guinea-Bissau', GN: 'Guinea', GY: 'Guyana', HT: 'Haiti', HN: 'Honduras', HU: 'Hungary', IS: 'Iceland', ID: 'Indonesia', IR: 'Iran', IQ: 'Iraq', IE: 'Ireland, Republic of', IL: 'Israel', IT: 'Italy', CI: 'Ivory Coast', JM: 'Jamaica', JP: 'Japan', JO: 'Jordan', KZ: 'Kazakhstan', KE: 'Kenya', KI: 'Kiribati', KV: 'Kosovo', KW: 'Kuwait', KG: 'Kyrgyzstan', LA: 'Laos', LV: 'Latvia', LB: 'Lebanon', LS: 'Lesotho', LR: 'Liberia', LY: 'Libya', LI: 'Liechtenstein', LT: 'Lithuania', LU: 'Luxembourg', MK: 'Macedonia', MG: 'Madagascar', MW: 'Malawi', MY: 'Malaysia', MV: 'Maldives', ML: 'Mali', MT: 'Malta', MH: 'Marshall Islands', MR: 'Mauritania', MU: 'Mauritius', MX: 'Mexico', MD: 'Moldova', MC: 'Monaco', MN: 'Mongolia', ME: 'Montenegro', MA: 'Morocco', MZ: 'Mozambique', MM: 'Myanmar', NA: 'Namibia', NR: 'Nauru', NP: 'Nepal', NL: 'Netherlands', NZ: 'New Zealand', NI: 'Nicaragua', NE: 'Niger', NG: 'Nigeria', KP: 'North Korea', NO: 'Norway', OM: 'Oman', PK: 'Pakistan', PW: 'Palau', PS: 'Palestine', PA: 'Panama', PG: 'Papua New Guinea', PY: 'Paraguay', PE: 'Peru', PH: 'Philippines', PL: 'Poland', PT: 'Portugal', QA: 'Qatar', RO: 'Romania', RU: 'Russia', RW: 'Rwanda', KN: 'Saint Kitts and Nevis', LC: 'Saint Lucia', VC: 'Saint Vincent and the Grenadines', WS: 'Samoa', SM: 'San Marino', ST: 'São Tomé and Príncipe', SA: 'Saudi Arabia', SN: 'Senegal', RS: 'Serbia', SC: 'Seychelles', SL: 'Sierra Leone', SG: 'Singapore', SK: 'Slovakia', SI: 'Slovenia', SB: 'Solomon Islands', SO: 'Somalia', ZA: 'South Africa', KR: 'South Korea', SS: 'South Sudan', ES: 'Spain', LK: 'Sri Lanka', SD: 'Sudan', SR: 'Suriname', SZ: 'Swaziland', SE: 'Sweden', CH: 'Switzerland', SY: 'Syria', TW: 'Taiwan', TJ: 'Tajikistan', TZ: 'Tanzania', TH: 'Thailand', BS: 'The Bahamas', GM: 'The Gambia', TG: 'Togo', TO: 'Tonga', TT: 'Trinidad and Tobago', TN: 'Tunisia', TR: 'Turkey', TM: 'Turkmenistan', TV: 'Tuvalu', UG: 'Uganda', UA: 'Ukraine', UY: 'Uruguay', UZ: 'Uzbekistan', VU: 'Vanuatu', VA: 'Vatican City', VE: 'Venezuela', VN: 'Vietnam', EH: 'Western Sahara', YE: 'Yemen', ZM: 'Zambia', ZW: 'Zimbabwe', }, country = document.querySelector("#Country"); // sets the value in the form the user can see country.value = countries[newValue.toLowerCase()]; }); /*['email', 'country'].forEach(function(inputField){ var newInput = document.createElement("input"); newInput.style.position = "absolute"; newInput.style.left = "-999em"; newInput.setAttribute("name", inputField + "-flag"); newInput.setAttribute("type", "text"); newInput.setAttribute("id", inputField + "-flag"); newInput.style.display = "none"; hiddenLinkedInInputs.appendChild(newInput); fillScript.setAttribute('data-field-' + inputField, inputField + '-flag'); });*/ // going to pseudo-hide an input field to give us a place to store // the email address and have it keep the main email field from being // filled. We *could* autofill email, but if they don't use a business // address (few do) then submit will reject it. Better to make them // just fill it to start with. We will also use this to trigger the GA // autofill event. // var input = document.createElement("input"); //input.setAttribute("type", "hidden"); // << nope /*input.style.position = "absolute"; input.style.left = "-999em"; input.setAttribute("name", "email-flag"); input.setAttribute("type", "text"); input.setAttribute("id", "email-flag"); input.style.display = "none"; // hook up that ^^^ input field to LinkedIn autofill fillScript.setAttribute('data-field-email', 'email-flag');*/ // add the elements to the DOM iframeHolderDiv.appendChild(fillScript); autoFillLocation.prepend(iframeHolderDiv); firstRow.appendChild(hiddenLinkedInInputs); // fragment vaporizes leaving input elements if (typeof MktoForms2 !== 'undefined') { MktoForms2.whenReady(function (form) { // need the id of the form so we can hook up autofill // doing this way will work on any Marketo form fillScript.setAttribute('data-form', 'mktoForm_' + form.getId()); form.onSubmit(function (form) { console.log('onSubmit'); console.log(form.vals()); }); form.onSuccess(function (values, followUpURL) { console.log('onSuccess LI'); // tell GA about it, but only if we set the hidden email field since we know LI should have that if (input.value.length && input.value.indexOf('@') !== -1) { var eventData = { category: 'LinkedIn Form AutoFill', action: 'mktoForm_' + form.getId() + '-', // will automatically set dlv-action which we'll pass to form id to name mapper in event submit in GTM label: [ values.Company, values.Industry, values.Country, values.Title, '{{Page Path}}', 'gclid:' + '{{JS - GA Client ID}}', ].join(' | '), }; console.log(eventData); // 'eventData' automatically maps to the GTM variables 'dlv - category', 'dlv - action', etc. window.dataLayer.push({ event: 'formLinkedInAutoFill', // MUST FIX WHEN EXPANDING AS EVENT ONLY FIRES ON DEMO PAGE eventData: eventData, eventCallback: function () { // this just prints that we've sent it console.log('event submitted: ' + eventData); }, }); // populated on the GTM side } return false; }); }); } })(); </script> <!-- what LinkedIn recommends which doesn't allow any customization --> <!--<script type="IN/Form2" data-form="mktoForm_1248" data-field-firstname="FirstName" data-field-lastname="LastName" data-field-phone="Phone" data-field-company="Company" data-field-title="Title"></script>-->