PageSourceSearch

https://coach-outlets.ru/catalog/view/javascript/simple.js?v=4.11.9

js coach-outlets.ru collected 2026-10-06 00:30:58 UTC 44,504 bytes, 1,090 lines download raw bytes

1(function($) {
2    var Simple = function() {
3    };
4
5    Simple.prototype.human = false;
6
7    Simple.prototype.instances = [];
8
9    Simple.prototype.resources = {
10        loading: "catalog/view/image/loading.gif",
11        next: "catalog/view/image/next_gray.png",
12        nextCompleted: "catalog/view/image/next_green.png"
13    };
14
15    Simple.prototype.serializeFields = function($block) {
16        var serialized = $block.find("input,select,textarea").serializeArray();
17
18        $block.find('input:checkbox:not(:checked)').each(function() {
19            var found = false;
20
21            for (var i in serialized) {
22                if (!serialized.hasOwnProperty(i)) continue;
23
24                if (serialized[i].name == this.name) {
25                    found = true;
26                }
27            }
28
29            if (!found) {
30                serialized.push({
31                    name: this.name,
32                    value: this.dataset && this.dataset.uncheckedValue ? this.dataset.uncheckedValue : ''
33                });
34            }
35        });
36
37        return serialized;
38    };
39
40    Simple.prototype.getValidationRules = function() {
41        var self = this;
42
43        return {
44            notEmpty: function($rule, silent) {
45                var fieldId = $rule.attr("data-for");
46                var fieldType = $rule.attr("data-for-type");
47
48                if (typeof silent === "undefined") {
49                    silent = false;
50                }
51
52                if (fieldId) {
53                    var $field = $(self.params.mainContainer).find("#" + fieldId);
54
55                    if (fieldType == 'checkbox' || fieldType == 'radio') {
56                        $field = $(self.params.mainContainer).find("[id*=" + fieldId + "_]");
57                    }
58                    
59                    if ($field.length) {
60                        if (!$rule.attr("data-required")) {
61                            $rule.hide();
62                            return true;
63                        }
64
65                        var value = "";
66
67                        if (fieldType == "checkbox" || fieldType == "radio") {
68                            var arr = $field.serializeArray();
69                            var values = [];
70                            for (var i in arr) {
71                                if (!arr.hasOwnProperty(i)) continue;
72                                values.push(arr[i].value);                                   
73                            }
74                            value = values.join(',');
75                        } else {
76                            value = $field.val();
77                        }
78
79                        if (!value) {
80                            if (!silent) {
81                                if (typeof toastr !== 'undefined' && self.params.notificationToasts) {
82                                    toastr.error($rule.text());
83                                }
84                                
85                                if (self.params.notificationDefault) {
86                                    $rule.show();
87                                }
88                            }
89                            return false;
90                        } else {
91                            $rule.hide();
92                            return true;
93                        }
94                    }
95                }
96                return true;
97            },
98            equal: function($rule, silent) {
99                var fieldId = $rule.attr("data-for");
100                var equalId = $rule.attr("data-equal");
101
102                if (typeof silent === "undefined") {
103                    silent = false;
104                }
105
106                if (fieldId && equalId) {
107                    var $mainContainer = $(self.params.mainContainer);
108
109                    var $field = $mainContainer.find("#" + fieldId);
110                    var $equal = $mainContainer.find("#" + equalId);
111
112                    if ($field.length && $equal.length) {
113                        if ($equal.val() != $field.val()) {
114                            if (!silent) {
115                                if (typeof toastr !== 'undefined' && self.params.notificationToasts) {
116                                    toastr.error($rule.text());
117                                }
118                                
119                                if (self.params.notificationDefault) {
120                                    $rule.show();
121                                }
122                            }
123                            return false;
124                        } else {
125                            $rule.hide();
126                            return true;
127                        }
128                    }
129                }
130                return true;
131            },
132            byLength: function($rule, silent) {
133                var fieldId = $rule.attr("data-for");
134
135                if (typeof silent === "undefined") {
136                    silent = false;
137                }
138
139                if (fieldId) {
140                    var $field = $(self.params.mainContainer).find("#" + fieldId);
141
142                    if ($field.length) {
143                        var min = 0;
144                        var max = 1000;
145
146                        if ($rule.attr("data-length-min")) {
147                            min = ~~$rule.attr("data-length-min");
148                        }
149
150                        if ($rule.attr("data-length-max")) {
151                            max = ~~$rule.attr("data-length-max");
152                        }
153
154                        var value = ($field.val() + '').trim();
155
156                        if (!value && !$rule.attr("data-required")) {
157                            $rule.hide();
158                            return true;
159                        }
160
161                        if (value.length < min || value.length > max) {
162                            if (!silent) {
163                                if (typeof toastr !== 'undefined' && self.params.notificationToasts) {
164                                    toastr.error($rule.text());
165                                }
166                                
167                                if (self.params.notificationDefault) {
168                                    $rule.show();
169                                }
170                            }
171                            return false;
172                        } else {
173                            $rule.hide();
174
175                            return true;
176                        }
177                    }
178                }
179                return true;
180            },
181            regexp: function($rule, silent) {
182                var fieldId = $rule.attr("data-for");
183                var fieldType = $rule.attr("data-for-type");
184
185                if (typeof silent === "undefined") {
186                    silent = false;
187                }
188
189                if (fieldId) {
190                    var $field = $(self.params.mainContainer).find("#" + fieldId);
191
192                    if (fieldType == 'checkbox' || fieldType == 'radio') {
193                        $field = $(self.params.mainContainer).find("[id*=" + fieldId + "_]");
194                    }
195                    
196                    if ($field.length) {
197                        var regexp = $rule.attr("data-regexp");
198
199                        if (regexp) {
200                            var value = "";
201
202                            if (fieldType == "checkbox" || fieldType == "radio") {
203                                var arr = $field.serializeArray();
204                                var values = [];
205                                for (var i in arr) {
206                                    if (!arr.hasOwnProperty(i)) continue;
207                                    values.push(arr[i].value);                                   
208                                }
209                                value = values.join(',');
210                            } else {
211                                value = $field.val();
212                            }
213
214                            if (!value && !$rule.attr("data-required")) {
215                                $rule.hide();
216                                return true;
217                            }
218
219                            try {
220                                if (!value.match(regexp)) {
221                                    if (!silent) {
222                                        if (typeof toastr !== 'undefined' && self.params.notificationToasts) {
223                                            toastr.error($rule.text());
224                                        }
225                                        
226                                        if (self.params.notificationDefault) {
227                                            $rule.show();
228                                        }
229                                    }
230                                    return false;
231                                } else {
232                                    $rule.hide();
233                                    return true;
234                                }
235                            } catch (err) {
236
237                            }
238                        }
239                    }
240                }
241                return true;
242            },
243            api: function($rule, silent) {
244                var fieldId = $rule.attr("data-for");
245                var fieldType = $rule.attr("data-for-type");
246
247                var $mainContainer = $(self.params.mainContainer);
248
249                if (typeof silent === "undefined") {
250                    silent = false;
251                }
252
253                if (fieldId) {
254                    var $field = $mainContainer.find("#" + fieldId);
255
256                    if (fieldType == 'checkbox' || fieldType == 'radio') {
257                        $field = $(self.params.mainContainer).find("[id*=" + fieldId + "_]");
258                    }
259
260                    if ($field.length) {
261                        var method = $rule.attr("data-method");
262
263                        if (method) {
264                            var filter = "";
265
266                            if ($rule.attr("data-filter")) {
267                                var filterType = $rule.attr("data-filter-type");
268
269                                var $filter = $mainContainer.find("#" + $rule.attr("data-filter"));
270
271                                if (filterType == 'checkbox' || filterType == 'radio') {
272                                    $filter = $mainContainer.find("[id*=" + $rule.attr("data-filter") + "_]");
273                                }
274
275                                if ($filter.length) {
276                                    if (filterType == "radio" || filterType == "checkbox") {
277                                        var arr = $filter.serializeArray();
278                                        var values = [];
279                                        for (var i in arr) {
280                                            if (!arr.hasOwnProperty(i)) continue;
281                                            values.push(arr[i].value);                                   
282                                        }
283                                        filter = values.join(',');
284                                    } else {
285                                        filter = $filter.val();
286                                    }
287                                } else if ($rule.attr("data-filter-value")) {
288                                    filter = $rule.attr("data-filter-value");
289                                }
290                            }
291
292                            var custom = $rule.attr("data-custom") ? true : false;
293
294                            var deferred = $.Deferred();
295
296                            var value = "";
297
298                            if (fieldType == "checkbox" || fieldType == "radio") {
299                                var arr = $field.serializeArray();
300                                var values = [];
301                                for (var i in arr) {
302                                    if (!arr.hasOwnProperty(i)) continue;
303                                    values.push(arr[i].value);                                   
304                                }
305                                value = values.join(',');
306                            } else {
307                                value = $field.val();
308                            }
309
310                            $.get("index.php?" + self.params.additionalParams + "route=common/simple_connector/validate&method=" + method + "&filter=" + encodeURIComponent(filter) + "&value=" + encodeURIComponent(value) + (custom ? "&custom=1 " : ""), function(data) {
311                                data = data.trim();
312                                
313                                if (data == "invalid") {
314                                    if (!silent) {
315                                        if (typeof toastr !== 'undefined' && self.params.notificationToasts) {
316                                            toastr.error($rule.text());
317                                        }
318                                        
319                                        if (self.params.notificationDefault) {
320                                            $rule.show();
321                                        }
322                                    }
323                                    deferred.resolve(false);
324                                } else {
325                                    $rule.hide();
326                                    deferred.resolve(true);
327                                }
328                            });
329
330                            return deferred.promise();
331                        }
332                    }
333                }
334
335                return true;
336            }
337        };
338    };
339
340    Simple.prototype.initValidationRules = function() {
341        var self = this;
342        var $mainContainer = $(self.params.mainContainer);
343
344        $mainContainer.find(".simplecheckout-rule-group").each(function() {
345            var $ruleGroup = $(this);
346            var fieldId = $(this).attr("data-for");
347            var promises = [];
348
349            if (fieldId) {
350                var $field = $mainContainer.find("#" + fieldId);
351                
352                if (!$field.length) {
353                    $field = $mainContainer.find("[id*=" + fieldId + "_]");
354                }
355
356                if ($field.length) {
357                    var checker = function() {
358                        var result = true;
359
360                        $ruleGroup.find(".simplecheckout-rule").each(function() {
361                            var $rule = $(this);
362                            var type = $(this).attr("data-rule");
363                            var rules = self.getValidationRules();
364                            
365                            if (typeof rules[type] === "function") {
366                                var promise = $.when(rules[type]($rule)).then(function(ruleResult){
367                                    if (!ruleResult) {
368                                        result = false;
369                                    }
370
371                                    return $.when(ruleResult);
372                                });
373
374                                promises.push(promise);
375                            }
376                        });
377
378                        $.when.apply($, promises).then(function() {
379                            $field.attr("data-valid", result ? "true" : "false");
380
381                            if (!result) {
382                                $field.parents(".form-group").addClass("has-error")
383                            } else  {
384                                $field.parents(".form-group").removeClass("has-error")
385                            }
386                        });
387                    };
388
389                    var $pairField = false;
390                    
391                    $ruleGroup.find(".simplecheckout-rule").each(function() {
392                        if ($(this).attr("data-rule") == 'equal' && $(this).attr("data-equal")) {
393                            if ($("#" + $(this).attr("data-equal")).length) {
394                                $pairField = $("#" + $(this).attr("data-equal"));
395                            }
396                        }
397                    });
398
399                    if (!self.params.notificationToasts && $field.attr('data-validate-on') && typeof $field[$field.attr('data-validate-on')] === 'function') {
400                        $field[$field.attr('data-validate-on')](checker);
401
402                        if ($pairField) {
403                            $pairField[$field.attr('data-validate-on')](checker);
404                        }                  
405                    } else {
406                        $field.change(checker);
407
408                        if ($pairField) {
409                            $pairField.change(function() { 
410                                if ($field.val()) {
411                                    checker.call($field);
412                                }
413                            });
414                        }
415                    }                    
416                }
417            }
418        });
419    };
420
421    Simple.prototype.checkRules = function(container, silent) {
422        var self = this;
423        var fields = {};
424        var resultAll = true;
425        var allPromises = [];
426        var $mainContainer =  $(self.params.mainContainer);
427        var $container = $mainContainer;
428
429        if (container) {
430            $container = $mainContainer.find(container);
431        }
432
433        if (typeof silent === "undefined") {
434            silent = false;
435        }
436
437        if ($container.length && ($container.is(":visible") || $container.find('*').is(":visible"))) {
438            $container.find(".simplecheckout-rule-group").each(function() {
439                var ruleGroupResult = true;
440                var promises = [];
441                var $ruleGroup = $(this);
442                var fieldId = $(this).attr("data-for");
443
444                if (fieldId) {
445                    var $field = $mainContainer.find("#" + fieldId);
446
447                    if (!$field.length) {
448                        $field = $mainContainer.find("[id*=" + fieldId + "_]");
449                    }
450
451                    if ($field.length) {
452                        $ruleGroup.find(".simplecheckout-rule").each(function() {
453                            var $rule = $(this);
454                            var type = $(this).attr("data-rule");
455                            var rules = self.getValidationRules();
456
457                            if (typeof rules[type] === "function") {
458                                var promise = $.when(rules[type]($rule, silent)).then(function(ruleResult){
459                                    if (!ruleResult) {
460                                        ruleGroupResult = false;
461                                    }
462
463                                    return $.when(ruleResult);
464                                });
465
466                                promises.push(promise);
467                            }
468                        });
469
470                        var groupPromise = $.when.apply($, promises).then(function() {
471                            $field.attr("data-valid", ruleGroupResult ? "true" : "false");
472
473                            if (!ruleGroupResult) {
474                                $field.parents(".form-group").addClass("has-error")
475                            } else  {
476                                $field.parents(".form-group").removeClass("has-error")
477                            }
478
479                            if (!ruleGroupResult) {
480                                resultAll = false;
481                            }
482                        });
483
484                        allPromises.push(groupPromise);
485                    }
486                }
487            });
488        }
489
490        var deferred = $.Deferred();
491
492        $.when.apply($, allPromises).then(function() {
493            deferred.resolve(resultAll);
494        });
495
496        return deferred.promise();
497    };
498
499    Simple.prototype.setAddressFields = function(block, countryId, zoneId, city, postcode, callbackAfterChanging) {
500        var self = this;
501        var $mainContainer = $(self.params.mainContainer);
502
503        var setFields = function() {
504            if (countryId) {
505                $mainContainer.find("#" + block + "_country_id").val(countryId);
506            }
507            if (zoneId) {
508                $mainContainer.find("#" + block + "_zone_id").val(zoneId);
509            }
510            if (city) {
511                $mainContainer.find("#" + block + "_city").val(city);
512            }
513            if (postcode) {
514                $mainContainer.find("#" + block + "_postcode").val(postcode);
515            }
516
517            if (typeof callbackAfterChanging === "function") {
518                callbackAfterChanging();
519            } else if (typeof reloadAll === "function") {
520                reloadAll();
521            }
522        };
523
524        if ($mainContainer.find("#" + block + "_country_id").val() != countryId) {
525            $mainContainer.find("#" + block + "_zone_id").load("index.php?" + self.params.additionalParams + "route=common/simple_connector/zone&country_id=" + countryId, function() {
526                setFields();
527            });
528        } else {
529            setFields();
530        }
531    };
532
533    Simple.prototype.initFileUploader = function(beforeUploading, afterUploading) {
534        var self = this;
535        var $mainContainer = $(self.params.mainContainer);
536
537        $mainContainer.find("[data-file]").each(function() {
538            var hiddenInputId = $(this).attr("data-file");
539            var fileNameId = hiddenInputId ? "text_" + hiddenInputId : "";
540
541            $(this).on("click", function() {
542                $("#form-upload").remove();
543
544                $("body").prepend("<form enctype='multipart/form-data' id='form-upload' style='display: none;'><input type='file' name='file' /></form>");
545
546                $("#form-upload input[name='file']").trigger("click");
547
548                if (typeof fileUploaderTimer !== "undefined") {
549                    clearInterval(fileUploaderTimer);
550                }
551
552                fileUploaderTimer = setInterval(function() {
553                    if ($("#form-upload input[name='file']").val() != "") {
554                        clearInterval(fileUploaderTimer);
555
556                        $.ajax({
557                            url: "index.php?" + self.params.additionalParams + "route=common/simple_connector/upload",
558                            type: "post",
559                            dataType: "json",
560                            data: new FormData($("#form-upload")[0]),
561                            cache: false,
562                            contentType: false,
563                            processData: false,
564                            beforeSend: function() {
565                                if (typeof beforeUploading === "function") {
566                                    beforeUploading();
567                                }
568                            },
569                            complete: function() {
570                                $("#form-upload").remove();
571
572                                if (typeof afterUploading === "function") {
573                                    afterUploading();
574                                }
575                            },
576                            success: function(json) {
577                                if (json["file"]) {
578                                    if (hiddenInputId) {
579                                        $mainContainer.find("#" + hiddenInputId).val(json["file"]).trigger('change');
580                                    }
581                                    if (fileNameId) {
582                                        var fname = typeof json["filename"] !== "undefined" && json["filename"] ? json["filename"] : file;
583                                        $mainContainer.find("#" + fileNameId).text(fname);
584                                    }
585                                }
586
587                                if (json["error"]) {
588                                    if (hiddenInputId) {
589                                        $mainContainer.find("#" + hiddenInputId).attr("value", "");
590                                    }
591                                    if (fileNameId) {
592                                        $mainContainer.find("#" + fileNameId).text(json["error"]);
593                                    }
594                                }
595                            },
596                            error: function(xhr, ajaxOptions, thrownError) {
597                                alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
598                            }
599                        });
600                    }
601                }, 500);
602            });            
603        });
604    };
605
606    Simple.prototype.initAutocomplete = function(callbackAfterChanging) {
607        var self = this;
608        var $fields = $(self.params.mainContainer).find("#payment_address_city, #shipping_address_city, #register_city, #address_city");
609        if (typeof($fields.autocomplete) !== "undefined") {
610            $fields.each(function() {
611                var $field = $(this)
612                var tmp = $field.attr("data-onchange");
613                if (tmp) {
614                    $field.removeAttr("data-onchange");
615                    $field.removeAttr("data-reload-payment-form");
616                    $field.attr("data-onchange-delayed", tmp);
617                }
618
619                $field.on("keydown", function(){
620                    $field.data("status", "started");
621                });
622            
623                $field.autocomplete({
624                    source: function(request, response) {
625                        $.ajax({
626                            url: "index.php?" + self.params.additionalParams + "route=common/simple_connector/geo",
627                            dataType: "json",
628                            data: {
629                                term: typeof request.term !== "undefined" ? request.term : request
630                            },
631                            success: function(data) {
632                                response($.map(data, function(item) {
633                                    if (typeof request.term === "undefined") {
634                                        return {
635                                            id: item.id,
636                                            label: item.full,
637                                            value: item.id,
638                                            postcode: item.postcode,
639                                            zone_id: item.zone_id,
640                                            country_id: item.country_id,
641                                            city: item.city
642                                        };
643                                    } else {
644                                        return {
645                                            id: item.id,
646                                            label: item.full,
647                                            value: item.city,
648                                            postcode: item.postcode,
649                                            zone_id: item.zone_id,
650                                            country_id: item.country_id,
651                                            city: item.city
652                                        };
653                                    }
654
655                                }));
656                            }
657                        });
658                    },
659                    minLength: 2,
660                    delay: 300,
661                    close: function( event, ui ) {
662                        if ($field.data("status") == "started") {
663                            //$field.val("");
664                            callbackAfterChanging($field);
665                        }
666                    },
667                    select: function(event, ui) {
668                        $field.data("status", "selected");
669                        var name = $field.attr("name");
670                        var from = name.substr(0, name.indexOf("["));
671                        
672                        if (ui !== undefined) {
673                            self.setAddressFields(from, ui.item.country_id, ui.item.zone_id, ui.item.city, ui.item.postcode, function() {
674                                callbackAfterChanging($field);
675                            });
676                        } else {
677                            self.setAddressFields(from, event.country_id, event.zone_id, event.city, event.postcode, function() {
678                                callbackAfterChanging($field);
679                            });
680                        }
681                    }
682                });
683            });
684        }
685    };
686
687    Simple.prototype.initPopups = function() {
688        var self = this;
689        var $mainContainer = $(self.params.mainContainer);
690
691        if (typeof($.fancybox) == "function") {
692            $mainContainer.find(".fancybox").fancybox({
693                width: 560,
694                height: 560,
695                autoDimensions: false
696            });
697        }
698
699        if (typeof($.colorbox) == "function") {
700            $mainContainer.find(".colorbox").colorbox({
701                width: 560,
702                height: 560
703            });
704        }
705
706        if (typeof($.prettyPhoto) !== "undefined") {
707            $mainContainer.find("a[rel^='prettyPhoto']").prettyPhoto({
708                theme: "light_square",
709                opacity: 0.5,
710                social_tools: "",
711                deeplinking: false
712            });
713        }
714    };
715
716    Simple.prototype.initTooltips = function(bootstrap) {
717        var self = this;
718        var $mainContainer = $(self.params.mainContainer);
719
720        $mainContainer.find(".simplecheckout-tooltip[data-for]").each(function() {
721            var $target = $mainContainer.find("#" + $(this).attr("data-for"));
722
723            if ($target.length) {
724                if ($target.attr("data-file")) {
725                    $(this).show();
726                } else {
727                    if (bootstrap && typeof $target.tooltip === "function") {
728                        $target.tooltip({
729                            html: true,
730                            title: $(this).html(),
731                            placement: 'bottom',
732                            container: 'body'
733                        });
734                    } else if (typeof $target.easyTooltip === "function") {
735                        $target.easyTooltip({
736                            useElement: self.params.mainContainer + " .simplecheckout-tooltip[data-for='" + $(this).attr("data-for") + "']",
737                            clickRemove: true
738                        });
739                    }
740                }
741            }
742        });
743    };
744
745    Simple.prototype.initMasks = function() {
746        var self = this;
747        var $mainContainer = $(self.params.mainContainer);
748
749        if (typeof $(document).inputmask !== "undefined" /*&& !window.localStorage.getItem('inputmaskFailed')*/) {
750            var masked = [];
751            $mainContainer.find("input[data-simple-mask]").each(function(indx) {
752                var mask = $(this).attr("data-simple-mask");
753                var id = $(this).attr("id");
754                if (mask && id) {
755                    masked[masked.length] = [id, mask];
756                }
757            });
758            try {
759                for (var i = 0; i < masked.length; i++) {
760                    var id = masked[i][0];
761                    var mask = masked[i][1];
762
763                    $mainContainer.find("input[id=" + id + "]")
764                        .inputmask({
765                            mask: mask,
766                            clearMaskOnLostFocus: true,
767                            clearIncomplete: true,
768                        });
769                        /*.on('change', function() {
770                            if ($(this).val().indexOf('_') > -1) {
771                                window.localStorage.setItem('inputmaskFailed', true);
772                                $(this).inputmask('remove');
773                            }                      
774                        });*/
775                }
776            } catch (err) {}
777        }
778    };
779
780    Simple.prototype.initSelect2 = function() {
781        var self = this;
782       
783        if (typeof $(document).select2 !== "undefined") {
784            $(self.params.mainContainer).find("select[data-type=select2]").each(function() {
785                $(this).select2({
786                    
787                });
788            });
789        }
790    };
791
792    Simple.prototype.initDatepickers = function(callbackAfterChanging) {
793        var self = this;
794        var days = false;
795
796        var checkWeekendAndHoliday = function(date) {
797            if (typeof $.datepicker !== "undefined") {
798                var noWeekend = $.datepicker.noWeekends(date);
799            } else {
800                var noWeekend = [(date.getDay() == 0 || date.getDay() == 6), ""];
801            }
802
803            if (noWeekend[0]) {
804                return checkNationalDay(date);
805            } else {
806                return noWeekend;
807            }
808        };
809
810        var checkNationalDay = function(date) {
811            var days = [
812                [1, 1, "ru"],
813                [1, 7, "ru"],
814                [5, 9, "ru"]
815            ];
816
817            for (i = 0; i < days.length; i++) {
818                if (date.getMonth() == days[i][0] - 1 && date.getDate() == days[i][1]) {
819                    return [false, days[i][2] + "_day"];
820                }
821            }
822            return [true, ""];
823        };
824
825        var addDays = function(add, onlyWeekdays) {
826            var result = add | 0;
827            var self = this;
828            if (onlyWeekdays) {
829                var i = 1;
830                while (i <= result) {
831                    var d = new Date();
832                    d.setDate(d.getDate() + i);
833                    var test = checkWeekendAndHoliday(d);
834                    if (!test[0]) {
835                        result++;
836                    }
837                    i++;
838                }
839            }
840
841            return result;
842        };
843
844        var checkDays = function(date) {
845            for (var i = 0; i < days.length; i++) {
846                if (date.getDay() == days[i]) {
847                    return [true, ""];
848                }
849            }
850
851            return [false, ""];
852        };
853
854        $(self.params.mainContainer).find("input[type=date],input[type=datetime],input[data-type=date],input[data-type=datetime]").each(function() {
855            var onlyWeekdays = $(this).attr("data-weekdays-only") ? true : false,
856                min = new Date(),
857                max = new Date();
858            
859            if ($(this).attr("data-days-only")) {
860                days = $(this).attr("data-days-only").split(",");
861                onlyWeekdays = false;
862            }
863            
864            if ($(this).attr("data-start-day")) {
865                min = $(this).attr("data-start-day");
866            } else if ($(this).attr("data-start-after")) {
867                min.setDate(min.getDate() + addDays($(this).attr("data-start-after"), onlyWeekdays));
868            }
869            
870            if ($(this).attr("data-end-day")) {
871                max = $(this).attr("data-end-day");
872            } else if ($(this).attr("data-end-after")) {
873                max.setDate(max.getDate() + addDays($(this).attr("data-end-after"), onlyWeekdays));
874            }
875            
876            if (typeof($(this).datetimepicker) !== "undefined") {
877                var disabledDays = [];
878
879                if (onlyWeekdays || typeof days.length !== "undefined") {
880                    var useDays = false;
881
882                    if (days.length !== "undefined" && days.length) {
883                        useDays = true;
884                    }
885
886                    for (var i = 0; i < 7; i++) {
887                        if (((i == 6 || i == 0) && onlyWeekdays) || (useDays && $.inArray(i + "", days) == -1)) {
888                            disabledDays.push(i);
889                        }
890                    }
891                }
892                
893                var $el = $(this);
894 
895                $el.datetimepicker({
896                    pickDate: true,
897                    pickTime: $el.attr("data-type") == "datetime" ? true : false,
898                    showTimepicker: false,
899                    daysOfWeekDisabled: disabledDays,
900                    firstDay: 1,
901                    beforeShowDay: onlyWeekdays ? checkWeekendAndHoliday : (days ? checkDays : null),
902                    minDate: min ? min : null,
903                    maxDate: max ? max : null,
904                    useCurrent: false,
905                    showButtonPanel: false,
906                    language: self.params.languageCode,
907                    locale: self.params.languageCode,
908                    onSelect: function() {
909                        $el.datetimepicker('hide');
910                    }
911                }).on('dp.change', function(dateText, inst) {
912                    if (typeof callbackAfterChanging === "function") {
913                        callbackAfterChanging($el);
914                    }
915                });
916
917                $el.next().on('click', function () {
918                    $el.focus();
919                });
920            } else if (typeof($(this).datepicker) !== "undefined") {
921                $(this).datepicker({
922                    firstDay: 1,
923                    beforeShowDay: onlyWee
923kdays ? checkWeekendAndHoliday : (days ? checkDays : null),
924                    minDate: min ? min : null,
925                    maxDate: max ? max : null,
926                    onSelect: function(dateText, inst) {
927                        if (typeof callbackAfterChanging === "function") {
928                            callbackAfterChanging($(this));
929                        }
930                    }
931                });
932            }
933        });
934    };
935
936    Simple.prototype.initTimepickers = function(callbackAfterChanging) {
937        var self = this;
938        var min = "";
939
940        if ($(this).attr("data-min-time")) {
941            min = ~~ ($(this).attr("data-min-time").split(":")[0]);
942        }
943
944        var max = "";
945
946        if ($(this).attr("data-max-time")) {
947            max = ~~ ($(this).attr("data-max-time").split(":")[0]);
948        }
949
950        var onlyHours = $(this).attr("data-hours-only") ? true : false;
951
952        $(self.params.mainContainer).find("input[type=time],input[data-type=time]").each(function() {
953            if (typeof($(this).datetimepicker) !== "undefined") {
954                var $el = $(this);
955                
956                $el.datetimepicker({
957                    pickDate: false,
958                    //language: document.cookie.match(new RegExp('language=([^;]+)')) && document.cookie.match(new RegExp('language=([^;]+)'))[1],
959                    language: self.params.languageCode,
960                    locale: self.params.languageCode,
961                    pickTime: true,
962                    showMinute: !onlyHours,
963                    useCurrent: false
964                }).on('dp.change', function(dateText, inst) {
965                    if (typeof callbackAfterChanging === "function") {
966                        callbackAfterChanging($el);
967                    }
968                });
969
970                $el.next().on('click', function () {
971                    $el.focus();
972                });
973            } else if (typeof($(this).timepicker) !== "undefined") {
974                $(this).timepicker({
975                    hourMin: min,
976                    hourMax: max,
977                    showMinute: !onlyHours,
978                    onSelect: function(datetimeText, datepickerInstance) {
979                        if (typeof callbackAfterChanging === "function") {
980                            callbackAfterChanging($(this));
981                        }
982                    },
983                    onClose: function() {
984                        if (typeof callbackAfterChanging === "function") {
985                            callbackAfterChanging($(this));
986                        }
987                    }
988                });
989            }
990        });
991    };
992
993    Simple.prototype.checkIsHuman = function() {
994        var self = this;
995        var timeoutId = 0;
996
997        $("body").on("mousemove", function() {
998            if (!self.human) {
999                clearTimeout(timeoutId);
1000
1001                timeoutId = window.setTimeout(function(){
1002                    self.human = true;
1003                    $.get("index.php?" + self.params.additionalParams + "route=common/simple_connector/human");
1004                }, 300);
1005            }
1006        });
1007    };
1008
1009    $.ajaxSetup({ cache: false });
1010
1011    window.Simple = Simple;
1012})(jQuery || $);
1013
1014if (typeof String.prototype.trim !== "function") {
1015    String.prototype.trim = function() {
1016        return this.replace(/^\s+|\s+$/g, "");
1017    };
1018}
1019
1020function includeScript(url) {
1021    document.write("<script type='text/javascript' src='" + url + "'></script>");
1022}
1023
1024function includeStyle(url) {
1025    document.write("<link rel='stylesheet' type='text/css' href='" + url + "' media='screen' />");
1026}
1027
1028function bind(func, context) {
1029    return function() {
1030        return func.apply(context, arguments);
1031    };
1032}
1033
1034function inherit(proto) {
1035    function F() {}
1036    F.prototype = proto;
1037    var object = new F();
1038    return object;
1039}
1040
1041function reloadAll() {
1042    if (typeof Simple.prototype.instances !== "undefined") {
1043        for (var i in Simple.prototype.instances) {
1044            if (!Simple.prototype.instances.hasOwnProperty(i)) continue;
1045
1046            if (typeof Simple.prototype.instances[i].reloadAll === "function") {
1047                Simple.prototype.instances[i].reloadAll();
1048            }
1049        }
1050    }
1051}
1052
1053function reloadBlock() {
1054    if (typeof Simple.prototype.instances !== "undefined") {
1055        for (var i in Simple.prototype.instances) {
1056            if (!Simple.prototype.instances.hasOwnProperty(i)) continue;
1057
1058            if (typeof Simple.prototype.instances[i].reloadBlock === "function") {
1059                Simple.prototype.instances[i].reloadBlock.apply(Simple.prototype.instances[i], arguments);
1060            }
1061        }
1062    }
1063}
1064
1065if (!window.localStorage) {
1066  window.localStorage = {
1067    getItem: function (sKey) {
1068      if (!sKey || !this.hasOwnProperty(sKey)) { return null; }
1069      return unescape(document.cookie.replace(new RegExp("(?:^|.*;\\s*)" + escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*"), "$1"));
1070    },
1071    key: function (nKeyId) {
1072      return unescape(document.cookie.replace(/\s*\=(?:.(?!;))*$/, "").split(/\s*\=(?:[^;](?!;))*[^;]?;\s*/)[nKeyId]);
1073    },
1074    setItem: function (sKey, sValue) {
1075      if(!sKey) { return; }
1076      document.cookie = escape(sKey) + "=" + escape(sValue) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
1077      this.length = document.cookie.match(/\=/g).length;
1078    },
1079    length: 0,
1080    removeItem: function (sKey) {
1081      if (!sKey || !this.hasOwnProperty(sKey)) { return; }
1082      document.cookie = escape(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
1083      this.length--;
1084    },
1085    hasOwnProperty: function (sKey) {
1086      return (new RegExp("(?:^|;\\s*)" + escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie);
1087    }
1088  };
1089  window.localStorage.length = (document.cookie.match(/\=/g) || window.localStorage).length;
1090}

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.