		<@if(booking.tab == 'showServices'){@>
				<div class="booking-body clearfix">
					<h2><@=ptEscape(langjs['List of all Services'])@>:</h2>
					<div class="booking-list-box">
						<ul class="booking-list view-list">
							<@services.each(function(service){
							var duration = moment.utc(moment.duration(service.get('serviceDuration')*60000).asMilliseconds());
							var childs = children.where({serviceKey: service.id});
							if(service.get('pricingType') == 'multiple' && childs.length){
							_.each(childs,function(child){
							var duration = moment.utc(moment.duration(child.get('duration')*60000).asMilliseconds());
							@>
							<li>
								<div class="bl bl-left"><img class="img-responsive img-circle default-img" src="<@=service.get('serviceImage') ? resizeGoogleImage(service.get('serviceImage'), 50) : '/bookingPage/img/booking-services.png'@>" alt=""></div>
								<div class="bl bl-center">
									<div><@=service.get('serviceName')@> (<@=child.get('name')@>)</div>
									<@if(showPrices || showDuration){@>
									<div class="bl-meta-deta">
										<@if(showPrices){@>
										<span><@=TCC.currency(account.get('currency')).symbol@> <@=child.get('cost') != null ? child.get('cost').toFixed(2) : 0 @></span>
										<@}@>
										<@if(showDuration){@>
										<span><@=getDurationString(duration)@></span>
										<@}@>
									</div>
									<@}@>
									<@if(showDescription){@>
										<@if(service.get('description') && service.get('description').value){@>
	                                    <div class="bl-meta-deta">
	                                        <span><@=service.get('description').value@></span>
	                                    </div>
										<@}@>
									<@}@>
								</div>
								<div class="bl bl-right">&nbsp;</div>
							</li>
							<@});@>
							<@} else{@>
							<li>
								<div class="bl bl-left"><img class="img-responsive img-circle default-img" src="<@=service.get('serviceImage') ? resizeGoogleImage(service.get('serviceImage'), 50) : '/bookingPage/img/booking-services.png'@>" alt=""></div>
								<div class="bl bl-center">
									<div><@=service.get('serviceName')@></div>
									<@if(showPrices || showDuration){@>
									<div class="bl-meta-deta">
										<@if(showPrices){@>
										<span><@=TCC.currency(account.get('currency')).symbol@> <@=service.get('serviceCost') != null ? service.get('serviceCost').toFixed(2) : 0 @></span>
										<@}@>
										<@if(showDuration){@>
										<span><@=getDurationString(duration)@></span>
										<@}@>
									</div>
									<@}@>
									<@if(showDescription){@>
										<@if(service.get('description') && service.get('description').value){@>
	                                    <div class="bl-meta-deta">
	                                    <span><@=service.get('description').value@></span>
	                                    </div>
										<@}@>
									<@}@>
								</div>
								<div class="bl bl-right">&nbsp;</div>
							</li>
							<@}@>
							<@});@> 
						</ul>
					</div>
				</div>
		<@} else if(booking.tab == 'showClasses'){@>
				<div class="booking-body clearfix">
					<h2><@=ptEscape(langjs['List of all Classes'])@>:</h2>
					<div class="booking-list-box">
						<ul class="booking-list view-list">
							<@classes.each(function(classModel){
							var duration = moment.utc(moment.duration(classModel.get('classDuration')*60000).asMilliseconds());
							@>
							<li>
								<div class="bl bl-left"><img class="img-responsive img-circle default-img" src="<@=classModel.get('classImage') ? resizeGoogleImage(classModel.get('classImage'), 50) : '/bookingPage/img/booking-class.png'@>" alt=""></div>
								<div class="bl bl-center">
									<div><@=classModel.get('className')@></div>
									<@if(showPrices || showDuration){@>
									<div class="bl-meta-deta">
										<@if(showPrices){@>
										<span><@=TCC.currency(account.get('currency')).symbol@> <@=classModel.get('classCost') != null ? classModel.get('classCost').toFixed(2) : 0 @></span>
										<@}@>
										<@if(showDuration){@>
										<span><@=getDurationString(duration)@></span>
										<@}@>
									</div>
									<@}@>
									<@if(showDescription){@>
										<@if(classModel.get('description') && classModel.get('description').value){@>
	                                    <div class="bl-meta-deta">
	                                    <span><@=classModel.get('description').value@></span>
	                                    </div>
	                                    <@}@>
                                    <@}@>
								</div>
								<div class="bl bl-right">&nbsp;</div>
							</li>
							<@});@> 
						</ul>
					</div>
				</div>
		<@} else if(booking.tab == 'showResources'){@>
				<div class="booking-body clearfix">
					<h2><@=ptEscape(langjs['List of all Resources'])@>:</h2>
					<div class="booking-list-box">
						<ul class="booking-list view-list">
							<@resources.each(function(resource){
							var duration = moment.utc(moment.duration(resource.get('duration')*60000).asMilliseconds());
							var childs = children.where({serviceKey: resource.id});
							if(resource.get('pricingType') == 'multiple' && childs.length){
							_.each(childs,function(child){
							var duration = moment.utc(moment.duration(child.get('duration')*60000).asMilliseconds());
							@>
							<li>
								<div class="bl bl-left"><img class="img-responsive img-circle default-img" src="<@=resource.get('displayImage') ? resizeGoogleImage(resource.get('displayImage'), 50) : '/bookingPage/img/booking-services.png'@>" alt=""></div>
								<div class="bl bl-center">
									<div><@=resource.get('name')@> (<@=child.get('name')@>)<@=(resource.get('type') == 'room' ? ' - Room' : '')@></div>
									<@if(showPrices || showDuration){@>
									<div class="bl-meta-deta">
										<@if(showPrices){@>
										<span><@=TCC.currency(account.get('currency')).symbol@> <@=child.get('cost') != null ? child.get('cost').toFixed(2) : 0 @></span>
										<@}@>
										<@if(showDuration){@>
										<span><@=getDurationString(duration)@></span>
										<@}@>
									</div>
									<@}@>
									<@if(resource.get('description') && resource.get('description').value){@>
									<div class="bl-meta-deta">
										<span><@=resource.get('description').value@></span>
									</div>
									<@}@>
								</div>
								<div class="bl bl-right">&nbsp;</div>
							</li>
							<@});@>
							<@} else{@>
							<li>
								<div class="bl bl-left"><img class="img-responsive img-circle default-img" src="<@=resource.get('displayImage') ? resizeGoogleImage(resource.get('displayImage'), 50) : '/bookingPage/img/booking-services.png'@>" alt=""></div>
								<div class="bl bl-center">
									<div><@=resource.get('name')@><@=(resource.get('type') == 'room' ? ' - Room' : '')@></div>
									<@if(showPrices || showDuration){@>
									<div class="bl-meta-deta">
										<@if(showPrices){@>
										<span><@=TCC.currency(account.get('currency')).symbol@> <@=resource.get('cost') != null ? resource.get('cost').toFixed(2) : 0 @></span>
										<@}@>
										<@if(showDuration){@>
										<span><@=getDurationString(duration)@></span>
										<@}@>
									</div>
									<@}@>
									<@if(resource.get('description') && resource.get('description').value){@>
									<div class="bl-meta-deta">
										<span><@=resource.get('description').value@></span>
									</div>
									<@}@>
								</div>
								<div class="bl bl-right">&nbsp;</div>
							</li>
							<@}@>
							<@});@> 
						</ul>
					</div>
				</div>
		<@} else{@>


				<@if((booking.tab != 'locations' && booking.tab != 'services') || booking.serviceId || booking.classId || booking.resourceId){
				var serviceName = '';
				var staffName = booking.autoSelectStaff ? '...' : '';
				var dateFormat = booking.dateAndTime ? moment(toPTDate(booking.dateAndTime)).format('MMM D , '+hourFormat) : '';
				var sessionDateFormat = booking.sessionDate ? moment(toPTDate(booking.sessionDate)).format('MMM D , '+hourFormat) : '';
				
				if(booking.type == 'appointment' && booking.serviceId) serviceName = services.get(booking.serviceId.split('_')[0]).get('serviceName');
				if(booking.staffId) staffName = (team.get(booking.staffId).get('firstName') ? team.get(booking.staffId).get('firstName') : "")+" "+(team.get(booking.staffId).get('lastName') ? team.get(booking.staffId).get('lastName') : ""); 
				if(booking.resourceId) serviceName = resources.get(booking.resourceId.split('_')[0]).get('name') + (resources.get(booking.resourceId.split('_')[0]).get('type') == 'room' ? ' - Room' : '' );
				if(booking.classId) serviceName = classes.get(booking.classId).get('className');
				
				@>
				<ul class="booking-body-nav">
					<li><a data-type="nav-services" href="javascipt:void(0);" <@=serviceName ? 'class="active"' : ''@>><span class=""><@=serviceName ? serviceName : 'Service type'@></span></a></li> 
					<@if(booking.type == 'appointment' || booking.type == 'class'){@>
					<li><a data-type="nav-staff" href="javascipt:void(0);" <@=staffName ? 'class="active"' : ''@>><i class="icon-arrow-right"></i><span class=""><@=staffName ? staffName : ptEscape(langjs['Team Member'])@></span></a></li> 
					<@}@>
					<@if(booking.type == 'class'){@>
					<li><a data-type="nav-sessions" href="javascipt:void(0);"  <@=booking.sessionDate ? 'class="active"' : ''@>><i class="icon-arrow-right"></i><@=sessionDateFormat ? sessionDateFormat : '<span>'+ptEscape(langjs['Sessions'])+'</span>'@></a></li>
					<@} else{ @> 
					<li><a data-type="nav-date" href="javascipt:void(0);"  <@=booking.dateAndTime ? 'class="active"' : ''@>><i class="icon-arrow-right"></i><@=dateFormat ? dateFormat : '<span class="span-visible-xs">'+ptEscape(langjs['Date'])+'</span><span class="span-hidden-xs">'+ptEscape(langjs['Date & Time'])+'</span>'@></a></li>
					<@}@> 
					<li><a data-type="nav-info" href="javascipt:void(0);"  <@=booking.complete ? 'class="active"' : ''@>><i class="icon-arrow-right"></i><span class=""><@=ptEscape(langjs['Info'])@></span></a></li> 
					<li><a data-type="nav-confirmation" href="javascipt:void(0);" <@=booking.booked ? 'class="active"' : ''@>><i class="icon-arrow-right"></i><span class=""><@=ptEscape(langjs['Complete'])@></span></a></li> 
				</ul> 
				<@}@>
				
				<@if(booking.tab == 'date'){@>
				<div class="dates-container">
					<div class="dates-array">
						<@if(!leftStop){@>
	    				<div class="date-item date-left"><i class="icon-arrow-left"></i></div>
						<@}@>
	    				<@
	    				var startday = startDate.clone();
	    				var endday = endDate.clone();
	    				while(startday.isSameOrBefore(endday))
	    				{
	    				@>
	    				<div class="date-item data-date-item <@= startday.format('YYYYMMDD') == booking.selectedDate.format('YYYYMMDD') ? 'active' : ''@><@=minEndDate && +startday.format('YYYYMMDD') > minEndDate.format('YYYYMMDD') ? ' disable' : ''@>" data-date="<@=startday.format('YYYYMMDD')@>" title="<@=startday.format('Do MMM YYYY')@>">
					        <div><@=startday.format('ddd').toUpperCase()@></div>
							<div><span><@=startday.format('Do')@></span></div>
							<div><@=startday.format('MMM').toUpperCase()@></div>        
						</div>
	    				<@	
	    					startday.add('days', 1);
	    				}
	    				@>
	    				<@if(!rightStop){@>
						<div class="date-item date-right"><i class="icon-arrow-right"></i></div>
						<@}@>
					</div>
				</div>
				<@}@>
				
				
				<@if(booking.tab == 'sessions'){@>
				<div class="dates-container">
					<div class="dates-array">
						<@if(booking.classPrevDates && booking.classPrevDates.length){@>
	    				<div class="date-item date-left classitem"><i class="icon-arrow-left"></i></div>
	    				<@}@>
	    				<div class="date-item data-date-item active">
							<div class="class-date"><@=booking.classDate.format('MMMM YYYY')@></div>
						</div>
						<@if(booking.classNextDate){@>
						<div class="date-item date-right classitem"><i class="icon-arrow-right"></i></div>
						<@}@>
					</div>
				</div>
				<@}@>
				
				<div class="booking-body clearfix">
					<@if(booking.tab == 'locations'){
					  if(locations && locations.size()){
					@>
					<h2><@=ptEscape(langjs['Choose a Location'])@>:</h2>
					<div class="booking-list-box">
						<ul class="booking-list location-list">
							<@locations.each(function(location){@>
							<li data-id="<@=location.id@>" class="<@=booking.locationId == location.id ? 'active' : ''@>">
								<div class="bl bl-left"><img class="img-responsive img-circle default-img" src="/bookingPage/img/booking-location.png" alt=""></div>
								<div class="bl bl-center">
									<div><@=location.get('locationName')@></div>
									<div class="bl-meta-deta">
										<span><@=ptEscape(location.get('address'))@><@=location.get('city') ? ', '+location.get('city') : ''@></span>
									</div>
								</div>
								<div class="bl bl-right"><i class="icon-arrow-right"></i></div>
							</li> 
							<@});@>
						</ul>
					</div>
						<@} else{@>
						<div class="booking-none text-center margin-top"><@=allowToBookWithoutSSO ? ptEscape(langjs['BOOKINGS ARE NOT OPEN AT THE MOMENT']) : 'PLEASE <a class="sso-login" href="javascript:void(0);" style="text-decoration: underline;">LOGIN</a> TO CONTINUE...'@></div>
						<@} @>
					<@} @>
					
					
					<@
					var allServiceItems = 0;
					var location = locations.get(booking.locationId);
					@> 
					
					<@if(booking.tab == 'services'){@>
					<@	var items = 0;
						var catServices = {};
						var catServiceArray = [];
						_.each(location.get('serviceKeys'), function(serviceId){
							
							var service = services.get(serviceId);
							if(!service) return;
							
							var staffInLocation = false;
							if(service.get('staffKeys') && service.get('staffKeys').length){
								_.each(service.get('staffKeys'), function(staffId){
									if(location.get('staffKeys') && location.get('staffKeys').contains(staffId) && team.get(staffId)) staffInLocation = true;
								});
							}
							if(!staffInLocation) return;
							
							items++;
							allServiceItems++;
							if(service.get('categorySet') && service.get('categorySet').length){
								if(!catServices[service.get('categorySet')[0]]) catServices[service.get('categorySet')[0]] = [];
								catServices[service.get('categorySet')[0]].push(service.id);
								if(!catServiceArray.contains(service.get('categorySet')[0])) catServiceArray.push(service.get('categorySet')[0]);
							}
							else{
								if(!catServices['Others']) catServices['Others'] = [];
								catServices['Others'].push([service.id]);
								if(!catServiceArray.contains('Others')) catServiceArray.push('Others');
							}
						});
						catServiceArray.sort(function(a, b){
							var keys = preferences.get('serviceCategoryKeys') ? preferences.get('serviceCategoryKeys') : [];
							if(!keys.contains(a)) return -1;
							return keys.indexOf(a) - keys.indexOf(b);
						});
						if(catServiceArray.contains('Others')){
							catServiceArray.splice(catServiceArray.indexOf('Others'), 1);
							catServiceArray.push('Others');
						}
						console.log(catServices);
					@>
					<@if(items){@>
					<h2><@=ptEscape(langjs['Choose a Service'])@>:</h2>
					<@_.each(catServiceArray, function(catId){
					var serviceIds = catServices[catId];
					serviceIds.sort(function(a, b){
						var keys = preferences.get('serviceKeys') ? preferences.get('serviceKeys') : [];
						if(!keys.contains(a)) return -1;
						return keys.indexOf(a) - keys.indexOf(b);
					});
					@>
					<div class="booking-list-box">
					<h3><@=serviceCats.get(catId) ? serviceCats.get(catId).get('categoryName') : 'Others'@></h3>
					<ul class="booking-list service-list">
						<@_.each(serviceIds, function(serviceId){
						var service = services.get(serviceId);
						var duration = moment.utc(moment.duration(service.get('serviceDuration')*60000).asMilliseconds());
						var childs = children.where({serviceKey: serviceId});
						
						if(service.get('pricingType') != 'single' && childs.length){
						_.each(childs,function(child){
						var duration = moment.utc(moment.duration(child.get('duration')*60000).asMilliseconds());
						@>
						<li data-id="<@=service.id@>_<@=child.id@>" class="<@=booking.serviceId == service.id+'_'+child.id ? 'active' : ''@>">
							<div class="bl bl-left"><img class="img-responsive img-circle<@=!service.get('serviceImage') ? ' default-img' : ''@>" src="<@=service.get('serviceImage') ? resizeGoogleImage(service.get('serviceImage'), 50) : '/bookingPage/img/booking-services.png'@>"></div>
							<div class="bl bl-center">
								<div><@=service.get('serviceName')@> (<@=child.get('name')@>)</div>
								<div class="bl-meta-deta">
									<@if(showPrices){@>
									<span><@=TCC.currency(account.get('currency')).symbol@> <@=child.get('cost') != null ? child.get('cost').toFixed(2) : 0 @></span>
									<@}@>
									<@if(showDuration){@>
									<span><@=getDurationString(duration)@></span>
									<@}@>
									<span class="bl-meta-details">VIEW DETAILS</span>
								</div>
								<div class="bl-meta-deta">
								<@if(showDescription){@>
									<div class="trimmed-content" ><span><@=service.get('description') && service.get('description').value ? service.get('description').value.replaceAll('\n', ' ').replaceAll('<br>', ' ') : ''@></span></div>
									<div class="full-content" ><@=service.get('description') ? service.get('description').value : ''@></div>
									<a href="#" class="show_hide <@=service.get('description') && service.get('description').value && service.get('description').value.indexOf('<br>') != -1 ? '' : 'hide' @>" data-content="toggle-text"><@=ptEscape(langjs['Read More'])@></a>
								<@}@>
								</div>
							</div>
							<div class="bl bl-right"><i class="icon-arrow-right"></i></div>
						</li> 
						<@
						});
						} else{@>
						<li data-id="<@=service.id@>" class="<@=booking.serviceId == service.id ? 'active' : ''@>">
							<div class="bl bl-left"><img class="img-responsive img-circle<@=!service.get('serviceImage') ? ' default-img' : ''@>" src="<@=service.get('serviceImage') ? resizeGoogleImage(service.get('serviceImage'), 50) : '/bookingPage/img/booking-services.png'@>"></div>
							<div class="bl bl-center">
								<div><@=service.get('serviceName')@></div>
									<div class="bl-meta-deta">
										<@if(showPrices){@>
										<span><@=TCC.currency(account.get('currency')).symbol@> <@=service.get('serviceCost') != null ? service.get('serviceCost').toFixed(2) : 0 @></span>
										<@}@>
										<@if(showDuration){@>
										<span><@=getDurationString(duration)@></span>
										<@}@>
										<span class="bl-meta-details">VIEW DETAILS</span>
									</div>
									<div class="bl-meta-deta">
										<@if(showDescription){@>
											<div class="trimmed-content" ><span><@=service.get('description') && service.get('description').value ? service.get('description').value.replaceAll('\n', ' ').replaceAll('<br>', ' ') : ''@></span></div>
											<div class="full-content" ><@=service.get('description') ? service.get('description').value : ''@></div>
											<a href="#" class="show_hide <@=service.get('description') && service.get('description').value && service.get('description').value.indexOf('<br>') != -1 ? '' : 'hide' @>" data-content="toggle-text"><@=ptEscape(langjs['Read More'])@></a>
										<@}@>
									</div>
							</div>
							<div class="bl bl-right"><i class="icon-arrow-right"></i></div>
						</li> 
						<@}
						 });@>
					</ul>
					</div>
					<@});@>
					<@}@>
					<@}@>
					
					
					<@if(booking.tab == 'services'){@>
					<@	var items = 0;
						var catClasses = {};
						var catClassesArray = [];
						classes.each(function(classModel){
						if(!classModel || !booking.availableClases.contains(classModel.id)) return;
						items++;
						allServiceItems++;
						if(classModel.get('categorySet') && classModel.get('categorySet').length){
							if(!catClasses[classModel.get('categorySet')[0]]) catClasses[classModel.get('categorySet')[0]] = [];
							catClasses[classModel.get('categorySet')[0]].push(classModel.id);
							if(!catClassesArray.contains(classModel.get('categorySet')[0])) catClassesArray.push(classModel.get('categorySet')[0]);
						}
						else{
							if(!catClasses['Others']) catClasses['Others'] = [];
							catClasses['Others'].push([classModel.id]);
							if(!catClassesArray.contains('Others')) catClassesArray.push('Others');
						}
						});
						
						catClassesArray.sort(function(a, b){
							var keys = preferences.get('classesCategoryKeys') ? preferences.get('classesCategoryKeys') : [];
							if(!keys.contains(a)) return -1;
							return keys.indexOf(a) - keys.indexOf(b);
						});
						if(catClassesArray.contains('Others')){
							catClassesArray.splice(catClassesArray.indexOf('Others'), 1);
							catClassesArray.push('Others');
						}
						console.log(catClasses);
					@>
					<@if(items){@>
					<h2><@=ptEscape(langjs['Choose a Class'])@>:</h2>
					<@_.each(catClassesArray, function(catId){
					var classIds = catClasses[catId];
					classIds.sort(function(a, b){
						var keys = preferences.get('classKeys') ? preferences.get('classKeys') : [];
						if(!keys.contains(a)) return -1;
						return keys.indexOf(a) - keys.indexOf(b);
					});
					@>
					<div class="booking-list-box">
					<h3><@=classCats.get(catId) ? classCats.get(catId).get('categoryName') : 'Others'@></h3>
					<ul class="booking-list class-list">
						<@_.each(classIds, function(classId){
						var classModel = classes.get(classId);
						var duration = moment.utc(moment.duration(classModel.get('classDuration')*60000).asMilliseconds());
						@>
						<li data-id="<@=classModel.id@>" class="<@=booking.classId == classModel.id ? 'active' : ''@>">
							<div class="bl bl-left"><img class="img-responsive img-circle<@=!classModel.get('classImage') ? ' default-img' : ''@>" src="<@=classModel.get('classImage') ? resizeGoogleImage(classModel.get('classImage'), 50) : '/bookingPage/img/booking-class.png'@>"></div>
							<div class="bl bl-center">
								<div><@=classModel.get('className')@></div>
								<div class="bl-meta-deta">
<!-- 									<@if(showPrices){@> -->
<!-- 									<span><@=TCC.currency(account.get('currency')).symbol@> <@=classModel.get('classCost') != null ? classModel.get('classCost').toFixed(2) : 0 @></span> -->
<!-- 									<@}@> -->
<!-- 									<@if(showDuration){@> -->
<!-- 									<span><@=getDurationString(duration)@></span> -->
<!-- 									<@}@> -->
									<span class="bl-meta-details">VIEW DETAILS</span>
									<div class="bl-meta-deta">
									<@if(showDescription){@>
											<div class="trimmed-content" ><span><@=classModel.get('description') && classModel.get('description').value ? classModel.get('description').value.replaceAll('\n', ' ').replaceAll('<br>', ' ') : ''@></span></div>
											<div class="full-content" ><@=classModel.get('description') ? classModel.get('description').value : ''@></div>
											<a href="#" class="show_hide <@=classModel.get('description') && classModel.get('description').value && classModel.get('description').value.indexOf('<br>') != -1 ? '' : 'hide' @>" data-content="toggle-text"><@=ptEscape(langjs['Read More'])@></a>
										<@}@>
									</div>
									</div>
							</div>
							<div class="bl bl-right"><i class="icon-arrow-right"></i></div>
						</li> 
						<@});@>
					</ul>
					</div>
					<@});@>
					<@}@>
					<@}@>
					
					
					
					
					<@if(booking.tab == 'services' && !preferences.get('autoSelectResource')){@>
					<@	var items = 0;
						var catResources = {};
						var catResourcesArray = [];
						_.each(location.get('resourceKeys'), function(resourceId){
							var resource = resources.get(resourceId);
							if(!resource) return;
							
							items++;
							allServiceItems++;
							if(resource.get('category')){
								if(!catResources[resource.get('category')]) catResources[resource.get('category')] = [];
								catResources[resource.get('category')].push(resource.id);
								if(!catResourcesArray.contains(resource.get('category'))) catResourcesArray.push(resource.get('category'));
							}
							else{
								return;
							}
						});
						catResourcesArray.sort(function(a, b){
							var keys = preferences.get('resourceCategoryKeys') ? preferences.get('resourceCategoryKeys') : [];
							if(!keys.contains(a)) return -1;
							return keys.indexOf(a) - keys.indexOf(b);
						});
						console.log(catResources);
					@>
					<@if(items){@>
					<h2><@=ptEscape(langjs['Choose a Resource'])@>:</h2>
					<@_.each(catResourcesArray, function(catId){
					var resourceIds = catResources[catId];
					resourceIds.sort(function(a, b){
						var keys = preferences.get('resourceKeys') ? preferences.get('resourceKeys') : [];
						if(!keys.contains(a)) return -1;
						return keys.indexOf(a) - keys.indexOf(b);
					});
					@>
					<div class="booking-list-box">
					<h3><@=resourceCats.get(catId) ? resourceCats.get(catId).get('categoryName') : 'Others'@></h3>
					<ul class="booking-list resource-list">
						<@_.each(resourceIds, function(resourceId){
						var resource = resources.get(resourceId);
						var duration = moment.utc(moment.duration(resource.get('duration')*60000).asMilliseconds());
						var childs = children.where({serviceKey: resourceId});
						
						if( resource.get('pricingType') != 'single' && childs.length){
						_.each(childs,function(child){
						var duration = moment.utc(moment.duration(child.get('duration')*60000).asMilliseconds());
						@>
						<li data-id="<@=resource.id@>_<@=child.id@>" class="<@=booking.resourceId == resource.id+'_'+child.id ? 'active' : ''@>">
							<div class="bl bl-left"><img class="img-responsive img-circle<@=!resource.get('displayImage') ? ' default-img' : ''@>" src="<@=resource.get('displayImage') ? resizeGoogleImage(resource.get('displayImage'), 50) : '/bookingPage/img/booking-services.png'@>"></div>
							<div class="bl bl-center">
								<div><@=resource.get('name')@> (<@=child.get('name')@>)<@=(resource.get('type') == 'room' ? ' - Room' : '')@></div>
								<div class="bl-meta-deta">
									<@if(showPrices){@>
									<span><@=TCC.currency(account.get('currency')).symbol@> <@=child.get('cost') != null ? child.get('cost').toFixed(2) : 0 @></span>
									<@}@>
									<@if(showDuration){@>
									<span><@=getDurationString(duration)@></span>
									<@}@>
									<span class="bl-meta-details">VIEW DETAILS</span>
								</div>
							</div>
							<div class="bl bl-right"><i class="icon-arrow-right"></i></div>
						</li> 
						<@
						});
						} else{@>
						<li data-id="<@=resource.id@>" class="<@=booking.resourceId == resource.id ? 'active' : ''@>">
							<div class="bl bl-left"><img class="img-responsive img-circle<@=!resource.get('displayImage') ? ' default-img' : ''@>" src="<@=resource.get('displayImage') ? resizeGoogleImage(resource.get('displayImage'), 50) : '/bookingPage/img/booking-services.png'@>"></div>
							<div class="bl bl-center">
								<div><@=resource.get('name')@><@=(resource.get('type') == 'room' ? ' - Room' : '')@></div>
								<div class="bl-meta-deta">
									<@if(showPrices){@>
									<span><@=TCC.currency(account.get('currency')).symbol@> <@=resource.get('cost') != null ? resource.get('cost').toFixed(2) : 0 @></span>
									<@}@>
									<@if(showDuration){@>
									<span><@=getDurationString(duration)@></span>
									<@}@>
									<span class="bl-meta-details">VIEW DETAILS</span>
								</div>
							</div>
							<div class="bl bl-right"><i class="icon-arrow-right"></i></div>
						</li> 
						<@}
						 });@>
					</ul>
					</div>
					<@});@>
					<@}@>
					<@}@>



					<@if(booking.tab == 'services' && preferences.get('autoSelectResource')){@>
					<@	var items = 0;
						var catResources = {};
						var catResourcesArray = [];
						_.each(location.get('resourceKeys'), function(resourceId){
							var resource = resources.get(resourceId);
							if(!resource) return;
							
							items++;
							allServiceItems++;
							if(resource.get('category')){
								if(!catResources[resource.get('category')]) catResources[resource.get('category')] = [];
								catResources[resource.get('category')].push(resource.id);
								if(!catResourcesArray.contains(resource.get('category'))) catResourcesArray.push(resource.get('category'));
							}
							else{
								return;
							}
						});
						catResourcesArray.sort(function(a, b){
							var keys = preferences.get('resourceCategoryKeys') ? preferences.get('resourceCategoryKeys') : [];
							if(!keys.contains(a)) return -1;
							return keys.indexOf(a) - keys.indexOf(b);
						});
						console.log(catResources);
					@>
					<@if(items){@>
					<h2><@=ptEscape(langjs['Choose a Resource'])@>:</h2>
					<div class="booking-list-box">
					<ul class="booking-list resource-cat-list">
					<@_.each(catResourcesArray, function(catId){
						var resourceIds = catResources[catId];
						resourceIds.sort(function(a, b){
							var keys = preferences.get('resourceKeys') ? preferences.get('resourceKeys') : [];
							if(!keys.contains(a)) return -1;
							return keys.indexOf(a) - keys.indexOf(b);
						});

						var resourceCategoryModel = resourceCats.get(catId);
						var durations = []; var costs = [];
						_.each(resourceIds, function(resourceId){
							var resource = resources.get(resourceId);
							var duration = moment.utc(moment.duration(resource.get('duration')*60000).asMilliseconds());
							var childs = children.where({serviceKey: resourceId});
							if(childs.length){
								_.each(childs,function(child){
								var duration = moment.utc(moment.duration(child.get('duration')*60000).asMilliseconds());
								durations.push(child.get('duration'));
								costs.push(child.get('cost') != null ? child.get('cost').toFixed(2) : 0 );
								});
							} 
							else{
								durations.push(resource.get('duration'));
								costs.push(resource.get('cost') != null ? resource.get('cost').toFixed(2) : 0 );
							}
						});
						console.log(durations);
						console.log(costs);
						@>
						<li data-id="<@=resourceCategoryModel.id@>" class="<@=booking.resourceCatId == resourceCategoryModel.id ? 'active' : ''@>">
							<div class="bl bl-left"><img class="img-responsive img-circle default-img" src="/bookingPage/img/booking-services.png"></div>
							<div class="bl bl-center">
								<div><@=resourceCategoryModel.get('categoryName')@></div>
								<div class="bl-meta-deta">
									<@if(showPrices){
									var min = costs.min();
									var max = costs.max();
									var costString = min == max ? TCC.currency(account.get('currency')).symbol + ' ' + min : TCC.currency(account.get('currency')).symbol + ' ' + min + ' - ' + TCC.currency(account.get('currency')).symbol + ' ' + max;
									@>
									<span><@=costString@></span>
									<@}@>
									<@if(showDuration){
									var min = durations.min();
									var max = durations.max();
									var durationString = min == max ? getDurationString(moment.utc(moment.duration(min*60000).asMilliseconds())) : getDurationString(moment.utc(moment.duration(min*60000).asMilliseconds())) +' - '+ getDurationString(moment.utc(moment.duration(max*60000).asMilliseconds()));  
									@>
									<span><@=durationString@></span>
									<@}@>
									<span class="bl-meta-details">VIEW DETAILS</span>
								</div>
							</div>
							<div class="bl bl-right"><i class="icon-arrow-right"></i></div>
						</li> 
					<@});@>
					</ul>
					</div>
					<@}@>
					<@}@>
					
					
					
					<@if(booking.tab == 'services' && !allServiceItems){@>
					<div class="booking-none text-center margin-top"><@=ptEscape(langjs['BOOKINGS ARE NOT OPEN AT THE MOMENT'])@></div>
					<@}@>
					
					
					 
					<@if(booking.tab == 'staff'){
					var staffList = [];
					_.each(location.get('staffKeys'), function(staffId){
						var staffKeys = [];
						if(booking.type == 'class'){
							staffKeys = booking.availableStaff
						} else if(booking.type == 'appointment') {
							staffKeys = services.get(booking.serviceId.split('_')[0]) ? services.get(booking.serviceId.split('_')[0]).get('staffKeys') :  [];						
						}
						if(!staffKeys.contains(staffId)) return;						
						var staff = team.get(staffId);
						if(!staff) return;
						items++;
						allServiceItems++;
						staffList.push(staff);
					});
					staffList.sort(function(a, b){
						if(booking.preferences.get('staffKeys') && booking.preferences.get('staffKeys').length) 
						{
							var aIndex = booking.preferences.get('staffKeys').indexOf(a.id) != -1 ? booking.preferences.get('staffKeys').indexOf(a.id) : staffList.length;
							var bIndex = booking.preferences.get('staffKeys').indexOf(b.id) != -1 ? booking.preferences.get('staffKeys').indexOf(b.id) : staffList.length;
							return aIndex - bIndex;
						}
						else
						{
							return a.get('firstName') < b.get('firstName') ? -1 : (a.get('firstName') > b.get('firstName') ? 1: 0);
						}
					});
					if(staffList.length){@>
					<h2><@=ptEscape(langjs['Choose a Team Member'])@>:</h2>
					<div class="booking-list-box">
						<ul class="booking-list staff-list">
							<@_.each(staffList, function(staff){@>
							<li data-id="<@=staff.id@>" class="<@=booking.staffId == staff.id ? 'active' : ''@>">
								<div class="bl bl-left"><img class="img-responsive img-circle<@=!staff.get('displayImage') ? ' default-img' : ''@>" src="<@=staff.get('displayImage') ? resizeGoogleImage(staff.get('displayImage'), 50) : '/bookingPage/img/booking-staff.png'@>"></div>
								<div class="bl bl-center">
									<div><@=(staff.get('firstName') ? staff.get('firstName') : "")+" "+(staff.get('lastName') ? staff.get('lastName') : "")@></div>
									<@if(staff.get('designation')){@>
									<div class="bl-meta-deta">
										<span><@=staff.get('designation')@></span>
									</div>
									<@}@>
								</div>
								<div class="bl bl-right"><i class="icon-arrow-right"></i></div>
							</li> 
							<@});@>
						</ul>
					</div>
					<@} else{@>
					<div class="booking-none"><@=ptEscape(langjs['SORRY! NO TEAM MEMBERS ARE AVAILABLE AT THE MOMENT'])@></div>
					<@}@>
					<@}@>
					
					


					<@if(booking.tab == 'sessions'){@>
					<@var classModel = classes.get(booking.classId);@>
					<@if(booking.classSlots.length){@>
					<@if(!preferences.get('hideBookingTimezone')){@>
					<div class="col-xs-12">
						<div class="row">
<!-- 								<div class="col-sm-6" style="margin: 0px auto 20px !important; float: none;"> -->
<!-- 								<div class="col-sm-offset-6 col-sm-6"> -->
							<div class="col-xs-12 col-sm-6 col-md-4" style="padding-left: 30px;margin-left: -15px;position: relative;">
								<i class="icon-navigation timezone-detect"></i>
								<div class="form-group">
			                        <select class="form-control selectpicker account-timezone" data-live-search="true" title="<@=!TCC.timezone_map_latest[currentTimezone] ? (timezoneValue ? timezoneValue : currentTimezone) : ''@>">
			                        	<@_.each(TCC.timezone_ids_latest,function(timezoneId)
			                        	{ 
			                        	var timezoneDisplayName = TCC.timezone_map_latest[timezoneId];
			                        	@>
			                        	<option data-icon="icon-overview" <@=timezoneId == currentTimezone ? 'selected ' : ''@>value="<@=timezoneId@>"> (<@=timezoneHoursMap[timezoneId]@>) <@=timezoneDisplayName@></option>
			                        	<@});@>
				                    </select>
			                    </div>
							</div>
						</div>
					</div>
					<@}@>
					<h2><@=ptEscape(langjs['Choose a Session you want to attend'])@>:</h2>
					<@
						var allSessionStaff = false;
						_.each(booking.classSlots, function(slot){
							if(booking.autoSelectStaff){
								var staffId = slot.split('_')[2];
								if(!team.get(staffId)) return;
							}
							allSessionStaff = true;
						});
						@>
						<@if(allSessionStaff){@>
						<div class="booking-list-box">
							<ul class="booking-list sessions-list">
								<@_.each(booking.classSlots, function(slot)
								{
									if(booking.autoSelectStaff){
										var staffId = slot.split('_')[2];
										if(!team.get(staffId)) return;
									}
									var cost = booking.classTotalAvailable[slot] && booking.classTotalAvailable[slot]["COST"] != null ? booking.classTotalAvailable[slot]["COST"] : 0;
									var duration = booking.classTotalAvailable[slot] && booking.classTotalAvailable[slot]["DURATION"] != null ? booking.classTotalAvailable[slot]["DURATION"] : 0;
									@>
									<li data-date="<@=slot@>" class="<@=slot == booking.sessionDate+'_'+booking.sessionId ? 'active' : ''@>">
										<div class="bl bl-left"><img class="img-responsive img-circle<@=!classModel.get('classImage') ? ' default-img' : ''@>" src="<@=classModel.get('classImage') ? resizeGoogleImage(classModel.get('classImage'), 50) : '/bookingPage/img/booking-class.png'@>"></div>
										<div class="bl bl-center" style="/* display: flex; */ justify-content: left;">
											<div class="bl-meta-deta" style="display: table;">
												<@if(booking.classFullSlots.contains(slot)){@>
													<@if(classModel && classModel.get('allowWaitlist')){@>
														<span class="<@=(booking.classTotalAvailable[slot]['IWA'] == 'true' ? 'slot-badge-wait' : 'slot-badge-full')@>" style="white-space :nowrap;"><@=(booking.classTotalAvailable[slot]["IWA"] == 'true' ? ((preferences.get('showSlots') == true ? booking.classTotalAvailable[slot]["WAIT"] : '') + 'Wait List - '+ptEscape(langjs['Available'])) : (ptEscape(langjs['Full'])))@></span>
													<@}else{@>
														<span class="slot-badge-full" style="white-space :nowrap;"><@=ptEscape(langjs['Full'])@></span>
													<@}@>
												<@}else{@>
													<span class="slot-badge-avail-<@=booking.classTotalAvailable[slot]['COLOR']@>" style="white-space :nowrap;"><@=(preferences.get('showSlots') == true ? booking.classTotalAvailable[slot]["CNF"] : '') + ptEscape(langjs['Available'])@></span>
												<@}@>
												<@if(showPrices){@>
													<span style="padding-left: 10px; margin-left: 10px;margin-right: 0px;display: table-cell;white-space :nowrap;"><@=TCC.currency(account.get('currency')).symbol@> <@=(+cost).toFixed(2)@></span>
												<@}if(showDuration){@>
													<span style="padding-left: 10px; margin-left: 10px;display: table-cell;white-space :nowrap;"><@=+duration >= 60 ? (parseInt(+duration/60, 10) > 1 ? parseInt(+duration/60, 10)+' hrs' : '1 hr')+'&nbsp;' : ''@><@=+duration%60 > 0 ? +duration%60+' mins' : ''@></span>
												<@}@>
											</div>
											<div style="margin-left: 10px;"><@=moment(toPTDate(slot.split('_')[0])).format('Do MMM YYYY, '+hourFormat)@> <span style="font-size: 14px;"><@=timezoneValue@></span></div>
											<@if(booking.autoSelectStaff){
											var staffId = slot.split('_')[2];
											@>
											<div class="bl-meta-deta"><span>- <@=(team.get(staffId).get('firstName') ? team.get(staffId).get('firstName') : "")+" "+(team.get(staffId).get('lastName') ? team.get(staffId).get('lastName') : "")@></span></div>
											<@}@>
										</div>
										<div class="bl bl-right"><i class="icon-arrow-right"></i></div>
									</li>  
								<@});@>
							</ul>
						</div>
						<@} else{@>
						<div class="booking-none"><@=ptEscape(langjs['SORRY! NO TEAM MEMBERS ARE AVAILABLE AT THE MOMENT'])@></div>
						<@}@>
					<@} else{@>
					<div class="booking-none"><@=ptEscape(langjs['NO SESSIONS AVAILABLE FOR THIS MONTH'])@></div>
					<@}@>
					<@}@>
					
					
					
					<@if(booking.tab == 'date'){@>
					<h2 class="hide">Choose date & time:</h2>
					<div class="row margin-bottom">
						<div class="col-sm-6 hide">
							<div class="datepicker"></div>
						</div>
						<@if(!preferences.get('hideBookingTimezone')){@>
						<div class="col-xs-12" style="margin-bottom: 30px;">
							<div class="row">
<!-- 								<div class="col-sm-6" style="margin: 0px auto 20px !important; float: none;"> -->
<!-- 								<div class="col-sm-offset-6 col-sm-6"> -->
								<div class="col-xs-12 col-sm-6 col-md-4" style="padding-left: 30px;position: relative;height: 40px;">
									<i class="icon-navigation timezone-detect"></i>
									<div class="form-group">
				                        <select class="form-control selectpicker account-timezone" data-live-search="true" title="<@=!TCC.timezone_map_latest[currentTimezone] ? (timezoneValue ? timezoneValue : currentTimezone) : ''@>">
				                        	<@_.each(TCC.timezone_ids_latest,function(timezoneId)
				                        	{ 
				                        	var timezoneDisplayName = TCC.timezone_map_latest[timezoneId];
				                        	@>
				                        	<option data-icon="icon-overview" <@=timezoneId == currentTimezone ? 'selected ' : ''@>value="<@=timezoneId@>"> (<@=timezoneHoursMap[timezoneId]@>) <@=timezoneDisplayName@></option>
				                        	<@});@>
					                    </select>
				                    </div>
								</div>
							</div>
						</div>
						<@}@>
						<div class="col-sm-12">
							<div class="row timeslots">
								<@_.each(slots, function(slot){@>
								<div class="col-xs-6 col-sm-3">
									<button class="btn btn-default booking-page-timings-btn <@=booking.dateAndTime == slot ? 'select-block' : ''@>" startdate="<@=slot@>" title="<@=moment(toPTDate(slot)).format('MMM Do YYYY, '+hourFormat)@> <@=timezoneValue@> (Available)"><@=moment(toPTDate(slot)).format(hourFormat)@></button>
								</div>
								<@});@>
								<@if(!slots.length){@>
								<div class="col-xs-12"><span class="no-slots"><@=ptEscape(langjs['No time slots are available for this date. Please select another date above to check availability'])@>.</span></div>
								<@}@>
								<@if(false){@>
						        <div class="col-xs-4">
									<h3 class="booking-page-timings-title">Morning</h3>
									<@
									var morning = 0;
									var noon = 0;
									var evening = 0;
									@>
									<@_.each(slots, function(slot){
									if( +(slot+"").substring(8,10) >= 12 ) return;
									morning++;
									@>
								 	<button class="btn btn-default booking-page-timings-btn <@=booking.dateAndTime == slot ? 'select-block' : ''@>" startdate="<@=slot@>" title="<@=moment(toPTDate(slot)).format('Do MMM YYYY, '+hourFormat)@> <@=timezoneValue@> (Available)"><@=moment(toPTDate(slot)).format(hourFormat)@></button>
									<@});@>
									<@if(!morning){@>
									<span class="no-slots">NO SLOTS</span>
									<@}@>
								</div>
								<div class="col-sm-4 col-xs-4 booking-page-timings-block">
							 		<h3 class="booking-page-timings-title">Afternoon</h3>	
								 	<@_.each(slots, function(slot){
									if( +(slot+"").substring(8,10) < 12 || +(slot+"").substring(8,10) >= 17 ) return;
									noon++;
									@>
								 	<button class="btn btn-default booking-page-timings-btn <@=booking.dateAndTime == slot ? 'select-block' : ''@>" startdate="<@=slot@>" title="<@=moment(toPTDate(slot)).format('Do MMM YYYY, '+hourFormat)@> <@=timezoneValue@> (Available)"><@=moment(toPTDate(slot)).format(hourFormat)@></button>
									<@});@>
									<@if(!noon){@>
									<span class="no-slots">NO SLOTS</span>
									<@}@>
						 		</div>	
						 		<div class="col-sm-4 col-xs-4 booking-page-timings-block">
							 		<h3 class="booking-page-timings-title">Evening</h3>
								 	<@_.each(slots, function(slot){
									if( +(slot+"").substring(8,10) < 17 ) return;
									evening++;
									@>
								 	<button class="btn btn-default booking-page-timings-btn <@=booking.dateAndTime == slot ? 'select-block' : ''@>" startdate="<@=slot@>" title="<@=moment(toPTDate(slot)).format('Do MMM YYYY, '+hourFormat)@> <@=timezoneValue@> (Available)"><@=moment(toPTDate(slot)).format(hourFormat)@></button>
									<@});@>
									<@if(!evening){@>
									<span class="no-slots">NO SLOTS</span>
									<@}@>
								</div>
								<@}@>
							</div>
						</div>
					</div>
					<@}@>
					
					<@if(booking.tab == 'info'){@>
					<h2><@=ptEscape(langjs['Enter your Information'])@>:</h2>
					<div class="information-box col-sm-8 row margin-bottom ">
					<form autocomplete="off">
							<@
							var allCustFieldsArray = [];
							if(allFields && allFields.length) allCustFieldsArray.push(allFields);
							if(allOtherFields && allOtherFields.length) allCustFieldsArray.push(allOtherFields);
							allCustFieldsArray = _.flatten(allCustFieldsArray);
							var custFieldsOrder = custFieldsOrder && custFieldsOrder.length ? custFieldsOrder : ['firstName', 'lastName', 'email', 'mobileNumber', 'alternativeMobileNumber', 'address', 'birthday', 'comments'];
							allCustFieldsArray.sort(function(a, b) {
							  var positionA = custFieldsOrder.indexOf(a) == -1 ? allCustFieldsArray.length : custFieldsOrder.indexOf(a);
							  var positionB = custFieldsOrder.indexOf(b) == -1 ? allCustFieldsArray.length : custFieldsOrder.indexOf(b);
							  if (positionA < positionB) {
							    return -1;
							  }
							  if (positionA > positionB) {
							    return 1;
							  }
							  return 0;
							});
							
							var isFirstLastNameConsecutive = false;
							for (i = 1; i < allCustFieldsArray.length; i++) {
							    if (allCustFieldsArray[i - 1] === 'firstName' && allCustFieldsArray[i] === 'lastName') {
							        isFirstLastNameConsecutive = true;
							    }
							}
							@>
							
							<@ if(booking.type == 'resource' && booking.resources && booking.resources.get(booking.resourceId.split('_')[0]) && booking.resources.get(booking.resourceId.split('_')[0]).get('type') == 'room'){@>
								<div class="row">
									<div class="form-group col-sm-12">
				                        <label class="pt-label"><@=ptEscape(langjs['Meeting Name'])@><span class="req_field">*</span></label>
				                        <input autocomplete="off" class="form-control meetingname" type="text" value="">
				                    </div>
								</div>
							<@}@>
							
							<@
							
							_.each(allCustFieldsArray, function(currentField){
							
							@>
								<@if(isFirstLastNameConsecutive && currentField == 'firstName'){@>
								<div class="row">
									<div class="form-group col-sm-6">
				                        <label class="pt-label"><@=ptEscape(langjs['First Name'])@><span class="req_field">*</span></label>
				                        <input autocomplete="off" class="form-control firstname" type="text" value="<@=user && user.firstName ? user.firstName : ''@>">
				                    </div>
									<div class="form-group col-sm-6">
				                        <label class="pt-label"><@=ptEscape(langjs['Last Name'])@><@=reqFields.contains('lastName') ? '<span class="req_field">*</span>' : ''@></label>
				                        <input autocomplete="off" class="form-control lastname" type="text" value="<@=user && user.lastName ? user.lastName : ''@>">
				                    </div>
								</div>
								<@}else if(!isFirstLastNameConsecutive && currentField == 'firstName'){@>
								<div class="form-group">
			                        <label class="pt-label"><@=ptEscape(langjs['First Name'])@><span class="req_field">*</span></label>
			                        <input autocomplete="off" class="form-control firstname" type="text" value="<@=user && user.firstName ? user.firstName : ''@>">
			                    </div>
								<@}else if(!isFirstLastNameConsecutive && currentField == 'lastName'){@>
								<div class="form-group">
			                        <label class="pt-label"><@=ptEscape(langjs['Last Name'])@><@=reqFields.contains('lastName') ? '<span class="req_field">*</span>' : ''@></label>
			                        <input autocomplete="off" class="form-control lastname" type="text" value="<@=user && user.lastName ? user.lastName : ''@>">
			                    </div>
								<@}@>
								<@if(currentField == 'email'){@>
								<div class="form-group">
			                        <label class="pt-label"><@=ptEscape(langjs['Email Id'])@><@=reqFields.contains('email') ? '<span class="req_field">*</span>' : ''@></label>
			                        <input autocomplete="off" class="form-control custemail" type="text" value="<@=user && user.email ? user.email : ''@>">
			                    </div>
			                    <@}@>
			                    
			                    <@if(currentField == 'mobileNumber'){@>
			                    <div class="form-group">
			                        <label class="pt-label"><@=ptEscape(langjs['Mobile Number'])@><@=reqFields.contains('mobileNumber') ? '<span class="req_field">*</span>' : ''@></label>
	<!-- 			                    <div class="phonenumber-group"> -->
				                    	<input autocomplete="off" class="form-control custmobile mobilenumber" type="text" value="<@=user && user.phoneNumber ? '+'+user.phoneNumber.replace('+','')  : ''@>">
	<!-- 			                   		<input autocomplete="off" class="form-control custmobile-extension" placeholder="Extension" type="text" value="<@=user.phoneNumberExt ? user.phoneNumberExt  : ''@>"> -->
	<!-- 			                   	</div> -->
			                   	</div>
			                    <@}@>
		
			                    <@if(currentField == 'alternativeMobileNumber'){@>
			                    <div class="form-group">
			                        <label class="pt-label"><@=ptEscape(langjs['Alternative Number'])@><@=reqFields.contains('alternativeMobileNumber') ? '<span class="req_field">*</span>' : ''@></label>
			                       	<div class="phonenumber-group">
			                        	<input autocomplete="off" class="form-control custalternative" type="text" value="<@=user && user.alternativeNumber ? '+'+user.alternativeNumber.replace('+','')  : ''@>">
			                   			<input autocomplete="off" class="form-control custaltmobile-extension" placeholder="Extension" type="text" value="<@=user.altNumberExt ? user.altNumberExt  : ''@>">
			                   		</div>
			                   	</div>
			                    <@}@>
								<@if(currentField == 'birthday'){@>
			                    <div class="form-group">
			                        <label class="pt-label"><@=ptEscape(langjs['Birthday'])@><@=reqFields.contains('birthday') ? '<span class="req_field">*</span>' : ''@></label>
			                        <div class="cust-edit-birthday-holder margin-bottom clearfix">
			                        	<div class="col-xs-4 btn-group">
					                     	<select class="form-control selectpicker custmonth bdselect" title="<@=ptEscape(langjs['MONTH'])@>">
					                            <@
					                            var birthmonth, birthday;
					                            if(user.birthMonthAndDate)
												{
													birthmonth = user.birthMonthAndDate.split('-')[0];
													birthday   = user.birthMonthAndDate.split('-')[1];
												}
												var monthsInDiffLanguage = moment.months();
												for(var i=0; i< Months.length; i++){@>
												<option value="<@=Months[i]@>" <@= birthmonth  == Months[i] ? 'selected="selected"' : ''@> ><@=monthsInDiffLanguage[i]@></option>
											   	<@}@>
					                        </select>
					                     </div>
					                     <div class="col-xs-4 btn-group" style="margin-left: -1px;">
					                     	<@
											  	var Days = [];
						                         if(!birthmonth || birthmonth == 'month')
						                         {
						                           	Days.length = 31;					
						                         }  						
												 else if(birthmonth == 'February' && (user.birthYear && user.birthYear%4 == 0))
											  	{
											  		Days.length = 29 ;
											  	}
											 	else if(birthmonth == 'January' || birthmonth == 'March' || birthmonth == 'May' || birthmonth =='July' || birthmonth == 'August' || birthmonth == 'October' || birthmonth == 'December')
											  	{
											  	 	Days.length =31 ;
											  	}
											  	else if(birthmonth == 'April' || birthmonth == 'June' || birthmonth == 'September' || birthmonth == 'November')
											  	{
											  		Days.length = 30 ;
											  	}
											 	 else
											  	{
											 		 Days.length = 28;
											  	}
											@> 
					                     	<select class="form-control selectpicker custdate bdselect" title="<@=ptEscape(langjs['Date'].toUpperCase())@>">
												<@for(var i=1; i <= Days.length; i++){@>
												<option value="<@=i@>" <@=birthday == i ? 'selected="selected"' : ''@>  ><@=i@></option>
												<@}@>
					                        </select>
					                     </div>
					                     <div class="col-xs-4 btn-group cust-year-drop <@=user.birthYear ? '' : 'hide'@>" style="margin-left: -1px;">
					                     	<select class="form-control selectpicker custyear bdselect" title="<@=ptEscape(langjs['YEAR'])@>">
					                            	<@for(var i= +DateFormater(new Date(),"%y") ; i >= 1900; i--){@>
						                   	  	<option  value="<@=i@>" <@=user.birthYear == i ? 'selected="selected"' : ''@> ><@=i@></option>
									            <@}@>
					                        </select>
					                     </div>
					                     <div class="col-xs-4">
					                     	<a href="javascript:void(0);" class="show-set-year <@=user.birthYear ? 'hide' : ''@>"><@=ptEscape(langjs['SET YEAR'])@></a>
					                     </div>
			                        </div>
			                    </div>
			                    <@}@>
								<@if(currentField == 'address'){@>
								<div class="form-group">
			                        <label class="pt-label"><@=ptEscape(langjs['Address'])@><@=reqFields.contains('address') ? '<span class="req_field">*</span>' : ''@></label>
			                        <input autocomplete="off" class="form-control custaddress" type="text" value="<@=user && user.address ? user.address : ''@>">
			                    </div>
								<div class="form-group">
			                        <label class="pt-label"><@=ptEscape(langjs['City'])@><@=reqFields.contains('address') ? '<span class="req_field">*</span>' : ''@></label>
			                        <input autocomplete="off" class="form-control custcity" type="text" value="<@=user && user.city ? user.city : ''@>">
			                    </div>
			                    <div class="row">
									<div class="form-group col-sm-6">
				                        <label class="pt-label"><@=ptEscape(langjs['State'])@><@=reqFields.contains('address') ? '<span class="req_field">*</span>' : ''@></label>
				                        <input autocomplete="off" class="form-control custstate" type="text" value="<@=user && user.state ? user.state : ''@>">
				                    </div>
									<div class="form-group col-sm-6">
				                        <label class="pt-label"><@=ptEscape(langjs['Pincode / Zipcode'])@><@=reqFields.contains('address') ? '<span class="req_field">*</span>' : ''@></label>
				                        <input autocomplete="off" class="form-control custzip" type="text" value="<@=user && user.zip ? user.zip : ''@>">
				                    </div>
			                    </div>
			                    <@}@>
			                   
			                    
			                    <@_.each(otherFieldsMap, function(key, value){@>
			                    <@if(currentField == value){@>
			                    <div class="form-group">
			                        <label class="pt-label"><@=ptEscape(value.replaceAll('ptSPCpt',' '))@><@=reqFields.contains(value) ? '<span class="req_field">*</span>' : ''@></label>
			                        <input autocomplete="off" class="form-control other_<@=key@>" data-key="<@=key@>" type="text" value="<@=user && user.otherFields ? user.otherFields[value] : ''@>">
			                    </div>
			                    <@}@>
			                    <@});@>
	
		                    <@});@>
		                    
		                    
		                    
		                    <@var allApptFieldsArray = [];
							if(allApptOtherFields && allApptOtherFields.length) allApptFieldsArray.push(allApptOtherFields);
							allApptFieldsArray = _.flatten(allApptFieldsArray);
							var allDuplicateApptFieldsArray = _.flatten(allApptFieldsArray);
							var apptFieldsOrder = apptFieldsOrder && apptFieldsOrder.length ? apptFieldsOrder : [];
							allApptFieldsArray.sort(function(a, b) {
							  var positionA = apptFieldsOrder.indexOf(a) == -1 ? allApptFieldsArray.length : apptFieldsOrder.indexOf(a);
							  var positionB = apptFieldsOrder.indexOf(b) == -1 ? allApptFieldsArray.length : apptFieldsOrder.indexOf(b);
							  if (positionA < positionB) {
							    return -1;
							  }
							  if (positionA > positionB) {
							    return 1;
							  }
							  return 0;
							});
							
							var filteredArray = apptFieldsOrder.filter(function(n) {
							    return allDuplicateApptFieldsArray.indexOf(ptEscape(n)) !== -1 && allDuplicateApptFieldsArray.remove(ptEscape(n));
							});
							
							_.each(filteredArray, function(currentField){@>
			                    <@_.each(apptOtherFieldsMap, function(key, value){@>
			                    <@if(ptEscape(currentField) == value){@>
			                    <div class="form-group">
			                        <label class="pt-label"><@=ptEscape(value.replaceAll('ptSPCpt',' '))@><@=apptReqFields.contains(value) ? '<span class="req_field">*</span>' : ''@></label>
			                        <input autocomplete="off" class="form-control apptOther_<@=key@>" data-key="<@=key@>" type="text" value="">
			                    </div>
			                    <@}@>
			                    <@});@>
		                    <@});@>
	
		                    
		                    
		                    <@if(allCustFieldsArray.contains('comments')){@>
							<div class="form-group">
		                        <label class="pt-label"><@=ptEscape(langjs['Booking Notes'])@></label>
		                        <textarea class="form-control bookingcomments" rows="3" ><@=user && user.bookingNotes ? user.bookingNotes : ''@></textarea>
		                    </div>
		                    <@}@>
		                    
		                    <@if(preferences.get("termsLink") && preferences.get("termsLink") != ''){
		                    	var termsLink = "http://"+preferences.get("termsLink").replace("http://", "").replace("https://", "");
		                    @>
		                    <div class="checkbox-holder checkbox-holder-lg margin-bottom">
		                    	<input id="terms-link" class="checkbox-custom terms-link" type="checkbox" <@=( preferences.get('termsLink') && preferences.get('checkTcOnLoad')) ? 'checked="checked"' : ''@> <@= (preferences.get('termsLink')) ? '' : 'enabled="enabled"'@>/ >
								<label for="terms-link" class="checkbox-custom-label">I confirm that I have read, understand and agree to the <a style="color: #674CAB;" href='<@=termsLink@>' target="_blank">Terms and Conditions</a>.</label>
						    	<!-- <div class="clearfix" >I confirm that I have read, understand and agree to the <a style="color: #674CAB;" href='<@=termsLink@>' target="_blank">Terms and Conditions</a>.</div> -->
						    </div>
		                    <@}
		                    if((alerts.customerAlerts.contains('remMessage')) || 
		                    ((booking.type == 'appointment' && (alerts.smsAlerts.contains("booked") || alerts.smsAlerts.contains("edited") || alerts.smsAlerts.contains("cancelled"))) ||
		                    (booking.type == 'class' && (alerts.smsAlerts.contains("classBooked") || alerts.smsAlerts.contains("classEdited") || alerts.smsAlerts.contains("classCancelled") || alerts.smsAlerts.contains("classWait") || alerts.smsAlerts.contains("classWaitEdited") || alerts.smsAlerts.contains("classWaitCancel"))) || 
		                    (booking.type == 'resource' && (alerts.smsAlerts.contains("resBooked") || alerts.smsAlerts.contains("resEdited") || alerts.smsAlerts.contains("resCancelled"))))){@>	
		                    <div class="checkbox-holder checkbox-holder-lg margin-bottom">
			                    <input id="send-sms" class="checkbox-custom send-sms" type="checkbox" checked>
								<label for="send-sms" class="checkbox-custom-label"><@=ptEscape(langjs['Enable SMS notifications for this booking'])@></label>
		                    </div>
		                    <@}
		                    if(preferences.get("captcha")){@>		
							<style>#g-captcha > div{margin: auto;}</style>                    
<!-- 		                    <div id="g-captcha" class="g-recaptcha" data-sitekey="<@=cap_site@>"></div> -->
								<div id="g-captcha"></div>
		                    <@}@>
		                    
		                    <div class="margin-top text-center">
		                    	<@
		                      if(!preferences.get("termsLink"))
		                    	{
			                    	  if(booking.isPaymentRequired)
			                    	  {
			                    	   	@>
			                    	   		<button  class="btn btn-primary margin-bottom booknow bookingpaymentbtn"><@=ptEscape(langjs['Proceed to Payment'])@><i class="icon-arrow-right"></i></button>
			                    		 		
			                    		 		<@if(booking.showPayLater){@>
													<hr class="hr-text bookingpaymentbtnor" data-content="OR">
													<button class="btn btn-default margin-bottom pay-later bookingpaymentbtn" style="padding: 15px 30px;margin-top: 10px;font-size: 16px;margin-right: 28px;"><@=ptEscape(langjs['Skip Payment'])@></button>
												<@}@>
			                    	  	<@
			                    	  }
			                    	  else
			                    	  {
			                    	  	@>
			                    	  		<button class="btn btn-primary margin-bottom booknow"><i class="icon-check-mark"></i><@=ptEscape(langjs['Book Appointment'])@></button>
			                    	  	<@
			                    	  }
		                    	  
		                    	}
		                    	else if(booking.isPaymentRequired)
		                    	{
		                    		 if(!preferences.get("checkTcOnLoad"))
		                    		 {
		                    		 	@>
		                    		 		<button  disabled class="btn btn-primary margin-bottom booknow bookingpaymentbtn"><@=ptEscape(langjs['Proceed to Payment'])@><i class="icon-arrow-right"></i></button>
		                    		 		
		                    		 		<@if(booking.showPayLater){@>
												<hr class="hr-text bookingpaymentbtnor" data-content="OR">
												<button disabled class="btn btn-default margin-bottom pay-later bookingpaymentbtn" style="padding: 15px 30px;margin-top: 10px;font-size: 16px;margin-right: 28px;"><@=ptEscape(langjs['Skip Payment'])@></button>
											<@}@>
		                    		 	<@
		                    		 }
		                    		 else
		                    		 {
		                    		 	@>
		                    		 		<button  class="btn btn-primary margin-bottom booknow bookingpaymentbtn"><@=ptEscape(langjs['Proceed to Payment'])@><i class="icon-arrow-right"></i></button>
		                    		 		
		                    		 		<@if(booking.showPayLater){@>
												<hr class="hr-text bookingpaymentbtnor" data-content="OR">
												<button class="btn btn-default margin-bottom pay-later bookingpaymentbtn" style="padding: 15px 30px;margin-top: 10px;font-size: 16px;margin-right: 28px;"><@=ptEscape(langjs['Skip Payment'])@></button>
											<@}@>
		                    		 	<@
		                    		 }
		                    	}
		                    	else 
		                    	{
		                    		 if(!preferences.get("checkTcOnLoad"))
		                    		 {
		                    		 	@>
			                    			<button disabled class="btn btn-primary margin-bottom booknow"><i class="icon-check-mark"></i><@=ptEscape(langjs['Book Appointment'])@></button>
			                    		<@
		                    		 }
		                    		 else
		                    		 {
		                    		 	@>
			                    			<button class="btn btn-primary margin-bottom booknow"><i class="icon-check-mark"></i><@=ptEscape(langjs['Book Appointment'])@></button>
			                    		<@
		                    		 }
		                    	}
		                    	@>
							</div>
						</form>
					</div>
					<@}@>
					
					<@if(booking.tab == 'payment'){@>
					<div class="row">
						<div class="col-xs-12" style="float: none;">
							<iframe id="paymentframe" src="<@=paymentLink@>" width="100%" frameborder="0" style="min-height: 400px;"></iframe>
						</div>
					</div>
					<@}@>
					
					
					<@if(booking.tab == 'confirmation' || booking.tab == 'waiting' || booking.tab == 'pending'){@>
					<div class="row">
						<div class="col-sm-8" style="margin: auto;float: none;">
							<div class="margin-bottom">
								<div class="booking-confirm-head">
									
									<@if(booking.tab == 'waiting'){@>
										<i class="icon-completed"></i>
										<h2><@=ptEscape(langjs['Your booking has been added to waitlist'])@>.</h2>
										<@if(booking.bookingEmailConfirmation == true){@>
											<@if(user.email){@>
											<h3><@=ptEscape(langjs['You will be receiving a mail once your booking has been confirmed'])@>.</h3>
											<@}@>
										<@}@>
									<@}else if(booking.tab == 'pending'){@>
										<i class="icon-pending" style="color: orange;font-size: 80px;"></i>
										<h2><@=ptEscape(langjs['Your booking is waiting for confirmation'])@>.</h2>
										<@if(booking.bookingEmailConfirmation == true && 
										((booking.type == 'appointment' && alerts.customerAlerts.contains("booked")) || 
										(booking.type == 'class' && alerts.customerAlerts.contains("classBooked")) || 
										(booking.type == 'resource' && alerts.customerAlerts.contains("resBooked")))){@>
											<@if(user.email){@>
											<h3><@=ptEscape(langjs['You will be receiving a confirmation mail once your booking has been approved'])@>.</h3>
											<@}@>
										<@}@>
									<@}else{@>
										<i class="icon-completed"></i>
										<h2><@=ptEscape(langjs['Your booking has been confirmed'])@>.</h2>
										<@if(booking.bookingEmailConfirmation == true){@>
											<@if(user.email){@>
												<h3><@=ptEscape(langjs['An email has been sent to '])@>  <@=user.email@></h3>
											<@}@>
										<@}@>
									<@}@>
									
								</div>
								<div class="booking-confirm clearfix">

									<@if(booking.type == 'appointment'){
										var serviceName = '';
										if(booking.serviceId.contains('_')) {
											serviceName = services.get(booking.serviceId.split('_')[0]).get('serviceName');
											serviceName += ' ('+children.get(booking.serviceId.split('_')[1]).get('name')+')';
										}
										else serviceName = services.get(booking.serviceId).get('serviceName');
									@>
									<div class="clearfix">
										<div class="col-sm-3"><@=ptEscape(langjs['Service'])@></div>
										<div class="col-sm-9"><@=serviceName@></div>
									</div>
									<@}@>
									
									<@if(booking.type == 'resource'){
										var serviceName = '';
										if(booking.resourceId.contains('_')) {
											serviceName = resources.get(booking.resourceId.split('_')[0]).get('name');
											serviceName += ' ('+children.get(booking.resourceId.split('_')[1]).get('name')+')';
											serviceName += ' - '+toTitleCase(resources.get(booking.resourceId.split('_')[0]).get('type'));
										}
										else
										{
											serviceName = resources.get(booking.resourceId).get('name');
											serviceName += (' - '+toTitleCase(resources.get(booking.resourceId).get('type')));
										}
									@>
									<div class="clearfix">
										<div class="col-sm-3"><@=ptEscape(langjs['Resource'])@></div>
										<div class="col-sm-9"><@=serviceName@></div>
									</div>
									<@}@>
									
									<@if(booking.type == 'class'){
										var serviceName = classes.get(booking.classId).get('className');
									@>
									<div class="clearfix">
										<div class="col-sm-3"><@=ptEscape(langjs['Class'])@></div>
										<div class="col-sm-9"><@=serviceName@></div>
									</div>
									<@}@>
									
									<@if(booking.type == 'appointment' || booking.type == 'class'){@>
									<div class="clearfix">
										<div class="col-sm-3"><@=ptEscape(langjs['Team Member'])@></div>
										<div class="col-sm-9"><@=(team.get(booking.staffId).get('firstName') ? team.get(booking.staffId).get('firstName') : "")+" "+(team.get(booking.staffId).get('lastName') ? team.get(booking.staffId).get('lastName') : "")@></div>
									</div>
									<@}@>
		
									<@if(booking.type == 'appointment' || booking.type == 'resource'){@>
									<div class="clearfix">
										<div class="col-sm-3"><@=ptEscape(langjs['Date & Time'])@></div>
										<div class="col-sm-9"><@=moment(toPTDate(booking.dateAndTime)).format('MMM Do YYYY, '+hourFormat)@> <@=timezoneValue@></div>
									</div>
									<@}@>
									
									<@if(booking.type == 'class'){@>
									<div class="clearfix">
										<div class="col-sm-3"><@=ptEscape(langjs['Date & Time'])@></div>
										<div class="col-sm-9"><@=moment(toPTDate(booking.sessionDate)).format('MMM Do YYYY, '+hourFormat)@> <@=timezoneValue@></div>
									</div>
									<@}@>
		
									<div class="clearfix">
										<div class="col-sm-3"><@=ptEscape(langjs['Client'])@></div>
										<div class="col-sm-9" style="line-height: 22px;margin-top: 5px;">
											<@=user.firstName@> <@=user.lastName@><br/>
											<@if(user.phoneNumber){@>
											<@=formatPhoneNumber('+'+user.phoneNumber.replace('+',''))@><br/>
											<@}@>
											<@if(user.email){@>
											<@=user.email@><br/>
											<@}@>
										</div>
									</div>
									<@if(booking.tab != 'waiting'){@>
									<@if(booking.zoomURL){@>
									<div class="clearfix" style="margin: 10px 0px;">
										<div class="col-sm-3" style="line-height: 20px;">Zoom URL</div>
										<div class="col-sm-9" style="word-break: break-all;line-height: 20px;">
											<a target="_blank" href="<@=booking.zoomURL@>"><@=booking.zoomURL@></a>
										</div>
									</div>
										<@if(booking.zoomPassword){@>
										<div class="clearfix" style="margin: 10px 0px;">
											<div class="col-sm-3" style="line-height: 20px;">Meeting Password</div>
											<div class="col-sm-9" style="word-break: break-all;line-height: 20px;">
												<@=booking.zoomPassword@>
											</div>
										</div>
										<@}@>
									<@}@>
									<@if(booking.gotomeetingURL){@>
									<div class="clearfix" style="margin: 10px 0px;">
										<div class="col-sm-3" style="line-height: 20px;">GoToMeeting URL</div>
										<div class="col-sm-9" style="word-break: break-all;line-height: 20px;">
											<a target="_blank" href="<@=booking.gotomeetingURL@>"><@=booking.gotomeetingURL@></a>
										</div>
									</div>
									<@}@>
									<@if(booking.jitsiURL){@>
									<div class="clearfix" style="margin: 10px 0px;">
										<div class="col-sm-3" style="line-height: 20px;">Jitsi URL</div>
										<div class="col-sm-9" style="word-break: break-all;line-height: 20px;">
											<a target="_blank" href="<@=booking.jitsiURL@>"><@=booking.jitsiURL@></a>
										</div>
									</div>
									<@}@>
									<@if(booking.hangoutURL){@>
									<div class="clearfix" style="margin: 10px 0px;">
										<div class="col-sm-3" style="line-height: 20px;">Google Meet URL</div>
										<div class="col-sm-9" style="word-break: break-all;line-height: 20px;">
											<a target="_blank" href="<@=booking.hangoutURL@>"><@=booking.hangoutURL@></a>
										</div>
									</div>
									<@}@>
									<@if(booking.hangoutPhone){@>
									<div class="clearfix" style="margin: 10px 0px;">
										<div class="col-sm-3" style="line-height: 20px;">Google Meet Phone</div>
										<div class="col-sm-9" style="word-break: break-all;line-height: 20px;">
											<a target="_blank" href="tel:<@=booking.hangoutPhone@><@=booking.phoneNumberPin ? ','+booking.phoneNumberPin : ''@>"><@=booking.hangoutPhone@> Pin: <@=booking.phoneNumberPin@></a>
										</div>
									</div>
									<@}@>
									<@if(booking.outlookURL){@>
									<div class="clearfix" style="margin: 10px 0px;">
										<div class="col-sm-3" style="line-height: 20px;">Skype/Teams URL</div>
										<div class="col-sm-9" style="word-break: break-all;line-height: 20px;">
											<a target="_blank" href="<@=booking.outlookURL@>"><@=booking.outlookURL@></a>
										</div>
									</div>
									<@}@>
									<@}@>
								</div>
								<div class="margin-top text-center">
									<div class="book-redirect-container"></div>
									<button type="button" class="btn btn-primary margin-bottom bookanother" style="margin-right: 30px;"><@=ptEscape(langjs['Book Again'])@></button>
									<@if(preferences.get('confirmCustomButtonName') && preferences.get('confirmCustomButtonLink')){@>
									<a type="button" class="btn btn-success bookcustombtn margin-bottom" href="<@=!preferences.get('confirmCustomButtonLink').contains('http://') && !preferences.get('confirmCustomButtonLink').contains('https://') ? 'http://'+preferences.get('confirmCustomButtonLink') : preferences.get('confirmCustomButtonLink')@>" target="_blank"> <@=ptEscape(preferences.get('confirmCustomButtonName'))@></a>
									<@}@>
								</div>
							</div>
						</div>
					</div>
					<@}@>
					
					
				</div>
				
		<@}@>	
		
		
		
		
		
		
		
		
		
		
		<div class="modal fade" id="booking-login" role="dialog">
		    <div class="modal-dialog">
		      <!-- Modal content-->
		      <div class="modal-content">
		        <div class="modal-header" style="background: #674CAB;">
		          <button type="button" class="close" style="color: #fff;margin-top: -11px;" data-dismiss="modal">&times;</button>
		          <div class="logo" style="text-align: center;padding: 0px;">
					<a href="/"><img class="brand-logo" src="/images/picktime-logo-leftnav-footer.png" height="50"></a>
				  </div>
		        </div>
		        <div class="modal-body booking-login-body">
			    	<div class="form">
			            <div class="panel with-nav-tabs panel-default bookingPage-loginPage" style="border: none;">
			                <div class="panel-heading loginPage-heading" style="border-bottom: none;">
		                        <ul class="nav nav-tabs bookingPage-loginPage-tabs">
		                            <li class="active"><a href="#login-tab" class="login-navtab-btn" data-toggle="tab"><@=ptEscape(langjs['Login'].toUpperCase())@></a></li>
		                            <li><a href="#register-tab" class="login-navtab-btn" data-toggle="tab"><@=ptEscape(langjs['Register'].toUpperCase())@></a></li>
		                        </ul>
			                </div>
			                <div class="panel-body bookingPage-loginPage-body">
			                    <div class="tab-content">
			                        <div class="tab-pane fade in active" id="login-tab">
		                        		<div class="main-login-form">
		                        			<div class="form-group">
						                        <label class="pt-label"><@=ptEscape(langjs['Email'])@></label>
						                        <input class="form-control bookingPage-loginPage-input booking-login-userName m-t-25" type="text"  autocomplete="off" value=""  placeholder="<@=ptEscape(langjs['Email'])@>" required="required">
						                    </div>
		                        			<div class="form-group" style="position: relative">
						                        <label class="pt-label"><@=ptEscape(langjs['Password'])@></label>
						                        <input class="form-control  bookingPage-loginPage-input booking-loign-password m-t-25" type="password" style="padding-right: 40px;" placeholder="<@=ptEscape(langjs['Password'])@>" autocomplete="off" required="required">
						                    	 <i id="eye-login" class="icon-private field-icon showpasswords hide" style="bottom: 8px;"></i>
						                    </div>
						                    <input class="form-control loginPage-input m-t-25" type="hidden" id="lg_cap" name="lg_cap">
				                        	<style>#g-captcha {margin-top: -10px;}</style>                    
											<div id="g-captcha-login"></div>
				                        	<button type="submit" class="margin-top btn btn-primary btn-block login-btn signin-btn m-t-25" style="padding: 10px;font-size: 16px;"><@=ptEscape(langjs['Login'])@></button>
				                        </div>
			                        	<div class="forgot-password m-t-25 margin-top">
			                        		<a class="forgot-password-link" href="/forgotPassword" target="_blank"><@=ptEscape(langjs['Forgotten your password?'])@></a>
			                        	</div>
											<hr class="hr-text" data-content="OR">
				                        	<div class="login-btn-block clearfix">
					                        	<div class="facebook-connect pull-left" style="cursor: pointer;width: 45%;">
					                        		<img src="/img/login/fb-signin-button.png" class="img-responsive">
					                        	</div>
					                        	<div class="google-connect pull-right" style="cursor: pointer;width: 45%;">
					                        		<img src="/img/login/google-signin-button.png" class="img-responsive">
					                        	</div>
	                        			   </div>
			                       		 </div>
			                        <div class="tab-pane fade" id="register-tab">
		                        		<div class="main-login-form">
		                        			<div class="form-group">
						                        <label class="pt-label"><@=ptEscape(langjs['Full Name'])@></label>
						                        <input class="form-control bookingPage-loginPage-input booking-firstName m-t-25" type="text"  placeholder="<@=ptEscape(langjs['Full Name'])@>"  autocomplete="off" required="required">
						                    </div>
		                        			<div class="form-group">
						                        <label class="pt-label"><@=ptEscape(langjs['Email'])@></label>
						                        <input class="form-control bookingPage-loginPage-input booking-email m-t-25" value="" type="text" placeholder="<@=ptEscape(langjs['Email'])@>" autocomplete="off" required="required">
						                    </div>
		                        			<div class="form-group" style="position: relative">
						                        <label class="pt-label"><@=ptEscape(langjs['Password'])@></label>
						                        <input class="form-control bookingPage-loginPage-input booking-password m-t-25" type="password" style="padding-right: 40px;" maxlength="256" placeholder="<@=ptEscape(langjs['Password'])@>"  autocomplete="off" required="required">
						                   		 <i id="eye-register" class="icon-private field-icon showpasswords" style="bottom: 8px;"></i>
						                    </div>
		                        			<div class="form-group" style="position: relative">
						                        <label class="pt-label"><@=ptEscape(langjs['Confirm Password'])@></label>
						                        <input class="form-control bookingPage-loginPage-input booking-confirmPassword m-t-25" style="padding-right: 40px;"type="password" maxlength="256" placeholder="<@=ptEscape(langjs['Confirm Password'])@>"  autocomplete="off" required="required">
						                    	<i id="eye-confRegister" class="icon-private field-icon showpasswords" style="bottom: 8px;"></i>
						                    </div>
				                        	<button type="submit" class="margin-top btn btn-primary btn-block login-btn register-btn m-t-25" style="padding: 10px;font-size: 16px;"><@=ptEscape(langjs['Register'])@></button>
			                        	</div>
			                        	<hr class="hr-text" data-content="OR">
			                        	<div class="login-btn-block clearfix">
				                        	<a class="facebook-connect pull-left" href="/social/redirect/facebook?isBookingPage=true" style="width: 45%">
				                        		<img src="/img/login/fb-signup-button.png" class="img-responsive">
				                        	</a>
				                        	<a class="google-connect pull-right" href="/social/redirect/google?isBookingPage=true" style="width: 45%">
				                        		<img src="/img/login/google-signup-button.png" class="img-responsive">
				                        	</a>
                        			   </div>
                        			   <div style="color: #999999;margin-top: 10px;padding: 4px;">
			                        		By clicking on Register or Signup with Facebook or Signup with Google, you agree to our <a href="https://www.picktime.com/legal/terms" target="_blank" style="color: #b3b2ab">Terms</a>, <a href="https://www.picktime.com/legal/privacy" target="_blank" style="color: #b3b2ab">Privacy Policy</a> and <a href="https://www.picktime.com/legal/cookie" target="_blank" style="color: #b3b2ab">Cookie Policy</a>.
			                          </div>
			                        </div>
			                    </div>
			                </div>
			            </div>
			        </div>
		        </div>
		      </div>
	    	</div>
	  	  </div>
