/**
	EvEmbed class.
	*/

if (typeof(EvEmbed) === 'undefined') {
	var EvEmbed = [];
}

/*
// EMBED HTML
var embed_html = ;
if (embed_html) {
	var eh_div = document.createElement("div");
	eh_div.innerHTML = embed_html;
	ev_embed.parentNode.insertBefore(eh_div, ev_embed);
}
console.log('EMBED');
console.log(embed_html);
*/

/**
	Grab query string parameters to check for page overrides.
	*/
var url_params = (function () {
	var match,
		pl     = /\+/g,  // Regex for replacing addition symbol with a space
		search = /([^&=]+)=?([^&]*)/g,
		decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
		query  = window.location.search.substring(1);

	var params = {};
	while (match = search.exec(query)) {
		params[decode(match[1])] = decode(match[2]);
	}

	return params;
})();

function get_embed_override(index) {
	var key = "ev" + index;

	if (key in url_params) {
		var page = url_params[key];
		if (["landing", "intro", "savings", "savings_phev", "savings_demand", "savings_fleet", "tou", "survey", "incentives", "promo", "promo2", "case_studies", "dealers", "installers", "retailers", "charger_loc", "chargers", "compare", "compare_advanced", "compare_phev", "compare_evse", "compare_evse_lvl3", "carbon", "carbon_fleet", "faq", "about", "about_fleet", "fleet_calculator", "savings_combined", "compare_combined", "solar"].indexOf(page) != -1) {
			return page;
		}
	}

	return false;
}

