/* jshint esversion: 8 */
addEventListener("load", (event) => {
	$(".dropdown-button").click(function(event){
		event.stopPropagation();
		$(this).closest(".dropdown-button-container").find(".dropdown-menu").toggle();
	});
	$(document).click(function(){
		console.log(this);
		$(".dropdown-button-container .dropdown-menu").hide();
	});
	if ($("form[name='bokmarkeform']").height() == 0){
		$("form[name='bokmarkeform']").css("margin", "0");
	}
//	$("#sidemenu").addClass("retracted");
	$("#sidemenu .sidemenu-main").on("click", function(){
		$element = $(this);
		$element.toggleClass("expanded");
		$("#sidemenu .sidemenu-main").not(this).removeClass("expanded");
		$("#sidemenu .sidemenu-submenu").not($element.next(".sidemenu-submenu")).slideUp(400);
		$element.next(".sidemenu-submenu").slideToggle(400);
		//$element.next(".sidemenu-submenu").toggleClass("expanded");
		console.log($element);
	});
	$("#sidemenu .expand-menu-container > div").on("click", function(){
		$element = $(this).closest("#sidemenu");
		$element.toggleClass("retracted");
	});
	var footer = document.getElementsByClassName('page-footer')[0];
	var documentHeight = document.body.scrollHeight;
	var viewportHeight = window.innerHeight;

	if (documentHeight > viewportHeight) {
		footer.style.marginRight = "calc(var(--body-padding) * -1)";
		footer.style.bottom = '0';
		footer.style.marginBottom = "-100px";

	} else {
		footer.style.position = 'fixed';
		footer.style.bottom = '0';
	}

});

function adjustFooter() {
	document.addEventListener('mouseover', function() {
		var footer = document.getElementsByClassName('page-footer')[0];
		var documentHeight = document.body.scrollHeight;
		var viewportHeight = window.innerHeight;

		if (documentHeight > viewportHeight) {
			footer.style.position = 'unset';
			footer.style.bottom = '0';
			footer.style.marginRight = "calc(var(--body-padding) * -1)";
		} else {
			footer.style.position = 'fixed';
			footer.style.bottom = '0';
			footer.style.marginTop = '15vh';
			footer.style.marginRight = "calc(var(--body-padding) * -1)";
		}
	});
}

/**
 * Gör en submit på searchform, efter att ha gjort en reset på ev övriga combos för fastighet m.m.
 */
function onChangeBolagsid() {
	const searchform = document.forms['searchform'];
	if (!searchform)
	{
		console.warn('Ett formulär som heter searchform förväntas. Automatisk change-hantering skippas.');
		return;
	}
	const searchResult = searchform.querySelector('select#id_fhid');
	if (searchResult)
	{
		searchResult.selectedIndex = 0
		onChangeFhid();
	}
	else
	{
		searchform.submit();
	}
}

function onChangeFhid()
{
	const searchform = document.forms['searchform'];
	if (!searchform)
	{
		console.warn('Ett formulär som heter searchform förväntas. Automatisk change-hantering skippas.');
		return;
	}
	const searchResult = searchform.querySelector("select#id_byggnadsid");
	if (searchResult)
	{
		searchResult.selectedIndex = 0
		onChangeByggnadsid();
	}
	else
	{
		searchform.submit();
	}
}

function onChangeByggnadsid()
{
	const searchform = document.forms['searchform'];
	if (!searchform)
	{
		console.warn('Ett formulär som heter searchform förväntas. Automatisk change-hantering skippas.');
		return;
	}
	const searchResult = searchform.querySelector("select#id_hoid");
	if (searchResult)
	{
		searchResult.selectedIndex = 0
		onChangeHoid();
	}
	else
	{
		searchform.submit();
	}
}

function onChangeHoid()
{
	const searchform = document.forms['searchform'];
	if (!searchform)
	{
		console.warn('Ett formulär som heter searchform förväntas. Automatisk change-hantering skippas.');
		return;
	}
	searchform.submit();
}

