function round(x, Pression)
{
    if (Pression == 0) return Math.round(x);
    var PresX = Math.pow(10, Pression);
    return Math.round(x * PresX) / PresX;
}
function CEvent()
{
    var me = this;
    var list = new Array();
    me.Add = function(Event)
    {
        if (typeof Event != "function") return;
        list.push(Event);
    }
    me.Clear = function()
    {
        list.length = 0;
    }
    me.Raise = function()
    {        
        for (var i in list) list[i](arguments);
    }
}
Number.prototype.toNum = function()
{
    return this.toString().replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1&nbsp;');
}
function CDebug(MaxW,MaxH,Left,Top)
{
    var d=document.createElement("DIV");
    d.style.position='absolute';
    d.style.top=Top.toString()+'px';
    d.style.left=Left.toString()+'px';
    d.style.width=MaxW.toString()+'px';
    d.style.height=MaxH.toString()+'px';
    d.style.overflow='auto';
    d.style.backgroundColor='white';
    document.body.appendChild(d);
    
    
    //alert("add");
    CDebug.prototype.Clear=function()
    {
        d.innerHTML='';
    }
    CDebug.prototype.MSG=function(Message)
    {
        d.innerHTML+=Message+'<br/>';
        //alert(Message)
    }
}

function CCalcSetka(d)
{
    var me = this;
    var execState = "stop";
    
    var debug=d;
    var lAdditions=new Array();
    var lBaseParams=new Array();
    var lCell=new Array();
    var lCellHeight=new Array();
    var lCellWidth=new Array();
    var lHeight=new Array();
    var lSection=new Array();
    var lPosts=new Array();
    var lAdditionsList=new Array();

    //Покрытие для столбов
    var eltPostsCover;
    var eltPostsCover2;
    
    var eltLen,eltCellH,eltCellW,eltHeight,eltSection,eltOutput,eltPosts,eltCrom,eltPolymer,eltHamerait;
    var eltCromPost,eltCromSection,eltCromSection2,eltCromSection3;
    
    var eltPolymerPost,eltPolymerSection,eltPolymerSection2,eltPolymerSection3;
    var eltPolymerSectionInfo1, eltPolymerSectionInfo2, eltPolymerSectionInfo3;

    var eltDeliveryClient, eltDeliveryClientKM;
    
    var eltAdditions=new Array();
    var eltAdditionsList=new Array();
    var eltCell,eltHeightInfo;
	var eltSec1Info,eltSec2Info,eltSec3Info
    var eltMontaj;

    var evOnCalcStart = new CEvent();
    var evOnCalcEnd= new CEvent();
    
    var curLen,curCellH,curCellW,curHeight,curSection,curPost,curHamerait;
    var curPolymer,curPolymerPost,curPolymerSection,curPolymerSection2,curPolymerSection3;

    //Текущее покрытие столба/секции.
    var curCover, curCover2; 
    
    var curCromPost,curCromSection,curCromSection2,curCromSection3,curCrom;
    var curMontaj;
	var curCell;
    
    var start=false;
    var init_additions_to=0;
    var init_additions_list_to=0;
    
    var sumCount;
    var sumLen;
    var sumSquare;
    var sumWeightPosts;
    var sumWeightSections;
    var sumCink;
    var sumPoly;
    var sumMontaj;
    var curCK;
    var weightSect;
    var weightPost;
    var startTimeout;
    var tmpOutput;

    //Покрытие, все виды
    var lCover = new Array();
    //Покрытие секций
    var sCoverSections = new Array();

    //Добавляем покрытие, используется для секций и столбов.
    CCalcSetka.prototype.AddCover = function(Obj)
    {
        lCover[Obj.ID] = Obj;
        Obj.toCNY = function()
        {
            switch (Obj.curr)
            {
                /*CNY*/ case 116: return Obj.price;
                /*RUB*/case 118: return Obj.price / me.GetBaseParam('rub_per_cny').Value;
                /*USD*/case 117: return Obj.price * me.GetBaseParam('cny_per_dol').Value;
            }
        }
        Obj.toUSD = function()
        {
            switch (Obj.curr)
            {
                case 116: return Obj.price / me.GetBaseParam('cny_per_dol').Value;
                case 118: return Obj.price / me.GetBaseParam('rub_per_dol').Value;
                case 117: return Obj.price;
            }
        }
        Obj.toRUB = function()
        {
            switch (Obj.curr)
            {
                case 116: return Obj.price / me.GetBaseParam('rub_per_cny').Value;
                case 118: return Obj.price;
                case 117: return Obj.price * me.GetBaseParam('rub_per_dol').Value;
            }
        }
    }
    //Задаём варианты покрытия секций, массив ID
    CCalcSetka.prototype.AddSectionsCover = function(Obj)
    {
        sCoverSections = Obj.cover;
        if (sCoverSections[0] == "") sCoverSections = new Array();
    }
    //Вывод вариантов покрытия секции
    CCalcSetka.prototype.WriteSectionsCover = function(SelectId)
    {
        document.write("<select id='"+SelectId+"'>");
        for (var i = 0; i < sCoverSections.length; i++)
        {
            var selected = i == 0 ? "selected='selected' " : "";
            var option = "<option " + selected + "value='" + sCoverSections[i] + "'>" + lCover[sCoverSections[i]].NAME + "</option>";
            document.write(option);    
        }
        document.write("</select>");
    }    
    
    CCalcSetka.prototype.calcStart = function(Event)
    {
        evOnCalcStart.Add(Event);
    }
    CCalcSetka.prototype.calcEnd= function(Event)
    {
        evOnCalcEnd.Add(Event);
    }
    CCalcSetka.prototype.DebugClear=function()
    {
        if(!debug) return;
        debug.Clear();
    }
    CCalcSetka.prototype.Debug=function(Message)
    {
        if(!debug) return;
        debug.MSG(Message);
    }
    CCalcSetka.prototype.OnChangeHeight=function()
    {
        me.FillPosts();
    }
    CCalcSetka.prototype.OnChangeParam=function()
    {
        if(!me.start) return;
        //me.MSGClear();
        //me.HideRows();
        
        me.MSG('<b>Обработка данных ... </b>');
        
        tmpOutput=setTimeout(me.StartCalc,200);
        //me.StartCalc();
    }
    CCalcSetka.prototype.GetParamValue = function(Name)
    {
        return lBaseParams[Name].Value;
    }

    //Скрытие выбора покрытия
    CCalcSetka.prototype.HideRows = function()
    {
        return;
        if (eltPosts.selectedIndex != -1)
        {
            me.Debug("eltPosts.selectedIndex " + eltPosts.selectedIndex);
            var Post = lPosts[eltPosts.options[eltPosts.selectedIndex].value];
            me.Debug(Post.Manufacture);
            if (Post.Manufacture == 91)
            {
                me.Debug("Process 91");
                var h1 = document.getElementById('hide_for_91_1');
                if (h1.className != 'hidden')
                {
                    h1.oldClass = h1.className;
                    h1.className = 'hidden';
                }
                var h2 = document.getElementById('hide_for_91_2');

                if (h2 != undefined)
                    if (h2.className != 'hidden')
                {
                    h2.oldClass = h2.className;
                    h2.className = 'hidden';
                }

                var h3 = document.getElementById('hide_for_90_1');
                me.Debug("h3.oldClass " + h3.oldClass);
                if (h3.oldClass != undefined)
                    h3.className = h3.oldClass;


            }
            else
            {
                me.Debug("Process 90");
                var h1 = document.getElementById('hide_for_91_1');
                if (h1.oldClass != undefined) h1.className = h1.oldClass;

                var h2 = document.getElementById('hide_for_91_2');
                if (h2 != undefined)
                    if (h2.oldClass != undefined) h2.className = h2.oldClass;

                var h3 = document.getElementById('hide_for_90_1');
                if (h3.className != 'hidden')
                {
                    h3.oldClass = h3.className.toString();
                    h3.className = 'hidden';
                }
            }
        }
    }
    
    CCalcSetka.prototype.StartCalc=function()
    {
        clearTimeout(tmpOutput);
        me.Calc();
        me.FillImage();
        
    }
    CCalcSetka.prototype.FillImage = function ()
    {
        var output = $(".calc_image_out");
        output.html("");

        var postHtml = '';
        var topHtml = '';
        var bottomHtml = '';
        var sectionHtml = '';

        if (curPost.image != '') postHtml = "<img src='" + curPost.image + "'/>";
        else postHtml = "&nbsp;";

        var curElt;
        for (var i = 0; i < eltAdditions.length; i++)
        {
            if (eltAdditions[i].checked)
            {
                curElt = lAdditions[i];
                if (curElt.imagePath != '')
                {
                    if (curElt.imagePosition == 98) topHtml += "<img src='" + curElt.imagePath + "'/>";
                    if (curElt.imagePosition == 99) bottomHtml += "<img src='" + curElt.imagePath + "'/>";
                }
            }
        }
        var curElt;
        for (var i in eltAdditionsList)
        {
            if (eltAdditionsList[i].selectedIndex != -1)
            {
                curElt = lAdditionsList[i].items[eltAdditionsList[i].selectedIndex];
                //Отображение описание
                document.getElementById("additions_list_desc_" + lAdditionsList[i].GroupId).innerHTML = curElt.desc;
                //Отображение изображения
                if (curElt.imagePath != '')
                {
                    if (curElt.imagePosition == 98) topHtml += "<img src='" + curElt.imagePath + "'/>";
                    if (curElt.imagePosition == 99) bottomHtml += "<img src='" + curElt.imagePath + "'/>";
                }
            }
        }

        //if(curHeight.Sec3!=0) sectionHtml+="<img src='"+me.GetBaseParam('section_image').ValueEx+"'/><br/>";
        //if(curHeight.Sec2!=0) sectionHtml+="<img src='"+me.GetBaseParam('section_image').ValueEx+"'/><br/>";
        if (curHeight.Sec1 != 0) sectionHtml += "<img src='" + me.GetBaseParam('section_image').ValueEx + "'/>";

        var height = curHeight.PostHeight;
        height = Math.floor(height / 100);
        height = height / 10;

        var height2 = curHeight.Sec1 + curHeight.Sec2 + curHeight.Sec3;
        height2 = Math.floor(height2 / 100);
        height2 = height2 / 10;

        //if (postHtml == "&nbsp;") 
            height = height2;

        var out = "<table class='bn'>";
        out += "<tr><td align='center'>" + topHtml + "&nbsp;</td></tr>";
        out += "<tr><td><table class='b'><tr>";
        out += "<td class='calc_arrow_top'><img src='/images/vip/calc_arrow_up.gif'/><br/>" + height.toNum() + " м<br/><img src='/images/vip/calc_arrow_down.gif'/></td>";
        out += "<td style='width:1px;' class='calc_post_left'>" + postHtml + "</td>";
        out += "<td align='center' valign='middle'>" + sectionHtml + "</td>";
        out += "<td style='width:1px;' class='calc_post_right'>" + postHtml + "</td>";
        out += "</tr></table></td></tr>";

        out += "<tr><td align='center'  class='calc_arrow_bottom'><table class='b'><tr><td style='width:1px' class='calc_arrow_left'><img src='/images/vip/calc_arrow_left.gif'/></td><td><span>" + (curSection.Width / 1000).toNum() + " м</span></td><td class='calc_arrow_right'><img  src='/images/vip/calc_arrow_right.gif'/></td></tr></table></td></tr>";
        if (bottomHtml != "") out += "<tr><td align='center'  class='calc_image_bottom'>" + bottomHtml + "&nbsp;</td></tr>";

        out += "</table>";


        output.html(out);
    }
	CCalcSetka.prototype.AddCell=function(obj)
    {
        obj.vert=new Array();
        obj.hor=new Array();
        
        for(var i in obj.count_vert)
        {
            var cur=obj.count_vert[i];
            obj.vert[cur.split(':')[0]]=cur.split(':')[1];
        }
        for(var i in obj.count_hor)
        {
            var cur=obj.count_hor[i];
            
            obj.hor[cur.split(':')[0]]=cur.split(':')[1];
        }
        lCell[lCell.length]=obj;         
    }
    CCalcSetka.prototype.AddAdditionsList=function(obj)
    {
        obj.items=new Array();
        lAdditionsList[obj.GroupId]=obj;        
    }
    CCalcSetka.prototype.AddAdditionsListItem=function(obj)
    {
        var cur=lAdditionsList[obj.GroupId].items;
        cur[cur.length]=obj;
    }
    //CCalcSetka.prototype.AddAdditions=function(Name,Price,CalcType,ApplyTo)
    CCalcSetka.prototype.AddAdditions=function(obj)
    {
        /*
        var obj=new Object();
        obj.Name=Name;
        obj.Price=Price;
        obj.CalcType=CalcType;
        obj.ApplyTo=ApplyTo;
        */
        lAdditions[lAdditions.length]=obj;
    }
    CCalcSetka.prototype.AddPostType=function(Data)
    {
        /*
        var obj=new Object();
        obj.Name=Name;
        obj.Price=Price;
        obj.SideA=SideA;
        obj.SideB=SideB;
        obj.Width=Width;
        obj.Manufacture=Manufacture;
        */
        //alert(Data.Name);
        lPosts[lPosts.length]=Data;
    }
    
    CCalcSetka.prototype.AddBaseParam=function(Name,ValueEx,ValType,TextCode)
    {
        var obj=new Object();
        obj.Name=Name;
        obj.ValueEx=ValueEx;
        try
        {
            obj.Value=parseFloat(ValueEx);
        }
        catch (e) {obj.Value=0;}
        
        obj.ValType=ValType;
        obj.TextCode=TextCode;
        lBaseParams[TextCode]=obj;
    }
    CCalcSetka.prototype.GetBaseParam=function(TextCode)
    {
        return lBaseParams[TextCode];
    }
    CCalcSetka.prototype.GetBaseParamValueCNY=function(TextCode)
    {
        var par=me.GetBaseParam(TextCode);
        //if(TextCode=='sea_tarif')            alert(par.ValType+" "+par.Value+" "+TextCode+" "+me.GetBaseParam('cny_per_dol').Value);
        if(par.ValType==81) return par.Value;
        if(par.ValType==80) 
        {
            //par.Value=parseFloat(par.Value.toString()+".0");
            //me.Debug(TextCode+' '+par.Value+' '+me.GetBaseParam('cny_per_dol').Value+' '+par.Value*me.GetBaseParam('cny_per_dol').Value);
            return par.Value*me.GetBaseParam('cny_per_dol').Value;
        }
        if(par.ValType==79) return par.Value/me.GetBaseParam('rub_per_cny').Value;
        return null;
    }
    CCalcSetka.prototype.GetBaseParamValueDol=function(TextCode)
    {
        var par=me.GetBaseParam(TextCode);
        if(par.ValType==81) return par.Value/me.GetBaseParam('cny_per_dol').Value;
        if(par.ValType==80) return par.Value;
        if (par.ValType == 79) return par.Value / me.GetBaseParam('rub_per_dol').Value;
        return null;
    }
    CCalcSetka.prototype.GetBaseParamValueRub = function(TextCode)
    {
        var par = me.GetBaseParam(TextCode);
        if (par.ValType == 81) return par.Value / me.GetBaseParam('cny_per_dol').Value * me.GetBaseParam('rub_per_dol').Value;
        if (par.ValType == 80) return par.Value * me.GetBaseParam('rub_per_dol').Value;
        if (par.ValType == 79) return par.Value;
        return null;
    }
    CCalcSetka.prototype.AddCellHeight=function(Name,Value)
    {
        var obj=new Object();
        obj.Name=Name;
        obj.Value=Value;
        lCellHeight[lCellHeight.length]=obj;
    }
    CCalcSetka.prototype.AddCellWidth=function(Name,Value)
    {
        var obj=new Object();
        obj.Name=Name;
        obj.Value=Value;
        lCellWidth[lCellWidth.length]=obj;
    }
    CCalcSetka.prototype.AddHeight=function(obj)
    {
        /*
        var obj=new Object();
        obj.Name=Name;
        obj.PostHeight=PostHeight;
        obj.Sec1=Sec1;
        obj.Sec2=Sec2;
        obj.Sec3=Sec3;
        */
        lHeight[lHeight.length]=obj;
    }
    CCalcSetka.prototype.AddSection=function(Name,Width)
    {
        var obj=new Object();
        obj.Name=Name;
        obj.Width=Width;
        lSection[lSection.length]=obj;
    }
    
    CCalcSetka.prototype.MSG=function(Message)
    {
        if(!eltOutput) return;
        eltOutput.innerHTML+=Message;
    }
    CCalcSetka.prototype.MSGClear=function()
    {
        if(!eltOutput) return;
        eltOutput.innerHTML='';
    }
    
   
    
    CCalcSetka.prototype.GetAddPercent=function(ItemsCount)
    {
        return parseFloat(me.InterpFunction(me.GetBaseParam('plan_add').ValueEx,sumLen))+me.GetBaseParam('nalogs_zp_hran').Value;

    }
    CCalcSetka.prototype.GetAddPercentRUS = function(ItemsCount)
    {
        return parseFloat(me.InterpFunction(me.GetBaseParam('plan_add_rus').ValueEx, sumLen)) + me.GetBaseParam('nalogs_zp_hran').Value;
    }
    CCalcSetka.prototype.GetCoverData = function(summ, ms, square)
    {
        var ret = new Object();
        ret.summ = summ;
        ret.msp = ms;

        if (curCover2 != null)
        {
            var oldCOver = curCover;
            curCover = curCover2;
            me.Debug("Добавка к весу(2) " + curCover.add_weight + " %");
            if (curCover.add_weight != '') ret.msp += ms * parseInt(curCover.add_weight) / 100;
            if (curCover.calc_type == 125) ret.summ += me.GetCoverSummM2(square, 1);
            if (curCover.calc_type == 122) ret.summ += me.GetCoverSumm(ms, 1);
            curCover = oldCOver;
        }

        if (curCover != null)
        {
            me.Debug("Добавка к весу(1) " + curCover.add_weight + " %");
            if (curCover.add_weight != '') ret.msp += ms * parseInt(curCover.add_weight) / 100;
            if (curCover.calc_type == 125) ret.summ += me.GetCoverSummM2(square, 1);
            if (curCover.calc_type == 122) ret.summ += me.GetCoverSumm(ms, 1);
        }
        return ret;

    }
    CCalcSetka.prototype.GetPostInfo = function(PostsCount)
    {
        var sk = 0;
        var ms;
        var s = 0;
        var fur_sum = 0;
        for (var i in curPost.Furnitura)
        {
            //me.Debug((curHeight.Sec1+curHeight.Sec2+curHeight.Sec3)*PostsCount);
            fur_sum += (curHeight.Sec1 + curHeight.Sec2 + curHeight.Sec3) * curPost.Furnitura[i].PricePerM / me.GetBaseParam('rub_per_cny').Value / 1000;
            //me.Debug((curHeight.Sec1+curHeight.Sec2+curHeight.Sec3)+" x "+PostsCount+' y '+curPost.Furnitura[i].PricePerM+' a '+me.GetBaseParam('rub_per_cny').Value);
        }
        me.Debug("Фурнитура :" + fur_sum);

        var s_mult = curPost.Mult;
        var msp = 0;
        var ck = 0;

        var mk = me.GetBaseParam('container_weight').Value;

        if (s_mult == 0) s_mult = 1;
        me.Debug("Множитель столбов:" + s_mult);

        //In in russia
        if (curPost.Manufacture == 91)
        {
            me.Debug("Рус столб price=" + curPost.Price);
            weightPost = 0;
            if (curPost.Price != 0 && curPost.Price != "")
            {
                //alert("curHeight.PostHeight "+curHeight.PostHeight);
                s = s_mult * curHeight.PostHeight * curPost.Price / 1000;
                me.Debug("s без наценки:" + s);
                s += s * me.GetAddPercentRUS(PostsCount) / 100;
                me.Debug("s :" + s);
                return s + fur_sum;
            }
            else
            {

                ms = s_mult * (curPost.SideA + curPost.SideB) * 2 * curPost.Width * curHeight.PostHeight * me.GetBaseParam('metal_weight').Value;
                var square = (curPost.SideA + curPost.SideB) * 2 * curHeight.PostHeight / 1e6;

                me.Debug("Высота столба, mm:" + curHeight.PostHeight);
                me.Debug("Площадь столба, m^2:" + square);
                me.Debug("Вес столба, кг:" + ms);
                s = 0;
                var msp = ms;
                var cover = me.GetCoverData(s, ms, square);
                msp = cover.msp;
                s = cover.summ;
                
                weightPost = msp;
                sumWeight += msp;

                s += ms * me.GetBaseParam('price_met_on_post_in_rus').Value / me.GetBaseParam('rub_per_cny').Value;
                s += s * me.GetAddPercentRUS(PostsCount) / 100;

                me.Debug("s :" + s);
                return s + fur_sum;
            }
        }

        if (curPost.Price != 0)
        {
            me.Debug("Столб расчет по пог метру.");
            me.Debug("cnt=" + PostsCount + " mult=" + s_mult + ' h=' + curHeight.PostHeight + ' pr=' + curPost.Price);
            ms = s_mult * curHeight.PostHeight * curPost.WeightPerM / 1000;
            ck = Math.floor(mk / ms);
            if (ms == 0) ck = 0;
            msp = ms;
            sk = 0;
            
            var cover = me.GetCoverData(sk, ms, square);
            msp = cover.msp;
            sk = cover.summ;
            
            weightPost = msp;
            sumWeight += msp;

            sk += ck * curHeight.PostHeight * curPost.Price / 1000;

            //Проценты за доставку и оформление
            sk += sk * me.GetBaseParam('komission_oleg').Value / 100;
            sk += sk * me.GetBaseParam('transfer_percent').Value / 100;


            me.Debug("s в китае:" + sk + ' ' + sk / ck);
            me.Debug("Вес столба:" + ms);

            me.Debug("Кол-во столбов в контейнере:" + ck);
            //s += s * me.GetAddPercent(PostsCount) / 100;
            //me.Debug("s :" + s);
            //return s + fur_sum;
        }
        else
        {


            ms = s_mult * (curPost.SideA + curPost.SideB) * 2 * curPost.Width * curHeight.PostHeight * me.GetBaseParam('metal_weight').Value;
            var square = (curPost.SideA + curPost.SideB) * 2 * curHeight.PostHeight / 1e6;

            me.Debug("Высота столба, mm:" + curHeight.PostHeight);
            me.Debug("Площадь столба, m^2:" + square);
            me.Debug("Вес столба, кг:" + ms);

            msp = ms;

            var cover = me.GetCoverData(0, ms, 0);
            msp = cover.msp;
            
            //if (curPolymer) msp += ms * me.GetBaseParam('post_with_poly_add_weight').Value / 100;
            //if (curCrom == "hot") msp += ms * me.GetBaseParam('hot_cink_add_weight').Value / 100;

            weightPost = msp;
            sumWeight += msp;
            sumWeightPosts = msp * PostsCount;

            ck = Math.floor(mk / msp);
            if (msp == 0) ck = 0;
            curCK = ck;
            me.Debug("Кол-во столбов в контейнере:" + ck);
            //alert(sk+" "+ms+" "+me.GetBaseParamValueCNY('post_in_china_per_one')); 
            sk = me.Facility(sk, ms, ck, me.GetBaseParamValueCNY('price_met_on_post_in_china'),
                        me.GetBaseParamValueCNY('post_in_china_per_one'),
                        me.GetBaseParam('manuf_post_percent').Value,
                        me.GetBaseParam('komission_oleg').Value,
                        me.GetBaseParam('transfer_percent').Value);

            me.Debug("Facility, CNY:" + Math.floor(sk));
        }

        var deliv = me.Delivery(sk, mk)
        sk = deliv;
        me.Debug("Затраты по столбам(20t), CNY:" + Math.floor(sk) + " единица: " + Math.floor(sk / ck));
        me.Debug("%+ :" + me.GetAddPercent(PostsCount));
        sk += sk * me.GetAddPercent(PostsCount) / 100;
        me.Debug("Общая цена по столбам(20t):" + Math.floor(sk) + " unit " + Math.floor(sk / ck));
        //alert(sk);
        if (ck == 0) return 0;
        return sk / ck + fur_sum;
    }
    CCalcSetka.prototype.GetSectionInfo = function(SectionsCount, SectionHeight, SectionHorCount)
    {
        var sk = 0;
        var ms;
        var s = 0;

        //weight_hor
        //weight_vert

        var colHorMult = me.GetBaseParam('col_hor_mult').Value;
        if (colHorMult == 0) colHorMult = 1;

        me.Debug("Кол-во секций:" + SectionsCount);
        me.Debug("Высота секции:" + SectionHeight);
        me.Debug("Множитель гор. прутков:" + colHorMult);
        var sliceHor = me.GetBaseParam('weight_hor').Value;
        var sliceVert = me.GetBaseParam('weight_vert').Value;
        //var colPoints=curSection.Width*SectionHeight/curCellH.Value/curCellW.Value;

        /*
        var colHor=colHorMult*Math.round(SectionHeight/curCellH.Value);
        var colVert=Math.round(curSection.Width/curCellW.Value);
        */

        var colHor = colHorMult * curCell.hor[SectionHeight];
        var colVert = curCell.vert[curSection.Width];

        me.Debug("colHor:" + colHor);
        me.Debug("colVert:" + colVert);


        var colPoints = colHor * colVert;

        //me.Debug("SectionHeight "+SectionHeight);
        //me.Debug("curCellH.Value "+curCellH.Value);
        me.Debug("Кол-во прутков: гор/верт" + colHor + "/" + colVert);
        me.Debug("Кол-во точек." + colPoints);
        colPoints
        mHor = curSection.Width * sliceHor * sliceHor * Math.PI * me.GetBaseParam('metal_weight').Value / 4;
        mVert = SectionHeight * sliceVert * sliceVert * Math.PI * me.GetBaseParam('metal_weight').Value / 4;
        //me.Debug("Вес прутка: гор/верт"+mHor+"/"+mVert);
        me.Debug("Вес прутков: гор/верт" + mHor * colHor + "/" + mVert * colVert);
        var mprut = mHor * colHor + mVert * colVert;
        me.Debug("Вес секции(Прутки), КГ:" + mprut);
        ms = mprut;
        var ms_hor_add = me.GetBaseParam('add_len_to_vert').Value * colVert * SectionHorCount * sliceVert * sliceVert * Math.PI * me.GetBaseParam('metal_weight').Value / 4;
        ms += ms_hor_add;

        me.Debug("Масса за счет ребер жесткости: " + ms_hor_add);
        //ms=curSection.Width*SectionHeight*Math.PI*me.GetBaseParam('metal_weight').Value*(sliceHor*sliceHor/curCellH.Value+sliceVert*sliceVert/curCellW.Value)/4;
        //me.Debug("Section Mass:"+ms);
        var msp = ms;
        if (curCover.add_weight != '') msp += ms * parseInt(curCover.add_weight) / 100;
        //if (curPolymer) msp += ms * me.GetBaseParam('section_with_poly_add_weight').Value / 100;
        //if (curCrom == "hot") msp += ms * me.GetBaseParam('hot_cink_add_weight').Value / 100;

        weightSect += msp;
        
        sumWeightSections = msp * SectionsCount;
        sumWeight += msp;
        me.Debug("Вес секции, КГ:" + msp);
        var mk = me.GetBaseParam('container_weight').Value;
        var ck = Math.floor(mk / msp);
        me.Debug("Кол-во секций в контейнере:" + ck);

        sk += colPoints * ck * me.GetBaseParamValueCNY('price_one_point')
        me.Debug("Стоимость сварки, CNY:" + sk);

        sk += ms * ck * me.GetBaseParamValueCNY('calibrate_ware_by_width');
        me.Debug("Калибровка проволоки, CNY:" + sk);

        sk = me.Facility(sk, ms, ck, me.GetBaseParamValueCNY('price_to_ware_in_china'),
                        0,
                        me.GetBaseParam('manuf_section_percent').Value,
                        me.GetBaseParam('komission_oleg').Value,
                        me.GetBaseParam('transfer_percent').Value);

        //alert("Facility:"+sk/ck);               
        var deliv = me.Delivery(sk, mk)
        sk = deliv;
        me.Debug("Затраты по секциям (20t), CNY:" + Math.floor(sk) + " unit " + Math.floor(sk / ck));
        me.Debug("%+ :" + me.GetAddPercent(SectionsCount));
        sk += sk * me.GetAddPercent(SectionsCount) / 100;
        me.Debug("Общая цена по секциям (20t), CNY:" + Math.floor(sk) + " unit " + Math.floor(sk / ck));
        //alert(sk);
        return sk / ck;
    }
    
    CCalcSetka.prototype.AdditionsListCalc=function()
    {
        var s=0;
        var s_cur;
        var curElt;
        for(var i in eltAdditionsList)
        {
            if(eltAdditionsList[i].selectedIndex!=-1)
            {
                curElt=lAdditionsList[i].items[eltAdditionsList[i].selectedIndex];
                me.Debug("Check AdditionList:"+lAdditionsList[i].GroupName);
                s_cur=me.ProcessAddition(curElt);
                s+=s_cur;   
            }
        }
        return s;
    }
    
    CCalcSetka.prototype.AdditionsCalc=function()
    {
        var s=0;
        var s_cur;
        var curElt;
        var count=1;
        for(var i=0;i<eltAdditions.length;i++)
        {
            me.Debug("add "+eltAdditions.checked);
            if(eltAdditions[i].checked)
            {
                count=1                
                curElt=lAdditions[i];
                if(lAdditions[i].CalcType==86)
                {
                    var cElt=document.getElementById(eltAdditions[i].id+'_count');
                    if(cElt!=undefined)
                    {
                        if(cElt.value!='')
                        {
                            try{count=parseInt(cElt.value);}
                            catch(e){count=1;}
                        }
                    }
                }
                s_cur=me.ProcessAddition(curElt,count);
                
                s+=s_cur;   
            }
        }
        return s;
    }
    CCalcSetka.prototype.InterpFunction=function(ValueIn,CurParam)
    {
        CurParam=parseFloat(CurParam);
        if(ValueIn.indexOf('-')==-1)
            return ValueIn.replace(',','.');
        
        try
        {
            var Points=ValueIn.split('-');
            //me.Debug("Value In:"+ValueIn+" "+Points.length);
            
            for (var i=0;i<Points.length;i++)
            {
                //me.Debug("point :"+Points[i]+">"+CurParam);    
                if(CurParam< parseFloat(Points[i].split(',')[0]) )
                    if(i>0)
                    {
                        var X1=parseFloat(Points[i-1].split(',')[0]);
                        var X2=parseFloat(Points[i].split(',')[0]);
                        var Y1=parseFloat(Points[i-1].split(',')[1].split('%')[0]);
                        var Y2=parseFloat(Points[i].split(',')[1].split('%')[0]);
                        var B=Math.log(Y2/Y1)/Math.log(X2/X1);
                        var A=Y1/Math.pow(X1,B);
                        var Ret=A*Math.pow(CurParam,B);
                        me.Debug("InterpFunction ret: "+Ret);
                        return Ret;
                    }
                    else
                    {
                        me.Debug("ret first");
                        return Points[0].split(',')[1].split('%')[0];
                    }
            }
            me.Debug("ret last "+Points[Points.length-1].split(',')[1].split('%')[0]);
            return Points[Points.length-1].split(',')[1].split('%')[0];
        }
        catch(e){return 0;}
    }
    CCalcSetka.prototype.ProcessMontaj=function(MontajPrice,LenValue,SumValue)
    {        
        if(curMontaj && MontajPrice!='')
        {
            return SumValue*me.InterpFunction(MontajPrice,LenValue)/100;
        }
        return 0;
    }
    CCalcSetka.prototype.ProcessAddition = function(curElt, count)
    {
        if (count == undefined) count = 1;

        var s_cur = 0;
        var s_montaj = 0;

        me.Debug("In " + curElt.Name + ' ' + curElt.CalcType + ' ' + curElt.Price + ' ' + curElt.ApplyTo);
        me.Debug("params " + sumWeightSections + ' ' + sumWeightPosts + ' ' + sumLen + ' ' + sumSquare + ' ' + sumCount);

        var persent_add = 0;
        if (curElt.priceUp != '')
        {
            persent_add = me.InterpFunction(curElt.priceUp, count);
        }


        //Расчёт по кол-ву секций(столбов)
        if (curElt.CalcType == 111)
        {
            s_cur = curElt.Price * sumCount;
            s_cur += s_cur * persent_add / 100;
            s_cur *= count;
            s_montaj = me.ProcessMontaj(curElt.MontajPrice, sumLen, s_cur);
        }

        if (curElt.CalcType == 86)
        {
            s_cur = curElt.Price;
            s_cur += s_cur * persent_add / 100;
            s_cur *= count;
            s_montaj = me.ProcessMontaj(curElt.MontajPrice, 0, s_cur);
        }
        if (curElt.CalcType == 85)
        {
            if (curElt.ApplyTo == 93)
            {
                s_cur = curElt.Price * sumWeightPosts;
                s_cur += s_cur * persent_add / 100;
                s_cur *= count;
                s_montaj = me.ProcessMontaj(curElt.MontajPrice, sumWeightPosts, s_cur);
            }
            else { s_cur = curElt.Price * sumWeightSections; s_montaj = me.ProcessMontaj(curElt.MontajPrice, sumWeightSections, s_cur); }
        }
        if (curElt.CalcType == 83)
        {
            if (curElt.ApplyTo == 93)
            {
                s_cur = curElt.Price * curHeight.PostHeight * sumCount;
                s_cur += s_cur * persent_add / 100;
                s_cur *= count;
                s_montaj = me.ProcessMontaj(curElt.MontajPrice, curHeight.PostHeight * sumCount, s_cur);
            }
            else
            {
                s_cur = curElt.Price * sumLen;
                s_cur += s_cur * persent_add / 100;
                s_cur *= count;
                s_montaj = me.ProcessMontaj(curElt.MontajPrice, sumLen, s_cur);
            }
        }
        if (curElt.CalcType == 84) if (curElt.ApplyTo == 92)
        {
            s_cur = curElt.Price * sumSquare;
            s_cur += s_cur * persent_add / 100;
            s_cur *= count;
            s_montaj = me.ProcessMontaj(curElt.MontajPrice, sumSquare, s_cur);
        }


        if (s_cur != 0)
        {


            if (count != 1)
                tmpOutput += "<tr><td>" + curElt.Name + "&nbsp;(" + count.toNum() + ")шт.&nbsp;</td><td>" + round(s_cur, 0).toNum() + " руб.";
            else
                tmpOutput += "<tr><td>" + curElt.Name + "&nbsp;</td><td>" + round(s_cur, 0).toNum() + " руб.";
            if (s_montaj > 0)
            {
                //tmpOutput+="<br/>Монтаж: "+(Math.round(s_cur*curElt.MontajPrice)/100).toString()+" руб.";
                tmpOutput += "<br/>Монтаж: " + round(s_montaj, 0).toNum() + " руб.";
                sumMontaj += s_montaj;
            }
            tmpOutput += " </td></tr>";
        }
        return s_cur;
    }
    CCalcSetka.prototype.Calc = function()
    {
        if (execState == "stop") me.CalcProcess();
        if (execState == "start") execState = "restart";
    }
    CCalcSetka.prototype.CalcProcess = function()
    {
        execState = "start";
        evOnCalcStart.Raise();

        me.start = true;
        sumWeight = 0;
        sumMontaj = 0;
        me.DebugClear();

        me.HideRows();
        if (!me.ValidateParams())
        {
            execState = "stop";
            return;
        }
        //me.MSG('Некорректные параметры');
        var secOverflow = me.GetBaseParam('sections_overflow').Value;
        me.Debug("Перекрытие секций,мм:" + secOverflow);

        var Count = Math.floor(curLen * 1000 / (curSection.Width - secOverflow));
        me.Debug("Кол-во секций:" + Count);

        if (Count != curLen * 1000 / (curSection.Width - secOverflow)) Count++;
        sumCount = Count;
        sumLen = curLen;
        sumSquare = curLen * (curHeight.Sec1 + curHeight.Sec2 + curHeight.Sec3);

        sumCink = 0;
        sumPoly = 0;
        var sumCinkPosts = 0;
        var sumPolyPosts = 0;

        if (eltCromPost.selectedIndex != -1)
            curCover = lCover[eltCromPost.options[eltCromPost.selectedIndex].value];
        else
            curCover = null;

        if (eltPostsCover2.selectedIndex != -1)
            curCover2 = lCover[eltPostsCover2.options[eltPostsCover2.selectedIndex].value];
        else
            curCover2 = null;
        //curCrom = eltCromPost.options[eltCromPost.selectedIndex].value;
        //curPolymer = (curCrom == 'poly' || curCrom == 'poly+cold');

        var postS = round(me.GetPostInfo(Count) * me.GetBaseParam('rub_per_cny').Value, 2);
        sumCinkPosts = sumCink / curCK * (Count + 1);
        sumPolyPosts = sumPoly / curCK * (Count + 1);

        me.MSGClear();
        //me.MSG(" столба, мм:"+curHeight.PostHeight.toString()+"<br/>");        

        //me.MSG("Цена столба, р:"+postS.toString()+"<br/>");
        var sumPost = round(postS * (Count + 1), 0);
        //me.MSG("Сумма по столбам, р.:"+(sumPost).toString()+"<br/>");
        me.Debug("---------------");

        weightSect = 0;
        //curCrom = eltCromSection.options[eltCromSection.selectedIndex].value;
        curCover = lCover[eltCromSection.options[eltCromSection.selectedIndex].value];
		curCover2 = null;
		
        me.Debug("curCover sec1= " + curCover.ID);
        //curPolymer=eltPolymerSection.checked;
        //curPolymer = (curCrom == 'poly' || curCrom == 'poly+cold');

        var Sec1, Sec2, Sec3;
        Sec1 = 0; Sec2 = 0; Sec3 = 0;

        var sumCinkSections = 0;
        var sumPolySections = 0;

        sumCink = 0; sumPoly = 0;
        if (curHeight.Sec1 > 0) Sec1 = round(me.GetSectionInfo(Count, curHeight.Sec1, curHeight.Sec1Count) * me.GetBaseParam('rub_per_cny').Value, 0);
        sumPolySections += sumPoly / curCK * Count;
        sumCinkSections += sumCink / curCK * Count;
        sumCink = 0; sumPoly = 0;

        curCover = lCover[eltCromSection2.options[eltCromSection2.selectedIndex].value];
        //curCrom = eltCromSection2.options[eltCromSection2.selectedIndex].value;
        //curPolymer = (curCrom == 'poly' || curCrom == 'poly+cold');

        if (curHeight.Sec2 > 0) Sec2 = round(me.GetSectionInfo(Count, curHeight.Sec2, curHeight.Sec2Count) * me.GetBaseParam('rub_per_cny').Value, 0);
        sumPolySections += sumPoly / curCK * Count;
        sumCinkSections += sumCink / curCK * Count;
        sumCink = 0; sumPoly = 0;

        curCover = lCover[eltCromSection3.options[eltCromSection3.selectedIndex].value];
        //curCrom = eltCromSection3.options[eltCromSection3.selectedIndex].value;
        //curPolymer = (curCrom == 'poly' || curCrom == 'poly+cold');

        if (curHeight.Sec3 > 0) Sec3 = Math.round(me.GetSectionInfo(Count, curHeight.Sec3, curHeight.Sec3Count) * me.GetBaseParam('rub_per_cny').Value, 0);
        sumPolySections += sumPoly / curCK * Count;
        sumCinkSections += sumCink / curCK * Count;
        sumCink = 0; sumPoly = 0;

        var sumSec = round((Sec1 + Sec2 + Sec3) * Count, 2);
        var sumSec1 = round((Sec1) * Count, 2);
        var sumSec2 = round((Sec2) * Count, 2);
        var sumSec3 = round((Sec3) * Count, 2);
        //me.MSG("Цена секции, р.:"+(Sec1+Sec2+Sec3).toString()+"<br/>");
        //me.MSG("Сумма по секциям, р.:"+(sumSec).toString()+"<br/>");
        me.Debug("---------------");

        var Output = '';

        Output += "";

        Output += "<table border='0' class='tab1'>";
        //По секциям
        Output += "<tr><td>Количество секций</td><td>" + Count.toNum() + " шт.</td></tr>";

        Output += "<tr><td>Вес 1 секции " + round(weightSect, 1).toString() + " кг.</td><td>Всего: " + round(weightSect * Count, 0).toNum() + " кг.</td></tr>";
        Output += "<tr><td>Cтоимость 1-й секции</td><td>" + round(sumSec1 / Count, 0).toNum() + " руб.</td></tr>";
        if (sumSec2 > 0) Output += "<tr><td>Cтоимость 2-й секции</td><td>" + round(sumSec2 / Count, 0).toNum() + " руб.</td></tr>";
        if (sumSec3 > 0) Output += "<tr><td>Cтоимость 3-й секции</td><td>" + round(sumSec3 / Count, 0).toNum() + " руб.</td></tr>";
        Output += "</table>";

        //По столбам
        Output += "<table border='0' class='tab1'>";
        if (sumPost > 0) Output += "<tr><td>Количество столбов</td><td>" + Count.toNum() + " шт.</td></tr>";
        if (weightPost > 0)
        {
            Output += "<tr><td>Вес 1 столба " + round(weightPost, 1).toString() + " кг.</td><td>Всего: " + round(weightPost * (Count), 0).toNum() + " кг.</td></tr>";
            Output += "<tr><td>Длина столба</td><td>" + round(curHeight.PostHeight / 1000, 1).toString() + " м.</td></tr>";
        }
        if (sumPost > 0) Output += "<tr><td>Cтоимость 1 столба</td><td>" + round(sumPost / Count, 0).toNum() + " руб.</td></tr>";

        Output += "</table>";

        Output += "<table border='0' class='tab2'>";
        //if(sumCinkPosts+sumCinkSections>0) Output+="<tr><td>Цинкование</td><td>"+(Math.round((sumCinkPosts+sumCinkSections)*me.GetBaseParam('rub_per_cny').Value*100)/100).toString()+" руб.</td></tr>";
        //if(sumPolySections+sumPolyPosts>0) Output+="<tr><td>Покрытие полимером</td><td>"+(Math.round((sumPolySections+sumPolyPosts)*me.GetBaseParam('rub_per_cny').Value*100)/100).toString()+" руб.</td></tr>";

        tmpOutput = '';
        var sumAdditions = me.AdditionsCalc();
        var sumAdditionsList = me.AdditionsListCalc();
        Output += tmpOutput;

        //Output+="<tr><td>&nbsp;</td><td>&nbsp;</td></tr>";
        Output += "</table>";
        if (curMontaj) sumMontaj += me.GetBaseParam('montaj').Value * (sumSec + sumPost) / 100;
        Output += "<table border='0' class='tab3' >";
        Output += "<tr><td>Стоимость секций</td><td>" + (sumSec).toNum() + " руб.</td></tr>";
        if (sumPost > 0) Output += "<tr><td>Стоимость столбов</td><td>" + (sumPost).toNum() + " руб.</td></tr>";
        Output += "<tr><td>Общий вес</td><td>" + round((weightPost * (Count) + weightSect * Count), 0).toNum() + " кг.</td></tr>";

        //Доставка
        var Delivery = 0;
        if (eltDeliveryClient.options[eltDeliveryClient.selectedIndex].value != "" && eltDeliveryClientKM.value != "")
        {
            var KM = parseInt(eltDeliveryClient.options[eltDeliveryClient.selectedIndex].value) + parseInt(eltDeliveryClientKM.value);
            var DelivaryTimes = sumLen / me.GetBaseParam('building_speed').Value;
            if (Math.floor(DelivaryTimes) != DelivaryTimes) DelivaryTimes = Math.floor(DelivaryTimes) + 1;
            if (sumMontaj == 0) DelivaryTimes = 1;
            Delivery = DelivaryTimes * round(KM * me.GetBaseParamValueRub('delivery_to_client'), 0);
            //alert(me.GetBaseParamValueRub('delivery_to_client_base'));
            Delivery += me.GetBaseParamValueRub('delivery_to_client_base');
            Output += "<tr><td>Доставка</td><td>" + Delivery.toNum() + " руб.</td></tr>";
        }
        Output += "<tr><td>Cтоимость забора за 1 пог. м.</td><td>" + round((Delivery + sumPost + sumSec + sumAdditions + sumMontaj + sumAdditionsList) / sumLen, 0).toNum() + " руб.</td></tr>";
        if (sumMontaj > 0) Output += "<tr><td>Монтаж</td><td>" + round(sumMontaj, 0).toNum() + " руб.</td></tr>";

        Output += "<tr><td><b>Общая стоимость ограждения</b></td><td><b>" + round((Delivery + sumPost + sumSec + sumAdditions + sumMontaj + sumAdditionsList), 0).toNum() + " руб.</b></td></tr>";

        Output += "</table>";

        me.MSG(Output);

        evOnCalcEnd.Raise();

        if (execState == "restart") me.CalcProcess();
        execState = "stop";
        //me.MSG("Итого, р.:"+(sumPost+sumSec+sumAdditions).toString()+"<br/>");
    }

    CCalcSetka.prototype.IsSectionCovered = function()
    {
        if (eltCromSection.selectedIndex == -1) return 0;
        var cov = lCover[eltCromSection.options[eltCromSection.selectedIndex].value];
        if (cov == undefined) return 0;
        if (cov.height == '') return 0;
        var ret = parseFloat(cov.height);
        return ret;
        //return (eltCromSection.options[eltCromSection.selectedIndex].value == "poly" || eltCromSection.options[eltCromSection.selectedIndex].value == "poly+cold");
    }
	CCalcSetka.prototype.ValidateParams = function()
	{
	    //eltLen,eltCellH,eltCellW,eltHeight,eltSection,
	    //eltOutput,eltPosts,eltCrom,eltPolymer,eltHamerait;
	    //eltAdditions=new Array();

	    //curLen,curCellH,curCellW,curHeight,curSection,curPost,curCrom,curPolymer,curHamerait;

	    //lAdditions lBaseParams lCellHeight lCellWidth lHeight lSection lPosts

	    if (eltDeliveryClient != undefined && eltDeliveryClientKM != undefined)
	    {
	        eltDeliveryClientKM.value = eltDeliveryClientKM.value.replace(/[^\d]/g, "");
	        eltDeliveryClientKM.value = eltDeliveryClientKM.value.replace(",", ".");
	        if (parseInt(eltDeliveryClientKM.value).toString() == 'NaN') eltDeliveryClientKM.value = "";
	    }
	    else return false;

	    if (eltLen.value == '') return false;
	    curLen = eltLen.value.replace(',', '.');

	    try { curLen = parseFloat(curLen); } catch (e) { return false; }

	    if (eltCell.selectedIndex == -1) return false;
	    curCell = lCell[eltCell.options[eltCell.selectedIndex].value];

	    /*
	    if(eltCellH.selectedIndex==-1) return false;
	    curCellH=lCellHeight[eltCellH.options[eltCellH.selectedIndex].value];
        
	    if(eltCellW.selectedIndex==-1) return false;
	    curCellW=lCellWidth[eltCellW.options[eltCellW.selectedIndex].value];
	    */

	    if (eltHeight.selectedIndex == -1) return false;
	    curHeight = lHeight[eltHeight.options[eltHeight.selectedIndex].value];

	    eltSec1Info.innerHTML = 'Высота: ' + curHeight.Sec1.toString() + 'mm';
	    eltSec2Info.innerHTML = 'Высота: ' + curHeight.Sec2.toString() + 'mm';
	    eltSec3Info.innerHTML = 'Высота: ' + curHeight.Sec3.toString() + 'mm';

	    var displayType = $.browser.msie ? "block" : 'table-row';
	    if (curHeight.Sec1 != 0 && curHeight.Sec2 != 0 && curHeight.Sec3 != 0)
	    {
	        eltHeightInfo.innerHTML = "<img alt='' src='/images/vip/sec3.gif' style='float:left;margin:5px;'/> ";
	        eltHeightInfo.innerHTML += 'Секции :<br/>' + curHeight.Sec3 + 'mm<br/>' + curHeight.Sec2 + 'mm<br/>' + curHeight.Sec1 + 'mm';
	        //eltHeightInfo.innerHTML+="<br/><img alt='' src='/images/vip/sec3.gif'/> ";

	        $(".section3_area,.section2_area").slideDown('normal', function() { $(this).css('display', displayType); });

	    }
	    if (curHeight.Sec1 != 0 && curHeight.Sec2 != 0 && curHeight.Sec3 == 0)
	    {
	        eltHeightInfo.innerHTML = "<img alt='' src='/images/vip/sec2.gif' style='float:left;margin:5px;'/> ";
	        eltHeightInfo.innerHTML += 'Секции :<br/>' + curHeight.Sec2 + 'mm<br/>' + curHeight.Sec1 + 'mm';
	        $(".section2_area").slideDown('normal', function() { $(this).css('display', displayType); });
	        $(".section3_area").slideUp('normal');
	    }
	    if (curHeight.Sec1 != 0 && curHeight.Sec2 == 0 && curHeight.Sec3 == 0)
	    {
	        eltHeightInfo.innerHTML = "<img alt='' src='/images/vip/sec1.gif' style='float:left;margin:5px;'/> ";
	        eltHeightInfo.innerHTML += 'Секции :<br/>' + curHeight.Sec1 + 'mm';
	        $(".section3_area,.section2_area").slideUp('normal');
	    }

	    //if(eltPolymerSection.checked) 
	    if (eltCromSection.options[eltCromSection.selectedIndex].value == "poly" || eltCromSection.options[eltCromSection.selectedIndex].value == "poly+cold")
	        $(".ware_weight_output").html((me.GetBaseParam('weight_hor').Value + 0.5).toString() + ' мм/' + (me.GetBaseParam('weight_vert').Value + 0.5).toString() + ' мм с полимерным покрытием.');
	    else
	        $(".ware_weight_output").html((me.GetBaseParam('weight_hor').Value).toString() + ' мм/' + (me.GetBaseParam('weight_vert').Value).toString() + ' мм.');

	    /*
	    if(eltPolymerSection2.checked) 
	    eltPolymerSectionInfo2.innerHTML='Диаметр прутка: '+(me.GetBaseParam('weight_hor').Value+0.5).toString()+' mm';
	    else
	    eltPolymerSectionInfo2.innerHTML='Диаметр прутка: '+(me.GetBaseParam('weight_hor').Value).toString()+' mm';
        
	    if(eltPolymerSection3.checked) 
	    eltPolymerSectionInfo3.innerHTML='Диаметр прутка: '+(me.GetBaseParam('weight_hor').Value+0.5).toString()+' mm';
	    else
	    eltPolymerSectionInfo3.innerHTML='Диаметр прутка: '+(me.GetBaseParam('weight_hor').Value).toString()+' mm';
	    */

	    if (eltSection.selectedIndex == -1) return false;
	    curSection = lSection[eltSection.options[eltSection.selectedIndex].value];

	    if (eltPosts.selectedIndex == -1) return false;
	    curPost = lPosts[eltPosts.options[eltPosts.selectedIndex].value];


	    //curHamerait = eltHamerait.checked;
	    curMontaj = eltMontaj.checked;
	    return true;
	}
    
    CCalcSetka.prototype.InitMontaj=function(Elt)
    {
        eltMontaj=Elt;
        eltMontaj.onclick=me.OnChangeParam;
    }
    CCalcSetka.prototype.InitDeliveryClient = function(eDeliveryClient, eDeliveryClientKM)
    {
        eltDeliveryClient = eDeliveryClient;
        eltDeliveryClientKM = eDeliveryClientKM;

        eltDeliveryClient.onchange = me.OnChangeParam;
        eltDeliveryClientKM.onchange = me.OnChangeParam;
        eltDeliveryClientKM.onkeyup = me.OnChangeParam;
    }
    CCalcSetka.prototype.InitLength=function(Elt)
    {
        eltLen=Elt;
        eltLen.onchange=me.OnChangeParam;
        eltLen.onkeyup=me.OnChangeParam;
    }
    CCalcSetka.prototype.InitPolimer=function(Post,Section,Section2,Section3,Info1,Info2,Info3)
    {
        eltPolymerPost=Post;
        eltPolymerPost.onclick=me.OnChangeParam;
        eltPolymerSection=Section;eltPolymerSection.onclick=me.OnChangeParam;
        eltPolymerSection2=Section2;if(eltPolymerSection2!=null) eltPolymerSection2.onclick=me.OnChangeParam;
        eltPolymerSection3=Section3;if(eltPolymerSection3!=null) eltPolymerSection3.onclick=me.OnChangeParam;
        
        eltPolymerSectionInfo1=Info1;
        eltPolymerSectionInfo2=Info2;
        eltPolymerSectionInfo3=Info3;
    }
    CCalcSetka.prototype.InitHamerait=function(Elt)
    {
        eltHamerait=Elt;
        eltHamerait.onclick=me.OnChangeParam;
    }
    
    CCalcSetka.prototype.InitCrom=function(Post,Section,Section2,Section3)
    {
        eltCromPost=Post;
        eltCromPost.onchange=me.OnChangeParam;
        eltCromSection=Section;
        eltCromSection.onchange=me.OnChangeParam;
        
        
        eltCromSection2=Section2;eltCromSection2.onchange=me.OnChangeParam;
        eltCromSection3=Section3;eltCromSection3.onchange=me.OnChangeParam;
    }
    CCalcSetka.prototype.InitOutput=function(Elt)
    {
        eltOutput=Elt;
    }
    CCalcSetka.prototype.InitSections=function(Elt,Sec1Info,Sec2Info,Sec3Info)
    {
        
        eltSection=Elt;
        eltSection.onchange=me.OnChangeParam;
        
        eltSec1Info=Sec1Info;
        eltSec2Info=Sec2Info;
        eltSec3Info=Sec3Info;
        //Fill sections
        me.FillSelect(eltSection,lSection);        
    }
    CCalcSetka.prototype.FillSelect=function(Select,Arr)
    {
        Select.options.length=0;
        
        if(navigator.appName=="Microsoft Internet Explorer")
            for(var i=0;i<Arr.length;i++)
                    Select.add(new Option(Arr[i].Name, i.toString()));
        else
            for(var i=0;i<Arr.length;i++)
                    Select.add(new Option(Arr[i].Name, i.toString()),null);
    }
    CCalcSetka.prototype.InitHeights=function(Elt,EltInfo)
    {
        eltHeight=Elt;
        eltHeight.onchange=function(){me.OnChangeHeight();me.OnChangeParam();};
        
        eltHeightInfo=EltInfo;
        //Fill 
                    
        me.FillSelect(eltHeight,lHeight);   
    }
    CCalcSetka.prototype.InitCellHeight=function(Elt)
    {
        eltCellH=Elt;
        eltCellH.onchange=me.OnChangeParam;
        //Fill 
        
        me.FillSelect(eltCellH,lCellHeight);   
    }
    CCalcSetka.prototype.InitCells=function(Elt)
    {
        eltCell=Elt;
        eltCell.onchange=me.OnChangeParam;
        //Fill 
        me.FillSelect(eltCell,lCell);   
    }
    CCalcSetka.prototype.InitCellWidth=function(Elt)
    {
        eltCellW=Elt;
        eltCellW.onchange=me.OnChangeParam;
        //Fill 
        me.FillSelect(eltCellW,lCellWidth);   
    }
    CCalcSetka.prototype.InitAddition=function(Elt,Position)
    {
        eltAdditions[Position]=Elt;
        Elt.onclick=me.OnChangeParam;
    }
    CCalcSetka.prototype.InitAdditionList=function(Elt,GroupId)
    {
        eltAdditionsList[GroupId]=Elt;
        Elt.onchange=me.OnChangeParam;
    }

    CCalcSetka.prototype.InitPosts = function(Elt, Cover, Cover2)
    {
        eltPosts = Elt;
        eltPosts.onchange = me.PostChange;
        eltPostsCover = Cover;
        eltPostsCover2 = Cover2;

        eltPostsCover2.onchange = me.OnChangeParam;

        me.FillPosts();
        me.PostChange();
        //me.FillSelect(eltPosts,lPosts);
    }
    CCalcSetka.prototype.PostChange = function()
    {
        if (eltPosts == undefined) return;

        if (eltPosts.selectedIndex == -1) return;
        var post = lPosts[eltPosts.options[eltPosts.selectedIndex].value];


        var fillSelect = function(Select, Arr)
        {
            var oldValue = Select.selectedIndex == -1 ? -1 : Select.options[Select.selectedIndex].value;
            Select.options.length = 0;
            var isIE = navigator.appName == "Microsoft Internet Explorer";

            var newIndex = -1;

            for (var i = 0; i < Arr.length; i++)
            {
                //alert(Arr[i]);
                if (Arr[i] == '') continue;
                if (isIE)
                    Select.add(new Option(lCover[Arr[i]].NAME, Arr[i]));
                else
                    Select.add(new Option(lCover[Arr[i]].NAME, Arr[i]), null);
                if (Arr[i] == oldValue) newIndex = Select.options.length - 1;
            }
            if (newIndex != -1) Select.selectedIndex = newIndex;
        }
        fillSelect(eltPostsCover, post.cover);
        fillSelect(eltPostsCover2, post.cover2);

        me.OnChangeParam();
    }
    CCalcSetka.prototype.FillPosts = function()
    {

        var oldValue = 0;
        var newIndex = 0;

        if (eltPosts.selectedIndex != -1) oldValue = eltPosts.options[eltPosts.selectedIndex].value



        if (eltHeight.selectedIndex != -1)
            curHeight = lHeight[eltHeight.options[eltHeight.selectedIndex].value];
        //alert(curHeight.PostHeight);

        var Select = eltPosts;
        var Arr = lPosts;
        Select.options.length = 0;
        var postHeight = curHeight.Sec1 + curHeight.Sec2 + curHeight.Sec3;

        var isIE = navigator.appName == "Microsoft Internet Explorer";
        for (var i = 0; i < Arr.length; i++)
        {

            if (Arr[i].heightFrom <= postHeight && Arr[i].heightTo >= postHeight)
            {
                if (isIE)
                    Select.add(new Option(Arr[i].Name, i.toString()));
                else
                    Select.add(new Option(Arr[i].Name, i.toString()), null);
                if (i == oldValue) newIndex = Select.options.length-1;
            }
        }
        if (newIndex != -1) Select.selectedIndex = newIndex;
    }
    
    CCalcSetka.prototype.GetAdditions=function()
    {
        var ret='';
        
        for(var i=0;i<lAdditions.length;i++)
        {
            if(lAdditions[i].CalcType==86) //Единичный расчёт
                ret += "<tr class='order_info'><td  class='c1'>" + lAdditions[i].Name + "</td><td class='c2'><input type='checkbox' id='addition_" + i.toString() + "'/>&nbsp;количество:<input type='textbox' size='4' value='1' id='addition_" + i.toString() + "_count'/></td><td  class='c3'>" + lAdditions[i].Description + "&nbsp;</td></tr>";
            else
                ret += "<tr class='order_info'><td  class='c1'>" + lAdditions[i].Name + "</td><td class='c2'><input type='checkbox' id='addition_" + i.toString() + "'/></td><td  class='c3'>" + lAdditions[i].Description + "&nbsp;</td></tr>";
        }
        init_additions_to=setInterval(me.InitAdditions,1000);
        return ret;
    }
    CCalcSetka.prototype.GetAdditionsList=function()
    {
        var ret='';
        
        for (var i in lAdditionsList)
        {
            ret += "<tr class='order_info'><td  class='c1'>" + lAdditionsList[i].GroupName + "</td><td class='c2'>";
            ret+="<select id='additions_list_"+lAdditionsList[i].GroupId+"'>";
            var first=true;
            //alert(i.GroupName+' '+i.items+' '+i);
            for(var j=0;j<lAdditionsList[i].items.length;j++)
            {
                ret+="<option value='"+j.toString()+"'>"+lAdditionsList[i].items[j].Name+"</option>";
            }
            ret+="</select>";
            ret += "</td><td  class='c3' id='additions_list_desc_" + lAdditionsList[i].GroupId + "'>" + lAdditionsList[i].GroupDescription + "&nbsp;</td></tr>";
        }
        init_additions_list_to=setInterval(me.InitAdditionsList,1000);
        return ret;
    }
    CCalcSetka.prototype.InitAdditionsList=function()
    {
        clearInterval(init_additions_list_to);
        for(var i in lAdditionsList)
            me.InitAdditionList(document.getElementById('additions_list_'+lAdditionsList[i].GroupId),i);   
    }
    CCalcSetka.prototype.InitAdditions=function()
    {
        clearInterval(init_additions_to);
        var count;
        for(var i=0;i<lAdditions.length;i++)
        {
            me.InitAddition(document.getElementById('addition_'+i.toString()),i);    
            count=document.getElementById('addition_'+i.toString()+'_count');
            if(count!=undefined) 
            {
                count.onchange=me.OnChangeParam;
                count.onkeyup=me.OnChangeParam;
            }
        }
    }
    CCalcSetka.prototype.Delivery=function(sk,mk)
    {
        //alert(me.GetBaseParamValueCNY('costs_in_china')+" "+me.GetBaseParamValueCNY('sea_tarif'));
        //alert(me.GetBaseParamValueCNY('custom_duty_per_kg')+" "+me.GetBaseParamValueCNY('custom_commision')+" "+me.GetBaseParamValueCNY('delivery_on_russia_to_sclad'));
        //me.Debug("Delivery in sk="+sk);

        var sout = 0;
        me.Debug("MK :" + mk);
        me.Debug("Морской тариф, CNY :"+me.GetBaseParamValueCNY('sea_tarif'));
        sout+=me.GetBaseParamValueCNY('sea_tarif');
        me.Debug("Таможенная пошлина, CNY :"+mk.toString()+' '+(mk*me.GetBaseParamValueCNY('custom_duty_per_kg')).toString());
        sout+=mk*me.GetBaseParamValueCNY('custom_duty_per_kg');
        me.Debug("Таможенная коммисия, CNY :"+me.GetBaseParamValueCNY('custom_commision'));
        sout+=me.GetBaseParamValueCNY('custom_commision');
        me.Debug("Доставка по россии, CNY :"+me.GetBaseParamValueCNY('delivery_on_russia_to_sclad'));
        sout+=me.GetBaseParamValueCNY('delivery_on_russia_to_sclad');
        
        me.Debug("Доставка, CNY:"+sout);
        return sk+sout;
    }
    /*
        ms  - масса 1-го элемента
        ck  - кол-во эл-тов
        
        Возвращает сумму покрытия в CNY, по весу
    */
    CCalcSetka.prototype.GetCoverSumm = function(ms, ck)
    {
        if (curCover == undefined || curCover == null)
        {
            me.Debug("Покрытие: параметры не корректны !");
            return 0;
        }
        var summ = 0;
        if (curCover.calc_type == 122)
        {
            summ = curCover.toCNY() * ms * ck;
        }
        me.Debug("Покрытие: " + summ);
        return summ;
    }
    /*
    square  - полощадь 1-го элемента, м^2
    ck      - кол-во эл-тов
        
    Возвращает сумму покрытия по площади, в CNY
    */
    CCalcSetka.prototype.GetCoverSummM2 = function(square, ck)
    {
        if (curCover == undefined || curCover == null)
        {
            me.Debug("Покрытие м2: параметры не корректны !");
            return 0;
        }
        var summ = 0;
        if (curCover.calc_type == 125)
        {
            summ = curCover.toCNY() * square * ck;
        }
        me.Debug("Покрытие М2: " + summ);
        return summ;
    }
    CCalcSetka.prototype.Facility = function(sk, ms, ck, MetalPricePerKg, WorkPricePerUnit, PercentFacility, PercentManager, PercentTransfer)
    {
        //me.Debug("Facility in sk="+sk);

        var CinkHotPricePerKg = me.GetBaseParamValueCNY('cink_hot_per_kg');
        var CinkColdPricePerKg = me.GetBaseParamValueCNY('cink_cold_per_kg');
        var PolymerPricePerKg = me.GetBaseParamValueCNY('covering_polimer_per_kg');

        sk += ms * ck * MetalPricePerKg;

        var cover = me.GetCoverData(sk, ms*ck, 0);
        sk = cover.summ;
        
        //sk += me.GetCoverSumm(ms, ck);

        /*
        if(curCrom!='none')        
        if(curCrom=='hot'){sumCink=ms*ck*CinkHotPricePerKg; sk+=ms*ck*CinkHotPricePerKg;}
        else { sumCink = ms * ck * CinkColdPricePerKg; sk += ms * ck * CinkColdPricePerKg; }
            
        // ??? Зачем, посчитано выше
        if(curCrom=='hot')
        {
        sumCink=ms*ck*CinkHotPricePerKg;
        sk+=ms*ck*CinkHotPricePerKg;
        //hot_cink_add_weight
        }
        //Расчет холодного цинкования
        if (curCrom == 'poly+cold') { sumCink = ms * ck * CinkColdPricePerKg; sk += ms * ck * CinkColdPricePerKg; }
        //Расчет покрытия полимером
        if (curCrom == 'poly' || curCrom == 'poly+cold') { sk += ms * ck * PolymerPricePerKg; sumPoly = ms * ck * PolymerPricePerKg; }
        */
        //if(curPolymer) {sk+=ms*ck*PolymerPricePerKg; sumPoly=ms*ck*PolymerPricePerKg;}
        me.Debug("Хол. цинк " + (ms * ck * CinkColdPricePerKg).toString());
        me.Debug("Полимер " + (ms * ck * PolymerPricePerKg).toString());

        if (WorkPricePerUnit > 0) sk += ck * WorkPricePerUnit;
        sk += sk * PercentFacility / 100;
        sk += sk * PercentManager / 100;
        me.Debug("Затраты в китае, CNY: " + me.GetBaseParamValueCNY('costs_in_china'));

        sk += me.GetBaseParamValueCNY('costs_in_china');
        sk += sk * PercentTransfer / 100;

        me.Debug("Производство +% , CNY:" + sk + " единица:" + Math.round(sk / ck));
        return sk;
    }
    
}

var calcSetka=new CCalcSetka(null);
//var calcSetka=new CCalcSetka(new CDebug(300,700,1100,700));

