
	var regExpBirthdate  = new RegExp("^(19|20)[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])([0-9a-zA-Z]{0,4})$");
	var regExpCivicRegNr = new RegExp("^(19|20)[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])([0-9a-zA-Z]{4})$");
	var regExpPhone = new RegExp("^[\+]*[0-9\-\ \.]+$");
	

	function toggleElementAndImage (elementId, imgId, imgSrcWhileVisible, imgSrcWhileHidden, loopElements) {
	
		if (loopElements) {
	
			var i = document.getElementById(imgId);
			var loopCnt = 0;
			while (loopCnt >= 0) {
				try {
					e = document.getElementById(elementId + loopCnt);
					if (e.style.display == "none") {
						e.style.display = "";
						i.src = imgSrcWhileVisible;
					} else {
						e.style.display = "none";
						i.src = imgSrcWhileHidden;
					}
					loopCnt++;
				} catch (e) {
					if (loopCnt > 0) {
						loopCnt = -1; // abort looping if idx 1 or greater is missing, dont abort on 0 (ie loop count might begin on 0 or 1).
					} else {
						loopCnt++;
					}
				}
			}
			
		} else {
			
			var e = document.getElementById(elementId);
			var i = document.getElementById(imgId);
			if (e.style.display == "none") {
				e.style.display = "";
				i.src = imgSrcWhileVisible;
			} else {
				e.style.display = "none";
				i.src = imgSrcWhileHidden;
			}
			
		}
	}

	/**
	 * Set a given value to the element with the given id
	 */
	function setValueById (elementId, newValue) {
		if (elementId == null || elementId.length == 0) {
			return 1;
		}
		if (newValue == null) {
			newValue = "";
		}
		document.getElementById(elementId).value = newValue;
	}
	
	function getValueById (elementId) {
		if (elementId == null || elementId.length == 0) {
			return null;
		}
		return document.getElementById(elementId).value;
	}
	
	function confirmNavigation (url, confirmMessage) {
		if (confirmMessage != null && confirmMessage.length > 0) {
			if (!confirm(confirmMessage)) {
				return;
			}
		}
		window.location.href = url;
	}
	
	function confirmFormSubmit (formId, confirmMessage) {
		if (confirmMessage != null && confirmMessage.length > 0) {
			if (!confirm(confirmMessage)) {
				return;
			}
		}
		formSubmit(formId);
	}
	
	function confirmFormSubmit_setValueById (formId, confirmMessage, elementId, newValue) {
		if (confirmMessage != null && confirmMessage.length > 0) {
			if (!confirm(confirmMessage)) {
				return;
			}
		}
		setValueById(elementId, newValue);
		formSubmit(formId);
	}
		 
	function formSubmit (formId) {
		disableControls();
		
		if (formId == 'pinfoform') {
			// Multiple file input with the same name is used on this page
			// Change type to hidden if empty value and clear value of the matching (hidden) input field which keeps track of the file index pointer.
			el = document.getElementById(formId).elements;
			for (var i=0; i<el.length; i++) {
				if (el[i].type == 'file' && el[i].value.length == 0) {
					//alert("Found empty file:\n" + i + ". name=" + el[i].name + ", id=" + el[i].id + ", type=" + el[i].type + ", value=" + el[i].value);
					el[i].disabled = true
					for (var j=0; j<el.length; j++) {
						if (el[j].name == el[i].id) {
							el[j].value = "";
						}
					}
				}
			}
				
			/*
			var s = "pinfoform elements " + el.length + "\n\n";
			for (var i=0; i<el.length; i++) {
				s = s + i + ". name=" + el[i].name + ", id=" + el[i].id + ", type=" + el[i].type + ", value=" + el[i].value + "\n";
				
			}
			alert(s);
			*/
		}
		
		document.getElementById(formId).submit();
	}
	
	function formValidateAndSubmit (formId, arrayOfEvalCode, arrayOfErrMsgs, errMsgPrefix) {
		var errMsg = "";
		
		try {
			for (var i=0; i<arrayOfEvalCode.length; i++) {
				if (!eval(arrayOfEvalCode[i])) {
					//document.getElementById('a').style.background='#FF6666';
					errMsg += " - " + arrayOfErrMsgs[i] + "\n";
				}
			}
		} catch (err) {
			//alert("formValidateAndSubmut error: " + err);
		}
		
		if (errMsg.length > 0) {
			alert(errMsgPrefix + errMsg);
		} else {
			formSubmit(formId);
		}
	}
	
	/**
	 * Wrapper for realbeControls(true)
	 */
	function disableControls () {
		realbeControls(true);
	}

	/**
	 * Wrapper for realbeControls(false)
	 */
	function enalbeControls () {
		realbeControls(false);
	}

	/**
	 * Sets disabled status on all elements in all forms on the page.
	 * @param status New disabled-status.
	 */
	function realbeControls (status) {
		var fLen = document.forms.length;
		
		for (var fIdx=0; fIdx<fLen; fIdx++) {
			var elLen = document.forms[fIdx].elements.length;
			
			for (var elIdx=0; elIdx<elLen; elIdx++) {
				var elObj = document.forms[fIdx].elements[elIdx];
				
				if (elObj.type == "button" || elObj.type == "reset" || elObj.type == "submit") {
					elObj.disabled = status;
					elObj.value = "Vänta";
				}
			}
		}
	}

	//
	// Unsaved data warnings
	//
	
	// Notification flag for changed form data that hasn't been saved.
	var mtrwcSaveWarningFlag = false;
	
	// Inactivity limit in minutes
	var mtrwcSaveWarningLimit = 25;
	var mtrwcSessionLifeTime = 30;

	// Trigger inactivity message after x minutes
	function mtrwcStartTimeoutWarning () {
		setTimeout('mtrwcTimeoutWarning()', (mtrwcSaveWarningLimit * 60 * 1000));
	}
	
	// Set notification flag
	function mtrwcSetSaveWarning () {
		mtrwcSaveWarningFlag = true;
	}
	
	// Return notification flag
	function mtrwcIsSaveWarning () {
		return mtrwcSaveWarningFlag;
	}
	
	// Navigation to URL after confirmation if unsaved form data exists
	function mtrwcSaveWarning (url) {
		if (mtrwcIsSaveWarning()) {
			if (confirm("Du har ändringar som inte är sparade,\nvill du ändå lämna sidan?")) {
				window.location = url;
				mtrwcSaveWarningFlag = false;
			}
		} else {
			window.location = url;
		}
	}

	// Inserts a prefix 0 of the passed number is less than 10
	function mtrwcFormatTime (i) {
		if (i<10) {
			i = "0" + i;
		}
		return i;
	}

	// Shows an inactivitywarning
	function mtrwcTimeoutWarning () {
		var today = new Date();
		var h = mtrwcFormatTime(today.getHours());
		var m = mtrwcFormatTime(today.getMinutes());
		alert("Inaktivitetsvarning!\n" +
				"\n" +
				"Om " + (mtrwcSessionLifeTime - mtrwcSaveWarningLimit) + " minuter kommer din inloggning att sluta fungera p.g.a.\n"+
				"att du vara inaktiv i " + mtrwcSaveWarningLimit + " minuter.\n" +
				"\n" +
				"För att din inloggning inte ska sluta fungera bör du\n" +
				"spara dina ändraningar direkt!\n" +
				"\n" +
				"Varning inträffade kl. " + h + ":" + m + ".");
	}
	
	// Resize parent iframe
	function resizeParentMtrIframe (fname) {
		try {
			parent.DYNIFS.resize(fname);
		} catch (err) {
		}
	}
	
	function validateInput_minLength (elementId, minLength) {
		minLength = minLength < 0 ? 0 : minLength;
		if (getValueById(elementId) != null) {
			if (getValueById(elementId).length >= minLength) {
				return true;
			}
		}
		return false;
	}
	
	function validateInput_birthdate (elementId) {
		if (getValueById(elementId) != null) {
			if (regExpBirthdate.test(getValueById(elementId))) {
				return true;
			}
		}
		return false;
	}
	
	function validateInput_civicregnr (elementId) {
		if (getValueById(elementId) != null) {
			if (regExpCivicRegNr.test(getValueById(elementId))) {
				return true;
			}
		}
		return false;
	}
	
	function validateInput_phone (elementId) {
		if (getValueById(elementId) != null) {
			if (regExpPhone.test(getValueById(elementId))) {
				return true;
			}
		}
		return false;
	}
	
	function showCalendar (url,targetElementId) {
		winCal = window.open(url + "?target=" + targetElementId, "mtrwcCalendarWindow", "location=0,toolbar=0,status=0,menubar=0,width=308,height=150,resizable=0");
	}