﻿var raceStartTime = new Date();
var raceTimerInterval = 1000;
var dataTimerInterval = 15000;
var eventStatus;
var countdownTimer;
var raceTimer;
var pageInitTime; // for postevent racetimer
var currentRaceTime;
var _requestingPoints = false;
var dataUpdateTimer;
var replayLapDuration = 180;
var totalReplayTime = 0;
var showOnlyEntrants = true;
var postRaceTimerStep = 1000;
var eventMap;
var veOverloadDisableBubbleAutoHide= true;

function init() {

}
//$addHandler(this, "load", init);
$addHandler(this, "resize", resize);

function countdownTimer_OnTick(sender, args) {
    var timeNow = new Date();

    var dif = new Date(raceStartTime-timeNow);
    var secs = dif.valueOf()/1000;

    if (secs < 0) {
        countdownTimer._stopTimer();
        SportsDo.setObjInnerText("raceTime", "Race begins");
        setTimeout("setupLiveEvent()", 10000);
    } else {
        var format = "";
        var display = "";
        
       var noOfDays = calcage(secs,86400,100000, false);
        if (noOfDays == 0) {
          format = "hh:mm:ss";
        } else if (noOfDays == 1) {
          format = "dd Day, hh:mm:ss";
        } else {
          format = "dd Days hh:mm:ss";
        }
        display = format.replace(/dd/g, noOfDays);
        display = display.replace(/hh/g, calcage(secs,3600,24, true));
        display = display.replace(/mm/g, calcage(secs,60,60, true));
        display = display.replace(/ss/g, calcage(secs,1,60, true));

        SportsDo.setObjInnerText("raceTime", display);
    }
}

function startRaceTimer() {
  raceTimer = $create(SportsDo.Timer, {enabled:true,id:"raceTimer",interval:raceTimerInterval}, {tick:raceTimer_OnTick}, null, null);
}

function startPostRaceTimer() {
  raceTimer = $create(SportsDo.Timer, {enabled:true,id:"raceTimer",interval:raceTimerInterval}, {tick:postRaceTimer_OnTick}, null, null);
  for (var i=0; i<9; i++) {
    eventMap._onReplayFastForwardHandler();
  }
}

function calcage(secs, num1, num2, leadingZero) {
  s = ((Math.floor(secs/num1))%num2).toString();
  if (leadingZero && s.length < 2)
    s = "0" + s;
  return s;
}

function postRaceTimer_OnTick(sender, args) {
  var t = new Date();
  
  t.setTime(currentRaceTime);
  var s = SportsDo.formatTime(t, "hh:mm:ss");
  
  SportsDo.setObjInnerText("raceTime", s);
  
  currentRaceTime = currentRaceTime + postRaceTimerStep;
}

function raceTimer_OnTick(sender, args) {
    var timeNow = new Date();
    //timeNow.setTime(timeNow.getTime() - ((new Date()).getTimezoneOffset() * 60000));
    
    // - this didn't work on the day - JV
    //if (eventStatus == "PostEvent") {
      //var dif = timeNow - pageInitTime;
      //timeNow.setDate(raceStartTime.getDate());
      //timeNow.setTime(raceStartTime.getTime() + dif);
    //}
    
    if (timeNow > raceStartTime) {
      var t = new Date();
      t.setTime(timeNow - raceStartTime);
      
      var s = SportsDo.formatTime(t, "hh:mm:ss");
      
      SportsDo.setObjInnerText("raceTime", s);
      
      // keep a track of the current racetime
      currentRaceTime = timeNow.getTime() - raceStartTime.getTime();
    }
}

