(function($) {

    var Slider = function(element, options){
		//Defaults are below
		var settings = $.extend({}, $.fn.Slider.defaults, options);

        //Useful variables. Play carefully.
        var vars = {
            currentSlide: 0,
            currentImage: '',
            totalSlides: 0,
            running: false,
            paused: false,
            stop:false
        };
    
        //Get this slider
        var sliderWrapper = $(element);
        sliderWrapper.addClass('SliderWrapper').width(settings.width);
        var tmp_html=sliderWrapper.html();
        sliderWrapper.empty();
        if(settings.effect=="slide")
       	 	var slideClass="Slider effectSliding";
       	 else
       	 	var slideClass="Slider effectFade";
  
        var sliderDetails=$("<div class='SliderDetails'></div>").hide().appendTo(sliderWrapper);
        var slider=$("<div></div>").addClass(slideClass).html(tmp_html).appendTo(sliderWrapper).height(settings.height);
        var sliderNavigation=$("<div class='SliderNavigation' ></div>");        
        if(settings.navContainer!=false && $(settings.navContainer).size()>0){
            sliderNavigation.appendTo($(settings.navContainer));
        }
        else {
            sliderNavigation.appendTo(sliderDetails);
        }
          
        var sliderHighImage=$("<a href='' class='highResolutionLink'>View High Resolution</a>");
     	$("<div class='SliderInfoBox' ></div>").append(sliderHighImage).appendTo(sliderNavigation);
     	
        slider.data(':vars', vars);
        //Find our slider children
        sliderHighImage.css('display','none');
		
        var kids = slider.children();
        kids.each(function() {
            var child = $(this);
            child.css("max-width",sliderWrapper.width()+"px").wrap("<div class='Slide'></div>").parent().width(sliderWrapper.width());
            vars.totalSlides++;
        });
        
        kids.show();
        
        $("div.Slide img",sliderWrapper).live("click",function(e){
        	e.preventDefault();
            if(vars.running) return false;
            clearInterval(timer);
            timer = '';
            Run(slider, kids, settings, 'next');
        })
  
     	var slideViewport;
     	if(settings.effect=="slide"){
     		slideViewport=$("<div class='slideViewPort' ></div>").appendTo(slider);
     	}      
        //Set startSlide
        if(settings.startSlide > 0){
            if(settings.startSlide >= vars.totalSlides) settings.startSlide = vars.totalSlides - 1;
            vars.currentSlide = settings.startSlide;
        }
            
        if(settings.effect=="fade")
       	 	kids.eq(vars.currentSlide).parent().show();
        else 
        	slideViewport.append(kids.eq(vars.currentSlide).parent().clone());
        
		//Start
        var timer = 0;
        if(!settings.manualAdvance && kids.length > 1){
            timer = setInterval(function(){ Run(slider, kids, settings, false); }, settings.pauseTime);
        }

        //Add Direction nav
        if(settings.directionNav){
            sliderWrapper.append('<div class="-directionNav"><a class="-prevNav">Prev</a><a class="-nextNav">Next</a></div>');
            
            //Hide Direction nav
            if(settings.directionNavHide){
                $('.-directionNav', sliderWrapper).hide();
                slider.hover(function(){
                    $('.-directionNav', sliderWrapper).show();
                }, function(){
                    $('.-directionNav', sliderWrapper).hide();
                });
            }
            var containerr = $("#homepageSlider");
            $('a.-prevNav', containerr).click(function(){
	                if(vars.running) return false;
	                clearInterval(timer);
	                timer = '';
	                Run(slider, kids, settings, 'prev');
	                
            	
            }).mousedown(function(){
            		$(this).addClass("-prevNav_pressed");
            	
            }).mouseup(function(){
            		$(this).removeClass("-prevNav_pressed");
            	
            }).mouseleave(function(){
            		$(this).removeClass("-prevNav_pressed");
            })
            
            $('a.-nextNav', containerr).click(function(){
                if(vars.running) return false;
                clearInterval(timer);
                timer = '';
                Run(slider, kids, settings, 'next');
            }).mousedown(function(){
            		$(this).addClass("-nextNav_pressed");
            }).mouseup(function(){
            		$(this).removeClass("-nextNav_pressed");
            }).mouseleave(function(){
            		$(this).removeClass("-nextNav_pressed");
            })
        }
        
        var Control,ControlInfo;
        
        //Add Control nav
        if(settings.controlNav){
            Control = $('<div class="-controlNav"></div>');
            sliderNavigation.prepend(Control);
			 $('<a href="#" class="-controlPrev">Previous</a>').appendTo(Control).click(function(e){
			 		e.preventDefault();
	                if(vars.running) return false;
	                clearInterval(timer);
	                timer = '';
	                Run(slider, kids, settings, 'prev');
            })
            
             ControlInfo=$('<span class="-control"></span>');
             Control.append(ControlInfo);
             ControlInfo.html((vars.currentSlide+1) +'/'+vars.totalSlides);
			 $('<a href="#" class="-controlNext">Next</a>').appendTo(Control).click(function(e){
			 		e.preventDefault();
	                if(vars.running) return false;
	                clearInterval(timer);
	                timer = '';
	                Run(slider, kids, settings, 'next');
            })
        }	
        
        //Keyboard Navigation
        if(settings.keyboardNav){
            $(window).keypress(function(event){
                //Left
                if(event.keyCode == '37'){
                    if(vars.running) return false;
                    clearInterval(timer);
                    timer = '';
                    vars.currentSlide-=2;
                    Run(slider, kids, settings, 'prev');
                }
                //Right
                if(event.keyCode == '39'){
                    if(vars.running) return false;
                    clearInterval(timer);
                    timer = '';
                    Run(slider, kids, settings, 'next');
                }
            });
        }
        
        if(settings.pauseOnHover){
            slider.find(".Slide").hover(function(){
                vars.paused = true;
                clearInterval(timer);
                timer = '';
            }, function(){
               vars.paused = false;
	              //Restart the timer
	              if(timer == '' && !settings.manualAdvance){
	                  timer = setInterval(function(){ Run(slider, kids, settings, false); }, settings.pauseTime);
	               }
            });
        }
        //Event when Animation finishes
        slider.bind(':animFinished', function(){ 
            vars.running = false; 
            //Restart the timer
            if(timer == '' && !vars.paused && !settings.manualAdvance){
                timer = setInterval(function(){ Run(slider, kids, settings, false); }, settings.pauseTime);
            }
            //Trigger the afterChange callback
            settings.afterChange.call(this);
        });

        // Private run method
		var Run = function(slider, kids, settings, nudge){
			//Get our vars
			var vars = slider.data(':vars');
			var prev_slide=vars.currentSlide;
			
            //Trigger the lastSlide callback
            if(vars && (vars.currentSlide == vars.totalSlides - 1)){ 
				settings.lastSlide.call(this);
			}
            
            // Stop
			if((!vars || vars.stop) && !nudge) return false;
			
			//Trigger the beforeChange callback
			settings.beforeChange.call(this);
	
			if(nudge == 'prev'){	
				vars.currentSlide--;
			}
			else if(nudge == 'next'){
				vars.currentSlide++;
			}
			else {
				
				vars.currentSlide++;
			}
			
            //Trigger the slideshowEnd callback
			if(vars.currentSlide == vars.totalSlides){ 
				vars.currentSlide = 0;
				settings.slideshowEnd.call(this);
			}
			
			if(vars.currentSlide < 0) vars.currentSlide = (vars.totalSlides - 1);
			//Set vars.currentImage
			
			//Set active links
			if(settings.controlNav){
				$('.-controlNav a', slider).removeClass('active');
				$('.-controlNav a:eq('+ vars.currentSlide +')', slider).addClass('active');
			}
		
			//Run effects
			vars.running = true;
			
            ControlInfo.html((vars.currentSlide+1) +'/'+vars.totalSlides);
			
			if(settings.effect=="fade"){
				
				// hide previous displayed information
				$("#SliderInfo div.SliderItem").addClass('hide');
				//display next 
				$("div#SliderInfo_"+vars.currentSlide).removeClass('hide');
				//changed displayed page nr
				$("#SliderCurrentPage").html(parseInt(vars.currentSlide)+1);
				
				if(settings.fadeInSameTime){
					
					kids.eq(vars.currentSlide).parent().fadeIn(settings.animSpeed,function(){
						
						slider.trigger(':animFinished');
						
					});
					kids.eq(prev_slide).parent().fadeOut(settings.animSpeed,function(){
						
						slider.trigger(':animFinished');
						
					});
				}
				else {
					kids.eq(prev_slide).parent().fadeOut(settings.animSpeed/2,function(){
						kids.eq(vars.currentSlide).parent().fadeIn(settings.animSpeed/2,function(){
							slider.trigger(':animFinished');
						});
					});
				}
			}
			else if(settings.effect=="slide") {
				var current_element=slideViewport.find("*").eq(0);
				var marginLeft;
				var clone=kids.eq(vars.currentSlide).parent().clone().hover(function(){
	                vars.paused = true;
	                clearInterval(timer);
	                timer = '';
	            }, function(){
	               vars.paused = false;
		              //Restart the timer
		              if(timer == '' && !settings.manualAdvance){
		                  timer = setInterval(function(){ Run(slider, kids, settings, false); }, settings.pauseTime);
		               }
	            });
				
				if(nudge == 'prev'){
					slideViewport.prepend(clone.css({"marginLeft":-sliderWrapper.width(),"marginRight":settings.gap}));
					clone.animate({"margin-left":0},settings.animSpeed,function(){
						current_element.remove();
						clone.css("margin","0px");
						slider.trigger(':animFinished');
					})
				}
				else {
					slideViewport.append(clone);
					current_element.css({"margin-right":settings.gap}).animate({"margin-left":-(sliderWrapper.width()+settings.gap)},settings.animSpeed,function(){
						current_element.remove();
						clone.css("margin","0px");
						slider.trigger(':animFinished');
					})
				}
			}
		}
        
        // For debugging
        var trace = function(msg){
            if (this.console && typeof console.log != "undefined")
                console.log(msg);
        }
        
        // Start / Stop
        this.stop = function(){
            if(!$(element).data('nivo:vars').stop){
                $(element).data('nivo:vars').stop = true;
                trace('Stop Slider');
            }
        }
        
        this.start = function(){
            if($(element).data('nivo:vars').stop){
                $(element).data('nivo:vars').stop = false;
                trace('Start Slider');
            }
        }
        
        //Trigger the afterLoad callback
        settings.afterLoad.call(this);
    };
        
    $.fn.Slider = function(options) {
    
        return this.each(function(){
            var element = $(this);
            // Return early if this element already has a plugin instance
            if (element.data('slider')) return;
            // Pass options to plugin constructor
            var slider = new Slider(this, options);
            // Store plugin object in this element's data
            element.data('slider', slider);
        });

	};
	
	//Default settings
	$.fn.Slider.defaults = {
		controlPlayback:true,
		pauseOnHover : true,
		effect:'slide',
		fadeInSameTime:false,
		gap:20,
		animSpeed:500,
		pauseTime:3000,
		height:800,
        width:980,
		startSlide:0,
		directionNav:true,
		directionNavHide:true,
		controlNav:true,
		keyboardNav:true,
		manualAdvance:true,
                navContainer:false,
		beforeChange: function(){},
		afterChange: function(){},
		slideshowEnd: function(){},
                lastSlide: function(){},
                afterLoad: function(){}
	};
	
	$.fn._reverse = [].reverse;
	
})(jQuery);

$(document).ready(function(){
	$("#Slider").live('mouseenter',function(){
		$(".-directionNav a").css("display","block");
	})
	$("#Slider").live('mouseleave',function(){
		$(".-directionNav a").css("display","none");
	})
})