function onNumberKeyPress(e, input, signed, precision, scale)
{
	var prefix = "";
	if (signed)
		prefix = "-|";
	var regexStr = prefix + "\\d|[\\.,]";
	var ret = (onKeyPress(e, new RegExp(regexStr)));
	var length = precision;
	if (scale > 0)
		length += scale + 1;
	if (signed)
		length++;
	ret = ret && checkLength(e, input.value, length);
	return ret;
}
function validateEmail(email)
{
	if (email === '')
	{
		return true;
	}

	// notera: "epost(; epost)*" dvs semikolonseparerad lista (med valfria mellanslag emellan)
	// i efter avslutande / anger case insensitive, men email.toLowercase() känns mer lättläst/uppenbart
	const validRegex = /^[a-z0-9._%+-]+@[a-z0-9.-]+.[a-z]{2,6}(; *[a-z0-9._%+-]+@[a-z0-9.-]+.[a-z]{2,6})*$/;
	if(!validRegex.test(email.toLowerCase()))
	{
		alert("Ogiltig epost");
		return false;
	}
	return true;
}
function validateNumber(name, input, signed, precision, scale, max)
{
	var value = input.value;
	value = value.replace(/ /g, '');
	if (signed == null)
		signed = false;
	if (precision == null)
		precision = 10;
	if (scale == null)
		scale = 0;
	var regexps = new Array();
	var prefix = "";
	if (signed)
		prefix = "-?";
	var regexpStr = prefix + "\\d{0," + precision + "}";
	regexps[0] = new RegExp(regexpStr);
	if (scale > 0) {
		regexps[1] = new RegExp(regexpStr + "[\\.,]\\d{0," + scale + "}");
	}
	ret = validate(name, input, regexps, value);
	if (!ret) return false;
	if (max != null) {
		if (value > max) {
			alert("Max värde är " + max);
			input.focus();
			return false;
		}
	}
	return true;
}


const luhnCheck = num => {
	if(num=="-")
		return true;
	num = num.replace(/[^0-9]/, '');
	let arr = (num + '')
		.split('')

		.reverse()
		.map(x => parseInt(x));
	let lastDigit = arr.splice(0, 1)[0];
	let sum = arr.reduce((acc, val, i) => (i % 2 !== 0 ? acc + val : acc + ((val * 2) % 9) || 9), 0);
	sum += lastDigit;
	return sum % 10 === 0;
};

function isValidIBANNumber(input) {
	var CODE_LENGTHS = {
		AD: 24, AE: 23, AT: 20, AZ: 28, BA: 20, BE: 16, BG: 22, BH: 22, BR: 29,
		CH: 21, CR: 21, CY: 28, CZ: 24, DE: 22, DK: 18, DO: 28, EE: 20, ES: 24,
		FI: 18, FO: 18, FR: 27, GB: 22, GI: 23, GL: 18, GR: 27, GT: 28, HR: 21,
		HU: 28, IE: 22, IL: 23, IS: 26, IT: 27, JO: 30, KW: 30, KZ: 20, LB: 28,
		LI: 21, LT: 20, LU: 20, LV: 21, MC: 27, MD: 24, ME: 22, MK: 19, MR: 27,
		MT: 31, MU: 30, NL: 18, NO: 15, PK: 24, PL: 28, PS: 29, PT: 25, QA: 29,
		RO: 24, RS: 22, SA: 24, SE: 24, SI: 19, SK: 24, SM: 27, TN: 24, TR: 26,
		AL: 28, BY: 28, CR: 22, EG: 29, GE: 22, IQ: 23, LC: 32, SC: 31, ST: 25,
		SV: 28, TL: 23, UA: 29, VA: 22, VG: 24, XK: 20
	};
	var iban = String(input).toUpperCase().replace(/[^A-Z0-9]/g, ''), // keep only alphanumeric characters
		code = iban.match(/^([A-Z]{2})(\d{2})([A-Z\d]+)$/), // match and capture (1) the country code, (2) the check digits, and (3) the rest
		digits;
	// check syntax and length
	if (!code || iban.length !== CODE_LENGTHS[code[1]]) {
		return false;
	}
	// rearrange country code and check digits, and convert chars to ints
	digits = (code[3] + code[1] + code[2]).replace(/[A-Z]/g, function (letter) {
		return letter.charCodeAt(0) - 55;
	});
	// final check
	return mod97(digits) === 1;
}

function mod97(string) {
	var checksum = string.slice(0, 2), fragment;
	for (var offset = 2; offset < string.length; offset += 7) {
		fragment = String(checksum) + string.substring(offset, offset + 7);
		checksum = parseInt(fragment, 10) % 97;
	}
	return checksum;
}



function onMoneyKeyPress(e, input, signed, size)
{
	return onNumberKeyPress(e, input, signed, size, 2);
}

function validateMoney(name, input, signed, size)
{
	return validateNumber(name, input, signed, size, 2);
}

function onTimeKeyPress(e, input)
{
	var regexp = /\d|[:\.]/;
	return onKeyPress(e, regexp);
}

function validateTime(name, input)
{
	var regexp = /^\d{1,2}[:][0-5][0-9]$/;
	var ret = validate(name, input, regexp);
	return ret;
}

function onDateKeyPress(e, input)
{
	var regexp = /\d|-/;
	return onKeyPress(e, regexp);
}

