
(function($) {

    var euroceptSlider = function(element, options){
		var settings = $.extend({}, $.fn.euroceptSlider.defaults, options);

        var vars = {
            currentSlide: 0,
            currentImage: '',
            totalSlides: 0,
            randAnim: '',
            running: false,
            paused: false,
            stop: false
        };
    
        var slider = $(element);
        slider.data('eurocept:vars', vars);
        slider.css('position','relative');
        slider.addClass('euroceptSlider');
        
        var kids = slider.children();
        kids.each(function() {
            var under = $(this);
            var link = '';
            if(!under.is('img')){
                if(under.is('a')){
                    under.addClass('eurocept-imageLink');
                    link = under;
                }
                under = under.find('img:first');
            }
            var underWidth = under.width();
            if(underWidth == 0) underWidth = under.attr('width');
            var underHeight = under.height();
            if(underHeight == 0) underHeight = under.attr('height');
            if(underWidth > slider.width()){
                slider.width(underWidth);
            }
            if(underHeight > slider.height()){
                slider.height(underHeight);
            }
            if(link != ''){
                link.css('display','none');
            }
            under.css('display','none');
            vars.totalSlides++;
        });
        
        if(settings.startSlide > 0){
            if(settings.startSlide >= vars.totalSlides) settings.startSlide = vars.totalSlides - 1;
            vars.currentSlide = settings.startSlide;
        }
        
        if($(kids[vars.currentSlide]).is('img')){
            vars.currentImage = $(kids[vars.currentSlide]);
        } else {
            vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
        }
        
        if($(kids[vars.currentSlide]).is('a')){
            $(kids[vars.currentSlide]).css('display','block');
        }
        
        slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');
        
        for(var i = 0; i < settings.slices; i++){
            var sliceWidth = Math.round(slider.width()/settings.slices);
            if(i == settings.slices-1){
                slider.append(
                    $('<div class="eurocept-slice"></div>').css({ left:(sliceWidth*i)+'px', width:(slider.width()-(sliceWidth*i))+'px' })
                );
            } else {
                slider.append(
                    $('<div class="eurocept-slice"></div>').css({ left:(sliceWidth*i)+'px', width:sliceWidth+'px' })
                );
            }
        }
     		
        if(vars.currentImage.attr('title') != ''){
            var title = vars.currentImage.attr('title');
            if(title.substr(0,1) == '#') title = $(title).html();
            $('.eurocept-caption p', slider).html(title);					
            $('.eurocept-caption', slider).fadeIn(settings.animSpeed);
        }
        
        var timer = 0;
        if(!settings.manualAdvance && kids.length > 1){
            timer = setInterval(function(){ euroceptRun(slider, kids, settings, false); }, settings.pauseTime);
        }
        
        slider.bind('eurocept:animFinished', function(){ 
            vars.running = false; 
            $(kids).each(function(){
                if($(this).is('a')){
                    $(this).css('display','none');
                }
            });
            if($(kids[vars.currentSlide]).is('a')){
                $(kids[vars.currentSlide]).css('display','block');
            }
            if(timer == '' && !vars.paused && !settings.manualAdvance){
                timer = setInterval(function(){ euroceptRun(slider, kids, settings, false); }, settings.pauseTime);
            }
            settings.afterChange.call(this);
        });
        
        var resetSliceWidth = function(slider, settings){
            var slices = $('.eurocept-slice', slider);
            var i = 0;
            slices.each(function(){
                var slice = $(this);
                var sliceWidth = Math.round(slider.width()/settings.slices);
                if(i == settings.slices-1){
                    slice.css('width', (slider.width()-(sliceWidth*i)) + 'px');
                } else {
                    slice.css('width', sliceWidth + 'px');
                }
                i++;
            });
        }

		var euroceptRun = function(slider, kids, settings, nudge){
			var vars = slider.data('eurocept:vars');
            
            if(vars && (vars.currentSlide == vars.totalSlides - 1)){ 
				settings.lastSlide.call(this);
			}
            
			if((!vars || vars.stop) && !nudge) return false;
			
			settings.beforeChange.call(this);
					
			if(!nudge){
				slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');
			} 
			vars.currentSlide++;
			if(vars.currentSlide == vars.totalSlides){ 
				vars.currentSlide = 0;
				settings.slideshowEnd.call(this);
			}
			if(vars.currentSlide < 0) vars.currentSlide = (vars.totalSlides - 1);
			if($(kids[vars.currentSlide]).is('img')){
				vars.currentImage = $(kids[vars.currentSlide]);
			} else {
				vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
			}
			
			
			var  i = 0;
			$('.eurocept-slice', slider).each(function(){
				var sliceWidth = Math.round(slider.width()/settings.slices);
				$(this).css({ height:'0px', opacity:'0', 
					background: 'url("'+ vars.currentImage.attr('src') +'") no-repeat -'+ ((sliceWidth + (i * sliceWidth)) - sliceWidth) +'px 0%' });
				i++;
			});
            
            if(settings.effect.indexOf(',') != -1){
                var anims = settings.effect.split(',');
                vars.randAnim = anims[Math.floor(Math.random()*(anims.length))];
				if(vars.randAnim == undefined) vars.randAnim = 'fade';
            }
		
			vars.running = true;
			if(settings.effect == 'header' || settings.effect == 'headerRight' || vars.randAnim == 'header' || 
					settings.effect == 'headerLeft' || vars.randAnim == 'headerLeft'){
				var timeBuff = 0;
				var i = 0;
				var v = 0;
                resetSliceWidth(slider, settings);
				var slices = $('.eurocept-slice', slider);
				if(settings.effect == 'headerLeft' || vars.randAnim == 'headerLeft') slices = $('.eurocept-slice', slider)._reverse();
				slices.each(function(){
					var slice = $(this);
					if(i == 0){
						slice.css('top','0px');
						i++;
					} else {
						slice.css('bottom','0px');
						i = 0;
					}
					
					if(v == settings.slices-1){
						setTimeout(function(){
							slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('eurocept:animFinished'); });
						}, (100 + timeBuff));
					} else {
						setTimeout(function(){
							slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed);
						}, (100 + timeBuff));
					}
					timeBuff += 50;
					v++;
				});
			} 
		}
        
        var trace = function(msg){
            if (this.console && typeof console.log != "fout")
                console.log(msg);
        }
        
        
        settings.afterLoad.call(this);
    };
        
    $.fn.euroceptSlider = function(options) {
    
        return this.each(function(){
            var element = $(this);
            if (element.data('euroceptslider')) return;
            var euroceptslider = new euroceptSlider(this, options);
            element.data('euroceptslider', euroceptslider);
        });

	};
	
	$.fn.euroceptSlider.defaults = {
		effect: 'header',
		slices: 10,
		animSpeed: 1000,
		pauseTime: 5000,
		beforeChange: function(){},
		afterChange: function(){},
		slideshowEnd: function(){},
        lastSlide: function(){},
        afterLoad: function(){}
	};
	
	$.fn._reverse = [].reverse;
	
})(jQuery);
