var App; if (!App) App = {};
var Init; if (!Init) Init = {};
var Options; if (!Options) Options = {};


App = {
	
	'ie' : false,
	'ieVersion' : 0,
	'ie6' : false,
	'ie7' : false,
	'ie8' : false,
	'lang' : 'fr',

	'init' : function() {
		
		App.detectIE();
		
		$(document).pngFix();
		
		$("input.hint, textarea.hint").hint();
		
		Init.Datepicker("input.datepicker");
		
		Init.Carousel("#carousel",{
			'slide' : 'img'
		});
		
		Init.Contact("#contactForm");
		
		$(".ratingForm").stars({
			oneVoteOnly: false,
			callback: function(ui, type, rating) {
				$(ui.element).children("input[name=rating]").val(rating);
			}
		});
		
		Init.Newsletter("#newsletter");
		
		$('.photos a').lightBox({
			imageBtnPrev:'/statics/img/lightbox-btn-prev_'+App.lang+'.gif',
			imageBtnNext:'/statics/img/lightbox-btn-next_'+App.lang+'.gif',
			imageBtnClose:'/statics/img/lightbox-btn-close_'+App.lang+'.gif',
			txtOf: ((App.lang == "en") ? 'of':'de')
		});
		
		$("h2.expander a.expand").click(function(e) {
			e.preventDefault();
			if(!$(this).is(".inactive")) {
				var panel = $(this).parent().next(".panel");
				if(panel.is(":visible")) {
					panel.slideUp("fast");
					$(this).find("img").attr("src","/statics/img/more.gif");
				} else {
					panel.slideDown("fast");
					$(this).find("img").attr("src","/statics/img/less.gif");
				}
			}
		});
		
		$("a.more").click(function(e) {
			e.preventDefault();
			if($(this).parents(".rating-text").find("div.content").length) {
				if(!$(this).parents(".rating-text").find("div.content").is(":visible")) {
					$(this).text((App.lang == "en") ? "Less details":"Moins de détails");
				} else {
					$(this).text((App.lang == "en") ? "More details":"Plus de détails");
				}
				$(this).parents(".rating-text").find("div.content").slideToggle();
			}
		});
		
		Init.WineField("#ratingAdd");
		
	},
	
	'Event' : function(cat,action,label) {
	
		try {
		
			if(pageTracker) { pageTracker._trackEvent(cat, action, label); }
			if(pageTracker2) { pageTracker2._trackEvent(cat, action, label); }
			
		} catch(err) {}
	},
	
	'detectIE' : function() {
		if ($.browser.msie) {
			App.ie = true;
			App.ieVersion = parseInt($.browser.version.substr(0,1));
			if(App.ieVersion == 6) { App.ie6 = true; }
			if(App.ieVersion == 7) { App.ie7 = true; }
			if(App.ieVersion == 8) { App.ie8 = true; }
		}
	}
	
};


/*********************************************
*
* Common options
*
**********************************************/

Options = {

	"datepicker" : {
		buttonImageOnly: true,
		buttonImage: "/statics/icons/date.png",
		showOn: "both",
		dateFormat: 'yy-mm-dd',
		changeYear: true,
		changeMonth: true,
		showOtherMonths: true,
		yearRange: '-3:+50',
		dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
		dayNamesMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],
		dayNamesShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
		monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
		monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Juin','Juil','Aoû','Sep','Oct','Nov','Déc'],
		appendText: "(AAAA-MM-JJ)"
	}

};

/*********************************************
*
* Templates
*
**********************************************/

Templates = {

	"render" : function(text,values) {
		var re_cache = {};
		var tmpl = text.replace(/%7B/ig,'{').replace(/%7D/ig,'}');
		$.each(values, function(k,v) {
			tmpl = tmpl.replace( new RegExp('{'+k+'}', 'gm'), v );	
		});
		
		return tmpl;

	}
};

/*********************************************
*
* Quick Init
*
**********************************************/

Init.Datepicker = function(selector,_opts) {
	var $el = jQuery(selector);
	if(!$el.length) { return; }
	
	// Options
	_opts = jQuery.extend(Options.datepicker, _opts);

	$el.datepicker(_opts);
};

