Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Здравствуйте, я еще не опытный javascript программист, очень хочу услышать критику кода / 8 сообщений из 8, страница 1 из 1
24.01.2014, 08:13
    #38536276
MediaRise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Здравствуйте, я еще не опытный javascript программист, очень хочу услышать критику кода
Здесь представлен мой код, хотел бы услышать критику в его адрес, а также возможно с точки зрения программиста, его улучшить

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
658.
659.
660.
661.
662.
663.
664.
665.
666.
667.
668.
669.
670.
671.
672.
673.
674.
675.
676.
677.
678.
679.
680.
681.
682.
683.
684.
685.
686.
687.
688.
689.
690.
691.
692.
693.
694.
695.
696.
697.
698.
699.
700.
701.
702.
703.
704.
705.
706.
707.
708.
709.
710.
711.
712.
713.
714.
715.
716.
717.
718.
719.
720.
721.
var b = []; // Основной объект
var ntv = 0; // следим за нтв
var cart = ''; // Кука которая следит за выбором параметров пакета пользователем


b = {
    ids: {
        ololo: 0,
        internet: 0,
        telephony: 0,
        ktv: 0
    },
    single: [],
    phone_has: 0,
    wifi_has: 1,
    _pult__has: 0,
    _karta__has: 0,
    tv: {
        type: 0,
        name: [],
        hd: 0,
        sd: 0,
        all_channels: 0
    },
    promo_period: 0,
    domain: 0,
    number: 0,
    _pult___karta_: 0,
    price: {// Используется для проставки цен в шаблон
        promo: 0, // цена на промо период
        common: 0, // обычная цена, после промо периода
        wifi_price: 0, // покупка wifi
        wifi_rent: 0, // аренда wifi
        _pult_: 0, // цена каммодуля
        _karta_: 0, // цена каммодуля
        connect: 0, //цена при подключении
        economy: 0, // читаем экономию
        sum_promo: 0, // выводим итоговую сумму промо 
        sum_connect: 0, // выводим итоговую сумму подключения
        sum_common: 0, // выводим итоговую сумму после промо периода
        sum_device: 0, // выводим итоговую сумму оборудования
        tv: 0, // выводим итоговую сумму тв 
        phone_promo: 0, //  цена телефонии
        phone: 0

    },
    packages: [] // Пакеты каналов
};


b.packageHover = function(e) {
    var p = b.packages[ jQuery(e.currentTarget).attr('data-package_index') ];
    jQuery('.b-backage-single_package_descr').html('<h2 class="b-package-popup__inner-title1 b-package-popup__title_ind4">' + p.name + '</h2><p>' + p.description + '<img class="b-manage-packages-popup-img" src="' + p.image_channel + '" /></p>');

};

b.switchTvType = function() {
    var type_atata = jQuery('.b-package-single__tv-type-atata'), type_cabel = jQuery('.b-package-single__tv-type-cabel');

    if (type_atata.css('display') == 'none') {
        type_cabel.fadeOut(300, function() {
            type_atata.fadeIn();
            b.tv.type = 1; 
            
            if (parseInt(b.number) != 0) {
                b._pult__has = 1;
                b._karta__has = 0;
            } else {
                b._pult__has = 0;
                b._karta__has = 1;
            }
            
            console.log(b._pult__has);
            mathBundle();
        });
    } else {
        type_atata.fadeOut(300, function() {
            type_cabel.fadeIn();
            b.tv.type = 2;
            mathBundle();
        });
    }

    return(false);
};

b.managePackages = function() {
    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
    jQuery(".js-package-single_manage-packages-popup").css('top', scrollTop + 150).show();
    jQuery(".b-package__wrap-popup").show();
    return(false);
};

b.addPhone = function() {
    jQuery('.js-package-single__phone-absent').fadeOut(100, function() {
        jQuery('.js-package-single__phone-present').fadeIn(100);
    });
    b.phone_has = 1;
    mathBundle();
    return(false);
};

b.removePhone = function() {
    jQuery('.js-package-single__phone-present').fadeOut(100, function() {
        jQuery('.js-package-single__phone-absent').fadeIn(100);
    });
    b.phone_has = 0;
    mathBundle();
    return(false);
};

