﻿Sys.Application.add_init(function ()
{
    BetsCart.LoadBetsCart();
});

Array.prototype.contains = function (obj)
{
    var i = this.length;
    while (i--)
    {
        if (this[i] === obj)
            return true;
    }

    return false;
}

function BetsCartItemClass()
{
    this.OutcomeID = new Number();
    this.SportEventLocalizedName = new String();
    this.OutcomesBlockLocalizedName = new String();
    this.LocalizedFactorTitle = new String();
    this.FactorValue = new String();
}

function BetsCartClass()
{
    this.objBetsCart = new Object();
    this.objBetsCartItemsCollection = new Object();
    this.betsCartOutcomesArray = new Array();
    this.strBetsCartItemsCountCookieName = "oybetscartitemscount"
    this.strCookieName = "oybetscart";
    this.nCookieBufferSize = 10;
}

BetsCartClass.prototype.LoadBetsCart = function ()
{
    var objOCLinksArray = $("a.oc");
    objOCLinksArray.each(function (index)
    {
        $(this).click(BetsCart.AddOutcomeToCart);
    });

    this.objBetsCart = document.getElementById("BetsCart");
    this.objBetsCartItemsCollection = this.objBetsCart.getElementsByTagName("ul")[0];

    this.LoadCartFromCookies();

    $("img.bClose", this.objBetsCart).each(function (index)
    {
        $(this).click(BetsCart.RemoveOutcomeFromCart);
    });
}

BetsCartClass.prototype.AddOutcomeToCart = function (e)
{
    var nOutcomeID = parseInt(e.target.rel);
    var strFactorValue = $(e.target).text();

    var bRepeatedOutcome = BetsCart.betsCartOutcomesArray.contains(nOutcomeID);

    if (0 < nOutcomeID && !bRepeatedOutcome)
    {
        var objBetsCartMapper = new BetsCartMapperClass();
        objBetsCartMapper.GetBetsCartItem(nOutcomeID, function (response)
        {
            BetsCart.GetBetsCartItemCallback(response, strFactorValue);
        }, this.AddOutcomeToCartError);
    }

    return false;
}

BetsCartClass.prototype.GetBetsCartItemCallback = function (response, strFactorValue)
{
    var BetsCartItem = new BetsCartItemClass();

    BetsCartItem.OutcomeID = response.OutcomeID;
    BetsCartItem.SportEventLocalizedName = response.SportEventLocalizedName;
    BetsCartItem.OutcomesBlockLocalizedName = response.OutcomesBlockLocalizedName;
    BetsCartItem.LocalizedFactorTitle = response.LocalizedFactorTitle;
    BetsCartItem.FactorValue = strFactorValue;

    this.AppendBetsCartItem(BetsCartItem);

    if (0 < this.objBetsCartItemsCollection.childNodes.length &&
    this.objBetsCartItemsCollection.childNodes[0].className == "")
        this.objBetsCartItemsCollection.childNodes[0].className = "firstListItem";

    this.StoreCartToCookies();
}

BetsCartClass.prototype.AddOutcomeToCartError = function (data)
{
}

BetsCartClass.prototype.RemoveOutcomeFromCart = function (e)
{
    var objEventTarget;
    if (!e)
        var e = window.event;
    if (e.target)
        objEventTarget = e.target;
    else
    {
        if (e.srcElement)
            objEventTarget = e.srcElement;
    }

    $(objEventTarget).unbind();

    var objBetItemNode = objEventTarget.parentNode.parentNode.parentNode.parentNode.parentNode;

    BetsCart.objBetsCartItemsCollection.removeChild(objBetItemNode);

    if (0 < BetsCart.objBetsCartItemsCollection.childNodes.length &&
    BetsCart.objBetsCartItemsCollection.childNodes[0].className == "")
        BetsCart.objBetsCartItemsCollection.childNodes[0].className = "firstListItem";

    BetsCart.StoreCartToCookies();

    return false;
}

