var scCacheList = [];
var scCache     = null;
var scSetting = {"speed":50,            //  скорость - количество пикселей на которое будет сворачивать слой за один раз
                 "timeout":10,          //  задержка перед последующей итерацией для эффекта плавности
                 "eventtype":"click"    // на какое событие будут кнопки реагировать click|overout
                };
function sc_scrollTo(event,mode)
 {
    var targetObj = getEventTarget(event);
    var divRootObj = getParentByTagName(targetObj,'DIV');
    var tableObj = divRootObj.getElementsByTagName("TABLE")[0];
    var divObj = getParentByTagName(tableObj,'DIV');
    var w = divObj.clientWidth?divObj.clientWidth:divObj.offsetWidth;
    var td_cnt=tableObj.rows[0].cells.length;
    var cache_len=scCacheList.length;
    var cache_index=-1;
    for(var c=0;c<cache_len;c++)
     {
        if(scCacheList[c].table==tableObj) 
         {
            cache_index=c;
            break;
         }
     }
    if(cache_index < 0)
     {
        cache_index=cache_len;
        var tdObj=tableObj.rows[0].insertCell(td_cnt);
        tableObj.style.right=0;
        scCacheList.push( {"div":divObj,"table":tableObj,"pos":[],"tdw":[],"chunk":0,"width":w,"timeout":null});
        for(var i=0;i<=td_cnt;i++)
         {
            var tdObj=tableObj.rows[0].cells[i];
            var pos = sc_getPositionBy(tdObj,divObj);
            if(pos[0]<w) scCacheList[cache_len].chunk++;
            scCacheList[cache_len].pos.push(pos[0]);
            if(i>0)
             {
               scCacheList[cache_len].tdw.push(pos[0]-scCacheList[cache_len].pos[i-1]);
             }
         }
        scCacheList[cache_len].pos.pop();
        tableObj.rows[0].deleteCell(td_cnt);
     }
    if(td_cnt <= scCacheList[cache_index].chunk) 
     {
        scCache=null;
        return false;
     }
    scCache=scCacheList[cache_index];
    switch(event.type)
     {
        case "mouseover":
        case "mouseout":
          return false;
          break;
        case "click":
          if(scSetting.eventtype=='click')
           {
             sc_Click(targetObj,mode);
             clearTimeout(scCacheList[cache_index].timeout);
           }
          else
           {
             return false;
           }
          break;
     }
 }
function sc_Click(clickObj,mode)
 {
     var func = clickObj.getAttribute("onclick");
     clickObj.removeAttribute("onclick");
     var td_cnt=scCache.table.rows[0].cells.length;
     for(var i=0;i<td_cnt;i++)
      {
         var tdObj=scCache.table.rows[0].cells[i];
         var pos = sc_getPositionBy(tdObj,scCache.div);
         if(pos[0]==0)
          {
            var ind_l=i; 
            var ind_r=i+scCache.chunk-1;
          }
      }
     switch(mode)
      {
        case "l":
          if(ind_l > 0)
           {
              setTimeout(function() { sc_goLeft(scCache.pos[(ind_l-1)]) } , scSetting.timeout); //вызываем эту же функцию повторно через curtainTimeout миллисекунд
           }
          else if(ind_l == 0)
           {
             var trObj = scCache.table.rows[0];
             var tdObj = trObj.insertCell(0);
             tdObj.innerHTML = trObj.cells[trObj.cells.length-1].innerHTML;
             var x_diff=scCache.tdw[scCache.tdw.length-1];
             scCache.tdw.unshift(x_diff);
             scCache.tdw.pop();
             for(var i=0,il=scCache.tdw.length;i<il;i++) 
              {
                if(i==0) { var td_pos=0; scCache.pos[i]=0; }
                else     scCache.pos[i]=td_pos;
                td_pos=td_pos+scCache.tdw[i];
              }
             scCache.table.style.right = x_diff + 'px';
             setTimeout(function() { sc_goLeft(0) } , scSetting.timeout); //вызываем эту же функцию повторно через curtainTimeout миллисекунд
             trObj.deleteCell(trObj.cells.length-1);
           }
          break;
        case "r":
          if( ind_r < (td_cnt - 1) ) 
           {
             setTimeout(function() { sc_goRight(scCache.pos[(ind_l+1)]); } , scSetting.timeout); //вызываем функцию 
           }
          else if (ind_r == (td_cnt-1))
           {
             var trObj = scCache.table.rows[0];
             var tdObj = trObj.insertCell(trObj.cells.length);
             tdObj.innerHTML = trObj.cells[0].innerHTML;
             setTimeout(function() { sc_goRight(scCache.pos[ind_l]); } , scSetting.timeout); //вызываем эту же функцию повторно через curtainTimeout миллисекунд
             var x_diff=scCache.tdw[0];
             scCache.tdw.push(scCache.tdw[0]);
             scCache.tdw.shift();
             for(var i=0,il=scCache.tdw.length;i<il;i++) 
              {
                if(i==0) { var td_pos=0; scCache.pos[i]=0; }
                else     scCache.pos[i]=td_pos;
                td_pos=td_pos+scCache.tdw[i];
              }
             trObj.deleteCell(0);
             scCache.table.style.right = (parseInt(scCache.table.style.right,10) -x_diff) + 'px';
           }
          break;
      }
     clickObj.setAttribute("onclick",func);
 }
function sc_getPositionBy(targetObj,parentObj)
 {
   var theElement = targetObj;
   var pos = [0,0];
   while(theElement != parentObj)
    {
      pos[0]=pos[0]+theElement.offsetLeft;
      pos[1]=pos[1]+theElement.offsetTop;
      theElement = theElement.offsetParent;
    }
   return pos;
 }
function sc_goLeft(x_to)
 {
    var x_from = parseInt(scCache.table.style.right);
    var l = x_from - x_to;
    if(l<=0)
     {
        return false;
     }
   else if(l > scSetting.speed)
    {
       scCache.table.style.right = (x_from-scSetting.speed)+'px';
       setTimeout(function() { sc_goLeft(x_to) } , scSetting.timeout); //вызываем эту же функцию повторно через curtainTimeout миллисекунд
    }
   else
    {
       scCache.table.style.right = x_to+'px';
       return false;
    }
 }
function sc_goRight(x_to)
 {
   var x_from = parseInt(scCache.table.style.right);
   var l = x_to - x_from;
   if(l<=0)
    {
       return false;
    }
   else if(l > scSetting.speed)
    {
       scCache.table.style.right = (x_from+scSetting.speed)+'px';
       setTimeout(function() { sc_goRight(x_to) } , scSetting.timeout); //вызываем эту же функцию повторно через curtainTimeout миллисекунд
    }
   else
    {
       scCache.table.style.right = x_to+'px';
       return false;
    }
 }

