(function($) {
   $.fn.paginate = function(options) {
      var opts = $.extend({}, $.fn.paginate.defaults, options);
      return this.each(function() {
         $this = $(this);
         var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
         var selectedpage = o.start;
         $.fn.draw(o,$this,selectedpage); 
      });
   };
   var outsidewidth_tmp = 0;
   var insidewidth    = 0;
   var bName = navigator.appName;
   var bVer = navigator.appVersion;
   if(bVer.indexOf('MSIE 7.0') > 0)
      var ver = "ie7";
   $.fn.paginate.defaults = {
      count       : 5,
      start       : 12,
      display     : 5,
      border               : true,
      border_color         : '#fff',
      text_color           : '#8cc59d',
      background_color     : 'black',  
      border_hover_color      : '#fff',
      text_hover_color        : '#fff',
      background_hover_color  : '#fff', 
      rotate               : true,
      images               : true,
      mouse             : 'slide',
      onChange          : function(){return false;}
   };
   $.fn.draw = function(o,obj,selectedpage){
      if(o.display > o.count)
         o.display = o.count;
      $this.empty();
      if(o.images){
         var spreviousclass   = 'jPag-sprevious-img';
         var previousclass    = 'jPag-previous-img';
         var snextclass       = 'jPag-snext-img';
         var nextclass     = 'jPag-next-img';
      }
      else{
         var spreviousclass   = 'jPag-sprevious';
         var previousclass    = 'jPag-previous';
         var snextclass       = 'jPag-snext';
         var nextclass     = 'jPag-next';
      }
      var _first     = $(document.createElement('a')).addClass('jPag-first ui-state-default ui-corner-all').html('Pierwszy');
      
      if(o.rotate){
         if(o.images) var _rotleft  = $(document.createElement('span')).addClass(spreviousclass);
         else var _rotleft = $(document.createElement('span')).addClass(spreviousclass).html('&laquo;');    
      }
      
      var _divwrapleft  = $(document.createElement('div')).addClass('jPag-control-back');
      _divwrapleft.append(_first).append(_rotleft);
      
      var _ulwrapdiv = $(document.createElement('div')).css('overflow','hidden');
      var _ul        = $(document.createElement('ul')).addClass('jPag-pages')
      var c = (o.display - 1) / 2;
      var first = selectedpage - c;
      var selobj;
      for(var i = 0; i < o.count; i++){
         var val = i+1;
         if(val == selectedpage){
            var _obj = $(document.createElement('li')).html('<span class="jPag-current">'+val+'</span>');
            selobj = _obj;
            _ul.append(_obj);
         }  
         else{
            var _obj = $(document.createElement('li')).html('<a>'+ val +'</a>');
            _ul.append(_obj);
            }           
      }     
      _ulwrapdiv.append(_ul);
      
      if(o.rotate){
         if(o.images) var _rotright = $(document.createElement('span')).addClass(snextclass);
         else var _rotright   = $(document.createElement('span')).addClass(snextclass).html('&raquo;');
      }
      
      var _last      = $(document.createElement('a')).addClass('jPag-last ui-state-default ui-corner-all').html('Ostatni');
      var _divwrapright = $(document.createElement('div')).addClass('jPag-control-front');
      _divwrapright.append(_rotright).append(_last);
      
      //append all:
      $this.addClass('jPaginate').append(_divwrapleft).append(_ulwrapdiv).append(_divwrapright);
         
      if(!o.border){
         if(o.background_color == 'none') var a_css            = {'color':o.text_color};
         else var a_css                                  = {'color':o.text_color,'background-color':o.background_color};
         if(o.background_hover_color == 'none') var hover_css  = {'color':o.text_hover_color};
         else var hover_css                              = {'color':o.text_hover_color,'background-color':o.background_hover_color};   
      }  
      else{
         if(o.background_color == 'none') var a_css            = {'color':o.text_color,'border':'1px solid '+o.border_color};
         else var a_css                                  = {'color':o.text_color,'background-color':o.background_color,'border':'1px solid '+o.border_color};
         if(o.background_hover_color == 'none') var hover_css  = {'color':o.text_hover_color,'border':'1px solid '+o.border_hover_color};
         else var hover_css                              = {'color':o.text_hover_color,'background-color':o.background_hover_color,'border':'1px solid '+o.border_hover_color};
      }
      
      $.fn.applystyle(o,$this,a_css,hover_css,_first,_ul,_ulwrapdiv,_divwrapright);
      //calculate width of the ones displayed:
      var outsidewidth = outsidewidth_tmp - _first.parent().width() -3;
      if(ver == 'ie7'){
         _ulwrapdiv.css('width',outsidewidth+72+'px');
         _divwrapright.css('left',outsidewidth_tmp+6+72+'px');
      }
      else{
         _ulwrapdiv.css('width',outsidewidth+'px');
         _divwrapright.css('left',outsidewidth_tmp+6+'px');
      }
      
      if(o.rotate){
         _rotright.hover(
            function() {
              thumbs_scroll_interval = setInterval(
               function() {
                 var left = _ulwrapdiv.scrollLeft() + 1;
                 _ulwrapdiv.scrollLeft(left);
               },
               20
              );
            },
            function() {
              clearInterval(thumbs_scroll_interval);
            }
         );
         _rotleft.hover(
            function() {
              thumbs_scroll_interval = setInterval(
               function() {
                 var left = _ulwrapdiv.scrollLeft() - 1;
                 _ulwrapdiv.scrollLeft(left);
               },
               20
              );
            },
            function() {
              clearInterval(thumbs_scroll_interval);
            }
         );
         if(o.mouse == 'press'){
            _rotright.mousedown(
               function() {
                 thumbs_mouse_interval = setInterval(
                  function() {
                    var left = _ulwrapdiv.scrollLeft() + 5;
                    _ulwrapdiv.scrollLeft(left);
                  },
                  20
                 );
               }
            ).mouseup(
               function() {
                 clearInterval(thumbs_mouse_interval);
               }
            );
            _rotleft.mousedown(
               function() {
                 thumbs_mouse_interval = setInterval(
                  function() {
                    var left = _ulwrapdiv.scrollLeft() - 5;
                    _ulwrapdiv.scrollLeft(left);
                  },
                  20
                 );
               }
            ).mouseup(
               function() {
                 clearInterval(thumbs_mouse_interval);
               }
            );
         }
         else{
            _rotleft.click(function(e){
               var width = outsidewidth - 10;
               var left = _ulwrapdiv.scrollLeft() - width;
               _ulwrapdiv.animate({scrollLeft: left +'px'});
            });   
            
            _rotright.click(function(e){
               var width = outsidewidth - 10;
               var left = _ulwrapdiv.scrollLeft() + width;
               _ulwrapdiv.animate({scrollLeft: left +'px'});
            });
         }
      }
      
      //first and last:
      _first.click(function(e){
            _ulwrapdiv.animate({scrollLeft: '0px'});
            _ulwrapdiv.find('li').eq(0).click();
      });
      _last.click(function(e){
            _ulwrapdiv.animate({scrollLeft: insidewidth +'px'});
            _ulwrapdiv.find('li').eq(o.count - 1).click();
      });
      
      //click a page
      _ulwrapdiv.find('li').click(function(e){
         selobj.html('<a>'+selobj.find('.jPag-current').html()+'</a>'); 
         var currval = $(this).find('a').html();
         $(this).html('<span class="jPag-current">'+currval+'</span>');
         selobj = $(this);
         $.fn.applystyle(o,$(this).parent().parent().parent(),a_css,hover_css,_first,_ul,_ulwrapdiv,_divwrapright);  
         var left = (this.offsetLeft) / 2;
         var left2 = _ulwrapdiv.scrollLeft() + left;
         var tmp = left - (outsidewidth / 2);
         if(ver == 'ie7')
            _ulwrapdiv.animate({scrollLeft: left + tmp - _first.parent().width() + 52 + 'px'}); 
         else
            _ulwrapdiv.animate({scrollLeft: left + tmp - _first.parent().width() + 'px'});   
         o.onChange(currval); 
      });
      
      var last = _ulwrapdiv.find('li').eq(o.start-1);
      last.attr('id','tmp');
      var left = document.getElementById('tmp').offsetLeft / 2;
      last.removeAttr('id');
      var tmp = left - (outsidewidth / 2);
      if(ver == 'ie7') _ulwrapdiv.animate({scrollLeft: left + tmp - _first.parent().width() + 52 + 'px'});  
      else _ulwrapdiv.animate({scrollLeft: left + tmp - _first.parent().width() + 'px'}); 
   }
   
   $.fn.applystyle = function(o,obj,a_css,hover_css,_first,_ul,_ulwrapdiv,_divwrapright){
               obj.find('a').css(a_css);
               obj.find('span.jPag-current').css(hover_css);
               obj.find('a').hover(
               function(){
                  $(this).css(hover_css);
               },
               function(){
                  $(this).css(a_css);
               }
               );
               obj.css('padding-left',_first.parent().width() + 5 +'px');
               insidewidth = 0;
               
               obj.find('li').each(function(i,n){
                  if(i == (o.display-1)){
                     outsidewidth_tmp = this.offsetLeft + this.offsetWidth ;
                  }
                  insidewidth += this.offsetWidth;
               })
               _ul.css('width',insidewidth+'px');
   }
})(jQuery);
