function mlkComponenteCalendario(id, codigo, ambiente, niu, estagiosID, url, dataReal, dataActiva, opcoes, vistas, vistaOmissao) {
  var fActivo = function (num, i) { if ((num & i) == i) { return true; } else { return false; }}
  this.id = id;
  this.codigo = codigo;
  this.ambiente = ambiente;
  this.niu = niu;
  this.estagiosID = estagiosID;
  this.url = url;
  this.dataReal = dataReal; //formato aaaa-mm-dd
  this.dataActiva = dataActiva;
  this.dataActivaAnterior = dataActiva;
  this.bNovo = fActivo(opcoes, 1);
  this.bPesquisa = fActivo(opcoes, 2);
  this.bConsultaDetalhada = fActivo(opcoes, 4);
  this.bPersonalizar = fActivo(opcoes, 8);
  this.bPermitirNavegacao = fActivo(opcoes, 16);
  this.bPersistencia = fActivo(opcoes, 32);
  this.bMasterPersistencia = fActivo(opcoes, 64);
  this.bVistaDiaria = fActivo(vistas, 1);
  this.bVistaSemanal = fActivo(vistas, 2);
  this.bVistaMensal = fActivo(vistas, 4);
  this.vistaOmissao = vistaOmissao;
  this.vistaActiva = 0;
  this.vistaAnterior = 0;
  this.idVMDiaActivo = '';
  this.fInicializaBarraFerramentas();
  this.marcacoes = new Array();
  this.controloMarcacoes = new Array();
  this.diasReservados = new Array();  
  this.wnd = null;
  this.wndErro = null;
  this.csTempoFecho = 250; //tempo que demora a fechar os div de selecção mês e ano
  this.csTempoMovAno = 50; //tempo que demora a aumentar ou diminuir os anos no div de selecção do ano
  this.csTempoMovDia = 100; //tempo que demora a aumentar ou diminuir os dia no div de selecção do dia do mês
  this.timerCSMes = 0; this.timerCSAno = 0; this.intervaloCSAno = 0; this.intervaloCSMDia = 0;
  this.cScMaxY = 0; this.cScPosY = 0; this.cScEndY = 0; this.cScLastTime = 0; this.cScVelocidade = 100; this.cScTimerId = 0; this.cScVelocidadeOmissao = 100;  
 }

mlkComponenteCalendario.prototype.fRegistosAlterados =
  function () {
    this.marcacoes = new Array();
    this.controloMarcacoes = new Array();
    this.fCarregaVista(this.vistaActiva);
  }

mlkComponenteCalendario.prototype.fPosicionar =
  function (data) {
		this.mudaDataActiva(data);
		this.fCarregaVista(this.vistaActiva);
  }

mlkComponenteCalendario.prototype.fPesquisar = 
  function () {
    var wpos = 790, hpos = 550, xpos = window.screen.width / 2 - wpos / 2, ypos = window.screen.height / 2 - hpos / 2 - 15;
	  var qs = '';
    qs = this.url + '/calendario/cal_tarefas.aspx?componente=' + this.id + '&calambiente=' + this.ambiente + '&mperfil=' + this.niu + '&niu=' + this.niu;
		if (this.wnd) this.wnd.close();
		this.wnd = window.open(qs, 'fTarefa', 'left=' + xpos + ', top=' + ypos + ', width=' + wpos + ', height=' + hpos + ', status=no, scrollbars=no, resizable=yes', false);
		this.wnd.focus();
  }

mlkComponenteCalendario.prototype.fPersonalizar =
  function () {
		var wpos = 375, hpos = 305, xpos = window.screen.width / 2 - wpos / 2, ypos = window.screen.height / 2 - hpos / 2 - 15;
		var qs = 'componente=' + this.id + '&ajustar=1&persistencia=' + (this.bPersistencia ? 1 : 0) + '&masterpersistencia=' + (this.bMasterPersistencia ? 1 : 0) + '&mperfil=' + this.niu + '&niu=' + this.niu;
	  if (this.wnd) this.wnd.close();
		this.wnd = window.open(this.url + '/calendario/cal_opcoes.aspx?' + qs, 'fperso', 'left=' + xpos + ', top=' + ypos + ', width=' + wpos + ', height=' + hpos + ', status=no, scrollbars=no, resizable=no', false);
		this.wnd.focus();
  }

mlkComponenteCalendario.prototype.fHoje =
  function () {
    this.mudaDataActiva(this.dataReal);
    this.fCarregaVista(this.vistaActiva);
  }
  
mlkComponenteCalendario.prototype.fPersonalizacaoEfectuada =
  function () {
    self.location.reload();
  }

mlkComponenteCalendario.prototype.fUnload =
  function() {
    if (this.bPersistencia == false) {
      //limpar
      var url = this.url + '/calendario/cal_session.aspx';
      var dados = 's=1&niu=' + this.niu;
      var resp = this.fDoCallBack(url, dados);
    }
  }

mlkComponenteCalendario.prototype.fRegisto =
  function (formID, estagioID, respostaID, campo) {
		var wpos = 640, hpos, qst;
		if (this.bNovo == false) {
			hpos = 480;
			modoLeitura = 1;
		} else {
			hpos = 600;
			modoLeitura = 0;
		}
		var xpos = window.screen.width / 2 - wpos / 2, ypos = window.screen.height / 2 - hpos / 2 - 15;
	  var dt = this.dataActiva;
		if (formID == 0) {
			qst = '&niu=' + this.niu +	'&formid=' + formID;
		} else {
			qst = '&ajustar=0' +
						'&niu=' + this.niu +
						'&formid=' + formID +
						'&estagioid=' + estagioID +
						'&respostaid=' + respostaID +
						'&ambiente=' + this.ambiente +
						'&v=2' +
						'&d=1' +
						'&b=1|1|1|1|0|1|0|0|0' +
						'&sl=0' +
						'&i=2' + 
						'&camposomissao=' + campo + '=' + dt;
		}
		qst = this.url + '/calendario/calendario_registo.aspx?componente=' + this.id + '&modoleitura=' + modoLeitura +
																 '&calambiente=' + this.ambiente + 
																 '&mperfil=' + this.niu +
																 '&data=' + dt +
																 qst;
		if (this.wnd) this.wnd.close();
		this.wnd = window.open(qst, 'fRegisto', 'left=' + xpos + ', top=' + ypos + ', width=' + wpos + ', height=' + hpos + ', status=no, scrollbars=no, resizable=yes', false);
		this.wnd.focus();
	}

mlkComponenteCalendario.prototype.fMesCarregado =
  function (ano, mes) {
    var pos = ano + (mes > 9 ? '' : '0') + mes;
    this.controloMarcacoes[parseInt(pos, 10)] = { carregado: true, data: new Date() };
  }

