jQuery.fn.pageinate = function (settings) {
	
	// Default settings
	var settings = jQuery.extend({
		row: function (container, item, i) {},
		page: function (i) {},
		url: "",
		show: 10,
		start_page:1
	}, settings);
	
	// jQuery-wrap element used for page list
	settings.pagelist_selector = jQuery(settings.pagelist_selector);
	
	return this.each(function(_, element){
		// jQuery-wrap element
		element = $(element);
		
		var page_link_callback_creator = function(i) {
			return function() {
				$(this).html('&nbsp;');
				$(this).attr('class','waiting')
				update(i);
			}
		};
		
		var update = function (page) {

			jQuery.getJSON(settings.url, {page:page, show:settings.show}, function(data){
				// Returned data from JSON-request
				pages = data['pages'];
				posts = data['posts'];
				
				// Populate rows
				for (var i=0; i<settings.show; i++) {
					if (posts[i])
						settings.row(element, posts[i], i);
					else
						settings.row(element, false, i);
				}

				
				settings.pagelist_selector.fadeOut(100, function(){
					settings.pagelist_selector.html("");
					// Build page-list
					for (i=1; i <= pages; i++) {
						selected = page==i
						page_link = settings.page(i, selected);
						settings.pagelist_selector.append(page_link);
						
						if(!selected) {
							page_link.click(page_link_callback_creator(i));
						}
					}
					settings.pagelist_selector.fadeIn(100);
				});

				
			});
		};
		
		// Run initial update when page loads
		update(settings.start_page);
	});
}

