jQuery.fn.pagination = function(options){
	var settings = {
		items_per_page : 10,
		pageBarId   : 'pagination-bar',
		pageName    : 'page',
		pageRange   : 3,
		btnWidth : 27
	};
	
	settings = jQuery.extend(settings, options || {});
	
	var base = this;
	var currentPage  = 1;
	var pageCount = 0;
	
	var getPageBtn = function(page) {
		var aa = $('<a href="">').attr({
			'class' : 'page_btn'
		});
		if (page == currentPage) {
			aa.attr('class','page_btn_on');
		}
		aa.html(page);
		aa.data('page',page);
		aa.click(function(){
			$('#'+settings.pageName+currentPage).hide();
			currentPage = $(this).data('page');
			$('#'+settings.pageName+currentPage).show();
			createPageBar();
			return false;
		});
		
		return aa;
	}
	var createPageBar = function() {
		if (pageCount < 2) return;
		var bar = $('<div/>').css({
			'text-align' : 'center',
			'margin' : '0 auto'
		});
		
		var fm = currentPage - settings.pageRange;
		if (fm < 1) fm = 1;
		var lm = currentPage + settings.pageRange;
		if (lm > pageCount) lm = pageCount;
		
		var ww = 0;
		
		if (fm != 1) {
			bar.append(getPageBtn(1));
			ww += settings.btnWidth;
		}
		
		if (fm > 2) {
			bar.append('<span class="page_dot">...</span>');
			ww += settings.btnWidth;
		}
		
		for (var i=fm; i<=lm; i++) {
			var aa = getPageBtn(i);
			bar.append(aa);
			ww += settings.btnWidth;
		}
		
		if (pageCount - lm > 2) {
			bar.append('<span class="page_dot">...</span>');
			ww += settings.btnWidth;
		}
		
		if (lm != pageCount) {
			bar.append(getPageBtn(pageCount));
			ww += settings.btnWidth;
		}
		
		
		
		
		$('#'+settings.pageBarId).html('');
		$('#'+settings.pageBarId).append(bar);
		
		bar.css('width',ww+'px');
	}
	
	return this.each(function() {
		var _this = jQuery(this);
		
		var items = _this.children();
		
		pageCount = Math.ceil(_this.children().length/settings.items_per_page);
		
		var pages = new Array();
		
		for (var i=0;i<items.length;i++) {
			var idx = parseInt(i/settings.items_per_page);
			if (pages[idx] == null) {
				var page = $('<div id="'+settings.pageName+(idx+1)+'"/>').css({
					overflow : 'hidden'
				});
				pages[idx] = page;
			}
			
			(pages[idx]).append(items[i]);
		}
		
		_this.html('');
		for (i=0;i<pages.length;i++)
			_this.append(pages[i].hide());
		
		pages[currentPage-1].show();
		
		createPageBar();
	});
}