mlkComponenteCalendario.prototype.fAdicionaDiaReservado =
  function (pos, diaReservado) {
    var dia = null;
    if (typeof(this.marcacoes[pos]) != 'object') { this.marcacoes[pos] = { ordenadas: false, lista: new Array(), diaReservado: false, listaDR: new Array() }; }
    dia = this.marcacoes[pos];
    dia.diaReservado = true;
    dia.listaDR[dia.listaDR.length] = diaReservado; //{data: '2008-06-10', descricao: 'Dia de Portugal'}
  }

mlkComponenteCalendario.prototype.fAdicionaMarcacao =
  function (pos, marcacao) {
    var dia = null;
    if (typeof(this.marcacoes[pos]) != 'object') { this.marcacoes[pos] = { ordenadas: false, lista: new Array(), diaReservado: false, listaDR: new Array() }; }
    dia = this.marcacoes[pos];
    dia.lista[dia.lista.length] = marcacao;
    dia.ordenadas = false;
  }

mlkComponenteCalendario.prototype.fOrdenaMarcacoes =
	function (m1, m2) {
	  var d1 = m1.ano + "-" + ((m1.mes < 10) ? '0' : '') + m1.mes + "-" + ((m1.dia < 10) ? '0' : '') + m1.dia;
	  var d2 = m2.ano + "-" + ((m2.mes < 10) ? '0' : '') + m2.mes + "-" + ((m2.dia < 10) ? '0' : '') + m2.dia;
	  
	  if (d1 != m1.dataIni && d1 != m1.dataFim && m1.continua == true)
			return -1; //Dia completo
			
	  else if (d2 != m2.dataIni && d2 != m2.dataFim && m2.continua == true)
			return 1; //Dia completo
	  
	  else if (d1 == m1.dataFim && d1 != m1.dataIni && m1.continua == true)
			return -1; //Inicio dia -> hora
	  
	  else if (d2 == m2.dataFim && d2 != m2.dataIni && m2.continua == true)
			return 1; //Inicio dia -> hora
	  
	  else if (m1.horaIni == '' && m2.horaIni == '')
	    return 0;
	    
	  else if (m1.horaIni == '' && m2.horaIni != '')
	    return 1;
	    
	  else if (m1.horaIni != '' && m2.horaIni == '')
	    return -1;
	    
	  else if (m1.horaIni < m2.horaIni) 
	    return -1; 
	    
	  else if (m1.horaIni == m2.horaIni) 
	    return 0; 
	    
	  else 
	    return 1;
	} 

mlkComponenteCalendario.prototype.fInicializaBarraFerramentas =
  function () {
    document.getElementById(this.id + 'cBTNovo').style.display = (this.bNovo ? 'inline' : 'none');
    document.getElementById(this.id + 'cBTPesquisa').style.display = (this.bPesquisa ? 'inline' : 'none');
    document.getElementById(this.id + 'cBTPersonalizar').style.display = (this.bPersonalizar ? 'inline' : 'none');
    document.getElementById(this.id + 'cBTVistaMes').style.display = (this.bVistaMensal ? 'inline' : 'none');
    document.getElementById(this.id + 'cBTVistaDia').style.display = (this.bVistaDiaria ? 'inline' : 'none');
    document.getElementById(this.id + 'cBTVistaSemana').style.display = (this.bVistaSemanal ? 'inline' : 'none');
  }

mlkComponenteCalendario.prototype.fCarregaVista =
  function (vista) {
    //Preparar dados para a nova vista
    var ano = this.obtemAno();
    var mes = this.obtemMes().id + 1;
    var pos = parseInt(ano + '' + (mes > 9 ? mes : '0' + mes), 10);
    if (typeof(this.controloMarcacoes[pos]) == 'object' && this.controloMarcacoes[pos].carregado == true ) {
      //não faz nada, já tem cá os dados;
    } else {
      //carregar dados do servidor
      var dados = 'codigo=' + this.codigo + '&ambiente=' + this.ambiente + '&niu=' + this.niu + '&estagiosid=' + this.estagiosID + '&ano=' + ano + '&mes=' + mes;
      var url = this.url + '/calendario/componenteCB.aspx';
      var resp = this.fDoCallBack(url, dados);
      if (resp.ok == true && resp.resposta.substr(0, 1) == '1') {
        //alert(resp.resposta.substr(1));
        eval(resp.resposta.substr(1));
        this.fMesCarregado(ano, mes);
      }
    }
    //Mostrar
    this.fMostraVista(vista);
  }

mlkComponenteCalendario.prototype.fDoCallBack = 
  function (url, dados) {
    var xmlRequest = null, bErro = false;
		if (window.XMLHttpRequest) {
			xmlRequest = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			xmlRequest = new ActiveXObject('Microsoft.XMLHTTP');
		} else {
			alert('O seu browser não suporta algumas funcionalidades, por favor, contacte o seu administrador de sistema');
			return;
		}  
	  xmlRequest.open('POST', url, false);
	  xmlRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=ISO-8859-1');
    xmlRequest.send(dados);
    bErro = (xmlRequest.status == 200 ? false : true);
    if (bErro == true) {
      if (this.wndErro) { this.wndErro.close(); }  
      this.wndErro = window.open('about:blank', 'Erro', 'location=no, menubar=no, toolbar=no');  
      this.wndErro.document.write(xmlRequest.responseText);
      alert('Erro ao obter dados do calendário. Por favor contacte o administrador de sistema.[Erro HTTP]'); 
      this.wndErro.focus(); 
      return {ok: false, resposta: ''}; 
    } else {
      return {ok: true, resposta: xmlRequest.responseText}; 
    }
  }

