// Plugins Big Youth

(function($){
	
	// Console Dev
	window.dev = new function() {

		var hasConsole;

		if (typeof console != 'undefined')
			hasConsole = false;
		else
			hasConsole = false;

		this.info 	= function(o) {hasConsole ? console.info(o) : false;}
		this.log 	= function(o) {hasConsole ? console.log(o) : false;}
		this.error 	= function(o) {hasConsole ? console.error(o) : false;}
	};

	// byFilter
	$.fn.byFilter = function(params) {

		var filter = false,
			slide = false,
			collection,
			page = 0,
			root = this;

		init = function() {
			params = $.extend({
				url: null, // URL ajax du loader
				levels: 2, // Nombre de niveaux de navigation (2 ou 3)
				items: 4 // Nombre d'éléments à remplacer
			}, params);
		}
		init();

		/**
		 * OBJECTS DECLARATIONS
		 */

		var Item = function(el, data) {

			this.el = el;
			this.data = data;

			this.init = function () {
				if (typeof el == 'undefined' || el == null)
					this.el = $('<li class="even"></li>')

				if (typeof data == 'undefined') {
					this.data = {
						title: this.el.find('h3 a:first').val(),
						img: this.el.find('img:first').attr('src'),
						isPlayable: false // @todo: à revoir
					}
				}
			}

			this.render = function() {
				
				var img = '<div class="'+ (data.isPlayable ? 'videos' : 'photos') +'-link"><a href="'+ data.link +'" class="">'+ (data.isPlayable ? '<span class="btn-lecture">Lire</span>' : '') +'<img src="'+ data.img +'" alt=""></a></div>',
					title = '<a href="'+ data.link +'" class=""><h3>'+ data.title +'</h3></a>',
					description = typeof data.description != 'undefined' ? '<p>'+ data.description +'</p>' : '';

				this.el.text('') // Nettoie l'élément

				if (params.levels > 2) {
					this.el.append(img+title+description);
				} else {
					this.el.append(title+img);
				}
				
				return this.el;				
			}

			this.init();
		}

		var ItemCollection = function(el) {
			var items = [],
				that = this;

			this.init = function() {
				this.el = el;
				this.el.find('li').each(function(){
					items.push(new Item($(this)))
				});
			}

			this.update = function(data) {
				items = [];
				for (i=0; i<data.length; i++)
				{
					items.push(new Item($('<li class="'+ (i%2 == 0 ? 'even' : 'row') +'"></li>'),data[i]));	
				}
				return this;
			}

			this.renew = function(keepPagination) {
				var content = this.el, newContent = $('<div></div>'),
					pagEl = $this.find('.librairie-nav:first'),
					pagination;

				keepPagination = keepPagination || false;

				for (i=0;i<items.length;i++)
					newContent.append(items[i].render());
									
				// Animate
				this.state('hiding',function(){
					content.html(newContent.html());
					that.state('displaying');
				});

				// Pagination
				if (keepPagination === false) {
					page = 0;
					if (pagEl.length > 0)
						pagination = new Pagination(pagEl);
				}
			}

			this.state = function(state,c) {
				if (typeof c !== 'function')
					c = function(){};

				switch (state) {
					case 'loading':
						this.el.stop().animate({opacity: 0.5},200,c);
						break;
					case 'hiding':
						this.el.stop().animate({opacity: 0.1},200,c);
						break;
					case 'displaying':
					default:
						this.el.stop().animate({opacity: 1},200,c);
						break;
				}
			}

			this.init();
		}

		var Filter = function(el) {

			var self = this;
			
			this.init = function() {
				this.el = el;
				this.filter = this.el.find('li a.active').attr('data-filter');
				this.update();

				this.el.find('li a').bind('click',function(e){
					e.preventDefault();
					self.change($(this).attr('data-filter'));
				});
			}

			this.change = function(dataFilter) {
				this.el.find('li.active, li.active a').removeClass('active'); // @todo: Ne pas supprimer si le data-filter == au dataFilter
				this.el.find('li a[data-filter='+ dataFilter +']').addClass('active').parent().addClass('active');
				this.filter = dataFilter;
				this.update();
			}

			this.update = function() {
				filter = this.filter;
				this.onFilterClick();
			}

			this.onFilterClick = function() {

				collection.state('loading');

				jQuery.ajax({
			 		url: params.url,
			 		type: 'post',
			 		dataType: 'json',
			 		data: {
			 			'slide': slide,
			 			'filter': filter,
			 			'count': params.items
			 		},
			 		success: function(data) {
			 			collection.update(data).renew();
			 		},
			 		error: function(error) {
			 			dev.error(error.responseText);
			 		}
			 	})
			}
			this.init();

		}

		// <a> element
		var MenuItem = function(el) {
			
			var self = this,
				active = false;

			this.init = function() {

				this.el = el;

				if (this.el.hasClass('active')) {
					active = true;
					slide = this.el.attr('data-id');
				}

				this.el.bind('click',function(e){
					e.preventDefault();
					self.el.parents('ul').eq(0).find('li a').removeClass('active');
					self.toggle(true);
					
					self.onMenuItemClick();
				})
			}

			this.toggle = function(active) {
				if (typeof active == 'undefined')
					active = !active;
				if (active) {
					this.el.addClass('active');
					slide = this.el.attr('data-id');
				}
				else
					this.el.removeClass('active');
			}

			this.onMenuItemClick = function() {

				collection.state('loading');

			 	jQuery.ajax({
			 		url: params.url,
			 		type: 'post',
			 		dataType: 'json',
			 		data: {
			 			'slide': slide,
			 			'filter': filter,
			 			'count': params.items
			 		},
			 		success: function(data) {
			 			collection.update(data).renew();
			 		},
			 		error: function(error) {
			 			dev.error(error.responseText);
			 		}
			 	})

			 }

			this.init();
		}

		var Pagination = function(el) {
			
			var self = this,
				current = 0;

			this.init = function() {

				el.find('li a').each(function(){
					if ($(this).hasClass('prev')) {
						$(this).unbind('click');
						$(this).bind('click',function(e){
							e.preventDefault();
							self.prev();
						})	
					} else if ($(this).hasClass('next')) {
						$(this).unbind('click');
						$(this).bind('click',function(e){
							e.preventDefault();
							self.next();
						})
					}
				});
			}

			this.prev = function() {
				if (page > 0) {
					page--;
					this.onNavigationClick();
				}
			}

			this.next = function() {
				page++;
				this.onNavigationClick();
			}

			this.onNavigationClick = function() {
				
				collection.state('loading');

				jQuery.ajax({
			 		url: params.url,
			 		type: 'post',
			 		dataType: 'json',
			 		data: {
			 			'slide': slide,
			 			'filter': filter,
			 			'count': params.items,
			 			'page': page
			 		},
			 		success: function(data) {
			 			if (data.length > 0)
			 				collection.update(data).renew(true);
			 			else
			 				collection.state('displaying');
			 		},
			 		error: function(error) {
			 			dev.error(error.responseText);
			 		}
			 	});
			}

			this.init();
		}

		 /**
		  * PLUGIN IMPLEMENTATION
		  */

		this.each(function(){
			
			$this = $(this);

			// Items
			collection = new ItemCollection($(this).find('.collection:first'));

			// Filter
			if (params.levels > 2) {
				new Filter($this.find('.byFilter:first'));
			}

			// Menu
			var nav2 = $this.find('.menu:first');

			// MenuItems
			nav2.find('li a').each(function(){
				new MenuItem($(this));
			});

			return this;
		});
	};

	// Placeholder
	$.fn.byPlaceholder = function() {
		this.each(function(){
			
			var initValue = $(this).val();

			$(this).bind('focus',function(){
				if ($(this).val() == initValue) {
					$(this).val('');
				}
				$(this).bind('focusout',function(){
					if ($(this).val() == '')
						$(this).val(initValue);
				})
			})

			return this;
		});
	};

	// bySlider
	$.fn.bySlider = function(params) {

		var currentSlide = 0,
			navigation = {},
			slides,
			$slider,
			that = this,
			el_prev = $(that).find('.slideshow-nav a.btn.slideshow-prev:first'),
			el_next = $(that).find('.slideshow-nav a.btn.slideshow-next:first');


		var init = function() {
			
			params = $.extend({
				url: '/js/json/slides.php'
			},params);

			$.ajax({
				url: params.url,
				dataType: 'json',
				type: 'GET',
				success: function(data){
					slides = [];
					for(i=0; i<data.length; i++) {
						slides.push(new Slide(data[i]));
					}
				},
				error: function(){
					dev.error(error.responseText());
				}
			});

			$(that).find('.slideshow-nav a.btn').bind('click',function(e){
                
				e.preventDefault();
				if ($(this).hasClass('slideshow-prev')) {
					that.prev();
				} else if ($(this).hasClass('slideshow-next')) {
					that.next();
				}
			})

		};

		init();

		var Slide = function(data) {

			var markup = '<div class="slide" data-id="${id}">'
			    +'<img src="${img}" alt="" />'
			    +'<div class="wrapper">'
			        +'<div id="slideshow-text">'
				        +'<h1><span class="apostrophe"></span>{{html title}}<span class="apostrophefin"></span></h1>'
				        +'<p class="date">{{html time}}</p>'
				        +'<p>{{html description}}</p>'
				        +'<div class="fd-more_link plus">'
				            +'<a href="${link}"><span>Toute l\'actualité </span><span class="more-link">+</span></a>'
				       	+'</div>'
			        +'</div>'
				+'</div>'
		    +'</div>';

			var init = function() {
				$.template('slide',markup);
				this.id = data.id;
				this.img = data.img;
				this.title = data.title;
				this.description = data.description;
				this.link = data.link;
				this.time = data.time;
				this.renderedData = $.tmpl('slide', data);
				el_prev.fadeTo(200,0.3);
			};
			init();

			this.rendered = false;
			this.renderedData = '';

			this.render = function(c) {

				this.renderedData = jQuery.tmpl('slide', this);
				this.rendered = true;

				if (typeof c === 'function')
					c(this.renderedData);

				return this.renderedData;
			}
		}

		// ATTENTION ! Code Charette !!!!!

		this.next = function() {
			
			// On teste si il y a une slide suivante
			if (typeof slides[currentSlide+1] == 'object') {
				// Si la slide n'a pas déjà été générée
				if ( ! slides[currentSlide+1].rendered) {
					slides[currentSlide+1].render(function(html){
						$('.slide[data-id='+ (currentSlide) +']').after(html);
					})
				}
				$slider.find('.slideshow-wrapper').animate({left: '-=1400'},500,'easeInOutQuart');
			} else {
				dev.error("No more slides");
				return;
			}

			currentSlide++;

			if (currentSlide+1 === slides.length) {
				el_next.fadeTo(200,0.3); // Sale !
			}
			if (currentSlide+1 > 1) {
				el_prev.fadeTo(200,1); // Sale !
			}
		}

		this.prev = function() {
			
			if (currentSlide == 0) {
				dev.error('No more slides');
				return;
			}
			$slider.find('.slideshow-wrapper').animate({left: '+=1400'},500,'easeInOutQuart');
			currentSlide--;

			if (currentSlide+1 === 1) {
				el_prev.fadeTo(200,0.3); // Sale !
			}
			if (currentSlide+1 < slides.length) {
				el_next.fadeTo(200,1); // Sale !
			}

		}

		this.each(function(){
			
			$slider = $(this);

			$(this).find('.slide:first').attr('data-id',currentSlide); // Ajoute le data-id

		});

		return this;
	};

	// byTeamLoader
	$.fn.byTeamLoader = function(params) {
		
		var that = this,
			detailContainer = $('#equipe-membre'),
			galleryContainer = $('#equipe-gallery'),
			navigation;

		var sendRequest = function(page) {

			var page = page || 0;

			$.ajax({
				type: 'POST',
				dataType: 'JSON',
				url: params.url,
				data: {
					page: page
				},
				success: function(data) {

					if (typeof data.team !== 'undefined') {

						$images = galleryContainer.find('li.membre img');

						for (i in data.team) {
							new TeamMember(data.team[i],$images.eq(i));
						}
					}
				},
				error: function(error) {
					dev.error(error.responseText);
				}
			});
		}

		var init = function() {
			params = $.extend({
				url: '/js/json/team.php'
			},params);
			sendRequest();
		}; init();

		var Navigation = function() {
			this.current = 0;
			this.next = function() {
				this.current += 1;
				sendRequest(this.current);
			};
			this.prev = function() {
				this.current -= 1;
				sendRequest(this.current);
			};
		}

		var TeamMember = function(data,el) {

			var self = this;

			this.el = el;
			this.name = data.name;
			this.poste = data.poste;
			this.description = data.description;
			this.imageSmall = data.imageSmall;
			this.imageTall = data.imageTall;
// DBT AJOUT SPY
			this.imageDetail = data.imageDetail;
// FIN AJOUT SPY
			this.facebook = data.facebook;
			this.twitter = data.twitter;
			this.plus = data.plus;

			var init = function() {
				self.el.unbind('click');
				self.el.bind('click',function(){
					showDetails();
				});

				el.fadeTo(200,0.1,function(){
					el.attr('src',self.imageSmall).fadeTo(200,1);
				})

			}; init();

			var showDetails = function() {

				self.newDetailContainer = detailContainer.clone();
				
				// Image
// DBT MODIF SPY
				galleryContainer.find('img:first').attr('src',self.imageTall);
				self.newDetailContainer.find('img:first').attr('src',self.imageDetail);
//				self.newDetailContainer.find('img:first').attr('src',this.imageTall);
// FIN MODIF SPY

				// Texte
				self.newDetailContainer.find('h3:first').text(self.name);
				self.newDetailContainer.find('h4:first').text(self.poste);
				self.newDetailContainer.find('p:first').html(self.description);
				// Liens
				self.newDetailContainer.find('.share-link a').each(function(){
					if ($(this).hasClass('fb')) {
// DBT MODIF SPY
						$(this).html('Suivre<br>'+ self.name +'<br><span>sur Facebook</span>').attr('href',self.facebook);
//						$(this).html('Suivre<br>'+ self.name +'<br><span>Facebook</span>').attr('src',self.facebook);
// FIN MODIF SPY
					} else if ($(this).hasClass('tw')) {
						$(this).html('Suivre<br>'+ self.name +'<br><span>sur Twitter</span>').attr('href',self.twitter);
//						$(this).html('Suivre<br>'+ self.name +'<br><span>Twitter</span>').attr('src',self.twitter);
					} else if ($(this).hasClass('gplus')) {
// DBT MODIF SPY
						$(this).html('Suivre<br>'+ self.name +'<br><span>sur Google+</span>').attr('href',self.plus);
//						$(this).html('Suivre<br>'+ self.name +'<br><span>Google+</span>').attr('src',self.plus);
// FIN MODIF SPY
					}
				});
			
				// Ci-gît un fadeOut disparu au combat
				detailContainer.replaceWith(self.newDetailContainer).stop(true,false).fadeTo(200,1,function(){
					detailContainer = self.newDetailContainer;
					self.newDetailContainer = null;
				});
			}
		}

		this.each(function(){
			
			navigation = new Navigation();

			galleryContainer.find('li.btn a').click(function(e){
				e.preventDefault();
				if ($(this).parent().hasClass('prev')) {
					navigation.prev();
				} else if ($(this).parent().hasClass('next')) {
					navigation.next();
				}
			})

			return this;
		})

	};

	// DON Sentences
	$(function() {
		var sentences = [],
			current = 0;

		var switchSentence = function() {
			if (current === (sentences.length - 1))
				current = 0;
			else
				current++;
		}

		// Find all sentences
		$('#don').find('.first-cols .title-upper').each(function(){
			sentences.push($(this).text());
		});

		// Listener
		$('#don .btn.recharge:first').click(function(e){
			e.preventDefault();
			switchSentence();
			$('#don .first-cols .title-upper:first')
				.fadeOut(200,function(){
					$(this).text(sentences[current])
						.fadeIn(200);
				});
		});
	});

	// DON Prices
	$(function() {
		var don,
			cost;

		var updateValue = function(newVal, updateInput) {
			updateInput = updateInput || true;
			newVal = (typeof newVal === 'number' ? newVal : Number(newVal));

			// Calculer le prix
			don = newVal;
			cost = don - don * 0.66;

			// Mettre à jour le champ
			$('#valeur-entree input:last').val(cost.toFixed(2));

			if (updateInput === true)
				$('#valeur-entree input:first').val(don);

			$('#form-to-send').find('input[name=don]').remove();
			$('#form-to-send').append('<input type="hidden" name="don" value="'+ don +'"/>');
		}

		$('#valeur-btns a.btn-val').click(function(e){
			e.preventDefault();
			var newVal = $(this).text().match(/\d+/i);

			updateValue(newVal,false);

			// Set active
			$(this).addClass('active').parent().siblings().find('a').removeClass('active');
		});

		$('#valeur-entree input:first').live('focus mouseup',function(e){
			if (e.type == 'focusin') {
				this.select();
			}
			if (e.type == 'mouseup') {
				return false;
			}
		});

		$('#valeur-entree input:first').bind('keyup',function(e){

			var caret,
				val = $(this).val();
			
			if (val.match(/\D+/gi)) {
				val = val.replace(/\D+/gi,'');
				$(this).val(val);
			}
			updateValue(val,false);

                        // Alexis, commente car bug sur valuer du don.
			//caret = $(this).val().length > 2 ? $(this).caret().start - 2 : 0;
			//$(this).caret({start: caret, end: caret});

			// Elever les classes actives
			if (val !== '0 €' && val > 0) {
				$('#valeur-btns a.btn-val').removeClass('active');
			} else {
				$('#valeur-btns a.btn-val').eq(3).click();
			}
		})

	});

})(jQuery);


