EB.scroller = {
    options: [],
    
	create: function(el) {
        
        if (!el.childNodes.length) { alert('EB.scroller: no child nodes...'); return; }
        if (!el.id) { alert('EB.scroller: Missing element id'); return; }
        
        el.scrollOptions = EB.getElementOptions(el, null, {scrollstyle: "horizontal", delay: 50, stepsize: 1, itemdelay: 0, wrap: true, autostart: true } );
		if(typeof el.scrollOptions.itemdelay == "string") el.scrollOptions.itemdelay = parseInt(el.scrollOptions.itemdelay);
		
        // 1) node check
        for (var i=0; i<el.childNodes.length; i++) {
            if (el.childNodes[i].nodeType == 3)
                // remove all text nodes
                el.removeChild(el.childNodes[i--]);
            else {
            }
        }

		if (el.scrollOptions.mouseover_pause == true || el.scrollOptions.mouseover_pause == "true") {
			EB.addEvent(el, "mouseover", function() { EB.scroller.pause(el.id); });
			EB.addEvent(el, "mouseout", function() { EB.scroller.resume(el.id); });
		}  
		
        if (el.scrollOptions.scrollstyle == "vertical") {

            // make sure there are enough elements in the list to scroll it
            while (el.scrollHeight <= el.offsetHeight) {
                var l = el.childNodes.length;
                for (var i=0; i<l; i++) {
                    var e = el.childNodes[i].cloneNode(true); 
                    el.appendChild(e);
                }
                el.scrollTop = 0;
            }

        } else if (el.scrollOptions.scrollstyle == "horizontal") {

            // make sure there are enough elements in the list to scroll it
            while (el.scrollWidth <= 2*el.offsetWidth) {
                var l = el.childNodes.length;
                for (var i=0; i<l; i++) {
                    var e = el.childNodes[i].cloneNode(true); 
                    el.appendChild(e);
                }
                el.scrollLeft = 0;
            }

        } else {
            alert("EB.scroller: Unknown scrollstyle");
            return;
        }

        if (el.scrollOptions.autostart == true || el.scrollOptions.autostart == "true")
            EB.scroller.start(el.id);
            
        
    },

    scroll: function(el) {
        
        var options = el.scrollOptions;
        var delay = options.delay;

        if (options.stepsize == "child") {
            if (el.scrollOptions.scrollstyle == "vertical")
                el.scrollTop = 0; else el.scrollLeft = 0;
            
            el.appendChild(el.childNodes[0]);
            if (options.itemdelay > 0)
                delay = options.itemdelay;

            if (el.status == "stop") return;
        } else {
            if (el.scrollOptions.scrollstyle == "vertical") {

                var s = parseInt(options.stepsize);
                el.scrollTop += s;
                if (s > 0 && el.scrollTop > el.childNodes[0].offsetHeight) {
                    // scrolling down: the first item has gone out of sight.
                    el.scrollTop -= el.childNodes[0].offsetHeight;
                    el.appendChild(el.childNodes[0]);
                
                    if (options.itemdelay > 0) {
                        delay = options.itemdelay;
					}
                    if (el.status == "stop") return;
                
                } else if (s < 0 && el.scrollTop <= 0) {
                    // scrolling up: the first item is fully into sight: append element to top.
                    el.insertBefore(el.childNodes[el.childNodes.length-1], el.childNodes[0]);
                    el.scrollTop += el.childNodes[0].offsetHeight;

                    if (options.itemdelay > 0) {
                    	delay = options.itemdelay;
					}
                    if (el.status == "stop") return;
                }
            } else {
			
                var s = parseInt(options.stepsize);
                el.scrollLeft += s;
                var add = el.childNodes[0].currentStyle?(parseInt(el.childNodes[0].currentStyle.paddingLeft)):0;
                
                if (s > 0 && el.scrollLeft > el.childNodes[0].offsetWidth + add) {
                    // scrolling left: the first item has gone out of sight.
                    el.scrollLeft = -add;
                    //el.scrollLeft -= el.childNodes[0].offsetWidth + add;
                    el.appendChild(el.childNodes[0]);

                    if (options.itemdelay > 0)
                        delay = options.itemdelay;

                    if (el.status == "stop") return;
                
                } else if (s < 0 && el.scrollLeft <= 0) {
                    // scrolling right: the first item is fully into sight: append element to left.
                    el.insertBefore(el.childNodes[el.childNodes.length-1], el.childNodes[0]);
                    el.scrollLeft += el.childNodes[0].offsetWidth;

                    if (options.itemdelay > 0)
                         delay = options.itemdelay;

                    if (el.status == "stop") return;
                }
            }
        }
        
        el.timer = setTimeout(function(){EB.scroller.scroll(el);}, delay);
    },

    start: function(id) {
        var el = document.getElementById(id);
        if (el.status == "start") return;
        el.status = "start";
        EB.scroller.scroll(el);
    },

	pause: function(id) {	
        var el = document.getElementById(id);
		if (el.timer) {
			clearTimeout(el.timer);	
			el.timer = 0;
			el.oldstatus = el.status;
			el.status = "pause";
		}
	},
	
	resume: function(id) {
        var el = document.getElementById(id);
		if (el.status == "pause") {
			el.status = el.oldstatus;
	        el.timer = setTimeout(function(){EB.scroller.scroll(el);}, el.scrollOptions.delay);
		}
	},
	
    stop: function(id) {
        var el = document.getElementById(id);
        el.status = "stop";
    },

    toggle: function(id) {
        var el = document.getElementById(id);
        if (el.status == "stop")EB.scroller.start(id);
        else EB.scroller.stop(id);
    },

    reverse: function(id) {
        var el = document.getElementById(id);
        el.scrollOptions.stepsize = -el.scrollOptions.stepsize;
    },

    next: function(id, start_timeout) {
        var el = document.getElementById(id);
        el.scrollOptions.stepsize = Math.abs(el.scrollOptions.stepsize);
        el.status = "start";
        EB.scroller.scroll(el);
        el.status = "stop";
        if(start_timeout) setTimeout(function(){EB.scroller.start(id);}, start_timeout);
    },
    
    prev: function(id, start_timeout) {
        var el = document.getElementById(id);
        el.scrollOptions.stepsize = -Math.abs(el.scrollOptions.stepsize);
        el.status = "start";
        EB.scroller.scroll(el);
        EB.scroller.start(id);
        el.status = "stop";
        if(start_timeout) setTimeout(function(){EB.scroller.start(id);}, start_timeout);
    }

   
    
};


