/**
 * performs form fields validation.
 * Get array of data about
 * fileds these to be validated,
 * validation criteries,
 * error messages these should be shown if validation failed.
 * Mark fields those fail validation with CSS class ".wrong-field",
 * changes CSS style "display:inline" for validation errors messages labels.
 *
 * @param validationData - array of maps which has next structure:
 *      jqField - jQuery object of field that should be validate;
 *      validator - function that should perform validation;
 *      criteria - value/case to compare in validation proccess
 *      messageId - ID of field that contatins error message that should be shown, if validation fails
 * @return <code>true</code> - in case all validation passed well, <code>false</code> - if even one validation failed.
 */
function formValidation(validationData) {
    var validationPassed = true;
    for (var data in validationData) {
        var item = validationData[data];

        item.jqField.each(function() {
            if (! item.validator(this, item.criteria)) {
                markValidationFailed(item.messageId, this);
                validationPassed = false;
            }
        });
    }
    return validationPassed;
}

/**
 * Clears validation results in the given dialog.
 *
 * @param dialog the dialog to process
 */
function clearValidationResult(dialog) {
    $(dialog).find(".error-message").css({display:"none"});
    /*removes server validation error class*/
    $(dialog).find(".error-message").removeClass("server-validation-error");
    $(dialog).find(".wrong-field").removeClass("wrong-field");
}

/**
 * Marks failed validation result for the given message and field
 *
 * @param messageId the label id to display
 * @param jqField the input field to highlight
 */
function markValidationFailed(messageId, jqField) {
    $(messageId).css({display:"block"});
    $(jqField).addClass("wrong-field");
}

/**
 * validates value length to be less than criteria value.
 * @param data :
 *       value - numeric value,
 *       criteria - numeric value
 */
function validateLengthLessThan(jqField, criteria) {
    var value = $(jqField).val();
    return value.length < criteria;
}

/**
 * validates value length to be greater than criteria value.
 *
 * @param data :
 *       value - numeric value
 *       criteria - numeric value
 */
function validateLengthGreaterThan(jqField, criteria) {
    var value = $(jqField).val();
    return value.length > criteria;
}

/**
 * validates value to be matched for regular expression.
 * @param data :
 *       value - string value
 *       criteria - regular expression pattern
 */
function validateForRegExpPattern(jqField, criteria) {
    var value = $.trim($(jqField).val());
    var regExp = new RegExp(criteria, "g");
    return regExp.test(value);
}

/**
 * validates value to be defined and not empty
 * @param data :
 *       value - string value
 */
function validateNotEmptyAndNotZero(jqField, criteria) {
    var value = $(jqField).val();
    if (typeof value == "undefined" || value == "" || value == '0') {
        return false;
    } else {
        return true;
    }
}

function validateEmailGroupsNumber(jqField, criteria) {
    var value = $(jqField).val();
    return value.split("@").length <= criteria + 1;
    /*splitting is done by '@' sign, so the last group is criteria +1 */
}

function validateEmailInCaseOfResponse(email, sendMailOnResponse) {
    return !( sendMailOnResponse && email.value.length == 0 ); 
}