roshanoracle
4/4/2017 - 2:55 PM

Euromaster : Drop Down Code Template

Euromaster : Drop Down Code Template

// Set lookups and actions
window.bluekai_michelin = {};
window.bluekai_michelin.campaign_ids = {};
window.bluekai_michelin.category_ids = {};
window.bluekai_michelin.category_lookup = {

	"736953": ["visited any site", "width", "10.5"],	 // "ID" : ["friendly name for ref","option ID","option value"] (add more of these)

}

// Parse BlueKai object
if (typeof(bk_results) != "undefined") {

	// Parse category and campaign IDs
	if (typeof(bk_results.campaigns[0]) != "undefined") {


		for (var i = 0; i < bk_results.campaigns.length; i++) {

			window.bluekai_michelin.campaign_ids[bk_results.campaigns[i].campaign] = true;

			for (var j = 0; j < bk_results.campaigns[i].categories.length; j++) {

				if (typeof(bk_results.campaigns[i].categories[j].categoryID) != "undefined") {

					window.bluekai_michelin.category_ids[bk_results.campaigns[i].categories[j].categoryID] = true;

				}

			}

		}

	}

	// Look up Category IDs
	for (categoryID in window.bluekai_michelin.category_lookup){

		if(window.bluekai_michelin.category_ids[categoryID]){

			var dropdown_name = bluekai_michelin.category_lookup[categoryID][1];
			var dropdown_value = bluekai_michelin.category_lookup[categoryID][2];

			jQuery('#' + dropdown_name).val(dropdown_value); // Set dropdown option

		}

	}

} else {
	console.log("MICHELIN BLUEKAI : No 'bk_results' object yet");
}
dataLayer.push({
	'event': 'bluekai',
	'bluekai_experiment_name': 'Blackcircles Tyres Segment',
	'bluekai_experiment_value': enter group name here // replace with group name
});
/*
###############################################################################################
### ORACLE BLUEKAI : Universal Site Optimisation Integration : Custom Michelin BlackCircles ###
###############################################################################################

Author : roshan.gonsalkorale@oracle.com, alex.wilton@oracle.com, mike.knott@oracle.com

Debugger:
	
- add 'bk_so_logger=true' as a query-string parameter in the URL and check the console logs

Implementation Instructions:

- Third party specific instructions:
	- DFP - DFP to be implemented via Google Publisher Tag (https://developers.google.com/doubleclick-gpt/)
- Update the config as per the "CONFIG" section below (please reach out to Oracle for help if required)

 */

window.bk_so_integration = window.bk_so_integration || {};
window.bk_so_integration.functions = window.bk_so_integration.functions || {};
window.bk_so_integration.data = window.bk_so_integration.data || {};
window.bk_so_integration.config = window.bk_so_integration.config || {};
window.bk_so_integration.split_testing = window.bk_so_integration.split_testing || {};
window.bk_so_integration.split_testing.experiments = window.bk_so_integration.split_testing.experiments || {};

// CONFIG : EDIT THIS PART

// BlueKai Config
window.bk_so_integration.config.bluekai_jsonreturn_id = "40620"; // replace with your JSON Return Container ID
window.bk_so_integration.config.wait_in_ms = 1; // How long to wait before asking BlueKai for the latest categories and firing data to third party (default 5000ms)
window.bk_so_integration.config.include_audience_names = false; // Set to false to not share audience names to any vendors
window.bk_so_integration.config.split_testing = true; // Set to true to enable split testing cookie
window.bk_so_integration.config.enable_cookie = false; // Set to true to allow data to be set in cookies

// Split testing Config (if enabled above)
window.bk_so_integration.split_testing.experiments["blackcircles_tyres"] = {}; // Set name for experiment
window.bk_so_integration.split_testing.experiments["blackcircles_tyres"].control_size = "10%"; // Set control a % size (must be multiple of 10) (e.g. 10%, 20% etc)

// BlueKai Config

/*
 * ##########################################################################################
 * DO NOT EDIT BELOW THIS LINE
 * ##########################################################################################
 */

