(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					: false,
		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').html('First');
		
		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').html('Last');
		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};
			}
		}*/
		a_css = {};
        hover_css  = {};
		
		$.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);