    function right () {
        if (this.px_position + this.carousel_size < this.ul_width) {
            this.x_move = this.xli_array[this.li_position];
            this.px_position = this.px_position + this.xli_array[this.li_position];
            idx = this.li_position+1;

            while (this.x_move + this.xli_array[idx] <= this.carousel_size) {
                this.x_move = this.x_move + this.xli_array[idx];
                this.px_position = this.px_position + this.xli_array[idx];
                ++idx;
                ++this.li_position;
            };
            ++this.li_position;
            if (this.px_position + this.x_move > this.ul_width) {
                this.x_move = this.ul_width - this.px_position;
                this.px_position = this.ul_width - this.carousel_size;
            };
            var obj_tmp = $(this.carousel_next);
            var obj_tmp_parent = $(this.carousel_next).parentNode;
            var content_tmp = obj_tmp_parent.innerHTML

            var disable_clik =  function () {$(obj_tmp).writeAttribute('onclick','return false;'); };
            var enable_clik = function () {$(obj_tmp_parent).update(content_tmp); };

            new Effect.Move(this.li_container, { x: -this.x_move, y: 0, mode: 'relative',
                                                 beforeStart:disable_clik,
                                                 afterFinish:enable_clik
                                               });

        }
        else {
            var obj_tmp = $(this.carousel_next);
            var obj_tmp_parent = $(this.carousel_next).parentNode;
            var content_tmp = obj_tmp_parent.innerHTML

            var disable_clik =  function () {$(obj_tmp).writeAttribute('onclick','return false;'); };
            var enable_clik = function () {$(obj_tmp_parent).update(content_tmp); };

            new Effect.Move(this.li_container, { x: -10, y: 0, mode: 'relative', duration:0.1, queue:'end',
                                                 beforeStart:disable_clik
                                                });
            new Effect.Move(this.li_container, { x: 10, y: 0, mode: 'relative', duration:0.1, queue:'end',
                                                 afterFinish:enable_clik
                                                });
        };
    };

    function left () {
        if (this.li_position > 0) {
            // recalculate li_position
            var tmp = 0;
            for (i=0; i <= this.xli_array.length; ++i) {
                tmp = tmp + this.xli_array[i];
                if (tmp >= this.px_position) {
                    break;
                }
            }
            this.li_position = i;

            this.x_move = this.xli_array[this.li_position];
            this.px_position = this.px_position - this.xli_array[this.li_position];
            idx = this.li_position;
            while (true) {
                --idx;
                if (this.x_move + this.xli_array[idx] <= this.carousel_size) {
                    --this.li_position;
                    this.x_move = this.x_move + this.xli_array[idx];
                    this.px_position = this.px_position - this.xli_array[idx];
                }
                else { break; }
            };
            ++idx;
            var obj_tmp = $(this.carousel_back);
            var obj_tmp_parent = $(this.carousel_back).parentNode;
            var content_tmp = obj_tmp_parent.innerHTML

            var disable_clik =  function () {$(obj_tmp).writeAttribute('onclick','return false;'); };
            var enable_clik = function () {$(obj_tmp_parent).update(content_tmp); };

            new Effect.Move(this.li_container, { x: this.x_move, y: 0, mode: 'relative',
                                                 beforeStart:disable_clik,
                                                 afterFinish:enable_clik
                                               });
        }
        else {
            var obj_tmp = $(this.carousel_back);
            var obj_tmp_parent = $(this.carousel_back).parentNode;
            var content_tmp = obj_tmp_parent.innerHTML

            var disable_clik =  function () {$(obj_tmp).writeAttribute('onclick','return false;'); };
            var enable_clik = function () {$(obj_tmp_parent).update(content_tmp); };
            
            new Effect.Move(this.li_container, { x: 10, y: 0, mode: 'relative', duration:0.1, queue:'end',
                                                 beforeStart:disable_clik
                                                });
            new Effect.Move(this.li_container, { x: -10, y: 0, mode: 'relative', duration:0.1, queue:'end',
                                                 afterFinish:enable_clik
                                                });
        };
    };

    function horizontal_carousel (carousel_container,li_container,carousel_back,carousel_next) {
        this.carousel_back= carousel_back;
        this.carousel_next= carousel_next;
        this.li_container = li_container;
        this.carousel_container_object = $(carousel_container);
        this.li_container_object = $(li_container);

        this.ul_width = 0;
        this.xli_array = new Array();
        for (i=0; i<this.li_container_object.getElementsByTagName('li').length; ++i) {
            var current_li_element = this.li_container_object.getElementsByTagName('li')[i];
            this.ul_width = parseInt(this.ul_width) + parseInt($(current_li_element).getWidth());
            this.xli_array[i] = parseInt($(current_li_element).getWidth());
        };
        this.li_container_object.setStyle({width:this.ul_width + 'px'});

        this.carousel_size = parseInt(this.carousel_container_object.getWidth());

        this.li_position = 0;
        this.px_position = 0;
        this.right = right;
        this.left = left;

    };
    function down () {
        if (this.px_position + this.carousel_size < this.ul_height) {
            this.y_move = this.yli_array[this.li_position]
            this.px_position = this.px_position + this.yli_array[this.li_position]
            idx = this.li_position+1
            while (this.y_move + this.yli_array[idx] <= this.carousel_size) {
                this.y_move = this.y_move + this.yli_array[idx]
                this.px_position = this.px_position + this.yli_array[idx]
                ++idx
                ++this.li_position
            }
            ++this.li_position
            if (this.px_position + this.y_move > this.ul_height) {
                this.y_move = this.ul_height - this.px_position
                this.px_position = this.ul_height - this.carousel_size
            }
            var obj_tmp = $(this.carousel_down);
            var obj_tmp_parent = $(this.carousel_down).parentNode;
            var content_tmp = obj_tmp_parent.innerHTML

            var disable_clik =  function () {$(obj_tmp).writeAttribute('onclick','return false;'); };
            var enable_clik = function () {$(obj_tmp_parent).update(content_tmp); };
            
            new Effect.Move(this.li_container, { x: 0, y: -this.y_move, mode: 'relative', 
                                                 beforeStart:disable_clik,
                                                 afterFinish:enable_clik
                                               });
        }
        else {
            var obj_tmp = $(this.carousel_down);
            var obj_tmp_parent = $(this.carousel_down).parentNode;
            var content_tmp = obj_tmp_parent.innerHTML

            var disable_clik =  function () {$(obj_tmp).writeAttribute('onclick','return false;'); };
            var enable_clik = function () {$(obj_tmp_parent).update(content_tmp); };
            new Effect.Move(this.li_container, { x: 0, y: -10, mode: 'relative', duration:0.1, queue:'end',
                                                 beforeStart:disable_clik
                                                });
            new Effect.Move(this.li_container, { x: 0, y: 10, mode: 'relative', duration:0.1, queue:'end',
                                                 afterFinish:enable_clik
                                                });
        }
    }

    function up () {
        if (this.li_position > 0) {
            // recalculate li_position
            var tmp = 0
            for (i=0; i <= this.yli_array.length; ++i) {
                tmp = tmp + this.yli_array[i]
                if (tmp >= this.px_position) {
                    break;
                }
            }
            this.li_position = i

            this.y_move = this.yli_array[this.li_position]
            this.px_position = this.px_position - this.yli_array[this.li_position]
            idx = this.li_position
            while (true) {
                --idx
                if (this.y_move + this.yli_array[idx] <= this.carousel_size) {
                    --this.li_position
                    this.y_move = this.y_move + this.yli_array[idx]
                    this.px_position = this.px_position - this.yli_array[idx]
                }
                else { break }
            }
            ++idx
            var obj_tmp = $(this.carousel_up);
            var obj_tmp_parent = $(this.carousel_up).parentNode;
            var content_tmp = obj_tmp_parent.innerHTML

            var disable_clik =  function () {$(obj_tmp).writeAttribute('onclick','return false;'); };
            var enable_clik = function () {$(obj_tmp_parent).update(content_tmp); };
            new Effect.Move(this.li_container, { x: 0, y: this.y_move, mode: 'relative',
                                                 beforeStart:disable_clik,
                                                 afterFinish:enable_clik  
                                               });

        }
        else {
            var obj_tmp = $(this.carousel_up);
            var obj_tmp_parent = $(this.carousel_up).parentNode;
            var content_tmp = obj_tmp_parent.innerHTML

            var disable_clik =  function () {$(obj_tmp).writeAttribute('onclick','return false;'); };
            var enable_clik = function () {$(obj_tmp_parent).update(content_tmp); };
            new Effect.Move(this.li_container, { x: 0, y: 10, mode: 'relative', duration:0.1, queue:'end',
                                                 beforeStart:disable_clik
                                                });
            new Effect.Move(this.li_container, { x: 0, y: -10, mode: 'relative', duration:0.1, queue:'end',
                                                 afterFinish:enable_clik
                                                });
        }
    }

    function vertical_carousel (carousel_container,li_container,carousel_up,carousel_down) {
        this.carousel_up= carousel_up
        this.carousel_down= carousel_down
        this.li_container = li_container
        this.carousel_container_object = $(carousel_container)
        this.li_container_object = $(li_container)

        this.ul_height = 0
        this.yli_array = new Array()
        for (i=0; i<this.li_container_object.getElementsByTagName('li').length; ++i) {
            var current_li_element = this.li_container_object.getElementsByTagName('li')[i]
            this.ul_height = parseInt(this.ul_height) + parseInt($(current_li_element).getHeight())
            this.yli_array[i] = parseInt($(current_li_element).getHeight())
        }
        this.li_container_object.setStyle({height:this.ul_height + 'px'})

        this.carousel_size = parseInt(this.carousel_container_object.getHeight())

        this.li_position = 0
        this.px_position = 0
        this.down = down
        this.up = up
    }
