var jsgalscr = new Object;
jsgalscr.sTime = 20; //uSec between moving on arrows
jsgalscr.sMove = 10; //amount to move on arrow
jsgalscr.wMove = 40; //amount to move on mouseWheel

function scrlObjInit(obj, oName, elem)
 {
  obj.selfName  = oName;
  obj.elemName  = elem;
  obj.scrollEl  = document.getElementById(elem);
  obj.scrlWidth = obj.scrollEl.parentNode.offsetWidth; //document.getElementById(elem).parentNode.offsetWidth;
  obj.objWidth  = obj.scrollEl.offsetWidth;
  obj.maxLeft   = obj.scrlWidth - obj.objWidth;
  obj.x         = obj.scrollEl.offsetLeft;
  obj.doScroll  = false;
  if(obj.maxLeft > 0)
   {
    obj.scrlLft   = objScrlFake;
    obj.scrlRgt   = objScrlFake;
    obj.scrlStart = objScrlFake;
    obj.scrollEl.style.left = (obj.maxLeft)/2 + 'px';
   } else {
    obj.scrlLft   = objScrlLft;
    obj.scrlRgt   = objScrlRgt;
    obj.scrlStart = objScrlStart;
   }
  obj.scrlStop  = objScrlStop;
  obj.scrlMove  = objScrlMove;
  obj.scrlWheel = objScrlWheel;
  hookEvent(elem,'mousewheel',function(e){jsGalScrlW(e,obj.selfName)});
 }

//now with checks to avoid overboarding
function objScrlMove(x)
 {
  this.x = this.x + x;
//if over left edge
  if(this.x < this.maxLeft)
   {
    this.x = this.maxLeft;
   };
//if over right edge
  if(this.x > 0)
   {
    this.x = 0;
   };
  this.scrollEl.style.left = this.x + 'px';
 }

function objScrlFake(dx)
 {
  return false;
 }

function objScrlLft()
 {
//alert(this.doScroll);
//alert(this.x);
//alert(this.maxLeft);
  if(this.doScroll && (this.x > this.maxLeft))
   {
    this.scrlMove(-jsgalscr.sMove);
    return true;
   } else {    this.scrlWidth = this.scrollEl.parentNode.offsetWidth;
    this.thisWidth = this.scrollEl.offsetWidth;
    this.maxLeft   = this.scrlWidth - this.thisWidth;
//alert(this.x);
//alert(this.maxLeft);
    return false;
   }
 }

function objScrlRgt()
 {
  if(this.doScroll && (this.x < 0))
   {
    this.scrlMove(jsgalscr.sMove);
    return true;
   } else {
    return false;
   }
 }

function objScrlStop()
 {
  if(typeof(jsGalScrTimer) != 'undefined')
   {
    clearTimeout(jsGalScrTimer);
   }
  this.doScroll=false;
 }

function objScrlWheel(e)
 {  e = e ? e : window.event;
  var mov = e.detail ? e.detail * -1 : e.wheelDelta / 40;
  if(mov > 0)
   {    if(this.x >= 0)
     {      return false;     };    this.scrlMove(jsgalscr.wMove);
   } else {    if(this.x <= this.maxLeft)
     {      this.scrlWidth = this.scrollEl.parentNode.offsetWidth;
      this.thisWidth = this.scrollEl.offsetWidth;
      this.maxLeft   = this.scrlWidth - this.thisWidth;
      if(this.x < this.maxLeft)
       {        return false;       }
     }    this.scrlMove(-jsgalscr.wMove);
   }
  cancelEvent(e)
  return true;
 }

//это только для запуска таймера, блин
function objScrlStart(dx)
 {
  this.doScroll=true;
  if(dx > 0)
   {
    jsGalScrlL(this.selfName);
   } else {
    jsGalScrlR(this.selfName);
   }
 }

//фунсы для вызова методов объекта!!!
function jsGalScrlL(objName)
 {
//  alert(objName);
  if(jsgalscr[objName].scrlLft)
   {
    donext = jsgalscr[objName].scrlLft();
//alert(donext);
    if(donext)
     {
      jsGalScrTimer = setTimeout(function() { jsGalScrlL(objName); }, jsgalscr.sTime);
     }
   }
 }

function jsGalScrlR(objName)
 {
  if(jsgalscr[objName].scrlRgt)
   {
    donext = jsgalscr[objName].scrlRgt();
    if(donext)
     {
      jsGalScrTimer = setTimeout(function() { jsGalScrlR(objName); }, jsgalscr.sTime);
     }
   }
 }

function jsGalScrlW(e, objName)
 {//alert(e);
//alert(objName);
  if(jsgalscr[objName].scrlWheel)
   {
    jsgalscr[objName].scrlWheel(e);
   }
 }


function hookEvent(element, eventName, callback)
 {
  if(typeof(element) == "string")
    element = document.getElementById(element);
  if(element == null)
    return;
  if(element.addEventListener)
   {
    if(eventName == 'mousewheel')
      element.addEventListener('DOMMouseScroll', callback, false);
    element.addEventListener(eventName, callback, false);
   }
  else if(element.attachEvent)
    element.attachEvent("on" + eventName, callback);
 }

function unhookEvent(element, eventName, callback)
 {
  if(typeof(element) == "string")
    element = document.getElementById(element);
  if(element == null)
    return;
  if(element.removeEventListener)
   {
    if(eventName == 'mousewheel')
      element.removeEventListener('DOMMouseScroll', callback, false);
    element.removeEventListener(eventName, callback, false);
   }
  else if(element.detachEvent)
    element.detachEvent("on" + eventName, callback);
 }

function cancelEvent(e)
 {
  e = e ? e : window.event;
  if(e.stopPropagation)
    e.stopPropagation();
  if(e.preventDefault)
    e.preventDefault();
  e.cancelBubble = true;
  e.cancel = true;
  e.returnValue = false;
  return false;
 }
