var relogio = {

  maxerr: 0.2, // see value in NTP.js 	error = Math.round(Math.sqrt(sigma2/i)/10)/100;

  jsClockGMT : function(){

     // Copyright 1999 - 2001 by Ray Stott
     // Modified 071205 - Carlos
     // Added leap second support 081216 - Carlos
     // Several additions like Sync cookie & beating on the second,... 090201 - Carlos
   if (!document.getElementById('clock0') || !document.getElementById('clockT')) {
      return
   }
   var setD = 1
   if (!document.getElementById('clockD')) {
      setD = 0
   }
   var temp = "Calculando..."
   var leap = 0.

   var off = NTP.getCookie("NTPClockOffset")
   var err = NTP.getCookie("NTPClockError")
   var syn = NTP.getCookie("NTPClockSync")
  // var lastT = NTP.getCookie("NTPClockLastT")

   if(!err){
          NTP.sync()
          if(!err){
                err=10000000.
	        NTP.setCookie("NTPClockOffset",0);
                NTP.setCookie("NTPClockError",err)
          }
   } else {
	  var time = new Date();
          var gmtMS = NTP.getNow(); 
          if(err < relogio.maxerr){
              gmtMS = NTP.fixTime(gmtMS) //adjust with NTP
	      var offdst = time.getTimezoneOffset() * 60000 * 1
              gmtMS = gmtMS + (time.getTimezoneOffset() * 60000 * 1) // remove Time Zone offsets
          }
   	  var gmtTime =  new Date(gmtMS)
          var hour = gmtTime.getHours()
          var minute = gmtTime.getMinutes()
   	  var second = gmtTime.getSeconds()
	  var mils = 1000 - gmtTime.getMilliseconds()
//	  if(Math.abs(time.valueOf()-lastT)>100){NTP.sync()}
//	  NTP.setCookie("NTPClockLastT",time.valueOf()+mils)
	  
   	  temp = " " + ((hour < 10) ? "0" : "") + hour
   	  temp += ((minute < 10) ? ":0" : ":") + minute
   	  temp += ((second < 10) ? ":0" : ":") + second
   }

   if (err < relogio.maxerr){
        document.getElementById('clockT').innerHTML = "Hora Legal OAL"
        document.getElementById('clockT').title= "Hora em Portugal continental e Madeira. Nos Açores subtraia 1 hora."
	document.getElementById('clock0').innerHTML = temp
	var desf= Math.abs(((parseFloat(off)+parseFloat(offdst))/1000)).toFixed(2)
	var delf= parseFloat(err).toFixed(2)
	if (off < -4){ // test negative offsets paying attention to the fact that rounding will transform [-4,4] into 0
        	document.getElementById('clock0').title= "A hora do seu sistema está adiantada de " + desf + " s."
		if(setD){
			if (delf == 0){
				document.getElementById('clockD').innerHTML = "+" + desf + " +/- 0.005 s"
			}else{
				document.getElementById('clockD').innerHTML = "+" + desf + " +/- " + delf + " s"
			}
		}
	}else{
		if(desf == 0){
			if(delf == 0){
				document.getElementById('clock0').title= "A hora do seu sistema está correcta a menos de 0.005 s."
				if(setD){document.getElementById('clockD').innerHTML = desf +" +/- 0.005 s"}
			}else{
				document.getElementById('clock0').title= "A hora do seu sistema está correcta a menos de " + delf + " s."
				if(setD){document.getElementById('clockD').innerHTML = desf +" +/- " + delf + " s"}
			}
			
		}else{
			document.getElementById('clock0').title= "A hora do seu sistema está atrasada de " + desf + " s."
			if (setD){
				if (delf == 0){
					document.getElementById('clockD').innerHTML = "-" + desf + " +/- 0.005 s"
				}else{
					document.getElementById('clockD').innerHTML = "-" + desf + " +/- " + delf + " s"
				}
			}
		}
	}
	if(setD){document.getElementById('clockD').title = ""}
   } else {
        document.getElementById('clockT').innerHTML = "A sua hora".fontcolor("Red")
        document.getElementById('clockT').title= "ATENÇÃO: esta não é a hora legal! Veja 'O que é isto?'."
        document.getElementById('clock0').innerHTML = temp.fontcolor("Red")
        document.getElementById('clock0').title= "ATENÇÃO: esta não é a hora legal! Veja 'O que é isto?'."
	if(setD){
		document.getElementById('clockD').innerHTML = ("??.?? +/- ?.?? s").fontcolor("Orange")
		document.getElementById('clockD').title = "Não é possível determinar o desfasamento. O erro é muito elevado!"
	}
   }
   if(syn == 0){
   	document.getElementById('clockT').innerHTML = "Calculando...".fontcolor("Red")
	document.getElementById('clockT').title= "Calculando o desfasamento do seu relógio..."
   }

   if(leap == 1. && gmtTime){
	var day = gmtTime.getDate()
	var month = gmtTime.getMonth()
	var year = gmtTime.getFullYear()
   	if(day == 31 && month == 11 && year == 2008 && hour == 23 && minute == 59 && second == 59){
		off = off - 1000.
		NTP.setCookie("NTPClockOffset",off)
		setTimeout("relogio.leapsecond()",mils)
   	} else {
		setTimeout("relogio.jsClockGMT()",mils)
	}
    }else{   
		setTimeout("relogio.jsClockGMT()",mils)
   }
  },
// leapsecond function outdated.. extensive chages in the original code...
  leapsecond : function(){

     // Copyright 1999 - 2001 by Ray Stott
     // Modified 071205 - Carlos
     // Added leap second support 081216 - Carlos
   if (!document.getElementById('clock0')) {
      return
   }
   var temp = "Calculando..."

   var off = NTP.getCookie("NTPClockOffset")
   var sig2 = NTP.getCookie("NTPClockSigma2")

   if(!sig2){
          NTP.sync()
          if(!sig2){
                sig2=10000000.
	        NTP.setCookie("NTPClockOffset",0);
                NTP.setCookie("NTPClockSigma2",sig2)
          }
   } else {
	  var time = new Date();
          var gmtMS = NTP.getNow(); 
          if(sig2 < 300000.){
              gmtMS = NTP.fixTime(gmtMS) //adjust with NTP
              gmtMS = gmtMS + (time.getTimezoneOffset() * 60000 * 1) // remove Time Zone offsets
          }
   	  var gmtTime =  new Date(gmtMS)
          var hour = gmtTime.getHours()
          var minute = gmtTime.getMinutes()
   	  var second = gmtTime.getSeconds()
	  var day = gmtTime.getDate()
	  var month = gmtTime.getMonth()
	  var year = gmtTime.getFullYear()
	  
   	  temp = " " + ((hour < 10) ? "0" : "") + hour
   	  temp += ((minute < 10) ? ":0" : ":") + minute
	  if(day == 31 && month == 11 && year == 2008 && hour == 23 && minute == 59 && second == 59){
	  	temp += ":60".fontcolor("Darkorange")
	  } else {
		temp += ((second < 10) ? ":0" : ":") + second
	  }
   }
   if (sig2 < 300000.){
        document.getElementById('clockT').innerHTML = "Hora Legal OAL"
        document.getElementById('clockT').title= "Hora em Portugal continental e Madeira. Nos Açores subtraia 1 hora."
	document.getElementById('clock0').innerHTML = temp
        document.getElementById('clock0').title= "Hora em Portugal continental e Madeira. Nos Açores subtraia 1 hora."
   } else {
        document.getElementById('clockT').innerHTML = "A sua hora".fontcolor("Red")
        document.getElementById('clockT').title= "ATENÇÃO: esta não é a hora legal! Veja 'O que é isto?'."
        document.getElementById('clock0').innerHTML = temp.fontcolor("Red")
        document.getElementById('clock0').title= "ATENÇÃO: esta não é a hora legal! Veja 'O que é isto?'."
   }
   setTimeout("relogio.jsClockGMT()",1000)

  }
}

