var P_BASE = new Object();
var P_EXT_BASE = new Object();
var P_N_FOOTBALL_BASE = new Object();
var P_EGOIST_BASE = new Object();
var P_KINO = new Object();
var P_VIP_KINO = new Object();
var P_SPORT = new Object();
var P_SUPER_SPORT = new Object();
var P_N_FOOTBALL = new Object();
var P_NIGHT = new Object();
var P_HD = new Object();
var P_FAMILY = new Object();
var P_LITE = new Object();
var P_SMS = new Object();
var P_LITEPLUS = new Object();
var P_LIDERBASE = new Object;
var P_LIDER = new Object;
var P_OPENING = new Object;
var P_VIASAT = new Object;

/** битовые идентификаторы */
P_BASE.id = 1;
P_EXT_BASE.id = 1 << 1;
P_N_FOOTBALL_BASE.id = 1 << 2;
P_KINO.id = 1 << 3;
P_VIP_KINO.id = 1 << 4;
P_SPORT.id = 1 << 5;
P_SUPER_SPORT.id = 1 << 6;
P_N_FOOTBALL.id = 1 << 7;
P_NIGHT.id = 1 << 8;
P_HD.id = 1 << 9;
P_FAMILY.id = 1 << 10;
P_LITE.id = 1 << 11;
P_SMS.id = 1 << 12;
P_EGOIST_BASE.id = 1 << 13;
P_LITEPLUS.id = 1 << 15;
P_LIDERBASE.id = 1 << 16;
P_LIDER.id = 1 << 17;
P_OPENING.id = 1 << 18;
P_VIASAT.id = 1 << 19;

/**
 * битовые идентификаторы прав используются для проверки - больше ли новая
 * подписка, чем старая. все биты, установленные в старой подписке, должны быть
 * в новой
 */
var BASE_RIGHTS = 1;
var EXT_BASE_RIGHTS = 1 << 1;
var N_FOOTBALL_RIGHTS = 1 << 2;
var KINO_RIGHTS = 1 << 3;
var VIP_KINO_RIGHTS = 1 << 4;
var SPORT_RIGHTS = 1 << 5;
var SUPER_SPORT_RIGHTS = 1 << 6;
var NIGHT_RIGHTS = 1 << 7;
var HD_RIGHTS = 1 << 8;
var FAMILY_RIGHTS = 1 << 9;
var LITE_RIGHTS = 1 << 9;
var SMS_RIGHTS = 1 << 10;
var LIDER_RIGHTS = 1 << 11;
var OPENING_RIGHTS = 1 << 12;
var VIASAT_RIGHTS = 1 << 13;

P_LITE.rights = LITE_RIGHTS;
P_LITEPLUS.rights = P_LITE.rights | 1 << 12;
P_BASE.rights = P_LITEPLUS.rights | BASE_RIGHTS;
P_EXT_BASE.rights = P_BASE.rights | EXT_BASE_RIGHTS;
P_N_FOOTBALL_BASE.rights = N_FOOTBALL_RIGHTS;
P_KINO.rights = KINO_RIGHTS;
P_VIP_KINO.rights = KINO_RIGHTS | VIP_KINO_RIGHTS;
P_SPORT.rights = SPORT_RIGHTS;
P_SUPER_SPORT.rights = SPORT_RIGHTS | SUPER_SPORT_RIGHTS | N_FOOTBALL_RIGHTS;
P_N_FOOTBALL.rights = N_FOOTBALL_RIGHTS;
P_NIGHT.rights = NIGHT_RIGHTS;
P_HD.rights = HD_RIGHTS;
P_FAMILY.rights = FAMILY_RIGHTS;
P_SMS.rights = SMS_RIGHTS;
P_EGOIST_BASE.rights = EGOIST_RIGHTS;
P_LIDERBASE.rights = LIDER_RIGHTS;
P_LIDER.rights = LIDER_RIGHTS;
P_OPENING.rights = OPENING_RIGHTS;
P_VIASAT.rights = VIASAT_RIGHTS;

