var FormHelpers = (function(FormHelpers) {
	'use strict';

	FormHelpers.disableButtonsOnClick = disableButtonsOnClick;
	FormHelpers.disablePrimaryButtonsOnClick = disablePrimaryButtonsOnClick;
	FormHelpers.activateLoadingState = activateLoadingState;
	FormHelpers.removeLoadingSpinnerAndEnableButtons = removeLoadingSpinnerAndEnableButtons;
	FormHelpers.formatErrorMessages = formatErrorMessages;
	FormHelpers.scrollToErrorPanel = scrollToErrorPanel;
	FormHelpers.initializeTooltips = initializeTooltips;
	FormHelpers.preventEnterOnTextInputs = preventEnterOnTextInputs;
	FormHelpers.showButton = showButton;
	FormHelpers.hideButton = hideButton;
	FormHelpers.disableButton = disableButton;
	FormHelpers.showOnlyLastPageMessage = showOnlyLastPageMessage;
	FormHelpers.modifyInputFileWidth = modifyInputFileWidth;
	FormHelpers.countCharacters = countCharacters;
	FormHelpers.validateFileSize = validateFileSize;
	FormHelpers.validateFileNameLength = validateFileNameLength;
	FormHelpers.handleModalLast = handleModalLast;
	FormHelpers.handleModalFirst = handleModalFirst;
	FormHelpers.closeOnEscape = closeOnEscape;

	function hideButton(btn) {
		btn.style.display = 'none';
	}

	function showButton(btn) {
		btn.style.display = 'inline-block';
	}

	function disableButton(btn) {
		jQuery(btn).click(function() {
			jQuery(btn).prop("disabled",true);
		});
	}

	function disableButtonsOnClick() {
		jQuery('.btn').click(function() {
			jQuery('.btn').prop("disabled",true);
		});
	}

	function disablePrimaryButtonsOnClick() {
		jQuery('.btn-primary').click(function() {
			jQuery('.btn-primary').prop("disabled",true);
		});
	}

	function activateLoadingState() {
		jQuery("span[id$='body']").addClass("loading");
	}

	function removeLoadingSpinnerAndEnableButtons() {
		jQuery("span[id$='body']").removeClass("loading");
		jQuery('.btn').prop("disabled",false);
	}

	function formatErrorMessages() {
		// sfdc classes
		jQuery(".messageCell").find("h4").remove();
		jQuery(".message").css("padding-bottom", "10px");

		var $li = jQuery(".messageTable").find("li");
		if ($li.length < 1) {
			var singleError = jQuery(".messageTable").find("div");
			singleError.text(removeFieldName(singleError.text()));
		} else {
			$li.css("padding-top", "0px");
			$li.each(function() {
				var $listItem = jQuery(this);
				$listItem.text(removeFieldName($listItem.text()));
			});
		}

		function removeFieldName(errorString) {
			return errorString.slice(errorString.indexOf(':') + 1).trim();
		}

	}

	function scrollToErrorPanel() {
		jQuery('html, body').animate({scrollTop : 0},800);
		jQuery('.btn').prop("disabled",false);
		jQuery("#errorMessages").focus();
	}

	function initializeTooltips() {
		jQuery('[data-toggle="tooltip"]').tooltip();
	}

	function preventEnterOnTextInputs() {
		window.addEventListener('keydown', function preventUnintendedEnter(e) {
			if (e.keyIdentifier=='U+000A' || e.keyIdentifier=='Enter' || e.key=='Enter' || e.keyCode==13 || e.which==13) {
				if (e.target.nodeName=='INPUT' && e.target.type=='text' || jQuery(e.target).hasClass('helpIcon')) {
					e.preventDefault();
					return false;
				}
			}
		}, true);
	}

	function showOnlyLastPageMessage() {
		var pageMessages = jQuery("[id$='uploadForm:messages']");
		if (pageMessages) {
			var messages = pageMessages.find('li');
			jQuery.each(messages, function(i, message) {
				if (i < messages.length - 1) {
					message.remove();
				}
			});
			pageMessages.show();
		}
	}

	function validateFileNameLength(fileInputElement) {
		const maxFileNameLength = 80;
		let fileName =  fileInputElement.files[0].name.replace(/\.[^/.]+$/, "");
		let fileNameLength = fileName.length;
		return fileNameLength <= maxFileNameLength;
	}

	function validateFileSize(fileInputElement) {
		const maxFileSizeInBytes = 10485760;
		let validFileSize = true;
		let attachedFile = fileInputElement.files[0];

		if(typeof attachedFile !== 'undefined') {
			let fileSize = attachedFile.size;
			validFileSize = fileSize <= maxFileSizeInBytes;
		}
		return validFileSize;
	}

	function modifyInputFileWidth(element) {
		var fileNameLength = element.value.length;
		if(fileNameLength) {
			element.style.width = fileNameLength * 10 + 'px';
		} else {
			element.style.width = '100%';
		}
	}

	function countCharacters(textArea, countText, maxNumberOfCharacters) {
		var textEntered = document.getElementById(textArea).value;
		var counter = (maxNumberOfCharacters - (textEntered.length));
		var countRemaining = document.getElementById(countText);
		countRemaining.textContent = counter;
	}

	function handleModalLast(event, elementIdToFocus) {
		if (!event.shiftKey && event.keyCode === 9) {
			event.preventDefault();
			document.getElementById(elementIdToFocus).focus();
		}
	}

	function handleModalFirst(event, elementIdToFocus) {
		if (event.shiftKey && event.keyCode === 9) {
			event.preventDefault();
			document.getElementById(elementIdToFocus).focus();
		}
	}
	function closeOnEscape(event) {
		if (event.keyCode === 27) {
			cancelAction();
		}
	}

	return FormHelpers;

})(FormHelpers || {});