﻿var FanSkill = {};

FanSkill.ScoreSheet = (function () {

    var _grpArr = new Array();
    var _runonce = false;

    var _PlayerList = null;
    var _PickedPlayers = new Array();
    var _PlayerGroupPositions = null;

    var _GameOptions = {
        UserId: 0,
        GameId: 0,
        GameDate: '',
        SeasonId: 0,
        PageIdx: 1,
        PageSize: 20,
        TotalPage: 0,
        GroupingId: 0,
        SearchPhrase: '',
        SpecificGame: 0,
        EntryFee: 0,
        EntryCount: 0,
        TotalPrize: 0,
        PayoutTypeId: 0,
        PayoutCount: 0
    };

    var _playerListFilter = {
        "PlayerSearchPhrase": '',
        "Statistic": ''
    };

    var _Dialog = null;

    /*
    ** GET GAME INFO
    */
    function _GetGameDetail() {

        $.getJSON("Services/MasterService.svc/GetGameInfo",
        {
            'GameId': _GameOptions.GameId,
            'UserId': _GameOptions.UserId,
            'TotalPrize': _GameOptions.TotalPrize,
            'PayoutCount': _GameOptions.PayoutCount
        },
        function (responseData) {

            var jData = $.parseJSON(responseData.d);

            var ddlStats = $('#ddlStatistic');

            ddlStats.html('');

            // populate the grouping Dropdown
            $(jData.GroupingSport).each(function (key, val) {
                ddlStats.append('<option value="' + val.GroupingId + '">' + val.GroupingName + '</option>')
            });


            ddlStats = $('#ddlTodaysGames');

            ddlStats.html('');
            ddlStats.append('<option value="0">All Games</option>')

            // populate the today games Dropdown
            $(jData.TodayGames).each(function (key, val) {
                ddlStats.append('<option value="' + val.CompetitionId + '">' + val.HomeTeamShortName + '@' + val.AwayTeamShortName + '</option>')
            });

            var slot = 0;

            $(jData.GroupingSport).each(function (key, val) {

                _grpArr[key] = {
                    "GroupingName": val.GroupingName,
                    "Slots": val.AvailableSpot,
                    "SlotLeft": val.AvailableSpot,
                    "GroupingId": val.GroupingId
                };

                for (var i = 0; i < val.AvailableSpot; i++) {

                    slot++;

                    $('#fantasyTeam').append('<li groupingId=' + val.GroupingId + ' class="playerPicked stats_' + val.GroupingId + '"><span>' + val.GroupingName + '</span><div></div></li>');

                }

            });

            // Initiate Game Info Display
            _GameOptions.EntryFee = jData.EntryFee;
            _GameOptions.EntryCount = jData.EntryCount;
            _GameOptions.PayoutTypeId = jData.PayoutTypeId;
            _GameOptions.SeasonId = jData.SeasonId;
            _GameOptions.GameDate = jData.StartDate;
            _GameOptions.TotalPrize = jData.TotalPrize;
            _GameOptions.PayoutCount = jData.PayoutCount;
            //


            $('#entryCount').text(_GameOptions.EntryCount);
            $('#entryFeeValue').text(_GameOptions.EntryFee);
            $('.capAmmount').text(_GameOptions.TotalPrize);
            $('#numPaidOut').text(_GameOptions.PayoutCount);

            if (jData.UserPickPlayers != null) {
                // Set PickedPlayer List 
                _PickedPlayers = jData.UserPickPlayers;
            }
            // Initiate the grouping game option for the player list.
            _GameOptions.GroupingId = _grpArr[0].GroupingId;
            _GetPlayerListData();


            //Debug(jData);

        });


    }


    function CleanPlayerList() {

        $('.playerPicked').each(function () {

            var playerId = $(this).children('div').attr('id');

            $('tr#player_' + playerId.split('_')[1]).hide();

        });

    }

    function _GeneratePlayerListTable(data) {

        var table = $('#playerListContainer table tbody');
        table.html('');

        $(data).each(function (key, val) {

            table.append("<tr></tr>");

            var tr = $("tr:last", table);

            tr.attr('player', val.PlayerId);

            tr.append('<td class="playersName"><span class="playerName">' + val.Name + '</span><span class="playerPos">(' + val.ShortPosition + ')</span></td>');
            tr.append('<td class="FSA">' + val.FSA + '</td>');
            tr.append('<td class="matchup">' + val.PlayerTeam + '@' + val.AwayTeam + '</td>');
            tr.append('<td class="select"><a class="selectPlayer" href="#">&nbsp;</a></td>');

        });

        $("#playerListContainer table tbody tr:even").addClass("alt");


    }


    function _FindGroupingObj(groupingId) {

        var obj;

        for (var i = 0; i < _grpArr.length; i++) {

            if (_grpArr[i].GroupingId == groupingId) {

                obj = _grpArr[i];
                break;
            }

        }

        return obj;

    }

    function _FindPickedPlayer(playerId) {

        var obj;

        for (var i = 0; i < _PickedPlayers.length; i++) {

            if (_PickedPlayers[i].PlayerId == playerId) {

                obj = _PickedPlayers[i];
                break;
            }

        }

        return obj;

    }


    function _AddPickedPlayerToList(groupingId, playerId, playerName, pos) {

        var obj = _FindGroupingObj(groupingId);

        if (obj.SlotLeft == 0) {
            alert('no more!');
        } else {

            obj.SlotLeft--;

            $('.stats_' + obj.GroupingId).each(function () {

                if ($(this).children('div').html() == '') {

                    $(this).children('div').attr('id', playerId);
                    $(this).children('div').addClass('clearfix').html(playerName + ' ' + pos + ' <a class="remPickedPlayer" href="#"><img src="../../images/ss_RemovePlayer.jpg"/></a>');

                    return false;
                }

            });

            $("#playerListContainer table tbody tr").removeClass('alt');
            $("#playerListContainer table tbody tr:even").addClass("alt");
        }


    }

    function _FilterPlayerLists(playersList) {
        var arr = new Array();
        var isPicked = false;

        for (var i = 0; i < playersList.length; i++) {
            if (_PickedPlayers != null) {
                for (var i2 = 0; i2 < _PickedPlayers.length; i2++) {
                    if (playersList[i].PlayerId == _PickedPlayers[i2].PlayerId) {
                        isPicked = true;
                    }
                }
            }
            if (!isPicked) {
                arr.push(playersList[i]);
            }
            isPicked = false;
        }

        return arr;
    }

    function _FilterPlayerListsWithOldPickPlayers(playersList, PickedPlayers) {
        var arr = new Array();
        var isPicked = false;
        var lastPickGroupingId = 0;


        for (var i = 0; i < playersList.length; i++) {

            for (var i2 = 0; i2 < PickedPlayers.length; i2++) {

                if (playersList[i].PlayerId == PickedPlayers[i2].PlayerId) {
                    isPicked = true;
                    lastPickGroupingId = PickedPlayers[i2].GroupingId;
                }
            }

            if (!isPicked) {
                arr.push(playersList[i]);
            }
            isPicked = false;
        }

        return arr;
    }

    function _GetPlayerListData() {

        $.getJSON("Services/MasterService.svc/GetPlayerLists",
            {
                "PlayerSearchPhrase": _GameOptions.SearchPhrase,
                "GroupingId": _GameOptions.GroupingId,
                "Date": _GameOptions.GameDate,
                "SeasonId": _GameOptions.SeasonId,
                "PageIdx": _GameOptions.PageIdx,
                "PageSize": _GameOptions.PageSize,
                "SpecificGameId": _GameOptions.SpecificGame
            }, function (responseData) {

                //Debug(responseData.d);

                var playerListContainer = $("#playerListContainer");

                var da = $.parseJSON(responseData.d);

                // Set Playerlist in memory
                _PlayerList = da.PlayersList;

                var playersCount = da.playersCount;

                // Get Player Group positions
                _PlayerGroupPositions = da.PlayerGroupPositions;

                if (!_runonce) {
                    // Filter out pickedPlayers
                    if (_PickedPlayers != null) {
                        if (_PickedPlayers.length > 0) {
                            _PlayerList = _FilterPlayerListsWithOldPickPlayers(_PlayerList, _PickedPlayers)

                            for (var i = 0; i < _PickedPlayers.length; i++) {
                                //groupingId,playerId,playerName,pos
                                _AddPickedPlayerToList(_PickedPlayers[i].GroupingId, _PickedPlayers[i].PlayerId, _PickedPlayers[i].Name, _PickedPlayers[i].ShortPosition);
                            }

                        }
                    }

                    _runonce = true;
                }
                else {
                    _PlayerList = _FilterPlayerLists(_PlayerList);
                }

                // Generate player list table 
                _GeneratePlayerListTable(_PlayerList);

                // not use
                _GameOptions.TotalPage = Math.floor(playersCount / _GameOptions.PageSize);


                // Check if it was a search perform by the user
                if (_GameOptions.SearchPhrase != '') {


                    var as = '{0} Players Founds - <a id="lnkClearSearch" href="#">Clear</a>'.format(playersCount);

                    $('#searchResult').remove();

                    $('#playerList').before($('<div/>', {
                        id: 'searchResult'
                    }).html(as));

                }

                $('#lnkClearSearch').click(function (e) {
                    e.preventDefault();
                    $('#txtPlayerSearch').val('');
                    $('#searchResult').remove();
                    _GetPlayerListData();
                });

                // Init
                //                if (!_runonce) {

                //                    // Build the Pagination 
                //                    table = $('#playerList tfoot');

                //                    table.append("<tr></tr>");
                //                    var tr = $('tr:last',table);

                //                    var html = '<td id="pagination" colspan="4">';
                //                            html += '<ul>';
                //                                html += '<li><a id="lnkFirstPage" href="#"><<</a></li>';
                //                                html += '<li><a id="lnkPreviousPage" class="disabled" href="#"><</a></li>';
                //                                html += '<li><input id="txtCurrentPage" type="text" /></li>';
                //                                html += '<li><label id="lblTotalPage"></label></li>';
                //                                html += '<li><a id="lnkNextPage" href="#">></a></li>';
                //                                html += '<li><a id="lnkLastPage" href="#">>></a></li>';
                //                            html += '</ul>';
                //                        html += '</td>';

                //                    tr.append(html);

                //                     
                //                    $('#lnkNextPage').click(function(e) {
                //                        e.preventDefault();

                //                        _getNextPage();
                //                    });

                //                    $('#lnkPreviousPage').click(function(e) {
                //                        e.preventDefault();

                //                        _getPreviousPage();
                //                    });

                //                    $('#lnkFirstPage').click(function(e) {
                //                        e.preventDefault();
                //                        _gotoPage(1);
                //                       $('#lnkPreviousPage').addClass('disabled');
                //                       _PaginationLinkDisableCheck($('#lnkNextPage'));
                //                    });

                //                    $('#lnkLastPage').click(function(e) {
                //                        e.preventDefault();
                //                        _gotoPage(_GameOptions.TotalPage);
                //                          $('#lnkNextPage').addClass('disabled');
                //                          _PaginationLinkDisableCheck($('#lnkPreviousPage'));
                //                    });

                //                    _runonce = true;

                //               }

                //               $('#lblTotalPage').text(_GameOptions.TotalPage);
                //               $('#txtCurrentPage').val(_GameOptions.PageIdx);


                // Still use??
                CleanPlayerList();

            });
    }

    function _getPreviousPage() {

        if (_GameOptions.PageIdx > 1) {
            _GameOptions.PageIdx--;
            _GetPlayerListData();

            if (_GameOptions.PageIdx == 1) {
                $('#lnkPreviousPage').addClass('disabled');
            }

            _PaginationLinkDisableCheck($('#lnkNextPage'));

        }

    }

    function _PaginationLinkDisableCheck(lnk) {

        if (lnk.hasClass('disabled')) {
            lnk.removeClass('disabled');
        }
    }

    function _getNextPage() {

        if (_GameOptions.PageIdx < _GameOptions.TotalPage) {
            _GameOptions.PageIdx++;
            _GetPlayerListData();

            if (_GameOptions.PageIdx == _GameOptions.TotalPage) {
                $('#lnkNextPage').addClass('disabled');
            }

            _PaginationLinkDisableCheck($('#lnkPreviousPage'));

        }

    }

    function _gotoPage(pageIdx) {
        _GameOptions.PageIdx = pageIdx;
        _GetPlayerListData();
    }

    function _CheckRemovedPlayer(currentGroupingId, ShortPosition) {
        //alert('Test');

        for (var i = 0; i < _PlayerGroupPositions.length; i++) {

            if (_PlayerGroupPositions[i].GroupingId == currentGroupingId) {
                for (var i = 0; i < _PlayerGroupPositions.length; i++) {
                    if (_PlayerGroupPositions[i].ShortPos == ShortPosition) {
                        return true;
                    }
                }
            }

            else {
                return false;
            }
        }
    }

    function _ConfirmSubmit() {

        var FinalEntryFee = _GameOptions.EntryFee + (_GameOptions.EntryFee * 0.10);
        FinalEntryFee = FinalEntryFee.toFixed(2);

        var $diaSubmit = $('<div>');
        $diaSubmit.append('<p style="font-size:20px; padding-bottom:10px;">Please confirm that the amount of <span style="color:red;">$' + FinalEntryFee + '</span> will taken from your account balance.</p>');
        $diaSubmit.append('<a id="BtnCancel" style="top:2px; margin-right:20px;" href="#"><img src="/images/cancelred.png" alt="" border="0" /></a>');
        $diaSubmit.append('<a id="BtnConfirm" href="#"><img src="/images/confirm.png" alt="" border="0" /></a>');
        $diaSubmit.append('</div>');


        $diaSubmit.dialog({
            resizable: false,
            title: "Confirm Submit",
            width: "410",
            height: "140",
            modal: true,
            close: function () {
                $diaSubmit.remove();
            }
        });

        $('#BtnCancel').click(function (e) {
            $diaSubmit.remove();
        });

        $('#BtnConfirm').click(function (e) {
            e.preventDefault();
            FanSkill.ScoreSheet.ConfirmEntryFee();
            $diaSubmit.remove();
            $(_Dialog).remove();
            _SendToUpcomGames();
        });

    }

    function _SendToUpcomGames() {
         window.location.replace("MyAccount.aspx#UpcomGames");
    }

    function _CheckUserAlreadyJoinGame() {
        $.getJSON("Services/MasterService.svc/CheckUserAlreadyJoinGame",
            {
                "GameId": _GameOptions.GameId,
                "UserId": _GameOptions.UserId
            }, function (data) {
                var jData = $.parseJSON(data.d);
                if (jData == false) {
                    _ConfirmSubmit();
                }
                else {
                    $(_Dialog).remove();
                    reloadPage();
                }
            });

    }

    function _ShowPayout() {


        $.getJSON("Services/MasterService.svc/GetPayoutDetails",
            {
                "payoutId": _GameOptions.PayoutTypeId
            }, function (data) {

                var $dia = $('<div></div>');

                $dia.append('<table><thead></thead><tbody></tbody></table>');

                var thead = $($dia, 'thead');
                var tbody = $($dia, "tbody");

                thead.html("");
                tbody.html("");

                var jData = $.parseJSON(data.d);

                var nbRanks = jData.NBRanks;

                var tr = null;

                var thTitle = "";

                $("<tr/>").appendTo(thead);

                var tr = $("tr:last", thead);



                for (var i = 0; i < nbRanks; i++) {

                    thTitle = (i + 1);

                    if (i == 0) {
                        thTitle += "ST";
                    } else if (i == 1 || i == 2) {
                        thTitle += "RD";
                    } else {
                        thTitle += "TH";
                    }

                    $("<th/>", { html: thTitle }).appendTo(tr);

                    $(tr).addClass("diaPayoutTh");

                }

                var arr = $.parseJSON(jData.PayoutFormula);

                $("<tr/>").appendTo(tbody);

                tr = $("tr:last", tbody);

                for (var i = 0; i < arr.length; i++) {

                    var minRank = arr[i].MinRank;
                    var maxRank = arr[i].MaxRank;
                    var diff = maxRank - minRank;

                    for (var i2 = 0; i2 <= diff; i2++) {
                        $("<td/>", { text: arr[i].Percentage + "%" }).appendTo(tr);
                        $(tr).addClass("diaPayoutTr");
                    }

                }

                var dialogWitdh = _GameOptions.PayoutCount * 55;
                dialogWitdh = dialogWitdh + "px";

                $dia.dialog({
                    title: "Top Paid Out",
                    width: dialogWitdh,
                    height: "100",
                    modal: true,
                    close: function () {
                        $dia.remove();
                    }
                });
                $(".ui-dialog-titlebar").show();
                $(".ui-dialog .ui-dialog-content").css('background', 'black');

            });
    }

    return { // PUBLIC

        init: function (gameOptions) {

            window.scrollTo(10, 0);

            _Dialog = $("<div></div>").load(formPath + "PickPlayers.htm", function () {

                _GameOptions.GameId = gameOptions.GameId;
                _GameOptions.GameDate = gameOptions.GameDate;
                _GameOptions.SeasonId = gameOptions.SeasonId;
                _GameOptions.PageIdx = gameOptions.PageIdx;
                _GameOptions.PageSize = gameOptions.PageSize;
                _GameOptions.UserId = gameOptions.UserId;


                _GetGameDetail();

                $('.remPickedPlayer').live('click', function (e) {
                    e.preventDefault();
                    FanSkill.ScoreSheet.RemovePlayerFromTeam($(this));
                });

                $('#lnkSaveSelection').click(function (e) {
                    e.preventDefault();
                    FanSkill.ScoreSheet.submitTeam();
                    _CheckUserAlreadyJoinGame();

                });

                $('.selectPlayer').live('click', function (e) {
                    e.preventDefault();
                    FanSkill.ScoreSheet.AddPlayerToTeam($(this), $('#ddlStatistic').val());
                });

                // Bind #ddlTodaysGames Change Event to filter 
                $('#ddlTodaysGames').change(function () {
                    _GameOptions.PageIdx = 1;
                    _GameOptions.SpecificGame = $(this).val();
                    _GetPlayerListData();
                });

                $('#ddlStatistic').change(function () {
                    _GameOptions.GroupingId = $(this).val();
                    _GetPlayerListData();
                });

                $('#btnSearchPlayer').click(function (e) {
                    e.preventDefault();
                    FanSkill.ScoreSheet.getPlayersList();
                });

                $('#lnkPayoutDetail').click(function (e) {
                    e.preventDefault();
                    _ShowPayout();
                });

                $('#lnkClearSearch').live('click', function (e) {
                    e.preventDefault();
                    $('#txtPlayerSearch').val();

                    _GameOptions.SearchPhrase = $('#txtPlayerSearch').val();
                    _GameOptions.GroupingId = $('#ddlStatistic option:selected').val();
                    _GetPlayerListData();

                });

                $("#LearnMoreRulesLink").click(function () {
                    window.scrollTo(10, 0);
                    $("#divHelpRules").dialog(
                    {
                        height: 525,
                        width: 600,
                        buttons: {
                            close: function () {
                                $('#divHelpRules').dialog('close');

                            }

                        }

                    });

                    $(".ui-widget .ui-widget-content").css('background', 'url("images/ui-bg_flat_100_0c0c0c_40x100.png") repeat-x scroll 50% 50% #FFFFFF');
                    $(".ui-widget .ui-widget-content").css('color', '#000000');
                    $("#divHelpRules").scrollTop();

                });

            }).dialog({
                resizable: false,
                title: "PickSheet",
                width: "1028",
                height: "765",
                position: 'top',
                modal: true,
                close: function () {
                    $(_Dialog).remove();
                    _runonce = false;
                }
            });
            $(".ui-dialog-titlebar").show();
            $(".ui-dialog .ui-dialog-content").css('background', 'white');
        },

        submitTeam: function () {

            var pickedPlayer = [];
            var jData;
            $('li.playerPicked').each(function () {

                var playerId = $(this).children('div').attr('id');
                var groupingId = $(this).attr('class').split(' ')[1].split('_')[1];

                if (playerId != "") {
                    pickedPlayer.push({
                        "PlayerId": playerId,
                        "GroupingId": groupingId
                    });
                }
            });

            jData = {
                "UserId": _GameOptions.UserId,
                "GameId": _GameOptions.GameId,
                "PickedPlayer": pickedPlayer
            };

            $.ajax({
                type: "POST",
                url: "services/masterService.svc/SavePlayerSelection",
                data: $.toJSON(jData),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                processdata: true,
                async: false,
                success: function (msg) {
                },
                error: ServiceFailed
            });

        },
        AddPlayerToTeam: function (link, groupingId) {

            var obj = _FindGroupingObj(groupingId);

            if (obj.SlotLeft == 0) {
                alert('no more!');
            } else {

                obj.SlotLeft--;

                $('.stats_' + obj.GroupingId).each(function () {

                    if ($(this).children('div').html() == '') {

                        var tr = link.parent().parent();

                        var playerName = $(tr).find('.playerName').text();

                        var pos = $(tr).find('.playerPos').text();
                        pos = pos.replace('(', '');
                        pos = pos.replace(')', '');

                        //alert(pos);

                        var playerId = tr.attr('player');

                        var fsa = tr.children()[1].innerText;
                        var playerTeam = tr.children()[2].innerText.split('@')[0];
                        var awayTeam = tr.children()[2].innerText.split('@')[1];


                        _PickedPlayers.push({
                            PlayerId: playerId,
                            Name: playerName,
                            ShortPosition: pos,
                            FSA: fsa,
                            PlayerTeam: playerTeam,
                            AwayTeam: awayTeam,
                            GroupingId: groupingId
                        })


                        $(this).children('div').attr('id', playerId);
                        $(this).children('div').addClass('clearfix').html(playerName + ' ' + pos + ' <a class="remPickedPlayer" href="#"><img src="../../images/ss_RemovePlayer.jpg"/></a>');

                        tr.remove();

                        return false;
                    }

                });

                $("#playerListContainer table tbody tr").removeClass('alt');
                $("#playerListContainer table tbody tr:even").addClass("alt");
            }
        },
        RemovePlayerFromTeam: function (elem) {
            var playerId = elem.parent().attr('id');

            var player = _FindPickedPlayer(playerId);

            var obj = _FindGroupingObj(player.GroupingId);

            // find player object index  
            var objIdx = _PickedPlayers.indexOf(player);

            // Remove picked player 
            _PickedPlayers.splice(objIdx, 1);

            obj.SlotLeft++;

            var currentGroupingId = $('#ddlStatistic option:selected').val();

            var CheckedRemoved = _CheckRemovedPlayer(currentGroupingId, player.ShortPosition);

            if (CheckedRemoved == true) {

                var table = $('#playerListContainer table tbody tr');
                var i = 0;

                $('.FSA').each(function () {

                    var FsaValue = $(this).text();
                    var intPlayerFsa;

                    intPlayerFsa = parseInt(player.FSA);
                    if (intPlayerFsa > FsaValue) {

                        var tr = $("<tr>");
                        tr.attr('player', player.PlayerId);
                        tr.append('<td class="playersName"><span class="playerName">' + player.Name + '</span><span class="playerPos">(' + player.ShortPosition + ')</span></td>');
                        tr.append('<td class="FSA">' + intPlayerFsa + '</td>');
                        tr.append('<td class="matchup">' + player.PlayerTeam + '@' + player.AwayTeam + '</td>');
                        tr.append('<td class="select"><a class="selectPlayer" href="#">&nbsp;</a></td></tr>');

                        $(this).parent('tr').before(tr);

                        $("#playerListContainer table tbody tr").removeClass('alt');
                        $("#playerListContainer table tbody tr:even").addClass("alt");

                        return false;
                    }

                    i++;

                });

            }
            elem.parent().removeAttr('id')
            elem.parent().html('');
        },
        getPlayersList: function () {

            _GameOptions.SearchPhrase = $('#txtPlayerSearch').val();
            _GameOptions.GroupingId = $('#ddlStatistic option:selected').val();
            _GameOptions.SpecificGame = $('#ddlTodaysGames:selected').val();

            _GetPlayerListData();

        },
        ConfirmEntryFee: function () {
            var EntryFee = _GameOptions.EntryFee + (_GameOptions.EntryFee * 0.10);

            var jData;

            jData = {
                "UserId": _GameOptions.UserId,
                "GameId": _GameOptions.GameId,
                "EntryFee": EntryFee
            };

            $.ajax({
                type: "POST",
                url: "services/masterService.svc/FinanceEntreFeeTransaction",
                data: $.toJSON(jData),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                processdata: true,
                async: false,
                success: function (msg) {
                },
                error: ServiceFailed
            });
        }


    };
    // End Return

})();

function reloadPage() {
    window.location.reload()
    _runonce = false;
}

function ServiceFailed(result) {
    alert('Service call failed: ' + result.status + '' + result.statusText);
    ResetVar();
}
// Extention Helper Functions 

String.prototype.format = function () {
    var args = arguments;
    return this.replace(/{(\d+)}/g, function (match, number) {
        return typeof args[number] != 'undefined'
      ? args[number]
      : '{' + number + '}'
    ;
    });
};

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function (obj, fromIndex) {
    if (fromIndex == null) {
        fromIndex = 0;
    } else if (fromIndex < 0) {
        fromIndex = Math.max(0, this.length + fromIndex);
    }
    for (var i = fromIndex, j = this.length; i < j; i++) {
        if (this[i] === obj)
            return i;
    }
    return -1;
  };
}