function newsResponse(data) {
  try {
    var newsText = new Sys.StringBuilder();
    var item, photo, dt, link, row, imageCell, image, textCell, timeSpan;
    var tbl = $get("newsListTable");
    
    if (data.News.length > 0) {
      var tbody = tbl.tBodies[0];
      while (tbody.rows.length > 0) {
        var rIndex = tbody.rows[0].sectionRowIndex;
	    tbody.rows[0].parentNode.deleteRow(rIndex);
      }
    }
    
    for (var i=0; i<data.News.length; i++) {
      item = data.News[i];
      
      dt = new Date();
      dt.setTime(item.dt);
      
      if (item.nn != null) {
        link = document.createElement("a");
        link.setAttribute("href", "javascript:centerDoer('" + item.nn + "')");
        link.appendChild(document.createTextNode(item.nn));
      } else if (item.ext.pic != null) {
        photo = new SportsDo.Mapping.SPhotoPoint(item.ext.pic.id, new SportsDo.Mapping.SLatLng(item.ext.pic.lt, item.ext.pic.lg), item.t);
        eventMap.addPhoto(photo);
        
        link = document.createElement("a");
        link.setAttribute("href", "javascript:centerPhoto('" + item.ext.pic.id + "')");
        link.appendChild(document.createTextNode(item.t));
      } else {
        link = document.createElement("a");
        link.setAttribute("href", "javascript://");
        link.appendChild(document.createTextNode(item.t));
      }
    
      if (link != null && link.innerHTML.length > 0) {
        var row = tbl.tBodies[0].insertRow(0);
        row.className = selectDoerItemCssClass(i);
        imageCell = row.insertCell(0);
        imageCell.className = "imageCell";
        image = document.createElement("img");
        imageCell.appendChild(image);
        image.setAttribute("src", item.iu);
        textCell = row.insertCell(1);
        timeSpan = document.createElement("span");
        textCell.appendChild(timeSpan);
        timeSpan.setAttribute("width", "20px");
        timeSpan.appendChild(document.createTextNode(SportsDo.formatTime(dt, "hh:mm")));
        textCell.appendChild(document.createTextNode(" - "));
        textCell.appendChild(link);
        if (item.nn != null) {
          textCell.appendChild(document.createTextNode(" - " + item.t));
        }
      }
      
      if (i == 30) {
        break;
      }
    }
  } catch (err) {
  }
}

function showDoerTab() {
  $get("doerListHolder").style.display = "block";
  $get("newsHolder").style.display = "none";
  $get("newsTab").className = "inactiveTab";
  $get("doersTab").className = "activeTab";
}

function showNewsTab() {
  $get("doerListHolder").style.display = "none";
  $get("newsHolder").style.display = "block";
  $get("newsTab").className = "activeTab";
  $get("doersTab").className = "inactiveTab";
}

function resize() {
  if (eventMap != null) {
      var size = SportsDo.GetInnerSize();
      var width = parseInt($get("mainContent").offsetWidth) - 30 - parseInt($get("panel1").offsetWidth);
      var height = size[1] - 95;
      eventMap.resizeMap(width, height);
      
      $get("panel1").style.height = height + "px";
      var imgPanel = $get("imagePanel");
      var imgPanelHeight = imgPanel == null ? 0 : imgPanel.offsetHeight
      if (height - parseInt($get("infoPanel").offsetHeight) - parseInt(imgPanelHeight) > 25) {
        $get("newsPanel").style.height = height - parseInt($get("infoPanel").offsetHeight) - parseInt(imgPanelHeight) - 25 + "px";
      }
      $get("tabPanel").style.height = parseInt($get("newsPanel").offsetHeight) + "px";
      
      if (parseInt($get("tabPanel").offsetHeight) > 60) {
        $get("newsHolderContent").style.height = parseInt($get("tabPanel").offsetHeight) - 60 + "px";
      }
  }
}

function eventMap_Created(map) {
  eventMap = map;
  var startTime = $get("__SPORTSDOEVENTSTARTTIME");
  if ($get("__EVENTSTATUS") != null) {
    eventStatus = $get("__EVENTSTATUS").value;
  }
  if (startTime != null) {
    raceStartTime.setTime(startTime.value);
    
    if (eventStatus == "PostEvent") {
      setupPostEvent();
    } else if (eventStatus == "PreEvent") {
      countdownTimer = $create(SportsDo.Timer, {enabled:true,id:"countdownTimer",interval:1000}, {tick:countdownTimer_OnTick}, null, null);
      setupPreEvent();
    } else if (eventStatus == "LiveEvent") {
      setupLiveEvent();
    }
  }
  
  showDoerTab();
  
  setToLocationPackViewPort();
  
  resize();
  eventMap.resetCenter();
  
  eventMap.showDashboardPanel();
  eventMap.showMapTypePanel();
  eventMap.showOverviewMapPanel();
  
  // enable the custom bubble for Virtual Earth
  if (!(BrowserDetect.browser == "Explorer" && BrowserDetect.version <= 6)) {
    eventMap.enableCustomBubble();
  }
  
  eventMap.addPreDoerBubbleShow(generateDoerBubbleHtml);
  eventMap.addOnDoerAdd(onDoerAdd);
  
  var panelWrapper = document.createElement("div");
  panelWrapper.setAttribute("class", "listWrapper");
  var newsListTable = document.createElement("table");
  newsListTable.appendChild(document.createElement("tbody"));
  panelWrapper.appendChild(newsListTable);
  newsListTable.setAttribute("id", "newsListTable");
  newsListTable.setAttribute("cellpadding", "0");
  newsListTable.setAttribute("cellspacing", "0");
  newsListTable.setAttribute("width", "220px");
    
  var holder = $get("newsHolder");
  if (BrowserDetect.browser == "Explorer") {
    holder.innerHTML = panelWrapper.outerHTML;
  } else {
    holder.appendChild(panelWrapper);
  }

  dataUpdateTimer = $create(SportsDo.Timer, {enabled:true,id:"dataUpdateTimer",interval:dataTimerInterval}, {tick:dataUpdateTimer_OnTick}, null, null);
  requestDataAsync();
  
  loadJsCssFile("/Clubs/Event/Styles/custombubble.css", "css");
}

