function validate(formName,submitButtonName)
{
    if (submitButtonName)
    {
        disable(submitButtonName);
    }
	var error = "";
	var i;
	var details;
	var currentField;
	var f = eval("document."+formName);
	if (f.dem_required)
	{
		var required = f.dem_required.value.split(",");
		for (i=0;i<required.length;i++)
		{
			details = required[i].split(":");
			currentField = eval("f."+details[0]);
			if (currentField.value.length < 1)
			{
				error = error+"Please enter "+details[1]+"\n";
			}
		}
	}
	if (f.dem_email)
	{
		if (f.dem_email.value.length > 0)
		{
			var email = f.dem_email.value.split(",");
			for (i=0;i<email.length;i++)
			{
				details = email[i].split(":");
				currentField = eval("f."+details[0]);
				if (currentField.value.length > 0 && echeck(currentField.value) == false)
				{
					error = error+"Please enter a valid email address for "+details[1]+"\n";
				}
			}
		}
	}
	if (f.dem_number)
	{
		if (f.dem_number.value.length > 0)
		{
			var number = f.dem_number.value.split(",");
			for (i=0;i<number.length;i++)
			{
				details = number[i].split(":");
				currentField = eval("f."+details[0]);
				if (currentField.value.length > 0 && checkCharSet(currentField.value, "0123456789' '") == false)
				{
					error = error + details[1] + " may only contain numbers.\n";
				}
			}
		}
	}
	if (f.dem_phone)
	{
		if (f.dem_phone.value.length > 0)
		{
			var phone = f.dem_phone.value.split(",");
			for (i=0;i<phone.length;i++)
			{
				details = phone[i].split(":");
				currentField = eval("f."+details[0]);
				if (currentField.value.length > 0 && checkCharSet(currentField.value, "0123456789/-+ ()") == false)
				{
					error = error + details[1] + " may only contain valid numbers.\n";
				}
			}
		}
	}
	if (f.dem_future_date)
	{
		if (f.dem_future_date.value.length > 0)
		{
			var theDate = f.dem_future_date.value.split(",");
			for (i = 0; i < theDate.length; i++)
			{
				details = theDate[i].split(":");
				currentFieldDay = eval("f." + details[0] + "_day");
				currentFieldMonth = eval("f." + details[0] + "_month");
				currentFieldYear = eval("f." + details[0] + "_year");
				if (!checkFutureDate(currentFieldYear.value, currentFieldMonth.value, currentFieldDay.value))
				{
					error = error + "Please enter a valid " + details[1] + ".\n";
				}
			}
		}
	}
	if (f.dem_luhn)
	{
		if (f.dem_luhn.value.length > 0)
		{
			var luhn = f.dem_luhn.value.split(",");
			for (i=0;i<luhn.length;i++)
			{
				details = luhn[i].split(":");
				currentField = eval("f."+details[0]);
				if(checkCharSet(currentField.value, "0123456789")== false || currentField.value.length < 12 || currentField.value.length > 19 || luhnCheck(currentField.value) == false){
					error = error + "Please enter a valid " + details[1] + ".\nPlease ensure there are no spaces or non-numeric charaters and that all details are correct.\n";
				}
			}
		}
	}
	/* Verify CVN exists for MC and Visa */
	if (f.card_type)
	{
		if ((f.card_type.value=='VISA' || f.card_type.value=='MC') && f.cvn.value=="")
		{
			error = error+"Please enter CVN\n";
		}
	}
	if (f.dem_password && f.dem_password_conf)
	{
		if (f.dem_password.value != f.dem_password_conf.value)
		{
			error = error+"Password and confirm password do not match\n";
		}
	}
	/* Check there is a price for private ad */
	if (formName == "sellMyCarPrivate") {
	    if (
	       (f.currency.value=='EURO' && f.price_euro.value=='')
	       ||
	       (f.currency.value=='GBP' && f.price_sterling.value=='') 
	    ) {
	        error = error+"Please enter a price for the currency you have selected\n";
	    }
	}
	if (error != "")
	{
		alert(error); 
		if (submitButtonName)
        {
            enable(submitButtonName);
        }
		return false;
	}
	else
	{
		/* provide warnings if all main fields are not filled in when entering an ad */
		if (f.dem_preferred)
		{
			var warning = "";
			var preferred = f.dem_preferred.value.split(",");
			for (i=0;i<preferred.length;i++)
			{
				details = preferred[i].split(":");
				currentField = eval("f."+details[0]);
				if (currentField.value.length < 1 || currentField.value=="0")
				{
					warning = warning+details[1]+"\n";
				}
			}
			if (warning.length > 0)
			{
				warning = "The following fields have not been specified - not specifying these fields may result in your ad being returned in fewer user searches, or may make it more difficult for customers to contact you: \n\n"+warning+"\nUnspecified descriptive fields will be displayed with a dash (-) on the website, unspecified contact fields will not be displayed.\nClick 'Ok' to proceed without specifying values for these fields.";
        		
				if (false == confirm(warning))
				{
				    if (submitButtonName)
                    {
                        enable(submitButtonName);
                    }
                    return false;
				}
				else
				{
				    return true;
				}
			}
			else
			{
				return true;
			}
		}
		else
		{
			return true;
		}
	}
}
function echeck(str) 
{
	var email = str;
	if(email == "")
		return false;

	var reg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/; // not valid
	var reg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.'_]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/; // valid
	if (!reg1.test(email) && reg2.test(email))	// if syntax is valid	
		return true;

	return false;
}
function checkCharSet(string, charSet) 
{
	var i = 0;
	while(i < string.length && charSet.indexOf(string.charAt(i)) >= 0)
		i++;
	
	return (i == string.length);
}

function luhnCheck(ccNumber){
	var i, sum, weight;
	sum = 0;

	for(i = 0; i < ccNumber.length -1; i++){
		weight = ccNumber.substr(ccNumber.length - (i +2), 1) * (2 - (i %2));
		sum += ((weight < 10) ? weight : (weight -9));
	}
	if(parseInt(ccNumber.substr(ccNumber.length - 1)) == ((10 - sum % 10) % 10)){
		return true;	
	}else{
		return false;
	}
}

function checkFutureDate(itemYear, itemMonth, itemDay){
	var dateToCheck = new Date(itemYear,itemMonth-1,itemDay);
	var today = new Date();
	if (dateDiff(dateToCheck, today) < 0) {
		return false;
	}else{
		return true;
	}
}

function dateDiff(date1, date2)
{
	var yearDiff = date1.getFullYear() - date2.getFullYear();
	var monthDiff = date1.getMonth() - date2.getMonth();
	var dayDiff = date1.getDate() - date2.getDate();
	var diff = (yearDiff * 365) + (monthDiff * 30) + (dayDiff);
		
	return (diff);
}

function disable(name)
{
    var toDisable = document.getElementsByName(name);
    
    for (var i=0;i < toDisable.length;i++)
    {
        toDisable[i].disabled = true;
    }
}

function enable(name)
{
    var toEnable = document.getElementsByName(name);
    
    for (var i=0;i < toEnable.length;i++)
    {
        toEnable[i].disabled = false;
    }
}
