<!doctype html>
<html>
	<head>
		

		<meta property="og:title" content="ACTIVE8 Member Portal">
		
			<meta property="og:image" content="https://active8fitness.gymmasteronline.com/portal/static/asset/active8fitness.asset/logo_2.png?v=1636673576.7089775">
		

		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<title>ACTIVE8 Member Portal | Home - ACTIVE8 Member Portal</title>
		<link href="https://active8fitness.gymmasteronline.com/portal/static/css/bootstrap.min.css?v=1677183786.0339115" rel="stylesheet">
		<link href="https://active8fitness.gymmasteronline.com/portal/static/css/custom.css?v=1711573565.3132117" rel="stylesheet">
		<link rel="stylesheet" type="text/css" href="https://active8fitness.gymmasteronline.com/portal/static/3rdparty/glyphicons/css/glyphicons.css?v=1677183786.0179112">
		<link rel="stylesheet" type="text/css" href="https://active8fitness.gymmasteronline.com/portal/static/3rdparty/glyphicons/css/glyphicons-filetypes.css?v=1677183786.0179112">
		<link rel="stylesheet" type="text/css" href="https://active8fitness.gymmasteronline.com/portal/static/3rdparty/glyphicons/css/glyphicons-halflings.css?v=1677183786.0179112">
		<link rel="stylesheet" type="text/css" href="https://active8fitness.gymmasteronline.com/portal/static/3rdparty/glyphicons/css/glyphicons-social.css?v=1677183786.0179112">

		
		<link rel="shortcut icon" href="https://active8fitness.gymmasteronline.com/static/favicon.ico">

		

		<meta name="gm_release" content="v1280.wraith">
<meta name="gm_server" content="syd48.gymmasteronline.com">
<meta name="gm_location" content="home.login">
<meta name="gm_userid" value="">
<script src="https://active8fitness.gymmasteronline.com/portal/static/3rdparty/sentry/bundle.min.js?v=1677183786.0299115"></script>
<script src="https://active8fitness.gymmasteronline.com/portal/static/components/js/sentry.js?v=1705554967.8528259"></script>

		<script src="https://active8fitness.gymmasteronline.com/portal/static/3rdparty/jquery-1.11.2.min.js?v=1677183786.0259113"></script>
		<script src="https://active8fitness.gymmasteronline.com/portal/static/3rdparty/underscore-min.js?v=1677183786.0299115"></script>
		<script src="https://active8fitness.gymmasteronline.com/portal/static/3rdparty/moment-with-locales.min.js?v=1677183786.0299115"></script>
		<script src="https://active8fitness.gymmasteronline.com/portal/static/3rdparty/bootstrap.min.js?v=1677183786.0139112"></script>
		<script src="https://active8fitness.gymmasteronline.com/portal/static/3rdparty/jquery.validate.min.js?v=1677183786.0299115"></script>
		<script src="https://active8fitness.gymmasteronline.com/portal/static/3rdparty/iframeResizer.contentWindow.min.js?v=1677183786.0219114"></script>
		<script src="https://active8fitness.gymmasteronline.com/portal/static/3rdparty/bootstrap-datepicker.min.js?v=1677183786.0139112"></script>
		<script src="https://active8fitness.gymmasteronline.com/portal/static/3rdparty/jSignature.min.js?v=1677183786.0259113"></script>
		<script src="https://active8fitness.gymmasteronline.com/portal/static/js/custom-utils.js?v=1677183786.053912"></script>

		<script>
			// fix for  old versions of IE
			if (!window.console) {
				window.console = {};
				window.console.log = function () {};
				window.console.info = function () {};
				window.console.warn = function () {};
				window.console.error = function () {};
			}

			window.mp = {}
			window.mp.hook = {};

			(function() {
				var hooks = {};
				window.mp.hook.add = function(name, func) {
					if (!hooks[name]) hooks[name] = [];
					hooks[name].push(func);
				}

				window.mp.hook.call = function(name) {
					if (hooks[name]) hooks[name].forEach(function(f) {
						f();
					});
					if (name !== 'all') {
						// Fire handler for all events
						window.mp.hook.call('all');
					}
				}
			})();
		</script>

		
		
		<link href="https://active8fitness.gymmasteronline.com/portal/static/css/font-awesome.min.css?v=1677183786.0339115" rel="stylesheet">
		<link href="https://active8fitness.gymmasteronline.com/portal/static/css/bootstrap-datepicker3.min.css?v=1677183786.0299115" rel="stylesheet">

		
		<link href="https://active8fitness.gymmasteronline.com/portal/static/css/googlefonts_opensans.css?v=1677183786.0339115" rel='stylesheet' type='text/css'>
		<meta charset=utf-8 />

		

		

		

		

		

		
	</head>
	<body>
		
		<div class="companylogo-center col-xs-12">
			<img class="img-responsive" src="https://active8fitness.gymmasteronline.com/portal/static/asset/active8fitness.asset/logo_2.png?v=1636673576.7089775">
		</div>
		
		

		<a id="base_breakout_toplink" target="_top" class="none">
			<h1>
				Redirecting to mobile view. Please click here if redirection does not work.
			</h1>
		</a>

		<div id="wrap">
			<div id="flash_div" class="col-xs-12">
				
			</div>



			
			<div id="billingprovider_flash_stripe_div" class="col-xs-12 none">
				<div class="alert alert-info alert-dismissible"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>Please "Continue" to add payment details for Stripe realtime payment.  Please Note the CC details you add now, will NOT be saved.</div>
			</div>

			
			<div id="loadingcontainer" class="loadingcontainer none col-xs-12 col-sm-12 col-md-12 clearfix">
			  	<div class="loader">
			    	<div class="loader--dot"></div>
			    	<div class="loader--dot"></div>
			    	<div class="loader--dot"></div>
			    	<div class="loader--dot"></div>
			    	<div class="loader--dot"></div>
			    	<div class="loader--dot"></div>
			    	<div class="loader--text">Loading...</div>
			  	</div>
			</div>
			

		


