validField = '#FFFFFF';
invalidField = '#B9D9E8';
required = /^req_/;
elem = '';
el = '';
validForm = true;
validLink = '';
validChrs = /[0-9a-zA-Z]/
validFormSubmitTo = ""; // script where the valid VALID will be sent to - leave empty for same as action defined in the <form> tag
defaultSubmitTo = "" // script where the INVALID form will be sent to - leave empty for same as action defined in the <form> tag

function validate(element, msg, doAlert, msgId)
{
	var valid = true;
	temp = "";
	elem = element;

	switch (element.type)
	{
		case 'text':
		{
			temp = text(element, msgId);
			if (!temp)
			{
				valid = temp;
				msg = "* Required field";
				createmsg(msg, doAlert, msgId);
				document.getElementById(element.id).style.backgroundColor = invalidField;
			}
			else
			{
				document.getElementById(element.id).style.backgroundColor = validField;
				clearMsg(msgId);
			}
			break;
		}
		
		case 'textarea':
		{
			temp = textarea(element);
			if (!temp)
			{
				valid = temp;
				msg = "* Required field";
				createmsg(msg, doAlert, msgId);
				document.getElementById(element.id).style.backgroundColor = invalidField;
			}
			else
			{
				document.getElementById(element.id).style.backgroundColor = validField;
				clearMsg(msgId);
			}
			break;
		}
		
		case 'select-one':
		{
			temp = selectOne(element);
			if (!temp)
			{
				valid = temp;
				msg = "* Required field";
				createmsg(msg, doAlert, msgId);
				document.getElementById(element.id).style.backgroundColor = invalidField;
			}
			else
			{
				document.getElementById(element.id).style.backgroundColor = validField;
				clearMsg(msgId);
			}
			break;
		}
		
		case 'select-multiple':
		{
			temp = selectMultiple(element);
			if (!temp)
			{
				valid = temp;
				msg = "* Required field";
				createmsg(msg, doAlert, msgId);
				document.getElementById(element.id).style.backgroundColor = invalidField;
			}
			else
			{
				document.getElementById(element.id).style.backgroundColor = validField;
				clearMsg(msgId);
			}
			break;
		}
		
		case 'checkbox':
		{
			temp = checkbox(element);
			if (!temp)
			{
				valid = temp;
				msg = "* Please check at least one option";
				createmsg(msg, doAlert, msgId);
				//document.getElementById(element.id).style.backgroundColor = invalidField;
			}
			else
			{
			    clearMsg(msgId);
			}
			break;
		}
		
		case 'radio':
		{
			temp = radio(element);
			if (!temp)
			{
				valid = temp;
				msg = "* Please select an option";
				createmsg(msg, doAlert, msgId);
				//document.getElementById(element.id).style.backgroundColor = invalidField;
			}
			else
			{
			    clearMsg(msgId);
			}
			break;
		}
		case 'password':
		{
			temp = password(element);
			if (!temp)
			{
				valid = temp;
				createmsg(msg, doAlert, msgId);
				document.getElementById(element.id).style.backgroundColor = invalidField;
			}
			else
			{
				document.getElementById(element.id).style.backgroundColor = validField;
				clearMsg(msgId);
			}
			break;
		}
		case 'file':
		{
			temp = testFile(element);
			if (!temp)
			{
				valid = temp;
				createmsg(msg, doAlert, msgId);
				document.getElementById(element.id).style.backgroundColor = invalidField;
			}
			else
			{
				document.getElementById(element.id).style.backgroundColor = validField;
				clearMsg(msgId);
			}
			break;
		}
	}

	if (valid == false)
	{
		return false;
	}
}


