(function($){
 $.fn.paginate = function(options) {
 
 	var defaults = {  	    
	    listLimit: 5, 
	    listElement: "div",
	    listClass: "listing",  
	    controlCss: "pagination",
	    cssObjActive: "current",
	    container: "pagination-holder",
	    pageSummary: false
	 };  
 
 
 	var opts = $.extend(defaults, opts); 
 	
 	
 	
 	function display(p) {
 		var s = start(p);
 		$(opts.listElement+'.'+opts.listClass).hide(); 
 		var i = 0; 		
		for(i=0;i<opts.listLimit;i++) {				
			$(opts.listElement+'.'+opts.listClass+':eq('+s+')').show();
			s++;			
		}
		if (opts.pageSummary)
			showSummary(p);
 	}		
  	
 	function startList (i,t) {
 		$sli = $('<li />').append($('<a />').attr({id:"p"+i, href: "#"+i}).html(t));	
 		$sli.bind('click', function() {
			var p = $(this).children('a').attr('id').substr(1);		 	
			$('#anchor').attr({name:p});
			$('#'+opts.controlCss+' a.'+opts.cssObjActive).removeClass(opts.cssObjActive);
			$(this).next('li').children('a').addClass(opts.cssObjActive);	
		 	display(p);
		});
		return $sli;
 	}
 	
 	function pageList (i,t) {
 		$li = $('<li />').append($('<a />').attr({id:"p"+i, href: "#"+i}).html(t));		
		$li.bind('click', function() {		
		 	var p = $(this).children('a').attr('id').substr(1); 	
		 	$('#anchor').attr({name:p});		 	
		 	$('#'+opts.controlCss+' a.'+opts.cssObjActive).removeClass(opts.cssObjActive);
		 	$(this).children('a').addClass(opts.cssObjActive); 			
 			display(p);
		});		
		return $li;
 	}
 	
 	function endList (i,t) {
 		$eli = $('<li />').append($('<a />').attr({id:"p"+i, href: "#"+i}).html(t));	
 		$eli.bind('click', function() {
			var p = $(this).children('a').attr('id').substr(1);		
			$('#anchor').attr({name:p});
			$('#'+opts.controlCss+' a.'+opts.cssObjActive).removeClass(opts.cssObjActive);
			$(this).prev('li').children('a').addClass(opts.cssObjActive);
		 	display(p);
		});
		return $eli;
 	}
 	
 	function count() {
 		var r = $(opts.listElement+'.'+opts.listClass).length;
 		return r;
 	}
 	function pages(r) {
 		var l  = Math.ceil(r / opts.listLimit);
 		return l;
 	}
 	function start(p) {
 		var s = (p - 1) * opts.listLimit;
 		return s;
 	}
 	
 	function buildNav() { 	
 		var r = count();	
		var l = pages(r);
		var i = 1;
		
		if (r >= 1 )
			var $wrapper = $('<div />').attr({ id: opts.controlCss}).appendTo('#'+opts.container);		
			var $control = $('<ul />').appendTo($wrapper);	 		
 			var $sli = startList("1","<");		 	
			$control.append($sli);		
			for(i=1;i<=l;i++) {
				var $li = pageList(i,i);						
				$control.append($li);
			}				
			var $eli = endList(l,">");		
			$control.append($eli);			
 	} 
 	
 	function showSummary(p) {
 		var r = count();
 		var l = pages(r); 
 		var s = start(p) + 1;
 		var e = (s + opts.listLimit) - 1;
 		
 		if (e > r) {
 			e = r;
 		} 		
 		$('#summary').remove(); 		
 		$('<div />').attr({ id: "summary"}).addClass("summary").text('Page '+ p +' of '+ l +' - displaying '+ s +' to '+ e +' of '+ r + ' records').prependTo('div#'+ opts.controlCss);;
 		
 	}
 	
 	function getParams() { 	
 		var a = location.href.split("#");
 		if (a[1] == null) 	
 		   var h = 1;
 		else
 		   var h = a[1]; 		
 		return h;
 	}
 	
 	function init() { 		
 		var h = getParams();  		
 		$('#anchor').attr({name:h});
 		display(h); 
 		buildNav();
 		$('#pagination a:eq('+h+')').addClass(opts.cssObjActive);
 		
 		if (opts.pageSummary) 
 			showSummary(h);
 		 		
 	}

    	return this.each(function() { 
		init();			
    	});
 };
})(jQuery);
