﻿/// <reference name="MicrosoftAjax.js"/>

var controls;

var clock;
var stateManager;
var localId;
var getDataTID = null;

function pageLoad() {
    localId = Math.floor(Math.random() * 10000000);

    controls = {
        currentRace: $get("CurrentRace"),
        noRace: $get("NoRace"),
        tournament: $get("Tournament"),
        tournamentTitle: $get("TournamentTitle"),
        matchDistance: $get("MatchDistance"),
        matchSex: $get("MatchSex"),
        pair: $get("Pair"),
        pairCount: $get("PairCount"),
        innerCompetitor: {
            container: $get("InnerCompetitor"),
            startNumber: $get("InnerCompetitorStartNumber"),
            name: $get("InnerCompetitorName"),
            results: $get("InnerResults"),
            lapDistance: $get("InnerLapDistance"),
            lapsRemaining: $get("InnerLapsRemaining"),
            totalTime: $get("InnerTotalTime"),
            lapTime: $get("InnerLapTime")
        },
        outerCompetitor: {
            container: $get("OuterCompetitor"),
            startNumber: $get("OuterCompetitorStartNumber"),
            name: $get("OuterCompetitorName"),
            results: $get("OuterResults"),
            lapDistance: $get("OuterLapDistance"),
            lapsRemaining: $get("OuterLapsRemaining"),
            totalTime: $get("OuterTotalTime"),
            lapTime: $get("OuterLapTime")
        },
        clock: $get("Clock"),
        raceStatus: $get("RaceStatus"),
        linkHref: $get("LinkHref")
    };

    controls.tournament.innerHTML = controls.tournamentTitle.value;
    controls.clock.innerHTML = LiveWeb.Utils.formatTime(0, 1);
    controls.raceStatus.style.display = "none";
    controls.innerCompetitor.results.style.visibility = "hidden";
    controls.outerCompetitor.results.style.visibility = "hidden";
    
    stateManager = $create(LiveWeb.ClientStateManager, { delay: delay });
    var raceStateManager = stateManager.get_raceStateManager(LiveWeb.PairColors.WhiteRed);
    raceStateManager.add_raceSwitch(raceSwitch);
    raceStateManager.add_racePrepare(racePrepare);
    raceStateManager.add_raceStart(raceStart);
    raceStateManager.add_raceComplete(raceComplete);
    raceStateManager.add_passage(passage);
    raceStateManager.add_clockUpdate(clockUpdate);

    $addHandler(controls.currentRace, "click", bannerClick);

    LiveWeb.DataService.set_timeout(dataServiceTimeout);    
    LiveWeb.DataService.Reset();
    getData(false);
}

function bannerClick() {
    window.open(controls.linkHref.value, "EventSiteWindow");
}

function getData(delay) {
    LiveWeb.DataService.GetData(localId, null, null, null, LiveWeb.MatchResultsMode.None, getDataCompleted, getDataFailed, { delay: delay });
}

function getDataCompleted(result, context) {
    if (result == null) {
        getDataTID = setTimeout(function() { getData(true); }, getDataInterval * 1000);
        controls.currentRace.style.display = "none";
        controls.noRace.style.display = "block";
    }
    else {
        getDataTID = setTimeout(function() { getData(true); }, getDataInterval * 1000);
        try {
            stateManager.queueData(result, context.delay, false);
        }
        catch (e) {
            Sys.Debug.traceDump(e);
        }
        controls.currentRace.style.display = "block";
        controls.noRace.style.display = "none";
    }
}

function getDataFailed(error) {
    Sys.Debug.traceDump(error);
    LiveWeb.DataService.Reset();
    getDataTID = setTimeout(function() { getData(true); }, getDataInterval * 2 * 1000);
}

function clockUpdate(sender, e) {
    controls.clock.innerHTML = LiveWeb.Utils.formatTime(sender.get_clock().get_seconds(), 1);
}