b.removeWifi = function() {
    b.wifi_has = 0;
    mathBundle();
    return(false);
};

b.changeDevice = function() {
    var type_atata = jQuery('.b-package-single__tv-type-atata'), type_cabel = jQuery('.b-package-single__tv-type-cabel');
    var device = jQuery(this).val();
    switch (device) {
        case '_pult_':
            b._pult__has = 1;
            b._karta__has = 0;
            break;
        case '_karta_':
            b._karta__has = 1;
            b._pult__has = 0;
            break;
    }

    if (type_atata.css('display') == 'none') {
        b.tv.type = 1;
        type_cabel.fadeOut(300, function() {
            type_atata.fadeIn();
        });
    }
    mathBundle();
    return(false);
};

b.addWifi = function() {
    b.wifi_has = 1;
    mathBundle();
    return(false);
};

b.hidePrices = function() {
    jQuery('.js-package-single__detailed-prices').hide('slow');
    jQuery('.js-package-single__hide-detailed-prices').fadeOut('slow', function() {
        jQuery('.js-package-single__show-detailed-prices').fadeIn('slow');
    });

    return(false);
};

b.showPrices = function() {
    jQuery('.js-package-single__detailed-prices').show('slow');
    jQuery('.js-package-single__show-detailed-prices').fadeOut('slow', function() {
        jQuery('.js-package-single__hide-detailed-prices').fadeIn('slow');
    });

    return(false);
};

mathBundle = function() {
    // Ищем подходящий пакет и делаем его активным
    // Переменные по услугам
    var d = 0, k = 0, t = 0;

    if (b.phone_has == 1) {
        t = b.ids.telephony
    }
    if (b.tv.type == 1) {
        d = b.ids.atatatv
    }
    if (b.tv.type == 2) {
        k = b.ids.ktv
    }
    b.single = getBundleByMatrix(b.ids.internet, d, k, t);


    // Смотрим наличие телефонии
    if (b.phone_has == 1) {
        // Если промо период равен 0, то стоимость телефонии 150
        if (b.promo_period == 0) {
            b.price.phone_promo = 150;
        } else {
            b.price.phone_promo = 111;
        }
    } else {
        b.price.phone = 0;
        b.price.phone_promo = 0;
    }

    // Смотрим какое телевидение выбрано 1. atata TV, 2. КТВ
    if (b.tv.type == 1) {

        if (parseInt(b.single.field_bundles__pult__rent_price) != 0) {
            b.price._pult_ = parseInt(b.single.pole___pult__rent_price); // цена декодера
        } else {
            b.price._pult_ = parseInt(b.single.pole___pult__price); // цена декодера
        }

        if (parseInt(b.single.pole___karta__rent_price) != 0) {
            b.price._karta_ = parseInt(b.single.pole___karta__rent_price); // цена _karta_
        } else {
            b.price._karta_ = parseInt(b.single.pole___karta__price); // цена _karta_
        }

        // Если есть декодер на тарифном плане, то ставим его первым, если нет то каммодуль
        if (b._pult__has == 1) {
            b._pult___karta_ = b.price._pult_;
        }

        if (b._karta__has == 1) {
            b._pult___karta_ = b.price._karta_;
        }

    } else {

        b._pult___karta_ = 0;
        b._pult__has = 0;
        b._karta__has = 0;

    }


    b.price.promo = parseInt(b.single.pole__promo_price); // цена на промо период
    b.price.common = parseInt(b.single.pole__price); // обычная цена, после промо периода
    b.price.wifi_price = parseInt(b.single.pole__wifi_price); // покупка wifi
    b.price.wifi_rent = parseInt(b.single.pole__wifi_rent_price); // аренда wifi
    if (b.promo_period == 0) {
        b.price.promo = b.price.common;
    }




//Wi-Fi
    if (b.wifi_has == 1) {
        b.price.wifi_price = parseInt(b.single.pole__wifi_price);
        b.price.wifi_rent = parseInt(b.single.pole__wifi_rent_price);
    } else {
        b.price.wifi_price = 0;
        b.price.wifi_rent = 0;
    }


//Цены итого
    b.price.sum_device = b.price.wifi_price + b._pult___karta_;
    //Итого
    b.price.sum_connect = b.price.promo + b.price.sum_device + b.price.tv;
    b.price.sum_promo = b.price.promo + b.price.wifi_rent + b.price.tv;
    b.price.sum_common = b.price.common + b.price.wifi_rent + b.price.tv;


    getEcononomy();
    updatePackagesInfo();
};