/** Названия пакетов */
P_BASE.name = "Базовый";
P_EXT_BASE.name = "Базовый Плюс";
P_N_FOOTBALL_BASE.name = "Наш футбол";
P_KINO.name = "Кино";
P_VIP_KINO.name = "VIP Кино";
P_SPORT.name = "Спорт";
P_SUPER_SPORT.name = "Суперспорт";
P_N_FOOTBALL.name = "Наш футбол";
P_NIGHT.name = "Ночной";
P_HD.name = "HD";
P_FAMILY.name = "Семейный";
P_LITE.name = "Лайт";
P_SMS.name = "СМС-Информ - отправка уведомлений об изменении счета на ваш телефон";
P_EGOIST_BASE.name = "Эгоист ТВ";
P_LITEPLUS.name = "Лайт Плюс";
P_LIDERBASE.name = "Лидер ТВ";
P_LIDER.name = "Лидер ТВ";
P_OPENING.name = "Открытие";
P_VIASAT.name = "Виасат"



/** названия пакетов для имен переменных */
P_BASE.vname = "base";
P_EXT_BASE.vname = "extbase";
P_LITEPLUS.vname = "liteplus";
P_N_FOOTBALL_BASE.vname = "nfootball";
P_KINO.vname = "kino";
P_VIP_KINO.vname = "vipkino";
P_SPORT.vname = "sport";
P_SUPER_SPORT.vname = "supersport";
P_N_FOOTBALL.vname = "nfootball";
P_NIGHT.vname = "night";
P_HD.vname = "hd";
P_FAMILY.vname = "family";
P_LITE.vname = "lite";
P_SMS.vname = "smsinform";
P_EGOIST_BASE.vname = "egoist";
P_LIDERBASE.vname = "lider";
P_LIDER.vname = "lider";
P_OPENING.vname = 'opening';
P_VIASAT.vname = 'viasat';


/** ЛАЙТ ПЛЮС */

var priceModifier = function(price)
{
    return price
};
var periodInfo = " руб. в месяц";
/** Группы пакетов */

var G_BASE = new Object();
var G_KINO = new Object();
var G_SPORT = new Object();
var G_N_FOOTBALL = new Object();
var G_NIGHT = new Object();
var G_HD = new Object();
var G_FAMILY = new Object();
var G_SERVICES = new Object();
var G_LIDER = new Object();
var G_OPENING = new Object();
var G_VIASAT = new Object();

G_BASE.id = "base";
G_KINO.id = "kino";
G_SPORT.id = "sport";
G_N_FOOTBALL.id = "nfootball";
G_NIGHT.id = "night";
G_HD.id = "hd";
G_FAMILY.id = "family";
G_SERVICES.id = "service"
G_LIDER.id = "lider";
G_OPENING.id = "opening";
G_VIASAT.id = "viasat";
G_SERVICES.title = "Дополнительные услуги";

G_BASE.req = true;
G_KINO.req = false;
G_SPORT.req = false;
G_N_FOOTBALL.req = false;
G_NIGHT.req = false;
G_HD.req = false;
G_LIDER.req = false;
G_FAMILY.req = false;
G_SERVICES.req = false;
G_FAMILY.disabled = true;
G_SERVICES.disabled = true;

G_BASE.pack = [ P_LITE, P_LITEPLUS, P_BASE, P_EXT_BASE, P_N_FOOTBALL_BASE, P_LIDERBASE ];
G_KINO.pack = [ P_KINO, P_VIP_KINO ];
G_SPORT.pack = [ P_SPORT, P_SUPER_SPORT ];
G_N_FOOTBALL.pack = [ P_N_FOOTBALL ];
G_NIGHT.pack = [ P_NIGHT ];
G_HD.pack = [ P_HD ];
G_FAMILY.pack = [ P_FAMILY ];
G_SERVICES.pack = [ P_SMS ];
G_LIDER.pack = [P_LIDER];
G_OPENING.pack = [P_OPENING];
G_VIASAT.pack = [P_VIASAT];

G_BASE.selection = P_LITE;
G_KINO.selection = null;
G_SPORT.selection = null;
G_N_FOOTBALL.selection = null;
G_NIGHT.selection = null;
G_HD.selection = null;
G_FAMILY.selection = null;
G_SERVICES.selection = null;
G_LIDER.selection=null;