<div class="container login ">
	<div class="page-header col-xs-12 col-sm-12">
		
		<h3>ACTIVE8 Member Portal</h3>
		
		
	</div>
	<div class="login-content col-xs-12 col-sm-12">
		<form method="post" class="form-horizontal" id="login_form">
			
			<div class="form-group col-xs-12 col-sm-12">
				<input type="email" class="form-control" name="email" placeholder="Email" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Email'">
			</div>
			<div class="form-group col-xs-12 col-sm-12">
				<input type="password" class="form-control" name="password" placeholder="Password" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Password'">
				<i id="passwd-btn" class="fa fa-eye fa-2x" title="Show/Hide password" aria-hidden="true"></i>
			</div>
			
			

			<div class="submit-button col-xs-12 col-sm-12">
				<div class="loginbutton nopadding col-xs-12">
					
					
					<div class="col-xs-12 login-portal">
						
						<button type="submit" class="btn btn-success btn-login">Member Log In</button>
						
					</div>
					
					<div class="col-xs-12 nopadding forgotpass">
						<a href="/portal/recover_password?session=eyJjb250ZXh0X2NvbXBhbnlpZCI6MiwibGFuZ3VhZ2UiOiJlbl9VUyIsImlwX2FkZHIiOiIxMDEuMTg3LjE3My4xNTUifQ.ZiYVbA.NJVIQBDSlrN0Yni5-jpPm3Pjh88" class="forgot-pass">Forgot Password?</a>
					</div>
				</div>

				
					<input name="facebook_userid" hidden>
					<input name="firstname" hidden>
					<input name="surname" hidden>
				

			</div>

			<div class="casualbooking-button col-xs-12 col-sm-12 nopadding">
				
				<div class="signupbutton col-xs-6">
					<a href="/portal/signup?session=eyJjb250ZXh0X2NvbXBhbnlpZCI6MiwibGFuZ3VhZ2UiOiJlbl9VUyIsImlwX2FkZHIiOiIxMDEuMTg3LjE3My4xNTUifQ.ZiYVbA.NJVIQBDSlrN0Yni5-jpPm3Pjh88" class="btn btn-primary btn-signUp signup-params">
							Sign Up
						</a>
					
				</div>
				
				
				<div class="enquirybutton col-xs-6">
					<a href="/portal/enquiry?session=eyJjb250ZXh0X2NvbXBhbnlpZCI6MiwibGFuZ3VhZ2UiOiJlbl9VUyIsImlwX2FkZHIiOiIxMDEuMTg3LjE3My4xNTUifQ.ZiYVbA.NJVIQBDSlrN0Yni5-jpPm3Pjh88" class="btn btn-primary btn-enquiry">Enquiry</a>
				</div>
				

				
				<div class="casualbutton col-xs-12 col-sm-12">
					<a type="submit" class="btn btn-primary btn-casualmember" href="/portal/casual_form?session=eyJjb250ZXh0X2NvbXBhbnlpZCI6MiwibGFuZ3VhZ2UiOiJlbl9VUyIsImlwX2FkZHIiOiIxMDEuMTg3LjE3My4xNTUifQ.ZiYVbA.NJVIQBDSlrN0Yni5-jpPm3Pjh88">