mlkComponenteCalendario.prototype.fMostraVista =
  function (vista) {
    if (vista != this.vistaActiva) {
      this.fCScrollEsconde(true);
      //esconder a vista actual
      if (this.vistaActiva != 0) { 
        if (this.vistaActiva == 1 ) { // --------> diária
          document.getElementById(this.id + 'ctCVistasSemanalDiaria').style.display = 'none';
          document.getElementById(this.id + 'ctCVistaDiaria').style.display = 'none';
          document.getElementById(this.id + 'cBTVistaDia').style.display = 'inline';
        } else if (this.vistaActiva == 2) { // --------> semanal
          document.getElementById(this.id + 'ctCVistasSemanalDiaria').style.display = 'none';
          document.getElementById(this.id + 'ctCVistaSemanal').style.display = 'none';
          document.getElementById(this.id + 'cBTVistaSemana').style.display = 'inline';
        } else if (this.vistaActiva == 4) { // --------> mensal
          document.getElementById(this.id + 'ctCVistaMensal').style.display = 'none';
          document.getElementById(this.id + 'cBTVistaMes').style.display = 'inline';
        }
      }
    }
    //mostrar a nova vista
    this.vistaAnterior = this.vistaActiva;
    this.vistaActiva = vista;
    if (this.vistaActiva == 1 ) { // --------> diária
      //menu
      this.fDesenhaMenu(this.vistaActiva);
      //conteudo
      document.getElementById(this.id + 'ctCVistasSemanalDiaria').style.display = 'block';
      document.getElementById(this.id + 'ctCVistaDiaria').style.display = 'block';
      document.getElementById(this.id + 'ctCDMarcCont').className = 'ctCDMarcContV1';
      //barra
      document.getElementById(this.id + 'cBTVistaDia').style.display = 'none';
      //Desenhar
      this.fLimpaVistaDiariaSemanal();
      this.fDesenhaVistaDiaria();
      this.fCScrollInicializa();
            
    } else if (this.vistaActiva == 2) { // --------> semanal
      //menu
      this.fDesenhaMenu(this.vistaActiva);
      //conteudo
      document.getElementById(this.id + 'ctCVistasSemanalDiaria').style.display = 'block';
      document.getElementById(this.id + 'ctCVistaSemanal').style.display = 'block';
      document.getElementById(this.id + 'ctCDMarcCont').className = 'ctCDMarcContV2';        
      //barra
      document.getElementById(this.id + 'cBTVistaSemana').style.display = 'none';
      //Desenhar
      this.fLimpaVistaDiariaSemanal();
      this.fDesenhaVistaSemanal();
      this.fCScrollInicializa();
      
    } else if (this.vistaActiva == 4) { // --------> mensal
      //menu
      this.fDesenhaMenu(this.vistaActiva);
      //conteudo
      document.getElementById(this.id + 'ctCVistaMensal').style.display = 'block';
      //barra
      document.getElementById(this.id + 'cBTVistaMes').style.display = 'none';
      //Desenhar
      this.fLimpaVistaMensal();
      this.fDesenhaVistaMensal();
    }
  }

mlkComponenteCalendario.prototype.fDesenhaMenu = 
  function (vista) {
    var mes = this.obtemMes();
    var ano = this.obtemAno();
    document.getElementById(this.id + 'mnCMesCt').innerHTML = mes.nome;
    document.getElementById(this.id + 'mnCAnoCt').innerHTML = ano;
    if (this.bPermitirNavegacao == true) {
      var szID = this.id;
      document.getElementById(this.id + 'mnCMesMold').className = 'mnCMold';
      document.getElementById(this.id + 'mnCMes').className = 'mnCMes';
      document.getElementById(this.id + 'mnCMes').onclick = function () { eval(szID + '.fCSMesMostra();'); };
      document.getElementById(this.id + 'mnCMes').onmouseout = function () { eval(szID + '.fCSMouseOut(\'csMes\');'); };
      document.getElementById(this.id + 'mnCMes').onmouseover = function () { eval(szID + '.fCSMouseOver(\'csMes\');'); }; 
      document.getElementById(this.id + 'mnCMesSeta').className = 'mnCSeta';
      document.getElementById(this.id + 'mnCAnoMold').className = 'mnCMold';
      document.getElementById(this.id + 'mnCAno').className = 'mnCAno';
      document.getElementById(this.id + 'mnCAno').onclick = function () { eval(szID + '.fCSAnoMostra();'); };
      document.getElementById(this.id + 'mnCAno').onmouseout = function () { eval(szID + '.fCSMouseOut(\'csAno\');'); };
      document.getElementById(this.id + 'mnCMes').onmouseover = function () { eval(szID + '.fCSMouseOver(\'csAno\');'); }; 
      document.getElementById(this.id + 'mnCAnoSeta').className = 'mnCSeta';      
      if (vista == 1) { //diária
        document.getElementById(this.id + 'mnCNavMold').style.display = 'none';
        document.getElementById(this.id + 'mnCMes').className = 'mnCMesV12';
        document.getElementById(this.id + 'mnCAno').className = 'mnCAnoV12';
        document.getElementById(this.id + 'csAno').className = 'csAnoV12';
      } else if (vista == 2) { //semanal
        document.getElementById(this.id + 'mnCNavMold').style.display = 'none';
        document.getElementById(this.id + 'mnCMes').className = 'mnCMesV12';
        document.getElementById(this.id + 'mnCAno').className = 'mnCAnoV12';
        document.getElementById(this.id + 'csAno').className = 'csAnoV12';    
      } else if (vista == 4) { //mensal
        document.getElementById(this.id + 'mnCNavMold').style.display = 'inline';
        document.getElementById(this.id + 'mnCMes').className = 'mnCMesV4';
        document.getElementById(this.id + 'mnCAno').className = 'mnCAnoV4';
        document.getElementById(this.id + 'csAno').className = 'csAnoV4';
      }      
    } else {
      document.getElementById(this.id + 'mnCMesMold').className = 'mnCMoldIna';
      document.getElementById(this.id + 'mnCMes').className = 'mnCMesIna';
      document.getElementById(this.id + 'mnCMes').onclick = null;
      document.getElementById(this.id + 'mnCMes').onmouseout = null;
      document.getElementById(this.id + 'mnCMesSeta').className = 'mnCSetaIna';
      document.getElementById(this.id + 'mnCAnoMold').className = 'mnCMoldIna';
      document.getElementById(this.id + 'mnCAno').className = 'mnCAnoIna';
      document.getElementById(this.id + 'mnCAno').onclick = null;
      document.getElementById(this.id + 'mnCAno').onmouseout = null;
      document.getElementById(this.id + 'mnCAnoSeta').className = 'mnCSetaIna';
      document.getElementById(this.id + 'mnCNavMold').style.display = 'none';
    }
  }

