// ---------------- variables --------------------------------------------------
var clock_host = 'http://time.in.ua/c';
var req, reqstart, reqend, response, offset, offset1, timeout;
var randmin, randsec, undef, reqCount, reqNum, os;
var alertURL = "http://time.in.ua/setup.html";
var offsetCookie = 'offset';
var reqCount = 3;

// ---------------- SNTP via HTTP syncronization -------------------------------

function loadXMLDoc(url) {
  reqstart = (new Date()).getTime();
  // branch for native XMLHttpRequest object
  if (window.XMLHttpRequest) {
    req = new XMLHttpRequest();
    req.onreadystatechange = processReqChange;
    req.open("GET", url, true);
    req.setRequestHeader('Pragma', 'no-cache');
    req.setRequestHeader('Cache-control', 'no-cache');
    req.send(null);
  }
  else if (window.ActiveXObject) {
    // branch for IE/Windows ActiveX version
    req = new ActiveXObject("Microsoft.XMLHTTP");
    if (req) {
      req.onreadystatechange = processReqChange;
      req.open("GET", url, true);
      req.setRequestHeader('Pragma', 'no-cache');
      req.setRequestHeader('Cache-control', 'no-cache');
      req.send();
    }
  }
}

function processReqChange()
{
  // only if req shows "complete"
  if (req.readyState == 4) {
    // only if "OK"
    if (req.status == 200 || req.responseText != undef) {
      // ...processing statements go here...
      response = req.responseText;
      reqend = (new Date()).getTime();
      reqNum -= 1;
      offset1 = (reqend-reqstart)/2;
      // real time (in microseconds) is response * 1000 + offset
      // user's time (in microseconds) is reqend
      // difference is reqend - (response * 1000 + offset)
      offset1 = reqend - response*1000 - offset1;
      if (offset == undef) offset = 0;
      offset += offset1;
      if (reqNum == 0) {
        offset = Math.round(offset/reqCount);
        var expire = new Date();
        expire.setTime(expire.getTime() + 86400 * 1000); // 1 day
        setCookie(offsetCookie, offset, expire.toGMTString());
        display();
      }
      else {
        setTimeout("makeRequest()", 500);
      }
    }
    else {
      alert("There was a problem retrieving the XML data:\n" + req.statusText);
    }
  }
}

function go() {
//  if (reqNum != -1) {
    if (window.confirm("Ваши часы не синхронизированы! Хотите узнать, как это можно исправить?")) {
      if (alertURL.indexOf("?") == -1) alertURL += "?";
      else alertURL += "&";
      alertURL += "offset=" + offset;
      if (os) alertURL += "#" + os;
      top.location.href = alertURL;
//      reqNum = -1;
//    }
  }
}

function display() {
  var div;
  var timer = (new Date()).getTime();
  var real = timer + offset;
  real = Math.round(real);
  real = real.toString();
  real = 1000-real.substr(real.length-3);
  timeout = setTimeout("displayTime()", real);
  var info = "GMT: " + getGMT() + ". Разница хода: " + offset2time(offset) + ". ";
  div = document.getElementById("time");
  if (Math.abs(offset) > 1000) {
    info += "Ваши часы не синхронизированы!";
    if (div) {
      div.style.color = '#ff0000';
      div.style.cursor = 'pointer';
      if (div.addEventListener) div.addEventListener("click", go, false);
      else if (div.attachEvent) div.attachEvent("onclick", go);
      else div.onclick = go;
    }
  }
  else {
    info += "Ваши часы синхронизированы.";
    if (div) {
      div.style.color = '#000000';
      div.style.cursor = 'default';
      if (div.removeEventListener) div.removeEventListener("click", go, false);
      else if (div.detachEvent) div.detachEvent("click", go);
      else div.onclick = undef;
    }
  }
  var time = new Date();
  time.setTime(time.getTime() - offset);
  if (time.getMinutes() > randmin) time.setTime(time.getTime() + 1000*3600);
  info += " Следующая синхронизация в " + time.getHours() + ":" + d2(randmin) + ":" + d2(randsec) + ".";
  div = document.getElementById("big_clock");
  if (div) { 
    div.title = info;
    div.style.visibility = 'visible';
  }
}