Not a Member? Make a Booking

</a>
				</div>
				
			</div>
		</form>
	</div>
	
</div>


		
		<div id="app-badge-container" class="">
			<div class="app-badge col-xs-6">
				<a href="https://play.google.com/store/apps/details?id=com.treshna.memberportal" target="_blank">
					<img class="img-responsive pull-right" src="https://active8fitness.gymmasteronline.com/portal/static/images/android-store.png?v=1677183786.0459118" alt="Google Play Store">
				</a>
			</div>
			<div class="app-badge col-xs-6">
				<a href="https://apps.apple.com/app/gymmaster-member/id1297093746" target="_blank">
					<img class="img-responsive pull-left" src="https://active8fitness.gymmasteronline.com/portal/static/images/ios-store.svg?v=1677183786.0499117" alt="iOS App Store">
				</a>
			</div>
		</div>
		



	<div class="gymmasterMark col-xs-12 col-sm-12">
		
			<a href="https://www.gymmaster.com" target="_blank">
				<h4>Membership Software by</h4>
				<h3><span class="gymText">GYM</span><span class="masterText">MASTER</span></h3>
			</a>
		

		
	</div>


		</div>

		<div class="modal fade alert_modal" id="alert_modal" tabindex="-1" role="dialog" aria-labelledby="alert_modal_label">
			<div class="modal-dialog" role="document">
				<div class="modal-content col-xs-12 col-sm-12">
					<div class="modal-header col-xs-12 col-sm-12">
						<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
					</div>
					<div class="modal-body col-xs-12 col-sm-12">
						<p></p>
					</div>

					<div class="modal-footer">
						<button type="button" class="btn btn-default" id="alert_modal_no" data-dismiss="modal">NO</button>
						<button type="button" class="btn btn-primary" id="alert_modal_yes">YES</button>
					</div>
				</div>
			</div>
		</div>

		<script>
			function escapeHTML(str) {
	var escapes = {
		'&': '&',
		'<': '<',
		'>': '>',
		'"': '"',
		"'": '''
	};
	return ('' + str).replace(/[&<>"']/g, function(match) {
		return escapes[match];
	});
}

function unescapeHTML(str) {
	var escapes = {
		'&': '&',
		'<': '<',
		'>': '>',
		'"': '"',
		"'": '''
	};

	var cleanStr = ('' + str);
	var keys = Object.keys(escapes);
	for (var i = 0; i < keys.length; i++) {
		var k = keys[i];
		cleanStr = cleanStr.replace(new RegExp(escapes[k], 'g'), k);
	}
	return cleanStr;
}

// Gets jQuery object outerHTML, for creating HTML with jQuery DOM
function extractOuterHTML(elem) {
	return $('<div>').append(elem).html();
}

/* Overload string handling for capilisation */
String.prototype.capitalise = function() {
	return this.charAt(0).toUpperCase() + this.slice(1);
}


$('form input[type=text]:not(.lowercase)').on('blur', function() {
	var v = $(this).val();
	if (v) {
		$(this).val(v.capitalise());
	}
});

/**
 * Converts a jQuery object into a object of key-value pairs, which can be
 * used to POST in a JSON AJAX request.
 */
$.fn.serializeForm = function() {
	var serialized = this.serializeArray();
	var obj = {};
	for (var i = 0; i < serialized.length; i++) {
		obj[serialized[i].name] = serialized[i].value;
	}

	return obj;
}

function timeformat(date, time) {
	var d = new Date(date + 'T' + time);
	var hh = d.getHours();
	var m = d.getMinutes();
	if (m == 0) {
		m = '00';
	}
	var dd = 'AM';
	var h = hh;
	if (h >= 12) {
		h = hh-12;
		dd = 'PM';
	}
	if (h == 0) {
		h = 12;
	}
	return h + ':' + m + dd;
}

function reformat_numeric_date(dat) {
	if (/^\d{8}$/.test(dat)) {
		console.log('Date ' + dat + ' is fully numeric, 8 digits');
	} else {
		return null;
	}

	var day = dat.slice(0, 2);
	var month = dat.slice(2, 4);
	var year = dat.slice(4, 8);
	var new_dat =  day + '-' + month + '-' + year

	return new_dat;
}

function ajax_user_aborted(jqXHR) {
	return !jqXHR.getAllResponseHeaders();
}

function debounced(delay, fn) {
	var timeout;
	return function() {
		var context = this, args = arguments;
		var later = function() {
			timeout = null;
			fn.apply(context, args);
		};
		var callNow = !timeout;
		clearTimeout(timeout);
		timeout = setTimeout(later, delay);
		if (callNow) fn.apply(context, args);
	};
};

