 /******************************
  * base.form.js               *  
  *                            *
  * comuns para todos os forms *
  ******************************/

/**
 * Valida campos
 * 
 * exemplos:
 *         formValidate()          //valida todos os campos obrigatórios da tela
 *         formValidate('YYY')     //valida todos os campos internos ao elemento com id="YYY"
 *         formValidate($('.WWW')) //valida todos os campos que obedeçam a regra do seletor jQuery (class = WWW)  
 * @param strig/objJquery campos
 * @return boolean
 */
function formValidate(campos){
    var retorno = true;
    if(!campos){
        $(':input.required').not(':hidden,:disabled').each(function(){
            if(retorno){ retorno = $(this).baseValidate(false); }
        });
    }else{
        if(campos instanceof Object){
            campos.each(function(){
                if(retorno && $(this).is('.required')){ retorno = $(this).baseValidate(false); }
            });
        }else{
            $('#'+campos).each(function(){
                if(retorno){ retorno = $(this).baseValidate(false); }
            });
        }
    }
    return retorno;
}

/**
 * Executa a validação do input referenciada em "data('validateFunction')"
 *
 * @param boolean allowEmpty  default true (permite campo vazio)
 * @return boolean
 */
$.fn.baseValidate = function(allowEmpty){
    allowEmpty = (!allowEmpty)?false:true; //default true
    if( !allowEmpty ){
        switch ($(this).attr('controltype')) {
            case 'quote':
            case 'money':
            case 'float':
                if(!$(this).floatVal()>0){
                    $(this).showToolTip(i18n.MN060);
                    return false;
                }
                break;
            case 'number':
                if(!parseInt($(this).val())>0){
                    $(this).showToolTip(i18n.MN060);
                    return false;
                }
                break;
            default:
                if($.trim($(this).getValUnmasked()) == ""){
//                if($.trim($(this).val()) == ""){
                    $(this).showToolTip(i18n.MN060);
                    return false;
                }
            break;
        }
    }
    if(!allowEmpty && ($(this).attr('type') == 'radio' || $(this).attr('type') == 'checkbox')){
        var nameInput = $(this).attr('name');
        if(!$(':input[name="'+nameInput+'"]').isChecked()){
            $(this).showToolTip(i18n.MN060);
            return false;
        }
    }
    
    if( $.isFunction( $(this).data('validateFunction') ) ){
        
        if($(this).data('validateFunction')($(this))){
            return true; 
        }else{
            return false;
        }
    }
    return true;
};

$.fn.isChecked = function(){
    var field = $(this);
    if(field.length) {
        for(i = 0; i < field.length; i++) {
            if(field[i].checked)
                return true;
        }
    }
    else if(field.checked)
        return true;
    return false;
};


/**
 * Prepara os inputs (mascaras e funções de validações)
 * 
 * @param mixed container
 * @return void
 */
