﻿function PTARelogio(sMeuId, sClientID, sDataHora, nNrTempoEvento, nNrIncremento, nNrTempoAtualizacaoServidor, iTipoRelogio,
    sEventoAtualizacaoRelogio, nTempoRealce, sCssClasseRealce, sFuncaoTrigger, nTempoRestanteTrigger, bTopMain) {
    this.ParseDataHora = function(sDataHora, iTipoRelogio) {
        var oAgora = new Date();
        var nDia, nMes, nAno, nHora, nMinuto, nSegundo;

        var aDataHora = sDataHora.split(' ');
        var aData = aDataHora[0].split('/');
        var aHora = aDataHora[1].split(':');

        nDia = parseInt(aData[0], 10);
        nMes = parseInt(aData[1], 10);
        nAno = parseInt(aData[2], 10);

        nHora = parseInt(aHora[0], 10);
        nMinuto = parseInt(aHora[1], 10);
        nSegundo = parseInt(aHora[2], 10);

        return new Date(nAno, nMes - 1, nDia, nHora, nMinuto, nSegundo);
    }

    this.CompletaCasas = function(sStrin, nNumCasa, sComplement) {
        var sTem = String(sStrin)

        while (sTem.length < nNumCasa)
            sTem = sComplement + sTem;

        return sTem;
    }

    this.MostraMensagem = function(sMensagem) {
        var oDataHora = document.getElementById(this.ClientID + '_oRelogio');
        if (oDataHora) {
            if (this._sCssClassRealce != '') {
                oDataHora.className = this._sCssClass;
                this._sCssClass = '';
            }
            else {
                oDataHora.style.color = this._sCssClass;
                this._sCssClass = '';
            }
            oDataHora.innerHTML = sMensagem;
        }
    }
    this.MostraDataHora = function() {
        var sDataHora = '';
        var iTempoRestante = 0;

        if (this.TipoRelogio == 0) //Hora
        {
            sDataHora = this.CompletaCasas(this.DataHora.getHours(), 2, '0') + ':' +
		        this.CompletaCasas(this.DataHora.getMinutes(), 2, '0') + ':' +
		        this.CompletaCasas(this.DataHora.getSeconds(), 2, '0');
        }
        else if (this.TipoRelogio == 1) //DataHora
        {
            sDataHora = this.CompletaCasas(this.DataHora.getDate(), 2, '0') + '/' +
                this.CompletaCasas(this.DataHora.getMonth() + 1, 2, '0') + '/' +
		        this.DataHora.getFullYear() + ' ' +
		        this.CompletaCasas(this.DataHora.getHours(), 2, '0') + ':' +
		        this.CompletaCasas(this.DataHora.getMinutes(), 2, '0') + ':' +
		        this.CompletaCasas(this.DataHora.getSeconds(), 2, '0');

            //realce não implementado neste modo!
        }
        else if (this.TipoRelogio == 2) //MinutoSegundo
        {
            sDataHora = this.CompletaCasas(this.DataHora.getMinutes(), 2, '0') + ':' +
		        this.CompletaCasas(this.DataHora.getSeconds(), 2, '0');

            //realce não implementado neste modo!
        }
        else if (this.TipoRelogio == 3) //DiaHora
        {
            var nDiasRestantes = this.CalcularDiasRestante(this.RetornaDataAtual(), this.DataHora);

            if (nDiasRestantes > 0)
                sDataHora = nDiasRestantes + ((nDiasRestantes > 1) ? ' dias ' : ' dia ');

            sDataHora += this.CompletaCasas(this.DataHora.getHours(), 2, '0') + ':' +
                this.CompletaCasas(this.DataHora.getMinutes(), 2, '0') + ':' +
		        this.CompletaCasas(this.DataHora.getSeconds(), 2, '0');

            //realce não implementado neste modo!
        }
        iTempoRestante = this.CalcularTempoRestante(this.RetornaDataAtual(), this.DataHora);
        var oDataHora = document.getElementById(this.ClientID + '_oRelogio');

        if (oDataHora) {
            if (iTempoRestante <= this._nTempoRealce) {
                if (this._sCssClassRealce != '') {
                    if (this._sCssClass == '')
                        this._sCssClass = oDataHora.className;

                    oDataHora.className = this._sCssClassRealce;
                }
                else {
                    if (this._sCssClass == '')
                        this._sCssClass = oDataHora.style.color;

                    oDataHora.style.color = 'red';
                }
            }
            else {
                if (this._sCssClassRealce != '') {
                    oDataHora.className = this._sCssClass;
                    this._sCssClass = '';
                }
                else {
                    oDataHora.style.color = this._sCssClass;
                    this._sCssClass = '';
                }
            }

            if (iTempoRestante <= this._nTempoRestanteTrigger) {
                if (!this._bExecutouFuncaoTrigger) {
                    if (this._sFuncaoTrigger.length > 0) {
                        try {
                            this._bExecutouFuncaoTrigger = true;
                            eval(this._sFuncaoTrigger);
                        } catch (e) { }
                    }
                }
            }
        }

        if (oDataHora)
            oDataHora.innerHTML = sDataHora;
    }

    this.IncrementaRelogio = function(sDataHora, iTipoRelogio) {
        if (!this._bAtualizando && !this._bParado) {
            var nDiasRestantes = this.CalcularDiasRestante(this.RetornaDataAtual(), this.DataHora);
            if ((nDiasRestantes > 0) ||
	            (this.DataHora.getHours() > 0) ||
		        (this.DataHora.getMinutes() > 0) ||
		        (this.DataHora.getSeconds() > 0))
                this.DataHora.setSeconds(this.DataHora.getSeconds() + this.Incremento);

            this.MostraDataHora();
        }
    }

    this.RetornaDataAtual = function() {
        if (this._bTopMain) {
            return top.frames["main"].dtDataHoraCorrente;
        }
        else {
            return this.DataHora;
        }
    }

    this.CalcularDiasRestante = function(tDtInicial, tDtFinal) {
        tDtInicial = new Date(tDtInicial.getFullYear(), tDtInicial.getMonth(), tDtInicial.getDate());
        tDtFinal = new Date(tDtFinal.getFullYear(), tDtFinal.getMonth(), tDtFinal.getDate());
        return Math.floor((tDtFinal.valueOf() - tDtInicial.valueOf()) / (1000 * 60 * 60 * 24));
    }
    this.CalcularTempoRestante = function(tDtInicial, tDtFinal) {
        tDtInicial = new Date(tDtInicial.getFullYear(), tDtInicial.getMonth(), tDtInicial.getDate());
        tDtFinal = new Date(tDtFinal.getFullYear(), tDtFinal.getMonth(), tDtFinal.getDate(), tDtFinal.getHours(), tDtFinal.getMinutes(), tDtFinal.getSeconds());
        return Math.floor((tDtFinal.valueOf() - tDtInicial.valueOf()) / (1000));
    }

    this.IniciaIncremento = function() {
        this._bParado = false;
        this.IncrementaRelogio();
        this._sIdIncremento = window.setInterval(this.MeuId + '.IncrementaRelogio();', this._nNrTempoEvento);

        if (this._sEventoAtualizacaoRelogio != '') {
            this._sIdTimerAtualizacao = window.setInterval(this.MeuId + ".AtualizaDataHora();", this._nNrTempoAtualizacaoServidor);
        }
    }

    this.IniciaSincronizacao = function() {
        if (this._sEventoAtualizacaoRelogio != '') {
            this._sIdTimerAtualizacao = window.setInterval(this.MeuId + ".AtualizaDataHora();", this._nNrTempoAtualizacaoServidor);
        }
    }

    this.PausaIncremento = function() {
        this._bParado = true;
        if (this._sIdIncremento != '') {
            window.clearInterval(this._sIdIncremento);
            this._sIdIncremento = '';
        }

        if (this._sIdTimerAtualizacao != '') {
            window.clearInterval(this._sIdTimerAtualizacao);
            this._sIdTimerAtualizacao = '';
        }
    }

    this.PausaIncrementoCliente = function() {
        this._bParado = true;
        if (this._sIdIncremento != '') {
            window.clearInterval(this._sIdIncremento);
            this._sIdIncremento = '';
        }
    }

    this.LiberarObjeto = function() {
        if (this._sIdIncremento != '') {
            window.clearInterval(this._sIdIncremento);
            this._sIdIncremento = '';
        }

        if (this._sIdTimerAtualizacao != '') {
            window.clearInterval(this._sIdTimerAtualizacao);
            this._sIdTimerAtualizacao = '';
        }
    }

    this.AtualizaDataHora = function() {
        if (this._sEventoAtualizacaoRelogio.indexOf('(') == -1)
            this._sEventoAtualizacaoRelogio += '(' + this.MeuId + ');'

        this._bAtualizando = true;
        var oNovaHora = eval(this._sEventoAtualizacaoRelogio);
        if (oNovaHora != null)
            this.DataHora = oNovaHora;
        this._bAtualizando = false;
    }

    //propriedades 'publicas'
    this.MeuId = sMeuId;
    this.ClientID = sClientID;
    this.DataHora = this.ParseDataHora(sDataHora, iTipoRelogio);
    this.TipoRelogio = iTipoRelogio;
    this.Incremento = nNrIncremento

    //propriedades 'privadas'
    this._sIdTimerIncremento = '';
    this._sIdTimerAtualizacao = '';
    this._sEventoAtualizacaoRelogio = sEventoAtualizacaoRelogio;
    this._nNrTempoEvento = nNrTempoEvento;
    this._nNrTempoAtualizacaoServidor = nNrTempoAtualizacaoServidor;
    this._bAtualizando = false;
    this._bParado = false;
    this._nTempoRealce = nTempoRealce;
    this._sCssClass = '';
    this._sCssClassRealce = sCssClasseRealce;
    this._sFuncaoTrigger = sFuncaoTrigger;
    this._bExecutouFuncaoTrigger = false;
    this._nTempoRestanteTrigger = nTempoRestanteTrigger;
    this._bTopMain = bTopMain;

    this.MostraDataHora();
}
