(function($) {
$.fn.jHorizontalScroller = function(o) {
    var o = $.extend({
        btnPrev: null,
        btnNext: null,
        activeClass: 'active',
        container: null,
        block: null,
        speed: 200,
        start: 0,
        scroll: 1,
        center: false,
        navigation: null,
        navigationClass: 'hs_dot',
        navigationActiveClass: 'hs_dot_active',
        unlimited: true
    }, o || {});

    return this.each(function() {
        var running = false;
        var dots_active = false;

        var dots_bar = null;

        var obj = $(this);
        var curr = 0;
        var container = $(o.container, obj).eq(0);
        var block = $(o.block, container);
        var btnNext = $(o.btnNext, obj);
        var btnPrev = $(o.btnPrev, obj);
        var blockCount = block.size();

        if (blockCount == 0)
        	return;

        if (o.center)
        	curr = Math.floor(blockCount / 2);

        var blockWidth = width(block);
        var blockHeight = height(block);

        var dots = new Array(blockCount);

        container.css({
        	overflow: 'hidden',
        	width: blockWidth + "px",
        	height: blockHeight + "px",
        	position: 'relative'
        });

        block.css({
        	float: 'left'
        });

        var html = container.html();
        container.empty();

        var containerIn = $('<div>').appendTo(container);

        containerIn.css({
        	width: blockWidth * blockCount + "px",
        	height: blockHeight,
        	position: 'absolute',
        	left: -(curr * blockWidth)
        });

		containerIn.html(html);

		if (btnPrev) {
			btnPrev.click(function(event) {
				event.preventDefault();
				return go(curr - 1);
			});

			if (curr > 0 || (o.unlimited && blockCount > 1))
				btnPrev.addClass(o.activeClass);
		}

		if (btnNext) {
			btnNext.click(function(event) {
				event.preventDefault();
				return go(curr + 1);
			});

			//if (blockCount > 1)
			if (curr < blockCount)
				btnNext.addClass(o.activeClass);
		}

		if (o.navigation) {
        	dots_bar = $(o.navigation, obj);

        	if (dots_bar) {
        		dots_active = true;

        		for (var n = blockCount - 1; n >= 0; n--) {
					dots[n] = $('<span>').addClass(o.navigationClass).prependTo(dots_bar);

					if (n == curr)
						dots[n].addClass(o.navigationActiveClass);

					dots[n].bind('mouseover', {num: n}, function(event) {if (event.data.num != curr) $(this).addClass(o.navigationActiveClass)});
					dots[n].bind('mouseout', {num: n}, function(event) {if (event.data.num != curr) $(this).removeClass(o.navigationActiveClass)});

					dots[n].bind('click', {num: n}, function (event) {
						go(event.data.num);
					});
        		}
        	}
        }

		function go(to) {
            if (!running) {
            	if (o.unlimited) {
            		if (to < 0)
            			to = blockCount - 1;
            		else if (to >= blockCount)
            			to = 0;
            	} else if (to < 0 || to >= blockCount)
					return;

				if (dots_active) {
					dots[curr].removeClass(o.navigationActiveClass);
					dots[to].addClass(o.navigationActiveClass);
				}

				curr = to;

				if (btnPrev) {
                    if (to == 0 && !o.unlimited)
            			btnPrev.removeClass(o.activeClass);
            		else
            			btnPrev.addClass(o.activeClass);
                }

                if (btnPrev) {
        			if (to == blockCount - 1 && !o.unlimited)
        				btnNext.removeClass(o.activeClass);
        			else
        				btnNext.addClass(o.activeClass);
                }

                running = true;

                containerIn.animate({left: -(curr * blockWidth)}, o.speed, null,
                    function() {
                        running = false;
                    }
                );
            }

            return false;
        }
    });
};

function width(el) {
     return el[0].offsetWidth/* + parseInt(el.css('margin-left')) + parseInt(el.css('margin-right'))*/;
};
function height(el) {
    return el[0].offsetHeight/* + parseInt(el.css('margin-top')) + parseInt(el.css('margin-bottom'))*/;
};

})(jQuery);