function coalesce(value, ifnull) {
	if (typeof value !== 'undefined' && value !== null) return value;
	return ifnull;
}

function ifnotnull(value) {
	if (typeof value !== 'undefined' && value !== null) return value;
	return '';
}

function getlocal_addressfield(addressType) {
		if (addressType == 'route') return 'addressstreet';	
		if (addressType == 'sublocality_level_1') return 'addresssuburb';	
		if (addressType == 'locality') return 'addresscity';	
		if (addressType == 'postal_code') return 'addressareacode';	
		if (addressType == 'administrative_area_level_1') return 'state';
		if (addressType == 'country') return 'addresscountry';
		return false;			
	}

function fill_in_address(autocomplete, elem, prefix) {
	var place = autocomplete.getPlace();
	var street_number = null;
	var flat_number = null;
	var premise = null;
	var local_fieldname = null;

	for (var i = 0; i < place.address_components.length; i++) {
		var address_value = place.address_components[i]['long_name'];
		var addressType = place.address_components[i].types[0];
		if (getlocal_addressfield(addressType)|| addressType == 'street_number' || addressType == 'subpremise' || addressType == 'premise') {
			//to concatenate street_number & street_address 
			if (addressType != 'street_number' && addressType != 'subpremise' && addressType != 'premise') {
					local_fieldname = getlocal_addressfield(addressType);
			} else {
				if (addressType == 'street_number') {
					street_number = address_value;
                    var start = elem.value.split(" ")[0];
                    if (start.indexOf(street_number) > -1) {
                        street_number = start;
                    }
				} else if (addressType == 'subpremise')	{
						flat_number = address_value;
				} else if (addressType == 'premise') {
						premise = address_value;
				}	
			}
			if ((local_fieldname == 'addressstreet') && (street_number || flat_number || premise)) {
				if (flat_number) {
						address_value = flat_number + '/' + street_number + ' ' + address_value;
				} else if (premise) {
						address_value = premise + ' ' + street_number + ' ' + address_value;
				} else if (premise && flat_number) {
						address_value = flat_number + ' ' + premise + '/' + street_number + ' ' + address_value;
				} else {
						address_value =  street_number + ' ' + address_value;
				}									
			}
			if (local_fieldname === 'addresscity') {
				var city_hidden = $('input[name=' + prefix + 'addresscity]').closest('.form-group').hasClass('none');
				var suburb_hidden = $('input[name=' + prefix + 'addresssuburb]').closest('.form-group').hasClass('none');
				// City will be hidden for AU, as they usually use suburb instead. But Google
				// returns the suburb as a city
				if (city_hidden && !suburb_hidden) {
					local_fieldname = 'addresssuburb';
				}
			}
			$('input[name=' + prefix + local_fieldname + ']').val(address_value);
		}
	}
}

function uploadphoto(files, previewelem) {
	var fileReader=new FileReader();
	fileReader.onload = function (e) {
		$(previewelem).attr('src', e.target.result).removeClass('none');
	}
	var file=files[0];
	fileReader.readAsDataURL(file);
}

function get_seat_list(bid, elem) {
	$.ajax({
		method: 'GET',
		url: "/portal/seatlist"+"?bid="+bid
	}).done(function(data) {
		if (!data.error) {
			populate_seat_list(data.response, elem);
		} else {
			ajax_exception(data.error);
		}
	}).fail(function() {
		ajax_exception("An internal error occurred. Please try again later.");
	});
}

function populate_seat_list(seats, elem) {
	var s_html = '';
	for (var i = 0; i < seats.length; i++) {
		if (seats[i]['taken']) {
			line = '<option disabled>'+seats[i]['seatnum']+' (Taken)</option>';
		} else {
			line = '<option>'+seats[i]['seatnum']+'</option>';
		}
		s_html += line;
	}
	elem.html(s_html);
}

function get_class_attendees(bid, renderFunc, $elem) {
	$.ajax({
		url: "/portal/book/class/attendees",
		method: 'GET',
		data: {bid: bid}
	}).done(function(data) {
		if (!data.error) {
			renderFunc(data.attendees, data.waitlist, $elem);
		} else {
			ajax_exception(data.error);
		}
	}).fail(function() {
		ajax_exception("An internal error occurred. Please try again later.");
	});
}

function clear_alerts() {
	$('#flash_div .alert').remove();
}