Init.WineField = function(selector) {

	var $el = jQuery(selector);
	if(!$el.length) { return; }
	
	new Init.ItemField($el.find("div.wineField"),{
		'listClass' : '',
		'selectedClass' : 'wine',
		'inputName' : 'wid',
		'inputKey' : 'wid',
		'url' : '/'+App.lang+'/wines/all.json',
		'label' : function(data) { return data.name_fr; }
		
	});
	
};


//Initialise un champ de sélection d'un item
Init.ItemField = function(selector,_opts) {

	if(!$(selector).length) { return; }
	var $el = $(selector);
	
	// Options
	_opts = jQuery.extend({
		'onSelect' : function() { },
		'onRemove' : function() { },
		'listClass' : 'items',
		'selectedClass' : 'item',
		'inputName' : 'iid',
		'inputKey' : 'iid',
		'url' : '/admin/items.json',
		'paramName' : 'autocomplete',
		'label' : function(data) { return (data.name) ? data.name:"Item"; }
	}, _opts);
	
	//Initialise le champ de recherche
	new Autocomplete($el.find("input.search"),{
		"url" : _opts.url,
		"paramName" : _opts.paramName,
		"method" : "GET",
		"waitDelay" : 100,
		"minChars" : 2,
		"format" : "json",
		"onLoading" : function() {
			$el.find(".results .spinner").remove();
			if(!$el.find(".results ul").length || $el.find(".results ul li.noresult").length) {
				$el.find(".results").show().html("<div align='center' class='spinner'><img src='/statics/img/loading_block.gif' /></div>");
			} else {
				$el.find(".results ul").after("<div align='center' class='spinner'><img src='/statics/img/loading_block.gif' /></div>");
			}
		},
		"onEmpty" : function() {
			$el.find(".results").html("").hide();
		},
		"onLoad" : function(data) {
			$el.find(".results").show().html("<ul class='list "+_opts.listClass+"'></ul>");
			if(data.length) {
				if(jQuery.trim($(this).val()).length) {
					data = data.slice(0,15);
					$(data).each(function() {
						var item = '<input type="hidden" name="'+_opts.inputName+'" value="'+this[_opts.inputKey]+'" />';
						item += '<input type="hidden" class="data" value="'+escape($.toJSON(this))+'" />';
						item += "<span class='"+_opts.selectedClass+"'>"+_opts.label(this)+"</span>";
						$el.find(".results ul").append("<li>"+item+"</li>");
					});
					$el.find(".results ul li").click(function(e) {
						var data = $.evalJSON(unescape($(this).find("input.data").val()));
						
						_opts.onSelect.call($el,$(this),data);
						
						$el.find(".selected").html($(this).html()+" - <a href='#' class='rem'>X</a>");
						$el.find("input.search").hide();
						$el.find(".selected a.rem").click(function(e) {
							e.preventDefault();
							
							_opts.onRemove.call($el,$(this));
							
							$(this).parent().html("");
							$el.find("input.search").show();
						});
						
						$el.find(".results").html("").hide();
						$el.find("input.search").val($el.find("input.search").attr("title")).addClass("hasHint");
					});
				} else {
					$el.find(".results").html("").hide();
				}
			} else {
				$el.find(".results ul").append("<li class='noresult'>Aucun résultat</li>");
			}
		}
	});
	
	//Initialise le bouton supprimer du lieu sélectionné
	$el.find(".selected a.rem").click(function(e) {
		e.preventDefault();
		
		_opts.onRemove.call($el,$(this));
		
		$(this).parent().html("<input type='hidden' name='"+_opts.inputName+"' value='0' />");
		$el.find(".top").show();
	});
	
	if(parseInt($el.find(".selected input[name="+_opts.inputName+"]").val()) > 0) {
		$el.find(".top").hide();
	}

};


Init.Newsletter = function(selector,options) {

	var $el = jQuery(selector);
	if(!$el.length) { return; }
	
	var $form = $el.find("form");
	
	$form.submit(function(e) {
		e.preventDefault();
		$form.find("div.error, div.success").remove();
		
		var params = $form.serialize();
		var email = $form.find("input[name=email]").val();
		
		$form.find("input[name=email]").val((App.lang == "fr") ? "Chargement...":"Loading...").addClass("hasHint").attr("disabled","disabled");
		
		$.post("/"+App.lang+"/contact/newsletter.json",params,function(data) {
			
			$form.find("input[name=email]").val(email).removeClass("hasHint").attr("disabled","");
			
			if(!data.error && data.success) {
				
				App.Event('Newsletter','Add',email);
				
				$form.append("<div class='success'>"+data.msg+"</div>");
				$form.find("input[name=email]").val($form.find("input[name=email]").attr("title")).addClass("hasHint");
				
			} else {
				
				$form.append("<div class='error'>"+data.error+"</div>");
				
				if(!$form.find("input[name=email]").val().length) {
					$form.find("input[name=email]").val($form.find("input[name=email]").attr("title")).addClass("hasHint");
				}
				
			}
			
		},"json");
		
	});
	
}


