﻿Type.registerNamespace("Atlantis");

var atlpb_loopIteration = 0;

Atlantis.ProductBrowser = function(listName, containerName, listItemClassName) {
    Atlantis.ProductBrowser.initializeBase(this);
    
    this._listName = listName;
    this._list = $get(this._listName);
    
    this._containerName = containerName;
    var container = $get(this._containerName);
    this._listItems = container.getElementsByTagName("li");
    this._listItemsOffSetLeft = Array();
    var listItemsOffSetTop = this._listItems[0].offsetTop;
    for(var i=0; i<this._listItems.length; i++){
        this._listItemsOffSetLeft.push(this._listItems[i].offsetLeft);
    }
    for(var j=0; j<this._listItems.length; j++){
        this._listItems[j].style.cssFloat="none";
        this._listItems[j].style.styleFloat="none";
        this._listItems[j].style.position="absolute";
        Sys.UI.DomElement.setLocation(this._listItems[j], this._listItemsOffSetLeft[j], listItemsOffSetTop);
    }
    this._listItemClassName = listItemClassName;
    
    this._sliderVal = 0;
    this._arrowScrollAmount = 0.24;
    this._overlap = 0;
    this._animationId = false;
        
    var viewportWidth = Sys.UI.DomElement.getBounds(container).width;
    var offsetImageWidth = Sys.UI.DomElement.getBounds(this._listItems[0]).width - this._overlap;
    this._contentWidth = offsetImageWidth * this._listItems.length;
    this._offsetContentWidth = -1 * (this._contentWidth - viewportWidth);
}

Atlantis.ProductBrowser.prototype = {
   
    getSliderVal: function() {
        return this._sliderVal;
    },
    
    getArrowScrollAmount: function() {
        return this._arrowScrollAmount;
    },
   
    getContentWidth: function() {
        return this._contentWidth;
    },
   
    animateSlide : function(toX, interval) {
        window.clearInterval(this._animationId);
        this._sliderVal=this._fixtoX(toX);
        var stopPoint=this._getStopPoint(this._sliderVal,this._offsetContentWidth);
        var list = this._list;
        var animationId;
        this._animationId = animationId = window.setInterval(function(){
            var x = Atlantis.ProductBrowser.prototype._calculateDecel(list.offsetLeft, stopPoint);
            list.style.left=x+"px";
            if(x==stopPoint)
                window.clearInterval(animationId);
        },interval)
    },
    
    slide : function(toX, interval) {
        window.clearInterval(this._animationId);
        var stopPoint=this._getStopPoint(this._fixtoX(toX),this._offsetContentWidth);
        var step = 1;
        var list = this._list;
        var offsetContentWidth = this._offsetContentWidth;
        if (this._list.offsetLeft > stopPoint)
            step = -1;
        var animationId;
        this._animationId = animationId = window.setInterval(function(){
            var x = list.offsetLeft + step;
            if(x>=0 || x<=offsetContentWidth)
                window.clearInterval(animationId);
            else
                list.style.left=x+"px";                    
        },interval)
    },
    
    loop : function(toX, interval, scrollWidth) {
        window.clearInterval(this._animationId);
        var stopPoint=this._getStopPoint(this._fixtoX(toX),this._offsetContentWidth);
        var step = scrollWidth;
        var list = this._list;
        var offsetContentWidth = this._offsetContentWidth;
        var listItems = this._listItems;
        var imageWidth = Sys.UI.DomElement.getBounds(this._listItems[0]).width;
        var listItemsOffSetLeft = this._listItemsOffSetLeft;
        if (this._list.offsetLeft > stopPoint)
            step *= -1;
        var animationId;
      
        this._animationId = animationId = window.setInterval(function(){
            var x = list.offsetLeft + step;
            if(x <= (imageWidth*-1)) {
                atlpb_loopIteration = (atlpb_loopIteration+1)%listItems.length;
                _shiftItems(atlpb_loopIteration);
                list.style.left="0px";  
            }
            else {
                if(x >= 0) {
                    atlpb_loopIteration = (atlpb_loopIteration-1)%listItems.length;
                    _shiftItems(atlpb_loopIteration);
                    list.style.left=(imageWidth * -1)+"px";
                }
                else
                    list.style.left=x+"px";
            }
        },interval)
        
        function _shiftItems(times){
            var imageNewPosition;
            for (var i=0; i<listItems.length; i++){
                imageNewPosition = (i + times)%listItems.length;
                if (imageNewPosition < 0)
                    imageNewPosition = imageNewPosition + listItems.length
                listItems[imageNewPosition].style.left=listItemsOffSetLeft[i]+"px";
            }
        }
    },
    
    jump: function(step){         
        var list = this._list;
        var listItems = this._listItems;
        var listItemsOffSetLeft = this._listItemsOffSetLeft;
        atlpb_loopIteration = (atlpb_loopIteration + step)%listItems.length;
        _shiftItems(atlpb_loopIteration);  
         
        function _shiftItems(times){
            var imageNewPosition;
            for (var i=0; i<listItems.length; i++){
                imageNewPosition = (i + times)%listItems.length;
                if (imageNewPosition < 0){
                    imageNewPosition = imageNewPosition + listItems.length;
                }               
                listItems[imageNewPosition].style.left = listItemsOffSetLeft[i]+"px";
            }
        }
    },   
    
    
    move : function(toX) {
        window.clearInterval(this._animationId);
        this._sliderVal=this._fixtoX(toX);
        var stopPoint=this._getStopPoint(this._sliderVal,this._offsetContentWidth);
        if(stopPoint>=this._offsetContentWidth && stopPoint<=0){
            this._list.style.left=stopPoint+"px";
        }
    },
    
    cancelMovement : function() {
        window.clearInterval(this._animationId);
    },

    _getStopPoint: function(toX, offset) {
        if(toX>1)toX=1;
        if(toX<0)toX=0;
        return offset*toX;
    },
    
    _calculateDecel: function(from,to){
        var n = from - Math.floor((from-to)*.4);

        if(Math.abs(from-to)<4)
            return to;
        else 
            return n;
    },
    
    _fixtoX: function(toX){
        if(toX>1)toX=1;
        if(toX<0)toX=0;
        return toX;  
    }
}

Atlantis.ProductBrowser.registerClass("Atlantis.ProductBrowser");

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