mlkComponenteCalendario.prototype.fDesenhaVistaSemanal =
  function () {
    var dia = this.obtemDia(), diaMAX = this.obtemNumDiasMes(this.dataActiva);
    var sz, obj, ds, dsAj, dsInaMin = -1, dsInaMax = -1;
    var pTop = (document.all ? 0 : 1), pCent = (document.all ? 1 : 3), pBai = (document.all ? 2 : 5);
    //actualizar dia do mês
    document.getElementById(this.id + 'ctCDSDiaMes').innerHTML = 'dia ' + dia.diaMes;
    //actualizar separadores
    dsAj = (dia.diaSemana == 0 ? 7 : dia.diaSemana);
    // -> determinar dias da semana inactivos
    if (dia.diaMes < dsAj) {
      dsInaMin = 1;
      dsInaMax = (dsAj - dia.diaMes);
    } else if (dsAj + (diaMAX -  dia.diaMes) < 7 ) {
      dsInaMin = dia.diaSemana + (diaMAX - dia.diaMes) + 1;
      dsInaMax = 7;
    }
    // -> desenhar
    for (ds = 1; ds < 8; ds++) {
      if (ds >= dsInaMin && ds <= dsInaMax) {
        sz = 'Ina';
      } else {
        sz = (dsAj == ds ? 'Act' : '');
      }
      obj = document.getElementById(this.id + 'csMDiaSem' + (ds == 7 ? 0 : ds));
      obj.className = 'ctCDSMnDiaMold' + sz;
      obj.childNodes[pTop].className = 'ctCDSMnDiaTop' + sz;
      obj.childNodes[pTop].childNodes[0].className = 'ctCDSMnDiaTopEsq' + sz;
      obj.childNodes[pTop].childNodes[1].className = 'ctCDSMnDiaTopCent' + sz;
      obj.childNodes[pTop].childNodes[2].className = 'ctCDSMnDiaTopDir' + sz;
      obj.childNodes[pCent].className = 'ctCDSMnDiaCent' + sz;
      obj.childNodes[pCent].childNodes[0].className = 'ctCDSMnDia' + sz;
      if (sz == 'Ina') {
        if (obj.childNodes[pCent].childNodes[0].childNodes[0].tagName == 'A') {
          obj.childNodes[pCent].childNodes[0].innerHTML = obj.childNodes[pCent].childNodes[0].childNodes[0].innerHTML;
        }
      } else {
        if (obj.childNodes[pCent].childNodes[0].childNodes[0].tagName != 'A') {
          obj.childNodes[pCent].childNodes[0].innerHTML = '<a href="javascript:' + this.id + '.fSeleccionaDiaSemana(' + (ds == 7 ? 0 : ds) + ');">' + obj.childNodes[pCent].childNodes[0].innerHTML + '</a>';
        }      
      }
      obj.childNodes[pBai].className = 'ctCDSMnDiaBai' + sz;
      obj.childNodes[pBai].childNodes[0].className = 'ctCDSMnDiaBaiEsq' + sz;
      obj.childNodes[pBai].childNodes[1].className = 'ctCDSMnDiaBaiCent' + sz;
      obj.childNodes[pBai].childNodes[2].className = 'ctCDSMnDiaBaiDir' + sz;
    }
    //Colocar as marcacoes para este dia
    this.fColocaMarcacoesDoDia();
  }

mlkComponenteCalendario.prototype.fDesenhaVistaDiaria =
  function () {
    var lst = this.dataActiva.split('-'), lstOLD = this.dataActivaAnterior.split('-');
    var mesOLD = lstOLD[1], mes = lst[1];
    if (this.vistaAnterior != this.vistaActiva || mesOLD != mes) {
      this.fCSMDiaInicializa(this.obtemDia().diaMes, this.obtemNumDiasMes(this.dataActiva), true);
    } else {
      this.fCSMDiaInicializa(this.obtemDia().diaMes, this.obtemNumDiasMes(this.dataActiva), false);
    }
    //Colocar as marcacoes para este dia
    this.fColocaMarcacoesDoDia();
  }

mlkComponenteCalendario.prototype.fColocaMarcacoesDoDia =
  function () {
    var dt = new Date(this.obtemAno(), this.obtemMes().id, this.obtemDia().diaMes);
    var pos = parseInt(this.dataActiva.replace(/-/gi, ''), 10);
    var bApresentar, dia, marcacao, hora, descricao;
    var dvCont, dv, num;
    if (typeof(this.marcacoes[pos]) == 'object' && this.marcacoes[pos].lista.length > 0) {
      //Ordenar as marcacoes
      if (this.marcacoes[pos].ordenadas == false) {
        this.marcacoes[pos].lista.sort(this.fOrdenaMarcacoes);
        this.marcacoes[pos].ordenadas = true;
      }
      //Colocar as marcacoes na interface
      num = 0;
      for (var i=0; i < this.marcacoes[pos].lista.length; i++) {
        bApresentar = true;
        dia = this.marcacoes[pos];
        dvCont = document.getElementById(this.id + 'ctCDMarcContScroll');
        if (this.fPodeColocarMarcacao(dt, dia, dia.lista[i]) == true) {
	        //insere
          marcacao = dia.lista[i];
          hora = marcacao.fDeterminaHora();
          descricao = marcacao.descricao;
          dv = document.createElement('DIV');
          dvCont.appendChild(dv);
          dv.className = 'ctCDMarc' + ((num % 2) == 0 ? ' ctCDMarcPar' : ' ctCDMarcImpar') + (this.bConsultaDetalhada == true ? '' : ' ctCDMarcSemCons');
          dv.innerHTML = '<span>' + hora + '</span>' + descricao;
          if (this.bConsultaDetalhada == true) {
            //fRegisto(formID, estagioID, respostaID, campo)
            dv.innerHTML = '<a href="javascript:' + this.id + '.fRegisto(\'' + marcacao.formID + '\', \'' + marcacao.estagioID + '\', \'' + marcacao.respostaID + '\', \'' + marcacao.campo + '\');">' + dv.innerHTML + '</a>';
          }
          num += 1;
	      }
      } //for
      if (num > 0) {
        //retirar 'Nenhum registo'
        dvCont.removeChild(dvCont.childNodes[0]);
      }
    }// tem marcacoes
  }

mlkComponenteCalendario.prototype.fPodeColocarMarcacao =
  function (dt, dia, marcacao) {
    //se é sábado e não pode apresentar ao sábado, se é domingo e não pode apresentar ao domingo, se é dia reservado e não pode apresentar em dias reservados
    if (
          (marcacao.sabado == false && dt.getDay() == 6) 
          || (marcacao.domingo == false && dt.getDay() == 0) 
          || (marcacao.diaReservado == false && dia.diaReservado == true)
    ) {  
      return false;
    } else {
      return true;
    }   
   
  }

mlkComponenteCalendario.prototype.fLimpaVistaDiariaSemanal =
  function () {
    document.getElementById(this.id + 'ctCDMarcContScroll').innerHTML = '<div class="ctCDMarcSemRegistos">Nenhum registo</div>';
  }