function setToLocationPackViewPort() {
  if (eventMap != null && $get("__VIEWPORTTOPRIGHT") != null && $get("__VIEWPORTBOTTOMLEFT") != null) {
    var topRightS = $get("__VIEWPORTTOPRIGHT").value;
    var bottomLeftS = $get("__VIEWPORTBOTTOMLEFT").value;
    var topRight = new SportsDo.Mapping.SLatLng(topRightS.split(',')[0], topRightS.split(',')[1]);
    var bottomLeft = new SportsDo.Mapping.SLatLng(bottomLeftS.split(',')[0], bottomLeftS.split(',')[1]);
    eventMap.autoZoom(topRight, bottomLeft);
  }
}

function onDoerAdd(sender, args) {
  if (typeof(args.doer.ext) != "undefined" && args.doer.ext.ent === false) {
    args.doer.getIcon().setImageUrl('/ui/events/icons/spectator.gif');
  } else {
    args.doer.getIcon().setImageUrl('/ui/events/icons/entrant.gif');
  }
}

function generateDoerBubbleHtml(sender, args) {
  var nickname = args.doer.getId();
  var fullname = args.doer.ext.fn;

  args.bubbleType = SportsDo.Mapping.SBubbleType.InfoAndMap;
  
  if (typeof(args.doer.ext) != "undefined") {
    var location = args.doer.ext.loc;
    var date = new Date();
    if (eventStatus === "LiveEvent") {
      date.setTime(args.doer.ext.dt);
    } else {
      date.setTime(args.doer.ext.dt - raceStartTime);
    }
    
    if (location != null) {
      location = location.replace(/\r\n/g, '<br />');
    } else {
      location = "";
    }

    var dateString = SportsDo.formatTime(date, "hh:mm:ss");
    var sb = new Sys.StringBuilder();
    sb.append("<div style='position: relative; height: 120px; margin-top: 5px;'><div style='float: left'><img style=\"background-color: white\" src=\"/picture.ashx?size=64x&user=");
    sb.append(nickname);
    sb.append("\"></div>");
    sb.append("<div style='margin-left: 65px; line-height: 15px;'><b>" + fullname + " - </b>");
    sb.append("<a href=\"/" + nickname + "\" target=\"_blank\">((" + nickname + "))</a>");
    sb.append("<br/>" + location);
    sb.append("<br/>last seen: " + dateString);
    sb.append("</div></div>");
    if (eventStatus === "LiveEvent") {
      sb.append("<span>To get updates by text send <b>sportsdo ");
      sb.append(nickname);
      sb.append("</b> to <b>81025</b>*</span><br/><br/><span style=\"font-size: 8pt\">*texts cost 25p + standard network charge</span>");
    }

    args.htmlContent = sb.toString();
  } else {
    var sb = new Sys.StringBuilder();
    sb.append("<div style='position: relative; height: 160px; margin-top: 5px;'><div style='float: left'><img style=\"background-color: white\" src=\"/picture.ashx?size=64x&user=");
    sb.append(nickname);
    sb.append("\"></div>");
    sb.append("<div style='margin-left: 65px; line-height: 15px;'><b>" + fullname + " - </b>");
    sb.append("<a href=\"/" + nickname + "\" target=\"_blank\">((" + nickname + "))</a>");
    sb.append("</div></div>");
    
    args.htmlContent = sb.toString();
  }
}

function setupPreEvent() {
}