var P_EGOIST = new Object();
P_EGOIST.id = 1 << 14;
var EGOIST_RIGHTS = 1 << 11;
P_EGOIST.rights = EGOIST_RIGHTS;
P_EGOIST.name = "Эгоист ТВ";
P_EGOIST.vname = "egoist";
P_EGOIST_BASE.size = 1;
var G_EGOIST = new Object();
G_EGOIST.id = "egoist";
G_EGOIST.pack = [ P_EGOIST ];

/** запрещенные комбинации */
P_SUPER_SPORT.restricted = [ P_N_FOOTBALL ];
P_N_FOOTBALL_BASE.restricted = [ P_SPORT, P_SUPER_SPORT, P_KINO, P_VIP_KINO,
        P_N_FOOTBALL, P_NIGHT, P_HD, P_FAMILY, P_OPENING, P_VIASAT];
P_LITE.restricted = [ P_SUPER_SPORT, P_VIP_KINO, P_HD, P_FAMILY, P_VIASAT ];
P_LITEPLUS.restricted = [ P_HD, P_FAMILY, P_VIASAT];
P_EGOIST_BASE.restricted = [ P_SPORT, P_SUPER_SPORT, P_KINO, P_VIP_KINO,
        P_NIGHT, P_HD, P_FAMILY, P_EGOIST, P_OPENING, P_VIASAT ];
P_LIDERBASE.restricted = [ P_SPORT, P_SUPER_SPORT, P_KINO, P_VIP_KINO, P_NIGHT, P_HD, P_LIDER, P_FAMILY, P_EGOIST, P_OPENING , P_VIASAT];

var GROUPS = [ G_BASE, G_KINO, G_NIGHT, G_SPORT, G_N_FOOTBALL, G_OPENING, G_VIASAT, G_HD, G_EGOIST, G_LIDER, 
        G_FAMILY, G_SERVICES ];

/** проставим каждому пакету его группу */
for (i in GROUPS)
{
    var group = GROUPS[i];
    for (j in group.pack)
    {
        group.pack[j].group = group;
    }
}

var prices = new Array();
/** базовый */
prices[P_BASE.id] = 550.0;
prices[P_BASE.id | P_KINO.id] = 850.0;
prices[P_BASE.id | P_SPORT.id] = 850.0;
prices[P_BASE.id | P_NIGHT.id] = 850.0;
prices[P_BASE.id | P_KINO.id | P_SPORT.id] = 1100.0;
prices[P_BASE.id | P_KINO.id | P_SUPER_SPORT.id] = 1400.0;
prices[P_BASE.id | P_KINO.id | P_NIGHT.id] = 1100.0;
prices[P_BASE.id | P_KINO.id | P_SPORT.id | P_NIGHT.id] = 1250.0;
prices[P_BASE.id | P_KINO.id | P_SUPER_SPORT.id | P_NIGHT.id] = 1550.0;
prices[P_BASE.id | P_VIP_KINO.id] = 1050.0;
prices[P_BASE.id | P_SUPER_SPORT.id] = 1150.0;
prices[P_BASE.id | P_VIP_KINO.id | P_SPORT.id] = 1250.0;
prices[P_BASE.id | P_VIP_KINO.id | P_SUPER_SPORT.id] = 1550.0;
prices[P_BASE.id | P_VIP_KINO.id | P_NIGHT.id] = 1250.0;
prices[P_BASE.id | P_VIP_KINO.id | P_SPORT.id | P_NIGHT.id] = 1350.0;
prices[P_BASE.id | P_VIP_KINO.id | P_SUPER_SPORT.id | P_NIGHT.id] = 1650.0;
prices[P_BASE.id | P_SPORT.id | P_NIGHT.id] = 1100.0;
prices[P_BASE.id | P_SUPER_SPORT.id | P_NIGHT.id] = 1400.0;

