var fadetime=1200;
var fadeincrement=50;

var hashlocation=null,hashchangeinterval=null,navmap={},currentpage=null,navlis=[],homepage={},pagechanging=false,ietest=0,ietime=new Date(), twitted=false;
/* <?php require_once('navimages.js'); ?> */


$(document).ready(function(){
	initnavlinks();
	homepage.container=document.getElementById('index-pages');
	homepage.page=document.getElementById('index');
	homepage.src='index';
	homepage.hash='';
	homepage.subnavs=[];
	$('#nav img.home-image').each(function(){
		homepage.subnavs.push(this);
	});
	changepage(gethash());
	
	function initnavlinks()
	{
		var lis=$('#nav > li');
		var i=0;
		lis.each(function(){
			var map={}, li=$(this);
			navlis.push(this);
			map.a=li.children('span').children('a')[0];
			map.nav=li.children('ul')[0];
			map.links={};
			map.container=document.getElementById(this.id+'-pages');
			var j=0;
			li.find('ul > li > a').each(function(){
				var ind=this.href.indexOf('#');
				if (ind==-1) return;
				map.links[gethashsect(this.href.substring(ind+1),1)]=this;
				this.imgsrcs=navimages[i][j];
				j++;
			});
			navmap[this.id]=map;
			i++;
		});
		
		$('#nav a').click(function(e){
			if (!hashchangeinterval&&!pagechanging) starthashchangedetector();
		});
	}
});


function changepage(hash)
{
	if (pagechanging) {return;}
	if (currentpage&&currentpage.hash==hash) return;
	pagechanging=true;
	stophashchangedetector();
	var newpage={};
	if (hash=='') //index
	{
		newpage=homepage;
	}
	else
	{
		var hashes=hash.split('/');
		newpage.container=document.getElementById(hashes[0]+'-pages');
		newpage.page=document.getElementById(hash.replace('/','-'));
		if (!newpage.container||!newpage.page) {endswitch(); return;}
		newpage.hash=hash;
		newpage.src=hash;
		newpage.as=getnavlinkbyhash(hash);
		newpage.subnavs=[];
		var imgcount=0;
		for (var i=0;i<navlis.length;i++)
		{
			if (navlis[i].id==hashes[0]) newpage.subnavs[i]=$(navlis[i]).children('ul')[0];
			else
			{
				newpage.subnavs[i]=newpage.as[1].imgsrcs[imgcount];
				imgcount++;
			}
		}
	}
	
	if (!currentpage)
	{
		$.get('pages/'+newpage.src+'.php',function(data){
			newpage.page.innerHTML=data;
			addtwitter();
		});
		if (newpage.as!==undefined)
		{
			var hashes=hash.split('/');
			var imgcount=0;
			var srcs=newpage.as[1].imgsrcs;
			for (var i=0;i<newpage.subnavs.length;i++)
			{
				if (typeof(newpage.subnavs[i])!='string') continue;
				var img=new Image();
				img.src=srcs[imgcount];
				navlis[i].appendChild(img);
				srcs[imgcount]=img;
				newpage.subnavs[i]=img;
				imgcount++;
			}
		}
		$(newpage.subnavs).addClass('selected');
		$(newpage.as).addClass('selected');
		addfooter();
		$(newpage.container).show();
		$(newpage.page).show();
		currentpage=newpage;
		endswitch();
		return;
	}
	else
	{
		if (newpage.hash==currentpage.hash) {endswitch();return;}
		
		var pageloaded=false,imgsloaded=false;
		
		if (!newpage.as[1].imgsrcs[0].src) 
		{
			new ImageLoader(newpage.as[1].imgsrcs, function(imgs){
			//	alert(newpage.as[1].imgsrcs);
				if ((new Date()-ietime)<1000) ietest++;
				else ietest=0;
				if (ietest>10) {refresh(true);}
				ietime=new Date();
				var imgcount=0;
				var srcs=newpage.as[1].imgsrcs;
				for (var i=0;i<navlis.length;i++)
				{
					if (navlis[i].id==hashes[0]);
					else
					{
						var img=imgs[imgcount];
						try {navlis[i].appendChild(img);}
						catch (e) {};
						srcs[imgcount]=img;
						newpage.subnavs[i]=img;
						imgcount++;
					}
				}
				imgsloaded=true;
				//	checkisdone();
				if (pageloaded&&imgsloaded) switchpages();
			});
		}
		else 
		{
			imgsloaded=true;
			//	checkisdone();
			if (pageloaded&&imgsloaded) switchpages();
		}
		
		if (newpage.page.innerHTML=='') 
		{
			$.get('/pages/'+newpage.src+'.php',function(data){
				newpage.page.innerHTML=data;
				addtwitter();
				pageloaded=true;
				//	checkisdone();
				if (pageloaded&&imgsloaded) switchpages();
			});
		}
		else
		{
			pageloaded=true;
		//	checkisdone();
			if (pageloaded&&imgsloaded) switchpages();
		}
		
		// why is this function 'not defined' when called from the 'else' blocks?
		function checkisdone()
		{
			if (pageloaded&&imgsloaded) switchpages();
		}
	}
	
	
	function switchpages()
	{
		var switching=[[],[]];
		for (var i=0;i<4;i++)
		{
			var ol=currentpage.subnavs[i], ne=newpage.subnavs[i];
			if (ol!=ne) 
			{
				switching[0].push(ne);
				switching[1].push(ol);
			}
		}
		$(currentpage.as).removeClass('selected');
		$(newpage.as).addClass('selected');

		$(switching[0]).fadeIn(fadetime, function(){
			$(this).addClass('selected');
		});
		$(switching[1]).fadeOut(fadetime, function(){
			$(this).removeClass('selected');
		});
		
		var ol=currentpage.page, ne=newpage.page;
		if (ol.parentNode==ne.parentNode)
		{
			ol=currentpage.page;
			ne=newpage.page;
			if (ol!=ne)
			{
				$(ol).fadeOut(fadetime/2,function(){
					$(ne).fadeIn(fadetime/2);
				});
			}
		}
		else
		{
			$(ne).show();
			$(ne.parentNode).fadeIn(fadetime);
			$(ol.parentNode).fadeOut(fadetime,function(){$(ol).hide();});
			$('#footer-div').appendTo($(newpage.container));
		}
		setTimeout(function(){
			currentpage=newpage;
			endswitch();
			return;
		},fadetime+100);
	}
	
	function endswitch()
	{
		pagechanging=false;
		starthashchangedetector(hash);
	}
	
	function addfooter()
	{
		var footer=document.getElementById('footer-div');
		if (footer.parentNode!=newpage.container) $(footer).appendTo($(newpage.container));
	}
	
	function addtwitter()
	{
		if (twitted||newpage.page.id!='journal-journal') return;
		twitted=true;
		var head=document.getElementsByTagName('head')[0], scr=document.createElement('script');
		scr.setAttribute('type','text/javascript');
		scr.setAttribute('src','/js/twitter.js');
		head.appendChild(scr);
		
		var tweetint=setInterval(tweet,300);
		
		function tweet()
		{
			if (typeof getTwitters==='undefined') return;
			clearInterval(tweetint);
			getTwitters('twitterpated', { 
				id: 'mariahines', 
				count: 26, 
				enableLinks: true, 
				ignoreReplies: true, 
				clearContents: false,
				template: '%text% <a href="http://twitter.com/%user_screen_name%/statuses/%id%/">%time%</a>',
				callback: function(){
					$('#twitterpated > ul > li').each(function(){
						var html=this.innerHTML;
					  	if (html.indexOf('@')==0||html.indexOf('.@')==0) this.parentNode.removeChild(this);
					  	else this.style.marginTop='20px';
					 });
				}
			});
		}
	}

}