function cancelGetData() {
    if (getDataTID != null) {
        Sys.Debug.trace("Cancelling scheduled getData().");
        clearTimeout(getDataTID);
        getDataTID = null;
    }
}

function removeChildNodes(parent) {
    while (parent.hasChildNodes()) {
        parent.removeChild(parent.firstChild);
    }
}

function raceSwitch(sender, e) {
    refreshCurrentRace(e.race);
}

function racePrepare(sender, e) {
    refreshCurrentRace(e.race);
}

function raceStart(sender, e) {
    refreshCurrentRace(e.race);
}

function raceComplete(sender, e) {
    refreshCurrentRace(e.race);
}

function passage(sender, e) {
    refreshLaps(stateManager.get_raceStateManager(LiveWeb.PairColors.WhiteRed).get_uiRace(), e.track, e.index);    
}

function refreshLaps(race, track, index) {
    var laps = race.laps[track];
    var trackControls = track == LiveWeb.Track.Inner ? controls.innerCompetitor : controls.outerCompetitor;
    var lastLapIndex = -1;
    for (var i = laps.length - 1; i >= 0; i--) {
        if (!laps[i].isEmpty) {
            lastLapIndex = i;
            break;
        }
    }
    if (lastLapIndex == -1) {
        trackControls.results.style.visibility = "hidden";
    }
    else if (index == null || index == lastLapIndex) {
        var lastLap = laps[lastLapIndex];
        trackControls.results.style.visibility = "visible";
        trackControls.lapDistance.innerHTML = race.match.lapDistances[lastLapIndex];
        trackControls.lapsRemaining.innerHTML = race.match.lapCount - lastLapIndex - 1;
        trackControls.totalTime.innerHTML = LiveWeb.Utils.formatTime(lastLap.totalTime, 2);
        trackControls.lapTime.innerHTML = lastLap.lapTime.toFixed(1);
    }
}

function refreshCurrentRace(race) {
    controls.matchDistance.innerHTML = race.match.distance;
    if (race.match.sex == LiveWeb.Sex.Male) {
        controls.matchSex.innerHTML = "heren";
    }
    else if (race.match.sex == LiveWeb.Sex.Female) {
        controls.matchSex.innerHTML = "dames";
    }
    else {
        controls.matchSex.innerHTML = "";
    }
    controls.pair.innerHTML = race.pair;
    controls.pairCount.innerHTML = race.match.pairCount;
    refreshCompetitor(race.innerSkater, controls.innerCompetitor);
    refreshCompetitor(race.outerSkater, controls.outerCompetitor);
    refreshRaceStatus(race);
    refreshLaps(race, LiveWeb.Track.Inner);
    refreshLaps(race, LiveWeb.Track.Outer);
}

function refreshRaceStatus(race) {
    controls.raceStatus.style.color = "";
    switch (race.uiState) {
        case LiveWeb.RaceState.Preparing:
            controls.raceStatus.innerHTML = "Wachten op start";
            controls.raceStatus.style.display = "block";
            break;
        case LiveWeb.RaceState.Completed:
            if (race.falseStart || (race.laps[LiveWeb.Track.Inner].length == 0 && race.laps[LiveWeb.Track.Outer].length == 0)) {
                race.falseStart = true;
                controls.raceStatus.innerHTML = "Valse start";
                controls.raceStatus.style.color = "Red";
            }
            else {
                controls.raceStatus.innerHTML = "Rit afgelopen";
            }
            controls.raceStatus.style.display = "block";
            break;
        default:
            controls.raceStatus.innerHTML = "";
            controls.raceStatus.style.display = "none";
            break;
    }
}

function refreshCompetitor(competitor, controls) {
    if (competitor != null) {
        controls.container.style.display = "block";
        controls.startNumber.innerHTML = competitor.startNumber;
        controls.name.innerHTML = competitor.name;
    }
    else {
        controls.container.style.display = "none";
    }
}