356 lines
12 KiB
HTML
356 lines
12 KiB
HTML
<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'),
|
|
mktoForm,
|
|
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',
|
|
};
|
|
// sets the value in the form the user can see
|
|
if (typeof MktoForms2 !== 'undefined') {
|
|
mktoForm.setValues({
|
|
'Country': countries[newValue.toUpperCase()]});
|
|
}
|
|
});
|
|
hiddenInputCreator('state', function(newValue){
|
|
mktoForm.setValues({
|
|
'State': newValue.toUpperCase()
|
|
});
|
|
});
|
|
|
|
/*['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());
|
|
mktoForm = form;
|
|
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>--> |