function validateDate(name, input)
{
	if (input.value == '')
		return true;
	var regexp = /\d{2,4}-?\d{2}-?\d{2}/;
	var ret = validate(name, input, regexp);
	if (!ret) {
		return false;
	}
	var ret = checkValidDate(input.value);
	if (!ret) {
		alert(name + ' är inte ett korrekt datum!');
		input.focus();
	}
	return ret;
}

function onPersonorgnrKeyPress(e, input)
{
	if (!checkLength(e, input.value, 11))
		return false;
	var regexp = /\d|-/;
	return onKeyPress(e, regexp);
}

function validatePersonorgnr(name, input)
{
 if (input.value == '')
   return true;
 var regexp = /\d{6}-?\d{4}/;
 var ret = validate(name, input, regexp, null, false);

 if (!ret) {
   var ret = confirm(name + ' har felaktigt format!');
   if (ret) {
     return true;
   } else {
	 input.focus();
	 return false;
   }
 }

 if (ret) {
	 ret = validateChecksiffra(input.value);
  }
 if (!ret) {
	 ret = confirm(name + ' har felaktig checksiffra!');
 }

 if (ret)
	 return true;

 input.focus();
 return false;
}

function validateFileSize(fileInput, maxFileSize, maxTotalSize, filstorlekMsg, totStorlekMsg) {
	if (!window.FileReader) {
		// funktionalitet finns inte
		return true;
	}

	const files = fileInput['files'];
	let totalSize = 0;
	for(const file of files) {
		/*
		 	File
				lastModified: 1560472975000
				name: "Landscapes 03.jpg"
				size: 8782022
				type: "image/jpeg"
				webkitRelativePath: ""
		 */
		const fileSize = file.size;
		if (fileSize > maxFileSize) {
			alert(file.name + ": " + filstorlekMsg);
			return false;
		}
		totalSize += fileSize;
	}
	if (totalSize > maxTotalSize) {
		if (files.length === 1) {
			alert(filstorlekMsg);
		} else {
			alert(totStorlekMsg);
		}
		return false;
	}
	return true;
}

function validate(namn, input, regexp, value, showerror)
{
	if (showerror == null)
		showerror = true;
	if (value == null)
		value = input.value;
	if (value == '')
		return true;
	if (regexp instanceof Array) {
		for (var i=0; i < regexp.length; i++) {
			if (checkRegexp(value, regexp[i]))
				return true;
		}
	} else {
		if (checkRegexp(value, regexp))
			return true;
	}
	if (showerror)
		showValidationError(namn, input);

	return false;
}

function showValidationError(name, input)
{
	alert(name + ' har felaktigt format!');
	input.focus();
}

function onKeyPress(e, regex)
{
	if (isSpecialKey(e))
		return true;
	return regex.test(getCh(e));
}

function getCh(e)
{
	var key = window.event ? e.keyCode : e.which;
	if (isSpecialKey(e))
		return null;
	return String.fromCharCode(key);
}

function checkRegexp(value, regex)
{
	var ret = value.match(regex) == value;
	return ret;
}

function isSpecialKey(e)
{
	var key = window.event ? e.keyCode : e.which;
	return (key == 8 || key == 0 || key == 13 || key == 10 || key == 9);
}

function checkLength(e, value, length)
{
	var key = window.event ? e.keyCode : e.which;
	if (key == 8 || key == 0 || key == 13 || key == 10)
		return true;
	return value.length < length;
}

function checkValidDate(input)
{
	var parts = input.split("-");
	var yearfield;
	var monthfield = null;
	var dayfield = null;
	if (parts.length == 1) {
		var date = parts[0];
		if (date.length == 8) {
			yearfield = date.substring(0,4);
			monthfield = date.substring(4,6);
			dayfield = date.substring(6,8);
		} else {
			yearfield = date.substring(0,2);
			yearfield += 2000;
			monthfield = date.substring(2,4);
			dayfield = date.substring(4,6);
		}
		monthfield--;
	} else {
		yearfield = parts[0];
		if (parts.length > 1) {
			monthfield = parts[1]-1;
		}
		if (parts.length > 2) {
			dayfield = parts[2];
		}
	}
 	if (monthfield != null) {
		if (monthfield.length > 0 && (monthfield < 0 || monthfield > 12)) {
			return false;
		}
	}
	if (dayfield != null) {
		if (dayfield.length > 0) {
			var dayobj = new Date(yearfield, monthfield, dayfield);
			//alert('month: '+ dayobj.getMonth() + ' : ' + monthfield);
			//alert('day: '+ dayobj.getDate() + ' : ' + dayfield);
			//alert('year: '+ dayobj.getFullYear() + ' : ' + yearfield);
			if ((dayobj.getMonth()!=monthfield)||(dayobj.getDate()!=dayfield)||(dayobj.getFullYear()!=yearfield))
				return false;
		}
	}
	return true;
}

