$(document).ready(function() {
(function(container, paginator) {

    var WIDTH    = 600;
    var INTERVAL = 75;
    var STEP     = 150;
    var AUTO_PERIOD = 5000;
    var SPEED = [20, 30, 50, 100, 150];

    container.css("position", "relative");

    var images   = container.find("img");
    var count    = images.length;    
    var current  = 0;
    var position = 0;
    var endpos   = 0;
    var interval = null;
    var mouseon  = false;
    var tmousout  = 0;
    var tslideoff = (new Date()).getTime();
    var cspeed    = 0;
    
    var points = (function(paginator, count) {
        var markup = [];
        for (var i = 0; i < count; i++) {
            markup.push("<li><a href='#" + i + "'>" + (i + 1) + "</a></li>");
        }
        paginator.html(markup.join(""));
        paginator.show();
        var points = paginator.find("li");
        points.first().addClass("current");
        return points;
    })(paginator, count);
    
    for (var i = 0; i < count; i++) {
        (function(point, i) {
            point.click(
                (function(e) {
                    slideTo(i);
                    return false;
                })
            );
        })(points.eq(i), i);
    }
    
    function toPosition(pos) {
        container.css("left", "-" + pos + "px");
        position = pos;
        var cur = parseInt(pos / WIDTH);
        if (cur != current) {
            points.eq(current).removeClass("current");        
            current = cur;
            points.eq(current).addClass("current");
        }
    }
    
    function smoothTo(pos) {
        if (pos == position) {
            return false;
        }
        startInterval();
        endpos = pos;
    }
    
    function slideTo(number) {
        smoothTo(number * WIDTH);
    }    
    
    function startInterval() {
        if (!interval) {
            cspeed   = 0;
            interval = setInterval(clock, INTERVAL);
        }
    }
    
    function stopInterval() {
        if (interval) {
            clearInterval(interval);
            interval  = null;
            tslideoff = (new Date()).getTime();
        }
    }
    
    function clock() {   
        var speed = SPEED[cspeed];
    
        if (cspeed < SPEED.length - 1) {
            cspeed++;
        }
        
        var del = Math.abs(position - endpos);
        if (del < 30) {
            speed = 20;
        } else if (del < 75) {
            speed = 30;
        } else if (del < 200) {
            speed = 50;
        } else if (del < 300) {
            speed = 100;
        }
   
        if (position < endpos) {
            position += speed;
            if (position > endpos) {
                position = endpos;
            }
        } else if (endpos < position) {
            position -= speed;
            if (position < endpos) {
                position = endpos;
            }
        }
        toPosition(position);
        if (position == endpos) {
            stopInterval();
        }
    }
    
    setInterval((function() {
        
        if (interval || mouseon) {
            return false;
        }
        var time = (new Date()).getTime();

        if (time - tslideoff < AUTO_PERIOD) {
            return false;
        }
        if (time - tmousout < AUTO_PERIOD) {
            return false;
        }
        if (current < count - 1) {
            slideTo(current + 1);     
        } else {
            slideTo(0);
        }
    }), 500);


})($("div.slides_container"), $("ul.pagination"));
});

