/**
 * PALATO
 *
 * @author Jean Pimentel
 * @collaborators Lucas Mezêncio
 */

(function(window, undefined) {
    var Palato   = window.Palato || {},
        document = window.document;
    
    /**
     * Controle do formulário de Trabalhe Conosco
     *
     * @author Lucas Mezêncio
     * @since 08/2011
     */
    Palato.TrabalheConosco = (function() {
            /**
             * Variável que recebe as validações dos formulários
             */
        var _val = '',

            /**
             * O form atual para a validação e exibição
             */
            _formAtual  = '',

            /**
             * Array com todos os forms da página
             */
            _forms = [],

            /**
             * Regras de validação e mensagens
             */
            _rules = {
                'dados-pessoais' : {
                    't_nome'           : 'required',
                    't_cpf'            : {
                        required : true,
                        cpf      : true
                    },
                    't_estado_civil'   : 'required',
                    't_sexo'           : 'required',
                    't_identidade'     : 'required',
                    't_nacionalidade'  : 'required',
                    't_nascimento'     : 'required',
                    't_telefone'       : 'required',
                    't_email'          : {
                        required : true,
                        email    : true
                    },
                    't_endereco'       : 'required',
                    't_numero'         : 'required',
                    't_cep'            : 'required',
                    't_bairro'         : 'required',
                    't_cidade'         : 'required',
                    't_estado'         : 'required'
                },

                'dados-escolares' : {
                    't_ensino'      : 'required',
                    't_instituicao' : 'required'
                },

                'experiencia-profissional-1' : {
                    't_empresa_1'   : 'required',
                    't_cargo_1'     : 'required',
                    't_admissao_1'  : 'required',
                    't_atividade_1' : 'required'
                },

                'experiencia-profissional-2' : {
                    't_empresa_2'   : function() {
                        return TrabalheConosco._checaCamposVazios();
                    },
                    't_cargo_2'     : function() {
                        return TrabalheConosco._checaCamposVazios();
                    },
                    't_admissao_2'  : function() {
                        return TrabalheConosco._checaCamposVazios();
                    },
                    't_demissao_2'  : function() {
                        return TrabalheConosco._checaCamposVazios();
                    },
                    't_atividade_2' : function() {
                        return TrabalheConosco._checaCamposVazios();
                    }
                },

                'experiencia-profissional-3' : {
                    't_empresa_3'   : function() {
                        return TrabalheConosco._checaCamposVazios();
                    },
                    't_cargo_3'     : function() {
                        return TrabalheConosco._checaCamposVazios();
                    },
                    't_admissao_3'  : function() {
                        return TrabalheConosco._checaCamposVazios();
                    },
                    't_demissao_3'  : function() {
                        return TrabalheConosco._checaCamposVazios();
                    },
                    't_atividade_3' : function() {
                        return TrabalheConosco._checaCamposVazios();
                    }
                }

                // upload : {}
            },

            /**
             * Mensagens para a validação (em branco, caso precise criar, só preencher)
             */
            _messages = {
                'dados-pessoais'             : {
                    email : 'Insira um email válido. (seunome@dominio.com.br)'
                },

                'dados-escolares'            : {},

                'experiencia-profissional-1' : {},

                'experiencia-profissional-2' : {},

                'experiencia-profissional-3' : {}

                // upload : {}
            },

            /**
             * Dá o bind nos elementos do formulário
             * 
             * @author Lucas Mezêncio
             * @since 08/2011
             */
            _init      = function() {
                $('.avancar').live('click', function(e) {
                    _avancar(this);
                });

                $('.voltar').live('click', function(e) {
                    _voltar(this);
                });

                // Preenchendo o array de fieldsets para o controle dos botões
                $('.form', '#steps').each(function(i, el) {
                    _forms.add(el.id);
                });

                _formAtual = _forms.first();
            },

            /**
             * Checa se os campos de um formulário não requerido estão vazios,
             * se apenas um campo estiver preenchido, os outros campos passam
             * a ser obrigatórios
             *
             * @author Lucas Mezêncio
             * @since 08/2011
             *
             * @return {boolean}
             */
            _checaCamposVazios = function() {
                var retorno = false;

                $('input', '#'+_formAtual).each(function(i, el) {
                    if ($(el).val() != '') {
                        retorno = true;
                    }
                });

                return retorno;
            },

            /**
             * Cria um input de acordo com os campos dos formulários
             *
             * @author Lucas Mezêncio
             *
             * @param {HTML.Object} el
             */
            _criaInput = function(el) {
                var $input;

                if (!['submit', 'hidden'].has(el.type)) {
                    // Hack para os inputs de sexo
                    if (el.name == 't_sexo') {
                        el.value = $('input:radio[name=t_sexo]:checked').val();
                        el.id    = 't_sexo';
                    }

                    // Cria o elemento caso ele não exista ainda
                    if (!$('#'+el.id, '#upload').length > 0) {
                        $input = $('<input/>').attr({
                            'id'    : el.id,
                            'name'  : el.name,
                            'value' : el.value,
                            'type'  : 'hidden'
                        });

                        $('#upload').append($input);
                    // Se o elemento existe e seu conteúdo foi alterado, atualiza o conteúdo do mesmo
                    } else if ($('#'+el.id, '#upload').val() != el.value) {
                        $('#'+el.id, '#upload').val(el.value);
                    }
                }
            },

            /**
             * @author Lucas Mezêncio
             * 
             * @param {jQuery.Object} $elem
             * @param {Object} rules
             * @param {Object} messages
             */
            _setValidate = function($elem, rules, messages) {
                var defOpts = {
                        ignore        : 'input[type=hidden]',
                        onkeyup       : false,
                        errorElement  : 'p',
                        errorClass    : 'error',
                        rules         : rules || {},
                        messages      : messages || {},
                        submitHandler : function(form) {
                            $('input, textarea, select', form).each(function(i, el) {
                                _criaInput(el);
                            });
                        }
                    }

                _val = $elem.validate(defOpts);
            },

            /**
             * Controla o botão de avançar e valida o formulário em questão
             * 
             * @author Lucas Mezêncio
             * @since 08/2011
             */
            _avancar    = function() {
                var $formAtual   = $('#'+_formAtual),
                    $proximoForm = $formAtual.next();

                if ($formAtual.is('form')) {
                    _setValidate($formAtual, _rules[_formAtual]);
                }

                // Validando o formulário e passando para o próximo
                if (typeof _val == 'object') {
                    if (!_val.form()) {
                        return false;
                    }
                }

                $formAtual
                    .addClass('hide')
                    .hide();
                $proximoForm
                    .removeClass('hide')
                    .show();

                _formAtual = $proximoForm.attr('id');

                if (!$('.voltar', $formAtual).is(':visible')) {
                    $('.voltar')
                        .removeClass('hide')
                        .show();
                }

                $('html, body').animate({ scrollTop : $proximoForm.position().top }, 'slow');


                if (_formAtual === _forms.last()) {
                    $('.avancar', $formAtual)
                        .addClass('hide')
                        .hide();
                    $('#enviar')
                        .removeClass('hide')
                        .show();
                }

                return true;
            },

            /**
             * Controla o botão de voltar
             * 
             * @author Lucas Mezêncio
             * @since 08/2011
             */
            _voltar     = function() {
                var $formAtual    = $('#'+_formAtual),
                    $formAnterior = $formAtual.prev();

                $formAtual
                    .addClass('hide')
                    .hide();
                $formAnterior
                    .removeClass('hide')
                    .show();

                // Removendo todas as mensagens de erro
                $('.error', $formAnterior).remove();

                _formAtual = $formAnterior.attr('id');

                if (!$('.avancar', $formAtual).is(':visible')) {
                    $('.avancar', $formAtual)
                        .removeClass('hide')
                        .show();
                }

                if ($('#enviar').is(':visible')) {
                    $('#enviar')
                        .addClass('hide')
                        .hide();
                }

                $('html, body').animate({
                    scrollTop : $formAnterior.position().top
                }, 'slow');

                if (_formAtual == _forms.first()) {
                    $('.voltar', $formAtual)
                        .addClass('hide')
                        .hide();
                }
            }
        
        return {
            init : function() {
                _init();
                
                return this;
            },
            voltar : function() {
                _voltar();
                
                return this;
            },
            avancar : function() {
                _avancar();
                
                return this;
            }
        }
    })();
    
    window.Palato = Palato;
})(window);
