(function ($, undefined) {
	'use strict';

	var showClass = 'edOverlay__show',
		bodyClass = 'edOverlay__active',
		hideDisabledClass = 'edOverlay__hideDisabled';

	var defaultOptions = {
		additionalClasses: '',
		content: '',
		moduleId: 0,
		showDelay: 0,
		showOnLeave: false,
		showOnKeyInHref: '',
		language: '',
		showOnScroll: {
			amount: 0,
			unit: 'px'
		},
		showOnlyOnce: {
			cookie: '',
			cookieDuration: 0,
			successCookieDuration: 0
		},
		showByPageviews: {
			cookie: '',
			condition: '>=',
			threshold: 10
		},
		showOnQueryConditions: [],
		showOnUrlHash: '',
		showOnElementClick: false,
		onDomInit: undefined,
		onHide: undefined,
		disableHide: false,
		urlParams: ''
	};

	var escapeRegEx = function (value) {
		if (!value)
			return "";

		return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
	};

	function edOverlay(params) {
		var self = this;

		self.$body = $('body');
		self.$window = $(window);

		self.options = $.extend(true, {}, defaultOptions, params);
		self.shownOnce = false;
		self.$overlay = $();

		var showConditionDefined = false;

		if (self.options.showDelay > 0) {
			setTimeout(function () {
				self.show();
			}, self.options.showDelay);
			showConditionDefined = true;
		}

		if (self.options.showOnLeave) {
			self.$body.on('mouseleave', function () {
				if (self.shownOnce)
					return;

				self.show();
			});
			showConditionDefined = true;
		}

		if (self.options.showOnScroll.amount > 0) {
			self.$window.on('scroll', function () {
				if (self.shownOnce)
					return;

				var scrollTop = document.documentElement.scrollTop || document.body.scrollTop,
					referenceHeight = self.$body.outerHeight(true) - self.$window.height();

				if (
					self.options.showOnScroll.unit == 'px' && scrollTop >= self.options.showOnScroll.amount ||
					self.options.showOnScroll.unit == '%' && scrollTop / referenceHeight * 100 >= self.options.showOnScroll.amount
				)
					self.show();
			});
			showConditionDefined = true;
		}

		if (self.options.showOnElementClick) {
			$(self.$body).on('click', '.edMailChimpForm_' + self.options.moduleId, function () {
				self.show(true);
			});
			showConditionDefined = true;
		}

		if (!showConditionDefined) {
			self.show();
		}
	}

	edOverlay.prototype = {
		show: function (overrideCookie) {
			var self = this;

			if (!overrideCookie && self.options.showOnlyOnce.cookie && Cookies.get(self.options.showOnlyOnce.cookie))
				return;

			var abort = true,
				showConditionsSet = false;

			if (self.options.showOnKeyInHref) {
				showConditionsSet = true;

				var keys = self.options.showOnKeyInHref.split(','),
					i = 0,
					l = keys.length;

				for (; i < l; i++) {
					if (location.href.indexOf(encodeURIComponent(keys[i].trim())) == -1)
						continue;

					abort = false;
					break;
				}
			}

			if (self.options.showOnQueryConditions && self.options.showOnQueryConditions.length) {
				showConditionsSet = true;

				var i = 0,
					l = self.options.showOnQueryConditions.length,
					queryString = self.options.urlParams;

				for (; i < l; i++) {
					var condition = self.options.showOnQueryConditions[i],
						regex;

					if (condition.QueryCondition == 0)
						regex = new RegExp('(&|\\?)' + escapeRegEx(condition.QueryKey) + '=' + escapeRegEx(condition.QueryValue) + '(&|$)', 'ig');
					else
						regex = new RegExp('(&|\\?)' + escapeRegEx(condition.QueryKey) + '(=|&|$)', 'ig');

					if (queryString.match(regex)) {
						abort = false;
						break;
					}
				}
			}

			if (abort && self.options.showOnUrlHash) {
				showConditionsSet = true;

				if (location.hash == '#' + self.options.showOnUrlHash)
					abort = false;
			}

			if (abort && self.options.showByPageviews.cookie) {
				showConditionsSet = true;

				var userPageviews = Cookies.get(self.options.showByPageviews.cookie);

				if (
					(self.options.showByPageviews.condition == '>=' && userPageviews >= self.options.showByPageviews.threshold) ||
					(self.options.showByPageviews.condition == '<=' && userPageviews <= self.options.showByPageviews.threshold)
				)
					abort = false;
			}

			if (showConditionsSet && abort)
				return;

			self.shownOnce = true;

			if (self.$overlay.length === 0) {
				var additionalClasses = '';

				if (self.options.additionalClasses)
					additionalClasses = ' ' + self.options.additionalClasses;

				if (self.options.disableHide)
					additionalClasses += ' ' + hideDisabledClass;

				self.$overlay = $(
						'<div class="edOverlay' + additionalClasses + '">' +
							'<div class="edOverlay__mainWrapper">' +
								'<div class="edOverlay__contentWrapper"></div>' +
								'<div class="edOverlay__hideTrigger"></div>' +
							'</div>' +
						'</div>'
					)
						.appendTo(self.$body);

				self.$mainWrapper = $('> .edOverlay__mainWrapper', self.$overlay);
				self.$contentWrapper = $('> .edOverlay__contentWrapper', self.$mainWrapper);

				self.$mainWrapper.on('click', '.edOverlay__hideTrigger', function () {
					self.hide();
				});

				self.$contentWrapper.html(self.options.content);

				if (typeof self.options.onDomInit == 'function')
					self.options.onDomInit.call(self);
			}

			self.$body.addClass(bodyClass);
			self.$overlay.addClass(showClass);
			var requestParams = {
				portalId: self.options.portalId,
				moduleId: self.options.moduleId,
				action: 'increaseviews'
			};
			$.ajax({
				type: 'POST',
				url: self.options.websiteRoot + 'DesktopModules/EasyDNNmailChimpPlus/Services/UserSubscription.ashx?portalid=' + self.options.portalId+ (self.options.language.length>0?'&language='+self.options.language:''),
				data: requestParams,
				timeout: 150000,
				success: function (response) {
				}
			});
		},
		hide: function () {
			var self = this;

			if (self.options.disableHide)
				return;

			if (self.options.showOnlyOnce.cookie && !Cookies.get(self.options.showOnlyOnce.cookie))
				Cookies.set(self.options.showOnlyOnce.cookie, '1', { expires: self.options.showOnlyOnce.cookieDuration });

			self.$body.removeClass(bodyClass);
			self.$overlay.removeClass(showClass);

			if (typeof self.options.onHide == 'function')
				self.options.onHide.call(self);
		},
		enableHide: function () {
			var self = this;

			self.options.disableHide = false;
			self.$overlay.removeClass(hideDisabledClass);
		}
	};

	window.edOverlay = edOverlay;

})(eds3_5_jq);

