1'use strict'; 2 3$.ajaxSettings.traditional = true; 4 5var $Common = function () { 6 var head = document.head || document.getElementsByTagName('head')[0], 7 style = document.createElement('style'), 8 styleSheet, 9 dataType = [ 10 'String', 11 'Number', 12 'Boolean', 13 'Array', 14 'Function', 15 'Date', 16 'RegExp', 17 'Error', 18 'Symbol' 19 ], 20 nodeType = [ 21 'Element', 22 'Attribute', 23 'Text Node', 24 'CDATA Section', 25 'Entity Reference', 26 'Entity', 27 'Processing Instruction', 28 'Comment', 29 'Document', 30 'Document Type', 31 'Document Fragment', 32 'Notation' 33 ], 34 _class; 35 36 head.appendChild(style); 37 styleSheet = document.styleSheets[document.styleSheets.length - 1]; 38 _class = { 39 getType: function (target, requestType) { 40 var name = getName(target); 41 42 if (arguments.length == 2) { 43 switch (_class.getType(requestType)) { 44 case 'String': 45 requestType = requestType.replace(/\s+/, '').split(','); 46 case 'Array': 47 return compareString(requestType); 48 case 'Number': 49 if (isNaN(target)) { 50 return isNaN(requestType); 51 } 52 default: 53 return target === requestType; 54 } 55 } else { 56 return name; 57 } 58 59 function compareString (values) { 60 for (var i = 0; i < values.length; i++) { 61 try { 62 if (name.toLowerCase() == values[i].toLowerCase()) { 63 return true; 64 } 65 } catch (z) { 66 //return false; 67 } 68 } 69 70 return false; 71 } 72 73 function getName (e) { 74 if (e === undefined || e === null) { 75 return e; 76 } else { 77 var type = typeof e; 78 79 if (type != 'object') { 80 return _class.getName(type); 81 } else { 82 type = Object.prototype.toString.call(e); 83 84 if (type == '[object Object]') { 85 dataType.forEach(function (value) { 86 var constructor = window[value]; 87 88 if (constructor && constructor.prototype && e instanceof constructor) { 89 return value; 90 } 91 }); 92 return 'Object'; 93 } else { 94 if (e instanceof Node && e.nodeType) { 95 return nodeType[e.nodeType - 1]; 96 } else { 97 type = type.match(/([\w\.]+)[^\w]*$/); 98 99 if (type && dataType.indexOf(type[1]) >= 0) { 100 return type[1]; 101 } else { 102 return 'Unknown Type'; 103 } 104 } 105 } 106 } 107 } 108 } 109 }, 110 111 getName: function (value) { 112 return value.slice(0, 1).toUpperCase() + value.slice(1); 113 }, 114 115 clone: function (currentObject) { 116 var newObject = new currentObject.constructor(); 117 118 Object.keys(currentObject).forEach(function (name) { 119 newObject[name] = currentObject[name]; 120 }); 121 122 for (var i = 1; i < arguments.length; i++) { 123 var addObject = arguments[i]; 124 125 switch (this.getType(addObject)) { 126 case 'Object': 127 Object.keys(addObject).forEach(function (name) { 128 newObject[name] = addObject[name]; 129 }); 130 break; 131 } 132 } 133 134 return newObject; 135 }, 136 137 createRule: function (selectors, rules, index) { 138 switch (this.getType(selectors)) { 139 case 'Array': 140 selectors = selectors.join(','); 141 break; 142 case 'String': 143 break; 144 default: 145 return; 146 } 147 148 switch (this.getType(rules)) { 149 case 'Array': 150 rules = rules.join(';'); 151 break; 152 case 'String': 153 break; 154 default: 155 return; 156 } 157 158 if (!index && index != 0) { 159 index = styleSheet.cssRules.length; 160 } 161 162 styleSheet.insertRule(selectors + '{' + rules + '}', index); 163 }, 164 165 deleteRule: function (value) { 166 switch (this.getType(value)) { 167 case 'String': 168 var pair = clearText(value).replace(/\}/, '').split(/\{/), 169 rule; 170 171 for (var i = 0; i < styleSheet.cssRules.length; i++) { 172 rule = clearText(styleSheet.cssRules[i].cssText, true); 173 174 if (rule[0] == pair[0]) { 175 if (!pair[1]) { 176 _deleteRule(i); 177 } else if (rule[0] == pair[0]) { 178 _deleteRule(i); 179 } 180 } 181 } 182 183 break; 184 case 'Number': 185 value = parseInt(value); 186 187 if (value < styleSheet.cssRules.length) { 188 _deleteRule(parseInt(value)); 189 } 190 191 break; 192 default: 193 $.each(styleSheet.cssRules, function (index) { 194 _deleteRule(index); 195 }); 196 break; 197 } 198 199 function _deleteRule (_index) { 200 styleSheet.deleteRule(_index); 201 } 202 203 function clearText (text, status) { 204 text = text 205 .replace(/[\r\n'"]/g, '') 206 .replace(/^\s+/, '') 207 .replace(/\s+$/, '') 208 .replace(/\s*([\;\,\:\{])\s*/g, '$1') 209 .replace(/;?\s*(\})/, '$1') 210 .replace(/\s+/g, ' '); 211 212 return status ? text.replace('}', '').split('{') : text; 213 } 214 }, 215 216 pushState: function (options) { 217 state('push', options); 218 return this.getQuery(); 219 }, 220 221 replaceState: function (options) { 222 state('replace', options); 223 return this.getQuery(); 224 }, 225 226 getURLParts: function (url, hash) { 227 url = url !== undefined ? url : location.href; 228 229 var hash = url.split('#'), 230 search = hash[0].split('?'), 231 result = { 232 hash: hash[1] 233 }; 234 235 if (search[1]) { 236 result.path = search[0]; 237 result.search = search[1]; 238 } else if (/[&,=]/.test(search[0])) { 239 result.path = ''; 240 result.search = search[0]; 241 } else { 242 result.path = search[0]; 243 result.search = ''; 244 } 245 246 return result; 247 }, 248 249 getURL: function (options) { 250 options = options || {}; 251 252 var href = this.getURLParts(options.url), 253 query, 254 result = []; 255 256 options.url = href.search; 257 query = this.getQuery(options);
258 Object.keys(query).forEach(function (name) { 259 result.push(name + '=' + query[name].join(',')); 260 }); 261 262 if (href.path && result.length) { 263 href.path += '?'; 264 } 265 266 result = href.path + result.join('&'); 267 268 if (href.hash && options.hash) { 269 result += '#' + href.hash; 270 } 271 272 return result; 273 }, 274 275 getFormData: function () { 276 var result = {}; 277 278 for (var i = 0; i < arguments.length; i++) { 279 var set = arguments[i]; 280 281 switch (this.getType(set)) { 282 case 'String': 283 set = set.split('&'); 284 case 'Array': 285 set.forEach(function (pair) { 286 pair = decodeURIComponent(pair).split('='); 287 result[pair[0]] = pair[1]; 288 }); 289 break; 290 case 'Object': 291 Object.keys(set).forEach(function (name) { 292 result[name] = set[name]; 293 }); 294 break; 295 } 296 } 297 298 return result; 299 }, 300 301 getQuery: function (options) { 302 options = options || {}; 303 304 if (!options.query) { 305 options.query = this.getURLParts(options.url).search; 306 } 307 308 var query = makeObject(options.query), 309 add = makeObject(options.add), 310 remove = makeObject(options.remove), 311 replace = makeObject(options.replace); 312 313 Object.keys(remove).forEach(function (id) { 314 if (remove[id]) { 315 Object.keys(remove[id]).forEach(function (value) { 316 removeItem(add[id], value); 317 removeItem(replace[id], value); 318 removeItem(query[id], value); 319 }); 320 } else { 321 delete add[id]; 322 delete replace[id]; 323 delete query[id]; 324 } 325 }); 326 327 Object.keys(replace).forEach(function (id) { 328 if (replace[id].length) { 329 query[id] = options.single ? replace[id][0] : replace[id]; 330 } else { 331 delete query[id]; 332 } 333 }); 334 335 Object.keys(add).forEach(function (id) { 336 if (!query[id] || !query[id].length) { 337 query[id] = _class.mergeArray([], add[id]); 338 } else { 339 query[id] = _class.mergeArray([], query[id], add[id]); 340 } 341 }); 342 343 if (options.name) { 344 return query[options.name]; 345 } else { 346 return query; 347 } 348 349 function removeItem (set, value) { 350 if (set) { 351 var index = set.indexOf(value); 352 353 if (index >= 0) { 354 set.splice(index, 1); 355 } 356 } 357 } 358 359 function makeObject (list) { 360 if (list) { 361 switch (_class.getType(list)) { 362 case 'String': 363 list = list.split(/\s*&\s*/); 364 365 if (list.length == 1 && !list[0]) { 366 // list = list[0].split(/\s*,\s*/); 367 368 // if (list.length == 1 && !list[0]) { 369 // return {}; 370 // } 371 372 if (!list.length) { 373 return {}; 374 } 375 } 376 case 'Array': 377 var object = {}; 378 379 list.forEach(function (value) { 380 var pair = value.split(/\s*=\s*/); 381 382 if (pair[1]) { 383 object[pair[0]] = getValue(pair[1]); 384 } else { 385 object[pair[0]] = []; 386 } 387 }); 388 return object; 389 case 'Object': 390 Object.keys(list).forEach(function (key) { 391 if (list[key]) { 392 switch (_class.getType(list[key])) { 393 case 'String': 394 list[key] = getValue(list[key]); 395 break; 396 case 'Array': 397 break; 398 case 'Object': 399 list[key] = Object.keys(list[key]); 400 break; 401 default: 402 list[key] = [list[key].toString()]; 403 break; 404 } 405 } else { 406 list[key] = []; 407 } 408 }); 409 return list; 410 default: 411 return {}; 412 } 413 } else { 414 return {}; 415 } 416 417 function getValue (value) { 418 if (value.match(/^\[(.+)\]$/)) { 419 return [value]; 420 } else { 421 return _class.getArray(value); 422 } 423 } 424 } 425 }, 426 427 mergeArray: function () { 428 var result = this.getArray(arguments[0]); 429 430 for (var i = 1; i < arguments.length; i++) {
431 this.getArray(arguments[i]).forEach(function (value) { 432 if (result.indexOf(value) < 0) { 433 result.push(value); 434 } 435 }); 436 } 437 438 return result; 439 }, 440 441 getArray: function (object, separator) { 442 switch (this.getType(object)) { 443 case 'String': 444 return object.replace(/^\s+/g, '').replace(/\s+$/g, '').split(/\s*,\s*/); 445 case 'Array': 446 return object.slice(); 447 case 'Object': 448 return Object.keys(object); 449 default: 450 return []; 451 } 452 }, 453 454 getCookie: function (name) { 455 var cookies = document.cookie, 456 result = {}; 457 458 if (cookies) { 459 cookies 460 .replace(/^\s+/, '') 461 .replace(/\s+$/, '') 462 .split(/\s*;\s*/) 463 .forEach(function (value) { 464 value = value.split(/\s*=\s*/); 465 result[value[0]] = value[1]; 466 }); 467 } 468 469 return name ? result[name] : result; 470 }, 471 472 setCookie: function (options) { 473 var cookies = this.getCookie(), 474 newCookies = [], 475 oldCookies = [], 476 // oldDate = new Date(0), 477 // expireDate = new Date(), 478 settings = [ 479 'path=/', 480 'domain=' + location.hostname 481 ]; 482 483 // expireDate.setDate(expireDate.getDate() + 30); 484 485 switch (this.getType(options)) { 486 case 'String': 487 options = options 488 .replace(/^\s+/, '') 489 .replace(/\s+$/, '') 490 .split(/\s*;\s*/); 491 case 'Array': 492 options.forEach(function (value) { 493 value = value.split(/\s*=\s*/); 494 setResult(value[0], value[1]); 495 }); 496 break; 497 case 'Object': 498 Object.keys(options).forEach(function (name) { 499 setResult(name, options[name]); 500 }); 501 break; 502 } 503 504 if (oldCookies.length) { 505 oldCookies = oldCookies.concat(settings, 'max-age=0'); 506 document.cookie = oldCookies.join('; '); 507 } 508 509 if (newCookies.length) { 510 newCookies = newCookies.concat(settings, 'max-age=' + 30 * 24 * 60 * 60); 511 document.cookie = newCookies.join('; '); 512 } 513 514 function setResult (name, value) { 515 switch (_class.getType(value)) { 516 case undefined: 517 case null: 518 if (name in cookies) { 519 if (cookies[name] === undefined) { 520 oldCookies.push(name); 521 } else { 522 oldCookies.push(name + '=' + cookies[name]); 523 } 524 525 delete cookies[name]; 526 } 527 528 break; 529 default: 530 newCookies.push(name + '=' + value); 531 cookies[name] = value; 532 break; 533 } 534 } 535 } 536 }; 537 538 function state (type, options) { 539 try { 540 history[type + 'State']( 541 options.state || options.query, 542 options.title || document.title, 543 _class.getURL({ 544 url: options.href, 545 replace: options.query, 546 hash: !options.removeHash 547 }) 548 ); 549 } catch (z) {} 550 } 551 552 return _class; 553}(); 554 555var $Params = function () { 556 var dummyStyle = document.documentElement.style, 557 transitionend = { 558 '': 'transitionend', 559 'webkit': 'webkitTransitionEnd', 560 'Moz': 'transitionend', 561 'O': 'otransitionend', 562 'ms': 'MSTransitionEnd' 563 }, 564 vendor = (function () { 565 var result = false;
566 567 't,webkitT,MozT,msT,OT'.split(',').some(function (value) { 568 if (value + 'ransform' in dummyStyle) { 569 result = value.slice(0, value.length - 1); 570 return true; 571 } 572 }); 573 return result; 574 })(), 575 touchPad = (/hp-tablet/gi).test(navigator.appVersion), 576 hasTouch = 'ontouchstart' in window && !touchPad; 577 578 function prefixStyle (style) { 579 if (vendor === '') { 580 return style; 581 } 582 583 style = style.charAt(0).toUpperCase() + style.substr(1); 584 return vendor + style; 585 } 586 587 return { 588 isAndroid: (/android/gi).test(navigator.appVersion), 589 isIDevice: (/iphone|ipad/gi).test(navigator.appVersion), 590 isTouchPad: touchPad, 591 cssVendor: vendor ? '-' + vendor.toLowerCase() + '-' : '', 592 has3d: prefixStyle('perspective') in dummyStyle, 593 hasTouch: hasTouch, 594 hasTransform: vendor !== false, 595 hasTransitionEnd: prefixStyle('transition') in dummyStyle, 596 transform: prefixStyle('transform'), 597 transformOrigin: prefixStyle('transformOrigin'), 598 transitionProperty: prefixStyle('transitionProperty'), 599 transitionDuration: prefixStyle('transitionDuration'), 600 transitionTimingFunction: prefixStyle('transitionTimingFunction'), 601 transitionDelay: prefixStyle('transitionDelay'), 602 deviceWidth: screen.width, 603 deviceHeight: screen.height, 604 605 altEvents: { 606 resize: 'onorientationchange' in window ? 'orientationchange' : 'resize', 607 start: hasTouch ? 'touchstart' : 'mousedown', 608 move: hasTouch ? 'touchmove' : 'mousemove', 609 end: hasTouch ? 'touchend' : 'mouseup', 610 cancel: hasTouch ? 'touchcancel' : 'mouseup', 611 transitionEnd: vendor !== false ? transitionend[vendor] : false 612 }, 613 614 getTranslate: function(x, y) { 615 if (this.has3d) { 616 return 'translate3d(' + x + ', ' + y + ', 0)'; 617 } else { 618 return 'translate(' + x + ', ' + y + ')'; 619 } 620 } 621 } 622}(); 623 624var $Mediator = function () { 625 var _class, 626 eventsList = {}, 627 lastEventsList = {}; 628 629 _class = { 630 on: function () { 631 checkHandlers({ 632 args: Array.prototype.slice.call(arguments), 633 prepare: addHandlers 634 }); 635 return this; 636 }, 637 638 one: function () { 639 checkHandlers({ 640 args: Array.prototype.slice.call(arguments), 641 once: true, 642 prepare: addHandlers 643 }); 644 return this; 645 }, 646 647 off: function () { 648 checkHandlers({ 649 args: Array.prototype.slice.call(arguments), 650 once: true, 651 prepare: removeHandlers 652 }); 653 return this; 654 }, 655 656 fire: function (e) { 657 var args = Array.prototype.splice.call(arguments, 1), 658 names, 659 result = []; 660 661 switch ($Common.getType(e)) { 662 case 'String': 663 case 'Array': 664 names = e; 665 break; 666 case 'Object': 667 names = e.name; 668 break; 669 default: 670 return; 671 } 672 673 checkValues(names, function (name) { 674 var event = getEvent(name), 675 _event, 676 _args, 677 removeList = []; 678 679 switch ($Common.getType(e)) { 680 case 'Object': 681 _event = $Common.clone(e); 682 break; 683 default: 684 _event = {}; 685 break; 686 } 687 688 _event.name = name; 689 _args = [_event].concat(args); 690 lastEventsList[name] = _args; 691 692 if (!event) { 693 return; 694 } 695 696 event.progress = true; 697 execute(0); 698 699 function execute (index) { 700 for (var i = index; i < event.handlers.length; i++) { 701 var item = event.handlers[i], 702 context = item.context || e.context || null; 703 704 if (e.type && item.type != e.type) { 705 continue; 706 } 707 708 if (item.once) { 709 removeList.push(i); 710 } 711 712 if (item.async) { 713 runHandler(item.handler, context, _args).then(function (_result) { 714 if (item.report) { 715 result.push(_result); 716 } 717 718 execute(i + 1); 719 }); 720 break; 721 } else { 722 if (item.report) { 723 result.push(runHandler(item.handler, context, _args)); 724 } else { 725 runHandler(item.handler, context, _args); 726 } 727 } 728 } 729 730 if (result.length == event.reportCount && e.callback) { 731 e.callback.apply(e.context || null, result); 732 } 733 734 if (i == event.handlers.length) { 735 for (var i = removeList.length; i--;) { 736 if (event.handlers[i].report) { 737 event.reportCount--; 738 } 739 740 event.handlers.splice(i, 1); 741 } 742 743 delete event.progress; 744 } 745 } 746 }); 747 748 return this; 749 } 750 }; 751 752 return _class; 753
754 function runHandler (handler, context, args) { 755 return handler.apply(context, args); 756 } 757 758 function checkHandlers (options) { 759 if (!options.args) { 760 return 761 } 762 763 switch ($Common.getType(options.args[0])) { 764 case 'String': 765 options.prepare({ 766 name: options.args[0], 767 handlers: options.args.slice(1) 768 }, options.once); 769 break; 770 case 'Object': 771 options.args.forEach(function (item) { 772 options.prepare(item, options.once); 773 }); 774 break; 775 } 776 } 777 778 function addHandlers (item, once) { 779 var handlers = item.handlers; 780 781 checkValues(item.name, function (name) { 782 var event = setEvent(name); 783 784 checkValues(handlers, function (execute) { 785 if (check(execute.handler || execute)) { 786 return; 787 } 788 789 var data = set([ 790 'type', 791 'async', 792 'report', 793 'track' 794 ], item, { 795 context: item.context || null, 796 order: item.order || 10, 797 once: once 798 }); 799 800 switch ($Common.getType(execute)) { 801 case 'Object': 802 set([ 803 'handler', 804 'type', 805 'context', 806 'order', 807 'async', 808 'report', 809 'track' 810 ], execute, data); 811 break; 812 case 'Function': 813 data.handler = execute; 814 break; 815 } 816 817 setHandler(name, data); 818 819 if (data.track && lastEventsList[name] && !event.progress) { 820 runHandler(data.handler, data.context, lastEventsList[name]); 821 } 822 823 function check (handler) { 824 return event.handlers.some(function (item) { 825 if (handler == item.handler && item.context == item.context) { 826 return true; 827 } 828 }); 829 } 830 831 function set (names, source, target) { 832 names.forEach(function (name) { 833 if (source[name] !== undefined) { 834 target[name] = source[name]; 835 } 836 }); 837 return target; 838 } 839 }); 840 }); 841 } 842 843 function removeHandlers (item) { 844 checkValues(item.name, function (name) { 845 if (item.handlers) { 846 checkValues(item.handlers, function (handler) { 847 var options = { 848 handler: handler 849 }; 850 851 if (item.context) { 852 options.context = item.context; 853 } 854 855 resetHandlers(name, options); 856 }); 857 } else if (item.context) { 858 resetHandlers(name, { 859 context: item.context 860 }); 861 } else { 862 resetEvent(name); 863 } 864 }); 865 } 866 867 function getEvent (name) { 868 return eventsList[name]; 869 } 870 871 function setEvent (name) { 872 if (!eventsList[name]) { 873 eventsList[name] = { 874 handlers: [], 875 reportCount: 0 876 }; 877 } 878 879 return eventsList[name]; 880 } 881 882 function resetEvent (name) { 883 delete eventsList[name]; 884 } 885 886 function resetHandlers (name, options) { 887 var event = eventsList[name]; 888 889 if (!event) { 890 return; 891 } 892 893 var handlers = getHandlers(name); 894 895 if (!handlers || !handlers.length) { 896 return; 897 } 898 899 var keys = Object.keys(options); 900 901 for (var i = handlers.length ; i--;) { 902 if (check(handlers[i])) { 903 if (handlers[i].report) { 904 event.reportCount--; 905 } 906 907 handlers.splice(i, 1); 908 } 909 } 910 911 function check (item) { 912 return keys.every(function (key) { 913 return options[key] == item[key]; 914 }); 915 } 916 } 917 918 function getHandlers (name) { 919 if (eventsList[name]) { 920 return eventsList[name].handlers; 921 } 922 } 923 924 function setHandler (name, data) { 925 var event = eventsList[name]; 926 927 if (event) { 928 event.handlers.push(data); 929 930 if (data.report) { 931 event.reportCount++; 932 } 933 934 event.handlers.sort(function (a, b) { 935 return a.order - b.order; 936 }); 937 } 938 } 939 940 function checkValues (values, callback) { 941 switch ($Common.getType(values)) { 942 case 'String': 943 values = values.split(/\s+/); 944 case 'Array':
945 values.forEach(function (value) { 946 callback(value); 947 }); 948 break; 949 case 'Function': 950 callback(values); 951 break; 952 } 953 } 954}(); 955 956var $Input = function () { 957 var mainRules = [ 958 'boxSizing', 959 'borderTopStyle', 960 'borderTopStyle', 961 'borderTopWidth', 962 'borderBottomStyle', 963 'borderBottomWidth', 964 'paddingTop', 965 'paddingRight', 966 'paddingBottom', 967 'paddingLeft', 968 'lineHeight', 969 'fontSize', 970 'fontFamily', 971 'fontWeight', 972 'fontStyle', 973 'fontVariant', 974 'fontStretch', 975 'fontSizeAdjust', 976 'textTransform', 977 'textDecoration', 978 'textIndent', 979 'wordSpacing', 980 'letterSpacing' 981 ], 982 sendDelay, 983 _class; 984 985 _class = { 986 prepareInput: function (options) { 987 if (!options.element) { 988 options.element = $(options.selector || 'textarea', options.context); 989 } 990 991 setTimeout(function () { 992 options.element.each(function () { 993 var $item = $(this), 994 rule = $item.data('rule'), 995 cs = getComputedStyle(this, null), 996 styles = {}, 997 itemStyle = { 998 overflow: 'hidden', 999 resize: 'none' 1000 }; 1001 1002 for (var i = mainRules.length; i--;) { 1003 if (cs[mainRules[i]] !== undefined) { 1004 styles[mainRules[i]] = cs[mainRules[i]]; 1005 } 1006 } 1007 1008 if (rule) { 1009 switch (rule) { 1010 case 'max': 1011 case 'fix': 1012 itemStyle = { 1013 overflow: 'auto', 1014 resize: 'none' 1015 }; 1016 1017 break; 1018 } 1019 1020 $item.data({ 1021 edge: getHeight(this, getFakeValue($item.data('size'))) 1022 }); 1023 } 1024 1025 $item.css(itemStyle).data({ 1026 styles: styles, 1027 offset: parseInt(cs.paddingTop) + parseInt(cs.paddingBottom) 1028 }); 1029 1030 setInputHeight(this, true); 1031 1032 $item 1033 .on('mousemove', itemMouseMove) 1034 .on('mousedown', itemMouseDown) 1035 .on('mouseup', itemMouseUp) 1036 .on('focus', itemFocus) 1037 .on('input', itemContentChange); 1038 }); 1039 }, 0); 1040 1041 function itemContentChange() { 1042 setInputHeight(this); 1043 1044 if (options.callback) { 1045 options.callback(this); 1046 } 1047 } 1048 1049 function itemMouseMove (e) { 1050 e.stopPropagation(); 1051 } 1052 1053 function itemMouseDown () { 1054 $(this).data({ 1055 width: this.offsetWidth, 1056 height: this.offsetHeight 1057 }); 1058 } 1059 1060 function itemMouseUp () { 1061 var $item = $(this); 1062 1063 if ($item.data('width') != this.offsetWidth || $item.data('height') != this.offsetHeight) { 1064 setInputHeight(this); 1065 } 1066 } 1067 1068 function itemFocus () { 1069 _class.test.css($.extend($(this).data('styles'), { 1070 width: this.offsetWidth 1071 })); 1072 } 1073 1074 function setInputHeight (item, status) { 1075 var $item = $(item), 1076 rule = $item.data('rule'), 1077 height = getHeight(item); 1078 1079 if (rule) { 1080 var edge = $item.data('edge'); 1081 1082 switch (rule) { 1083 case 'min': 1084 if (height < edge) { 1085 height = edge; 1086 } 1087 1088 break; 1089 case 'max': 1090 if (height > edge) { 1091 height = edge; 1092 } 1093 1094 break; 1095 case 'fix': 1096 height = edge; 1097 break; 1098 } 1099 } 1100 1101 if ($item.data('height') != height) { 1102 $item.css({ 1103 height: height + 'px' 1104 }).data({ 1105 height: height 1106 }); 1107 1108 if (!status) { 1109 $item.trigger('height:input'); 1110 } 1111 } 1112 } 1113 1114 function getHeight (item, value) { 1115 var inputStyles = $(item).data('styles'), 1116 delta = { 1117 top: 0, 1118 bottom: 0 1119 }; 1120 1121 switch (inputStyles.boxSizing) { 1122 case 'border-box': 1123 delta.top += parseInt(inputStyles.borderTopWidth); 1124 delta.bottom += parseInt(inputStyles.borderBottomWidth); 1125 case 'padding-box': 1126 delta.top += parseInt(inputStyles.paddingTop); 1127 delta.bottom += parseInt(inputStyles.paddingBottom); 1128 break; 1129 } 1130 1131 _class.test.css($.extend(inputStyles, { 1132 width: item.offsetWidth 1133 })).html(value || item.value.replace(/[\r\n]/g, '<br>').replace(/(<br>)$/, '$1*') || '*'); 1134 1135 return _class.test.get(0).offsetHeight; 1136 } 1137 1138 function getFakeValue (size) { 1139 for (var value = '*', i = parseInt(size) - 1; i--;) { 1140 value += '<br>*'; 1141 } 1142 1143 return value; 1144 } 1145 } 1146 }; 1147 1148 $(function () { 1149 _class.test = $('<div>').css({ 1150 boxSizing: 'border-box', 1151 whiteSpace: 'pre-wrap', 1152 wordWrap: 'break-word' 1153 }).appendTo( 1154 $('<div>').css({ 1155 position: 'absolute', 1156 overflow: 'hidden', 1157 width: 0, 1158 height: 0 1159 }).appendTo( 1160 $(document.body) 1161 ) 1162 ); 1163 }); 1164 1165 return _class; 1166}(); 1167 1168var $Franchise = function () { 1169 var _mainClass = {}, 1170 root = document.documentElement, 1171 userMode = $(root).data('version'), 1172 iscrollOptions = { 1173 common: { 1174 scrollbars: 'custom' 1175 }, 1176 X: { 1177 scrollX: true 1178 }, 1179 Y: { 1180 scrollY: true, 1181 preventDefault: false 1182 } 1183 }, 1184 iDeviceMode; 1185 1186 if ($Params.hasTouch) { 1187 // if ($Params.isIDevice) { 1188 $(root).addClass('idevice'); 1189 iDeviceMode = true; 1190 // } 1191 $.extend(iscrollOptions.X, { 1192 eventPassthrough: true 1193 }); 1194 } else { 1195 $.extend(iscrollOptions.Y, { 1196 // interactiveScrollbars: true, 1197 mouseWheel: true, 1198 click: true 1199 }); 1200 } 1201 1202 if (document.documentMode && document.documentMode <= 11) { 1203 $(root).addClass('old-browser'); 1204 } 1205 1206 $(window) 1207 .on('resize orientationchange', checkPageWidth) 1208 .on('scroll', checkPageScroll); 1209 1210 $.extend(_mainClass, { 1211 getOptions: function (url, param) { 1212 var result = $Common.getURLParts(url), 1213 _param = {}; 1214 1215 for (var i = 1; i < arguments.length; i++) { 1216 _param = $.extend(_param, arguments[i]); 1217 } 1218 1219 return $.extend(result, { 1220 query: $Common.getQuery({ 1221 url: result.search, 1222 add: _param 1223 }) 1224 }); 1225 }, 1226 1227 getMethod: function (data) { 1228 var method; 1229 1230 if (data) { 1231 method = data.method; 1232
1233 if (!method) { 1234 try { 1235 method = data.attr('method'); 1236 } catch (z) { 1237 try { 1238 method = data.data('method'); 1239 } catch (z) {} 1240 } 1241 } 1242 } 1243 1244 return method || 'POST'; 1245 }, 1246 1247 getSendParam: function (options, sendParam) { 1248 var result, 1249 sendData = $Common.clone.apply($Common, Array.prototype.slice.call(arguments, 2).concat([ 1250 options.query, 1251 { 1252 sessid: BX.bitrix_sessid() 1253 } 1254 ])); 1255 1256 if (sendParam.method.toUpperCase() == 'GET') { 1257 result = { 1258 url: $Common.getURL({ 1259 url: options.path, 1260 query: sendData 1261 }), 1262 data: null 1263 }; 1264 } else { 1265 result = { 1266 url: options.path, 1267 data: sendData 1268 }; 1269 } 1270 1271 return $Common.clone(sendParam, result); 1272 }, 1273 1274 send: function (sendData, success, error) { 1275 $.ajax(sendData) 1276 .done(function (data) { 1277 success.call(null, data); 1278 }).fail(function () { 1279 error.apply(null, Array.prototype.slice.apply(arguments)); 1280 }); 1281 } 1282 }); 1283 1284 _mainClass.$Cart = function () { 1285 var _class = {}, 1286 activeClass = 'cart-menu-active', 1287 fixedStopClass = 'cart-fixed', 1288 scrollEvents = [ 1289 // $Params.hasTouch ? 'touchmove' : 'scroll', 1290 'touchmove', 1291 'scroll', 1292 'resize', 1293 'orientationchange' 1294 ].join(' '); 1295 1296 $(function () { 1297 var headerWrapper = $('[data-wrapper="header"]'); 1298 1299 $(window).on(scrollEvents, checkScroll); 1300 checkScroll.call(window); 1301 1302 function checkScroll () { 1303 var wrapperTop = headerWrapper.offset().top, 1304 delta = headerWrapper.outerHeight(), 1305 offset = $(this).scrollTop(); 1306 1307 if (this.innerWidth > 768) { 1308 if (wrapperTop + delta < offset) { 1309 $(root).addClass(fixedStopClass); 1310 } else { 1311 $(root).removeClass(fixedStopClass); 1312 } 1313 } else { 1314 $(root).removeClass(fixedStopClass); 1315 } 1316 } 1317 }); 1318 1319 $(document) 1320 .on('click', '[data-action="cart-toggle"]', function (e) { 1321 $(this).closest('[data-item="cart"]').toggleClass(activeClass); 1322 }); 1323 }(); 1324 1325 _mainClass.$Filter = function () { 1326 var _class = {}, 1327 1328 filterActiveClass = 'filter-active', 1329 toggleActiveClass = 'toggle-active', 1330 checkedActiveClass = 'filter-checked', 1331 resultsActiveClass = 'filter-results-active', 1332 wideClass = 'wrapper-wide', 1333 parentClass = 'item-parent', 1334 1335 toggleWrapperSelector = '[data-action="toggle"]', 1336 listWrapperSelector = '[data-wrapper="filter"]', 1337 listItemSelector = '[data-item="filter"]', 1338 childListSelector = '[data-parent="filter"]', 1339 listItemChoiceSelector = '[data-action="choice"]', 1340 listItemActionSelector = '[data-action="filter"]', 1341 resultsWrapperSelector = '[data-wrapper="result"]', 1342 resultsContentSelector = '[data-content="result"]', 1343 inputWrapperSelector = '[data-wrapper="field"]', 1344 searchWrapperSelector = '[data-wrapper="search"]', 1345 1346 query = $Common.getQuery(), 1347 filterParam, 1348 listScrollOptions = $Common.clone(iscrollOptions.common, iscrollOptions.Y); 1349 1350 function Result (resultWrapper) { 1351 var resultItem = this, 1352 resultTemplate = getTemplate($('[data-template="result"]', resultWrapper)); 1353 1354 $.extend(this, { 1355 wrapper: resultWrapper, 1356 target: $(resultsContentSelector, resultWrapper), 1357 template: resultTemplate, 1358 items: {} 1359 }); 1360 1361 $Mediator 1362 .on('get:result', function (e, data) { 1363 if (data) {
1364 Object.keys(data).forEach(function (name) { 1365 if (data[name]) { 1366 resultItem.set(name, data[name]); 1367 } else { 1368 resultItem.remove(name); 1369 } 1370 }); 1371 } else { 1372 Object.keys(resultItem.items).forEach(function (name) { 1373 resultItem.remove(name); 1374 }); 1375 } 1376 }) 1377 .on('remove:result', function (e, name) { 1378 resultItem.remove(name); 1379 }); 1380 1381 resultWrapper 1382 .on('click', '[data-action="reset"]', function () { 1383 $Mediator 1384 .fire('reset:result') 1385 .fire('get:result'); 1386 resultItem.target.empty(); 1387 }) 1388 .on('click', '[data-action="result"]', function () { 1389 var item = $(this), 1390 name = item.data('name'), 1391 data = {}; 1392 1393 data[name] = null; 1394 resultItem.remove(name); 1395 $Mediator 1396 .fire('reset:result', data) 1397 .fire('get:result', data); 1398 }); 1399 } 1400 1401 Result.prototype = { 1402 set: function (name, data) { 1403 if (!this.items[name]) { 1404 var value = data.value 1405 .replace(/</g, '<') 1406 .replace(/>/g, '>'), 1407 title = data.title ? data.title 1408 .replace(/</g, '<') 1409 .replace(/>/g, '>') : value, 1410 item = this.template 1411 .replace('{#name}', name) 1412 .replace('{#value}', value) 1413 .replace('{#title}', title); 1414 1415 this.items[name] = $(item).appendTo(this.target); 1416 this.wrapper.addClass(resultsActiveClass); 1417 } 1418 }, 1419 1420 get: function (name) { 1421 return this.items[name]; 1422 }, 1423 1424 remove: function (name) { 1425 if (this.items[name]) { 1426 this.items[name].remove(); 1427 delete this.items[name]; 1428 1429 if (!Object.keys(this.items).length) { 1430 this.wrapper.removeClass(resultsActiveClass); 1431 } 1432 } 1433 } 1434 }; 1435 1436 function Search (searchWrapper) { 1437 var searchItem = this, 1438 input = $('input', searchWrapper), 1439 name = input.eq(0).attr('name'), 1440 searchDelay; 1441 1442 $.extend(this, { 1443 wrapper: searchWrapper, 1444 input: input 1445 }); 1446 1447 if (query[name] && query[name][0]) { 1448 var data = {}, 1449 value = decodeURIComponent(query[name][0]); 1450 1451 data[name] = { 1452 value: value 1453 }; 1454 $Mediator.fire('get:result', data); 1455 } 1456 1457 _class.search[name] = this; 1458 searchWrapper 1459 .on('input', function () { 1460 clearTimeout(searchDelay); 1461 searchDelay = setTimeout(done, 500); 1462 1463 function done () { 1464 var data = {}; 1465 1466 $Mediator.fire('remove:result', name); 1467 1468 if (input.val()) { 1469 data[name] = { 1470 value: input.val() || null 1471 }; 1472 } else { 1473 data[name] = null; 1474 $Mediator.fire('reset:result', data); 1475 } 1476 1477 $Mediator.fire('get:result', data); 1478 } 1479 }); 1480 1481 $Mediator.on('reset:result', function (e, data) { 1482 if (!data || name in data) { 1483 input.val(''); 1484 } 1485 }); 1486 } 1487 1488 function Input (inputWrapper) { 1489 var inputItem = this, 1490 inputs = $('input', inputWrapper), 1491 name = inputs.eq(0).attr('name'); 1492 1493 $.extend(this, { 1494 wrapper: inputWrapper, 1495 inputs: inputs 1496 }); 1497 1498 inputs.each(function () { 1499 inputItem.inputs[this.value] = { 1500 input: this, 1501 value: this.value, 1502 title: $.trim($(this).closest('[data-item="label"]').text()) 1503 }; 1504 }); 1505 1506 _class.input[name] = this; 1507 1508 if (query[name]) { 1509 var item = this.inputs[query[name][0]], 1510 data = {}; 1511 1512 item.input.checked = true; 1513 data[name] = item; 1514 $Mediator.fire('get:result', data); 1515 } 1516 1517 inputWrapper 1518 .on('change', 'input', function () { 1519 var data = {}; 1520 1521 if (this.checked) { 1522 data[name] = inputItem.inputs[this.value]; 1523 } else { 1524 data[name] = null; 1525 } 1526 1527 $Mediator.fire('get:result', data); 1528 }); 1529 1530 $Mediator.on('reset:result', function (e, data) { 1531 if (!data || name in data) { 1532 inputs.each(function () { 1533 this.checked = false;
1534 }); 1535 } 1536 }); 1537 } 1538 1539 function List (listWrapper) { 1540 var listItem = this, 1541 name = listWrapper.data('name'); 1542 1543 if (!name) { 1544 name = 'set_' + Object.keys(_class.list).length; 1545 } 1546 1547 _class.list[name] = this; 1548 $.extend(this, { 1549 wrapper: listWrapper, 1550 parent: listWrapper.closest(listWrapperSelector), 1551 scrollWrapper: $('[data-wrapper="scroll"]', listWrapper), 1552 name: name, 1553 checkedItems: {}, 1554 activeItems: {}, 1555 items: {} 1556 }); 1557 $(listItemSelector, listWrapper).each(function () { 1558 new Field($(this), listItem); 1559 }); 1560 1561 if (listWrapper.data('type') == 'scroll') { 1562 this.scrollType = true; 1563 } 1564 1565 listWrapper 1566 .on('click', toggleWrapperSelector, listItem.toggle.bind(this)) 1567 .on('click', listItemActionSelector, function (e) { 1568 var item = $(this).closest(listItemSelector), 1569 id = item.data('name'); 1570 1571 e.stopPropagation(); 1572 listItem.items[id].toggleActive(); 1573 }) 1574 .on('click', listItemChoiceSelector, function (e) { 1575 var item = $(this), 1576 parent = item.closest(listItemSelector), 1577 id = parent.data('name'); 1578 1579 e.stopPropagation(); 1580 1581 if (!listItem.getCheckedItems(id)) { 1582 listItem.setCheckedItems(id); 1583 } else { 1584 listItem.resetCheckedItems(id); 1585 } 1586 }); 1587 1588 $Mediator.on('reset:result', function (e, data) { 1589 if (data) { 1590 Object.keys(data).forEach(function (id) { 1591 if (listItem.get(id)) { 1592 listItem.resetCheckedItems(id); 1593 } 1594 }); 1595 } else { 1596 listItem.resetCheckedItems(); 1597 } 1598 }); 1599 } 1600 1601 List.prototype = { 1602 setScroll: function () { 1603 if (this.scroll) { 1604 this.scroll.refresh(); 1605 } else { 1606 this.scroll = new IScroll(this.scrollWrapper.get(0), listScrollOptions); 1607 } 1608 }, 1609 1610 resetScroll: function () { 1611 if (this.scroll) { 1612 this.scroll.scroller.removeAttribute('style'); 1613 this.scroll.destroy(); 1614 delete this.scroll; 1615 } 1616 }, 1617 1618 show: function () { 1619 if (_class.activeList) { 1620 _class.activeList.close(); 1621 } 1622 1623 this.wrapper.addClass(toggleActiveClass); 1624 _class.activeList = this; 1625 1626 if (_class.scrollType && this.scrollType) { 1627 this.setScroll(); 1628 } 1629 }, 1630 1631 close: function () { 1632 this.wrapper.removeClass(toggleActiveClass); 1633 delete _class.activeList; 1634 }, 1635 1636 toggle: function () { 1637 if (this != _class.activeList) { 1638 this.show(); 1639 } else { 1640 this.close(); 1641 } 1642 }, 1643 1644 set: function (id, item) { 1645 this.items[id] = item; 1646 }, 1647 1648 get: function (id) { 1649 return this.items[id]; 1650 }, 1651 1652 getActiveItems: function (level) { 1653 if (level !== undefined) { 1654 return this.activeItems[level]; 1655 } else { 1656 return this.activeItems; 1657 } 1658 }, 1659
1660 setActiveItems: function (id) { 1661 if (id !== undefined) { 1662 var item = this.get(id); 1663 1664 this.activeItems[item.level] = id; 1665 this.parent.toggleClass(wideClass, !!this.get(this.activeItems[0]).children); 1666 1667 if (!item.children) { 1668 this.setCheckedItems(id); 1669 } 1670 } 1671 }, 1672 1673 resetActiveItems: function (id) { 1674 var item = this.get(id); 1675 1676 delete this.activeItems[item.level]; 1677 1678 if (!Object.keys(this.activeItems).length) { 1679 this.parent.removeClass(wideClass); 1680 } 1681 }, 1682 1683 getCheckedItems: function (id) { 1684 if (id !== undefined) { 1685 if (this.checkedItems[id]) { 1686 return this.get(id); 1687 } 1688 } else { 1689 return Object.keys(this.checkedItems); 1690 } 1691 }, 1692 1693 setCheckedItems: function (id) { 1694 if (id !== undefined) { 1695 var item = this.get(id), 1696 data; 1697 1698 if (item) { 1699 this._setCheckedItems(id); 1700 data = this._setCheckedItems(id); 1701 $Mediator.fire('get:result', data); 1702 } 1703 } 1704 }, 1705 1706 _setCheckedItems: function (id) { 1707 var item = this.get(id), 1708 data = {}; 1709 1710 if (item.children) { 1711 item.children.forEach(function (_id) { 1712 var _item = this.get(_id); 1713 1714 this.setCheckedItem(_id); 1715 item.activeChildren[_id] = true; 1716 data[_id] = { 1717 value: 'Y', 1718 title: _item.title 1719 }; 1720 }.bind(this)); 1721 } 1722 1723 if (item.parent) { 1724 item.parent.activeChildren[id] = true; 1725 1726 if (item.parent.children.length == Object.keys(item.parent.activeChildren).length) { 1727 this.setCheckedItem(item.parent.id); 1728 data[item.parent.id] = { 1729 value: 'Y', 1730 title: item.parent.title 1731 }; 1732 } else { 1733 this.resetCheckedItem(item.parent.id); 1734 data[item.parent.id] = null; 1735 } 1736 } 1737 1738 this.setCheckedItem(id); 1739 data[id] = { 1740 value: 'Y', 1741 title: item.title 1742 }; 1743 return data; 1744 }, 1745 1746 setCheckedItem: function (id) { 1747 var item = this.get(id); 1748 1749 if (item) { 1750 this.checkedItems[id] = true; 1751 item.wrapper.addClass(checkedActiveClass); 1752 } 1753 }, 1754 1755 resetCheckedItems: function (id) { 1756 if (id === undefined) {
1757 this.getCheckedItems().forEach(function (id) { 1758 this.resetCheckedItem(id); 1759 }.bind(this)); 1760 } else { 1761 if (this.get(id)) { 1762 var data = this._resetCheckedItems(id); 1763 $Mediator.fire('get:result', data); 1764 } 1765 } 1766 }, 1767 1768 _resetCheckedItems: function (id) { 1769 var item = this.get(id), 1770 data = {}; 1771 1772 if (item.children) { 1773 item.children.forEach(function (_id) { 1774 this.resetCheckedItem(_id); 1775 data[_id] = null; 1776 }.bind(this)); 1777 } 1778 1779 // if (item.parent) { 1780 // delete item.parent.activeChildren[id]; 1781 // this.resetCheckedItem(item.parent.id); 1782 // data[item.parent.id] = null; 1783 // } 1784 1785 this.resetCheckedItem(id); 1786 data[id] = null; 1787 return data; 1788 }, 1789 1790 resetCheckedItem: function (id) { 1791 var item = this.get(id); 1792 1793 if (item) { 1794 delete this.checkedItems[id]; 1795 item.wrapper.removeClass(checkedActiveClass); 1796 } 1797 } 1798 }; 1799 1800 function Field (itemWrapper, list) { 1801 var filterItem = this, 1802 id = itemWrapper.data('name'), 1803 parentItem = itemWrapper.parent().closest(listItemSelector), 1804 titleItem = itemWrapper.children(listItemActionSelector), 1805 childBlock = itemWrapper.children(childListSelector), 1806 status, 1807 data = {}; 1808 1809 $.extend(this, { 1810 id: id, 1811 list: list, 1812 title: $.trim(titleItem.text()), 1813 wrapper: itemWrapper 1814 }); 1815 1816 if (childBlock.length) { 1817 this.children = []; 1818 this.activeChildren = {}; 1819 itemWrapper.addClass(parentClass); 1820 } 1821 1822 if (parentItem.length) { 1823 var parent = list.get(parentItem.data('name')); 1824 1825 this.level = parent.level + 1; 1826 this.parent = parent; 1827 parent.children.push(id); 1828 1829 if (list.getCheckedItems(parent.id)) { 1830 status = true; 1831 } 1832 } else { 1833 this.level = 0; 1834 } 1835 1836 list.set(id, this); 1837 1838 if (query[id]) { 1839 status = true; 1840 } 1841 1842 if (status) { 1843 list.setCheckedItems(id); 1844 } 1845 } 1846 1847 Field.prototype = {
1848 setActive: function () { 1849 this.wrapper.addClass(filterActiveClass); 1850 this.list.setActiveItems(this.id); 1851 }, 1852 1853 resetActive: function () { 1854 this.wrapper.removeClass(filterActiveClass); 1855 this.list.resetActiveItems(this.id); 1856 }, 1857 1858 toggleActive: function () { 1859 if (this.children) { 1860 var activeID = this.list.getActiveItems(this.level); 1861 1862 if (activeID == this.id) { 1863 this.resetActive(); 1864 } else { 1865 if (activeID) { 1866 this.list.get(activeID).resetActive(); 1867 } 1868 1869 this.setActive(); 1870 } 1871 } else { 1872 if (this.list.getCheckedItems(this.id)) { 1873 this.list.resetCheckedItems(this.id); 1874 } else { 1875 this.list.setCheckedItems(this.id); 1876 } 1877 } 1878 } 1879 }; 1880 1881 $(function () { 1882 var filterWrapper = $('[data-wrapper="filter-fields"]'), 1883 paginationWrapper = $('[data-wrapper="pagination"]'), 1884 productWrapper = $('[data-wrapper="product-list"]'), 1885 formWrapper = $('[data-wrapper="form"]', filterWrapper), 1886 filterParam = getFullParam(formWrapper, 'filter'), 1887 1888 options = _mainClass.getOptions(formWrapper.attr('action'), getFullParam(formWrapper, 'param')), 1889 sendParam = { 1890 method: _mainClass.getMethod(formWrapper), 1891 dataType: 'json' 1892 }, 1893 resultDelay; 1894 1895 if (!filterWrapper.length) { 1896 return; 1897 } 1898 1899 $.extend(_class, { 1900 list: {}, 1901 input: {}, 1902 search: {}, 1903 data: {}, 1904 send: function (data) { 1905 var sendData = data || this.data, 1906 param = {}; 1907 1908 switch (Object.keys(sendData).length) { 1909 case 1: 1910 if (filterParam.get in sendData) { 1911 reset(); 1912 } else { 1913 set(); 1914 } 1915 1916 break; 1917 case 0: 1918 reset(); 1919 break; 1920 default: 1921 set(); 1922 break; 1923 } 1924 1925 _class.setURL(sendData); 1926 param = _mainClass.getSendParam(options, sendParam, sendData, param); 1927 _mainClass.send(param, function (data) { 1928 productWrapper 1929 .empty() 1930 .append(data.items); 1931 paginationWrapper.empty(); 1932 1933 if (data.count) { 1934 paginationWrapper.append(data.pages); 1935 } 1936 }, function () { 1937 1938 }); 1939 1940 function set () { 1941 delete sendData[filterParam.reset]; 1942 // param[filterParam.get] = true; 1943 sendData[filterParam.get] = true; 1944 } 1945 1946 function reset () { 1947 delete sendData[filterParam.get]; 1948 // param[filterParam.reset] = true; 1949 sendData[filterParam.reset] = true; 1950 } 1951 }, 1952 setURL: function (data) { 1953 $Common.replaceState({ 1954 href: $Common.getURL({ 1955 href: location.href, 1956 query: data || this.data 1957 }) 1958 }); 1959 } 1960 }); 1961 1962 $(document) 1963 .on('click', function (e) { 1964 if (_class.activeList && !$(e.target).closest(listWrapperSelector).length) { 1965 _class.activeList.close(); 1966 } 1967 }); 1968 1969 formWrapper 1970 .on('submit', function (e) { 1971 e.preventDefault(); 1972 }); 1973 1974 paginationWrapper 1975 .on('click', '[data-action="pagination"]', function (e) { 1976 var data = $Common.clone(_class.data), 1977 search = this.search.replace('?', '').split('='); 1978 1979 e.preventDefault(); 1980 data[search[0]] = search[1]; 1981 _class.send(data); 1982 }); 1983 1984 $Mediator 1985 .on({ 1986 name: 'window:resize', 1987 track: true, 1988 handlers: function (e, data) { 1989 if (data.innerWidth > 480) { 1990 _class.scrollType = true; 1991 1992 if (_class.activeList) { 1993 _class.activeList.setScroll(); 1994 } 1995 } else { 1996 delete _class.scrollType; 1997 1998 if (_class.activeList) { 1999 _class.activeList.resetScroll(); 2000 } 2001 } 2002 } 2003 }) 2004 .on('reset:result', function (e, data) { 2005 if (data) {
2006 Object.keys(data).forEach(function (id) { 2007 delete _class.data[id]; 2008 }); 2009 } else { 2010 _class.data = {}; 2011 } 2012 2013 _class.setURL(_class.data); 2014 }) 2015 .on('get:result', function (e, data) { 2016 set(data); 2017 2018 if (_class.complete) { 2019 clearTimeout(resultDelay); 2020 resultDelay = setTimeout(done, 0); 2021 } 2022 2023 function done () { 2024 _class.send(); 2025 } 2026 }); 2027 2028 new Result($(resultsWrapperSelector, filterWrapper)); 2029 $(searchWrapperSelector, filterWrapper).each(function () { 2030 new Search($(this)); 2031 }); 2032 $(inputWrapperSelector, filterWrapper).each(function () { 2033 new Input($(this)); 2034 }); 2035 $(listWrapperSelector, filterWrapper).each(function () { 2036 new List($(this)); 2037 }); 2038 _class.complete = true; 2039 2040 function set (data) { 2041 switch ($Common.getType(data)) { 2042 case 'Object': 2043 Object.keys(data).forEach(function (name) { 2044 switch ($Common.getType(data[name])) { 2045 case 'String': 2046 _class.data[name] = data[name]; 2047 break; 2048 case 'Object': 2049 _class.data[name] = data[name].value; 2050 break; 2051 default: 2052 delete _class.data[name]; 2053 break; 2054 } 2055 }); 2056 break; 2057 default: 2058 _class.data = {}; 2059 break; 2060 } 2061 } 2062 }); 2063 }(); 2064 2065 _mainClass.$Tab = function () { 2066 var _class = {}, 2067 tabActiveClass = 'tab-active', 2068 2069 tabItemSelector = '[data-item="tab"]', 2070 2071 startParams = getParameters(), 2072 tabActiveID = startParams.tab; 2073 2074 $(function () { 2075 var tabWrapper = $('[data-wrapper="tab"]'), 2076 tabItems = $(tabItemSelector, tabWrapper), 2077 tabButtons = $('[data-wrapper="tab-action"] [data-action="tab"]', tabWrapper); 2078 2079 $.extend(_class, {
2080 setActiveTab: function (id) { 2081 if (id) { 2082 if (id != tabActiveID) { 2083 this.resetActiveTab(); 2084 } 2085 2086 tabActiveID = id; 2087 tabItems.filter('[data-id="' + id + '"]').addClass(tabActiveClass); 2088 tabButtons.filter('[data-id="' + id + '"]').addClass(tabActiveClass); 2089 $Common.replaceState({ 2090 query: { 2091 tab: id 2092 } 2093 }); 2094 } 2095 }, 2096 resetActiveTab: function (id) { 2097 id = id || tabActiveID; 2098 2099 if (id) { 2100 tabItems.filter('[data-id="' + id + '"]').removeClass(tabActiveClass); 2101 tabButtons.filter('[data-id="' + id + '"]').removeClass(tabActiveClass); 2102 } 2103 }, 2104 scrollToActiveTab: function (tab) { 2105 if(typeof tab !== 'string') $('html, body').scrollTop(($(tab).offset().top) - 50); 2106 } 2107 }); 2108 2109 tabItems.each(function () { 2110 var tab = $(this), 2111 id = tab.data('id'); 2112 2113 if (!tabActiveID) { 2114 if (tab.hasClass(tabActiveClass)) { 2115 _class.setActiveTab(id); 2116 } else { 2117 _class.resetActiveTab(id); 2118 } 2119 } else { 2120 if (id == tabActiveID) { 2121 _class.setActiveTab(id); 2122 } else { 2123 _class.resetActiveTab(id); 2124 } 2125 } 2126 }); 2127 2128 if (!tabActiveID) { 2129 _class.setActiveTab(tabItems.eq(0).data('id')); 2130 } 2131 2132 tabWrapper 2133 .on('click', '[data-action="tab"]', function () { 2134 var button = $(this), 2135 id = button.data('id'), 2136 tab; 2137 2138 if (id) { 2139 _class.setActiveTab(id); 2140 _class.scrollToActiveTab(id); 2141 } else{ 2142 tab = button.closest(tabItemSelector); 2143 2144 if (tab.length) { 2145 _class.setActiveTab(tab.data('id')); 2146 _class.scrollToActiveTab(tab); 2147 } 2148 } 2149 }); 2150 }); 2151 }(); 2152 2153 _mainClass.$Toggle = function () { 2154 var _class = {}, 2155 2156 fieldsetDisableClass = 'form-fieldset-disable', 2157 2158 wrapperSelector = '[data-wrapper="toggle"]', 2159 actionSelector = '[data-action="toggle"]', 2160 targetSelector = '[data-target="toggle"]'; 2161 2162 $(function () { 2163 }); 2164 2165 $(document) 2166 .on('change', actionSelector, function () { 2167 var input = $(this), 2168 id = input.data('id'), 2169 wrapper = input.closest(wrapperSelector), 2170 targets = wrapper.data('targets'); 2171 2172 if (!targets) { 2173 targets = $(targetSelector, wrapper); 2174 wrapper.data('targets', targets); 2175 } 2176 2177 targets.each(function () { 2178 var target = $(this); 2179 2180 if (target.data('id') == id) { 2181 target 2182 .removeClass(fieldsetDisableClass) 2183 .removeAttr('disabled'); 2184 } else { 2185 target 2186 .addClass(fieldsetDisableClass) 2187 .attr('disabled', true); 2188 } 2189 }); 2190 }); 2191 }(); 2192 2193 _mainClass.$Menu = function () { 2194 var _class = {}, 2195 menuScroll, 2196 overflowClass = 'page-overflow', 2197 menuActiveClass = 'menu-active', 2198 menuToggleClass = 'menu-toggle', 2199 contrastActiveClass = 'contrast-active', 2200 contrastViewClass = 'contrast-view', 2201 searchActiveClass = 'search-active', 2202 increaseFontClass = 'font-increase', 2203 activeFontClass = 'font-size-active', 2204 2205 menuWrapperSelector = '[data-wrapper="menu"]', 2206 menuContainerSelector = '[data-container="menu"]', 2207 menuItemSelector = '[data-item="menu"]', 2208 2209 menuScrollOptions = $Common.clone(iscrollOptions.common, iscrollOptions.Y), 2210 fontSize = $Common.getCookie('fontSize') || 1, 2211 contrast = $Common.getCookie('contrast') == 'yes'; 2212 2213 if (contrast) { 2214 $(root).addClass(contrastActiveClass); 2215 } 2216 2217 if (fontSize == 2) { 2218 $(root).addClass(increaseFontClass); 2219 } 2220 2221 $(function () { 2222 var headerWrapper = $('[data-wrapper="header"]'), 2223 functionalWrapper = $('[data-wrapper="functional"]', headerWrapper), 2224 contrastWrapper = $('[data-wrapper="contrast"]', headerWrapper), 2225 fontItems = $('[data-action="font-size"]', contrastWrapper), 2226 2227 menuWrapper = $(menuWrapperSelector), 2228 menuContainer = $(menuContainerSelector, menuWrapper), 2229 menuItems = $(menuItemSelector, menuWrapper), 2230 menuScrollWrapper = $('[data-wrapper="scroll"][data-type="menu"]'), 2231
2232 searchWrapper = $('[data-wrapper="search"]', headerWrapper), 2233 searchInput = $('[data-action="input"]', searchWrapper), 2234 activeMenuItem = menuItems.filter('.' + menuActiveClass); 2235 2236 $.extend(_class, { 2237 menuOpen: function () { 2238 $(root).addClass(overflowClass); 2239 menuWrapper.addClass(menuActiveClass); 2240 _class.menuScroll(); 2241 menuWrapper.on('click', this.checkMenu); 2242 }, 2243 menuClose: function () { 2244 menuWrapper.off('click', this.checkMenu); 2245 $(root).removeClass(overflowClass); 2246 menuWrapper.removeClass(menuActiveClass); 2247 }, 2248 checkMenu: function (e) { 2249 e.stopPropagation(); 2250 2251 if (!$(e.target).closest(menuContainer).length) { 2252 this.menuClose(); 2253 } 2254 }.bind(_class), 2255 menuToggle: function (e) { 2256 var target = $(e.target), 2257 item = $(this); 2258 2259 if (target.is('span') || target.is(item)) { 2260 item.toggleClass(menuToggleClass); 2261 _class.menuScroll(); 2262 } 2263 }, 2264 menuScroll: function () { 2265 if (menuScroll) { 2266 menuScroll.refresh(); 2267 } 2268 }, 2269 searchOpen: function () { 2270 $(root).addClass(searchActiveClass); 2271 searchInput.focus(); 2272 }, 2273 searchClose: function () { 2274 $(root).removeClass(searchActiveClass); 2275 }, 2276 contrastOpen: function () { 2277 $(root).addClass(contrastActiveClass); 2278 $Common.setCookie({ 2279 contrast: 'yes' 2280 }); 2281 }, 2282 contrastClose: function () { 2283 $(root).removeClass(contrastActiveClass); 2284 _class.resetContrastMode(); 2285 $Common.setCookie({ 2286 contrast: 'no' 2287 }); 2288 }, 2289 contrastToggle: function () { 2290 if ($(root).hasClass(contrastActiveClass)) { 2291 _class.contrastClose(); 2292 } else { 2293 _class.contrastOpen(); 2294 } 2295 }, 2296 setContrastMode: function () { 2297 $(root).addClass(contrastViewClass); 2298 _class.contrastOpen(); 2299 }, 2300 resetContrastMode: function () { 2301 $(root).removeClass(contrastViewClass); 2302 }, 2303 toggleFontSize: function () { 2304 var item = $(this), 2305 value = item.data('value'); 2306 2307 $(root).toggleClass(increaseFontClass, value > 1); 2308 $Common.setCookie({ 2309 fontSize: value 2310 }); 2311 setFontItem(item); 2312 } 2313 }); 2314 setFontItem(fontItems.filter('[data-value="' + fontSize + '"]')); 2315 2316 if (activeMenuItem.length) { 2317 activeMenuItem.addClass(menuToggleClass); 2318 } else { 2319 activeMenuItem = undefined; 2320 } 2321 2322 function setFontItem (item) { 2323 if (!item.hasClass(activeFontClass)) { 2324 item 2325 .addClass(activeFontClass) 2326 .siblings().removeClass(activeFontClass); 2327 } 2328 } 2329 2330 $(document) 2331 .on('click', '[data-action="additional"]', function () { 2332 $(this).closest('[data-wrapper="additional"]').toggleClass('additional-active'); 2333 }); 2334 2335 contrastWrapper 2336 .on('click', '[data-action="font-size"]', _class.toggleFontSize) 2337 .on('click', '[data-action="close"]', _class.resetContrastMode) 2338 .on('click', '[data-action="reset"]', _class.contrastClose); 2339 2340 $Mediator.on({ 2341 name: 'window:resize', 2342 track: true, 2343 handlers: function (e, options) { 2344 if (options.innerWidth > 768) { 2345 if (menuScroll) { 2346 menuScroll.scroller.removeAttribute('style'); 2347 menuScroll.destroy(); 2348 menuScroll = null; 2349 } 2350 } else { 2351 if (!menuScroll && menuScrollWrapper.length) { 2352 menuScroll = new IScroll(menuScrollWrapper.get(0), menuScrollOptions); 2353 } 2354 } 2355 } 2356 }); 2357 2358 headerWrapper 2359 .on('click', '[data-action="search"]', _class.searchOpen); 2360
2361 searchWrapper 2362 .on('click', '[data-action="close"]', _class.searchClose); 2363 2364 if ($Params.hasTouch) { 2365 headerWrapper 2366 .on('focusin', 'input', function () { 2367 $(root).addClass('fixfixed'); 2368 }) 2369 .on('focusout', 'input', function () { 2370 $(root).removeClass('fixfixed'); 2371 }); 2372 } 2373 2374 menuWrapper 2375 .on('click', '[data-action="open"]', _class.menuOpen.bind(_class)) 2376 .on('click', '[data-action="close"]', _class.menuClose.bind(_class)) 2377 .on('click', '[data-action="contrast"]', _class.setContrastMode) 2378 .on('click', menuItemSelector, _class.menuToggle); 2379 }); 2380 }(); 2381 2382 _mainClass.$Form = function () { 2383 var popupActiveClass = 'form-popup-active', 2384 popupErrorClass = 'form-popup-error', 2385 popupLoadingClass = 'form-popup-loading', 2386 orderedClass = 'ordered-item', 2387 errorFieldClass = 'error-field', 2388 errorFormClass = 'error-form', 2389 2390 formSelector = '[data-wrapper="form"]', 2391 cartItemSelector = '[data-item="cart"]'; 2392 2393 $(function () { 2394 var headerWrapper = $('[data-wrapper="header"]'), 2395 popupWrapper = $('[data-wrapper="form-popup"]'), 2396 popupTarget = $('[data-target="form-popup"]', popupWrapper), 2397 cartItem = $(cartItemSelector, headerWrapper), 2398 popupScroll; 2399 2400 $.extend(_mainClass, { 2401 popupOpen: function (e) { 2402 e.preventDefault(); 2403 $('.form-wrapper').append(" <div class='sk-wandering-cubes'><div class='sk-cube sk-cube-1'></div><div class='sk-cube sk-cube-2'></div></div>"); 2404 2405 var button = $(this), 2406 item = button.closest('[data-item="form"]'), 2407 formWrapper = button.closest('[data-wrapper="form"]'), 2408 errorWrapper = $('[data-wrapper="error"]', formWrapper), 2409 errorMessage = $('[data-message="error"]', errorWrapper), 2410 id = getParam(button, 'id'), 2411 additional = getParam(button, 'additional'), 2412 method = getParam(button, 'method') || formWrapper.attr('method'), 2413 type = getParam(button, 'type'), 2414 behavior = getFullParam(button, 'ajax', type), 2415 redirect = getFullParam(button, 'redirect', type), 2416 address = getFullParam(button, 'url', type), 2417 standardOptions = _mainClass.getOptions(address ? address : formWrapper.attr('action'), getFullParam(button, 'param'), { 2418 id: id 2419 }, additional), 2420 standardSendParam = { 2421 method: method || _mainClass.getMethod(), 2422 dataType: 'html' 2423 }, 2424 extendOptions = _mainClass.getOptions(behavior, getFullParam(button, 'param')), 2425 extendSendParam = { 2426 method: method || _mainClass.getMethod(), 2427 dataType: 'json' 2428 }, 2429 param = _mainClass.getSendParam(standardOptions, standardSendParam), 2430 start; 2431 2432 if (redirect) { 2433 button.prop('disabled', true); 2434 _mainClass.send(param, function (data) { 2435 data = getJSON(data); 2436 2437 if (data.STATUS == 'OK') { 2438 __done(redirect); 2439 } else { 2440 _done(); 2441 } 2442 }, _done); 2443 } else if (behavior) { 2444 button.prop('disabled', true); 2445 _mainClass.send(param, function (data) { 2446 $('.form-wrapper .sk-wandering-cubes').remove(); 2447 data = getJSON(data); 2448 2449 switch (data.STATUS) { 2450 case 'OK': 2451 param = _mainClass.getSendParam(extendOptions, standardSendParam); 2452 _mainClass.send(param, function (data) { 2453 var cart = $(data); 2454 2455 cartItem.replaceWith(cart); 2456 cartItem = cart; 2457 setCartCount(); 2458 $Mediator 2459 .fire('set:result', getCartCount(id)) 2460 .off('set:result', setResult); 2461 _done(); 2462 }, _done); 2463 break; 2464 case 'ERROR': 2465 errorMessage.text(data.MESSAGE); 2466 formWrapper.addClass(errorFormClass); 2467 // _done(); 2468 break; 2469 } 2470 }, _done); 2471 } else { 2472 $(root).addClass(popupActiveClass); 2473 reset(); 2474 popupWrapper.addClass(popupLoadingClass); 2475 _mainClass.send(param, function (data) { 2476 $('.form-wrapper .sk-wandering-cubes').remove(); 2477 data = data 2478 .replace(/[\r\n]/g, '') 2479 .replace(/^.+(<form)/img, '$1') 2480 .replace(/(<\/form[^>]>).+$/img, '$1'); 2481 2482 if ($(data).data('wrapper') == 'form') { 2483 done(data); 2484 } else { 2485 popupWrapper.addClass(popupErrorClass); 2486 } 2487 }, function () { 2488 popupWrapper.addClass(popupErrorClass); 2489 }); 2490 2491 if (button.data('type') == 'order') { 2492 $Mediator.on({ 2493 name: 'set:result', 2494 context: button, 2495 handlers: setResult 2496 }); 2497 } 2498 } 2499 2500 function _done () { 2501 button.removeAttr('disabled'); 2502 _mainClass.popupClose(); 2503 } 2504 2505 function done (data) { 2506 var form = $(data).filter('form'), 2507 images = $('img', form), 2508 count = images.length; 2509 2510 if ($Params.hasTouch) { 2511 start = document.body.scrollTop; 2512 setTimeout(function () { 2513 $(window).scrollTop(start); 2514 }, 0); 2515 } 2516 2517 reset(); 2518 popupTarget.prepend(form); 2519 2520 if (count) { 2521 images.each(function () { 2522 if (this.complete) { 2523 count--; 2524 } else { 2525 $(this).on('load', function () { 2526 count--; 2527 2528 if (!count) { 2529 set(); 2530 } 2531 }); 2532 } 2533 }); 2534 2535 if (!count) { 2536 set(); 2537 } 2538 } else { 2539 set(); 2540 } 2541 2542 // $Mediator.fire('content:change', form); 2543 // $('input, textarea, select', form).filter(':visible').eq(0).focus(); 2544 form.data('additional', $Common.getFormData(form.serialize())); 2545
2546 function set () { 2547 popupScroll.set($('[data-wrapper="scroll"]', form)); 2548 $Mediator.fire('content:change', form); 2549 form 2550 .on('height:input', function () { 2551 popupScroll.item.refresh(); 2552 }); 2553 2554 setTimeout(function () { 2555 $Input.prepareInput({ 2556 context: form, 2557 // selector: 'textarea', 2558 // callback: function () {} 2559 }); 2560 }, 0); 2561 } 2562 } 2563 2564 function reset () { 2565 $(formSelector, popupTarget).remove(); 2566 popupWrapper 2567 .removeClass(popupErrorClass) 2568 .removeClass(popupLoadingClass); 2569 } 2570 }, 2571 popupClose: function () { 2572 $(root).removeClass(popupActiveClass); 2573 popupScroll.destroy(); 2574 popupWrapper.removeClass(popupErrorClass); 2575 } 2576 }); 2577 2578 popupScroll = { 2579 options: $Common.clone(iscrollOptions.common, iscrollOptions.Y, { 2580 click: false 2581 }), 2582 set: function (wrapper) { 2583 this.wrapper = wrapper; 2584 2585 if (!iDeviceMode) { 2586 this.item = new IScroll(wrapper.get(0), this.options); 2587 } 2588 2589 this.setHeight(); 2590 2591 if (window.BX && BX.UserConsent) { 2592 this.control = BX.UserConsent.load(BX(wrapper.get(0))); 2593 BX.onCustomEvent('submit-form', []); 2594 BX.addCustomEvent( 2595 this.control, 2596 BX.UserConsent.events.save, 2597 function (data) { 2598 popupScroll.accepted = true; 2599 } 2600 ); 2601 BX.addCustomEvent( 2602 this.control, 2603 BX.UserConsent.events.accepted, 2604 function () { 2605 popupScroll.accepted = true; 2606 } 2607 ); 2608 BX.addCustomEvent( 2609 this.control, 2610 BX.UserConsent.events.refused, 2611 function () { 2612 delete popupScroll.accepted; 2613 } 2614 ); 2615 } 2616 }, 2617 refresh: function () { 2618 if (!iDeviceMode) { 2619 setTimeout(function () { 2620 this.item.refresh(); 2621 }.bind(this), 0); 2622 } 2623 }, 2624 destroy: function () { 2625 delete this.accepted; 2626 2627 if (!iDeviceMode) { 2628 if (this.item) { 2629 this.item.scroller.removeAttribute('style'); 2630 this.item.destroy(); 2631 delete this.item; 2632 } 2633 } 2634 2635 if (this.wrapper) { 2636 delete this.wrapper; 2637 } 2638 }, 2639 check: function (e, data) { 2640 if (data !== undefined) { 2641 this.dims = data; 2642 this.setHeight(); 2643 } 2644 }, 2645 setHeight: function () { 2646 if (this.wrapper) { 2647 setTimeout(function () { 2648 if (iDeviceMode) { 2649 this.wrapper.height(Math.min(this.wrapper.get(0).scrollHeight, this.dims.innerHeight - 50)); 2650 } else { 2651 this.wrapper.height(Math.min(this.item.scroller.offsetHeight, this.dims.innerHeight - 50)); 2652 this.refresh(); 2653 } 2654 }.bind(this), 0); 2655 } 2656 }, 2657 resetHeight: function () { 2658 if (this.wrapper) { 2659 this.wrapper.height('auto'); 2660 2661 if (!iDeviceMode) { 2662 this.refresh(); 2663 } 2664 } 2665 } 2666 }; 2667 2668 setCartCount(); 2669 2670 $('[data-item="form"]').each(function () { 2671 var item = $(this), 2672 id = item.data('id'), 2673 button = $('[data-action="form"][data-type="order"]', item), 2674 result = getCartCount(id); 2675 2676 if (result) { 2677 button.attr('data-count', result); 2678 } else { 2679 button.removeAttr('data-count'); 2680 } 2681 }); 2682 $Mediator.on('window:resize', popupScroll.check.bind(popupScroll)); 2683 2684 $(document) 2685 .on('click', '[data-action="form"]', _mainClass.popupOpen) 2686 .on('click', '[data-action="change"]', function () { 2687 var item = $(this), 2688 id = item.data('id'), 2689 wrapper = item.closest('[data-wrapper="change"]'), 2690 form = $('[data-wrapper="form"][data-id="' + id + '"]', wrapper); 2691 2692 if (form.length) { 2693 item.closest('[data-wrapper="form"]').addClass('form-hidden'); 2694 form.removeClass('form-hidden'); 2695 $('input, select, textarea', form).eq(0).focus(); 2696 } 2697 }) 2698 .on('click', '[data-wrapper="social"] [data-action="toggle"]', function () { 2699 $(this).closest('[data-wrapper="social"]').toggleClass('social-active'); 2700 }) 2701 .on('click', '[data-action="list"][data-type="delete"]', function () { 2702 2703 }); 2704 2705 popupWrapper 2706 .on('input', '[data-item="count"]', function () { 2707 var form = $(this).closest('[data-wrapper="form"]'), 2708 additional = form.data('additional'); 2709 2710 if (!additional) { 2711 additional = {}; 2712 } 2713 2714 this.value = this.value.replace(/[^\d]/g, ''); 2715 additional[this.name] = this.value; 2716 form.data('additional', additional); 2717 }) 2718 .on('click', '[data-action="count"]', function () { 2719 var button = $(this), 2720 type = button.data('type'), 2721 wrapper = button.closest('[data-wrapper="count"]'), 2722 input = $('[data-item="count"]', wrapper), 2723 name = input.attr('name'), 2724 value = Number(input.val()), 2725 form = button.closest('[data-wrapper="form"]'), 2726 additional = form.data('additional'); 2727 2728 if (!additional) { 2729 additional = {}; 2730 } 2731 2732 if (value) { 2733 switch (type) { 2734 case 'less': 2735 if (value > 1) { 2736 value--; 2737 } 2738 2739 break; 2740 case 'more': 2741 value++; 2742 break; 2743 } 2744 2745 additional[name] = value; 2746 input.val(value); 2747 form.data('additional', additional); 2748 } 2749 }) 2750 .on('click', '[data-action="close"]', _mainClass.popupClose) 2751 .on('submit', formSelector, popupSend); 2752 2753 function popupSend (e) { 2754 e.preventDefault(); 2755 2756 if (popupScroll.control && !popupScroll.accepted) { 2757 return; 2758 } 2759 2760 var form = $(formSelector, popupWrapper), 2761 options = _mainClass.getOptions(form.attr('action'), form.data('param')), 2762 sendParam = { 2763 method: _mainClass.getMethod(form), 2764 dataType: 'json' 2765 }, 2766 button = form.find('.form-button'), 2767 param = _mainClass.getSendParam(options, sendParam, $Common.getFormData(form.serialize())); 2768 2769 $(button).attr('disabled', true); 2770 2771 _mainClass.send(param, function (data) { 2772 if (data.success) { 2773 // $('[data-item="success"]', form).replaceWith(data.success); 2774 // $('[data-item="error"]', form).empty(); 2775 // popupScroll.setHeight(); 2776 $(popupScroll.wrapper).replaceWith(data.success); 2777 $(button).attr('disabled', false); 2778 popupScroll.destroy(); 2779 } else if (data.error) { 2780 $(button).attr('disabled', false); 2781 $('[data-wrapper="field"]', form).each(function () { 2782 var field = $(this), 2783 elements = $('input, select, textarea', field), 2784 name = elements.eq(0).attr('name'); 2785 2786 if (data.error[name]) { 2787 field.addClass(errorFieldClass); 2788 field.attr('data-error-message', data.error[name]); 2789 } else { 2790 field.removeClass(errorFieldClass); 2791 field.removeAttr('data-error-message'); 2792 } 2793 }); 2794 popupScroll.setHeight(); 2795 // popupWrapper.addClass(popupErrorClass); 2796 } 2797 }, function () { 2798 // popupWrapper.addClass(popupErrorClass); 2799 }); 2800 } 2801 2802 function setResult (e, result) { 2803 if (result) { 2804 this.attr('data-count', result); 2805 } else { 2806 this.removeAttr('data-count'); 2807 } 2808 } 2809 2810 function getJSON (data) { 2811 return JSON.parse(data 2812 .replace(/'[\r\n\s]*?:[\r\n\s]*?'/g, '":"') 2813 .replace(/'[\r\n\s]*?,[\r\n\s]*?'/g, '","') 2814 .replace(/\{[\r\n\s]*?'/g, '{"') 2815 .replace(/'[\r\n\s]*?\}/g, '"}')); 2816 } 2817 2818 function __done (redirect) { 2819 location.href = redirect; 2820 } 2821 2822 function setCartCount () { 2823 var staff = cartItem.data('staff'); 2824 2825 if (!staff) { 2826 return; 2827 } 2828 2829 if (staff) { 2830 var result = {}; 2831 2832 staff 2833 .replace(/^\{/, '') 2834 .replace(/\}$/, '') 2835 .split(',') 2836 .forEach(function (value) { 2837 value = value.split(':'); 2838 result[value[0]] = value[1]; 2839 }); 2840 2841 cartItem 2842 .removeAttr('staff') 2843 .data('staff', result); 2844 } 2845 } 2846 2847 function getCartCount (id) { 2848 var staff = cartItem.data('staff'); 2849 2850 if (id && staff) { 2851 return staff[id]; 2852 } 2853 } 2854 }); 2855 }(); 2856 2857 $Mediator.on({ 2858 name: 'content:change', 2859 track: true, 2860 handlers: function (e, context) { 2861 $('[data-wrapper="screenshots"]', context).slick({ 2862 dots: true, 2863 infinite: true, 2864 speed: 300, 2865 slidesToShow: 1, 2866 adaptiveHeight: true 2867 }); 2868 2869 $('[data-wrapper="slider"] [data-content="slider"]', context).each(function () { 2870 var item = $(this), 2871 wrapper = item.closest('[data-wrapper="slider"]'), 2872 data = { 2873 adaptiveHeight: true, 2874 prevArrow: $('[data-action="slider"][data-type="next"]'), 2875 nextArrow: $('[data-action="slider"][data-type="prev"]') 2876 }; 2877 2878 if ('autoplay' in wrapper.data()) { 2879 data.autoplay = true; 2880 data.autoplaySpeed = wrapper.data('autoplay') || 3000; 2881 } 2882 2883 item.slick(data); 2884 }); 2885 2886 $('[data-carousel]', context).slick({ 2887 slidesToShow: 5, 2888 slidesToScroll: 1, 2889 dots: false, 2890 prevArrow: $('[data-carousel-prev]'), 2891 nextArrow: $('[data-carousel-next]'),
2892 responsive: [ 2893 { 2894 breakpoint: 768, 2895 settings: { 2896 slidesToShow: 4 2897 } 2898 }, 2899 { 2900 breakpoint: 640, 2901 settings: { 2902 slidesToShow: 2 2903 } 2904 } 2905 ] 2906 }); 2907 2908 $('[data-mobile-carousel]', context).slick({ 2909 slidesToShow: 3, 2910 slidesToScroll: 1, 2911 dots: false, 2912 prevArrow: $('[data-mobile-carousel-prev]'), 2913 nextArrow: $('[data-mobile-carousel-next]'), 2914 arrows: false, 2915 responsive: [ 2916 { 2917 breakpoint: 640, 2918 settings: { 2919 slidesToShow: 2, 2920 arrows: true 2921 } 2922 }, 2923 { 2924 breakpoint: 550, 2925 settings: { 2926 slidesToShow: 1, 2927 arrows: true 2928 } 2929 } 2930 ] 2931 }); 2932 2933 // $('[data-wrapper="field"] select', context).select2({ 2934 // minimumResultsForSearch: Infinity 2935 // }); 2936 setTimeout(function () { 2937 $('[data-wrapper="field"] select', context).styler({ 2938 selectSearch: true 2939 }); 2940 window.dispatchEvent(new Event('resize')); 2941 }); 2942 2943 $('main table', context).each(function () { 2944 var table = $(this), 2945 width = table.attr('width'), 2946 wrapper, 2947 scrollOptions = $Common.clone(iscrollOptions.common, iscrollOptions.X); 2948 2949 table.wrap($('<div>', { 2950 'data-wrapper': 'table', 2951 'class': 'table-wrapper' 2952 })); 2953 2954 if (width) { 2955 table 2956 .removeAttr('width') 2957 .css({ 2958 'min-width': width + 'px' 2959 }); 2960 } 2961 2962 wrapper = table.closest('[data-wrapper="table"]'); 2963 wrapper.data('scroll', new IScroll(wrapper.get(0), scrollOptions)); 2964 }); 2965 2966 $('main img', context).each(function () { 2967 var image = $(this), 2968 width = image.attr('width'), 2969 height = image.attr('height'); 2970 2971 if (width) { 2972 image 2973 .removeAttr('width') 2974 .css({ 2975 'max-width': width + 'px' 2976 }); 2977 } 2978 2979 if (height) { 2980 image 2981 .removeAttr('height') 2982 .css({ 2983 'max-height': height + 'px' 2984 }); 2985 } 2986 }); 2987 } 2988 }); 2989 2990 $(function () { 2991 var searchActiveClass = 'search-active'; 2992 2993 checkPageWidth(); 2994 checkPageScroll(); 2995 $Mediator.fire('content:change'); 2996 2997 $(document) 2998 .on('focus', '[data-wrapper="search"] input', function () { 2999 $(this).closest('[data-wrapper="search"]').addClass(searchActiveClass); 3000 }) 3001 .on('blur', '[data-wrapper="search"] input', function () { 3002 $(this).closest('[data-wrapper="search"]').removeClass(searchActiveClass); 3003 }); 3004 }); 3005 3006 return _mainClass; 3007 3008 function getParam (element, name) { 3009 var param = element.data(name) || get('item') || get('wrapper'); 3010 3011 if (param) { 3012 element.data(name, param); 3013 } 3014 3015 return param; 3016 3017 function get (part) { 3018 return element.closest('[data-' + part + '="form"]').data(name); 3019 } 3020 } 3021 3022 function getFullParam (element, name, _name) { 3023 var result = element.data(name); 3024 3025 switch ($Common.getType(result)) { 3026 case 'Object': 3027 return done(); 3028 break; 3029 default: 3030 var value = getParam(element, name); 3031 3032 if (value) { 3033 result = redefine(value); 3034 element.removeAttr('data-' + name); 3035 element.data(name, result); 3036 return done(); 3037 } 3038 3039 break; 3040 } 3041 3042 function redefine (data) { 3043 var _result = {}; 3044 3045 data 3046 .replace(/^\{/, '') 3047 .replace(/\}$/, '') 3048 .split(',') 3049 .forEach(function (pair) { 3050 pair = pair.split(/\s*:\s*/); 3051 _result[pair[0]] = pair[1]; 3052 }); 3053 return _result; 3054 } 3055 3056 function done () { 3057 return _name ? result[_name] : result; 3058 } 3059 } 3060 3061 function getParameters () { 3062 var params = location.search.slice(1), 3063 result = {}; 3064 3065 if (params) { 3066 params.split('&').forEach(function (value) { 3067 var values = value.split('='); 3068 3069 result[values[0]] = values[1]; 3070 }); 3071 } 3072 3073 return result; 3074 } 3075 3076 function checkPageWidth () { 3077 $Mediator.fire('window:resize', { 3078 innerWidth: window.innerWidth, 3079 innerHeight: window.innerHeight, 3080 scrollTop: root.scrollTop, 3081 scrollLeft: root.scrollLeft 3082 }); 3083 } 3084 3085 function checkPageScroll () { 3086 $Mediator.fire('window:scroll', { 3087 scrollTop: root.scrollTop 3088 }); 3089 } 3090 3091 function getTemplate (item) { 3092 if (item) { 3093 return item.text() 3094 .replace(/^\s+/, '') 3095 .replace(/\s+$/, '') 3096 .replace(/>[\s\r\n]+</, '><'); 3097 } 3098 } 3099}(); 3100 3101var $Tariff = function () { 3102 $(document) 3103 .on('click', '.table-toggle-title', function () { 3104 $(this).parent().toggleClass('open'); 3105 }) 3106 .on('mouseover', '.tooltipe sup', function () { 3107 $(this).parent().find('.tooltipe-text').fadeIn(); 3108 }) 3109 .on('mouseleave', '.tooltipe sup', function () { 3110 $(this).parent().find('.tooltipe-text').fadeOut(); 3111 }) 3112 .on('click', '.tariff-table-order', function () { 3113 $('body').find('.form-wrapper.form-popup').addClass('tariff-form-popup'); 3114 }) 3115 .on('click', '._scroll-target', function (e) { 3116 e.preventDefault(); 3117 $('html, body').animate({ 3118 scrollTop: $("div.table-toggle-wrapper").offset().top 3119 }, 1000) 3120 $('.table-toggle-wrapper').addClass('open'); 3121 }) 3122 .on('focus', '.main-search-input', function(){ 3123 if ( /^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { 3124 $('html, body').animate({ 3125 scrollTop: $(".page-wrapper").offset().top 3126 }, 1000) 3127 } 3128 }) 3129 // .on('click', '.tariff-form-popup form .form-button', function (e) { 3130 // if(!$('.tariff-form-popup form').children('input.tel').length > 0 ) { 3131 // let error=0; 3132 // let phone = $("input.tel").val(); 3133 // if(!isValidPhone(phone) ){ 3134 // error=2; 3135 // $("input.tel").parent().parent() 3136 // .addClass('error-field') 3137 // .attr('data-error-message', "ÐепÑавилÑнÑй номеÑ" ); 3138 // window.dispatchEvent(new Event('resize')); 3139 // } 3140 // else { 3141 // $("input.tel").parent().parent() 3142 // .removeClass('error-field') 3143 // .removeAttr('data-error-message'); 3144 // window.dispatchEvвапent(new Event('resize')); 3145 // } 3146 // } 3147 // if(error==0){ 3148 // return true; 3149 // } 3150 // else{ 3151 // return false;
3152 // } 3153 // }) 3154 .on('mouseup', 'body', function (e) { 3155 var div = $(".main-user-consent-request-popup-cont"); 3156 var popup = $(".form-popup"); 3157 if ((!div.is(e.target) && !popup.is(e.target) ) 3158 && (div.has(e.target).length === 0 && popup.has(e.target).length === 0)) { 3159 $('html').removeClass('form-popup-active'); 3160 } 3161 }); 3162 function isValidPhone(phoneNumber) { 3163 var pattern = new RegExp(/^((8|\+7)[\-]?)?(\(?\d{3}\)?[\-]?)?[\d\-]{7,10}$/); 3164 return pattern.test(phoneNumber); 3165 } 3166 3167 $(document).scroll(function() { 3168 if ($(document).scrollTop() >= 70) { 3169 $('.page-header').addClass('sticky'); 3170 } else { 3171 $('.page-header').removeClass('sticky'); 3172 } 3173 }); 3174 3175}(); 3176 3177 3178 3179 3180// console.log() 3181// arguments.callee.caller
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.