/**
* Scrollable view
*/
var ui = ui || {};
ui.Scroller = function(direction, domElement, prevElement, nextElement, labelElement, callback)
{
    var self = this;
    var $ = jQuery;
    var view = $(domElement);
    if (prevElement) var prevBtn = typeof(prevElement) == "string" ? view.find(prevElement) : $(prevElement);
    if (nextElement) var nextBtn = typeof(nextElement) == "string" ? view.find(nextElement) : $(nextElement);
    if (labelElement) var indexLabel = typeof(labelElement) == "string" ? view.find(labelElement) : $(labelElement);
    var isVert = (direction == ui.Scroller.VERTICAL);
    var scroll = 0;
    var scrollProp = isVert ? "top" : "left";
    var pageSize = 1;
    var maxScroll = 0;
    var itemSize;
    
    this.domElement = domElement;
    this.prevElement = prevElement;
    this.nextElement = nextElement;
	
	this.onScroll = null;
    
    this.makeImageFromAnchor = false;
    this.btEnabled = { opacity:1, cursor:"pointer" };
    this.btDisabled = { opacity:0.5, cursor:"default" };
    
    /* SETUP */
    
    var container = view.find("ul");
    var viewWidth = container.width();
    var viewHeight = container.height();
    var viewFloat = container.css("float");
    
    container = container.wrap("<div></div>").parent();
    var items = container.find("li");
    container.css({ position:"relative", overflow:"hidden", width:viewWidth, height:viewHeight, "float":viewFloat });
    container.find("ul").css({ position:"absolute", overflow:"visible", width:"auto", height:"auto" });
    
    if (isVert)
    {
        itemSize = items.height();
        pageSize = Math.floor((viewHeight + 5) / itemSize);
    }
    else 
    {
        itemSize = items.width();
        pageSize = Math.floor((viewWidth + 5) / itemSize);
    }
    maxScroll = items.length - pageSize;
    
    if (isVert)
    {
        items.css({ position:"absolute" })
            .each(function(index) {
                $(this).css({ top:itemSize * index });
            });
    }
    else 
    {
        items.css({ position:"absolute" })
            .each(function(index) {
                $(this).css({ left:itemSize * index });
            });
    }
    
    if (prevBtn && prevBtn.length) prevBtn.click(scrollPrev);
    if (nextBtn && nextBtn.length) nextBtn.click(scrollNext);
    container.mousewheel(mousewheel);
    
    updateBtns();
    
    
    /* SCROLLING */
    
    function mousewheel(e, delta)
    {
        if (delta > 0) scrollPrev(e);
        else if (delta < 0) scrollNext(e);
    }
    
    function updateBtns()
    {
        if (prevBtn) prevBtn.css(scroll > 0 ? self.btEnabled : self.btDisabled);
        if (nextBtn) nextBtn.css(scroll < maxScroll ? self.btEnabled : self.btDisabled);
    }
    
    function scrollPrev(e)
    {
        e.preventDefault();
        $(e.target).blur();
        if (scroll <= 0) return;
        scroll--;
        smoothScroll();
    }
    function scrollNext(e)
    {
        e.preventDefault();
        $(e.target).blur();
        if (scroll >= maxScroll) return;
        scroll++;
        smoothScroll();
    }
    function smoothScroll()
    {
		if (indexLabel && indexLabel.length) indexLabel.html("" + (scroll  + 1));
        
        var item = $(view.find("li").get(scroll + pageSize - 1));
        if (item)
        {
            view.find("li:first").get(0).__current = item.get(0);
            
            item.css({ display:"block" });
            item.children().css({ display:"" });
            if (self.makeImageFromAnchor)
            {
                var anchor = item.children("a");
                if (anchor.length)
                {
                    var title = anchor.attr("title");
                    anchor.replaceWith('<img src="' + anchor.attr("href") + '" title="' + title + '" alt="' + title + '" />');
                }
            }
        }
        var prop = {};
        prop[scrollProp] = -(scroll * itemSize);
        view.find("ul").stop().animate(prop);
        
        updateBtns();
		
		if (self.onScroll) self.onScroll(scroll);
    }
	
	this.setScroll = function(value)
	{
		if (value < 0) value = 0;
		if (value > maxScroll) value = maxScroll;
		if (scroll == value) return;
		scroll = value;
		smoothScroll();
	}
}

ui.Scroller.VERTICAL = "v";
ui.Scroller.HORIZONTAL = "h";