/** базовый расширенный */
prices[P_EXT_BASE.id] = 750.0;
prices[P_EXT_BASE.id | P_KINO.id] = 1050.0;
prices[P_EXT_BASE.id | P_SPORT.id] = 1050.0;
prices[P_EXT_BASE.id | P_NIGHT.id] = 1050.0;
prices[P_EXT_BASE.id | P_KINO.id | P_SPORT.id] = 1300.0;
prices[P_EXT_BASE.id | P_KINO.id | P_SUPER_SPORT.id] = 1600.0;
prices[P_EXT_BASE.id | P_KINO.id | P_NIGHT.id] = 1300.0;
prices[P_EXT_BASE.id | P_KINO.id | P_SPORT.id | P_NIGHT.id] = 1450.0;
prices[P_EXT_BASE.id | P_KINO.id | P_SUPER_SPORT.id | P_NIGHT.id] = 1750.0;
prices[P_EXT_BASE.id | P_VIP_KINO.id] = 1250.0;
prices[P_EXT_BASE.id | P_SUPER_SPORT.id] = 1350.0;
prices[P_EXT_BASE.id | P_VIP_KINO.id | P_SPORT.id] = 1450.0;
prices[P_EXT_BASE.id | P_VIP_KINO.id | P_SUPER_SPORT.id] = 1750.0;
prices[P_EXT_BASE.id | P_VIP_KINO.id | P_NIGHT.id] = 1450.0;
prices[P_EXT_BASE.id | P_VIP_KINO.id | P_SPORT.id | P_NIGHT.id] = 1550.0;
prices[P_EXT_BASE.id | P_VIP_KINO.id | P_SUPER_SPORT.id | P_NIGHT.id] = 1850.0;
prices[P_EXT_BASE.id | P_SPORT.id | P_NIGHT.id] = 1300.0;
prices[P_EXT_BASE.id | P_SUPER_SPORT.id | P_NIGHT.id] = 1600.0;

/** LITE */

prices[P_LITE.id] = 99.00;
prices[P_LITE.id | P_SPORT.id] = 699.00;
prices[P_LITE.id | P_KINO.id] = 699.00;
prices[P_LITE.id | P_NIGHT.id] = 699.00;
prices[P_LITE.id | P_SPORT.id | P_KINO.id] = 1299.00;
prices[P_LITE.id | P_SPORT.id | P_NIGHT.id] = 1299.00;
prices[P_LITE.id | P_NIGHT.id | P_KINO.id] = 1299.00;
prices[P_LITE.id | P_NIGHT.id | P_KINO.id | P_SPORT.id] = 1449.00;

/** Лайт Плюс */
prices[P_LITEPLUS.id] = 199.0;
prices[P_LITEPLUS.id | P_KINO.id] = 789.0;
prices[P_LITEPLUS.id | P_SPORT.id] = 789.0;
prices[P_LITEPLUS.id | P_NIGHT.id] = 789.0;
prices[P_LITEPLUS.id | P_KINO.id | P_SPORT.id] = 1050.0;
prices[P_LITEPLUS.id | P_SPORT.id | P_NIGHT.id] = 1050.0;
prices[P_LITEPLUS.id | P_KINO.id | P_NIGHT.id] = 1050.0;
prices[P_LITEPLUS.id | P_KINO.id | P_SPORT.id | P_NIGHT.id] = 1200.0;
prices[P_LITEPLUS.id | P_KINO.id | P_SUPER_SPORT.id] = 1350.0;
prices[P_LITEPLUS.id | P_KINO.id | P_SUPER_SPORT.id | P_NIGHT.id] = 1500.0;
prices[P_LITEPLUS.id | P_VIP_KINO.id] = 1000.0;
prices[P_LITEPLUS.id | P_SUPER_SPORT.id] = 1100.0;
prices[P_LITEPLUS.id | P_VIP_KINO.id | P_SPORT.id] = 1200.0;
prices[P_LITEPLUS.id | P_VIP_KINO.id | P_SUPER_SPORT.id] = 1500.0;
prices[P_LITEPLUS.id | P_VIP_KINO.id | P_NIGHT.id] = 1200.0;
prices[P_LITEPLUS.id | P_VIP_KINO.id | P_SPORT.id | P_NIGHT.id] = 1300.0;
prices[P_LITEPLUS.id | P_VIP_KINO.id | P_SUPER_SPORT.id | P_NIGHT.id] = 1600.0;
prices[P_LITEPLUS.id | P_SUPER_SPORT.id | P_NIGHT.id] = 1350.0;

/** a la carte */
prices[P_N_FOOTBALL_BASE.id] = 199.0;
prices[P_LIDERBASE.id] = 50.0;
prices[P_EGOIST_BASE.id] = 150.0;