function iscompressed()
{
	//
	// Kolla om det finn en komprimerat bild i formuläret
	let packadbild = document.getElementById("bildobjekt");
	if (packadbild) {
		// Om det finns en bild, hitta objektet för "file input"
		let fileinputnamn = document.getElementById("id_bildobjekt");
		if(fileinputnamn){
			// Fältet finns, rensa det, ursprungsbilden skickas inte.
			let inputfaltet = document.getElementById("id_"+fileinputnamn.value);
			inputfaltet.value=null;
		}
	}
}

function compresspic(inp,formname)
{
	if (!inp.files[0])
		return;
	let imageFile = inp.files[0];
	var reader = new FileReader();

	reader.onload = function (e)
	{
		//
		// sug in bilden, bygg en målarduk, förminska bilden, lägg den på duken, spara duken i formulärat.
		//
		var img = document.createElement("img");
		img.onload = function (event)
		{
			//
			//  Bestäm storlek på målarduken
			//
			var width = img.width;
			var height = img.height;
			var ratio= width/height;
			var MAX_WIDTH = 2000;
			var MAX_HEIGHT = MAX_WIDTH * ratio;
			if (width > height)
			{
				if (width > MAX_WIDTH)
				{
					height = height * (MAX_WIDTH / width);
					width = MAX_WIDTH;
				}
			}
			else
			{
				if (height > MAX_HEIGHT)
				{
					width = width * (MAX_HEIGHT / height);
					height = MAX_HEIGHT;
				}
			}
			//
			// Skapa målarduken
			//
			var canvas = document.createElement("canvas");
			canvas.width = width;
			canvas.height = height;
			var ctx = canvas.getContext("2d");
			//
			// Fyll duken med bilden
			//
			ctx.drawImage(img, 0, 0, width, height);

			var dataurl = canvas.toDataURL(imageFile.type);
			//
			// Skapa ett gömt objekt med den komprimerade bilden i "vårt" FORM
			//
			var bilden = document.createElement("input");
			bilden.setAttribute("type", "hidden");
			bilden.setAttribute("name", "bildobjekt");
			bilden.setAttribute("id", "bildobjekt");
			bilden.setAttribute("value", dataurl);
			formular = document.getElementsByName(formname)[0];
			formular.appendChild(bilden);
		}
		img.src = e.target.result;
	}
	reader.readAsDataURL(imageFile);
}

// sleep time expects milliseconds
function sleep (time) {
	return new Promise((resolve) => setTimeout(resolve, time));
}

function filesize(inp, formname, max, submit, name) {
	//
	// För stora filer får vi inte ladda upp
	//
	let photosize = inp.files[0].size;
	document.getElementsByName('save')[0].disabled = true;
	if (photosize > max) {
		alert('Filen är för stor');
		document.getElementsByName('save')[0].disabled = true;
		return;
	}
	//
	// Submit används i mobila gränssnittet.
	// I nuläget skapar vi bara en klientbaserad komprimerad bild vid submit
	// Vi måste rensa inputfältet med filnamnet innan submit.
	// Framgent ska det göras i en trigger "submit" knappen, men det kräver en större insats.
	// Just nu görs det exakt innan  submit om det finns ett fält "bildobjekt" med en komprimerad bild i formulkäret.
	//
	if(submit)
		compresspic(inp,formname);
	// En liten fördröjning behövs för att bilden ska hinna packas ihop och läggas i formuläret (Går att fixa till snyggare, men lite bökigt)
	sleep(300).then(() => {
		let finnsbild = document.getElementById("bildobjekt");
		if (finnsbild) {
			//
			// Mobillösningen, nollställ ursprungsbilden
			//
			let bildinput = document.getElementById("id_"+name);
			if(bildinput){
				bildinput.value=null;
			}
			//
			// Framtiden:
			// Skapa ett "hidden field" men namnet på inputfältet sparat i objektet "id_bildobjekt"
			// Den används senare när man trycker på "spara". Då rensas "fileinput" vid sändningsögonblicket
			// Annars så det mystiskt ut (Ingen bild laddad, men vi skickar en komprimerad lik förbannat....)
			// Rensar vi inte fältet skickas både den komprimerade och orginalet.
			/*
			var bildnamn = document.createElement("input");
			bildnamn.setAttribute("type", "hidden");
			bildnamn.setAttribute("id", "id_bildobjekt");
			bildnamn.setAttribute("value", name);
			formular = document.getElementsByName(formname)[0];
			formular.appendChild(gollum);
			*/

		}
		if (submit) {
			document.getElementsByName(formname)[0].submit();
		} else
			document.getElementsByName('save')[0].disabled = false;
	})
/*
	sleep(300).then(() =>
	{
	}); */
}