function do_the_scroll_thing(scrollto) {
	var scrollmargin = 5;
	// check if using base-gm wih big ol' header
	if ($('.serenitycontent').length || $('.logingm').length) scrollmargin = 100;

	$('html, body').animate({
		scrollTop: scrollto.offset().top - scrollmargin
	}, 500);
	if ('parentIFrame' in window) {
		if (iframelocation) parentIFrame.scrollTo(0, iframelocation.offsetTop + scrollto.offset().top);
	}
}

function ajax_exception(message, options) {
	display_flashmessage(message, 'danger', options);
}

function ajax_warning(message, options) {
	display_flashmessage(message, 'warning', options);
}

function ajax_info(message, options) {
	display_flashmessage(message, 'info', options);
}

function ajax_success(message, options) {
	display_flashmessage(message, 'success', options);
}

function display_flashmessage(message, flash_class, options) {
	options = options || {};

	clear_alerts();
	if ($('.modal.in').length) elem = $('.modal.in .modal-body');
	else elem = $('#flash_div');
	elem.prepend('<div class="alert alert-'+escapeHTML(flash_class)+' alert-dismissible"><button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>'+escapeHTML(message)+'</div>');
	if (options.scroll != false) {
		do_the_scroll_thing(elem.find('.alert'));
	}
}

