PageSourceSearch

https://istraria.ru/templates/goodtheme/js/core.js?1586724323

js istraria.ru collected 2026-09-25 21:55:49 UTC 25,754 bytes, 758 lines download raw bytes

1var icms = icms || {};
2
3$(document).ready(function(){
4
5    for(var module in icms){
6        if ( typeof(icms[module].onDocumentReady) === 'function' ) {
7            icms[module].onDocumentReady();
8        }
9    }
10
11    renderHtmlAvatar();
12
13    $('.widget_tabbed').each(function(){
14
15       $('.tabs .tab a, .tabs .tab a', $(this)).click(function(){
16           var wid = $(this).data('id');
17           var block = $(this).parent('li').parent('ul').parent('.tabs').parent('.widget_tabbed');
18           $('.body', block).hide();
19           $('.links-wrap', block).hide();
20           $('#widget-'+wid, block).show();
21           $('#widget-links-'+wid, block).show();
22           $('.tabs a', block).removeClass('active');
23           $(this).addClass('active');
24           return false;
25       });
26
27    });
28
29	$('.messages.ajax-modal a').on('click', function(){
30        $('#popup-manager').addClass('nyroModalMessage');
31	});
32
33});
34
35icms.menu = (function ($) {
36
37    this.onDocumentReady = function(){
38
39        $(document).on('click', function(event) {
40            if ($(event.target).closest('.dropdown_menu').length) {
41                $('.dropdown_menu > input').not($(event.target).closest('.dropdown_menu > input')).prop('checked', false);
42                return;
43            }
44            $('.dropdown_menu > input').prop('checked', false);
45        });
46
47        var dropdown = $('<select class="mobile_menu_select" />').appendTo("nav");
48        $("<option value='/'></option>").appendTo(dropdown);
49
50   
51
52        if ($('.tabs-menu').length){
53
54            $(".tabs-menu").each(function() {
55
56                var tabs = $(this);
57
58                var dropdown = $('<select class="mobile_menu_select" />').prependTo(tabs);
59                $("> ul > li > a", tabs).each(function() {
60                    var el = $(this);
61                    var attr = {
62                        value   : el.attr('href'),
63                        text    : el.text()
64                    };
65                    if(window.location.pathname.indexOf(el.attr('href')) === 0){
66                        attr.selected = true;
67                    }
68                    $("<option>", attr).appendTo(dropdown);
69                });
70
71                $(dropdown).change(function() {
72                    window.location = $(this).find("option:selected").val();
73                });
74
75            });
76
77        }
78
79        if($('div.widget.fixed_actions_menu').length){
80            if ($('#breadcrumbs').length){
81                $('#breadcrumbs').prepend($('div.widget.fixed_actions_menu'));
82                $('div.widget.fixed_actions_menu').on('click', function (){
83                    if($(this).hasClass('clicked')){ return; }
84                    var __menu = $(this).addClass('clicked');
85                    var hide_func = function (){
86                        $(document).one('click', function(event) {
87                            if ($(event.target).closest(__menu).length) { hide_func(); return; }
88                            $(__menu).removeClass('clicked');
89                        });
90                    };
91                    hide_func();
92                });
93            } else {
94                $('div.widget.fixed_actions_menu').removeClass('fixed_actions_menu');
95            }
96        };
97
98    };
99
100    return this;
101
102}).call(icms.menu || {},jQuery);
103
104icms.forms = (function ($) {
105
106    this.wysiwygs_insert_pool = {insert: {}, add: {}, init: {}, save: {}};
107    this.submitted = false;
108    this.form_changed = false;
109    this.csrf_token = false;
110
111    var _this = this;
112
113    this.addWysiwygsInsertPool = function (field_name, callback){
114        this.wysiwygs_insert_pool.insert[field_name] = callback;
115    };
116
117    this.addWysiwygsAddPool = function (field_name, callback){
118        this.wysiwygs_insert_pool.add[field_name] = callback;
119    };
120
121    this.addWysiwygsInitPool = function (field_name, callback){
122        this.wysiwygs_insert_pool.init[field_name] = callback;
123    };
124
125    this.addWysiwygsSavePool = function (field_name, callback){
126        this.wysiwygs_insert_pool.save[field_name] = callback;
127    };
128
129    this.wysiwygBeforeSubmit = function (){
130        for(var field_name in this.wysiwygs_insert_pool.save) {
131            if(this.wysiwygs_insert_pool.save.hasOwnProperty(field_name)){
132                if (typeof(this.wysiwygs_insert_pool.save[field_name]) === 'function') {
133                    this.wysiwygs_insert_pool.save[field_name](field_name);
134                }
135            }
136        }
137        return this;
138    };
139
140    this.wysiwygInit = function (field_name){
141        if (typeof(this.wysiwygs_insert_pool.init[field_name]) === 'function') {
142            this.wysiwygs_insert_pool.init[field_name](field_name);
143        }
144        return this;
145    };
146
147    this.wysiwygInsertText = function (field_name, text){
148        if (typeof(this.wysiwygs_insert_pool.insert[field_name]) === 'function') {
149            this.wysiwygs_insert_pool.insert[field_name](field_name, text);
150        } else {
151            $('#'+field_name).val(text).focus();
152        }
153        return this;
154    };
155
156    this.wysiwygAddText = function (field_name, text){
157        if (typeof(this.wysiwygs_insert_pool.add[field_name]) === 'function') {
158            this.wysiwygs_insert_pool.add[field_name](field_name, text);
159        } else {
160            addTextToPosition($('#'+field_name), text);
161        }
162        return this;
163    };
164
165    this.getCsrfToken = function (){
166        if(this.csrf_token === false){
167            this.csrf_token = $('meta[name="csrf-token"]').attr('content');
168        }
169        return this.csrf_token;
170    };
171
172    this.setCsrfToken = function (csrf_token){
173        this.csrf_token = csrf_token;
174    };
175
176    this.initFilterForm = function(selector){
177
178        $($(selector).find('.buttons input[type = submit]')).on('click', function (){
179
180            var form = $(this.closest('form'));
181            var submit_uri = $(form).attr('action');
182
183            var form_params = _this.toJSON(form);
184
185            var o = {};
186            for(var name in form_params){if(form_params.hasOwnProperty(name)){
187                if(name === 'page'){ continue; }
188                if(form_params[name] && form_params[name] !== '0'){
189                    o[name] = form_params[name];
190                }
191            }}
192
193            var query_string = $.param(o);
194            if(query_string.length > 0){
195                window.location.href = submit_uri+'?'+query_string;
196            } else {
197                window.location.href = submit_uri;
198            }
199
200            return false;
201
202        });
203
204    };
205
206    this.initUnsaveNotice = function(){
207
208        var init_data = {};
209
210        $('form').each(function(i){
211            init_data[i] = _this.toJSON($(this));
212            $(this).attr('data-notice_id', i);
213        });
214
215        $(document).on('change', '.form-tabs input, .form-tabs select, .form-tabs textarea', function (e) {
216            var form = $(this).closest('form');
217            _this.form_changed = (JSON.stringify(init_data[form.attr('data-notice_id')]) !== JSON.stringify(_this.toJSON(form))) ? true : false;
218        });
219        $(document).on('submit', 'form', function () {
220            icms.forms.submitted = true;
221        });
222        $(window).on('beforeunload', function (e) {
223            if (icms.forms.form_changed && !icms.forms.submitted) {
224                var e = e || window.event;
225                var msg = LANG_SUBMIT_NOT_SAVE;
226                if (e) {
227                    e.returnValue = msg;
228                }
229                return msg;
230            }
231        });
232
233    };
234
235	this.toJSON = function(form) {
236        _this.wysiwygBeforeSubmit();
237        var o = {};
238        var a = form.serializeArray();
239        $.each(a, function() {
240            if (o[this.name] !== undefined) {
241                if (!o[this.name].push) {
242                    o[this.name] = [o[this.name]];
243                }
244                o[this.name].push(this.value || '');
245            } else {
246                o[this.name] = this.value || '';
247            }
248        });
249        return o;
250	};
251
252    this.submit = function(selector){
253        selector = selector || '.button-submit';
254        icms.forms.submitted = true;
255        $(selector).trigger('click');
256    };
257
258	this.updateChildList = function (child_id, url, value, current_value){
259
260		var child_list = $('#'+child_id);
261
262		if ($('#f_'+child_id+' .loading').length==0){
263			$('#f_'+child_id+' label').append(' <div class="loading"></div>');
264		}
265
266		child_list.html('');
267
268        current_value = current_value || '';
269
270        if(!$.isArray(current_value)){
271            current_value = [current_value];
272        }
273
274		$.post(url, {value: value}, function(result){
275
276			for(var k in result){if(result.hasOwnProperty(k)){
277                if(typeof result[k].value !== 'undefined'){
278                    var _value = result[k].value;
279                    var title = result[k].title;
280                }else{
281                    var _value = k;
282                    var title = result[k];
283                }
284				child_list.append('<option value="'+_value+'"'+($.inArray(_value, current_value) !== -1 ? ' selected' : '')+'>'+title+'</option>');
285			}}
286
287            $(child_list).trigger('chosen:updated');
288
289			$('#f_'+child_id+' .loading').remove();
290
291            icms.events.run('icms_forms_updatechildlist', result);
292
293		}, 'json');
294
295	};
296
297    this.submitAjax = function(form, additional_params){
298
299        icms.forms.submitted = true;
300
301        var form_data = this.toJSON($(form));
302
303        if(additional_params){
304            $.extend(form_data, additional_params);
305        }
306
307        var url = $(form).attr('action');
308
309        var submit_btn = $(form).find('.button-submit');
310
311        $(submit_btn).prop('disabled', true);
312
313        $.post(url, form_data, function(result){
314
315            $(submit_btn).prop('disabled', false);
316
317            if (result.errors == false){
318                if ("callback" in result){
319                    window[result.callback](form_data, result); return;
320                }
321                if (result.success_text){
322                    icms.modal.alert(result.success_text);
323                }
324                return;
325            }
326
327            if (typeof(result.errors)=='object'){
328
329                $('.field_error', form).removeClass('field_error');
330                $('.error_text', form).remove();
331
332                for(var field_id in result.errors){
333                    var id = field_id.replace(':', '_');
334                    $('#f_'+id, form).addClass('field_error');
335                    $('#f_'+id, form).prepend('<div class="error_text">' + result.errors[field_id] + '</div>');
336                    $(form).find('ul.tabbed > li > a[href = "#'+$('#f_'+id, form).parents('.tab').attr('id')+'"]').trigger('click');
337                }
338
339                icms.events.run('icms_forms_submitajax', result);
340
341                icms.modal.resize();
342
343                icms.forms.submitted = false;
344
345                return;
346
347            }
348
349        }, 'json');
350
351        return false;
352
353    };
354
355    this.initSymbolCount = function (field_id, max, min){
356        $('#f_'+field_id).append('<div class="symbols_count"><span class="symbols_num"></span><span class="symbols_spell"></span></div>');
357        var symbols_count = $('#f_'+field_id+' > .symbols_count');
358        var symbols_num   = $('.symbols_num', symbols_count);
359        var symbols_spell = $('.symbols_spell', symbols_count);
360        if(max){
361            var type = 'left';
362        } else {
363            var type = 'total';
364        }
365        if(min){
366            type = 'total';
367        }
368        var field_id_el = $('#'+field_id);
369
370        $(symbols_num).on('click', function (){
371            if(max){
372                if(type === 'total'){
373                    type = 'left';
374                } else {
375                    type = 'total';
376                }
377                render_symbols_count();
378            }
379        });
380        var render_symbols_count = function (){
381            var num = +$(field_id_el).val().length;
382            if(!num){
383                $(symbols_num).html(''); $(symbols_count).hide(); return;
384            }
385            if(min){ if(num < min){
386                    $(symbols_num).addClass('overflowing_min');
387                } else {
388                    $(symbols_num).removeClass('overflowing_min');
389            }}
390            if(max && num > max){
391                $(symbols_num).addClass('overflowing');
392            } else {
393                $(symbols_num).removeClass('overflowing');
394            }
395            if(type === 'total'){
396                $(symbols_count).fadeIn();
397                $(symbols_num).html(num);
398                $(symbols_spell).html(spellcount(num, LANG_CH1, LANG_CH2, LANG_CH10));
399            } else {
400                $(symbols_count).fadeIn();
401                if(num > max){
402                    num = max;
403                    $(field_id_el).val($(field_id_el).val().substr(0, max));
404                }
405                $(symbols_num).html((max - num));
406                $(symbols_spell).html(spellcount(num, LANG_CH1, LANG_CH2, LANG_CH10)+' '+LANG_ISLEFT);
407            }
408        };
409        $(field_id_el).on('input', render_symbols_count);
410        icms.events.on('autocomplete_select', function(){ render_symbols_count(); });
411        render_symbols_count();
412    };
413
414    this.getInputVal = function(el){
415        if($(el).is(':checkbox,:radio')){
416            var v = $(el+':checked').val();
417            return typeof v === 'undefined' ? '0' : v;
418        }
419        return $(el).val();
420    };
421    this.inputNameToId = function(name){
422        name = name.replace(/\:|\|/g,'_');
423        return name;
424    };
425    this.inputNameToElName = function(name){
426        name = name.split(':');
427        return (typeof name !== 'string' && name.length > 1) ? name.shift()+'['+name.join('][')+']' :  name;
428    };
429    this.VDListeners = {};
430    this.VDRules = {from:{},depends:{}};
431    this.addVisibleDepend = function(form_id, field_id, rules){
432        if(typeof this.VDRules.depends[form_id+'-'+field_id] === 'undefined'){ /* здесь все зависимости поля field_name */
433            this.VDRules.depends[form_id+'-'+field_id] = rules; /* array('is_cats' => array('show' => array('1'))) */
434        }else{
435            $.extend(this.VDRules.depends[form_id+'-'+field_id], rules);
436        }
437        for(var f in rules){if(rules.hasOwnProperty(f)){
438            if(typeof this.VDRules.from[form_id+'-'+f] === 'undefined'){this.VDRules.from[form_id+'-'+f] = {};}
439            if(typeof this.VDRules.from[form_id+'-'+f][field_id] === 'undefined'){ /* здесь все, кто зависит от поля f */
440                this.VDRules.from[form_id+'-'+f][field_id] = rules[f]; /* array('show' => array('1')) */
441            }else{
442                $.extend(this.VDRules.from[form_id+'-'+f][field_id], rules[f]);
443            }
444            if(typeof this.VDListeners[form_id+'-'+f] === 'undefined'){
445                this.VDListeners[form_id+'-'+f] = '#'+form_id+' [name="'+this.inputNameToElName(f)+'"]';
446                $('#'+form_id+' [name="'+this.inputNameToElName(f)+'"]').on('change', function (){
447                    for(var field in _this.VDRules.from[form_id+'-'+f]){if(_this.VDRules.from[form_id+'-'+f].hasOwnProperty(field)){ /* перебор теÑ
447…, кто зависит от этого поля f */
448                        var display = null; /* если не будет show */
449
450                        for(var _from in _this.VDRules.depends[form_id+'-'+field]){if(_this.VDRules.depends[form_id+'-'+field].hasOwnProperty(_from)){ /* перебор тех, от кого зависит поле field */
451                            if(typeof _this.VDRules.depends[form_id+'-'+field][_from]['show'] !== 'undefined'){
452                                if($.inArray(_this.getInputVal('#'+form_id+' [name="'+_this.inputNameToElName(_from)+'"]'), _this.VDRules.depends[form_id+'-'+field][_from]['show']) !== -1){
453                                    display = true;
454                                    break;
455                                }else{
456                                    display = false;
457                                }
458                            }
459                        }}
460
461                        if(display === null){display = true;}
462
463                        if(display){ /* скрытие сильнее показа */
464                            for(var _from in _this.VDRules.depends[form_id+'-'+field]){if(_this.VDRules.depends[form_id+'-'+field].hasOwnProperty(_from)){ /* перебор тех, от кого зависит поле field */
465                                if(typeof _this.VDRules.depends[form_id+'-'+field][_from]['hide'] !== 'undefined'){
466                                    if($.inArray(_this.getInputVal('#'+form_id+' [name="'+_this.inputNameToElName(_from)+'"]'), _this.VDRules.depends[form_id+'-'+field][_from]['hide']) !== -1){
467                                        display = false;
468                                        break;
469                                    }else{
470                                        display = true;
471                                    }
472                                }
473                            }}
474                        }
475
476                        if(display){
477                            $('#f_'+_this.inputNameToId(field)).removeClass('hide_field').prev('.field_tabbed').removeClass('hide_field');
478                        } else {
479                            $('#f_'+_this.inputNameToId(field)).addClass('hide_field').prev('.field_tabbed').addClass('hide_field');
480                        }
481
482                    }}
483                });
484            }
485        }}
486        return this;
487    };
488    this.VDReInit = function(){
489        for(var l in this.VDListeners){if(this.VDListeners.hasOwnProperty(l)){
490            $(this.VDListeners[l]).triggerHandler('change');
491        }}
492    };
493
494	return this;
495
496}).call(icms.forms || {},jQuery);
497
498icms.events = (function ($) {
499
500    this.listeners = {};
501
502    this.on = function(name, callback){
503        if (typeof(this.listeners[name]) == 'object'){
504            this.listeners[name].push(callback);
505        } else {
506            this.listeners[name] = [callback];
507        }
508        return this;
509    };
510
511    this.run = function(name, params){
512        params = params || {};
513        for(var event_name in this.listeners[name]) {
514            if(this.listeners[name].hasOwnProperty(event_name)){
515                if (typeof(this.listeners[name][event_name]) == 'function') {
516                    this.listeners[name][event_name](params);
517                }
518            }
519        }
520        return this;
521    };
522
523	return this;
524
525}).call(icms.events || {},jQuery);
526
527icms.pagebar = function(id, initial_page, has_next, is_modal){
528
529    initial_page = initial_page || 1;
530
531    var page = 1;
532
533    var link = $(id);
534
535    var showMore = function(){
536
537        var list_wrap = $(link).prev();
538
539        if(!has_next){
540            if(initial_page > 1){
541                return true;
542            }
543            $('body,html').animate({
544                scrollTop: $(list_wrap).offset().top
545                }, 500
546            );
547            return false;
548        }
549
550        $(link).addClass('show_spinner');
551
552        page += 1;
553
554        var post_params = $(link).data('url-params');
555        post_params.page = page;
556
557        $.post($(link).data('url'), post_params, function(data){
558
559            var first_page_url = $(link).data('first-page-url');
560
561            $(link).removeClass('show_spinner');
562
563            if (!data.html) { return; }
564
565            has_next = data.has_next;
566            page = data.page;
567
568            $(list_wrap).append(data.html);
569
570            if(!has_next){
571                $('span', link).html($('span', link).data('to-first'));
572                $(link).attr('href', first_page_url);
573            }
574
575            var _sep = first_page_url.indexOf('?') !== -1 ? '&' : '?';
576
577            if(!is_modal){
578                window.history.pushState({link: first_page_url+_sep+'page='+page}, '', first_page_url+_sep+'page='+page);
579            }
580
581            if(is_modal){
582                icms.modal.resize();
583            }
584
585        }, 'json');
586
587        return false;
588
589    };
590
591    $(link).on('click', function (){
592        return showMore();
593    });
594
595};
596
597$.expr[':'].Contains = $.expr.createPseudo(function(arg) {
598    return function( elem ) {
599        return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
600    };
601});
602function setCaretPosition(field, pos) {
603    var $field = $(field);
604    if ($field[0].setSelectionRange) {
605        $field.focus();
606        $field[0].setSelectionRange(pos, pos);
607    } else if ($field[0].createTextRange) {
608        var range = $field[0].createTextRange();
609        range.collapse(true);
610        range.moveEnd('character', pos);
611        range.moveStart('character', pos);
612        range.select();
613    }
614}
615function getCaretPosition(field) {
616    var $field = $(field);
617    if($field.length){
618        if (document.selection) {
619            $field.focus();
620            var Sel = document.selection.createRange();
621            Sel.moveStart ('character', -$field.val().length);
622            return Sel.text.length;
623        } else {
624            return $field[0].selectionStart || 0;
625        }
626    }
627    return 0;
628}
629function addTextToPosition(field_id, text, spacer, spacer_stop){
630	var field = $(field_id);
631	var value = $(field).val();
632	var pos = getCaretPosition(field);
633    var value1 = value.substring(0, pos);
634    var value2 = value.substring(pos, value.length);
635    if(spacer){
636        var check1 = function(spacer){ // проверка перед вставляемым
637            if(value1.length >= spacer.length){
638                if(value1.substring(pos - spacer.length, pos) !== spacer){
639                    return true;
640                }
641            }
642            return false;
643        };
644        var check2 = function(spacer){ // проверка после вставляемого текста
645            if(value2.length >= spacer.length){
646                if(value2.substring(0, spacer.length) !== spacer){
647                    return true;
648                }
649            }
650            return false;
651        };
652        var insert1 = true, insert2 = true;
653        if(spacer_stop){
654            for(var ss in spacer_stop){if(spacer_stop.hasOwnProperty(ss)){
655                if(insert1 && (!spacer_stop[ss] || spacer_stop[ss] == 1) && !check1(ss)){
656                    insert1 = false;
657                }
658                if(insert2 && (!spacer_stop[ss] || spacer_stop[ss] == 2) && !check2(ss)){
659                    insert2 = false;
660                }
661            }}
662        }
663
664        if(insert1 && check1(spacer)){
665            text = spacer+text;
666        }
667        if(insert2 && check2(spacer)){
668            text += spacer;
669        }
670    }
671    $(field).val(value1 + text + value2).trigger('input');
672    setCaretPosition(field, pos+text.length);
673    return false;
674}
675function toggleFilter(){
676    var filter = $('.filter-panel');
677    $('.filter-link', filter).toggle('fast');
678    $('.filter-container', filter).slideToggle('fast');
679}
680function goBack(){
681    window.history.go(-1);
682}
683function spellcount (num, one, two, many){
684    if (num%10==1 && num%100!=11){
685        str = one;
686    } else if(num%10>=2 && num%10<=4 && (num%100<10 || num%100>=20)){
687        str = two;
688    } else {
689        str = many;
690    }
691    return str;
692}
693function renderHtmlAvatar(wrap){
694    wrap = wrap || document;
695    $('div.default_avatar', wrap).each(function(){
696        var a = this;
697        var i = $('img', this);
698        var isrc = $(i).attr('src');
699        $(i).attr('src', '');
700        $(i).attr('src', isrc);
701        $(i).load(function() {
702            var h = +$(this).height();
703            $(a).css({
704                'line-height': h+'px',
705                'font-size': Math.round((h*0.625))+'px'
706            });
707        });
708    });
709}
710function initMultyTabs(selector, tab_wrap_field){
711    tab_wrap_field = tab_wrap_field || '.field';
712    $(selector).each(function(indx, element){
713        var tab = $(' > li > a', $(this));
714        $(tab).closest('li').eq(0).addClass('active');
715		$(tab).on('click', function() {
716            var tab_field = $(this).attr('href');
717			$(this).closest('li').addClass('active').siblings().removeClass('active');
718            $(element).nextAll(tab_wrap_field+':lt('+$(tab).closest('li').length+')').hide();
719            $(tab_field).show();
720            return false;
721		});
722    });
723}
724function initTabs(selector){
725    $(selector+' .tab').hide();
726    $(selector+' .tab').eq(0).show();
727    $(selector+' ul.tabbed > li').eq(0).addClass('active');
728    $(selector+' ul.tabbed > li > a').click(function(){
729        $(selector+' li').removeClass('active');
730        $(this).parent('li').addClass('active');
731        $(selector+' .tab').hide();
732        $(selector+' '+$(this).attr('href')).show();
733        icms.events.run('icms_tab_cliked', this);
734        return false;
735    });
736    $(selector+' .field').each(function(indx, element){
737        if($(element).hasClass('field_error')){
738            $(selector+' ul.tabbed > li > a[href = "#'+$(element).parents('.tab').attr('id')+'"]').trigger('click');
739        }
740    });
741    $('select.mobile_menu_select', selector).change(function() {
742        $(selector+' ul.tabbed > li > a[href = "'+$(this).find("option:selected").val()+'"]').trigger('click');
743    });
744}
745function insertJavascript(filepath, onloadCallback) {
746    if ($('head script[src="'+filepath+'"]').length > 0){
747        return;
748    }
749    var el = document.createElement('script');
750    el.setAttribute('type', 'text/javascript');
751    el.setAttribute('src', filepath);
752    if (typeof(onloadCallback) == 'function') {
753        el.setAttribute('onload', function() {
754            onloadCallback();
755        });
756    }
757    $('head').append(el);
758}

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.