/**
 * @projeto Website cidadeplena.com.br
 * @cliente Instituto Cidade Plena.
 * @autor STUDIO
 * @copyright 2009 Instituto Cidade Plena.
 */

/**
 * Responsável pelo website.
 */
cCidadePlena = new Class.create({
    /**
     * Executado ao instanciar a classe.
     */
    initialize: function() {
        // Registra o evento ao carregar a página.
        Event.observe(window, 'load', function() {
            // Inicia o slide show do cabeçalho.
            this.iniciarSlideShowCabecalho(0);
        }.bind(this));
        
        // Registra o evento ao clicar no link "contato" do lado direito.
        Event.observe($$('body div.cabecalho ul.navegacao li.contato a')[0], 'click', function() {
            // Alterna a vizualização do box do contato.
            this.toggleBoxContato();
        }.bind(this));
        
        // Registra o evento ao enviar o formulário.
        Event.observe($$('body div.cabecalho div.contato form')[0], 'submit', function(e) {
            // Pára a ação do evento.
            e.stop();
            
            // Envia o conteúdo do box "Contato".
            this.enviarBoxContato();
        }.bind(this));
        
        // Registra o evento ao clicar no botão "X" da box "Contato".
        Event.observe($$('body div.cabecalho div.contato div.fechar a')[0], 'click', function(e) {
            // Pára a ação do evento.
            e.stop();
            
            // Fecha a box "Contato".
            this.fecharBoxContato(0);
        }.bind(this));
        
        // Define o valor do botão "Enviar" para um espaço.
        $$('body div.cabecalho div.contato input.enviar')[0].value = ' ';
    },
    
    /**
     * Inicia o slide show do cabeçalho.
     * 
     * @return void
     */
    iniciarSlideShowCabecalho: function(posicao) {
        // Se a posição for 6 retorna à primeira.
        if (posicao == 6)
            posicao = 0;
        
        // Define a posição do slide show.
        $$('body div.cabecalho div.slide-show')[0].addClassName('imagem-'+posicao);
        
        // Exibe a imagem da posição atual do slide show.
        new Effect.Appear($$('body div.cabecalho div.slide-show')[0], {
            from: 0,
            to: 1,
            duration: 1,
            queue: {
                position: 'end',
                scope: 'slideShowCabecalho'
            },
            afterFinish: function() {
                // Oculta a imagem da posição atual do slide show.
                new Effect.Fade($$('body div.cabecalho div.slide-show')[0], {
                    from: 1,
                    to: 0,
                    duration: 1,
                    queue: {
                        position: 'end',
                        scope: 'slideShowCabecalho'
                    },
                    delay: 4,
                    afterFinish: function() {
                        // Remove a classe indicativa da imagem da posição atual.
                        $$('body div.cabecalho div.slide-show')[0].removeClassName('imagem-'+posicao);
                        
                        // Inicia o slide show na próxima posição.
                        this.iniciarSlideShowCabecalho(posicao+1)
                    }.bind(this)
                });
            }.bind(this)
        });
    },
    
    /**
     * Alterna a visibilidade do box "Contato".
     * 
     * @return void
     */
    toggleBoxContato: function() {
        // Verifica se a box está visível.
        if ($$('body div.cabecalho div.contato')[0].visible() != true)
            // Abre a box.
            this.abrirBoxContato();
        else
            // Fecha a box.
            this.fecharBoxContato();
    },
    
    /**
     * Abre a box "Contato".
     * 
     * @return void
     */
    abrirBoxContato: function() {
        new Effect.BlindDown($$('body div.cabecalho div.contato')[0], {
            from: 0,
            to: 1,
            duration: 0.2,
            transition: Effect.Transitions.sinoidal,
            queue: {
                position: 'end',
                scope: 'abaContato'
            }
        });
    },
    
    /**
     * Fecha a box "Contato".
     * 
     * @param integer delay O delay de execução.
     * 
     * @return void
     */
    fecharBoxContato: function(delay) {
        new Effect.BlindUp($$('body div.cabecalho div.contato')[0], {
            from: 0,
            to: 1,
            duration: 0.2,
            transition: Effect.Transitions.sinoidal,
            delay: delay,
            queue: {
                position: 'end',
                scope: 'abaContato'
            }
        });
    },
    
    /**
     * Abre o status da box "Contato".
     * 
     * @param string mensagem A mensagem a ser exibida.
     * @param integer status O número de status.
     * 
     * @return void
     */
    abrirStatusBoxContato: function(mensagem, status) {
        // Define a mensagem.
        $$('body div.cabecalho div.contato div.status')[0].innerHTML = mensagem;
        
        // Exibe o status da mensagem.
        new Effect.Appear($$('body div.cabecalho div.contato div.status')[0], {
            from: 0,
            to: 1,
            duration: 0.3,
            transition: Effect.Transitions.sinoidal,
            queue: {
                position: 'end',
                scope: 'boxContato'
            },
            afterFinish: function() {
                // Verifica se o status não é de enviado.
                if (status != 1) {
                    // Fecha a mensagem de status da box.
                    this.fecharStatusBoxContato(2);
                } else {
                    // Fecha a mensagem de status da box e a própria box.
                    this.fecharBoxContato(1.5);
                    this.fecharStatusBoxContato(1);
                }
            }.bind(this)
        });
    },
    
    /**
     * Fecha o status da box "Contato".
     * 
     * @param integer delay O delay de execução.
     * 
     * @return void
     */
    fecharStatusBoxContato: function(delay) {
        new Effect.Fade($$('body div.cabecalho div.contato div.status')[0], {
            from: 1,
            to: 0,
            duration: 0.3,
            transition: Effect.Transitions.sinoidal,
            delay: delay,
            queue: {
                position: 'end',
                scope: 'boxContato'
            }
        }); 
    },
    
    /**
     * Envia a box "Contato" e seus dados.
     * 
     * @return void
     */
    enviarBoxContato: function() {
        // Requisita a página de envio da box juntamente com os dados.
        new Ajax.Request('/interfaces/global/box-contato.php', {
            parameters: $$('body div.cabecalho div.contato form')[0].serialize(),
            onComplete: function(Transport) {
                // Define o objeto JSON de resposta.
                var JSON = eval('('+Transport.responseText+')');
                
                // Abre o status da box com a mensagem e o número de status.
                this.abrirStatusBoxContato(JSON.mensagem, JSON.status);
            }.bind(this)
        });
    }
});