/**
 * getCurrentCategory
 * @returns String met huidige categorie
 */
function getCurrentCategory() {
	return $("#nav_tabs ul li.current a").attr('class');
}

/**
 * hideAllProducts
 * verberg alle producten
 */
function hideAllProducts() {
	$(".product").hide();
	$("p.no-results").hide();
}

/**
 * showProducts
 * Toon alle producten met de klas uit de param.
 * Als er geen producten zijn, toon een no-results div.
 * 
 * @param productsClass String met JQuery selector voor de producten (dus '.CLASSNAME').
 */
function showProducts( productsClass ) {
	if( $(productsClass).length )
		$(productsClass).show();
	else
		$("p.no-results").show();
}

/**
 * changeNav
 * Zet een class current op de huidige li.
 * 
 * @param href Href van het a-element waar op geklikt is (# is niet per se nodig)
 */
function changeNav( href ) {
	$("#nav_tabs ul li.current").removeClass("current");
	$("#nav_tabs ul li a[class*='" + href + "']").parent("li").addClass( "current" );
}

/**
 * clickTab
 * Na een click op een tabblad voer je de actie uit die bij dat tabblad hoort.
 * 
 * @param hash de Hash die bij de URL is meegegeven (zonder #).
 */
function clickTab( hash ) {
	//Verberg alle producten
	//hideAllProducts();
	
	//Voer de ajax call maar uit.
	getAjaxProducts(hash,1);
	
	//En zet de navigatie op actief.
	changeNav( hash );
}

function refreshGooglePlus() {
	(function() {
		var po = document.createElement('script'); po.type = 'text/javascript'; po.async = 'true';
		po.src = 'https://apis.google.com/js/plusone.js';
		var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
	  })();
}

/**
 * getAjaxProducts
 * haal producten op met Ajax, op basis van hash en page number
 * 
 * @param hash String met type (mogelijke waarden: 'alles','kortingscode','gratis','aanbieding'
 * @param pageNumber Int met pagina nummer
 */
function getAjaxProducts( hash, pageNumber ) {
	$("html, body").scrollTop(0);
	$(".page_navigation").hide();
	
	if($("ul.products.active").length) {
		//Toon loading screen
		showLoading();
	
		$("ul.products.active").hide(1, function() {
		
			$.ajax({
				url		: "?cat=" + hash + "&pg=" + pageNumber,
				method	: 'GET',
				error: function(response) {
					hideLoading();
					//alert('020 error');
				},
				success	: function(response) {
					if( $(response).find("products").text() == "" ) {
						$(".no-results").show();
						hideLoading();
						return false;
					}
					
					//no results melding kan worden verborgen.
					$(".no-results").hide();
					
					//Update the shizzle
					var productsXml = $(response).find("products");
					var pagination = $(response).find("pagination");
					var productsHtml = productsXml.text();
					var paginationHtml = pagination.text();
					
					//Replace the html
					$("ul.products.active").html( $(productsHtml) );
					$(".page_navigation").html( paginationHtml );
					
					//And show the shizzle again.
					$("ul.products.active").show();
					$(".page_navigation").show();
					
					$(".store-extra").find("input[name='cat']").val(hash);
					
					hideLoading();
					
					refreshGooglePlus();
					//$.getScript('https://apis.google.com/js/plusone.js');
					//gapi.plusone.go();
				}
			});
		});
	}
	
	//Tot slot nog even JQuery addressen!
	if( $.address.parameter("cat") != undefined )
		$.address.parameter("cat", hash);
	else
		$.address.parameter("cat", hash, true);

	if( $.address.parameter("pg") != undefined )
		$.address.parameter("pg", pageNumber);
	else
		$.address.parameter("pg", pageNumber, true);
}

/**
 * changePaginationTo
 * verander de paginatie naar het pageNumber in de parameter.
 * 
 * @param pageNumber Integer met het paginanummer.
 */
function changePaginationTo( pageNumber ) {
	var pagination = $(".page_navigation ul.pages li");

	$(pagination).removeClass("current_page");
	
	$(pagination).each(function() {
		if( $(this).find("a").text() == pageNumber )
			$(this).addClass("current_page");
	})		
}