function getimagebysrc(src,parentnode)
{
	var imgs=parentnode.getElementsByTagName('img');
	var len=imgs.length;
	for (var i=0,img;i<imgs.length,img=imgs[i];i++)
	{
		if (img.getAttribute('src')==src) return img;
	}
	return null;
}

function getnavlinkbyhash(hash)
{
	hash=striphash(hash);
	if (hash=='') return null;
	var subs=hash.split('/');
	var nav=navmap[subs[0]];
	if (!nav) return [];
	return [nav.a,nav.links[subs[1]]];
}

function gethashbase(hash)
{
	return hash.split('/')[0];
}
function gethashsect(hash,index)
{
	return hash.split('/')[index]||'';
}

function gethash()
{
	return striphash(window.location.hash) || '';
}
function striphash(hash)
{
	return hash.replace('#','');
}

function starthashchangedetector(newhash)
{
	if (!hashchangeinterval)
	{
		hashlocation=newhash;
		hashchangeinterval=setInterval(function(){
			var hash=gethash();
			if (hash!=hashlocation)
			{
				hashchangehandler(hash);
			}
		},300);
	}
}
function stophashchangedetector()
{
	if (hashchangeinterval) {clearInterval(hashchangeinterval);}
	hashchangeinterval=null;
}

function hashchangehandler(hash)
{
//	stophashchangedetector();
	changepage(hash);
}

function ImageLoader(srcs,callback)
{
	if (srcs.constructor!=Array || typeof callback!='function') return null;
	
	var a=this, images=new Array(srcs.length), loaded=new Array(srcs.length), sentcallback=false;
	for (var i=0;i<srcs.length;i++)
	{
		loaded[i]=null;
	//	alert(srcs[i]+'\n'+srcs.length+'\n'+i);
		add(srcs[i],i);
	}
	a.images=loaded;
	
	
	function add(src,spot)
	{
		var img=new Image();
		img.isloaded=false;
		var tries=0;
		img.onerror=onerr;
		img.onabort=onabort;
		img.onload=onload
		img.src=src;
		images[spot]=img;
		
		function onload()
		{
		//	alert('images['+spot+'] = '+this);
			this.isloaded=true;
			loaded[spot]=this;
			checkisready();
		}
		function onerr()
		{
			tries++;
		//	alert('error!\n'+src+'\n'+srcs+'\n'+tries);
			if (tries>4) return;
			tryagain();
		}
		function onabort()
		{
			tries++;
		//	alert('abortion!\n'+src+'\n'+tries);
			if (tries>4) return;
			tryagain();
		}
		
		function tryagain()
		{
			img=new Image();
			img.isloaded=false;
			img.onerror=onerr;
			img.onabort=onabort;
			img.onload=onload
			img.src=src;
			images[spot]=img;
		}
	}
	
	function checkisready()
	{
		if (sentcallback) return;
		for (var i=0;i<loaded.length;i++)
		{
	//		alert(i+'\n'+images[i]);
			if (loaded[i]);
			else return false;
	//		alert('images['+i+'] is loaded');
		}
		
		sentcallback=true;
		return callback(loaded);
	}
	
}