function htAjaxFormValidate(id){
    $("#" + id).submit(function(){
        if(!canSubmit(this)){
            return false;
        }
    });
    $("#" + id + " input, #" + id + " textarea, #" + id + " select").blur(function(){doSingleValidation($(this), id)});
}

function doSingleValidation(obj, id){
    var elem = $(obj).attr("name");
    $("#" + elem + "-errors").remove();
    if($(obj).attr('obrigatorio') == 'true' && $(obj).val() == ""){
        var erros = {"isEmpty" : "Preenchimento obrigatório"};
        showErrors(elem, erros);
        return false;
    }
    if($(obj).attr("type") != "submit" && $(obj).attr("type") != "button" && $(obj).attr("type") != "file" && !$(obj).attr("readonly")){
        $.post(
            baseUrl + "ajax-form",
            $("#" + id).serialize() + "&ht_ajax_form_validator_id=" + id,
            function(rawData){
                if(jQuery.browser.msie){
                    //alert(rawData);
                    dados = $.parseJSON(rawData);
                }
                else {
                    dados = rawData;
                }
                var erros = dados[elem];
                showErrors(elem, erros);
                //setAutoDisappear(id);
            },
            ((jQuery.browser.msie) ? "text" : "json")
        );
    }
}

function doCompleteValidation(formObj){
    $('.ajax-errors').remove();
    var elements = getElements(formObj);
    for(elem in elements){
        //if($('#' + elem).attr('required') == 'true'){
            //$('#' + elem + '-errors').remove();
        //}
        var obj = elements[elem];
        if($(obj).attr('obrigatorio') == 'true') {
            var hasError = false;
            switch($(obj).attr('type')){
                case 'radio':
                    var radioname = $(obj).attr('name');
                    var radiochecked = false;
                    $('input[name='+ radioname +']').each(function(){
                        if($(this).is(':checked')){
                            radiochecked = true;
                        }
                    });
                    if(radiochecked == false){
                        hasError = true;
                    }
                    break;
                case 'checkbox':
                    if(!$(obj).is(':checked')){
                        hasError = true;
                    }
                    break;
                case 'file':
                    if($(obj).val() == ''){
                        hasError = true;
                    }
                    break;
                default:
                    if($(obj).val() == ""){
                        hasError = true;
                    }
            }
            if(hasError == true){
                var erros = {"isEmpty" : "Preenchimento obrigatório"};
                showErrors(elem, erros);
                $(obj).focus();
                return false;
            }
            //return false;
        }
    }
    if(countErrors(formObj) > 0){
        return false;
    } else {
        $.post(
            baseUrl + "ajax-form",
            $(formObj).serialize() + "&ht_ajax_form_validator_id=" + $(formObj).attr('id'),
            function(rawData){
                if(jQuery.browser.msie){
                    //alert(rawData);
                    dados = $.parseJSON(rawData);
                }
                else {
                    dados = rawData;
                }

                for(i in dados){
                    showErrors(i, dados[i]);
                }
                //setAutoDisappear(id);
                if(countErrors(formObj) > 0 ){
                   return false;
               } else {
                   if($(formObj).attr('rel') == 'ajax-submit'){
                        return false;
                   } else {
                       formObj.submit();
                   }
                   return true;
               }
            },
            ((jQuery.browser.msie) ? "text" : "json")
        );
    }
}

function setAjaxForm(formId)
{
    $('#' + formId).attr('rel', 'ajax-submit');
}

function showErrors(elemTMP, erros){
    try{
        elem = getRealId(elemTMP);
    } catch(err){
        elem = elemTMP;
    }

    $('#' + elem + '-errors').remove();
    $('#' + elem ).parent().find('ul.errors').remove();
    var erro  = "<ul id=\"" + elem + "-errors\" class=\"ajax-errors\">";
    elemErrorCount = 0;
    for(k in erros){
        if(k != 'fileUploadErrorIniSize'){
            erro += "<li class=\"" + k + "\">" + erros[k] + "</li>";
            elemErrorCount++;
        }
    }
    erro += "</ul>";
    if(elemErrorCount > 0){
        if($("#" + elem).attr('name')){
            if($("#" + elem).parent().hasClass('input-replace-wrapper')){
                $("#" + elem).parent().parent().append(erro);
            } else {
                $("#" + elem).parent().append(erro);
            }
        } else {
            $('input[name=' + elem + ']').parent().parent().find('ul.errors').remove();
            $('input[name=' + elem + ']').parent().parent().append(erro);
        }
        $("#" + elem).parent().find('.removeDuplicates').remove(); //jQuery Bug
        $("#" + elem).parent().find('.empty').remove(); //jQuery Bug
        addErrorBehaviors();
    }
    $("#" + elem + '-errors').trigger("ajaxErrorAdded");
}

function getRealId(elemTMP){
    if(elemTMP.lastIndexOf(']') == (elemTMP.length - 1)){
        var arrTMP = elemTMP.split('[');
        var retTMP = arrTMP.join('-').replace(']', '');
        return retTMP;
    } else {
        return elemTMP;
    }
}

function getElements(formObj){
    var elements = {};
    $(formObj).find('input, textarea, select, checkbox, radio').each(function(){
        //if ($(this).attr('name') !== undefined) {
            elements[$(this).attr('name')] = $(this);
        //}
    });
    return elements;
    //return $(formObj).find('input, select, checkbox, radio');
}

function setAutoDisappear(id){
    $("#" + id + " .ajax-errors").click(function(){
        $(this).prev().focus();
        $(this).fadeOut();
    });
    $("#" + id + " input").focus(function(){
        $(this).next().fadeOut();
    });
}

function canSubmit(formObj){
    return doCompleteValidation(formObj);
}

function countErrors(formObj){
    var c = 0;
    $(formObj).find('.ajax-errors').each(function(){
        //alert($(this).attr('id'));
        c++;
    });
    return c;
}

function isArray(o){
    return(typeof(o.length)=="undefined")?false:true;
}

function addErrorBehaviors()
{
    $('.ajax-errors').click(function(){
        $(this).fadeOut();
        $(this).prev().focus();
    });
    $('.ajax-errors').prev().focus(function(){
        $(this).next().fadeOut();
    });
}
