/**
 * jQuery Slider
 * @author Jakub Derdziak
 *
 * usege: $("#slider").slide( {
 *      elementWidth: -1,           //width of the single element. If default, be sure that each element has the same width and it's well specified in css
 *      sliderWidth: -1,            //how long should be width of the slider. -1 means take values from css.
 *      sliderType: "circle",       //"circle" or "return" - what script should do if it reaches end
 *      freezOnMouseOver: false,    //if movement should stop, when mouse is over
 *      fluentMovement: false,      //true if you want fluent movement,
 *      tickTime: 3000,             //time in miliseconds - works only if fluentMove is set to false, time between animations
 *      animationTime: 400,         //time in miliseconds - works only if fluentMove is set to false, time of animation
 *      fluentTickTime: 40,         //time in miliseconds - works only if fluentMove is set to true. Decide how long one frame lasts. The smaller value the faster animation will be. If set to more than 40, can couse animation will be less fluent.
 *      fluentMoveWidth: 2          //size in pixels - works only if fluentMove is set to true. How many piksels will animation move on every frame.
 * } );
 * 
 * @param elementWidth - integer, set width of the single element. All alements must have the same width; default is -1, but use this only when you are sure, that all slider elements have the same width
 * @param sliderWidth - integer, set width of the slider. In not set it will be get from css
 * @sliderType - string, "circle", "return", circle will couse "infinite" loop, return will go back to the begining, when slider reach its end
 */

jQuery.fn.slider = function( settings )
{
    var o = {}
    var sliderInterval = new Array(), isSliding = false;

    var defaults = {
        elementWidth: -1,
        sliderWidth: -1,
        sliderType: "circle",
        freezOnMouseOver: false,
        fluentMovement: false,
        tickTime: 3000,
        animationTime: 400,
        fluentTickTime: 40,
        fluentMoveWidth: 2
    }

    var slideSliderCircle = function( sliderNumber, singleSettings )
    {
        var slider = jQuery("#slider-"+sliderNumber);
        isSliding = true;

        if( singleSettings.fluentMovement )
        {
            slider.css({"left":(parseInt(slider.css("left")) - singleSettings.fluentMoveWidth) + "px"});
            if( -parseInt(slider.css("left")) > singleSettings.elementWidth )
            {
                //returnTo = singleSettings.elementWidth + parseInt(slider.css("left"));
                returnTo = slider.children("*:first").outerWidth( true ) + parseInt(slider.css("left"));
                slider.children("*:first").remove();
                slider.css("left",returnTo+"px");
                slider.children("*:first").clone(true).appendTo("#slider-"+sliderNumber);
            }
        }
        else
        {
            slider.animate({"left": "-="+singleSettings.elementWidth+"px"},singleSettings.animationTime,function(){
                slider.children("*:first").remove();
                slider.css("left","0px");
                slider.children("*:first").clone(true).appendTo("#slider-"+sliderNumber);
            });
        }
    }

    var slideSliderReturn = function( sliderNumber, singleSettings )
    {
        var slider = jQuery("#slider-"+sliderNumber);
        isSliding = true;

        if( singleSettings.fluentMovement )
        {
            slider.css({"left":(parseInt(slider.css("left")) - singleSettings.fluentMoveWidth) + "px"});
            if( -parseInt(slider.css("left")) >= ( slider.outerWidth() - slider.parent().innerWidth() ) )
            {
                slider.css({"left": "0px"});
            }
        }
        else
        {
            if( -parseInt(slider.css("left")) >= ( slider.outerWidth() - slider.parent().innerWidth() ) )
            {
                slider.animate({"left": "0px"});
            }
            else
            {
                slider.animate({"left": "-="+singleSettings.elementWidth+"px"},singleSettings.animationTime);
            }
        }
    }

    var startSliding = function( sliderNumber, singleSettings )
    {
        var time = singleSettings.tickTime;
        if( singleSettings.fluentMovement )
        {
            time = singleSettings.fluentTickTime;
        }
        
        if( singleSettings.sliderType == "circle" )
        {
            sliderInterval[sliderNumber] = setInterval( function (){ slideSliderCircle( sliderNumber, singleSettings ) } , time );
        }
        else
        {
            sliderInterval[sliderNumber] = setInterval( function (){ slideSliderReturn( sliderNumber, singleSettings ) } , time );
        }

        if( singleSettings.freezOnMouseOver )
        {
            var slider = jQuery("#slider-"+sliderNumber);
            slider.mouseenter( function( ) {
                clearInterval(sliderInterval[sliderNumber]);
                isSliding = false;
            } ).mouseleave( function( ) {
                if( !isSliding )    //doesn't start is sliding actually works
                {
                    if( singleSettings.sliderType == "circle" )
                    {
                        sliderInterval[sliderNumber] = setInterval( function (){ slideSliderCircle( sliderNumber, singleSettings ) } , time );
                    }
                    else
                    {
                        sliderInterval[sliderNumber] = setInterval( function (){ slideSliderReturn( sliderNumber, singleSettings ) } , time );
                    }
                }
            } );
        }
        
    }
    
    return this.each(function() {
        var t = jQuery(this);
        var elementsCount = 0;
        var singleSettings = jQuery.extend( {}, defaults, settings );
        var counter = Math.round(Math.random()*10000);
        
        t.css("overflow-x","hidden");
        t.css("position","relative");
        t.css("height",t.innerHeight());

        if( singleSettings.sliderWidth === -1 )
        {
            t.css("width",jQuery(this).innerWidth()+"px");
        }
        else
        {
            t.css("width",singleSettings.sliderWidth+"px");
        }

        t.append('<div id="slider-' + counter + '"></div>');
        var s = jQuery( "#slider-" + counter );
        s.css("position","absolute");
        s.css("left","0px");
        s.css("top","0px");

        var elementsWidth = 0;
        var maxWidth = 0;

        t.children().each( function() {
            if( singleSettings.elementWidth === -1 )
            {
                //singleSettings.elementWidth = jQuery(this).outerWidth( true );
                elementsWidth += jQuery(this).outerWidth( true );

                if( jQuery(this).outerWidth( true ) > maxWidth )
                {
                    maxWidth = jQuery(this).outerWidth( true );
                }
            }
            else
            {
                maxWidth = singleSettings.elementWidth;
                elementsWidth += maxWidth;
            }
            
            if( jQuery(this).attr('id') != "slider-" + counter )
            {
                jQuery(this).appendTo( "#slider-" + counter );
                elementsCount++;
            }
        } );

        singleSettings.elementWidth = maxWidth;
        
        if( elementsWidth == 0 )
        {
            elementsWidth = elementsCount * maxWidth;
        }
        
        if( singleSettings.sliderType === "circle" )
        {
            s.css( "width", elementsWidth + maxWidth );
        }
        else
        {
            s.css( "width", elementsWidth );
        }
        
        //If there is no enough elements...
        if( t.innerWidth() >= ( s.outerWidth() - maxWidth ) && singleSettings.sliderType === "circle" )
        {
            return false;
        }
        else if ( t.innerWidth() >= s.outerWidth() )
        {
            return false;
        }

        if( singleSettings.sliderType === "circle" )
        {
            s.children("*:first").clone(true).appendTo("#slider-" + counter);
        }

        startSliding(counter, singleSettings);

        //counter++;
    });
}