function text(element, msgId)
{
	var number = /number$/;
	var notNumber = /[^0-9]/;
	var isEmail = /email/;
	var uniqueEmail = /unique/;
	var isURL = /website/;
	var isUser = /username/;
	var validChar = /[^0-9a-zA-Z]/;
	temp = "";
	id = element.id


	if (!validChrs.test(document.getElementById(id).value) && required.test(id))
	{
		return false;
	}
	else if (isUser.test(id))
	{
		if (document.getElementById(id).value.length < 3)
		{
			return false;
		}
		else if (validChar.test(document.getElementById(id).value))
		{
			return false;
		}
		else
		{
			type = 'user';
			process(element, type);
		}
	}

	else if (isEmail.test(id))
	{
		temp = emailCheck(document.getElementById(id).value);
		if(temp && document.getElementById(id).value != '')
		{
			if (uniqueEmail.test(id))
			{
				type = 'email';
				process(element, type);
			}
			else
			{
				return true;
			}
		}
		else
		{
			return false;
		}
	}
	
	else if (number.test(id))
	{
		if (required.test(id))
		{
			if (notNumber.test(document.getElementById(id).value) || document.getElementById(id).value == "")
			{
			    document.getElementById(msgId).innerHTML = "* Numbers Only";
				return false;
			}
			else
			{
				return true;
			}
		}
		else
		{
			if (document.getElementById(id).value == '')
			{
				return true;
			}
			else if (document.getElementById(id).value != '' && notNumber.test(document.getElementById(id).value))
			{
				return false;
			}
			else
			{
				return true;
			}
		}
	}

	else if (isURL.test(id))
	{
		if (document.getElementById(id).value == '')
		{
			return false;
		}
		else if (!CheckDomain(id))
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	
	else if (document.getElementById(id).value == '' && required.test(id))
	{
		return false;
	}
	
	else
	{
		return true;
	}
}

function password(element)
{
	id = element.id
	if (document.getElementById(id).id == 'req_password' && (document.getElementById(id).value == '' || document.getElementById(id).value.length < 6))
	{
		return false;
	}
	else if (document.getElementById(id).id == 'req_password_conf' && (document.getElementById(id).value == '' || document.getElementById(id).value != document.getElementById('req_password').value || document.getElementById('req_password').value.length < 6))
	{
		return false;
	}
	else if (document.getElementById(id).value == '')
	{
		return false;
	}
	else
	{
		return true;
	}
}

function selectOne(element)
{
	check = /^req_interest_in_/;
	
	id = element.id
	if (check.test(id))
	{
		noneSelected = true;
		sel = document.getElementsByTagName('select');
		for (i = 0; i < sel.length; i++)
		{
			id = sel[i].id;
			if (document.getElementById(id).options[document.getElementById(id).selectedIndex].value != 'null')
			{
				noneSelected = false;
			}
		}
		if (!noneSelected)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	else
	{
		if (document.getElementById(id).options[document.getElementById(id).selectedIndex].value == 'null')
		{
			return false;
		}
		else
		{
			return true;
		}
	}
}

function selectMultiple(element)
{
	id = element.id
	if (document.getElementById(id).value == '')
	{
		return false;
	}
	else
	{
		return true;
	}
}

function checkbox(element)
{
	id = element.id
	checked = false;
	elem = document.getElementsByName(element.name);
	
	for (i = 0; i < elem.length; i++)
	{
		if (elem[i].checked == true)
		{
			checked = true;
		}
	}
	
	if (checked == true)
	{
		return true;
	}
	else
	{
		return false;
	}
}

function radio(element)
{
	id = element.id
	checked = false;
	elem = document.getElementsByName(element.name);

	for (i = 0; i < elem.length; i++)
	{
		if (elem[i].checked == true)
		{
			checked = true;
		}
	}
	
	if (checked == true)
	{
		return true;
	}
	else
	{
		return false;
	}
}

function textarea(element)
{
	id = element.id
	
	if (!validChrs.test(document.getElementById(id).value))
	{
		return false;
	}
	else if (document.getElementById(id).value == '')
	{
		return false;
	}
	else
	{
		return true;
	}
}

function testFile(element)
{
	id = element.id
	if (document.getElementById(id).value == '')
	{
		return false;
	}
	else
	{
		return true;
	}
}

function nextstep(form, doAlert, msg, msgElemId)
{
	validForm = true;
	focusedEl = '';
	
	if (doAlert == undefined)
		doAlert = false;
	if (msg == undefined)
		msg = '';
	if (msgElemId == undefined)
		msgElemId == '';

	for (j = 0; j < form.elements.length; j++)
	{
		if (required.test(form.elements[j].id) && form.elements[j].style.visibility != 'hidden' && form.elements[j].disabled == false)
		{
			if (msgElemId != '')
	            msgElementId = msgElemId + "_" + form.elements[j].id;
	        doAlert = false;
			if (validate(form.elements[j], msg, doAlert, msgElementId) == false)
			{
				validForm = false;
				if (focusedEl == '')
				{
					focusedEl = form.elements[j];
				}
			}
		}
		else if (required.test(form.elements[j].id) && form.elements[j].style.visibility != 'hidden' && form.elements[j].disabled == true)
		{
		    if (msgElemId != '')
		        msgElementId = msgElemId + "_" + form.elements[j].id;
		    clearMsg(msgElementId);
		}
	}

	if (validForm == false)
	{
		focusedEl.focus();
		if (doAlert == true)
		{
			alert(msg);
		}
		return false;
	}
	else
	{
		if (validFormSubmitTo != "")
			form.action = validFormSubmitTo;
		return true;
	}
}

function resetForm(form)
{
	for (i = 0; i < form.elements.length; i++)
	{
		if (form.elements[i].type != 'submit' && form.elements[i].type != 'reset' && form.elements[i].type != 'button' && form.elements[i].type != null && form.elements[i].disabled != true)
		{
			//alert(form.elements[i].type + ' - ' + form.elements[i].value);
			form.elements[i].style.backgroundColor = validField;
			errorId = "error_" + form.elements[i].id;
			if (document.getElementById(errorId) != undefined)
			{
			    document.getElementById(errorId).innerHTML = "";
			}
			switch (form.elements[i].type)
			{
				case 'text':
				{
					form.elements[i].value = '';
					break;
				}
				case 'select-one':
				{
					form.elements[i].options[form.elements[i].selectedIndex].value = 'null';
					break;
				}
				case 'checkbox' || 'radio':
				{
					form.elements[i].checked = '';
				}
			}
		}
	}
	form.elements[0].focus();
}


function emailCheck(email, doAlert, msgId)
{
	var at="@";
	var dot=".";
	var lat=email.indexOf(at);
	var lastChr=email.length;
	var ldot=email.indexOf(dot);

	if (lat==-1)
	{
	    createmsg("* Invalid Email Address", false, 'error_req_email');
		return false;
	}
	
	if (lat==-1 || lat==0 || lat==lastChr)
	{
	    createmsg("* Invalid Email Address", false, 'error_req_email');
		return false;
	}
	
	if (ldot==-1 || ldot==0 || ldot==lastChr-1)
	{
	    createmsg("* Invalid Email Address", false, 'error_req_email');
		return false;
	}
	
	if (email.indexOf(at,(lat+1))!=-1)
	{
	    createmsg("* Invalid Email Address", false, 'error_req_email');
		return false;
	}
	
	if (email.substring(lat-1,lat)==dot || email.substring(lat+1,lat+2)==dot)
	{
	    createmsg("* Invalid Email Address", false, 'error_req_email');
		return false;
	}
	
	if (email.indexOf(dot,(lat+2))==-1)
	{
	    createmsg("* Invalid Email Address", false, 'error_req_email');
		return false;
	}
	
	if (email.indexOf(" ")!=-1)
	{
	    createmsg("* Invalid Email Address", false, 'error_req_email');
		return false;
	}
	
	return true;
}

function createmsg(msg, doAlert, msgId)
{
    numbers = "0123456789";
    lastChar = msgId.charAt(msgId.length - 1)
    if (numbers.indexOf(lastChar) != -1)
    {
        msgId = msgId.substring(0, msgId.lastIndexOf("_"));
    }

	if (msg != '')
	{
		if (msgId && doAlert != true)
		{
			writeMessage = document.getElementById(msgId); //if the message will be displayed in another tag or element, this would be its id
			if (writeMessage.innerHTML == '' || (writeMessage.innerHTML != '* Invalid Email Address' && writeMessage.innerHTML != '* Numbers Only'))
			    writeMessage.innerHTML = msg;
		}
		else if (doAlert == true && msgId == "")
			alert (msg);
	}
}
function clearMsg(messId)
{
    numbers = "0123456789";
    lastChar = messId.charAt(messId.length - 1)
    if (numbers.indexOf(lastChar) != -1)
    {
        messId = messId.substring(0, messId.lastIndexOf("_"));
    }
    document.getElementById(messId).innerHTML = "";
}


function CheckDomain(elementId)
{
	var arr = new Array(
						'.com','.net','.org','.biz','.coop','.info','.museum','.name',
						'.pro','.edu','.gov','.int','.mil','.ac','.ad','.ae','.af','.ag',
						'.ai','.al','.am','.an','.ao','.aq','.ar','.as','.at','.au','.aw',
						'.az','.ba','.bb','.bd','.be','.bf','.bg','.bh','.bi','.bj','.bm',
						'.bn','.bo','.br','.bs','.bt','.bv','.bw','.by','.bz','.ca','.cc',
						'.cd','.cf','.cg','.ch','.ci','.ck','.cl','.cm','.cn','.co','.cr',
						'.cu','.cv','.cx','.cy','.cz','.de','.dj','.dk','.dm','.do','.dz',
						'.ec','.ee','.eg','.eh','.er','.es','.et','.fi','.fj','.fk','.fm',
						'.fo','.fr','.ga','.gd','.ge','.gf','.gg','.gh','.gi','.gl','.gm',
						'.gn','.gp','.gq','.gr','.gs','.gt','.gu','.gv','.gy','.hk','.hm',
						'.hn','.hr','.ht','.hu','.id','.ie','.il','.im','.in','.io','.iq',
						'.ir','.is','.it','.je','.jm','.jo','.jp','.ke','.kg','.kh','.ki',
						'.km','.kn','.kp','.kr','.kw','.ky','.kz','.la','.lb','.lc','.li',
						'.lk','.lr','.ls','.lt','.lu','.lv','.ly','.ma','.mc','.md','.mg',
						'.mh','.mk','.ml','.mm','.mn','.mo','.mp','.mq','.mr','.ms','.mt',
						'.mu','.mv','.mw','.mx','.my','.mz','.na','.nc','.ne','.nf','.ng',
						'.ni','.nl','.no','.np','.nr','.nu','.nz','.om','.pa','.pe','.pf',
						'.pg','.ph','.pk','.pl','.pm','.pn','.pr','.ps','.pt','.pw','.py',
						'.qa','.re','.ro','.rw','.ru','.sa','.sb','.sc','.sd','.se','.sg',
						'.sh','.si','.sj','.sk','.sl','.sm','.sn','.so','.sr','.st','.sv',
						'.sy','.sz','.tc','.td','.tf','.tg','.th','.tj','.tk','.tm','.tn',
						'.to','.tp','.tr','.tt','.tv','.tw','.tz','.ua','.ug','.uk','.um',
						'.us','.uy','.uz','.va','.vc','.ve','.vg','.vi','.vn','.vu','.ws',
						'.wf','.ye','.yt','.yu','.za','.zm','.zw');

	url = document.getElementById(elementId).value;
	if (url.toUpperCase().indexOf("HTTP://")==0)
	{
		url = url.substring(7,url.length);
	}
	else if (url.toUpperCase().indexOf("HTTPS://")==0)
	{
		url = url.substring(8,url.length);
	}
	
	var mai = url;
	var val = true;
	var ext;
	var directory;
	var temp = mai.substring(0,mai.indexOf("/"));		
	
	if (temp=="")
	{
		temp=mai;
	}
	
	var dot = temp.lastIndexOf(".");
	var dname = mai.substring(0,dot);
	var slash = mai.indexOf("/");
	
	if (slash>=0)
	{
		ext = mai.substring(dot,slash);		
	}
	else
	{
		ext = mai.substring(dot,mai.length);
	}
	
	if(dot>2 && dot<57)
	{
		for(var i=0; i < arr.length; i++)
		{
			if(ext == arr[i])
			{
				val = true;
				break;
			}
			else
			{
				val = false;
			}
		}
		
		if(val == false)
		{
			document.getElementById(elementId).style.backgroundColor = invalidField;
			return false;
		}
		else
		{
			for(var j=0; j < dname.length; j++)
			{
				var dh = dname.charAt(j);
				var hh = dh.charCodeAt(0);
				if((hh > 47 && hh<59) || (hh > 64 && hh<91) || (hh > 96 && hh<123) || hh==45 || hh==46)
				{
					if((j==0 || j==dname.length-1) && hh == 45)
					{
						document.getElementById(elementId).style.backgroundColor = invalidField;
						return false;
					}
				}
				else
				{
					document.getElementById(elementId).style.backgroundColor = invalidField;
					return false;
				}
			}
		}
	}
	else
	{
		document.getElementById(elementId).style.backgroundColor = invalidField;
		return false;
	}
	
	return true;
}


