PageSourceSearch

https://laguna22.ru/js/bvi.js?v=20260902d

js laguna22.ru collected 2026-09-28 22:45:44 UTC 52,146 bytes, 988 lines download raw bytes

1/*!
2 * Button visually impaired v2.0
3 */
4(function ($) {
5    "use strict";
6    $.bvi = function (options) {
7        var default_setting = $.extend({
8            'bvi_target': '.bvi-open',
9            'bvi_theme': 'white',
10            'bvi_font': 'arial',
11            'bvi_font_size': 16,
12            'bvi_letter_spacing': 'normal',
13            'bvi_line_height': 'normal',
14            'bvi_images': true,
15            'bvi_reload': false,
16            'bvi_fixed': true,
17            'bvi_tts': true,
18            'bvi_flash_iframe': true,
19            'bvi_hide': false
20        }, options);
21
22        var versionIE = detectIE();
23        var selector = default_setting.bvi_target;
24        var check_bvi_theme;
25        var check_bvi_font;
26        var check_bvi_letter_spacing;
27        var check_bvi_line_height;
28        var check_bvi_font_size;
29        var check_bvi_images;
30        var check_bvi_fixed;
31        var check_bvi_tts;
32        var check_bvi_flash_iframe;
33        var check_bvi_hide;
34        var checkError;
35        var bvi_tts_synth = window.speechSynthesis;
36        var bvi_tts_support_browser = (bvi_tts_synth !== undefined) ? true : false;
37        var sm = '576';
38        var md = '768';
39        var lg = '992';
40        var xl = '1200';
41        var width = (window.innerWidth > 0) ? window.innerWidth : screen.width;
42
43        console.log('Bvi console: ready Button visually impaired v2.0');
44
45        if (bvi_tts_support_browser) {
46            setInterval(function () {
47                if (bvi_tts_synth.speaking == false) {
48                    $('.bvi-tts-play').removeClass('disabled');
49                    $('.bvi-tts-pause').addClass('disabled');
50                    $('.bvi-tts-resume').addClass('disabled');
51                    $('.bvi-tts-stop').addClass('disabled');
52                }
53            }, 1000);
54            console.log('Bvi console: Чтение речи поддерживается в данной браузере');
55        } else {
56            console.log('Bvi console: Чтение речи не поддерживается в данном браузере');
57        }
58
59        $(window).on('resize', function () {
60            var width_resize = (window.innerWidth > 0) ? window.innerWidth : screen.width;
61
62            if (width_resize >= lg) {
63                $('.bvi-panel-container').show();
64            }
65
66            if (width_resize <= lg) {
67                $('.bvi-panel-container').removeClass('bvi-container').addClass('bvi-container-fluid');
68            } else {
69                $('.bvi-panel-container').removeClass('bvi-container-fluid').addClass('bvi-container');
70            }
71        });
72
73        function detectIE() {
74            var ua = window.navigator.userAgent;
75            var msie = ua.indexOf('MSIE ');
76
77            if (msie > 0) {
78                return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
79            }
80
81            var trident = ua.indexOf('Trident/');
82            if (trident > 0) {
83                var rv = ua.indexOf('rv:');
84                return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
85            }
86
87            var edge = ua.indexOf('Edge/');
88            if (edge > 0) {
89                return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
90            }
91
92            return false;
93        }
94
95        function bvi_tts_speak(text) {
96            if (Cookies.get('bvi-tts') === 'true' && bvi_tts_support_browser) {
97                bvi_tts_synth.cancel();
98                var voices = bvi_tts_synth.getVoices();
99                var chunkLength = 120;
100                var pattRegex = new RegExp('^[\\s\\S]{' + Math.floor(chunkLength / 2) + ',' + chunkLength + '}[.!?,]{1}|^[\\s\\S]{1,' + chunkLength + '}$|^[\\s\\S]{1,' + chunkLength + '} ');
101                var $array = [];
102                var $text = text;
103
104                while ($text.length > 0) {
105                    $array.push($text.match(pattRegex)[0]);
106                    $text = $text.substring($array[$array.length - 1].length);
107                }
108
109                $.each($array, function () {
110                    var speechUtterance = new SpeechSynthesisUtterance(this.trim());
111                    speechUtterance.volume = 1;
112                    speechUtterance.rate = 1;
113                    speechUtterance.pitch = 1;
114                    speechUtterance.lang = 'ru-RU';
115
116                    speechUtterance.onstart = function (event) {
117                        console.log(speechUtterance);
118                        //console.log('Start called for: ' + event.utterance.text + '-' + event.charIndex);
119                    };
120
121                    speechUtterance.onend = function (event) {
122                        //console.log(event.name + ' end ' + event.elapsedTime + ' milliseconds.');
123                    };
124
125                    speechUtterance.onpause = function (event) {
126                        //console.log(event.name + ' pause ' + event.elapsedTime + ' milliseconds.');
127                    };
128
129                    speechUtterance.onresume = function (event) {
130                        //console.log(event.name + ' resume ' + event.elapsedTime + ' milliseconds.');
131                    };
132
133                    speechUtterance.onboundary = function (event) {
134                        /*
135                        var world = bvi_getWordAt(event.utterance.text, event.charIndex);
136                        var src_str = $(id).text();
137                        var term = world.replace(/(\s+)/, "(<[^>]+>)*$1(<[^>]+>)*");
138                        var pattern = new RegExp("(" + term + ")", "gi");
139                        src_str = src_str.replace(pattern, "<mark>$1</mark>");
140                        src_str = src_str.replace(/(<mark>[^<>]*)((<[^>]+>)+)([^<>]*<\/mark>)/, "$1</mark>$2<mark>$4");
141                        $(id).html(src_str);
142                        console.log(event.utterance.text);
143                        */
144                    };
145
146                    for (var i = 0; i < voices.length; i++) {
147                        if (voices[i].lang === 'ru-RU' && voices[i].voiceURI === 'Google русский') {
148                            speechUtterance.voice = voices[i];
149                            speechUtterance.voiceURI = voices[i].voiceURI;
150                        } else if (voices[i].lang === 'ru-RU' && voices[i].voiceURI === 'Microsoft Irina Desktop - Russian') {
151                            speechUtterance.voice = voices[i];
152                            speechUtterance.voiceURI = voices[i].voiceURI;
153                        } else if (voices[i].lang === 'ru-RU' && voices[i].voiceURI === 'urn:moz-tts:sapi:Microsoft Irina Desktop - Russian?ru-RU') {
154                            speechUtterance.voice = voices[i];
155                            speechUtterance.voiceURI = voices[i].voiceURI;
156                        } else if (voices[i].lang === 'ru-RU' && voices[i].voiceURI === 'com.apple.speech.synthesis.voice.yuri') {
157                            speechUtterance.voice = voices[i];
158                            speechUtterance.voiceURI = voices[i].voiceURI;
159                        }
160                    }
161
162                    bvi_tts_synth.speak(speechUtterance);
163                });
164            }
165        }
166
167        function bvi_getWordAt(str, pos) {
168            str = String(str);
169            pos = Number(pos) >>> 0;
170            var left = str.slice(0, pos + 1).search(/\S+$/),
171                right = str.slice(pos).search(/\s/);
172            if (right < 0) {
173                return str.slice(left);
174            }
175            return str.slice(left, right + pos);
176        }
177
178        function bvi_tts_player() {
179            var bvi_tts_text_id;
180            var bvi_tts_voice_target = $(".bvi-tts");
181
182            $('.bvi-tts-link').remove();
183            $('.bvi-tts-text').contents().unwrap();
184
185            if (Cookies.get('bvi-tts') === 'true' && bvi_tts_support_browser) {
186                bvi_tts_voice_target.each(function (index) {
187                    bvi_tts_text_id = 'bvi-tts-text-id-' + index;
188                    $(this).wrapInner('<div class="bvi-tts-text ' + bvi_tts_text_id + '"></div>');
189                    $(this).prepend('<div class="bvi-tts-link bvi-tts-link-id-' + index + '" data-bvi-tts-class-text=".' + bvi_tts_text_id + '" data-bvi-tts-link-id=".bvi-tts-link-id-' + index + '">\n' +
190                        '    <a href="#" class="bvi-tts-play bvi-link">Воспроизвести</a>\n' +
191                        '    <a href="#" class="bvi-tts-pause bvi-link disabled">Пауза</i></a>\n' +
192                        '    <a href="#" class="bvi-tts-resume bvi-link disabled">Продолжить</i></a>\n' +
193                        '    <a href="#" class="bvi-tts-stop bvi-link disabled">Стоп</i></a>\n' +
194                        '</div>');
195                });
196
197                $('.bvi-tts-link').show();
198
199                $('.bvi-tts-play').click(function () {
200                    bvi_tts_synth.cancel();
201                    var bvi_tts_class = $(this).parent().data('bvi-tts-class-text');
202                    var bvi_tts_links_id = $(this).parent().data('bvi-tts-link-id');
203                    var bvi_tts_class_text = $(bvi_tts_class).text();
204
205                    bvi_tts_speak(bvi_tts_class_text);
206
207                    $('.bvi-tts-play').removeClass('disabled');
208                    $('.bvi-tts-pause').addClass('disabled');
209                    $('.bvi-tts-resume').addClass('disabled');
210                    $('.bvi-tts-stop').addClass('disabled');
211                    $(bvi_tts_links_id + ' .bvi-tts-play').addClass('disabled');
212                    $(bvi_tts_links_id + ' .bvi-tts-pause').removeClass('disabled');
213                    $(bvi_tts_links_id + ' .bvi-tts-stop').removeClass('disabled');
214                    return false;
215                });
216
217                $('.bvi-tts-resume').click(function () {
218                    var bvi_tts_links_id = $(this).parent().data('bvi-tts-link-id');
219                    $(bvi_tts_links_id + ' .bvi-tts-pause').removeClass('disabled');
220                    $(this).addClass('disabled');
221                    bvi_tts_synth.resume();
222                    return false;
223                });
224
225                $('.bvi-tts-pause').click(function () {
226                    var bvi_tts_links_id = $(this).parent().data('bvi-tts-link-id');
227                    $(bvi_tts_links_id + ' .bvi-tts-resume').removeClass('disabled');
228                    $(this).addClass('disabled');
229                    bvi_tts_synth.pause();
230                    return false;
231                });
232
233                $('.bvi-tts-stop').click(function () {
234                    bvi_tts_synth.cancel();
235                    var bvi_tts_links_id = $(this).parent().data('bvi-tts-link-id');
236                    $(this).addClass('disabled');
237                    $(bvi_tts_links_id + ' .bvi-tts-play').removeClass('disabled');
238                    $(bvi_tts_links_id + ' .bvi-tts-pause').addClass('disabled');
239                    $(bvi_tts_links_id + ' .bvi-tts-resume').addClass('disabled');
240                    return false;
241                });
242            } else {
243                $('.bvi-tts-link').remove();
244                $('.bvi-tts-text').contents().unwrap();
245            }
246        }
247
248        function bvi_click() {
249            $("#bvi-panel-close, .bvi-panel-close, #bvi-toggler-close").click(function () {
250
251                bvi_tts_speak('Обычная версия сайта');
252
253                if (Cookies.get("bvi-reload") === 'true') {
254                    document.location.reload(true);
255                }
256
257                $(".bvi-body *").each(function () {
258                    var $this = $(this);
259                    var background_image = $this.css("background-image");
260                    var pattern = background_image.replace(/.*\s?url\([\'\"]?/, '').replace(/[\'\"]?\).*/, '');
261                    if (pattern != 'none') {
262                        if (versionIE == 11 || versionIE == 10 || versionIE == 9) {
263                            var data_bvi_img_original = $this.attr('data-bvi-background-image-original') || pattern;
264                            $this.css("background-image", "url(" + data_bvi_img_original + ")");
265                            $this.removeClass('bvi-background-image');
266                        }
267                    }
268                });
269
270                $("img").each(function () {
271                    $(this).show();
272                    $('div.bvi-img').remove();
273                    $(this).removeClass("bvi-background-image");
274                    if (versionIE == 11 || versionIE == 10 || versionIE == 9) {
275                        var data_bvi_img_original = $(this).attr('data-bvi-img-original') || this.src;
276                        this.src = data_bvi_img_original;
277                    }
278                });
279
280                Cookies.remove("bvi-panel-active", {path: "/"});
281                Cookies.remove("bvi-font-size", {path: "/"});
282                Cookies.remove("bvi-theme", {path: "/"});
283                Cookies.remove("bvi-images", {path: "/"});
284                Cookies.remove("bvi-line-height", {path: "/"});
285                Cookies.remove("bvi-letter-spacing", {path: "/"});
286                Cookies.remove("bvi-tts", {path: "/"});
287                Cookies.remove("bvi-font-family", {path: "/"});
288                Cookies.remove("bvi-panel-hide", {path: "/"});
289                Cookies.remove("bvi-flash-iframe", {path: "/"});
290                Cookies.remove("bvi-reload", {path: "/"});
291
292                active();
293                return false;
294            });
295
296            $('#bvi-panel-hide, #bvi-toggler-menu-hide').click(function () {
297                $('.bvi-panel').toggle(0);
298                $('.bvi-link-top').toggle(0);
299                set('data-bvi-panel-hide', 'bvi-panel-hide', true);
300                bvi_tts_speak('Панель скрыта');
301                return false;
302            });
303
304            $('#bvi-panel-show').click(function () {
305                $('.bvi-panel').toggle(0);
306                $('.bvi-link-top').toggle(0);
307                set('data-bvi-panel-hide', 'bvi-panel-hide', false);
308                bvi_tts_speak('Панель открыта');
309                return false;
310            });
311
312            $('#bvi-setting').click(function () {
313                $('.bvi-setting-menu').toggle(0);
314                $(this).toggleClass("active");
315                bvi_tts_speak('Дополнительные настройки');
316                return false;
317            });
318
319            $('#bvi-toggler').click(function () {
320                $('.bvi-panel-container').toggle(0);
321                $(this).toggleClass("active");
322                bvi_tts_speak('Меню');
323                return false;
324            });
325
326            $('#bvi-setting-close').click(function () {
327                $('.bvi-setting-menu').toggle(0);
328                $('#bvi-setting').toggleClass("active");
329                bvi_tts_speak('Дополнительные настройки закрыты');
330                return false;
331            });
332
333            $('#bvi-font-size-less').click(function () {
334                var size = parseFloat(Cookies.get("bvi-font-size")) - 1;
335                $(this).addClass('active').siblings().removeClass('active');
336                $('#bvi-font-size').text(size);
337                if (size != 0) {
338                    set('data-bvi-size', 'bvi-font-size', size);
339                    bvi_tts_speak('Размер шрифта уменьшен');
340                }
341                return false;
342            });
343
344            $('#bvi-font-size-more').click(function () {
345                var size = parseFloat(Cookies.get("bvi-font-size")) + 1;
346                $(this).addClass('active').siblings().removeClass('active');
347                $('#bvi-font-size').text(size);
348                if (size != 40) {
349                    set('data-bvi-size', 'bvi-font-size', size);
350                    bvi_tts_speak('Размер шрифта увеличен');
351                }
352                return false;
353            });
354
355            $("#bvi-theme-white").click(function () {
356                $(this).addClass('active').siblings().removeClass('active');
357                set('data-bvi-theme', 'bvi-theme', 'white');
358                bvi_tts_speak('Цвет сайта черным по белому');
359                return false;
360            });
361
362            $("#bvi-theme-black").click(function () {
363                $(this).addClass('active').siblings().removeClass('active');
364                set('data-bvi-theme', 'bvi-theme', 'black');
365                bvi_tts_speak('Цвет сайта белым по черному');
366                return false;
367            });
368
369            $("#bvi-theme-blue").click(function () {
370                $(this).addClass('active').siblings().removeClass('active');
371                set('data-bvi-theme', 'bvi-theme', 'blue');
372                bvi_tts_speak('Цвет сайта тёмно-синим по голубому');
373                return false;
374            });
375
376            $("#bvi-theme-brown").click(function () {
377                $(this).addClass('active').siblings().removeClass('active');
378                set('data-bvi-theme', 'bvi-theme', 'brown');
379                bvi_tts_speak('Цвет сайта коричневым по бежевому');
380                return false;
381            });
382
383            $("#bvi-theme-green").click(function () {
384                $(this).addClass('active').siblings().removeClass('active');
385                set('data-bvi-theme', 'bvi-theme', 'green');
386                bvi_tts_speak('Цвет сайта зеленым по тёмно-коричневому');
387                return false;
388            });
389
390            $('#bvi-images-true').click(function () {
391                $(this).addClass('active').siblings().removeClass('active');
392                set('data-bvi-images', 'bvi-images', true);
393                bvi_tts_speak('Изображения включены');
394                return false;
395            });
396
397            $('#bvi-images-false').click(function () {
398                $(this).addClass('active').siblings().removeClass('active');
399                set('data-bvi-images', 'bvi-images', false);
400                bvi_tts_speak('Изображения выключены');
401                return false;
402            });
403
404            $('#bvi-images-grayscale').click(function () {
405                $(this).addClass('active').siblings().removeClass('active');
406                set('data-bvi-images', 'bvi-images', 'grayscale');
407                bvi_tts_speak('Изображения чёрно-белые');
408                return false;
409            });
410
411            $("#bvi-line-height-normal").click(function () {
412                $(this).addClass('active').siblings().removeClass('active');
413                set('data-bvi-line-height', 'bvi-line-height', 'normal');
414                bvi_tts_speak('Междустрочный интервал cтандартный');
415                return false;
416            });
417
418            $("#bvi-line-height-average").click(function () {
419                $(this).addClass('active').siblings().removeClass('active');
420                set('data-bvi-line-height', 'bvi-line-height', 'average');
421                bvi_tts_speak('Междустрочный интервал средний');
422                return false;
423            });
424
425            $("#bvi-line-height-big").click(function () {
426                $(this).addClass('active').siblings().removeClass('active');
427                set('data-bvi-line-height', 'bvi-line-height', 'big');
428                bvi_tts_speak('Междустрочный интервал большой');
429                return false;
430            });
431
432            $("#bvi-letter-spacing-normal").click(function () {
433                $(this).addClass('active').siblings().removeClass('active');
434                set('data-bvi-letter-spacing', 'bvi-letter-spacing', 'normal');
435                bvi_tts_speak('Межбуквенный интервал одинарный');
436                return false;
437            });
438
439            $("#bvi-letter-spacing-average").click(function () {
440                $(this).addClass('active').siblings().removeClass('active');
441                set('data-bvi-letter-spacing', 'bvi-letter-spacing', 'average');
442                bvi_tts_speak('Межбуквенный интервал полуторный');
443                return false;
444            });
445
446            $("#bvi-letter-spacing-big").click(function () {
447                $(this).addClass('active').siblings().removeClass('active');
448                set('data-bvi-letter-spacing', 'bvi-letter-spacing', 'big');
449                bvi_tts_speak('Межбуквенный интервал двойной');
450                return false;
451            });
452
453            $("#bvi-font-family-arial").click(function () {
454                $(this).addClass('active').siblings().removeClass('active');
455                set('data-bvi-font-family', 'bvi-font-family', 'arial');
456                bvi_tts_speak('Шрифт без засечек');
457                return false;
458            });
459
460            $("#bvi-font-family-times").click(function () {
461                $(this).addClass('active').siblings().removeClass('active');
462                set('data-bvi-font-family', 'bvi-font-family', 'times');
463                bvi_tts_speak('Шрифт с засечками');
464                return false;
465            });
466
467            $("#bvi-flash-iframe-true").click(function () {
468                $(this).addClass('active').siblings().removeClass('active');
469                set('data-bvi-flash-iframe', 'bvi-flash-iframe', true);
470                bvi_tts_speak('Включить встроенные элементы');
471                return false;
472            });
473
474            $("#bvi-flash-iframe-false").click(function () {
475                $(this).addClass('active').siblings().removeClass('active');
476                set('data-bvi-flash-iframe', 'bvi-flash-iframe', false);
477                bvi_tts_speak('Выключить встроенные элементы');
478                return false;
479            });
480
481            $("#bvi-tts-true").click(function () {
482                $(this).addClass('active').siblings().removeClass('active');
483                set('data-bvi-tts', 'bvi-tts', true);
484                bvi_tts_speak('Синтез речи включён');
485                bvi_tts_player();
486                return false;
487            });
488
489            $("#bvi-tts-false").click(function () {
490                $(this).addClass('active').siblings().removeClass('active');
491                set('data-bvi-tts', 'bvi-tts', false);
492                bvi_tts_speak('Синтез речи выключён');
493                bvi_tts_player();
494                return false;
495            });
496
497            $("#bvi-settings-default").click(function () {
498                $('#bvi-theme-' + Cookies.get("bvi-theme")).removeClass('active');
499                $('#bvi-images-' + Cookies.get("bvi-images")).removeClass('active');
500                $('#bvi-line-height-' + Cookies.get("bvi-line-height")).removeClass('active');
501                $('#bvi-letter-spacing-' + Cookies.get("bvi-letter-spacing")).removeClass('active');
502                $('#bvi-font-family-' + Cookies.get("bvi-font-family")).removeClass('active');
503                $('#bvi-flash-iframe-' + Cookies.get("bvi-flash-iframe")).removeClass('active');
504                $('#bvi-tts-' + Cookies.get("bvi-tts")).removeClass('active');
505
506                $('#bvi-theme-' + default_setting.bvi_theme).addClass('active');
507                $('#bvi-images-' + default_setting.bvi_images).addClass('active');
508                $('#bvi-line-height-' + default_setting.bvi_line_height).addClass('active');
509                $('#bvi-letter-spacing-' + default_setting.bvi_letter_spacing).addClass('active');
510                $('#bvi-font-family-' + default_setting.bvi_font).addClass('active');
511                $('#bvi-flash-iframe-' + default_setting.bvi_flash_iframe).addClass('active');
512                $('#bvi-tts-' + default_setting.bvi_tts).addClass('active');
513
514                $('#bvi-font-size').text(default_setting.bvi_font_size);
515
516                set('data-bvi-size', 'bvi-font-size', default_setting.bvi_font_size);
517                set('data-bvi-theme', 'bvi-theme', default_setting.bvi_theme);
518                set('data-bvi-images', 'bvi-images', default_setting.bvi_images);
519                set('data-bvi-line-height', 'bvi-line-height', default_setting.bvi_line_height);
520                set('data-bvi-letter-spacing', 'bvi-letter-spacing', default_setting.bvi_letter_spacing);
521                set('data-bvi-font-family', 'bvi-font-family', default_setting.bvi_font);
522                set('data-bvi-flash-iframe', 'bvi-flash-iframe', default_setting.bvi_flash_iframe);
523                set('data-bvi-tts', 'bvi-tts', default_setting.bvi_tts);
524                bvi_tts_speak('Настройки по умолчанию');
525                bvi_tts_player();
526                return false;
527            });
528        }
529
530        function set(data, set_cookies, set_cookies_data) {
531            Cookies.set(set_cookies, set_cookies_data, {path: "/", expires: 1});
532            $(".bvi-body").attr(data, Cookies.get(set_cookies));
533            get_image();
534        }
535
536        function set_active_link() {
537            $('#bvi-theme-' + Cookies.get("bvi-theme")).addClass('active');
538            $('#bvi-images-' + Cookies.get("bvi-images")).addClass('active');
539            $('#bvi-line-height-' + Cookies.get("bvi-line-height")).addClass('active');
540            $('#bvi-letter-spacing-' + Cookies.get("bvi-letter-spacing")).addClass('active');
541            $('#bvi-font-family-' + Cookies.get("bvi-font-family")).addClass('active');
542            $('#bvi-flash-iframe-' + Cookies.get("bvi-flash-iframe")).addClass('active');
543            $('#bvi-tts-' + Cookies.get("bvi-tts")).addClass('active');
544        }
545
546        function get() {
547            if (typeof Cookies.get("bvi-font-size") === 'undefined'
548                || typeof Cookies.get("bvi-theme") === 'undefined'
549                || typeof Cookies.get("bvi-images") === 'undefined'
550                || typeof Cookies.get("bvi-line-height") === 'undefined'
551                || typeof Cookies.get("bvi-letter-spacing") === 'undefined'
552                || typeof Cookies.get("bvi-tts") === 'undefined'
553                || typeof Cookies.get("bvi-font-family") === 'undefined'
554                || typeof Cookies.get("bvi-panel-hide") === 'undefined'
555                || typeof Cookies.get("bvi-flash-iframe") === 'undefined'
556                || typeof Cookies.get("bvi-reload") === 'undefined'
557                || typeof Cookies.get("bvi-fixed") === 'undefined'
558            ) {
559                Cookies.set("bvi-font-size", default_setting.bvi_font_size, {path: "/", expires: 1});
560                Cookies.set("bvi-theme", default_setting.bvi_theme, {path: "/", expires: 1});
561                Cookies.set("bvi-images", default_setting.bvi_images, {path: "/", expires: 1});
562                Cookies.set("bvi-line-height", default_setting.bvi_line_height, {path: "/", expires: 1});
563                Cookies.set("bvi-letter-spacing", default_setting.bvi_letter_spacing, {path: "/", expires: 1});
564                Cookies.set("bvi-tts", default_setting.bvi_tts, {path: "/", expires: 1});
565                Cookies.set("bvi-font-family", default_setting.bvi_font, {path: "/", expires: 1});
566                Cookies.set("bvi-panel-hide", default_setting.bvi_hide, {path: "/", expires: 1});
567                Cookies.set("bvi-flash-iframe", default_setting.bvi_flash_iframe, {path: "/", expires: 1});
568                Cookies.set("bvi-reload", default_setting.bvi_reload, {path: "/", expires: 1});
569                Cookies.set("bvi-fixed", default_setting.bvi_fixed, {path: "/", expires: 1});
570            }
571
572            $('.bvi-body').attr({
573                'data-bvi-panel-hide': Cookies.get("bvi-panel-hide"),
574                'data-bvi-size': Cookies.get("bvi-font-size"),
575                'data-bvi-theme': Cookies.get("bvi-theme"),
576                'data-bvi-images': Cookies.get("bvi-images"),
577                'data-bvi-line-height': Cookies.get("bvi-line-height"),
578                'data-bvi-letter-spacing': Cookies.get("bvi-letter-spacing"),
579                'data-bvi-font-family': Cookies.get("bvi-font-family"),
580                'data-bvi-flash-iframe': Cookies.get("bvi-flash-iframe"),
581                'data-bvi-reload': Cookies.get("bvi-reload"),
582                'data-bvi-tts': Cookies.get("bvi-tts"),
583                'data-bvi-fixed': Cookies.get("bvi-fixed")
584            });
585
586            $('#bvi-font-size').text(Cookies.get("bvi-font-size"));
587
588            var bvi_panel = Cookies.get("bvi-panel-hide");
589
590            if (bvi_panel === 'false' || typeof bvi_panel === 'undefined') {
591                $('.bvi-panel').show();
592                $('.bvi-link-top').hide();
593            } else {
594                $('.bvi-panel').hide();
595                $('.bvi-link-top').show("slow");
596            }
597        }
598
599        function get_image() {
600            var bvi_images = Cookies.get("bvi-images");
601
602            $(".bvi-body *").each(function () {
603                var $this = $(this);
604                var background_image = $this.css("background-image");
605                var pattern = background_image.replace(/^url\(['"]?/,'').replace(/['"]?\)$/,'');
606
607                if (pattern != 'none') {
608                    $(this).addClass('bvi-background-image');
609                }
610            });
611
612            $("img").each(function () {
613                $(this).addClass('bvi-img');
614            });
615
616            if (bvi_images === 'true') {
617                $("img").each(function () {
618                    $(this).show();
619                    $('div.bvi-img').remove();
620                    //$(this).removeClass("bvi-background-image");
621                    if (versionIE == 11 || versionIE == 10 || versionIE == 9) {
622                        var data_bvi_img_original = $(this).attr('data-bvi-img-original') || this.src;
623                        this.src = data_bvi_img_original;
624                    }
625                });
626
627                $(".bvi-body *").each(function () {
628                    var $this = $(this);
629                    var background_image = $this.css("background-image");
630                    var pattern = background_image.replace(/^url\(['"]?/,'').replace(/['"]?\)$/,'');
631                    if (pattern != 'none') {
632                        if (versionIE == 11 || versionIE == 10 || versionIE == 9) {
633                            var r = '^(https?|http)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]';
634                            if(pattern.match(r)) {
635                                var data_bvi_img_original = $this.attr('data-bvi-background-image-original') || pattern;
636                                $this.css("background-image", "url(" + data_bvi_img_original + ")");
637                            }
638                        }
639                    }
640                });
641            }
642
643            if (bvi_images === 'false') {
644                $('div.bvi-img').remove();
645
646                $("img").each(function () {
647                    $(this).hide();
648                    //$(this).removeClass("bvi-background-image");
649                    var alt = this.alt || 'Изображение';
650                    var imgClass = $(this).attr("class") || 'bvi-class-none';
651                    var imgId = $(this).attr("id") || 'bvi-id-none';
652                    $(this).after($('<div class="' + imgClass + '" id="' + imgId + '" style="width: ' + $(this).get(0).naturalWidth + 'px; height: 100%;">').html(alt));
653                });
654            }
655
656            if (bvi_images === 'grayscale') {
657                $("img").each(function () {
658                    $(this).show();
659                    $('div.bvi-img').remove();
660                    //$(this).removeClass("bvi-background-image");
661                    if (versionIE == 11 || versionIE == 10 || versionIE == 9) {
662                        $(this).attr('data-bvi-img-original', this.src
662);
663                        if (location.hostname === extractHostname(this.src)) {
664                            var src = grayscale(this.src);
665                            this.src = src;
666                        } else {
667                            return false;
668                        }
669                    }
670                });
671
672                $(".bvi-body *").each(function () {
673                    var $this = $(this);
674                    var background_image = $this.css("background-image");
675                    var pattern = background_image.replace(/^url\(['"]?/,'').replace(/['"]?\)$/,'');
676                    if (pattern != 'none') {
677                        if (versionIE == 11 || versionIE == 10 || versionIE == 9) {
678                            var r = '^(https?|http)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]';
679                            if(pattern.match(r)) {
680                                var src_pattern = grayscale(pattern);
681                                $this.attr('data-bvi-background-image-original', pattern);
682                                $this.css("background-image", "url(" + src_pattern + ") !important");
683                            }
684                        }
685                    }
686                });
687            }
688        }
689
690        function extractHostname(url) {
691            var hostname;
692            if (url.indexOf("//") > -1) {
693                hostname = url.split('/')[2];
694            } else {
695                hostname = url.split('/')[0];
696            }
697            hostname = hostname.split(':')[0];
698            hostname = hostname.split('?')[0];
699
700            return hostname;
701        }
702
703        function grayscale(src) {
704            var canvas = document.createElement('canvas');
705            var ctx = canvas.getContext('2d');
706            var imgObj = new Image();
707            //imgObj.crossOrigin = "Anonymous";
708            imgObj.src = src;
709            canvas.width = imgObj.naturalWidth || imgObj.offsetWidth || imgObj.width;
710            canvas.height = imgObj.naturalHeight || imgObj.offsetHeight || imgObj.height;
711            ctx.drawImage(imgObj, 0, 0);
712            var imgPixels = ctx.getImageData(0, 0, canvas.width, canvas.height);
713
714            for (var y = 0; y < imgPixels.height; y++) {
715                for (var x = 0; x < imgPixels.width; x++) {
716                    var i = (y * 4) * imgPixels.width + x * 4;
717                    var avg = (imgPixels.data[i] + imgPixels.data[i + 1] + imgPixels.data[i + 2]) / 3;
718                    imgPixels.data[i] = avg;
719                    imgPixels.data[i + 1] = avg;
720                    imgPixels.data[i + 2] = avg;
721                }
722            }
723
724            ctx.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
725
726            return canvas.toDataURL();
727        }
728
729        function active() {
730            if (versionIE == 8 || versionIE == 7 || versionIE == 6 || versionIE == 5) {
731                console.log('Bvi console: Браузер не поддерживается.');
732                alert(confirm('Браузер не поддерживается.'));
733            } else {
734                if (Cookies.get('bvi-panel-active') === 'true') {
735                    $(selector).find('span').html('Обычная версия сайта').addClass('bvi-panel-close');
736                    $(selector).find('svg').addClass('bvi-panel-close');
737                    
738                    $(selector).addClass('bvi-active');
739                    panel();
740                    bvi_tts_player();
741                    bvi_click();
742                    set_active_link();
743                    if (bvi_tts_support_browser === false) {
744                        Cookies.set("bvi-tts", false, {path: "/", expires: 1});
745                        $('#bvi-tts-true').remove();
746                        $('#bvi-tts-false').remove();
747                    }
748                } else {
749                    bvi_tts_player();
750                    $(selector).removeClass('bvi-active');
751                 //    $(selector).find('svg').removeAttribute('class');
752                 //    $(selector).find('span').removeAttribute('class');
753                    $(selector).find('span').html('Версия для слабовидящих').removeClass('bvi-panel-close');
754                    $(selector).find('svg').removeClass('bvi-panel-close');
755                   
756                    
757                    /*$('.bvi-panel-close').remove();*/
758                    $(".bvi-panel").remove();
759                    $(".bvi-link-top").remove();
760                    $('body > .bvi-body').contents().unwrap();
761                    $('.bvi-tts-link').remove();
762                    $('.bvi-tts-text').contents().unwrap();
763                }
764            }
765        }
766
767        function panel() {
768            $('head').append('<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">');
769            $('body').wrapInner('<div class="bvi-body"></div>');
770            $('body').prepend('<div class="bvi-panel">\n' +
771                '    <div class="bvi-container-fluid">\n' +
772                '        <div class="bvi-row bvi-no-gutters">\n' +
773                '            <div class="bvi-col-12">\n' +
774                '                <div class="bvi-panel-toggler">\n' +
775                '                    <a href="#" id="bvi-toggler" class="bvi-link" title="Меню">Меню</a>\n' +
776                '                    <a href="#" id="bvi-toggler-close" class="bvi-link" title="Обычная версия сайта">Обычная версия сайта</a>\n' +
777                '                    <a href="#" id="bvi-toggler-menu-hide" class="bvi-link" title="Скрыть панель"><i class="bvi-images bvi-images-minus-square-o "></i></a>\n' +
778                '                </div>\n' +
779                '            </div>\n' +
780                '        </div>\n' +
781                '    </div>\n' +
782                '    <div class="bvi-panel-container bvi-container">\n' +
783                '        <div class="bvi-row bvi-no-gutters">\n' +
784                '            <div class="bvi-col-6 bvi-col-sm-6 bvi-col-md-3 bvi-col-lg-3 bvi-col-xl-3 bvi-text-center">\n' +
785                '                <div class="bvi-title">Размер шрифта <span id="bvi-font-size"></span> px</div>\n' +
786                '                <a href="#" id="bvi-font-size-less" class="bvi-link" title="Уменьшить размер шрифта">A -</a>\n' +
787                '                <a href="#" id="bvi-font-size-more" class="bvi-link" title="Увеличить размер шрифта">A +</a>\n' +
788                '            </div>\n' +
789                '            <div class="bvi-col-6 bvi-col-sm-6 bvi-col-md-3 bvi-col-lg-3 bvi-col-xl-3 bvi-text-center">\n' +
790                '                <div class="bvi-title">Цвета сайта</div>\n' +
791                '                <a href="#" id="bvi-theme-white" class="bvi-link bvi-link-white " title="Черным по белому">Ц</a>\n' +
792                '                <a href="#" id="bvi-theme-black" class="bvi-link bvi-link-black" title="Белым по черному">Ц</a>\n' +
793                '                <a href="#" id="bvi-theme-blue" class="bvi-link bvi-link-blue" title="Темно-синим по голубому">Ц</a>\n' +
794                '                <a href="#" id="bvi-theme-brown" class="bvi-link bvi-link-brown" title="Коричневым по бежевому">Ц</a>\n' +
795                '                <a href="#" id="bvi-theme-green" class="bvi-link bvi-link-green" title="Зеленым по темно-коричневому">Ц</a>\n' +
796                '            </div>\n' +
797                '            <div class="bvi-col-6 bvi-col-sm-6 bvi-col-md-3 bvi-col-lg-3 bvi-col-xl-2 bvi-text-center">\n' +
798                '                <div class="bvi-title">Изображения</div>\n' +
799                '                <a href="#" id="bvi-images-true" class="bvi-link" title="Изображения включены"><i class="bvi-images bvi-images-on"></i></a>\n' +
800                '                <a href="#" id="bvi-images-false" class="bvi-link" title="Изображения выключены"><i class="bvi-images bvi-images-off"></i></a>\n' +
801                '                <a href="#" id="bvi-images-grayscale" class="bvi-link" title="Изображения черно-белые"><i class="bvi-images bvi-images-adjust"></i></a>\n' +
802                '            </div>\n' +
803                '            <div class="bvi-col-6 bvi-col-sm-6 bvi-col-md-3 bvi-col-lg-3 bvi-col-xl-4 bvi-text-center">\n' +
804                '                <div class="bvi-title">Дополнительно</div>\n' +
805                '                <a href="#" id="bvi-tts-true" class="bvi-link" title=""><i class="bvi-images bvi-images-volume-on"></i></a>\n' +
806                '                <a href="#" id="bvi-tts-false" class="bvi-link"><i class="bvi-images bvi-images-volume-off"></i></a>\n' +
807                '                <a href="#" id="bvi-setting" class="bvi-link" title="Настройки">Настройки</a>\n' +
808                '                <a href="#" id="bvi-panel-close" class="bvi-link" title="Обычная версия сайта"><i class="bvi-images bvi-images-eye-slash"></i></a>\n' +
809                '                <a href="#" id="bvi-panel-hide" class="bvi-link" title="Скрыть панель"><i class="bvi-images bvi-images-minus-square-o"></i></a>\n' +
810                '            </div>\n' +
811                '        </div>\n' +
812                '        <div class="bvi-setting-menu bvi-hide-lg">\n' +
813                '            <div class="bvi-row bvi-no-gutters">\n' +
814                '                <div class="bvi-col-sm-12 bvi-col-md-6 bvi-col-lg-4 bvi-col-xl-4 bvi-text-center">\n' +
815                '                    <div class="bvi-title">Междустрочный интервал</div>\n' +
816                '                    <a href="#" id="bvi-line-height-normal" class="bvi-link" title="Междустрочный интервал стандартный">Стандартный</a>\n' +
817                '                    <a href="#" id="bvi-line-height-average" class="bvi-link" title="Междустрочный интервал средний">Средний</a>\n' +
818                '                    <a href="#" id="bvi-line-height-big" class="bvi-link" title="Междустрочный интервал большой">Большой</a>\n' +
819                '                </div>\n' +
820                '                <div class="bvi-col-sm-12 bvi-col-md-6 bvi-col-lg-5 bvi-col-xl-5 bvi-text-center">\n' +
821                '                    <div class="bvi-title">Межбуквенный интервал</div>\n' +
822                '                    <a href="#" id="bvi-letter-spacing-normal" class="bvi-link" title="Межбуквенный интервал одинарный">Одинарный</a>\n' +
823                '                    <a href="#" id="bvi-letter-spacing-average" class="bvi-link"\n' +
824                '                       title="Межбуквенный интервал полуторный">Полуторный</a>\n' +
825                '                    <a href="#" id="bvi-letter-spacing-big" class="bvi-link" title="Межбуквенный интервал двойной">Двойной</a>\n' +
826                '                </div>\n' +
827                '                <div class="bvi-col-sm-12 bvi-col-md-6 bvi-col-lg-3 bvi-col-xl-3 bvi-text-center">\n' +
828                '                    <div class="bvi-title">Шрифт</div>\n' +
829                '                    <a href="#" id="bvi-font-family-arial" class="bvi-link" title="Шрифт без засечек">Без засечек</a>\n' +
830                '                    <a href="#" id="bvi-font-family-times" class="bvi-link" title="Шрифт с засечками">С засечками</a>\n' +
831                '                </div>\n' +
832                '                <div class="bvi-col-sm-12 bvi-col-md-6 bvi-col-lg-6 bvi-col-xl-6 bvi-text-center">\n' +
833                '                    <div class="bvi-title">Встроенные элементы (Видео, карты и тд.)</div>\n' +
834                '                    <a href="#" id="bvi-flash-iframe-true" class="bvi-link" title="Включить">Включить</a>\n' +
835                '                    <a href="#" id="bvi-flash-iframe-false" class="bvi-link" title="Выключить">Выключить</a>\n' +
836                '                </div>\n' +
837                '                <div class="bvi-col-sm-12 bvi-col-md-12 bvi-col-lg-6 bvi-col-xl-6 bvi-text-right">\n' +
838                '                    <div class="bvi-title">&nbsp;</div>\n' +
839                '                    <a href="#" id="bvi-settings-default" class="bvi-link" title="Вернуть стандартные настройки">
839Настройки\n' +
840                '                        по умолчанию</a>\n' +
841                '                    <a href="#" id="bvi-setting-close" class="bvi-link" title="Закрыть панель">Закрыть панель</a>\n' +
842                '                </div>\n' +
843                '            </div>\n' +
844                '            <div class="bvi-row bvi-mt">\n' +
845                '                <div class="bvi-col-12 bvi-text-center">\n' +
846                '                    <a href="http://bvi.isvek.ru/" class="bvi-link-copy" target="_blank" title="bvi.isvek.ru v2.0">bvi.isvek.ru</a>\n' +
847                '                </div>\n' +
848                '            </div>\n' +
849                '        </div>\n' +
850                '    </div>\n' +
851                '</div>\n' +
852                '<a href="#" id="bvi-panel-show" class="bvi-link bvi-link-top"><i class="bvi-images bvi-images-eye"></i></a>');
853
854            if (width >= lg) {
855                $('.bvi-panel-container').show();
856            }
857
858            if (width <= lg) {
859                $('.bvi-panel-container').removeClass('bvi-container').addClass('bvi-container-fluid');
860            } else {
861                $('.bvi-panel-container').removeClass('bvi-container-fluid').addClass('bvi-container');
862            }
863
864            var scroll = (window.pageYOffset !== undefined) ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop;
865
866            if (scroll > 99) {
867                if (Cookies.get("bvi-fixed") == 'true') {
868                    $(".bvi-panel").addClass("bvi-fixed-top");
869                }
870            }
871
872            $(window).scroll(function () {
873                if ($(this).scrollTop() >= 99) {
874                    if (Cookies.get("bvi-fixed") == 'true') {
875                        $(".bvi-panel").addClass('bvi-fixed-top');
876                    }
877                } else {
878                    $(".bvi-panel").removeClass("bvi-fixed-top");
879                }
880            });
881
882            get();
883            get_image();
884        }
885
886        if (default_setting.bvi_theme == 'white' ||
887            default_setting.bvi_theme == 'black' ||
888            default_setting.bvi_theme == 'blue' ||
889            default_setting.bvi_theme == 'brown' ||
890            default_setting.bvi_theme == 'green') {
891            check_bvi_theme = true;
892        } else {
893            check_bvi_theme = false;
894            checkError = ['bvi_theme'];
895        }
896
897        if (default_setting.bvi_font == 'times' || default_setting.bvi_font == 'arial') {
898            check_bvi_font = true;
899        } else {
900            check_bvi_font = false;
901            checkError = ['bvi_font'];
902        }
903
904        if (default_setting.bvi_letter_spacing == 'normal' || default_setting.bvi_letter_spacing == 'average' || default_setting.bvi_letter_spacing == 'big') {
905            check_bvi_letter_spacing = true;
906        } else {
907            check_bvi_letter_spacing = false;
908            checkError = ['bvi_letter_spacing'];
909        }
910
911        if (default_setting.bvi_line_height == 'normal' || default_setting.bvi_line_height == 'average' || default_setting.bvi_line_height == 'big') {
912            check_bvi_line_height = true;
913        } else {
914            check_bvi_line_height = false;
915            checkError = ['bvi_line_height'];
916        }
917
918        if (default_setting.bvi_font_size == 0) {
919            check_bvi_font_size = false;
920            checkError = ['bvi_font_size'];
921        } else if (default_setting.bvi_font_size <= 40) {
922            check_bvi_font_size = true;
923        } else {
924            check_bvi_font_size = false;
925            checkError = ['bvi_font_size'];
926        }
927
928        if (default_setting.bvi_images === false || default_setting.bvi_images === true || default_setting.bvi_images === 'grayscale') {
929            check_bvi_images = true;
930        } else {
931            check_bvi_images = false;
932            checkError = ['bvi_images'];
933        }
934
935        if (default_setting.bvi_fixed === false || default_setting.bvi_fixed === true) {
936            check_bvi_fixed = true;
937        } else {
938            check_bvi_fixed = false;
939            checkError = ['bvi_fixed'];
940        }
941
942        if (default_setting.bvi_tts === false || default_setting.bvi_tts === true) {
943            check_bvi_tts = true;
944        } else {
945            check_bvi_tts = false;
946            checkError = ['bvi_tts'];
947        }
948
949        if (default_setting.bvi_flash_iframe === false || default_setting.bvi_flash_iframe === true) {
950            check_bvi_flash_iframe = true;
951        } else {
952            check_bvi_flash_iframe = false;
953            checkError = ['bvi_flash_iframe'];
954        }
955
956        if (default_setting.bvi_hide === false || default_setting.bvi_hide === true) {
957            check_bvi_hide = true;
958        } else {
959            check_bvi_hide = false;
960            checkError = ['bvi_hide'];
961        }
962
963        if (check_bvi_theme === true &&
964            check_bvi_font === true &&
965            check_bvi_letter_spacing === true &&
966            check_bvi_line_height === true &&
967            check_bvi_font_size === true &&
968            check_bvi_images === true &&
969            check_bvi_fixed === true &&
970            check_bvi_flash_iframe === true &&
971            check_bvi_tts === true &&
972            check_bvi_hide === true) {
973            if ($(selector).length) {
974                $(selector).click(function () {
975                    Cookies.set('bvi-panel-active', true, {path: "/", expires: 1});
976                    active();
977                    bvi_tts_speak('Версия сайта для слабовидящих');
978                    return false;
979                });
980            } else {
981                console.log('Bvi console: Неправильный параметр - [bvi_target]');
982            }
983            active();
984        } else {
985            console.log('Bvi console: Неправильный параметр - [' + checkError + ']');
986        }
987    };
988})(jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.