//################## SETUP AND INITIALISATION ###################
if (window.addEventListener) { //DOM method for binding an event
	window.addEventListener("load", init, false);
	//window.addEventListener("onpaste", MCTEFormat.onPaste(), false);
} else if (window.attachEvent) {//IE exclusive method for binding an event
	window.attachEvent("onload", init);
	//window.attachEvent("onpaste", MCTEFormat.onPaste());
} else if (document.getElementById) {//support older modern browsers
	window.onload=init();
	//window.onpaste = MCTEFormat.onPaste();	
}


var transify = new LUCIDtransitions();
var convertedlinks = [];
var da = null;
var simplegal = null;
var ptr = "/";
var contentcontainerheight = null;
var contentcontainerel = null;
var contentinnerel = null;

function init() {
	transify.setupLinks();
	da = new LucidSimpleComms(transify);
	
	simplegal = new simpleGalleryFader(document.getElementById("recentwork_homepage"), document.getElementById("recentwork_pager"));
	
	if (window.location.hash != "") {
		var masterhash = window.location.hash.toString();
		transify.initprocesshash(masterhash.replace("#", ""));
	} else {
		transify.registeredhash = "#"+ptr+"layout/1/main"
		window.location.hash = "#"+ptr+"layout/1/main";
	}
	
	contentcontainerel = document.getElementById("rightside");
	contentcontainerheight = parseInt(contentcontainerel.offsetHeight);
	contentinnerel = document.getElementById("rightside_inner");
}

