if ('undefined' == typeof(bind)) {
	// borrowed from google-closure js library
	function bind(fn, selfObj, var_args) {
	  var context = selfObj || goog.global;
 
	  if (arguments.length > 2) {
	    var boundArgs = Array.prototype.slice.call(arguments, 2);
	    return function() {
	      var newArgs = Array.prototype.slice.call(arguments);
	      Array.prototype.unshift.apply(newArgs, boundArgs);
	      return fn.apply(context, newArgs);
	    };
 
	  } else {
	    return function() {
	      return fn.apply(context, arguments);
	    };
	  }
	};
};

RDNScroller = (function() {
 return new function() {
   var params = {};
   
   this.initialize = function(opt_scroll_cont, opt_btn_prev, opt_btn_next) {
     //console.log('RDNScroller.initialize');
     var ulEl, liEl;
     params.cont = opt_scroll_cont;
     params.btnPrev = opt_btn_prev;
     params.btnNext = opt_btn_next;
     params.itemsNumber = params.cont.find('li').size();

     liEl = params.cont.find('li').get(0);
     params.itemWidth = $(liEl).width();
     /*$(params.cont).css({
       'width': (params.itemsNumber * params.itemWidth)+'px'
     });*/

     params.els = [];
     params.contOffset = $(params.cont).offset();
     params.contWidth = $(params.cont).width();
     for (var i=0; i<params.itemsNumber; i++) {
       var el = {};
       el.domEl = $(params.cont.find('li').get(i));
       /*el.top = params.contOffset.top-180;*/
       el.left = /*params.contOffset.left-params.contOffset.left+*/(params.itemWidth*i);
       $(el.domEl).css({
         /*'position': 'absolute',
         'top': el.top+'px',*/
         'left': el.left+'px'
       });
       params.els.push(el);
     }
     
     params.posLeft = 0;
     params.isPaused = false;
     params.speed1x = 0.5;
     params.speed2x = 5;
     params.speed = params.speed1x;
     params.isMoveLeft = true;
     
     //console.log(params);
     startPlaying();
   };
   
   function tick() {
     //console.log('RDNScroller.tick');
     if (params.isPaused)
      return;
     if (params.isMoveLeft) {
       if (params.els[params.itemsNumber-1].left < (params.contOffset.left+params.contWidth+params.itemWidth/2)) {
         params.els[0].left = params.els[params.itemsNumber-1].left + params.itemWidth;
         params.els.push(params.els.shift());
       }
     } else {
       if ((params.contOffset.left-params.itemWidth/2)<params.els[0].left) {
         params.els[params.itemsNumber-1].left = params.els[0].left - params.itemWidth;
         params.els.unshift(params.els.pop());
       }       
     }
     var step;
     if (params.isMoveLeft)
      step = -params.speed;
     else
      step = params.speed;
     for (var i=0; i<params.itemsNumber; i++) {
       params.els[i].left += step;
       params.els[i].domEl.css({'left': (params.els[i].left)+'px'});
     }
   };
   
   function onOver() { params.isPaused = true;};   
   function onOut() { params.isPaused = false;};
   
   function onBtnPrevOver() { params.speed = params.speed2x;params.isMoveLeft = false;};
   function onBtnPrevOut() { params.speed = params.speed1x;params.isMoveLeft = true;};
   
   function onBtnNextOver() { params.speed = params.speed2x;};
   function onBtnNextOut() { params.speed = params.speed1x;};
   function onResize() { 
     //console.log('onResize');
     params.contOffset = $(params.cont).offset();
     params.contWidth = $(params.cont).width();
   };
   
   function startPlaying() {
     //console.log('RDNScroller.startPlaying');     
     setInterval(bind(tick, this), 10);
     $(params.cont).mouseover(bind(onOver, this));
     $(params.cont).mouseout(bind(onOut, this));
     $(params.btnPrev).mouseover(bind(onBtnPrevOver, this));
     $(params.btnPrev).mouseout(bind(onBtnPrevOut, this));
     $(params.btnNext).mouseover(bind(onBtnNextOver, this));
     $(params.btnNext).mouseout(bind(onBtnNextOut, this));
     $(window).resize(bind(onResize, this));
   };   
 }
})();