/**
 * isProductPage
 * Laat zien of de huidige pagina een product-pagina is.
 * 
 * @param hash Hash-tag van de product pagina
 * @returns {Boolean} zitten we op een product pagina
 */
function isProductPage( hash ) {
	var bodyId = $("body").attr("id");
	
	if( bodyId == "placeholder-winkelpagina" || bodyId == "producten-nieuw" || bodyId == "zoek-tag-resultaat" )
		return (hash == "alles" || hash == "kortingscode" || hash == "gratis" || hash == "aanbieding");
	
	return false;
}

/**
 * showLoading
 * toon het laad-scherm voor producten en append dat aan de body.
 * Maak het laad-scherm als het nog niet bestaat of toon het als het al wel bestaat.
 */
function showLoading() {
	if( $(".loadingscreen").length ) {
		$(".loadingscreen").show();
	} else {
		var loadingScreen = $('<div class="loadingscreen"></div>')
			.css({
				position           : 'absolute',
				zIndex             : 9999,
				width              : $(".column_two_third").width(),
				height             : $("ul.products").outerHeight(true),
				left               : $("#nav_tabs").offset().left,
				top                : ( $("#nav_tabs").offset().top + $("#nav_tabs").height() ),
				opacity            : 0.8,
				backgroundImage    : 'url(/couponcode/templates/korting.com/images/loading.gif)',
				backgroundRepeat   : 'no-repeat',
				backgroundPosition : 'center 10px',
				backgroundColor    : 'white'
			})
			.prependTo($("body"))
		;
	}
}

/**
 * hideLoading
 * verberg het laad-scherm voor producten en append 
 */
function hideLoading() {
	$(".loadingscreen").hide();
}

/**
 * loadDynamicJs
 * laad een javascript en voeg die via JS toe aan de body :). Voorkomt blocking JS.
 * 
 * @param filename String met de bestandsnaam van het toe te voegen script.
 */
function loadDynamicJs( filename ) {
	 var script = document.createElement("script");
	 script.type = "text/javascript";
	 script.src = filename;
	 document.getElementsByTagName("body")[0].appendChild(script);
}

