EB.scroller = {
    options: [],
    
	create: function(el) {

        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, updatenumber: null } );
		if(typeof el.scrollOptions.itemdelay == "string") el.scrollOptions.itemdelay = parseInt(el.scrollOptions.itemdelay);

        // mouseover_pause option
		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); });
		}  
		
        // 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 {
            }
        }
        for (var i=0; i<el.childNodes.length; i++) {
		el.childNodes[i].setAttribute("number", el.childNodes.length-i);
	}	

        if (!el.childNodes.length) { alert('EB.scroller: no child nodes...'); return; }
        
        // floats
        if (el.scrollOptions.usefloats == "true") {

            var s = document.createElement("SPAN");
            s.style.display = "block";
            var w = 0;
            while (el.childNodes.length) {
                w += el.childNodes[el.childNodes.length-1].offsetWidth;
                s.appendChild(el.childNodes[el.childNodes.length-1]);
            }
            el.appendChild(s);
            s.style.width = w+"px";

            el.nodesNode = s;
            
        } else {
            el.nodesNode = el;
        }
        
        // for (var i=0; i<el.nodesNode.childNodes.length; i++) { el.nodesNode.childNodes[i].style.visibility = "visible"; }

        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.nodesNode.offsetWidth) {
            /*
                var l = el.nodesNode.childNodes.length;
                var w = 0;
                for (var i=0; i<l; i++) {
                    var e = el.nodesNode.childNodes[i].cloneNode(true);
                    w += e.offsetWidth;
                    el.nodesNode.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);
        
        
    },

    childheight: function (el, i) {
        if (el.table)
            return el.scrollOptions.scrollstyle=="horizontal"?el.table.rows[0].childNodes[i].offsetHeight:el.table.rows[i].offsetHeight;
        return el.childNodes[i].offsetHeight;
    },
    
    childwidth: function (el, i) {
        if (el.table)
            return el.scrollOptions.scrollstyle=="horizontal"?el.table.rows[0].childNodes[i].offsetWidth:el.table.rows[i].offsetWidth;
        return el.childNodes[i].offsetWidth;
    },
    
    scroll: function(el) {
        
        var options = el.scrollOptions;
        var delay = options.delay;
        el.atItem = false;
        
        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;

            el.atItem = true;
        } 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;
					}
                    el.atItem = true;
                
                } 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;
					}
                    el.atItem = true;
                }
            } else {
			
                var s = parseInt(options.stepsize);
                el.scrollLeft += s;
                
                //var add = el.childNodes[0].currentStyle?(parseInt(el.childNodes[0].currentStyle.paddingLeft)):0;
                var add = 0;
                
                if (s > 0 && el.scrollLeft > el.nodesNode.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.nodesNode.appendChild(el.nodesNode.childNodes[0]);

                    if (options.itemdelay > 0)
                        delay = options.itemdelay;

                    el.atItem = true;
                
                } else if (s < 0 && el.scrollLeft <= 0) {
                    // scrolling right: the first item is fully into sight: append element to left.
                    el.nodesNode.insertBefore(el.nodesNode.childNodes[el.nodesNode.childNodes.length-1], el.nodesNode.childNodes[0]);
                    el.scrollLeft += el.nodesNode.childNodes[0].offsetWidth;

                    if (options.itemdelay > 0)
                         delay = options.itemdelay;

                    el.atItem = true;
                }
            }
        }


        if (el.atItem && !el.first && el.scrollOptions.updatenumber) {
            document.getElementById(el.scrollOptions.updatenumber).innerHTML = el.nodesNode.childNodes[0].getAttribute("number")+"";
        }

        if (el.atItem && el.status == "stop") return;
        el.first = false;
        
        clearTimeout(el.timer);
        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";
        el.first = true;
        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;
            if (el.status != "stop" || !el.atItem)
                el.timer = setTimeout(function(){EB.scroller.scroll(el);}, el.scrollOptions.delay);
		}
	},
	
    stop: function(id) {
        var el = document.getElementById(id);
        el.first = true;
        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.first = true;
        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.first = true;
        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);
    }

   
    
};