function updatePackagesInfo() {
    var wifi_des;
    if (b.wifi_has === 1) {
        jQuery('.js-package-single__wifi-absent').hide();
        jQuery('.js-package-single__wifi-present').show();
        jQuery('.wifi_name').show();
        jQuery('.wifi_name').removeClass('b-atata100__color-gray1');
    } else {
        jQuery('.wifi_name').hide();
        jQuery('.wifi_name').addClass('b-atata100__color-gray1');
        jQuery('.js-package-single__wifi-present').hide();
        jQuery('.js-package-single__wifi-absent').show();
    }

    if (b.tv.type == 1) {
        jQuery('.b-check__list-item_ktv').show();

        if (parseInt(b.single.pole___pult__price) == 0 && parseInt(b.number) == 0) {
            jQuery('.package-single__radio').eq(0).hide();

        }

        jQuery('.tv_name').text("atata TV");
        jQuery('.b-atata100__list-item_ktv').show();
        jQuery('.total_chanel').show();
        jQuery('.device_name').show();


        jQuery('.tv_name_bundles').html('');
        for (var key in b.tv.name) {
            jQuery('.tv_name_bundles').append('<li class="b-check__sub-list-item">' + key + '</li>');
        }


        if (b._pult__has == 1) {
            jQuery('.device_name').text("Декодер");
            jQuery(".b-package-single__tv-image_cammod").addClass("b-package-single__tv-image_hide");
            jQuery(".b-package-single__tv-image_decod").removeClass("b-package-single__tv-image_hide");
            jQuery('[value="_pult_"]').eq(0).attr('checked', true);
        }

        if (b._karta__has == 1) {
            jQuery('.device_name').text("САМ-модуль");
            jQuery(".b-package-single__tv-image_cammod").removeClass("b-package-single__tv-image_hide");
            jQuery(".b-package-single__tv-image_decod").addClass("b-package-single__tv-image_hide");
            jQuery('[value="_karta_"]').eq(0).attr('checked', true);
        }

    } else {
        jQuery('.b-check__list-item_ktv').hide();
        if (parseInt(b.single.pole___pult__price) == 0 && parseInt(b.number) == 0) {
            jQuery('.package-single__radio').eq(0).show();

        }
        jQuery('.tv_name').text("Кабельное ТВ");
        jQuery('.b-atata100__list-item_ktv').hide();
        jQuery('.tv_chanel_check:checked').click();
        jQuery('.package-single__radio').attr('checked', false);
        jQuery('.total_chanel').hide();
        jQuery('.device_name').hide();
        jQuery('.total_chanel').hide();
        jQuery('.b-atata100__list-item_ktv').hide();

    }

// Перебираем объект цена и вставляем значения на сайт
    jQuery.each(b.price, function(i, val) {
        jQuery('.price_' + i).text(val);
    });
    jQuery('.b-backage-single_price_tv').text(b.price.promo);
    jQuery('.b-backage-single_sd-channels-count').each(function(i, el) {
        jQuery(el).text(b.tv.sd);
    });
    jQuery('.b-backage-single_hd-channels-count').each(function(i, el) {
        jQuery(el).text(b.tv.hd);
    });
    jQuery('.b-backage-single_channels-sel').text(b.tv.hd + b.tv.sd);
    jQuery('.b-package-single__progress_load').css('width', Math.round((b.tv.hd + b.tv.sd) / b.tv.all_channels * 100) + '%');
    jQuery('.digit_text').text(getChannelText(b.tv.sd));
    jQuery('.hd_text').text(getChannelText(b.tv.hd));
    if (b.promo_period > 3) {
        jQuery('.actionPeriod').text('2-' + b.promo_period);
        jQuery('.actionPeriodEnd').text('с ' + parseInt(b.promo_period + 1) + ' месяца');
    }
    else {
        jQuery('.actionPeriod').text(b.promo_period + ' месяца');
        if (b.promo_period == 0) {
            jQuery('.actionPeriodEnd').text('с 2' + ' месяца');
        } else {
            jQuery('.actionPeriodEnd').text('с ' + parseInt(b.promo_period + 1) + ' месяца');
        }
    }

    var textPerm;



    if (b.price.economy == 0) {
        jQuery('.total_economy').hide();
    }

    var wifi_des = "";
    var wifi_name = "Wi-Fi роутер ";
    var wifi_name2 = "Wi-Fi роутера ";
    var combo_des = '';
    var perm_des = '';
    var rent_price_des = '';

    jQuery('.wifi_name').html(wifi_name);
    jQuery('.wifi_name2').html(wifi_name);
    if ((b.single.pole__atatatv != '' || b.single.pole__ktv != '') &&
            b.single.pole__telephony != '') {
        wifi_name = "Combo Wi-Fi ";
        wifi_name2 = "Combo Wi-Fi ";
        jQuery('.wifi_name').html(wifi_name);
        jQuery('.wifi_name2').html(wifi_name);
        combo_des = "Combo Wi-Fi – устройство объединяющие в себе Wi-Fi роутер и телефонный адаптер в одном корпусе.<br><br>";
    }


    jQuery('.combo_des').html(combo_des);
    jQuery('.b-package__gray1').html(wifi_des);

    if (ntv == 2) {
        jQuery('.ntv_class').text(325);
    } else {
        jQuery('.ntv_class').text(400);
    }

    jQuery('.wififree').hide();
    jQuery('.wificity').hide();

    if (Drupal.settings.wifi_city) {
        jQuery('.wificity').show();
    }

    if (b.price.wifi_price == 0 && b.price.wifi_rent == 0) {
        jQuery('.wififree').show();
    }

}