// FUNCTION : Cookie Grabber
bk_so_integration.functions.cookie_grabber = function(cookie_name){

	if(document.cookie.split(cookie_name) !== -1){

		var temp = document.cookie.split(cookie_name + "=");
		var cookie_value = temp[1].split(";")[0]

		return cookie_value;

	}	
	
}

// FUNCTION : Split testing cookie generator
bk_so_integration.functions.split_testing_cookie_generator = function() {
	
	if(window.bk_so_integration.config.split_testing){

		if(!bk_so_integration.functions.localstorage_retriever("bluekai_split_testing").toString()){ // check if you have a segment already in local storage

			window.bk_so_integration.split_testing.segment_id = Math.floor(Math.random() * 10) + 1; // segment between 0-10

			// Set cookie
			bk_so_integration.functions.localstorage_cookie_sender(window.bk_so_integration.split_testing.segment_id,"bluekai_split_testing");			
			bk_so_integration.functions.logger("SPLIT TESTING : 'bluekai_split_testing' localstorage NOT found : Generated ID of '" + window.bk_so_integration.split_testing.segment_id + "' and set in local storage");
			
					
		} else {

			// Grab segment ID from local_storage
			window.bk_so_integration.split_testing.segment_id = bk_so_integration.functions.localstorage_retriever("bluekai_split_testing");
			bk_so_integration.functions.logger("SPLIT TESTING : 'bluekai_split_testing' localstorage FOUND : ID is '" + window.bk_so_integration.split_testing.segment_id + "'");

		};
		
	};

};

// FUNCTION : Split Testing
bk_so_integration.functions.split_testing_experiment_generator = function(experiment_name,control_size) {

	if(control_size){
		bk_so_integration.functions.logger("SPLIT TESTING : " + experiment_name + " : " + "control size found as '" + control_size + "'");
		control_size = parseInt(control_size.split("%")[0]);
		bk_so_integration.functions.logger("SPLIT TESTING : " + experiment_name + " : " + "control size reformatted to '" + control_size + "'");
	} 

	if(window.bk_so_integration.config.split_testing && experiment_name && control_size){
		
		// Grab segment ID
		var segment_id = window.bk_so_integration.split_testing.segment_id;

		// Determine control/experiment size
		var control_start = 1;
		var control_end = control_size / 10;

		if(control_end < 10){
			var experiment_start = control_end + 1
			var experiment_end = 10
		}

		if(segment_id >= control_start && segment_id <= control_end){
		 
			window.bk_so_integration.split_testing.experiments[experiment_name].your_segment_type = "control";  			

		} else {window.bk_so_integration.split_testing.experiments[experiment_name].your_segment_type = "experiment";}

		bk_so_integration.functions.logger("SPLIT TESTING : " + experiment_name + " : " + "you are in '" + window.bk_so_integration.split_testing.experiments[experiment_name].your_segment_type + "' segment");	

	};

};

