(function(jQuery) {
	
	/* // ==================================== \\
   || ========== Get url parameter =========== || 
   \\ ======================================= // */
	jQuery.extend({
		getUrlVars: function(url){
			var vars = [], hash;
			var hashes = url.slice(url.indexOf('?') + 1).split('&');
			for(var i = 0; i < hashes.length; i++) {
				hash = hashes[i].split('=');
				vars.push(hash[0]);
				vars[hash[0]] = hash[1];
			}
			return vars;
		},
		getUrlVar: function(name){
		return $.getUrlVars()[name];
		}
	});
	
	var catalogSlider = function() {
		
		/* ========== "CONSTRUCT" ========== */
		var parametres = {controllerUrl : '', isAdvancedSearch : false, isQuerySearch : false, currentUl : {}, currentUlIndex : 0, urlParams : {} }
		
		var buttons = {
			left : {url :'', object : { a : {}, loader:{} }, response : {} },
			right : {url :'',object : { a : {}, loader:{} }, response : {} }
		}
		
		buttons.right.object.a = jQuery('.nav-category').children('a.right');
		buttons.left.object.a = jQuery('.nav-category').children('a.left');
		buttons.right.object.loader = jQuery('.nav-category').children('img.right');
		buttons.left.object.loader = jQuery('.nav-category').children('img.left');
		
		
		/* ========== INITIALISATION DE LA PAGE ========== */
		var init = function() {
		
			buttons.right.object.a.hide();
			buttons.left.object.a.hide();
			
			//we add active class on the ul before load the others ul (just in the first load)
			jQuery('.category-caroussel').children('ul').addClass('active');
		
			if(parametres.isAdvancedSearch) {		
				parametres.urlParams = jQuery.getUrlVars(jQuery(buttons.left.object.a).attr('href'));
				if(parametres.urlParams.firstPage) buttons.left.url = parametres.controllerUrl+location.href.slice(location.href.indexOf('?'))+'&p='+parametres.urlParams.p+'&firstPage='+parametres.urlParams.firstPage;
				else buttons.left.url = parametres.controllerUrl+location.href.slice(location.href.indexOf('?'))+'&p='+parametres.urlParams.p;
				
				parametres.urlParams = jQuery.getUrlVars(jQuery(buttons.right.object.a).attr('href'));
				buttons.right.url = parametres.controllerUrl+location.href.slice(location.href.indexOf('?'))+'&p='+parametres.urlParams.p;
			}
			else {
				var param = jQuery.getUrlVars(jQuery(buttons.left.object.a).attr('href'));
				(param.firstPage) ? buttons.left.url = parametres.controllerUrl + '?p='+param.p+'&firstPage='+param.firstPage : buttons.left.url = parametres.controllerUrl + '?p='+param.p;
				
				var param = jQuery.getUrlVars(jQuery(buttons.right.object.a).attr('href'));
				buttons.right.url = parametres.controllerUrl + '?p='+param.p
			}
			
			_sendRequest();
		}
		
		var _sendRequest = function() {
			jQuery.when(jQuery.ajax(buttons.left.url), jQuery.ajax(buttons.right.url)).done(function(a1,  a2){
				var reqLeft = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */
				var reqRight = a2[2];
	
				if(reqRight.statusText == "success" && reqLeft.statusText == "success") {
					buttons.left.response = jQuery.parseJSON(reqLeft.responseText);
					buttons.right.response = jQuery.parseJSON(reqRight.responseText);
					(buttons.left.response != null) ? _insertListOnInit(buttons.left.response.list, 'left') : _hideButtonLeft();
					(buttons.right.response != null) ? _insertListOnInit(buttons.right.response.list, 'right') : _hideButtonRight();
					
					if(buttons.right.response == null && buttons.left.response == null) {initRolloverCategory();}
					
					var slides = jQuery('.category-caroussel').find('ul.products-grid');
					var nbrOfSlides = slides.length;
					
					jQuery('.category-caroussel').width(jQuery('.category-caroussel').children('ul').width() * nbrOfSlides);
					
					var multiplicator = 0;
					for(var i=0; i<nbrOfSlides; i++) {
						if(jQuery(slides).eq(i).hasClass('active')) {
							if(i>0)	multiplicator++;
							break;
						}
					}
					
					var newMargin = '-'+(jQuery('.category-caroussel').children('ul').width() * multiplicator)+'px';
					jQuery('.category-caroussel').css('margin-left', newMargin);
						
				}
			});
		}
		
		var _insertListOnInit = function(list, direction) {
			parametres.currentUl = jQuery('.category-caroussel').children('.active');
			var list = jQuery(list).children().children('ul');
		
			switch(direction) {
				case 'left':
					jQuery('.category-caroussel').prepend(list);
					_showButtonLeft();
				break;
				case 'right':
					jQuery('.category-caroussel').append(list);
					_showButtonRight();
				break;
			}
			
			initRolloverCategory();
		}
		
		/* ========== LOADPRODUCTS ON CLICK ========== */
		var loadProducts = function(direction, url) {
			parametres.urlParams = jQuery.getUrlVars(url);
			parametres.currentUl = jQuery('.category-caroussel').children('.active');
			parametres.currentUlIndex = jQuery('.category-caroussel ul').index(parametres.currentUl);
			
			switch(direction) {
				case 'left':
					_loadProductLeft();
						//Init ds-sleight for IE
						if (navigator.platform == "Win32" && navigator.appName == "Microsoft Internet Explorer" && window.attachEvent) {
							initDsSleight();
						}
				break;
				
				case 'right':
					_loadProductRight();
											//Init ds-sleight for IE
						if (navigator.platform == "Win32" && navigator.appName == "Microsoft Internet Explorer" && window.attachEvent) {
							initDsSleight();
						}
				break;
			
			}//EndSwitch
		}
		
		var _loadProductLeft = function () {
			var newUl = jQuery(parametres.currentUl).removeClass('active').parent().find('ul').eq(parametres.currentUlIndex - 1).addClass('active');
			var newUlIndex = jQuery('.category-caroussel ul').index(newUl);
			
			_showButtonLeft();
			_showButtonRight();
			
			if((newUlIndex - 1) < 0) {
				var params='';
				if(!parametres.isAdvancedSearch) {	
				 	if(parametres.urlParams.firstPage) params = 'p='+parametres.urlParams.p+'&firstPage='+parametres.urlParams.firstPage;
				 	else params = 'p='+parametres.urlParams.p;
				}else {
					if(parametres.urlParams.firstPage) params = location.href.slice(location.href.indexOf('?') + 1)+'&p='+parametres.urlParams.p+'&firstPage='+parametres.urlParams.firstPage;
				 	else params = location.href.slice(location.href.indexOf('?') + 1)+'&p='+parametres.urlParams.p;				
				}
			 	
				_showLoaderLeft();
			 	
				jQuery.ajax({
					url: parametres.controllerUrl,
					data : params,
					success: function( data ) { (data !== '') ? _insertList(jQuery.parseJSON(data), 'left') : _hideButtonLeft() }
					
				});
			}
		
		}
		
		var _loadProductRight = function () {
			var newUl = jQuery(parametres.currentUl).removeClass('active').parent().find('ul').eq(parametres.currentUlIndex + 1).addClass('active');
			_showButtonLeft();
			_showButtonRight();
			if( parametres.currentUlIndex + 3 >  (parseInt(jQuery('.category-caroussel').find('ul').length)) ) {
				
			 	_showLoaderRight();
			 	
			 	var params = '';
			 	if(!parametres.isAdvancedSearch) {
			 		params = 'p='+parametres.urlParams.p;
			 	}else {
			 		params = location.href.slice(location.href.indexOf('?'))+'&p='+parametres.urlParams.p;
			 		params = params.substr(1,params.length);
			 	}
			 	
			 	
				jQuery.ajax({
					url: parametres.controllerUrl,
					data : params,
					success: function( data ) {	(data !== '') ? _insertList(jQuery.parseJSON(data), 'right') : _hideButtonRight(); }
				});
			}		
		}
		
		var _insertList = function(data, direction) {
			var caroussel = jQuery('.category-caroussel');
			var list = jQuery(data.list).find('.products-grid');
			caroussel.width(caroussel.width() + jQuery('.category-caroussel ul').width());
			
			switch(direction) {
				case 'left':
					caroussel.prepend(list);
					caroussel.css('margin-left', '-'+jQuery('.category-caroussel ul').width()+'px')
					_showButtonLeft();
					
					if(typeof enableAlphaImages == 'function') { 
						enableAlphaImages();
					}
				break;
				case 'right':
					caroussel.append(list);
					
					_showButtonRight();
					
					if(typeof enableAlphaImages == 'function') { 
						enableAlphaImages();
					}
				break;
			}
			
			//rebind le hover sur les nouveaux produits
			initRolloverCategory();
		}
	
		var _showButtonLeft = function() {buttons.left.object.loader.hide(); buttons.left.object.a.show();}
		var _showLoaderLeft = function() {buttons.left.object.loader.show(); buttons.left.object.a.hide();}
		var _hideButtonLeft = function() {buttons.left.object.loader.hide(); buttons.left.object.a.hide();}
		
		var _showButtonRight = function() {buttons.right.object.loader.hide(); buttons.right.object.a.show();}
		var _showLoaderRight = function() {buttons.right.object.loader.show(); buttons.right.object.a.hide();}
		var _hideButtonRight = function() {buttons.right.object.loader.hide(); buttons.right.object.a.hide();}
		
		/* ========== END OF ANIMATE ========== */
		var bindComplete = function(direction) {
			switch(direction) {
				case 'left':
					var buttonHref = jQuery.getUrlVars(buttons.left.object.a.attr('href'));
					var newPage = parseInt(buttonHref.p) + 1;
					var newUrlRight = parametres.controllerUrl + '?p='+newPage ;
					
					buttons.left.object.a.attr('href', newUrlRight);
					if(buttonHref.p == 1) {
						var newUrlLeft = parametres.controllerUrl +'?p='+ buttonHref.p + '&firstPage=true';
					}
					else if(buttonHref.p > 1) {
						buttonHref.p--;
						var newUrlLeft = parametres.controllerUrl + '?p='+ buttonHref.p;
					}
					buttons.left.object.a.attr('href', newUrlLeft);
					
					loadProducts('left', newUrlLeft)
				break;
				
				case 'right':
					buttons.left.object.a.show();
					
					var buttonHref = jQuery.getUrlVars(buttons.right.object.a.attr('href'));
					
					var newPage = parseInt(buttonHref.p) - 1;
					var newUrlLeft = buttons.right.object.a.attr('href').substr(0, (buttons.right.object.a.attr('href').length -1)) + newPage;
					
					buttons.right.object.a.attr('href', newUrlLeft);
					buttonHref.p++;
					
					var optionsLength = buttons.right.object.a.attr('href').slice(buttons.right.object.a.attr('href').indexOf('?')).length;
					var newUrlRight = buttons.right.object.a.attr('href').substr(0, (buttons.right.object.a.attr('href').length - optionsLength)) + '?p=' +buttonHref.p;
					
					buttons.right.object.a.attr('href', newUrlRight);
					
					loadProducts('right', newUrlRight)
				break;
			}
		
		}
		
		return {
			init:init,
			loadProducts:loadProducts,
			bindComplete:bindComplete,
			
			parametres: parametres,
			buttons:buttons
		}
	}
	
/*  // =========================================================== \\
   || ========== Init rollover on products in category =========== || 
   \\ =========================================================== // */
	
	var initRolloverCategory = function() {
		var productInfo = jQuery('.products-grid').find('.bloc-infos-product');
		for(var i=0; i <productInfo.length;i++) {
			jQuery(productInfo).eq(i).parent().hoverIntent(function(){
				jQuery(this).children('.bloc-infos-product').fadeIn('fast');
			}, function(){
				jQuery(this).children('.bloc-infos-product').fadeOut('fast');
			})
		}
		
		//Init ds-sleight for IE
		if (navigator.platform == "Win32" && navigator.appName == "Microsoft Internet Explorer" && window.attachEvent) {
			initDsSleight();
		}
	}
	
	var initDsSleight = function() {
		if(typeof enableAlphaImages == 'function') { 
		window.attachEvent("onload", enableAlphaImages);
		};
	}
	
	jQuery('document').ready(function() {
		
		/*  || ========== GESTION DE LA PAGE CATALOG PRODUCT LIST =========== || */
		
		//Recherche ajax desactivé dans la recherche par query, on inialise juste les rollovers
		if(jQuery('body').hasClass('catalogsearch-result-index')) {
		
			initRolloverCategory();
		}
		
		//Dans le cas d'une page catalogue ou d'une recherche avancée, on effectue la requête ajax
		if(jQuery('body').hasClass('catalog-category-view') || jQuery('body').hasClass('catalogsearch-advanced-result')) {
			
			// "construct" du catalogSlider
			var sliderCatalog = catalogSlider();
						
			if(jQuery('body').hasClass('catalog-category-view')){
				sliderCatalog.parametres.controllerUrl =  BASE_URL+'catalogajax/index/index/';
			}
			else if(jQuery('body').hasClass('catalogsearch-advanced-result')) {
				sliderCatalog.parametres.controllerUrl =  BASE_URL+'catalogajax/advancedSearch/index/';
				sliderCatalog.parametres.isAdvancedSearch = true;
			}	
			else if(jQuery('body').hasClass('catalogsearch-result-index')) {
				sliderCatalog.parametres.controllerUrl =  BASE_URL+'catalogajax/advancedSearch/index/';
				sliderCatalog.parametres.isQuerySearch = true;
			}
			
			if(sliderCatalog.buttons.right.object.a.length > 0 && sliderCatalog.buttons.left.object.a.length > 0) {
				
				//on init la sliderCatalog
				sliderCatalog.init();
				
				// Bind click \\
				sliderCatalog.buttons.right.object.a.bind('click', function(e){
					e.preventDefault();
					var newLeft = parseInt(jQuery(this).parent().parent().children('.category-caroussel').css('margin-left'),10) - jQuery(this).parent().parent().children('.category-caroussel').children('ul').width();
					
					jQuery(this).parent().parent().children('.category-caroussel').animate({
						'margin-left' : newLeft+'px'
					}, function() { sliderCatalog.bindComplete('right'); });
				});
				
				sliderCatalog.buttons.left.object.a.bind('click', function(e) {
					e.preventDefault();
					var newLeft = parseInt(jQuery(this).parent().parent().children('.category-caroussel').css('margin-left'),10) + jQuery(this).parent().parent().children('.category-caroussel').children('ul').width();
					
					jQuery(this).parent().parent().children('.category-caroussel').animate({
						'margin-left' : newLeft+'px'
					}, function() { sliderCatalog.bindComplete('left'); });
				});
			}
		}
		
		
	}); 	
   	//
   // !! AUCUN CODE ICI !! \\
 
   
})(jQuery);