/**
 * @param buttonClicked  Måste vara av type=submit, och isf kommer name=value på den att läggas till i formuläret som skickas
 * @param formname
 * @returns {Promise<Response>}
 */
async function asyncPOSTform(buttonClicked = null, formname = 'postform')
{
	const data = prepSubmitDataFromForm(buttonClicked, formname).toString();
	return asyncPOST(data);
}

/**
 * @returns {Promise<Response>}
 */
async function asyncPOST(data, dest = 'ajaxserver.php')
{
	const response = fetch(dest, {
		method: 'POST',
		body: data,
		headers:
		{
			'Content-Type': 'application/x-www-form-urlencoded',
		}
	});
	return response;
}

function prepSubmitDataFromForm(buttonClicked = null, formname = 'postform')
{
	return form2urlparams(formname, buttonClicked);
}

function form2urlparams(formname = 'postform', buttonClicked = null)
{
	const form = document.getElementsByName(formname)[0];
	let data = new FormData(form, buttonClicked);
	data = new URLSearchParams(data);  // Funkar med eller utan denna, men blir lite mer kompakt o läsbart med. Kräver headern 'Content-Type: application/x-www-form-urlencoded'.
	return data;
}

// TODO AJAX: Oklart om denna borde blanda in formulär över huvud taget. Öppet för diskussion.
function prepSubmitData(buttonClicked = null, additionalParams = {}, formname = 'postform')
{
	const data = prepSubmitDataFromForm(buttonClicked, formname);
	for (const property in additionalParams)
	{
		data.append(property, additionalParams[property]);
	}
	return data;
}

/**
 *
 * @param response fetch() response
 * @param msgarea HTML ID för där meddelandet ska visas, annars blir det en alert
 * @returns {Promise<void>}
 * @see showErrMsg för default msgarea m.m.
 */
async function handleAjaxError(response, msgarea = '')
{
	const text = await response.text();
	let msg = 'Tyvärr, ett fel uppstod';
	if (`${text}`.length > 0) // kan hända att det inte är det om det skiter sig riktigt
	{
		const svar = JSON.parse(text);
		console.error('felkod: ', svar.code, ' feltext: ', svar.description);
		msg = svar.description;
	}

	if (msgarea === '') {
		showErrMsg(msg);
//		showErrMsg(utf2latin(msg)); // TODO FEL: behövs ibland...
	} else {
		showErrMsg(msg, msgarea);
//		showErrMsg(utf2latin(msg), msgarea); // TODO FEL: behövs ibland...
	}
}

/**
 * Hantera filer nedladdade via async-anrop. Tar hänsyn till om servern föredrar visa eller spara på disk direkt.
 *
 * __OBS!__ Förutsätter:
 * - Att man redan innan kollat response.ok
 * - Att headern Content-Disposition är satt med attachment/inline och i fallet attachment även filnamn
 *
 * @param response
 * @returns {Promise<void>}
 */
async function downloadFromResponse(response)
{
	"use strict";
	const data = await response.blob();
	const blob = new Blob([data]);

	let disposition = response.headers.get('Content-Disposition');
	disposition = disposition.split('filename='); // finns det inte så får man hela i array[0], så det funkar även för 'inline' då filnamn inte blir relevant
	const howToHandle = disposition[0].replaceAll(' ', '').replaceAll(';', '');

	const link = document.createElement('a');
	link.style.display = 'none';
	link.href = window.URL.createObjectURL(blob);

	const body = document.getElementsByTagName('body')[0];
	body.insertAdjacentElement('beforeend', link);
	switch (howToHandle)
	{
		case 'attachment':
			const filename = disposition[1].replaceAll("'", '').replaceAll('"', '');
			link.download = filename;
			break;

		case 'inline':
			link.removeAttribute('download'); // eftersom vi återanvänder elementet istf skapa o ta bort varje gång
			break;
	}
	link.click();
}


function suggest(e, name, str, url) {
	var key = window.event ? e.keyCode : e.which;
	if (key == 9 || key == 16 || key == 37 || key == 39)
		return;
	if (str.length == 0)
		return;
	url += '&name=' + name + '&value=' + str;

	handler = function(req) {
		var ss = document.getElementById(name + '_suggest')
		ss.innerHTML = req.responseText;
		ss.style.visibility = "visible";
		ss.style.zIndex = "999";
	}

	AjaxRequest.get({
		"url": url,
		"onSuccess": handler
	});
}