// FUNCTION : Local Storage Send
bk_so_integration.functions.localstorage_cookie_sender = function(data, name_of_var) {

	// Set data in first-party cookie if required
	if(window.bk_so_integration.config.enable_cookie || window.bk_so_integration.config.enable_google_optimize){

		// encode cookie value if sending audience names
		var cookie_data = (name_of_var === "bk_audience_names") ? encodeURIComponent(data).replace(/'/g,"%27").replace(/"/g,"%22") : data; 

		document.cookie = name_of_var + "=" + cookie_data + ";path=/;domain=" +
		document.domain + ";expires=Thu, 31 Dec 2099 00:00:00 GMT";

		bk_so_integration.functions.logger("COOKIES : storing '" + JSON.stringify(cookie_data) + "' as '" + name_of_var
				+ "' cookie");
	}
	
	if (typeof (Storage) !== "undefined") {

		bk_so_integration.functions.logger("LOCAL STORAGE : storing '" + JSON.stringify(data) + "' as '" + name_of_var
				+ "' in local storage");
		localStorage.setItem(name_of_var, JSON.stringify(data));

	} else {

		bk_so_integration.functions.logger("LOCAL STORAGE : SEND DATA : HTML 5 NOT SUPPORTED");
		return "no storage"; // HTML 5 NOT SUPPORTED
	}

}

// FUNCTION : Local Storage Retrieve
bk_so_integration.functions.localstorage_retriever = function(name_of_var) {

	if (typeof (Storage) !== "undefined") {

		var result = JSON.parse(localStorage.getItem(name_of_var));
		if (!result) {
			bk_so_integration.functions.logger("LOCAL STROAGE : no " + name_of_var
					+ " values available in local storage. Setting to empty array.");
			return [];
		}
		bk_so_integration.functions.logger("LOCAL STORAGE : Retrieved following '" + name_of_var
				+ "' from local storage : " + result);
		return result;
	}

}

// FUNCTION : Local Storage fallback
bk_so_integration.functions.localstorage_fallback = function() {

	bk_so_integration.functions.logger("Local Storage : attempting fallback");

	// category IDs
	if (typeof (Storage) !== "undefined") {

		window.bk_so_integration.data.bk_category_ids = bk_so_integration.functions
				.localstorage_retriever("bk_cat_ids");
		window.bk_so_integration.data.bk_campaign_ids = bk_so_integration.functions
				.localstorage_retriever("bk_campaign_ids");
		if (window.bk_so_integration.config.include_audience_names) {
			window.bk_so_integration.data.bk_audience_names = bk_so_integration.functions
					.localstorage_retriever("bk_audience_names");
		}

		// Send data
		bk_so_integration.functions.sendTargets();
	} else {
		bk_so_integration.functions.logger("LOCAL STORAGE : SEND DATA : HTML 5 NOT SUPPORTED");
		return "no storage"; // HTML 5 NOT SUPPORTED
	}
}

bk_so_integration.functions.logger = function(message, attribute_object) {

	if (document.location.href.indexOf('bk_so_logger=true') > -1) {

		// session cookie
		document.cookie = "bk_so_logger=" + "true" + ";path=/;domain=" + document.domain + ";expires=";
	}

	if (document.cookie.indexOf('bk_so_logger=true') > -1) {

		if (typeof attribute_object === "undefined") {
			console.log("BLUEKAI SO : " + message);
		} else {
			for (varName in attribute_object) {
				console.log("BLUEKAI SO : " + message + varName + "=" + attribute_object[varName]);
			}
		}
	}

};

bk_so_integration.functions.arrayAddUnique = function(array, entry) {
	if (array.indexOf(entry) < 0) {
		array.push(entry);
	}

}

// FUNCTION : Parse BlueKai data and send
bk_so_integration.functions.parseBkResults = function() {

	// Parse BlueKai Campaign Results
	window.bk_so_integration.data.bk_category_ids = [];
	window.bk_so_integration.data.bk_campaign_ids = [];
	window.bk_so_integration.data.bk_audience_names = [];

	if (typeof (bk_results) != "undefined") {

		if (typeof (bk_results.campaigns[0]) != "undefined") {

			bk_so_integration.functions.logger("'bk_results' object found");

			for (var i = 0; i < bk_results.campaigns.length; i++) {

				var campaignId = bk_results.campaigns[i].campaign

				bk_so_integration.functions.arrayAddUnique(window.bk_so_integration.data.bk_campaign_ids, campaignId);

				if (window.bk_so_integration.config.include_audience_names) {

					var audience_name = bk_results.campaigns[i].BkDmpAudienceName;

					if (typeof (audience_name) != "undefined") {
						audience_name = decodeURIComponent(audience_name.replace(/\+/g,  " ")); // decode URI
						bk_so_integration.functions.logger("Audience name found: " + audience_name);
						bk_so_integration.functions.arrayAddUnique(window.bk_so_integration.data.bk_audience_names,
								audience_name)
					}

				}
				for (var j = 0; j < bk_results.campaigns[i].categories.length; j++) {

					if (typeof (bk_results.campaigns[i].categories[j].categoryID) != "undefined") {

						var categoryId = bk_results.campaigns[i].categories[j].categoryID;

						bk_so_integration.functions.arrayAddUnique(window.bk_so_integration.data.bk_category_ids,
								categoryId);

					}
				}
			}

			// Send data to Local Storage
			bk_so_integration.functions
					.localstorage_cookie_sender(window.bk_so_integration.data.bk_category_ids, "bk_cat_ids");
			bk_so_integration.functions.localstorage_cookie_sender(window.bk_so_integration.data.bk_campaign_ids,
					"bk_campaign_ids");
			if (window.bk_so_integration.config.include_audience_names) {
				bk_so_integration.functions.localstorage_cookie_sender(window.bk_so_integration.data.bk_audience_names,
						"bk_audience_names");
			}

			// Send data
			bk_so_integration.functions.sendTargets();

		} else {

			bk_so_integration.functions.logger("No campaigns object");
		}
	}
}

bk_so_integration.functions.sendTargets = function() {

	bk_so_integration.functions.logger("Determine target systems to send data");

	
}

// FUNCTION : Call BlueKai
bk_so_integration.functions.callBlueKai = function(bluekai_jsonreturn_id) {
	1
	// Check if JSON return tag and bk_results already there
	if ((window.bk_results)
			&& (document.head && document.head.innerHTML.indexOf(bluekai_jsonreturn_id + '?ret=js') > -1)
			|| (document.body && document.body.innerHTML.indexOf(bluekai_jsonreturn_id + '?ret=js') > -1)) {

		bk_so_integration.functions.logger("JSON Return tag found");
		bk_so_integration.functions.logger("Parsing 'bk_results' directly");
		bk_so_integration.functions.parseBkResults(); // Parse results (don't
		// call JSON ret tag)

	} else {

		bk_so_integration.functions.logger("JSON Return tag NOT found");
		bk_so_integration.functions.localstorage_fallback(); // Grab from
		// local storage
		bk_so_integration.functions.logger("Waiting " + window.bk_so_integration.config.wait_in_ms
				+ "ms before calling JSON Return Tag");

		setTimeout(function() {

			bk_so_integration.functions.logger("Calling JSON Return tag");
			var bk_json_ret = document.createElement("script");
			bk_json_ret.type = "text/javascript";
			bk_json_ret.onload = function() {
				bk_so_integration.functions.logger("JSON Return tag loaded");
				bk_so_integration.functions.logger("Parsing 'bk_results'");
				bk_so_integration.functions.parseBkResults(); // Parse results
			};
			bk_so_integration.functions.parseBkResults(); // Parse results
			bk_json_ret.src = "//tags.bluekai.com/site/" + bluekai_jsonreturn_id
					+ "?ret=js&limit=1&phint=integration=so";

			document.head.appendChild(bk_json_ret);

		}, window.bk_so_integration.config.wait_in_ms);
	}
};

// CONFIG LOGGING : Loop through config and log
for (configs in window.bk_so_integration.config){

	bk_so_integration.functions.logger("CONFIG : " + configs + " = " + window.bk_so_integration.config[configs]);

}

// SPLIT TESTING (if activated in config)
if(window.bk_so_integration.config.split_testing){

	// Get experiment ID
	bk_so_integration.functions.split_testing_cookie_generator();

	for (experiments in window.bk_so_integration.split_testing.experiments){

		if(experiments && window.bk_so_integration.split_testing.experiments[experiments].control_size){

			bk_so_integration.functions.logger("SPLIT TESTING : Configuring experiment code for '" + experiments + "'");
			bk_so_integration.functions.split_testing_experiment_generator(experiments,window.bk_so_integration.split_testing.experiments[experiments].control_size);

		};

	};

};

// RUN CODE
bk_so_integration.functions.callBlueKai(window.bk_so_integration.config.bluekai_jsonreturn_id);

// CUSTOM DATA LAYER CODE : Custom DOM Ready GA data to fire segmentation data
document.addEventListener("DOMContentLoaded", function(){
	
	var data = {	
		'event': 'bluekai',
		'bluekai_experiment_name': 'Blackcircles Tyres',
		'bluekai_experiment_value': bk_so_integration.split_testing.experiments.blackcircles_tyres.your_segment_type	
	}

	bk_so_integration.functions.logger("GTM DATA LAYER : pushing data to datalayer (see below)");
	bk_so_integration.functions.logger("GTM DATA LAYER : " + JSON.stringify(data));
	dataLayer.push(data);

});