var markFields=true;
function validate(frm)
{
	var email_chk=/(^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$)/i;
	var msg=mainMsg+'<ul>';
	var foc=-1;
	var err=false;
	if(typeof fields != "undefined"){
		for(i in fields){
			var field = eval('frm.'+fields[i]);
			var fieldValue=getFieldValue(field);
			if(empty(fieldValue)){
				if(!field.disabled) { 
					if(foc==-1){
						foc=fields[i];
						err=true;
					}
					field.className="inputError";
					setLabel(field);
				}
			}
			else{
				field.className="inputNormal";
				resetLabel(field);
			}
		}
	}
	if(err){
		msg+="<li>"+nullErr+"</li>";
		err=false;
	}
	if(typeof emails != "undefined"){
		for(j in emails){
			var field = eval('frm.'+emails[j]);
			var fieldValue=getFieldValue(field);		
			if(!email_chk.test(fieldValue) && !empty(fieldValue) ){
				if(foc==-1){
					foc=emails[j];
				}
				err=true;
				field.className="inputError";
				setLabel(field);
			}
		}
	}
	if(err){
		msg+="<li>"+emailErr+"</li>";
		err=false;
	}
	
	if(typeof nums != "undefined"){
		for(k in nums){
			var field = eval('frm.'+nums[k]);
			var fieldValue=getFieldValue(field);		
			if(!empty(fieldValue) && (isNaN(fieldValue) || (fieldValue <= 0))){
				if(foc==-1){
					foc=nums[k];
				}
				err=true;
				field.className="inputError";
				setLabel(field);
			}
			
		}
	}
	if(err){
		msg+="<li>"+numberErr+"</li>";
		err=false;
	}
	if(typeof ccDetails != "undefined" && ccDetails.length==4){
		var field = eval('frm.'+ccDetails[0]);
		fieldValue=getFieldValue(field);
		if(fieldValue!=""){
			if(validateCreditCard(fieldValue)){
				var dt= new Date();
				var year=dt.getFullYear();
				var month=dt.getMonth()+1;
				var expMonth = eval('frm.'+ccDetails[1]);
				var expYear = eval('frm.'+ccDetails[2]);
				if(getFieldValue(expYear)<year || (getFieldValue(expYear)==year && getFieldValue(expMonth)<month)){
					expMonth.className="inputError";
					expYear.className="inputError";
					msg+="<li>"+ccDateErr+"</li>";
					if(foc==-1){
						foc=ccDetails[1];
					}
					
				}
				var ccCvv=eval('frm.'+ccDetails[3]);
				var cvvValue=getFieldValue(ccCvv);
				if(cvvValue.length<3){
					ccCvv.className="inputError";
					msg+="<li>"+ccCvvErr+"</li>";
					if(foc==-1){
						foc=ccDetails[3];
					}
				}			
				
			}
			else{
				if(foc==-1){
					foc=ccDetails[0];
				}
				field.className="inputError";
				msg+="<li>"+ccNumErr+"</li>";
			}	
		}
		for(k in nums){
			var fieldValue=getFieldValue(field);		
			if(!empty(fieldValue) && (isNaN(fieldValue) || (fieldValue <= 0))){
				if(foc==-1){
					foc=nums[k];
				}
				err=true;
				field.className="inputError";
			}
			
		}
	}
	
	
	if(foc!=-1){
		var msgBox=document.getElementById(messageBox);
		msg+='</ul>';
		msgBox.style.display="";
		msgBox.innerHTML=msg;
		var fieldType = eval('frm.' + foc + '.type');
		if(fieldType && fieldType!='hidden' && fieldType!='radio' && fieldType!='checkbox'){
			eval('frm.'+foc+'.focus()')
		}
		return(false);
	} else{
		return(true);
	}
}

function validateCreditCard(ccNum) {
	var v = "0123456789";
	var w = "";
	for (var i=0; i < ccNum.length; i++) {
		x = ccNum.charAt(i);
		if (v.indexOf(x,0) != -1){
			w += x;
		}
	}
	var j = w.length / 2;
	if (j < 6.5 || j > 8 || j == 7){
		return false;
	}
	var k = Math.floor(j);
	var m = Math.ceil(j) - k;
	var c = 0;
	for (var i=0; i<k; i++) {
		a = w.charAt(i*2+m) * 2;
		c += a > 9 ? Math.floor(a/10 + a%10) : a;
	}
	for (var i=0; i<k+m; i++){
		c += w.charAt(i*2+1-m) * 1;
	}
	return (c%10 == 0);
}

function setLabel(element){
	if(!markFields){
		return false;
	}
	var parentEl = element.parentNode;
	if(parentEl.previousSibling.nodeType==3){//IE returns txt node :(
		cell=parentEl.previousSibling.previousSibling;
	}else{
		cell=parentEl.previousSibling;
	}
	cell.className='labelError';
}


function resetLabel(element){
	if(!markFields){
		return false;
	}
	var parentEl = element.parentNode;
	if(parentEl.previousSibling.nodeType==3){
		cell=parentEl.previousSibling.previousSibling;
	}else{
		cell=parentEl.previousSibling;
	}
	cell.className='label';
}