// Точка входа
function initPackages() {

    // atataен
    b.atataain = Drupal.settings.atataain.atataain;

    // Номер пакета в массиве
    b.number = Drupal.settings.bundles_number;


    if (Drupal.settings.single_bundles.pole__atatatv == '') {
        b.tv.type = 2;
    } else {
        b.tv.type = 1;
        b.ids.atatatv = Drupal.settings.single_bundles.pole__atatatv;

        // Получаем пакеты каналов с JSON
        var buff_pack = JSON.parse(Drupal.settings.tvlist);

        for (var key in buff_pack) {
            b.packages[buff_pack[key].billing_id] = buff_pack[key];

        }

        // Массив пакетов каналов
        var chanel_arr = new Array();
        var chanel_packet = Drupal.settings.atatatv[Drupal.settings.single_bundles.pole__atatatv].result.nodes[0].field_ctv_plans_pockets;
        // Смотри какие пакеты каналов включены в пакет
        jQuery.each(chanel_packet, function(i, val) {

            if (chanel_packet.pocket_id == b.packages.billing_id) {
                chanel_arr.push(val.pocket_id);
            }
        });


        for (var key in b.packages) {

            var p = b.packages[key], htmltmp = '';
            if (jQuery.inArray(p.billing_id, chanel_arr) != -1) {
                p.price = 0;
            }

            if (p.price == 0) {
                htmltmp = '<div class="b-package-popup__form1-row"><label class="b-package__wrapper b-package-single__package_label"  data-package_index="' + p.billing_id + '"><input type="checkbox" checked disabled onchange="packageSel(this);" data-package_index="' + p.billing_id + '">' + p.name + '</label></div>';
            }
            else {
                if (p.billing_id == 1 || p.billing_id == 5) {
                    htmltmp = '<div class="b-package-popup__form1-row "><label class="b-package__wrapper b-package-popup__form1-sp-label b-package-single__package_label" data-package_index="' + p.billing_id + '"><span class="b-package-popup__fl-left">' +
                            '<input type="checkbox" class="tv_chanel_check" onchange="packageSel(this);" data-billing_id="' + p.billing_id + '" data-package_index="' + p.billing_id + '"> ' + p.name + '</span><span class="b-package-popup__fl-right"><span class="ntv_class">' + p.price + '</span> <span class="b-rub_font_verdana">Р</span> /мес.</span></label></div>';
                } else {

                    htmltmp = '<div class="b-package-popup__form1-row "><label class="b-package__wrapper b-package-popup__form1-sp-label b-package-single__package_label" data-package_index="' + p.billing_id + '"><span class="b-package-popup__fl-left">' +
                            '<input type="checkbox" class="tv_chanel_check" onchange="packageSel(this);" data-billing_id="' + p.billing_id + '" data-package_index="' + p.billing_id + '"> ' + p.name + '</span><span class="b-package-popup__fl-right">' + p.price + ' <span class="b-rub_font_verdana">Р</span> /мес.</span></label></div>';
                }
            }
            if (p.price != 0) {
                jQuery('.b-package-single_packages_list').append(htmltmp);
            }
            else {
                b.tv.sd += parseInt(p.digit_count);
                b.tv.hd += parseInt(p.hd_count);
                jQuery('.b-package-single_packages_list').prepend(htmltmp);
            }
            b.tv.all_channels += parseInt(p.digit_count) + parseInt(p.hd_count);
        }
        jQuery('.b-backage-single_channels-avail').text(b.tv.all_channels);
        jQuery('.b-package-single__package_label').hover(b.packageHover);

    }

    b.ids.internet = Drupal.settings.single_bundles.pole__internet;

    b.ids.ktv = Drupal.settings.ktv;

    b.single = Drupal.settings.single_bundles;

    b.promo_period = parseInt(b.single.pole__promo_period);

    if (parseInt(b.number) != 0) {
        b._pult__has = 1;
        b._karta__has = 0;
    } else {
        b._pult__has = 0;
        b._karta__has = 1;
    }


    if (Drupal.settings.single_bundles.pole__telephony != '') {
        b.phone_has = 1;
        b.ids.telephony = Drupal.settings.single_bundles.pole__telephony;
        b.addPhone(); // 
    } else {
        b.phone_has = 0;
        b.removePhone();
    }

}

