
// force validation of given fields onblur
function onBlurValidateFields(elements)
{
    elements.each(function(i,e) {
        var e = jQuery(e);
        if (!e.data("onBlurValidate")) {
            e.blur(function(){
                e.valid();
            });
            e.data("onBlurValidate", true);
        }
    });
}

// trim content of given fields onblur
function onBlurTrimFields(elements)
{
    elements.each(function(i,e) {
        var e = jQuery(e);
        if (!e.data("onBlurTrim")) {
            e.blur(function(){
                jQuery(this).val(jQuery.trim(jQuery(this).val()));
            });
            e.data("onBlurTrim", true);
        }
    });
}

// fix number format in given fileds onblur - remove spaces, replace "," with "."
function onBlurFixNumber(elements)
{
    elements.each(function(i,e) {
        var e = jQuery(e);
        if (!e.data("onBlurFixNumber")) {
            e.blur(function() {
                jQuery(this).val(jQuery(this).val().replace(/ /g, "").replace(/,/g, "."));
            });
            e.data("onBlurFixNumber", true);
        }
    });
}

// default JS validator options constructor
function ValidatorOptions(defaults)
{
//     this['onfocusout'] = true;
//     this['focusInvalid'] = false;
//     this['focuscleanup'] = true;
    this['errorPlacement'] = function(errors, element) {
//         alert(jQuery(element).attr("id"));
        jQuery(element).attr("title", errors.html());
    }
    this['highlight'] = function(element, errorClass, validClass) {
        $(element).addClass(errorClass).removeClass(validClass);
        refreshTabs(this.currentForm);
    }
    this['unhighlight'] = function(element, errorClass, validClass) {
        jQuery(element).removeClass(errorClass).removeAttr("title");
        refreshTabs(this.currentForm);
    }
    this['ignore'] = ".empty-form input, .empty-form select, .empty-form textarea, .sys-ignore, .sys-ignore input, .sys-ignore select, .sys-ignore textarea";
    this['submitHandler'] = function(form) {
        form = jQuery(form);

        //var pre_submit_calls = window["VALIDATOR_" + form.attr("id") + "_pre_submits"];
        var pre_submit_calls = window["VALIDATOR_" + form.attr("id") + "_pre_submits"];
        var call_retval = true;
        if (pre_submit_calls != undefined) {
            for (var f in pre_submit_calls) {
                if (!pre_submit_calls[f](form)) {
                    call_retval = false;
                }
            }
        }

        if (call_retval) {
            form.get(0).submit();
            return false;
        } else {
            return false;
        }
    }
    this['invalidHandler'] = function(form, validator) {
        log(validator.errorList);
        try {
            var el = $(validator.findLastActive() || validator.errorList.length && validator.errorList[0].element || [])
            .filter(":visible")
            .focus()
            .trigger("focusin");
            var offset = el.offset();
            window.scrollTo(0,offset.top-100);
        } catch(e) {
            // ignore IE throwing errors when focusing hidden elements
        }
    }

    if (defaults) {
        for(var prop in defaults) {
            this[prop] = defaults[prop];
        }
    }
}

function bindErrorDisplay(form_id)
{
    jQuery("form#" + form_id).find("input, select, textarea").live('mouseover',function(){
        var el = $(this);
        if (el.hasClass("error") && el.attr('title') != '') {
            var width = el.width();
            var height = el.height();
            var left = this.offsetLeft;
            var message = '<span class="errorM" style="left: ' + left + 'px; min-width: ' + (width - 4) + 'px; top: -' + (23) + 'px;">' + el.attr('title') + '</span>';
            el.after(message).attr('title', '');
        }
    });
    jQuery("form#" + form_id).find("input, select, textarea").live('mouseout',function(){
        var el = $(this);
        var message = el.next('span');
        el.attr('title',message.text());
        message.remove();
    });
}

function addValidatorPreSubmitCall(form_id, f)
{
    var validator_calls_name = "VALIDATOR_" + form_id + "_pre_submits";
    if ((window[validator_calls_name] == undefined) || (window[validator_calls_name] == null)) {
        window[validator_calls_name] = new Array();
    }
    window[validator_calls_name].push(f);
}

function removeValidatorPreSubmitCalls(form_id)
{
    var validator_calls_name = "VALIDATOR_" + form_id + "_pre_submits";
    window[validator_calls_name] = null;
}

function initValidator(form_id, options)
{
    var form = jQuery("form#" + form_id);

    onBlurFixNumber(form.find("input.sys-number, input.sys-integer")); // fix numbers in sys-number fields
	onBlurTrimFields(form.find("input,textarea")); // trim content of inputs and textareas on blur
    onBlurValidateFields(form.find("input,textarea,select")); // onblur validate all form fields

    window["VALIDATOR_" + form_id] = form.validate(options);
    form.find("input[maxlength]").each(function(i, e) {
        jQuery(e).rules("add", {
            maxlength: parseInt(jQuery(e).attr("maxlength")),
            messages: {
                maxlength: jQuery.format("Max {0} characters are allowed")
            }
        });
    });
    bindErrorDisplay(form_id);
}

function removeValidator(form_id)
{
    jQuery.removeData(jQuery("form#" + form_id).get(0), "validator");
    window["VALIDATOR_" + form_id] = null;
    removeValidatorPreSubmitCalls(form_id);
}

function setValidatorReinitRoutine(form_id, callback)
{
    window["VALIDATOR_" + form_id + "_reinit_routine"] = callback;
}

function removeValidatorReinitRoutine(form_id)
{
    window["VALIDATOR_" + form_id + "_reinit_routine"] = null;
}

function reinitValidator(form_id)
{
    var validator_reinit_name = "VALIDATOR_" + form_id + "_reinit_routine";
//     alert("VAlidator reinit ("+validator_reinit_name+"): " + window[validator_reinit_name]);
    if (window[validator_reinit_name] != undefined && window[validator_reinit_name] != null) {
        var validator_calls_name = "VALIDATOR_" + form_id + "_pre_submits";
        var validator_pre_submit_calls = window[validator_calls_name];
        window["VALIDATOR_" + form_id + "_reinit_routine"]();
        window[validator_calls_name] = validator_pre_submit_calls;
    }
}

function setupGeneralValidator(form_id)
{
    var options = new ValidatorOptions({form_id: form_id});
    initValidator(form_id, options);
    //window["VALIDATOR_" + form_id] = jQuery("form#" + form_id).validate(options);
    setValidatorReinitRoutine(form_id, function() {
//         removeValidator(form_id);
//         initValidator(form_id, options);
    });
}

function refreshTabs(form)
{
    jQuery(form).find("div.sys-tabs").each(function(i, e) {
        var tabs_inline = jQuery(e);
        tabs_inline.find("div.sys-tab-content").each(function(i, e) {
            var tab_content = jQuery(e);
            var tab_header = tabs_inline.find("li.sys-tab-header a[href=#"+tab_content.attr("id")+"]").parent();
            if (tab_content.find(".error").size() > 0) {
                tab_header.addClass("error");
            } else {
                tab_header.removeClass("error");
            }
            if (!tab_content.find(".sys-first_trans_field").val()) {
                tab_header.addClass("empty");
            } else {
                tab_header.removeClass("empty");
            }
        });
    });
}

