angular
	.module(
		'pages',
		[
			'pages.datingCenter',
			'pages.dashboard',
			'pages.profiles',
			'pages.plist',
			'pages.viewProfile',
			'pages.messages',
			'pages.editProfile',
			'pages.resetPassword',
			'pages.help',
			'pages.aboutUs',
			'pages.privacy',
			'pages.terms',
			'pages.2257Notice',
			'pages.unSubscribe',
			'pages.mailToPrivacy',
			'pages.contentWall',
			'pages.billing',
			'authBox',
			'emailConfirm',
			'noticeBar',
			'newMessagesAlert',
			'insufficientCreditsPopup',
			'dating.models.pages',
			'dating.models.users',
			'dating.models.profiles',
			'dating.models.updates',
			'dating.models.messages',
			'dating.models.track',
			'dating.models.featured',
			'dating.models.interactions',
			'dating.directives.fancybox',
			'dating.directives.simplegallery',
			'dating.directives.updates',
			'dating.directives.messages',
			'dating.directives.profilesList',
			'dating.directives.stopRedirect',
			'dating.directives.goBack',
			'dating.interceptors.pageRender',
			'dating.helpers.mobile',
			'dating.helpers.blockUser',
			'dating.helpers.apiPrefix',
			'dating.directives.signInForm',
			'dating.directives.signUpForm',
			'dating.directives.forgottenPasswordForm',
			'dating.directives.externalScript',
			'dating.directives.videoPlayer',
			'dating.directives.audioMessage',
			'owlcarousel',
			'Dating'
		].concat(window.globalParams.ngModules)
	)
	.service('addTapAndHold', function () {
		var addTapAndHold = function (targetId) {
			var i = 0;
			var $target = document.getElementById(targetId);
			if ($target) {
				$target.addEventListener('touchstart', function () {
					var t = window.setInterval(function () {
						i += 0.5;
						if (i >= 1) {
							window.clearInterval(t);
							$('#' + targetId + ' .marketing-info').fadeIn();
							i = 0;
						}
					}, 500);
				});
				$target.addEventListener('touchend', function () {
					$('#' + targetId + ' .marketing-info').fadeOut();
					i = 0;
				});
			}
		};
		return addTapAndHold;
	})
	.service('showEnableRebillPopup', function ($modal, $modalStack) {
		var showEnableRebillPopup = function (popupData) {
			$modal.open({
				templateUrl: globalParams.templateUrls.pages.rebill_custom_popup,
				controller: 'BodyCtrl as bodyCtrl',
				keyboard: false,
				backdrop: 'static',
				animation: false,
				resolve: {
					popupData: function () {
						return popupData || {};
					}
				}
			});
			$modalStack.dismissAll();
		};
		return showEnableRebillPopup;
	})
	.service('monetizationHook', function (globalParamsService, PagesModel, $window, $timeout, authService) {
		var GLOBALS = globalParamsService.GLOBALS;
		var monetizationHook = function (optionId) {
			if (GLOBALS.monetizationFlag && authService.isAuthenticated && authService.currentUser.neverUpgraded) {
				PagesModel.monetizationCheck(optionId).then(function (result) {
					if (result.data && result.data.monetisationUrl != null) {
						$timeout(function () {
							var win = $window.open();
							win.location = result.data.monetisationUrl;
						});
					}
				});
			}
		};
		return monetizationHook;
	})
	.config(function () {
		window.globalParams.isMobileScreen = $('body').width() <= 768;
		window.globalParams.isMobileScreenFooterBanners = $('body').width() <= 1024;
	})
	.config(function ($httpProvider) {
		$httpProvider.interceptors.push('pageRenderInterceptor');
	})
	.config([
		'$stateProvider',
		function ($stateProvider) {
			$stateProvider.state('dating.pages', {
				url: '/',
				views: {
					'notificationbar@': {
						controller: 'NotificationBarCtrl as notificationBarCtrl',
						templateUrl: globalParams.templateUrls.email_confirm.notification_bar
					},
					//target the ui-view named 'navs' in ROOT state
					'navs@': {
						controller: 'PagesCtrl as pagesCtrl',
						templateUrl: globalParams.templateUrls.pages.navs
					},
					'noticebar@': {
						controller: 'NoticeBarCtrl as noticeBarCtrl',
						templateUrl: globalParams.templateUrls.notice_bar.notice_bar
					},
					'footer@': {
						controller: 'FooterCtrl as footerCtrl',
						templateUrl: globalParams.templateUrls.pages.footer
					},
					'footerbanners@': {
						controller: 'FooterCtrl as footerCtrl',
						templateUrl: globalParams.templateUrls.pages['footer-banners']
					},
					'leftusernav@': {
						controller: 'LeftUserNavCtrl as leftUserNavCtrl',
						templateUrl: globalParams.templateUrls.pages.leftusernav
					},
					'searchform@': {
						controller: 'SearchFormCtrl as searchFormCtrl',
						templateUrl: globalParams.templateUrls.pages.searchform
					},
					'featuredMembership@': {
						controller: 'FeaturedCtrl as featuredCtrl',
						templateUrl: globalParams.templateUrls.pages.featured_membership_nav
					},
					'overlay@': {
						controller: 'OverlayCtrl as overlayCtrl',
						templateUrl: globalParams.templateUrls.pages.overlay
					}
				}
			});
		}
	])
	.factory('TickerService', function ($interval, EventsModel, $rootScope) {
		//Global ticker fetcher service, each time a controller uses it, refCount++. We only fetch on interval if a controller is using this
		//service i.e. refCount > 0
		var service = {};
		var intervalId = null;
		var refCount = 0;
		var oldTickers = null;
		service.tickers = {};

		function fetchTickers() {
			EventsModel.getTickers().then(
				function (result) {
					var redirectHeader = result.headers('X-Dating-Filter-Redirect');
					if (redirectHeader) {
						window.location.replace(redirectHeader);
					}

					if (oldTickers) {
						var changedKeys = [];
						var nonTickerKeys = ['OnlineNow', 'NearYou', 'NewMembers'];
						var keysToCheck = ['NewViewedYou', 'NewMessages', 'NewLikesYou', 'NewMatches'];
						for (var key in result.data) {
							if (oldTickers[key] !== result.data[key]) {
								changedKeys.push(key.split('n')[1]);
							}
						}
						if (changedKeys.length > 0) {
							if (
								changedKeys.some(function (str) {
									return keysToCheck.includes(str);
								})
							) {
								changedKeys = changedKeys.concat(nonTickerKeys);
							}
							$rootScope.$broadcast('tickerChanged', changedKeys);
						}
					}
					oldTickers = angular.copy(result.data);
					angular.copy(result.data, service.tickers);
					service.tickers = result.data;
				},
				function (error) {
					console.error(error);
				}
			);
		}

		service.startInterval = function () {
			if (refCount === 0) {
				intervalId = $interval(fetchTickers, 30000);
				fetchTickers();
			}
			refCount++;
		};
		service.stopInterval = function () {
			refCount--;
			if (refCount === 0 && intervalId !== null) {
				$interval.cancel(intervalId);
				intervalId = null;
			}
		};
		return service;
	})
	.controller(
		'PagesCtrl',
		function (
			$scope,
			$modal,
			$state,
			$translate,
			$location,
			PagesModel,
			ProfilesModel,
			EventsModel,
			MobileHelper,
			showSignInBox,
			showSignUpBox,
			showNewMessagesAlert,
			globalParamsService,
			$window,
			userAccess,
			MessagesModel,
			$rootScope,
			authService,
			showInsufficientCreditsModal,
			UsersModel,
			UpgradeDialog,
			InteractionsModel,
			$templateRequest,
			$sce,
			$compile,
			$interval,
			$timeout,
			TickerService
		) {
			var pagesCtrl = this;
			var GLOBALS = globalParamsService.GLOBALS;
			var myEl = { el: null };
			var ExoLoader = myEl.el || window.ExoLoader;
			$translate.use(GLOBALS.i18nDefaultLang);
			$scope.$on('userLoggedOut', function () {
				if (angular.isDefined(interactionInterval)) {
					$interval.cancel(interactionInterval);
					interactionInterval = undefined;
					compiledTemplate.remove();
				}
			});
			$scope.$on('userLoggedIn', function () {
				setCtrl();
				var loggedEvent = new CustomEvent('userLoggedIn');
				document.dispatchEvent(loggedEvent);
			});
			var isNotLander =
				$state.current.name.indexOf('sugarDaddy') === -1 &&
				$state.current.name.indexOf('sugarBaby') === -1 &&
				$state.current.name.indexOf('datingCenter') === -1 &&
				($state.current.name !== 'dating.pages' || $state.current.name !== 'dating.pages.dashboard') &&
				pagesCtrl.isLoggedIn === false;

			pagesCtrl.isAdblockEnabled = false;
			pagesCtrl.liveCamsIdZone = 'http://s.vlink4.com/splash.php?idzone=';
			pagesCtrl.sexyGamesIdZone = 'http://s.vlink4.com/splash.php?idzone=';
			pagesCtrl.members = 250000 + random(0, 9999);
			pagesCtrl.online = 32000 + random(0, 999);
			var upgrade = {};
			var compiledTemplate;
			var interactionInterval;
			var notificationAudio = new Audio('../themes/assets/notification-sound.wav');

			function setCtrl() {
				$scope.GLOBALS = globalParamsService.GLOBALS;
				pagesCtrl.showSignInBox = showSignInBox;
				pagesCtrl.showSignUpBox = showSignUpBox;
				pagesCtrl.nNewMessagesCount = 0;
				pagesCtrl.siteName = GLOBALS.siteName;
				pagesCtrl.siteDomain = GLOBALS.siteDomain;
				pagesCtrl.siteUrl = GLOBALS.siteUrl;
				pagesCtrl.logo = GLOBALS.logo;
				pagesCtrl.imagesUrl = GLOBALS.baseUrl + '/styles/images/';
				pagesCtrl.creditsUrl = GLOBALS.siteUrl + 'profile/edit/settings' + '#credits';
				pagesCtrl.isLoggedIn = authService.isAuthenticated;
				pagesCtrl.currentUser = authService.currentUser;
				pagesCtrl.advertisement = GLOBALS.advertisement;
				pagesCtrl.isMobile = parseInt(GLOBALS.isMobile);
				pagesCtrl.isExternalUpgradeSite = parseInt(GLOBALS.isExternalUpgradeSite);
				pagesCtrl.exoLinksWithAdblockOn = GLOBALS.exoLinksWithAdblockOn;
				pagesCtrl.externalUpgradeUrl = pagesCtrl.isLoggedIn ? GLOBALS.userInfo.partnerBillingRedirectUrl : '';
				pagesCtrl.upgradeUrl = parseInt(GLOBALS.isExternalUpgradeSite)
					? pagesCtrl.externalUpgradeUrl
					: '/billing/upgrade';
				pagesCtrl.isBillingPartnerCmp =
					GLOBALS.userInfo.billingPartner && parseInt(GLOBALS.userInfo.billingPartner) === 7;
				pagesCtrl.isMainstream = GLOBALS.isMainstreamSite;
				pagesCtrl.isRootMainstreamTraffic = pagesCtrl.isMainstream && GLOBALS.userInfo.isRootTraffic;
				pagesCtrl.hasFreeMovies = parseInt(GLOBALS.hasFreeMovies);
				pagesCtrl.showAdvertisementLabel = GLOBALS.markAdvert && GLOBALS.userInfo.isRootTraffic;
				pagesCtrl.contentWall = GLOBALS.contentWall;
				pagesCtrl.featureToggles = GLOBALS.featureToggles;
				pagesCtrl.isCreditsSite = parseInt(GLOBALS.isCreditsSite);
				pagesCtrl.monetizationFlag = GLOBALS.monetizationFlag;
				pagesCtrl.monetizationPageViewsCount = GLOBALS.monetizationPageViewsCount;
				pagesCtrl.isSafeMode = authService.isAuthenticated ? !!authService.currentUser.safeMode : true;
				pagesCtrl.desktopTabZonesExoClickUrls = GLOBALS.advertisement.desktopTabZonesExoClickUrls;
				pagesCtrl.mobileTabZonesExoClickUrls = GLOBALS.advertisement.mobileTabZonesExoClickUrls;
				pagesCtrl.desktopTabZonesAdniumUrls = GLOBALS.advertisement.desktopTabZonesAdniumUrls;
				pagesCtrl.mobileTabZonesAdniumUrls = GLOBALS.advertisement.mobileTabZonesAdniumUrls;
				pagesCtrl.stripcashCamTabUrl = GLOBALS.stripcashCamTabUrl;
				upgrade.userMembership = GLOBALS.userInfo.membership;
				upgrade.isExPremium = GLOBALS.isExPremium;
				upgrade.insufficientCredits = GLOBALS.userInfo.hasInsufficientCreditsFlag;
				pagesCtrl.hasInteractionsFS = +GLOBALS.showInteractionPopup;
				pagesCtrl.isFeatured = GLOBALS.userInfo.isFeatured;
				pagesCtrl.isRegularUpgradeSite = !pagesCtrl.isExternalUpgradeSite && !pagesCtrl.isCreditsSite;
				pagesCtrl.shouldShowUpgradePopup = +GLOBALS.showUpgradePopup && pagesCtrl.isRegularUpgradeSite;
				$rootScope.upgrade = upgrade;
				if (pagesCtrl.isLoggedIn && !userAccess.hasAccess) {
					pagesCtrl.isLoggedIn = false;
				}
				if (pagesCtrl.isLoggedIn) {
					$rootScope.pageViewsCount = 0;
					var deregisterListener = $rootScope.$on('$stateChangeStart', function (event, toState) {
						if (toState.name !== 'dating.pages.fullPageAd') {
							$rootScope.pageViewsCount++;
						}
						if (pagesCtrl.monetizationFlag && pagesCtrl.isLoggedIn && pagesCtrl.currentUser.neverUpgraded) {
							if ($rootScope.pageViewsCount === +pagesCtrl.monetizationPageViewsCount) {
								$rootScope.monetizeFullPageAd = '1';
								$rootScope.pageViewsCount = 0;
								event.preventDefault();
								$state.go('dating.pages.fullPageAd');
							}
						} else {
							if (
								+pagesCtrl.monetizationPageViewsCount === 0 &&
								GLOBALS.userInfo.showFullPageAd &&
								$rootScope.pageViewsCount === 5
							) {
								GLOBALS.userInfo.showFullPageAd = 0;
								event.preventDefault();
								$state.go('dating.pages.fullPageAd');
								deregisterListener();
							}
						}
					});
					updateNavigationUI();
					setAdCodes();
					placeAdCodes();
					if (pagesCtrl.hasInteractionsFS && pagesCtrl.isLoggedIn) {
						fetchInteractions();
					}
					if (pagesCtrl.isLoggedIn && GLOBALS.userInfo.exoSubParams) {
						pagesCtrl.exoSub2 = GLOBALS.userInfo.exoSubParams.sub2;
						pagesCtrl.exoSub3 = GLOBALS.userInfo.exoSubParams.sub3;
						pagesCtrl.exoSubUrlParams = '&sub2=' + pagesCtrl.exoSub2 + '&sub3=' + pagesCtrl.exoSub3;
					}
					pagesCtrl.rebillDisabledABTest = parseInt(authService.currentUser.rebillDisabledABTest);
					pagesCtrl.noAvatar = pagesCtrl.currentUser.avatar.indexOf('no_photo_') > -1;
					$scope.$on('no_photo:true', function () {
						pagesCtrl.noAvatar = true;
					});
					$scope.$on('no_photo:false', function () {
						pagesCtrl.noAvatar = false;
					});

					$scope.$on('$destroy', function () {
						TickerService.stopInterval();
					});

					if (!pagesCtrl.isPagesTickerStarted) {
						pagesCtrl.isPagesTickerStarted = true;
						TickerService.startInterval();
					}
					pagesCtrl.shouldShowMessages = true;
					$scope.$on('clear_messages', function () {
						pagesCtrl.shouldShowMessages = false;
					});

					var convertToNumbers = function (obj) {
						Object.keys(obj).forEach(function (key) {
							obj[key] = parseInt(obj[key]);
						});
						return obj;
					};

					$scope.$watch(
						function () {
							return TickerService.tickers;
						},
						function (newTickers) {
							if (+pagesCtrl.featureToggles.getTickersSE) {
								pagesCtrl.tickers = angular.copy(newTickers);
							} else {
								pagesCtrl.tickers = angular.copy(convertToNumbers(newTickers));
							}
						},
						true
					);

					MessagesModel.getUnread().then(function (result) {
						pagesCtrl.nNewMessagesCount = result.data.totalUnreadMessages;
					});

					if (+pagesCtrl.featureToggles.getTickersSE) {
						if (!pagesCtrl.isPagesTickerStarted) {
							pagesCtrl.isPagesTickerStarted = true;
							TickerService.startInterval();
						}
						angular.element($window).bind('scroll', function () {
							var offsetY = this.pageYOffset;
							var limit = angular.element('.top-header').innerHeight();
							if (angular.element('.upgrade-bar').length > 0) {
								limit += angular.element('.upgrade-bar').innerHeight();
							}
							if (angular.element('.notification-bar').length > 0) {
								limit += angular.element('.notification-bar').innerHeight();
							}
							if (offsetY > limit) {
								angular.element('.body-container').addClass('on-top');
							} else {
								angular.element('.body-container').removeClass('on-top');
							}
						});
					}
				}
				// Checks if user has credits info so the functions / variables only get assigned if it's a credit site
				if (GLOBALS.creditsInfo && GLOBALS.creditsInfo.currentCredits && GLOBALS.creditsInfo.expiryDate) {
					pagesCtrl.creditCount = GLOBALS.creditsInfo.currentCredits;
					pagesCtrl.creditsExpiryDate = GLOBALS.creditsInfo.expiryDate.date;
					pagesCtrl.creditsExpiryDateStamp = pagesCtrl.creditsExpiryDate.split(' ')[0];
					pagesCtrl.creditsExpiryTimeStamp = pagesCtrl.creditsExpiryDate.split(' ')[1];
					pagesCtrl.creditsExpiryTimeZone = GLOBALS.creditsInfo.expiryDate.timezone;
					pagesCtrl.creditsExpiryDateFormatted = convertDateFormat(pagesCtrl.creditsExpiryDateStamp);
					$rootScope.creditsReachedZero = false;
					$rootScope.liveCreditsCount = pagesCtrl.creditCount;

					pagesCtrl.creditsRemainingDays = function () {
						if (pagesCtrl.creditsExpiryDate) {
							var currentDate = new Date();
							var parsedExpiryDate = Date.parse(
								new Date(pagesCtrl.creditsExpiryDateStamp + 'T' + pagesCtrl.creditsExpiryTimeStamp)
							);
							var differenceInDays = Math.floor((parsedExpiryDate - currentDate) / (1000 * 3600 * 24));
							if (differenceInDays <= 1) {
								return 'less than 1';
							}
							return differenceInDays;
						}
					};
					// Interval function that fetches the credit info every 5 seconds
					pagesCtrl.updateCreditCounter = setInterval(function () {
						PagesModel.currentCreditsInfo().then(function (response) {
							if (response.data && response.data.currentCredits && response.data.currentCredits !== '0') {
								$rootScope.liveCreditsCount = response.data.currentCredits;
							} else if (response.data && response.data.currentCredits && response.data.currentCredits === '0') {
								$rootScope.creditsReachedZero = true;
								clearInterval(pagesCtrl.updateCreditCounter); // Clear the interval
								updateNavigationUI();
							} else {
								$rootScope.creditsReachedZero = true;
								clearInterval(pagesCtrl.updateCreditCounter); // Clear the interval
								downgradeCreditsUser();
							}
						});
						$rootScope.$apply();
					}, 5000);
				}

				function convertDateFormat(dateString) {
					var parts = dateString.split('-');
					return parts[2] + '.' + parts[1] + '.' + parts[0];
				}

				if (parseInt(GLOBALS.showLeaveSiteWarningPopup)) {
					LeaveSiteNotification();
				}
				if (!GLOBALS.mobileQuery && GLOBALS.isMobile == '0' && isNotLander) {
					MobileHelper.setMobileFlag();
					MobileHelper.watchScreenSize();
				}
				if (pagesCtrl.rebillDisabledABTest && +pagesCtrl.featureToggles.rebillDisabledABTest) {
					$rootScope.$broadcast('showEnableRebillPopup');
					setTimeout(function () {
						$('.rebillCustomPopup3').show();
					}, 500);
				}
				if ($state.current.name != 'dating.pages.unSubscribe') {
					showNewMessagesAlert();
				}
				if ($state.current.name == 'dating.pages') {
					if (!window.globalParams.isMobileScreen || !isNotLander) {
						$state.go(pagesCtrl.isLoggedIn ? 'dating.pages.dashboard' : 'dating.pages.datingCenter');
					}
					if (window.globalParams.isMobileScreen && isNotLander) {
						$state.go(pagesCtrl.isLoggedIn ? 'dating.pages.dashboard' : 'dating.pages.datingCenter');
					}
				}
			}

			function fetchInteractions() {
				$interval(function () {
					$scope.widgetState = JSON.parse(localStorage.getItem('widgetStateFor:' + window.CONFIG.userUid));
					interactionInterval = InteractionsModel.getNewInteractions().then(function (result) {
						if (result.status === 200 && angular.isDefined(result.data) && Object.keys(result.data).length > 0) {
							pagesCtrl.newInteractions = result.data;
							pagesCtrl.shouldShowInteractions = true;
							$scope.interactionType = Object.keys(pagesCtrl.newInteractions)[0];
							$scope.interactionUsername = pagesCtrl.newInteractions[$scope.interactionType].username;
							$scope.interactionAvatar = pagesCtrl.newInteractions[$scope.interactionType].avatar;
							$scope.interactionOnline = pagesCtrl.newInteractions[$scope.interactionType].online;
							$scope.interactionAge = pagesCtrl.newInteractions[$scope.interactionType].age;
							$scope.interactionId = pagesCtrl.newInteractions[$scope.interactionType].profileId;
							$scope.interactionExternalId = pagesCtrl.newInteractions[$scope.interactionType].externalId;
							if (pagesCtrl.shouldShowInteractions) {
								pagesCtrl.createInteractionTemplate().then(function () {
									pagesCtrl.showInteractionTemplate();
									$timeout(function () {
										pagesCtrl.hideInteractionTemplate();
									}, 10000);
								});
							} else {
								pagesCtrl.hideInteractionTemplate();
							}
						}
					});
				}, 30000);
			}

			pagesCtrl.createInteractionTemplate = function () {
				var templateUrl = globalParams.templateUrls.pages.interaction_popup;
				return $templateRequest($sce.trustAsResourceUrl(templateUrl)).then(function (template) {
					compiledTemplate = $compile(template)($scope);
					angular.element(document.body).append(compiledTemplate);
				});
			};
			pagesCtrl.showInteractionTemplate = function () {
				if (!$scope.widgetState.isOpen && !pagesCtrl.isMobile) {
					compiledTemplate.removeClass('hide-no-widget');
					compiledTemplate.addClass('show-no-widget');
				} else {
					if (window.ccpInfo.config.mode === 'chat-list') {
						compiledTemplate.removeClass('hide-chat-list');
						compiledTemplate.addClass('show-chat-list');
					} else {
						compiledTemplate.removeClass('hide');
						compiledTemplate.addClass('show');
					}
				}
				notificationAudio.play();
			};
			pagesCtrl.hideInteractionTemplate = function () {
				if (angular.isDefined(compiledTemplate)) {
					if (!$scope.widgetState.isOpen && !pagesCtrl.isMobile) {
						compiledTemplate.addClass('hide-no-widget');
						compiledTemplate.removeClass('show-no-widget');
					} else {
						if (window.ccpInfo.config.mode === 'chat-list') {
							compiledTemplate.addClass('hide-chat-list');
							compiledTemplate.removeClass('show-chat-list');
						} else {
							compiledTemplate.addClass('hide');
							compiledTemplate.removeClass('show');
						}
					}
					$timeout(function () {
						compiledTemplate.remove();
					}, 2000);
					pagesCtrl.shouldShowInteractions = false;
				}
			};
			pagesCtrl.handleInteraction = function (event, interactionType) {
				event.stopPropagation();
				if (interactionType === 'like') {
					ProfilesModel.sendMatch($scope.interactionExternalId, 'accept').then(function () {
						$state.go('dating.pages.viewProfile', {
							id: $scope.interactionExternalId
						});
					});
				} else {
					$state.go('dating.pages.viewProfile', {
						id: $scope.interactionExternalId
					});
				}
				pagesCtrl.hideInteractionTemplate();
				pagesCtrl.shouldShowInteractions = false;
			};

			function updateNavigationUI() {
				upgrade.url = '/billing/upgrade';
				upgrade.buttonText = 'Upgrade now';
				upgrade.premiumUserStatusText = 'Premium';
				upgrade.showUpgradeButton = true;
				upgrade.showPremiumUserStatus = false;
				upgrade.showNotifyUpgrade = false;
				upgrade.notifyUpgradeText = '';
				upgrade.showCreditsCount = false;
				upgrade.showCreditsCountdown = false;
				if (upgrade.userMembership === 'premium') {
					upgrade.showUpgradeButton = false;
					upgrade.showPremiumUserStatus = true;
				}
				if (parseInt(GLOBALS.isExternalUpgradeSite)) {
					upgrade.url = authService.isAuthenticated ? GLOBALS.userInfo.partnerBillingRedirectUrl : '';
					upgrade.buttonText =
						GLOBALS.userInfo.billingPartner && parseInt(GLOBALS.userInfo.billingPartner) === 7
							? 'Unlimited Access'
							: 'Get Verified';
					upgrade.premiumUserStatusText = 'Verified';
					if (authService.isAuthenticated && upgrade.userMembership != 'premium') {
						upgrade.showNotifyUpgrade = true;
						upgrade.notifyUpgradeText =
							'Limited time offer: verify you are 18+ free of charge and unlock all premium features!';
						if (GLOBALS.userInfo.billingPartner && parseInt(GLOBALS.userInfo.billingPartner) === 7) {
							upgrade.notifyUpgradeText = 'Special offer: get instant unlimited access to all premium features!';
						}
					}
				} else if (parseInt(GLOBALS.isCreditsSite)) {
					upgrade.buttonText = 'Unlock credits';
					if (GLOBALS.creditsInfo.currentCredits) {
						upgrade.showCreditsCountdown = true;
						upgrade.showCreditsCount = true;
					}
					if (upgrade.insufficientCredits || (upgrade.isExPremium && upgrade.userMembership === 'standard')) {
						upgrade.buttonText = 'Re-purchase';
						upgrade.showUpgradeButton = true;
					}
				}
			}

			function downgradeCreditsUser() {
				upgrade.isExPremium = true;
				upgrade.userMembership = 'standard';
				updateNavigationUI();
			}

			$scope.$on('showPurchaseModal', function () {
				if (+pagesCtrl.featureToggles.showInsufficientCreditsPopup) {
					showInsufficientCreditsModal();
					enableCreditsPurchase();
				} else {
					window.location.href = pagesCtrl.upgradeUrl;
				}
			});

			$scope.$on('showUpgradeModal', function () {
				if (pagesCtrl.shouldShowUpgradePopup) {
					UpgradeDialog.open();
				} else {
					window.location.href = pagesCtrl.upgradeUrl;
				}
			});

			$scope.$on('featuredMembershipPurchased', function () {
				pagesCtrl.isFeatured = true;
			});

			function enableCreditsPurchase() {
				UsersModel.checkInsufficientCredits().then(function (response) {
					if (response.data && response.data.hasInsufficientCreditsFlag) {
						upgrade.insufficientCredits = true;
						updateNavigationUI();
					}
				});
			}

			pagesCtrl.isExPremiumUser = function () {
				return GLOBALS.isExPremium === '1';
			};

			function setAdCodes() {
				pagesCtrl.liveCamsTab = pagesCtrl.currentUser.liveCamsTab;
				pagesCtrl.sexyGamesTab = pagesCtrl.currentUser.sexyGamesTab;
				pagesCtrl.moreGirlsTab = pagesCtrl.currentUser.moreGirlsTab;
			}

			ExoLoader.getDetector().detectCensorship(function (block) {
				if (block) {
					pagesCtrl.isAdblockEnabled = true;
				}
				$scope.$on('$viewContentLoaded', placeAdCodes());
				angular.element($window).bind('resize', placeAdCodes());
			});

			function placeAdCodes() {
				if (pagesCtrl.isLoggedIn) {
					pagesCtrl.liveCamsUrl = pagesCtrl.liveCamsTab.url;
					pagesCtrl.sexyGamesUrl = pagesCtrl.sexyGamesTab.url;
					pagesCtrl.pickupUrl = pagesCtrl.moreGirlsTab.url;
					if (+pagesCtrl.featureToggles.GoAdServer && !pagesCtrl.isSafeMode) {
						if (GLOBALS.isMobile == '0') {
							pagesCtrl.liveCamsUrl =
								'//go2.trafficbull.com/redirect.go?pid=11794&spaceid=1242595&keywords=cams&returnurl=';
							pagesCtrl.sexyGamesUrl =
								'//go2.trafficbull.com/redirect.go?pid=11794&spaceid=1242596&keywords=games&returnurl=';
						} else {
							pagesCtrl.liveCamsUrl =
								'//go2.trafficbull.com/redirect.go?pid=11794&spaceid=1242597&keywords=cams&returnurl=';
							pagesCtrl.sexyGamesUrl =
								'//go2.trafficbull.com/redirect.go?pid=11794&spaceid=1242598&keywords=games&returnurl=';
						}
					} else if (pagesCtrl.isAdblockEnabled && pagesCtrl.exoLinksWithAdblockOn) {
						pagesCtrl.liveCamsUrl += '&tags=adblock';
						pagesCtrl.sexyGamesUrl += '&tags=adblock';
					}
				}
			}

			pagesCtrl.datingTabsNewBehaviour = function (event) {
				event.preventDefault();
				window.open(event.currentTarget.href);
			};

			if (!isNotLander) {
				if ($state.current.name.indexOf('sugarBaby') !== -1) {
					document.cookie = 'landingPage=sugarBaby;path=/';
					pagesCtrl.currentLander = 'sugarBaby';
				} else if ($state.current.name.indexOf('sugarDaddy') !== -1) {
					document.cookie = 'landingPage=sugarDaddy;path=/';
					pagesCtrl.currentLander = 'sugarDaddy';
				} else {
					pagesCtrl.currentLander = 'datingCenter';
				}
			}

			pagesCtrl.setSafeMode = function () {
				ProfilesModel.setSafeMode().then(function () {
					var safeModeValue = !authService.currentUser.safeMode;
					authService.currentUser.safeMode = safeModeValue;
					pagesCtrl.isSafeMode = safeModeValue;
					$rootScope.$broadcast('safeModeChanged');
				});
			};

			$scope.$on('sign-out:success', function () {
				pagesCtrl.isLoggedIn = false;
				pagesCtrl.currentLander = 'datingCenter';
				pagesCtrl.currentUser = null;
			});

			function LeaveSiteNotification() {
				window.onbeforeunload = function (e) {
					e = e || window.event;

					if (e) {
						e.returnValue = 'Any string';
					}

					return 'Any string';
				};
			}

			pagesCtrl.getCurrentPage = function () {
				return PagesModel.getCurrentPage();
			};
			pagesCtrl.isCurrentPage = function (page) {
				return PagesModel.isCurrentPage(page);
			};
			pagesCtrl.isActivityPage = function () {
				var currentPage = PagesModel.getCurrentPage();
				var activityPages = ['overview', 'matches', 'likesyou', 'viewedyou', 'youlike', 'youviewed'];
				return activityPages.indexOf(currentPage) > -1;
			};
			pagesCtrl.isMatchesPage = function () {
				var currentPage = PagesModel.getCurrentPage();
				var matchesPages = ['matches', 'likesyou', 'youlike'];
				return matchesPages.indexOf(currentPage) > -1;
			};
			pagesCtrl.isViewsPage = function () {
				var currentPage = PagesModel.getCurrentPage();
				var viewsPages = ['viewedyou', 'youviewed'];
				return viewsPages.indexOf(currentPage) > -1;
			};
			pagesCtrl.isProfilePage = function () {
				var currentPage = PagesModel.getCurrentPage();
				return $location.path() == '/profile/view/id/me' || currentPage == 'EditProfile';
			};

			pagesCtrl.onLikesYouSelected = function () {
				EventsModel.sendEvent('updateLastViewedRequestsTab');
				if (pagesCtrl.tickers) {
					TickerService.tickers.nNewLikesYou = 0;
					pagesCtrl.tickers.nNewLikesYou = 0;
				}
			};
			pagesCtrl.onViewedYouSelected = function () {
				EventsModel.sendEvent('updateViewedYouTabTime');
				if (pagesCtrl.tickers) {
					TickerService.tickers.nNewViewedYou = 0;
					pagesCtrl.tickers.nNewViewedYou = 0;
				}
			};
			pagesCtrl.onMatchesSelected = function () {
				EventsModel.sendEvent('updateLastViewedMatchesTab');
				if (pagesCtrl.tickers) {
					TickerService.tickers.nNewMatches = 0;
					pagesCtrl.tickers.nNewMatches = 0;
				}
			};
			pagesCtrl.onMessagesSelected = function () {
				EventsModel.sendEvent('updateLastViewedMessagesTab');
				if (pagesCtrl.tickers) {
					TickerService.tickers.nNewMessages = 0;
					pagesCtrl.tickers.nNewMessages = 0;
				}
			};

			function random(a, b) {
				return a + Math.floor(Math.random() * (b - a));
			}

			function init() {
				$rootScope.monetizeFullPageAd = '';
				setCtrl();
				pagesCtrl.updateCreditCounter = null;
				updateNavigationUI();
			}

			init();
		}
	)
	.controller('NoPhotoModalBox', function (globalParamsService) {
		var GLOBALS = globalParamsService.GLOBALS;

		var noPhotoModalBox = this;
		noPhotoModalBox.isMobile = GLOBALS.isMobileScreen;
		noPhotoModalBox.isWoman = GLOBALS.userInfo.gender == 1;
		noPhotoModalBox.goToEditPhoto = function () {
			GLOBALS.toPhotoUpload = true;
		};
	})
	.controller(
		'FooterCtrl',
		function (
			$scope,
			$rootScope,
			$state,
			PagesModel,
			globalParamsService,
			userAccess,
			showSignInBox,
			showSignUpBox,
			$window,
			ProfilesModel,
			authService
		) {
			var footerCtrl = this;
			var GLOBALS = globalParamsService.GLOBALS;

			footerCtrl.isLoggedIn = authService.isAuthenticated;
			if (footerCtrl.isLoggedIn && !userAccess.hasAccess && PagesModel.getCurrentPage() !== 'billing') {
				footerCtrl.isLoggedIn = false;
			}

			footerCtrl.isMobileScreenFooterBanners = GLOBALS.isMobileScreenFooterBanners;
			footerCtrl.companyName = GLOBALS.companyName;
			footerCtrl.companyCountry = GLOBALS.companyCountry;
			footerCtrl.companyAddress = GLOBALS.companyAddress;
			footerCtrl.isSafeMode = authService.isAuthenticated ? !!authService.currentUser.safeMode : true;
			footerCtrl.siteName = GLOBALS.siteName;
			footerCtrl.siteDomain = GLOBALS.siteDomain;
			footerCtrl.siteUrl = GLOBALS.siteUrl;
			footerCtrl.year = GLOBALS.year;
			footerCtrl.showSignInBox = showSignInBox;
			footerCtrl.showSignUpBox = showSignUpBox;
			footerCtrl.isUpgradePage = PagesModel.getCurrentPage() == 'billing';
			footerCtrl.isRegistered = footerCtrl.isLoggedIn && GLOBALS.user ? GLOBALS.user.isRegistered : false;
			footerCtrl.imagesUrl = GLOBALS.baseUrl + '/images/';
			footerCtrl.exoLinksWithAdblockOn = GLOBALS.exoLinksWithAdblockOn;
			footerCtrl.advertisement = GLOBALS.advertisement;
			footerCtrl.isExternalUpgradeSite = parseInt(GLOBALS.isExternalUpgradeSite);
			footerCtrl.isMainstream = GLOBALS.isMainstreamSite;
			footerCtrl.isRootTraffic = GLOBALS.userInfo.isRootTraffic;
			footerCtrl.hasFreeMovies = parseInt(GLOBALS.hasFreeMovies);
			footerCtrl.showAdvertisementLabel = GLOBALS.markAdvert && GLOBALS.userInfo.isRootTraffic;
			footerCtrl.contentWall = GLOBALS.contentWall;
			footerCtrl.showFooter = (footerCtrl.isLoggedIn && GLOBALS.loadMobileLayout) || !GLOBALS.loadMobileLayout;

			footerCtrl.desktopTabZonesExoClickUrls = GLOBALS.advertisement.desktopTabZonesExoClickUrls;
			footerCtrl.mobileTabZonesExoClickUrls = GLOBALS.advertisement.mobileTabZonesExoClickUrls;
			footerCtrl.desktopTabZonesAdniumUrls = GLOBALS.advertisement.desktopTabZonesAdniumUrls;
			footerCtrl.mobileTabZonesAdniumUrls = GLOBALS.advertisement.mobileTabZonesAdniumUrls;

			footerCtrl.stripcashCamTabUrl = GLOBALS.stripcashCamTabUrl;

			footerCtrl.currentUser = authService.currentUser;
			footerCtrl.isRootMainstreamTraffic = footerCtrl.isMainstream && GLOBALS.userInfo.isRootTraffic;
			if (footerCtrl.isLoggedIn && GLOBALS.userInfo.exoSubParams) {
				footerCtrl.exoSub2 = GLOBALS.userInfo.exoSubParams.sub2;
				footerCtrl.exoSub3 = GLOBALS.userInfo.exoSubParams.sub3;
				footerCtrl.exoSubUrlParams = '&sub2=' + footerCtrl.exoSub2 + '&sub3=' + footerCtrl.exoSub3;
			}
			footerCtrl.liveCamsIdZone = 'http://s.vlink4.com/splash.php?idzone=';
			footerCtrl.sexyGamesIdZone = 'http://s.vlink4.com/splash.php?idzone=';

			if (footerCtrl.isLoggedIn) {
				footerCtrl.liveCamsTab = footerCtrl.currentUser.liveCamsTab;
				footerCtrl.sexyGamesTab = footerCtrl.currentUser.sexyGamesTab;
				footerCtrl.moreGirlsTab = footerCtrl.currentUser.moreGirlsTab;
			}

			footerCtrl.setSafeMode = function () {
				ProfilesModel.setSafeMode().then(function () {
					var safeModeValue = !authService.currentUser.safeMode;
					authService.currentUser.safeMode = safeModeValue;
					footerCtrl.isSafeMode = safeModeValue;
					$rootScope.$broadcast('safeModeChanged');
				});
			};

			$scope.$on('sign-out:success', function () {
				footerCtrl.isLoggedIn = false;
				footerCtrl.currentUser = null;
			});

			footerCtrl.getCurrentPage = function () {
				return PagesModel.getCurrentPage();
			};

			footerCtrl.isCurrentPage = function (page) {
				return PagesModel.isCurrentPage(page);
			};

			footerCtrl.isActivityPage = function () {
				var currentPage = PagesModel.getCurrentPage();
				var activityPages = ['overview', 'matches', 'likesyou', 'viewedyou', 'youlike', 'youviewed'];
				return activityPages.indexOf(currentPage) > -1;
			};

			footerCtrl.goTop = function () {
				$('html, body').animate({ scrollTop: 0 }, 500);
			};

			footerCtrl.datingTabsNewBehaviour = function (event) {
				event.preventDefault();
				window.open(event.currentTarget.href);
			};

			if (footerCtrl.isLoggedIn) {
				footerCtrl.noAvatar = footerCtrl.currentUser.avatar.indexOf('no_photo_') > -1;
				$scope.$on('no_photo:true', function () {
					footerCtrl.noAvatar = true;
				});
				$scope.$on('no_photo:false', function () {
					footerCtrl.noAvatar = false;
				});
			}

			footerCtrl.isAdblockEnabled = false;

			window.ExoLoader.getDetector().detectCensorship(function (block) {
				if (block) {
					footerCtrl.isAdblockEnabled = true;
				}
				$scope.$on('$viewContentLoaded', placeAdCodes());
				angular.element($window).bind('resize', placeAdCodes());
			});

			function placeAdCodes() {
				if (footerCtrl.isLoggedIn) {
					footerCtrl.liveCamsUrl = footerCtrl.liveCamsTab.url;
					footerCtrl.sexyGamesUrl = footerCtrl.sexyGamesTab.url;
					footerCtrl.pickupUrl = footerCtrl.moreGirlsTab.url;

					if (footerCtrl.isAdblockEnabled && footerCtrl.exoLinksWithAdblockOn) {
						footerCtrl.liveCamsUrl += '&tags=adblock';
						footerCtrl.sexyGamesUrl += '&tags=adblock';
					}
				}
			}
		}
	)
	.controller(
		'LeftUserNavCtrl',
		function (
			$scope,
			$state,
			$stateParams,
			$location,
			authService,
			EventsModel,
			PagesModel,
			ProfilesModel,
			userAccess,
			globalParamsService,
			$window,
			TickerService
		) {
			var GLOBALS = globalParamsService.GLOBALS;
			var leftUserNavCtrl = this,
				currentPage = $stateParams.page || 1,
				searchFilter = ProfilesModel.parseSearchParams($stateParams.filter);
			leftUserNavCtrl.getCurrentPage = function () {
				return PagesModel.getCurrentPage();
			};
			$scope.$on('userLoggedIn', function () {
				setCtrl();
			});

			function setCtrl() {
				$scope.GLOBALS = globalParamsService.GLOBALS;
				leftUserNavCtrl.isMobile = parseInt(GLOBALS.isMobile);
				leftUserNavCtrl.isLoggedIn = authService.isAuthenticated;
				leftUserNavCtrl.currentUser = authService.currentUser;
				leftUserNavCtrl.creditsUrl = GLOBALS.siteUrl + 'profile/edit/settings' + '#credits';
				leftUserNavCtrl.showExoclickAds =
					leftUserNavCtrl.currentUser && leftUserNavCtrl.currentUser.showExoclickAds ? true : false;
				leftUserNavCtrl.isSafeMode = authService.isAuthenticated ? !!authService.currentUser.safeMode : true;
				leftUserNavCtrl.advertisement = GLOBALS.advertisement;
				leftUserNavCtrl.isMainstream = GLOBALS.isMainstreamSite;
				leftUserNavCtrl.isRootMainstreamTraffic = leftUserNavCtrl.isMainstream && GLOBALS.userInfo.isRootTraffic;
				leftUserNavCtrl.hasFreeMovies = parseInt(GLOBALS.hasFreeMovies);
				leftUserNavCtrl.showAdvertisementLabel = GLOBALS.markAdvert && GLOBALS.userInfo.isRootTraffic;
				leftUserNavCtrl.contentWall = GLOBALS.contentWall;
				leftUserNavCtrl.desktopTabZonesExoClickUrls = GLOBALS.advertisement.desktopTabZonesExoClickUrls;
				leftUserNavCtrl.mobileTabZonesExoClickUrls = GLOBALS.advertisement.mobileTabZonesExoClickUrls;
				leftUserNavCtrl.desktopTabZonesAdniumUrls = GLOBALS.advertisement.desktopTabZonesAdniumUrls;
				leftUserNavCtrl.mobileTabZonesAdniumUrls = GLOBALS.advertisement.mobileTabZonesAdniumUrls;
				leftUserNavCtrl.stripcashCamTabUrl = GLOBALS.stripcashCamTabUrl;
				leftUserNavCtrl.isExternalUpgradeSite = parseInt(GLOBALS.isExternalUpgradeSite);
				if (leftUserNavCtrl.isLoggedIn && !userAccess.hasAccess) {
					leftUserNavCtrl.isLoggedIn = false;
				}
				if (leftUserNavCtrl.isLoggedIn && GLOBALS.userInfo.exoSubParams) {
					leftUserNavCtrl.exoSub2 = GLOBALS.userInfo.exoSubParams.sub2;
					leftUserNavCtrl.exoSub3 = GLOBALS.userInfo.exoSubParams.sub3;
					leftUserNavCtrl.exoSubUrlParams = '&sub2=' + leftUserNavCtrl.exoSub2 + '&sub3=' + leftUserNavCtrl.exoSub3;
				}
				if (leftUserNavCtrl.isExternalUpgradeSite) {
					leftUserNavCtrl.upgradeUrl = leftUserNavCtrl.isLoggedIn ? GLOBALS.userInfo.partnerBillingRedirectUrl : '';
					leftUserNavCtrl.upgradeText = leftUserNavCtrl.isBillingPartnerCmp ? 'Unlimited Access' : 'Get Verified';
				} else {
					leftUserNavCtrl.upgradeUrl = '/billing/upgrade';
					leftUserNavCtrl.upgradeText = 'Upgrade now';
				}
				leftUserNavCtrl.isBillingPartnerCmp =
					GLOBALS.userInfo.billingPartner && parseInt(GLOBALS.userInfo.billingPartner) === 7;
				if (leftUserNavCtrl.isLoggedIn) {
					leftUserNavCtrl.liveCamsTab = leftUserNavCtrl.currentUser.liveCamsTab;
					leftUserNavCtrl.sexyGamesTab = leftUserNavCtrl.currentUser.sexyGamesTab;
					leftUserNavCtrl.moreGirlsTab = leftUserNavCtrl.currentUser.moreGirlsTab;
				}
				if (leftUserNavCtrl.currentUser) {
					TickerService.startInterval();
				}
			}

			$scope.$watch(
				function () {
					return TickerService.tickers;
				},
				function (newTickers) {
					leftUserNavCtrl.tickers = angular.copy(newTickers);
				},
				true
			);

			function init() {
				setCtrl();
				leftUserNavCtrl.liveCamsIdZone = 'http://s.vlink4.com/splash.php?idzone=';
				leftUserNavCtrl.sexyGamesIdZone = 'http://s.vlink4.com/splash.php?idzone=';
			}

			init();

			leftUserNavCtrl.updateUI = function () {
				leftUserNavCtrl.showEditProfileNav = leftUserNavCtrl.getCurrentPage() === 'EditProfile';
				leftUserNavCtrl.showUpdatesWidget =
					leftUserNavCtrl.getCurrentPage() === 'Dashboard' || leftUserNavCtrl.getCurrentPage() === 'Profiles';
				leftUserNavCtrl.showMainNav = leftUserNavCtrl.getCurrentPage() !== 'EditProfile';
				leftUserNavCtrl.showSearchWidget =
					leftUserNavCtrl.getCurrentPage() === 'ViewProfile' || leftUserNavCtrl.getCurrentPage() === 'Play';
			};
			leftUserNavCtrl.updateUI();
			leftUserNavCtrl.getCurrentSection = function () {
				return $location.path();
			};
			ProfilesModel.getSearchProfiles(currentPage, searchFilter).then(function (result) {
				leftUserNavCtrl.searchProfiles = result.profiles;
				leftUserNavCtrl.totalProfiles = result.total_profiles;
				leftUserNavCtrl.currentPage = currentPage;
				leftUserNavCtrl.isLoading = false;
			});

			$scope.$on('sign-out:success', function () {
				leftUserNavCtrl.isLoggedIn = false;
				leftUserNavCtrl.currentUser = null;
			});

			leftUserNavCtrl.onMessagesSelected = function () {
				EventsModel.sendEvent('updateLastViewedMessagesTab');
				TickerService.tickers.nNewMessages = 0;
				leftUserNavCtrl.tickers.nNewMessages = 0;
			};

			leftUserNavCtrl.onMatchesSelected = function () {
				EventsModel.sendEvent('updateLastViewedMatchesTab');
				TickerService.tickers.nNewMatches = 0;
				leftUserNavCtrl.tickers.nNewMatches = 0;
			};

			leftUserNavCtrl.onViewedYouSelected = function () {
				EventsModel.sendEvent('updateViewedYouTabTime');
				TickerService.tickers.nNewViewedYou = 0;
				leftUserNavCtrl.tickers.nNewViewedYou = 0;
			};

			leftUserNavCtrl.onLikesYouSelected = function () {
				EventsModel.sendEvent('updateLastViewedRequestsTab');
				TickerService.tickers.nNewLikesYou = 0;
				leftUserNavCtrl.tickers.nNewLikesYou = 0;
			};

			leftUserNavCtrl.datingTabsNewBehaviour = function (event) {
				event.preventDefault();
				window.open(event.currentTarget.href);
			};

			$scope.$on('$locationChangeStart', function () {
				leftUserNavCtrl.updateUI();
			});

			$scope.$on('$viewContentLoaded', placeAdCodes());
			angular.element($window).bind('resize', placeAdCodes());

			function placeAdCodes() {
				if (leftUserNavCtrl.isLoggedIn) {
					leftUserNavCtrl.liveCamsUrl = leftUserNavCtrl.liveCamsTab.url;
					leftUserNavCtrl.sexyGamesUrl = leftUserNavCtrl.sexyGamesTab.url;
					leftUserNavCtrl.pickupUrl = leftUserNavCtrl.moreGirlsTab.url;
				}
			}

			$scope.$on('$destroy', function () {
				TickerService.stopInterval();
			});
		}
	)
	.controller(
		'SearchFormCtrl',
		function (
			$scope,
			$state,
			$stateParams,
			PagesModel,
			ProfilesModel,
			globalParamsService,
			PROFILE_SETTINGS,
			authService,
			$modal
		) {
			var GLOBALS = globalParamsService.GLOBALS;

			var searchFormCtrl = this,
				currentPage = $stateParams.page || 1,
				profilesPerPage = 20,
				searchFilter = ProfilesModel.parseSearchParams($stateParams.filter),
				defaultFilter;
			searchFormCtrl.isLoggedIn = authService.isAuthenticated;
			searchFormCtrl.currentUser = authService.currentUser;

			ProfilesModel.getSearchProfiles(currentPage, searchFilter).then(function (result) {
				searchFormCtrl.searchProfiles = result.profiles;
				searchFormCtrl.totalProfiles = result.total_profiles;
				searchFormCtrl.currentPage = currentPage;
				searchFormCtrl.isLoading = false;
			});

			searchFormCtrl.getCurrentPage = function () {
				return PagesModel.getCurrentPage();
			};

			searchFormCtrl.showUpgradePopup = function () {
				if (
					searchFormCtrl.nProfileInsteadOfLprofile &&
					(!searchFormCtrl.isLoggedIn || searchFormCtrl.currentUser.membership !== 'premium')
				) {
					$modal.open({
						templateUrl: globalParams.templateUrls.pages.upgrade_popup,
						controller: 'UpgradeBoxCtrl as upgradeBoxCtrl',
						size: 'upgradePopup'
					});
				}
			};

			searchFormCtrl.pageChanged = function () {
				$state.go('dating.pages.profiles', {
					page: searchFormCtrl.currentPage
				});
			};

			searchFormCtrl.filterProfiles = function () {
				$state.go('dating.pages.profiles', {
					page: searchFormCtrl.currentPage,
					filter: ProfilesModel.buildSearchParams(searchFormCtrl.profilesFilter)
				});
			};

			searchFormCtrl.countryChange = function () {
				$scope.$broadcast('angucomplete-alt:clearInput');
			};

			searchFormCtrl.autocompleteDataFormatCallback = function (str) {
				return {
					q: str,
					limit: 20,
					country: searchFormCtrl.profilesFilter.whereCountry
				};
			};

			searchFormCtrl.autocompleteObjectSelectedCallback = function (selectedCity) {
				selectedCity = selectedCity || {
					originalObject: { region: '', textKey: '' }
				};
				searchFormCtrl.profilesFilter.whereCity = selectedCity.originalObject.region;
				searchFormCtrl.profilesFilter.whereExactLocation = selectedCity.originalObject.textKey;
			};
			searchFormCtrl.isLoading = true;
			searchFormCtrl.countries = ProfilesModel.getSearchCountries();
			searchFormCtrl.minAges = ProfilesModel.getMinAges();
			searchFormCtrl.maxAges = ProfilesModel.getMaxAges();
			searchFormCtrl.profilesPerPage = profilesPerPage;
			searchFormCtrl.nProfileInsteadOfLprofile = GLOBALS.nProfileInsteadOfLprofile;
			defaultFilter = {
				whereCountry: GLOBALS.userInfo.location,
				whereCity: GLOBALS.userInfo.city,
				lowAge: searchFormCtrl.minAges[0],
				highAge: searchFormCtrl.minAges[searchFormCtrl.minAges.length - 1],
				withPhotos: true
			};

			var obj = _.find(searchFormCtrl.countries, ['code', defaultFilter.whereCountry]);
			if (!obj) {
				defaultFilter.whereCountry = '';
				defaultFilter.whereCity = '';
			}

			searchFormCtrl.profilesFilter = searchFilter ? searchFilter : defaultFilter;
			searchFormCtrl.profileSettingsOptions =
				PROFILE_SETTINGS[searchFormCtrl.currentUser ? (searchFormCtrl.currentUser.gender == 1 ? 2 : 1) : 1];
			_.each(searchFormCtrl.profileSettingsOptions, function (item, key) {
				_.each(item, function (text, id) {
					if (key == 'education' && text.indexOf('(') > -1) {
						//adjust by removing () from Associate's degree (2 years college) and BA/BS (4 years college)
						text = text.replace(/ *\([^)]*\) */g, '');
						item[id] = text;
					}
					if (key == 'height' && text.indexOf('/') > -1) {
						//adjust by removing ft measures
						text = text.replace(/ *[^)]*\/ */g, '');
						item[id] = text;
					}
				});
				searchFormCtrl.profileSettingsOptions[key] = item;
			});
			$scope.$on('sign-out:success', function () {
				searchFormCtrl.isLoggedIn = false;
				searchFormCtrl.currentUser = null;
			});
		}
	)
	.controller(
		'OverlayCtrl',
		function ($scope, $state, $stateParams, PagesModel, ProfilesModel, globalParamsService, authService) {
			var GLOBALS = globalParamsService.GLOBALS;
			var overlayCtrl = this;
			overlayCtrl.siteDomain = GLOBALS.siteDomain;
			overlayCtrl.siteName = GLOBALS.siteName;
			overlayCtrl.imagesUrl = GLOBALS.baseUrl + '/styles/images/';
			overlayCtrl.cupidMail = GLOBALS.cupidDomain;

			overlayCtrl.overlays = {};
			var sent = false;

			overlayCtrl.showOverlay = function (overlayName, setupFocus, EventsModel) {
				setupFocus = typeof setupFocus !== 'undefined' ? setupFocus : false;
				overlayCtrl.overlays[overlayName] = true;

				if (setupFocus && GLOBALS.cookie1ClickActionsSooner) {
					$(window).on('focus mousemove touchmove', function () {
						if (sent) {
							return;
						}
						EventsModel.updateFocus();
						sent = true;
					});
				}
			};

			overlayCtrl.hideOverlay = function (overlayName) {
				overlayCtrl.overlays[overlayName] = false;
			};

			overlayCtrl.isOverlayVisible = function (overlayName) {
				return !!overlayCtrl.overlays[overlayName];
			};

			overlayCtrl.toggleOverlay = function (overlayName) {
				if (overlayCtrl.isOverlayVisible(overlayName)) {
					overlayCtrl.hideOverlay(overlayName);
				} else {
					overlayCtrl.showOverlay(overlayName);
				}
			};

			$scope.$on('overlay:show', function (event, data, setupFocus) {
				setupFocus = typeof setupFocus !== 'undefined' ? setupFocus : false;
				overlayCtrl.showOverlay(data, setupFocus);
			});

			$scope.$on('overlay:hide', function (event, data) {
				overlayCtrl.overlays[data] = false;
			});

			function handleRegistrationOverlay() {
				var user = GLOBALS.user;

				if (user.justRegistered) {
					overlayCtrl.showOverlay('registerStep2');
				}

				if (user.showUploadPhotoDescriptionBox) {
					if (user.showOneClickBox) {
						overlayCtrl.showOverlay('fullOneClick', true);
					} else {
						overlayCtrl.showOverlay('registerStep3');
					}
				}

				if (user.resetPassword) {
					overlayCtrl.showOverlay('updatePassword');
				}

				var affiliateSteps = [
					{ condition: user.affiliateOneClickBox, overlay: 'basicOneClickStep1' },
					{ condition: user.affiliateOneClickBoxStep2, overlay: 'basicOneClickStep2' },
					{ condition: user.affiliateOneClickBoxStep3, overlay: 'basicOneClickStep3' }
				];

				affiliateSteps.forEach(function (step) {
					if (step.condition) {
						overlayCtrl.showOverlay(step.overlay, true);
					}
				});
			}
			if (authService.isAuthenticated && GLOBALS.loadMobileLayout) {
				handleRegistrationOverlay();
			}
			$scope.$on('userLoggedIn', function () {
				handleRegistrationOverlay();
			});
		}
	)
	.directive('resizeSelect', function () {
		return {
			restrict: 'A',
			link: function ($scope, $elm) {
				function resizeElement() {
					$('#hiddenSelect option').html($('#' + $($elm).attr('id') + ' option:selected').text());
					$('#' + $($elm).attr('id')).width($('#hiddenSelect').width() - 20);
				}

				$elm.on('change', resizeElement);
				setTimeout(resizeElement, 10);
			}
		};
	})
	.controller(
		'BodyCtrl',
		function (
			authService,
			userAccess,
			$scope,
			$window,
			PagesModel,
			showEnableRebillPopup,
			ProfilesModel,
			globalParamsService,
			$sce
		) {
			var GLOBALS = globalParamsService.GLOBALS;
			var bodyCtrl = this;
			$scope.$on('userLoggedIn', function () {
				setCtrl();
			});

			function setCtrl() {
				bodyCtrl.showContentWallFS = GLOBALS.showContentWallAI;
				bodyCtrl.showContentWallABTest = GLOBALS.showContentWallABTest;
				bodyCtrl.contentWallUrl = $sce.trustAsResourceUrl(GLOBALS.contentWallUrl);
				bodyCtrl.isLoggedIn = authService.isAuthenticated;
				bodyCtrl.isMainstreamSite = GLOBALS.isMainstreamSite;
				bodyCtrl.showLeftNav = bodyCtrl.isLoggedIn;
				bodyCtrl.isFeaturedEnabled = parseInt(GLOBALS.isFeaturedEnabled);
				bodyCtrl.showFeaturedFS = GLOBALS.showFeaturedFunctionality;
				bodyCtrl.isFeatured = GLOBALS.userInfo.isFeatured;
				bodyCtrl.isPremium = authService.currentUser && authService.currentUser.membership === 'premium';
				bodyCtrl.isCreditsSite = parseInt(GLOBALS.isCreditsSite);

				if (parseInt(GLOBALS.isMobile) && bodyCtrl.showContentWallFS) {
					var observer = new MutationObserver(function (mutations) {
						mutations.forEach(function (mutation) {
							if (mutation.type === 'childList') {
								var iframe = angular.element(document.querySelector('.dashboard-content-wall'));
								if (iframe.length) {
									iframe[0].onload = function () {
										iframe[0].style.height = GLOBALS.user.showNotificationBar ? '75%' : '95%';
									};
								}
							}
						});
					});
					var config = { childList: true, subtree: true };
					observer.observe(document.body, config);
				}
			}

			$scope.$on('featuredMembershipPurchased', function () {
				bodyCtrl.isFeatured = true;
			});

			$scope.$on('sign-out:success', function () {
				bodyCtrl.isLoggedIn = false;
				bodyCtrl.showLeftNav = false;
			});

			$scope.$watch(
				function () {
					return authService.currentUser ? authService.currentUser.safeMode : null;
				},
				function (newValue, oldValue) {
					if (newValue !== oldValue) {
						var isGuest = parseInt(window.globalParams.isGuest);
						var ccpEnabled = window.globalParams.ccpEnabled;
						var isUpgradePage = window.globalParams.isUpgradePage;
						var ccpConfig = window.globalParams.CCP_BACKUP_CONFIG;
						if (!isGuest && ccpEnabled && !isUpgradePage && ccpConfig) {
							ccpConfig.safeMode = newValue ? '1' : '';
							if (window.CCP) {
								window.CCP.initWidget(document.getElementById('chat-widget'), ccpConfig);
							}
						}
					}
				},
				true
			);

			bodyCtrl.getCurrentPage = function () {
				return PagesModel.getCurrentPage();
			};

			$scope.$on('$viewContentLoaded', function () {
				bodyCtrl.inViewProfile = bodyCtrl.getCurrentPage() === 'ViewProfile';
				bodyCtrl.notInFullPageAd = bodyCtrl.getCurrentPage() !== 'FullPageAd';
				bodyCtrl.notInSignOutAd = bodyCtrl.getCurrentPage() !== 'signOutAd';
				bodyCtrl.notInProfiles = bodyCtrl.getCurrentPage() !== 'Profiles';
				bodyCtrl.notInRegOfferOne = bodyCtrl.getCurrentPage() !== 'RegOfferOne';
				bodyCtrl.notInRegOfferTwo = bodyCtrl.getCurrentPage() !== 'RegOfferTwo';
				bodyCtrl.notInUpgrade = bodyCtrl.getCurrentPage() !== 'billing';
				bodyCtrl.inEditProfile = bodyCtrl.getCurrentPage() === 'EditProfile';
				bodyCtrl.inDashboard = bodyCtrl.getCurrentPage() === 'Dashboard';
				bodyCtrl.inMessages = bodyCtrl.getCurrentPage() === 'Messages';
				bodyCtrl.inDatingCenter = bodyCtrl.getCurrentPage() === 'DatingCenter';
				bodyCtrl.inActivity = ['matches', 'viewedyou', 'likesyou', 'youlike'].indexOf(bodyCtrl.getCurrentPage()) !== -1;
				bodyCtrl.notInSeparateUnsubscribe = bodyCtrl.getCurrentPage() !== 'SeparateUnsubscribe';
				bodyCtrl.inEmailOffer = bodyCtrl.getCurrentPage() && bodyCtrl.getCurrentPage().includes('EmailOffer');
				bodyCtrl.contentWallUrl = $sce.trustAsResourceUrl(GLOBALS.contentWallUrl);
				bodyCtrl.showContentWall =
					bodyCtrl.inDashboard &&
					(bodyCtrl.showContentWallFS || bodyCtrl.showContentWallABTest) &&
					bodyCtrl.contentWallUrl;
			});

			bodyCtrl.customRebillPopupsStep4 = function () {
				$('.rebillCustomPopup3').hide();
				ProfilesModel.changeRebill(1).then(function () {
					window.location.reload();
				});
			};

			$scope.$on('showEnableRebillPopup', function () {
				showEnableRebillPopup();
			});

			function init() {
				bodyCtrl.mobileResolution = false;
				bodyCtrl.isMobile = false;
				bodyCtrl.profiles = [
					{ picture: 'Marguot.png', name: 'Marguot' },
					{ picture: 'mrsdiva.png', name: 'mrsdiva' },
					{ picture: 'amoreamo.png', name: 'amoreamo' },
					{ picture: 'grownsexy.png', name: 'grownnsexy' },
					{ picture: 'Zeina.png', name: 'Zeina' },
					{ picture: 'daringnicole.png', name: 'daringnicole' }
				];
				setCtrl();
			}

			init();
		}
	)
	.controller('DocumentClickCtrl', function (globalParamsService, EventsModel, authService, $scope) {
		var GLOBALS = globalParamsService.GLOBALS;
		var documentClickCtrl = this;
		$scope.$on('userLoggedIn', function () {
			setCtrl();
		});

		function setCtrl() {
			documentClickCtrl.removeOptimiserRedirects = GLOBALS.removeOptimiserRedirects;
			documentClickCtrl.currentUser = authService.currentUser;
			documentClickCtrl.isLoggedIn = authService.isAuthenticated;
			if (!documentClickCtrl.removeOptimiserRedirects) {
				documentClickCtrl.showPopUnder = showPopUnder;
			}
			if (documentClickCtrl.isLoggedIn) {
				if (
					GLOBALS.displayOneclickPopupOnExit &&
					!documentClickCtrl.removeOptimiserRedirects &&
					!GLOBALS.userInfo.showFullPageAd
				) {
					angular.element(document).one('click', 'a:not(.no-under)', function (ev) {
						ev.stopPropagation();
						documentClickCtrl.showPopUnder(angular.element(this).attr('href'));
					});
				}
			}
		}

		function showPopUnder(url) {
			var emailCurrentUser, subId, groupIdExitPopup, urlPopUnder, keyword;
			if (url == undefined) {
				url = window.location.href;
			}

			function createPopUnder(sUrl) {
				var parent = top != self && typeof top.document.location.toString() === 'string' ? top : self;
				var pName = '_blank';
				var pWidth = $(window).width();
				var pHeight = $(window).height();
				var pPosX = window.screenX != undefined ? window.screenX : 0;
				var pPosY = window.screenY != undefined ? window.screenY : 0;
				var pMenuBar = window.menubar && window.menubar.visible == true ? 'yes' : 'no';
				var pToolBar = window.toolbar && window.toolbar.visible == true ? 'yes' : 'no';
				var browser = (function () {
					var n = navigator.userAgent.toLowerCase();
					var b = '';
					if (/msie|trident/i.test(n) || /msie/i.test(n)) {
						b = 'ie';
					} else if (/firefox/i.test(n)) {
						b = 'firefox';
					} else if (/opera/i.test(n) || /opr/i.test(n)) {
						b = 'opera';
					} else if (/chrome/i.test(n) && /windows/i.test(n)) {
						b = 'chrome';
					} else if (/webkit/i.test(n)) {
						b = 'webkit';
					} else if (/safari/i.test(n) && !/chrome/.test(n)) {
						b = 'safari';
					}
					return b;
				})();

				function openNewBackgroundTab() {
					var a = document.createElement('a');
					a.href = sUrl;
					var evt = document.createEvent('MouseEvents');
					evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, true, false, false, false, 0, null);
					a.dispatchEvent(evt);
				}

				function openCloseWindow() {
					var ghost = window.open('about:blank');
					ghost.focus();
					ghost.close();
				}

				var sOptions =
					'toolbar=' +
					pToolBar +
					',scrollbars=yes,location=yes,statusbar=yes,menubar=' +
					pMenuBar +
					',resizable=1,width=' +
					pWidth.toString() +
					',height=' +
					pHeight.toString() +
					',screenX=' +
					pPosX +
					',screenY=' +
					pPosY;

				if (browser == 'chrome' || browser == 'opera') {
					openNewBackgroundTab(sUrl);
				} else {
					var popUnder = parent.window.open(sUrl, pName, sOptions);
					if (popUnder) {
						try {
							popUnder.blur();
							popUnder.opener.window.focus();
							window.self.window.blur();
							window.focus();
							if (browser == 'firefox') {
								openCloseWindow();
							}
						} catch (e) {
							// popunder blocked by browser
						}
					}
				}
			}

			if (documentClickCtrl.isLoggedIn) {
				emailCurrentUser = documentClickCtrl.currentUser.emailCurrentUser;
				if (GLOBALS.displayOneclickPopupOnExit && emailCurrentUser) {
					GLOBALS.displayOneclickPopupOnExit = false;
					subId = documentClickCtrl.currentUser.subid;
					groupIdExitPopup = GLOBALS.groupIdExitPopup ? GLOBALS.groupIdExitPopup : 94;
					keyword = parseInt(GLOBALS.isMobile) ? GLOBALS.siteShortName + '_mobile' : GLOBALS.siteShortName;
					urlPopUnder =
						GLOBALS.tmDomain +
						'?group_id=' +
						groupIdExitPopup +
						'&keyword=' +
						keyword +
						'&email=' +
						emailCurrentUser +
						'&subid=' +
						subId;
					EventsModel.sendEvent('updateLastViewedOneclickPopupOnExit');
					createPopUnder(urlPopUnder);
				}
			}
		}

		setCtrl();

		$scope.$on('sign-out:success', function () {
			documentClickCtrl.isLoggedIn = false;
			documentClickCtrl.currentUser = null;
		});
	})
	.directive('documentClick', [
		'globalParamsService',
		function () {
			return {
				restrict: 'A',
				controller: 'DocumentClickCtrl',
				controllerAs: 'documentClickCtrl',
				bindToController: true,
				link: function () {}
			};
		}
	])
	.controller('UpgradeBoxCtrl', function (PagesModel, authService, globalParamsService) {
		var upgradeBoxCtrl = this;
		var GLOBALS = globalParamsService.GLOBALS;
		upgradeBoxCtrl.isLoggedIn = authService.isAuthenticated;
		var externalUpgradeUrl = upgradeBoxCtrl.isLoggedIn ? GLOBALS.userInfo.partnerBillingRedirectUrl : '';
		upgradeBoxCtrl.upgradeUrl = parseInt(GLOBALS.isExternalUpgradeSite) ? externalUpgradeUrl : '/billing/upgrade';
		upgradeBoxCtrl.isExternalUpgradeSite = parseInt(GLOBALS.isExternalUpgradeSite);
		upgradeBoxCtrl.isBillingPartnerCmp =
			GLOBALS.userInfo.billingPartner && parseInt(GLOBALS.userInfo.billingPartner) === 7;

		upgradeBoxCtrl.getCurrentPage = function () {
			return PagesModel.getCurrentPage();
		};

		if (upgradeBoxCtrl.getCurrentPage() === 'EditProfile') {
			upgradeBoxCtrl.title = 'Location settings are available for premium users only!';
		} else {
			upgradeBoxCtrl.title = 'Advanced search options are available for premium users only!';
		}
	});
