﻿function Tournament(options) {
    this._tournament = options.tournament;
    this._tabs = options.tabs || "LG,OS,HS,AS,TT";
    this._compact = options.compact === true;
    this._options = options;
}

Tournament.prototype = {
    _container: null,
    _options: null,
    _tournament: null,

    _compact: false,

    _createIn: function (container) {
        this._container = container;
        this._init();
    },

    _init: function () {
        var tabs = [];

        $.each(this._tabs.split(","), function (ind, t) {
            var name = $.trim(t);
            switch (name) {
                case "LG":
                    tabs.push({ id: "LastGames", text: "Maçlar" });
                    break;
                case "OS":
                    tabs.push({ id: "OverallStandings", text: "Puan Durumu" });
                    break;
                case "HS":
                    tabs.push({ id: "HomeStandings", text: "İç Saha" });
                    break;
                case "AS":
                    tabs.push({ id: "AwayStandings", text: "Dış Saha" });
                    break;
                case "TT":
                    tabs.push({ id: "TeamCharts", text: "Takım Grafikleri" });
                    break;
            }
        });

        this._createTabs(tabs);
    },

    _createTabs: function (tabs) {
        var that = this, c, ul;


        c = this._container;

        if (tabs.length > 1) {
            ul = $("<ul>").appendTo(c);

            $.each(tabs, function (ind, tab) {
                $("<li>").append($("<a>").attr("href", "#" + tab.id).text(tab.text)).appendTo(ul);
            });

            $.each(tabs, function (ind, tab) {
                $("<div/>").attr("id", tab.id).appendTo(c);
            });

            c.tabs({ show: function (e, args) {
                var $panel = $(args.panel);

                if (!$panel.is(":empty")) {
                    return;
                }

                that["_load" + $panel.attr("id")]($panel);
            }
            });
        }
        else {
            this["_load" + tabs[0].id](c);
        }

    },

    _loadLastGames: function (container) {
        var that = this, i, len, m, c = 6,
            matches = this._tournament.getMatches(),
            $table = $("<table class='tournament-matches' />").appendTo(container),
            $row = $("<tr style='font-weight:bold' />").appendTo($table),
            $lastCell, $finishedCell,
            lastCount = 0,
            finishedCount = 0;

        function createMatchRow(ind, match) {
            var finished = m.hScore >= 0 && m.aScore >= 0,
                $mPanel = $("<div />"),
                $mTable = $("<table class='tournament-match-panel' />").appendTo($mPanel),
                color = (finished ? 0x777 : 0x79a) + ind * 0x111,
                bgColor = 0xfff - color,
                $mRow = $("<tr style='color:#" + color.toString(16) + "' />").appendTo($mTable);

            $("<td style='color:#fff;background-color:#" + (bgColor.toString(16)) + ";width:6%;font-weight:bold'/>").text(match.mType).appendTo($mRow);
            $("<td style='width:28%'/>").text(match.date.localeFormat("dd.MM HH:mm")).appendTo($mRow);
            $("<td style='width:29%;'/>").append(that._compact ? match.hCode : match.hName).appendTo($mRow);
            $("<td style='width:8%;font-weight:bold'/>").text(finished ? String.format("{0}:{1}", m.hScore, m.aScore) : "v").appendTo($mRow);
            $("<td style='width:29%;text-align:right'/>").append(that._compact ? match.aCode : match.aName).appendTo($mRow);

            return $mPanel;
        }

        $row.append($("<td />").text("Gelecek Maçlar"));
        $row.append($("<td />").text("Biten Maçlar"));

        $row = $("<tr />").appendTo($table);
        for (i = 0, len = matches.length; i < len; i++) {
            m = matches[i];
            if (m.hScore >= 0 && m.aScore >= 0) {
                // match finished
                if (!$finishedCell) {
                    $finishedCell = $("<td />").appendTo($row);
                }
                if (finishedCount < c) {
                    $finishedCell.append(createMatchRow(finishedCount, m));
                    finishedCount += 1;
                }
            }
            else {
                // match not finished
                if (!$lastCell) {
                    $lastCell = $("<td />").prependTo($row);
                }
                if (lastCount < c) {
                    $lastCell.append(createMatchRow(lastCount, m));
                    lastCount += 1;
                }
            }

            if (lastCount === c && finishedCount === c) {
                break;
            }
        }

        if (!$lastCell) {
            $row.prepend($("<td />").text("Yakın tarihte oynanacak maç bulunmamaktadır."));
        }

        if (!$finishedCell) {
            $row.append($("<td />").text("Biten maç bulunmamaktadır."));
        }

    },

    _loadStandings: function (container, prefix) {
        prefix = prefix || "o";
        var that = this;
        var standings = this._tournament.getStandings(prefix);
        var $standings = $("<table class='team-group-standings' cellspacing='0' cellpadding='1' />");
        var $headerRow = $("<tr></tr>").appendTo($standings).css("font-weight", "bold");
        $("<td/>").appendTo($headerRow).attr("title", "Sıra").css("width", "5%");
        $("<td/>").appendTo($headerRow).css("width", "5%");
        $("<td/>").appendTo($headerRow).text("Takım").attr("align", "left").css("width", this._compact ? "10%" : "25%");
        $("<td/>").appendTo($headerRow).text("O").attr("title", "Oynanan Maç").css("width", "5%");
        if (!this._compact) {
            $("<td/>").appendTo($headerRow).text("G").attr("title", "Galibiyet").css("width", "5%");
            $("<td/>").appendTo($headerRow).text("B").attr("title", "Beraberlik").css("width", "5%");
            $("<td/>").appendTo($headerRow).text("M").attr("title", "Mağlubiyet").css("width", "5%");
            $("<td/>").appendTo($headerRow).text("AG").attr("title", "Atılan Gol").css("width", "5%");
            $("<td/>").appendTo($headerRow).text("YG").attr("title", "Yenilen Gol").css("width", "5%");
        }
        $("<td/>").appendTo($headerRow).text("P").attr("title", "Puan").css("width", "5%").css("color", "#000");
        if (!this._compact) {
            $("<td/>").appendTo($headerRow).text("Av").attr("title", "Averaj").css("width", "5%");
            $("<td/>").appendTo($headerRow).text("Son Maçlar").attr("title", "Son Maçlar").css("width", "20%");
        }

        var edges = {
            winHigh: Number.MIN_VALUE, winLow: Number.MAX_VALUE,
            drawHigh: Number.MIN_VALUE, drawLow: Number.MAX_VALUE,
            lossHigh: Number.MIN_VALUE, lossLow: Number.MAX_VALUE,
            goalsHigh: Number.MIN_VALUE, goalsLow: Number.MAX_VALUE,
            concededHigh: Number.MIN_VALUE, concededLow: Number.MAX_VALUE,
            avgHigh: Number.MIN_VALUE, avgLow: Number.MAX_VALUE
        };

        $.each(standings, function (i, team) {

            var $row = $("<tr></tr>").appendTo($standings);
            $("<td style='font-weight:bold'/>").appendTo($row).text((i + 1) + ".");
            var $flag = $("<td/>").appendTo($row);
            var p = team[prefix + "Played"] || 0,
                w = team[prefix + "Win"] || 0,
                d = team[prefix + "Draw"] || 0,
                l = team[prefix + "Loss"] || 0,
                gf = team[prefix + "Goals"] || 0,
                gc = team[prefix + "Conceded"] || 0,
                pts = team[prefix + "Points"] || 0,
                avg = gf - gc;

            $("<span class='flag flag-" + team.code + "'></span>").css("height", 16).css("border", "none").css("border-bottom", "1px solid #666").appendTo($flag);
            $("<td/>").appendTo($row).text(that._compact ? team.code : team.name).attr("align", "left");
            $("<td/>").appendTo($row).text(p);

            if (!that._compact) {
                $("<td/>").appendTo($row).text(w);
                $("<td/>").appendTo($row).text(d);
                $("<td/>").appendTo($row).text(l);
                $("<td/>").appendTo($row).text(gf);
                $("<td/>").appendTo($row).text(gc);
            }
            $("<td/>").appendTo($row).text(pts).css("color", "#000");

            if (!that._compact) {
                $("<td/>").appendTo($row).text(avg);
                edges.winHigh = Math.max(edges.winHigh, w);
                edges.winLow = Math.min(edges.winLow, w);
                edges.drawHigh = Math.max(edges.drawHigh, d);
                edges.drawLow = Math.min(edges.drawLow, d);
                edges.lossHigh = Math.max(edges.lossHigh, l);
                edges.lossLow = Math.min(edges.lossLow, l);
                edges.goalsHigh = Math.max(edges.goalsHigh, gf);
                edges.goalsLow = Math.min(edges.goalsLow, gf);
                edges.concededHigh = Math.max(edges.concededHigh, gc);
                edges.concededLow = Math.min(edges.concededLow, gc);
                edges.avgHigh = Math.max(edges.avgHigh, avg);
                edges.avgLow = Math.min(edges.avgLow, avg);

                var m,
                matches = team[prefix + "Matches"],
                len = matches.length,
                lastGames = [];

                for (var j = Math.max(0, len - 10); j < len; j++) {
                    m = matches[j];
                    if (m.hCode === team.code) {
                        lastGames.push({ match: m, res: m.hScore > m.aScore ? "g" : (m.hScore < m.aScore ? "m" : "b") });
                    }
                    else {
                        lastGames.push({ match: m, res: m.hScore > m.aScore ? "m" : (m.hScore < m.aScore ? "g" : "b") });
                    }
                }

                var lg = $("<td/>").css("font-family", "consolas, courier new, lucia console").appendTo($row);
                $.map(lastGames, function (lastGame, i) {
                    lg.append($("<span>")
                        .css("margin", "1px")
                        .addClass(lastGame.res)
                        .text(lastGame.res)
                        .attr("title", String.format("{0} {1}:{2} {3}",
                            lastGame.match.hName,
                            lastGame.match.hScore,
                            lastGame.match.aScore,
                            lastGame.match.aName)));
                });

                if (i == 1) {
                    $row.find("td").addClass("cl");
                }
                if (i == 14) {
                    $row.find("td").addClass("rl");
                }
            }
        });

        if (!this._compact) {
            $standings.find("tr td:nth-child(5)[innerText='" + edges.winHigh + "']").css("color", "#0a0");
            $standings.find("tr td:nth-child(5)[innerText='" + edges.winLow + "']").css("color", "#f00");
            $standings.find("tr td:nth-child(6)[innerText='" + edges.drawHigh + "']").css("color", "#00f");
            $standings.find("tr td:nth-child(6)[innerText='" + edges.drawLow + "']").css("color", "#00f");
            $standings.find("tr td:nth-child(7)[innerText='" + edges.lossHigh + "']").css("color", "#f00");
            $standings.find("tr td:nth-child(7)[innerText='" + edges.lossLow + "']").css("color", "#0a0");
            $standings.find("tr td:nth-child(8)[innerText='" + edges.goalsHigh + "']").css("color", "#0a0");
            $standings.find("tr td:nth-child(8)[innerText='" + edges.goalsLow + "']").css("color", "#f00");
            $standings.find("tr td:nth-child(9)[innerText='" + edges.concededHigh + "']").css("color", "#f00");
            $standings.find("tr td:nth-child(9)[innerText='" + edges.concededLow + "']").css("color", "#0a0");
            $standings.find("tr td:nth-child(11)[innerText='" + edges.avgHigh + "']").css("color", "#0a0");
            $standings.find("tr td:nth-child(11)[innerText='" + edges.avgLow + "']").css("color", "#f00");
        }
        $standings.find("span.g").css("color", "#000");
        $standings.find("span.m").css("color", "#aaa");
        $standings.appendTo(container);
    },
    _loadOverallStandings: function (container) {
        this._loadStandings(container, "o");
    },
    _loadHomeStandings: function (container) {
        this._loadStandings(container, "h");
    },
    _loadAwayStandings: function (container) {
        this._loadStandings(container, "a");
    },
    _loadTeamCharts: function (container) {

        var teams = [];
        var teamsHash = {};
        var colors = ["BE4B48", "4A7EBB", "98B954"];

        var $chart = $("<img />")
            .attr("align", "absMiddle")
            .appendTo(container);

        container.append($("<p/>").text("Gri alanda yer alan takım isimlerinin yanında yer alan çarpı ikonuna tıklayarak o takımı grafikten çıkarabilir, alt bölümde yer alan takımları da gri alana taşıyarak grafiğe ekleyebilirsiniz."));

        var $current = $("<ul />").addClass("chart-teams current").appendTo(container);
        var $teams = $("<ul />").addClass("chart-teams").appendTo(container);

        function buildSrc() {
            var urlParts = [];

            var chd = [], // data
                chco = [], // color
                chdl = [], // legend,
                chxt = ["x", "y"]; // axis

            urlParts.push("cht=lc");
            urlParts.push("chs=400x200");

            var data = [], maxY = 1, maxX = 1;
            for (var i = 0; i < teams.length; i++) {
                var t = teams[i];
                if (t) {
                    chdl.push(t.name);

                    data[i] = [0];
                    var total = 0;
                    for (var j = 0; j < t.oMatches.length; j++) {
                        var m = t.oMatches[j];
                        if (m && m.type === (j + 1)) {
                            total += MatchHelper.getPoints(t.code, m);
                        }
                        data[i].push(total);
                        maxY = Math.max(maxY, total);
                        maxX = Math.max(maxX, j);
                    }
                }
            }

            maxX += 1;

            for (var i = 0; i < data.length; i++) {
                if (data[i]) {
                    for (var j = 0; j < data[i].length; j++) {
                        data[i][j] = Math.round(data[i][j] * (1000 / maxY)) / 10;
                    }

                    chd.push(data[i].join(","));
                    chco[chco.length] = colors[i];
                }
            }


            urlParts.push("chd=t:" + chd.join("|"));
            urlParts.push("chls=3|3|3");
            urlParts.push("chco=" + chco.join(","));
            urlParts.push("chdl=" + chdl.join("|"));
            urlParts.push("chxt=" + chxt.join(","));
            urlParts.push("chxr=0,0," + maxX+",2|1,0," + maxY);
            urlParts.push("chg=" + (Math.round(1 * (1000 / maxX)) / 10) + "," + (Math.round(15 * (1000 / maxY)) / 10) + ",1,3");

            return String.format("https://chart.googleapis.com/chart?" + urlParts.join("&"));
        }

        function updateChart() {
            $chart.attr("src", buildSrc());
        }

        function makeDraggable($team) {
            $team.draggable({ helper: "clone", opacity: 0.50, scope: "teams" });
        }

        function makeDroppable($team) {
            $team.droppable({ scope: "teams", tolerance: "pointer",
                over: function (event, ui) {
                    var ind = $(this).data("index");
                    $(this).css("background-color", "#" + colors[ind]).css("color", "#fff");
                },
                out: function (event, ui) {
                    var ind = $(this).data("index");
                    $(this).css("background-color", "#fff").css("color", "#" + colors[ind]);
                },
                drop: function (event, ui) {
                    var $this = $(this),
                        ind = $this.data("index"),
                        $team = ui.draggable;

                    var team = teamsHash[$team.data("teamIndex")];
                    if (team) {

                        teams[ind] = team;
                        updateChart();

                        $this.empty()
                            .css("background-color", "#fff")
                            .css("color", "#" + colors[ind])
                            .append(createCurrentElement(ind, team))
                            .droppable("disable");

                        $this.data("teamIndex", $team.data("teamIndex"));

                        $team.removeClass("selectable").addClass("selected").draggable("disable");
                    }
                }
            });
        }

        function createTeamElement(i, tm) {
            var text = String.format("{0}. {1} ({2})", (i + 1), tm.name, tm.oPoints);
            var $result = $("<table><tr><td></td><td>" + text + "</td></tr></table>");
            $result.find("td").first().append($("<span class='flag flag-" + tm.code + "'></span>").css("height", 16).css("border", "none").css("border-bottom", "1px solid #666"));
            return $result;
        }
        function createCurrentElement(i, tm) {
            var text = String.format("{0}. {1} ({2})", (i + 1), tm.name, tm.oPoints);
            var $result = $("<table><tr><td>" + text + "</td><td><span class='ui-icon ui-icon-circle-close'></span></td></tr></table>");
            $result.data("index", i);
            $result.find("span.ui-icon").css("cursor", "pointer").click(function () {
                var $this = $(this),
                    ind = $this.closest("table").data("index");

                teams[ind] = null;
                updateChart();

                var $ct = $this.closest("li");
                $ct.droppable("enable");
                $teams.find("#t_" + $ct.data("teamIndex")).removeClass("selected").addClass("selectable").draggable("enable");

                $this.closest("tr")
                    .empty()
                    .append("<td>Grafiğe eklemek istediğiniz takımı bu alana taşıyın</td>");
            });
            return $result;
        }

        $.each(this._tournament.getStandings(), function (ind, team) {
            teamsHash[ind] = team;
            var $team = $("<li />")
                .addClass(ind < 2 ? "selected" : "selectable")
                .attr("id", "t_" + ind)
                .appendTo($teams)
                .append(createTeamElement(ind, team));

            $team.data("teamIndex", ind);

            makeDraggable($team);

            if (ind < 3) {
                if (ind < 2) {
                    $team.draggable("disable");
                }

                var $currentTeam = $("<li />")
                    .addClass("current")
                    .css("color", "#" + colors[ind])
                    .appendTo($current);

                $currentTeam.data("index", ind);
                $currentTeam.data("teamIndex", ind);
                makeDroppable($currentTeam);
                if (ind < 2) {
                    $currentTeam.append(createCurrentElement(ind, team));
                    $currentTeam.droppable("disable");
                    teams.push(team);
                }
                else {
                    $currentTeam.append("<table><tr><td>Grafiğe eklemek istediğiniz takımı bu alana taşıyın</td></tr></table>");
                    teams.push(null);
                }
            }
        });

        updateChart();
    }
};

Tournament.createIn = function (container, options) {
    var t = new Tournament(options);
    t._createIn(container);
}
