﻿function getData() {
    window.status = 'Checking for updates...';
    if (null != window.IScoringDataService) {
        IScoringDataService.GetScorecardFullData(window.__matchId, window.__scorecardVersion, null, onGetDataComplete, onGetDataError);
    } else {
        window.location.reload(); //Service not loaded
    }
}

function onGetDataComplete(result) {

    text("lastUpdated", new Date().format('d MMMM yyyy HH:mm:ss'));

    if (!result) {
        window.status = 'No new data';
        return;
    }

    document.title = result.CurrentScore ? String.format("{0} | {1}", result.CurrentScore, result.MatchTitle) : result.MatchTitle;

    text("state", result.State);
    $get("state").className = result.StateColour;

    text("toss", result.Toss);
    visible("tossBox", result.Toss != null && result.Toss != "");
    text("result", result.MatchResult);
    visible("resultBox", result.MatchResult != null && result.MatchResult != "");
    text("daySession", result.DaySession);
    visibleInline("daySession", result.DaySession != null && result.DaySession != "");
    text("team1Players", result.Team1Players);
    text("team2Players", result.Team2Players);

    for (var i = 0; i < result.Innings.length; i++) {
        var inn = result.Innings[i];
        var ino = inn.InningsNumber;

        visible(inningsId(ino, "container"), inn.ShowInnings);
        $get(inningsId(ino, "container")).className = inn.IsCurrentInnings ? window.__currentInningsClass : "";

        var tbl = $get(inningsId(ino, "batting"));
        tbl.rows[0].cells[0].innerHTML = inn.BattingTeam;

        for (var b = 0; b < inn.BattingCard.length; b++) { //skip TH row
            var batter = inn.BattingCard[b];
            if (tbl.rows.length <= b + 1) {
                addRow(tbl, 7);
            }
            var cells = tbl.rows[b + 1].cells;
            elemText(cells[0], String.format("{0} {1}", getBatterPrefix(batter), batter.BatsmanName));
            elemText(cells[1], batter.HowOut);
            elemText(cells[2], batter.Runs);
            elemText(cells[3], batter.Balls);
            elemText(cells[4], batter.Mins);
            elemText(cells[5], batter.Fours);
            elemText(cells[6], batter.Sixes);

        }

        while (tbl.rows.length > inn.BattingCard.length + 1) {
            removeRow(tbl, tbl.rows.length - 1);
        }

        tbl = $get(inningsId(ino, "bowling"));

        for (var b = 0; b < inn.BowlerCard.length; b++) { //skip TH row
            var bowler = inn.BowlerCard[b];
            if (tbl.rows.length <= b + 1) {
                addRow(tbl, 7);
            }
            var cells = tbl.rows[b + 1].cells;
            elemText(cells[0], bowler.BowlerName);
            cells[0].className = "name";
            elemText(cells[1], bowler.Overs);
            elemText(cells[2], bowler.Maidens);
            elemText(cells[3], bowler.Runs);
            elemText(cells[4], bowler.Wickets);
            elemText(cells[5], bowler.Wides);
            elemText(cells[6], bowler.NoBalls);

        }

        while (tbl.rows.length > inn.BowlerCard.length + 1) {
            removeRow(tbl, tbl.rows.length - 1);
        }

        visible(inningsId(ino, "bowlingBox"), inn.BowlerCard.length > 0)

        visible(inningsId(ino, "notes"), inn.Notes.length > 0);
        var list = $get(inningsId(ino, "notelist"))
        for (var n = 0; n < inn.Notes.length; n++) {
            var note = inn.Notes[n];
            var items = list.getElementsByTagName("LI");
            if (items.length <= n) {
                var li = document.createElement("LI");
                list.appendChild(li);
            }
            items[n].innerHTML = note;
        }

        while (list.getElementsByTagName("LI").length > inn.Notes.length) {
            var items = list.getElementsByTagName("LI");
            list.removeChild(items[items.length - 1]);
        }

        text(inningsId(ino, "fow"), inn.FallOfWickets);
        visible(inningsId(ino, "fowBox"), inn.FallOfWickets != null && inn.FallOfWickets != "")
        text(inningsId(ino, "runrate"), inn.RunRate);
        text(inningsId(ino, "lastOver"), inn.LastOver);
        text(inningsId(ino, "bestOver"), inn.BestOver);
        text(inningsId(ino, "lastBoundary"), inn.LastBoundary);
        text(inningsId(ino, "currentPartnership"), inn.CurrentPartnership);

    }

    window.__scorecardVersion = result.ScorecardVersion;

    window.status = 'Update complete';

}

function getBatterPrefix(batter) {
    var prefix = "";
    if (batter.Captain) {
        prefix = "<strong>*</strong>";
    }
    if (batter.Keeper) {
        prefix = prefix + "<sup>&#8224;</sup>";
    }
    return prefix;

}

function addRow(tbl, cols) {
    var row = document.createElement("TR");
    for (var c = 0; c < cols; c++) {
        var cell = document.createElement("TD");
        row.appendChild(cell);
    }
    tbl.getElementsByTagName("tbody")[0].appendChild(row);
}

function removeRow(tbl, row) {
    tbl.getElementsByTagName("tbody")[0].removeChild(tbl.rows[row]);
}

function onGetDataError(error) {
    window.status = "Error: " + error.message;
}

function inningsId(no, ctl) {
    return 'innings' + no + '_' + ctl;
}

function text(id, val) {
    var element = $get(id);
    if (!element) return;
    if (element.innerHTML == (val + '')) return;
    if (val == null) val = "";
    element.innerHTML = val;
}

function elemText(element, val) {
    if (!element) return;
    if (element.innerHTML == (val + '')) return;
    if (val == null || val == "") val = "&nbsp;";
    element.innerHTML = val;
}

function visible(id, show) {
    var element = $get(id);
    if (!element) return;
    element.style.display = show ? "block" : "none";
}

function visibleInline(id, show) {
    var element = $get(id);
    if (!element) return;
    element.style.display = show ? "inline" : "none";
}