BetsCartClass.prototype.AppendBetsCartItem = function (betsCartItem)
{
    var objBetsCartItem = document.createElement("li");

    var objTable = document.createElement("table");
    objTable.setAttribute("cellpadding", "0");
    objTable.setAttribute("cellspacing", "0");
    objTable.setAttribute("border", "0");

    var objTBody = document.createElement("tbody");

    objTable.appendChild(objTBody);

    objTBody.insertRow(0);

    var objHeaderCell = document.createElement("th");

    var objBetItemHeader = document.createElement("h4");

    var objBetItemHeaderText = document.createTextNode(betsCartItem.SportEventLocalizedName);
    var objBetItemHeaderBreak = document.createElement("br");
    var objBetItemHeaderSpan = document.createElement("span");
    var objBetItemHeaderSpanText = document.createTextNode(betsCartItem.OutcomesBlockLocalizedName);

    objBetItemHeaderSpan.appendChild(objBetItemHeaderSpanText);
    objBetItemHeader.appendChild(objBetItemHeaderText);
    objBetItemHeader.appendChild(objBetItemHeaderBreak);
    objBetItemHeader.appendChild(objBetItemHeaderSpan);

    objHeaderCell.appendChild(objBetItemHeader);

    objTBody.rows[0].appendChild(objHeaderCell);

    objHeaderCell = document.createElement("th");
    objHeaderCell.className = "factorColumn";

    var objBetItemRemoveButton = document.createElement("img");
    objBetItemRemoveButton.className = "bClose";
    objBetItemRemoveButton.src = "/Images/empty_pixel.gif";
    objBetItemRemoveButton.alt = "Удалить";
    objBetItemRemoveButton.onclick = BetsCart.RemoveOutcomeFromCart;

    objHeaderCell.appendChild(objBetItemRemoveButton);

    objTBody.rows[0].appendChild(objHeaderCell);

    objTBody.insertRow(1);

    objTBody.rows[1].insertCell(0);
    objTBody.rows[1].cells[0].appendChild(document.createTextNode(betsCartItem.LocalizedFactorTitle));

    objTBody.rows[1].insertCell(1);
    objTBody.rows[1].cells[1].className = "factorColumn";

    var objOutcomeHiddenInput = document.createElement("input");
    objOutcomeHiddenInput.type = "hidden";
    objOutcomeHiddenInput.value = betsCartItem.OutcomeID;

    objTBody.rows[1].cells[1].appendChild(objOutcomeHiddenInput);
    objTBody.rows[1].cells[1].appendChild(document.createTextNode(betsCartItem.FactorValue));

    objBetsCartItem.appendChild(objTable);

    this.objBetsCartItemsCollection.appendChild(objBetsCartItem);
}

BetsCartClass.prototype.StoreCartToCookies = function ()
{
    var betItemsArray = new Array();

    for (var i = 0; i < this.objBetsCartItemsCollection.childNodes.length; i++)
    {
        var objBetsCartItem = this.objBetsCartItemsCollection.childNodes[i];
        if (objBetsCartItem.nodeType == 1) // Node.ELEMENT_NODE
        {
            var BetsCartItem = new BetsCartItemClass();

            var objTBody = objBetsCartItem.getElementsByTagName("table")[0].tBodies[0];

            var objFirstRow = objTBody.rows[0];
            var objItemHeader = objFirstRow.cells[0].getElementsByTagName("h4")[0];
            BetsCartItem.SportEventLocalizedName = objItemHeader.firstChild.nodeValue;
            BetsCartItem.OutcomesBlockLocalizedName = objItemHeader.lastChild.firstChild.nodeValue;

            var objSecondRow = objTBody.rows[1];
            BetsCartItem.LocalizedFactorTitle = objSecondRow.cells[0].firstChild.nodeValue;

            var objSecondRowSecondCell = objSecondRow.cells[1];
            BetsCartItem.OutcomeID = parseInt(objSecondRowSecondCell.firstChild.value);
            BetsCartItem.FactorValue = objSecondRowSecondCell.lastChild.nodeValue;

            betItemsArray.push(BetsCartItem);
        }
    }

    this.betsCartOutcomesArray = new Array();
    for (var i = 0; i < betItemsArray.length; i++)
    {
        this.betsCartOutcomesArray.push(betItemsArray[i].OutcomeID);
    }

    var nStorageCookiesCount = this.GetStorageCookiesCount(betItemsArray.length);

    var WorkWithCookies = new WorkWithCookiesClass();
    WorkWithCookies.Write(this.strBetsCartItemsCountCookieName, betItemsArray.length, null, null);

    for (var nCookieCounter = 0; nCookieCounter < nStorageCookiesCount; nCookieCounter++)
    {
        var strCookieFullName = this.GetStorageCookieFullName(nCookieCounter);

        var nStartPos = nCookieCounter * this.nCookieBufferSize;
        var nEndPos = nStartPos + this.nCookieBufferSize;
        if (betItemsArray.length < nEndPos)
            nEndPos = betItemsArray.length;

        var strBetsCartItemsSerialized = "{";
        for (var i = nStartPos; i < nEndPos; i++)
        {
            if (0 < i)
                strBetsCartItemsSerialized += ",";
            strBetsCartItemsSerialized += "[" + betItemsArray[i].OutcomeID + "|~|" + betItemsArray[i].SportEventLocalizedName + "|~|" + betItemsArray[i].OutcomesBlockLocalizedName + "|~|" + betItemsArray[i].LocalizedFactorTitle + "|~|" + betItemsArray[i].FactorValue + "]";
        }

        strBetsCartItemsSerialized += "}";

        WorkWithCookies.Write(strCookieFullName, strBetsCartItemsSerialized, null, null);
    }

    return false;
}

