var sandstorm = sandstorm ||
{}
sandstorm.scrollview = {};

sandstorm.scrollview.HorizontalScrollView = function(target, object)
{
    this.delegate = typeof object.delegate == "undefined" ? null : object.delegate;
    this.element = target;
    this.pagesize = object.pageWidth;
    this.totalPages = object.totalPages;
    this.totalWidth = this.pagesize * this.totalPages;
    this.direction = null;
    this.startX = 0;
    this.pageNumber = 0;
    this.lastPlacedTouch = null;
    this.ulStartX = target.style.left.replace('px', '');
    this.elementWidth = target.style.width.replace('px', '');
    this.isVerticalScrolling = false;
    this.MIN_TRACKING_FOR_DRAG = 15;
    this.PERCENT_CHANGE_THRESHOLD = 15;
    this.MOMENTUM_TIMING_FUNCTION = 'cubic-bezier(0.33, 0.66, 0.47, 1)';

    //if (sandstorm.application.currentDevice.platform == sandstorm.useragent.devicePlatform.iOS ||
    //    sandstorm.application.currentDevice.platform == sandstorm.useragent.devicePlatform.Android)
    // {
    // set up listeners
    target.addEventListener('touchstart', this, false);
    target.addEventListener('touchmove', this, false);
    target.addEventListener('touchend', this, false);
    // }


}



sandstorm.scrollview.HorizontalScrollView.prototype.handleEvent = function(e)
{
    switch (e.type)
    {
        case "touchstart":
            this.onTouchStart(e);
            var scope = this;
            break;

        case "touchmove":
            this.onTouchMove(e);
            break;

        case "touchend":
            this.onTouchEnd(e);
            break;
    }
}

sandstorm.scrollview.HorizontalScrollView.prototype.onTouchStart = function(e)
{
    this.startX = e.touches[0].clientX;
    this.lastPlacedTouch = e.touches[0].clientX;
    this.ulStartX = this.leftPos();
}

sandstorm.scrollview.HorizontalScrollView.prototype.onTouchMove = function(e)
{
    this.lastPlacedTouch = e.touches[0].clientX;
    var newOffsetX = this.startX - e.touches[0].clientX;

    this.direction = this.startX - this.lastPlacedTouch > 0 ? 1 : -1;
    if (this.isDragging(newOffsetX))
    {
        var nextPosition = this.ulStartX - newOffsetX;
        var nextPage = (nextPosition * -1 / this.pagesize);

        nextPage = (this.lastPlacedTouch > this.startX) ? Math.ceil(nextPage) : Math.floor(nextPage);

        this.animateTo(nextPosition);

        if (nextPage != this.pageNumber)
        {
            if (this.delegate && typeof this.delegate.scrollViewShouldChangePage != "undefined")
            {
                if (this.delegate.scrollViewShouldChangePage(this, nextPage, this.totalPages))
                {
                    this.pageNumber = nextPage;
                }
            }
            else
            {
                this.pageNumber = nextPage;
            }

        }
        if (this.delegate && typeof this.delegate.scrollViewDidChange != "undefined") this.delegate.scrollViewDidChange(this)

    }

    var changeX = this.startX - e.touches[0].clientX;
    if (changeX > this.MIN_TRACKING_FOR_DRAG)
    {
        document.body.addEventListener('touchmove', this.disableNativeScrolling);
    }
}

sandstorm.scrollview.HorizontalScrollView.prototype.onTouchEnd = function(e)
{
    this.direction = null;
    document.body.removeEventListener('touchmove', this.disableNativeScrolling);
    this._isDragging = false;
    var leftPos = this.leftPos();
    leftPos = leftPos || 0;
    var dragChange = this.startX - this.lastPlacedTouch;

    if (leftPos == 0 && dragChange <= 0) return;

    var dragPercent = Math.abs(dragChange / this.pagesize * 100);

    if (dragPercent >= this.PERCENT_CHANGE_THRESHOLD)
    {
		// which way were we going:
		var direction = ((dragChange / this.pagesize) * 100) > 0 ? 1 : -1;
		var nextPage = this.pageNumber + direction;

		nextPage  = nextPage < 0 ? 0 : nextPage;
		nextPage  = nextPage > (this.totalPages - 1) ? (this.totalPages - 1) : nextPage;

		this.pageNumber = nextPage;
		this.animateTo((-1 * nextPage) * this.pagesize, 500);

		if (this.delegate && typeof this.delegate.scrollViewDidChange != "undefined") this.delegate.scrollViewDidChange(this);
		return;
    }
    var pageChange = Math.abs(Math.round(dragChange / this.pagesize));
    if (dragChange > 0)
    {
		var newxPos = this.ulStartX - this.pagesize * pageChange;
    }
    else
    {
		var newxPos = this.ulStartX + this.pagesize * pageChange;
    }

    var nextPage = Math.round((newxPos * -1) / this.pagesize); // we have to flip the sign to get a proper page representation
    //this.pageNumber = Math.round(Math.abs(newxPos) / this.pagesize);

    if (this.delegate && typeof this.delegate.scrollViewShouldChangePage != "undefined")
    {
		var currentPage = this.pageNumber;
        if (this.delegate.scrollViewShouldChangePage(this, nextPage, this.totalPages))
        {
            this.pageNumber = nextPage;
        }
    }
    else
    {
        if (this.pageNumber >= this.totalPages - 1)
        {
            this.pageNumber = this.totalPages - 1;
        }
    }

    this.animateTo(-this.pageNumber * this.pagesize, 500);
    if (this.delegate && typeof this.delegate.scrollViewDidChange != "undefined") this.delegate.scrollViewDidChange(this);



    var callback = null;
    if (this.delegate && typeof this.delegate.onScrollComplete)
    {
        callback = this.delegate.onScrollComplete;
    }

	var target = this.element;
	var scope  = this.delegate;
    this.element.addEventListener("webkitTransitionEnd", function()
    {
        return function()
        {
			if(callback) callback(scope);
            target.removeEventListener("webkitTransitionEnd", arguments.callee);
        }
    }())

}


sandstorm.scrollview.HorizontalScrollView.prototype.disableNativeScrolling = function(e)
{
    e.preventDefault();
}

sandstorm.scrollview.HorizontalScrollView.prototype.isDragging = function(touchX)
{
    if (this._isDragging) return this._isDragging;
    if (touchX)
    {
        if (Math.abs(touchX) > this.MIN_TRACKING_FOR_DRAG)
        {
            this._isDragging = true;
            return this._isDragging;
        }
    }
    return false;
}

sandstorm.scrollview.HorizontalScrollView.prototype.leftPos = function()
{
    var xPropStr = $(this.element).css("-webkit-transform");
    var tempArr = xPropStr.split(",");
    var xTransform = tempArr[4];
    xTransform = xTransform ? xTransform : 0;
    var leftPos = this.element.style.left.replace('px', '');

    //if (sandstorm.application.currentDevice.platform == "ios")
    //{
    leftPos = xTransform;
    //}

    return parseInt(leftPos, 10);
}


sandstorm.scrollview.HorizontalScrollView.prototype.animateTo = function(offsetX, duration)
{
    if($.browser.webkit){
	    duration = duration != undefined ? duration : 0;
	    this.element.style.webkitTransition = '-webkit-transform ' + duration + 'ms ';
	    this.element.style.webkitTransform = 'translate3d(' + offsetX + 'px, 0, 0)';
    }
}