Init.Carousel = function(selector,options) {

	var $el = jQuery(selector);
	if(!$el.length) { return; }
	
	//Paramètres par défauts
	var settings = jQuery.extend({
		slide: ".slide", //Défini une slide
		delay: 3000, //Délai entre chaque slide
		speed: 1000, //Vitesse du fade
		index: 0, //Début de l'animation
		random: true //Débute l'animation sur une slide aléatoire
	}, options);

	
	//Variables privées
	var timeout = null;
	var slides = [];
	var currentIndex = settings.index;
	var nextIndex = 0;
	var $slides = jQuery("<div class='slides' style='display:none;'></div>");
	
	
	function init() {
		
		//Construction du conteneur de slide
		$el.prepend($slides)
		$slides.css({"width":$el.width()+"px","height":$el.height()+"px","position":"relative","top":"0px","left":"0px"});
		
		//Stockage des slides dans une array javascript
		$el.find(settings.slide).each(function() {
			var slide = $(this).clone();
			slide.css({"position":"relative","margin":"0"});
			slides.push(slide);
			$(this).remove();
		});
		
		//Défini la première image aléatoirement et la suivante
		if(settings.random) { currentIndex = (Math.floor(Math.random()*slides.length)); }
		nextIndex = ((slides.length-1) == currentIndex) ? 0:currentIndex+1;
		
		//Ajoute la première slide et la suivante (en dessous)
		$slides.append(slides[currentIndex].clone().css({"zIndex":"21","position":"absolute","left":"0"}));
		$slides.append(slides[nextIndex].clone().css({"zIndex":"20","position":"absolute","left":"0"}));
		$slides.show();
		
		//Démarre la routine
		timeout = window.setTimeout(nextSlide,settings.delay);
	}
	
	function nextSlide() {
		
		//Fade out la slide du dessus
		$slides.find(settings.slide).eq(0).fadeOut(settings.speed,function() {
		
			//Enlève la slide du dessus
			$(this).remove();
			
			//Défini la slide du dessous comme nouvelle slide du dessus
			$slides.find(settings.slide).eq(0).css({"zIndex":"21","position":"absolute","left":"0"});
			
			//Défini la slide en cours et la suivante(à ajouter)
			currentIndex = ((slides.length-1) == currentIndex) ? 0:currentIndex+1;
			nextIndex = ((slides.length-1) == currentIndex) ? 0:currentIndex+1;
			
			//Ajoute la slide suivante(en dessous)
			$slides.append(slides[nextIndex].clone().css({"zIndex":"20","position":"absolute","left":"0"}));
			
			//Continue la routine
			timeout = window.setTimeout(nextSlide,settings.delay);
		});
		
	}
	
	init();

};

Init.Contact = function(selector) {
	
	var el = $(selector);
	if(!el.length) { return; }
	
	el.find("form").submit(function(e) {
		e.preventDefault();
		var form = $(this);
		el.find("div.success").remove();
		el.find("div.error").remove();
		if(form.validate()) {
			form.block(Options.block_contact);
			$.post("/"+App.lang+"/contact.json",form.serialize(),function(data) {
				form.unblock();
				if(!data.error && data.success) {
				
					App.Event('Contact','Send',form.find("input[name=name]").val());
				
					el.find("form").before("<div class='success' style='cursor:pointer;'>"+((App.lang == "fr") ? "Votre message a été envoyé":"Your message is sent")+"</div>");
					el.find(".success").click(function() { el.find(".success").remove(); });
					form.find("textarea[name=message]").val("");
					form.find("input[type=text]").each(function() {
						$(this).val($(this).attr("title")).addClass("hasHint");
					});
					
				} else {
					el.find("form").before("<div class='error'>"+data.error+"</div>");
				}
			},"json");
		}
	});

};


