var APP = {
	scrollIndicator: function($html){
		if($(document).scrollTop() > 0){
			$html.find('body').addClass('scrolled');
		}else{
			$html.find('body').removeClass('scrolled');			
		}		
		if($(document).scrollTop() > 32){
			$html.find('body').addClass('topped');		
		}else{
			$html.find('body').removeClass('topped');						
		}
	},
	bgImagePreloader: function(){
		
		$('.preload-bg-image').each(function(){
						
			var $container = $(this);
			var imageSrc = $container.data('bgSrc');	
			
			if(imageSrc != ''){
			
			var tmpImg = new Image();
		    tmpImg.src = imageSrc;
		    tmpImg.onload = function() {
	      		$container.css({'background-image': 'url(' + imageSrc +')'});
		    	$container.addClass('loaded');
		    	setTimeout(function(){
		    		$container.find('.remove-after-load').remove();
		    	},500);
		    };			
		    }else{
		    	$container.addClass('loaded');
		    }
			
		});
		
	},
	siteSearch: function(){
		
		$('.site-search').each(function(){
			
			var $searchForm = $(this).find('form');
			$searchForm.submit(function(){
				return false;
			});
			
			$searchForm.find('input[type="text"]').keydown(function(){
				if($(this).val().length < 3){
					$searchForm.find('.no-results').removeClass('show');
				}
			});
			
			
			var ajaxCall = false;
			var timeout;
			
			$searchForm.find('input[type="text"]').typeahead({
				minLength: 2, 
				fitToElement: true,
				items:13,
				showHintOnFocus: true,
				source: function(keyword, callback){	
					keyword = keyword.replace(/</g, "&lt;").replace(/>/g, "&gt;");
					$searchForm.find('.dynamic-icon').addClass('loading');
							
					if (timeout) {
		                clearTimeout(timeout);
		            }
		
		            timeout = setTimeout(function() {
		            	if(ajaxCall){
				        	ajaxCall.abort();
				       	}
		                ajaxCall = $.ajax({
							method: 'POST',
							url: '/api/search',
							data: {keyword: keyword},
							success: function(res){
								if(res.data.length == 0 && keyword != ''){
									$searchForm.find('.no-results').find('.keyword').html(keyword);
									$searchForm.find('.no-results').addClass('show');
								}else{
									$searchForm.find('.no-results').removeClass('show');							
								}
								setTimeout(function(){
									$searchForm.find('.dynamic-icon').removeClass('loading');
								}, 200);
								return callback(res.data);
							}
						});
		            }, 200);
										
					return ajaxCall;				
				},
				displayText: function(item){
					if(item.type == 'strain'){
						return ''+item.title;						
					}else if(item.type == 'brand'){
						return ''+item.title+' (breeder)';
					}
				},
			    highlighter: function(item) {
			        var query = this.query;
			        if(!query) {
			            return '<div> ' + item + '</div>';
			        }
			        
			        var queryParts = query.split(' ');
			        var jElem = $('<div></div>').html(item);
			        for(var i=0;i<queryParts.length;i++){
				        var reEscQuery = queryParts[i].replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
				        var reQuery = new RegExp('(' + reEscQuery + ')', "gi");
				
				        var textNodes = $(jElem.find('*')).add(jElem).contents().filter(function () { return this.nodeType === 3; });
				        textNodes.replaceWith(function() {
				            return $(this).text().replace(reQuery, '<strong>$1</strong>')
				        });	
			        }			        
			        
			        return jElem.html();
			    },
			    matcher: function(item){
			    	return true;
			    },
				afterSelect: function(item){
					
					$searchForm.find('input[type="text"]').val((item.title).replace(/(<([^>]+)>)/ig,""));
					$searchForm.find('.dynamic-icon').addClass('loading');
					document.location.href = item.url;						
					
					
				}
	         });
			
		});
		
	},
	pageSeedsOverview: function(){
				
		CATALOG.catalog();
		
		if($('.category-text-block').length > 0 && $('.category-text-block .more-about').length > 0){
			$('.category-text-block .more-about').click(function(){
				$("html, body").animate({ scrollTop: $('.section-category-text').offset().top-$('#header').height() }, 1000);
			});
		}
		
	},
	pageSeedPage: function(){
		
		var $gallery = $('.section-strain-main .gallery');
		
		var $mainImg = $gallery.find('.main img');
		var $list = $gallery.find('.list');
		
		$list.find('.thumb').click(function(){
			$list.find('.thumb').removeClass('active');
			$(this).addClass('active');
			var imgSrc = $(this).find('img').data('largeSrc');
			$mainImg.attr('src', imgSrc);
		});
		
		var $table = $('table.table-offers');
    
	    $table.find('th.sortable')
        .wrapInner('<span title="sort this column"/>')
        .each(function(){
            
            var th = $(this),
                thIndex = th.index(),
                inverse = false;
            
            th.click(function(){
                
                $table.find('th.sortable').removeClass('sorted-asc');
                $table.find('th.sortable').removeClass('sorted-desc');
                $table.find('th.sortable i').replaceWith('<i class="fas fa-sort"></i>');
                
                
                if(inverse){
               	 	th.addClass('sorted-desc');  
               	 	th.find('i').replaceWith('<i class="fas fa-sort-up"></i>');             	
                }else{
                	th.addClass('sorted-asc');                	
               	 	th.find('i').replaceWith('<i class="fas fa-sort-down"></i>');  
                }
                
                $table.find('td').filter(function(){
                    
                    return $(this).index() === thIndex;
                    
                }).sortElements(function(a, b){
                    
                    return $([a]).data('value') > $([b]).data('value') ?
                        inverse ? -1 : 1
                        : inverse ? 1 : -1;
                    
                }, function(){
                    
                    return this.parentNode; 
                    
                });
                
                inverse = !inverse;
                    
            });
                
        });		
		
		
		$('.show-all-offers').click(function(){
			
			$('html,body').animate({
				scrollTop: $('.section-strain-offers').offset().top-90
			}, 500, function(){
				
			})
			
		});
		
			
		$('.scroll-to-alternative').click(function(){
			
			$('html,body').animate({
				scrollTop: $('.section-strain-related').offset().top-90
			}, 500, function(){
				
			})
			
		});
		
	},
	pageSeedReviews: function(){
		
		$('.popup-close').click(function(){
			var $this = $(this);
			$this.closest('.popup').removeClass('open');
			setTimeout(function(){
				$('body').removeClass('no-scroll');
				$this.closest('.popup').removeClass('animate');				
			}, 5);
			
		});
		
		$('.btn-add-review').click(function(){
			$('.popup-add-review').addClass('animate');
			setTimeout(function(){
				$('body').addClass('no-scroll');
				$('.popup-add-review').addClass('open');				
			}, 5);
		});
		
		var $reviewForm = $('form[name="review-form"]');
		var starCount = $reviewForm.find('.review .star').length;
		
		$reviewForm.find('.review .star').bind('mouseover', function(){
			var index = $reviewForm.find('.review .star').index(this);
			for(var i=0;i<starCount;i++){
				if(i<=index){
					$reviewForm.find('.review .star:eq('+i+') i').addClass('fas').removeClass('far');
				}else{
					$reviewForm.find('.review .star:eq('+i+') i').addClass('far').removeClass('fas');
				}
			}
		});
		
		$reviewForm.find('.review .star').on('click', function(){
			var starIndex = $reviewForm.find('.review .star').index(this);
			for(var i=0;i<starCount;i++){
				if(i<=starIndex){
					$reviewForm.find('.score .star:eq('+i+') i').addClass('fas').removeClass('far');
				}else{
					$reviewForm.find('.score .star:eq('+i+') i').addClass('far').removeClass('fas');
				}
			}
			$reviewForm.find('input[name="stars"]').val(starIndex+1);
			$reviewForm.find('.review').addClass('voted');		
			$reviewForm.validate().element('[name="stars"]');	
		});
		
		$reviewForm.find('.recommended span').click(function(){
			$(this).closest('.recommended').find('span').removeClass('active');
			$(this).addClass('active');
			$(this).closest('.recommended').find('[name="recommended"]').val($(this).data('value'));
		});
		
		$reviewForm.validate({
			ignore: '',
			rules: {
				stars: {
					required: true
				},
				pros: {
					required: true,
					minlength: 5
				},
				name: {
					required: true
				},
				email: {
					required: true,
					email: true
				},
				place: {
					required: true
				}
			},
			messages: {		
				stars: 'Rate by clicking on the stars',	
				pros: 'Enter your review please',
				name: 'Enter your name please, nickname is fine also!',
				place: 'Where are you from?',
				email: 'Enter your e-mailaddress please'
			},
			errorElement: 'span',
			errorClass: 'form-error',
			invalidHandler: function(event, validator) {
				
			},
			submitHandler: function(){ 				
				$reviewForm.find('.alert').hide();
				$reviewForm.addClass('loading');
				var formData = $reviewForm.serialize();
				SERVICE.ajaxCall('/api/add-strain-review', formData, function(res){
					$reviewForm.removeClass('loading');
					if(res.success == 1){
						$reviewForm.find('.alert-success').show();
						$reviewForm.find('.form-group, .btn').hide();
						$('.btn-add-review').hide();
						setTimeout(function(){
							$('.popup-close').click();
						},2000);
					}else{
						$reviewForm.find('.alert-danger').show();						
					}
				});

			}
		});
		
		$('.usefull .group span').click(function(){
			
			var $usefull = $(this).parent().parent().parent();
			
			$usefull.find('.group span').hide();
			$usefull.find('.group').css('border','0px').append('<span class="spinner"></span>');
			
			var reviewId = $(this).closest('.review').data('reviewId');
			
			if($(this).hasClass('usefull-yes')){
				var usefullStatus = 1;
			}else{
				var usefullStatus = -1;				
			}
			
			SERVICE.ajaxCall('/api/strain-review-usefull', {review_id: reviewId, usefull: usefullStatus }, function(res){
				console.log(res);
				setTimeout(function(){
					$usefull.html('<p>Thanks for your feedback!</p>');						
				},1000);
			});
		});
		
		
	},
	pageContact: function(){
		var $contactForm = $('form[name="contact-form"]');		
					
		$contactForm.validate({
			rules: {			
				name: {
					required: true,
					minlength: 1
				},	
				email: {
					required: true,
					email: true
				},
				message: {
					required: true,
					minlength: 5
				},
			},
			messages: {		
				name: 'Enter your name please',	
				email: {
					required: 'Enter your emailadress please',
					email: 'Enter a valid emailadress please'
				},
				message: 'Could you be a bit more specific?'
			},
			errorElement: 'span',
			errorClass: 'form-error',
			invalidHandler: function(event, validator) {
				
			},
			submitHandler: function(){ 				
				$contactForm.find('.alert').hide();
				$contactForm.addClass('loading');
				var formData = $contactForm.serialize();
				SERVICE.ajaxCall('/api/contact', formData, function(res){
					$contactForm.removeClass('loading');
					if(res.success == 1){
						$contactForm.find('.alert-success').show();
						$contactForm.find('.form-group, .btn').hide();
					}else{
						$contactForm.find('.alert-danger').show();						
					}
				});

			}
		});
	},
	pageSuggest: function(){
		var $contactForm = $('form[name="suggest-form"]');		
					
		$contactForm.validate({
			rules: {			
				name: {
					required: true,
					minlength: 1
				},	
				email: {
					required: true,
					email: true
				},
				strain_name: {
					required: true
				},
			},
			messages: {		
				name: 'Enter your name please',	
				email: {
					required: 'Enter your emailadress please',
					email: 'Enter a valid emailadress please'
				},
				strain_name: 'Enter the name of the strain please'
			},
			errorElement: 'span',
			errorClass: 'form-error',
			invalidHandler: function(event, validator) {
				
			},
			submitHandler: function(){ 				
				$contactForm.find('.alert').hide();
				$contactForm.addClass('loading');
				var formData = $contactForm.serialize();
				SERVICE.ajaxCall('/api/suggest-strain', formData, function(res){
					$contactForm.removeClass('loading');
					if(res.success == 1){
						$contactForm.find('.alert-success').show();
						$contactForm.find('.form-group, .btn').hide();
					}else{
						$contactForm.find('.alert-danger').show();						
					}
				});

			}
		});
	},
	defaults: function(){
		
		$('.side-menu').find('.submenu').click(function(){
			if($(this).hasClass('open')){
				$(this).find('ul').slideUp();
				$(this).removeClass('open');
			}else{
				$(this).find('ul').slideDown();	
				$(this).addClass('open');			
			}
		});
		
		$('.side-menu, .menu-overlay').swipe({
			swipeRight:	function(){
				$('body').removeClass('side-menu-open');
				$('.menu-overlay').fadeOut();
			}
		});
		
		
		$('.menu-toggler, .menu-overlay').click(function(){
			if($('body').hasClass('side-menu-open')){
				$('body').removeClass('side-menu-open');
				$('.menu-overlay').fadeOut();
			}else{				
				$('body').addClass('side-menu-open');
				$('.menu-overlay').fadeIn();
			}
		});
		
		$('.search-toggle, .close-search').click(function(){
			if($('body').hasClass('mobile-search')){
				$('body').removeClass('mobile-search');
			}else{				
				$('body').addClass('mobile-search');
			}
		});
		
		
		$('.site-search').find('input').on('focus', function(){
			$(this).closest('.site-search').addClass('focused');
		});
		$('.site-search').find('input').on('blur', function(){
			$(this).closest('.site-search').removeClass('focused');
		});
		
		
		var currentUrlSplit = document.location.pathname.split('/');
		var currentUrl = '';
		for(var i=0;i<currentUrlSplit.length;i++){
			if(currentUrlSplit[i] != '' && isNaN(parseInt(currentUrlSplit[i]))){
				currentUrl = currentUrl+'/'+currentUrlSplit[i];
			} 
		}
		
		$('a[href="'+currentUrl+'"]').addClass('current');
		
		$('.topbar ul.currency li ul li span').click(function(){
			var currency = $(this).data('currency');
			SERVICE.ajaxCall('/api/set-currency', {currency: currency}, function(res){
				if(res.success == 1){
					SERVICE.cookie('currency', currency.toLowerCase());
					location.reload();
				}else{
					console.log('could set currency')						
				}
			});
		});
		
		var $newsletterForm = $('form[name="newsletter-form"]');		
					
		$newsletterForm.validate({
			rules: {
				email: {
					required: true,
					email: true
				}
			},
			messages: {		
				email: {
					required: 'Enter your emailadress please',
					email: 'Enter a valid emailadress please'
				}
			},
			errorElement: 'span',
			errorClass: 'form-error',
			 errorPlacement: function(error, element) {
		        error.insertAfter($(element).parent());
		    },
			invalidHandler: function(event, validator) {
				
			},
			
			submitHandler: function(){ 				
				$newsletterForm.find('.alert').hide();
				$newsletterForm.addClass('loading');
				var formData = $newsletterForm.serialize();
				SERVICE.ajaxCall('/api/newsletter-subscription', formData, function(res){
					$newsletterForm.removeClass('loading');
					if(res.success == 1){
						$newsletterForm.find('.alert-success').show();
						$newsletterForm.find('.input-group, .btn').hide();
					}else{
						$newsletterForm.find('.alert-danger').show();						
					}
				});

			}
		});
		
		
	},
	googleAnalytics: function(){
		
		var gaId = $('.google-analytics').data('gaId');
		
		if(gaId != ''){
			
			$('body').append('<script async src="https://www.googletagmanager.com/gtag/js?id='+gaId+'"></script>');
			window.dataLayer = window.dataLayer || [];
		  	function gtag(){dataLayer.push(arguments);}
		  	gtag('js', new Date());		
		  	gtag('config', gaId);
				
			$('a.track-ml').click(function(e){	
	 			
		 		var trackUrl = $(this).attr('href');
	
				  gtag('event', 'click', {
				  		'event_category' : 'merchant-redirect',
				  		'event_label' : trackUrl,
				   		'transport': 'beacon'
					});
						
		 	});		
			
		}
		

	},
	pageReview: function(){
		
		var $reviewBlock = $('.page-review');
		var starCount = $reviewBlock.find('.review .star').length;
		
		$reviewBlock.find('.review .star').bind('mouseover', function(){
			var index = $reviewBlock.find('.review .star').index(this);
			for(var i=0;i<starCount;i++){
				if(i<=index){
					$reviewBlock.find('.review .star:eq('+i+') i').addClass('fa-star').removeClass('fa-star-o');
				}else{
					$reviewBlock.find('.review .star:eq('+i+') i').addClass('fa-star-o').removeClass('fa-star');
				}
			}
		});
		
		$reviewBlock.find('.stars .review .star').on('click', function(){
			var index = $reviewBlock.find('.review .star').index(this)+1;
			$reviewBlock.find('.review .star').unbind('mouseover');
			$reviewBlock.find('.stars .review .star').unbind('click');
			$reviewBlock.addClass('voted');
			SERVICE.ajaxCall('/api/cast-vote', {stars: index, url: document.location.pathname}, function(res){ 
			});
		});
		
	},
	pageHome: function(){
		
		if($('.countdown-timer').length > 0){
			
			$timer = $('.countdown-timer');
			var timeLeft = $timer.data('timeLeft');
			
			var today = new Date();
			today.setSeconds(today.getSeconds() + timeLeft);
			
			var countDownDate = today.getTime();
			
			var x = setInterval(function() {
			
			  	var now = new Date().getTime();
			
			  	var distance = countDownDate - now;
			
			  	var days = Math.floor(distance / (1000 * 60 * 60 * 24));
			  	var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
			  	var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
			  	var seconds = Math.floor((distance % (1000 * 60)) / 1000);
			  
			  	$timer.html('');
			  	$timer.append('<span class="counter days"><span class="number">'+days+'</span><span class="label">days</span></span>');
			  	$timer.append('<span class="counter hours"><span class="number">'+hours+'</span><span class="label">hours</span></span>');
			  	$timer.append('<span class="counter minutes"><span class="number">'+minutes+'</span><span class="label">minutes</span></span>');
			  	$timer.append('<span class="counter seconds"><span class="number">'+seconds+'</span><span class="label">seconds</span></span>');
			  
			  	if (distance < 0) {
			    	clearInterval(x);
			    	$timer.html('<span class="expired">Deal expired</span>');
			    	$('.get-deal-now').hide();
			  	}
			
			}, 1000);
			
		}
						
	},
	pageFaq: function(){
		
		var $faqItems = $('.faq-items');
		
		$faqItems.find('.faq-item .faq-title').click(function(){
			$faqItems.find('.faq-item').removeClass('open');
			$(this).parent('.faq-item').addClass('open');
			$faqItems.find('.faq-item').find('.desc').slideUp();
			$(this).parent('.faq-item').find('.desc').slideDown();
		});
		
	},
	pagePromo: function(){
		$('textarea.banner-link').on('click, focus', function(){
			$(this).select();
		});
	},
	hello: function(){
		
	},
	init: function(){
		
		var $html = $('html');
					
		APP.scrollIndicator($html);
		$(window).scroll(function(){
			APP.scrollIndicator($html);
		});
		
		APP.defaults();
		APP.bgImagePreloader();		
		APP.siteSearch();
		
		if('ontouchstart' in window){
			$('body').addClass('mobile');
		}
		
		if($html.find('body').attr('id') == 'home'){
			setTimeout(function(){
				APP.pageHome();
			}, 0);
		}
		if($html.find('body').attr('id') == 'seeds'){
			APP.pageSeedsOverview();
		}
		if($html.find('body').attr('id') == 'strain'){
			APP.pageSeedPage();
		}	
		if($html.find('body').attr('id') == 'strain-reviews'){
			APP.pageSeedReviews();
		}	
		if($html.find('body').attr('id') == 'contact'){
			APP.pageContact();
		}	
		if($html.find('body').attr('id') == 'suggest-strain'){
			APP.pageSuggest();
		}	
		if($html.find('body').attr('id') == 'faq'){
			APP.pageFaq();
		}	
		if($html.find('body').attr('id') == 'promo'){
			APP.pagePromo();
		}	
		if($html.find('.google-analytics').length > 0){
			APP.googleAnalytics();
		}
		
	}
};
APP.init();