var xorOptional = new Array();

function XvalidateFields(formOptions){

var valMessage = '';

	if(!formOptions || formOptions == ''){
		alert('formOptions required');
	}

$.each(formOptions, function (elemId, requirement){
		
                   valMessage = valMessage + XvalidateTypes(elemId, requirement);	
		
		                });
		
	if(valMessage!=""){	
	alert("Please complete the below fields\n\n"+valMessage);
	return false
	}else{
	return true;	
	}

}

function XvalidateTypes(fieldId, elemRequirement){
		
		if(elemRequirement != '' && elemRequirement != 'undefined'){
		vTypes = elemRequirement.split('|');
		}else{
		return '';
		}
		
		if(vTypes.length == 1){
		return 	'';
		}
		
		if($(fieldId) == '' || $(fieldId) == 'undefined'){
		return '';	
		}
			
	var errors=0;	
	
	$(fieldId).css("background-color", "#FFFFFF");
	
	
	theValue = $(fieldId).val();
		
		
		
			for(vt=1; vt<vTypes.length; vt++){
				
				
				realTypes = vTypes[vt].split(':');
		
						switch(realTypes[0]){
							
								case 'OPTIONAL':
									
									if(Xoptional(theValue) == ""){ 
									return '';
									}
								break;
								
								case 'CHECKED':
									alert($(fieldId).attr('checked'));
									if(!$(fieldId).checked){ 
									errors++;
									}
								
								break;
								
								case 'XORFIELD':
														
									if(!$(realTypes[1]).attr('name')){
									errors++; alert('XORFIELD requires another field ID'); return false;
									}
									if(!realTypes[2]){
									errors++; alert('XORFIELD requires type check at end i.e. :NUM'); return false;	
									}
									
									tmp1 = eval('X'+realTypes[2].toLowerCase()+'("'+$(realTypes[1]).val()+'");');
									tmp2 = eval('X'+realTypes[2].toLowerCase()+'("'+theValue+'");');
									
									if(tmp1 == 1 && tmp2 == 1){
									errors++;	
									}
									
								
								break;
								
								case 'DEPENDANT':
								alert($(realTypes[1]).attr('name'));
									if($(realTypes[1]).val() == '' && $(fieldId).val() == ''){ 
									errors++;
									}
								
								break;
				
								case 'NUM':
								
								errors += Xnum(theValue);
													
								break;
														
								case 'STRINGMAX':
								
								errors += Xstrmax(theValue, realTypes[1]);
								
								break;
								
								case 'STRINGMIN':
								
									errors += Xstrmin(theValue, realTypes[1]);
								
								break;
								
								case 'MAX':
								
									errors += Xmax(theValue, realTypes[1]);
								
								break;
								
								case 'MIN':
								
									errors += Xstrmin(theValue, realTypes[1]);
								
								break;
								
								case 'EMAIL':
									
										errors += Xemail(theValue);
								break;
								
								case 'URL':
									
									errors += Xurl(theValue);
								break;
								
								case 'TIME':
									
									errors += Xtime(theValue);
								break;
								
									case 'DATE':
									
									errors += Xdate(theValue);
								break;
								
								case 'NOTEMPTY':
										
									errors += Xnotempty(theValue);
									
										
								break;
								
								default:
								alert( vTypes[vt] + 'not recognized');
								break;
				
						}
				
			}
		
		if(errors > 0){
		
		$(fieldId).css("background-color", "#CCCCCC");
		
		return 	"- "+vTypes[0]+"\n";
		}
		
		return '';
	}
	
function Xnum(theValue){
	if(!theValue.match(/\b\d+\b/)){
	return 1;
	}
	return 0;
}
function Xoptional(theValue){
	if(theValue == ""){ 
	return '';
	}
return 1;
}

function Xnotempty(theValue){
	if(theValue == ""){
	return 1;
	}
	return 0;
}

function Xstrmax(theValue, matchVal){
	if(theValue.length > parseInt(matchVal)){
	return 1;
	}
	return 0;
}

function Xstrmin(theValue, matchVal){
		if(theValue.length < parseInt(matchVal)){
		return 1;
	}
	return 0;
}
function Xmax(theValue, matchVal){
	if(parseFloat(theValue) > parseFloat(matchVal)){
	return 1;
	}
	return 0;
}
function Xmin(theValue, matchVal){
	if(parseFloat(theValue) < parseFloat(matchVal)){
	return 1;
	}
	return 0;
}
function Xemail(theValue){
	if (!theValue.match(/\b[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}\b/i)) {
	return 1;
	}
	return 0;
}
function Xurl(theValue){
	
	if (!theValue.match(/^((http:\/\/)+|^(https:\/\/))+?([a-zA-Z0-9])+\.+/)) {
	return 1;
	}
	return 0;
}

function Xtime(theValue){
	if (!theValue.match(/\b[0-9]{2}\:[0-9]{2}\:[0-9]{2}\b/)) {
	return 1;
	}
	return 0;
}	

function Xdate(theValue){
	if (!theValue.match(/\b(19|20)[0-9]{2}[- \/.](0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])\b/)) {
	return 1;
	}
	return 0;
}			