// https://gist.github.com/901295if (navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i)) {var viewportmeta = document.querySelectorAll('meta[name="viewport"]')[0];if (viewportmeta) {viewportmeta.content = 'width=device-width, minimum-scale=1.0, maximum-scale=1.0';document.body.addEventListener('gesturestart', function() {viewportmeta.content = 'width=device-width, minimum-scale=0.25, maximum-scale=1.6';}, false);}}// slide-down images on homepage$(document).ready(function() {					   	$('#myProjects li').hover(function(){		$(this).find('img').animate({top:'150px'},{queue:false,duration:600});	}, function(){		$(this).find('img').animate({top:'0px'},{queue:false,duration:600});	});	});// form validator ------------------------------------------------------------------------------------		function checkform(of)		{		// Test if DOM is available and there is an element called required			if(!document.getElementById || !document.createTextNode){return;}			if(!document.getElementById('required')){return;}		// Define error messages and split the required fields			var errorID='errormsg';			var errorClass='error'/* changes for linked list */			var errorMsg='Please enter or change the following fields:';/* end changes for linked list */			var errorImg='/images/alert.gif';			var errorAlt='Error';			var errorTitle='This field has an error!';			var reqfields=document.getElementById('required').value.split(',');		// Cleanup old mess			// if there is an old errormessage field, delete it			if(document.getElementById(errorID))			{				var em=document.getElementById(errorID);				em.parentNode.removeChild(em);			}			// remove old images and classes from the required fields			for(var i=0;i<reqfields.length;i++)			{				var f=document.getElementById(reqfields[i]);				if(!f){continue;}				if(f.previousSibling && /img/i.test(f.previousSibling.nodeName))				{					f.parentNode.removeChild(f.previousSibling);				}				f.className='';			}		// loop over required fields			for(var i=0;i<reqfields.length;i++)			{		// check if required field is there				var f=document.getElementById(reqfields[i]);				if(!f){continue;}		// test if the required field has an error, 		// according to its type				switch(f.type.toLowerCase())				{					case 'text':						if(f.value=='' && f.id!='email'){cf_adderr(f)}									// email is a special field and needs checking						if(f.id=='email' && !cf_isEmailAddr(f.value)){cf_adderr(f)}												break;					case 'textarea':						if(f.value==''){cf_adderr(f)}												break;					case 'checkbox':						if(!f.checked){cf_adderr(f)}												break;					case 'select-one':						if(!f.selectedIndex && f.selectedIndex==0){cf_adderr(f)}												break;				}			}			return !document.getElementById(errorID);			/* Tool methods */			function cf_adderr(o)			{				// create image, add to and colourise the error fields				var errorIndicator=document.createElement('img');				errorIndicator.alt=errorAlt;				errorIndicator.src=errorImg;				errorIndicator.title=errorTitle;				o.className=errorClass;				o.parentNode.insertBefore(errorIndicator,o);			// Check if there is no error message				if(!document.getElementById(errorID))				{				// create errormessage and insert before submit button					var em=document.createElement('div');					em.id=errorID;					var newp=document.createElement('p');					newp.appendChild(document.createTextNode(errorMsg))					em.appendChild(newp);/* added for linked list */					var newul=document.createElement('ul');							em.appendChild(newul);/* end added for linked list */					// find the submit button 					for(var i=0;i<of.getElementsByTagName('input').length;i++)					{						if(/submit/i.test(of.getElementsByTagName('input')[i].type))						{							var sb=of.getElementsByTagName('input')[i];							break;						}					}					if(sb)					{						sb.parentNode.insertBefore(em,sb);					}					} /* added for linked list */				var em=document.getElementById(errorID).getElementsByTagName('ul')[0];				var newli=document.createElement('li');				var newa=document.createElement('a');				for(var i=0;i<of.getElementsByTagName('label').length;i++)				{					if(of.getElementsByTagName('label')[i].htmlFor==o.id)					{						var txt=of.getElementsByTagName('label')[i].firstChild.nodeValue;						break;					}				}					newa.appendChild(document.createTextNode(txt));				newa.href='#'+f.id;				newa.onclick=function()				{					var loc=this.href.match(/#(\w.+)/)[1];					document.getElementById(loc).focus();					return false;				}				newli.appendChild(newa);				em.appendChild(newli);/* end added for linked list */			}			function cf_isEmailAddr(str) 			{			    return str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/);			}		}
