var pricelist = {"blocks":[34000,41500,44500,49000,51500],"tiles":[[200,3700,3900,4100],[300,4300,4500,4700]],"sides":[4000,5500],"slab":{"50":[5300,6000,7200],"60":[5700,6500,7800],"70":[6300,7000,8400],"80":[6600,7300,8700],"90":[7000,7700,9300],"100":[7700,8500,10200],"120":[8800,9700,10700],"140":[10500,11600,12800],"150":[11200,12400,13600],"200":[15000,16500,18100],"250":[18800,20700,22800],"300":[22500,24700,27300]},"slabRegularSizes":[50,60,80,100,120,150,200],"polishing":[1500,3000],"canting":["5%","10%"],"common":[[["600x400x50",1306,1450],["500x150x120",577,622],["600x80x50(2)","500x80x50(1)",632,714],[2267,2470]],[["600x400x80",1499,1643],["500x200x120",770,830],["600x80x80(2)","500x80x80(1)",810,892],[2793,3010]],[["800x400x50",1741,1933],["500x150x120",577,622],["800x80x50(2)","500x80x50(1)",780,882],[2830,3097]],[["800x400x80",1999,2191],["500x200x120",770,830],["800x80x80(2)","500x80x80(1)",1000,1102],[3477,3754]],[["900x450x80",2530,2773],["600x200x120",924,996],["900x80x80(2)","600x80x80(1)",1144,1259],[4235,4580]],[["1000x500x50",2721,3021],["600x200x120",924,996],["1000x80x80(2)","600x80x80(1)",1240,1365],[4544,4992]],[["1000x500x80",3124,3424],["600x200x150",1173,1245],["1000x80x80(2)","600x80x80(1)",1240,1365],[5065,5471]],[["1200x600x80",4498,4930],["700x200x150",1368,1452],["1200x100x80(2)","700x100x80(1)",1589,1775],[7091,7656]],[["1200x600x100",5483,5915],["700x250x150",1711,1816],["1200x100x80(2)","700x100x80(1)",1589,1775],[7933,8508]]]}; // Для изменения цен - меняешь priceIndex как в karelgran.ru/xl! TO CHANGE PRICES - change priceIndex same to karelgran.ru/xl! var inStd = function (p, _std) { return Array.isArray(_std) ? _std.indexOf(p) != -1 : (p == _std || _std == "*"); } var isStd = function (l, w, d) { var a = getMin(l, w, d); for (var i = 0; i < std.length; i++) { if (inStd(a[0], std[i][0]) && inStd(a[1], std[i][1]) && inStd(a[2], std[i][2])) return true; } return false; } var isSemiStd = function (l, w, d) { var a = getMin(l, w, d); for (var i = 0; i < semistd.length; i++) { if (inStd(a[0], semistd[i][0]) && inStd(a[1], semistd[i][1]) && inStd(a[2], semistd[i][2])) return true; } return false; } function getProductTypeEx (l, w, h) { var min = getMin(l, w, h), t = null; if (min[0] * min[1] <= 110 && (min[1] + min[0]) < 21 && (min[1] / min[0] < 3)) t = 3; else if (min[1] / min[0] > 2) t = 1; else t = 2; return t; } var std = [ [[5, 8], 40, [60, 80]], [[5, 8], [50, 60], 100], [[5, 8], 60, 120], [[12, 15], [15, 20], [50, 60, 70]], [[5,8], [8, 10], [50, 60, 70, 80, 100, 120]] ] var semistd = [ [[5, 8], "*", [80, 100, 120]] ] function getProductType (l, w, h) { var min = getMin(l, w, h), t = null; if (min[0] * min[1] <= 110 && (min[1] + min[0]) < 21 && (min[1] / min[0] < 3)) t = 3; else if (min[0] * min[1] < 400 && (min[1] + min[0]) < 40) { if (min[1] / min[0] > 2) t = 1; else t = 2; } else t = 1; return t; } function getMin (a) { var a = Array.isArray(arguments[0]) ? JSON.parse(JSON.stringify(arguments[0])) : Array.prototype.slice.call(arguments); for (var i = 0; i < a.lenght; i++) { a[i] = parseFloat(a[i]); } a.sort(function (a,b) { return a - b }); return a; } function getCubicMeterCost (t, length, width, depth, notStela) { var priceIndex = 1, discount = 0; if (t == 1) { var c = 0, s = length * width / 10000; switch (Math.round(depth - 0.49)) { case 2: c = 240000; break; case 3: c = 180000; break; case 4: c = 150000; break; case 5: c = 136000; break; case 6: c = 126000; break; case 7: c = 116000; break; case 8: c = 103000; break; case 9: c = 100000; break; case 10: c = 100000; break; case 11: c = 100000; break; case 12: c = 100000; break; case 13: c = 100000; break; case 14: c = 100000; break; case 15: c = 100000; break; case 20: c = 100000; break; } /*switch (Math.round(depth - 0.49)) { case 2: case 3: case 4: case 5: discount = 0.05; break; case 6: discount = 0.05; break; case 7: discount = 0.05; break; // was 0.16 case 8: discount = 0.05; break; default: discount = 0.00; break; }*/ discount = notStela ? 0 : discount; if (depth > 15 && depth < 31 && depth != 20) c = 100000; else if (depth > 30) c = 100000 * (100 + (depth - 30) * 3) / 100; k1 = Math.pow(s > 1.30 ? (1 + s - 1.30) : 1, 0.9) - (s > 1.50 ? Math.pow((1 + s - 1.50), 0.6) - 1: 0) - (s > 1.70 ? Math.pow((1 + s - 1.70), 0.3) - 1: 0); k2 = Math.pow(length > 119 ? (100 + length - 119) / 100 : 1, 0.9) - (length > 150 ? Math.pow((100 + length - 150) / 100, 0.7) - 1 : 0) - (length > 170 ? Math.pow((100 + length - 170) / 100, 0.5) - 1 : 0) - (length > 170 ? Math.pow((100 + length - 170) / 100, 0.3) - 1 : 0); return priceIndex * k1 * k2 * c * (1 - discount); } else if (t == 2) { var c = getCubicMeterCost(1, length, width, depth, true) * Math.pow(length > 70 ? (100 + length - 70) / 100 : 1, 0.2), discount = 0.15; return c * (1 - discount); } else if (t == 3) { var c = 0, s = width * depth; if (s < 26) c = 120000; // 120000 per m3 else if (s < 41) c = 111000; // 111000 per m3 else if (s < 51) c = 100000; // 100000 per m3 else if (s < 61) c = 100000; // 100000 per m3 else if (s < 65) c = 90000; // 90000 per m3 else if (s < 81) c = 85000; // 85000 per m3 else if (s <= 110) c = 85000; // 85000 per m3 return priceIndex * (length > 120 ? c * Math.pow((100 + length - 120) / 100, 0.5) : c); } return 0; } function calculatePrice (l, w, d, p) { var min = getMin(l, w, d); var t = getProductTypeEx(min[2], min[1], min[0]); var cubicMeterCost = getCubicMeterCost(t, min[2], min[1], min[0]) * ((min[0] > 4 && min[2] * min[1] * min[0] < 10000 && (min[2] + min[1] < 50)) ? 2.2 : 1) * ((min[0] <= 4 && (min[1] < 30 || min[2] < 30)) ? 1.5 : 1); var decreaser = 0, increaser = 1, nstdCoef = 1.0; switch (p) { case 0: decreaser = l * w * 600 / 10000; break; case 2: increaser = 1.19; break; case 3: increaser = 1.28; break; case 4: increaser = 1.37; break; case 5: increaser = 1.5; break; } if (p > 1 && t == 3) increaser += 0.1; if (min[0] * min[1] * min[2] < 0.02 * 1000000 && min[0] * min[1] / min[0] >= 0.75 && min[1] / min[0] < 2 && min [2] / min[1] < 4 && min[0] * min[1] < 150 && t == 2 && !isStd(min[0], min[1], min[2])) increaser += 0.1; return Math.round(increaser * cubicMeterCost * l * w * d / 1000000 - decreaser) * (isStd(min[0], min[1], min[2]) ? 1 : nstdCoef); }