function setupPostEvent() {
  this.startReplay = function() {
    raceTimer.set_enabled(true);
  };
  
  this.pauseReplay = function() {
    raceTimer.set_enabled(false);
  };

  this.fastForwardReplay = function() {
    if (postRaceTimerStep < 5000) {
      raceTimer.set_interval(raceTimer.get_interval() - 100);
    }
    
    postRaceTimerStep += 1000;
  };

  this.rewindReplay = function() {
    if (postRaceTimerStep > 1000) {
      if (postRaceTimerStep < 5000) {
        raceTimer.set_interval(raceTimer.get_interval() + 200);
      }
      postRaceTimerStep -= 1000;
    }
  };
  
  this.stopReplay = function() {
    raceTimer.set_enabled(false);
  };
  
  SportsDo.setObjInnerText(null, "Replay Race Time", $get("infoPanel").firstChild.firstChild);
  
  //var opts = { play: true, stop: true, pause: true, fastForward: true, rewind: false };
  //eventMap.showReplayPanel(opts);
  $get("remoteControl").style.display = "block";
  eventMap.addOnReplayStart(this.startReplay);
  eventMap.addOnReplayPause(this.pauseReplay);
  eventMap.addOnReplayFastForward(this.fastForwardReplay);
  eventMap.addOnReplayRewind(this.rewindReplay);
  eventMap.addOnReplayStop(this.stopReplay);
  pageInitTime = new Date();
  startPostRaceTimer();
}

function setupLiveEvent() {
  startRaceTimer();
}

function centerDoer(id) {
  var doer = eventMap.centerDoer(id);
  doer.showBubble();
}

function centerPhoto(id) {
  var photo = eventMap.centerPhoto(id);
  photo.showBubble();
}

function dataUpdateTimer_OnTick(sender, args) {
  requestDataAsync();
}

function compareDoersOnDistance(a, b) {
  if (a.ext.ds < b.ext.ds)
    return -1;
  if (a.ext.ds > b.ext.ds)
    return 1;
  return 0;
}

function sortDoerListTableByDistance() {
  var Table1Sorter = new TSorter;
  Table1Sorter.setGet("attribute", "_distance");
  Table1Sorter.init('doerListTable');
  Table1Sorter.sort();
	
  var tblRows = $get("doerListTable").tBodies[0].rows;
  for (var i=0;i<tblRows.length;i++) {
    tblRows[i].setAttribute("class", selectDoerItemCssClass(i));
  }
}

function doerResponse(response) {
  try {
    var data = response;
    var doer, slatlng, pt, doerPoint, newDoer;
    var doerListTable;

    if (data.Doers != null && eventMap.getDoers().length > 0) {
      setTimeout(function() {
        var index = 0;
        var item, cell, link;

        for (var i=0; i<data.Doers.length; i++) {
          newDoer = data.Doers[i];
          
          if (newDoer.ext.draw == true) {
            doer = eventMap.findDoerById(newDoer.nn);
            
            if (doer != null) {
              slatlng = new SportsDo.Mapping.SLatLng(newDoer.pt.lt, newDoer.pt.lg);
              doer.ext = newDoer.ext;
              doer.setLatLng(slatlng);
            } else {
              doerPoint = new SportsDo.Mapping.SDoerPoint(newDoer.nn, new SportsDo.Mapping.SLatLng(newDoer.pt.lt, newDoer.pt.lg));
              doerPoint.ext = newDoer.ext;
              eventMap.addDoer(doerPoint);
            }
          }

          item = $get("list_" + newDoer.nn);
          if (item != null) {
            item.setAttribute("_distance", parseFloat(newDoer.ext.ds));
            if (eventStatus !== "PostEvent") {
              cell = item.childNodes[1];
              cell.replaceChild(document.createTextNode(newDoer.ext.ds), cell.childNodes[2]);
            }
          } else {
            if (!showOnlyEntrants || newDoer.ext.ent === true) {
              createDoerListDomItem(index, newDoer.nn, newDoer.ext.fn, newDoer.ext.ds);
              index++;
            }
          }
        }
        
        sortDoerListTableByDistance();
      }, 10);
    } else {
      var panelWrapper = document.createElement("div");
      panelWrapper.setAttribute("class", "listWrapper");
      doerListTable = createDoerListTable();
      panelWrapper.appendChild(doerListTable);

      var holder = $get("doerListHolder");
      if (BrowserDetect.browser == "Explorer") {
        holder.innerHTML = panelWrapper.outerHTML;
      } else {
        holder.appendChild(panelWrapper);
      }
      
      var index = 0;
      for (var i=0; i<data.Doers.length; i++) {
        doer = data.Doers[i];
        
        if (!showOnlyEntrants || doer.ext.ent === true) {
          createDoerListDomItem(index, doer.nn, doer.ext.fn, doer.ext.ds)
          index++;
        }
      }
      eventMap.dataBind(data);
    }
  } catch (err) {
  }
}