mlkComponenteCalendario.prototype.fDesenhaVistaMensal =
  function () {
    var ano = this.obtemAno();
    var mes = this.obtemMes();
    var maxDias = this.obtemNumDiasMes(this.dataActiva);
    var data = new Date(ano, mes.id, 1), szData, pos;
    var linha = 0, numDias = data.getDay(), ds, id, obj, sz, title;
    title = (this.bVistaDiaria || this.bVistaSemanal ? 'Ver dia' : (this.bNovo ? 'Efectuar marcação neste dia' : '')) ;
    numDias = (numDias == 0 ? 6 : numDias - 1);
    for (var d=1; d <= maxDias; d++) {
      data =  new Date(ano, mes.id, d);
      szData = this.obtemDataDeDATE(data);
      pos = parseInt(szData.replace(/-/gi, ''), 10);
      ds = data.getDay();
      id = this.id + 'ctCMP' + linha  + '' + ds;
      obj = document.getElementById(id);
      sz = '<a href="javascript:;" ' + 
                'onclick="' + this.id + '.fClickVM(\'' + id + '\', \'' + szData + '\');" ' +
                'ondblclick="' + this.id + '.fDblClickVM(\'' + id + '\', \'' + szData + '\');" ' +
                'title="' + title + '" ' + 
           '>' + d + '</a>'
      obj.innerHTML = sz;
      
      if (typeof(this.marcacoes[pos]) == 'object') {
        //Verificar se é dia Reservado
        if (this.marcacoes[pos].diaReservado == true) {
          obj.className += ' ctCMDiaFS'; 
        }              
        //Verificar se tenho marcações para este dia
        if (this.marcacoes[pos].lista.length > 0) {
          var bPode = false;
          for (var i=0; i < this.marcacoes[pos].lista.length; i++) {
            if (this.fPodeColocarMarcacao(data, this.marcacoes[pos], this.marcacoes[pos].lista[i]) == true) {
              bPode = true;
              break;
            }
          }
          if (bPode == true) { obj.className += ' ctCMDiaMarcacao'; }
        }
      }
      //Verificar se é o dia activo
      if (szData == this.dataActiva) {
        this.idVMDiaActivo = id;
        obj.className += ' ctCMDiaActivo';
      }      
      //Verificar se é o dia real
      if (szData == this.dataReal) {
        obj.parentNode.className = 'ctCMMoldIntDiaReal';
        obj.parentNode.parentNode.className = 'ctCMMoldExtDiaReal';
      }
      //mudar linha
      numDias ++;
      if (numDias == 7) {
        linha ++;
        numDias = 0;
      }
    } //for
  }

mlkComponenteCalendario.prototype.fClickVM =
  function (id, data) {
    var obj;
    //desactivar o dia activo anterior
    if (this.idVMDiaActivo != '' && document.getElementById(this.idVMDiaActivo)) {
      obj = document.getElementById(this.idVMDiaActivo);
      obj.className = obj.className.replace(/ ctCMDiaActivo/gi, '');
    }
    //activar o novo dia
    this.mudaDataActiva(data);
    this.idVMDiaActivo = id;
    obj = document.getElementById(this.idVMDiaActivo);
    obj.className += ' ctCMDiaActivo';
  }

mlkComponenteCalendario.prototype.fDblClickVM =
  function (id, data) {
    this.fClickVM(id, data);
    if (this.bVistaDiaria == true) {
      this.fCarregaVista(1);
    } else if (this.bVistaSemanal == true) {
      this.fCarregaVista(2);
    } else if (this.bNovo == true) {
      this.fRegisto(0);
    }
  }

mlkComponenteCalendario.prototype.fLimpaVistaMensal =
  function () {
    var id, obj;
    for (var j = 0; j < 6; j++) {
      for (var i = 0; i < 7; i++) {
        id = this.id + 'ctCMP' + j + '' + i;
        obj = document.getElementById(id);
        obj.innerHTML = '&nbsp;';
        if (i == 0 || i == 6) {
          obj.className = 'ctCMDia ctCMDiaFS';
        } else {
          obj.className = 'ctCMDia';
        }
        obj.parentNode.className = 'ctCMMoldInt';
        obj.parentNode.parentNode.className = 'ctCMMoldExt';
      }
    }
  }

mlkComponenteCalendario.prototype.fSeleccionaDia =
  function (id) {
    var dia = parseInt(document.getElementById(this.id + 'csMDia' + id).innerHTML, 10);
    var novaData = this.constroiData(this.obtemAno(), this.obtemMes().id + 1, dia);
    if (this.dataActiva == novaData) {
      //é o mesmo dia não faz nada
    } else {
      this.mudaDataActiva(novaData);
      this.fCarregaVista(this.vistaActiva);
    }
  }

mlkComponenteCalendario.prototype.fSeleccionaDiaSemana =
  function (diaSemana) {
    var dia = this.obtemDia();
    var dMes, dsAj, novaData;
    if (diaSemana == dia.diaSemana) {
      //é o mesmo dia não faz nada
    } else {
      dsAj = (diaSemana == 0 ? 7 : diaSemana);
      dMes = dia.diaMes + (dsAj - (dia.diaSemana == 0 ? 7 : dia.diaSemana));
      novaData = this.constroiData(this.obtemAno(), this.obtemMes().id + 1, dMes);
      this.mudaDataActiva(novaData);
      this.fCarregaVista(this.vistaActiva);
    }
  }

mlkComponenteCalendario.prototype.fMudaSemana =
  function (sentido) {
    var dia = this.obtemDia();
    var diaMAX, objDataMAX, dsMAXAj;
    var diaMIN, objDataMIN, dsMINAj;
    var bMuda = false, novoDia;
    if (sentido > 0) {
      diaMAX = this.obtemNumDiasMes(this.dataActiva);
      objDataMAX = new Date(this.obtemAno(), this.obtemMes().id, diaMAX);
      dsMAXAj = (objDataMAX.getDay() == 0 ? 7 : objDataMAX.getDay());
      if (dia.diaMes <= (diaMAX - dsMAXAj)) {
        bMuda = true;
        novoDia = ((dia.diaMes + 7) > diaMAX ? diaMAX : (dia.diaMes + 7));
      }
    } else {
      diaMIN = 1;
      objDataMIN = new Date(this.obtemAno(), this.obtemMes().id, 1);
      dsMINAj = (objDataMIN.getDay() == 0 ? 7 : objDataMIN.getDay());
      if (dia.diaMes > (8 - dsMINAj)) {
        bMuda = true;
        novoDia = ((dia.diaMes - 7) < diaMIN ? diaMIN : (dia.diaMes - 7));
      }
    }
    if (bMuda == true) {
      novaData = this.constroiData(this.obtemAno(), this.obtemMes().id + 1, novoDia);
      this.mudaDataActiva(novaData);
      this.fCarregaVista(this.vistaActiva);
    }
  }

mlkComponenteCalendario.prototype.fSeleccionaMes =
  function (id) {
    var mes = this.obtemMes();
    if (mes.id == id) {
      //é o mesmo mês, não faz nada
    } else {
      //actualizar data activa
      this.mudaDataActiva(this.constroiData(this.obtemAno(), id + 1, this.obtemDia().diaMes));
      //mudar
      this.fCarregaVista(this.vistaActiva);
    }
    //Esconder div de selecção
    this.fCSMesEsconde();
  }

mlkComponenteCalendario.prototype.fSeleccionaAno =
  function (id) {
    var ano = this.obtemAno();
    var anoSEL = parseInt(document.getElementById(this.id + 'csAno' + id).innerHTML, 10);
    if (ano == anoSEL) {
      //é o mesmo ano não faz nada
    } else {
      //actualizar data activa
      this.mudaDataActiva(this.constroiData(anoSEL, this.obtemMes().id + 1, this.obtemDia().diaMes));
      //mudar
      this.fCarregaVista(this.vistaActiva);
    }
    //Esconder div de selecção
    this.fCSAnoEsconde();
  }

