
var twheel, tkey, temp;
function CSBfleXcroll(targetId){

    var kAct={_37:['-1',0],_38:[0,'-1'],_39:['1',0],_40:[0,'1']};   //navigation arrow buttons of the keyboard
    var kAct2={_33:['1'],_34:['-1']};   //pageUp & pageDown keys
    var dDiv = document.getElementById('scroll'+targetId+'Container');    //('root'+targetId);
    dDiv.fleXcroll=true;
    dDiv.vScroll=true;
    dDiv.scrollPos=[0,0,0,0];
    dDiv.pageScroll=[0,0];
    dDiv.stepScroll=[0,ratioV[targetId]*10];
    dTrack = document.getElementById('track'+targetId);
    dTrackH = document.getElementById('trackH'+targetId);
    

    dDiv.commitScroll=function(xScr,yScr){
	      
	    if (xScr || yScr) {
	        var dir;
	        index = targetId; 
	        speed = theScroll[index].origSpeed;
	        theScroll[index].origSpeed = speed*3;
    	    
	        if (xScr)
	            if (xScr>0)
	                theScroll[index].scrollEast(index);
	            else
	                theScroll[index].scrollWest(index);
	        else 
	            if(yScr)
	                if (yScr >0)
	                     theScroll[index].scrollSouth(index);
	                else 
	                    theScroll[index].scrollNorth(index);
    	     
    	            
	         setTimeout('theScroll['+index+'].endScroll();', 500);
	         theScroll[index].origSpeed = speed;   
	     }
    };

    dDiv.contentScroll=function(xPos,yPos,relative){
	    var reT=[false,false],Bar;
	    if(xPos&&dDiv.hScroll){Bar=tDiv.hrz.sBar;Bar.targetScroll=(relative)?Math.min(Math.max(Bar.mxScroll,Bar.targetScroll-xPos),0):-xPos;Bar.contentScrollPos();reT[0]=[Bar.targetScroll,Bar.mxScroll]}
	    if(yPos&&dDiv.vScroll){Bar=tDiv.vrt.sBar;Bar.targetScroll=(relative)?Math.min(Math.max(Bar.mxScroll,Bar.targetScroll-yPos),0):-yPos;Bar.contentScrollPos();reT[1]=[Bar.targetScroll,Bar.mxScroll]}
	    return reT;
    }
    
    document.goScroll=null;
    addTrigger(dDiv,'mousewheel',mWheelProc);
    addTrigger(dTrack,'mousedown',mTrackClickV);
    //addTrigger(dTrackH,'mousedown',mTrackClickH);
    addTrigger(dDiv,'DOMMouseScroll',mWheelProc);
    if(!addCheckTrigger(dDiv,'mousewheel',mWheelProc)||!addCheckTrigger(dDiv,'DOMMouseScroll',mWheelProc)){dDiv.onmousewheel=mWheelProc;}
    //** 21.04.2010-stef: I've commented the following line because it caused  a blue line border  in scrollcontent fiv when mouseClick inside it in Safari
    //dDiv.setAttribute('tabIndex','0');


    addTrigger(dDiv,'keydown',function(e){
                                    temp = (new Date()).getTime();
                                    if (temp != tkey ) {
                                        tkey=temp;
                                   
	                                    if(!e){var e=window.event;};
	                                    var pK=e.keyCode;
	                                    if(kAct['_'+pK]){
	                                        dDiv.commitScroll(kAct['_'+pK][0], kAct['_'+pK][1]);    //??
	                                        if(e.preventDefault) e.preventDefault();
	                                        return false;
	                                    }else
	                                        if (kAct2['_'+pK]){
	                                            jumpVPage(parseInt(kAct2['_'+pK][0]));
	                                        }
	                                }
	                              });
    addTrigger(dDiv,'keypress',function(e){//make Opera Happy
	    if(!e){var e=window.event;};var pK=e.keyCode;
	    if(kAct['_'+pK]){e.preventDefault();return false;}
    }); 
    
    
    function mWheelProc(e){
        if ( (bIsNotFullHeight && !targetId) || targetId ) {
    
            temp = (new Date()).getTime();
            if (temp != twheel ) {
                twheel=temp;
                
                if(!e) e=window.event;
                if(!this.fleXcroll) return;
                var scrDv=this;
                var delta=0;
                
                if(e.wheelDelta) delta=-e.wheelDelta;
                if(e.detail) delta=e.detail;
                delta=delta<0?-1:+1;
                scrDv.commitScroll(false,delta); 
               
           }
            return false;
        }
    };

    function mTrackClickV(e){
       var k, my, ty;
        
       if(!e) e=window.event;
       my = e.pageY;
       ty = parseInt(theThumbV[targetId].style.top);
       if ( my < ty ) k=1; else k=-1;   // if my<ty - pageUp, else - pageDown
       
       jumpVPage(k);
    }
    
    function mTrackClickH(e){
       var k, mx, tx, thLeft, containerWidth, contentWidth, Limit;
       
       if(!e) e=window.event;
       mx = e.pageX;
       tx = parseInt(theThumbH[targetId].style.left);
       if ( mx < tx ) k=1; else k=-1;
      
       jumpHPage(k);
    }
    
    function jumpVPage(dir){
        var ty, thTop, containerHeight, contentHeight, Limit
        if ( dir>0)  // page Up
            Limit = theThumbV[targetId].minY
        else // page Down
            Limit = theThumbV[targetId].maxY;
       
        //calculate top position for content
       containerHeight = parseInt(theScroll[targetId].container.offsetHeight);
       ty = parseInt(theScroll[targetId].content.style.top) + containerHeight*dir;
       theScroll[targetId].jumpTo(null, -ty);
   
       //calculate new top position for Scroll thumb
       contentHeight = parseInt(theScroll[targetId].docH);
       thTop =  (-1) * dir * containerHeight * containerHeight / contentHeight + parseInt(theThumbV[targetId].style.top);
       theThumbV[targetId].style.top =(dir<0)? (thTop<Limit? thTop:Limit) : (thTop<Limit? Limit : thTop) + 'px';
    }
    
     function jumpHPage(dir){
        var tx, thLeft, containerWidth, contentWidth, Limit;
        if ( dir>0)  // page Right
            Limit = theThumbH[targetId].minX;
        else // page Left
            Limit = theThumbH[targetId].maxX;
       
       //calculate left position for content
       containerWidth = parseInt(theScroll[targetId].container.offsetWidth);
       tx = parseInt(theScroll[targetId].content.style.left) + containerWidth*dir;
       theScroll[targetId].jumpTo( -tx, null);
       
       //calculate new left position for Scroll thumb
       contentWidth = parseInt(theScroll[targetId].docW);
       thLeft =  (-1) * dir * containerWidth * containerWidth / contentWidth + parseInt(theThumbH[targetId].style.left);
       theThumbH[targetId].style.left =(dir<0)? (thLeft<Limit? thLeft:Limit) : (thLeft<Limit? Limit : thLeft) + 'px';
    }
    
    function addTrigger(elm,eventname,func){
    if (elm)
        if(!addCheckTrigger(elm,eventname,func)&&elm.attachEvent) {
            elm.attachEvent('on'+eventname,func);
            }
     };
    function addCheckTrigger(elm,eventname,func){
     if (elm)   
        if(elm.addEventListener){
            elm.addEventListener(eventname,func,false);
            window.addEventListener("unload",function(){removeTrigger(elm,eventname,func)},false);
            return true;
         } 
         else return false;
     
    };
    function removeTrigger(elm,eventname,func){
        if(!removeCheckTrigger(elm,eventname,func)&&elm.detachEvent) 
            elm.detachEvent('on'+eventname,func);
    };
    function removeCheckTrigger(elm,eventname,func){
        if(elm.removeEventListener){
            elm.removeEventListener(eventname,func,false);
            return true;
        } 
        else return false;
    };

    function CSBFindPos(elem){ 
        //function modified from firetree.net
        var obj=elem,curleft=curtop=0;
        if(obj.offsetParent){while(obj){curleft+=obj.offsetLeft;curtop+=obj.offsetTop;obj=obj.offsetParent;}}
        else if(obj.x){curleft+=obj.x;curtop+=obj.y;}
        elem.xPos=curleft;elem.yPos=curtop;
    };

    function calcScrollVal(v,i){
        var stR=v.toString(); v=parseInt(stR);
        return (stR.match(/p$/))?v*dDiv.pageScroll[i]:(stR.match(/s$/))?v*dDiv.stepScroll[i]:v;
    }
    


};