function is_mobile() {
	var check = false;
	// iOS >=13 has the same user agent string as a Mac
	var iPad = (/iPad/.test(navigator.userAgent)) || (/MacIntel/.test(navigator.platform) && navigator.maxTouchPoints > 1);
	(function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
	return check || iPad;
}

// Not using padStart() due to browser incompatibility
function padstr(s, num, char) {
	return s.length < num ? char + s : s;
}

function hex_to_rgb(hex) {
	var short = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
	hex = hex.replace(short, function(m, r, g, b) {
		return r + r + g + g + b + b;
	});

	var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
	return {
		r: parseInt(result[1], 16),
		g: parseInt(result[2], 16),
		b: parseInt(result[3], 16)
	};
}

function rbg_to_hex(rgb) {
	return '#' + padstr(rgb['r'].toString('16'), 2, '0') + padstr(rgb['g'].toString('16'), 2, '0') + padstr(rgb['b'].toString('16'), 2, '0');
}

function bgluma(bgcolour, luma_limit) {
	var rgb = hex_to_rgb(bgcolour);   // convert rrggbb to decimal
	var luma = 0.2126 * rgb['r'] + 0.7152 * rgb['g'] + 0.0722 * rgb['b']; // per ITU-R BT.709
	// true if dark, false if light
	return luma < luma_limit;
}

function bgcolour_darker(bgcolour) {
	var c = hex_to_rgb(bgcolour);
	var darker = {
		r: Math.max(c['r'] - 20, 0),
		g: Math.max(c['g'] - 20, 0),
		b: Math.max(c['b'] - 20, 0),
	};
	return rbg_to_hex(darker);
}

function iframeBreakout(url) {
	var breakoutData = {
		type: 'gm.breakout',
		url: url
	};
	console.log('Breaking out of iframe...');
	// Loop in case of loading before hostpage JS
	setInterval(function() {
		window.parent.postMessage(breakoutData, '*');
	}, 1000);
}


$(document).ready(function() {
	function autoBreakout() {
		$('#base_breakout_toplink')
			.removeClass('none')
			.attr('href', window.location.href);
		$('#wrap').addClass('none');
		iframeBreakout(window.location.href);
	}
	if (self != top) {
		if (is_mobile()) autoBreakout();
	}
});


function delayed_redirect(url, delay) {
	delay = delay || 1500;
	setTimeout(function() {
		window.location.href = url;
	 }, delay);
}

function modal_confirm(message, yes_callback, no_callback) {
	$('#alert_modal .modal-body p').html(message);
	$('#alert_modal #alert_modal_yes').off('click').on('click', function() {
		yes_callback();
		$("#alert_modal").off('hidden.bs.modal').modal('hide');
	});
	$("#alert_modal").on('hidden.bs.modal', function () {
		no_callback();
	});

	$('#alert_modal #alert_modal_yes').text('Yes');
	$('#alert_modal #alert_modal_no').text('No');

	$('#alert_modal').on('shown.bs.modal', function() {
		do_the_scroll_thing($('#alert_modal'));
	});

	$('#alert_modal').modal('show');
}

function show_loading() {
	$('.loadingcontainer').removeClass('none');
}

function hide_loading() {
	$('.loadingcontainer').addClass('none');
}

function signupByGoogle() {
	$('#gsignin-link .abcRioButtonContents').click();
}

function onGoogleSignIn(googleUser) {
	var profile = googleUser.getBasicProfile();
	console.log('ID: ' + profile.getId());
	console.log('Name: ' + profile.getName());
	console.log('Image URL: ' + profile.getImageUrl());
	console.log('Email: ' + profile.getEmail());
	$('input[name=name]').val(profile.getName());
	$('input[name=email]').val(profile.getEmail());
	$('input[name=google]').val('true');
	$('form').submit();
}

function initialise_signature(elem) {
	sig_dict = {
		'signatureLine': true
	}
	elem.jSignature(sig_dict);
	elem.find('.jSignature').css('border', '1px dotted rgb(204, 204, 204)');
}

// Initialise a DOB datepicker, populating common settings
function initialise_dob_datepicker($elem, options) {
	var defaults = {
		forceParse: false,
		startView: 'years',
	};

	

	// Populate options with default values
	options = $.extend(defaults, options);
	_do_datepicker_init($elem, options);
}

// Initialise a generic datepicker, populating default settings
function initialise_datepicker($elem, options) {
	var defaults = {
		todayBtn: 'linked',
		todayHighlight: true,
	};

	// Populate options with default values
	options = $.extend(defaults, options);
	_do_datepicker_init($elem, options);
}

function _translate_datepicker() {
	try {
		// Do in here, so that datepicker should be available
		$.fn.datepicker.dates['en'] = {
			days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
			daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
			daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
			months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
			monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
			today: "Today",
			clear: "{ g.ftl('jinja-clear') }}",
			titleFormat: "MM yyyy", /* Leverages same syntax as 'format' */
		};
	} catch (error) {
		console.error(error);
	}
}

function _do_datepicker_init($elem, options) {
	_translate_datepicker();

	var defaults = {
		// general options
		format: "dd-mm-yyyy",
		startDate: "01-01-1900",
		endDate: "01-01-2032",
		orientation: "bottom",
		weekStart: 1,
		autoclose: true,
	};

	// Populate options with default values
	options = $.extend(defaults, options);
	$elem.datepicker(options);
}

function submit_wrapper(callback, override_submit_button) {
	var can_submit = true;
	return function () {
		if (!can_submit) {
			return;
		}

		var $submit_button = override_submit_button || $(this);
		var original_text = $submit_button.text();
		$submit_button.addClass('disabled').text($submit_button.data('submitting-text') || "Submitting...");
		can_submit = false;

		function restore_button() {
			$submit_button.removeClass('disabled').text(original_text);
			can_submit = true;
		}

		var deferred = null;
		try {
			deferred = callback();
		} catch (e) {
			restore_button();
			throw e;
		}

		if (typeof deferred != 'object' || deferred == null || deferred.always == undefined) {
			restore_button();
		} else {
			deferred
				.fail(function (error) {
					console.error(error);
					ajax_exception("An internal error occurred. Please try again later.");
				})
				.always(restore_button);
		}
	}
}
		</script>

		<script>
			$.validator.setDefaults({
	// Usually just ignores :hidden by default
	ignore: ':hidden:not(.validate-hidden), .form-group.none input, .form-group.none select',
	highlight: function(element) {
		$(element).closest('.form-group').addClass('has-error');
	},
	unhighlight: function(element) {
		$(element).closest('.form-group').removeClass('has-error');
	},
	errorElement: 'label',
	errorClass: 'error',
	errorPlacement: append_validation_error,
	focusInvalid: false,
	invalidHandler: function(form, validator) {
		if (!validator.numberOfInvalids())
			return;
		$('html, body').animate({
			scrollTop: $(validator.errorList[0].element).offset().top - 100
		}, 500);
		if ('parentIFrame' in window) {
			if (iframelocation) parentIFrame.scrollTo(0, $(validator.errorList[0].element).offset().top);
		}
		console.error({'MP form validation errors': validator.errorList});
	},
	messages: {
		email: {
			email: "Please enter a valid email address."
		}
	}
});$.validator.messages.required = "This field is required.";


$.validator.addMethod('validCellPhone', function(value, element, params) {
	if (!value.trim()) return true;
	
    // Only allow numbers, spaces, and +-()
	return !(/[^\d \-+()]+/.test(value))
}, "Invalid Cell Phone number");


$.validator.addMethod('validAreaCode', function(value, element, params) {
	if (!value.trim()) return true;
	
	return true;
}, "Invalid Postal Code");

$.validator.addMethod('validCustomText2', function(value, element, params) {
	
	return true;
}, "Silver Sneakers Number must be 16 digits");

function append_validation_error(error, $elem) {
	if (typeof error === 'string') {
		// Convert the string into an error element
		error = $('<label class="error">').text(error);
	}

	var placement = $elem.data()['errorplacement'];
	if (placement) {
		$(placement).append(error);
	} else {
		if($elem.is(':checkbox') || $elem.is(':radio')) {
			var $formGroup = $elem.closest('.form-group');
			var $label = $formGroup.find('.control-label');
			var $errorLabel = $elem.closest('.errorlabel');
			if ($label.length > 0) {
				$label.next().append(error);
			} else if ($errorLabel.length > 0) {
				error.insertBefore($errorLabel);
			} else {
				error.appendTo($elem.closest('div'));
			}
		} else if ($elem.parent().hasClass('input-group')) {
			var group = $elem.parent();
			error.insertAfter(group);
		} else {
			error.insertAfter($elem);
		}
	}
}



var checking_email_xhr = null;
function check_email_exists() {
	var companyid = $('#companyidid').val();
	var email = $('#emailid').val();
	if (email) {
		checking_email_xhr = $.ajax({ 
			url: "/portal/emailexists",
			type: 'GET',
			data: {
				companyid: companyid,
				email: email
			},
			beforeSend: function() {
				if(checking_email_xhr != null) {
					checking_email_xhr.abort();
				}
			}
		}).done(function(data) {
			$('#emailerr').remove();
			if (data.exists) {
				$('#emailid').after(
					$('<div class="member_validation" id="emailerr">')
						.html('There is already a member with this email. Click <a href="/portal/login?session=eyJjb250ZXh0X2NvbXBhbnlpZCI6MiwibGFuZ3VhZ2UiOiJlbl9VUyIsImlwX2FkZHIiOiIxMDEuMTg3LjE3My4xNTUifQ.ZiYVbA.NJVIQBDSlrN0Yni5-jpPm3Pjh88">here</a> to login or reset your password.')
				);
			}
		}).fail(function(jqXHR) {
			if (!ajax_user_aborted(jqXHR)) {
				ajax_exception('Error checking if email exists.');
			}
		});
	}
}
		</script>

		<script>
		$(document).ready(function() {
			initialise_datepicker($('.datepicker[name!="dob"]'));

			initialise_dob_datepicker($('.datepicker[name="dob"]'));

			$('.datepicker').attr('placeholder', 'dd-mm-yyyy').attr('onblur', 'this.placeholder="dd-mm-yyyy"').attr('onfocus', 'this.placeholder=""');
		});

		var iframelocation;

		$(document).ready(function() {
			if (self != top) {
				var iframechecker = setInterval(function() {
					if (!iframelocation && 'parentIFrame' in window) {
						// Getting iframe size. Can only do this once, as the argument is a callback ran on every resize & scroll
						parentIFrame.getPageInfo(function(resp) {
							if (!iframelocation) {
								// Log the first time only to prevent spamming the console
								console.info('[GM_MP] Found initial iframe location of', resp);
							}
							iframelocation = resp;
						});
					}

					clearInterval(iframechecker);
				}, 1000);
			}

			
		});
		</script>
		<!--[if lt IE 9]>
		<script type="text/javascript" src="https://active8fitness.gymmasteronline.com/portal/static/3rdparty/flashcanvas.js?v=1677183786.0179112"></script>
		<![endif]-->
		

		<script>
		var ajax_loading_timeout;

		$(document).ajaxStart(function() {
			ajax_loading_timeout = setTimeout(function() {
				show_loading();
			}, 2000);
		});

		$(document).ajaxStop(function() {
			clearTimeout(ajax_loading_timeout);
			hide_loading();
		});
		</script>

		
			
			  

		

		
		
	

<script>

facebook_init();



function facebook_init() {
	window.fbAsyncInit = function() {
		FB.init({
			appId      : '285462828536364',
			// cookie     : true,
			xfbml      : true,
			version    : 'v2.8'
		});
		FB.AppEvents.logPageView();
	};

	(function(d, s, id){
		 var js, fjs = d.getElementsByTagName(s)[0];
		 if (d.getElementById(id)) {return;}
		 js = d.createElement(s); js.id = id;
		 js.src = "//connect.facebook.net/en_US/sdk.js";
		 fjs.parentNode.insertBefore(js, fjs);
	 }(document, 'script', 'facebook-jssdk'));
}

function facebook_auth() {
	var $elem = $(this);
	// Where to redirect to
	var base_uri = 'https://www.gymmasteronline.com/portal/facebook/redirect';
	// Redirect back to here
	var target_uri = [location.protocol, '//', location.host, location.pathname].join('');
	var redirect_uri = base_uri + '?targeturi=' + encodeURIComponent(target_uri);
	var uri = encodeURI("https://www.facebook.com/dialog/oauth?client_id=285462828536364&response_type=token&scope=email&redirect_uri="+ redirect_uri);

	// Redirect via a click, due to browser restrictions on changing window.parent
	$elem.attr('href', uri);
	return true;
}

function facebook_check_accesstoken() {
	var url_hash = location.hash;
	var url_lookup = {};
	url_hash
		.substr(1)
		.split("&")
		.map(function(value) {
			var split_up = value.split('=');
			url_lookup[split_up[0]] = decodeURIComponent(split_up[1]);
		});

	if (url_lookup.access_token) {
		FB.api('/me?access_token='+url_lookup.access_token+'&fields=id,first_name,last_name,gender,email', facebook_redirect_to_target);
	} else {
		console.log('User cancelled login or did not fully authorize.');
		facebook_unsuccessful_redirect();
	}
}

function _facebook_redirect(base_uri, url_params) {
	var url_query = Object.keys(url_params)
		.map(function(k) {
			return encodeURIComponent(k) + '=' + encodeURIComponent(url_params[k]);
		})
		.join('&');

	window.location.replace(base_uri + '?' + url_query);
}

function facebook_redirect_to_target(response) {
	var base_uri = $('#targeturi').val();
	var url_params = {
		'facebook_userid': response.id,
		'email': response.email,
		'firstname': response.first_name,
		'surname': response.last_name,
		'gender': response.gender,
	};

	_facebook_redirect(base_uri, url_params);
}

function facebook_unsuccessful_redirect() {
	var base_uri = $('#targeturi').val();
	var url_params = {
		'fberror': 'Unsuccessful Facebook login',
	};

	_facebook_redirect(base_uri, url_params);
}

function facebook_check_response() {
	var url_query = location.search;
	var url_lookup = {};
	url_query
		.substr(1)
		.split("&")
		.map(function(value) {
			var split_up = value.split('=');
			url_lookup[split_up[0]] = decodeURIComponent(split_up[1]);
		});

	if (url_lookup.facebook_userid) facebook_populate_form(url_lookup);
	else if (url_lookup.fberror) ajax_exception(url_lookup.fberror);
}

function facebook_populate_form(lookup) {
	$('input[name="facebook_userid"]').val(lookup.facebook_userid);
	$('input[name="email"]').val(lookup.email);
	// also sending these for login for better debugging
	$('input[name="firstname"]').val(lookup.firstname);
	$('input[name="surname"]').val(lookup.surname);
	if (lookup.gender == 'male') $('#male').prop('checked', true);
	else if (lookup.gender == 'female') $('#female').prop('checked', true);
	$('input[name="password"], input[name="confirmpassword"]').removeAttr('required').parents('.form-group').addClass('none');

	$('form').submit();
}

$(document).ready(function() {
	// Check for Facebook login
	facebook_check_response();

	$('#facebook_login').on('click', facebook_auth);
	$('#btn-set-language').on('click', change_language);
});

$('#passwd-btn').on('click', function() {
	$(this).toggleClass('fa-eye');
	$(this).toggleClass('fa-eye-slash');

	if ($('input[name="password"]').get(0).type == 'password') {
		$('input[name="password"]').get(0).type = 'text';
	} else {
		$('input[name="password"]').get(0).type = 'password';
	}

});

if ('None' == 'chocozap') {

	var addon_params = '';
	var url = new URL(document.location.href);
	var keys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term', 'gclid'];
	for (key of keys) {
		var value = url.searchParams.get(key);
		if (value) {
			addon_params = addon_params + '&' + key + '=' + value;
		}
	}
	
	$('.signup-params').attr('href', "/portal/signup?session=eyJjb250ZXh0X2NvbXBhbnlpZCI6MiwibGFuZ3VhZ2UiOiJlbl9VUyIsImlwX2FkZHIiOiIxMDEuMTg3LjE3My4xNTUifQ.ZiYVbA.NJVIQBDSlrN0Yni5-jpPm3Pjh88" + addon_params);
}

async function change_language() {
	var data = {
		'language' : $('#language-select').val()
	};
	$.ajax({
		type: 'POST',
		data: data,
		url: "/portal/local_language?session=eyJjb250ZXh0X2NvbXBhbnlpZCI6MiwibGFuZ3VhZ2UiOiJlbl9VUyIsImlwX2FkZHIiOiIxMDEuMTg3LjE3My4xNTUifQ.ZiYVbA.NJVIQBDSlrN0Yni5-jpPm3Pjh88"
	}).success(function(result) {
		const homeurl = window.location.protocol + window.location.pathname;
		if (result.error) {
			ajax_exception(result.error);
		} else {
			location.replace(homeurl);
		}
	});
}

</script>


		
		
	</body>
</html>