mlkComponenteCalendario.prototype.fMudaMes =
  function (sentido) {
    var ano = this.obtemAno();
    var mes = this.obtemMes().id;
    var dia = this.obtemDia().diaMes;
    var max;
    if (sentido > 0) {
      if (mes == 11) {
        ano += 1;
        mes = 0;
      } else {
        mes += 1;
      }    
    } else {
      if (mes == 0) {
        ano -= 1;
        mes = 11;
      } else {
        mes -= 1;
      }
    }
    this.mudaDataActiva(this.constroiData(ano, mes + 1, dia));
    //mudar
    this.fCarregaVista(this.vistaActiva);    
  }

mlkComponenteCalendario.prototype.mudaDataActiva =
  function (novaData) {
    this.dataActivaAnterior = this.dataActiva;
    this.dataActiva = novaData;
  }

mlkComponenteCalendario.prototype.obtemNumDiasMes =
  function (data) {
    var lst = data.split('-');
	  return 32 - new Date(parseInt(lst[0], 10), (parseInt(lst[1], 10) - 1), 32).getDate();
  }

mlkComponenteCalendario.prototype.obtemDia =
  function(bReal) {
    bReal = (typeof(bReal) == 'undefined' ? false : bReal);
    var data = (bReal ? this.dataReal : this.dataActiva);
    var lst = data.split('-');
    var objData = new Date(lst[0], parseInt(lst[1], 10) - 1, lst[2]);
    return { diaMes: objData.getDate(), diaSemana: objData.getDay() };
  }

mlkComponenteCalendario.prototype.obtemMes = 
	function(bReal) {
	  bReal = (typeof(bReal) == 'undefined' ? false : bReal);
	  var data = (bReal ? this.dataReal : this.dataActiva);
	  var mes = data.split('-')[1];
	  switch (mes) {
	    case '01':
	      return {nome:'Janeiro', id: 0};
	      break;
	    case '02':
	      return {nome:'Fevereiro', id: 1};
	      break;
	    case '03':
	      return {nome:'Março', id: 2};
	      break;
	    case '04':
	      return {nome:'Abril', id: 3};
	      break;
	    case '05':
	      return {nome:'Maio', id: 4};
	      break;
	    case '06':
	      return {nome:'Junho', id: 5};
	      break;
	    case '07':
	      return {nome:'Julho', id: 6};
	      break;
	    case '08':
	      return {nome:'Agosto', id: 7};
	      break;
	    case '09':
	      return {nome:'Setembro', id: 8};
	      break;
	    case '10':
	      return {nome:'Outubro', id: 9};
	      break;
	    case '11':
	      return {nome:'Novembro', id: 10};
	      break;
	    case '12':
	      return {nome:'Dezembro', id: 11};
	      break;	    
	  }
	}
	
mlkComponenteCalendario.prototype.obtemAno =
  function(bReal) {
    bReal = (typeof(bReal) == 'undefined' ? false : bReal);
    var data = (bReal ? this.dataReal : this.dataActiva);
    return parseInt(data.split('-')[0], 10);
  }
 
mlkComponenteCalendario.prototype.obtemDataDeDATE =
  function(objDate) {
    var ano = objDate.getFullYear();
    var mes = objDate.getMonth() + 1;
    var dia = objDate.getDate();
    return this.constroiData(ano, mes, dia);
  }

mlkComponenteCalendario.prototype.constroiData =
  function (ano, mes, dia) {
    var sz = ano + '-' + (mes > 9 ? mes : '0' + mes) + '-01';
    var max = this.obtemNumDiasMes(sz);
    if (dia > max) {
      dia = max;
    }
    return ano + '-' + (mes > 9 ? mes : '0' + mes) + '-' + (dia > 9 ? dia : '0' + dia);
  }
 
/*  MARCACOES *****************************************************************/ 

function mlkCompCalMarcacao (
            ano, mes, dia, anoFim, mesFim, diaFim, 
            dataIni, horaIni, dataFim, horaFim, 
            continua, diaReservado, sabado, domingo, 
            campo, formID, estagioID, respostaID, descricao
          ) {
  this.ano = ano; this.mes = mes; this.dia = dia;
  this.anoFim = anoFim; this.mesFim = mesFim; this.diaFim = diaFim;
  this.dataIni = dataIni; this.horaIni = horaIni; this.dataFim = dataFim; this.horaFim = horaFim; 
  this.continua = continua; this.diaReservado = diaReservado; this.sabado = sabado; this.domingo = domingo;  
  this.campo = campo; this.formID = formID; this.estagioID = estagioID; this.respostaID = respostaID;
  this.descricao = descricao;
}
 
mlkCompCalMarcacao.prototype.fDeterminaHora =
  function() {
    var hora = '';
	  if (this.dataFim == '' && this.horaIni == '' && this.horaFim == '') {
	    hora = "Dia";
	  } else if (this.dataFim == '' && this.horaIni == '' && this.horaFim != '') {
	    hora = "Início " + this.horaFim;
	  } else if (this.dataFim == '' && this.horaIni != '' && this.horaFim == '') {
	    hora = this.horaIni;
	  } else if (this.dataFim == '' && this.horaIni != '' && this.horaFim != '') {
	    hora = this.horaIni + " - " + this.horaFim;
	  } else if (this.dataFim != '' && this.horaIni == '' && this.horaFim == '') {
	    hora = "Dia(+)";
	  } else if (this.dataFim != '' && this.horaIni == '' && this.horaFim != '' && this.continua == false) {
	    hora = "Início " + this.horaFim;
	  } else if (this.dataFim != '' && this.horaIni == '' && this.horaFim != '' && this.continua == true) {
	    if (this.diaFim == this.dia && this.mesFim == this.mes && this.anoFim == this.ano) {
	      hora = "Início " + this.horaFim;
	    } else {
	      hora = "Dia(+)";
	    }
	  } else if (this.dataFim != '' && this.horaIni != '' && this.horaFim == '' && this.continua == false) {
	    hora = this.horaIni + " Fim";
	  } else if (this.dataFim != '' && this.horaIni != '' && this.horaFim == '' && this.continua == true) {
	    if (parseInt(this.dataIni.split("-")[2], 10) == this.dia && parseInt(this.dataIni.split("-")[1], 10) == this.mes && parseInt(this.dataIni.split("-")[0], 10) == this.ano) {
	      hora = this.horaIni + " Fim";
	    } else {
	      hora = "Dia(+)";
	    }
	  } else if (this.dataFim != '' && this.horaIni != '' && this.horaFim != '' && this.continua == false) {
	    hora = this.horaIni + " - " + this.horaFim;
	  } else if (this.dataFim != '' && this.horaIni != '' && this.horaFim != '' && this.continua == true) {
	    if (parseInt(this.dataIni.split("-")[2], 10) == this.dia && parseInt(this.dataIni.split("-")[1], 10) == this.mes && parseInt(this.dataIni.split("-")[0], 10) == this.ano) {
	      hora = this.horaIni + " Fim";
	    } else if (parseInt(this.dataFim.split("-")[2], 10) == this.dia && parseInt(this.dataFim.split("-")[1], 10) == this.mes && parseInt(this.dataFim.split("-")[0], 10) == this.ano) {
	      hora = "Início " + this.horaFim;
	    } else {
	      hora = "Dia(+)";
	    }
	  }
	  return hora;
  } 
 
