/*

 HScrollArea    : Контроллер для прокрутки горизонтальной области.
 
 Createted By   : D. Akinshin
 Date           : 26.02.2009
 Dependences    : jquery, jquery.timers
  
    Параметры:
 
 areaClass          - css класс области, для прокрутки, у области должен быть 
                      внутренний контейнер DIV, 
                      например <div class='area'><div> Content </div></div>
                      
 rowCount           - кол-во строк
 addWidth           - добавочная ширина к внутреннему контейнеру(баг ИЕ) по умолчанию 50
 
 buttonRightClass   - css класс правой кнопки
 buttonLeftClass    - css класс левой кнопки
 
 moveTimeout        - время перемещения скрола на малый интервал, в милисекундах (50)
 
 moveSmallStep      - значение малого интервала (2) (используется при перекрытии)
 moveBigStep        - значение большого интервала (150) (используется при клике)
 moveBigStepOverflow- анимация для большого интервала т.е + интервал, - интервал
 
 eventStart         - событие для старта: 'click','over', или оба 'click,over'
 buttonRightHtml    - html правой кнопки (&nbsp;)
 buttonLeftHtml     - html левой кнопки (&nbsp;)
 widthInPercent     - ширина прокрутки в процентах(0)
    Пример использования: 
 
  hsArea1=new HScrollArea({
            areaClass : 'area',
            rowCount:2,
            addWidth:50,
            moveTimeout:20,
            moveSmallStep:5,
            moveBigStep:150,
            eventStart:'click,over',
            buttonRightClass:'right',
            buttonLeftClass:'left',
            buttonRightHtml:'<div>&nbsp;</div>',
            buttonLeftHtml:'<div>&nbsp;</div>',
            widthInPercent:70
            });
*/
function HScrollArea(Args)
{
    var me=this;
    if( Args==undefined) return;
    
    var areaClass=Args.areaClass==undefined?'area':Args.areaClass;
    
    var buttonRightClass=Args.buttonRightClass==undefined?'right':Args.buttonRightClass;
    var buttonLeftClass=Args.buttonLeftClass==undefined?'left':Args.buttonLeftClass;
    var buttonRightHtml=Args.buttonRightHtml==undefined?'&nbsp;':Args.buttonRightHtml;
    var buttonLeftHtml=Args.buttonLeftHtml==undefined?'&nbsp;':Args.buttonLeftHtml;
    
    var rowCount=Args.rowCount==undefined?1:Args.rowCount;
    var addWidth=Args.addWidth==undefined?50:Args.addWidth;
    var moveTimeout=Args.moveTimeout==undefined?50:Args.moveTimeout;
    var moveSmallStep=Args.moveSmallStep==undefined?2:Args.moveSmallStep;
    var moveBigStep=Args.moveBigStep==undefined?150:Args.moveBigStep;
    var moveBigStepOverflow=Args.moveBigStepOverflow==undefined?Math.floor(moveBigStep/5):Args.moveBigStepOverflow;
    var widthInPercent=Args.widthInPercent==undefined?0:Args.widthInPercent;
    
    var eventStart=Args.eventStart==undefined?'over,click':Args.eventStart;
    var containers=new Array();
    var speedBigStep=300;
    var speedBigStepOver=110;
    var canLeft=false;
    var canRight=false;
    
    HScrollArea.prototype.ButtonClick=function() {}
    HScrollArea.prototype.ButtonOver=function()
    {
        //alert($(this).hasClass(buttonLeftClass)+' '+this.className)
        if($(this).hasClass(buttonLeftClass)) 
        {
            if(!$(this).hasClass(buttonLeftClass+"_disable")) $(this).addClass(buttonLeftClass+"_over");
        }
        else 
        {
            
            if(!$(this).hasClass(buttonRightClass+"_disable"))  $(this).addClass(buttonRightClass+"_over");
        }
        
        if(eventStart.indexOf('over')==-1) return;
        
        var sl=$(this.scrollElement).find(':first');
        var SL=$(this.scrollElement);
        var nb=$(this.negativeButton);
        sl.scrollLeft(0);
        
        if($(this).hasClass(buttonLeftClass))
        {
            if(!canLeft) return;
            var curStep=Math.abs(parseInt(sl.css("margin-left")));
            var curTimeout=Math.floor(curStep*moveTimeout/moveSmallStep);
            
            sl.animate({marginLeft:parseInt(sl.css("margin-left"))+ curStep},
                        {duration:curTimeout,
                        complete:function()
                        {
                            me.UpdateButtonsStatesMargin(SL);
                        }
                        });
        }
        else
        {
            if(!canRight) return;
            var curStep=sl.outerWidth()+parseInt(sl.css("margin-left"))-SL.outerWidth();
            var curTimeout=Math.floor(curStep*moveTimeout/moveSmallStep);
            //alert(curStep+ ' '+curTimeout);
            
            sl.animate({marginLeft:parseInt(sl.css("margin-left"))- curStep},
                        {duration:curTimeout,
                        complete:function()
                        {
                            me.UpdateButtonsStatesMargin(SL);
                        }
                        });
            
        }
        
        //this.movestart();                
    }
    HScrollArea.prototype.ButtonOut=function()
    {
        if($(this).hasClass(buttonLeftClass)) $(this).removeClass(buttonLeftClass+"_over");
        else $(this).removeClass(buttonRightClass+"_over");
        
        if(eventStart.indexOf('over')==-1) return;
        this.movestop();
                
    }
    HScrollArea.prototype.ButtonDown=function()
    {
        if(eventStart.indexOf('click')==-1) return;
        var sl=$(this.scrollElement).find(':first');
        var SL=this.scrollElement;
        //alert(sl.size());
        var nb=$(this.negativeButton);
        //sl.css("position","relative");
        sl.scrollLeft(0);
        
        if($(this).hasClass(buttonLeftClass))
        {
            if(!canLeft) return;
            sl.animate({marginLeft:parseInt(sl.css("margin-left"))+ moveBigStep+moveBigStepOverflow}, speedBigStep,'swing',function()
                    {
                        $(this).animate({marginLeft:parseInt(sl.css("margin-left"))-moveBigStepOverflow}, speedBigStepOver,'swing',function()
                        {
                            if(parseInt(sl.css("margin-left"))>0) $(this).animate({marginLeft:0}, speedBigStepOver,'swing',
                                    function(){me.UpdateButtonsStatesMargin(SL);});
                            else
                                me.UpdateButtonsStatesMargin(SL);
                        });
                    });
        }
        else
        {
            if(!canRight) return;
            sl.animate({marginLeft:parseInt(sl.css("margin-left"))- moveBigStep-moveBigStepOverflow}, speedBigStep,'swing',function()
                    {
                        $(this).animate({marginLeft:parseInt(sl.css("margin-left"))+moveBigStepOverflow}, speedBigStepOver,'swing',function()
                        {
                            //alert(parseInt(sl.css("margin-left"))+' '+sl.outerWidth()+' '+sl.parent().outerWidth());
                            if(sl.outerWidth()+ parseInt(sl.css("margin-left"))<sl.parent().outerWidth()) 
                                $(this).animate({marginLeft:sl.parent().outerWidth()-sl.outerWidth()}, speedBigStepOver,'swing',
                                    function(){me.UpdateButtonsStatesMargin(SL);});
                            else
                                me.UpdateButtonsStatesMargin(SL);
                        });
                    });
        }
        //me.UpdateButtonsStatesMargin(this.scrollElement);
        //me.UpdateButtonsStates(sl.parent());
    }
    HScrollArea.prototype.ButtonUp=function(){}
    
    HScrollArea.prototype.ScrollToRight=function()
    {
        //if(this.hasStart==true) return;
        //alert(canRight);
        if(!canRight) return;
        //var t=$(this);
        //var t=this;
        //this.hasStart=true;
        
        //t.everyTime(moveTimeout,'t1',me.ScrollToRightAction);
        me.ScrollToRightAction();
    }
    HScrollArea.prototype.ScrollToRightAction=function()
    {
        //var sl=$(this.scrollElement);
        var sl=$(this.scrollElement).find(':first');
        alert(sl.html());
        var SL=this.scrollElement;
        //if(sl.scrollLeft()==sl.attr('scrollWidth')- sl.width()) 
            //this.movestop();            
        if(!canRight) return;
        //alert("Start");
        sl.animate({marginLeft:parseInt(sl.css("margin-left"))- moveSmallStep}, moveTimeout,'swing',function()
                    {
                        me.UpdateButtonsStatesMargin(SL);        
                    });
                    
        //sl.scrollLeft(sl.scrollLeft()+moveSmallStep);
        //me.UpdateButtonsStates(sl);
    }
    HScrollArea.prototype.ScrollToLeft=function()
    {
        if(this.hasStart==true) return;
        var t=$(this);
        this.hasStart=true;
        t.everyTime(moveTimeout,'t2',me.ScrollToLeftAction);
    }
    HScrollArea.prototype.ScrollToLeftAction=function()
    {
        var sl=$(this.scrollElement);
        if(sl.scrollLeft()==0)
            this.movestop();
            
        sl.scrollLeft(sl.scrollLeft()-moveSmallStep);
        me.UpdateButtonsStates(sl);
    }
    HScrollArea.prototype.ScrollStop=function()
    {
        //me.UpdateButtonsStates(this.scrollElement);
        //this.hasStart=false;
        var sl=$(this.scrollElement).find(':first');
        var SL=this.scrollElement;
        $(this).stopTime();        
        $(this).stop();
        sl.stop();
        me.UpdateButtonsStatesMargin(SL);
    }
    HScrollArea.prototype.InitButton=function(Elt,Button,NegButton)
    {
        Button.get(0).scrollElement=Elt;
        Button.get(0).negativeButton=NegButton;
        if(Button.hasClass(buttonLeftClass)) Button.get(0).movestart=me.ScrollToLeft;
        if(Button.hasClass(buttonRightClass)) Button.get(0).movestart=me.ScrollToRight;    
        Button.get(0).movestop=me.ScrollStop;    
        
        Button.click(me.ButtonClick);
        Button.mouseover(me.ButtonOver);
        Button.mouseout(me.ButtonOut);
        Button.mousedown(me.ButtonDown);
        Button.mouseup(me.ButtonUp);        
    }
    HScrollArea.prototype.CreateTable=function(Elt)
    {        
        var ContentElt=$(document.createElement('TD'));
        ContentElt.css('padding','0');
        
        var MainTable=$(document.createElement('TABLE'));
        MainTable.css('border-collapse','collapse');
        MainTable.css('border','0');
        
        var MainTableBody=$(document.createElement('TBODY'));
        MainTable.append(MainTableBody);
        var MainTableRow=$(document.createElement('TR'));
        MainTableBody.append(MainTableRow);
        
        var before=$(document.createElement('DIV'));
        Elt.after(before);
        Elt.remove();
        ContentElt.append(Elt);
        
        var buttonR=$(document.createElement('TD'));
        buttonR.attr('className',buttonRightClass);
        
        var buttonL=$(document.createElement('TD'));        
        buttonL.attr('className',buttonLeftClass);
        
        Elt.get(0).buttonLeft=buttonL;
        Elt.get(0).buttonRight=buttonR;
        
        buttonR.css('padding','0');
        buttonL.css('padding','0');
        
        buttonL.html(buttonLeftHtml);
        buttonR.html(buttonRightHtml);
        
        MainTableRow.append(buttonL);
        MainTableRow.append(ContentElt);
        MainTableRow.append(buttonR);
        
        
        before.before(MainTable);
        before.remove();
        
        me.InitButton(Elt.get(0),buttonL,buttonR);
        me.InitButton(Elt.get(0),buttonR,buttonL);
        
        
        
    }
    HScrollArea.prototype.UpdateButtonsStatesMargin=function(Container)
    {
        var sl=$(Container);
        var slc=$(Container).find(':first');
        var m=parseInt(slc.css("margin-left"));
        canLeft=m<0;
        canRight=slc.outerWidth()+ m>sl.outerWidth();
        
        //alert(m+" "+sl.outerWidth()+" "+slc.outerWidth()+" "+HasRight+" "+HasLeft);
        
        if(!canLeft)  sl.attr('buttonLeft').addClass(buttonLeftClass+'_disable').removeClass(buttonLeftClass+'_over');
            else sl.attr('buttonLeft').removeClass(buttonLeftClass+'_disable');
        if(!canRight)  sl.attr('buttonRight').addClass(buttonRightClass+'_disable').removeClass(buttonRightClass+'_over');
            else sl.attr('buttonRight').removeClass(buttonRightClass+'_disable');
    }
    HScrollArea.prototype.UpdateButtonsStates=function(Container)
    {
        me.UpdateButtonsStatesMargin(Container);
        return;
        
        var sl=$(Container);
        if(sl.scrollLeft()==0)  sl.attr('buttonLeft').addClass(buttonLeftClass+'_disable');
            else sl.attr('buttonLeft').removeClass(buttonLeftClass+'_disable');
        if(sl.scrollLeft()>=sl.attr('scrollWidth')- sl.width())  sl.attr('buttonRight').addClass(buttonRightClass+'_disable');
            else sl.attr('buttonRight').removeClass(buttonRightClass+'_disable');
    }
    HScrollArea.prototype.Resize=function()
    {
        for(var i=0;i<containers.length;i++)
            me.SetContainerWidth(containers[i]);
    }
    HScrollArea.prototype.SetContainerWidth=function(Elt)
    {
        if(widthInPercent==0) return;
        Elt=$(Elt);
        Elt.hide();
        Root=Elt.parents('TABLE');
        var newW=Math.floor(Root.parent().outerWidth()*widthInPercent/100);
        newW=newW-Elt.attr('buttonLeft').outerWidth()-Elt.attr('buttonRight').outerWidth();
        Elt.css('width',newW.toString()+'px');       
        Elt.show();
    }
    
    HScrollArea.prototype.Init=function()
    {        
        var elt=$('.'+areaClass+' > div');
        var base=$(document.createElement('DIV'));
        $(document.body).append(base);
        base.css('position','absolute');
        base.css('width','30000px');
        
        elt.each(function()
        {
            var before=$(document.createElement('DIV'));
            var t=$(this);
            t.after(before);
            t.remove();
            base.append(t);
            var oldPosition=t.css('position');
            
            t.css('position','absolute');
            var w=Math.floor(t.width()/rowCount)+addWidth;
            
            t.css('width',w.toString()+'px');
            t.css('position',oldPosition);
            before.before(t);
            containers[containers.length]=t.parent().get(0);
            
            
            me.CreateTable(t.parent());
            me.SetContainerWidth(t.parent());
            var sl=t.parent();
            //if(sl.scrollLeft()==0)  sl.attr('buttonLeft').addClass(buttonLeftClass+'_disable');
            //if(sl.scrollLeft()>=sl.attr('scrollWidth')- sl.width())  sl.attr('buttonRight').addClass(buttonRightClass+'_disable');
            me.UpdateButtonsStates(sl)
        });
        
        base.remove();
        
        $(window).resize(me.Resize);
    }
    
    me.Init();
}
