var debug = {
	log: function(string){
		if(typeof(string)!='undefined'){
			if($('#debugConsole').length == 0){
				$('body').append('<div id=\"debugConsole\"></div>');
				$
			}
			$('#debugConsole').fadeIn('normal');
			$('#debugConsole').append('<div>'+string+'</div>');
			//$('#debugConsole').draggable;
		}	
	}
};
var autoPaginate = {
	
	defaults: {
		maxHeight: 200, 
		maxNavPages: 5,
		nextArrow: "&gt;",
		prevArrow: "&lt;",
		currentPage: 1,
		debug: false
	},
	
	init: function(element,defaultsObject){
		var elementData = new Object;
		if(typeof(defaultsObject) != 'undefined'){
			//set maxheight for element
			element.attr("maxHeight", autoPaginate.getData(defaultsObject.maxHeight, autoPaginate.defaults.maxHeight));
			
			//set max nav pages for element
			element.attr("maxNavPages", autoPaginate.getData(defaultsObject.maxNavPages, autoPaginate.defaults.maxNavPages));
			
			//set next arrow html for nav
			element.attr("nextArrow", autoPaginate.getData(defaultsObject.nextArrow, autoPaginate.defaults.nextArrow));
			
			//set prev arrow html for nav
			element.attr("prevArrow", autoPaginate.getData(defaultsObject.prevArrow, autoPaginate.defaults.prevArrow));
			
			//debugging
			element.attr("debug", autoPaginate.getData(defaultsObject.debug, autoPaginate.defaults.debug));
			
			//current page
			element.attr("currentPage", autoPaginate.getData(defaultsObject.currentPage, autoPaginate.defaults.currentPage));
		}else{
			element.attr("maxHeight", autoPaginate.defaults.maxHeight);
			element.attr("maxNavPages", autoPaginate.defaults.maxNavPages);
			element.attr("nextArrow", autoPaginate.defaults.nextArrow);
			element.attr("prevArrow", autoPaginate.defaults.prevArrow);
			element.attr("debug", autoPaginate.defaults.debug);
			element.attr("currentPage", autoPaginate.defaults.currentPage);
		}
		
		element.attr("pages", autoPaginate.parseElements(element));
		
		if(element.attr("pages")>1){
			autoPaginate.buildNav(element);
		}
		
	},
	getData: function(sourceVal,defaultVal){
		var targetVal;
		if(typeof(sourceVal) != 'undefined'){
			targetVal = sourceVal;
		}else{
			targetVal = defaultVal;
		}
		return targetVal;
	},
	parseElements: function(parent){
		var kids = $(parent).children();
		var page = 1;
		var pageHeight = 0;
		
		parent.attr('autoPaginate',
			function(){
				var randomnumber=Math.floor(Math.random()*1000);
				while($("ul[autoPaginate='"+randomnumber+"']").length > 0){
					randomnumber=Math.floor(Math.random()*1000);
				}
				return randomnumber;
			}
		);
		kids.each(function(i){
			var element = $(this);
			var realHeight = element.height();
			if((parseInt(pageHeight) + parseInt(realHeight)) <= parseInt(parent.attr("maxHeight"))){
				pageHeight = parseInt(pageHeight) + parseInt(realHeight);
			}else{
				page++;
				pageHeight = 0;
				pageHeight = parseInt(pageHeight) + parseInt(realHeight);
			}
			autoPaginate.setPageValue(element,page);
		});
		return page;
	},
	setPageValue: function(element,pageID){
		element.attr('page',pageID);
		if(pageID != 1){
			element.addClass('hiddenPage');
		}
	},
	
	bindPageNav: function(paginationID){
		var navElements = $("ul[navid='"+paginationID+"']>li>a");
		navElements.bind('click',function(e){
			var element = e.currentTarget;
			var page = $(element).attr("pageId");
			if(!$(element).is(".paginatePrev") && !$(element).is(".paginateNext")){
				autoPaginate.updateNav(page,paginationID);
			}else{
				var currentPage = $("ul[autoPaginate='"+paginationID+"']").attr("currentPage");
				if($(element).is(".paginateNext")){
					var move = parseInt(currentPage) + 1;
				}else{
					var move = parseInt(currentPage) - 1;
				}
				autoPaginate.updateNav(move,paginationID);
			}
			
			return false;
		});
	},
	updateNav: function(page, paginationID){
		var pageLimit = parseInt($("ul[navid='"+paginationID+"']>li").length) - 2;
		var max = $("ul[navid='"+paginationID+"']").attr("max");
		
		var min = $("ul[navid='"+paginationID+"']").attr("min");
		
		var maxNavPages = $("ul[navid='"+paginationID+"']").attr("maxNavPages");
		var pages = $("ul[autoPaginate='"+paginationID+"']").attr("pages");
		
		if(page > 0 && page <= pageLimit){
			
			function update(min,max,move,paginationID,page){
				$("ul[navid='"+paginationID+"']>li.number").addClass("hiddenPage");
				var newMin = parseInt(min)+parseInt(move);
				
				var newMax = parseInt(max)+parseInt(move);
				
				for(i = newMin; i <= newMax; i++){
					
					$("#"+paginationID+"-"+i).removeClass("hiddenPage");
				}
				$("ul[navid='"+paginationID+"']").attr("min",newMin);
				$("ul[navid='"+paginationID+"']").attr("max",newMax);
			}
			if(parseInt(page) >= parseInt(max) && parseInt(page) != parseInt(pages)){
				update(min,max,1,paginationID,page);
			}
			if(parseInt(page) <= parseInt(min) && parseInt(page) != 1){
				update(min,max,-1,paginationID,page);
			}
			if(parseInt(page) == 1){$("ul[navid='"+paginationID+"']>li:first").css("visibility","hidden")}else{$("ul[navid='"+paginationID+"']>li:first").css("visibility","visible")}
			if(parseInt(page) == pageLimit){$("ul[navid='"+paginationID+"']>li:last").css("visibility","hidden")}else{$("ul[navid='"+paginationID+"']>li:last").css("visibility","visible")}
			$("ul[autoPaginate='"+paginationID+"']").children().addClass('hiddenPage');
			$("ul[autoPaginate='"+paginationID+"']>li[page='"+page+"']").removeClass('hiddenPage');
			$("ul[autoPaginate='"+paginationID+"']").attr("currentPage", page);
			$("ul[navid='"+paginationID+"']>li>a").removeClass("pageinateNavSelected");
			$("ul[navid='"+paginationID+"']>li>a[pageId='"+page+"']").addClass("pageinateNavSelected");
		}
		
	},
	buildNav: function(element){
		var paginationID = element.attr('autoPaginate');
		var max = parseInt(element.attr("maxNavPages"));
		if(parseInt(element.attr("pages")) > 1 ){
		    var html = "<div id=\"paginationContainer\" class=\"paginationContainer\"><ul class=\"paginationNav\" navid=\""+paginationID+"\" min=\"1\" max=\""+max+"\">";
		    html += "<li style=\"visibility: hidden;\"><a href=\"#last\" class=\"paginatePrev\">"+element.attr("prevArrow")+"</a></li>";
		    for(var i=1;i <= parseInt(element.attr("pages")); i++){
			    var hidden = "";
			    if(i > element.attr("maxNavPages")){
				    hidden = " hiddenPage";
			    }
			    html += "<li class=\"number"+hidden+"\" id=\""+paginationID+"-"+i+"\"><a pageId=\""+i+"\"  href=\"#"+i+"\">"+i+"</a></li>";
		    }
		    html += "<li><a href=\"#next\" class=\"paginateNext\">"+element.attr("nextArrow")+"</a></li>"
		    html += "</ul></div>";
		    element.after(html);
		    $("ul[navid='"+paginationID+"']>li>a[pageId='1']").addClass("pageinateNavSelected");
		    autoPaginate.bindPageNav(paginationID);
		 }
	},
	getContainer: function(){
		
	}
};
