function showError(field_name, message) {
    var field_id='#' + field_name;
    var field_error_id='#' + field_name + '_error';
    var field_error_p_id=field_error_id + '';
    $(field_error_p_id).text(message);
    $(field_id).addClass("error");
    $(field_id).focus();
    $(field_error_id).attr("style", "display:block");
}

function showRadioError(field_name, message) {
    var field_id='#' + field_name + '_error_border';
    var field_error_id='#' + field_name + '_error';
    var field_error_p_id=field_error_id + ' > p:first';
    $(field_error_p_id).text(message);
    $(field_id).addClass("error");
    $(field_error_id).attr("style", "display:block");
}

function hideErrors() {
    $(".error_description").hide();
    $(".error").removeClass("error");
}

function hideError(field_name) {
    $("#" + field_name + "_error").hide();
    $("#" + field_name).removeClass("error");
}


function trim(str, chars) {
    return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}


function trimFields (fields) {
    jQuery.each(fields, 
        function(key, value) {
            var element=$('#'+key);
            element.val(trim(element.val()));
        });
}

function checkRequired (required_fields) {
    var errors=false;
    jQuery.each(required_fields, 
      function(key, value) {
        var element=$('#'+key);
        
        if (element.length == 0) {
            element=$('input:radio[name=' + key + ']:checked');
            if (element.length == 0) {
                showRadioError(key, "Please select "+value);
                errors=true;
            }
        } else {
            var curVal = element.val();
            if (trim(curVal) == "") {
                showError(key, "Please enter "+value);
                errors=true;
            }
        }
      });
    return errors;
}



var numberRegexp=/^R?[\d ]*\d(\.\d+)?$/;

function isNumeric (value) {
    return (value.search(numberRegexp) >= 0);
}

function checkNumeric (numeric_fields) {
    var errors=false;
    jQuery.each(numeric_fields, 
      function(key, value) {
        var element=$('#'+key);
        
        var curVal = element.val();
        if (curVal != "" && ! isNumeric(curVal)) {
            showError(key, "Please enter a numeric value for "+value);
            errors=true;
        }
      });
    return errors;
}

function isPostCode(value) {
    return (isNumeric(value) && value.length == 4);
}

function checkPostCode (postcode_fields) {
    var errors=false;
    jQuery.each(postcode_fields, 
      function(key, value) {
        var element=$('#'+key);

        var curVal = element.val();
        if (curVal != "" && ! isPostCode(curVal)) {
            showError(key, "Please enter a proper value for "+value);
            errors=true;
        }
      });
    return errors;
}

//var phoneRegexp=/^(\+\d+)? *(\(\d+\))?[\d ]+$/;
var phoneRegexp=/^\d{3}\ ?\d{3}\ ?\d{4}$/;

function isPhone (value) {
    return (value.length < 24 && value.search(phoneRegexp) >= 0);
}

function checkPhone (phone_fields) {
    var errors=false;
    jQuery.each(phone_fields, 
      function(key, value) {
        var element=$('#'+key);
        
        var curVal = element.val();
        if (curVal != "" && ! isPhone(curVal)) {
            showError(key, "Please enter a valid SA phone number, e.g. 082 123 4567");
            errors=true;
        }
      });
    return errors;
}



var dateRegexp=/^\d{4}-\d{1,2}-\d{1,2}$/;

// Convert yyyy-mm-dd to a JS date var, returns null if date is invalid.
function convertDate (date) {
    var correct_format= (date.search(dateRegexp) >= 0);
    if (correct_format) {

        var parts=date.split(/-/);
        var day = parseInt(parts[2], 10);
        var month = parseInt(parts[1], 10);
        var year = parseInt(parts[0], 10);
        if (day < 1 || day > 31 || month < 1 || month > 12) {
            return null;
        }

        var d = new Date();
        d.setFullYear(year);
        d.setMonth(month - 1);
        d.setDate(day);

        // Check for day out of bounds for given month
        if (d.getDate() != day) {
            return null;
        } else {
            return d;
        }

    } else {
        return null;
    }

}



function isDate (value) {
    var d = convertDate(value);
    if (d != null) {
        return true;
    } else {
        return false;
    }
}

function checkDate (date_fields) {
    var errors=false;
    jQuery.each(date_fields, 
      function(key, value) {
        var element=$('#'+key);
        
        var curVal = element.val();
        if (curVal != "" && ! isDate(curVal)) {
            showError(key, "Please enter a date");
            errors=true;
        }
      });
    return errors;
}


var emailRegexp=/^[^@]+@[^@]+$/;

function isEmail (value) {
    return (value.search(emailRegexp) >= 0);
}

function checkEmail (email_fields) {
    var errors=false;
    jQuery.each(email_fields, 
      function(key, value) {
        var element=$('#'+key);
        
        var curVal = element.val();
        if (curVal != "" && ! isEmail(curVal)) {
            showError(key, "Please enter an email address");
            errors=true;
        }
      });
    return errors;
}


function isIdNumber(id) {
    if (id.length != 13) {
        return false;
    }
    if (id.match(new RegExp('^[0-9]+$'))==null) {
        return false;
    }
    //    alert("Checking id:" + id);
    var digits=id.split(new RegExp(''));
    var oddSum = 0;
    for (i = 0; i < 12; i+=2) {
        oddSum += parseInt(digits[i]);
    }
    //    alert("OddSum:" + oddSum);
    var evenNumber = digits[1]+digits[3]+digits[5]+digits[7]+digits[9]+digits[11];
    evenNumber = parseInt(evenNumber,10)*2;
    //    alert("EvenNumber:" + evenNumber);
    var evenDigits = evenNumber.toString().split(new RegExp(''));
    var evenSum = 0;
    for (i = 0; i < evenDigits.length; i++) {
        evenSum += parseInt(evenDigits[i]);
    }
    //    alert("EvenSum:" + evenSum);
    var finalSum = oddSum + evenSum;
    //    alert("finalSum:" + finalSum);
    var finalDigitChar = finalSum.toString().substr(finalSum.toString().length - 1, 1);
    //    alert("finalDigitChar:" + finalDigitChar);
    var finalDigit = parseInt(finalDigitChar);
    //    alert("finalDigit:" + finalDigit);
    var checkDigit;
    if (finalDigit == 0) {
        checkDigit='0';
    } else {
        checkDigit = (10-finalDigit).toString();
    }
    //    alert("checkDigit:" + checkDigit);
    return checkDigit==digits[12];
}



function checkId (id_fields) {
    var errors=false;
    jQuery.each(id_fields, 
      function(key, value) {
        var element=$('#'+key);
        
        var curVal = element.val();
        if (curVal != "" && ! isIdNumber(curVal)) {
            showError(key, "Please enter an id number");
            errors=true;
        }
      });
    return errors;
}
