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

	PhoneFieldFormatter.applyPhoneFormatters = applyPhoneFormatListeners;

	function applyPhoneFormatListeners() {
		var elements = document.getElementsByClassName('phone-format');
		for (var i = 0; i < elements.length; i++) {
			if (elements[i].tagName === 'INPUT' && elements[i].type === 'text') {
				elements[i].addEventListener('blur', formatInputValue);
				elements[i].addEventListener('focus', unformatInputValue);
			}
		}
	}

	function formatInputValue(event) {
		var phoneFormatter = formatter('(XXX) XXX-XXXX');

		var unformattedValue = unformat(event.target.value);
		if (unformattedValue.length === 10) {
			event.target.value = phoneFormatter(event.target.value);
		} else {
			event.target.value = unformat(event.target.value);
		}
	}

	function unformatInputValue(event) {
		event.target.value = unformat(event.target.value);
	}

	function formatter(format) {
		return function (value) {
			var formatChars = format.split('');
			var newValue = '';
			var valueCounter = 0;

			for (var i = 0; i < formatChars.length; i++) {
				if (!value[valueCounter]) {
					break;
				} else {
					if (formatChars[i] === 'X' && value[valueCounter]) {
						newValue += value[valueCounter];
						valueCounter++;
					} else {
						newValue += formatChars[i];
					}
				}
			}

			var filterNonNumbers = function (char) {
				return char !== 'X';
			};

			return newValue.split('').filter(filterNonNumbers).join('');
		}
	}

	function unformat(value) {
		return value.split('').filter(function(char) {
			return !isNaN(char) && char !== ' ';
		}).join('');
	}

	return PhoneFieldFormatter;

})(PhoneFieldFormatter || {});