BetsCartClass.prototype.LoadCartFromCookies = function ()
{
    var WorkWithCookies = new WorkWithCookiesClass();
    var strCookieBody = WorkWithCookies.Read(this.strBetsCartItemsCountCookieName);

    var nItemsArrayLength = strCookieBody != null ? parseInt(strCookieBody) : undefined;
    if (nItemsArrayLength !== undefined)
    {
        var nStorageCookiesCount = this.GetStorageCookiesCount(nItemsArrayLength);

        var betItemsArray = new Array();

        for (var nCookieCounter = 0; nCookieCounter < nStorageCookiesCount; nCookieCounter++)
        {
            var strCookieFullName = this.GetStorageCookieFullName(nCookieCounter);

            strCookieBody = WorkWithCookies.Read(strCookieFullName);

            var strBetsCartChunkSerialized = strCookieBody != null ? strCookieBody.slice(1, -1) : undefined;
            if (strBetsCartChunkSerialized !== undefined)
            {
                var strChunkPattern = /(\[[^\[]*\])+/g;

                var matches = strBetsCartChunkSerialized.match(strChunkPattern);
                if (matches != null)
                {
                    for (var chunk = 0; chunk < matches.length; chunk++)
                    {
                        var strBetsCartItem = matches[chunk].slice(1, -1);

                        var betsCartItemsArray = strBetsCartItem.split(/\|\~\|/g);
                        if (betsCartItemsArray != null)
                        {
                            var BetsCartItem = new BetsCartItemClass();

                            BetsCartItem.OutcomeID = betsCartItemsArray[0];
                            BetsCartItem.SportEventLocalizedName = betsCartItemsArray[1];
                            BetsCartItem.OutcomesBlockLocalizedName = betsCartItemsArray[2];
                            BetsCartItem.LocalizedFactorTitle = betsCartItemsArray[3];
                            BetsCartItem.FactorValue = betsCartItemsArray[4];

                            betItemsArray.push(BetsCartItem);
                        }
                    }
                }
            }
        }

        for (var i = 0; i < betItemsArray.length; i++)
        {
            this.AppendBetsCartItem(betItemsArray[i]);
            this.betsCartOutcomesArray.push(betItemsArray[i].OutcomeID);
        }

        if (0 < this.objBetsCartItemsCollection.childNodes.length &&
        this.objBetsCartItemsCollection.childNodes[0].className == "")
            this.objBetsCartItemsCollection.childNodes[0].className = "firstListItem";
    }

    return false;
}

BetsCartClass.prototype.GetStorageCookiesCount = function (nBetItemsArrayLength)
{
    var nStorageCookiesCount = parseInt(nBetItemsArrayLength / this.nCookieBufferSize);
    if (0 < nBetItemsArrayLength % this.nCookieBufferSize)
        nStorageCookiesCount++;

    return nStorageCookiesCount;
}

BetsCartClass.prototype.GetStorageCookieFullName = function (nCookieCounter)
{
    var strCookieFullName = this.strCookieName;
    if (0 < nCookieCounter)
        strCookieFullName += nCookieCounter;

    return strCookieFullName;
}

var BetsCart = new BetsCartClass();