function setSuggestion(name, value) {
	document.getElementById(name).value = value;
	ss = document.getElementById(name + '_suggest');
	ss.innerHTML = '';
	ss.style.visibility = "hidden";
}

function hideSuggestion(name) {
	ss = document.getElementById(name + '_suggest');
	ss.innerHTML = '';
	ss.style.visibility = "hidden";
}

function validateChecksiffra(penr)
{
  penr = penr.replace('-', '');
  var numbers = penr.match(/^(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)$/);
  var checkSum = 0;

  if (numbers == null) { return false; }
  var tmp;
  for (var i = 1; i < 10 ; i++)
  {
    if (i % 2 == 0) {
      var x = parseInt(numbers[i]);
      checkSum += x;
    } else {
      var x = numbers[i]*2;
      var x2 = x % 10;
      var x1 = (x - x2) / 10;
      if (x1 > 0) {
      	checkSum += x1;
      }
      checkSum += x2;
    }
  }
  var last = checkSum % 10;
  if (last > 0)
  	last = 10 - last;
  return (numbers[10] == last);
}

function validateMandatory(label, input)
{
	if (input.value == '') {
		alert(label + ' är obligatoriskt!');
		return false;
	}
	return true;
}

function setPostort(postnr, postort, landsprefix, div_landsprefix)
{
	AjaxRequest.get({
		"url": "../register/ajaxserver.php?action=getPostort&postnr=" + postnr.value,
		"onSuccess": function(req) {
			postort.value = req.responseText;
		}
	});
	changeAjaxCombo(postnr, document.getElementById(div_landsprefix),
		"../register/ajaxserver.php?action=getLandsprefix&landsprefix="+landsprefix);
}

function changeAjaxCombo(source, destination, url)
{
	if (destination == null)
		return;
	url += '&value=' + source.value;

	handler = function(req) {
		destination.innerHTML = req.responseText;
	}

	AjaxRequest.get({
		"url": url,
		"onSuccess": handler
	});
}

function showHelp(page)
{
	helpWin = window.open(page, 'help', 'toolbar=1,status=1,width=1160,height=800,scrollbars=1,resizable=1,location=yes');
	helpWin.focus();
}

function showErrMsg(msg, msgContainer = 'notifications-area')
{
	showMsg(msg, 'error', msgContainer);
}

function showWarningMsg(msg, msgContainer = 'notifications-area')
{
	showMsg(msg, 'varning', msgContainer);
}

function showNoticeMsg(msg, msgContainer = 'notifications-area')
{
	showMsg(msg, 'notice', msgContainer);
}

function showInfoMsg(msg, msgContainer = 'notifications-area')
{
	showMsg(msg, 'inforad', msgContainer);
}

function showMsg(mess, cssClass, msgContainer = 'notifications-area')
{
	let msg = mess;
	if (mess === null || mess.length === 0) {
		msg = 'Tyvärr, ett fel uppstod';
	}
	const container = document.getElementById(msgContainer);
	if (container)
	{
		const msgWidget = document.createElement('p');
		msgWidget.className = cssClass;
		const txt = document.createTextNode(msg);
		msgWidget.appendChild(txt);

		container.appendChild(msgWidget);
	}
	else
	{
		console.warn('Hittar ingen #'+ msgContainer + '. Fallback till alert()');
		alert(msg);
	}
}

/**
 * Använd endast med säkrad input!
 */
function showMsgAllowingHTML(mess, cssClass, msgContainer = 'notifications-area')
{
	let msg = mess;
	if (mess === null || mess.length === 0) {
		msg = 'Tyvärr, ett fel uppstod';
	}
	const container = document.getElementById(msgContainer);
	if (container)
	{
		const msgWidget = document.createElement('p');
		msgWidget.className = cssClass;
		msgWidget.innerHTML = msg;

		container.appendChild(msgWidget);
	}
	else
	{
		console.warn('Hittar ingen #'+ msgContainer + '. Fallback till alert()');
		alert(msg);
	}
}


function storeCaret (input) {
	if (input.createTextRange) {
		input.caretPos = document.selection.createRange().duplicate();
	}
}

function isIE()
{
	return (navigator.appVersion.indexOf("MSIE")!=-1);
}

function insertAtCaret(myField, myValue) {
	//IE support
	if (document.selection) {
		myField.focus();
		sel = document.selection.createRange();
		sel.text = myValue;
	}
	//MOZILLA/NETSCAPE support
	else if (myField.selectionStart || myField.selectionStart == '0') {
		var startPos = myField.selectionStart;
		var endPos = myField.selectionEnd;
		myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length);
	} else {
		myField.value += myValue;
	}
}