EvEmbed.push((function () {

	function init(index) {
		// console.log('Initializing index ' + index);

		var ev_embed = document.getElementById("enw-ev-embed");

		// new multiple embed method
		if (! ev_embed) {
			var ev_embed_group = document.getElementsByClassName("ev_embed_group");
			if (ev_embed_group.hasOwnProperty(index)) {
				var ev_embed = ev_embed_group[index];
			}
			else {
				console.log("Could not find the EvEmbed element(s)..");
				return;
			}
		}
		else {
			console.log('Found 1 embed.');
		}

		var ds = ev_embed.dataset;
		var p, s, c, sc, makes, site_id;

		// console.log("My element..");
		// console.log(ev_embed);

		if (ds && typeof(ds) != 'undefined') {
			p = ds.page;
			s = ds.standalone;
			c = ds.css;
			makes = ds.makes;
			site_id = ds.site_id;
			sc = (ds.scroll || '').toLowerCase() == 'true';
		}
		else {
			p = ev_embed.getAttribute('data-page');
			s = ev_embed.getAttribute('data-standalone');
			c = ev_embed.getAttribute('data-css');
			makes = ev_embed.getAttribute('data-makes');
			site_id = ev_embed.getAttribute('data-site_id');
			sc = (ev_embed.getAttribute('data-scroll') || '').toLowerCase() == 'true';
		}

		//console.log("scroll content on navigate: " + sc)

		var u = "https://canoochee.upgrade.guide/ev/solar/";
		// var ev_iframe_id = "enw-ev-content";
		var ev_iframe_id = "ev_embed_frame_" + index;
		// var wrapper = document.getElementById(ev_iframe_id);

		// remove any existing content
		while(ev_embed.firstChild) {
			ev_embed.removeChild(ev_embed.firstChild);
		}

		var p_override = get_embed_override(index);

		if (p_override) {
		  if (p_override === 'promo') {
				p_override = 'promos';
			}
			u += p_override + "/";
		}
		else if (p) {
			if (p === 'promo') {
				p = 'promos';
			}
			else if (p === 'solar') {
			  p = 'solar-calculator'
			}
			u += p + "/";
		}

		u += "?embed"
			+ (s ? "&standalone" : '')
			+ (c ? "&css=" + c : '')
			+ (site_id ? "&site_id=" + site_id : '')
			+ (makes ? "&makes=" + encodeURIComponent(makes) : '');

		// console.log("loading: " + u)

		var frameTm = undefined;
		function watchMobile() {
			var c = document.getElementById(ev_iframe_id);
			var offset = c.parentElement.offsetWidth;
			var ww = window.innerWidth;
			var nw = Math.min(offset, ww);

			clearTimeout(frameTm);
			frameTm = undefined;
			frameTm = setTimeout(function() {
				// only apply if width changed
				if (c.width != nw) {
					c.width = nw;
					// ev iframe id is posted to identify itself and only apply to the correct iframe
					c.contentWindow.postMessage(ev_iframe_id, '*');
				}
			}, 400);
		}

		/**
			Custom remove padding around iframe.
			*/
		function fixMason(el) {
			// TODO add specific rule specificying client, this is for Mason.
			var main = document.getElementsByClassName('main-cnt');
			if (main && main.length) {
				main[0].style.padding = 0;
				var ch = main[0].children;
				if (ch && ch.length) {
					ch[0].style.padding = 0;
				}
			}
		}

		function fixOrcas(el) {
			var a = document.getElementsByClassName('es-content');
			if (a && a.length) {
				a[0].style.padding = 0;
			}

			var b = document.getElementsByClassName('es-main');
			if (b && b.length) {
				b[0].style.width = 'initial';
				b[0].style.cssFloat = 'none';
			}
		}

		fixMason(ev_embed);
		fixOrcas(ev_embed);

		var init_load = true;
		var ev_iframe = document.createElement("iframe");
		ev_iframe.id = ev_iframe_id;
		ev_iframe.src = u;
		ev_iframe.title = "EV Toolkit";
		ev_iframe.frameborder = "0";
		// ev_iframe.loading = "lazy";
		ev_iframe.height = "1000";
		ev_iframe.innerHTML = "Unable to Display Contents";
		ev_iframe.scrolling = "no";
		ev_iframe.style.border = 0;
		ev_iframe.width = "100%";
		ev_iframe.onload = function() {
			watchMobile();

			// temp behavior to still enable scrolling for avista, otherwise turn it off for all
			var sc_enable = false;
			var sc_offset = 0;
			if (u.indexOf("https://avista.upgrade.guide/ev/commercial/") > -1) {
				sc_enable = true;
				sc_offset = 140;
				//console.log("Force avista site to scroll with offset");
			}

			// ER 6/18/21 - disabling auto scrolling behavior per bens request except for avista
			// console.log("auto-scroll on navigate enabled? " + sc);
			if (! init_load && sc_enable) {
				// IE doesn't support behavior
				var ua = window.navigator.userAgent;
				var msie = ua.indexOf("MSIE");
				var offset = ev_iframe.offsetTop - sc_offset;
				if (msie != -1) {
					window.scrollTo(0, offset);
				}
				else {
					window.scrollTo({
						top: offset,
						behavior: 'smooth'
					});
				}
			}
			init_load = false;
		};

		ev_embed.appendChild(ev_iframe);

		/* CHANNEL ATTEMPT FOR IE */

		// wait for the iframe to load
		ev_iframe.addEventListener("load", function() {
			var channel = new MessageChannel();

			// console.log("iframe loaded...");
			var ref_ht = 0;

			// listen for messages on port1
			channel.port1.onmessage = function(e) {
				// console.log("Got channel message: " + e.data);
				var sp = e.data.split(':');
				var target_id = sp[0];
				var rh = parseFloat(sp[1]);

				// only allow the matching iframe to fire
				if (target_id != ev_iframe_id) {
					console.log('I will not fire ' + ev_iframe_id + '..');
					return;
				}
				else {
					// console.log('Firing ' + ev_iframe_id + '..');
				}

				// only apply if height has changed
				if (ref_ht != rh) {
					ev_iframe.height = rh + 50;

					// set both ways or one? ..to ensure cross-compatibility
					var hh = rh + 50 + 'px';
					ev_embed.style.height = hh;
					ev_embed.setAttribute('style', 'height: ' + hh);
				}
				ref_ht = rh;
			};

			// add scroll trigger
			/*
			var scrollFn = function(e) {
				if (typeof(ev_iframe.contentWindow.SCROLL_FN) != 'undefined') {
					ev_iframe.contentWindow.SCROLL_FN({
						'scrollTop': window.scrollY,
						'height': window.innerHeight
					});
				}
			}
			*/

			var scrollTm = undefined;
			const scrollFn = function (e) {
				clearTimeout(scrollTm);
				scrollTm = undefined;

				var data = {
					'scrollTop': window.scrollY,
					'height': window.innerHeight
				};
				// var msg = "scroll:" + window.scrollY + ':' + window.innerHeight;

				scrollTm = setTimeout(function () {
					ev_iframe.contentWindow.postMessage(data, '*'); // , [channel.port2]);
				}, 100);
			}
			window.addEventListener('scroll', scrollFn);
			scrollFn();
			// scrollFn(); // run initial scroll check

			// transfer port2 to the iframe
			ev_iframe.contentWindow.postMessage(ev_iframe_id, '*', [channel.port2]);
			ev_iframe.contentWindow.postMessage({
				'iframe_parent': window.location.href,
				'referrer': document.referrer
			}, '*'); //, [channel.port2]);
		});

		// window.addEventListener("resize", watchMobile);
		window.setInterval(watchMobile, 1000);

		return this;
	}

	return {
		init: init,
	}

})().init(EvEmbed.length));

// console.log('Added EvEmbed instance..');
// console.log(EvEmbed);