/*  SELECÇÃO do ANO *****************************************************************/
mlkComponenteCalendario.prototype.fCSAnoMostra = 
  function () {
    var objCSAno = document.getElementById(this.id + 'csAnoCont');
    //esconder mes
    this.fCSMesEsconde();
    //seleccionar ano activo
    this.fCSAnoIncrementa(true);
    //mostrá-lo
    objCSAno.style.visibility = 'visible';
    objCSAno.style.top = document.getElementById(this.id + 'ctC').offsetTop + 'px';
    objCSAno.style.left = document.getElementById(this.id + 'mnCAnoMold').offsetLeft + 'px'; 
  }
mlkComponenteCalendario.prototype.fCSAnoEsconde =
  function () {
    var objCSAno = document.getElementById(this.id + 'csAnoCont');
    objCSAno.style.visibility = 'hidden';
  }
mlkComponenteCalendario.prototype.fCSAnoIncrementa =
  function (bPosicionarAnoActivo) {
    bPosicionarAnoActivo = (typeof(bPosicionarAnoActivo) == 'undefined' ? false : bPosicionarAnoActivo);
    var i, anoActivo, anoActual, novoAno, obj;
    anoActivo = this.obtemAno();
    if (document.all) {
      anoActual = parseInt(document.getElementById(this.id + 'csAno2').innerText, 10);
    } else {
      anoActual = parseInt(document.getElementById(this.id + 'csAno2').innerHTML, 10);
    }
    if (bPosicionarAnoActivo == true) { anoActual = anoActivo - 1; }
    novoAno = anoActual - 2;
		for	(i=0; i<5; i++) {
		  novoAno += 1;
		  obj = document.getElementById(this.id + 'csAno' + i);
			if (novoAno == anoActivo) { 
			  obj.className = 'csLinkActual';
			}	else { 
			  obj.className = '';
			}
      if (document.all) {
        obj.innerText = novoAno;
      } else {
        obj.innerHTML = novoAno;
      }
		}
  }
mlkComponenteCalendario.prototype.fCSAnoDiminui =
  function () {
    var i, anoActivo, anoActual, novoAno, obj;
    anoActivo = this.obtemAno();
    if (document.all) {
      anoActual = parseInt(document.getElementById(this.id + 'csAno2').innerText, 10);
    } else {
      anoActual = parseInt(document.getElementById(this.id + 'csAno2').innerHTML, 10);
    }
    novoAno = anoActual + 2;
		for	(i=4; i>=0; i--) {
		  novoAno -= 1;
		  obj = document.getElementById(this.id + 'csAno' + i);
			if (novoAno == anoActivo) { 
			  obj.className = 'csLinkActual';
			}	else { 
			  obj.className = '';
			}
      if (document.all) {
        obj.innerText = novoAno;
      } else {
        obj.innerHTML = novoAno;
      }
		}  
  }
mlkComponenteCalendario.prototype.fCSAnoMouseDown =  
  function (sentido) { 
    clearInterval(this.intervaloCSAno);
    if (sentido > 0) {
      this.intervaloCSAno = setInterval(this.id + '.fCSAnoIncrementa();', this.csTempoMovAno);
    } else {
      this.intervaloCSAno = setInterval(this.id + '.fCSAnoDiminui();', this.csTempoMovAno);
    }    
  }
mlkComponenteCalendario.prototype.fCSAnoMouseUp = 
  function () {
    clearInterval(this.intervaloCSAno);
  } 
  
  /* SELECÇÃO DO MÊS *****************************************************************/
mlkComponenteCalendario.prototype.fCSMesMostra =   
  function () {
    var objCSMes = document.getElementById(this.id + 'csMesCont');
    var mes = this.obtemMes();
    //esconder ano
    this.fCSAnoEsconde();
    //seleccionar mês actual
    for (var i=1; i < 13; i++) {
      document.getElementById(this.id + 'csMes' + i).className = (i == (mes.id + 1) ? ' csLinkActual' : '');
    }
    //mostrá-lo
    objCSMes.style.visibility = 'visible';
    objCSMes.style.top = document.getElementById(this.id + 'ctC').offsetTop + 'px';
    objCSMes.style.left = document.getElementById(this.id + 'mnCMesMold').offsetLeft + 'px'; 
  }
mlkComponenteCalendario.prototype.fCSMesEsconde = 
  function () {
    var objCSMes = document.getElementById(this.id + 'csMesCont');
    objCSMes.style.visibility = 'hidden';
  }
mlkComponenteCalendario.prototype.fCSMouseOver = 
  function (id) {
    if (id == 'csMes') {
      clearTimeout(this.timerCSMes);
    } else if (id == 'csAno') {
      clearTimeout(this.timerCSAno);
    }
  }
mlkComponenteCalendario.prototype.fCSMouseOut =   
  function (id) {
    if (id == 'csMes') {
      clearTimeout(this.timerCSMes);
      this.timerCSMes = setTimeout(this.id + '.fCSMesEsconde();', this.csTempoFecho);
    } else if (id == 'csAno') {
      clearTimeout(this.timerCSAno);
      this.timerCSAno = setTimeout(this.id + '.fCSAnoEsconde();', this.csTempoFecho);
    }
  }

/* SELECÇÃO DO DIA DO MÊS *****************************************************************/
mlkComponenteCalendario.prototype.fCSMDiaInicializa = 
  function (diaACTIVO, diaMAX, bReposiciona) {
    var i, dia, obj, bEncontrou = false;
    if (typeof(bReposiciona) != 'boolean') { bReposiciona = true; }
    if (bReposiciona == true) {
      if (diaACTIVO >= 1 && diaACTIVO <= 3) {
        dia = 1;
      } else if (diaACTIVO >= (diaMAX - 6)) {
        dia = (diaMAX - 8);
      } else {
        dia = diaACTIVO - 2
      }
    } else {
      dia = parseInt(document.getElementById(this.id + 'csMDia0').innerHTML, 10);
    }
    for (i=0; i<9; i++) {
      obj = document.getElementById(this.id + 'csMDia' + i);
      obj.parentNode.className = obj.parentNode.className.replace(/ctCDMMenuDiaActual/gi, '');
      if (dia == diaACTIVO) {
        obj.parentNode.className = obj.parentNode.className + ' ctCDMMenuDiaActual';
        bEncontrou = true;
      }
      if (document.all) {
        obj.innerText = dia;
      } else {
        obj.innerHTML = dia;
      }
      dia += 1;
    }
    if (bEncontrou == false) { this.fCSMDiaInicializa(diaACTIVO, diaMAX, true); }
  }
