$.fn.paging = function(elem, pagelength, options) {
	var settings =  {
		navID: 'nav',
		navClass: 'nav',
		navPlacement: 'append',
		highlightClass: 'selected',
		prevTxt: 'Prev',
		nextTxt: 'Next',
		pagenumPrefix: '',
		alertOnError: 1
	}
	if(options) $.extend(settings, options);
	return this.each(function() {
		var parent = $(this);
		var children = $(this).find(elem);
		var numchildren = children.length;
		var numpages = Math.ceil(numchildren/pagelength);
		pagenum = 1;
		
		function init () {
			if(numchildren>0){
				makenav();
				showpage(pagenum);
			} else {
				if (settings.alertOnError==1) alert('Paging error. No matching elements found.');
			}
		}
		function makenav() {
			if(settings.pagenumPrefix!='') {
				settings.pagenumPrefix=settings.pagenumPrefix+' ';
			}
			var str = '<div id="'+settings.navID+'" class="'+settings.navClass+'"></div>';
			switch (settings.navPlacement){
				case 'before':
					$(parent).before(str);
					break;
				case 'after':		
					$(parent).after(str);
					break;
				case 'prepend':
					$(parent).prepend(str);
					break;
				default:
					$(parent).append(str);
					break;
			}
			for (i=1;i<=numpages;i++) {
				$("#"+settings.navID).append('<a href="#" rel="'+i+'">'+settings.pagenumPrefix+i+'</a> ');
			}
			$("#"+settings.navID).append(' of '+numpages+' ');
			$("#"+settings.navID).prepend('<a href="#" rel="prev" class="prev">'+settings.prevTxt+'</a> ');
			$("#"+settings.navID).append('<a href="#" rel="next" class="next">'+settings.nextTxt+'</a>');
		}
		function showpage(x) {
			$(children).hide();
			var pagestart = (x*pagelength)-pagelength;
			var pageend = x*pagelength-1;
			for (i=pagestart;i<=pageend;i++){
				$(children).eq(i).show();
			}
			pagenum = x;
			$("#"+settings.navID+" a").removeClass(settings.highlightClass);
			$("#"+settings.navID+" a[rel="+x+"]").addClass(settings.highlightClass);
		}
		init();
		$("#"+settings.navID).find("a").click(function () {
			var j = 0;
			if($(this).attr('rel') == 'next') {
				if (eval(pagenum)<eval(numpages)) {
					j = eval(pagenum+1);
				}
			} else if($(this).attr('rel') == 'prev') { 
				if (eval(pagenum)>1) {
					j = eval(pagenum-1);
				}
			} else {		
				j = eval($(this).attr('rel'));		
			}
			if (j>0) showpage(j);
			return false;
		});
	});
}