$(function (){
	$("body").addClass("js_enabled");
	
	//@TODO: what's this for?
	$.expr[':'].external = function(obj){
	    return !obj.href.match(/^mailto\:/) && (obj.hostname != location.hostname);
	};
	
	// Add 'external' CSS class to all external links
	$("a:external:not(#close)").each(function(){
		this.target="_blank";
	});
	
	$("a[rel='external']").attr("target", "_blank");
	
	/*
	 * zoekveld
	 */
	 if(!Modernizr.input.placeholder){
		$("input").each(
			function(){
				if($(this).val()=="" && $(this).attr("placeholder")!=""){
					$(this).val($(this).attr("placeholder"));
					$(this).focus(function(){
						if($(this).val()==$(this).attr("placeholder")) $(this).val("");
					});
					$(this).blur(function(){
						if($(this).val()=="") $(this).val($(this).attr("placeholder"));
					});
				}
		});
	}
	
	/*
	 * newsletter
	 */
	
	if ($(".container_newsletter").length > 0) {
		function validateNewsletter() {
			if ($("#form_newsletter").length) {
				$("#form_newsletter").validate({
					rules: {
						"newsletter_email": {
							"required": true,
							"email": true
						}
					},
					messages: {
						"newsletter_email": {
							"required":"vul een e-mailadres in",
							"email":"dit e-mailadres is ongeldig"
						}
					},
					submitHandler: function(form) {
						$.ajax({
							type: 	"post",
							url:	$(form).attr('action'),
							data:	$(form).serialize(),
							success: function(respond_status) {
								var status;
								if (respond_status == 'subscribed') {
									status = '<p>We hebben je een e-mail gestuurd, waarmee je de inschrijving moet bevestigen.</p>';
								}
								else if (respond_status == 'unsubscribed') {
									status = '<p>Je bent uitgeschreven voor onze nieuwsbrief. Je ontvangt hierover een e-mail ter bevestiging.</p>';
								}
								else if (respond_status == 'not_found') {
									status = '<p>Het ingevoerde e-mailadres is niet gevonden.</p>';
								}
								else if (respond_status == 'already_exists') {
									status = '<p>Het ingevoerde e-mailadres bestaat al.</p>';
								}
								
								$(form).siblings('.status').html(status);
								$(form).slideUp();
								
							}
						})
					}
				});
			}
		}
		
		validateNewsletter();
		
		$(".container_newsletter").find("#switch_forms .toggle > a").live("click", function(e) {
			e.preventDefault();
			
			$.get(e.target.href, function(new_form) {
				
				$(".container_newsletter").fadeOut("slow", function() {
					$(".container_newsletter").parent(".block_inner")
						.html(new_form)
						.hide()
						.fadeIn("slow")
					;
					
					var newsletter_container_tmp = $(".container_newsletter");
					
					if (newsletter_container_tmp.attr("id") == "container_newsletter_unsubscribe") {
						newsletter_container_tmp.parents(".block").addClass("newsletter_unsubscribe");
					}
					else {
						newsletter_container_tmp.parents(".block").removeClass("newsletter_unsubscribe");
					}
					
					validateNewsletter();
				});
			});
		});
	}
	
	/*
	 * home
	 */
	if ($("#mycarousel").length) { // ook zoekresultaten
		
		//  WEL IE6
		if ($.browser.msie && $.browser.version=="6.0") {
			
			if ($("#home #mycarousel").length > 0) {
				$('#mycarousel').jcarousel();
			}
			
		}
		// NIET IE 6
		else {
			$('#mycarousel').jcarousel({
				scroll: 5
			});
		}
	}
	
	if ($("#tabs_home").length) {
		$("#tabs_home").tabs().tabs('rotate', 4000);
		
		$('#tabs_home').hover(function(){
			$(this).tabs('rotate', 0, false);
		},function(){
			$(this).tabs().tabs('rotate', 4000);
		});
	}
	
	/*
	 * winkels az
	 */
	if ($("#nav_az").length) {
		
		/*
		m3Columnize(
			$(".section ul"), 3
		);
		*/
		
		m3SmoothScroll($("#nav_az a"), 800);
		m3SmoothScroll($(".section .heading a"), 400);
	}
	
	/*
	 * winkels categorieen
	 */
	if ($("#nav_categories").length) {
		
		m3Columnize(
			$("#nav_categories ul"), 2
		);
		
		/*
		m3Columnize(
			$(".section ul"), 3
		);
		*/
		
		m3SmoothScroll($("#nav_categories a"), 800);
		m3SmoothScroll($(".section .heading a"), 400);
	}
	
	/*
	 * winkel : instruction video in lightbox
	 */
	if ($("#store_instruction").length) {
		$("#store_instruction a").colorbox({
			iframe: true,
			width: 650,
			height: 550
		});
	}
	
	
	var action_blocks = $(".block_action");
	
	if (action_blocks.length > 0) {
		action_blocks.each(function() {
			$(this).click(function(e) {
				e.preventDefault();
				
				window.open(
					$(this).find("h4 a").attr("href")
				);
			});
		});
	}
	
	var product_daily_offer = $("#container_product .product.product_daily_offer");
	
	if (product_daily_offer.length > 0) {
		product_daily_offer.find(".logo_holder a").colorbox();
	}
	
	/*
	 * Tabs op winkel-, tags- en zoekenpagina
	 */
	//Haal Hash op
	var hash = $.address.parameter("cat");
	var isClicked = false;
	
	$("#nav_tabs:not(.no-ajax) ul li a").click(function(e) {
		var action = $(this).attr('class');
		
		e.preventDefault();
		clickTab( action );
		isClicked = true;
	});
	
	if( !isClicked && isProductPage( hash ) ) {
		$.address.externalChange(function(fn) {
			//We zitten op Product pagina
			clickTab( fn.parameters.cat );
		});
	}
	
	/*
	$("#nav_tabs ul li a").each(function() {
		var href = $(this).attr('href');
		var action = href.split("#")[1];
		
		if( isProductPage( action ) ) {
			if( $(this).parent("li").hasClass("current") ) {
				//Zorg dat klikken op een actief tabblad niet mogelijk is.
				$(this).live("click", function(e) {
					e.preventDefault();
				});
			}
			
			$(this).click(function(e) {
				e.preventDefault();
				clickTab( action );
			});
		} else {
			if( $(this).parent("li").hasClass("current") ) {
				$(this).click(function(e) {
					e.preventDefault();
				});
			}
		}
	});
	*/
	
	/*
	 * AJAX calls product pagina's
	 */
	if( $(".product-pagination").length ) {
		$("ul.pages li a").live("click",function(e) {
			e.preventDefault();
			
			if( $(this).attr('class') == "current_page" )
				return false;
			
			var href = $(this).attr('href');
			var split = href.split("/");
			var pageNumber = split[split.length-1];
			var currentCategory = getCurrentCategory();

			getAjaxProducts( currentCategory, pageNumber );
		});
	}
	
	/*
	 * create a text selection:
	 *
	 * example: $('#elem').selectRange(3,5); 
	 */
	$.fn.selectRange = function(start, end) {
		return this.each(function() {
			if (this.setSelectionRange) {
				this.focus();
				this.setSelectionRange(start, end);
			} else if (this.createTextRange) {
				var range = this.createTextRange();
				range.collapse(true);
				range.moveEnd('character', end);
				range.moveStart('character', start);
				range.select();
			}
        });
	};
	
	$("#canvas #search_keyword").autocomplete("/auto_suggest", {
		multiple: true,
		minChars: 3,
		selectFirst: false,
		dataType: "json",
		width: $("#search_keyword").outerWidth(),
		formatItem: function(row, i, max) {
			var product_row = "";
			product_row += "<div class=\"logo_holder small product_" + row.category + "\">";
			product_row += "<img src='"+ row.supplier.logo  +"' />";
			product_row += "</div	>";
			product_row +=  row.product_title;
			
			return product_row;
		},
		formatMatch: function(row, i, max) {
			return row.product_title
		},
		formatResult: function(row) {
		},
		parse: function(data) {
			return $.map(data, function(row) {
				return {
					data: row,
					value: row.product_title,
					result: row.product_title
				}
			});
		}
	}).result(function(e, item) {
		window.location.href = item.href;
	});
	
	
	/*
	 * contact
	 */
	 
	if ($("#form_contact").length) {
		
		jQuery.validator.addMethod("exactlength", function(value, element, param) {
			return this.optional(element) || value.length == param;
		}, jQuery.format("Please enter exactly {0} characters."));


		$("#form_contact").validate({
			rules: {
				naam: {
					"required": true
				},
				email: {
					"required": true,
					"email": true
				},
				verificatiecode: {
					"required": true,
					"exactlength" : 5
				}
			},
			messages: {
				naam: {
					"required":"vul je naam in"
				},
				email: {
					"required":"vul het e-mailadres in",
					"email":"het ingevulde e-mailadres is ongeldig"
				},
				verificatiecode: {
					"required":"type de code uit de afbeelding over",
					"exactlength" : 'de code moet uit 5 tekens bestaan'
				}
			}
		});
	}
	
	//Cufon replacement.
	//Cufon.replace('#canvas h1');
	
	/*
	 * Store page
	 */
	$('.store_description_inner').expander({
    	slicePoint: 150,
    	expandText: "lees meer",
    	userCollapseText: "klap in"
    });
    
    /**
    *	PRODUCT
    */
    $(".product_code").not(".clicked").find(".code_layer").qtip({
    	position: {
    		corner: {
	    		tooltip: "topMiddle",
	    		target: "bottomMiddle"
	    	}
	    },
    	style: {
    		tip: true,
    		name: "green"
    	}
    });
	
	/*
	 * Load more
	 */
	 
	 if ($('.loadmore').length) {
	 	
		var loadmore		= $('.loadmore'),
	 		loadmoreForm	= loadmore.find('form'),
	 		loadmoreButton   = loadmoreForm.find('input[type="submit"]'),
	 		nextPageField	= loadmoreForm.find('input[name="pg"]'),
			catField = loadmoreForm.find('input[name="cat"]')
	 	;
		
		function disableLoadMore() {
			loadmoreButton.attr("disabled", "disabled").addClass('disabled');
		}
		
		function enableLoadMore() {
			loadmoreButton.removeAttr("disabled").removeClass('disabled');
		}
		
		if (loadmoreForm.attr('action') == "") {
			disableLoadMore();
		}
		
		enableLoadMore();
		
		loadmoreForm.submit(function(e) {
			
			e.preventDefault();
			
			disableLoadMore();
			
			loadmore.addClass("loading");
				
			$.ajax({
				url		: $(e.target).attr('action') + '?pg=' + nextPageField.val() + '&cat=' + catField.val(),
				method	: 'GET',
				error  : function() {
					loadmore.removeClass("loading");
				},
				success	: function(response) {
					
					if( $(response).find("products").text().length && $(response).find("products").text() != '' ) {
						var productsXml = $(response).find("products");
						var productsHtml = productsXml.text();
						
						$(productsHtml).appendTo( $('ul.products.active') );
						
						if (productsXml.attr("next_page") !== '') {
							nextPageField.val(productsXml.attr("next_page"));
							enableLoadMore();
						}
						else {
							disableLoadMore();
						}
						
						refreshGooglePlus();
					}
					
					loadmore.removeClass("loading");
					
				}
			});
		});
	}

	/*
	 * when the user wants to share this product, toggle the share
	 * content that contains the 'tell a friend' form and the share
	 * widgets fior several sites.
	 */
	 
	 $(".product .share p.label a").live("click",function(e) {
		//m3Log("-- share");
		e.preventDefault();

		var label         = this;
		var product       = $(this).parents(".product");
		var share_content = $(product).find(".share_content");
		var share_email   = $(product).find(".share_email");
		var share_uri     = $(this).children("a").attr("href");
		
		// display the share content
		if (!$(label).hasClass("expanded")) {
			$(label).addClass("expanded");
			
			$(share_content).slideDown("normal");
					
			var share_form = $(share_email).find("form");
			
			/*
			 * preview function
			 */
			$(product).find(".preview_holder a").colorbox({
				width: "50%"
			});

			$(share_form).attr("action", share_uri);
			
			$(share_form).validate({
				rules: {
					"receiver[name]" : {
						required: true
					},
					"receiver[email]" : {
						required: true,
						email: true
					},
					"sender[name]" : {
						required: true
					},
					"sender[email]" : {
						required: true,
						email: true
					},
					"message" : {
						required: true
					},
					"verificatiecode" : {
						required: true,
						minlength: 5
					}
				},
				messages: {
					"receiver[name]" : {
						required: "vul een naam in"
					},
					"receiver[email]" : {
						required: "vul een e-mailadres in",
						email: "dit e-mailadres is ongeldig"
					},
					"sender[name]" : {
						required: "vul je naam in"
					},
					"sender[email]" : {
						required: "vul je e-mailadres in",
						email: "dit e-mailadres is ongeldig"
					},
					"message" : {
						required: "vul een bericht in"
					},
					"verificatiecode" : {
						required: "verificatiecode bestaat uit 5 tekens"
					}
					
				},
				submitHandler: function(form) {
					$.ajax({
						type: 	"post",
						url:	$(form).attr('action'),
						data:	$(form).serialize(),
						success: function(data) {
							if (data == 'sent') {
								$(form).siblings('.status').html('<p>Deze actie is doorgestuurd.</p>');
								$(form).slideUp();
							}
						}
					})
				}
			});
		}
		// hide the share content
		else {
			$(label).removeClass("expanded");
			$(share_content).slideUp("normal");
		}
	});
});

/*
String.prototype.capitalize = function(){ //v1.0
    return this.replace(/\w+/g, function(a){
        return a.charAt(0).toUpperCase() + a.substr(1).toLowerCase();
    });
}; 
*/
