/**
 * darmahSlider plugin
 *
 * Copyright (c) 2009 Armelle Coquart (http://darma.fr)
 * documentation & demo : http://www.darma.fr/code-source/horizontal-scrollbar-jquery-plugin/
 * source disponible pour usage non-commercial - dans tous cas contraire (revente, promotion, auto-promotion etc.) contacter armelle.coquart@gmail.com pour droit d'utilisation.
 * free for non-commercial use only - please contact armelle.coquart@gmail.com otherwise.
 */
 
(function($) {
	$.fn.darmahSlider = function(options) {

	var defaults = {			
		slider: '#myslider', //element a slider
		numelem: 10, //nombre d'elements par page
		totalnumelem: 100, //nombre d'elements		
		elemwidth: 10, //largeur element
		elemheight: 10, //hauteur element
		width: 100, //largeur visible	
		controlwidth: 100, //largeur totale controles			
		numelemperstep: 1, //nombre d'elements a slider au clic
        cookiename: 'mycookie', //nom du cookie pour position slide
        ajaxurl : '', //url du fichier pour recuperer les pages next et previous,
		ajaxparam : 1, //param à ajouter pour ajax - ici categorie id
		readyfunc : null //executée au load de page
	};


	this.each(function() {
		var obj = $(this);
		var o = $.extend(defaults, options);
		var container = $(o.slider + '-container');
		var controls = $(o.slider + '-controls');
		var moveleft = $(o.slider + '-moveleft');
		var moveright = $(o.slider + '-moveright');
		var dragcontainer = $(o.slider + '-dragcontainer');
		var drag = $(o.slider + '-drag');		
		var pageprevious = $(o.slider + '-pageprevious');
		var pagenext = $(o.slider + '-pagenext');
		
		var totalwidth = o.numelem * o.elemwidth + pageprevious.outerWidth() + pagenext.outerWidth(); //largeur totale panel
		if(totalwidth < o.width) totalwidth = o.width;
		var btwidth = o.controlwidth * o.width / totalwidth; //largeur du bouton de drag
		var amplitude = o.controlwidth - btwidth; //largeur libre du bouton
		var scale = (totalwidth == o.width) ? 0 : ((totalwidth - o.width) / amplitude); //echelle de déplacement
		var step = (totalwidth == o.width) ? 0 : o.numelemperstep * o.elemwidth / scale; //taille du pas de déplacement

        var currentPage = 0;		
		var maxNumPage = 0;		
		if(o.numelem>0) maxNumPage = Math.ceil(o.totalnumelem/o.numelem) - 1;
		
		container.css('overflow', 'hidden');		
		container.height(o.elemheight);
		container.width(o.width);		
		controls.css('display', 'block');
		controls.width(o.controlwidth + moveleft.width() + moveright.width());		
		$(o.slider).width(totalwidth);
		dragcontainer.width(o.controlwidth);		
		drag.width(btwidth);		
		drag.css('cursor', 'pointer');
		drag.css('position', 'relative');
		drag.css('top', '0');
		drag.css('left', '0');
		moveleft.css('cursor', 'pointer');
		moveright.css('cursor', 'pointer');	
		$(o.slider + '-spacer').height($(o.slider + '-spacer').height() + controls.height() - 23);        

		//charger la premiere page
		if(o.totalnumelem > 0){
			if($.cookie(o.cookiename) != null){
				var a = $.cookie(o.cookiename).split('_');
				if(a.length == 2){
					currentPage = a[0];
					loadPage(a[1]);				
				}	
			}else{
				loadPage(0);			
            }			
        }
		
        drag.draggable({
			axis: 'x',
			containment: 'parent',
			drag: function(event, ui){
                listMoveTo(ui.position.left, false, 1);
			},
			stop: function(event, ui){
				setCookie(ui.position.left);			
			}			
		});
	    dragcontainer.click(function(e){
            var pos = e.pageX - $(this).position().left - 0.5*btwidth;		
			setCookie(pos);					
            listMoveTo(pos, true, 400);		
	    });
	    moveleft.click(function(){
		    var pos = drag.position().left - dragcontainer.position().left - step;
			setCookie(pos);								
            listMoveTo(pos, true, 200);		
	    });
	    moveright.click(function(){
		    var pos = drag.position().left - dragcontainer.position().left + step;
			setCookie(pos);			
            listMoveTo(pos, true, 200);		
	    });
		
        function loadPage(initPos){
			var request = $.ajax({
				type: 'POST',
				url: o.ajaxurl,
				data: 'page=' + currentPage + '&param=' + o.ajaxparam,
				success: function(response){
					$(o.slider).css('marginLeft', '0px');						
					$(o.slider).css('display', 'none');										
					$(o.slider).html(response);
				},
				error: function(obj, msg, e){
					//alert(msg);
				},
				complete: function(obj, msg){
    				listMoveTo(initPos, true, 0);
					$(o.slider).fadeIn(1000);										
				    initPage();
				}
			});		
		}
		
		function initPage(){
			pageprevious = $(o.slider + '-pageprevious');
			pagenext = $(o.slider + '-pagenext');		
			pageprevious.css('cursor', 'pointer');
			pagenext.css('cursor', 'pointer');	
			pagenext.css('display', 'none');						
			pageprevious.css('display', 'none');						
			if(currentPage > 0) pageprevious.css('display', 'block');								
			if(currentPage < maxNumPage) pagenext.css('display', 'block');									
			pageprevious.click(function(){
				if(currentPage <= 0) return;		
				currentPage--;
				initDrag();
				loadPage(0);
			});				
			pagenext.click(function(){
				if(currentPage >= maxNumPage) return;		
				currentPage++;
				initDrag();				
				loadPage(0);
			});	
            if(typeof(eval(o.readyfunc)) == 'function') eval(o.readyfunc + '();');			
		}
		function initDrag(){
			setCookie(0);
			$(drag).animate({'left' : '0px'}, 400, 'swing');
		}
		
		function listMoveTo(pos, fixdrag, speed){
			if(pos < 0) pos = 0;
			if(pos > o.controlwidth - btwidth) pos = o.controlwidth - btwidth;			
			if(fixdrag){	
				drag.css('left', pos + 'px');	
			}
			if(speed == 0){
				$(o.slider).css('marginLeft', - scale*pos + 'px');			
			}else{
				$(o.slider).animate({'marginLeft' : - scale*pos + 'px'}, speed, 'swing');
			}	
		}
		function setCookie(pos){
			$.cookie(o.cookiename, currentPage + '_' + pos, {path: '/'});
		}

		
	});
	
}})(jQuery);