function selectAttribute(attribute, no)
{
	eval("document.searchform.attribute" + no + ".value = attribute");
	document.searchform.submit();
}

function selectSearchAttr(i)
{
	eval("input = document.searchform.search_min" + i);
	if (input != null)
		input.value = '';
 	eval("input = document.searchform.search_max" + i);
	if (input != null)
		input.value = '';
	document.searchform.submit();
}

function indicate_overflow(hitcount)
{
	var div = document.getElementById("overflow");
	div.innerHTML = "<i>Det finns fler än " + hitcount + " poster som matchar sökkriteriet!</i>";
}

let selectAllState = true;
function selectAll(name = 'pick_')
{
	const nodeList = document.postform.querySelectorAll("input[name^="+name+"]");	for (let i=0; i < nodeList.length; i++)
	{
		const element = nodeList[i];
		const elementId = element.getAttribute("id");
		// kolla att vi har isFilteredRow(), det är inte säkert där inte tablesorter används
		const filtered = typeof isFilteredRow === 'function' && isFilteredRow('#' + elementId);
		if (!filtered) // ignorera de som är i bortfiltrerade rader som finns, men döljs
		{
			const disabled = element.getAttribute("disabled");
			const attrname = element.getAttribute("name");
			const prefix = attrname.substr(0, name.length);


			if (prefix == name && !disabled)
				element.checked = selectAllState;
		}
	}
	selectAllState = !selectAllState;
}
/*

let selectAllState = true;
function selectAll(prefix = 'pick_')
{
	for (let i = 0; true; i++) {
		const elementId = "id_"+prefix+i;
		const element = document.getElementById(elementId);
		if (!element)
		{
			break;
		}
		// kolla att vi har isFilteredRow(), det är inte säkert där inte tablesorter används
		const filtered = typeof isFilteredRow === 'function' && isFilteredRow('#' + elementId);
		if (!filtered) // ignorera de som är i bortfiltrerade rader som finns, men döljs
		{
			element.checked = selectAllState;
		}
	}
	selectAllState = !selectAllState;
}
*/
let checkRangeStartvalue = null;
let checkRangeEndvalue = null;
/**
 * __TODO den verkar lite iffig:__ ibland markerar den till synes slumpmässigt, men jag har inte grottat i om jag anv den helt rätt
 */
function selectRange(e, v, prefix = 'pick_')
{
	if (e.shiftKey)
	{
		if (checkRangeStartvalue == null)
		{
			return;
		}
		checkRangeEndvalue = v;
		if (checkRangeStartvalue > checkRangeEndvalue)
		{
			[checkRangeEndvalue, checkRangeStartvalue] = [checkRangeStartvalue, checkRangeEndvalue];
		}
		for (let i = checkRangeStartvalue; i <= checkRangeEndvalue; i++)
		{
			const elementId = "id_"+prefix+i;
			// kolla att vi har isFilteredRow(), det är inte säkert där inte tablesorter används
			const filtered = typeof isFilteredRow === 'function' && isFilteredRow('#' + elementId);
			if (!filtered) // ignorera de som är i bortfiltrerade rader som finns, men döljs
			{
				const element = document.getElementById(elementId)
				element.checked = true;
			}
		}
	}
	else
	{
		checkRangeStartvalue = v;
		checkRangeEndvalue = null;
	}
}

function selectAllRadio(prefix, newvalue)
{
	for (let i = 0; true; i++) {
		const elementId = "id_"+prefix+i+'_'+newvalue;
		const element = document.getElementById(elementId);
		if (!element)
		{
			break;
		}
		// kolla att vi har isFilteredRow(), det är inte säkert där inte tablesorter används
		const filtered = typeof isFilteredRow === 'function' && isFilteredRow('#' + elementId);
		if (!filtered && !element.disabled) // disabled-kollen krävs i bild Avisering > Reskontra > Ränteavisering
		{
			element.checked = (element.value == newvalue.toString());
			//setCheckedValue(element, newvalue); funkar också
		}
	}
}

// return the value of the radio button that is checked
// return an empty string if none are checked, or
// there are no radio buttons
function getCheckedValue(radioObj) {
	if(!radioObj)
		return "";
	var radioLength = radioObj.length;
	if(radioLength == undefined) {
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	}
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}

// set the radio button with the given value as being checked
// do nothing if there are no radio buttons
// if the given value does not exist, all the radio buttons
// are reset to unchecked
function setCheckedValue(radioObj, newValue) {
	if(!radioObj)
		return;
	var radioLength = radioObj.length;
	if(radioLength == undefined) {
		radioObj.checked = (radioObj.value == newValue.toString());
		return;
	}
	for(var i = 0; i < radioLength; i++) {
		radioObj[i].checked = false;
		if(radioObj[i].value == newValue.toString()) {
			radioObj[i].checked = true;
		}
	}
}

