function checkRequired(formObj,errorCallback){
	/* do not use if this browser is safari???
	if((!Context.Common.testBrowser('msie') && !Context.Common.testBrowser('firefox')) || Context.Common.testBrowser('safari'))
		return true;
	*/

	var items 	= new Array();
	var result 	= itemType = null;
	var valid 	= true;
	var str 		= '';
	
	//	get required elements (inputs);
	var inputItems = formObj.getElementsByTagName('input');
	for(var i =0;i<inputItems.length;i++){
     	if(itemType=inputItems[i].getAttribute('req')){
			inputItems[i].style.border='1px solid #A5ACB2';
			inputItems[i].style.background='#fff';
     		if(result=validateItem(inputItems[i],itemType,inputItems[i].value))
     			items[items.length] = result;
		}
	}

     //	get required elements (text areas);
	var inputItems2 = formObj.getElementsByTagName('textarea');
	for(var i =0;i<inputItems2.length;i++){
     	if(itemType=inputItems2[i].getAttribute('req')){
			inputItems2[i].style.border='1px solid #A5ACB2';
			inputItems2[i].style.background='#fff';
     		if(result=validateItem(inputItems2[i],itemType,inputItems2[i].value))
     			items[items.length] = result;
		}
	}
	
     //	get required elements (select items);
	var inputItems3 = formObj.getElementsByTagName('select');
	for(var i =0;i<inputItems3.length;i++){
     	if(itemType=inputItems3[i].getAttribute('req')){
			inputItems3[i].style.border='1px solid #A5ACB2';
			inputItems3[i].style.background='#fff';
     		if(result=validateItem(inputItems3[i],itemType,inputItems3[i].value))
     			items[items.length] = result;
		}
	}

	for (var i=0;i<items.length;i++){
		items[i].element.style.border='1px solid #FF8080';
		items[i].element.style.background='#FFFFC0';
		if(str.indexOf(items[i].error)<0)
			str += (i+1)+". " + items[i].error +"\n";
		valid = false;
		//items[i].element.focus();
	}
	
	if(!valid){
		if(!errorCallback){
			alert(str);
		}else{
			errorCallback(str);
		}
	}
	
     return valid;
}

function validateItem(item,itemType,val){
	var itemLabel  = getItemLabel(item);

     if(itemType.indexOf('ifempty:')>=0){
     	var dependantItem = itemType.split(':')[1].split(',')[0];
     	var thisItemType = itemType.split(':')[1].split(',')[1];
     	var itemLabel2 = getItemLabel(document.getElementById(dependantItem));
     	if((document.getElementById(dependantItem).value.replace(/^\s+|\s+$/g,'').length < 1 ||
     		document.getElementById(dependantItem).value.replace(/^\s+|\s+$/g,'')=='' )&& validateItem(item,thisItemType,val))
               return {'element':item,'error':'You must complete the "'+itemLabel+'" field if you leave the "'+itemLabel2+'" field empty!'};
	}else{
		//	other basic checks;
		if(val.replace(/^\s+|\s+$/g,'').length < 1 || val.replace(/^\s+|\s+$/g,'')=='')
			return {'element':item,'error':'"'+itemLabel+'" field is required!'};
	}

	//	custom filters;
	switch(itemType){
     	case 'email':
     		filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
          		return (!filter.test(val) ? {'element':item,'error':'Please enter a valid email address for the "'+itemLabel+'" field!'}: null);

     	case 'date':
     		filter = /^([0-9]{2})+\/([0-9]{2})+\/([0-9]{4})+$/;
          		return (!filter.test(val) ? {'element':item,'error':'Please enter a valid date\nin the format: mm/dd/yyy\nfor the "'+itemLabel+'" field!"'}: null);
          		
     	case 'datefield':
     		switch(item.id.split('_').reverse()[0]){
     			case 'm':
     			case 'd':
     				filter = /^([0-9]{2})+$/;
          				return (!filter.test(val) ? {'element':item,'error':'Please enter a valid date in the format: mm/dd/yyy\nfor the "'+itemLabel+'" field!"'}: null);
     			case 'y':
     				filter = /^([0-9]{4})+$/;
          				return (!filter.test(val) ? {'element':item,'error':'Please enter a valid date in the format: mm/dd/yyy\nfor the "'+itemLabel+'" field!"'}: null);
          		//default:
          			//validateItem(item,'date',val);
			}
		break;

     	case 'makepwd':
          	if(val.length<8)
          		return {'element':item,'error':'Passwords must be at least 8 characters in length!'};

          	if(document.getElementById(item.name+'_v').value!=val)
           		return {'element':item,'error':'Your passwords do not match!'};

     	break;

     	case 'vfemail':
     		filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
     		if(!filter.test(val))
          		return {'element':item,'error':'Please enter a valid email address for the "'+itemLabel+'" field!'};

          	if(document.getElementById(item.name+'_v').value!=val)
           		return {'element':item,'error':'Your Email Addresses do not match!'};

     	break;

     	default:
     		return null;
	}
}

function getItemLabel(item){
	//See if it's in an adjacent Table Cell;
	var cell = null;
	try{
     	cell = item.parentNode.parentNode.getElementsByTagName('td')[0].innerHTML.replace(/<[^>]+>/gi,"").replace(/[^a-zA-Z0-9\s]/gi,'').replace(/^\s+|\s+$/g,'');
	}catch(e){}
	if(cell && cell!='')
		return cell;

	//Check Alternate Text:
	if(item.alt)
		return item.alt;

	//Use Field Name;
	return (item.name.replace(/^\s+|\s+$/g,' ') +''+ item.name.charAt(0).toUpperCase() +''+ item.name.substr(1));
}