tar_autonav={
	defaults:function(){
		return {
		//"ping":"", //The URL of the page that returns JSON
		"mode":"page", //Possible values "stream":auto load (append); "stack":Load More button (append); "page": AJAX page links (replace)
		"autolimit":2, //Positive integer to define the number of times the auto stream should fire before showing a continue button
		"scrolltotop":true, //For "page" mode, sets if the browser should automatically scroll back up to the top of the container with new data
		"offset":-200, //The pixel offset before the automatic stream event fires. Negative numbers move the trigger up the page
		//"pagelabel":"div,stack-page-label page-[x],Page [x]", //Comma-delimited parameters for page delimiter when a new page is drawn. "node type,class name,label text". Wildcard [x] will be replaced with page number
		"selectedclass":".selected_page", //The class used to denote the selected page, should equal what the PHP sends as the initial class
		"pagelinkscontainer":".pages", //Class (".container"), ID ("#container"), or Path ("#post .container ul:first") of pagination links container
		"appendto":".articles", //Class, ID, or Path of element to which the results should be appended !! Will be emptied if stack mode is off, should contain only posts as direct children
		"loadmessage":"", //Message to display while loading posts. Will be used as dynamic message for stream and page, or as button text for stack
		"endmessage":"No More Posts To Display", //Message to display at the end of the stack or stream
		"modifier":"text", //The attribute of the pagination link that should be used to determine the number of the page to be requested
		"cancel":0 //Include this if you wish the user to be able to cancel the automatic loading of more posts. Defined in Milliseconds
		}
	},
	init:function(){
		$(".tar_autonav").each(function(){
			var vars=tar_autonav.buildvars(this,"var","title","text");
			$(this).data(vars);
			tar_autonav.setup(this);
		});
	},
	setup:function(elem){
		var vars=$(elem).data();
		var pagenav=$(elem).find(vars.pagelinkscontainer);
		$(elem).empty().append(pagenav);
		$(elem).addClass(vars.mode);
		if(vars.stack){
			$(elem).find(vars.selectedclass).addClass("loaded").next().addClass("load-next");
			$(elem).find(vars.pagelinkscontainer).hide();
			if(!(vars.auto)){
				$(elem).append('<div class="tar_autonav-load-more-button"><div><span>'+vars.loadmessage+'</span></div></div>');
			}
		}else{
			$(elem).find(vars.pagelinkscontainer+" a").click(function(){
				tar_autonav.hashset(this);
				return false;
			});
			if(document.location.hash!=""){
				var hash=document.location.hash.replace("#","").split("|");
				var setme=tar_autonav.hashtest(hash,$(elem).attr("id"));
				if(setme&&hash[setme]!=1){
					tar_autonav.ping(hash[setme],elem,true);
				}
			}
		}
		tar_autonav.delegate(elem);
	},
	delegate:function(elem){
		var vars=$(elem).data();
		var actid=$(elem).attr("id");
		if(vars.auto){
			$(window).scroll(function(){
				var offset=$(document).scrollTop();
				var windowheight = (typeof window.innerHeight != 'undefined' ? window.innerHeight : document.documentElement.offsetHeight);
				var triggerpos=document.getElementById(actid).offsetTop;
				if(offset+windowheight>=triggerpos+vars.offset){
					if(!($(elem).hasClass("pingaling"))&&!($(elem).hasClass("auto-paused"))&&$(elem).find(".load-next").length){
						var limit=(vars.autolimit)?vars.autolimit:0;
						tar_autonav.events.stream(elem,vars.modifier,limit);
					}
				}
			});
		}else{
			$(elem).find(vars.pagelinkscontainer+" a").click(function(){
				if(!($(elem).hasClass("pingaling"))){
					tar_autonav.events.page(this,vars.modifier);
				}
			});			
			$(elem).find(".tar_autonav-load-more-button").click(function(){
				if(!($(elem).hasClass("pingaling"))){
					tar_autonav.events.stack(this,vars.modifier);
				}
			});
		}
	},
	events:{
		stream:function(elem,modifier,limit){
			$(elem).addClass("pingaling");
			var getpage=tar_autonav.getmod($(elem).find(".load-next"),modifier);
			tar_autonav.ping(getpage,elem);
			var loadcount=($(elem).data("loadcount"))?$(elem).data("loadcount"):0;
			loadcount++
			$(elem).data("loadcount",loadcount);
			if(loadcount==limit){
				$(elem).addClass("auto-paused");
				$(elem).append('<div class="">Continue Streaming Posts</div>');
			}
		},
		stack:function(elem,modifier){
			$(elem).closest(".tar_autonav").addClass("pingaling");
			var getpage=tar_autonav.getmod($(elem).closest(".tar_autonav").find(".load-next"),vars.modifier);
			tar_autonav.ping(getpage,$(elem).closest(".tar_autonav"));
		},
		page:function(elem,modifier){
			$(elem).closest(".tar_autonav").addClass("pingaling");
			var getpage=tar_autonav.getmod($(elem),modifier);
			tar_autonav.ping(getpage,$(elem).closest(".tar_autonav"));
		}
	},
	ping:function(getpage,elem,firstload){
		var vars=$(elem).data();
		var appendto=".tar_autonav";
		if(!(vars.stack)){ $(vars.appendto).css({"height":$(vars.appendto).height()}); $(vars.appendto).empty(); appendto=vars.appendto }
		if(vars.stack&&!vars.auto){
			$(".tar_autonav-load-more-button").addClass("tar_autonav-loading");
		}else{
			var addclass=(vars.loadmessage=="")?" no-message":" has-message";
			$(appendto).append('<div id="tar_autonav-load-more-callout" class="tar_autonav-load-more-callout tar_autonav-loading'+addclass+'">'+vars.loadmessage+'</div>');
		}
		if(!vars.stack&&!firstload&&vars.scrolltotop){ tar_autonav.scrolltotop($(vars.appendto)); }
		$.ajax({
			url:vars.ping.replace("[x]",getpage),
			dataType:'json',
			success:function(json){
				if(vars.mode=="page"){
					$(vars.appendto).find(".tar_autonav-load-more-callout").remove();
				}else{
					$(".tar_autonav-loading").removeClass("tar_autonav-loading");
					$(".tar_autonav-load-more-callout").remove();
				}
				if(vars.pagelabel){
					var pieces=vars.pagelabel.split(",");
					var buildlabel='<'+pieces[0]+' class="'+pieces[1].replace(/\[x\]/g,getpage)+'">'+pieces[2].replace(/\[x\]/g,getpage)+'</'+pieces[0]+'>';
					$(vars.appendto).append(buildlabel);
				}
				for(i=0;i<json.articles.length;i++){ 	
					var title=json.articles[i].title;
					var content=json.articles[i].content;
					var appstring=vars.structure;
					for(x in json.articles[i]){
						var rstr="["+x+"]";
						var rval=json.articles[i][x];
						appstring=appstring.replace(rstr,rval);
					}
					$(vars.appendto).append(appstring);
				}
				$(vars.appendto).removeAttr("style");
				$(elem).removeClass("pingaling");
				if(vars.stack){
					if($(elem).find(".load-next").next().length){
						$(elem).find(".load-next").removeClass("load-next").addClass("loaded").next().addClass("load-next");
					}else{
						$(elem).find(".load-next").removeClass("load-next").addClass("loaded");
						$(elem).append('<div class="">'+vars.endmessage+'</div>');
						$(elem).find(".tar_autonav-load-more-button").remove();
					}
				}
			},
			error:function(jqXHR,textStatus,errorThrown){
				alert("Error: "+errorThrown);
			}
		});
	},
	scrolltotop:function(elem){
		var myid=$(elem).attr("id");
		while($(elem).attr("id")==""){
			myid=tar_autonav.randomstring();
			if(!($("#"+myid).length)){$(elem).attr("id",myid);}
		}
		var offset=document.getElementById(myid).offsetTop-50;
		$("html").animate({scrollTop:offset});
	},
	getmod:function(elem,attr){
		if(attr=="text"){
			return $(elem).text();
		}else{
			return $(elem).attr(attr);
		}
	},
	buildvars:function(elem,node,k,v){
		var vars=tar_autonav.defaults();
		for (i=0;i<$(elem).children(node).length;i++){
			var key=$(elem).children(node+":eq("+i+")").attr(k);
			var val=(v=="text")?$(elem).children(node+":eq("+i+")").text():$(elem).children(node+":eq("+i+")").attr(v);
			if(val=="true"||val=="false"){ val=tar_autonav.bool(val); }
			vars[key]=val;
		}
		switch(vars.mode){
			case "stream":
				vars.auto=true;
				vars.stack=true;
				break;
			case "stack":
				vars.auto=false;
				vars.stack=true;
				break;
			case "page":
				vars.auto=false;
				vars.stack=false;
				break;
		}
		vars["structure"]=$.trim($(elem).find(".structure").html());
		return vars;
	},
	randomstring:function(len,custring){
		var pool=(custring)?custring.split(""):"abcdefghijklmnopqurtuvwxyz".split("");
		var len=(len)?len:6;
		var newid="";
		for(i=0;i<len;i++){newid+=pool[Math.floor(Math.random()*pool.length)];}
		return newid;
	},
	bool:function(val){
		switch(val){
			case "true": return true; break;
			case "false": return false; break;
			case true: return true; break;
			case false: return false; break;
			default: return parseInt(val);
		}
	},
	hashset:function(elem){
		var hash=document.location.hash.replace("#","");
		var hasharr=hash.split("|");
		var myid=$(elem).closest(".tar_autonav").attr("id");
		var mypos=tar_autonav.hashtest(hasharr,myid);
		var mynum=$(elem).text();
		if(mypos){
			hasharr[mypos]=mynum;
			document.location.hash=hasharr.join("|");
		}else{
			var leadin=(hash)?hash+"|":"#";
			document.location.hash=leadin+myid+"|"+mynum;
		}
	},
	hashtest:function(hash,seek){
		var testor=hash;
		var tosender=false;
		for(i=0;i<testor.length;i++){
			if(testor[i]==seek){
				tosender=i+1;
			}
		}
		return tosender;
	}
}

$(document).ready(function(){ tar_autonav.init(); });
