;(function($){
	$.fn.paginator = function (s){
		var options = {
			pagesTotal  : 1, //бщее количество страниц
		 	pagesSpan   : 100,  //количество показываемых страниц
		 	pageCurrent : 1,  //текущая страница
			baseUrl     : './page/', //ссылка или функция function (page){}
		 	returnOrder : false,
		 	lang        : {
							arrowRight : String.fromCharCode(8594),
							arrowLeft  : String.fromCharCode(8592)}
     };
	 
	 
	 $.extend(options, s);
	 
	 options.pagesSpan = options.pagesSpan < options.pagesTotal ? options.pagesSpan : options.pagesTotal;
	 options.pageCurrent = options.pagesTotal < options.pageCurrent ? options.pagesTotal : options.pageCurrent;
	 if (!$.isFunction(options.baseUrl) && !options.baseUrl.match(/%page%/i)) options.baseUrl += '%page%';
	 
	 
	 var html = {
	       holder: null,
		   table: null,
		   trPages: null, 
		   trScrollBar: null,
		   tdsPages: null,
		   scrollBar: null,
		   scrollThumb: null,
		   pageCurrentMark: null
         };
	 
	 function prepareHtml(el){
	   html.holder = el;
	   $(html.holder).html(makePagesTableHtml());
	   html.table = $(html.holder).find('table:last');
	   html.trPages = $(html.table).find('tr:first');
	   html.tdsPages = $(html.trPages).find('td');
	   html.scrollBar = $(html.holder).find('div.scroll_bar');
	   html.scrollThumb = $(html.holder).find('div.scroll_thumb');
	   html.pageCurrentMark = $(html.holder).find('div.current_page_mark');
	   if (options.pagesTotal == options.pagesSpan) {
	     $(html.holder).addClass('fulsize');
	   };
     };
     
     function makePagesTableHtml(){
	   var tdWidth = (100 / (options.pagesSpan + 2)) + '%';
     
	   var isFunc = $.isFunction(options.baseUrl); 	

	   var prior_page = (parseInt(options.pageCurrent) > 1) ? parseInt(options.pageCurrent) - 1 : 1;
	 
	   var html = '' +
	'<table width="100%">' +
		'<tr>' 
			     for (var i=1; i<=options.pagesSpan; i++){
				html += '<td width="' + tdWidth + '"></td>';
			}
			html += '' + 
		'</tr>' +
		'<tr>' +
			     '<td colspan="' + options.pagesSpan + '">' +
				'<div class="scroll_bar">' + 
					'<div class="scroll_trough"></div>' + 
					'<div class="scroll_thumb">' + 
						'<div class="scroll_knob"></div>' + 
					'</div>' + 
					'<div class="current_page_mark"></div>' + 
				'</div>' +
			'</td>' +
		'</tr>' +
	'</table>';
	 
	   return html;
    };
     
    function initScrollThumb(){
	  html.scrollThumb.widthMin = '8';
	  html.scrollThumb.widthPercent = options.pagesSpan/options.pagesTotal * 100;
	  html.scrollThumb.xPosPageCurrent = (options.pageCurrent - Math.round(options.pagesSpan/2))/options.pagesTotal * $(html.table).width();
	  if (options.returnOrder) {
		 html.scrollThumb.xPosPageCurrent = $(html.table).width() - (html.scrollThumb.xPosPageCurrent + Math.round(options.pagesSpan/2)/options.pagesTotal * $(html.table).width());
	  }; 
	  html.scrollThumb.xPos = html.scrollThumb.xPosPageCurrent;
	  html.scrollThumb.xPosMin = 0;
	  html.scrollThumb.xPosMax;
	  html.scrollThumb.widthActual;
	  setScrollThumbWidth();  
    };
   
    function setScrollThumbWidth(){
	  $(html.scrollThumb).css({width : html.scrollThumb.widthPercent + "%"});
	  html.scrollThumb.widthActual = $(html.scrollThumb).width();

	  if (html.scrollThumb.widthActual < html.scrollThumb.widthMin)
		$(html.scrollThumb).css('width', html.scrollThumb.widthMin + 'px');

	  html.scrollThumb.xPosMax = $(html.table).width - html.scrollThumb.widthActual;   
    };

    function moveScrollThumb(){
	  $(html.scrollThumb).css({left : html.scrollThumb.xPos + "px"});
    }

    function initPageCurrentMark(){
	  html.pageCurrentMark.widthMin = '3';
	  html.pageCurrentMark.widthPercent = 100 / options.pagesTotal;
	  html.pageCurrentMark.widthActual;
	  setPageCurrentPointWidth();
	  movePageCurrentPoint();
    };
  
    function setPageCurrentPointWidth(){
	  $(html.pageCurrentMark).css({width : html.pageCurrentMark.widthPercent + '%'});

	  html.pageCurrentMark.widthActual = $(html.pageCurrentMark).width();

	  if(html.pageCurrentMark.widthActual < html.pageCurrentMark.widthMin)
		$(html.pageCurrentMark).css("width", html.pageCurrentMark.widthMin + 'px');
    };
  
    function movePageCurrentPoint(){
	  var pos = 0;
	  if(html.pageCurrentMark.widthActual < $(html.pageCurrentMark).width()){
	    pos = (options.pageCurrent - 1) / options.pagesTotal * $(html.table).width() - $(html.pageCurrentMark).width() / 2;
	  } else {
	    pos = (options.pageCurrent - 1)/options.pagesTotal * $(html.table).width();
	  };
	  
	  if (options.returnOrder) pos = $(html.table).width() - pos - $(html.pageCurrentMark).width(); 
	  
	  $(html.pageCurrentMark).css({left: pos + 'px'}); 	
    };

    function initEvents (){
	  moveScrollThumb();
	  options.returnOrder ? drawReturn() : drawPages();
	
	  $(html.scrollThumb).bind('mousedown', function(e){										   
		var dx = e.pageX - html.scrollThumb.xPos;		
	
		$(document).bind('mousemove', function(e){
			html.scrollThumb.xPos = e.pageX - dx;
			
			moveScrollThumb();
			options.returnOrder ? drawReturn() : drawPages();
		});
		
		$(document).bind('mouseup', function(){
			$(document).unbind('mousemove');
			enableSelection();
		});
		
		disableSelection();
	  }); 
	
	  if ($.isFunction(options.baseUrl)){
	    $(html.holder).find('a[rel!=""]').bind('click', function (e){
			var n = parseInt($(this).attr('rel'));
			options.baseUrl(n);
		});
	  };	
	  
	  $(window).resize(function (){
	     setPageCurrentPointWidth();
	     movePageCurrentPoint();
         setScrollThumbWidth();
	  });
	  
    };  

    function drawPages(){  
	  var percentFromLeft = html.scrollThumb.xPos / $(html.table).width();
	  var cellFirstValue = Math.round(percentFromLeft * options.pagesTotal);
	 
	  var data = "";

	  if (cellFirstValue < 1){
	    cellFirstValue = 1;
	    html.scrollThumb.xPos = 0;
	    moveScrollThumb();
	  } else if (cellFirstValue >= options.pagesTotal - options.pagesSpan) {
	    cellFirstValue = options.pagesTotal - options.pagesSpan + 1;
	    html.scrollThumb.xPos = $(html.table).width() - $(html.scrollThumb).width();
  	    moveScrollThumb();
	  };  
	
	  var isFunc = $.isFunction(options.baseUrl);
	
	  for(var i=0; i < html.tdsPages.length; i++){	
	    var cellCurrentValue = cellFirstValue + i;
	    if(cellCurrentValue == options.pageCurrent){
		  data = '<span> <strong>' + cellCurrentValue + '</strong> </span>';
	    } else {
		  data = '<span> <a href="'; 
		  data += isFunc ? 'javascript:void(0)' : options.baseUrl.replace(/%page%/i, cellCurrentValue);       
		  data += '">' + cellCurrentValue + '</a> </span>';
	    };
	    $(html.tdsPages[i]).html(data);
	    if (isFunc){
		  $(html.tdsPages[i]).find('a').bind('click', function (){
														options.baseUrl($(this).text());	  
													  });  
	    }
	  };
    };

    function drawReturn(){  
	  var percentFromLeft = html.scrollThumb.xPos / $(html.table).width();
	  var cellFirstValue = options.pagesTotal - Math.round(percentFromLeft * options.pagesTotal);
	  
	  var data = "";
	  if (cellFirstValue < options.pagesSpan){
	    cellFirstValue = options.pagesSpan;
	    html.scrollThumb.xPos = $(html.table).width() - $(html.scrollThumb).width();
	    moveScrollThumb();
	  } else if (cellFirstValue >= options.pagesTotal) {
	    cellFirstValue = options.pagesTotal;
	    html.scrollThumb.xPos = 0;
	    moveScrollThumb();
	  }; 	 
	
	  var isFunc = $.isFunction(options.baseUrl);
	
	  for(var i=0; i < html.tdsPages.length; i++){	
	    var cellCurrentValue = cellFirstValue - i;
	    if(cellCurrentValue == options.pageCurrent){
		  data = '<span> <strong>' + cellCurrentValue + '</strong> </span>';
	    } else {
		  data = '<span> <a href="'; 
		  data += isFunc ? 'javascript:void(0)' : options.baseUrl.replace(/%page%/i, cellCurrentValue);       
		  data += '">' + cellCurrentValue + '</a> </span>';
	    };
	    $(html.tdsPages[i]).html(data);
	    if (isFunc){
		  $(html.tdsPages[i]).find('a').bind('click', function (){
		  												options.baseUrl($(this).text());	  
		 											  });  
	    }
	  };
    };

    function enableSelection(){
	  document.onselectstart = function(){
		return true;
	  };
    };

    function disableSelection (){
	  document.onselectstart = function(){
		return false;
	  };  
	  $(html.scrollThumb).focus();	
    };
	 
	 
	 prepareHtml(this);	 
	 initScrollThumb();
	 initPageCurrentMark();
	 initEvents();	 
   };
})(jQuery);