PageSourceSearch

https://www.webareal.cz/bohemiasoft/js/bs.js

js webareal.cz collected 2026-09-25 20:22:51 UTC 22,381 bytes, 859 lines download raw bytes

1/* global id_language, id_country_code, path_request, type_request, cache_break, administration_id_language, administration_id_country_code */
2
3/**
4 * @namespace BS
5 * @autor Jaroslav Trsek <[email protected]>
6 */
7var BS = BS || {};
8
9/**
10 * Parametr pro obnovu cache při změně buildu
11 * @type String
12 */
13BS.$cache_break_param = '_=' + (typeof cache_break !== 'undefined' ? cache_break : (new Date()).getTime());
14
15/**
16 * Rozšíří objekt1 (hlubokou kopií) o objekt2 aniž by přepsal objekt1
17 * @param {Object} $default Původní objekt.
18 * @param {Object} $request Rozšiřující objekt (Pokud nebudou existovat vlastnosti tak se připíší. V opačném případě přepíšou původní hodnoty)
19 * @return {Object}
20 */
21BS.extend = function($default, $request)
22{
23  var $tmp = {};
24  $.extend(true, $tmp, $default);
25  $.extend(true, $tmp, $request);
26  return $tmp;
27};
28
29/** --------------------------------------------------------------------------------
30 * Definování defaultních requestů
31 */
32BS.Request = {};
33
34/**
35 * defaultní request, ze kterého dědí všichni ostatní
36 */
37BS.Request.$default = {
38  url: path_request,
39  type: type_request,
40  cache: false,
41  dataType: 'json',
42  error: function(jqXHR, textStatus, errorThrown){
43    if(textStatus === "parsererror")
44    {
45      BS.Debug.info(errorThrown);
46      BS.Debug.log("Response text: "+ jqXHR.responseText);
47    }
48  },
49  beforeSend: function()
50  {
51    var $live_xhr;
52    var $counter = $("body").attr('data-xhr-counter');
53    if (typeof $counter === 'undefined')
54    {
55      $live_xhr = 0;
56    }
57    else
58    {
59      $live_xhr = parseInt($counter);
60    }
61    $("body").attr('data-xhr-counter', ++$live_xhr);
62    if ($live_xhr === 1)
63    {
64      $("body").addClass("bs-xhr-waiting");
65    }
66  },
67  complete: function()
68  {
69    var $live_xhr = parseInt($("body").attr('data-xhr-counter'));
70    $("body").attr('data-xhr-counter', --$live_xhr);
71    if ($live_xhr === 0)
72    {
73      $("body").removeClass("bs-xhr-waiting");
74    }
75
76  },
77  statusCode: {
78    //TODO: doplnit  kontrolu odhlášeného uživatele - 401 Unauthorized
79    401: function($xhr) {
80    },
81    //TODO: doplnit kontrolu placených částí aplikace - 402 Payment Required
82    402: function($xhr) {
83    },
84    500: function($xhr) {
85      var $server_path_of_exception = $xhr.getResponseHeader("X-Nette-Error-Log");
86      if ($server_path_of_exception !== null)
87      {
88        var $url_part = $server_path_of_exception.split("/");
89        var $url_exception = 'http://' + window.location.hostname + '/log/' + $url_part[$url_part.length - 1];
90        window.open($url_exception, '_newtab');
91      }
92      else
93      {
94        BS.Debug.warn($xhr.responseText);
95      }
96    }
97  },
98  data: {
99    id_language: id_language,
100    id_country_code: id_country_code
101  }
102};
103
104/**
105 * Doplnění requestu o přesměrování při úspěchu
106 */
107BS.Request.$default_with_redirect = BS.extend(BS.Request.$default, {
108  success: function(data) {
109    if (data)
110    {
111      if (data.redirect_url)
112      {
113        window.location.replace(data.redirect_url);
114      }
115      else
116      {
117        $(BS).trigger('e_request_message_received', [data]);
118      }
119    }
120  }
121});
122
123/**
124 * Requesty s jazykem administrace
125 */
126BS.Request.$default_admin = BS.extend(BS.Request.$default, {
127  data: {
128    id_language: administration_id_language,
129    id_country_code: administration_id_country_code
130  }
131});
132BS.Request.$default_admin_with_redirect = BS.extend(BS.Request.$default_with_redirect, {
133  data: {
134    id_language: administration_id_language,
135    id_country_code: administration_id_country_code
136  }
137});
138/**
139 * konec definování requestů
140 * --------------------------------------------------------------------------------- */
141
142/**
143 * Obnoví obrázek v elementu <img>
144 * !!! Odstraňuje všechny parametry z URL, pokud nebude výhledově vyhovovat, tak přepsat za nahrazování !!!
145 * @param {String|Object} $image Selector obrázku, nebo jQuery ($) instance obrázku
146 * @return {Boolean}
147 */
148BS.refresh_image = function($image)
149{
150  var $element = $image;
151  if (typeof $image === "string")
152  {
153    $element = $($image);
154  }
155  // pokud nemáme $ instanci elementu, tak ukončíme provádění
156  if (!($element instanceof $))
157  {
158    BS.Debug.error("Prametr není instancí $");
159    return false;
160  }
161  var $src = $element.attr("src");
162  var $query_position = $src.indexOf('?');
163  // odstraníme staré parametry url adresy
164  if ($query_position !== -1)
165  {
166    var $amp_position = $src.substring($query_position).indexOf('&');
167    if ($amp_position !== -1)
168    {
169      // pokud budou odstraněny i dakší parametry URL, tak pro jistotu vypíšema varování
170      BS.Debug.warn("BS.refresh_image(): z URL byly odstraněny parametry (" + $src.substring($query_position + $amp_position + 1) + ")");
171    }
172    $src = $src.substring(0, $query_position);
173  }
174  $element.attr('src', $src + '?_=' + Math.random());
175  return true;
176};
177
178/**
179 * Převede barvu z RGB do HEX
180 * @param {String} $css_color Barva v rgb "rgb( 255, 255, 255)"
181 * @return {String}
182 */
183BS.get_hex_color = function($css_color)
184{
185  var $digits = /(.*?)rgb\((\d+), (\d+), (\d+)\)/.exec($css_color);
186  var $red = parseInt($digits[2]);
187  var $green = parseInt($digits[3]);
188  var $blue = parseInt($digits[4]);
189  var $rgb = $blue | ($green << 8) | ($red << 16);
190  var $color = '#' + $rgb.toString(16);
191  if ($color === '#0')
192  {
193    $color = "#000000";
194  }
195  return $digits[1] + $color;
196};
197
198/**
199 * Upožní k parametrům z GETu přistupovat jako k poli
200 * @example BS.get_url_vars()["id"] // stejné jako PHP-kové $_GET["id"]
201 * @return {Array}
202 */
203BS.get_url_vars = function()
204{
205  var vars = {};
206  var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m, key, value) {
207    vars[key] = value;
208  });
209  return vars;
210};
211
212/**
213 * Odpočet, spustí callback když vyprší čas
214 * @param {Numeric} $seconds
215 * @param {Function} $change_callback
216 * @param {Function} $finish_callback
217 */
218BS.countdown_timer = function($seconds, $change_callback, $finish_callback)
219{
220  function countdown()
221  {
222    if ($seconds === 0)
223    {
224      if (typeof $finish_callback !== "undefined")
225      {
226        $finish_callback($seconds);
227      }
228    }
229    else
230    {
231      if (typeof $change_callback !== "undefined")
232      {
233        $change_callback($seconds);
234      }
235      $seconds--;
236      setTimeout(countdown, 1000);
237    }
238  }
239  countdown();
240};
241
242/**
243 * @class
244 */
245BS.Debug = {
246  /**
247   * Identifikátor inicializace
248   * @type {Boolean}
249   * @private
250   */
251  $is_initialized: false,
252  /**
253   * Defaultně vypneme, aby jsme uživatele donutili inicializovat. Ošetření podpory objektu console bude až v initu
254   * @type {Boolean}
255   * @private
256   */
257  $enable_console: false,
258  /**
259   * Defaultně vypneme. Debug bude zapínat APP
260   * @type {Boolean}
261   * @private
262   */
263  $enable_debug: false,
264  /**
265   * Pole pro uchovávání informace o skupinách debugovacích hlášek. Bude fungovat jako bug fix pro prohlížeče
266   * které nativně nepodporují console.group() a console.groupEnd()
267   * @type {Array}
268   */
269  $options: {
270    enable_debug: false,
271    enable_logging: false
272  },
273  $group: [],
274  /**
275   * @type Array Zasíbník posleních N debugů
276   */
277  $debug_bin: [],
278  /**
279   * @type Number Max počet debugů v zásobníku
280   */
281  $debug_bin_limit: 10,
282  /**
283   * Inicializace Debugu
284   * @method
285   * @param {Object} options
286   * @example
287   * <code>
288   * BS.Debug.init(true); // zapnuté debugování
289   * ...
290   * BS.Debug.init(false); // vypnuté debugování
291   * ...
292   * BS.Debug.init(); // vypnuté debugování
293   * </code>
294   */
295  init: function(options)
296  {
297    this.$options = BS.extend(this.$options, options);
298    // nastavíme zobrazení debugovacích informací
299    if (typeof $enable_debug === "boolean")
300    {
301      this.$is_initialized = true;
302      this.$options.enable_debug = $enable_debug;
303    }
304    // uližíme si vypnutí/zapnutí konzole
305    // pokud bude vypnutá a debug bude zapnutý, tak se zprávy budou zobrazovat v alertech
306    if (typeof console === "object")
307    {
308      this.$enable_console = true;
309    }
310    if (this.$options.enable_logging)
311    {
312      window.onerror = function(msg, url, lineNo)
313      {
314        BS.Debug.error_handler(msg, url, lineNo);
315      };
316    }
317  },
318  /*
319   *Zjistí jestli je povolen debug
320   *@return {Boolean}
321   */
322  is_debug_enable: function()
323  {
324    if (this.$is_initialized)
325    {
326      return this.$options.enable_debug;
327    }
328    else
329    {
330      this.init(false);
331      return this.$options.enable_debug;
332    }
333  },
334  /*
335   *Zjistí jestli je dostupná konzole
336   *@return {Boolean}
337   */
338  is_console_enable: function()
339  {
340    if (this.$is_initialized)
341    {
342      return this.$enable_console;
343    }
344    else
345    {
346      this.init(false);
347      return this.$enable_console;
348    }
349  },
350  /**
351   * Obyčejná zápis do logu. Pokud není dostupný, tak se zavolá alert. Použíje se v prohlížečích, které nepodporují konzoli
352   * @method
353   * @example
354   * <code>
355   * BS.Debug.log('BS test console.log'); // bez odkazu na objekt v DOMu
356   * ...
357   * BS.Debug.log('BS test console.log','test'); // s odkazem na element s id="test"
358   * </code>
359   * @param {String} $message Zpráva která se zobrazí do konzole
360   * @param {String} $id ID elementu na která se má v konzoli vytvořit odkaz
361   */
362  log: function($message, $id)
363  {
364    // Konzole není dostupná, vyhoď alert
365    if (this.$enable_console === false && this.is_debug_enable() === true)
366    {
367      //Tady začíná a končí alertové peklo
368      //alert($message);
369    }
370    else
371    {
372      if (this.is_debug_enable() === true)
373      {
374        if (typeof $id === "string")
375        {
376          console.log(document.getElementById($id), $message);
377        }
378        else
379        {
380          console.log($message);
381        }
382      }
383    }
384    this.add_to_bin($message);
385  },
386  /**
387   * Metoda pro zápis informativní chyby do konzole (ve většině prohlížečů se podbarví modře).
388   * @method
389   * @example
390   * <code>
391   * BS.Debug.info('BS test console.log'); // bez odkazu na objekt v DOMu
392   * ...
393   * BS.Debug.info('BS test console.log','test'); // s odkazem na element s id="test"
394   * </code>
395   * @param {String} $message Zpráva která se zobrazí do konzole
396   * @param {String} $id ID elementu na která se má v konzoli vytvořit odkaz
397   */
398  info: function($message, $id)
399  {
400    // Konzole není dostupná vyhoď alert
401    if (this.is_debug_enable() === true)
402    {
403      if (this.$enable_console === false)
404      {
405        this.log('Info:' + $message);
406      }
407      else
408      {
409        if (typeof $id === "string")
410        {
411          console.info(document.getElementById($id), $message);
412        }
413        else
414        {
415          console.info($message);
416        }
417      }
418    }
419    this.add_to_bin($message);
420  },
421  /**
422   * Metoda pro zápis varování do konzole (ve většině prohlížečů se podbarví žlutě).
423   * @method
424   * @example
425   * <code>
426   * BS.Debug.warn('BS test console.log'); // bez odkazu na objekt v DOMu
427   * ...
428   * BS.Debug.warn('BS test console.log','test'); // s odkazem na element s id="test"
429   * </code>
430   * @param {String} $message Zpráva která se zobrazí do konzole
431   * @param {String} $id ID elementu na která se má v konzoli vytvořit odkaz
432   */
433  warn: function($message, $id)
434  {
435    // Konzole není dostupná vyhoď alert
436    if (this.$enable_console === false)
437    {
438      this.log('Warn:' + $message);
439    }
440    else
441    {
442      if (this.is_debug_enable() === true)
443      {
444        if (typeof $id === "string")
445        {
446          console.warn(document.getElementById($id), $message);
447        }
448        else
449        {
450          console.warn($message);
451        }
452      }
453    }
454    this.add_to_bin($message);
455  },
456  /**
457   * Metoda pro zápis kritické chyby do konzole (ve většině prohlížečů se podbarví červeně).
458   * @method
459   * @example
460   * <code>
461   * BS.Debug.error('BS test console.log'); // bez odkazu na objekt v DOMu
462   * ...
463   * BS.Debug.error('BS test console.log','test'); // s odkazem na element s id="test"
464   * </code>
465   * @param {String} $message Zpráva která se zobrazí do konzole
466   * @param {String} $id ID elementu na která se má v konzoli vytvořit odkaz
467   */
468  error: function($message, $id)
469  {
470    // Konzole není dostupná vyhoď alert
471    if (this.$enable_console === false)
472    {
473      this.log('Error:' + $message);
474    }
475    else
476    {
477      if (this.is_debug_enable() === true)
478      {
479        if (typeof $id === "string")
480        {
481          console.error(document.getElementById($id), $message);
482        }
483        else
484        {
485          //Objekt je povinný, ale může být prázdný, tak proč tím otravovat vývojáře
486          console.error('', $message);
487        }
488      }
489    }
490    this.add_to_bin($message);
491  },
492  /**
493   * Vymazání konzole.
494   * Mazání se nedoporučuje a podporuje ho jenom FF. Vloží tedy odřádkování pro ptické oddělení debugovacích informací
495   * @method
496   * @example
497   * <code>
498   * BS.Debug.clear();
499   * </code>
500   */
501  clear: function()
502  {
503    this.log("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
504  },
505  /**
506   * Vytvoří seskupení pro debugovací výpisy, které za ním následují. Dají se do sebe vnořovat.
507   * Automaticky se změří čas celé skupiny
508   * IE skupyny v konzoli nepodporuje, takže se zobrazí pouze informativní text a vytvoření skupiny požadovaného jména.
509   * Pro IE nelze dosadit ani odsazení, protože si tam IE doplňuje vlastní texty
510   * @method
511   * @example
512   * <code>
513   * BS.Debug.group_start('Jmeno skupiny');
514   * BS.Debug.warn('Chyba blublable1');
515   * BS.Debug.warn('Chyba blublable2');
516   * BS.Debug.warn('Chyba blublable3');
517   * BS.Debug.group_end();
518   * </code>
519   * @param {String} $title Nadpis seskupení
520   */
521  group_start: function($title)
522  {
523    this.$group[this.$group.length] = $title;
524    BS.Timer.start($title);
525    var $alternative_title = '- Nova skupina: ' + $title + ' ----------------------------------------------------------';
526    if (typeof console.group === "function")
527    {
528      console.group($title);
529    }
530    else
531    {
532      this.info($alternative_title);
533    }
534    this.add_to_bin($alternative_title);
535  },
536  /**
537   * Ukončení naposledy vytvořeného seskupení debugovacích výpisů
538   * IE skupyny v konzoli nepodporuje, takže se zobrazí pouze informativní text o ukončení naposled vytvořené skupiny.
539   * @method
540   * @example
541   * //viz.: BS.Debug.group_start();
542   */
543  group_end: function()
544  {
545    var $title_group = this.$group[this.$group.length - 1];
546    var $alternative_title = 'Konec skupiny: ' + $title_group;
547    if (typeof console.groupEnd === "function")
548    {
549      console.groupEnd();
550      this.info($alternative_title);
551    }
552    else
553    {
554      this.info('- ' + $alternative_title + ' -');
555    }
556    BS.Timer.end($title_group);
557    this.$group.pop();
558    this.add_to_bin($alternative_title);
559  },
560  /**
561   * Zpočítá výskyt použití this.count(). Pouze ve FF se zobrazí správně jen jedna řádka. Ostatní prohlížeče vypisují
562   * každý výskyt. Pro IE jsem nenašel alternativu vůbec.
563   * @method
564   * @example
565   * <code>
566   * for (x=0;x<12;x++)
567   * {
568   * BS.Debug.count("Otoceni for");
569   * }
570   * // Mělo by vypsat pouze: Otoceni for 12
571   * // Ve vsech prohlížečích (kromě FF), se ale vypíše tolik řádek kolik je obrátek v cyklu:/
572   * </code>
573   * @param {String} $title Popisek vápisu
574   */
575  count: function($title)
576  {
577    if (typeof console.count === "function")
578    {
579      console.count($title);
580    }
581  },
582  /**
583   * Zobrazí tabulková data (z objektu nebo pole). Normálně funguje pouze ve FF
584   * @method
585   * @example
586   * <code>
587   * var team = new Array();
588   * team[0] = {
589   *   jmeno: 'Franta',
590   *   prijmeni: 'Trotl',
591   *   pozice: 'tester'
592   * };
593   * team[1] = {
594   *   jmeno: 'Delsi',
595   *   prijmeni: 'Emil',
596   *   pozice: 'lepsi tester'
597   * };
598   *
599   * BS.Debug.table(team);// vypise vsechny sloupce
600   * ...
601   * BS.Debug.table(team, ["jmeno","prijmeni"]);// vypise pouze sloupce jmeno a prijmeni
602   * </code>
603   * @param {Array} $data Objekt nebo pole které se má vypsat do tabulky.
604   * @param {Array} $filter Polo názvů hodnot, keré se mají vypsat. Pokud nebude vyplněno nic, tak se vypíšou všechny sloupce
605   */
606  table: function($data, $filter)
607  {
608    if (typeof console.table === "function")
609    {
610      if (typeof $filter === "object")
611      {
612        console.table($data, $filter);
613      }
614      else
615      {
616        console.table($data);
617      }
618    }
619    else
620    {
621      //console.log($data);
622    }
623  },
624  error_handler: function($message, $url, $line_number)
625  {
626    var $data = {
627      'action': 'Log_js_error',
628      'message': $message,
629      'url': $url,
630      'line_number': $line_number,
631      'debug': BS.Debug.get_bin()
632    };
633    // requirejs loading error
634    if ($url.search('requirejs.js') > -1)
635    {
636      $data.requirejs_order = {};
637      $('head script').each(function(index) {
638        var $name = $(this).data('requiremodule');
639        if (typeof $name !== 'undefined')
640        {
641          $data.requirejs_order[$name] = $(this).attr('src');
642        }
643      });
644    }
645    var $request = BS.extend(BS.Request.$default_admin, {
646      data: $data
647    });
648    $.ajax($request);
649  },
650  /**
651   * @param {String} $message
652   */
653  add_to_bin: function($message)
654  {
655    if (this.$debug_bin.length >= this.$debug_bin_limit)
656    {
657      this.$debug_bin.shift();
658    }
659    this.$debug_bin.push($message);
660  },
661  /**
662   * @returns {Array}
663   */
664  get_bin: function()
665  {
666    return this.$debug_bin;
667  }
668};
669/**
670 * Objekt pro měření času chodu aplikace
671 * @class
672 */
673BS.Timer = {
674  /**
675   * Nastavení časovače. Jednotlivé šasovače je možné v APP křížit
676   * @method
677   * @example
678   * <code>
679   * BS.Timer.start("Prubeh cyklu");
680   * for (x=0;x<12;x++)
681   * {
682   *   //...
683   * }
684   * BS.Timer.end("Prubeh cyklu");
685   * </code>
686   * @param {String}
686 $title Jméno časovače
687   */
688  start: function($title)
689  {
690    if (typeof console.time === "function")
691    {
692      console.time($title);
693    }
694    else
695    {
696      BS.Debug.info("Casovac neni podporovan (vysledek nebude tak presny)");
697      this.alternative_time_start($title);
698    }
699  },
700  /**
701   * Ukončení časovače
702   * @method
703   * @example
704   * // viz. BS.Timer.start();
705   * @param {String} $title Jméno časovače. Musí se shodovat s $title v BS.Timer.start($title);
706   */
707  end: function($title)
708  {
709    // nemá smysl vypisovat dvě stejné hlášky o nefunkčnosti časovače
710    if (typeof console.timeEnd === "function")
711    {
712      console.timeEnd($title);
713    }
714    else
715    {
716      this.alternative_time_end($title);
717    }
718  },
719  /**
720   * Náhradní časovač pro prohlížeče, které nepodporují console.time()
721   * Není tak přesné, jako time přímo od prohlížeče
722   * Převzato z: http://stackoverflow.com/questions/3516515/console-time-in-ie8-developer-tools?answertab=active#tab-top
723   * @private
724   * @param {String} $name
725   * @param {Boolean} $reset
726   */
727  alternative_time_start: function($name, $reset)
728  {
729    if (!$name)
730    {
731      return;
732    }
733    var time = new Date().getTime();
734    if (!console.timeCounters)
735    {
736      console.timeCounters = {};
737    }
738    var key = "KEY" + $name.toString();
739    if (!$reset && console.timeCounters[key])
740    {
741      return;
742    }
743    console.timeCounters[key] = time;
744  },
745  /**
746   * Ukončení náhradního časovače
747   * Převzato z: http://stackoverflow.com/questions/3516515/console-time-in-ie8-developer-tools?answertab=active#tab-top
748   * @private
749   * @param {String} $name
750   */
751  alternative_time_end: function($name)
752  {
753    var time = new Date().getTime();
754    if (!console.timeCounters)
755    {
756      return;
757    }
758    var key = "KEY" + $name.toString();
759    var timeCounter = console.timeCounters[key];
760    if (timeCounter)
761    {
762      var diff = time - timeCounter;
763      var label = $name + ": " + diff + "ms";
764      BS.Debug.info(label);
765      delete console.timeCounters[key];
766    }
767  }
768};
769/**
770 * Zapne profilování na určité části kódu
771 * @class
772 */
773BS.Profiler = {
774  /**
775   * Zapnutí profileru. Lze spustit pouze jeden v jednom čase
776   * @method
777   * @example
778   * BS.Profiler.start("Profil 1");
779   * function testFor()
780   * {
781   *   for (x = 0; x <= 10; x++)
782   *   {
783   *     document.write(x+"<br />");
784   *   }
785   * }
786   * testFor();
787   * BS.Profiler.end();
788   * @param {String} $title Název profileru
789   */
790  start: function($title)
791  {
792    console.profile($title);
793  },
794  /**
795   * Vypnutí profileru. Nepožaduje název, protože může běžet vždy jen jedno profilování
796   * @method
797   */
798  end: function()
799  {
800    console.profileEnd();
801  }
802};
803
804// Komentáře událostí
805
806/**
807 * Událost přijetí systémové zprávy, aby by každém systému šlo obsluhovat výsledek requestu vlastní metodou na zobrazení zprávy.
808 * @example
809 * Pokud využíváte v extend pro ajax BS.Request.$default_with_redirect, událost je aktivována. Pokud máte vlastní success funkci, pro oznámení události uvnitř použijte:
810 * <code>
811 * $(BS).trigger('e_request_message_received', [data]);
812 * </code>
813 *
814 * @example
815 * <code>
816 * BS.on('e_request_message_received', function($event, $report){
817 *   Vas_projekt_namespace.vase_funkce_na_zobrazeni_zpravy($report);
818 * });
819 * </code>
820 *
821 * @name BS#BS:e_request_message_received
822 * @event
823 *
824 * @param {Object} $event    Event object
825 * @param {String} $report Zpráva
826 */
827
828/**
829 * Událost uzavření filemanageru
830 *
831 * @example
832 * <code>
833 * $(BS).on('e_fm_close', function($event){
834 *   Vas_projekt_namespace.vase_funkce();
835 * });
836 * </code>
837 *
838 * @name BS#BS:e_fm_close
839 * @event
840 *
841 * @param {Object} $event Event object
842 */
843
844/**
845 * Událost potvrzení filemanageru s vybranými soubory (Ok, Vybrat, Použít)
846 *
847 * @example
848 * <code>
849 * $(BS).on('e_fm_files_selected', function($event, $selected_files){
850 *   Vas_projekt_namespace.vase_funkce($selected_files);
851 * });
852 * </code>
853 *
854 * @name BS#BS:e_fm_files_selected
855 * @event
856 *
857 * @param {Object} $event          Event object
858 * @param {Array}  $selected_files Pole objektů obsahující informace o souborech. Tím že je to pole, tak počet parametrů je počet souborů - 1
859 */

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.