function createDoerListTable() {
  var table = document.createElement("table");
  table.setAttribute("id", "doerListTable");
  table.setAttribute("cellpadding", "0");
  table.setAttribute("cellspacing", "0");
  table.setAttribute("width", "220px");
  table.appendChild(document.createElement("tbody"));
  return table;
}

function selectDoerItemCssClass(i) {
  if (i % 2 == 0) {
    return "doerItem";
  } else {
    return "doerItemAlternate";
  }
}

function createDoerListDomItem(index, doerId, fullname, totalDistance) {
  if (totalDistance == null) {
    totalDistance = "";
  }
  
  var tbl = $get("doerListTable");
  var num = tbl.tBodies[0].rows.length;
  var row = tbl.tBodies[0].insertRow(0);
  row.className = selectDoerItemCssClass(index);
  row.setAttribute("id", "list_" + doerId);
  row.setAttribute("_doerId", doerId);
  row.setAttribute("_distance", parseFloat(totalDistance));
  
  var cell1 = row.insertCell(0);
  cell1.className = "imageCell";
  var img = document.createElement("img");
  img.setAttribute("src", "/ui/events/icons/doer_item.gif");
  cell1.appendChild(img);
  
  var cell2 = row.insertCell(1);
  var link = document.createElement("a");
  link.setAttribute("href", "javascript:centerDoer('" + doerId + "')");
  link.appendChild(document.createTextNode(fullname));
  cell2.appendChild(link);
  
  if (eventStatus !== "PostEvent") {
    cell2.appendChild(document.createElement("br"));
    cell2.appendChild(document.createTextNode(totalDistance));
  }
}

var uniqueId = 0;
function requestDataAsync() {
  var eventId = $get("__SPORTSDOEVENTID");
  if (eventId != null) {
    if (eventStatus === "PostEvent") {
      if (typeof(currentRaceTime) === "undefined") {
        currentRaceTime = 0;
      }

      var dataRequest = new SportsDoApi("dataRequest", "Events/ReplayEvent", "dataAsyncRequestComplete", 
        [["asJson", "true"], ["maxMs", currentRaceTime], ["eid", eventId.value], ["minMs", uniqueId], ["ir", $get("__ONLYENTRANTSINREGION").value]],
        $get("__SVCSERVERURL").value);
      dataRequest.startRequest();
    } else if (eventStatus === "LiveEvent") {
      var dataRequest = new SportsDoApi("dataRequest", "Events/LiveEvent", "dataAsyncRequestComplete", 
        [["asJson", "true"], ["eid", eventId.value], ["prevUniqueId", uniqueId], ["ir", $get("__ONLYENTRANTSINREGION").value]],
        $get("__SVCSERVERURL").value);
      dataRequest.startRequest();
    }
  }
}

function dataAsyncRequestComplete(response) {
  uniqueId = response.uniqueId;
  doerResponse(response);
  newsResponse(response);
  _requestingPoints = false;
}

function replayLapComplete(sender, args) {
  totalReplayTime = args.time;
  requestReplayDataAsync(totalReplayTime * 1000, replayLapDuration);
}

function replayLapOnTick(sender, args) {
  var d = new Date();
  d.setTime(0);
  d.setSeconds(args.time);
  SportsDo.setObjInnerText("raceTime", SportsDo.formatTime(d, "hh:mm:ss"));
}

function playPauseButtonClick() {
    var btn = $get("playPauseButton");
    
    if (btn.src == document.location.protocol + "//" + document.location.hostname + "/ui/mapreplay/play.gif") {
        btn.src = "/ui/mapreplay/pause.gif";
        eventMap._onReplayStartHandler();
    } else {
        btn.src = "/ui/mapreplay/play.gif";
        eventMap._onReplayPauseHandler();
    }
}

function stopButtonClick() {
    eventMap._onReplayStopHandler();
}

function slowerButtonClick() {
    eventMap._onReplayRewindHandler();
}

function fasterButtonClick() {
    eventMap._onReplayFastForwardHandler();
}