$(document).ready(function() {

    // fix default to validate once onblur
    jQuery.validator.setDefaults( {
        onfocusout: function(element) {
            if ( !this.checkable(element) ) {
                this.element(element);
            }
        },
        onkeyup: function(element) {
            if ( element.name in this.submitted || element == this.lastElement ) {
                if (element.type != 'textarea') {
                    this.element(element);
                }
                
                var tip_box = $('#tip_' + element.id);
                if (tip_box && tip_box.text()) {
                    tip_box.hide();
                }
            }
        }
    } );
    
    function merger(a,b) {
        for( i in a ) {
            for( j in b ) {
                if (i==j)  {
                    for( k in b[j] ) {
                        a[i][k] = b[j][k];
                    }
                } else {
                    if (! a[j]) {
                        a[j] = b[j];
                    }
                }
            }
        }
    }
    
    // get all input validate stuff
    var rules = {};
    var messages2 = {};
    $(':input[validate]').each(function(i) {
        var validate = $(this).attr('validate');
        var name = $(this).attr('name');
        rules[name] = {};
        // split with space
        var rules_array = validate.split("##");
        if ( rules_array.length < 2 ) {
        	rules_array = validate.split("#");
        }
        var part_num = 0;
        while (part_num < rules_array.length) {
            var lastPart = rules_array[part_num];
            part_num += 1;
            //check if that's a JSON
            if (lastPart.match('{')) {
                var rule;
                eval("rule = " + lastPart + ";");
                for (i in rule) {
                    if (i == 'message' || i == 'custom_message') {
                        messages2[name] = {};
                        for (j in rule[i]) {
                            messages2[name][j] = rule[i][j];
                        }
                    } else {
                        rules[name][i] = rule[i];
                    }
                }
            } else {
                rules[name][lastPart] = true;
            }
        }
    } );

    // get custom messages
    if (typeof(form_id) == 'undefined') {
        form_id = 'myForm';
    }
    if (typeof(messages) != 'undefined') {
        merger(messages2, messages);
    }
    var validate_params = {
        rules: rules,
        messages: messages2,
        errorClass: 'form_tips_erro',
        errorElement: 'div'
    };
    if (typeof(errorPlacement) != 'undefined') {
        validate_params["errorPlacement"] = errorPlacement;
    }
    if (typeof(submitHandler) != 'undefined') {
        validate_params["submitHandler"] = submitHandler;
    }

    // validate myForm form on keyup and submit
    var validator = $("#" + form_id).validate( validate_params );

});