function offset2time(time) {
  var min, sec, msec, abs;
  if (time < 0) abs = -1;
  else abs = 1;
  time = Math.abs(time);
  msec = time - 1000 * Math.floor(time / 1000);
  time = Math.floor(time / 1000);
  sec = time - 60 * Math.floor(time / 60);
  min = Math.floor(time / 60);
  time = '';
  if (min) time += min + " мин";
  if (sec) {
    if (time) time += " ";
    time += sec + " с";
  }
  if (msec) {
    if (time) time += " ";
    time += msec + " мс";
  }
  if (abs == -1) time = "-" + time;
  return time;
}

function startSync() {
  randmin = Math.floor(Math.random()*60);
  randsec = Math.floor(Math.random()*60);
  if (reqCount <= 0) reqCount = 1;
  reqNum = reqCount;
  makeRequest();
}

function makeRequest() {
  url = clock_host + "?r=" + Math.random();
  if (reqNum == reqCount) {
    if (offset) offset1 = offset;
    else offset1 = parseInt(getCookie(offsetCookie));
    if (offset1) url += "&of=" + offset1;
  }
  else if (offset1) url += "&of1=" + offset1;
  loadXMLDoc(url);
}

function displayTime() {
  timeout = setTimeout("displayTime()", 1000);
  var time = new Date();
  time.setTime(time.getTime() - offset);
  var div = document.getElementById("time");
  if (div) div.innerHTML = d2(time.getHours())+":"+d2(time.getMinutes())+":"+d2(time.getSeconds());
  if (time.getSeconds() == randsec && time.getMinutes() == randmin) startSync();
}

function d2(val) {
  if (val < 10) val = "0"+val;
  return val;
}

function getGMT() {
  var my_winterOffset = (new Date(2000,01,01)).getTimezoneOffset();
  var my_summerOffset = (new Date(2000,07,01)).getTimezoneOffset();
  var my_nowOffset = (new Date()).getTimezoneOffset();
  var my_gmt = -my_nowOffset/60;
  if (my_nowOffset == my_summerOffset && my_nowOffset != my_winterOffset) my_gmt--;
  if (my_gmt > 0) my_gmt = "+" + my_gmt;
  return my_gmt;
}

function closewin() {
  var obj = document.getElementById("big_clock");
  if (obj) obj.style.visibility = 'hidden';
  clearTimeout(timeout);
}

function about() {
  top.location.href = "http://time.in.ua/clock.html";
}

function setCookie (name, value, expires, path, domain, secure) {
  document.cookie = name + "=" + escape(value) +
          ((expires) ? "; expires=" + expires : "") +
          ((path) ? "; path=" + path : "") +
          ((domain) ? "; domain=" + domain : "") +
          ((secure) ? "; secure" : "");
}

function getCookie(name) {
  var cookie = " " + document.cookie;
  var search = " " + name + "=";
  var setStr = null;
  var offset = 0;
  var end = 0;
  if (cookie.length > 0) {
    offset = cookie.indexOf(search);
    if (offset != -1) {
      offset += search.length;
      end = cookie.indexOf(";", offset);
      if (end == -1) end = cookie.length;
      setStr = unescape(cookie.substring(offset, end));
    }
  }
  return(setStr);
}

// ---------------- main programm start --------------------------------------
var ua = window.navigator.userAgent;
if (ua.match(/Win(dows\s+)?([\d\.NTXP\s]+?)(;|\)|$)/i)) os = "windows";
else if (ua.match(/FreeBSD(\s?)([^;\\s)]+?)(;|\)|$)/i)) os = "freebsd";
else if (ua.match(/Linux(\s?)([^;\)]+?)(;|\)|$)/i)) os = "linux";
/*
if (os) {
  alertURL += "#" + os;
  var div = document.getElementById("big_clock1");
  if (div) {
    div.style.MozBorderRadius = '10px';
    div.style.border = 'black 1px solid';
    div.style.background = '#cccccc transparent';
  }
}
*/
startSync();