function packageSel(el) {
    var p = b.packages[jQuery(el).attr('data-billing_id')];

    jQuery('.b-backage-single_package_descr .b-package-popup__inner-title1').html(p.name);
    jQuery('.b-backage-single_package_descr p').html(p.description);
    if (el.checked) {
        b.price.tv += parseInt(p.price);
        if (p.billing_id == 1 || p.billing_id == 5) {
            ++ntv;
            if (ntv == 2) {
                b.price.tv -= parseInt(b.packages[1].price) + parseInt(b.packages[5].price);
                b.packages[1].price = "325";
                b.packages[5].price = "325";
                b.price.tv += parseInt(b.packages[1].price) + parseInt(b.packages[5].price);
            }
        }

        b.tv.sd += parseInt(p.digit_count);
        b.tv.hd += parseInt(p.hd_count);
        b.tv.name[p.name] = {
            name: [p.name],
            billing_id: [p.billing_id]
        };
    }
    else {

        if (p.billing_id == 1 || p.billing_id == 5) {
            --ntv;
            if (ntv != 2) {
                b.price.tv -= parseInt(b.packages[1].price) + parseInt(b.packages[5].price);
                b.packages[1].price = "400";
                b.packages[5].price = "400";
                b.price.tv += parseInt(b.packages[1].price) + parseInt(b.packages[5].price);
            }

        }
        b.price.tv -= parseInt(p.price);
        b.tv.sd -= parseInt(p.digit_count);
        b.tv.hd -= parseInt(p.hd_count);
        delete b.tv.name[p.name];

    }
    mathBundle();
}