/** добавляем наш футбол и 149 рублей */
for (n in prices)
{
    if ((n & P_SUPER_SPORT.id) == 0 && (n & P_N_FOOTBALL.id) == 0)
    {
        var index = n | P_N_FOOTBALL.id;
        prices[index] = prices[n] + 149.0;
    }
}
for (n in prices)
{
    if ((n & P_EGOIST.id) == 0)
    {
        var index = n | P_EGOIST.id;
        prices[index] = prices[n] + 150.0;
    }
}
for (n in prices)
{
    if ((n & P_LIDER.id) == 0)
    {
        var index = n | P_LIDER.id;
        prices[index] = prices[n] + 50.0;
    }
}

/** добавляем SMS-Информ */
for (n in prices)
{
    if ((n & P_SMS.id) == 0)
    {
        var index = n | P_SMS.id;
        prices[index] = prices[n] + 10.0;
    }
}
/** добавляем HD */
for (n in prices)
{
    if ((n & P_HD.id) == 0)
    {
        var index = n | P_HD.id;
        prices[index] = prices[n] + 359.0;
    }
}

/** добавляем Открытие */
for (n in prices)
{
    if ((n & P_OPENING.id) == 0)
    {
        var index = n | P_OPENING.id;
        prices[index] = prices[n] + 199.0;
    }
}

/** добавляем Viasat */
for (n in prices)
{
    if ((n & P_VIASAT.id) == 0)
    {
        var index = n | P_VIASAT.id;
        prices[index] = prices[n] + 300.0;
    }
}



/** Спорт, Суперспорт - +49 */
for (n in prices)
{
    if ((n & P_SPORT.id) != 0 || (n & P_SUPER_SPORT.id) != 0)
    {
        prices[n] = prices[n] + 49.0;
    }
}




prices[P_LIDERBASE.id|P_N_FOOTBALL.id]=199+50;


function check(box)
{
    box.checked = true;
    box.getParent().removeClass('unchecked');
    box.getParent().addClass('checked');
}
function uncheck(box)
{
    box.checked = false;
    box.getParent().removeClass('checked');
    box.getParent().addClass('unchecked');
}
function enable(box)
{
    box.disabled = false;
    box.getParent().removeClass('disabled');
}
function disable(box)
{
    box.disabled = true;
    box.getParent().addClass('disabled');
}

