$.fn.pager = function(clas, options) {
	
	var settings = {		
		navId: 'nav',
		navClass: 'nav',
		navAttach: 'append',
		highlightClass: 'highlight',
		prevText: '&laquo;',
		nextText: '&raquo;',
  	    prevImgUrl: null, 
  	    prevImgWidth: 0, 
  	    prevImgHeight: 0, 
  	    nextImgUrl: null,
  	    nextImgWidth: 0,
  	    nextImgHeight: 0,
		useImageButtons: false,
		linkText: null,
		linkWrap: null,
		height: null,
		namedPage: false,
		showTotalPages: false,
		pageText: 'Page',
		totalPagesText: ' of ',
		pageClass: 'navPage',
		removeNaviKeys: false
	}
	if(options) $.extend(settings, options);
	
		
	return this.each( function () {
		
		var me = $(this);
		var size;
	    var i = 0;		
		var navid = '#'+settings.navId;
		
		function init () {
			size = $(clas, me).not(navid).size();
			if(settings.height == null) {			
				settings.height = getHighest();
			}
			if(size > 1) {
				makeNav();
				setFeatures();
				show();
				if (!settings.namedPage) {
					highlight();
				}
				
			}			
			sizePanel();
			if(settings.linkWrap != null) {
				linkWrap();
			}
		}
		function makeNav () {		
			var str = '<div id="'+settings.navId+'" class="'+settings.navClass+'"><div id="naviWrap">';
			if (settings.useImageButtons == true) {
    			str += '<a href="#" rel="prev"><img src="'+settings.prevImgUrl+'" width="' + settings.prevImgWidth + '" height="' + settings.prevImgHeight + '" id="prevButton" alt="prev" class="naviPrevActive" /></a>';	
    		} else {
    		    str += '<a href="#" rel="prev">'+settings.prevText+'</a>';	
    		}
			
			if (settings.namedPage) {
				str += '<span class="' + settings.pageClass + '" rel="namedPage"></span>';
			} else {
				for(var i = 0; i < size; i++) {
					var j = i+1;
					str += '<a href="#" rel="'+j+'">';
				    str += (settings.linkText == null) ? j : settings.linkText[j-1];				
					str += '</a>';
				}				
			}
			if (settings.useImageButtons == true) {
			    str += '<a href="#" rel="next"><img src="'+settings.nextImgUrl+'" width="' + settings.nextImgWidth + '" height="' + settings.nextImgHeight + '" id="nextButton" alt="next" class="naviNextActive" /></a>';
			} else {
			    str += '<a href="#" rel="next">'+settings.nextText+'</a>';
			}
			str += '</div></div>';
			switch (settings.navAttach) {		
				case 'before':
					$(me).before(str);
					break;
				case 'after':		
					$(me).after(str);
					break;
				case 'prepend':
					$(me).prepend(str);
					break;
				default:
					$(me).append(str);
					break;
			}
			
		}
		function show () {
			$(me).find(clas).not(navid).hide();
			var show = $(me).find(clas).not(navid).get(i);
			$(show).show();
		}		
		function highlight () {
				$(me).find(navid).find('a').removeClass(settings.highlightClass);
				var show = $(me).find(navid).find('a').get(i+1);			
				$(show).addClass(settings.highlightClass);
		}

		function setFeatures () {
			if (settings.namedPage) {
				$(me).find(navid).find("span").empty().append(settings.pageText + ' ' + (i+1));
			}
			if (settings.showTotalPages) {
				$(me).find(navid).find("span").empty().append((i+1) + settings.totalPagesText + size);
			}
			if (settings.removeNaviKeys) {
			    $(me).find(navid).find('a').css({
						    "visibility":"visible"
				});
			    if (i==0) {
				    $(me).find(navid).find('a[@rel=prev]').css({
						    "visibility":"hidden"
				    });
				}
				if (i+1==size) {
				    $(me).find(navid).find('a[@rel=next]').css({
						    "visibility":"hidden"
				    });
				}
			}
		}

		function sizePanel () {
			if($.browser.msie) {
				$(me).find(clas).not(navid).css( {
					height: settings.height
				});	
			} else {
				$(me).find(clas).not(navid).css( {
					minHeight: settings.height
				});
			}
		}
		function getHighest () {
			var highest = 0;
			$(me).find(clas).not(navid).each(function (count) {
				if(this.offsetHeight > highest) {
					highest = this.offsetHeight;
				}
			});
			highest = highest + "px";
			return highest;
		}
		
		function getNavHeight () {
			var nav = $(navid).get(0);
			return nav.offsetHeight;
		}
		function linkWrap () {
			$(me).find(navid).find("a").wrap(settings.linkWrap);
		}
		init();
		$(this).find(navid).find("a").click(function () {
			if($(this).attr('rel') == 'next') {
				if(i + 1 < size) {
					i = i+1;
				}
			} else if($(this).attr('rel') == 'prev') { 
				if(i > 0) {	
					i = i-1;
				}
			} else {		
				var j = $(this).attr('rel');	
				i = j-1;
			}
			setFeatures();
			show();
			if (!settings.namedPage) {
				highlight();
			}
			return false;
		});
		$(this).find(navid).find("a").mouseup(function(){this.blur();});
	});	
}