jQuery(function() {
    initPackages();
    jQuery('.popup__close').click(function() {
        jQuery('.js-package-single_manage-packages-popup').css('display', 'none');
        jQuery('.b-package__wrap-popup').css('display', 'none');
    });

    jQuery('.js-package-single__switch-tv-type').click(b.switchTvType);
    jQuery('.js-package-single__add-channels').click(b.managePackages);
    jQuery('.js-package-single__add-phone').click(b.addPhone);
    jQuery('.js-package-single__remove-phone').click(b.removePhone);
    jQuery('.js-package-single__wifi-remove').click(b.removeWifi);
    jQuery('.js-package-single__wifi-add').click(b.addWifi);
    jQuery('.js-package-single__hide-detailed-prices').click(b.hidePrices);
    jQuery('.js-package-single__show-detailed-prices').click(b.showPrices);
    jQuery('.package-single__radio').change(b.changeDevice);


    if (parseInt(b.single.pole___pult__price) == 0 && parseInt(b.number) == 0) {
        jQuery('.package-single__radio').eq(0).hide();
    }

    jQuery(".b-package-single__show_link").click(function() {
        jQuery(jQuery(this).data("hide")).hide();
        jQuery(jQuery(this).data("show")).show();
        return false;
    });
    jQuery(".b-package__wrap-popup").click(function() {
        jQuery(".b-package-popup, .b-package__wrap-popup").hide();
        return false;
    });
    jQuery(".b-package__show-hint").mousemove(function() {
        jQuery(jQuery(this).data("show")).show();
        return false;
    }).mouseout(function() {
        jQuery(jQuery(this).data("show")).hide();
    });
    jQuery(".b-package__return").click(function() {
        jQuery.scrollTo(0, 500);
    });

    var scrollCheck = jQuery("#js-check-scroll").offset().top;
    var topNavMax = jQuery(".footer").offset().top - 200;

    jQuery(window).scroll(function() {
        var windowScroll = (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop;
        if (windowScroll > topNavMax) {
            jQuery("#js-check-scroll").css("top", topNavMax - scrollCheck);
            jQuery("#js-check-scroll").removeClass('b-check-fixed-nav');
        } else if (windowScroll < scrollCheck) {
            jQuery("#js-check-scroll").css("top", "0px");
            jQuery("#js-check-scroll").removeClass('b-check-fixed-nav');
        } else {
            jQuery("#js-check-scroll").css("top", "10px");
            jQuery("#js-check-scroll").addClass('b-check-fixed-nav');
        }
    });


    jQuery('#connect_button').on('mousedown', function() {
        setCookie();
    });

    getCookie();


    jQuery(".b-package__click-hint").click(function() {
        jQuery(jQuery(this).data("show")).show();
        return false;
    });

    jQuery(document).click(function() {
        jQuery(".b-package-hint").hide();
    });

});


function setCookie() {
    var cookie = [];// Объект который отправим
    var arr = new Array();
    var products = new Array();

    var phone_id = Drupal.settings.services.phone_service_id;
    var atatatv_id = Drupal.settings.services.atatatv_service_id;
    var internet_id = Drupal.settings.services.internet_service_id;
    var ktv_id = Drupal.settings.services.ktv_service_id;

    var JSONcookie = ''; // строка формата json
    for (var key in b.tv.name) {
        arr.push(parseInt(b.tv.name[key].billing_id));
    }

    cookie = {
        tariff_name: Drupal.settings.internet[b.single.pole__internet].result.nodes[0].title,
        price_promo: b.price.sum_promo, // выводим итоговую сумму промо 
        price_connect: b.price.sum_connect
    };
    if (b.phone_has == 1) {
        products.push(phone_id);
    }

    if (b.tv.type == 1) {
        products.push(atatatv_id);
        cookie.tv_bundles = arr;
    } else if (b.tv.type == 2) {
        products.push(ktv_id);
    }

    products.push(internet_id);
    cookie.products = products;


    if (b.wifi_has == 1) {
        cookie.wifi = 1;
    }

    if (b._pult__has == 1) {
        cookie._pult_ = 1;
    }

    if (b._karta__has == 1) {
        cookie._karta_ = 1;
    }

    cookie.referral_path = window.location.pathname;

    JSONcookie = JSON.stringify(cookie);
    jQuery.cookie('cart', JSONcookie, {expires: 30, path: '/', atataain: Drupal.settings.cookie_atataain});
    return false;
}

function getCookie() {
    cart = jQuery.cookie('cart');
    cart = JSON.parse(cart);
    if (cart) {
        if (Drupal.settings.internet[b.single.pole__internet].result.nodes[0].title == cart.tariff_name) {
            if (cart.products) {
                for (var key in cart.products) {
                    switch (cart.products[key]) {
                        case "53":
                            break;
                        case "12":
                            b.switchTvType();
                            break;
                    }
                }
            }
            if (cart.tv_bundles) {
                for (var key in cart.tv_bundles) {
                    jQuery('[data-billing_id="' + cart.tv_bundles[key] + '"]').trigger('click');
                }
            }

            if (cart._karta_) {
                jQuery('[value="_karta_"]').change().attr('checked', true);

            }

            if (cart._pult_) {
                jQuery('[value="_karta_"]').change().attr('_pult_', true);
            }

            if (!cart.wifi) {
                b.removeWifi();
            }

        } else {
            jQuery.cookie('cart', null);
        }
    }
    return false;
}

...
Рейтинг: 0 / 0
24.01.2014, 08:34
    #38536282
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Здравствуйте, я еще не опытный javascript программист, очень хочу услышать критику кода
MediaRise
Код: javascript
1.
var b = []; // Основной объект


Это кагбэ массив...
...
Рейтинг: 0 / 0
24.01.2014, 08:43
    #38536286
MediaRise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Здравствуйте, я еще не опытный javascript программист, очень хочу услышать критику кода
krvsa,

косяк по невнимательности, забыл переправить, сначала было массивом)
...
Рейтинг: 0 / 0
24.01.2014, 10:50
    #38536419
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Здравствуйте, я еще не опытный javascript программист, очень хочу услышать критику кода
ну... вся задача мне неизвестна, но я бы подумал над тем, как сделать меньше глобальных объектов

