/*
Custom awDashboard
http://avoidwork.com
*/

window.onload = function()
{
	awDashboard.init();
}

var awDashboard=(awDashboard)?awDashboard:function()
{
	var private =
	{
		anchor:"",
		ie:((document.all)&&(navigator.appVersion<8))?true:false, // browser detection
		images:"",
		imageRollBack:"",
		imageRowSize:5,
		imageSize:"",
		pages:"",
		navCache:false,
		timerAnchor:"",
		timerImages:"",
		timerImagesCache:"",
		timerPages:"",
		timerNavCache:"",
		
		anchorGet: function()
		{
			if (unescape(self.document.location.hash.substring(1))!="")
			{
				private.anchor=unescape(self.document.location.hash.substring(1));
				private.anchorLoad();
			}
		},

		anchorLoad: function()
		{
			var objTarget=document.getElementById("picture");	
			private.elementReset(objTarget.id);
	
			if (private.images.total==0)
			{
				objTarget.innerHTML="<div class=\"error\"><h2>Connection Error</h2><h3>Images could not be loaded</h3></div>";
			}
			else
			{
				if ((private.anchor=="") || (parseInt(private.anchor)<1) || (parseInt(private.anchor)>private.images.total))
				{
					window.location="#"+private.imageRollBack;
				}
				else if (isNaN(private.anchor))
				{
					var loaded=false;

					for (i=0;i<private.pages.page.length;i++)
					{
						if ("#"+private.anchor==private.pages.page[i].url)
						{
							if (document.getElementById("nav_"+private.imageRollBack))
							{
								(private.ie)?document.getElementById("nav_"+private.imageRollBack).setAttribute("className",""):document.getElementById("nav_"+private.imageRollBack).setAttribute("class","");
							}
							
							var objPage=private.pages.page[i];
							var objContent=document.createElement("div");
							objContent.setAttribute("id","info");
							objTarget.appendChild(objContent);
							
							private.loadingIcon(objContent);
							private.urlLoad(objContent.id,"pages/"+objPage.file);

							loaded=true;
							
							delete objImage;
							delete objContent;
							delete objPage;
							
							break;
						}
					}
			
					(!loaded)?window.location="#"+private.imageRollBack:void(0);
					delete loaded;
				}
				else
				{
					private.elementReset(objTarget.id);
					
					if (document.getElementById("nav_"+private.imageRollBack))
					{
						(private.ie)?document.getElementById("nav_"+private.imageRollBack).setAttribute("className",""):document.getElementById("nav_"+private.imageRollBack).setAttribute("class","");
					}
					
					private.imageRollBack=private.anchor;
					
					var imageNext=(private.anchor==private.images.total)?1:parseInt(private.anchor)+1;
			
					if (document.getElementById("nav_"+private.anchor))
					{
						(private.ie)?document.getElementById("nav_"+private.anchor).setAttribute("className","selected"):document.getElementById("nav_"+private.anchor).setAttribute("class","selected");
					}
					
					var objImage=document.createElement("img");
					objImage.type="image";
					objImage.src=window["image_"+private.anchor].src;
					objImage.setAttribute("id",("picture_"+private.anchor));
					objImage.setAttribute("alt",private.images.image[private.anchor].title);
					
					if (!document.all)
					{
						(private.ie)?objImage.setAttribute("style","filter:alpha(opacity=010)"):objImage.setAttribute("style","opacity:0");
						objImage.setAttribute("onload","awDashboard.opacityChange('"+objImage.id+"',0,100,300);");
					}
			
					var objAnchor=document.createElement("a");
					objAnchor.setAttribute("href",("#"+imageNext));
					objAnchor.setAttribute("id",("anchor_"+private.anchor));
					objAnchor.setAttribute("title","View next image");
					objAnchor.appendChild(objImage);		
			
					objTarget.appendChild(objAnchor);
					
					/*if ((window.Reflection)&&(!document.all))
					{
						(private.ie)?objImage.setAttribute("className","reflect rheight10"):objImage.setAttribute("class","reflect rheight10");
						window.addReflections();
					}*/
					
					delete imageNext;
					delete objAnchor;
					delete objImage;
				}
			}			
		},

		anchorStart: function()
		{
			private.timerAnchor = setInterval(function()
			{
				if (self.document.location.hash.substring(1)=="")
				{
					window.location="#"+private.imageRollBack;
				}
				else if (self.document.location.hash.substring(1)!=private.anchor)
				{
					private.anchorGet();
				}
			}, 100);
		},
			
		elementDestroy: function(obj)
		{
			(document.getElementById(obj))?document.body.removeChild(document.getElementById(obj)):void(0);
		},
		
		elementReset: function(obj)
		{
			private.elementDestroy("awCalendar"); // removing calendar if present
			(document.getElementById(obj))?document.getElementById(obj).innerHTML="":void(0);
		},
		
		imagesCache: function()
		{
			if (private.images.total>0)
			{	
				for (i=1;i<=private.images.total;i++) // caching nav size
				{
					window["nav_"+i]=new Image();
					window["nav_"+i].src=private.images.image[i].square
				}
				
				for (i=1;i<=private.images.total;i++) // caching display size
				{
					window["image_"+i]=new Image();
					eval('window["image_"+i].src=private.images.image[i].'+private.imageSize);
				}
				
				private.timerNavCache = setInterval(function()
				{
					if (!private.navCache)
					{
						for (i=1;i<=private.images.total;i++)
						{
							private.navCache=(window["nav_"+i].complete)?true:false;
							if (!private.navCache)
							{
								break;
							}
						}

						if (private.navCache)
						{
							clearInterval(private.timerNavCache);
							private.navLoad();
							private.anchorStart();
						}
					}
				}, 100);
			}
		},
		
		jsonSet: function(obj,httpRequest)
		{
			if (httpRequest.readyState==4)
			{
				((httpRequest.status==200)&&(httpRequest.responseText!=""))?eval(obj+'='+httpRequest.responseText+';'):void(0);
			}
		},

		loadingIcon: function(obj)
		{
			if (!document.getElementById(obj.id+"_loading"))
			{
				var objImage=document.createElement("img");
				objImage.type="image";
				objImage.src=window["loading"].src;
				objImage.setAttribute("id",(obj.id+"_loading"));
				objImage.setAttribute("alt","Loading");
				(private.ie)?objImage.setAttribute("className","loading"):objImage.setAttribute("class","loading");
				obj.appendChild(objImage);
				delete objImage;
			}
		},

		navLoad: function()
		{
			if (private.images.total>0)
			{
				var objContainer=document.getElementById("nav");
				var objTarget=document.createElement("div");
				objTarget.setAttribute("id",("nav_container"));

				for (i=1;i<=private.images.total;i++)
				{
					var objImage=document.createElement("img");
					objImage.type="image";
					objImage.src=window["nav_"+i].src;
					objImage.setAttribute("alt",("Thumbnail "+i));
					objImage.setAttribute("id",("thumb_"+i));
					
					if (!document.all) //adding fade to everything except IE.
					{
						(private.ie)?objImage.setAttribute("style","filter:alpha(opacity=010)"):objImage.setAttribute("style","opacity:0");
						objImage.setAttribute("onload","awDashboard.opacityChange('"+objImage.id+"',0,50,300);");
						objImage.setAttribute("onmouseover","awDashboard.opacityChange('"+objImage.id+"',50,100,300);");
						objImage.setAttribute("onmouseout","awDashboard.opacityChange('"+objImage.id+"',100,50,300);");
					}

					var objAnchor=document.createElement("a");
					objAnchor.setAttribute("href",("#"+i));
					objAnchor.setAttribute("id",("nav_"+i));
					objAnchor.appendChild(objImage);

					objTarget.appendChild(objAnchor);
					
					delete objAnchor;
					delete objImage;
				}
				
				private.elementReset(objContainer.id);
				document.onkeydown=awDashboard.navKey;
				
				if (!document.all) //adding fade to everything except IE.
				{
					(private.ie)?objTarget.setAttribute("style","filter:alpha(opacity=010)"):objTarget.setAttribute("style","opacity:0");
					objContainer.appendChild(objTarget);
					awDashboard.opacityChange(objTarget.id,0,100,300);
				}
				else
				{
					objContainer.appendChild(objTarget);
				}
				
				delete objContainer;
				delete objTarget;
			}
		},
		
		pagesSet: function()
		{	
			var objContainer=document.getElementById("pages");		
			private.elementReset(objContainer.id);
			
			for (i=0;i<private.pages.page.length;i++)
			{
				try
				{
					var objPage = private.pages.page[i];

					var objItem=document.createElement("li");
					objItem.setAttribute("id","link_"+i);
			
					var objAnchor=document.createElement("a");
					objAnchor.setAttribute("href",objPage.url);
					objAnchor.setAttribute("title",objPage.title);
					objAnchor.innerHTML=objPage.name;
		
					objItem.appendChild(objAnchor);
					objContainer.appendChild(objItem);
				
					delete objAnchor;
					delete objItem;
					delete objPage;
				}
				catch(e) {}
			}
			
			delete objContainer;
		},
		
		requestSet: function(obj,httpRequest)
		{
			if (httpRequest.readyState==4)
			{
				document.getElementById(obj).innerHTML=(httpRequest.status==200)?httpRequest.responseText:"A server error has occurred";
			}
		},
		
		urlLoad: function(obj,url,type)
		{
			var httpRequest=false;
	
			if (window.XMLHttpRequest)
			{
				httpRequest=new XMLHttpRequest();
			}
			else if (window.ActiveXObject)
			{
				try
				{
					httpRequest=new ActiveXObject("Msxml2.XMLHTTP");
				}
				catch (e)
				{
					try
					{
						httpRequest=new ActiveXObject("Microsoft.XMLHTTP");
					}
					catch (e) {}
				}
			}

			if (!httpRequest)
			{
				return false;
			}
			
			switch (type)
			{
				case "json":
					httpRequest.onreadystatechange = function() { private.jsonSet(obj,httpRequest); };
					break;
				default:
					httpRequest.onreadystatechange = function() { private.requestSet(obj,httpRequest); };
					break;
			}

			httpRequest.open("GET",url,true);
			httpRequest.send(null);
			
			delete httpRequest;
		}
	};
	
	var public =
	{
		init: function()
		{
			//setting object values
			private.urlLoad("private.images","assets/images.json","json");
			private.urlLoad("private.pages","assets/pages.json","json");
			
			//resizing containers based on client (24" or larger screen)
			private.imageSize=(document.documentElement.clientHeight>1000)?"large":"medium";
			if (private.imageSize=="large")
			{
				document.getElementById("container").style.width="1564px";
				document.getElementById("picture").style.width="1024px";
				document.getElementById("picture").style.height="1024px";
			}

			//preloading AJAX icon
			window["loading"]=new Image();
			window["loading"].src="http://farm5.static.flickr.com/4065/4474242391_d5ca519f5e_o.gif";

			//adding AJAX loading graphics
			private.loadingIcon(document.getElementById("nav"));
			private.loadingIcon(document.getElementById("pages"));
			private.loadingIcon(document.getElementById("picture"));
			
			//starting various timers for building the GUI
			private.timerImages = setInterval(function()
			{
				if (private.images.total!=undefined)
				{
					clearInterval(private.timerImages);
					private.imageRollBack=(private.images.total==0)?0:Math.floor(Math.random()*(private.images.total-1)+1);
					private.imagesCache(); // caching images, once done GUI renders & anchor parsing starts
				}
			}, 100);
						
			private.timerPages = setInterval(function()
			{
				if (private.pages.page!=undefined)
				{
					clearInterval(private.timerPages);
					private.pagesSet();
				}
			}, 100);
			
			//loading Twitter content
			private.loadingIcon(document.getElementById("twitter"));
			private.urlLoad("twitter","pages/twitter.htm");
		},
		
		formSubmit: function(obj,target,element)
		{
			var emailPattern=/^[0-9a-zA-Z]+@[0-9a-zA-Z]+[\.]{1}[0-9a-zA-Z]+[\.]?[0-9a-zA-Z]+$/; // 'user@domain.com'
			var formElement=""; // form element that trips the error boolean
			var formError=false; // boolean variable validation & submission
			var formValues=""; // field values will be appended to this for xmlhttp submission
	
			for(i=0;i<obj.elements.length;i++)
			{
				if ((obj.elements[i].type=="text") || (obj.elements[i].type=="textarea"))
				{
					switch(obj.elements[i].name)
					{
						case "date":
						{
							if (isNaN(new Date(obj.elements[i].value).getYear()))
							{
								formError=true;
								formElement=obj.elements[i].name;
							}
							break;
						}
						case "email":
						{
							if (!emailPattern.test(obj.elements[i].value)) // validating value against against regex pattern
							{
								formError=true;
								formElement=obj.elements[i].name;
							}
							break;
						}
						case "email2":
						{
							if (obj.elements[i].value!=document.getElementById("email").value) // verifying email field values match
							{
								formError=true;
								formElement=obj.elements[i].name;
							}
							break;
						}
						case "telephone":
						{
							if ((obj.elements[i].value=="") && (document.getElementById("contact_telephone").checked))
							{
								formError=true;
								formElement=obj.elements[i].name;
							}
							break;
						}
						default:
						{
							if (obj.elements[i].value=="")
							{
								formError=true;
								formElement=obj.elements[i].name;
							}
							break;
						}
					}
				}
		
				if (formError)
				{
					document.getElementById(formElement).focus();
					break;
				}
				else // adding valid form elements & values to formValues
				{
					if (obj.elements[i].name!="email2")
					{
						if (((obj.elements[i].type=="radio") && (obj.elements[i].checked==true)) || (obj.elements[i].type!="radio"))
						{
							formValues=formValues+("&"+obj.elements[i].name+"="+obj.elements[i].value);
						}
					}
				}
			}

			if (!formError)
			{
				var objTarget = document.getElementById(element);
				private.elementReset(objTarget.id);
				private.loadingIcon(objTarget);
				private.urlLoad(objTarget.id,"submit/"+target+".htm?"+formValues.substring(1));
				delete objTarget.id;
			}
	
			return false;
		},
		
		navKey: function(e)
		{
			if (!isNaN(private.anchor))
			{
				var imageCurrent=parseInt(private.anchor);
				var imageNext=new String("");
				var imageRow=parseInt(private.imageRowSize);
				var imageTotal=parseInt(private.images.total);
				var keyCode=(window.event)?event.keyCode:e.keyCode;

				switch (keyCode)
				{
					case 37: // left
						imageNext=((imageCurrent-1)<1)?imageTotal:(imageCurrent-1);
						break;
					case 38: // up
						if ((imageCurrent-imageRow)<1)
						{
							imageNext=(imageTotal/imageRow).toString();
							imageNext=(imageNext.indexOf(".")<0)?parseInt(imageNext):parseInt(imageNext.substring(0,imageNext.indexOf(".")));
							imageNext=imageCurrent+(imageRow*imageNext);
							imageNext=(imageNext>imageTotal)?(imageNext-imageRow):imageNext;
						}
						else
						{
							imageNext=(imageCurrent-imageRow);
						}
						
						break;
					case 39: // right
						imageNext=((imageCurrent+1)>imageTotal)?1:(imageCurrent+1);
						break;
					case 40: // down
						if ((imageCurrent+imageRow)>imageTotal)
						{
							imageNext=(imageTotal/imageRow).toString();
							imageNext=(imageNext.indexOf(".")<0)?parseInt(imageNext):parseInt(imageNext.substring(0,imageNext.indexOf(".")));
							imageNext=imageCurrent-(imageRow*imageNext);
							imageNext=(imageNext<1)?(imageNext+imageRow):imageNext;
						}
						else
						{
							imageNext=(imageCurrent+imageRow);
						}
						break;
				}
			
				(imageNext!="")?window.location="#"+imageNext.toString():void(0);
			
				delete imageCurrent;
				delete imageNext;
				delete imageRow;
				delete imageTotal;
				delete keyCode;
			}
		},
		
		opacity: function(opacity,id)
		{
			if (document.getElementById(id))
			{
				var objStyle=document.getElementById(id).style;
				objStyle.opacity=(opacity/100);
				objStyle.MozOpacity=(opacity/100);
				objStyle.KhtmlOpacity=(opacity/100);
				objStyle.filter="alpha(opacity="+opacity+")";
				delete objStyle;
			}
		},

		opacityChange: function(id,start,end,ms)
		{
			var speed = Math.round(ms/100);
			var timer = 0;

			if (start>end)
			{
				for (i=start;i>=end;i--)
				{
					setTimeout("awDashboard.opacity("+i+",'"+id+"')",(timer*speed));
					timer++;
				}
			}
			else if (start<end)
			{
				for (i=start;i<=end;i++)
				{
					setTimeout("awDashboard.opacity("+i+",'"+id+"')",(timer*speed));
					timer++;
				}
			}
			
			delete speed;
			delete timer;
		},

		opacityShift: function(id,ms)
		{
			(document.getElementById(id).style.opacity==0)?awDashboard.opacityChange(id,0,100,ms):awDashboard.opacityChange(id,100,0,ms);
		}
	};

	return public;
}();
