//Appends an element to the document
var appendHtml = function (element, html) {
var div = document.createElement('div');
div.innerHTML = html;
while (div.children.length > 0) {
element.appendChild(div.children[0]);
}
}
async function AddHeaderScripts() {
Log("Jquery Check");
if ('undefined' == typeof window.jQuery) {
var jQueryScript = document.createElement('script');
jQueryScript.setAttribute('src','https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js');
document.head.appendChild(jQueryScript);
var count = 0;
//Check if Jquery is running yet?
while (!window.hasOwnProperty("jQuery")) {
Log("waiting for jQuery");
await new Promise(r => setTimeout(r, 250));
count++;
//Stop infinateloop maxtime 5s
if (count > 20) {
break;
}
}
}
await AddScripts()
}
function LoadScript(src) {
return new Promise(function (resolve) {
var existingScript = document.querySelector('script[src="' + src + '"]');
if (existingScript) {
resolve(true);
return;
}
var script = document.createElement('script');
script.src = src;
script.onload = function () { resolve(true); };
script.onerror = function () { resolve(false); };
document.head.appendChild(script);
});
}
function LoadStyleSheet(href) {
if (document.querySelector('link[href="' + href + '"]')) {
return;
}
var link = document.createElement('link');
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = href;
document.head.appendChild(link);
}
async function AddScripts() {
if ('undefined' != typeof window.jQuery) {
Log("jQuery Installed");
LoadStyleSheet("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css");
LoadStyleSheet("https://cdn.jsdelivr.net/npm/tom-select@2.4.3/dist/css/tom-select.bootstrap4.min.css");
await LoadScript("https://piersstaging.c-level.earth//scripts/autocomplete/autocomplete-combined.js");
await LoadScript("https://cdn.jsdelivr.net/npm/tom-select@2.4.3/dist/js/tom-select.complete.min.js");
Log("All header scripts loaded");
} else {
Log("jQuery NOT Installed");
//Jquery didnt insert properly calculator wont run.
alert("Jquery could not be installed, please refresh and try again.");
}
}
//Global pramas
var quoteParmId = getParameterByName("oid");
var cancelParm = getParameterByName("c");
/* START Global Functions */
//Gets a query string parameter by name
function getParameterByName(name, url) {
if (!url) url = window.location.href;
name = name.replace(/[\[\]]/g, '\\$&');
var regex = new RegExp('[?&]' + name + '(=([^]*)|&|#|$)'),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, ' '));
}
//Hide all the steps in the calculator
function HideStep() {
$('.clevel-step').hide();
}
//Reloads the page
function ReloadPage() {
Log("Page reload");
window.location.reload();
}
//logging
function Log(message) {
if (balanceAPI.DeveloperMode) {
console.log(message)
}
}
//Get a property from an object by name
function GetProperty(item, name) {
if (item && Object.prototype.hasOwnProperty.call(item, name)) {
return item[name];
}
return "Key not found";
};
/* END Global Functions */
/* START API Functions */
async function FetchHtml(url){
var fetchedData = await fetch(url, {headers: {'apikey': balanceAPI.ApiKey},})
.then(response => response.text())
.then(responseBody => {
Log("FetchHtml:Complete " +url)
Log("FetchHtml:Text " +responseBody.toString())
return responseBody.toString();
})
.catch(error => {
console.error(error);
});
return fetchedData;
}
async function GetJSONFromAPI(url, result) {
var fetchedData = await fetch(url, {headers: {'apikey': balanceAPI.ApiKey, 'Content-Type': 'application/json'},})
.then(response => response.json())
.then(responseBody => {
Log("Fetch:Complete " +url)
Log("Fetch:JSON " +JSON.stringify(responseBody))
result = responseBody;
})
.catch(error => {
Log(error);
return null;
});
return result;
}
function GetJQueryAPICall(url){
var result = null;
$.ajax({
method: "GET",
url: url,
headers: {
'apikey': balanceAPI.ApiKey,
'Content-Type': 'application/json'
},
contentType: "application/json",
async: false,
error: function () {
alert("An error has occured please check entered data and try again!");
}
}).done(function (data) {
Log("GetJQueryAPICall" +data);
result = data;
});
return result;
}
function PostUpdate(url, postData) {
var _data = JSON.stringify(postData);
Log("PostUpdate" +_data);
$.ajax({
method: "POST",
url: balanceAPI.ApiUrl + url,
headers: {
'apikey': balanceAPI.ApiKey,
'Content-Type': 'application/json'
},
contentType: "application/json",
async: false,
data: _data,
error: function () {
alert("An error has occured please check entered data and try again!");
}
}).done(function (data) {
balanceAPI.UpdateResponse = data;
Log(data)
});
}
function PostCombine(postData) {
var _data = JSON.stringify(postData);
$.ajax({
method: "POST",
url: balanceAPI.ApiUrl + "/v1/quote/combine",
headers: {
'apikey': balanceAPI.ApiKey,
'Content-Type': 'application/json'
},
contentType: "application/json",
async: false,
data: _data,
error: function () {
alert("An error has occured please check entered data and try again!");
balanceAPI.QuoteDetails = null;
}
}).done(function (data) {
Log("PostCombine" +data)
balanceAPI.QuoteDetails = data;
});
}
function PostCalculation(url, postData) {
if(balanceAPI.Error) {
return;
}
var _data = JSON.stringify(postData);
$.ajax({
method: "POST",
url: balanceAPI.ApiUrl + url,
headers: {
'apikey': balanceAPI.ApiKey,
'Content-Type': 'application/json'
},
contentType: "application/json",
async: false,
data: _data,
error: function () {
alert("An error has occured please check entered data and try again!");
//balanceAPI.QuoteDetails = null; try not resetting just not updating.
return false;
}
}).done(function (data) {
Log("PostCalculation" +data)
//Do we already have a quote?
if(balanceAPI.QuoteDetails == null) {
balanceAPI.QuoteDetails = data;
return true;
}
Log("Combine needed");
currentQuoets = GetCombinedQuote(data.QuoteId);
Log("Quote Combine" +JSON.stringify(currentQuoets));
PostCombine(currentQuoets);
});
}
/* END API Functions */
/* START Object Functions */
function GetCombinedQuote(quoteId) {
var Quote = {QuoteIds:[]};
if(quoteId != null) {
Quote.QuoteIds.push(quoteId);
}
var push = true;
if(typeof balanceAPI.QuoteDetails !== undefined) {
balanceAPI.QuoteDetails?.Quotes?.forEach(function(item) {
Quote.QuoteIds.push(item.QuoteId);
push = false;
});
if(push) {
//We only have one quote, push
Quote.QuoteIds.push(balanceAPI.QuoteDetails.QuoteId);
}
}
return Quote;
}
function GetUpdateObject() {
var QuoteId = balanceAPI.QuoteDetails.QuoteId;
var Personalisation = "";
var CertificateSendEmail = "";
var perObj = $("input[name='clevel-cert-name']");
if (typeof perObj != 'undefined') {
Personalisation = $(perObj).val();
}
var emailObject = $("input[name='clevel-cert-email']");
if (typeof emailObject != 'undefined') {
CertificateSendEmail = $(emailObject).val();
}
var SendCertificate = balanceAPI.SendCertificate;
var Reference = balanceAPI.Referance;
var UrlReferer = window.location.href;
UrlReferer = UrlReferer.replace(/\#.*/, '');
UrlReferer = UrlReferer.replace(/\?.+/g, "$'");
return {
QuoteId,
CertificateSendEmail,
Personalisation,
SendCertificate,
Reference,
UrlReferer,
};
}
//Checks is the broswer is mobile width
function MobileCheck() {
var isMobile = window.matchMedia("only screen and (max-width: 559px)").matches;
if(isMobile) {
return true;
}
}
function GetScrollOffset() {
var selectors = "header, .sticky-top, .fixed-top, .navbar-fixed-top, [data-scroll-offset]";
var elements = document.querySelectorAll(selectors);
var maxBottom = 0;
elements.forEach(function (element) {
if (!(element instanceof Element)) {
return;
}
var style = window.getComputedStyle(element);
var position = style.position;
if (position !== "fixed" && position !== "sticky") {
return;
}
if (style.display === "none" || style.visibility === "hidden") {
return;
}
var rect = element.getBoundingClientRect();
if (rect.height < 1 || rect.bottom <= 0) {
return;
}
if (rect.top > 0 && position !== "fixed") {
return;
}
maxBottom = Math.max(maxBottom, rect.bottom);
});
return Math.ceil(maxBottom + 16);
}
function ScrollToResolver(elem) {
// Check if elem is not null and is a DOM element
if (!elem || !(elem instanceof Element)) {
return;
}
var scrollOffset = GetScrollOffset();
var targetTop = window.pageYOffset + elem.getBoundingClientRect().top - scrollOffset;
if (typeof window.scrollTo === "function") {
window.scrollTo({
top: Math.max(targetTop, 0),
behavior: "smooth"
});
return;
}
document.body.scrollTop = Math.max(targetTop, 0);
document.documentElement.scrollTop = Math.max(targetTop, 0);
}
function formatZeroPadding(dateString) {
return dateString < 10 ? '0' + dateString : dateString.toString();
}
function ClearFormForNextCalculation()
{
// Check if the elements exist and then set their values to an empty string
if ($("#clevel-from").length) {
if (typeof ClearAirportField === "function") {
ClearAirportField($("#clevel-from"));
} else {
$("#clevel-from").val("");
}
}
if ($("#clevel-to").length) {
if (typeof ClearAirportField === "function") {
ClearAirportField($("#clevel-to"));
} else {
$("#clevel-to").val("");
}
}
}
function GetProgressStageIndex(navLinks) {
var currentStep = (balanceAPI && balanceAPI.Step) ? balanceAPI.Step : "";
if (!navLinks || !navLinks.length) {
navLinks = $(".clevel-subnav a");
}
var currentHref = "#" + currentStep.replace('.', '');
var currentNavIndex = navLinks.index(navLinks.filter("[href='" + currentHref + "']"));
if (currentNavIndex !== -1) {
return currentNavIndex;
}
if (currentStep.indexOf("calculation") !== -1) {
return Math.max(navLinks.length - 2, 0);
}
if (currentStep.indexOf("complete") !== -1) {
return Math.max(navLinks.length - 1, 0);
}
return 0;
}
/* END Object Functions */
//Flight prams in queryString
var clevelFlightFrom = getParameterByName("clevelfrom");
var clevelFlightTo = getParameterByName("clevelto");
var clevelFlightClass = getParameterByName("clevelclass");
var clevelFlightPassangers = getParameterByName("clevelpass");
var flightHtmlDashSteps = "
";
//Set and changes the dashset settings
function DashStepSettings() {
}
//Sets and shows the correct step
function ShowStep() {
HideStep();
DashStepSettings();
var currentStep = $(balanceAPI.Step);
currentStep.show();
var progressSteps = currentStep.find(".clevel-step-dash > div");
if (!progressSteps.length) {
progressSteps = $(".clevel-step-dash > div");
}
var selectedStageIndex = GetProgressStageIndex(currentStep.find(".clevel-subnav a"));
progressSteps.removeClass("select");
progressSteps.slice(0, selectedStageIndex + 1).addClass("select");
//Show the correct buttons
$(".clevel-add-another").hide();
$(".clevel-offset").hide();
$(".clevel-calculate").show();
Log("ShowStep()");
Log("Show Step" +balanceAPI.Step);
//Scroll to new step top.
var srcollElementId = balanceAPI.Step.replace('.', '');
Log("Call scroll with element " +srcollElementId);
var element = document.getElementById(srcollElementId);
ScrollToResolver(element);
}
var balanceAPI = {
ApiKey: "7cd94c8f-5c03-489c-9f58-fa18a8fd20af",
ApiUrl: "https://piersstaging-api.c-level.earth/",
Calculator:"Flight",
CalculatorHtmlUrl: "",
CalculationHtml: "",
CalculatorElement: "clevel-calculator",
CartHtml: "",
DeveloperMode: false,
Equivalence:null,
HtmlRoot: "https://piersstaging.c-level.earth/",
Referance:"",
Error:false,
SandboxMode: false,
SendCertificate:true,
Step:".clevel-step-one",
NavigationHtml: "",
QuoteDetails:null,
Initialize: function () {
Initialize();
}
};
async function SetEquivilance(calHtml) {
var CO2Kg = parseInt(balanceAPI.QuoteDetails.Co2Total_Kg);
Log("CO2kg:" +CO2Kg);
var url = balanceAPI.ApiUrl +"/v1/equivalence/co2/" +CO2Kg
var _data = await GetJSONFromAPI(url, balanceAPI.Equivalence);
Log("EQUDATA" +_data);
balanceAPI.Equivalence = _data
Log("balanceAPI.Equivalence" +JSON.stringify(balanceAPI.Equivalence));
var cal = document.getElementById(balanceAPI.CalculatorElement);
if (cal) {
balanceAPI.Equivalence.forEach(item => {
var name = GetProperty(item, "Name")
if(name == "Black Coffee") {
item.Description = "boiling water for a cup of coffee";
item.Unit = "cups";
calHtml = EquivilanceShow(calHtml, item, "ONE")
}
if(name == "Mobile") {
item.Unit = "";
calHtml = EquivilanceShow(calHtml, item, "TWO")
}
if(name == "Allowance") {
calHtml = EquivilanceShow(calHtml, item, "THREE")
}
});
Log("Calculator Replaced HTML:" +calHtml)
}
return calHtml;
}
function EquivilanceShow(calHtml, item, EQUTEXT){
var iconName = "==EQU" +EQUTEXT +"ICON=="
var icon = GetProperty(item, "FontAwesomeIconCss")
var textName = "==EQU" +EQUTEXT +"TEXT=="
var textDescription = GetProperty(item, "Description")
var totalName = "==EQU" +EQUTEXT +"NUMBER=="
var total = GetProperty(item, "Total")
var unitName = "==EQU" +EQUTEXT +"UNIT=="
var unit = GetProperty(item, "Unit")
var totalFixed = 0;
if(total > 0)
{
totalFixed = total.toFixed(0)
}
calHtml = calHtml.toString().replaceAll(iconName,icon);
calHtml = calHtml.toString().replaceAll(textName, textDescription);
calHtml = calHtml.toString().replaceAll(totalName, totalFixed);
calHtml = calHtml.toString().replaceAll(unitName, unit);
Log("Calhtml equivilance replaced");
return calHtml;
}
var autocomplete = null;
function BuildAirportOption(item) {
return {
value: item.IataCode,
label: item.IataCode + " - " + item.AirportName,
text: item.AirportName
};
}
function ClearAirportSelectionState(htmlObject) {
htmlObject.removeData("selected-iata");
htmlObject.removeData("selected-label");
}
function SetAirportSelectionState(htmlObject, option) {
if (!option) {
ClearAirportSelectionState(htmlObject);
return;
}
htmlObject.data("selected-iata", option.value);
htmlObject.data("selected-label", option.label);
}
function UpdateAirportFieldState(htmlObject, state) {
htmlObject.removeClass("error success");
if (state) {
htmlObject.addClass(state);
}
if (htmlObject.length && htmlObject[0].tomselect) {
$(htmlObject[0].tomselect.wrapper).removeClass("error success");
if (state) {
$(htmlObject[0].tomselect.wrapper).addClass(state);
}
}
}
function GetAirportDisplayValue(htmlObject) {
if (!htmlObject || !htmlObject.length) {
return "";
}
if (htmlObject[0].tomselect) {
var selectedValue = htmlObject[0].tomselect.getValue();
if (selectedValue) {
var option = htmlObject[0].tomselect.options[selectedValue];
if (option && option.label) {
return option.label;
}
}
return htmlObject[0].tomselect.control_input.value || "";
}
return htmlObject.val() || "";
}
function GetAirportSelectedCode(htmlObject) {
if (!htmlObject || !htmlObject.length) {
return "";
}
if (htmlObject[0].tomselect) {
var selectedValue = htmlObject[0].tomselect.getValue();
if (selectedValue) {
return selectedValue;
}
var typedAirport = htmlObject[0].tomselect.control_input.value || "";
var typedMatch = typedAirport.match(/^([A-Za-z]{3})\b/);
if (typedMatch && typedMatch[1]) {
return typedMatch[1].toUpperCase();
}
}
var selectedCode = htmlObject.data("selected-iata");
if (selectedCode) {
return selectedCode;
}
var airport = htmlObject.val() || "";
var match = airport.match(/^([A-Za-z]{3})\b/);
if (match && match[1]) {
return match[1].toUpperCase();
}
return "";
}
async function FetchAirports(query) {
if (!query || query.length < 2) {
return [];
}
var url = balanceAPI.ApiUrl + "/v1/airport/autocomplete/" + encodeURIComponent(query);
var response = await fetch(url, {
headers: {
apikey: balanceAPI.ApiKey
}
});
if (!response.ok) {
return [];
}
var json = await response.json();
return (json || []).filter(function (item) {
return item && item.IataCode && item.AirportName;
}).map(BuildAirportOption);
}
function SetBloodHound() {
autocomplete = {
fetchAirports: FetchAirports
};
Log("SetBloodhound - complete");
}
function SetTomSelectAutoComplete(element) {
if (!element || element.tomselect) {
return;
}
var htmlObject = $(element);
var suppressNextFocusClear = false;
new TomSelect(element, {
valueField: "value",
labelField: "label",
searchField: ["label", "text"],
options: [],
create: false,
persist: false,
maxItems: 1,
maxOptions: 20,
loadThrottle: 250,
closeAfterSelect: true,
preload: "focus",
shouldLoad: function (query) {
return query.length > 1;
},
load: function (query, callback) {
autocomplete.fetchAirports(query).then(function (items) {
callback(items);
}).catch(function () {
callback();
});
},
onType: function () {
ClearAirportSelectionState(htmlObject);
UpdateAirportFieldState(htmlObject, "");
},
onChange: function (value) {
if (!value) {
ClearAirportSelectionState(htmlObject);
UpdateAirportFieldState(htmlObject, "");
return;
}
var option = this.options[value];
SetAirportSelectionState(htmlObject, option);
UpdateAirportFieldState(htmlObject, "success");
suppressNextFocusClear = true;
this.control_input.blur();
},
onInitialize: function () {
var input = this.control_input;
var tomSelect = this;
$(this.wrapper).removeClass("form-control clevel-first-input");
input.addEventListener("blur", function () {
CheckIataCode(htmlObject);
});
input.addEventListener("focus", function () {
if (!tomSelect.getValue()) {
suppressNextFocusClear = false;
return;
}
if (suppressNextFocusClear) {
suppressNextFocusClear = false;
return;
}
tomSelect.clear(true);
ClearAirportSelectionState(htmlObject);
UpdateAirportFieldState(htmlObject, "");
});
},
render: {
option: function (item, escape) {
return "" + escape(item.value) + "" + escape(item.text) + "
";
},
item: function (item, escape) {
return "" + escape(item.label) + "
";
},
no_results: function (data, escape) {
return "No airports found for \"" + escape(data.input) + "\"
";
}
}
});
}
function SetLegacyAutoComplete(htmlObject) {
if (htmlObject.data("clevelLegacyAutocomplete")) {
return;
}
htmlObject.typeahead(null, {
displayKey: "value",
limit: 19,
source: function (query, syncResults, asyncResults) {
autocomplete.fetchAirports(query).then(function (items) {
asyncResults(items.map(function (item) {
return {
value: item.label,
text: item.text
};
}));
}).catch(function () {
asyncResults([]);
});
},
templates: {
suggestion: Handlebars.compile("{{value}}
"),
footer: Handlebars.compile("Searched for '{{query}}'")
}
});
htmlObject.on("typeahead:select typeahead:autocomplete", function (event, item) {
var match = (item && item.value) ? item.value.match(/^([A-Za-z]{3})\b/) : null;
if (match && match[1]) {
SetAirportSelectionState(htmlObject, {
value: match[1].toUpperCase(),
label: item.value
});
UpdateAirportFieldState(htmlObject, "success");
}
});
htmlObject.on("input", function () {
ClearAirportSelectionState(htmlObject);
UpdateAirportFieldState(htmlObject, "");
});
htmlObject.data("clevelLegacyAutocomplete", true);
}
function SetAutoComplete(htmlObject) {
Log("SetAutoComplete on:" + htmlObject.attr("id"));
if (!htmlObject || !htmlObject.length) {
return;
}
if (typeof window.TomSelect !== "undefined") {
SetTomSelectAutoComplete(htmlObject[0]);
return;
}
SetLegacyAutoComplete(htmlObject);
}
/* START CART FUNCTIONS */
async function BuildCart(){
var cartHtml = "";
var cartTemplateUrl = balanceAPI.HtmlRoot + "/Html/Cart";
var cartSingleLineHtml = await FetchHtml(cartTemplateUrl);
//No quote is Set
if (balanceAPI.QuoteDetails === undefined || balanceAPI.QuoteDetails === null) {
Log("No quotes")
balanceAPI.CartHtml = cartHtml;
} else {
cartHtml = "";
//Add heading to the cart.
cartHtml = 'Items Added:
'
//We have single quote
if(balanceAPI.QuoteDetails.Quotes === undefined || balanceAPI.QuoteDetails.Quotes === null){
cartHtml = cartHtml +CartOrderlineHtml(balanceAPI.QuoteDetails, cartSingleLineHtml);
} else {
//We have mulitple quotes
balanceAPI.QuoteDetails?.Quotes?.forEach(item => {
var result = CartOrderlineHtml(item, cartSingleLineHtml);
cartHtml = cartHtml +result;
});
}
}
balanceAPI.CartHtml = "" + cartHtml +"
";
//Are we replacing the current cart?
var cartElement = document.getElementsByName("clevel-cart-continer");
Log("Element found:" +cartElement)
if(cartElement) {
Log("CartHtml: replaced")
$(".clevel-cart-continer").replaceWith(balanceAPI.CartHtml);
}
//Set the cart functions
CartFunctions();
}
function CartOrderlineHtml(quoteDetails, cartSingleLineHtml) {
var newCartLine = cartSingleLineHtml;
var tonnesCO2 = GetProperty(quoteDetails, "Co2Total_Tonne");
var shortDescription = GetProperty(quoteDetails, "ShortDescription");
var metaDataHtml = CartMetaData(quoteDetails.MetaData);
var quoteId = GetProperty(quoteDetails, "QuoteId");
newCartLine = newCartLine.replaceAll("==QUOTEID==", quoteId);
newCartLine = newCartLine.replaceAll("==CO2TONNES==", tonnesCO2);
newCartLine = newCartLine.replaceAll("==SHORTDISCRIPTION==", shortDescription);
newCartLine = newCartLine.replaceAll("==METADATA==", metaDataHtml);
return newCartLine;
}
function CartMetaData(metaData) {
var str = "";
if (typeof metaData != 'undefined') {
metaData.forEach(item => {
var metaDataString = "==NAME==:==VALUE==";
var metaName = GetProperty(item, "Name");
var metaValue = GetProperty(item, "Value");
metaDataString = metaDataString.replace("==NAME==", metaName);
metaDataString = metaDataString.replace("==VALUE==", metaValue);
str = str + metaDataString;
});
}
return str;
}
function CartFunctions() {
$(".cart-view").click(function() {
Log("cart view toggle");
var showElement = $(this).nextAll(".cart-item");
Log("Element to toggle:" +showElement)
showElement.toggle();
});
$(".cart-delete").click(function() {
var quoteId = $(this).data("quoteid")
Log("Cart-Delete-Click: " +quoteId)
CartDelete(quoteId);
BuildCart();
});
}
function CartDelete(quoteId) {
var mainQuoteId = GetProperty(balanceAPI.QuoteDetails, "QuoteId");
if(mainQuoteId == quoteId) {
balanceAPI.QuoteDetails = null;//There was only one quote just blank it.
Log("Cart-item-cleared-removed:" +quoteId);
ReloadPage();
return;
}
//Do we have lots of quotes find index in array and remove.
balanceAPI.QuoteDetails?.Quotes?.forEach(function(item, index, object) {
var itemQuoyeId = GetProperty(item,"QuoteId")
if (itemQuoyeId === quoteId) {
object.splice(index, 1);
Log("Cart-item-removed:" +quoteId);
}
});
Log("Cart-item-count:" +balanceAPI.QuoteDetails?.Quotes?.length);
//Have we removed all the quotes?
if(balanceAPI.QuoteDetails?.Quotes?.length == 0) {
ReloadPage();
return;
}
//Replace the current calulation back to the replacment text
if(balanceAPI.Step == ".clevel-step-calculation") {
$(".clevel-step-calculation").replaceWith(balanceAPI.CalculationHtml);
currentQuoets = GetCombinedQuote();
Log("Quote Combine" +JSON.stringify(currentQuoets));
PostCombine(currentQuoets);
Calculate();
ShowCalculation();
}
}
async function Initialize() {
//First make sure all scripts are on the page
await AddHeaderScripts();
Log("balanceAPI.SandboxMode" +balanceAPI.SandboxMode);
if(balanceAPI.SandboxMode) {
Log("Model.ApiSandboxRootUrl:https://piersstaging-api.c-level.earth/");
balanceAPI.ApiUrl = "https://piersstaging-api.c-level.earth/";
balanceAPI.HtmlRoot = "https://piersstaging.c-level.earth/";
}
Log("balanceAPI.ApiUrl" +balanceAPI.ApiUrl);
Log("balanceAPI.HtmlRoot" +balanceAPI.HtmlRoot);
var bootstrapCss = ''
appendHtml(document.head, bootstrapCss);
var customCssUrl = ''
appendHtml(document.head, customCssUrl);
if (balanceAPI.Calculator == "Flight") {
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/flightcalculator"
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/flightcalculator"
}
if (balanceAPI.Calculator == "Accommodation") {
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/accommodationcalculator"
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/accommodationcalculator"
}
if (balanceAPI.Calculator == "Business") {
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/businesscalculator"
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/businesscalculator"
}
if (balanceAPI.Calculator == "Carbon") {
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/carboncalculator"
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/carboncalculator"
}
if (balanceAPI.Calculator == "Car") {
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/carcalculator"
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/carcalculator"
}
if(balanceAPI.Calculator == "Tree") {
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/treecalculator"
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/treecalculator"
}
if(balanceAPI.Calculator == "Gas") {
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/gascalculator"
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/gascalculator"
}
if(balanceAPI.Calculator == "Electric") {
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/electriccalculator"
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/electriccalculator"
}
if(balanceAPI.Calculator == "Percapita") {
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/percapitacalculator"
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/percapitacalculator"
}
if(balanceAPI.Calculator == "FilmProduction") {
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/filmproductioncalculator"
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/filmproductioncalculator"
}
if(balanceAPI.Calculator == "FilmLights") {
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/filmlightscalculator"
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/filmlightscalculator"
}
if(balanceAPI.Calculator == "FilmLocation") {
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/filmlocationcalculator"
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/filmlocationcalculator"
}
//Multistep cals
if(balanceAPI.Calculator == "Energy") {
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/energycalculator"
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/energycalculator"
}
if(balanceAPI.Calculator == "Film") {
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/filmcalculator";
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/filmcalculator";
}
if(balanceAPI.Calculator == "Travel") {
balanceAPI.NavigationHtml = balanceAPI.HtmlRoot + "/htmlnavigation/travelcalculator"
balanceAPI.CalculatorHtmlUrl = balanceAPI.HtmlRoot + "/html/travelcalculator"
}
BuildCart();
BuildHtml();
CartFunctions();
};
function Calculate() {
Log("Calculate() called");
balanceAPI.Error = false;
//Set the client referance if there is one for the quote
if($('#clevel-clientref').length) {
var _ref = $("#clevel-clientref").val();
if(_ref) {
balanceAPI.Referance = _ref;
Log("Referance set:" +balanceAPI.Referance);
}
}
//Call the correct Calculate function
if(balanceAPI.Calculator == "Flight" || balanceAPI.Step == ".clevel-step-flight") {
FlightCalculate();
}
if(balanceAPI.Calculator == "Accommodation" || balanceAPI.Step == ".clevel-step-accommodation") {
AccommodationCalculate();
}
if(balanceAPI.Calculator == "Business") {
BusinessCalculate();
}
if(balanceAPI.Calculator == "Carbon") {
CarbonCalculate();
}
if(balanceAPI.Calculator == "Car" || balanceAPI.Step == ".clevel-step-car") {
CarCalculate();
}
if(balanceAPI.Calculator == "Gas" || balanceAPI.Step == ".clevel-step-gas") {
GasCalculate();
}
if(balanceAPI.Calculator == "Electric" || balanceAPI.Step == ".clevel-step-electric") {
ElectricCalculate();
}
if(balanceAPI.Calculator == "FilmProduction" || balanceAPI.Step == ".clevel-step-filmproduction") {
FilmProductionCalculate();
}
if(balanceAPI.Calculator == "FilmLights" || balanceAPI.Step == ".clevel-step-filmlights") {
FilmLightsCalculate();
}
if(balanceAPI.Calculator == "FilmLocation" || balanceAPI.Step == ".clevel-step-filmlocation") {
FilmLocationCalculate();
}
if(balanceAPI.Calculator == "Tree") {
TreeCalculate();
}
if(balanceAPI.Calculator == "Percapita") {
PerCapitaCalculate();
}
//MultiStep start points
if(balanceAPI.Calculator == "Energy") {
if(balanceAPI.Step == ".clevel-step-one") {
GasCalculate();
}
}
if(balanceAPI.Calculator == "Business") {
if(balanceAPI.Step == ".clevel-step-one") {
BusinessCalculate();
}
}
if(balanceAPI.Calculator == "Film") {
if(balanceAPI.Step == ".clevel-step-one") {
FilmLocationCalculate();
}
}
if(balanceAPI.Calculator == "Travel") {
if(balanceAPI.Step == ".clevel-step-one") {
FlightCalculate();
}
}
};
async function SetNavigation() {
//Remove the selected tag from nav
$(".clevel-subnav a").removeClass("clevel-nav-selected");
Log("SetNavigation()");
var currentStep = $(balanceAPI.Step);
var navLinks = currentStep.find(".clevel-subnav a");
if (!navLinks.length) {
navLinks = $(".clevel-subnav a");
}
var navStageIndex = GetProgressStageIndex(navLinks);
navLinks.slice(0, navStageIndex + 1).addClass("clevel-nav-selected");
if (balanceAPI.Step) {
var navSelector = balanceAPI.Step.replace('-dash','');
navSelector = navSelector.replace('step','next');
Log("Nav selector:" +navSelector);
}
//Next Steps
$(".clevel-next-calculation").click(function() {
Log("clevel-net-calculation click()")
//Only show cal if there is a QuoteDetails
if(balanceAPI.QuoteDetails) {
ShowCalculation();
} else {
if(!balanceAPI.Error) {
alert("You cant see the results until you have made an offset");
}
balanceAPI.Error = true;
}
})
$(".clevel-next-flight").click(function() {
balanceAPI.Step = ".clevel-step-flight"
ShowStep();
SetNavigation();
Settings();
})
$(".clevel-next-filmlights").click(function() {
balanceAPI.Step = ".clevel-step-filmlights"
ShowStep();
SetNavigation();
Settings();
})
$(".clevel-next-filmlocation").click(function() {
balanceAPI.Step = ".clevel-step-filmlocation"
ShowStep();
SetNavigation();
Settings();
})
$(".clevel-next-filmproduction").click(function() {
balanceAPI.Step = ".clevel-step-filmproduction"
ShowStep();
SetNavigation();
Settings();
})
$(".clevel-next-car").click(function() {
balanceAPI.Step = ".clevel-step-car"
ShowStep();
SetNavigation();
Settings();
})
$(".clevel-next-accommodation").click(function() {
balanceAPI.Step = ".clevel-step-accommodation"
ShowStep();
SetNavigation();
Settings();
})
$(".clevel-next-gas").click(function() {
balanceAPI.Step = ".clevel-step-gas"
ShowStep();
SetNavigation();
Settings();
})
$(".clevel-next-electric").click(function() {
balanceAPI.Step = ".clevel-step-electric"
ShowStep();
SetNavigation();
Settings();
})
}
async function ButtonEvents() {
Log("ButtonEvents() called")
//Add item without moving.
$(".clevel-add").click(function() {
Log("clevel-add click()")
Calculate();
if(!balanceAPI.Error) {
BuildCart();
ShowAddAnother()
}
var srcollElementId = balanceAPI.Step.replace('.', '');
if(element == null || element.length === 0) {
//Cant find the correct element scroll to the top
srcollElementId = "clevel-calculator";
}
var element = document.getElementById(srcollElementId);
Log("Call scroll with element " +srcollElementId);
ScrollToResolver(element);
})
$('.clevel-add-another-button').click(function() {
$(".clevel-calculate").show();
$(".clevel-add-another").hide();
var srcollElementId = balanceAPI.Step.replace('.', '');
Log("Call scroll with element " +srcollElementId);
ScrollToResolver(document.getElementById(srcollElementId));
// Check if the elements exist and then set their values to an empty string
ClearFormForNextCalculation();
})
$("#clevel-show-price").click(function() {
Log("clevel-show-price click()")
ShowCalculation();
})
$("#clevel-calculate-price").click(function() {
Log("clevel-calculate-price click()")
Calculate();
ShowCalculation();
//Wait
setTimeout(function (){}, 500);
//Scroll to element
ScrollToResolver(document.getElementById("clevel-step-calculation"));
})
}
async function BuildProjectHtml(calHtml) {
var projectsHtml = await FetchHtml(balanceAPI.HtmlRoot + "/html/projects/" +balanceAPI.ApiKey);
calHtml = calHtml.toString().replaceAll("==PROJECTS==", projectsHtml);
return calHtml
}
async function BuildNavigationHtml(calculatorHtml) {
//Add the navigation
var navigationResultsHtml = "";
if(balanceAPI.NavigationHtml.length) {
var navigationResultsHtml = await FetchHtml(balanceAPI.NavigationHtml);
}
calculatorHtml = calculatorHtml.toString().replaceAll("==NAVIGATION==", navigationResultsHtml);
return calculatorHtml;
}
async function Settings() {
//Set the settings
if(balanceAPI.Calculator == "Flight") {
await FlightSettings()
}
//Apply settings
if(balanceAPI.Calculator == "Business") {
await BusinessSettings();
}
//Apply settings
if(balanceAPI.Calculator == "Carbon") {
await CarbonSettings();
}
if(balanceAPI.Calculator == "Car") {
await CarSettings();
}
if(balanceAPI.Calculator == "Gas") {
await GasSettings();
}
if(balanceAPI.Calculator == "Energy") {
await GasSettings();
}
if(balanceAPI.Calculator == "Film") {
await CarSettings();
await FlightSettings()
}
if(balanceAPI.Calculator == "Travel") {
await FlightSettings();
await CarSettings();
}
}
async function BuildHtml() {
var cal = document.getElementById(balanceAPI.CalculatorElement);
if (cal) {
//Build Caclulation results HTML template
var calulatorResultsHtml = await FetchHtml(balanceAPI.HtmlRoot + "/html/calculation");
calulatorResultsHtml = calulatorResultsHtml.toString().replaceAll('==CART==', balanceAPI.CartHtml);
balanceAPI.CalculationHtml = calulatorResultsHtml;
//Build full calculator HTML
var calculatorHtml = await FetchHtml(balanceAPI.CalculatorHtmlUrl);
calculatorHtml = calculatorHtml.toString().replaceAll("==CALCULATION==", calulatorResultsHtml);
calculatorHtml = calculatorHtml.toString().replaceAll('==CART==', balanceAPI.CartHtml);
calculatorHtml = await BuildProjectHtml(calculatorHtml);
calculatorHtml = await BuildNavigationHtml(calculatorHtml);
//Set the Calculator inner HTML
cal.innerHTML = calculatorHtml;
if (typeof c !== "undefined" && c != null) {
alert("Your transaction has been canceled")
window.location.replace(location.pathname);
}
if (typeof quoteParmId !== "undefined" && quoteParmId != null) {
Log("Quote id found");
OrderCompleted();
} else {
Settings();
//Set the default dsah steps
DashStepSettings();
SetNavigation();
ButtonEvents();
}
} else {
Log("element is missing from the page");
}
}
function InitFunctions() {
Log("InitFunctions");
$("#clevel-purchase").click(function() {
Log("Purchase click")
Purchase();
});
$("#clevel-balance-now").click(function() {
var element = document.getElementById("clevel-balance-section");
Log("Scoll to clevel-balance-section")
ScrollToResolver(element);
});
$('#clevel-balance-more').click(function() {
Log("Reload Page")
window.location.replace(location.pathname);
})
}
function Purchase() {
Log("Complete click");
var updateOffset = GetUpdateObject();
var url = "/v1/quote/update";
PostUpdate(url, updateOffset);
var url = balanceAPI.UpdateResponse.CheckOutUrl;
Log("CheckOutUrl" +url)
if (url == "invoice") {
var url = window.location.href.split(/[?#]/)[0];
url = url + "?oid=" + balanceAPI.QuoteDetails.QuoteId;
Log("redirect url:" + url);
window.location.replace(url);
}
Log("redirect url:" + url);
window.location.replace(url);
}
async function OrderCompleted() {
Log("Order complete");
var url = balanceAPI.ApiUrl + "/v1/quote/purchase/" +quoteParmId
var result = "";
result = await GetJSONFromAPI(url, result);
balanceAPI.QuoteDetails = result;
ShowComplete();
}
function ShowAddAnother() {
//Dont hid the calculator if we have an error.
if(balanceAPI.Error) {
balanceAPI.Error = false;//Reset error as it has been shown.
return;
}
$(".clevel-calculate").hide();
$(".clevel-offset").show();
$(".clevel-add-another").show();
if(balanceAPI.Step == ".clevel-step-calculation") {
return;
}
}
async function ShowCalculation() {
Log("ShowCalculation()");
balanceAPI.Error = false;
//Check we have item in
if(balanceAPI?.QuoteDetails == null) {
return;
}
balanceAPI.Step = ".clevel-step-calculation"
HideStep();
Log("BuildCart()");
await BuildCart();
await BuildCompleteCalculationHtml();
ShowStep();
ButtonEvents();
CartFunctions();
SetNavigation();
Settings();
//If we have a referance add it to the certificate name field
var referance = balanceAPI.Referance;
if(referance.length) {
document.getElementById('clevel-cert-name').value = referance;
}
}
async function ShowComplete() {
Log("ShowComplete()");
balanceAPI.Step = ".clevel-step-complete";
HideStep();
Log("BuildCart()");
await BuildCart();
await BuildCompleteCalculationHtml();
CartFunctions();
ShowStep();
$('.clevel-cart').hide();
$('.clevel-cart-complete').show();
}
async function BuildCompleteCalculationHtml() {
//Replace the calculation with a new blank one!
var calulatorResultsHtml = await FetchHtml(balanceAPI.HtmlRoot + "/html/calculation");
var newBlankCalculation = calulatorResultsHtml;
//Are we replacing the current cart?
var cartElement = document.getElementById("clevel-calculation-container");
Log("Calculator Element found:" +cartElement)
if(cartElement) {
$("#clevel-calculation-container").replaceWith(calulatorResultsHtml);
Log("Calculator Html: replaced")
}
//Replace all content
var cal = document.getElementById(balanceAPI.CalculatorElement);
var calHtml = "";
if (cal) {
var totalPrice = balanceAPI?.QuoteDetails?.TotalPrice;
if(balanceAPI?.QuoteDetails?.TotalPrice > 1)
{
totalPrice = totalPrice.toFixed(2)
}
calHtml = cal.innerHTML;
if(typeof balanceAPI.QuoteDetails.TotalTrees != "undefined" && balanceAPI.QuoteDetails.TotalTrees != 0) {
calHtml = calHtml.toString().replaceAll("==OFFSETH1==", "YOUR IMPACT");
calHtml = calHtml.toString().replaceAll("==OFFSETCTA==", "PLANT TREES");
calHtml = calHtml.toString().replaceAll("==OFFSETFINALCATH2==", "BALANCE MY IMPACT");
calHtml = calHtml.toString().replaceAll("==OFFSETTOTAL==", balanceAPI.QuoteDetails.TotalTrees);
calHtml = calHtml.toString().replaceAll("==OFFSETTOTALTEXT==", "TREE(S) PLANTED");
} else {
calHtml = calHtml.toString().replaceAll("==OFFSETH1==", "YOUR CARBON FOOTPRINT")
calHtml = calHtml.toString().replaceAll("==OFFSETCTA==", "BALANCE MY CARBON");
calHtml = calHtml.toString().replaceAll("==OFFSETFINALCATH2==", "BALANCE MY CARBON");
calHtml = calHtml.toString().replaceAll("==OFFSETTOTAL==", balanceAPI.QuoteDetails.Co2Total_Tonne);
calHtml = calHtml.toString().replaceAll("==OFFSETTOTALTEXT==", "TONNES CO2");
}
calHtml = calHtml.toString().replaceAll("==OFFSETTOTALCOST==", totalPrice);
var calHtmlWithEq = await SetEquivilance(calHtml);
Log("Calculator Replaced HTML");
var calWithProjects = await BuildProjectHtml(calHtmlWithEq);
var calWithNav = await BuildNavigationHtml(calWithProjects);
calWithNav = calWithNav.toString().replaceAll('==CART==', balanceAPI.CartHtml);
cal.innerHTML = calWithNav;
InitFunctions();
}
}
function CheckQuotePart(quoteType) {
if(balanceAPI?.QuoteDetails?.Quotes?.includes(quoteType)) {
return true;
}
return false;
}
function RequiredText(htmlElement) {
if(!balanceAPI.Error) {
htmlElement.removeClass("error");
}
var result = htmlElement.val();
if(result == null) {
balanceAPI.Error = true;
}
if (result.length === 0) {
balanceAPI.Error = true;
}
if(balanceAPI.Error) {
htmlElement.addClass("error");
htmlElement.focus();
return true;
}
return false;
}
function RequiredNumber(htmlElement) {
Log("RequiredNumber" +JSON.stringify(htmlElement));
if(!balanceAPI.Error) {
htmlElement.removeClass("error");
}
if(!RequiredText(htmlElement)) {
var result = htmlElement.val();
if ($.isNumeric(result)) {
return false;
}
balanceAPI.Error = true;
htmlElement.focus();
htmlElement.addClass("error");
return true;
}
return false;
}
/* START FilmLocations Cal */
function FilmLocationCalculate() {
var cal = {
Description: "Film Location Offset",
CountryCode: "GB",
CurrencyCode: "GBP",
Reference: balanceAPI.Referance
}
Log("Cal Referance Set:" +cal.Reference);
var _countryCode = $("#clevel-filmlocation-countrycode").val();
var _externalCrew = $("#clevel-filmlocation-externalcrew").val();
var _shootlocation = $("#clevel-filmlocation-location").val();
var _shootDuration = $("#clevel-filmlocation-duration").val();
var _localCrew = $("#clevel-filmlocation-localcrew").val();
cal.LocalCrew = Number(_localCrew);
cal.ExternalCrew = Number(_externalCrew);
cal.DurationDays = Number(_shootDuration);
cal.CountryCode = _countryCode;
cal.ShootCityLocation = _shootlocation;
//Validation
RequiredNumber($("#clevel-filmlocation-externalcrew"));
RequiredNumber($("#clevel-filmlocation-localcrew"));
RequiredNumber($("#clevel-filmlocation-duration"));
Log("filmlocation calculate complete");
PostCalculation("/v1/calculate/filmlocation", cal);
}
/* END FilmLocations Cal */
/* START FilmLights Cal */
function FilmLightsCalculate() {
var cal = {
CountryCode: "GB",
CurrencyCode: "GBP",
LightNumber: 1,
Reference: balanceAPI.Reference,
LightType: "Key",
DurationDays: 2
}
var _countryCode = $("#clevel-filmlights-countrycode").val();
var _lightingType = $("#clevel-filmlights-type").val();
var _shootlocation = $("#clevel-filmlights-shootlocation").val();
var _shootDuration = $("#clevel-filmlights-shootDuration").val();
var _totalLights = $("#clevel-filmlights-lights").val();
cal.LightNumber = Number(_totalLights);
cal.DurationDays = Number(_shootDuration);
Log("filmlights duration:" +cal.DurationDays);
cal.LightType = _lightingType;
Log("filmlights duration:" +cal.DurationDays);
cal.CountryCode = _countryCode;
cal.ShootLocation = _shootlocation;
//Validation
RequiredNumber($("#clevel-filmlights-shootDuration"));
RequiredNumber($("#clevel-filmlights-lights"));
Log("filmlights Calculate: complete");
PostCalculation("/v1/calculate/filmlights", cal);
}
/* END FilmLights Cal */
/* START FilmProduction Cal */
function FilmProductionCalculate() {
var cal = {
Description: "Film Production Offset",
CountryCode: "GB",
CurrencyCode: "GBP",
Reference: balanceAPI.Reference,
ProductionType: "Edit"
}
var _countryCode = $("#clevel-filmproduction-countrycode").val();
var _productionType = $("#clevel-accommodation-type").val();
var _officeLocation = $("#clevel-filmproduction-officelocation").val();
var _durationDays = $("#clevel-filmproduction-duration").val();
var _totalPeople = $("#clevel-filmproduction-staff").val();
cal.TotalPeople = Number(_totalPeople);
cal.DurationDays = Number(_durationDays);
cal.ProductionType = _productionType;
cal.CountryCode = _countryCode;
cal.OfficeLocation = _officeLocation;
//Validation
RequiredNumber($("#clevel-filmproduction-duration"));
RequiredNumber($("#clevel-filmproduction-staff"));
Log("filmproduction Calculate: complete");
PostCalculation("/v1/calculate/filmproduction", cal);
}
/* END FilmProduction */
/* START Electricity Cal */
function ElectricCalculate() {
var cal = {
Description: "Electricity Offset",
CountryCode: "GB",
Amount: 1000,
Reference: balanceAPI.Reference,
CurrencyCode: "GBP"
}
var _ammount = $("#clevel-electric-amount").val();
var _countryCode = $("#clevel-electric-countrycode").val();
cal.CountryCode = _countryCode;
cal.Amount = Number(_ammount);
//Check validation
RequiredNumber($("#clevel-electric-amount"));
Log("Electricity Calculate: complete");
PostCalculation("/v1/calculate/electricity", cal);
}
/* END Electric */
/* START Gas Cal */
function GasCalculate() {
var cal = {
Description: "Gas Offset",
CountryCode: "UK",
Unit: "kwh",
Amount: 1000,
Reference: balanceAPI.Reference,
CurrencyCode: "GBP"
}
var _amount = $("#clevel-gas-amount").val();
var _unitChecked = $("#btn-gas-m3").attr("checked");
if (_unitChecked === "checked") {
cal.Unit = "m3";
}
cal.Amount = Number(_amount);
Log("Gas Calculate: complete");
//Check validation
RequiredNumber($("#clevel-gas-amount"));
PostCalculation("/v1/calculate/gas", cal);
}
function GasSettings() {
$(".clevel-gas-unit").click(function () {
$(".clevel-gas-unit").removeClass('bg-colour-one');
$(".clevel-gas-unit").removeAttr("checked");
$(this).addClass('bg-colour-one');
$(this).attr('checked', 'checked');
})
}
/* END Gas */
/* START PerCapita Cal */
function PerCapitaCalculate() {
var cal ={
CountryCode: "GB",
TotalPeople: 1,
Reference: balanceAPI.Reference,
CurrencyCode: "GBP"
}
var _people = $("#clevel-percapita-people").val();
cal.TotalPeople = Number(_people);
var _countryCode = $("#clevel-percapita-country").val();
cal.CountryCode = _countryCode;
Log("PerCapita Calculate: complete");
//Check validation
RequiredNumber($("#clevel-percapita-people"));
PostCalculation("/v1/calculate/percapita", cal);
}
/* END PerCapita Cal */
/* START Tree Cal */
function TreeCalculate() {
var cal = {
Trees: 1,
Reference: "",
CurrencyCode: "GBP",
Reference: balanceAPI.Reference
}
var _treesToPlant = $("#clevel-tree-amount").val();
cal.Trees = Number(_treesToPlant);
//Check validation
RequiredNumber($("#clevel-tree-amount"));
//only post if no error
Log("Tree Calculate: complete");
PostCalculation("/v1/calculate/planttrees", cal);
}
/* END Tree Cal */
/* START Business Cal */
function BusinessCalculate() {
Log("Business Calculate: start");
var cal = {
FromDate:"2023/01/01",
ToDate:"2023/01/01",
CountryCode:"UK",
OrganisationSize:"",
HomeEmployee:1,
OfficeEmployee:1,
OfficeSizem2:200,
HomeWorkPercentage:50,
Reference:""
}
//Populate
var _fromMonth = $("#clevel-business-frommonth").val();
var _fromYear = $("#clevel-business-fromyear").val();
cal.ToDate = _fromYear + '-' + formatZeroPadding(_fromMonth) + '-01';
var _toMonth = $("#clevel-business-tomonth").val();
var _toYear = $("#clevel-business-toyear").val();
cal.ToDate = _toYear + '-' + formatZeroPadding(_toMonth) + '-01';
var _organisation = $("#clevel-business-org").val();
cal.OrganisationSize = _organisation;
//Check validation
Log("#clevel-clientref");
RequiredText($("#clevel-clientref"));
Log("#clevel-business-peoplehome");
RequiredNumber($("#clevel-business-peoplehome"));
Log("#clevel-business-homepercent");
RequiredNumber($("#clevel-business-homepercent"));
Log("#clevel-business-peopleoffice");
RequiredNumber($("#clevel-business-peopleoffice"));
Log("#clevel-business-officesizem2");
RequiredNumber($("#clevel-business-officesizem2"));
var _clientRef = $("#clevel-clientref").val();
cal.Reference = _clientRef;
var _peopleHome = $("#clevel-business-peoplehome").val();
cal.HomeEmployee = Number(_peopleHome);
var _peopleOffice = $("#clevel-business-peopleoffice").val();
cal.OfficeEmployee = Number(_peopleOffice);
var _officeSize_m2 = $("#clevel-business-officesizem2").val();
cal.OfficeSizem2 = Number(_officeSize_m2);
var _homePercent = $("#clevel-business-homepercent").val();
cal.HomeWorkPercentage = Number(_homePercent);
Log("Business Calculate: complete");
PostCalculation("/v1/calculate/business", cal);
}
function BusinessSettings() {
}
/* END Carbon */
/* START Car Cal */
function CarCalculate() {
var cal = {
Size: "Small",
Type: "Petrol",
Distance: 1,
Reference: balanceAPI.Reference,
DistanceMeasurement: "Km"
}
//Populate
var _carSize = $("#clevel-car-size").val();
var _carType = $("#clevel-car-type").val();
cal.Size = _carSize;
cal.Type = _carType;
var _unitChecked = $("#btn-miles").attr("checked");
if (_unitChecked === "checked") {
cal.DistanceMeasurement = "Miles";
}
var _Distance = $("#clevel-car-distance").val();
cal.Distance = Number(_Distance);
//Check validation
RequiredNumber($("#clevel-car-distance"));
Log("Car Calculate: complete");
PostCalculation("/v1/calculate/car", cal);
}
function CarSettings() {
$(".clevel-car-unit").click(function () {
$(".clevel-car-unit").removeClass('bg-colour-one');
$(".clevel-car-unit").removeAttr("checked");
$(this).addClass('bg-colour-one');
$(this).attr('checked', 'checked');
})
}
/* END Carbon */
/* START Carbon Cal */
function CarbonCalculate() {
var cal = {
Description: "Carbon offset",
Unit: "Kg",
Co2Amount: 1,
Reference: balanceAPI.Reference,
CurrencyCode: "GBP"
}
var _co2Ammount = $("#clevel-carbon-amount").val();
var _unitChecked = $("#btn-tonne").attr("checked");
if (_unitChecked === "checked") {
cal.Unit = "Tonne";
}
cal.Co2Amount = Number(_co2Ammount);
//Check validation
RequiredNumber($("#clevel-carbon-amount"));
Log("Carbon Calculate: complete");
PostCalculation("/v1/calculate/carbon", cal);
}
function CarbonSettings() {
$(".clevel-carbon-unit").click(function () {
$(".clevel-carbon-unit").removeClass('bg-colour-one');
$(".clevel-carbon-unit").removeAttr("checked");
$(this).addClass('bg-colour-one');
$(this).attr('checked', 'checked');
})
}
/* END Carbon */
//API Calls
/* START Accommodation */
function AccommodationCalculate() {
var cal = {
Guests: 1,
Nights: 1,
AccomodationType: "Hotel",
CountryCode:"UK",
Reference: balanceAPI.Reference,
CurrencyCode: "GBP"
}
//Populate
var _guests = $("#clevel-accommodation-guests").val();
var _countryCode = $("#clevel-accommodation-countrycode").val();
var _nights = $("#clevel-accommodation-nights").val();
var _accomodationType = $("#clevel-accommodation-type").val();
cal.Guests = Number(_guests)
cal.Nights = Number(_nights)
cal.CountryCode = _countryCode
cal.AccomodationType = _accomodationType
Log("AccommodationCalculate: complete");
//Check validation
RequiredNumber($("#clevel-accommodation-nights"));
RequiredNumber($("#clevel-accommodation-guests"));
PostCalculation("/v1/calculate/accommodation", cal);
}
/* END Accommodation */
/* START Flight Functions */
async function FlightSettings() {
if (balanceAPI.Calculator == "Flight" || balanceAPI.Calculator == "Travel" || balanceAPI.Calculator == "Film") {
SetBloodHound();
SetAutoComplete($('#clevel-from'));
SetAutoComplete($('#clevel-to'));
$(".clevel-flight-trip").off("click.clevelFlightTrip").on("click.clevelFlightTrip", function () {
$(".clevel-flight-trip").removeClass('bg-colour-two');
$(".clevel-flight-trip").removeAttr("checked");
$(this).addClass('bg-colour-two');
$(this).attr('checked', 'checked');
})
}
$("#clevel-from").off("focusout.clevelAirport").on("focusout.clevelAirport", function () {
var result = CheckIataCode($("#clevel-from"));
Log("clevel-to check:" +result);
});
$("#clevel-to").off("focusout.clevelAirport").on("focusout.clevelAirport", function () {
var result = CheckIataCode($("#clevel-to"));
Log("clevel-to check:" +result);
});
}
function FlightCalculate() {
var cal = {
IataCodes: [],
IsReturn: false,
Passengers: 1,
Class: "Economy",
Reference: balanceAPI.Reference,
CurrencyCode: "GBP"
}
//Populate
var _fromAirport = GetAirportDisplayValue($("#clevel-from"));
var _passangerNumber = $("#clevel-passengers").val();
var _toAirport = GetAirportDisplayValue($("#clevel-to"));
var _roundTrip = $("#btn-return").attr("checked");
var _flightClass = $("#clevel-flightclass").val();
var _fromIataCode = GetAirportSelectedCode($("#clevel-from"));
var _toIataCode = GetAirportSelectedCode($("#clevel-to"));
if (!CheckIataCode($("#clevel-from"))) {
if(balanceAPI.QuoteDetails == null) {
alert("Error on FROM airport, Please use three letter airport code or autocomplete.");
$("#clevel-from").focus();
balanceAPI.Error = true;
return;
}
}
if (!CheckIataCode($("#clevel-to"))) {
if(balanceAPI.QuoteDetails == null) {
alert("Error on TO airport, Please use three letter airport code or autocomplete.");
$("#clevel-to").focus()
balanceAPI.Error = true;
return;
}
}
if (isNaN(_passangerNumber)) {
alert("Passanger number is not a number");
return;
}
if (_roundTrip === "checked") {
cal.IsReturn = true;
}
cal.IataCodes = [_fromIataCode, _toIataCode]
cal.Passengers = _passangerNumber;
cal.Class = _flightClass;
Log("FlightCalculate: complete");
Log("From IATSA Code:" +_fromIataCode)
PostCalculation("/v1/calculate/flight", cal);
//Clear the form
ClearAirportField($("#clevel-from"));
$("#clevel-passengers").val(1);
ClearAirportField($("#clevel-to"));
}
function ClearAirportField(htmlElement) {
if (!htmlElement || !htmlElement.length) {
return;
}
ClearAirportSelectionState(htmlElement);
UpdateAirportFieldState(htmlElement, "");
if (htmlElement[0].tomselect) {
htmlElement[0].tomselect.clear(true);
htmlElement[0].tomselect.clearOptions();
htmlElement[0].tomselect.control_input.value = "";
return;
}
htmlElement.val(null);
}
function CheckIataCode(htmlElement) {
UpdateAirportFieldState(htmlElement, "");
var airport = GetAirportDisplayValue(htmlElement);
var iataCode = GetAirportSelectedCode(htmlElement);
if (!iataCode) {
var check = true;
//Check if IATA codes passed in query string.
if (typeof clevelFlightFrom !== "undefined" && clevelFlightFrom !== null) {
check = false;
}
if (typeof clevelFlightTo !== "undefined" && clevelFlightTo !== null) {
check = false;
}
if (check) {
UpdateAirportFieldState(htmlElement, "error");
return false;
}
}
if (iataCode) {
var url = balanceAPI.ApiUrl + "/v1/airport/details/" + iataCode
var result = GetJQueryAPICall(url);
Log("IATACode:" +JSON.stringify(result));
if(result == null) {
airportData = null;
UpdateAirportFieldState(htmlElement, "error");
} else {
airportData = result;
if (!htmlElement.data("selected-iata")) {
SetAirportSelectionState(htmlElement, {
value: iataCode,
label: iataCode + " - " + result.AirportName
});
}
UpdateAirportFieldState(htmlElement, "success");
}
}
return true;
}
/* END Flight Functions */