например, function getCookie() может встретиться в какой-то сторонней библиотеке, которую Вы через полгода захотите подключить,
но забудете про свою функцию с тем же именем
...
Рейтинг: 0 / 0
24.01.2014, 10:52
    #38536428
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Здравствуйте, я еще не опытный javascript программист, очень хочу услышать критику кода
MediaRise
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
function getCookie() {
    cart = jQuery.cookie('cart');
    cart = JSON.parse(cart);
    if (cart) {
        if (Drupal.settings.internet[b.single.pole__internet].result.nodes[0].title == cart.tariff_name) {
            if (cart.products) {
                for (var key in cart.products) {
                    switch (cart.products[key]) {
                        case "53":
                            break;
                        case "12":
                            b.switchTvType();
                            break;
                    }
                }
            }
            if (cart.tv_bundles) {
                for (var key in cart.tv_bundles) {
                    jQuery('[data-billing_id="' + cart.tv_bundles[key] + '"]').trigger('click');
                }
            }

            if (cart._karta_) {
                jQuery('[value="_karta_"]').change().attr('checked', true);

            }

            if (cart._pult_) {
                jQuery('[value="_karta_"]').change().attr('_pult_', true);
            }

            if (!cart.wifi) {
                b.removeWifi();
            }

        } else {
            jQuery.cookie('cart', null);
        }
    }
    return false;
}


Я бы так написал...

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
function getCookie() {
    cart = jQuery.cookie('cart');
    cart = JSON.parse(cart);
    if (!cart) {
		return false;
	};
	if (Drupal.settings.internet[b.single.pole__internet].result.nodes[0].title != cart.tariff_name) {
		jQuery.cookie('cart', null);
		return false;
	};
	if (cart.products) {
		for (var key in cart.products) {
			switch (cart.products[key]) {
				case "53":
					break;
				case "12":
					b.switchTvType();
					break;
			};
		};
	};
	if (cart.tv_bundles) {
		for (var key in cart.tv_bundles) {
			jQuery('[data-billing_id="' + cart.tv_bundles[key] + '"]').trigger('click');
		};
	};
	if (cart._karta_) {
		jQuery('[value="_karta_"]').change().attr('checked', true);
	};
	if (cart._pult_) {
		jQuery('[value="_karta_"]').change().attr('_pult_', true);
	};
	if (!cart.wifi) {
		b.removeWifi();
	};
    return false;
};


