var NTP = {
  cookieShelfLife : 7, //7 days
  requiredResponses : 2,
  serverTimes : new Array,
  serverUrl : "/js/time/gettime.php",
  resyncTime : 120, // minutes
  sync : function(){
    // if the time was set within the last x minutes; ignore this set request; time was synce recently enough
	 var offset = NTP.getCookie("NTPClockOffset");
	 if (offset){try{
	 var t = offset.split("|")[1];
	 var d = NTP.fixTime()-parseInt(t);
	 if (d < (1000 * 60 * NTP.resyncTime)){return false;} // x minutes; return==skip
	 }catch(e){}
     }
     NTP.serverTimes = new Array;
     NTP.getServerTime();
  },
  getNow : function(){
      var date = new Date();
      return (date.getTime() + (60 * 60000));
  },
  parseServerResponse : function(data){
     var offset = parseInt(data.responseText.split(":")[0]);
     var origtime = parseInt(data.responseText.split(":")[1]);
     var delay = ((NTP.getNow() - origtime) / 2);
     offset = offset - delay;
     NTP.serverTimes.push(offset);

     // if we have enough responces set cookie
     if (NTP.serverTimes.length >= NTP.requiredResponses){
        // build average
	var average = 0;
	var i=0;
	for (i=0; i < NTP.serverTimes.length;i++){
	   average += NTP.serverTimes[i];
	}
	average = Math.round(average / i);
	NTP.setCookie("NTPClockOffset",average);
	NTP.setCookie("NTPClockOffset",average+'|'+NTP.fixTime()); // save the timestamp that we are setting it
     }
     else{
        NTP.getServerTime();
     }

  },
  getServerTime : function(){
     try{
      var req = new Ajax.Request(NTP.serverUrl,{
          onSuccess : NTP.parseServerResponse,
	  method : "get",
	  parameters : "t=" + NTP.getNow()
          });
      }
      catch(e){
         return false;
         //prototype.js not available
      }
  },
  setCookie : function(aCookieName,aCookieValue){
     var date = new Date();
     date.setTime(date.getTime() + (NTP.cookieShelfLife * 24*60*60*1000));
     var expires = '; expires=' + date.toGMTString();
     document.cookie = aCookieName + '=' + aCookieValue + expires + '; path=/';
  },
  getCookie : function(aCookieName){
     var crumbs = document.cookie.split('; ');
             for (var i = 0; i < crumbs.length; i++)
            {
                var crumb = crumbs[i].split('=');
                if (crumb[0] == aCookieName && crumb[1] != null)
                {
                    return crumb[1];
                }
            }
      return false;
  },
  fixTime : function(timeStamp){
      if(!timeStamp){timeStamp = NTP.getNow();}
      var offset = NTP.getCookie("NTPClockOffset") ;
      if (!offset){offset = 0;}else{offset=offset.split("|")[0];}
      return timeStamp + parseInt(offset);
  }
}

function jsClockGMT(){
     // Copyright 1999 - 2001 by Ray Stott
    if (!document.getElementById('clock0')) {
        return;
    }
    gmtMS = NTP.fixTime(); // offset for how bad our clock is off zulu to zulu

    var gmtTime =  new Date(gmtMS); // build a new object so we get the right txt back

	if (!gmtTime.dst())	{
		gmtTime.setUTCHours((gmtTime.getUTCHours()-1))
	}
	else	{
		//gmtTime.setHours(gmtTime.getHours()+1)
		gmtTime.setHours(gmtTime.getHours())
	}

    var monthNames = Array(12);
    monthNames[0] = "JAN";
    monthNames[1] = "FEB";
    monthNames[2] = "MAR";
    monthNames[3] = "APR";
    monthNames[4] = "MAY";
    monthNames[5] = "JUN";
    monthNames[6] = "JUL";
    monthNames[7] = "AUG";
    monthNames[8] = "SEP";
    monthNames[9] = "OCT";
    monthNames[10] = "NOV";
    monthNames[11] = "DEC";

    var hour = gmtTime.getUTCHours();
    var minute = gmtTime.getUTCMinutes();
    var second = gmtTime.getUTCSeconds();
    var year = gmtTime.getUTCFullYear();
    var month = monthNames[gmtTime.getUTCMonth()];
    var day = gmtTime.getUTCDate();

    var s='th';
	if(day===1 || day==21 || day==31) s='st';
	if(day===2 || day==22) s='nd';
	if(day===3 || day==23) s='rd';


    var temp = day + s + " " + month + " " + year;
    temp += " " + ((hour < 10) ? "0" : "") + hour;
    temp += ((minute < 10) ? ":0" : ":") + minute;
    temp += ((second < 10) ? ":0" : ":") + second;
    temp += "&nbsp;&nbsp;&nbsp;";
    document.getElementById('clock0').innerHTML = temp;
    setTimeout("jsClockGMT()",1000);
}


Date.prototype.stdTimezoneOffset = function() {
	var jan = new Date(this.getFullYear(), 0, 1);
	var jul = new Date(this.getFullYear(), 6, 1);
	return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
}


Date.prototype.dst = function() {
	return this.getTimezoneOffset() < this.stdTimezoneOffset();
}