(function ($, undefined) {
	'use strict';

	var requestingClass = 'edForm__requesting';

	var defaultOptions = {
		portalId: 0,
		moduleId: 0,
		websiteRoot: '',
		language: '',
		formSelector: '',
		multiGroupMode: false,
		successfulSubscriptionRedirect: '',
		formOverlay: {}
	};

	var init = function () {
		var self = this;

		self.validator = self.$form.validate({
			ignore: "",
			onsubmit: false
		});

		self.clearFormAfterResponse = false;

		self.$formWrapper
			.on('click', '.edForm__subscribe, .edForm__unsubscribe', function (ev) {
				ev.preventDefault();

				if (self.requestInProgress)
					return;

				$('.edForm__responseMessage', self.$formWrapper).html('');
				self.$formWrapper.removeClass('edForm__showResponse edForm__responseError edForm__responseSuccess');

				var $clicked = $(this),
					requestParams = {
						portalId: self.options.portalId,
						moduleId: self.options.moduleId
					},
					checkedRadioGroups = {},
					subscribing = $clicked.hasClass('edForm__subscribe');

				var formValid = true;

				$(':input', self.$formWrapper).each(function () {
					var $formEl = $(this),
						elName = $formEl.attr('name');

					if (!elName)
						return;

					if (!$formEl.valid()) {
						formValid = false;
						return;
					}

					if ($formEl.is('[type="radio"]')) {
						if (checkedRadioGroups[elName])
							return;

						checkedRadioGroups[elName] = true;

						var $checkedRadio = $('input[type="radio"][name="' + elName + '"]', self.$formWrapper).filter(':checked');

						if ($checkedRadio.length > 0)
							requestParams[elName] = $checkedRadio.val();

						return;
					}

					if (elName.slice(-2) == '[]') {
						if (!this.checked)
							return;

						if (requestParams[elName]) {
							requestParams[elName] += ',' + $formEl.val();
							return;
						}
					}

					requestParams[elName] = $formEl.val();
				});
				if (self.options.multiGroupMode) {
					var anyGroupChecked = false;
					var checks = $('[type = "checkbox"].eds_multiGroupMode', self.$formWrapper).each(function () {
						if ($(this).is(':checked')) {
							anyGroupChecked = true;
						}
					});
					if (!anyGroupChecked)
						$('#eds_multimode_error_' + self.options.moduleId).css({ 'display': "block" });
					else
						$('#eds_multimode_error_' + self.options.moduleId).css({ 'display': "none" });

					if (!anyGroupChecked)
						formValid = false;
				}

				if (!formValid)
					return;

				requestParams.action = subscribing ? 'subscribe' : 'unsubscribe';

				self.requestInProgress = true;
				self.$formWrapper.addClass(requestingClass);

				var responseMessage = 'Unknown error.',
					responseStatusClass = 'edForm__responseError';

				$.ajax({
					type: 'POST',
					url: self.options.websiteRoot + 'DesktopModules/EasyDNNmailChimpPlus/Services/UserSubscription.ashx?portalid=' + self.options.portalId + (self.options.language.length>0?'&language='+self.options.language:''),
					data: requestParams,
					timeout: 150000,
					success: function (response) {
						if (!response || !response.status)
							return;

						responseMessage = response.message;

						if (response.status == 'success') {
							responseStatusClass = 'edForm__responseSuccess';

							self.clearFormAfterResponse = response.clear;

							if (subscribing && self.formOverlay) {
								self.formOverlay.enableHide();

								if (self.options.formOverlay.showOnlyOnce)
									Cookies.set(self.options.formOverlay.showOnlyOnce.cookie, '1', { expires: self.options.formOverlay.showOnlyOnce.successCookieDuration });
							}
						}
					},
					complete: function () {
						self.requestInProgress = false;
						self.$formWrapper.removeClass(requestingClass);

						$('.edForm__responseMessage', self.$formWrapper).html(responseMessage);
						self.$formWrapper.addClass('edForm__showResponse ' + responseStatusClass);
					}
				});
			})
			.on('click', '.edForm__closeResponse', function () {
				if (self.options.successfulSubscriptionRedirect) {
					location.href = self.options.successfulSubscriptionRedirect;
					return;
				}

				self.$formWrapper.removeClass('edForm__showResponse');

				if (self.clearFormAfterResponse)
					$('input', self.$formWrapper).not('[type="radio"], [type="checkbox"]').val('');

				if (self.formOverlay)
					self.formOverlay.hide();
			});

		$('#eds_mailchimp_' + self.options.moduleId + '_selectall', self.$formWrapper).on('change', function () {
			$('.edmcp__checkBox input[type="checkbox"]', self.$formWrapper).prop('checked', this.checked);
		});
	}

	function edForm(el, options) {
		var self = this;

		self.requestInProgress = false;
		self.options = options;

		if (options.formOverlay && options.formOverlay.content) {
			options.formOverlay.onDomInit = function () {
				self.$form = $('> form', this.$contentWrapper)
				self.$formWrapper = $('#eds_mailchimp_' + options.moduleId + '_form', self.$form);

				init.call(self);
			};

			options.formOverlay.onHide = function () {
				self.validator.resetForm();
			};

			self.formOverlay = new edOverlay(options.formOverlay);
			return;
		}

		self.$form = $(options.formSelector);
		self.$formWrapper = $(el);

		init.call(self);
	}

	edForm.prototype = {};

	var instanceKey = 'edFormInstance';

	$.fn.edForm = function (options) {
		var apiReturn = undefined,
			args = arguments;

		this.each(function () {
			var self = this,
				instance = $.data(self, instanceKey);

			if (!instance) {
				instance = new edForm(self, $.extend(true, {}, defaultOptions, options));
				$.data(self, instanceKey, instance);
			}

			if ($.isPlainObject(options))
				return;

			apiReturn = instance.api($.extend([], args));

			if (apiReturn != undefined)
				return false;
		});

		if (apiReturn == undefined)
			return this;

		return apiReturn;
	};

})(eds3_5_jq);