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";
        }
    }
    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;
    }
}