function setupInputs(container){
    container = (container)?container:false;
    if( !container ){ 
        var inputs = $(':input');
    } else if( container.jquery ){
        if( container.is(':input') ){
            var inputs = container;
        } else {
            var inputs = container.find(':input');
        }
    } else {
        var inputs = $(container +' :input');
    }
    inputs.each(function(){
//        $(this).bind('change', $(this).baseValidate);
       
        var configDefaultDatepicker = {
            "dateFormat"      : "dd/mm/yy",
            "showOn"          : "button",
            "buttonImage"     : urlImg + "/calendar.png",
            "buttonImageOnly" : true,
            "changeMonth"     : true,
			"changeYear"      : true,
            "yearRange"       : "-20:+20",
            "buttonText"      : "Escolher Data...",
            "dayNamesMin"     : ["Dom", "Seg", "Ter", "Qui", "Qua", "Sex", "Sab"],
            "monthNamesShort" : ["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],
            "monthNames"      : ["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"]
        };
        
        switch( $(this).attr('controltype') ){
            case 'uf':
                $(this).bind('change', function(){
                            if( $($(this).attr('dependent')).length ){
                                $(this).getMunicipioByUf($(this).attr('dependent'));
                            }
                        });
                break;
            case 'cpf':
                $(this).data('validateFunction', isCpfValid)
                       .mask('999.999.999-99')
                       .css('text-align','center');
                break;
            case 'cnpj':
                $(this).data('validateFunction', isCnpjValid)
                       .mask('99.999.999/9999-99')
                       .css('text-align','center');
                break;
            case 'phone':
                $(this).mask('(99) 9999-9999')
                       .css('text-align','center');
                break;
            case 'cep':
                $(this).mask('99.999-999')
                       .css('text-align','center');
                break;
            case 'quote':
                $(this).maskMoney({"precision":7})
                       .css('text-align','right');
                break;
            case 'float':
            case 'money':
                $(this).maskMoney()
                       .css('text-align','right');
                break;
            case 'paginator':
                $(this).bind('keypress', $(this).number)
                       .bind('keypress',function(e){
                        var e=e||window.event;
                        var k=e.charCode||e.keyCode||e.which;
                        if( k == 13 ){
                            $(this).trigger('blur');
                            return true;
                        }
                        var key = String.fromCharCode(k);
                        var lastPage = $(this).attr('lastpage');
                        var qtdCharLastPage = lastPage.length;
                        if( qtdCharLastPage > 1 ){
                            key = parseInt( $(this).val() + (key+'') );
                            if( key > lastPage || key <= 0 ){
                                return false;
                            }
                        } else {    
                            if( key > lastPage || key <= 0 ){
                                return false;
                            }
                        }
                    });
                break;
            case 'number':
                $(this).bind('keypress', $(this).number);
                break;
            case 'float_zero_allowed':
            case 'money_zero_allowed':
                $(this).maskMoney()
                       .css('text-align','right');
                break;
            case 'number_zero_allowed':
                $(this).bind('keypress', $(this).number);
                break;            
            case 'date':
                $(this).data('validateFunction', isDateValid)
                       .mask('99/99/9999')
                       .css('text-align','center')
                       .datepicker(configDefaultDatepicker);
                break;
            case 'init_date':
                $(this).data('validateFunction', isInitDateValid)
                       .mask('99/99/9999')
                       .css('text-align','center')
                       .datepicker(configDefaultDatepicker);
                break;
            case 'final_date':
                $(this).data('validateFunction', isFinalDateValid)
                       .mask('99/99/9999')
                       .css('text-align','center')
                       .datepicker(configDefaultDatepicker);
                break;

            case 'date__m_y':
                $(this).data('validateFunction', isDateValid)
                       .mask('99/9999')
                       .css('text-align','center')
                       .datepicker($.extend(configDefaultDatepicker,{"dateFormat":"mm/yy"}));
                break;
            case 'init_date__m_y':
                $(this).data('validateFunction', isInitDateValid)
                       .mask('99/9999')
                       .css('text-align','center')
                       .datepicker($.extend(configDefaultDatepicker,{"dateFormat":"mm/yy"}));
                break;
            case 'final_date__m_y':
                $(this).data('validateFunction', isFinalDateValid)
                       .mask('99/9999')
                       .css('text-align','center')
                       .datepicker($.extend(configDefaultDatepicker,{"dateFormat":"mm/yy"}));
                break;

            case 'init_year':
                $(this).data('validateFunction', isInitDateValid)
                       .mask('9999')
                       .css('text-align','center')
                       .datepicker($.extend(configDefaultDatepicker,{"dateFormat":"yy"}));
                break;
            case 'final_year':
                $(this).data('validateFunction', isFinalDateValid)
                       .mask('9999')
                       .css('text-align','center')
                       .datepicker($.extend(configDefaultDatepicker,{"dateFormat":"yy"}));
                break;

            case 'date_less_than_today':
                $(this).data('validateFunction', isDateValidLessThanToday)
                       .mask('99/99/9999')
                       .css('text-align','center')
                       .datepicker($.extend({"maxDate":"-1d"},configDefaultDatepicker));
                break;
            case 'date_less_than_tomorrow':
                $(this).data('validateFunction', isDateValidLessThanTomorrow)
                       .mask('99/99/9999')
                       .css('text-align','center')
                       .datepicker($.extend({"maxDate":"d"},configDefaultDatepicker));
                break;
            case 'date_greater_than_today':
                $(this).data('validateFunction', isDateValidGreaterThanToday)
                       .mask('99/99/9999')
                       .css('text-align','center')
                       .datepicker($.extend({"minDate":"+1d"},configDefaultDatepicker));
                break;
            case 'date_greater_than_yesterday':
                $(this).data('validateFunction', isDateValidGreaterThanYesterday)
                       .mask('99/99/9999')
                       .css('text-align','center')
                       .datepicker($.extend({"minDate":"d"},configDefaultDatepicker));
                break;
            case 'email':
                $(this).data('validateFunction', isMailValid)
                       .css('text-transform','lowercase');
                break;
            case 'pais_sem_paraiso_fiscal':
                $(this).data('validateFunction', paisValidate);
                break;
            case 'nome_completo':
                $(this).data('validateFunction', isNomeCompletoValid);
                break;
//            case 'registro':
//                $(this).mask('a99999999')
//                       .css({
//                            'text-transform' :'uppercase',
//                            'text-align' :'center'
//                       })
//                       .blur(function(){
//                           $(this).val( $(this).val().toUpperCase() );
//                       });
//                break;
            case 'registro':
                $(this).data('validateFunction', isRegistro)
                       .css('text-transform','uppercase')
                       .keyup(function(){ return isRegistro($(this)); });
                break;
            case 'year':
                $(this).mask('9999')
                       .css('text-align','center');
                break;
            case 'code_control':
                $(this).mask('****.****.****.****')
                       .css({
                            "text-transform" : "uppercase",
                            "text-align"     : "center"
                       })
                       .blur(function(){
                           $(this).val( $(this).val().toUpperCase() );
                       });
                break;
            case 'upper_case':
                $(this).css({
                           "text-transform" : "uppercase"
                       })
                       .blur(function(){
                           $(this).val( $(this).val().toUpperCase() );
                       });
                break;
            case 'lower_case':
                $(this).css({
                    "text-transform" : "lowercase"
                })
                .blur(function(){
                    $(this).val( $(this).val().toLowerCase() );
                });
                break;
        }
        if( $(this).is('textarea') ){
            if( $(this).attr('maxlength') ){
                $(this).bind('keypress', $(this).limited);
            }
        }
        
        $(this).blur( $(this).baseValidate );
//        $(this).bind('blur', $(this).baseValidate );
    });
}

/**
 * Reseta a mascara de moeda
 * 
 * @param object params
 * @return object
 */
$.fn.resetMaskMoney = function(params){
    if( $(this).attr('readonly') ){
        $(this).removeAttr('readonly')
               .unmaskMoney()
               .maskMoney(params)
               .attr('readonly','readonly');
    } else {
        $(this).unmaskMoney().maskMoney(params);
    }
    return $(this);
}

/** ToolTip **/

/**
 * Método que exibe o toolTip
 * @param String         msg
 * @param objJquery        objJquery
 * @param boolean         ojbModal
 * @return void
 */
$.fn.showToolTip = function(msg){
    this.activateParentTab();
    var top   = this.offset().top; 
    var left  = this.offset().left;

    
    removeToolTip();

    var toolTip   = '<div class="toolTip hidden" style="top:'+(top - 50)+'px; left:'+(left + 10)+'px;">';
        toolTip  += '    <p onmouseover="$(this).children(\'a\').show();" onmouseout="$(this).children(\'a\').hide();">';
        toolTip  += '       <span> '+msg+'</span>';
        toolTip  += '       <a onclick="removeToolTip();" style="display:none"></a>';
        toolTip  += '    </p>';
        toolTip  += '</div>';
        
    
    $(document.body).append(toolTip);
    
    var element = $(this);
    
    if( $('.toolTip span').height() > $('.toolTip p').height() ){
        removeToolTip();
        showDialog(msg, 'alert', false, true, function(){
            if(!element.attr('readonly')){
                setFocusTimeout(element);
            }
        });
    } else {
        var targetOffset = this.offset().top;
        $('html,body').animate({scrollTop: targetOffset-70}, 500);
        if(!element.attr('readonly')){
            setFocusTimeout(element);
        }
        element.one('change',function(){removeToolTip();});

        $('.toolTip').removeClass('hidden');
        $('.toolTip span').height( $('.toolTip p').height() );
    }
    
};

/**
 * Ativa a tab do obj caso ele esteja dentro de uma.
 * Retorna false ou o Obj da tab.
 * @return boolean
 */
$.fn.activateParentTab = function(){
    var parentTab = this.closest('.ui-tabs>div');
        if(parentTab.length > 0){
            parentTab.parent().tabs('select', $('#'+parentTab.parent().attr('id')+'>div').index(parentTab));
            return true;
        }else{
            return false;
        }
};

/**
 * Remove possive o toolTip visivel
 * @return void
 */
function removeToolTip()
{
    var toolTip = $(".toolTip");
    if(toolTip.length > 0){
        toolTip.remove();
    }
}

/**
 * Remove possive o toolTip visivel
 * @return void
 */
function removeDialog()
{
    var dialog = $("#dialog");
    if(dialog.length > 0){
        dialog.remove();
    }
}

/**
 * 
 * @param msg
 * @param type
 * @param urlRedirect
 * @param modal
 * @param callbackSuccess
 * @return
 */
function showDialog(msg, type, urlRedirect, modal, callbackSuccess){
    ajaxLoaded();
    removeToolTip();
    removeDialog();
    var color = (type == "success")? "#54aa3c" : "#cd0a0a";
    type  = (type == "success")? "ui-icon-circle-check ui-icon-green":"ui-icon-alert ui-icon-red";
    var element  =    '<div id="dialog" title="Mensagem">';
        element +=        '<p style="color:'+color+'">';
        element +=            '<span class="ui-icon '+ type +'" style="float:left; margin:0 7px 50px 0;"></span>';
        element +=            msg;
        element +=        '</p>';
        element +=    '</div>';
    $(document.body).append(element);
    modal = !isset(modal)?!modal:modal;
    $("#dialog").dialog({
        dragStart: function(event, ui) { removeToolTip();$(this).css('visibility','hidden'); },
        dragStop: function(event, ui) { removeToolTip();$(this).css('visibility','visible'); },
        bgiframe: true,
        dialogClass: 'hide-close-button',
        modal: modal,
        closeOnEscape: false,
        buttons: {
            Ok: function() {
                if($.isFunction(callbackSuccess)){
                    callbackSuccess();
                }
                if(urlRedirect !== false && urlRedirect != undefined){
                    redirect(urlRedirect);
                }
                $(this).dialog('close');
                $(this).remove();
                ajaxLoaded();
            }
        }
    });
}

/**
 * Função que substitui o CONFIRM padrão do JS.
 *
 * @param STRING  msg  ( mensagem do alert ) 
 * @param BOOLEAN funcaoSim ( função se TRUE )
 * @param BOOLEAN funcaoNao ( função se FALSE )
 * @param STRING  title  ( texto do titulo ) 
 * @param INT  height  ( altura do dialog ) 
 * @param INT  width  ( comprimento do dialog )
 */
function showConfirmDialog(msg, funcaoSim, funcaoNao, title, height, width)
{
    removeToolTip();
    removeDialog();
    ajaxLoaded();
    
    var title = (title)?title:'Confirmação';
    
    var strHtml = "<div id=\"dialog\" title=\""+title+"\" style=\"display:none;\">";
    strHtml += "      <p>";
    strHtml += "        <span class=\"ui-icon ui-icon-help\" style=\"float:left; margin:0 7px 50px 0;\"></span>";
    strHtml +=          msg;
    strHtml += "     </p>";
    strHtml += "</div>";
    
    
    $('body').append(strHtml);
    
    var height = (height)? height : 'auto';
    var width  = (width) ? width  : 300;
    
    $("#dialog").dialog({
        dragStart: function(event, ui) { removeToolTip();$(this).css('visibility','hidden'); },
        dragStop: function(event, ui) { removeToolTip();$(this).css('visibility','visible'); },
        bgiframe: true,
        resizable: true,
        height: height,
        width: width,
        modal: true,
        shadow: true,
        overlay: {
            backgroundColor: '#000',
            opacity: 0.5
        },
        buttons: {
            "Não": function() {
                $(this).dialog('close');
                $(this).remove();
                if(funcaoNao != ""){
                    if($.isFunction(funcaoNao)){
                        setTimeout(funcaoNao, 100);
                    }else{
                        setTimeout('eval('+ funcaoNao +');', 100);
                    }
                }
            },
            "Sim": function() {
                $(this).dialog('close');
                $(this).remove();
                
                if(funcaoSim != ""){
                    if($.isFunction(funcaoSim)){
                        setTimeout(funcaoSim, 100);
                    }else{
                        setTimeout('eval('+ funcaoSim +');', 100);
                    }
                } 
            }
        }
    });
}
function showPhpValidation(retorno){
    ajaxLoaded();
    //var arrId = new Array();
    //var arrMsg = new Array();
    var i;
    var j;
    var k;

    var elemForm;
    var msgForm;
    for(i in retorno.arrMessages){
        //arrId.push(i);
        elemForm = i;
        for(j in retorno.arrMessages[i]){
            //arrMsg.push(retorno.arrMessages[i][j]);
            msgForm = (retorno.arrMessages[i][j]);
            break;
        }
        break;
    }
    //if( typeof(arrMsg[0]) == 'object' ) {
    if( typeof(msgForm) == 'object' ) {
        //exibirei apenas o primeiro erro com subform
        var elemSubform;
        var msgSumform;
        for(k in retorno.arrMessages[i][j]){
            msgSumform = (retorno.arrMessages[i][j][k]); 
            break;
        }
        elemSubform = i+'-'+j;
        $('#'+ elemSubform).showToolTip(msgSumform);
    } else {
        //exibirei apenas o primeiro erro
        //$('#'+ arrId[0]).showToolTip(arrMsg[0]);    
        $('#'+ elemForm).showToolTip(msgForm);    
    }
    // subform
    //{"error":true,"errorType":1,"arrMessages":{"procuracao":{"DT_VALIDADE":{"isEmpty":"Este campo n\u00e3o pode ser vazio"}}}}
    // form
    //{"error":true,"errorType":1,"arrMessages":{"DT_VALIDADE":{"isEmpty":"Este campo n\u00e3o pode ser vazio"}}}
}

function showPhpDbError(retorno){
//      var msg = isset(retorno.errorMessage)?retorno.errorMessage:i18n.MN042;
//    showDialog(msg, 'alert', retorno.urlRedirect, true);

    if( !retorno.errorMessage ){
        if( isset(retorno.urlRedirect) ){
            redirect( retorno.urlRedirect, retorno.arrData );
        }
    } else {
        if(count(retorno.arrData)>0){
            showDialog(retorno.errorMessage, 'alert',false, true, function(){ redirect(retorno.urlRedirect,retorno.arrData,'post'); });
        } else {
            showDialog(retorno.errorMessage, 'alert',retorno.urlRedirect, true);
        }
    }
}

function showPhpSuccess(retorno){
    if( !retorno.successMessage ){
        if( isset(retorno.urlRedirect) ){
            redirect( retorno.urlRedirect, retorno.arrData );
        }
    } else {
        if(count(retorno.arrData)>0){
            showDialog(retorno.successMessage, 'success',false, true, function(){ redirect(retorno.urlRedirect,retorno.arrData,'post'); });
        } else {
            showDialog(retorno.successMessage, 'success',retorno.urlRedirect, true);
        }
    }
}


/**
 * Função que checa os campos de senha
 * 
 * @param object jQuery objSenha
 * @return boolean
 */
function checkPassword(objSenha){
    var objSenha = (isset(objSenha))?objSenha:$(this);
    
    var password  = $.trim( objSenha.val() );
    var minLength = objSenha.attr('minlength');
    if( password.length != 0 && password.length < minLength ){
        if( minLength == 6 ){
            objSenha.showToolTip(i18n.MN073);
        }
        return false;
    }
    return true;
}

/**
 * Para checar se o CapsLock ta ativado
 * se sim retorna o showMsg com o aviso no elemento informado
 *
 * exemplo: onkeypress="checarCapsLock(event,$(this))"
 * @param event ev
 * @param object jQUery objQuery
 * @return void
 */
function checarCapsLock(ev,objQuery) {
    removeToolTip();
    
    var e = ev || window.event;
    var codigo_tecla = e.charCode||e.keyCode||e.which;
    var tecla_shift = e.shiftKey?e.shiftKey:((codigo_tecla == 16)?true:false);
    
    if(((codigo_tecla >= 65 && codigo_tecla <= 90) && !tecla_shift) || ((codigo_tecla >= 97 && codigo_tecla <= 122) && tecla_shift)) {
        objQuery.showToolTip(i18n.MN072);
    }
}

function isRegistro( objJquery ){
    objJquery.val( objJquery.val().toUpperCase() );
    if( $.trim(objJquery.val()) == '' ){
        objJquery.val('');
        removeToolTip();
        return false;
    }
    var otherChar = false;
    var firstChar = objJquery.val().substr(0,1).toUpperCase();
    if( !isNaN(firstChar) ){
        objJquery.attr('maxlength','8');
        if( objJquery.val().length == 8 ){
            otherChar = objJquery.val().substr(0,8);
            if( isNaN(otherChar) ){
                objJquery.showToolTip(i18n.MN081);
            } else {
                removeToolTip();
                return true;
            }
        }
    } else {
        if( firstChar == 'P' 
         || firstChar == 'S'
         || firstChar == 'T'
         || firstChar == 'B' ){
            objJquery.attr('maxlength','9');
            if( objJquery.val().length == 9 ){
                otherChar = objJquery.val().substr(1,8);
                if( isNaN(otherChar) ){
                    objJquery.showToolTip(i18n.MN081);
                } else {
                    removeToolTip();
                    return true;
                }
            }
        } else {
            objJquery.showToolTip(i18n.MN081);
        }
    }
    return false;
}

/**
 * Função para validar se a data informada é maior/menor que a ontem/amanhã/atual
 *
 * @param object jQuery objJquery
 * @param string type
 * @return boolean
 */
function isDateValidGeneric(objJquery,type){
    removeToolTip();
    var value = objJquery.getValUnmasked();
    if(value != ''){
        if(!isDateValid(objJquery)){
            return false;
        }else{
            var str = objJquery.val();
            
            var data = new Date();
            
            var dia = data.getDate();
            var mes = (data.getMonth())+1;
            var ano = data.getFullYear();


            if(dia < 10) dia = '0' + dia;
            if(mes < 10) mes = '0' + mes;

            var data1 = str;
            var value = parseInt( data1.split( "/" )[2].toString() + data1.split( "/" )[1].toString() + data1.split( "/" )[0].toString() );
            
            var data2 = dia + '/' + mes + '/' + ano;
            var hoje  = parseInt( data2.split( "/" )[2].toString() + data2.split( "/" )[1].toString() + data2.split( "/" )[0].toString() );
            
            switch(type){
                case 'greaterThanToday':
                    if ( hoje >= value ){
                        objJquery.showToolTip(i18n.MN027);
                        return false;
                    }else{
                        return true;
                    }
                    break;
                case 'greaterThanYesterday':
                    if ( hoje > value ){
                        objJquery.showToolTip(i18n.MN015);
                        return false;
                    }else{
                        return true;
                    }
                    break;
                case 'lessThanToday':
                    if ( hoje <= value ){
                        objJquery.showToolTip(i18n.MN016);
                        return false;
                    }else{
                        return true;
                    }
                    break;
                case 'lessThanTomorrow':
                    if ( hoje < value ){
                        objJquery.showToolTip(i18n.MN017);
                        return false;
                    }else{
                        return true;
                    }
                    break;
                default:
                    showDialog('Erro no tipo de valisação de data','alert');
                    return false;
                    break;
            }
        }
    }
}

/**
 * Função para validar se a data informada é maior que a atual
 *
 * @param object jQuery objJquery
 * @return boolean
 */
function isDateValidGreaterThanToday(objJquery){
    return isDateValidGeneric(objJquery,'greaterThanToday');
}
/**
 * Função para validar se a data informada é maior que a ontem
 *
 * @param object jQuery objJquery
 * @return boolean
 */
function isDateValidGreaterThanYesterday(objJquery){
    return isDateValidGeneric(objJquery,'greaterThanYesterday');
}
/**
 * Função para validar se a data informada é menor que a ontem
 *
 * @param object jQuery objJquery
 * @return boolean
 */
function isDateValidLessThanToday(objJquery){
    return isDateValidGeneric(objJquery,'lessThanToday');
}
/**
 * Função para validar se a data informada é menor que a amanhã
 *
 * @param object jQuery objJquery
 * @return boolean
 */
function isDateValidLessThanTomorrow(objJquery){
    return isDateValidGeneric(objJquery,'lessThanTomorrow');
}

/**
 * Verifica se uma string é um e-mail válido
 */
function isMailValid(objJquery) {
    removeToolTip();
    if(objJquery.val() != ''){
        if(!isMail(objJquery.val())) {
            objJquery.showToolTip(i18n.MN043);
            return false;
        }
        return true;
    }else{
        return true;
    }
}

function isMail(mail){
    var er = new RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/);
    if(typeof(mail) == "string"){
        if(er.test(mail)){ 
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

/**
 * Verifica se a data é válida
 * @param objJquery
 * @return
 */
function isInitDateValid(objJquery){
    if( !isDateValid(objJquery) ){
        return false;
    }
    
    var objInitDate  = objJquery;
    var objFinalDate = $(objJquery.attr('dependent'));
    var comparer     = compareDate(objInitDate, objFinalDate);

    if( comparer >= 0 ){
        return true;
    } else {
        objJquery.showToolTip(i18n.MN012);
        return false;
    }
}

/**
 * Verifica se a data é válida
 * @param objJquery
 * @return
 */
function isFinalDateValid(objJquery){
    if( !isDateValid(objJquery) ){
        return false;
    }
    
    var objFinalDate = objJquery;
    var objInitDate  = $(objJquery.attr('dependent'));
    var comparer     = compareDate(objInitDate, objFinalDate);

    if( comparer >= 0 ){
        return true;
    } else {
        objJquery.showToolTip(i18n.MN097);
        return false;
    }
}

/**
 * Verifica se a data é válida
 * @param objJquery
 * @return
 */
function isDateValid(objJquery){
    removeToolTip();
    var value = objJquery.getValUnmasked();
    if(value != ''){
        var data = new Date();
        switch(  value.length ){
            case 8:
                data = data.parseDate(objJquery.val(), 'dd/mm/yyyy');
                break;
            case 6:
                data = data.parseDate(objJquery.val(), 'mm/yyyy');
                break;
            case 4:
                data = data.parseDate(objJquery.val(), 'yyyy');
                break;
            default:
                data = false;
                break;
        }
        if(!data) {
            objJquery.showToolTip(i18n.MN065);
            return false;
        }
        return true;
    }else{
        return true;
    }
}
/**
 * Verifica se uma string é um CPF
 */
function isCPF(str){
    if (!str){ return false; }
    
    str = str.replace('.','');
    str = str.replace('.','');
    str = str.replace('-','');

    if( str.length !== 11 )
        return false;

    var c = str.substr(0,9);
    
    if( c == "000000000" +'' 
     || c == "111111111" +''
     || c == "222222222" +''
     || c == "333333333" +''
     || c == "444444444" +''
     || c == "555555555" +''
     || c == "666666666" +''
     || c == "777777777" +''
     || c == "888888888" +''
     || c == "999999999" ){
        return false;
    }
    
    var dv = str.substr(9,2);
    var d1 = 0;
    for (i = 0; i < 9; i++){
        d1 += c.charAt(i)*(10-i);
    }
    
    if (d1 == 0){
        return false;
    }
    
    d1 = 11 - (d1 % 11);
    if (d1 > 9) d1 = 0;
    if (dv.charAt(0) != d1){
        return false;
    }
    
    d1 *= 2;
    for (i = 0; i < 9; i++){
        d1 += c.charAt(i)*(11-i);
    }
    d1 = 11 - (d1 % 11);
    if (d1 > 9) d1 = 0;
    if (dv.charAt(1) != d1){
        return false;
    }
    return true;    
}

/**
 * Verifica se o valor do campo é um CPF
 *
 * @param objJquery
 * @return boolean
 */
function isCpfValid(objJquery) {
    removeToolTip();
    var cpf = objJquery.getValUnmasked();
    if( cpf.length == 11 ){ 
        if( !isCPF( cpf ) ){
            objJquery.showToolTip(i18n.MN031);
            return false;
        } else {
            return true;
        }
    }
    return false; 
}

/**
 * Verifica se a string é um cnpj
 *
 * @param String str
 * @return
 */
function isCNPJ(str){
    if (!str){ return false; }
    
    str = str.replace('.','');
    str = str.replace('.','');
    str = str.replace('/','');
    str = str.replace('-','');
    
    if (str.length != 14){
        return false;
    }
    
    if ((str.indexOf("-") != -1) || (str.indexOf(".") != -1) || (str.indexOf("/") != -1)){
        return false;
    }    

    var df, resto, dac = "";

    df = 5*str.charAt(0)+4*str.charAt(1)+3*str.charAt(2)+2*str.charAt(3)+9*str.charAt(4)+8*str.charAt(5)+7*str.charAt(6)+6*str.charAt(7)+5*str.charAt(8)+4*str.charAt(9)+3*str.charAt(10)+2*str.charAt(11);
    resto = df % 11;
    dac += ( (resto <= 1) ? 0 : (11-resto) );
    df = 6*str.charAt(0)+5*str.charAt(1)+4*str.charAt(2)+3*str.charAt(3)+2*str.charAt(4)+9*str.charAt(5)+8*str.charAt(6)+7*str.charAt(7)+6*str.charAt(8)+5*str.charAt(9)+4*str.charAt(10)+3*str.charAt(11)+2*parseInt(dac);
    resto = df % 11;
    dac += ( (resto <= 1) ? 0 : (11-resto) );

    if (dac != (str.substring(str.length-2,str.length))){
        return false;
    }
    return true;    
}

/**
 * Verifica se o valor do campo é um CNPJ
 *
 * @param objJquery
 * @return boolean
 */
function isCnpjValid(objJquery){
    removeToolTip();
    var cnpj = objJquery.getValUnmasked();
    if( cnpj.length == 14 ){ 
        if( !isCNPJ( cnpj ) ){
            objJquery.showToolTip(i18n.MN033);
            return false;
        } else {
            return true;
        }
    }
    return false; 
}

function isNomeCompletoValid(objJquery){
    removeToolTip();
    var str = trim(objJquery.val());
    if(str != ''){
        var espaco = str.indexOf(" ");
        if(espaco == -1){
            objJquery.showToolTip(i18n.MN034);
            return false;
        }else{
            var menos = str.charCodeAt(espaco-1);
            var mais = str.charCodeAt(espaco+1);
            if(menos == '32' || mais == '32'){
                return false;
            }else{
                return true;
            }
        }
    } else {
        return false;
    }
}

// limita campo textarea [change][keyup]
function textLimit(campo, tam, count) {
    if(campo.value.length >= tam)
        campo.value = campo.value.substr(0, tam);
    if(count){
        $('#' + count).html(campo.value.length + '');
    }
}

$.fn.floatVal = function(){
    return parseFloat(this.getValUnmasked().replace(',','.'));
};
/**
 * Retorna as informações de um input sem a máscara.
 * 
 * @param ARRAY arrAddCaracteres com os caracteres que são para remover do valor também.
 * @return o valor sem os caracteres de mascara e/ou os caracteres no array enviado por parâmetro. 
 */
$.fn.getValUnmasked = function(arrAddCaracteres) {
    var sValue = $(this).val();
    sValue = sValue.toString().replace( /[\-\.\/\:\_\s]/g, "" );
    if( arrAddCaracteres ){ 
        var i;
        var j;
        for(j=0;j<arrAddCaracteres.length;j++){
            i = 0;            
            while ( i < sValue.length ){
                sValue = sValue.toString().replace( arrAddCaracteres[j], "" );
                i++;
            }
        }
    }
    return sValue;
};

$.fn.clearForm = function() {
    return this.each(function() {
      var type = this.type, tag = this.tagName.toLowerCase();
      if (tag == 'form')
        return $(':input',this).clearForm();
      if (type == 'text' || type == 'password' || tag == 'textarea')
        this.value = '';
      else if (type == 'checkbox' || type == 'radio')
        this.checked = false;
      else if (tag == 'select')
        this.value = '';
    });
};

$.fn.number = function(e) {
    e=e||window.event;
    var k=e.charCode||e.keyCode||e.which;
    var strCheck = '0123456789';
    var keysOk = [0,8,9,13];
    var key = String.fromCharCode(k);
    if( $.inArray(k,keysOk)   != -1 ){ return true; }
    if( strCheck.indexOf(key) == -1 ){ return false; }
};

$.fn.limited = function() {
    $(this).keyup(function() {
        textLimit(this, this.getAttribute('maxlength'), this.getAttribute('target'));
    });
    $(this).change(function() {
        textLimit(this, this.getAttribute('maxlength'), this.getAttribute('target'));
    });
};

function isMoneyValid(objQuery){
    removeToolTip();
    if(!(objQuery.getValUnmasked(',')>0)){
        objQuery.showToolTip(i18n.MN060);
        return false;
    }
    return true;
};

/**
 * Seta o foco depois de 50 ms (default)
 *
 * @param object jQuery objQuery
 * @param integer time
 * @return void
 */
function setFocusTimeout(objQuery,time){
    time = isset(time)?time:50;
    setTimeout(function(){objQuery.focus();},time);
}

/**
 * Função que controla a visibilidade do grupo 
 * informado apartir do valor do 'change' 
 * do elemento informado 
 * 
 * @param string manager = string com o id ou a classe ex.: '#id_do_elemento' ou '.classe-do-elemento'
 * @param json group     = json com a relacao valor e elemento ex.: {'valor1':'elemento1','valor2':'elemento2'}
 * @return void
 */
function groupVisibilityManager(manager,group,callback){
    var objManager = $(manager);
    if( objManager.length > 0 ){
        var func = function(){
            var idxShow = $(this).val();
            if( group ){
                var groupPrev = null;
                for( var i in group ){
                    if( groupPrev == group[i] && i != idxShow ){
//                        alert( group[i] + ' igual  ' + groupPrev );
                        continue;
                    }
                    if( i == idxShow ){
//                        alert( 'show: '+ group[i] + ' value: ' + i  );
                        $(group[i]).show();
                    } else {
//                        alert( 'hide: '+ group[i] + ' value: ' + i  );
                        $(group[i]).hide();
                    }
                    groupPrev = group[i];
                }
            }
            if( $.isFunction(callback) ){
            	callback();
            }
        };
        objManager.bind('change',func);
        objManager.bind('click',func);
    }
}

/**
 * Função que clona o valor de "fromElement"
 * no "blur" do mesmo para o valor de "toElement"  
 * 
 * @param object jQuery fromElement
 * @param object jQuery toElement
 * @return boolean
 */
function setCloneValue(fromElement,toElement){
    if( !fromElement.length ) { 
        return false; 
    }
    if( !toElement.length ) { 
        return false; 
    }
    fromElement.bind('blur',function(){
        toElement.val($(this).val());
    });
}

/**
 * Função que clona o valor de "fromElement" para o valor de "toElement"  
 * 
 * @param object jQuery fromElement
 * @param object jQuery toElement
 * @return toElement
 */
function cloneValue(fromElement,toElement){
    if( !fromElement.length ) { 
        return false; 
    }
    if( !toElement.length ) { 
        return false; 
    }
    toElement.val(fromElement.val());
    return toElement;
}

/**
 * Associa o valor do indice de 'rs' 
 * para o campo do indice de 'indexFields' 
 * setando o campo como readonly 
 * se 'setFieldsReadonly' for igual a true
 * e/ou 
 * setando o campo como disabled 
 * se 'setFieldsDisabled' for igual a true
 *
 *
 * @param object rs
 * @param object indexFields
 * @param boolean setFieldsReadonly
 * @param boolean setFieldsDisabled
 * @return void
 */
function basePopulate(rs,indexFields,setFieldsReadonly,setFieldsDisabled){
    if( !rs ){
        setFieldsReadonly = false;
    }
    var field;
    var i;
    var value;
    for(i in indexFields){
        field = $(indexFields[i]);
        if( !field.length ) { 
//            showDialog( 'Erro ao carregar os dados:<br />Campo '+indexFields[i]+' não existe.' ,'alert' );
//            return false; 
            continue;
        }
        value = ( !rs[i] )?undefined:rs[i];
        //value = ( !rs[i] )?'':rs[i];
        field.val(value);
        field.trigger('change');
        if( setFieldsReadonly != undefined ){
            if( setFieldsReadonly ){
                field.attr('readonly','readonly');
            } else {
                field.removeAttr('readonly');
            }                    
        }
        if( setFieldsDisabled != undefined ){
            if( setFieldsDisabled ){
                field.attr('disabled','disabled');
            } else {
                field.removeAttr('disabled');
            }          
        }          
    }
}

function filterPopulate(arrSearch){
	for(name in arrSearch){
		var input = $('#'+name);
		if(input.length > 0){
			input.val(((arrSearch[name]==null)?'':arrSearch[name]));
		}
	}
	$('.filter-set :input').each(function(){
	    switch ($(this).attr('controltype')) {
            case 'quote':
            case 'money':
            case 'float':
                if($(this).floatVal()>0){
                    return $("#btn_show_filters").click();
                }
                break;
            case 'number':
                if(parseInt($(this).val())>0){
                    return $("#btn_show_filters").click();
                }
                break;
            default:
                if($.trim($(this).getValUnmasked()) != ""){
                    return $("#btn_show_filters").click();
                }
                break;
        }
	});
}


/**
 * Função que verifica se o país e um paraíso fiscal
 */
function paisValidate(objJquery) {
    var objDependent = $(objJquery.attr('dependent'));
    if($.trim(objJquery.val()) == ""){
        objDependent.val('');
    }
    if((objJquery.val() != "") && (objDependent.val() == "")){
        objJquery.val('');
//        objJquery.showToolTip(i18n.MN060);
        return false;
    }
    var retorno;
    $.each(viewData.autocompletePais,function(i){
         if(objDependent.val() == this.CD_PAIS){
            
            var regime = $('.declaracao-regime-nao-privilegiado');
            if(this.ST_REGIME_PRIVILEGIADO == 'S'){
                regime.show();
            }else{
                regime.find('#regime-nao-privilegiado').attr('checked', false);
                regime.hide();
            }
            if(this.ST_PARAISO_FISCAL == 'S'){
                objJquery.showToolTip(i18n.MN026);
                retorno = false;
            } else {
                retorno = true;
            }
        }
    });
    return retorno;
}

/**
 * obtem a descricao do país a partid do codigo
 * 
 * @param int cd
 * @return string
 */
function getPaisDescricao(cd) {
    var txPais = false;
    $.each(viewData.autocompletePais, function(key, value) {
        if (value.CD_PAIS == cd) {
            txPais = value.TX_PAIS;
        }
    });
    return txPais;
}

function setupEventoAutocomplete(subform) {
    subform = (subform)?subform+'-':'';
    var txEvento = $("#"+subform+"TX_EVENTO");
    txEvento.unautocomplete();
    txEvento.autocomplete( {
        'data' :viewData.autocompleteEvento,
        'max' :10,
        'result' : function(event, data, formatted) {
            if (isset(data)) {
                $("#"+subform+"CD_EVENTO").val(data.CD_EVENTO);
                $("#"+subform+"NI_ANO").val(data.NI_ANO);
                $("#"+subform+"TX_EDICAO").val(
                        (data.TX_EDICAO != null) ? data.TX_EDICAO : '');
                $("#"+subform+"CD_PAIS").val(data.CD_PAIS);
                $("#"+subform+"TX_PAIS").val(getPaisDescricao(data.CD_PAIS));
                $("#"+subform+"TX_CIDADE").val(data.TX_CIDADE);
                $("#"+subform+"DT_INICIO").val(data.DT_INICIO);
                $("#"+subform+"DT_FIM").val(data.DT_FIM);
                $("#"+subform+"TX_SITES_RELACIONADOS").val(data.TX_SITES_RELACIONADOS);
                $("#"+subform+"CD_SITUACAO").val(data.CD_SITUACAO);
            }
        },
        'formatItem' : function(data) {
            var edicao = "";
            if (data.TX_EDICAO != null) {
                edicao = " - " + data.TX_EDICAO;
            }
            return data.TX_EVENTO + " - " + data.NI_ANO + edicao;
        },
        'formatResult' : function(data) {
            return data.TX_EVENTO;
        }
    });
}