mlkComponenteCalendario.prototype.fCSMDiaIncrementa = 
  function () {
    var i, diaMAX, diaACTIVO, dia, obj;
    diaMAX = this.obtemNumDiasMes(this.dataActiva);
    diaACTIVO = this.obtemDia().diaMes;
    if (document.all) {
      dia = parseInt(document.getElementById(this.id + 'csMDia0').innerText, 10);
    } else {
      dia = parseInt(document.getElementById(this.id + 'csMDia0').innerHTML, 10);
    }
    if ((dia + 9) > diaMAX) { return; }
    for (i=0; i<9; i++) {
      dia += 1;
      if (dia <= diaMAX) {
        obj = document.getElementById(this.id + 'csMDia' + i);
        obj.parentNode.className = obj.parentNode.className.replace(/ctCDMMenuDiaActual/gi, '');
        if (dia == diaACTIVO) {
          obj.parentNode.className = obj.parentNode.className + ' ctCDMMenuDiaActual';
        }
        if (document.all) {
          obj.innerText = dia;
        } else {
          obj.innerHTML = dia;
        }
      } else {
        break;
      }
    } //for
  }
mlkComponenteCalendario.prototype.fCSMDiaDiminui = 
  function () {
    var i, diaMIN, diaACTIVO, dia, obj;
    diaMIN = 1;
    diaACTIVO = this.obtemDia().diaMes;
    if (document.all) {
      dia = parseInt(document.getElementById(this.id + 'csMDia0').innerText, 10);
    } else {
      dia = parseInt(document.getElementById(this.id + 'csMDia0').innerHTML, 10);
    }
    if (dia == diaMIN) { return; }
    dia = dia + 8;
    for (i=8; i>=0; i--) {
      dia -= 1;
      if (dia >= diaMIN) {
        obj = document.getElementById(this.id + 'csMDia' + i);
        obj.parentNode.className = obj.parentNode.className.replace(/ctCDMMenuDiaActual/gi, '');
        if (dia == diaACTIVO) {
          obj.parentNode.className = obj.parentNode.className + ' ctCDMMenuDiaActual';
        }
        if (document.all) {
          obj.innerText = dia;
        } else {
          obj.innerHTML = dia;
        }
      } else {
        break;
      }
    } //for
  }
mlkComponenteCalendario.prototype.fCSMDiaMouseDown = 
  function (sentido) { 
    clearInterval(this.intervaloCSMDia);
    if (sentido > 0) {
      this.intervaloCSMDia = setInterval(this.id + '.fCSMDiaIncrementa();', this.csTempoMovDia);
    } else {
      this.intervaloCSMDia = setInterval(this.id + '.fCSMDiaDiminui();', this.csTempoMovDia);
    }    
  }
mlkComponenteCalendario.prototype.fCSMDiaMouseUp =   
  function () {
    clearInterval(this.intervaloCSMDia);
  }
  
/* SCROLL DAS MARCAÇÕES *****************************************************************/
mlkComponenteCalendario.prototype.fCScrollInicializa =   
  function () {
    this.cScPosY = 0;
    this.fCScrollVerifica();
    document.getElementById(this.id + 'ctCDMarcContScroll').style.visibility = 'visible';
  }
mlkComponenteCalendario.prototype.fCScrollEsconde = 
  function (bEsconde) {
    if (bEsconde == true) {
      document.getElementById(this.id + 'ctCDScroll').style.display = 'none';
    } else {
      document.getElementById(this.id + 'ctCDScroll').style.display = 'block';
    }
  }
mlkComponenteCalendario.prototype.fCScrollCalculaAreas = 
  function  () {
    var divContentor, divConteudo;
    divConteudo = document.getElementById(this.id + 'ctCDMarcContScroll'); /*obter referencia para o div que que vai conter os conteudos*/
    divContentor = document.getElementById(this.id + 'ctCDMarcCont'); /*obter referencia para o div contentor*/
    this.cScMaxY = ((divConteudo.offsetHeight - divContentor.offsetHeight > 0) ? divConteudo.offsetHeight - divContentor.offsetHeight : 0);
  }
mlkComponenteCalendario.prototype.fCScrollVerifica =   
  function () { 
    var bRecalcula = false;
    this.fCScrollEsconde(true);
    this.fCScrollCalculaAreas();
    if (this.cScMaxY > 0) { 
      this.fCScrollEsconde(false); 
      bRecalcula = true;  
    } else { 
      this.fCScrollMovePara(0); 
    } 
    if(bRecalcula == true) { this.fCScrollCalculaAreas(); }
  }
mlkComponenteCalendario.prototype.fCScrollMovePara = 
  function (y){
    if(document.getElementById(this.id + 'ctCDMarcContScroll')) { 
      document.getElementById(this.id + 'ctCDMarcContScroll').style.top = (this.cScPosY = y) + "px";
    }
  }
mlkComponenteCalendario.prototype.fCScrollExecuta = 
  function (fy) {
    var now = ( new Date() ).getTime();
    var d = ((now - this.cScLastTime)/1000) * this.cScVelocidade;
    if (d > 0) {
      var y = this.cScPosY + fy * d;
      if ((fy == -1 && y > -this.cScMaxY) || (fy == 1 && y < 0)) {
        this.cScLastTime = now;
        this.fCScrollMovePara(y);
      } else {
        clearInterval(this.cScTimerId); 
        this.cScTimerId = 0;
        this.fCScrollMovePara(this.cScEndY);
      }
    }
  }
mlkComponenteCalendario.prototype.fCScrollPara = 
  function () {
    if (this.cScTimerId) { clearInterval(this.cScTimerId); } 
    this.cScTimerId = 0;  
  }
mlkComponenteCalendario.prototype.fCScrollComeca = 
  function (sentido, velocidade) { 
    this.cScEndY = ( sentido == 1 ? 0 : -this.cScMaxY);
    if (this.cScTimerId) clearInterval(this.cScTimerId);
    this.cScVelocidade = velocidade || this.cScVelocidadeOmissao;
    this.cScLastTime = (new Date()).getTime();
    this.cScTimerId = setInterval(this.id + '.fCScrollExecuta(' + (sentido == 1 ? 1 : -1) + ');', 10);
  }
 