// by Lincoln! 1.2

function photoSlider(id) {

    var _self = this;
    this.element = null;

    var m_interval = 5000;
    var m_duration = 600;
    var timerID = -1;


    var items = [];
    var centerSlot = 0;
    var inProgress = false;
    var m_size = { width: 0, height: 0 };
    var m_action = "swing";



    // constructor
    function init() {
        // get element

        this.element = document.getElementById(id);
        if (!this.element) {
            return;
        }

        // add children

        for (var j = 0; j < this.element.childNodes.length; j++) {
            var n = this.element.childNodes[j];
            if (n.nodeType === 1 && n.nodeName.match(/img/i)) {
                items.push(n);
            }
        }

        // start

        if (items.length > 0) {
            _self.setSize(items[0].offsetWidth, items[0].offsetHeight);
            _self.autostart();
        }
    };


    // processing loop
    function proc() {
        _self.slideLeftOver();
    };

    this.setSize = function(width, height) {
        m_size.width = width;
        m_size.height = height;
    };

    this.slideLeft = function() {

        if (inProgress) { return; }
        inProgress = true;

        var next = (centerSlot + 1) % items.length;
        var leaving = $(items[centerSlot]);
        var entering = $(items[next]);
        var delta = "-=" + m_size.width + "px";

        // make sure entering element is in place
        entering.css('top', 0).css('left', m_size.width);

        // visible and next elements are moved left
        entering.animate({ "left": delta }, m_duration, m_action, function() { inProgress = false; });
        leaving.animate({ "left": delta }, m_duration, m_action, null);

        centerSlot = next;
    };

    this.slideLeftOver = function() {

        if (inProgress) { return; }
        inProgress = true;

        var next = (centerSlot + 1) % items.length;

        var leavingID = items[centerSlot];
        var leaving = $(leavingID);
        var entering = $(items[next]);
        var delta = "-=" + m_size.width + "px";

        // make sure entering element is in place
        entering.css('top', 0).css('left', m_size.width).css('z-index', 201).css('visibility', 'visible');
        leaving.css('z-index', 99);

        // visible and next elements are moved left
        entering.animate({ "left": delta }, m_duration, m_action,
            (function(id) {
                return (function() {
                    $(id).css('visibility', 'hidden');
                    inProgress = false;
                });
            })(leavingID)
         );
        //leaving.animate({ "left": delta }, m_duration, m_action, null);

        centerSlot = next;
    };

    this.slideRight = function() {

        if (inProgress) { return; }
        inProgress = true;

        var next = (centerSlot + items.length - 1) % items.length;
        var leaving = $(items[centerSlot]);
        var entering = $(items[next]);
        var delta = "+=" + m_size.width + "px";

        // make sure entering element is in place
        entering.css('top', 0).css('left', -m_size.width);

        // visible and next elements are moved right
        entering.animate({ "left": delta }, m_duration, m_action, function() { inProgress = false; });
        leaving.animate({ "left": delta }, m_duration, m_action, null);

        centerSlot = next;
    };

    // automatic sliding
    this.autostart = function() {

        if (items.length < 2) {
            return;
        }

        // force positioning for all elements.
        for (var j = 0, len = items.length; j < len; j++) {
            var obj = (items[j]);
            //            obj.style.position = 'absolute';
            $(obj).css('top', 0).css('left', m_size.width * j);
        }

        // set last element to the left
        $(items[items.length - 1]).css('left', -m_size.width);

        timerID = setInterval(proc, m_interval); // start the processing loop
    };


    // run constructor (last thing)
    init();
}