function openpdf(href)
{
	window.open(href, "pdf");
}

function parseXML(text)
{
	try //Internet Explorer
 	{
  		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
  		xmlDoc.async="false";
  		xmlDoc.loadXML(text);
  	}
	catch(e)
  	{
 		parser = new DOMParser();
  		xmlDoc = parser.parseFromString(text, "text/xml");
  	}
  	return xmlDoc;
}

function setupAuditlogTablesorter()
{
	setupTablesorter(['zebra'], '.auditlog__datatable')
}

function onHover(element, flag)
{
	var clazz = element.getAttribute("class");
	if (flag) {
		clazz2 = clazz.replace("tr_other", "tr_hover");
		if (clazz2 == clazz)
			clazz2 += " tr_other";
	} else {
		clazz2 = clazz.replace("tr_hover", "tr_other");
		if (clazz2 == clazz)
			clazz2 += " tr_hover";
	}
	console.log(clazz2);
	element.setAttribute("class", clazz2);
}

function deleteRow(str, field, id)
{
    var ok = confirm(str);
    if (!ok)
        return;
    eval("document.deleteform." + field + ".value='" + id + "';");
    document.deleteform.submit();
}

/**
 * Verkar inte behövas om man lyckas få till allt exakt rätt, men efts den nu funkar...
 *
 * @param text i utf
 * @returns {string} text konverterad till latin
 */
function utf2latin(text)
{
	const decoder = new TextDecoder('iso8859-15');
	let bytes = [];

	for (let index in text)
	{
		let codePoint = text.codePointAt(index);
		//console.debug(codePoint);
		bytes.push(codePoint);
	}
	const converted = decoder.decode(new Uint16Array(bytes));
	return converted;
}

var substringMatcher = function(strs) {
  return function findMatches(q, cb) {
	console.log("findMatches: Hej 1");
    var matches, substringRegex;
    matches = [];
    substrRegex = new RegExp(q, 'i');
    $.each(strs, function(i, str) {
      if (substrRegex.test(str)) {
        matches.push(str);
      }
    });
    cb(matches);
  };
};

function onBankidLoginWeb()
{
    const url = "../API/login.php";
	const searchParams = new URL(window.location).searchParams;
    const params = {
        username: "",
		authtype: "portal_1",
		menuid: searchParams.get("menuid"),
		pageid: searchParams.get("pageid")
	};
    $.post(url, params, function (data) {
        //data = JSON.parse(data);
		let href = data.redirectUrl;
		if (data.redirectUrl) {
			let allowedRedirects = ["https://login.test.grandid.com", "https://login.grandid.com"];
			for (let url of allowedRedirects) {
				if (href.startsWith(url))
					window.location.href = href;
			}
		}

    }).fail(function(jqXHR, textStatus, errorThrown) {
		alert("ERR: " + textStatus + ", " + errorThrown);
	});
}




/* * * * * * * * *  Polyfills  * * * * * * * * */

// Se till så att string.startsWith() finns
// src: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
if (!String.prototype.startsWith) {
	Object.defineProperty(String.prototype, 'startsWith', {
		value: function(search, rawPos) {
			var pos = rawPos > 0 ? rawPos|0 : 0;
			return this.substring(pos, pos + search.length) === search;
		}
	});
}

function expandSection(element){
	$element = $(element);
	let $chevron = $element.find(".fa-chevron-right");
	let $section = $element.closest(".form-section").find("div.section-content");
	$chevron.toggleClass("retracted");
	$section.slideToggle(200);
	if ($chevron.hasClass("retracted")) {
		saveExpanded($section, $chevron);
	}
}

function saveExpanded(element, chevron) {
	localStorage.setItem("expandedSections", localStorage.getItem("expandedSections") + ";" + element.attr('id'));
	localStorage.setItem("chevrons", localStorage.getItem("chevrons") + ";" + chevron.attr("id"));
}

function loadExpanded() {
	let sectionsInStorage = localStorage.getItem("expandedSections");
	let chevronsInStorage = localStorage.getItem("chevrons");
	if (sectionsInStorage.length > 0) {
		let sections = sectionsInStorage.split(";");
		for (i = 0; i < sections.length; i++) {
			$section = $('#' + sections[i]);
			$section.slideDown(200);
		}
		let chevrons = chevronsInStorage.split(";");
		for (i = 0; i < chevrons.length; i++) {
			$chevron = $('#' + chevrons[i]);
			$chevron.addClass("retracted");
		}
		localStorage.clear();
	}

}