function LUCIDtransitions() {
	
	this.opendiv = null;
	this.animating = false
	var foo = this;
	var animatingfinished = new YAHOO.util.CustomEvent('animation was finished');
	this.ajaxloadingfinished = null;
	var classselector = "class";
	
	this.callback = null;
	
	this.fireRetainedLink = function(linktext) {
		
		var arrElements = document.getElementsByTagName('a');
		for (var i = 0; i < arrElements.length; i++) {
			if (arrElements[i].getAttribute('href') != null) {
				var myRE = new RegExp("javascript:transify", "i")
				//alert("in here! "+arrElements[i].getAttribute('href'));
				if (arrElements[i].getAttribute('href').search(myRE) != -1) { //has to be a relative link to transition
					
					if (arrElements[i].oldurl != null) { //only want to deal with converted links
						
						//alert("fired: "+arrElements[i].innerHTML+" : "+linktext.toLowerCase());
						if (linktext.toLowerCase() == arrElements[i].innerHTML.toLowerCase()) {
							
							eval(arrElements[i].href.replace("javascript:", "").replace("%20",""));
							
						}
					}
				}
			}
		}
	}
	
	this.setupLinks = function() {
		
		var arrElements = document.getElementsByTagName('div');
		for (var i = 0; i < arrElements.length; i++) {
			if (arrElements[i].getAttribute('includetype') == "page") {
				var pagecontentdiv = arrElements[i].getAttribute('id');
				var pagecontentinclude = arrElements[i].getAttribute('include');
			}
		}
		
		var arrElements = document.getElementsByTagName('a');
		
		for (var i = 0; i < arrElements.length; i++) {
			if (arrElements[i].getAttribute('href') != null) {
				var myRE = new RegExp("http://", "i");
				//if (document.all) { 
					var myRE1 = new RegExp("/page/", "i");
					var myRE1a = new RegExp("/lucid2/", "i");
					var myRE1b = new RegExp("/192\.168\.178\.64/", "i");
					var myRE1c = new RegExp("/localhost/", "i");
					var myRE1d = new RegExp("page\.php", "i");
				//}
				var myRE2 = new RegExp("javascript:", "i");
				var myRE3 = new RegExp("mailto:", "i");
				var myRE4 = new RegExp("#", "i");
				
				if (((!document.all) && arrElements[i].getAttribute('href').search(myRE) == -1 && arrElements[i].getAttribute('href').search(myRE2) == -1 && arrElements[i].getAttribute('href').search(myRE3) == -1 && arrElements[i].getAttribute('href').search(myRE4) == -1) || (document.all && (arrElements[i].getAttribute('href').search(myRE2) == -1 && arrElements[i].getAttribute('href').search(myRE3) == -1 && arrElements[i].getAttribute('href').search(myRE4) == -1 && (arrElements[i].getAttribute('href').search(myRE1) != -1 || arrElements[i].getAttribute('href').search(myRE1a) != -1 || arrElements[i].getAttribute('href').search(myRE1b) != -1 || arrElements[i].getAttribute('href').search(myRE1c) != -1 || arrElements[i].getAttribute('href').search(myRE1d) != -1)))) { //has to be a relative link to transition
					//alert("setting up links:"+arrElements[i].getAttribute('href'));
					oldhref = arrElements[i].getAttribute('href');
					if (arrElements[i].oldurl == null) {
						var d = Math.ceil(1000000*Math.random());
						var divid = "container_"+d;
						
						convertedlinks[oldhref] = divid; //keep track of any links we've converted so we dont convert them again later on!
						var urlelements = oldhref.split("/");
						var urlend = urlelements[urlelements.length-1];
						//var newurl = oldhref.replace("/page/","/layout/").replace(urlend, pagecontentinclude);
						var newurl = "";
						if (oldhref.search(myRE1d) != -1) {
							newurl += oldhref+"&layout=main";
						} else {
							newurl = oldhref.replace("/page/","/layout/").replace(urlend, "main");
						}
						//alert("got in here:"+newurl);
						arrElements[i].href = "javascript:transify.transin(document.getElementById('"+divid+"'), '"+newurl+"')";
						arrElements[i].oldurl = oldhref;
						var maincontainer = document.getElementById(pagecontentdiv);
						var newobj = document.createElement('div');
						newobj.setAttribute('id', divid);
						newobj.style.display = "none";
						newobj.style.overflow = "hidden";
						maincontainer.appendChild(newobj);
						transify.changeOpacity(newobj,0);
					}					
				}
			}
		}
	}
	
	this.pausecomp = function (millis) 
	{
		var date = new Date();
		var curDate = null;
	
		do { curDate = new Date(); } 
		while(curDate-date < millis);
	} 
	
	this.transout = function() {
		this.animating = true;
		var arrElements = this.opendiv.getElementsByTagName('div')
		var olddiv = this.opendiv;
		
		var upfades = function() {
			count = 0;
			for (var i = 0; i < arrElements.length; i++) {
				if (arrElements[i].className != null) {
					myRE = new RegExp("transup", "i")
					if (arrElements[i].className.search(myRE) != -1) {
						foo.fadeoutdown(arrElements[i]);
						count++;	
					}
				}
			}
			/*if (count > 0) {
				setTimeout(rightfades,350);
				setTimeout(leftfades,350);
			} else {
				rightfades();
				leftfades();
			}*/
			downfades(count);
		}
		
		var downfades = function(count) {
			if (!count) {
				count = 0;
			}
			for (var i = 0; i < arrElements.length; i++) {
				if (arrElements[i].className != null) {
					myRE = new RegExp("transdown", "i")
					if (arrElements[i].className.search(myRE) != -1) {
						foo.fadeoutup(arrElements[i]);
						count++;	
					}
				}
			}
			if (count > 0) {
				setTimeout(rightfades,350);
				setTimeout(leftfades,350);
			} else {
				rightfades();
				leftfades();
			}
		}
		
		var rightfades = function() {
			count = 0;
			for (var i = 0; i < arrElements.length; i++) {
				if (arrElements[i].className != null) {
					myRE = new RegExp("transright", "i")
					if (arrElements[i].className.search(myRE) != -1) {
						foo.fadeoutright(arrElements[i]);
						count++;	
					}
				}
			}
		}
		
		var leftfades = function() {
			count = 0;
			for (var i = 0; i < arrElements.length; i++) {
				if (arrElements[i].className != null) {
					myRE = new RegExp("transleft", "i")
					if (arrElements[i].className.search(myRE) != -1) {
						foo.fadeoutleft(arrElements[i]);
						count++;		
					}
				}
			}
			//tell the world we're finished so the next action can happen
			var stopanim = function () {
				animatingfinished.fire();
				foo.animating = false;
			}
			if (count > 0) {
				setTimeout(stopanim,550); //all this set of animations to complete
			} else {
				setTimeout(stopanim,250); //allow any previous animations to complete
				//stopanim();
			}
		}
		
		count = 0;
		for (var i = 0; i < arrElements.length; i++) {
			//alert("fading out : "+arrElements[i].getAttribute('className'));
			if (arrElements[i].className != null) {
				myRE = new RegExp("transout", "i")
				
				if (arrElements[i].className.search(myRE) != -1) {
					this.fadeout(arrElements[i]);
					count++;		
				}
			}
		}
		if (count > 0) {
			setTimeout(upfades,350);
		} else {
			upfades();
		}
		return false;
	}
	
	this.transinanimation = function(targetdiv) {
		this.animating = true;
		var arrElements = targetdiv.getElementsByTagName('div')
		//var olddiv = this.opendiv;
		
		var upfades = function() {
			count = 0;
			for (var i = 0; i < arrElements.length; i++) {
				if (arrElements[i].className != null) {
					myRE = new RegExp("transup", "i")
					if (arrElements[i].className.search(myRE) != -1) {
						foo.fadeinup(arrElements[i]);
						count++;	
					}
				}
			}
			/*if (count > 0) {
				setTimeout(rightfades,350);
				setTimeout(leftfades,350);
			} else {
				rightfades();
				leftfades();
			}*/
			downfades(count);
		}
		
		var downfades = function(count) {
			if (!count) {
				count = 0;
			}
			for (var i = 0; i < arrElements.length; i++) {
				if (arrElements[i].className != null) {
					myRE = new RegExp("transdown", "i")
					if (arrElements[i].className.search(myRE) != -1) {
						foo.fadeindown(arrElements[i]);
						count++;	
					}
				}
			}
			if (count > 0) {
				setTimeout(rightfades,350);
				setTimeout(leftfades,350);
			} else {
				rightfades();
				leftfades();
			}
		}
		
		var rightfades = function() {
			count = 0;
			for (var i = 0; i < arrElements.length; i++) {
				if (arrElements[i].className != null) {
					myRE = new RegExp("transright", "i")
					if (arrElements[i].className.search(myRE) != -1) {
						foo.fadeinright(arrElements[i]);
						count++;	
					}
				}
			}
		}
		
		var leftfades = function() {
			count = 0;
			for (var i = 0; i < arrElements.length; i++) {
				if (arrElements[i].className != null) {
					myRE = new RegExp("transleft", "i")
					if (arrElements[i].className.search(myRE) != -1) {
						foo.fadeinleft(arrElements[i]);
						count++;		
					}
				}
			}
			//tell the world we're finished so the next action can happen
			var stopanim = function () {
				animatingfinished.fire();
				foo.animating = false;
				//if (contentcontainerel && contentinnerel) { //sanity check container height as some browsers seem to be getting this wrong at the beginning of the process.
				//	if (parseInt(contentcontainerel.offsetHeight) != parseInt(contentinnerel.offsetHeight)) { 
				//		var height = new YAHOO.util.Anim(contentcontainerel, { height: { to: parseInt(contentinnerel.offsetHeight) }}, 0.5, YAHOO.util.Easing.easeOutStrong);
				//		height.animate();
				//	}
				//}
			}
			if (count > 0) {
				setTimeout(stopanim,550); //all this set of animations to complete
			} else {
				setTimeout(stopanim,250); //allow any previous animations to complete
				//stopanim();
			}
		}
		
		var fadeouts = function() {
			count = 0;
			for (var i = 0; i < arrElements.length; i++) {
				if (arrElements[i].className != null) {
					myRE = new RegExp("transout", "i")
					if (arrElements[i].className.search(myRE) != -1) {
						foo.fadein(arrElements[i]);
						count++;		
					}
				}
			}
			if (count > 0) {
				setTimeout(upfades,350);
			} else {
				upfades();
			}
		}
		
		//expand container
		//if (contentcontainerel && contentinnerel) {
		//	var height = new YAHOO.util.Anim(contentcontainerel, { height: { to: parseInt(contentinnerel.offsetHeight) }}, 0.5, YAHOO.util.Easing.easeOutStrong);
		//	height.animate();
		//	setTimeout(fadeouts,550);
		//} else {
			fadeouts();
		//}
		return false;
	}
	
	this.transin = function(targetdiv, URL) {
		if (this.opendiv != targetdiv) {
			//alert("transition");
			this.transout();
			var olddiv = this.opendiv;
			var oncomplete = function() {
				olddiv.style.display = "none";
				olddiv.innerHTML = "";
				
				
				//dial up opacity on all the faded out elements
				/*var arrElements = olddiv.getElementsByTagName('div')
				for (var i = 0; i < arrElements.length; i++) {
					if (arrElements[i].className != null) {
						myRE = new RegExp("transout", "i")
						myRE1 = new RegExp("transup", "i")
						myRE2 = new RegExp("transright", "i")
						myRE3 = new RegExp("transleft", "i")
						myRE4 = new RegExp("transdown", "i")
						if (arrElements[i].className.search(myRE) != -1 || arrElements[i].className.search(myRE1) != -1 || arrElements[i].className.search(myRE2) != -1 || arrElements[i].className.search(myRE3) != -1 || arrElements[i].className.search(myRE4) != -1) {
							//alert(arrElements[i].className);
							foo.changeOpacity(arrElements[i], 100);
							count++;		
						}
					}
				}*/
				foo.changeOpacity(olddiv, 0); //dial down the opacity on the old div so we dont get the 'double blink' effect next time it becomes active
				//foo.fadein(targetdiv);
				
				//dial down opacity on all the target div elements
				var arrElements = targetdiv.getElementsByTagName('div')
				for (var i = 0; i < arrElements.length; i++) {
					if (arrElements[i].className != null) {
						myRE = new RegExp("transout", "i")
						myRE1 = new RegExp("transup", "i")
						myRE2 = new RegExp("transright", "i")
						myRE3 = new RegExp("transleft", "i")
						myRE4 = new RegExp("transdown", "i")
						if (arrElements[i].className.search(myRE) != -1 || arrElements[i].className.search(myRE1) != -1 || arrElements[i].className.search(myRE2) != -1 || arrElements[i].className.search(myRE3) != -1 || arrElements[i].className.search(myRE4) != -1) {
							//alert(arrElements[i].id);
							foo.changeOpacity(arrElements[i], 0);
							count++;		
						}
					}
				}
				targetdiv.style.display = "block";
				foo.changeOpacity(targetdiv, 100);
				
				this.transinanimation(targetdiv);
				//if the original container is still present then we need to remove it to avoid id clashes later on
				var original = document.getElementById("originalcontent_container");
				if (original) {
					original.parentNode.removeChild(original);
				}
				
				//reset all template based includes like nav's etc
				var arrElements = document.getElementsByTagName('div');
				for (var i = 0; i < arrElements.length; i++) {
					if (arrElements[i].getAttribute('includetype') == "template") {
						//var pagecontentdiv = arrElements[i].getAttribute('id');
						var pagecontentinclude = arrElements[i].getAttribute('include');
						var urlelements = URL.split("/");
						var urlend = urlelements[urlelements.length-1];
						var newurl = URL.replace("/page/","/layout/").replace(urlend, pagecontentinclude);
						//alert(newurl+" : "+URL);
						da.remoteContent(newurl, arrElements[i]);
					}
				}
				if (Cufon) {
					Cufon.refresh();
					//alert("I got called");
					//setTimeout("Cufon.refresh()",1000);
					foo.generatehash(URL);
				}
			}
			foo.callback = oncomplete;
			this.opendiv = targetdiv;
			
			//get page output
			da.remoteContent(URL, targetdiv);
		}
		
		
	}
	
	this.runcallback = function() {
		if (foo.callback) {
			foo.callback();
			foo.callback = null;
		} else {
			//alert("no callback defined");
		}
	}
	
	this.triggerruncallback = function() {
		if (foo.animating) {
			setTimeout(function() {foo.triggerruncallback();}, 100);
		} else {
			foo.runcallback();
		}
	}
	
	this.setActiveDiv = function(targetdiv) {
		this.opendiv = targetdiv;
	}
	
	this.createContentContainer = function(masterContainerDiv) {
		
		//return div
	}
	
	this.loadContentForContainer = function(URL, container) {
		
	}
	
	this.changeOpacity = function(el, value) {
		if (document.all) {
			el.style["filter"] = "alpha(opacity="+value+")";
		} else {
			el.style["opacity"] = value/100;
		}
	}
	
	this.fadeout = function(element) {
		var fade = new YAHOO.util.Anim(element, { opacity: { from: 1, to: 0 }}, 0.5, YAHOO.util.Easing.easeIn);
		fade.animate();
	}
	
	this.fadeoutup = function(element) {
		var fade = new YAHOO.util.Anim(element, 
										{ opacity: { from: 1, to: 0 },
										  top: { by: -200}}, 0.5, YAHOO.util.Easing.easeIn);
		myHandler = function(type, args) { 
			element.style.top = (parseInt(element.style.top)+200)+"px";
		} 
		fade.onComplete.subscribe(myHandler);
		fade.animate();
	}
	
	this.fadeoutdown = function(element) {
		var fade = new YAHOO.util.Anim(element, 
										{ opacity: { from: 1, to: 0 },
										  top: { by: 200}}, 0.5, YAHOO.util.Easing.easeIn);
		myHandler = function(type, args) { 
			element.style.top = (parseInt(element.style.top)-200)+"px";
		} 
		fade.onComplete.subscribe(myHandler);
		fade.animate();
	}
	
	this.fadeoutleft = function(element) {
		var fade = new YAHOO.util.Anim(element, 
										{ opacity: { from: 1, to: 0 },
										  left: { by: -200}}, 0.5, YAHOO.util.Easing.easeIn);
		myHandler = function(type, args) { 
			element.style.left = (parseInt(element.style.left)+200)+"px";
		} 
		fade.onComplete.subscribe(myHandler);
		fade.animate();
	}
	
	this.fadeoutright = function(element) {
		var fade = new YAHOO.util.Anim(element, 
										{ opacity: { from: 1, to: 0 },
										  left: { by: 200}}, 0.5, YAHOO.util.Easing.easeIn);
		myHandler = function(type, args) { 
			element.style.left = (parseInt(element.style.left)-200)+"px";
		} 
		fade.onComplete.subscribe(myHandler);
		fade.animate();
	}
	
	this.fadein = function(element) {
		var fade = new YAHOO.util.Anim(element, { opacity: { from: 0, to: 1 }}, 0.5, YAHOO.util.Easing.easeOut);
		fade.animate();
	}
	
	this.fadeinup = function(element) {
		if (isNaN(parseInt(element.style.top))) {
			element.style.top = 200+"px";
		} else {
			element.style.top = (parseInt(element.style.top)+200)+"px";
		}
		var fade = new YAHOO.util.Anim(element, 
										{ opacity: { from: 0, to: 1 },
										  top: { by: -200}}, 0.5, YAHOO.util.Easing.easeOut);
		fade.animate();
	}
	
	this.fadeindown = function(element) {
		if (isNaN(parseInt(element.style.top))) {
			element.style.top = (-200)+"px";
		} else {
			element.style.top = (parseInt(element.style.top)-200)+"px";
		}
		var fade = new YAHOO.util.Anim(element, 
										{ opacity: { from: 0, to: 1 },
										  top: { by: 200}}, 0.5, YAHOO.util.Easing.easeOut);
		fade.animate();
	}
	
	this.fadeinleft = function(element) {
		if (isNaN(parseInt(element.style.left))) {
			element.style.left = (-200)+"px";
		} else {
			element.style.left = (parseInt(element.style.left)-200)+"px";
		}
		
		var fade = new YAHOO.util.Anim(element, 
										{ opacity: { from: 0, to: 1 },
										  left: { by: 200}}, 0.5, YAHOO.util.Easing.easeOut); 
		//fade.onComplete.subscribe(myHandler);
		fade.animate();
	}
	
	this.fadeinright = function(element) {
		if (isNaN(parseInt(element.style.left))) {
			element.style.left = (200)+"px";
		} else {
			element.style.left = (parseInt(element.style.left)+200)+"px";
		}
		
		var fade = new YAHOO.util.Anim(element, 
										{ opacity: { from: 0, to: 1 },
										  left: { by: -200}}, 0.5, YAHOO.util.Easing.easeOut); 
		//fade.onComplete.subscribe(myHandler);
		fade.animate();
	}
	
	//####### HASH TRACKING FUNCTIONS #########
	
	this.registeredhash = null;
	var hashinterval = null;
	
	this.generatehash = function(url) {
		window.location.hash = "#"+url;
		foo.registeredhash = "#"+url;
		var lociframe = document.getElementById("locationiframe");
		if (!document.all) {
			foo.checkhash(); //if we're in safari or firefox, start checking the hash every second
		} else {
			lociframe.src = ptr+"changelocation.php?hash="+url+"&cachedefeat="+Math.floor(Math.random()*10001);
		}
	}
	
	this.processhash = function(hashvalue) {
		//alert(hashvalue);
		//called on return of the changelocation.php file (used by IE);
		//var location = hashvalue.split("-");
		var currentlocation = window.location.hash;
		currentlocation = currentlocation.replace("#","");
		if (hashvalue != currentlocation) {
			var arrElements = document.getElementsByTagName('a');
			for (var i = 0; i < arrElements.length; i++) {
				if (arrElements[i].getAttribute('href') != null) {
					var myRE = new RegExp("javascript:transify", "i");
					var myRE2 = new RegExp(hashvalue, "i");
					if ((arrElements[i].getAttribute('href').search(myRE) != -1) && (arrElements[i].getAttribute('href').search(myRE2) != -1)) { //has to be a relative link to transition						
						if (arrElements[i].oldurl != null) { //only want to deal with converted links
								eval(arrElements[i].href.replace("javascript:", "").replace("%20",""));
						}
					}
				}
			}
			
			
			//alert("got in here");
			/*movedefinitecomplete(location[0],location[1],location[2]);
			if (oldlink != null) {
				oldlink.style.color = "";
			}
			oldlink = document.getElementById(location[2]);
			oldlink.style.color = "white";*/
		}
	}
	
	this.initprocesshash = function(hashvalue) {
		//var location = hashvalue.split("-");
		
		var arrElements = document.getElementsByTagName('a');
		for (var i = 0; i < arrElements.length; i++) {
			if (arrElements[i].getAttribute('href') != null) {
				var myRE = new RegExp("javascript:transify", "i");
				var myRE2 = new RegExp(hashvalue, "i");
				if ((arrElements[i].getAttribute('href').search(myRE) != -1) && (arrElements[i].getAttribute('href').search(myRE2) != -1)) { //has to be a relative link to transition						
					if (arrElements[i].oldurl != null) { //only want to deal with converted links
							eval(arrElements[i].href.replace("javascript:", "").replace("%20",""));
					}
				}
			}
		}
		
		/*movedefinitecomplete(location[0],location[1],location[2]);
		if (oldlink != null) {
			oldlink.style.color = "";
		}
		oldlink = document.getElementById(location[2]);
		oldlink.style.color = "white";*/
	}
	
	this.checkhash = function() {
		//used by non-IE browsers to check if back button was pressed.
		if (hashinterval) {
			if (foo.registeredhash != window.location.hash) {
				var currentlocation = window.location.hash;
				currentlocation = currentlocation.replace("#","");
				//var location = currentlocation.split("-");
				//movedefinitecomplete(location[0],location[1],location[2]);
				
				var arrElements = document.getElementsByTagName('a');
				for (var i = 0; i < arrElements.length; i++) {
					if (arrElements[i].getAttribute('href') != null) {
						var myRE = new RegExp("javascript:transify", "i");
						var myRE2 = new RegExp(currentlocation, "i");
						if ((arrElements[i].getAttribute('href').search(myRE) != -1) && (arrElements[i].getAttribute('href').search(myRE2) != -1)) { //has to be a relative link to transition						
							if (arrElements[i].oldurl != null) { //only want to deal with converted links
									eval(arrElements[i].href.replace("javascript:", "").replace("%20",""));
							}
						}
					}
				}
				
			} 
		} else {
			hashinterval = setInterval("transify.checkhash()",1000); //check the hash every second!
		}
	}
	
	
	
	this.init = function() {
		foo.ajaxloadingfinished = new YAHOO.util.CustomEvent('ajax was finished');
		foo.ajaxloadingfinished.subscribe(this.triggerruncallback);
		if (document.all) {
			classselector = "className";
		}
	}
	
	this.init();
	//animatingfinished.subscribe(this.runcallback);
	
}