/** права первоначальной подписки */
var initialRights = 0;
// Массив для хранения чекбоксов
var checkboxes = new Array();
var priceDisplay;
function createCalculator(horizontal, simple, noBase)
{
    var basecontainer = document.getElementById("calculator-body");
    var container;
    GROUPS.each(function(group, idx)
    {
        if (group.disabled)
            return;
        if (!(horizontal && (group.id == 'viasat' || group.id == 'hd' || group.id == 'nfootball'
                || group.id == 'family' || group.id == 'egoist' || group.id == 'lider' || group.id == 'night')))
        {
            container = new Element("div");
            group.container = container;
            basecontainer.appendChild(container);
            container.id = group.id;
            container.setAttribute("class", "group")
            container.className = "group";
            if (group.title)
            {
                var title = new Element("h5");
                title.set('text', group.title);
                container.appendChild(title);
            }
        }
        group.pack.each(function(pack, idx)
        {
            if (pack.disabled)
                return;
            var divv = new Element("label");
            divv.addClass("unchecked");
            divv.addClass("checkbox");
            container.appendChild(divv);
            var chbox = new Element("input",
            {
                'type':'checkbox',
                "value":pack.vname,
                'name':'package'
            });
            chbox.injectInside(divv);

            // выделяем сразу первый элемент в группе
            chbox.pack = pack;
            chbox.group = group;
            if (simple)
                chbox.addEvent('click', function()
                {
                    chkBoxPressed(this);
                }.bind(chbox));
            else
                divv.addEvent('click', changeValue.bind(chbox));
            pack.checkbox = chbox;
            checkboxes.push(chbox);
            span = new Element("span");
            span.set('html', pack.name);
            span.injectInside(divv);
            divv.id = 'label_' + pack.vname;
        });
        if (group.description)
        {
            comm = new Element("div");
            comm.addClass("description");
            comm.set('html', group.description);
            container.appendChild(comm);
        }

    });
    priceDisplay = new Element('div');
    priceDisplay.setAttribute('id', 'c_price');
    priceDisplay.injectInside(basecontainer);
    if (!noBase)
    {
        setPack(P_LITE.disabled ? P_BASE : P_LITE);
    } else
    {
        var el = basecontainer;
        do
        {
            el = el.getParent();
        } while (!el.getParent() || !el.match('form'));
        el.addEvent('submit', function()
        {
            if (!computePrice())
            {
                alert("Выберите вариант подписки");
                return false;
            }
        });
    }
    setPrice();
}
function setPack(pack)
{
    pack.checkbox.checked = true;
    chkBoxPressed(pack.checkbox);
}
function chkBoxPressed(box)
{
    if (!box.checked && box.group.req)
    {
        check(box);
        return;
    }
    if (box.checked)
    {
        check(box);
        box.group.checked = box;
        checkboxes.each(function(bbox, i)
        {
            if (bbox != box && bbox.group == box.group)
                uncheck(bbox);
        });
    } else
    {
        uncheck(box);
        box.group.checked = null;
    }
    checkboxes.each(function(box, i)
    {
        enable(box);
    });
    var rights = computeRights();
    checkboxes.each(function(box, i)
    {
        if (box.pack.restricted && box.checked)
        {
            box.pack.restricted.each(function(pack, i)
            {
                var pack = box.pack.restricted[i];
                if (pack.checkbox)
                {
                    uncheck(pack.checkbox);
                    disable(pack.checkbox);
                }
            });
        }
    });
    if (!computePrice())
        setPack(P_BASE);
    setPrice();
}
function changeValue()
{

    this.checked = !this.checked;
    chkBoxPressed(this);
}
function setPrice()
{
    highlightChannels();
    var counts = countChannels();
    var cStr;

    if (!computePrice())
        cStr = "";
    else
    {
        var count = counts % 100;
        if (count > 5 && count <= 20)
            cStr = 'каналов';
        else if (count % 10 == 1)
            cStr = 'канал';
        else if (count % 10 > 1 && count % 10 < 5)
            cStr = 'канала';
        else
            cStr = 'каналов';
        ;

        cStr = "<div class=\"calc_channels\">" + counts + ' ' + cStr
                + "<a href=\"/channels/\">список каналов</a></div>"
                + computePrice() + periodInfo;
    }
    priceDisplay.set('html', cStr);
}
function computeRights()
{
    var rights = 0;
    for (i in checkboxes)
    {
        var box = checkboxes[i];
        if (box.checked)
            rights = rights | box.pack.rights;
    }
    return rights;
}
function computePrice()
{
    var collect = 0;
    for (i in checkboxes)
    {
        var box = checkboxes[i];
        if (box.checked)
            collect = collect | box.pack.id;
    }
    if (prices[collect])
        return priceModifier(prices[collect]);
    return false;
}
function countChannels()
{
    var collect = 0;
    checkboxes.each(function(box, idx)
    {
        if (box.checked)
        {
            collect += box.pack.size ? box.pack.size : 0;
            if (box.pack == P_EXT_BASE)
                collect += P_BASE.size;
        }
    });
    return collect;
}

function fixSubscription()
{
    initialRights = computeRights();
}

/** провериь, изменили ли форму */
function checkSubscriptionForm()
{
    if (computeRights() == initialRights)
    {
        alert('Выбранный вариант подписки совпадает с существующим');
        return false;
    }
    if ((initialRights & computeRights()) != initialRights)
    {
        alert('Изменение подписки в выбранном периоде разрешено только в сторону увеличения набора каналов');
        return false;
    }
    return true;
}

function setFamilyPackage(cards)
{
    if (!cards || cards == 0)
    {
        return;
    }
    G_FAMILY.disabled = false;
    P_FAMILY.name = "Семейный (" + cards + (cards == 1 ? " карта" : " карты")
            + ")"
    /** добавляем цену семейного */
    for (n in prices)
    {
        if ((n & P_FAMILY.id) == 0)
        {
            var index = n | P_FAMILY.id;
            prices[index] = prices[n] + (cards * 90.0);
        }
    }
}

function highlightChannels()
{
    if (!$('channels'))
        return;
    $('channels').setAttribute('class', '');
    checkboxes.each(function(el, idx)
    {
        if (el.checked)
        {
            $('channels').addClass("calc_" + el.pack.vname);
        }
    });
}