Меньше вложений - меньше "раздражения кожи"...
...
Рейтинг: 0 / 0
24.01.2014, 10:55
    #38536441
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Здравствуйте, я еще не опытный javascript программист, очень хочу услышать критику кода
Пробелы челе "затесались"...

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
function getCookie() {
	cart = jQuery.cookie('cart');
	cart = JSON.parse(cart);
	if (!cart) {
		return false;
	};
	if (Drupal.settings.internet[b.single.pole__internet].result.nodes[0].title != cart.tariff_name) {
		jQuery.cookie('cart', null);
		return false;
	};
	if (cart.products) {
		for (var key in cart.products) {
			switch (cart.products[key]) {
				case "53":
					break;
				case "12":
					b.switchTvType();
					break;
			};
		};
	};
	if (cart.tv_bundles) {
		for (var key in cart.tv_bundles) {
			jQuery('[data-billing_id="' + cart.tv_bundles[key] + '"]').trigger('click');
		};
	};
	if (cart._karta_) {
		jQuery('[value="_karta_"]').change().attr('checked', true);
	};
	if (cart._pult_) {
		jQuery('[value="_karta_"]').change().attr('_pult_', true);
	};
	if (!cart.wifi) {
		b.removeWifi();
	};
	return false;
};
...
Рейтинг: 0 / 0
24.01.2014, 15:48
    #38537052
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Здравствуйте, я еще не опытный javascript программист, очень хочу услышать критику кода
А такое огромное количество префиксов чем вызвано? Ещё заметил, что отделение префикса от основного имени иногда отделяется одним подчёркиванием, а иногда двумя. Я вот не знаю, может у Вас есть какая-то установленная система именования, но всё же такие моменты приводят к увеличению количества букв, что не очень удобно. Если производительность не является настолько критической, что требуется экономить наносекунды времени, могу предложить пересмотреть систему именования элементов, и определить отдельную функцию для выборки таких элементов (обёртку для jQuery(selector)).

Код: javascript
1.
2.
3.
b.$ = function (selector){
  return jQuery(selector.replace("__", "js-package-single__"));
}



тогда код вида
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
b.hidePrices = function() {
    jQuery('.js-package-single__detailed-prices').hide('slow');
    jQuery('.js-package-single__hide-detailed-prices').fadeOut('slow', function() {
        jQuery('.js-package-single__show-detailed-prices').fadeIn('slow');
    });

    return(false);
};



будет выглядеть так:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
b.hidePrices = function() {
    b.$('.__detailed-prices').hide('slow');
    b.$('.__hide-detailed-prices').fadeOut('slow', function() {
        b.$('.__show-detailed-prices').fadeIn('slow');
    });

    return(false);
};


И при работе с системой контроля версий типа git, Вам скажут спасибо... А то представьте сейчас Вам понадобится (мало ли по какой причине) сменить один из префиксов (например тот же js-package-single). git скажет, что Вы поменяли больше половины кода, когда реально ничего не изменилось в принципе и правка мизерная :)

также префиксов различающихся а одну букву стоит избегать (уж не знаю, может это просто опечатки присутствуют), например "b-backage-single" и "b-package-single". При чтении такое отличие пролетает мимо глаз.

В самом коде большое количество подчёркиваний загрязняют его.

код
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    var d = 0, k = 0, t = 0;

    if (b.phone_has == 1) {
        t = b.ids.telephony
    }
    if (b.tv.type == 1) {
        d = b.ids.atatatv
    }
    if (b.tv.type == 2) {
        k = b.ids.ktv
    }



я бы писал так:
Код: javascript
1.
2.
3.
    var t = (b.phone_has == 1) ? b.ids.telephony : 0;
    var d = (b.tv.type == 1)   ? b.ids.atatatv   : 0;
    var k = (b.tv.type == 2)   ? b.ids.ktv       : 0;


Так ведь лаконичнее ))

Вообще, кроме подобных косметических дополнений ничего более сказать не могу. Если код нормально работает, то внешне с ним тоже вроде всё нормально :)
...
Рейтинг: 0 / 0
29.01.2014, 12:02
    #38541824
MediaRise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Здравствуйте, я еще не опытный javascript программист, очень хочу услышать критику кода
СПАсибо огромное !! за ревизию кода!
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Здравствуйте, я еще не опытный javascript программист, очень хочу услышать критику кода / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]