/*
 * BlockScroll
 * Скроллинг внутри любого блока
 * Version 010.06.27
 *
 * Для дополнительной информации:
 * http://bitby.net/web/scroll-in-block/plagin-skrollinka-teksta-vnutri-bloka
 *
 * Автор: Жлобо Евгений (WebMast)
 * http://bitby.net/
 */

jQuery.fn.BlockScroll = function(options){
	var options = jQuery.extend({
		SEL:'.thisp',
		DOM: function(){
		  $('.container')
		    .prepend('<div id="status">x * ( m - l ) / (l - r) = k</div>');
		},
		startDragF: function(){},
		stopDragF: function(){},
		initDragF: function(x,m,l,r,k){
		  $('#status').html(x+'x * ( '+m+'m - '+l+'l ) / ('+l+'l - '+r+'r) = '+k+'k');
		},
	},options);
	return this.each(function(){
		$this = jQuery(this);
		$this
		  .wrap('<div></div>')
		  .css({'overflow':'hidden'})
		  .children('div').eq(0)
		    .html('<span class="all-cont">'+$this.children('div').eq(0).html()+'</span>')
		  .parent()
		  .parent().attr({'className':'container'})
		    .append('<div class="trackDrag"><div class="arrowDrag"></div></div>');
		$trackDrag = $('.trackDrag');
		$arrowDrag = $('.arrowDrag');
		
		$trackDrag.css({
		  width:$this.width(),
		});

		options.DOM();
		
		var m = $('.all-cont', $this).width();
		var l = $this.innerWidth();
		var r = $arrowDrag.width();
		var t = $trackDrag.width();
		
		if($('.all-cont', $this).width() <= l){return false;}
		  
		// Начало перемещения
		var startDrag = function(){
		  $(window)
		    .bind('mousemove',trackDrag)
		    .bind('mouseup',stopDrag);
		  if(jQuery.browser.msie){
                    $(window)
		    .bind('selectstart',ignore)
		    .bind('dragstart',ignore);
		  }
		  options.startDragF();
		};
		// Окончание перемещения
		var stopDrag = function(){
		  options.stopDragF();
		  $(window)
		    .unbind('mousemove',trackDrag)
		    .unbind('mouseup',stopDrag);
		  if(jQuery.browser.msie){
                    $(window)
		    .unbind('selectstart',ignore)
		    .unbind('dragstart',ignore);
		  }
		};
		// Обработка функций для перемещения объектов
		var trackDrag = function(m){
		  left = m.pageX - $trackDrag.offset().left - ( r / 2 );
		  maxLeft = t - r;
		  if(left < 1)left = 0;
		    else if(left >= maxLeft)left = maxLeft;
		  arrowDrag(left);
		};
		// Перемещение текста
		var blockDrag = function(x){
		  k = x * ( m - l ) / (l - r);
		  $('.all-cont', $this).css({marginLeft:-k});
		  options.initDragF(x,m,l,r,k);
		};
		// Перемещение ползунка
		var arrowDrag = function(x){
		  $arrowDrag.css({'left':x});
		  blockDrag(x);
		};
		// Клик на полосе прокрутки
		var trackClick = function(m){
		  trackDrag(m);
		};
		
		function haveX(k){x = k / ( ( m - l ) / (l - r) );return x;}
		
		var showSel = function(){
		  if($(options.sel).length){
		    var $sel = $(options.sel);
		    k = $sel.offset().left-$trackDrag.offset().left;
		    if(k < l/2){k=0;}
		    else{k = k-(l/2)+($sel.width()/2);}
		    x = haveX(k);
		    if(l > m-k)x=l-r;
                    
		    arrowDrag(x);
		  }
		};

		var ignore = function(){return false;};
		
		showSel();

		$arrowDrag.bind('mousedown',startDrag);
		$trackDrag.bind('click',trackClick);
	});
};
