1(function (root, factory) { 2 //amd 3 if (typeof define === "function" && define.amd) { 4 define(['sprintf-js'], function (sprintf) { 5 return factory(sprintf.vsprintf); 6 }); 7 8 //commonjs 9 } else if (typeof module === "object" && module.exports) { 10 module.exports = factory(require('sprintf-js').vsprintf); 11 12 //global 13 } else { 14 root.I18nTranslator = factory(window.vsprintf); 15 } 16 17 var i18n = new I18nTranslator(TRANSLATIONS); 18 window['__'] = function (sMsg, sGroupID) { 19 return i18n.p__(sGroupID, sMsg); 20 }; 21 22 window['__pn'] = function (sMsgID, sGroupID, iValue) { 23 if (iValue === undefined || I18N_FN.isNumber(iValue) === false) { 24 iValue = 0; 25 } 26 return i18n.np__(sGroupID, sMsgID, sMsgID + '.PLURAL', iValue); 27 }; 28 29 window['__sl'] = function (languageCode) { 30 if (!languageCode) { 31 console.error('Language code is required for __sl'); 32 return false; 33 } 34 35 // ì¸ì´ì½ë íì ê²ì¦ (en_US ê°ì 5ì리 íì) 36 if (!/^[a-z]{2}_[A-Z]{2}$/.test(languageCode)) { 37 console.error('Invalid language code format. Expected format: en_US (5 characters)'); 38 return false; 39 } 40 41 // G2G íê²½ ì²´í¬ 42 if (!window.CAFE24?.SHOP?.isG2G?.() && !window.CAFE24?.SHOP?.isGlobale?.()) { 43 console.error('Language switching is only available in G2G environment'); 44 return false; 45 } 46 47 try { 48 // íì¬ ìê°ì ë²ì ì¼ë¡ ì¬ì© 49 var currentTime = new Date().getTime(); 50 var apiUrl = '/ind-script/i18n.php?v=' + currentTime + '&lang=' + languageCode + '&domain=front&type=G2G&format=json'; 51 52 fetch(apiUrl) 53 .then(function(response) { 54 if (!response.ok) { 55 throw new Error('HTTP error! status: ' + response.status); 56 } 57 return response.json(); 58 }) 59 .then(function(translationData) { 60 // ìëµ ë°ì´í° ê²ì¦ (íì í¤ë¤ ì²´í¬) 61 if (!translationData || 62 !translationData.domain || 63 !translationData['plural-forms'] || 64 !translationData.messages 65 ) { 66 console.error('Invalid translation data format'); 67 return; 68 } 69 70 // 기존 ë²ì ë°ì´í° ì´ê¸°í 71 i18n.dictionary = {}; 72 i18n.plurals = {}; 73 i18n.domain = null; 74 75 // ìë¡ì´ ë²ì ë°ì´í° ë¡ë 76 i18n.loadTranslations(translationData); 77 78 console.log('Language switched to:', languageCode); 79 }) 80 .catch(function(error) { 81 console.error('Failed to load language:', languageCode, error); 82 }); 83 } catch (error) { 84 console.error('Error in __sl function:', error); 85 return false; 86 } 87 }; 88}(this, function (vsprintf) { 89 "use strict"; 90 function I18nTranslator (translations) { 91 this.dictionary = {}; 92 this.plurals = {}; 93 this.domain = null; 94 95 if (translations) { 96 this.loadTranslations(translations); 97 } 98 } 99 100 I18nTranslator.prototype = { 101 loadTranslations: function (translations) { 102 var domain = translations.domain || ''; 103 104 if (this.domain === null) { 105 this.domain = domain; 106 } 107 108 if (this.dictionary[domain]) { 109 mergeTranslations(this.dictionary[domain], translations.messages); 110 return this; 111 } 112 113 if (translations.fn) { 114 this.plurals[domain] = { fn: translations.fn }; 115 } else if (translations['plural-forms']) { 116 var plural = translations['plural-forms'].split(';', 2); 117 118 this.plurals[domain] = { 119 count: parseInt(plural[0].replace('nplurals=', '')), 120 code: plural[1].replace('plural=', 'return ') + ';' 121 }; 122 } 123 124 this.dictionary[domain] = translations.messages; 125 126 return this; 127 }, 128 129 defaultDomain: function (domain) { 130 this.domain = domain; 131 132 return this; 133 }, 134 135 gettext: function (original) { 136 return this.dpgettext(this.domain, null, original); 137 }, 138 139 ngettext: function (original, plural, value) { 140 return this.dnpgettext(this.domain, null, original, plural, value); 141 }, 142 143 dngettext: function (domain, original, plural, value) { 144 return this.dnpgettext(domain, null, original, plural, value); 145 }, 146 147 npgettext: function (context, original, plural, value) { 148 return this.dnpgettext(this.domain, context, original, plural, value); 149 }, 150 151 pgettext: function (context, original) { 152 return this.dpgettext(this.domain, context, original); 153 }, 154 155 dgettext: function (domain, original) { 156 return this.dpgettext(domain, null, original); 157 }, 158 159 dpgettext: function (domain, context, original) { 160 var translation = getTranslation(this.dictionary, domain, context, original); 161 162 if (translation !== false && translation[0] !== '') { 163 return translation[0]; 164 } 165 166 return original; 167 }, 168 169 dnpgettext: function (domain, context, original, plural, value) { 170 var index = getPluralIndex(this.plurals, domain, value); 171 var translation = getTranslation(this.dictionary, domain, context, original); 172 173 if (translation[index] && translation[index] !== '') { 174 return translation[index]; 175 } 176 177 return (index === 0) ? original : plural; 178 }, 179 180 __: function (original) { 181 return format( 182 this.gettext(original), 183 Array.prototype.slice.call(arguments, 1) 184 ); 185 }, 186 187 n__: function (original, plural, value) { 188 return format( 189 this.ngettext(original, plural, value), 190 Array.prototype.slice.call(arguments, 3) 191 ); 192 }, 193 194 p__: function (context, original) { 195 return format( 196 this.pgettext(context, original), 197 Array.prototype.slice.call(arguments, 2) 198 ); 199 }, 200 201 d__: function (domain, original) { 202 return format( 203 this.dgettext(domain, original), 204 Array.prototype.slice.call(arguments, 2) 205 ); 206 }, 207 208 dp__: function (domain, context, original) { 209 return format( 210 this.dgettext(domain, context, original), 211 Array.prototype.slice.call(arguments, 3) 212 ); 213 }, 214 215 np__: function (context, original, plural, value) { 216 return format( 217 this.npgettext(context, original, plural, value), 218 Array.prototype.slice.call(arguments, 4) 219 ); 220 }, 221 222 dnp__: function (domain, context, original, plural, value) { 223 return format( 224 this.dnpgettext(domain, context, original, plural, value), 225 Array.prototype.slice.call(arguments, 5) 226 ); 227 } 228 }; 229 230 function getTranslation(dictionary, domain, context, original) { 231 context = context || ''; 232 233 if (!dictionary[domain] || !dictionary[domain][context] || !dictionary[domain][context][original]) { 234 return false;
235 } 236 237 try { 238 I18N_LOG_COLLECT.set(original, context); 239 } catch (e) {} 240 241 return dictionary[domain][context][original]; 242 } 243 244 function getPluralIndex(plurals, domain, value) { 245 if (!plurals[domain]) { 246 return value == 1 ? 0 : 1; 247 } 248 249 if (!plurals[domain].fn) { 250 plurals[domain].fn = new Function('n', plurals[domain].code); 251 } 252 253 return plurals[domain].fn.call(this, value) + 0; 254 } 255 256 function mergeTranslations(translations, newTranslations) { 257 for (var context in newTranslations) { 258 if (!translations[context]) { 259 translations[context] = newTranslations[context]; 260 continue; 261 } 262 263 for (var original in newTranslations[context]) { 264 translations[context][original] = newTranslations[context][original]; 265 } 266 } 267 } 268 269 function format (text, args) { 270 if (!args.length) { 271 return text; 272 } 273 274 if (args[0] instanceof Array) { 275 return vsprintf(text, args[0]); 276 } 277 278 return vsprintf(text, args); 279 } 280 281 return I18nTranslator; 282})); 283 284/** 285 * i18n ê´ë ¨ í¨ì 모ì 286 * @type {{ordinalSuffixes: string[], ordinalNumber: I18N_FN.ordinalNumber}} 287 */ 288var I18N_FN = { 289 ordinalSuffixes: ['th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th'], 290 291 ordinalNumber: function (iValue) { 292 if (iValue === undefined) { 293 return ''; 294 } 295 296 var iNum = String(iValue).replace(/,/g, ""); 297 if (this.isNumber(iNum) === false) { 298 return iValue; 299 } 300 if (__('__LANGUAGE.CODE__') !== 'en_US') { 301 return iValue; 302 } 303 iNum = Math.abs(iNum); 304 iNum = parseFloat(iNum); 305 if (((iNum % 100) >= 11 && ((iNum % 100) <= 13)) || iNum % 1 != 0) { 306 return iValue + 'th'; 307 } 308 309 return iValue + this.ordinalSuffixes[iNum % 10]; 310 }, 311 isNumber: function (v) { 312 return /^[+-]?\d*(\.?\d*)$/.test(v); 313 } 314}; 315 316var I18N_LOG_COLLECT = { 317 aTranslationCodes: [], 318 bIsCallApiOnLoaded: false, 319 request_url: window.location.pathname, 320 321 call: function () { 322 var data = I18N_LOG_COLLECT.aTranslationCodes; 323 if (data.length === 0) { 324 return false; 325 } 326 I18N_LOG_COLLECT.aTranslationCodes = []; 327 $.ajax({ 328 url: '/exec/common/translate/logging', 329 data: {"data": data}, 330 type: 'POST', 331 dataType: 'json', 332 success: function (aData) {} 333 }); 334 }, 335 set: function (sMsg_id, sGroup_id) { 336 if (typeof CAFE24.TRANSLATE_LOG_STATUS === 'undefined' || CAFE24.TRANSLATE_LOG_STATUS !== 'T') { 337 return; 338 } 339 340 var item = { 341 'request_url': I18N_LOG_COLLECT.request_url, 342 'msg_id': sMsg_id, 343 'group_id': sGroup_id 344 }; 345 346 if (I18N_LOG_COLLECT.bIsCallApiOnLoaded) { 347 I18N_LOG_COLLECT.aTranslationCodes.push(item); 348 I18N_LOG_COLLECT.call(); 349 return true; 350 } 351 I18N_LOG_COLLECT.aTranslationCodes.push(item); 352 }, 353 loadComplete: function () { 354 I18N_LOG_COLLECT.bIsCallApiOnLoaded = true; 355 I18N_LOG_COLLECT.call(); 356 } 357}; 358 359if (typeof CAFE24.TRANSLATE_LOG_STATUS !== 'undefined' && CAFE24.TRANSLATE_LOG_STATUS === 'T') { 360 if (document.addEventListener) { 361 document.addEventListener("DOMContentLoaded", function () { 362 I18N_LOG_COLLECT.loadComplete(); 363 }, false); 364 } else if (document.attachEvent) { 365 document.attachEvent("onreadystatechange", function () { 366 if (document.readyState === "complete") { 367 document.detachEvent("onreadystatechange", arguments.callee); 368 I18N_LOG_COLLECT.loadComplete(); 369 } 370 }); 371 } 372} 373/*! 374 * jQuery JavaScript Library v3.6.0 375 * https://jquery.com/ 376 * 377 * Includes Sizzle.js 378 * https://sizzlejs.com/ 379 * 380 * Copyright OpenJS Foundation and other contributors 381 * Released under the MIT license 382 * https://jquery.org/license 383 * 384 * Date: 2021-03-02T17:08Z 385 */ 386( function( global, factory ) { 387 388 "use strict"; 389 390 if ( typeof module === "object" && typeof module.exports === "object" ) { 391 392 // For CommonJS and CommonJS-like environments where a proper `window` 393 // is present, execute the factory and get jQuery. 394 // For environments that do not have a `window` with a `document` 395 // (such as Node.js), expose a factory as module.exports. 396 // This accentuates the need for the creation of a real `window`. 397 // e.g. var jQuery = require("jquery")(window); 398 // See ticket #14549 for more info. 399 module.exports = global.document ? 400 factory( global, true ) : 401 function( w ) { 402 if ( !w.document ) { 403 throw new Error( "jQuery requires a window with a document" ); 404 } 405 return factory( w ); 406 }; 407 } else { 408 factory( global ); 409 } 410 411// Pass this if window is not defined yet 412} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { 413 414// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 415// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode 416// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), str
vendor: 14,290 bytes, lines 416-882
416ict mode should be common 417// enough that all such attempts are guarded in a try block. 418 "use strict"; 419 420 var arr = []; 421 422 var getProto = Object.getPrototypeOf; 423 424 var slice = arr.slice; 425 426 var flat = arr.flat ? function( array ) { 427 return arr.flat.call( array ); 428 } : function( array ) { 429 return arr.concat.apply( [], array ); 430 }; 431 432 433 var push = arr.push; 434 435 var indexOf = arr.indexOf; 436 437 var class2type = {}; 438 439 var toString = class2type.toString; 440 441 var hasOwn = class2type.hasOwnProperty; 442 443 var fnToString = hasOwn.toString; 444 445 var ObjectFunctionString = fnToString.call( Object ); 446 447 var support = {}; 448 449 var isFunction = function isFunction( obj ) { 450 451 // Support: Chrome <=57, Firefox <=52 452 // In some browsers, typeof returns "function" for HTML <object> elements 453 // (i.e., `typeof document.createElement( "object" ) === "function"`). 454 // We don't want to classify *any* DOM node as a function. 455 // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 456 // Plus for old WebKit, typeof returns "function" for HTML collections 457 // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) 458 return typeof obj === "function" && typeof obj.nodeType !== "number" && 459 typeof obj.item !== "function"; 460 }; 461 462 463 var isWindow = function isWindow( obj ) { 464 return obj != null && obj === obj.window; 465 }; 466 467 468 var document = window.document; 469 470 471 472 var preservedScriptAttributes = { 473 type: true, 474 src: true, 475 nonce: true, 476 noModule: true 477 }; 478 479 function DOMEval( code, node, doc ) { 480 doc = doc || document; 481 482 var i, val, 483 script = doc.createElement( "script" ); 484 485 script.text = code; 486 if ( node ) { 487 for ( i in preservedScriptAttributes ) { 488 489 // Support: Firefox 64+, Edge 18+ 490 // Some browsers don't support the "nonce" property on scripts. 491 // On the other hand, just using `getAttribute` is not enough as 492 // the `nonce` attribute is reset to an empty string whenever it 493 // becomes browsing-context connected. 494 // See https://github.com/whatwg/html/issues/2369 495 // See https://html.spec.whatwg.org/#nonce-attributes 496 // The `node.getAttribute` check was added for the sake of 497 // `jQuery.globalEval` so that it can fake a nonce-containing node 498 // via an object. 499 val = node[ i ] || node.getAttribute && node.getAttribute( i ); 500 if ( val ) { 501 script.setAttribute( i, val ); 502 } 503 } 504 } 505 doc.head.appendChild( script ).parentNode.removeChild( script ); 506 } 507 508 509 function toType( obj ) { 510 if ( obj == null ) { 511 return obj + ""; 512 } 513 514 // Support: Android <=2.3 only (functionish RegExp) 515 return typeof obj === "object" || typeof obj === "function" ? 516 class2type[ toString.call( obj ) ] || "object" : 517 typeof obj; 518 } 519 /* global Symbol */ 520// Defining this global in .eslintrc.json would create a danger of using the global 521// unguarded in another place, it seems safer to define global only for this module 522 523 524 525 var 526 version = "3.6.0", 527 528 // Define a local copy of jQuery 529 jQuery = function( selector, context ) { 530 531 // The jQuery object is actually just the init constructor 'enhanced' 532 // Need init if jQuery is called (just allow error to be thrown if not included) 533 return new jQuery.fn.init( selector, context ); 534 }; 535 536 jQuery.fn = jQuery.prototype = { 537 538 // The current version of jQuery being used 539 jquery: version, 540 541 constructor: jQuery, 542 543 // The default length of a jQuery object is 0 544 length: 0, 545 546 toArray: function() { 547 return slice.call( this ); 548 }, 549 550 // Get the Nth element in the matched element set OR 551 // Get the whole matched element set as a clean array 552 get: function( num ) { 553 554 // Return all the elements in a clean array 555 if ( num == null ) { 556 return slice.call( this ); 557 } 558 559 // Return just the one element from the set 560 return num < 0 ? this[ num + this.length ] : this[ num ]; 561 }, 562 563 // Take an array of elements and push it onto the stack 564 // (returning the new matched element set) 565 pushStack: function( elems ) { 566 567 // Build a new jQuery matched element set 568 var ret = jQuery.merge( this.constructor(), elems ); 569 570 // Add the old object onto the stack (as a reference) 571 ret.prevObject = this; 572 573 // Return the newly-formed element set 574 return ret; 575 }, 576 577 // Execute a callback for every element in the matched set. 578 each: function( callback ) { 579 return jQuery.each( this, callback ); 580 }, 581 582 map: function( callback ) { 583 return this.pushStack( jQuery.map( this, function( elem, i ) { 584 return callback.call( elem, i, elem ); 585 } ) ); 586 }, 587 588 slice: function() { 589 return this.pushStack( slice.apply( this, arguments ) ); 590 }, 591 592 first: function() { 593 return this.eq( 0 ); 594 }, 595 596 last: function() { 597 return this.eq( -1 ); 598 }, 599 600 even: function() { 601 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 602 return ( i + 1 ) % 2; 603 } ) ); 604 }, 605 606 odd: function() { 607 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 608 return i % 2; 609 } ) ); 610 }, 611 612 eq: function( i ) { 613 var len = this.length, 614 j = +i + ( i < 0 ? len : 0 ); 615 return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); 616 }, 617 618 end: function() { 619 return this.prevObject || this.constructor(); 620 }, 621 622 // For internal use only. 623 // Behaves like an Array's method, not like a jQuery method. 624 push: push, 625 sort: arr.sort, 626 splice: arr.splice 627 }; 628 629 jQuery.extend = jQuery.fn.extend = function() { 630 var options, name, src, copy, copyIsArray, clone, 631 target = arguments[ 0 ] || {}, 632 i = 1, 633 length = arguments.length, 634 deep = false; 635 636 // Handle a deep copy situation 637 if ( typeof target === "boolean" ) { 638 deep = target; 639 640 // Skip the boolean and the target 641 target = arguments[ i ] || {}; 642 i++; 643 } 644 645 // Handle case when target is a string or something (possible in deep copy) 646 if ( typeof target !== "object" && !isFunction( target ) ) { 647 target = {}; 648 } 649 650 // Extend jQuery itself if only one argument is passed 651 if ( i === length ) { 652 target = this; 653 i--; 654 } 655 656 for ( ; i < length; i++ ) { 657 658 // Only deal with non-null/undefined values 659 if ( ( options = arguments[ i ] ) != null ) { 660 661 // Extend the base object 662 for ( name in options ) { 663 copy = options[ name ]; 664 665 // Prevent Object.prototype pollution 666 // Prevent never-ending loop 667 if ( name === "__proto__" || target === copy ) { 668 continue; 669 } 670 671 // Recurse if we're merging plain objects or arrays 672 if ( deep && copy && ( jQuery.isPlainObject( copy ) || 673 ( copyIsArray = Array.isArray( copy ) ) ) ) { 674 src = target[ name ]; 675 676 // Ensure proper type for the source value 677 if ( copyIsArray && !Array.isArray( src ) ) { 678 clone = []; 679 } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { 680 clone = {}; 681 } else { 682 clone = src; 683 } 684 copyIsArray = false; 685 686 // Never move original objects, clone them 687 target[ name ] = jQuery.extend( deep, clone, copy ); 688 689 // Don't bring in undefined values 690 } else if ( copy !== undefined ) { 691 target[ name ] = copy; 692 } 693 } 694 } 695 } 696 697 // Return the modified object 698 return target; 699 }; 700 701 jQuery.extend( { 702 703 // Unique for each copy of jQuery on the page 704 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), 705 706 // Assume jQuery is ready without the ready module 707 isReady: true, 708 709 error: function( msg ) { 710 throw new Error( msg ); 711 }, 712 713 noop: function() {}, 714 715 isPlainObject: function( obj ) { 716 var key; 717 718 // Detect obvious negatives 719 // Use toString instead of jQuery.type to catch host objects 720 if ( !obj || toString.call( obj ) !== "[object Object]" ) { 721 return false; 722 } 723 724 // Not own constructor property must be Object 725 if ( obj.constructor && 726 !hasOwn.call( obj, "constructor" ) && 727 !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) { 728 return false; 729 } 730 731 // Own properties are enumerated firstly, so to speed up, 732 // if last one is own, then all properties are own 733 for ( key in obj ) {} 734 735 return key === undefined || hasOwn.call( obj, key ); 736 }, 737 738 isEmptyObject: function( obj ) { 739 var name; 740 741 for ( name in obj ) { 742 return false; 743 } 744 return true; 745 }, 746 747 // Evaluates a script in a provided context; falls back to the global one 748 // if not specified. 749 globalEval: function( code, options, doc ) { 750 DOMEval( code, { nonce: options && options.nonce }, doc ); 751 }, 752 753 each: function( obj, callback ) { 754 var length, i = 0; 755 756 if ( isArrayLike( obj ) ) { 757 length = obj.length; 758 for ( ; i < length; i++ ) { 759 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 760 break; 761 } 762 } 763 } else { 764 for ( i in obj ) { 765 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 766 break; 767 } 768 } 769 } 770 771 return obj; 772 }, 773 774 // results is for internal usage only 775 makeArray: function( arr, results ) { 776 var ret = results || []; 777 778 if ( arr != null ) { 779 if ( isArrayLike( Object( arr ) ) ) { 780 jQuery.merge( ret, 781 typeof arr === "string" ? 782 [ arr ] : arr 783 ); 784 } else { 785 push.call( ret, arr ); 786 } 787 } 788 789 return ret; 790 }, 791 792 inArray: function( elem, arr, i ) { 793 return arr == null ? -1 : indexOf.call( arr, elem, i ); 794 }, 795 796 // Support: Android <=4.0 only, PhantomJS 1 only 797 // push.apply(_, arraylike) throws on ancient WebKit 798 merge: function( first, second ) { 799 var len = +second.length, 800 j = 0, 801 i = first.length; 802 803 for ( ; j < len; j++ ) { 804 first[ i++ ] = second[ j ]; 805 } 806 807 first.length = i; 808 809 return first; 810 }, 811 812 grep: function( elems, callback, invert ) { 813 var callbackInverse, 814 matches = [], 815 i = 0, 816 length = elems.length, 817 callbackExpect = !invert; 818 819 // Go through the array, only saving the items 820 // that pass the validator function 821 for ( ; i < length; i++ ) { 822 callbackInverse = !callback( elems[ i ], i ); 823 if ( callbackInverse !== callbackExpect ) { 824 matches.push( elems[ i ] ); 825 } 826 } 827 828 return matches; 829 }, 830 831 // arg is for internal usage only 832 map: function( elems, callback, arg ) { 833 var length, value, 834 i = 0, 835 ret = []; 836 837 // Go through the array, translating each of the items to their new values 838 if ( isArrayLike( elems ) ) { 839 length = elems.length; 840 for ( ; i < length; i++ ) { 841 value = callback( elems[ i ], i, arg ); 842 843 if ( value != null ) { 844 ret.push( value ); 845 } 846 } 847 848 // Go through every key on the object, 849 } else { 850 for ( i in elems ) { 851 value = callback( elems[ i ], i, arg ); 852 853 if ( value != null ) { 854 ret.push( value ); 855 } 856 } 857 } 858 859 // Flatten any nested arrays 860 return flat( ret ); 861 }, 862 863 // A global GUID counter for objects 864 guid: 1, 865 866 // jQuery.support is not used in Core but other projects attach their 867 // properties to it so it needs to exist. 868 support: support 869 } ); 870 871 if ( typeof Symbol === "function" ) { 872 jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; 873 } 874 875// Populate the class2type map 876 jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), 877 function( _i, name ) { 878 class2type[ "[object " + name + "]" ] = name.toLowerCase(); 879 } ); 880 881 function isArrayLike( obj ) { 882
vendor: 7,133 bytes, lines 883-1057
883 // Support: real iOS 8.2 only (not reproducible in simulator) 884 // `in` check used to prevent JIT error (gh-2145) 885 // hasOwn isn't used here due to false negatives 886 // regarding Nodelist length in IE 887 var length = !!obj && "length" in obj && obj.length, 888 type = toType( obj ); 889 890 if ( isFunction( obj ) || isWindow( obj ) ) { 891 return false; 892 } 893 894 return type === "array" || length === 0 || 895 typeof length === "number" && length > 0 && ( length - 1 ) in obj; 896 } 897 var Sizzle = 898 /*! 899 * Sizzle CSS Selector Engine v2.3.6 900 * https://sizzlejs.com/ 901 * 902 * Copyright JS Foundation and other contributors 903 * Released under the MIT license 904 * https://js.foundation/ 905 * 906 * Date: 2021-02-16 907 */ 908 ( function( window ) { 909 var i, 910 support, 911 Expr, 912 getText, 913 isXML, 914 tokenize, 915 compile, 916 select, 917 outermostContext, 918 sortInput, 919 hasDuplicate, 920 921 // Local document vars 922 setDocument, 923 document, 924 docElem, 925 documentIsHTML, 926 rbuggyQSA, 927 rbuggyMatches, 928 matches, 929 contains, 930 931 // Instance-specific data 932 expando = "sizzle" + 1 * new Date(), 933 preferredDoc = window.document, 934 dirruns = 0, 935 done = 0, 936 classCache = createCache(), 937 tokenCache = createCache(), 938 compilerCache = createCache(), 939 nonnativeSelectorCache = createCache(), 940 sortOrder = function( a, b ) { 941 if ( a === b ) { 942 hasDuplicate = true; 943 } 944 return 0; 945 }, 946 947 // Instance methods 948 hasOwn = ( {} ).hasOwnProperty, 949 arr = [], 950 pop = arr.pop, 951 pushNative = arr.push, 952 push = arr.push, 953 slice = arr.slice, 954 955 // Use a stripped-down indexOf as it's faster than native 956 // https://jsperf.com/thor-indexof-vs-for/5 957 indexOf = function( list, elem ) { 958 var i = 0, 959 len = list.length; 960 for ( ; i < len; i++ ) { 961 if ( list[ i ] === elem ) { 962 return i; 963 } 964 } 965 return -1; 966 }, 967 968 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + 969 "ismap|loop|multiple|open|readonly|required|scoped", 970 971 // Regular expressions 972 973 // http://www.w3.org/TR/css3-selectors/#whitespace 974 whitespace = "[\\x20\\t\\r\\n\\f]", 975 976 // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram 977 identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + 978 "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", 979 980 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors 981 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + 982 983 // Operator (capture 2) 984 "*([*^$|!~]?=)" + whitespace + 985 986 // "Attribute values must be CSS identifiers [capture 5] 987 // or strings [capture 3 or capture 4]" 988 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + 989 whitespace + "*\\]", 990 991 pseudos = ":(" + identifier + ")(?:\\((" + 992 993 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: 994 // 1. quoted (capture 3; capture 4 or capture 5) 995 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + 996 997 // 2. simple (capture 6) 998 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + 999 1000 // 3. anything else (capture 2) 1001 ".*" + 1002 ")\\)|)", 1003 1004 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter 1005 rwhitespace = new RegExp( whitespace + "+", "g" ), 1006 rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + 1007 whitespace + "+$", "g" ), 1008 1009 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), 1010 rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + 1011 "*" ), 1012 rdescend = new RegExp( whitespace + "|>" ), 1013 1014 rpseudo = new RegExp( pseudos ), 1015 ridentifier = new RegExp( "^" + identifier + "$" ), 1016 1017 matchExpr = { 1018 "ID": new RegExp( "^#(" + identifier + ")" ), 1019 "CLASS": new RegExp( "^\\.(" + identifier + ")" ), 1020 "TAG": new RegExp( "^(" + identifier + "|[*])" ), 1021 "ATTR": new RegExp( "^" + attributes ), 1022 "PSEUDO": new RegExp( "^" + pseudos ), 1023 "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + 1024 whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + 1025 whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), 1026 "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), 1027 1028 // For use in libraries implementing .is() 1029 // We use this for POS matching in `select` 1030 "needsContext": new RegExp( "^" + whitespace + 1031 "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + 1032 "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) 1033 }, 1034 1035 rhtml = /HTML$/i, 1036 rinputs = /^(?:input|select|textarea|button)$/i, 1037 rheader = /^h\d$/i, 1038 1039 rnative = /^[^{]+\{\s*\[native \w/, 1040 1041 // Easily-parseable/retrievable ID or TAG or CLASS selectors 1042 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 1043 1044 rsibling = /[+~]/, 1045 1046 // CSS escapes 1047 // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters 1048 runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), 1049 funescape = function( escape, nonHex ) { 1050 var high = "0x" + escape.slice( 1 ) - 0x10000; 1051 1052 return nonHex ? 1053 1054 // Strip the backslash prefix from a non-hex escape sequence 1055 nonHex : 1056 1057 // Replace a hexadecimal escape sequence with the encoded Unicode code point
vendor: 4,623 bytes, lines 1058-1166
1058 // Support: IE <=11+ 1059 // For values outside the Basic Multilingual Plane (BMP), manually construct a 1060 // surrogate pair 1061 high < 0 ? 1062 String.fromCharCode( high + 0x10000 ) : 1063 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); 1064 }, 1065 1066 // CSS string/identifier serialization 1067 // https://drafts.csswg.org/cssom/#common-serializing-idioms 1068 rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, 1069 fcssescape = function( ch, asCodePoint ) { 1070 if ( asCodePoint ) { 1071 1072 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 1073 if ( ch === "\0" ) { 1074 return "\uFFFD"; 1075 } 1076 1077 // Control characters and (dependent upon position) numbers get escaped as code points 1078 return ch.slice( 0, -1 ) + "\\" + 1079 ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; 1080 } 1081 1082 // Other potentially-special ASCII characters get backslash-escaped 1083 return "\\" + ch; 1084 }, 1085 1086 // Used for iframes 1087 // See setDocument() 1088 // Removing the function wrapper causes a "Permission Denied" 1089 // error in IE 1090 unloadHandler = function() { 1091 setDocument(); 1092 }, 1093 1094 inDisabledFieldset = addCombinator( 1095 function( elem ) { 1096 return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; 1097 }, 1098 { dir: "parentNode", next: "legend" } 1099 ); 1100 1101// Optimize for push.apply( _, NodeList ) 1102 try { 1103 push.apply( 1104 ( arr = slice.call( preferredDoc.childNodes ) ), 1105 preferredDoc.childNodes 1106 ); 1107 1108 // Support: Android<4.0 1109 // Detect silently failing push.apply 1110 // eslint-disable-next-line no-unused-expressions 1111 arr[ preferredDoc.childNodes.length ].nodeType; 1112 } catch ( e ) { 1113 push = { apply: arr.length ? 1114 1115 // Leverage slice if possible 1116 function( target, els ) { 1117 pushNative.apply( target, slice.call( els ) ); 1118 } : 1119 1120 // Support: IE<9 1121 // Otherwise append directly 1122 function( target, els ) { 1123 var j = target.length, 1124 i = 0; 1125 1126 // Can't trust NodeList.length 1127 while ( ( target[ j++ ] = els[ i++ ] ) ) {} 1128 target.length = j - 1; 1129 } 1130 }; 1131 } 1132 1133 function Sizzle( selector, context, results, seed ) { 1134 var m, i, elem, nid, match, groups, newSelector, 1135 newContext = context && context.ownerDocument, 1136 1137 // nodeType defaults to 9, since context defaults to document 1138 nodeType = context ? context.nodeType : 9; 1139 1140 results = results || []; 1141 1142 // Return early from calls with invalid selector or context 1143 if ( typeof selector !== "string" || !selector || 1144 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { 1145 1146 return results; 1147 } 1148 1149 // Try to shortcut find operations (as opposed to filters) in HTML documents 1150 if ( !seed ) { 1151 setDocument( context ); 1152 context = context || document; 1153 1154 if ( documentIsHTML ) { 1155 1156 // If the selector is sufficiently simple, try using a "get*By*" DOM method 1157 // (excepting DocumentFragment context, where the methods don't exist) 1158 if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { 1159 1160 // ID selector 1161 if ( ( m = match[ 1 ] ) ) { 1162 1163 // Document context 1164 if ( nodeType === 9 ) { 1165 if ( ( elem = context.getElementById( m ) ) ) { 1166
vendor: 7,215 bytes, lines 1167-1316
1167 // Support: IE, Opera, Webkit 1168 // TODO: identify versions 1169 // getElementById can match elements by name instead of ID 1170 if ( elem.id === m ) { 1171 results.push( elem ); 1172 return results; 1173 } 1174 } else { 1175 return results; 1176 } 1177 1178 // Element context 1179 } else { 1180 1181 // Support: IE, Opera, Webkit 1182 // TODO: identify versions 1183 // getElementById can match elements by name instead of ID 1184 if ( newContext && ( elem = newContext.getElementById( m ) ) && 1185 contains( context, elem ) && 1186 elem.id === m ) { 1187 1188 results.push( elem ); 1189 return results; 1190 } 1191 } 1192 1193 // Type selector 1194 } else if ( match[ 2 ] ) { 1195 push.apply( results, context.getElementsByTagName( selector ) ); 1196 return results; 1197 1198 // Class selector 1199 } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && 1200 context.getElementsByClassName ) { 1201 1202 push.apply( results, context.getElementsByClassName( m ) ); 1203 return results; 1204 } 1205 } 1206 1207 // Take advantage of querySelectorAll 1208 if ( support.qsa && 1209 !nonnativeSelectorCache[ selector + " " ] && 1210 ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && 1211 1212 // Support: IE 8 only 1213 // Exclude object elements 1214 ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { 1215 1216 newSelector = selector; 1217 newContext = context; 1218 1219 // qSA considers elements outside a scoping root when evaluating child or 1220 // descendant combinators, which is not what we want. 1221 // In such cases, we work around the behavior by prefixing every selector in the 1222 // list with an ID selector referencing the scope context. 1223 // The technique has to be used as well when a leading combinator is used 1224 // as such selectors are not recognized by querySelectorAll. 1225 // Thanks to Andrew Dupont for this technique. 1226 if ( nodeType === 1 && 1227 ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { 1228 1229 // Expand context for sibling selectors 1230 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || 1231 context; 1232 1233 // We can use :scope instead of the ID hack if the browser 1234 // supports it & if we're not changing the context. 1235 if ( newContext !== context || !support.scope ) { 1236 1237 // Capture the context ID, setting it first if necessary 1238 if ( ( nid = context.getAttribute( "id" ) ) ) { 1239 nid = nid.replace( rcssescape, fcssescape ); 1240 } else { 1241 context.setAttribute( "id", ( nid = expando ) ); 1242 } 1243 } 1244 1245 // Prefix every selector in the list 1246 groups = tokenize( selector ); 1247 i = groups.length; 1248 while ( i-- ) { 1249 groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + 1250 toSelector( groups[ i ] ); 1251 } 1252 newSelector = groups.join( "," ); 1253 } 1254 1255 try { 1256 push.apply( results, 1257 newContext.querySelectorAll( newSelector ) 1258 ); 1259 return results; 1260 } catch ( qsaError ) { 1261 nonnativeSelectorCache( selector, true ); 1262 } finally { 1263 if ( nid === expando ) { 1264 context.removeAttribute( "id" ); 1265 } 1266 } 1267 } 1268 } 1269 } 1270 1271 // All others 1272 return select( selector.replace( rtrim, "$1" ), context, results, seed ); 1273 } 1274 1275 /** 1276 * Create key-value caches of limited size 1277 * @returns {function(string, object)} Returns the Object data after storing it on itself with 1278 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) 1279 * deleting the oldest entry 1280 */ 1281 function createCache() { 1282 var keys = []; 1283 1284 function cache( key, value ) { 1285 1286 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) 1287 if ( keys.push( key + " " ) > Expr.cacheLength ) { 1288 1289 // Only keep the most recent entries 1290 delete cache[ keys.shift() ]; 1291 } 1292 return ( cache[ key + " " ] = value ); 1293 } 1294 return cache; 1295 } 1296 1297 /** 1298 * Mark a function for special use by Sizzle 1299 * @param {Function} fn The function to mark 1300 */ 1301 function markFunction( fn ) { 1302 fn[ expando ] = true; 1303 return fn; 1304 } 1305 1306 /** 1307 * Support testing using an element 1308 * @param {Function} fn Passed the created element and returns a boolean result 1309 */ 1310 function assert( fn ) { 1311 var el = document.createElement( "fieldset" ); 1312 1313 try { 1314 return !!fn( el ); 1315 } catch ( e ) { 1316 return false;
vendor: 4,414 bytes, lines 1317-1424
1317 } finally { 1318 1319 // Remove from its parent by default 1320 if ( el.parentNode ) { 1321 el.parentNode.removeChild( el ); 1322 } 1323 1324 // release memory in IE 1325 el = null; 1326 } 1327 } 1328 1329 /** 1330 * Adds the same handler for all of the specified attrs 1331 * @param {String} attrs Pipe-separated list of attributes 1332 * @param {Function} handler The method that will be applied 1333 */ 1334 function addHandle( attrs, handler ) { 1335 var arr = attrs.split( "|" ), 1336 i = arr.length; 1337 1338 while ( i-- ) { 1339 Expr.attrHandle[ arr[ i ] ] = handler; 1340 } 1341 } 1342 1343 /** 1344 * Checks document order of two siblings 1345 * @param {Element} a 1346 * @param {Element} b 1347 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b 1348 */ 1349 function siblingCheck( a, b ) { 1350 var cur = b && a, 1351 diff = cur && a.nodeType === 1 && b.nodeType === 1 && 1352 a.sourceIndex - b.sourceIndex; 1353 1354 // Use IE sourceIndex if available on both nodes 1355 if ( diff ) { 1356 return diff; 1357 } 1358 1359 // Check if b follows a 1360 if ( cur ) { 1361 while ( ( cur = cur.nextSibling ) ) { 1362 if ( cur === b ) { 1363 return -1; 1364 } 1365 } 1366 } 1367 1368 return a ? 1 : -1; 1369 } 1370 1371 /** 1372 * Returns a function to use in pseudos for input types 1373 * @param {String} type 1374 */ 1375 function createInputPseudo( type ) { 1376 return function( elem ) { 1377 var name = elem.nodeName.toLowerCase(); 1378 return name === "input" && elem.type === type; 1379 }; 1380 } 1381 1382 /** 1383 * Returns a function to use in pseudos for buttons 1384 * @param {String} type 1385 */ 1386 function createButtonPseudo( type ) { 1387 return function( elem ) { 1388 var name = elem.nodeName.toLowerCase(); 1389 return ( name === "input" || name === "button" ) && elem.type === type; 1390 }; 1391 } 1392 1393 /** 1394 * Returns a function to use in pseudos for :enabled/:disabled 1395 * @param {Boolean} disabled true for :disabled; false for :enabled 1396 */ 1397 function createDisabledPseudo( disabled ) { 1398 1399 // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable 1400 return function( elem ) { 1401 1402 // Only certain elements can match :enabled or :disabled 1403 // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled 1404 // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled 1405 if ( "form" in elem ) { 1406 1407 // Check for inherited disabledness on relevant non-disabled elements: 1408 // * listed form-associated elements in a disabled fieldset 1409 // https://html.spec.whatwg.org/multipage/forms.html#category-listed 1410 // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled 1411 // * option elements in a disabled optgroup 1412 // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled 1413 // All such elements have a "form" property. 1414 if ( elem.parentNode && elem.disabled === false ) { 1415 1416 // Option elements defer to a parent optgroup if present 1417 if ( "label" in elem ) { 1418 if ( "label" in elem.parentNode ) { 1419 return elem.parentNode.disabled === disabled; 1420 } else { 1421 return elem.disabled === disabled; 1422 } 1423 } 1424
1425 // Support: IE 6 - 11 1426 // Use the isDisabled shortcut property to check for disabled fieldset ancestors 1427 return elem.isDisabled === disabled || 1428 1429 // Where there is no isDisabled, check manually 1430 /* jshint -W018 */ 1431 elem.isDisabled !== !disabled && 1432 inDisabledFieldset( elem ) === disabled; 1433 } 1434 1435 return elem.disabled === disabled; 1436 1437 // Try to winnow out elements that can't be disabled before trusting the disabled property. 1438 // Some victims get caught in our net (label, legend, menu, track), but it shouldn't 1439 // even exist on them, let alone have a boolean value. 1440 } else if ( "label" in elem ) { 1441 return elem.disabled === disabled; 1442 } 1443 1444 // Remaining elements are neither :enabled nor :disabled 1445 return false; 1446 }; 1447 } 1448 1449 /** 1450 * Returns a function to use in pseudos for positionals 1451 * @param {Function} fn 1452 */ 1453 function createPositionalPseudo( fn ) { 1454 return markFunction( function( argument ) { 1455 argument = +argument; 1456 return markFunction( function( seed, matches ) { 1457 var j, 1458 matchIndexes = fn( [], seed.length, argument ), 1459 i = matchIndexes.length; 1460 1461 // Match elements found at the specified indexes 1462 while ( i-- ) { 1463 if ( seed[ ( j = matchIndexes[ i ] ) ] ) { 1464 seed[ j ] = !( matches[ j ] = seed[ j ] ); 1465 } 1466 } 1467 } ); 1468 } ); 1469 } 1470 1471 /** 1472 * Checks a node for validity as a Sizzle context 1473 * @param {Element|Object=} context 1474 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value 1475 */ 1476 function testContext( context ) { 1477 return context && typeof context.getElementsByTagName !== "undefined" && context; 1478 } 1479 1480// Expose support vars for convenience 1481 support = Sizzle.support = {}; 1482 1483 /** 1484 * Detects XML nodes 1485 * @param {Element|Object} elem An element or a document 1486 * @returns {Boolean} True iff elem is a non-HTML XML node 1487 */ 1488 isXML = Sizzle.isXML = function( elem ) { 1489 var namespace = elem && elem.namespaceURI, 1490 docElem = elem && ( elem.ownerDocument || elem ).documentElement; 1491 1492 // Support: IE <=8 1493 // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes 1494 // https://bugs.jquery.com/ticket/4833 1495 return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); 1496 }; 1497 1498 /** 1499 * Sets document-related variables once based on the current document 1500 * @param {Element|Object} [doc] An element or document object to use to set the document 1501 * @returns {Object} Returns the current document 1502 */ 1503 setDocument = Sizzle.setDocument = function( node ) { 1504 var hasCompare, subWindow, 1505 doc = node ? node.ownerDocument || node : preferredDoc; 1506 1507 // Return early if doc is invalid or already selected 1508 // Support: IE 11+, Edge 17 - 18+ 1509 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1510 // two documents; shallow comparisons work. 1511 // eslint-disable-next-line eqeqeq 1512 if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { 1513 return document; 1514 } 1515 1516 // Update global variables 1517 document = doc; 1518 docElem = document.documentElement; 1519 documentIsHTML = !isXML( document ); 1520
vendor: 9,023 bytes, lines 1521-1709
1521 // Support: IE 9 - 11+, Edge 12 - 18+ 1522 // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) 1523 // Support: IE 11+, Edge 17 - 18+ 1524 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1525 // two documents; shallow comparisons work. 1526 // eslint-disable-next-line eqeqeq 1527 if ( preferredDoc != document && 1528 ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { 1529 1530 // Support: IE 11, Edge 1531 if ( subWindow.addEventListener ) { 1532 subWindow.addEventListener( "unload", unloadHandler, false ); 1533 1534 // Support: IE 9 - 10 only 1535 } else if ( subWindow.attachEvent ) { 1536 subWindow.attachEvent( "onunload", unloadHandler ); 1537 } 1538 } 1539 1540 // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, 1541 // Safari 4 - 5 only, Opera <=11.6 - 12.x only 1542 // IE/Edge & older browsers don't support the :scope pseudo-class. 1543 // Support: Safari 6.0 only 1544 // Safari 6.0 supports :scope but it's an alias of :root there. 1545 support.scope = assert( function( el ) { 1546 docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); 1547 return typeof el.querySelectorAll !== "undefined" && 1548 !el.querySelectorAll( ":scope fieldset div" ).length; 1549 } ); 1550 1551 /* Attributes 1552 ---------------------------------------------------------------------- */ 1553 1554 // Support: IE<8 1555 // Verify that getAttribute really returns attributes and not properties 1556 // (excepting IE8 booleans) 1557 support.attributes = assert( function( el ) { 1558 el.className = "i"; 1559 return !el.getAttribute( "className" ); 1560 } ); 1561 1562 /* getElement(s)By* 1563 ---------------------------------------------------------------------- */ 1564 1565 // Check if getElementsByTagName("*") returns only elements 1566 support.getElementsByTagName = assert( function( el ) { 1567 el.appendChild( document.createComment( "" ) ); 1568 return !el.getElementsByTagName( "*" ).length; 1569 } ); 1570 1571 // Support: IE<9 1572 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); 1573 1574 // Support: IE<10 1575 // Check if getElementById returns elements by name 1576 // The broken getElementById methods don't pick up programmatically-set names, 1577 // so use a roundabout getElementsByName test 1578 support.getById = assert( function( el ) { 1579 docElem.appendChild( el ).id = expando; 1580 return !document.getElementsByName || !document.getElementsByName( expando ).length; 1581 } ); 1582 1583 // ID filter and find 1584 if ( support.getById ) { 1585 Expr.filter[ "ID" ] = function( id ) { 1586 var attrId = id.replace( runescape, funescape ); 1587 return function( elem ) { 1588 return elem.getAttribute( "id" ) === attrId; 1589 }; 1590 }; 1591 Expr.find[ "ID" ] = function( id, context ) { 1592 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 1593 var elem = context.getElementById( id ); 1594 return elem ? [ elem ] : []; 1595 } 1596 }; 1597 } else { 1598 Expr.filter[ "ID" ] = function( id ) { 1599 var attrId = id.replace( runescape, funescape ); 1600 return function( elem ) { 1601 var node = typeof elem.getAttributeNode !== "undefined" && 1602 elem.getAttributeNode( "id" ); 1603 return node && node.value === attrId; 1604 }; 1605 }; 1606 1607 // Support: IE 6 - 7 only 1608 // getElementById is not reliable as a find shortcut 1609 Expr.find[ "ID" ] = function( id, context ) { 1610 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 1611 var node, i, elems, 1612 elem = context.getElementById( id ); 1613 1614 if ( elem ) { 1615 1616 // Verify the id attribute 1617 node = elem.getAttributeNode( "id" ); 1618 if ( node && node.value === id ) { 1619 return [ elem ]; 1620 } 1621 1622 // Fall back on getElementsByName 1623 elems = context.getElementsByName( id ); 1624 i = 0; 1625 while ( ( elem = elems[ i++ ] ) ) { 1626 node = elem.getAttributeNode( "id" ); 1627 if ( node && node.value === id ) { 1628 return [ elem ]; 1629 } 1630 } 1631 } 1632 1633 return []; 1634 } 1635 }; 1636 } 1637 1638 // Tag 1639 Expr.find[ "TAG" ] = support.getElementsByTagName ? 1640 function( tag, context ) { 1641 if ( typeof context.getElementsByTagName !== "undefined" ) { 1642 return context.getElementsByTagName( tag ); 1643 1644 // DocumentFragment nodes don't have gEBTN 1645 } else if ( support.qsa ) { 1646 return context.querySelectorAll( tag ); 1647 } 1648 } : 1649 1650 function( tag, context ) { 1651 var elem, 1652 tmp = [], 1653 i = 0, 1654 1655 // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too 1656 results = context.getElementsByTagName( tag ); 1657 1658 // Filter out possible comments 1659 if ( tag === "*" ) { 1660 while ( ( elem = results[ i++ ] ) ) { 1661 if ( elem.nodeType === 1 ) { 1662 tmp.push( elem ); 1663 } 1664 } 1665 1666 return tmp; 1667 } 1668 return results; 1669 }; 1670 1671 // Class 1672 Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { 1673 if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { 1674 return context.getElementsByClassName( className ); 1675 } 1676 }; 1677 1678 /* QSA/matchesSelector 1679 ---------------------------------------------------------------------- */ 1680 1681 // QSA and matchesSelector support 1682 1683 // matchesSelector(:active) reports false when true (IE9/Opera 11.5) 1684 rbuggyMatches = []; 1685 1686 // qSa(:focus) reports false when true (Chrome 21) 1687 // We allow this because of a bug in IE8/9 that throws an error 1688 // whenever `document.activeElement` is accessed on an iframe 1689 // So, we allow :focus to pass through QSA all the time to avoid the IE error 1690 // See https://bugs.jquery.com/ticket/13378 1691 rbuggyQSA = []; 1692 1693 if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { 1694 1695 // Build QSA regex 1696 // Regex strategy adopted from Diego Perini 1697 assert( function( el ) { 1698 1699 var input; 1700 1701 // Select is set to empty string on purpose 1702 // This is to test IE's treatment of not explicitly 1703 // setting a boolean content attribute, 1704 // since its presence should be enough 1705 // https://bugs.jquery.com/ticket/12359 1706 docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" + 1707 "<select id='" + expando + "-\r\\' msallowcapture=''>" + 1708 "<option selected=''></option></select>"; 1709
1710 // Support: IE8, Opera 11-12.16 1711 // Nothing should be selected when empty strings follow ^= or $= or *= 1712 // The test attribute must be unknown in Opera but "safe" for WinRT 1713 // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section 1714 if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { 1715 rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); 1716 } 1717 1718 // Support: IE8 1719 // Boolean attributes and "value" are not treated correctly 1720 if ( !el.querySelectorAll( "[selected]" ).length ) { 1721 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); 1722 } 1723 1724 // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ 1725 if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { 1726 rbuggyQSA.push( "~=" ); 1727 } 1728 1729 // Support: IE 11+, Edge 15 - 18+ 1730 // IE 11/Edge don't find elements on a `[name='']` query in some cases. 1731 // Adding a temporary attribute to the document before the selection works 1732 // around the issue. 1733 // Interestingly, IE 10 & older don't seem to have the issue. 1734 input = document.createElement( "input" ); 1735 input.setAttribute( "name", "" ); 1736 el.appendChild( input ); 1737 if ( !el.querySelectorAll( "[name='']" ).length ) { 1738 rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + 1739 whitespace + "*(?:''|\"\")" ); 1740 } 1741 1742 // Webkit/Opera - :checked should return selected option elements 1743 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 1744 // IE8 throws error here and will not see later tests 1745 if ( !el.querySelectorAll( ":checked" ).length ) { 1746 rbuggyQSA.push( ":checked" ); 1747 } 1748 1749 // Support: Safari 8+, iOS 8+ 1750 // https://bugs.webkit.org/show_bug.cgi?id=136851 1751 // In-page `selector#id sibling-combinator selector` fails 1752 if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { 1753 rbuggyQSA.push( ".#.+[+~]" ); 1754 } 1755 1756 // Support: Firefox <=3.6 - 5 only 1757 // Old Firefox doesn't throw on a badly-escaped identifier. 1758 el.querySelectorAll( "\\\f" ); 1759 rbuggyQSA.push( "[\\r\\n\\f]" ); 1760 } ); 1761 1762 assert( function( el ) { 1763 el.innerHTML = "<a href='' disabled='disabled'></a>" + 1764 "<select disabled='disabled'><option/></select>"; 1765 1766 // Support: Windows 8 Native Apps 1767 // The type and name attributes are restricted during .innerHTML assignment 1768 var input = document.createElement( "input" ); 1769 input.setAttribute( "type", "hidden" ); 1770 el.appendChild( input ).setAttribute( "name", "D" ); 1771 1772 // Support: IE8 1773 // Enforce case-sensitivity of name attribute 1774 if ( el.querySelectorAll( "[name=d]" ).length ) { 1775 rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); 1776 } 1777 1778 // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) 1779 // IE8 throws error here and will not see later tests 1780 if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { 1781 rbuggyQSA.push( ":enabled", ":disabled" ); 1782 } 1783
vendor: 4,680 bytes, lines 1784-1882
1784 // Support: IE9-11+ 1785 // IE's :disabled selector does not pick up the children of disabled fieldsets 1786 docElem.appendChild( el ).disabled = true; 1787 if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { 1788 rbuggyQSA.push( ":enabled", ":disabled" ); 1789 } 1790 1791 // Support: Opera 10 - 11 only 1792 // Opera 10-11 does not throw on post-comma invalid pseudos 1793 el.querySelectorAll( "*,:x" ); 1794 rbuggyQSA.push( ",.*:" ); 1795 } ); 1796 } 1797 1798 if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || 1799 docElem.webkitMatchesSelector || 1800 docElem.mozMatchesSelector || 1801 docElem.oMatchesSelector || 1802 docElem.msMatchesSelector ) ) ) ) { 1803 1804 assert( function( el ) { 1805 1806 // Check to see if it's possible to do matchesSelector 1807 // on a disconnected node (IE 9) 1808 support.disconnectedMatch = matches.call( el, "*" ); 1809 1810 // This should fail with an exception 1811 // Gecko does not error, returns false instead 1812 matches.call( el, "[s!='']:x" ); 1813 rbuggyMatches.push( "!=", pseudos ); 1814 } ); 1815 } 1816 1817 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); 1818 rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); 1819 1820 /* Contains 1821 ---------------------------------------------------------------------- */ 1822 hasCompare = rnative.test( docElem.compareDocumentPosition ); 1823 1824 // Element contains another 1825 // Purposefully self-exclusive 1826 // As in, an element does not contain itself 1827 contains = hasCompare || rnative.test( docElem.contains ) ? 1828 function( a, b ) { 1829 var adown = a.nodeType === 9 ? a.documentElement : a, 1830 bup = b && b.parentNode; 1831 return a === bup || !!( bup && bup.nodeType === 1 && ( 1832 adown.contains ? 1833 adown.contains( bup ) : 1834 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 1835 ) ); 1836 } : 1837 function( a, b ) { 1838 if ( b ) { 1839 while ( ( b = b.parentNode ) ) { 1840 if ( b === a ) { 1841 return true; 1842 } 1843 } 1844 } 1845 return false; 1846 }; 1847 1848 /* Sorting 1849 ---------------------------------------------------------------------- */ 1850 1851 // Document order sorting 1852 sortOrder = hasCompare ? 1853 function( a, b ) { 1854 1855 // Flag for duplicate removal 1856 if ( a === b ) { 1857 hasDuplicate = true; 1858 return 0; 1859 } 1860 1861 // Sort on method existence if only one input has compareDocumentPosition 1862 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; 1863 if ( compare ) { 1864 return compare; 1865 } 1866 1867 // Calculate position if both inputs belong to the same document 1868 // Support: IE 11+, Edge 17 - 18+ 1869 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1870 // two documents; shallow comparisons work. 1871 // eslint-disable-next-line eqeqeq 1872 compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? 1873 a.compareDocumentPosition( b ) : 1874 1875 // Otherwise we know they are disconnected 1876 1; 1877 1878 // Disconnected nodes 1879 if ( compare & 1 || 1880 ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { 1881 1882 // Choose the first element that is related to our preferred document
1883 // Support: IE 11+, Edge 17 - 18+ 1884 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1885 // two documents; shallow comparisons work. 1886 // eslint-disable-next-line eqeqeq 1887 if ( a == document || a.ownerDocument == preferredDoc && 1888 contains( preferredDoc, a ) ) { 1889 return -1; 1890 } 1891 1892 // Support: IE 11+, Edge 17 - 18+ 1893 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1894 // two documents; shallow comparisons work. 1895 // eslint-disable-next-line eqeqeq 1896 if ( b == document || b.ownerDocument == preferredDoc && 1897 contains( preferredDoc, b ) ) { 1898 return 1; 1899 } 1900 1901 // Maintain original order 1902 return sortInput ? 1903 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 1904 0; 1905 } 1906 1907 return compare & 4 ? -1 : 1; 1908 } : 1909 function( a, b ) { 1910 1911 // Exit early if the nodes are identical 1912 if ( a === b ) { 1913 hasDuplicate = true; 1914 return 0; 1915 } 1916 1917 var cur, 1918 i = 0, 1919 aup = a.parentNode, 1920 bup = b.parentNode, 1921 ap = [ a ], 1922 bp = [ b ]; 1923 1924 // Parentless nodes are either documents or disconnected 1925 if ( !aup || !bup ) { 1926 1927 // Support: IE 11+, Edge 17 - 18+ 1928 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1929 // two documents; shallow comparisons work. 1930 /* eslint-disable eqeqeq */ 1931 return a == document ? -1 : 1932 b == document ? 1 : 1933 /* eslint-enable eqeqeq */ 1934 aup ? -1 : 1935 bup ? 1 : 1936 sortInput ? 1937 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 1938 0; 1939 1940 // If the nodes are siblings, we can do a quick check 1941 } else if ( aup === bup ) { 1942 return siblingCheck( a, b ); 1943 } 1944 1945 // Otherwise we need full lists of their ancestors for comparison 1946 cur = a; 1947 while ( ( cur = cur.parentNode ) ) { 1948 ap.unshift( cur ); 1949 } 1950 cur = b; 1951 while ( ( cur = cur.parentNode ) ) { 1952 bp.unshift( cur ); 1953 } 1954 1955 // Walk down the tree looking for a discrepancy 1956 while ( ap[ i ] === bp[ i ] ) { 1957 i++; 1958 } 1959 1960 return i ? 1961 1962 // Do a sibling check if the nodes have a common ancestor 1963 siblingCheck( ap[ i ], bp[ i ] ) : 1964 1965 // Otherwise nodes in our document sort first 1966 // Support: IE 11+, Edge 17 - 18+ 1967 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1968 // two documents; shallow comparisons work. 1969 /* eslint-disable eqeqeq */ 1970 ap[ i ] == preferredDoc ? -1 : 1971 bp[ i ] == preferredDoc ? 1 : 1972 /* eslint-enable eqeqeq */ 1973 0; 1974 }; 1975 1976 return document; 1977 }; 1978 1979 Sizzle.matches = function( expr, elements ) { 1980 return Sizzle( expr, null, null, elements ); 1981 }; 1982 1983 Sizzle.matchesSelector = function( elem, expr ) { 1984 setDocument( elem ); 1985 1986 if ( support.matchesSelector && documentIsHTML && 1987 !nonnativeSelectorCache[ expr + " " ] && 1988 ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && 1989 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { 1990 1991 try { 1992 var ret = matches.call( elem, expr ); 1993 1994 // IE 9's matchesSelector returns false on disconnected nodes 1995 if ( ret || support.disconnectedMatch || 1996 1997 // As well, disconnected nodes are said to be in a document 1998 // fragment in IE 9 1999 elem.document && elem.document.nodeType !== 11 ) { 2000 return ret; 2001 } 2002 } catch ( e ) { 2003 nonnativeSelectorCache( expr, true ); 2004 } 2005 } 2006 2007 return Sizzle( expr, document, null, [ elem ] ).length > 0; 2008 }; 2009 2010 Sizzle.contains = function( context, elem ) { 2011 2012 // Set document vars if needed
vendor: 32,163 bytes, lines 2013-2716
2013 // Support: IE 11+, Edge 17 - 18+ 2014 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 2015 // two documents; shallow comparisons work. 2016 // eslint-disable-next-line eqeqeq 2017 if ( ( context.ownerDocument || context ) != document ) { 2018 setDocument( context ); 2019 } 2020 return contains( context, elem ); 2021 }; 2022 2023 Sizzle.attr = function( elem, name ) { 2024 2025 // Set document vars if needed 2026 // Support: IE 11+, Edge 17 - 18+ 2027 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 2028 // two documents; shallow comparisons work. 2029 // eslint-disable-next-line eqeqeq 2030 if ( ( elem.ownerDocument || elem ) != document ) { 2031 setDocument( elem ); 2032 } 2033 2034 var fn = Expr.attrHandle[ name.toLowerCase() ], 2035 2036 // Don't get fooled by Object.prototype properties (jQuery #13807) 2037 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? 2038 fn( elem, name, !documentIsHTML ) : 2039 undefined; 2040 2041 return val !== undefined ? 2042 val : 2043 support.attributes || !documentIsHTML ? 2044 elem.getAttribute( name ) : 2045 ( val = elem.getAttributeNode( name ) ) && val.specified ? 2046 val.value : 2047 null; 2048 }; 2049 2050 Sizzle.escape = function( sel ) { 2051 return ( sel + "" ).replace( rcssescape, fcssescape ); 2052 }; 2053 2054 Sizzle.error = function( msg ) { 2055 throw new Error( "Syntax error, unrecognized expression: " + msg ); 2056 }; 2057 2058 /** 2059 * Document sorting and removing duplicates 2060 * @param {ArrayLike} results 2061 */ 2062 Sizzle.uniqueSort = function( results ) { 2063 var elem, 2064 duplicates = [], 2065 j = 0, 2066 i = 0; 2067 2068 // Unless we *know* we can detect duplicates, assume their presence 2069 hasDuplicate = !support.detectDuplicates; 2070 sortInput = !support.sortStable && results.slice( 0 ); 2071 results.sort( sortOrder ); 2072 2073 if ( hasDuplicate ) { 2074 while ( ( elem = results[ i++ ] ) ) { 2075 if ( elem === results[ i ] ) { 2076 j = duplicates.push( i ); 2077 } 2078 } 2079 while ( j-- ) { 2080 results.splice( duplicates[ j ], 1 ); 2081 } 2082 } 2083 2084 // Clear input after sorting to release objects 2085 // See https://github.com/jquery/sizzle/pull/225 2086 sortInput = null; 2087 2088 return results; 2089 }; 2090 2091 /** 2092 * Utility function for retrieving the text value of an array of DOM nodes 2093 * @param {Array|Element} elem 2094 */ 2095 getText = Sizzle.getText = function( elem ) { 2096 var node, 2097 ret = "", 2098 i = 0, 2099 nodeType = elem.nodeType; 2100 2101 if ( !nodeType ) { 2102 2103 // If no nodeType, this is expected to be an array 2104 while ( ( node = elem[ i++ ] ) ) { 2105 2106 // Do not traverse comment nodes 2107 ret += getText( node ); 2108 } 2109 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { 2110 2111 // Use textContent for elements 2112 // innerText usage removed for consistency of new lines (jQuery #11153) 2113 if ( typeof elem.textContent === "string" ) { 2114 return elem.textContent; 2115 } else { 2116 2117 // Traverse its children 2118 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 2119 ret += getText( elem ); 2120 } 2121 } 2122 } else if ( nodeType === 3 || nodeType === 4 ) { 2123 return elem.nodeValue; 2124 } 2125 2126 // Do not include comment or processing instruction nodes 2127 2128 return ret; 2129 }; 2130 2131 Expr = Sizzle.selectors = { 2132 2133 // Can be adjusted by the user 2134 cacheLength: 50, 2135 2136 createPseudo: markFunction, 2137 2138 match: matchExpr, 2139 2140 attrHandle: {}, 2141 2142 find: {}, 2143 2144 relative: { 2145 ">": { dir: "parentNode", first: true }, 2146 " ": { dir: "parentNode" }, 2147 "+": { dir: "previousSibling", first: true }, 2148 "~": { dir: "previousSibling" } 2149 }, 2150 2151 preFilter: { 2152 "ATTR": function( match ) { 2153 match[ 1 ] = match[ 1 ].replace( runescape, funescape ); 2154 2155 // Move the given value to match[3] whether quoted or unquoted 2156 match[ 3 ] = ( match[ 3 ] || match[ 4 ] || 2157 match[ 5 ] || "" ).replace( runescape, funescape ); 2158 2159 if ( match[ 2 ] === "~=" ) { 2160 match[ 3 ] = " " + match[ 3 ] + " "; 2161 } 2162 2163 return match.slice( 0, 4 ); 2164 }, 2165 2166 "CHILD": function( match ) { 2167 2168 /* matches from matchExpr["CHILD"] 2169 1 type (only|nth|...) 2170 2 what (child|of-type) 2171 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 2172 4 xn-component of xn+y argument ([+-]?\d*n|) 2173 5 sign of xn-component 2174 6 x of xn-component 2175 7 sign of y-component 2176 8 y of y-component 2177 */ 2178 match[ 1 ] = match[ 1 ].toLowerCase(); 2179 2180 if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { 2181 2182 // nth-* requires argument 2183 if ( !match[ 3 ] ) { 2184 Sizzle.error( match[ 0 ] ); 2185 } 2186 2187 // numeric x and y parameters for Expr.filter.CHILD 2188 // remember that false/true cast respectively to 0/1 2189 match[ 4 ] = +( match[ 4 ] ? 2190 match[ 5 ] + ( match[ 6 ] || 1 ) : 2191 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); 2192 match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); 2193 2194 // other types prohibit arguments 2195 } else if ( match[ 3 ] ) { 2196 Sizzle.error( match[ 0 ] ); 2197 } 2198 2199 return match; 2200 }, 2201 2202 "PSEUDO": function( match ) { 2203 var excess, 2204 unquoted = !match[ 6 ] && match[ 2 ]; 2205 2206 if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { 2207 return null; 2208 } 2209 2210 // Accept quoted arguments as-is 2211 if ( match[ 3 ] ) { 2212 match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; 2213 2214 // Strip excess characters from unquoted arguments 2215 } else if ( unquoted && rpseudo.test( unquoted ) && 2216 2217 // Get excess from tokenize (recursively) 2218 ( excess = tokenize( unquoted, true ) ) && 2219 2220 // advance to the next closing parenthesis 2221 ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { 2222 2223 // excess is a negative index 2224 match[ 0 ] = match[ 0 ].slice( 0, excess ); 2225 match[ 2 ] = unquoted.slice( 0, excess ); 2226 } 2227 2228 // Return only captures needed by the pseudo filter method (type and argument) 2229 return match.slice( 0, 3 ); 2230 } 2231 }, 2232 2233 filter: { 2234 2235 "TAG": function( nodeNameSelector ) { 2236 var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); 2237 return nodeNameSelector === "*" ? 2238 function() { 2239 return true; 2240 } : 2241 function( elem ) { 2242 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; 2243 }; 2244 }, 2245 2246 "CLASS": function( className ) { 2247 var pattern = classCache[ className + " " ]; 2248 2249 return pattern || 2250 ( pattern = new RegExp( "(^|" + whitespace + 2251 ")" + className + "(" + whitespace + "|$)" ) ) && classCache( 2252 className, function( elem ) { 2253 return pattern.test( 2254 typeof elem.className === "string" && elem.className || 2255 typeof elem.getAttribute !== "undefined" && 2256 elem.getAttribute( "class" ) || 2257 "" 2258 ); 2259 } ); 2260 }, 2261 2262 "ATTR": function( name, operator, check ) { 2263 return function( elem ) { 2264 var result = Sizzle.attr( elem, name ); 2265 2266 if ( result == null ) { 2267 return operator === "!="; 2268 } 2269 if ( !operator ) { 2270 return true; 2271 } 2272 2273 result += ""; 2274 2275 /* eslint-disable max-len */ 2276 2277 return operator === "=" ? result === check : 2278 operator === "!=" ? result !== check : 2279 operator === "^=" ? check && result.indexOf( check ) === 0 : 2280 operator === "*=" ? check && result.indexOf( check ) > -1 : 2281 operator === "$=" ? check && result.slice( -check.length ) === check : 2282 operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : 2283 operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : 2284 false; 2285 /* eslint-enable max-len */ 2286 2287 }; 2288 }, 2289 2290 "CHILD": function( type, what, _argument, first, last ) { 2291 var simple = type.slice( 0, 3 ) !== "nth", 2292 forward = type.slice( -4 ) !== "last", 2293 ofType = what === "of-type"; 2294 2295 return first === 1 && last === 0 ? 2296 2297 // Shortcut for :nth-*(n) 2298 function( elem ) { 2299 return !!elem.parentNode; 2300 } : 2301 2302 function( elem, _context, xml ) { 2303 var cache, uniqueCache, outerCache, node, nodeIndex, start, 2304 dir = simple !== forward ? "nextSibling" : "previousSibling", 2305 parent = elem.parentNode, 2306 name = ofType && elem.nodeName.toLowerCase(), 2307 useCache = !xml && !ofType, 2308 diff = false; 2309 2310 if ( parent ) { 2311 2312 // :(first|last|only)-(child|of-type) 2313 if ( simple ) { 2314 while ( dir ) { 2315 node = elem; 2316 while ( ( node = node[ dir ] ) ) { 2317 if ( ofType ? 2318 node.nodeName.toLowerCase() === name : 2319 node.nodeType === 1 ) { 2320 2321 return false; 2322 } 2323 } 2324 2325 // Reverse direction for :only-* (if we haven't yet done so) 2326 start = dir = type === "only" && !start && "nextSibling"; 2327 } 2328 return true; 2329 } 2330 2331 start = [ forward ? parent.firstChild : parent.lastChild ]; 2332 2333 // non-xml :nth-child(...) stores cache data on `parent` 2334 if ( forward && useCache ) { 2335 2336 // Seek `elem` from a previously-cached index 2337 2338 // ...in a gzip-friendly way 2339 node = parent; 2340 outerCache = node[ expando ] || ( node[ expando ] = {} ); 2341 2342 // Support: IE <9 only 2343 // Defend against cloned attroperties (jQuery gh-1709) 2344 uniqueCache = outerCache[ node.uniqueID ] || 2345 ( outerCache[ node.uniqueID ] = {} ); 2346 2347 cache = uniqueCache[ type ] || []; 2348 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 2349 diff = nodeIndex && cache[ 2 ]; 2350 node = nodeIndex && parent.childNodes[ nodeIndex ]; 2351 2352 while ( ( node = ++nodeIndex && node && node[ dir ] || 2353 2354 // Fallback to seeking `elem` from the start 2355 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 2356 2357 // When found, cache indexes on `parent` and break 2358 if ( node.nodeType === 1 && ++diff && node === elem ) { 2359 uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; 2360 break; 2361 } 2362 } 2363 2364 } else { 2365 2366 // Use previously-cached element index if available 2367 if ( useCache ) { 2368 2369 // ...in a gzip-friendly way 2370 node = elem; 2371 outerCache = node[ expando ] || ( node[ expando ] = {} ); 2372 2373 // Support: IE <9 only 2374 // Defend against cloned attroperties (jQuery gh-1709) 2375 uniqueCache = outerCache[ node.uniqueID ] || 2376 ( outerCache[ node.uniqueID ] = {} ); 2377 2378 cache = uniqueCache[ type ] || []; 2379 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 2380 diff = nodeIndex; 2381 } 2382 2383 // xml :nth-child(...) 2384 // or :nth-last-child(...) or :nth(-last)?-of-type(...) 2385 if ( diff === false ) { 2386 2387 // Use the same loop as above to seek `elem` from the start 2388 while ( ( node = ++nodeIndex && node && node[ dir ] || 2389 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 2390 2391 if ( ( ofType ? 2392 node.nodeName.toLowerCase() === name : 2393 node.nodeType === 1 ) && 2394 ++diff ) { 2395 2396 // Cache the index of each encountered element 2397 if ( useCache ) { 2398 outerCache = node[ expando ] || 2399 ( node[ expando ] = {} ); 2400 2401 // Support: IE <9 only 2402 // Defend against cloned attroperties (jQuery gh-1709) 2403 uniqueCache = outerCache[ node.uniqueID ] || 2404 ( outerCache[ node.uniqueID ] = {} ); 2405 2406 uniqueCache[ type ] = [ dirruns, diff ]; 2407 } 2408 2409 if ( node === elem ) { 2410 break; 2411 } 2412 } 2413 } 2414 } 2415 } 2416 2417 // Incorporate the offset, then check against cycle size 2418 diff -= last; 2419 return diff === first || ( diff % first === 0 && diff / first >= 0 ); 2420 } 2421 }; 2422 }, 2423 2424 "PSEUDO": function( pseudo, argument ) { 2425 2426 // pseudo-class names are case-insensitive 2427 // http://www.w3.org/TR/selectors/#pseudo-classes 2428 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters 2429 // Remember that setFilters inherits from pseudos 2430 var args, 2431 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || 2432 Sizzle.error( "unsupported pseudo: " + pseudo ); 2433 2434 // The user may use createPseudo to indicate that 2435 // arguments are needed to create the filter function 2436 // just as Sizzle does 2437 if ( fn[ expando ] ) { 2438 return fn( argument ); 2439 } 2440 2441 // But maintain support for old signatures 2442 if ( fn.length > 1 ) { 2443 args = [ pseudo, pseudo, "", argument ]; 2444 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? 2445 markFunction( function( seed, matches ) { 2446 var idx, 2447 matched = fn( seed, argument ), 2448 i = matched.length; 2449 while ( i-- ) { 2450 idx = indexOf( seed, matched[ i ] ); 2451 seed[ idx ] = !( matches[ idx ] = matched[ i ] ); 2452 } 2453 } ) : 2454 function( elem ) { 2455 return fn( elem, 0, args ); 2456 }; 2457 } 2458 2459 return fn; 2460 } 2461 }, 2462 2463 pseudos: { 2464 2465 // Potentially complex pseudos 2466 "not": markFunction( function( selector ) { 2467 2468 // Trim the selector passed to compile 2469 // to avoid treating leading and trailing 2470 // spaces as combinators 2471 var input = [], 2472 results = [], 2473 matcher = compile( selector.replace( rtrim, "$1" ) ); 2474 2475 return matcher[ expando ] ? 2476 markFunction( function( seed, matches, _context, xml ) { 2477 var elem, 2478 unmatched = matcher( seed, null, xml, [] ), 2479 i = seed.length; 2480 2481 // Match elements unmatched by `matcher` 2482 while ( i-- ) { 2483 if ( ( elem = unmatched[ i ] ) ) { 2484 seed[ i ] = !( matches[ i ] = elem ); 2485 } 2486 } 2487 } ) : 2488 function( elem, _context, xml ) { 2489 input[ 0 ] = elem; 2490 matcher( input, null, xml, results ); 2491 2492 // Don't keep the element (issue #299) 2493 input[ 0 ] = null; 2494 return !results.pop(); 2495 }; 2496 } ), 2497 2498 "has": markFunction( function( selector ) { 2499 return function( elem ) { 2500 return Sizzle( selector, elem ).length > 0; 2501 }; 2502 } ), 2503 2504 "contains": markFunction( function( text ) { 2505 text = text.replace( runescape, funescape ); 2506 return function( elem ) { 2507 return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; 2508 }; 2509 } ), 2510 2511 // "Whether an element is represented by a :lang() selector 2512 // is based solely on the element's language value 2513 // being equal to the identifier C, 2514 // or beginning with the identifier C immediately followed by "-". 2515 // The matching of C against the element's language value is performed case-insensitively. 2516 // The identifier C does not have to be a valid language name." 2517 // http://www.w3.org/TR/selectors/#lang-pseudo 2518 "lang": markFunction( function( lang ) { 2519 2520 // lang value must be a valid identifier 2521 if ( !ridentifier.test( lang || "" ) ) { 2522 Sizzle.error( "unsupported lang: " + lang ); 2523 } 2524 lang = lang.replace( runescape, funescape ).toLowerCase(); 2525 return function( elem ) { 2526 var elemLang; 2527 do { 2528 if ( ( elemLang = documentIsHTML ? 2529 elem.lang : 2530 elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { 2531 2532 elemLang = elemLang.toLowerCase(); 2533 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; 2534 } 2535 } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); 2536 return false; 2537 }; 2538 } ), 2539 2540 // Miscellaneous 2541 "target": function( elem ) { 2542 var hash = window.location && window.location.hash; 2543 return hash && hash.slice( 1 ) === elem.id; 2544 }, 2545 2546 "root": function( elem ) { 2547 return elem === docElem; 2548 }, 2549 2550 "focus": function( elem ) { 2551 return elem === document.activeElement && 2552 ( !document.hasFocus || document.hasFocus() ) && 2553 !!( elem.type || elem.href || ~elem.tabIndex ); 2554 }, 2555 2556 // Boolean properties 2557 "enabled": createDisabledPseudo( false ), 2558 "disabled": createDisabledPseudo( true ), 2559 2560 "checked": function( elem ) { 2561 2562 // In CSS3, :checked should return both checked and selected elements 2563 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 2564 var nodeName = elem.nodeName.toLowerCase(); 2565 return ( nodeName === "input" && !!elem.checked ) || 2566 ( nodeName === "option" && !!elem.selected ); 2567 }, 2568 2569 "selected": function( elem ) { 2570 2571 // Accessing this property makes selected-by-default 2572 // options in Safari work properly 2573 if ( elem.parentNode ) { 2574 // eslint-disable-next-line no-unused-expressions 2575 elem.parentNode.selectedIndex; 2576 } 2577 2578 return elem.selected === true; 2579 }, 2580 2581 // Contents 2582 "empty": function( elem ) { 2583 2584 // http://www.w3.org/TR/selectors/#empty-pseudo 2585 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), 2586 // but not by others (comment: 8; processing instruction: 7; etc.) 2587 // nodeType < 6 works because attributes (2) do not appear as children 2588 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 2589 if ( elem.nodeType < 6 ) { 2590 return false; 2591 } 2592 } 2593 return true; 2594 }, 2595 2596 "parent": function( elem ) { 2597 return !Expr.pseudos[ "empty" ]( elem ); 2598 }, 2599 2600 // Element/input types 2601 "header": function( elem ) { 2602 return rheader.test( elem.nodeName ); 2603 }, 2604 2605 "input": function( elem ) { 2606 return rinputs.test( elem.nodeName ); 2607 }, 2608 2609 "button": function( elem ) { 2610 var name = elem.nodeName.toLowerCase(); 2611 return name === "input" && elem.type === "button" || name === "button"; 2612 }, 2613 2614 "text": function( elem ) { 2615 var attr; 2616 return elem.nodeName.toLowerCase() === "input" && 2617 elem.type === "text" && 2618 2619 // Support: IE<8 2620 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" 2621 ( ( attr = elem.getAttribute( "type" ) ) == null || 2622 attr.toLowerCase() === "text" ); 2623 }, 2624 2625 // Position-in-collection 2626 "first": createPositionalPseudo( function() { 2627 return [ 0 ]; 2628 } ), 2629 2630 "last": createPositionalPseudo( function( _matchIndexes, length ) { 2631 return [ length - 1 ]; 2632 } ), 2633 2634 "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { 2635 return [ argument < 0 ? argument + length : argument ]; 2636 } ), 2637 2638 "even": createPositionalPseudo( function( matchIndexes, length ) { 2639 var i = 0; 2640 for ( ; i < length; i += 2 ) { 2641 matchIndexes.push( i ); 2642 } 2643 return matchIndexes; 2644 } ), 2645 2646 "odd": createPositionalPseudo( function( matchIndexes, length ) { 2647 var i = 1; 2648 for ( ; i < length; i += 2 ) { 2649 matchIndexes.push( i ); 2650 } 2651 return matchIndexes; 2652 } ), 2653 2654 "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { 2655 var i = argument < 0 ? 2656 argument + length : 2657 argument > length ? 2658 length : 2659 argument; 2660 for ( ; --i >= 0; ) { 2661 matchIndexes.push( i ); 2662 } 2663 return matchIndexes; 2664 } ), 2665 2666 "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { 2667 var i = argument < 0 ? argument + length : argument; 2668 for ( ; ++i < length; ) { 2669 matchIndexes.push( i ); 2670 } 2671 return matchIndexes; 2672 } ) 2673 } 2674 }; 2675 2676 Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; 2677 2678// Add button/input type pseudos 2679 for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { 2680 Expr.pseudos[ i ] = createInputPseudo( i ); 2681 } 2682 for ( i in { submit: true, reset: true } ) { 2683 Expr.pseudos[ i ] = createButtonPseudo( i ); 2684 } 2685 2686// Easy API for creating new setFilters 2687 function setFilters() {} 2688 setFilters.prototype = Expr.filters = Expr.pseudos; 2689 Expr.setFilters = new setFilters(); 2690 2691 tokenize = Sizzle.tokenize = function( selector, parseOnly ) { 2692 var matched, match, tokens, type, 2693 soFar, groups, preFilters, 2694 cached = tokenCache[ selector + " " ]; 2695 2696 if ( cached ) { 2697 return parseOnly ? 0 : cached.slice( 0 ); 2698 } 2699 2700 soFar = selector; 2701 groups = []; 2702 preFilters = Expr.preFilter; 2703 2704 while ( soFar ) { 2705 2706 // Comma and first run 2707 if ( !matched || ( match = rcomma.exec( soFar ) ) ) { 2708 if ( match ) { 2709 2710 // Don't consume trailing commas as valid 2711 soFar = soFar.slice( match[ 0 ].length ) || soFar; 2712 } 2713 groups.push( ( tokens = [] ) ); 2714 } 2715 2716 matched = false;
vendor: 5,359 bytes, lines 2717-2834
2717 2718 // Combinators 2719 if ( ( match = rcombinators.exec( soFar ) ) ) { 2720 matched = match.shift(); 2721 tokens.push( { 2722 value: matched, 2723 2724 // Cast descendant combinators to space 2725 type: match[ 0 ].replace( rtrim, " " ) 2726 } ); 2727 soFar = soFar.slice( matched.length ); 2728 } 2729 2730 // Filters 2731 for ( type in Expr.filter ) { 2732 if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || 2733 ( match = preFilters[ type ]( match ) ) ) ) { 2734 matched = match.shift(); 2735 tokens.push( { 2736 value: matched, 2737 type: type, 2738 matches: match 2739 } ); 2740 soFar = soFar.slice( matched.length ); 2741 } 2742 } 2743 2744 if ( !matched ) { 2745 break; 2746 } 2747 } 2748 2749 // Return the length of the invalid excess 2750 // if we're just parsing 2751 // Otherwise, throw an error or return tokens 2752 return parseOnly ? 2753 soFar.length : 2754 soFar ? 2755 Sizzle.error( selector ) : 2756 2757 // Cache the tokens 2758 tokenCache( selector, groups ).slice( 0 ); 2759 }; 2760 2761 function toSelector( tokens ) { 2762 var i = 0, 2763 len = tokens.length, 2764 selector = ""; 2765 for ( ; i < len; i++ ) { 2766 selector += tokens[ i ].value; 2767 } 2768 return selector; 2769 } 2770 2771 function addCombinator( matcher, combinator, base ) { 2772 var dir = combinator.dir, 2773 skip = combinator.next, 2774 key = skip || dir, 2775 checkNonElements = base && key === "parentNode", 2776 doneName = done++; 2777 2778 return combinator.first ? 2779 2780 // Check against closest ancestor/preceding element 2781 function( elem, context, xml ) { 2782 while ( ( elem = elem[ dir ] ) ) { 2783 if ( elem.nodeType === 1 || checkNonElements ) { 2784 return matcher( elem, context, xml ); 2785 } 2786 } 2787 return false; 2788 } : 2789 2790 // Check against all ancestor/preceding elements 2791 function( elem, context, xml ) { 2792 var oldCache, uniqueCache, outerCache, 2793 newCache = [ dirruns, doneName ]; 2794 2795 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching 2796 if ( xml ) { 2797 while ( ( elem = elem[ dir ] ) ) { 2798 if ( elem.nodeType === 1 || checkNonElements ) { 2799 if ( matcher( elem, context, xml ) ) { 2800 return true; 2801 } 2802 } 2803 } 2804 } else { 2805 while ( ( elem = elem[ dir ] ) ) { 2806 if ( elem.nodeType === 1 || checkNonElements ) { 2807 outerCache = elem[ expando ] || ( elem[ expando ] = {} ); 2808 2809 // Support: IE <9 only 2810 // Defend against cloned attroperties (jQuery gh-1709) 2811 uniqueCache = outerCache[ elem.uniqueID ] || 2812 ( outerCache[ elem.uniqueID ] = {} ); 2813 2814 if ( skip && skip === elem.nodeName.toLowerCase() ) { 2815 elem = elem[ dir ] || elem; 2816 } else if ( ( oldCache = uniqueCache[ key ] ) && 2817 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { 2818 2819 // Assign to newCache so results back-propagate to previous elements 2820 return ( newCache[ 2 ] = oldCache[ 2 ] ); 2821 } else { 2822 2823 // Reuse newcache so results back-propagate to previous elements 2824 uniqueCache[ key ] = newCache; 2825 2826 // A match means we're done; a fail means we have to keep checking 2827 if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { 2828 return true; 2829 } 2830 } 2831 } 2832 } 2833 } 2834 return false;
vendor: 8,930 bytes, lines 2835-3031
2835 }; 2836 } 2837 2838 function elementMatcher( matchers ) { 2839 return matchers.length > 1 ? 2840 function( elem, context, xml ) { 2841 var i = matchers.length; 2842 while ( i-- ) { 2843 if ( !matchers[ i ]( elem, context, xml ) ) { 2844 return false; 2845 } 2846 } 2847 return true; 2848 } : 2849 matchers[ 0 ]; 2850 } 2851 2852 function multipleContexts( selector, contexts, results ) { 2853 var i = 0, 2854 len = contexts.length; 2855 for ( ; i < len; i++ ) { 2856 Sizzle( selector, contexts[ i ], results ); 2857 } 2858 return results; 2859 } 2860 2861 function condense( unmatched, map, filter, context, xml ) { 2862 var elem, 2863 newUnmatched = [], 2864 i = 0, 2865 len = unmatched.length, 2866 mapped = map != null; 2867 2868 for ( ; i < len; i++ ) { 2869 if ( ( elem = unmatched[ i ] ) ) { 2870 if ( !filter || filter( elem, context, xml ) ) { 2871 newUnmatched.push( elem ); 2872 if ( mapped ) { 2873 map.push( i ); 2874 } 2875 } 2876 } 2877 } 2878 2879 return newUnmatched; 2880 } 2881 2882 function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { 2883 if ( postFilter && !postFilter[ expando ] ) { 2884 postFilter = setMatcher( postFilter ); 2885 } 2886 if ( postFinder && !postFinder[ expando ] ) { 2887 postFinder = setMatcher( postFinder, postSelector ); 2888 } 2889 return markFunction( function( seed, results, context, xml ) { 2890 var temp, i, elem, 2891 preMap = [], 2892 postMap = [], 2893 preexisting = results.length, 2894 2895 // Get initial elements from seed or context 2896 elems = seed || multipleContexts( 2897 selector || "*", 2898 context.nodeType ? [ context ] : context, 2899 [] 2900 ), 2901 2902 // Prefilter to get matcher input, preserving a map for seed-results synchronization 2903 matcherIn = preFilter && ( seed || !selector ) ? 2904 condense( elems, preMap, preFilter, context, xml ) : 2905 elems, 2906 2907 matcherOut = matcher ? 2908 2909 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, 2910 postFinder || ( seed ? preFilter : preexisting || postFilter ) ? 2911 2912 // ...intermediate processing is necessary 2913 [] : 2914 2915 // ...otherwise use results directly 2916 results : 2917 matcherIn; 2918 2919 // Find primary matches 2920 if ( matcher ) { 2921 matcher( matcherIn, matcherOut, context, xml ); 2922 } 2923 2924 // Apply postFilter 2925 if ( postFilter ) { 2926 temp = condense( matcherOut, postMap ); 2927 postFilter( temp, [], context, xml ); 2928 2929 // Un-match failing elements by moving them back to matcherIn 2930 i = temp.length; 2931 while ( i-- ) { 2932 if ( ( elem = temp[ i ] ) ) { 2933 matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); 2934 } 2935 } 2936 } 2937 2938 if ( seed ) { 2939 if ( postFinder || preFilter ) { 2940 if ( postFinder ) { 2941 2942 // Get the final matcherOut by condensing this intermediate into postFinder contexts 2943 temp = []; 2944 i = matcherOut.length; 2945 while ( i-- ) { 2946 if ( ( elem = matcherOut[ i ] ) ) { 2947 2948 // Restore matcherIn since elem is not yet a final match 2949 temp.push( ( matcherIn[ i ] = elem ) ); 2950 } 2951 } 2952 postFinder( null, ( matcherOut = [] ), temp, xml ); 2953 } 2954 2955 // Move matched elements from seed to results to keep them synchronized 2956 i = matcherOut.length; 2957 while ( i-- ) { 2958 if ( ( elem = matcherOut[ i ] ) && 2959 ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { 2960 2961 seed[ temp ] = !( results[ temp ] = elem ); 2962 } 2963 } 2964 } 2965 2966 // Add elements to results, through postFinder if defined 2967 } else { 2968 matcherOut = condense( 2969 matcherOut === results ? 2970 matcherOut.splice( preexisting, matcherOut.length ) : 2971 matcherOut 2972 ); 2973 if ( postFinder ) { 2974 postFinder( null, results, matcherOut, xml ); 2975 } else { 2976 push.apply( results, matcherOut ); 2977 } 2978 } 2979 } ); 2980 } 2981 2982 function matcherFromTokens( tokens ) { 2983 var checkContext, matcher, j, 2984 len = tokens.length, 2985 leadingRelative = Expr.relative[ tokens[ 0 ].type ], 2986 implicitRelative = leadingRelative || Expr.relative[ " " ], 2987 i = leadingRelative ? 1 : 0, 2988 2989 // The foundational matcher ensures that elements are reachable from top-level context(s) 2990 matchContext = addCombinator( function( elem ) { 2991 return elem === checkContext; 2992 }, implicitRelative, true ), 2993 matchAnyContext = addCombinator( function( elem ) { 2994 return indexOf( checkContext, elem ) > -1; 2995 }, implicitRelative, true ), 2996 matchers = [ function( elem, context, xml ) { 2997 var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( 2998 ( checkContext = context ).nodeType ? 2999 matchContext( elem, context, xml ) : 3000 matchAnyContext( elem, context, xml ) ); 3001 3002 // Avoid hanging onto element (issue #299) 3003 checkContext = null; 3004 return ret; 3005 } ]; 3006 3007 for ( ; i < len; i++ ) { 3008 if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { 3009 matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; 3010 } else { 3011 matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); 3012 3013 // Return special upon seeing a positional matcher 3014 if ( matcher[ expando ] ) { 3015 3016 // Find the next relative operator (if any) for proper handling 3017 j = ++i; 3018 for ( ; j < len; j++ ) { 3019 if ( Expr.relative[ tokens[ j ].type ] ) { 3020 break; 3021 } 3022 } 3023 return setMatcher( 3024 i > 1 && elementMatcher( matchers ), 3025 i > 1 && toSelector( 3026 3027 // If the preceding token was a descendant combinator, insert an implicit any-element `*` 3028 tokens 3029 .slice( 0, i - 1 ) 3030 .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) 3031 ).replace( rtrim, "$1" ),
vendor: 17,588 bytes, lines 3032-3460
3032 matcher, 3033 i < j && matcherFromTokens( tokens.slice( i, j ) ), 3034 j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), 3035 j < len && toSelector( tokens ) 3036 ); 3037 } 3038 matchers.push( matcher ); 3039 } 3040 } 3041 3042 return elementMatcher( matchers ); 3043 } 3044 3045 function matcherFromGroupMatchers( elementMatchers, setMatchers ) { 3046 var bySet = setMatchers.length > 0, 3047 byElement = elementMatchers.length > 0, 3048 superMatcher = function( seed, context, xml, results, outermost ) { 3049 var elem, j, matcher, 3050 matchedCount = 0, 3051 i = "0", 3052 unmatched = seed && [], 3053 setMatched = [], 3054 contextBackup = outermostContext, 3055 3056 // We must always have either seed elements or outermost context 3057 elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), 3058 3059 // Use integer dirruns iff this is the outermost matcher 3060 dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), 3061 len = elems.length; 3062 3063 if ( outermost ) { 3064 3065 // Support: IE 11+, Edge 17 - 18+ 3066 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 3067 // two documents; shallow comparisons work. 3068 // eslint-disable-next-line eqeqeq 3069 outermostContext = context == document || context || outermost; 3070 } 3071 3072 // Add elements passing elementMatchers directly to results 3073 // Support: IE<9, Safari 3074 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id 3075 for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { 3076 if ( byElement && elem ) { 3077 j = 0; 3078 3079 // Support: IE 11+, Edge 17 - 18+ 3080 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 3081 // two documents; shallow comparisons work. 3082 // eslint-disable-next-line eqeqeq 3083 if ( !context && elem.ownerDocument != document ) { 3084 setDocument( elem ); 3085 xml = !documentIsHTML; 3086 } 3087 while ( ( matcher = elementMatchers[ j++ ] ) ) { 3088 if ( matcher( elem, context || document, xml ) ) { 3089 results.push( elem ); 3090 break; 3091 } 3092 } 3093 if ( outermost ) { 3094 dirruns = dirrunsUnique; 3095 } 3096 } 3097 3098 // Track unmatched elements for set filters 3099 if ( bySet ) { 3100 3101 // They will have gone through all possible matchers 3102 if ( ( elem = !matcher && elem ) ) { 3103 matchedCount--; 3104 } 3105 3106 // Lengthen the array for every element, matched or not 3107 if ( seed ) { 3108 unmatched.push( elem ); 3109 } 3110 } 3111 } 3112 3113 // `i` is now the count of elements visited above, and adding it to `matchedCount` 3114 // makes the latter nonnegative. 3115 matchedCount += i; 3116 3117 // Apply set filters to unmatched elements 3118 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` 3119 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have 3120 // no element matchers and no seed. 3121 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that 3122 // case, which will result in a "00" `matchedCount` that differs from `i` but is also 3123 // numerically zero. 3124 if ( bySet && i !== matchedCount ) { 3125 j = 0; 3126 while ( ( matcher = setMatchers[ j++ ] ) ) { 3127 matcher( unmatched, setMatched, context, xml ); 3128 } 3129 3130 if ( seed ) { 3131 3132 // Reintegrate element matches to eliminate the need for sorting 3133 if ( matchedCount > 0 ) { 3134 while ( i-- ) { 3135 if ( !( unmatched[ i ] || setMatched[ i ] ) ) { 3136 setMatched[ i ] = pop.call( results ); 3137 } 3138 } 3139 } 3140 3141 // Discard index placeholder values to get only actual matches 3142 setMatched = condense( setMatched ); 3143 } 3144 3145 // Add matches to results 3146 push.apply( results, setMatched ); 3147 3148 // Seedless set matches succeeding multiple successful matchers stipulate sorting 3149 if ( outermost && !seed && setMatched.length > 0 && 3150 ( matchedCount + setMatchers.length ) > 1 ) { 3151 3152 Sizzle.uniqueSort( results ); 3153 } 3154 } 3155 3156 // Override manipulation of globals by nested matchers 3157 if ( outermost ) { 3158 dirruns = dirrunsUnique; 3159 outermostContext = contextBackup; 3160 } 3161 3162 return unmatched; 3163 }; 3164 3165 return bySet ? 3166 markFunction( superMatcher ) : 3167 superMatcher; 3168 } 3169 3170 compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { 3171 var i, 3172 setMatchers = [], 3173 elementMatchers = [], 3174 cached = compilerCache[ selector + " " ]; 3175 3176 if ( !cached ) { 3177 3178 // Generate a function of recursive functions that can be used to check each element 3179 if ( !match ) { 3180 match = tokenize( selector ); 3181 } 3182 i = match.length; 3183 while ( i-- ) { 3184 cached = matcherFromTokens( match[ i ] ); 3185 if ( cached[ expando ] ) { 3186 setMatchers.push( cached ); 3187 } else { 3188 elementMatchers.push( cached ); 3189 } 3190 } 3191 3192 // Cache the compiled function 3193 cached = compilerCache( 3194 selector, 3195 matcherFromGroupMatchers( elementMatchers, setMatchers ) 3196 ); 3197 3198 // Save selector and tokenization 3199 cached.selector = selector; 3200 } 3201 return cached; 3202 }; 3203 3204 /** 3205 * A low-level selection function that works with Sizzle's compiled 3206 * selector functions 3207 * @param {String|Function} selector A selector or a pre-compiled 3208 * selector function built with Sizzle.compile 3209 * @param {Element} context 3210 * @param {Array} [results] 3211 * @param {Array} [seed] A set of elements to match against 3212 */ 3213 select = Sizzle.select = function( selector, context, results, seed ) { 3214 var i, tokens, token, type, find, 3215 compiled = typeof selector === "function" && selector, 3216 match = !seed && tokenize( ( selector = compiled.selector || selector ) ); 3217 3218 results = results || []; 3219 3220 // Try to minimize operations if there is only one selector in the list and no seed 3221 // (the latter of which guarantees us context) 3222 if ( match.length === 1 ) { 3223 3224 // Reduce context if the leading compound selector is an ID 3225 tokens = match[ 0 ] = match[ 0 ].slice( 0 ); 3226 if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && 3227 context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { 3228 3229 context = ( Expr.find[ "ID" ]( token.matches[ 0 ] 3230 .replace( runescape, funescape ), context ) || [] )[ 0 ]; 3231 if ( !context ) { 3232 return results; 3233 3234 // Precompiled matchers will still verify ancestry, so step up a level 3235 } else if ( compiled ) { 3236 context = context.parentNode; 3237 } 3238 3239 selector = selector.slice( tokens.shift().value.length ); 3240 } 3241 3242 // Fetch a seed set for right-to-left matching 3243 i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; 3244 while ( i-- ) { 3245 token = tokens[ i ]; 3246 3247 // Abort if we hit a combinator 3248 if ( Expr.relative[ ( type = token.type ) ] ) { 3249 break; 3250 } 3251 if ( ( find = Expr.find[ type ] ) ) { 3252 3253 // Search, expanding context for leading sibling combinators 3254 if ( ( seed = find( 3255 token.matches[ 0 ].replace( runescape, funescape ), 3256 rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || 3257 context 3258 ) ) ) { 3259 3260 // If seed is empty or no tokens remain, we can return early 3261 tokens.splice( i, 1 ); 3262 selector = seed.length && toSelector( tokens ); 3263 if ( !selector ) { 3264 push.apply( results, seed ); 3265 return results; 3266 } 3267 3268 break; 3269 } 3270 } 3271 } 3272 } 3273 3274 // Compile and execute a filtering function if one is not provided 3275 // Provide `match` to avoid retokenization if we modified the selector above 3276 ( compiled || compile( selector, match ) )( 3277 seed, 3278 context, 3279 !documentIsHTML, 3280 results, 3281 !context || rsibling.test( selector ) && testContext( context.parentNode ) || context 3282 ); 3283 return results; 3284 }; 3285 3286// One-time assignments 3287 3288// Sort stability 3289 support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; 3290 3291// Support: Chrome 14-35+ 3292// Always assume duplicates if they aren't passed to the comparison function 3293 support.detectDuplicates = !!hasDuplicate; 3294 3295// Initialize against the default document 3296 setDocument(); 3297 3298// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) 3299// Detached nodes confoundingly follow *each other* 3300 support.sortDetached = assert( function( el ) { 3301 3302 // Should return 1, but returns 4 (following) 3303 return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; 3304 } ); 3305 3306// Support: IE<8 3307// Prevent attribute/property "interpolation" 3308// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx 3309 if ( !assert( function( el ) { 3310 el.innerHTML = "<a href='#'></a>"; 3311 return el.firstChild.getAttribute( "href" ) === "#"; 3312 } ) ) { 3313 addHandle( "type|href|height|width", function( elem, name, isXML ) { 3314 if ( !isXML ) { 3315 return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); 3316 } 3317 } ); 3318 } 3319 3320// Support: IE<9 3321// Use defaultValue in place of getAttribute("value") 3322 if ( !support.attributes || !assert( function( el ) { 3323 el.innerHTML = "<input/>"; 3324 el.firstChild.setAttribute( "value", "" ); 3325 return el.firstChild.getAttribute( "value" ) === ""; 3326 } ) ) { 3327 addHandle( "value", function( elem, _name, isXML ) { 3328 if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { 3329 return elem.defaultValue; 3330 } 3331 } ); 3332 } 3333 3334// Support: IE<9 3335// Use getAttributeNode to fetch booleans when getAttribute lies 3336 if ( !assert( function( el ) { 3337 return el.getAttribute( "disabled" ) == null; 3338 } ) ) { 3339 addHandle( booleans, function( elem, name, isXML ) { 3340 var val; 3341 if ( !isXML ) { 3342 return elem[ name ] === true ? name.toLowerCase() : 3343 ( val = elem.getAttributeNode( name ) ) && val.specified ? 3344 val.value : 3345 null; 3346 } 3347 } ); 3348 } 3349 3350 return Sizzle; 3351 3352 } )( window ); 3353 3354 3355 3356 jQuery.find = Sizzle; 3357 jQuery.expr = Sizzle.selectors; 3358 3359// Deprecated 3360 jQuery.expr[ ":" ] = jQuery.expr.pseudos; 3361 jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; 3362 jQuery.text = Sizzle.getText; 3363 jQuery.isXMLDoc = Sizzle.isXML; 3364 jQuery.contains = Sizzle.contains; 3365 jQuery.escapeSelector = Sizzle.escape; 3366 3367 3368 3369 3370 var dir = function( elem, dir, until ) { 3371 var matched = [], 3372 truncate = until !== undefined; 3373 3374 while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { 3375 if ( elem.nodeType === 1 ) { 3376 if ( truncate && jQuery( elem ).is( until ) ) { 3377 break; 3378 } 3379 matched.push( elem ); 3380 } 3381 } 3382 return matched; 3383 }; 3384 3385 3386 var siblings = function( n, elem ) { 3387 var matched = []; 3388 3389 for ( ; n; n = n.nextSibling ) { 3390 if ( n.nodeType === 1 && n !== elem ) { 3391 matched.push( n ); 3392 } 3393 } 3394 3395 return matched; 3396 }; 3397 3398 3399 var rneedsContext = jQuery.expr.match.needsContext; 3400 3401 3402 3403 function nodeName( elem, name ) { 3404 3405 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 3406 3407 } 3408 var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); 3409 3410 3411 3412// Implement the identical functionality for filter and not 3413 function winnow( elements, qualifier, not ) { 3414 if ( isFunction( qualifier ) ) { 3415 return jQuery.grep( elements, function( elem, i ) { 3416 return !!qualifier.call( elem, i, elem ) !== not; 3417 } ); 3418 } 3419 3420 // Single element 3421 if ( qualifier.nodeType ) { 3422 return jQuery.grep( elements, function( elem ) { 3423 return ( elem === qualifier ) !== not; 3424 } ); 3425 } 3426 3427 // Arraylike of elements (jQuery, arguments, Array) 3428 if ( typeof qualifier !== "string" ) { 3429 return jQuery.grep( elements, function( elem ) { 3430 return ( indexOf.call( qualifier, elem ) > -1 ) !== not; 3431 } ); 3432 } 3433 3434 // Filtered directly for both simple and complex selectors 3435 return jQuery.filter( qualifier, elements, not ); 3436 } 3437 3438 jQuery.filter = function( expr, elems, not ) { 3439 var elem = elems[ 0 ]; 3440 3441 if ( not ) { 3442 expr = ":not(" + expr + ")"; 3443 } 3444 3445 if ( elems.length === 1 && elem.nodeType === 1 ) { 3446 return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; 3447 } 3448 3449 return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { 3450 return elem.nodeType === 1; 3451 } ) ); 3452 }; 3453 3454 jQuery.fn.extend( { 3455 find: function( selector ) { 3456 var i, ret, 3457 len = this.length, 3458 self = this; 3459 3460 if ( typeof selector !== "string" ) {
vendor: 6,677 bytes, lines 3461-3647
3461 return this.pushStack( jQuery( selector ).filter( function() { 3462 for ( i = 0; i < len; i++ ) { 3463 if ( jQuery.contains( self[ i ], this ) ) { 3464 return true; 3465 } 3466 } 3467 } ) ); 3468 } 3469 3470 ret = this.pushStack( [] ); 3471 3472 for ( i = 0; i < len; i++ ) { 3473 jQuery.find( selector, self[ i ], ret ); 3474 } 3475 3476 return len > 1 ? jQuery.uniqueSort( ret ) : ret; 3477 }, 3478 filter: function( selector ) { 3479 return this.pushStack( winnow( this, selector || [], false ) ); 3480 }, 3481 not: function( selector ) { 3482 return this.pushStack( winnow( this, selector || [], true ) ); 3483 }, 3484 is: function( selector ) { 3485 return !!winnow( 3486 this, 3487 3488 // If this is a positional/relative selector, check membership in the returned set 3489 // so $("p:first").is("p:last") won't return true for a doc with two "p". 3490 typeof selector === "string" && rneedsContext.test( selector ) ? 3491 jQuery( selector ) : 3492 selector || [], 3493 false 3494 ).length; 3495 } 3496 } ); 3497 3498 3499// Initialize a jQuery object 3500 3501 3502// A central reference to the root jQuery(document) 3503 var rootjQuery, 3504 3505 // A simple way to check for HTML strings 3506 // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) 3507 // Strict HTML recognition (#11290: must start with <) 3508 // Shortcut simple #id case for speed 3509 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, 3510 3511 init = jQuery.fn.init = function( selector, context, root ) { 3512 var match, elem; 3513 3514 // HANDLE: $(""), $(null), $(undefined), $(false) 3515 if ( !selector ) { 3516 return this; 3517 } 3518 3519 // Method init() accepts an alternate rootjQuery 3520 // so migrate can support jQuery.sub (gh-2101) 3521 root = root || rootjQuery; 3522 3523 // Handle HTML strings 3524 if ( typeof selector === "string" ) { 3525 if ( selector[ 0 ] === "<" && 3526 selector[ selector.length - 1 ] === ">" && 3527 selector.length >= 3 ) { 3528 3529 // Assume that strings that start and end with <> are HTML and skip the regex check 3530 match = [ null, selector, null ]; 3531 3532 } else { 3533 match = rquickExpr.exec( selector ); 3534 } 3535 3536 // Match html or make sure no context is specified for #id 3537 if ( match && ( match[ 1 ] || !context ) ) { 3538 3539 // HANDLE: $(html) -> $(array) 3540 if ( match[ 1 ] ) { 3541 context = context instanceof jQuery ? context[ 0 ] : context; 3542 3543 // Option to run scripts is true for back-compat 3544 // Intentionally let the error be thrown if parseHTML is not present 3545 jQuery.merge( this, jQuery.parseHTML( 3546 match[ 1 ], 3547 context && context.nodeType ? context.ownerDocument || context : document, 3548 true 3549 ) ); 3550 3551 // HANDLE: $(html, props) 3552 if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { 3553 for ( match in context ) { 3554 3555 // Properties of context are called as methods if possible 3556 if ( isFunction( this[ match ] ) ) { 3557 this[ match ]( context[ match ] ); 3558 3559 // ...and otherwise set as attributes 3560 } else { 3561 this.attr( match, context[ match ] ); 3562 } 3563 } 3564 } 3565 3566 return this; 3567 3568 // HANDLE: $(#id) 3569 } else { 3570 elem = document.getElementById( match[ 2 ] ); 3571 3572 if ( elem ) { 3573 3574 // Inject the element directly into the jQuery object 3575 this[ 0 ] = elem; 3576 this.length = 1; 3577 } 3578 return this; 3579 } 3580 3581 // HANDLE: $(expr, $(...)) 3582 } else if ( !context || context.jquery ) { 3583 return ( context || root ).find( selector ); 3584 3585 // HANDLE: $(expr, context) 3586 // (which is just equivalent to: $(context).find(expr) 3587 } else { 3588 return this.constructor( context ).find( selector ); 3589 } 3590 3591 // HANDLE: $(DOMElement) 3592 } else if ( selector.nodeType ) { 3593 this[ 0 ] = selector; 3594 this.length = 1; 3595 return this; 3596 3597 // HANDLE: $(function) 3598 // Shortcut for document ready 3599 } else if ( isFunction( selector ) ) { 3600 return root.ready !== undefined ? 3601 root.ready( selector ) : 3602 3603 // Execute immediately if ready is not present 3604 selector( jQuery ); 3605 } 3606 3607 return jQuery.makeArray( selector, this ); 3608 }; 3609 3610// Give the init function the jQuery prototype for later instantiation 3611 init.prototype = jQuery.fn; 3612 3613// Initialize central reference 3614 rootjQuery = jQuery( document ); 3615 3616 3617 var rparentsprev = /^(?:parents|prev(?:Until|All))/, 3618 3619 // Methods guaranteed to produce a unique set when starting from a unique set 3620 guaranteedUnique = { 3621 children: true, 3622 contents: true, 3623 next: true, 3624 prev: true 3625 }; 3626 3627 jQuery.fn.extend( { 3628 has: function( target ) { 3629 var targets = jQuery( target, this ), 3630 l = targets.length; 3631 3632 return this.filter( function() { 3633 var i = 0; 3634 for ( ; i < l; i++ ) { 3635 if ( jQuery.contains( this, targets[ i ] ) ) { 3636 return true; 3637 } 3638 } 3639 } ); 3640 }, 3641 3642 closest: function( selectors, context ) { 3643 var cur, 3644 i = 0, 3645 l = this.length, 3646 matched = [], 3647 targets = typeof selectors !== "string" && jQuery(
vendor: 4,293 bytes, lines 3647-3771
3647selectors ); 3648 3649 // Positional selectors never match, since there's no _selection_ context 3650 if ( !rneedsContext.test( selectors ) ) { 3651 for ( ; i < l; i++ ) { 3652 for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { 3653 3654 // Always skip document fragments 3655 if ( cur.nodeType < 11 && ( targets ? 3656 targets.index( cur ) > -1 : 3657 3658 // Don't pass non-elements to Sizzle 3659 cur.nodeType === 1 && 3660 jQuery.find.matchesSelector( cur, selectors ) ) ) { 3661 3662 matched.push( cur ); 3663 break; 3664 } 3665 } 3666 } 3667 } 3668 3669 return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); 3670 }, 3671 3672 // Determine the position of an element within the set 3673 index: function( elem ) { 3674 3675 // No argument, return index in parent 3676 if ( !elem ) { 3677 return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; 3678 } 3679 3680 // Index in selector 3681 if ( typeof elem === "string" ) { 3682 return indexOf.call( jQuery( elem ), this[ 0 ] ); 3683 } 3684 3685 // Locate the position of the desired element 3686 return indexOf.call( this, 3687 3688 // If it receives a jQuery object, the first element is used 3689 elem.jquery ? elem[ 0 ] : elem 3690 ); 3691 }, 3692 3693 add: function( selector, context ) { 3694 return this.pushStack( 3695 jQuery.uniqueSort( 3696 jQuery.merge( this.get(), jQuery( selector, context ) ) 3697 ) 3698 ); 3699 }, 3700 3701 addBack: function( selector ) { 3702 return this.add( selector == null ? 3703 this.prevObject : this.prevObject.filter( selector ) 3704 ); 3705 } 3706 } ); 3707 3708 function sibling( cur, dir ) { 3709 while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} 3710 return cur; 3711 } 3712 3713 jQuery.each( { 3714 parent: function( elem ) { 3715 var parent = elem.parentNode; 3716 return parent && parent.nodeType !== 11 ? parent : null; 3717 }, 3718 parents: function( elem ) { 3719 return dir( elem, "parentNode" ); 3720 }, 3721 parentsUntil: function( elem, _i, until ) { 3722 return dir( elem, "parentNode", until ); 3723 }, 3724 next: function( elem ) { 3725 return sibling( elem, "nextSibling" ); 3726 }, 3727 prev: function( elem ) { 3728 return sibling( elem, "previousSibling" ); 3729 }, 3730 nextAll: function( elem ) { 3731 return dir( elem, "nextSibling" ); 3732 }, 3733 prevAll: function( elem ) { 3734 return dir( elem, "previousSibling" ); 3735 }, 3736 nextUntil: function( elem, _i, until ) { 3737 return dir( elem, "nextSibling", until ); 3738 }, 3739 prevUntil: function( elem, _i, until ) { 3740 return dir( elem, "previousSibling", until ); 3741 }, 3742 siblings: function( elem ) { 3743 return siblings( ( elem.parentNode || {} ).firstChild, elem ); 3744 }, 3745 children: function( elem ) { 3746 return siblings( elem.firstChild ); 3747 }, 3748 contents: function( elem ) { 3749 if ( elem.contentDocument != null && 3750 3751 // Support: IE 11+ 3752 // <object> elements with no `data` attribute has an object 3753 // `contentDocument` with a `null` prototype. 3754 getProto( elem.contentDocument ) ) { 3755 3756 return elem.contentDocument; 3757 } 3758 3759 // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only 3760 // Treat the template element as a regular one in browsers that 3761 // don't support it. 3762 if ( nodeName( elem, "template" ) ) { 3763 elem = elem.content || elem; 3764 } 3765 3766 return jQuery.merge( [], elem.childNodes ); 3767 } 3768 }, function( name, fn ) { 3769 jQuery.fn[ name ] = function( until, selector ) { 3770 var matched = jQuery.map( this, fn, until ); 3771
vendor: 35,404 bytes, lines 3772-4703
3772 if ( name.slice( -5 ) !== "Until" ) { 3773 selector = until; 3774 } 3775 3776 if ( selector && typeof selector === "string" ) { 3777 matched = jQuery.filter( selector, matched ); 3778 } 3779 3780 if ( this.length > 1 ) { 3781 3782 // Remove duplicates 3783 if ( !guaranteedUnique[ name ] ) { 3784 jQuery.uniqueSort( matched ); 3785 } 3786 3787 // Reverse order for parents* and prev-derivatives 3788 if ( rparentsprev.test( name ) ) { 3789 matched.reverse(); 3790 } 3791 } 3792 3793 return this.pushStack( matched ); 3794 }; 3795 } ); 3796 var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); 3797 3798 3799 3800// Convert String-formatted options into Object-formatted ones 3801 function createOptions( options ) { 3802 var object = {}; 3803 jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { 3804 object[ flag ] = true; 3805 } ); 3806 return object; 3807 } 3808 3809 /* 3810 * Create a callback list using the following parameters: 3811 * 3812 * options: an optional list of space-separated options that will change how 3813 * the callback list behaves or a more traditional option object 3814 * 3815 * By default a callback list will act like an event callback list and can be 3816 * "fired" multiple times. 3817 * 3818 * Possible options: 3819 * 3820 * once: will ensure the callback list can only be fired once (like a Deferred) 3821 * 3822 * memory: will keep track of previous values and will call any callback added 3823 * after the list has been fired right away with the latest "memorized" 3824 * values (like a Deferred) 3825 * 3826 * unique: will ensure a callback can only be added once (no duplicate in the list) 3827 * 3828 * stopOnFalse: interrupt callings when a callback returns false 3829 * 3830 */ 3831 jQuery.Callbacks = function( options ) { 3832 3833 // Convert options from String-formatted to Object-formatted if needed 3834 // (we check in cache first) 3835 options = typeof options === "string" ? 3836 createOptions( options ) : 3837 jQuery.extend( {}, options ); 3838 3839 var // Flag to know if list is currently firing 3840 firing, 3841 3842 // Last fire value for non-forgettable lists 3843 memory, 3844 3845 // Flag to know if list was already fired 3846 fired, 3847 3848 // Flag to prevent firing 3849 locked, 3850 3851 // Actual callback list 3852 list = [], 3853 3854 // Queue of execution data for repeatable lists 3855 queue = [], 3856 3857 // Index of currently firing callback (modified by add/remove as needed) 3858 firingIndex = -1, 3859 3860 // Fire callbacks 3861 fire = function() { 3862 3863 // Enforce single-firing 3864 locked = locked || options.once; 3865 3866 // Execute callbacks for all pending executions, 3867 // respecting firingIndex overrides and runtime changes 3868 fired = firing = true; 3869 for ( ; queue.length; firingIndex = -1 ) { 3870 memory = queue.shift(); 3871 while ( ++firingIndex < list.length ) { 3872 3873 // Run callback and check for early termination 3874 if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && 3875 options.stopOnFalse ) { 3876 3877 // Jump to end and forget the data so .add doesn't re-fire 3878 firingIndex = list.length; 3879 memory = false; 3880 } 3881 } 3882 } 3883 3884 // Forget the data if we're done with it 3885 if ( !options.memory ) { 3886 memory = false; 3887 } 3888 3889 firing = false; 3890 3891 // Clean up if we're done firing for good 3892 if ( locked ) { 3893 3894 // Keep an empty list if we have data for future add calls 3895 if ( memory ) { 3896 list = []; 3897 3898 // Otherwise, this object is spent 3899 } else { 3900 list = ""; 3901 } 3902 } 3903 }, 3904 3905 // Actual Callbacks object 3906 self = { 3907 3908 // Add a callback or a collection of callbacks to the list 3909 add: function() { 3910 if ( list ) { 3911 3912 // If we have memory from a past run, we should fire after adding 3913 if ( memory && !firing ) { 3914 firingIndex = list.length - 1; 3915 queue.push( memory ); 3916 } 3917 3918 ( function add( args ) { 3919 jQuery.each( args, function( _, arg ) { 3920 if ( isFunction( arg ) ) { 3921 if ( !options.unique || !self.has( arg ) ) { 3922 list.push( arg ); 3923 } 3924 } else if ( arg && arg.length && toType( arg ) !== "string" ) { 3925 3926 // Inspect recursively 3927 add( arg ); 3928 } 3929 } ); 3930 } )( arguments ); 3931 3932 if ( memory && !firing ) { 3933 fire(); 3934 } 3935 } 3936 return this; 3937 }, 3938 3939 // Remove a callback from the list 3940 remove: function() { 3941 jQuery.each( arguments, function( _, arg ) { 3942 var index; 3943 while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { 3944 list.splice( index, 1 ); 3945 3946 // Handle firing indexes 3947 if ( index <= firingIndex ) { 3948 firingIndex--; 3949 } 3950 } 3951 } ); 3952 return this; 3953 }, 3954 3955 // Check if a given callback is in the list. 3956 // If no argument is given, return whether or not list has callbacks attached. 3957 has: function( fn ) { 3958 return fn ? 3959 jQuery.inArray( fn, list ) > -1 : 3960 list.length > 0; 3961 }, 3962 3963 // Remove all callbacks from the list 3964 empty: function() { 3965 if ( list ) { 3966 list = []; 3967 } 3968 return this; 3969 }, 3970 3971 // Disable .fire and .add 3972 // Abort any current/pending executions 3973 // Clear all callbacks and values 3974 disable: function() { 3975 locked = queue = []; 3976 list = memory = ""; 3977 return this; 3978 }, 3979 disabled: function() { 3980 return !list; 3981 }, 3982 3983 // Disable .fire 3984 // Also disable .add unless we have memory (since it would have no effect) 3985 // Abort any pending executions 3986 lock: function() { 3987 locked = queue = []; 3988 if ( !memory && !firing ) { 3989 list = memory = ""; 3990 } 3991 return this; 3992 }, 3993 locked: function() { 3994 return !!locked; 3995 }, 3996 3997 // Call all callbacks with the given context and arguments 3998 fireWith: function( context, args ) { 3999 if ( !locked ) { 4000 args = args || []; 4001 args = [ context, args.slice ? args.slice() : args ]; 4002 queue.push( args ); 4003 if ( !firing ) { 4004 fire(); 4005 } 4006 } 4007 return this; 4008 }, 4009 4010 // Call all the callbacks with the given arguments 4011 fire: function() { 4012 self.fireWith( this, arguments ); 4013 return this; 4014 }, 4015 4016 // To know if the callbacks have already been called at least once 4017 fired: function() { 4018 return !!fired; 4019 } 4020 }; 4021 4022 return self; 4023 }; 4024 4025 4026 function Identity( v ) { 4027 return v; 4028 } 4029 function Thrower( ex ) { 4030 throw ex; 4031 } 4032 4033 function adoptValue( value, resolve, reject, noValue ) { 4034 var method; 4035 4036 try { 4037 4038 // Check for promise aspect first to privilege synchronous behavior 4039 if ( value && isFunction( ( method = value.promise ) ) ) { 4040 method.call( value ).done( resolve ).fail( reject ); 4041 4042 // Other thenables 4043 } else if ( value && isFunction( ( method = value.then ) ) ) { 4044 method.call( value, resolve, reject ); 4045 4046 // Other non-thenables 4047 } else { 4048 4049 // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: 4050 // * false: [ value ].slice( 0 ) => resolve( value ) 4051 // * true: [ value ].slice( 1 ) => resolve() 4052 resolve.apply( undefined, [ value ].slice( noValue ) ); 4053 } 4054 4055 // For Promises/A+, convert exceptions into rejections 4056 // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in 4057 // Deferred#then to conditionally suppress rejection. 4058 } catch ( value ) { 4059 4060 // Support: Android 4.0 only 4061 // Strict mode functions invoked without .call/.apply get global-object context 4062 reject.apply( undefined, [ value ] ); 4063 } 4064 } 4065 4066 jQuery.extend( { 4067 4068 Deferred: function( func ) { 4069 var tuples = [ 4070 4071 // action, add listener, callbacks, 4072 // ... .then handlers, argument index, [final state] 4073 [ "notify", "progress", jQuery.Callbacks( "memory" ), 4074 jQuery.Callbacks( "memory" ), 2 ], 4075 [ "resolve", "done", jQuery.Callbacks( "once memory" ), 4076 jQuery.Callbacks( "once memory" ), 0, "resolved" ], 4077 [ "reject", "fail", jQuery.Callbacks( "once memory" ), 4078 jQuery.Callbacks( "once memory" ), 1, "rejected" ] 4079 ], 4080 state = "pending", 4081 promise = { 4082 state: function() { 4083 return state; 4084 }, 4085 always: function() { 4086 deferred.done( arguments ).fail( arguments ); 4087 return this; 4088 }, 4089 "catch": function( fn ) { 4090 return promise.then( null, fn ); 4091 }, 4092 4093 // Keep pipe for back-compat 4094 pipe: function( /* fnDone, fnFail, fnProgress */ ) { 4095 var fns = arguments; 4096 4097 return jQuery.Deferred( function( newDefer ) { 4098 jQuery.each( tuples, function( _i, tuple ) { 4099 4100 // Map tuples (progress, done, fail) to arguments (done, fail, progress) 4101 var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; 4102 4103 // deferred.progress(function() { bind to newDefer or newDefer.notify }) 4104 // deferred.done(function() { bind to newDefer or newDefer.resolve }) 4105 // deferred.fail(function() { bind to newDefer or newDefer.reject }) 4106 deferred[ tuple[ 1 ] ]( function() { 4107 var returned = fn && fn.apply( this, arguments ); 4108 if ( returned && isFunction( returned.promise ) ) { 4109 returned.promise() 4110 .progress( newDefer.notify ) 4111 .done( newDefer.resolve ) 4112 .fail( newDefer.reject ); 4113 } else { 4114 newDefer[ tuple[ 0 ] + "With" ]( 4115 this, 4116 fn ? [ returned ] : arguments 4117 ); 4118 } 4119 } ); 4120 } ); 4121 fns = null; 4122 } ).promise(); 4123 }, 4124 then: function( onFulfilled, onRejected, onProgress ) { 4125 var maxDepth = 0; 4126 function resolve( depth, deferred, handler, special ) { 4127 return function() { 4128 var that = this, 4129 args = arguments, 4130 mightThrow = function() { 4131 var returned, then; 4132 4133 // Support: Promises/A+ section 2.3.3.3.3 4134 // https://promisesaplus.com/#point-59 4135 // Ignore double-resolution attempts 4136 if ( depth < maxDepth ) { 4137 return; 4138 } 4139 4140 returned = handler.apply( that, args ); 4141 4142 // Support: Promises/A+ section 2.3.1 4143 // https://promisesaplus.com/#point-48 4144 if ( returned === deferred.promise() ) { 4145 throw new TypeError( "Thenable self-resolution" ); 4146 } 4147 4148 // Support: Promises/A+ sections 2.3.3.1, 3.5 4149 // https://promisesaplus.com/#point-54 4150 // https://promisesaplus.com/#point-75 4151 // Retrieve `then` only once 4152 then = returned && 4153 4154 // Support: Promises/A+ section 2.3.4 4155 // https://promisesaplus.com/#point-64 4156 // Only check objects and functions for thenability 4157 ( typeof returned === "object" || 4158 typeof returned === "function" ) && 4159 returned.then; 4160 4161 // Handle a returned thenable 4162 if ( isFunction( then ) ) { 4163 4164 // Special processors (notify) just wait for resolution 4165 if ( special ) { 4166 then.call( 4167 returned, 4168 resolve( maxDepth, deferred, Identity, special ), 4169 resolve( maxDepth, deferred, Thrower, special ) 4170 ); 4171 4172 // Normal processors (resolve) also hook into progress 4173 } else { 4174 4175 // ...and disregard older resolution values 4176 maxDepth++; 4177 4178 then.call( 4179 returned, 4180 resolve( maxDepth, deferred, Identity, special ), 4181 resolve( maxDepth, deferred, Thrower, special ), 4182 resolve( maxDepth, deferred, Identity, 4183 deferred.notifyWith ) 4184 ); 4185 } 4186 4187 // Handle all other returned values 4188 } else { 4189 4190 // Only substitute handlers pass on context 4191 // and multiple values (non-spec behavior) 4192 if ( handler !== Identity ) { 4193 that = undefined; 4194 args = [ returned ]; 4195 } 4196 4197 // Process the value(s) 4198 // Default process is resolve 4199 ( special || deferred.resolveWith )( that, args ); 4200 } 4201 }, 4202 4203 // Only normal processors (resolve) catch and reject exceptions 4204 process = special ? 4205 mightThrow : 4206 function() { 4207 try { 4208 mightThrow(); 4209 } catch ( e ) { 4210 4211 if ( jQuery.Deferred.exceptionHook ) { 4212 jQuery.Deferred.exceptionHook( e, 4213 process.stackTrace ); 4214 } 4215 4216 // Support: Promises/A+ section 2.3.3.3.4.1 4217 // https://promisesaplus.com/#point-61 4218 // Ignore post-resolution exceptions 4219 if ( depth + 1 >= maxDepth ) { 4220 4221 // Only substitute handlers pass on context 4222 // and multiple values (non-spec behavior) 4223 if ( handler !== Thrower ) { 4224 that = undefined; 4225 args = [ e ]; 4226 } 4227 4228 deferred.rejectWith( that, args ); 4229 } 4230 } 4231 }; 4232 4233 // Support: Promises/A+ section 2.3.3.3.1 4234 // https://promisesaplus.com/#point-57 4235 // Re-resolve promises immediately to dodge false rejection from 4236 // subsequent errors 4237 if ( depth ) { 4238 process(); 4239 } else { 4240 4241 // Call an optional hook to record the stack, in case of exception 4242 // since it's otherwise lost when execution goes async 4243 if ( jQuery.Deferred.getStackHook ) { 4244 process.stackTrace = jQuery.Deferred.getStackHook(); 4245 } 4246 window.setTimeout( process ); 4247 } 4248 }; 4249 } 4250 4251 return jQuery.Deferred( function( newDefer ) { 4252 4253 // progress_handlers.add( ... ) 4254 tuples[ 0 ][ 3 ].add( 4255 resolve( 4256 0, 4257 newDefer, 4258 isFunction( onProgress ) ? 4259 onProgress : 4260 Identity, 4261 newDefer.notifyWith 4262 ) 4263 ); 4264 4265 // fulfilled_handlers.add( ... ) 4266 tuples[ 1 ][ 3 ].add( 4267 resolve( 4268 0, 4269 newDefer, 4270 isFunction( onFulfilled ) ? 4271 onFulfilled : 4272 Identity 4273 ) 4274 ); 4275 4276 // rejected_handlers.add( ... ) 4277 tuples[ 2 ][ 3 ].add( 4278 resolve( 4279 0, 4280 newDefer, 4281 isFunction( onRejected ) ? 4282 onRejected : 4283 Thrower 4284 ) 4285 ); 4286 } ).promise(); 4287 }, 4288 4289 // Get a promise for this deferred 4290 // If obj is provided, the promise aspect is added to the object 4291 promise: function( obj ) { 4292 return obj != null ? jQuery.extend( obj, promise ) : promise; 4293 } 4294 }, 4295 deferred = {}; 4296 4297 // Add list-specific methods 4298 jQuery.each( tuples, function( i, tuple ) { 4299 var list = tuple[ 2 ], 4300 stateString = tuple[ 5 ]; 4301 4302 // promise.progress = list.add 4303 // promise.done = list.add 4304 // promise.fail = list.add 4305 promise[ tuple[ 1 ] ] = list.add; 4306 4307 // Handle state 4308 if ( stateString ) { 4309 list.add( 4310 function() { 4311 4312 // state = "resolved" (i.e., fulfilled) 4313 // state = "rejected" 4314 state = stateString; 4315 }, 4316 4317 // rejected_callbacks.disable 4318 // fulfilled_callbacks.disable 4319 tuples[ 3 - i ][ 2 ].disable, 4320 4321 // rejected_handlers.disable 4322 // fulfilled_handlers.disable 4323 tuples[ 3 - i ][ 3 ].disable, 4324 4325 // progress_callbacks.lock 4326 tuples[ 0 ][ 2 ].lock, 4327 4328 // progress_handlers.lock 4329 tuples[ 0 ][ 3 ].lock 4330 ); 4331 } 4332 4333 // progress_handlers.fire 4334 // fulfilled_handlers.fire 4335 // rejected_handlers.fire 4336 list.add( tuple[ 3 ].fire ); 4337 4338 // deferred.notify = function() { deferred.notifyWith(...) } 4339 // deferred.resolve = function() { deferred.resolveWith(...) } 4340 // deferred.reject = function() { deferred.rejectWith(...) } 4341 deferred[ tuple[ 0 ] ] = function() { 4342 deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); 4343 return this; 4344 }; 4345 4346 // deferred.notifyWith = list.fireWith 4347 // deferred.resolveWith = list.fireWith 4348 // deferred.rejectWith = list.fireWith 4349 deferred[ tuple[ 0 ] + "With" ] = list.fireWith; 4350 } ); 4351 4352 // Make the deferred a promise 4353 promise.promise( deferred ); 4354 4355 // Call given func if any 4356 if ( func ) { 4357 func.call( deferred, deferred ); 4358 } 4359 4360 // All done! 4361 return deferred; 4362 }, 4363 4364 // Deferred helper 4365 when: function( singleValue ) { 4366 var 4367 4368 // count of uncompleted subordinates 4369 remaining = arguments.length, 4370 4371 // count of unprocessed arguments 4372 i = remaining, 4373 4374 // subordinate fulfillment data 4375 resolveContexts = Array( i ), 4376 resolveValues = slice.call( arguments ), 4377 4378 // the primary Deferred 4379 primary = jQuery.Deferred(), 4380 4381 // subordinate callback factory 4382 updateFunc = function( i ) { 4383 return function( value ) { 4384 resolveContexts[ i ] = this; 4385 resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; 4386 if ( !( --remaining ) ) { 4387 primary.resolveWith( resolveContexts, resolveValues ); 4388 } 4389 }; 4390 }; 4391 4392 // Single- and empty arguments are adopted like Promise.resolve 4393 if ( remaining <= 1 ) { 4394 adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, 4395 !remaining ); 4396 4397 // Use .then() to unwrap secondary thenables (cf. gh-3000) 4398 if ( primary.state() === "pending" || 4399 isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { 4400 4401 return primary.then(); 4402 } 4403 } 4404 4405 // Multiple arguments are aggregated like Promise.all array elements 4406 while ( i-- ) { 4407 adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); 4408 } 4409 4410 return primary.promise(); 4411 } 4412 } ); 4413 4414 4415// These usually indicate a programmer mistake during development, 4416// warn about them ASAP rather than swallowing them by default. 4417 var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; 4418 4419 jQuery.Deferred.exceptionHook = function( error, stack ) { 4420 4421 // Support: IE 8 - 9 only 4422 // Console exists when dev tools are open, which can happen at any time 4423 if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { 4424 window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); 4425 } 4426 }; 4427 4428 4429 4430 4431 jQuery.readyException = function( error ) { 4432 window.setTimeout( function() { 4433 throw error; 4434 } ); 4435 }; 4436 4437 4438 4439 4440// The deferred used on DOM ready 4441 var readyList = jQuery.Deferred(); 4442 4443 jQuery.fn.ready = function( fn ) { 4444 4445 readyList 4446 .then( fn ) 4447 4448 // Wrap jQuery.readyException in a function so that the lookup 4449 // happens at the time of error handling instead of callback 4450 // registration. 4451 .catch( function( error ) { 4452 jQuery.readyException( error ); 4453 } ); 4454 4455 return this; 4456 }; 4457 4458 jQuery.extend( { 4459 4460 // Is the DOM ready to be used? Set to true once it occurs. 4461 isReady: false, 4462 4463 // A counter to track how many items to wait for before 4464 // the ready event fires. See #6781 4465 readyWait: 1, 4466 4467 // Handle when the DOM is ready 4468 ready: function( wait ) { 4469 4470 // Abort if there are pending holds or we're already ready 4471 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { 4472 return; 4473 } 4474 4475 // Remember that the DOM is ready 4476 jQuery.isReady = true; 4477 4478 // If a normal DOM Ready event fired, decrement, and wait if need be 4479 if ( wait !== true && --jQuery.readyWait > 0 ) { 4480 return; 4481 } 4482 4483 // If there are functions bound, to execute 4484 readyList.resolveWith( document, [ jQuery ] ); 4485 } 4486 } ); 4487 4488 jQuery.ready.then = readyList.then; 4489 4490// The ready event handler and self cleanup method 4491 function completed() { 4492 document.removeEventListener( "DOMContentLoaded", completed ); 4493 window.removeEventListener( "load", completed ); 4494 jQuery.ready(); 4495 } 4496 4497// Catch cases where $(document).ready() is called 4498// after the browser event has already occurred. 4499// Support: IE <=9 - 10 only 4500// Older IE sometimes signals "interactive" too soon 4501 if ( document.readyState === "complete" || 4502 ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { 4503 4504 // Handle it asynchronously to allow scripts the opportunity to delay ready 4505 window.setTimeout( jQuery.ready ); 4506 4507 } else { 4508 4509 // Use the handy event callback 4510 document.addEventListener( "DOMContentLoaded", completed ); 4511 4512 // A fallback to window.onload, that will always work 4513 window.addEventListener( "load", completed ); 4514 } 4515 4516 4517 4518 4519// Multifunctional method to get and set values of a collection 4520// The value/s can optionally be executed if it's a function 4521 var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { 4522 var i = 0, 4523 len = elems.length, 4524 bulk = key == null; 4525 4526 // Sets many values 4527 if ( toType( key ) === "object" ) { 4528 chainable = true; 4529 for ( i in key ) { 4530 access( elems, fn, i, key[ i ], true, emptyGet, raw ); 4531 } 4532 4533 // Sets one value 4534 } else if ( value !== undefined ) { 4535 chainable = true; 4536 4537 if ( !isFunction( value ) ) { 4538 raw = true; 4539 } 4540 4541 if ( bulk ) { 4542 4543 // Bulk operations run against the entire set 4544 if ( raw ) { 4545 fn.call( elems, value ); 4546 fn = null; 4547 4548 // ...except when executing function values 4549 } else { 4550 bulk = fn; 4551 fn = function( elem, _key, value ) { 4552 return bulk.call( jQuery( elem ), value ); 4553 }; 4554 } 4555 } 4556 4557 if ( fn ) { 4558 for ( ; i < len; i++ ) { 4559 fn( 4560 elems[ i ], key, raw ? 4561 value : 4562 value.call( elems[ i ], i, fn( elems[ i ], key ) ) 4563 ); 4564 } 4565 } 4566 } 4567 4568 if ( chainable ) { 4569 return elems; 4570 } 4571 4572 // Gets 4573 if ( bulk ) { 4574 return fn.call( elems ); 4575 } 4576 4577 return len ? fn( elems[ 0 ], key ) : emptyGet; 4578 }; 4579 4580 4581// Matches dashed string for camelizing 4582 var rmsPrefix = /^-ms-/, 4583 rdashAlpha = /-([a-z])/g; 4584 4585// Used by camelCase as callback to replace() 4586 function fcamelCase( _all, letter ) { 4587 return letter.toUpperCase(); 4588 } 4589 4590// Convert dashed to camelCase; used by the css and data modules 4591// Support: IE <=9 - 11, Edge 12 - 15 4592// Microsoft forgot to hump their vendor prefix (#9572) 4593 function camelCase( string ) { 4594 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); 4595 } 4596 var acceptData = function( owner ) { 4597 4598 // Accepts only: 4599 // - Node 4600 // - Node.ELEMENT_NODE 4601 // - Node.DOCUMENT_NODE 4602 // - Object 4603 // - Any 4604 return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); 4605 }; 4606 4607 4608 4609 4610 function Data() { 4611 this.expando = jQuery.expando + Data.uid++; 4612 } 4613 4614 Data.uid = 1; 4615 4616 Data.prototype = { 4617 4618 cache: function( owner ) { 4619 4620 // Check if the owner object already has a cache 4621 var value = owner[ this.expando ]; 4622 4623 // If not, create one 4624 if ( !value ) { 4625 value = {}; 4626 4627 // We can accept data for non-element nodes in modern browsers, 4628 // but we should not, see #8335. 4629 // Always return an empty object. 4630 if ( acceptData( owner ) ) { 4631 4632 // If it is a node unlikely to be stringify-ed or looped over 4633 // use plain assignment 4634 if ( owner.nodeType ) { 4635 owner[ this.expando ] = value; 4636 4637 // Otherwise secure it in a non-enumerable property 4638 // configurable must be true to allow the property to be 4639 // deleted when data is removed 4640 } else { 4641 Object.defineProperty( owner, this.expando, { 4642 value: value, 4643 configurable: true 4644 } ); 4645 } 4646 } 4647 } 4648 4649 return value; 4650 }, 4651 set: function( owner, data, value ) { 4652 var prop, 4653 cache = this.cache( owner ); 4654 4655 // Handle: [ owner, key, value ] args 4656 // Always use camelCase key (gh-2257) 4657 if ( typeof data === "string" ) { 4658 cache[ camelCase( data ) ] = value; 4659 4660 // Handle: [ owner, { properties } ] args 4661 } else { 4662 4663 // Copy the properties one-by-one to the cache object 4664 for ( prop in data ) { 4665 cache[ camelCase( prop ) ] = data[ prop ]; 4666 } 4667 } 4668 return cache; 4669 }, 4670 get: function( owner, key ) { 4671 return key === undefined ? 4672 this.cache( owner ) : 4673 4674 // Always use camelCase key (gh-2257) 4675 owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; 4676 }, 4677 access: function( owner, key, value ) { 4678 4679 // In cases where either: 4680 // 4681 // 1. No key was specified 4682 // 2. A string key was specified, but no value provided 4683 // 4684 // Take the "read" path and allow the get method to determine 4685 // which value to return, respectively either: 4686 // 4687 // 1. The entire cache object 4688 // 2. The data stored at the key 4689 // 4690 if ( key === undefined || 4691 ( ( key && typeof key === "string" ) && value === undefined ) ) { 4692 4693 return this.get( owner, key ); 4694 } 4695 4696 // When the key is not a string, or both a key and value 4697 // are specified, set or extend (existing objects) with either: 4698 // 4699 // 1. An object of properties 4700 // 2. A key and value 4701 // 4702 this.set( owner, key, value ); 4703
vendor: 9,776 bytes, lines 4704-4994
4704 // Since the "set" path can have two possible entry points 4705 // return the expected data based on which path was taken[*] 4706 return value !== undefined ? value : key; 4707 }, 4708 remove: function( owner, key ) { 4709 var i, 4710 cache = owner[ this.expando ]; 4711 4712 if ( cache === undefined ) { 4713 return; 4714 } 4715 4716 if ( key !== undefined ) { 4717 4718 // Support array or space separated string of keys 4719 if ( Array.isArray( key ) ) { 4720 4721 // If key is an array of keys... 4722 // We always set camelCase keys, so remove that. 4723 key = key.map( camelCase ); 4724 } else { 4725 key = camelCase( key ); 4726 4727 // If a key with the spaces exists, use it. 4728 // Otherwise, create an array by matching non-whitespace 4729 key = key in cache ? 4730 [ key ] : 4731 ( key.match( rnothtmlwhite ) || [] ); 4732 } 4733 4734 i = key.length; 4735 4736 while ( i-- ) { 4737 delete cache[ key[ i ] ]; 4738 } 4739 } 4740 4741 // Remove the expando if there's no more data 4742 if ( key === undefined || jQuery.isEmptyObject( cache ) ) { 4743 4744 // Support: Chrome <=35 - 45 4745 // Webkit & Blink performance suffers when deleting properties 4746 // from DOM nodes, so set to undefined instead 4747 // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) 4748 if ( owner.nodeType ) { 4749 owner[ this.expando ] = undefined; 4750 } else { 4751 delete owner[ this.expando ]; 4752 } 4753 } 4754 }, 4755 hasData: function( owner ) { 4756 var cache = owner[ this.expando ]; 4757 return cache !== undefined && !jQuery.isEmptyObject( cache ); 4758 } 4759 }; 4760 var dataPriv = new Data(); 4761 4762 var dataUser = new Data(); 4763 4764 4765 4766// Implementation Summary 4767// 4768// 1. Enforce API surface and semantic compatibility with 1.9.x branch 4769// 2. Improve the module's maintainability by reducing the storage 4770// paths to a single mechanism. 4771// 3. Use the same single mechanism to support "private" and "user" data. 4772// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) 4773// 5. Avoid exposing implementation details on user objects (eg. expando properties) 4774// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 4775 4776 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, 4777 rmultiDash = /[A-Z]/g; 4778 4779 function getData( data ) { 4780 if ( data === "true" ) { 4781 return true; 4782 } 4783 4784 if ( data === "false" ) { 4785 return false; 4786 } 4787 4788 if ( data === "null" ) { 4789 return null; 4790 } 4791 4792 // Only convert to a number if it doesn't change the string 4793 if ( data === +data + "" ) { 4794 return +data; 4795 } 4796 4797 if ( rbrace.test( data ) ) { 4798 return JSON.parse( data ); 4799 } 4800 4801 return data; 4802 } 4803 4804 function dataAttr( elem, key, data ) { 4805 var name; 4806 4807 // If nothing was found internally, try to fetch any 4808 // data from the HTML5 data-* attribute 4809 if ( data === undefined && elem.nodeType === 1 ) { 4810 name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); 4811 data = elem.getAttribute( name ); 4812 4813 if ( typeof data === "string" ) { 4814 try { 4815 data = getData( data ); 4816 } catch ( e ) {} 4817 4818 // Make sure we set the data so it isn't changed later 4819 dataUser.set( elem, key, data ); 4820 } else { 4821 data = undefined; 4822 } 4823 } 4824 return data; 4825 } 4826 4827 jQuery.extend( { 4828 hasData: function( elem ) { 4829 return dataUser.hasData( elem ) || dataPriv.hasData( elem ); 4830 }, 4831 4832 data: function( elem, name, data ) { 4833 return dataUser.access( elem, name, data ); 4834 }, 4835 4836 removeData: function( elem, name ) { 4837 dataUser.remove( elem, name ); 4838 }, 4839 4840 // TODO: Now that all calls to _data and _removeData have been replaced 4841 // with direct calls to dataPriv methods, these can be deprecated. 4842 _data: function( elem, name, data ) { 4843 return dataPriv.access( elem, name, data ); 4844 }, 4845 4846 _removeData: function( elem, name ) { 4847 dataPriv.remove( elem, name ); 4848 } 4849 } ); 4850 4851 jQuery.fn.extend( { 4852 data: function( key, value ) { 4853 var i, name, data, 4854 elem = this[ 0 ], 4855 attrs = elem && elem.attributes; 4856 4857 // Gets all values 4858 if ( key === undefined ) { 4859 if ( this.length ) { 4860 data = dataUser.get( elem ); 4861 4862 if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { 4863 i = attrs.length; 4864 while ( i-- ) { 4865 4866 // Support: IE 11 only 4867 // The attrs elements can be null (#14894) 4868 if ( attrs[ i ] ) { 4869 name = attrs[ i ].name; 4870 if ( name.indexOf( "data-" ) === 0 ) { 4871 name = camelCase( name.slice( 5 ) ); 4872 dataAttr( elem, name, data[ name ] ); 4873 } 4874 } 4875 } 4876 dataPriv.set( elem, "hasDataAttrs", true ); 4877 } 4878 } 4879 4880 return data; 4881 } 4882 4883 // Sets multiple values 4884 if ( typeof key === "object" ) { 4885 return this.each( function() { 4886 dataUser.set( this, key ); 4887 } ); 4888 } 4889 4890 return access( this, function( value ) { 4891 var data; 4892 4893 // The calling jQuery object (element matches) is not empty 4894 // (and therefore has an element appears at this[ 0 ]) and the 4895 // `value` parameter was not undefined. An empty jQuery object 4896 // will result in `undefined` for elem = this[ 0 ] which will 4897 // throw an exception if an attempt to read a data cache is made. 4898 if ( elem && value === undefined ) { 4899 4900 // Attempt to get data from the cache 4901 // The key will always be camelCased in Data 4902 data = dataUser.get( elem, key ); 4903 if ( data !== undefined ) { 4904 return data; 4905 } 4906 4907 // Attempt to "discover" the data in 4908 // HTML5 custom data-* attrs 4909 data = dataAttr( elem, key ); 4910 if ( data !== undefined ) { 4911 return data; 4912 } 4913 4914 // We tried really hard, but the data doesn't exist. 4915 return; 4916 } 4917 4918 // Set the data... 4919 this.each( function() { 4920 4921 // We always store the camelCased key 4922 dataUser.set( this, key, value ); 4923 } ); 4924 }, null, value, arguments.length > 1, null, true ); 4925 }, 4926 4927 removeData: function( key ) { 4928 return this.each( function() { 4929 dataUser.remove( this, key ); 4930 } ); 4931 } 4932 } ); 4933 4934 4935 jQuery.extend( { 4936 queue: function( elem, type, data ) { 4937 var queue; 4938 4939 if ( elem ) { 4940 type = ( type || "fx" ) + "queue"; 4941 queue = dataPriv.get( elem, type ); 4942 4943 // Speed up dequeue by getting out quickly if this is just a lookup 4944 if ( data ) { 4945 if ( !queue || Array.isArray( data ) ) { 4946 queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); 4947 } else { 4948 queue.push( data ); 4949 } 4950 } 4951 return queue || []; 4952 } 4953 }, 4954 4955 dequeue: function( elem, type ) { 4956 type = type || "fx"; 4957 4958 var queue = jQuery.queue( elem, type ), 4959 startLength = queue.length, 4960 fn = queue.shift(), 4961 hooks = jQuery._queueHooks( elem, type ), 4962 next = function() { 4963 jQuery.dequeue( elem, type ); 4964 }; 4965 4966 // If the fx queue is dequeued, always remove the progress sentinel 4967 if ( fn === "inprogress" ) { 4968 fn = queue.shift(); 4969 startLength--; 4970 } 4971 4972 if ( fn ) { 4973 4974 // Add a progress sentinel to prevent the fx queue from being 4975 // automatically dequeued 4976 if ( type === "fx" ) { 4977 queue.unshift( "inprogress" ); 4978 } 4979 4980 // Clear up the last queue stop function 4981 delete hooks.stop; 4982 fn.call( elem, next, hooks ); 4983 } 4984 4985 if ( !startLength && hooks ) { 4986 hooks.empty.fire(); 4987 } 4988 }, 4989 4990 // Not public - generate a queueHooks object, or return the current one 4991 _queueHooks: function( elem, type ) { 4992 var key = type + "queueHooks"; 4993 return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { 4994 empty: jQuery.Callbacks( "once memory" ).add( function() {
vendor: 23,556 bytes, lines 4995-5693
4995 dataPriv.remove( elem, [ type + "queue", key ] ); 4996 } ) 4997 } ); 4998 } 4999 } ); 5000 5001 jQuery.fn.extend( { 5002 queue: function( type, data ) { 5003 var setter = 2; 5004 5005 if ( typeof type !== "string" ) { 5006 data = type; 5007 type = "fx"; 5008 setter--; 5009 } 5010 5011 if ( arguments.length < setter ) { 5012 return jQuery.queue( this[ 0 ], type ); 5013 } 5014 5015 return data === undefined ? 5016 this : 5017 this.each( function() { 5018 var queue = jQuery.queue( this, type, data ); 5019 5020 // Ensure a hooks for this queue 5021 jQuery._queueHooks( this, type ); 5022 5023 if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { 5024 jQuery.dequeue( this, type ); 5025 } 5026 } ); 5027 }, 5028 dequeue: function( type ) { 5029 return this.each( function() { 5030 jQuery.dequeue( this, type ); 5031 } ); 5032 }, 5033 clearQueue: function( type ) { 5034 return this.queue( type || "fx", [] ); 5035 }, 5036 5037 // Get a promise resolved when queues of a certain type 5038 // are emptied (fx is the type by default) 5039 promise: function( type, obj ) { 5040 var tmp, 5041 count = 1, 5042 defer = jQuery.Deferred(), 5043 elements = this, 5044 i = this.length, 5045 resolve = function() { 5046 if ( !( --count ) ) { 5047 defer.resolveWith( elements, [ elements ] ); 5048 } 5049 }; 5050 5051 if ( typeof type !== "string" ) { 5052 obj = type; 5053 type = undefined; 5054 } 5055 type = type || "fx"; 5056 5057 while ( i-- ) { 5058 tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); 5059 if ( tmp && tmp.empty ) { 5060 count++; 5061 tmp.empty.add( resolve ); 5062 } 5063 } 5064 resolve(); 5065 return defer.promise( obj ); 5066 } 5067 } ); 5068 var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; 5069 5070 var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); 5071 5072 5073 var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; 5074 5075 var documentElement = document.documentElement; 5076 5077 5078 5079 var isAttached = function( elem ) { 5080 return jQuery.contains( elem.ownerDocument, elem ); 5081 }, 5082 composed = { composed: true }; 5083 5084 // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only 5085 // Check attachment across shadow DOM boundaries when possible (gh-3504) 5086 // Support: iOS 10.0-10.2 only 5087 // Early iOS 10 versions support `attachShadow` but not `getRootNode`, 5088 // leading to errors. We need to check for `getRootNode`. 5089 if ( documentElement.getRootNode ) { 5090 isAttached = function( elem ) { 5091 return jQuery.contains( elem.ownerDocument, elem ) || 5092 elem.getRootNode( composed ) === elem.ownerDocument; 5093 }; 5094 } 5095 var isHiddenWithinTree = function( elem, el ) { 5096 5097 // isHiddenWithinTree might be called from jQuery#filter function; 5098 // in that case, element will be second argument 5099 elem = el || elem; 5100 5101 // Inline style trumps all 5102 return elem.style.display === "none" || 5103 elem.style.display === "" && 5104 5105 // Otherwise, check computed style 5106 // Support: Firefox <=43 - 45 5107 // Disconnected elements can have computed display: none, so first confirm that elem is 5108 // in the document. 5109 isAttached( elem ) && 5110 5111 jQuery.css( elem, "display" ) === "none"; 5112 }; 5113 5114 5115 5116 function adjustCSS( elem, prop, valueParts, tween ) { 5117 var adjusted, scale, 5118 maxIterations = 20, 5119 currentValue = tween ? 5120 function() { 5121 return tween.cur(); 5122 } : 5123 function() { 5124 return jQuery.css( elem, prop, "" ); 5125 }, 5126 initial = currentValue(), 5127 unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), 5128 5129 // Starting value computation is required for potential unit mismatches 5130 initialInUnit = elem.nodeType && 5131 ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && 5132 rcssNum.exec( jQuery.css( elem, prop ) ); 5133 5134 if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { 5135 5136 // Support: Firefox <=54 5137 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) 5138 initial = initial / 2; 5139 5140 // Trust units reported by jQuery.css 5141 unit = unit || initialInUnit[ 3 ]; 5142 5143 // Iteratively approximate from a nonzero starting point 5144 initialInUnit = +initial || 1; 5145 5146 while ( maxIterations-- ) { 5147 5148 // Evaluate and update our best guess (doubling guesses that zero out). 5149 // Finish if the scale equals or crosses 1 (making the old*new product non-positive). 5150 jQuery.style( elem, prop, initialInUnit + unit ); 5151 if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { 5152 maxIterations = 0; 5153 } 5154 initialInUnit = initialInUnit / scale; 5155 5156 } 5157 5158 initialInUnit = initialInUnit * 2; 5159 jQuery.style( elem, prop, initialInUnit + unit ); 5160 5161 // Make sure we update the tween properties later on 5162 valueParts = valueParts || []; 5163 } 5164 5165 if ( valueParts ) { 5166 initialInUnit = +initialInUnit || +initial || 0; 5167 5168 // Apply relative offset (+=/-=) if specified 5169 adjusted = valueParts[ 1 ] ? 5170 initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : 5171 +valueParts[ 2 ]; 5172 if ( tween ) { 5173 tween.unit = unit; 5174 tween.start = initialInUnit; 5175 tween.end = adjusted; 5176 } 5177 } 5178 return adjusted; 5179 } 5180 5181 5182 var defaultDisplayMap = {}; 5183 5184 function getDefaultDisplay( elem ) { 5185 var temp, 5186 doc = elem.ownerDocument, 5187 nodeName = elem.nodeName, 5188 display = defaultDisplayMap[ nodeName ]; 5189 5190 if ( display ) { 5191 return display; 5192 } 5193 5194 temp = doc.body.appendChild( doc.createElement( nodeName ) ); 5195 display = jQuery.css( temp, "display" ); 5196 5197 temp.parentNode.removeChild( temp ); 5198 5199 if ( display === "none" ) { 5200 display = "block"; 5201 } 5202 defaultDisplayMap[ nodeName ] = display; 5203 5204 return display; 5205 } 5206 5207 function showHide( elements, show ) { 5208 var display, elem, 5209 values = [], 5210 index = 0, 5211 length = elements.length; 5212 5213 // Determine new display value for elements that need to change 5214 for ( ; index < length; index++ ) { 5215 elem = elements[ index ]; 5216 if ( !elem.style ) { 5217 continue; 5218 } 5219 5220 display = elem.style.display; 5221 if ( show ) { 5222 5223 // Since we force visibility upon cascade-hidden elements, an immediate (and slow) 5224 // check is required in this first loop unless we have a nonempty display value (either 5225 // inline or about-to-be-restored) 5226 if ( display === "none" ) { 5227 values[ index ] = dataPriv.get( elem, "display" ) || null; 5228 if ( !values[ index ] ) { 5229 elem.style.display = ""; 5230 } 5231 } 5232 if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { 5233 values[ index ] = getDefaultDisplay( elem ); 5234 } 5235 } else { 5236 if ( display !== "none" ) { 5237 values[ index ] = "none"; 5238 5239 // Remember what we're overwriting 5240 dataPriv.set( elem, "display", display ); 5241 } 5242 } 5243 } 5244 5245 // Set the display of the elements in a second loop to avoid constant reflow 5246 for ( index = 0; index < length; index++ ) { 5247 if ( values[ index ] != null ) { 5248 elements[ index ].style.display = values[ index ]; 5249 } 5250 } 5251 5252 return elements; 5253 } 5254 5255 jQuery.fn.extend( { 5256 show: function() { 5257 return showHide( this, true ); 5258 }, 5259 hide: function() { 5260 return showHide( this ); 5261 }, 5262 toggle: function( state ) { 5263 if ( typeof state === "boolean" ) { 5264 return state ? this.show() : this.hide(); 5265 } 5266 5267 return this.each( function() { 5268 if ( isHiddenWithinTree( this ) ) { 5269 jQuery( this ).show(); 5270 } else { 5271 jQuery( this ).hide(); 5272 } 5273 } ); 5274 } 5275 } ); 5276 var rcheckableType = ( /^(?:checkbox|radio)$/i ); 5277 5278 var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); 5279 5280 var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); 5281 5282 5283 5284 ( function() { 5285 var fragment = document.createDocumentFragment(), 5286 div = fragment.appendChild( document.createElement( "div" ) ), 5287 input = document.createElement( "input" ); 5288 5289 // Support: Android 4.0 - 4.3 only 5290 // Check state lost if the name is set (#11217) 5291 // Support: Windows Web Apps (WWA) 5292 // `name` and `type` must use .setAttribute for WWA (#14901) 5293 input.setAttribute( "type", "radio" ); 5294 input.setAttribute( "checked", "checked" ); 5295 input.setAttribute( "name", "t" ); 5296 5297 div.appendChild( input ); 5298 5299 // Support: Android <=4.1 only 5300 // Older WebKit doesn't clone checked state correctly in fragments 5301 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; 5302 5303 // Support: IE <=11 only 5304 // Make sure textarea (and checkbox) defaultValue is properly cloned 5305 div.innerHTML = "<textarea>x</textarea>"; 5306 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; 5307 5308 // Support: IE <=9 only 5309 // IE <=9 replaces <option> tags with their contents when inserted outside of 5310 // the select element. 5311 div.innerHTML = "<option></option>"; 5312 support.option = !!div.lastChild; 5313 } )(); 5314 5315 5316// We have to close these tags to support XHTML (#13200) 5317 var wrapMap = { 5318 5319 // XHTML parsers do not magically insert elements in the 5320 // same way that tag soup parsers do. So we cannot shorten 5321 // this by omitting <tbody> or other required elements. 5322 thead: [ 1, "<table>", "</table>" ], 5323 col: [ 2, "<table><colgroup>", "</colgroup></table>" ], 5324 tr: [ 2, "<table><tbody>", "</tbody></table>" ], 5325 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 5326 5327 _default: [ 0, "", "" ] 5328 }; 5329 5330 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 5331 wrapMap.th = wrapMap.td; 5332 5333// Support: IE <=9 only 5334 if ( !support.option ) { 5335 wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ]; 5336 } 5337 5338 5339 function getAll( context, tag ) { 5340 5341 // Support: IE <=9 - 11 only 5342 // Use typeof to avoid zero-argument method invocation on host objects (#15151) 5343 var ret; 5344 5345 if ( typeof context.getElementsByTagName !== "undefined" ) { 5346 ret = context.getElementsByTagName( tag || "*" ); 5347 5348 } else if ( typeof context.querySelectorAll !== "undefined" ) { 5349 ret = context.querySelectorAll( tag || "*" ); 5350 5351 } else { 5352 ret = []; 5353 } 5354 5355 if ( tag === undefined || tag && nodeName( context, tag ) ) { 5356 return jQuery.merge( [ context ], ret ); 5357 } 5358 5359 return ret; 5360 } 5361 5362 5363// Mark scripts as having already been evaluated 5364 function setGlobalEval( elems, refElements ) { 5365 var i = 0, 5366 l = elems.length; 5367 5368 for ( ; i < l; i++ ) { 5369 dataPriv.set( 5370 elems[ i ], 5371 "globalEval", 5372 !refElements || dataPriv.get( refElements[ i ], "globalEval" ) 5373 ); 5374 } 5375 } 5376 5377 5378 var rhtml = /<|&#?\w+;/; 5379 5380 function buildFragment( elems, context, scripts, selection, ignored ) { 5381 var elem, tmp, tag, wrap, attached, j, 5382 fragment = context.createDocumentFragment(), 5383 nodes = [], 5384 i = 0, 5385 l = elems.length; 5386 5387 for ( ; i < l; i++ ) { 5388 elem = elems[ i ]; 5389 5390 if ( elem || elem === 0 ) { 5391 5392 // Add nodes directly 5393 if ( toType( elem ) === "object" ) { 5394 5395 // Support: Android <=4.0 only, PhantomJS 1 only 5396 // push.apply(_, arraylike) throws on ancient WebKit 5397 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); 5398 5399 // Convert non-html into a text node 5400 } else if ( !rhtml.test( elem ) ) { 5401 nodes.push( context.createTextNode( elem ) ); 5402 5403 // Convert html into DOM nodes 5404 } else { 5405 tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); 5406 5407 // Deserialize a standard representation 5408 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); 5409 wrap = wrapMap[ tag ] || wrapMap._default; 5410 tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; 5411 5412 // Descend through wrappers to the right content 5413 j = wrap[ 0 ]; 5414 while ( j-- ) { 5415 tmp = tmp.lastChild; 5416 } 5417 5418 // Support: Android <=4.0 only, PhantomJS 1 only 5419 // push.apply(_, arraylike) throws on ancient WebKit 5420 jQuery.merge( nodes, tmp.childNodes ); 5421 5422 // Remember the top-level container 5423 tmp = fragment.firstChild; 5424 5425 // Ensure the created nodes are orphaned (#12392) 5426 tmp.textContent = ""; 5427 } 5428 } 5429 } 5430 5431 // Remove wrapper from fragment 5432 fragment.textContent = ""; 5433 5434 i = 0; 5435 while ( ( elem = nodes[ i++ ] ) ) { 5436 5437 // Skip elements already in the context collection (trac-4087) 5438 if ( selection && jQuery.inArray( elem, selection ) > -1 ) { 5439 if ( ignored ) { 5440 ignored.push( elem ); 5441 } 5442 continue; 5443 } 5444 5445 attached = isAttached( elem ); 5446 5447 // Append to fragment 5448 tmp = getAll( fragment.appendChild( elem ), "script" ); 5449 5450 // Preserve script evaluation history 5451 if ( attached ) { 5452 setGlobalEval( tmp ); 5453 } 5454 5455 // Capture executables 5456 if ( scripts ) { 5457 j = 0; 5458 while ( ( elem = tmp[ j++ ] ) ) { 5459 if ( rscriptType.test( elem.type || "" ) ) { 5460 scripts.push( elem ); 5461 } 5462 } 5463 } 5464 } 5465 5466 return fragment; 5467 } 5468 5469 5470 var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 5471 5472 function returnTrue() { 5473 return true; 5474 } 5475 5476 function returnFalse() { 5477 return false; 5478 } 5479 5480// Support: IE <=9 - 11+ 5481// focus() and blur() are asynchronous, except when they are no-op. 5482// So expect focus to be synchronous when the element is already active, 5483// and blur to be synchronous when the element is not already active. 5484// (focus and blur are always synchronous in other supported browsers, 5485// this just defines when we can count on it). 5486 function expectSync( elem, type ) { 5487 return ( elem === safeActiveElement() ) === ( type === "focus" ); 5488 } 5489 5490// Support: IE <=9 only 5491// Accessing document.activeElement can throw unexpectedly 5492// https://bugs.jquery.com/ticket/13393 5493 function safeActiveElement() { 5494 try { 5495 return document.activeElement; 5496 } catch ( err ) { } 5497 } 5498 5499 function on( elem, types, selector, data, fn, one ) { 5500 var origFn, type; 5501 5502 // Types can be a map of types/handlers 5503 if ( typeof types === "object" ) { 5504 5505 // ( types-Object, selector, data ) 5506 if ( typeof selector !== "string" ) { 5507 5508 // ( types-Object, data ) 5509 data = data || selector; 5510 selector = undefined; 5511 } 5512 for ( type in types ) { 5513 on( elem, type, selector, data, types[ type ], one ); 5514 } 5515 return elem; 5516 } 5517 5518 if ( data == null && fn == null ) { 5519 5520 // ( types, fn ) 5521 fn = selector; 5522 data = selector = undefined; 5523 } else if ( fn == null ) { 5524 if ( typeof selector === "string" ) { 5525 5526 // ( types, selector, fn ) 5527 fn = data; 5528 data = undefined; 5529 } else { 5530 5531 // ( types, data, fn ) 5532 fn = data; 5533 data = selector; 5534 selector = undefined; 5535 } 5536 } 5537 if ( fn === false ) { 5538 fn = returnFalse; 5539 } else if ( !fn ) { 5540 return elem; 5541 } 5542 5543 if ( one === 1 ) { 5544 origFn = fn; 5545 fn = function( event ) { 5546 5547 // Can use an empty set, since event contains the info 5548 jQuery().off( event ); 5549 return origFn.apply( this, arguments ); 5550 }; 5551 5552 // Use same guid so caller can remove using origFn 5553 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); 5554 } 5555 return elem.each( function() { 5556 jQuery.event.add( this, types, fn, data, selector ); 5557 } ); 5558 } 5559 5560 /* 5561 * Helper functions for managing events -- not part of the public interface. 5562 * Props to Dean Edwards' addEvent library for many of the ideas. 5563 */ 5564 jQuery.event = { 5565 5566 global: {}, 5567 5568 add: function( elem, types, handler, data, selector ) { 5569 5570 var handleObjIn, eventHandle, tmp, 5571 events, t, handleObj, 5572 special, handlers, type, namespaces, origType, 5573 elemData = dataPriv.get( elem ); 5574 5575 // Only attach events to objects that accept data 5576 if ( !acceptData( elem ) ) { 5577 return; 5578 } 5579 5580 // Caller can pass in an object of custom data in lieu of the handler 5581 if ( handler.handler ) { 5582 handleObjIn = handler; 5583 handler = handleObjIn.handler; 5584 selector = handleObjIn.selector; 5585 } 5586 5587 // Ensure that invalid selectors throw exceptions at attach time 5588 // Evaluate against documentElement in case elem is a non-element node (e.g., document) 5589 if ( selector ) { 5590 jQuery.find.matchesSelector( documentElement, selector ); 5591 } 5592 5593 // Make sure that the handler has a unique ID, used to find/remove it later 5594 if ( !handler.guid ) { 5595 handler.guid = jQuery.guid++; 5596 } 5597 5598 // Init the element's event structure and main handler, if this is the first 5599 if ( !( events = elemData.events ) ) { 5600 events = elemData.events = Object.create( null ); 5601 } 5602 if ( !( eventHandle = elemData.handle ) ) { 5603 eventHandle = elemData.handle = function( e ) { 5604 5605 // Discard the second event of a jQuery.event.trigger() and 5606 // when an event is called after a page has unloaded 5607 return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? 5608 jQuery.event.dispatch.apply( elem, arguments ) : undefined; 5609 }; 5610 } 5611 5612 // Handle multiple events separated by a space 5613 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 5614 t = types.length; 5615 while ( t-- ) { 5616 tmp = rtypenamespace.exec( types[ t ] ) || []; 5617 type = origType = tmp[ 1 ]; 5618 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 5619 5620 // There *must* be a type, no attaching namespace-only handlers 5621 if ( !type ) { 5622 continue; 5623 } 5624 5625 // If event changes its type, use the special event handlers for the changed type 5626 special = jQuery.event.special[ type ] || {}; 5627 5628 // If selector defined, determine special event api type, otherwise given type 5629 type = ( selector ? special.delegateType : special.bindType ) || type; 5630 5631 // Update special based on newly reset type 5632 special = jQuery.event.special[ type ] || {}; 5633 5634 // handleObj is passed to all event handlers 5635 handleObj = jQuery.extend( { 5636 type: type, 5637 origType: origType, 5638 data: data, 5639 handler: handler, 5640 guid: handler.guid, 5641 selector: selector, 5642 needsContext: selector && jQuery.expr.match.needsContext.test( selector ), 5643 namespace: namespaces.join( "." ) 5644 }, handleObjIn ); 5645 5646 // Init the event handler queue if we're the first 5647 if ( !( handlers = events[ type ] ) ) { 5648 handlers = events[ type ] = []; 5649 handlers.delegateCount = 0; 5650 5651 // Only use addEventListener if the special events handler returns false 5652 if ( !special.setup || 5653 special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 5654 5655 if ( elem.addEventListener ) { 5656 elem.addEventListener( type, eventHandle ); 5657 } 5658 } 5659 } 5660 5661 if ( special.add ) { 5662 special.add.call( elem, handleObj ); 5663 5664 if ( !handleObj.handler.guid ) { 5665 handleObj.handler.guid = handler.guid; 5666 } 5667 } 5668 5669 // Add to the element's handler list, delegates in front 5670 if ( selector ) { 5671 handlers.splice( handlers.delegateCount++, 0, handleObj ); 5672 } else { 5673 handlers.push( handleObj ); 5674 } 5675 5676 // Keep track of which events have ever been used, for event optimization 5677 jQuery.event.global[ type ] = true; 5678 } 5679 5680 }, 5681 5682 // Detach an event or set of events from an element 5683 remove: function( elem, types, handler, selector, mappedTypes ) { 5684 5685 var j, origCount, tmp, 5686 events, t, handleObj, 5687 special, handlers, type, namespaces, origType, 5688 elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); 5689 5690 if ( !elemData || !( events = elemData.events ) ) { 5691 return; 5692 } 5693
vendor: 4,497 bytes, lines 5694-5797
5694 // Once for each type.namespace in types; type may be omitted 5695 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 5696 t = types.length; 5697 while ( t-- ) { 5698 tmp = rtypenamespace.exec( types[ t ] ) || []; 5699 type = origType = tmp[ 1 ]; 5700 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 5701 5702 // Unbind all events (on this namespace, if provided) for the element 5703 if ( !type ) { 5704 for ( type in events ) { 5705 jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); 5706 } 5707 continue; 5708 } 5709 5710 special = jQuery.event.special[ type ] || {}; 5711 type = ( selector ? special.delegateType : special.bindType ) || type; 5712 handlers = events[ type ] || []; 5713 tmp = tmp[ 2 ] && 5714 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); 5715 5716 // Remove matching events 5717 origCount = j = handlers.length; 5718 while ( j-- ) { 5719 handleObj = handlers[ j ]; 5720 5721 if ( ( mappedTypes || origType === handleObj.origType ) && 5722 ( !handler || handler.guid === handleObj.guid ) && 5723 ( !tmp || tmp.test( handleObj.namespace ) ) && 5724 ( !selector || selector === handleObj.selector || 5725 selector === "**" && handleObj.selector ) ) { 5726 handlers.splice( j, 1 ); 5727 5728 if ( handleObj.selector ) { 5729 handlers.delegateCount--; 5730 } 5731 if ( special.remove ) { 5732 special.remove.call( elem, handleObj ); 5733 } 5734 } 5735 } 5736 5737 // Remove generic event handler if we removed something and no more handlers exist 5738 // (avoids potential for endless recursion during removal of special event handlers) 5739 if ( origCount && !handlers.length ) { 5740 if ( !special.teardown || 5741 special.teardown.call( elem, namespaces, elemData.handle ) === false ) { 5742 5743 jQuery.removeEvent( elem, type, elemData.handle ); 5744 } 5745 5746 delete events[ type ]; 5747 } 5748 } 5749 5750 // Remove data and the expando if it's no longer used 5751 if ( jQuery.isEmptyObject( events ) ) { 5752 dataPriv.remove( elem, "handle events" ); 5753 } 5754 }, 5755 5756 dispatch: function( nativeEvent ) { 5757 5758 var i, j, ret, matched, handleObj, handlerQueue, 5759 args = new Array( arguments.length ), 5760 5761 // Make a writable jQuery.Event from the native event object 5762 event = jQuery.event.fix( nativeEvent ), 5763 5764 handlers = ( 5765 dataPriv.get( this, "events" ) || Object.create( null ) 5766 )[ event.type ] || [], 5767 special = jQuery.event.special[ event.type ] || {}; 5768 5769 // Use the fix-ed jQuery.Event rather than the (read-only) native event 5770 args[ 0 ] = event; 5771 5772 for ( i = 1; i < arguments.length; i++ ) { 5773 args[ i ] = arguments[ i ]; 5774 } 5775 5776 event.delegateTarget = this; 5777 5778 // Call the preDispatch hook for the mapped type, and let it bail if desired 5779 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { 5780 return; 5781 } 5782 5783 // Determine handlers 5784 handlerQueue = jQuery.event.handlers.call( this, event, handlers ); 5785 5786 // Run delegates first; they may want to stop propagation beneath us 5787 i = 0; 5788 while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { 5789 event.currentTarget = matched.elem; 5790 5791 j = 0; 5792 while ( ( handleObj = matched.handlers[ j++ ] ) && 5793 !event.isImmediatePropagationStopped() ) { 5794 5795 // If the event is namespaced, then each handler is only invoked if it is 5796 // specially universal or its namespaces are a superset of the event's. 5797 if ( !event.rnamespace || handleObj.namespace === false ||
vendor: 5,696 bytes, lines 5798-5940
5798 event.rnamespace.test( handleObj.namespace ) ) { 5799 5800 event.handleObj = handleObj; 5801 event.data = handleObj.data; 5802 5803 ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || 5804 handleObj.handler ).apply( matched.elem, args ); 5805 5806 if ( ret !== undefined ) { 5807 if ( ( event.result = ret ) === false ) { 5808 event.preventDefault(); 5809 event.stopPropagation(); 5810 } 5811 } 5812 } 5813 } 5814 } 5815 5816 // Call the postDispatch hook for the mapped type 5817 if ( special.postDispatch ) { 5818 special.postDispatch.call( this, event ); 5819 } 5820 5821 return event.result; 5822 }, 5823 5824 handlers: function( event, handlers ) { 5825 var i, handleObj, sel, matchedHandlers, matchedSelectors, 5826 handlerQueue = [], 5827 delegateCount = handlers.delegateCount, 5828 cur = event.target; 5829 5830 // Find delegate handlers 5831 if ( delegateCount && 5832 5833 // Support: IE <=9 5834 // Black-hole SVG <use> instance trees (trac-13180) 5835 cur.nodeType && 5836 5837 // Support: Firefox <=42 5838 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) 5839 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click 5840 // Support: IE 11 only 5841 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) 5842 !( event.type === "click" && event.button >= 1 ) ) { 5843 5844 for ( ; cur !== this; cur = cur.parentNode || this ) { 5845 5846 // Don't check non-elements (#13208) 5847 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) 5848 if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { 5849 matchedHandlers = []; 5850 matchedSelectors = {}; 5851 for ( i = 0; i < delegateCount; i++ ) { 5852 handleObj = handlers[ i ]; 5853 5854 // Don't conflict with Object.prototype properties (#13203) 5855 sel = handleObj.selector + " "; 5856 5857 if ( matchedSelectors[ sel ] === undefined ) { 5858 matchedSelectors[ sel ] = handleObj.needsContext ? 5859 jQuery( sel, this ).index( cur ) > -1 : 5860 jQuery.find( sel, this, null, [ cur ] ).length; 5861 } 5862 if ( matchedSelectors[ sel ] ) { 5863 matchedHandlers.push( handleObj ); 5864 } 5865 } 5866 if ( matchedHandlers.length ) { 5867 handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); 5868 } 5869 } 5870 } 5871 } 5872 5873 // Add the remaining (directly-bound) handlers 5874 cur = this; 5875 if ( delegateCount < handlers.length ) { 5876 handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); 5877 } 5878 5879 return handlerQueue; 5880 }, 5881 5882 addProp: function( name, hook ) { 5883 Object.defineProperty( jQuery.Event.prototype, name, { 5884 enumerable: true, 5885 configurable: true, 5886 5887 get: isFunction( hook ) ? 5888 function() { 5889 if ( this.originalEvent ) { 5890 return hook( this.originalEvent ); 5891 } 5892 } : 5893 function() { 5894 if ( this.originalEvent ) { 5895 return this.originalEvent[ name ]; 5896 } 5897 }, 5898 5899 set: function( value ) { 5900 Object.defineProperty( this, name, { 5901 enumerable: true, 5902 configurable: true, 5903 writable: true, 5904 value: value 5905 } ); 5906 } 5907 } ); 5908 }, 5909 5910 fix: function( originalEvent ) { 5911 return originalEvent[ jQuery.expando ] ? 5912 originalEvent : 5913 new jQuery.Event( originalEvent ); 5914 }, 5915 5916 special: { 5917 load: { 5918 5919 // Prevent triggered image.load events from bubbling to window.load 5920 noBubble: true 5921 }, 5922 click: { 5923 5924 // Utilize native event to ensure correct state for checkable inputs 5925 setup: function( data ) { 5926 5927 // For mutual compressibility with _default, replace `this` access with a local var. 5928 // `|| data` is dead code meant only to preserve the variable through minification. 5929 var el = this || data; 5930 5931 // Claim the first handler 5932 if ( rcheckableType.test( el.type ) && 5933 el.click && nodeName( el, "input" ) ) { 5934 5935 // dataPriv.set( el, "click", ... ) 5936 leverageNative( el, "click", returnTrue ); 5937 } 5938 5939 // Return false to allow normal processing in the caller 5940 return false;
5941 }, 5942 trigger: function( data ) { 5943 5944 // For mutual compressibility with _default, replace `this` access with a local var. 5945 // `|| data` is dead code meant only to preserve the variable through minification. 5946 var el = this || data; 5947 5948 // Force setup before triggering a click 5949 if ( rcheckableType.test( el.type ) && 5950 el.click && nodeName( el, "input" ) ) { 5951 5952 leverageNative( el, "click" ); 5953 } 5954 5955 // Return non-false to allow normal event-path propagation 5956 return true; 5957 }, 5958 5959 // For cross-browser consistency, suppress native .click() on links 5960 // Also prevent it if we're currently inside a leveraged native-event stack 5961 _default: function( event ) { 5962 var target = event.target; 5963 return rcheckableType.test( target.type ) && 5964 target.click && nodeName( target, "input" ) && 5965 dataPriv.get( target, "click" ) || 5966 nodeName( target, "a" ); 5967 } 5968 }, 5969 5970 beforeunload: { 5971 postDispatch: function( event ) { 5972 5973 // Support: Firefox 20+ 5974 // Firefox doesn't alert if the returnValue field is not set. 5975 if ( event.result !== undefined && event.originalEvent ) { 5976 event.originalEvent.returnValue = event.result; 5977 } 5978 } 5979 } 5980 } 5981 }; 5982 5983// Ensure the presence of an event listener that handles manually-triggered 5984// synthetic events by interrupting progress until reinvoked in response to 5985// *native* events that it fires directly, ensuring that state changes have 5986// already occurred before other listeners are invoked. 5987 function leverageNative( el, type, expectSync ) { 5988 5989 // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add 5990 if ( !expectSync ) { 5991 if ( dataPriv.get( el, type ) === undefined ) { 5992 jQuery.event.add( el, type, returnTrue ); 5993 } 5994 return; 5995 } 5996 5997 // Register the controller as a special universal handler for all event namespaces 5998 dataPriv.set( el, type, false ); 5999 jQuery.event.add( el, type, { 6000 namespace: false, 6001 handler: function( event ) { 6002 var notAsync, result, 6003 saved = dataPriv.get( this, type ); 6004 6005 if ( ( event.isTrigger & 1 ) && this[ type ] ) { 6006 6007 // Interrupt processing of the outer synthetic .trigger()ed event 6008 // Saved data should be false in such cases, but might be a leftover capture object 6009 // from an async native handler (gh-4350) 6010 if ( !saved.length ) { 6011 6012 // Store arguments for use when handling the inner native event 6013 // There will always be at least one argument (an event object), so this array 6014 // will not be confused with a leftover capture object. 6015 saved = slice.call( arguments ); 6016 dataPriv.set( this, type, saved ); 6017 6018 // Trigger the native event and capture its result 6019 // Support: IE <=9 - 11+ 6020 // focus() and blur() are asynchronous 6021 notAsync = expectSync( this, type ); 6022 this[ type ](); 6023 result = dataPriv.get( this, type ); 6024 if ( saved !== result || notAsync ) { 6025 dataPriv.set( this, type, false ); 6026 } else { 6027 result = {}; 6028 } 6029 if ( saved !== result ) { 6030 6031 // Cancel the outer synthetic event 6032 event.stopImmediatePropagation(); 6033 event.preventDefault(); 6034
6035 // Support: Chrome 86+ 6036 // In Chrome, if an element having a focusout handler is blurred by 6037 // clicking outside of it, it invokes the handler synchronously. If 6038 // that handler calls `.remove()` on the element, the data is cleared, 6039 // leaving `result` undefined. We need to guard against this. 6040 return result && result.value; 6041 } 6042 6043 // If this is an inner synthetic event for an event with a bubbling surrogate 6044 // (focus or blur), assume that the surrogate already propagated from triggering the 6045 // native event and prevent that from happening again here. 6046 // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the 6047 // bubbling surrogate propagates *after* the non-bubbling base), but that seems 6048 // less bad than duplication. 6049 } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { 6050 event.stopPropagation(); 6051 } 6052 6053 // If this is a native event triggered above, everything is now in order 6054 // Fire an inner synthetic event with the original arguments 6055 } else if ( saved.length ) { 6056 6057 // ...and capture the result 6058 dataPriv.set( this, type, { 6059 value: jQuery.event.trigger( 6060 6061 // Support: IE <=9 - 11+ 6062 // Extend with the prototype to reset the above stopImmediatePropagation() 6063 jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), 6064 saved.slice( 1 ), 6065 this 6066 ) 6067 } ); 6068 6069 // Abort handling of the native event 6070 event.stopImmediatePropagation(); 6071 } 6072 } 6073 } ); 6074 } 6075 6076 jQuery.removeEvent = function( elem, type, handle ) { 6077 6078 // This "if" is needed for plain objects 6079 if ( elem.removeEventListener ) { 6080 elem.removeEventListener( type, handle ); 6081 } 6082 }; 6083 6084 jQuery.Event = function( src, props ) { 6085 6086 // Allow instantiation without the 'new' keyword 6087 if ( !( this instanceof jQuery.Event ) ) { 6088 return new jQuery.Event( src, props ); 6089 } 6090 6091 // Event object 6092 if ( src && src.type ) { 6093 this.originalEvent = src; 6094 this.type = src.type; 6095 6096 // Events bubbling up the document may have been marked as prevented 6097 // by a handler lower down the tree; reflect the correct value. 6098 this.isDefaultPrevented = src.defaultPrevented || 6099 src.defaultPrevented === undefined && 6100 6101 // Support: Android <=2.3 only 6102 src.returnValue === false ? 6103 returnTrue : 6104 returnFalse; 6105 6106 // Create target properties 6107 // Support: Safari <=6 - 7 only 6108 // Target should not be a text node (#504, #13143) 6109 this.target = ( src.target && src.target.nodeType === 3 ) ? 6110 src.target.parentNode : 6111 src.target; 6112 6113 this.currentTarget = src.currentTarget; 6114 this.relatedTarget = src.relatedTarget; 6115 6116 // Event type 6117 } else { 6118 this.type = src; 6119 } 6120 6121 // Put explicitly provided properties onto the event object 6122 if ( props ) { 6123 jQuery.extend( this, props ); 6124 } 6125 6126 // Create a timestamp if incoming event doesn't have one 6127 this.timeStamp = src && src.timeStamp || Date.now(); 6128 6129 // Mark it as fixed 6130 this[ jQuery.expando ] = true; 6131 }; 6132 6133// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 6134// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 6135 jQuery.Event.prototype = { 6136 constructor: jQuery.Event, 6137 isDefaultPrevented: returnFalse, 6138 isPropagationStopped: returnFalse, 6139 isImmediatePropagationStopped: returnFalse, 6140 isSimulated: false, 6141 6142 preventDefault: function() { 6143 var e = this.originalEvent; 6144 6145 this.isDefaultPrevented = returnTrue; 6146 6147 if ( e && !this.isSimulated ) { 6148 e.preventDefault(); 6149 } 6150 }, 6151 stopPropagation: function() { 6152 var e = this.originalEvent; 6153 6154 this.isPropagationStopped = returnTrue; 6155 6156 if ( e && !this.isSimulated ) { 6157 e.stopPropagation(); 6158 } 6159 }, 6160 stopImmediatePropagation: function() { 6161 var e = this.originalEvent; 6162 6163 this.isImmediatePropagationStopped = returnTrue; 6164 6165 if ( e && !this.isSimulated ) { 6166 e.stopImmediatePropagation(); 6167 } 6168 6169 this.stopPropagation(); 6170 } 6171 }; 6172 6173// Includes all common event props including KeyEvent and MouseEvent specific props 6174 jQuery.each( { 6175 altKey: true, 6176 bubbles: true, 6177 cancelable: true, 6178 changedTouches: true, 6179 ctrlKey: true, 6180 detail: true, 6181 eventPhase: true, 6182 metaKey: true, 6183 pageX: true, 6184 pageY: true,
vendor: 4,565 bytes, lines 6185-6325
6185 shiftKey: true, 6186 view: true, 6187 "char": true, 6188 code: true, 6189 charCode: true, 6190 key: true, 6191 keyCode: true, 6192 button: true, 6193 buttons: true, 6194 clientX: true, 6195 clientY: true, 6196 offsetX: true, 6197 offsetY: true, 6198 pointerId: true, 6199 pointerType: true, 6200 screenX: true, 6201 screenY: true, 6202 targetTouches: true, 6203 toElement: true, 6204 touches: true, 6205 which: true 6206 }, jQuery.event.addProp ); 6207 6208 jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { 6209 jQuery.event.special[ type ] = { 6210 6211 // Utilize native event if possible so blur/focus sequence is correct 6212 setup: function() { 6213 6214 // Claim the first handler 6215 // dataPriv.set( this, "focus", ... ) 6216 // dataPriv.set( this, "blur", ... ) 6217 leverageNative( this, type, expectSync ); 6218 6219 // Return false to allow normal processing in the caller 6220 return false; 6221 }, 6222 trigger: function() { 6223 6224 // Force setup before trigger 6225 leverageNative( this, type ); 6226 6227 // Return non-false to allow normal event-path propagation 6228 return true; 6229 }, 6230 6231 // Suppress native focus or blur as it's already being fired 6232 // in leverageNative. 6233 _default: function() { 6234 return true; 6235 }, 6236 6237 delegateType: delegateType 6238 }; 6239 } ); 6240 6241// Create mouseenter/leave events using mouseover/out and event-time checks 6242// so that event delegation works in jQuery. 6243// Do the same for pointerenter/pointerleave and pointerover/pointerout 6244// 6245// Support: Safari 7 only 6246// Safari sends mouseenter too often; see: 6247// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 6248// for the description of the bug (it existed in older Chrome versions as well). 6249 jQuery.each( { 6250 mouseenter: "mouseover", 6251 mouseleave: "mouseout", 6252 pointerenter: "pointerover", 6253 pointerleave: "pointerout" 6254 }, function( orig, fix ) { 6255 jQuery.event.special[ orig ] = { 6256 delegateType: fix, 6257 bindType: fix, 6258 6259 handle: function( event ) { 6260 var ret, 6261 target = this, 6262 related = event.relatedTarget, 6263 handleObj = event.handleObj; 6264 6265 // For mouseenter/leave call the handler if related is outside the target. 6266 // NB: No relatedTarget if the mouse left/entered the browser window 6267 if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { 6268 event.type = handleObj.origType; 6269 ret = handleObj.handler.apply( this, arguments ); 6270 event.type = fix; 6271 } 6272 return ret; 6273 } 6274 }; 6275 } ); 6276 6277 jQuery.fn.extend( { 6278 6279 on: function( types, selector, data, fn ) { 6280 return on( this, types, selector, data, fn ); 6281 }, 6282 one: function( types, selector, data, fn ) { 6283 return on( this, types, selector, data, fn, 1 ); 6284 }, 6285 off: function( types, selector, fn ) { 6286 var handleObj, type; 6287 if ( types && types.preventDefault && types.handleObj ) { 6288 6289 // ( event ) dispatched jQuery.Event 6290 handleObj = types.handleObj; 6291 jQuery( types.delegateTarget ).off( 6292 handleObj.namespace ? 6293 handleObj.origType + "." + handleObj.namespace : 6294 handleObj.origType, 6295 handleObj.selector, 6296 handleObj.handler 6297 ); 6298 return this; 6299 } 6300 if ( typeof types === "object" ) { 6301 6302 // ( types-object [, selector] ) 6303 for ( type in types ) { 6304 this.off( type, selector, types[ type ] ); 6305 } 6306 return this; 6307 } 6308 if ( selector === false || typeof selector === "function" ) { 6309 6310 // ( types [, fn] ) 6311 fn = selector; 6312 selector = undefined; 6313 } 6314 if ( fn === false ) { 6315 fn = returnFalse; 6316 } 6317 return this.each( function() { 6318 jQuery.event.remove( this, types, fn, selector ); 6319 } ); 6320 } 6321 } ); 6322 6323 6324 var 6325
vendor: 9,664 bytes, lines 6326-6586
6326 // Support: IE <=10 - 11, Edge 12 - 13 only 6327 // In IE/Edge using regex groups here causes severe slowdowns. 6328 // See https://connect.microsoft.com/IE/feedback/details/1736512/ 6329 rnoInnerhtml = /<script|<style|<link/i, 6330 6331 // checked="checked" or checked 6332 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 6333 rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; 6334 6335// Prefer a tbody over its parent table for containing new rows 6336 function manipulationTarget( elem, content ) { 6337 if ( nodeName( elem, "table" ) && 6338 nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { 6339 6340 return jQuery( elem ).children( "tbody" )[ 0 ] || elem; 6341 } 6342 6343 return elem; 6344 } 6345 6346// Replace/restore the type attribute of script elements for safe DOM manipulation 6347 function disableScript( elem ) { 6348 elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; 6349 return elem; 6350 } 6351 function restoreScript( elem ) { 6352 if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { 6353 elem.type = elem.type.slice( 5 ); 6354 } else { 6355 elem.removeAttribute( "type" ); 6356 } 6357 6358 return elem; 6359 } 6360 6361 function cloneCopyEvent( src, dest ) { 6362 var i, l, type, pdataOld, udataOld, udataCur, events; 6363 6364 if ( dest.nodeType !== 1 ) { 6365 return; 6366 } 6367 6368 // 1. Copy private data: events, handlers, etc. 6369 if ( dataPriv.hasData( src ) ) { 6370 pdataOld = dataPriv.get( src ); 6371 events = pdataOld.events; 6372 6373 if ( events ) { 6374 dataPriv.remove( dest, "handle events" ); 6375 6376 for ( type in events ) { 6377 for ( i = 0, l = events[ type ].length; i < l; i++ ) { 6378 jQuery.event.add( dest, type, events[ type ][ i ] ); 6379 } 6380 } 6381 } 6382 } 6383 6384 // 2. Copy user data 6385 if ( dataUser.hasData( src ) ) { 6386 udataOld = dataUser.access( src ); 6387 udataCur = jQuery.extend( {}, udataOld ); 6388 6389 dataUser.set( dest, udataCur ); 6390 } 6391 } 6392 6393// Fix IE bugs, see support tests 6394 function fixInput( src, dest ) { 6395 var nodeName = dest.nodeName.toLowerCase(); 6396 6397 // Fails to persist the checked state of a cloned checkbox or radio button. 6398 if ( nodeName === "input" && rcheckableType.test( src.type ) ) { 6399 dest.checked = src.checked; 6400 6401 // Fails to return the selected option to the default selected state when cloning options 6402 } else if ( nodeName === "input" || nodeName === "textarea" ) { 6403 dest.defaultValue = src.defaultValue; 6404 } 6405 } 6406 6407 function domManip( collection, args, callback, ignored ) { 6408 6409 // Flatten any nested arrays 6410 args = flat( args ); 6411 6412 var fragment, first, scripts, hasScripts, node, doc, 6413 i = 0, 6414 l = collection.length, 6415 iNoClone = l - 1, 6416 value = args[ 0 ], 6417 valueIsFunction = isFunction( value ); 6418 6419 // We can't cloneNode fragments that contain checked, in WebKit 6420 if ( valueIsFunction || 6421 ( l > 1 && typeof value === "string" && 6422 !support.checkClone && rchecked.test( value ) ) ) { 6423 return collection.each( function( index ) { 6424 var self = collection.eq( index ); 6425 if ( valueIsFunction ) { 6426 args[ 0 ] = value.call( this, index, self.html() ); 6427 } 6428 domManip( self, args, callback, ignored ); 6429 } ); 6430 } 6431 6432 if ( l ) { 6433 fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); 6434 first = fragment.firstChild; 6435 6436 if ( fragment.childNodes.length === 1 ) { 6437 fragment = first; 6438 } 6439 6440 // Require either new content or an interest in ignored elements to invoke the callback 6441 if ( first || ignored ) { 6442 scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); 6443 hasScripts = scripts.length; 6444 6445 // Use the original fragment for the last item 6446 // instead of the first because it can end up 6447 // being emptied incorrectly in certain situations (#8070). 6448 for ( ; i < l; i++ ) { 6449 node = fragment; 6450 6451 if ( i !== iNoClone ) { 6452 node = jQuery.clone( node, true, true ); 6453 6454 // Keep references to cloned scripts for later restoration 6455 if ( hasScripts ) { 6456 6457 // Support: Android <=4.0 only, PhantomJS 1 only 6458 // push.apply(_, arraylike) throws on ancient WebKit 6459 jQuery.merge( scripts, getAll( node, "script" ) ); 6460 } 6461 } 6462 6463 callback.call( collection[ i ], node, i ); 6464 } 6465 6466 if ( hasScripts ) { 6467 doc = scripts[ scripts.length - 1 ].ownerDocument; 6468 6469 // Reenable scripts 6470 jQuery.map( scripts, restoreScript ); 6471 6472 // Evaluate executable scripts on first document insertion 6473 for ( i = 0; i < hasScripts; i++ ) { 6474 node = scripts[ i ]; 6475 if ( rscriptType.test( node.type || "" ) && 6476 !dataPriv.access( node, "globalEval" ) && 6477 jQuery.contains( doc, node ) ) { 6478 6479 if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { 6480 6481 // Optional AJAX dependency, but won't run scripts if not present 6482 if ( jQuery._evalUrl && !node.noModule ) { 6483 jQuery._evalUrl( node.src, { 6484 nonce: node.nonce || node.getAttribute( "nonce" ) 6485 }, doc ); 6486 } 6487 } else { 6488 DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); 6489 } 6490 } 6491 } 6492 } 6493 } 6494 } 6495 6496 return collection; 6497 } 6498 6499 function remove( elem, selector, keepData ) { 6500 var node, 6501 nodes = selector ? jQuery.filter( selector, elem ) : elem, 6502 i = 0; 6503 6504 for ( ; ( node = nodes[ i ] ) != null; i++ ) { 6505 if ( !keepData && node.nodeType === 1 ) { 6506 jQuery.cleanData( getAll( node ) ); 6507 } 6508 6509 if ( node.parentNode ) { 6510 if ( keepData && isAttached( node ) ) { 6511 setGlobalEval( getAll( node, "script" ) ); 6512 } 6513 node.parentNode.removeChild( node ); 6514 } 6515 } 6516 6517 return elem; 6518 } 6519 6520 jQuery.extend( { 6521 htmlPrefilter: function( html ) { 6522 return html; 6523 }, 6524 6525 clone: function( elem, dataAndEvents, deepDataAndEvents ) { 6526 var i, l, srcElements, destElements, 6527 clone = elem.cloneNode( true ), 6528 inPage = isAttached( elem ); 6529 6530 // Fix IE cloning issues 6531 if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && 6532 !jQuery.isXMLDoc( elem ) ) { 6533 6534 // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 6535 destElements = getAll( clone ); 6536 srcElements = getAll( elem ); 6537 6538 for ( i = 0, l = srcElements.length; i < l; i++ ) { 6539 fixInput( srcElements[ i ], destElements[ i ] ); 6540 } 6541 } 6542 6543 // Copy the events from the original to the clone 6544 if ( dataAndEvents ) { 6545 if ( deepDataAndEvents ) { 6546 srcElements = srcElements || getAll( elem ); 6547 destElements = destElements || getAll( clone ); 6548 6549 for ( i = 0, l = srcElements.length; i < l; i++ ) { 6550 cloneCopyEvent( srcElements[ i ], destElements[ i ] ); 6551 } 6552 } else { 6553 cloneCopyEvent( elem, clone ); 6554 } 6555 } 6556 6557 // Preserve script evaluation history 6558 destElements = getAll( clone, "script" ); 6559 if ( destElements.length > 0 ) { 6560 setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); 6561 } 6562 6563 // Return the cloned set 6564 return clone; 6565 }, 6566 6567 cleanData: function( elems ) { 6568 var data, elem, type, 6569 special = jQuery.event.special, 6570 i = 0; 6571 6572 for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { 6573 if ( acceptData( elem ) ) { 6574 if ( ( data = elem[ dataPriv.expando ] ) ) { 6575 if ( data.events ) { 6576 for ( type in data.events ) { 6577 if ( special[ type ] ) { 6578 jQuery.event.remove( elem, type ); 6579 6580 // This is a shortcut to avoid jQuery.event.remove's overhead 6581 } else { 6582 jQuery.removeEvent( elem, type, data.handle ); 6583 } 6584 } 6585 } 6586
vendor: 5,407 bytes, lines 6587-6743
6587 // Support: Chrome <=35 - 45+ 6588 // Assign undefined instead of using delete, see Data#remove 6589 elem[ dataPriv.expando ] = undefined; 6590 } 6591 if ( elem[ dataUser.expando ] ) { 6592 6593 // Support: Chrome <=35 - 45+ 6594 // Assign undefined instead of using delete, see Data#remove 6595 elem[ dataUser.expando ] = undefined; 6596 } 6597 } 6598 } 6599 } 6600 } ); 6601 6602 jQuery.fn.extend( { 6603 detach: function( selector ) { 6604 return remove( this, selector, true ); 6605 }, 6606 6607 remove: function( selector ) { 6608 return remove( this, selector ); 6609 }, 6610 6611 text: function( value ) { 6612 return access( this, function( value ) { 6613 return value === undefined ? 6614 jQuery.text( this ) : 6615 this.empty().each( function() { 6616 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6617 this.textContent = value; 6618 } 6619 } ); 6620 }, null, value, arguments.length ); 6621 }, 6622 6623 append: function() { 6624 return domManip( this, arguments, function( elem ) { 6625 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6626 var target = manipulationTarget( this, elem ); 6627 target.appendChild( elem ); 6628 } 6629 } ); 6630 }, 6631 6632 prepend: function() { 6633 return domManip( this, arguments, function( elem ) { 6634 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6635 var target = manipulationTarget( this, elem ); 6636 target.insertBefore( elem, target.firstChild ); 6637 } 6638 } ); 6639 }, 6640 6641 before: function() { 6642 return domManip( this, arguments, function( elem ) { 6643 if ( this.parentNode ) { 6644 this.parentNode.insertBefore( elem, this ); 6645 } 6646 } ); 6647 }, 6648 6649 after: function() { 6650 return domManip( this, arguments, function( elem ) { 6651 if ( this.parentNode ) { 6652 this.parentNode.insertBefore( elem, this.nextSibling ); 6653 } 6654 } ); 6655 }, 6656 6657 empty: function() { 6658 var elem, 6659 i = 0; 6660 6661 for ( ; ( elem = this[ i ] ) != null; i++ ) { 6662 if ( elem.nodeType === 1 ) { 6663 6664 // Prevent memory leaks 6665 jQuery.cleanData( getAll( elem, false ) ); 6666 6667 // Remove any remaining nodes 6668 elem.textContent = ""; 6669 } 6670 } 6671 6672 return this; 6673 }, 6674 6675 clone: function( dataAndEvents, deepDataAndEvents ) { 6676 dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 6677 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 6678 6679 return this.map( function() { 6680 return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); 6681 } ); 6682 }, 6683 6684 html: function( value ) { 6685 return access( this, function( value ) { 6686 var elem = this[ 0 ] || {}, 6687 i = 0, 6688 l = this.length; 6689 6690 if ( value === undefined && elem.nodeType === 1 ) { 6691 return elem.innerHTML; 6692 } 6693 6694 // See if we can take a shortcut and just use innerHTML 6695 if ( typeof value === "string" && !rnoInnerhtml.test( value ) && 6696 !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { 6697 6698 value = jQuery.htmlPrefilter( value ); 6699 6700 try { 6701 for ( ; i < l; i++ ) { 6702 elem = this[ i ] || {}; 6703 6704 // Remove element nodes and prevent memory leaks 6705 if ( elem.nodeType === 1 ) { 6706 jQuery.cleanData( getAll( elem, false ) ); 6707 elem.innerHTML = value; 6708 } 6709 } 6710 6711 elem = 0; 6712 6713 // If using innerHTML throws an exception, use the fallback method 6714 } catch ( e ) {} 6715 } 6716 6717 if ( elem ) { 6718 this.empty().append( value ); 6719 } 6720 }, null, value, arguments.length ); 6721 }, 6722 6723 replaceWith: function() { 6724 var ignored = []; 6725 6726 // Make the changes, replacing each non-ignored context element with the new content 6727 return domManip( this, arguments, function( elem ) { 6728 var parent = this.parentNode; 6729 6730 if ( jQuery.inArray( this, ignored ) < 0 ) { 6731 jQuery.cleanData( getAll( this ) ); 6732 if ( parent ) { 6733 parent.replaceChild( elem, this ); 6734 } 6735 } 6736 6737 // Force callback invocation 6738 }, ignored ); 6739 } 6740 } ); 6741 6742 jQuery.each( { 6743 appendTo: "append",
vendor: 37,584 bytes, lines 6744-7768
6744 prependTo: "prepend", 6745 insertBefore: "before", 6746 insertAfter: "after", 6747 replaceAll: "replaceWith" 6748 }, function( name, original ) { 6749 jQuery.fn[ name ] = function( selector ) { 6750 var elems, 6751 ret = [], 6752 insert = jQuery( selector ), 6753 last = insert.length - 1, 6754 i = 0; 6755 6756 for ( ; i <= last; i++ ) { 6757 elems = i === last ? this : this.clone( true ); 6758 jQuery( insert[ i ] )[ original ]( elems ); 6759 6760 // Support: Android <=4.0 only, PhantomJS 1 only 6761 // .get() because push.apply(_, arraylike) throws on ancient WebKit 6762 push.apply( ret, elems.get() ); 6763 } 6764 6765 return this.pushStack( ret ); 6766 }; 6767 } ); 6768 var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); 6769 6770 var getStyles = function( elem ) { 6771 6772 // Support: IE <=11 only, Firefox <=30 (#15098, #14150) 6773 // IE throws on elements created in popups 6774 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 6775 var view = elem.ownerDocument.defaultView; 6776 6777 if ( !view || !view.opener ) { 6778 view = window; 6779 } 6780 6781 return view.getComputedStyle( elem ); 6782 }; 6783 6784 var swap = function( elem, options, callback ) { 6785 var ret, name, 6786 old = {}; 6787 6788 // Remember the old values, and insert the new ones 6789 for ( name in options ) { 6790 old[ name ] = elem.style[ name ]; 6791 elem.style[ name ] = options[ name ]; 6792 } 6793 6794 ret = callback.call( elem ); 6795 6796 // Revert the old values 6797 for ( name in options ) { 6798 elem.style[ name ] = old[ name ]; 6799 } 6800 6801 return ret; 6802 }; 6803 6804 6805 var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); 6806 6807 6808 6809 ( function() { 6810 6811 // Executing both pixelPosition & boxSizingReliable tests require only one layout 6812 // so they're executed at the same time to save the second computation. 6813 function computeStyleTests() { 6814 6815 // This is a singleton, we need to execute it only once 6816 if ( !div ) { 6817 return; 6818 } 6819 6820 container.style.cssText = "position:absolute;left:-11111px;width:60px;" + 6821 "margin-top:1px;padding:0;border:0"; 6822 div.style.cssText = 6823 "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + 6824 "margin:auto;border:1px;padding:1px;" + 6825 "width:60%;top:1%"; 6826 documentElement.appendChild( container ).appendChild( div ); 6827 6828 var divStyle = window.getComputedStyle( div ); 6829 pixelPositionVal = divStyle.top !== "1%"; 6830 6831 // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 6832 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; 6833 6834 // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 6835 // Some styles come back with percentage values, even though they shouldn't 6836 div.style.right = "60%"; 6837 pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; 6838 6839 // Support: IE 9 - 11 only 6840 // Detect misreporting of content dimensions for box-sizing:border-box elements 6841 boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; 6842 6843 // Support: IE 9 only 6844 // Detect overflow:scroll screwiness (gh-3699) 6845 // Support: Chrome <=64 6846 // Don't get tricked when zoom affects offsetWidth (gh-4029) 6847 div.style.position = "absolute"; 6848 scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; 6849 6850 documentElement.removeChild( container ); 6851 6852 // Nullify the div so it wouldn't be stored in the memory and 6853 // it will also be a sign that checks already performed 6854 div = null; 6855 } 6856 6857 function roundPixelMeasures( measure ) { 6858 return Math.round( parseFloat( measure ) ); 6859 } 6860 6861 var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, 6862 reliableTrDimensionsVal, reliableMarginLeftVal, 6863 container = document.createElement( "div" ), 6864 div = document.createElement( "div" ); 6865 6866 // Finish early in limited (non-browser) environments 6867 if ( !div.style ) { 6868 return; 6869 } 6870 6871 // Support: IE <=9 - 11 only 6872 // Style of cloned element affects source element cloned (#8908) 6873 div.style.backgroundClip = "content-box"; 6874 div.cloneNode( true ).style.backgroundClip = ""; 6875 support.clearCloneStyle = div.style.backgroundClip === "content-box"; 6876 6877 jQuery.extend( support, { 6878 boxSizingReliable: function() { 6879 computeStyleTests(); 6880 return boxSizingReliableVal; 6881 }, 6882 pixelBoxStyles: function() { 6883 computeStyleTests(); 6884 return pixelBoxStylesVal; 6885 }, 6886 pixelPosition: function() { 6887 computeStyleTests(); 6888 return pixelPositionVal; 6889 }, 6890 reliableMarginLeft: function() { 6891 computeStyleTests(); 6892 return reliableMarginLeftVal; 6893 }, 6894 scrollboxSize: function() { 6895 computeStyleTests(); 6896 return scrollboxSizeVal; 6897 }, 6898 6899 // Support: IE 9 - 11+, Edge 15 - 18+ 6900 // IE/Edge misreport `getComputedStyle` of table rows with width/height 6901 // set in CSS while `offset*` properties report correct values. 6902 // Behavior in IE 9 is more subtle than in newer versions & it passes 6903 // some versions of this test; make sure not to make it pass there! 6904 // 6905 // Support: Firefox 70+ 6906 // Only Firefox includes border widths 6907 // in computed dimensions. (gh-4529) 6908 reliableTrDimensions: function() { 6909 var table, tr, trChild, trStyle; 6910 if ( reliableTrDimensionsVal == null ) { 6911 table = document.createElement( "table" ); 6912 tr = document.createElement( "tr" ); 6913 trChild = document.createElement( "div" ); 6914 6915 table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; 6916 tr.style.cssText = "border:1px solid"; 6917 6918 // Support: Chrome 86+ 6919 // Height set through cssText does not get applied. 6920 // Computed height then comes back as 0. 6921 tr.style.height = "1px"; 6922 trChild.style.height = "9px"; 6923 6924 // Support: Android 8 Chrome 86+ 6925 // In our bodyBackground.html iframe, 6926 // display for all div elements is set to "inline", 6927 // which causes a problem only in Android 8 Chrome 86. 6928 // Ensuring the div is display: block 6929 // gets around this issue. 6930 trChild.style.display = "block"; 6931 6932 documentElement 6933 .appendChild( table ) 6934 .appendChild( tr ) 6935 .appendChild( trChild ); 6936 6937 trStyle = window.getComputedStyle( tr ); 6938 reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + 6939 parseInt( trStyle.borderTopWidth, 10 ) + 6940 parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; 6941 6942 documentElement.removeChild( table ); 6943 } 6944 return reliableTrDimensionsVal; 6945 } 6946 } ); 6947 } )(); 6948 6949 6950 function curCSS( elem, name, computed ) { 6951 var width, minWidth, maxWidth, ret, 6952 6953 // Support: Firefox 51+ 6954 // Retrieving style before computed somehow 6955 // fixes an issue with getting wrong values 6956 // on detached elements 6957 style = elem.style; 6958 6959 computed = computed || getStyles( elem ); 6960 6961 // getPropertyValue is needed for: 6962 // .css('filter') (IE 9 only, #12537) 6963 // .css('--customProperty) (#3144) 6964 if ( computed ) { 6965 ret = computed.getPropertyValue( name ) || computed[ name ]; 6966 6967 if ( ret === "" && !isAttached( elem ) ) { 6968 ret = jQuery.style( elem, name ); 6969 } 6970 6971 // A tribute to the "awesome hack by Dean Edwards" 6972 // Android Browser returns percentage for some values, 6973 // but width seems to be reliably pixels. 6974 // This is against the CSSOM draft spec: 6975 // https://drafts.csswg.org/cssom/#resolved-values 6976 if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { 6977 6978 // Remember the original values 6979 width = style.width; 6980 minWidth = style.minWidth; 6981 maxWidth = style.maxWidth; 6982 6983 // Put in the new values to get a computed value out 6984 style.minWidth = style.maxWidth = style.width = ret; 6985 ret = computed.width; 6986 6987 // Revert the changed values 6988 style.width = width; 6989 style.minWidth = minWidth; 6990 style.maxWidth = maxWidth; 6991 } 6992 } 6993 6994 return ret !== undefined ? 6995 6996 // Support: IE <=9 - 11 only 6997 // IE returns zIndex value as an integer. 6998 ret + "" : 6999 ret; 7000 } 7001 7002 7003 function addGetHookIf( conditionFn, hookFn ) { 7004 7005 // Define the hook, we'll check on the first run if it's really needed. 7006 return { 7007 get: function() { 7008 if ( conditionFn() ) { 7009 7010 // Hook not needed (or it's not possible to use it due 7011 // to missing dependency), remove it. 7012 delete this.get; 7013 return; 7014 } 7015 7016 // Hook needed; redefine it so that the support test is not executed again. 7017 return ( this.get = hookFn ).apply( this, arguments ); 7018 } 7019 }; 7020 } 7021 7022 7023 var cssPrefixes = [ "Webkit", "Moz", "ms" ], 7024 emptyStyle = document.createElement( "div" ).style, 7025 vendorProps = {}; 7026 7027// Return a vendor-prefixed property or undefined 7028 function vendorPropName( name ) { 7029 7030 // Check for vendor prefixed names 7031 var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), 7032 i = cssPrefixes.length; 7033 7034 while ( i-- ) { 7035 name = cssPrefixes[ i ] + capName; 7036 if ( name in emptyStyle ) { 7037 return name; 7038 } 7039 } 7040 } 7041 7042// Return a potentially-mapped jQuery.cssProps or vendor prefixed property 7043 function finalPropName( name ) { 7044 var final = jQuery.cssProps[ name ] || vendorProps[ name ]; 7045 7046 if ( final ) { 7047 return final; 7048 } 7049 if ( name in emptyStyle ) { 7050 return name; 7051 } 7052 return vendorProps[ name ] = vendorPropName( name ) || name; 7053 } 7054 7055 7056 var 7057 7058 // Swappable if display is none or starts with table 7059 // except "table", "table-cell", or "table-caption" 7060 // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display 7061 rdisplayswap = /^(none|table(?!-c[ea]).+)/, 7062 rcustomProp = /^--/, 7063 cssShow = { position: "absolute", visibility: "hidden", display: "block" }, 7064 cssNormalTransform = { 7065 letterSpacing: "0", 7066 fontWeight: "400" 7067 }; 7068 7069 function setPositiveNumber( _elem, value, subtract ) { 7070 7071 // Any relative (+/-) values have already been 7072 // normalized at this point 7073 var matches = rcssNum.exec( value ); 7074 return matches ? 7075 7076 // Guard against undefined "subtract", e.g., when used as in cssHooks 7077 Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : 7078 value; 7079 } 7080 7081 function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { 7082 var i = dimension === "width" ? 1 : 0, 7083 extra = 0, 7084 delta = 0; 7085 7086 // Adjustment may not be necessary 7087 if ( box === ( isBorderBox ? "border" : "content" ) ) { 7088 return 0; 7089 } 7090 7091 for ( ; i < 4; i += 2 ) { 7092 7093 // Both box models exclude margin 7094 if ( box === "margin" ) { 7095 delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); 7096 } 7097 7098 // If we get here with a content-box, we're seeking "padding" or "border" or "margin" 7099 if ( !isBorderBox ) { 7100 7101 // Add padding 7102 delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 7103 7104 // For "border" or "margin", add border 7105 if ( box !== "padding" ) { 7106 delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 7107 7108 // But still keep track of it otherwise 7109 } else { 7110 extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 7111 } 7112 7113 // If we get here with a border-box (content + padding + border), we're seeking "content" or 7114 // "padding" or "margin" 7115 } else { 7116 7117 // For "content", subtract padding 7118 if ( box === "content" ) { 7119 delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 7120 } 7121 7122 // For "content" or "padding", subtract border 7123 if ( box !== "margin" ) { 7124 delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 7125 } 7126 } 7127 } 7128 7129 // Account for positive content-box scroll gutter when requested by providing computedVal 7130 if ( !isBorderBox && computedVal >= 0 ) { 7131 7132 // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border 7133 // Assuming integer scroll gutter, subtract the rest and round down 7134 delta += Math.max( 0, Math.ceil( 7135 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 7136 computedVal - 7137 delta - 7138 extra - 7139 0.5 7140 7141 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter 7142 // Use an explicit zero to avoid NaN (gh-3964) 7143 ) ) || 0; 7144 } 7145 7146 return delta; 7147 } 7148 7149 function getWidthOrHeight( elem, dimension, extra ) { 7150 7151 // Start with computed style 7152 var styles = getStyles( elem ), 7153 7154 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). 7155 // Fake content-box until we know it's needed to know the true value. 7156 boxSizingNeeded = !support.boxSizingReliable() || extra, 7157 isBorderBox = boxSizingNeeded && 7158 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 7159 valueIsBorderBox = isBorderBox, 7160 7161 val = curCSS( elem, dimension, styles ), 7162 offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); 7163 7164 // Support: Firefox <=54 7165 // Return a confounding non-pixel value or feign ignorance, as appropriate. 7166 if ( rnumnonpx.test( val ) ) { 7167 if ( !extra ) { 7168 return val; 7169 } 7170 val = "auto"; 7171 } 7172 7173 7174 // Support: IE 9 - 11 only 7175 // Use offsetWidth/offsetHeight for when box sizing is unreliable. 7176 // In those cases, the computed value can be trusted to be border-box. 7177 if ( ( !support.boxSizingReliable() && isBorderBox || 7178 7179 // Support: IE 10 - 11+, Edge 15 - 18+ 7180 // IE/Edge misreport `getComputedStyle` of table rows with width/height 7181 // set in CSS while `offset*` properties report correct values. 7182 // Interestingly, in some cases IE 9 doesn't suffer from this issue. 7183 !support.reliableTrDimensions() && nodeName( elem, "tr" ) || 7184 7185 // Fall back to offsetWidth/offsetHeight when value is "auto" 7186 // This happens for inline elements with no explicit setting (gh-3571) 7187 val === "auto" || 7188 7189 // Support: Android <=4.1 - 4.3 only 7190 // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) 7191 !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && 7192 7193 // Make sure the element is visible & connected 7194 elem.getClientRects().length ) { 7195 7196 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; 7197 7198 // Where available, offsetWidth/offsetHeight approximate border box dimensions. 7199 // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the 7200 // retrieved value as a content box dimension. 7201 valueIsBorderBox = offsetProp in elem; 7202 if ( valueIsBorderBox ) { 7203 val = elem[ offsetProp ]; 7204 } 7205 } 7206 7207 // Normalize "" and auto 7208 val = parseFloat( val ) || 0; 7209 7210 // Adjust for the element's box model 7211 return ( val + 7212 boxModelAdjustment( 7213 elem, 7214 dimension, 7215 extra || ( isBorderBox ? "border" : "content" ), 7216 valueIsBorderBox, 7217 styles, 7218 7219 // Provide the current computed size to request scroll gutter calculation (gh-3589) 7220 val 7221 ) 7222 ) + "px"; 7223 } 7224 7225 jQuery.extend( { 7226 7227 // Add in style property hooks for overriding the default 7228 // behavior of getting and setting a style property 7229 cssHooks: { 7230 opacity: { 7231 get: function( elem, computed ) { 7232 if ( computed ) { 7233 7234 // We should always get a number back from opacity 7235 var ret = curCSS( elem, "opacity" ); 7236 return ret === "" ? "1" : ret; 7237 } 7238 } 7239 } 7240 }, 7241 7242 // Don't automatically add "px" to these possibly-unitless properties 7243 cssNumber: { 7244 "animationIterationCount": true, 7245 "columnCount": true, 7246 "fillOpacity": true, 7247 "flexGrow": true, 7248 "flexShrink": true, 7249 "fontWeight": true, 7250 "gridArea": true, 7251 "gridColumn": true, 7252 "gridColumnEnd": true, 7253 "gridColumnStart": true, 7254 "gridRow": true, 7255 "gridRowEnd": true, 7256 "gridRowStart": true, 7257 "lineHeight": true, 7258 "opacity": true, 7259 "order": true, 7260 "orphans": true, 7261 "widows": true, 7262 "zIndex": true, 7263 "zoom": true 7264 }, 7265 7266 // Add in properties whose names you wish to fix before 7267 // setting or getting the value 7268 cssProps: {}, 7269 7270 // Get and set the style property on a DOM Node 7271 style: function( elem, name, value, extra ) { 7272 7273 // Don't set styles on text and comment nodes 7274 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { 7275 return; 7276 } 7277 7278 // Make sure that we're working with the right name 7279 var ret, type, hooks, 7280 origName = camelCase( name ), 7281 isCustomProp = rcustomProp.test( name ), 7282 style = elem.style; 7283 7284 // Make sure that we're working with the right name. We don't 7285 // want to query the value if it is a CSS custom property 7286 // since they are user-defined. 7287 if ( !isCustomProp ) { 7288 name = finalPropName( origName ); 7289 } 7290 7291 // Gets hook for the prefixed version, then unprefixed version 7292 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 7293 7294 // Check if we're setting a value 7295 if ( value !== undefined ) { 7296 type = typeof value; 7297 7298 // Convert "+=" or "-=" to relative numbers (#7345) 7299 if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { 7300 value = adjustCSS( elem, name, ret ); 7301 7302 // Fixes bug #9237 7303 type = "number"; 7304 } 7305 7306 // Make sure that null and NaN values aren't set (#7116) 7307 if ( value == null || value !== value ) { 7308 return; 7309 } 7310 7311 // If a number was passed in, add the unit (except for certain CSS properties) 7312 // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append 7313 // "px" to a few hardcoded values. 7314 if ( type === "number" && !isCustomProp ) { 7315 value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); 7316 } 7317 7318 // background-* props affect original clone's values 7319 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { 7320 style[ name ] = "inherit"; 7321 } 7322 7323 // If a hook was provided, use that value, otherwise just set the specified value 7324 if ( !hooks || !( "set" in hooks ) || 7325 ( value = hooks.set( elem, value, extra ) ) !== undefined ) { 7326 7327 if ( isCustomProp ) { 7328 style.setProperty( name, value ); 7329 } else { 7330 style[ name ] = value; 7331 } 7332 } 7333 7334 } else { 7335 7336 // If a hook was provided get the non-computed value from there 7337 if ( hooks && "get" in hooks && 7338 ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { 7339 7340 return ret; 7341 } 7342 7343 // Otherwise just get the value from the style object 7344 return style[ name ]; 7345 } 7346 }, 7347 7348 css: function( elem, name, extra, styles ) { 7349 var val, num, hooks, 7350 origName = camelCase( name ), 7351 isCustomProp = rcustomProp.test( name ); 7352 7353 // Make sure that we're working with the right name. We don't 7354 // want to modify the value if it is a CSS custom property 7355 // since they are user-defined. 7356 if ( !isCustomProp ) { 7357 name = finalPropName( origName ); 7358 } 7359 7360 // Try prefixed name followed by the unprefixed name 7361 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 7362 7363 // If a hook was provided get the computed value from there 7364 if ( hooks && "get" in hooks ) { 7365 val = hooks.get( elem, true, extra ); 7366 } 7367 7368 // Otherwise, if a way to get the computed value exists, use that 7369 if ( val === undefined ) { 7370 val = curCSS( elem, name, styles ); 7371 } 7372 7373 // Convert "normal" to computed value 7374 if ( val === "normal" && name in cssNormalTransform ) { 7375 val = cssNormalTransform[ name ]; 7376 } 7377 7378 // Make numeric if forced or a qualifier was provided and val looks numeric 7379 if ( extra === "" || extra ) { 7380 num = parseFloat( val ); 7381 return extra === true || isFinite( num ) ? num || 0 : val; 7382 } 7383 7384 return val; 7385 } 7386 } ); 7387 7388 jQuery.each( [ "height", "width" ], function( _i, dimension ) { 7389 jQuery.cssHooks[ dimension ] = { 7390 get: function( elem, computed, extra ) { 7391 if ( computed ) { 7392 7393 // Certain elements can have dimension info if we invisibly show them 7394 // but it must have a current display style that would benefit 7395 return rdisplayswap.test( jQuery.css( elem, "display" ) ) && 7396 7397 // Support: Safari 8+ 7398 // Table columns in Safari have non-zero offsetWidth & zero 7399 // getBoundingClientRect().width unless display is changed. 7400 // Support: IE <=11 only 7401 // Running getBoundingClientRect on a disconnected node 7402 // in IE throws an error. 7403 ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? 7404 swap( elem, cssShow, function() { 7405 return getWidthOrHeight( elem, dimension, extra ); 7406 } ) : 7407 getWidthOrHeight( elem, dimension, extra ); 7408 } 7409 }, 7410 7411 set: function( elem, value, extra ) { 7412 var matches, 7413 styles = getStyles( elem ), 7414 7415 // Only read styles.position if the test has a chance to fail 7416 // to avoid forcing a reflow. 7417 scrollboxSizeBuggy = !support.scrollboxSize() && 7418 styles.position === "absolute", 7419 7420 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) 7421 boxSizingNeeded = scrollboxSizeBuggy || extra, 7422 isBorderBox = boxSizingNeeded && 7423 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 7424 subtract = extra ? 7425 boxModelAdjustment( 7426 elem, 7427 dimension, 7428 extra, 7429 isBorderBox, 7430 styles 7431 ) : 7432 0; 7433 7434 // Account for unreliable border-box dimensions by comparing offset* to computed and 7435 // faking a content-box to get border and padding (gh-3699) 7436 if ( isBorderBox && scrollboxSizeBuggy ) { 7437 subtract -= Math.ceil( 7438 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 7439 parseFloat( styles[ dimension ] ) - 7440 boxModelAdjustment( elem, dimension, "border", false, styles ) - 7441 0.5 7442 ); 7443 } 7444 7445 // Convert to pixels if value adjustment is needed 7446 if ( subtract && ( matches = rcssNum.exec( value ) ) && 7447 ( matches[ 3 ] || "px" ) !== "px" ) { 7448 7449 elem.style[ dimension ] = value; 7450 value = jQuery.css( elem, dimension ); 7451 } 7452 7453 return setPositiveNumber( elem, value, subtract ); 7454 } 7455 }; 7456 } ); 7457 7458 jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, 7459 function( elem, computed ) { 7460 if ( computed ) { 7461 return ( parseFloat( curCSS( elem, "marginLeft" ) ) || 7462 elem.getBoundingClientRect().left - 7463 swap( elem, { marginLeft: 0 }, function() { 7464 return elem.getBoundingClientRect().left; 7465 } ) 7466 ) + "px"; 7467 } 7468 } 7469 ); 7470 7471// These hooks are used by animate to expand properties 7472 jQuery.each( { 7473 margin: "", 7474 padding: "", 7475 border: "Width" 7476 }, function( prefix, suffix ) { 7477 jQuery.cssHooks[ prefix + suffix ] = { 7478 expand: function( value ) { 7479 var i = 0, 7480 expanded = {}, 7481 7482 // Assumes a single number if not a string 7483 parts = typeof value === "string" ? value.split( " " ) : [ value ]; 7484 7485 for ( ; i < 4; i++ ) { 7486 expanded[ prefix + cssExpand[ i ] + suffix ] = 7487 parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; 7488 } 7489 7490 return expanded; 7491 } 7492 }; 7493 7494 if ( prefix !== "margin" ) { 7495 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; 7496 } 7497 } ); 7498 7499 jQuery.fn.extend( { 7500 css: function( name, value ) { 7501 return access( this, function( elem, name, value ) { 7502 var styles, len, 7503 map = {}, 7504 i = 0; 7505 7506 if ( Array.isArray( name ) ) { 7507 styles = getStyles( elem ); 7508 len = name.length; 7509 7510 for ( ; i < len; i++ ) { 7511 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); 7512 } 7513 7514 return map; 7515 } 7516 7517 return value !== undefined ? 7518 jQuery.style( elem, name, value ) : 7519 jQuery.css( elem, name ); 7520 }, name, value, arguments.length > 1 ); 7521 } 7522 } ); 7523 7524 7525 function Tween( elem, options, prop, end, easing ) { 7526 return new Tween.prototype.init( elem, options, prop, end, easing ); 7527 } 7528 jQuery.Tween = Tween; 7529 7530 Tween.prototype = { 7531 constructor: Tween, 7532 init: function( elem, options, prop, end, easing, unit ) { 7533 this.elem = elem; 7534 this.prop = prop; 7535 this.easing = easing || jQuery.easing._default; 7536 this.options = options; 7537 this.start = this.now = this.cur(); 7538 this.end = end; 7539 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); 7540 }, 7541 cur: function() { 7542 var hooks = Tween.propHooks[ this.prop ]; 7543 7544 return hooks && hooks.get ? 7545 hooks.get( this ) : 7546 Tween.propHooks._default.get( this ); 7547 }, 7548 run: function( percent ) { 7549 var eased, 7550 hooks = Tween.propHooks[ this.prop ]; 7551 7552 if ( this.options.duration ) { 7553 this.pos = eased = jQuery.easing[ this.easing ]( 7554 percent, this.options.duration * percent, 0, 1, this.options.duration 7555 ); 7556 } else { 7557 this.pos = eased = percent; 7558 } 7559 this.now = ( this.end - this.start ) * eased + this.start; 7560 7561 if ( this.options.step ) { 7562 this.options.step.call( this.elem, this.now, this ); 7563 } 7564 7565 if ( hooks && hooks.set ) { 7566 hooks.set( this ); 7567 } else { 7568 Tween.propHooks._default.set( this ); 7569 } 7570 return this; 7571 } 7572 }; 7573 7574 Tween.prototype.init.prototype = Tween.prototype; 7575 7576 Tween.propHooks = { 7577 _default: { 7578 get: function( tween ) { 7579 var result; 7580 7581 // Use a property on the element directly when it is not a DOM element, 7582 // or when there is no matching style property that exists. 7583 if ( tween.elem.nodeType !== 1 || 7584 tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { 7585 return tween.elem[ tween.prop ]; 7586 } 7587 7588 // Passing an empty string as a 3rd parameter to .css will automatically 7589 // attempt a parseFloat and fallback to a string if the parse fails. 7590 // Simple values such as "10px" are parsed to Float; 7591 // complex values such as "rotate(1rad)" are returned as-is. 7592 result = jQuery.css( tween.elem, tween.prop, "" ); 7593 7594 // Empty strings, null, undefined and "auto" are converted to 0. 7595 return !result || result === "auto" ? 0 : result; 7596 }, 7597 set: function( tween ) { 7598 7599 // Use step hook for back compat. 7600 // Use cssHook if its there. 7601 // Use .style if available and use plain properties where available. 7602 if ( jQuery.fx.step[ tween.prop ] ) { 7603 jQuery.fx.step[ tween.prop ]( tween ); 7604 } else if ( tween.elem.nodeType === 1 && ( 7605 jQuery.cssHooks[ tween.prop ] || 7606 tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { 7607 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); 7608 } else { 7609 tween.elem[ tween.prop ] = tween.now; 7610 } 7611 } 7612 } 7613 }; 7614 7615// Support: IE <=9 only 7616// Panic based approach to setting things on disconnected nodes 7617 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { 7618 set: function( tween ) { 7619 if ( tween.elem.nodeType && tween.elem.parentNode ) { 7620 tween.elem[ tween.prop ] = tween.now; 7621 } 7622 } 7623 }; 7624 7625 jQuery.easing = { 7626 linear: function( p ) { 7627 return p; 7628 }, 7629 swing: function( p ) { 7630 return 0.5 - Math.cos( p * Math.PI ) / 2; 7631 }, 7632 _default: "swing" 7633 }; 7634 7635 jQuery.fx = Tween.prototype.init; 7636 7637// Back compat <1.8 extension point 7638 jQuery.fx.step = {}; 7639 7640 7641 7642 7643 var 7644 fxNow, inProgress, 7645 rfxtypes = /^(?:toggle|show|hide)$/, 7646 rrun = /queueHooks$/; 7647 7648 function schedule() { 7649 if ( inProgress ) { 7650 if ( document.hidden === false && window.requestAnimationFrame ) { 7651 window.requestAnimationFrame( schedule ); 7652 } else { 7653 window.setTimeout( schedule, jQuery.fx.interval ); 7654 } 7655 7656 jQuery.fx.tick(); 7657 } 7658 } 7659 7660// Animations created synchronously will run synchronously 7661 function createFxNow() { 7662 window.setTimeout( function() { 7663 fxNow = undefined; 7664 } ); 7665 return ( fxNow = Date.now() ); 7666 } 7667 7668// Generate parameters to create a standard animation 7669 function genFx( type, includeWidth ) { 7670 var which, 7671 i = 0, 7672 attrs = { height: type }; 7673 7674 // If we include width, step value is 1 to do all cssExpand values, 7675 // otherwise step value is 2 to skip over Left and Right 7676 includeWidth = includeWidth ? 1 : 0; 7677 for ( ; i < 4; i += 2 - includeWidth ) { 7678 which = cssExpand[ i ]; 7679 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; 7680 } 7681 7682 if ( includeWidth ) { 7683 attrs.opacity = attrs.width = type; 7684 } 7685 7686 return attrs; 7687 } 7688 7689 function createTween( value, prop, animation ) { 7690 var tween, 7691 collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), 7692 index = 0, 7693 length = collection.length; 7694 for ( ; index < length; index++ ) { 7695 if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { 7696 7697 // We're done with this property 7698 return tween; 7699 } 7700 } 7701 } 7702 7703 function defaultPrefilter( elem, props, opts ) { 7704 var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, 7705 isBox = "width" in props || "height" in props, 7706 anim = this, 7707 orig = {}, 7708 style = elem.style, 7709 hidden = elem.nodeType && isHiddenWithinTree( elem ), 7710 dataShow = dataPriv.get( elem, "fxshow" ); 7711 7712 // Queue-skipping animations hijack the fx hooks 7713 if ( !opts.queue ) { 7714 hooks = jQuery._queueHooks( elem, "fx" ); 7715 if ( hooks.unqueued == null ) { 7716 hooks.unqueued = 0; 7717 oldfire = hooks.empty.fire; 7718 hooks.empty.fire = function() { 7719 if ( !hooks.unqueued ) { 7720 oldfire(); 7721 } 7722 }; 7723 } 7724 hooks.unqueued++; 7725 7726 anim.always( function() { 7727 7728 // Ensure the complete handler is called before this completes 7729 anim.always( function() { 7730 hooks.unqueued--; 7731 if ( !jQuery.queue( elem, "fx" ).length ) { 7732 hooks.empty.fire(); 7733 } 7734 } ); 7735 } ); 7736 } 7737 7738 // Detect show/hide animations 7739 for ( prop in props ) { 7740 value = props[ prop ]; 7741 if ( rfxtypes.test( value ) ) { 7742 delete props[ prop ]; 7743 toggle = toggle || value === "toggle"; 7744 if ( value === ( hidden ? "hide" : "show" ) ) { 7745 7746 // Pretend to be hidden if this is a "show" and 7747 // there is still data from a stopped show/hide 7748 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { 7749 hidden = true; 7750 7751 // Ignore all other no-op show/hide data 7752 } else { 7753 continue; 7754 } 7755 } 7756 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); 7757 } 7758 } 7759 7760 // Bail out if this is a no-op like .hide().hide() 7761 propTween = !jQuery.isEmptyObject( props ); 7762 if ( !propTween && jQuery.isEmptyObject( orig ) ) { 7763 return; 7764 } 7765 7766 // Restrict "overflow" and "display" styles during box animations 7767 if ( isBox && elem.nodeType === 1 ) { 7768
vendor: 5,766 bytes, lines 7769-7924
7769 // Support: IE <=9 - 11, Edge 12 - 15 7770 // Record all 3 overflow attributes because IE does not infer the shorthand 7771 // from identically-valued overflowX and overflowY and Edge just mirrors 7772 // the overflowX value there. 7773 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; 7774 7775 // Identify a display type, preferring old show/hide data over the CSS cascade 7776 restoreDisplay = dataShow && dataShow.display; 7777 if ( restoreDisplay == null ) { 7778 restoreDisplay = dataPriv.get( elem, "display" ); 7779 } 7780 display = jQuery.css( elem, "display" ); 7781 if ( display === "none" ) { 7782 if ( restoreDisplay ) { 7783 display = restoreDisplay; 7784 } else { 7785 7786 // Get nonempty value(s) by temporarily forcing visibility 7787 showHide( [ elem ], true ); 7788 restoreDisplay = elem.style.display || restoreDisplay; 7789 display = jQuery.css( elem, "display" ); 7790 showHide( [ elem ] ); 7791 } 7792 } 7793 7794 // Animate inline elements as inline-block 7795 if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { 7796 if ( jQuery.css( elem, "float" ) === "none" ) { 7797 7798 // Restore the original display value at the end of pure show/hide animations 7799 if ( !propTween ) { 7800 anim.done( function() { 7801 style.display = restoreDisplay; 7802 } ); 7803 if ( restoreDisplay == null ) { 7804 display = style.display; 7805 restoreDisplay = display === "none" ? "" : display; 7806 } 7807 } 7808 style.display = "inline-block"; 7809 } 7810 } 7811 } 7812 7813 if ( opts.overflow ) { 7814 style.overflow = "hidden"; 7815 anim.always( function() { 7816 style.overflow = opts.overflow[ 0 ]; 7817 style.overflowX = opts.overflow[ 1 ]; 7818 style.overflowY = opts.overflow[ 2 ]; 7819 } ); 7820 } 7821 7822 // Implement show/hide animations 7823 propTween = false; 7824 for ( prop in orig ) { 7825 7826 // General show/hide setup for this element animation 7827 if ( !propTween ) { 7828 if ( dataShow ) { 7829 if ( "hidden" in dataShow ) { 7830 hidden = dataShow.hidden; 7831 } 7832 } else { 7833 dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); 7834 } 7835 7836 // Store hidden/visible for toggle so `.stop().toggle()` "reverses" 7837 if ( toggle ) { 7838 dataShow.hidden = !hidden; 7839 } 7840 7841 // Show elements before animating them 7842 if ( hidden ) { 7843 showHide( [ elem ], true ); 7844 } 7845 7846 /* eslint-disable no-loop-func */ 7847 7848 anim.done( function() { 7849 7850 /* eslint-enable no-loop-func */ 7851 7852 // The final step of a "hide" animation is actually hiding the element 7853 if ( !hidden ) { 7854 showHide( [ elem ] ); 7855 } 7856 dataPriv.remove( elem, "fxshow" ); 7857 for ( prop in orig ) { 7858 jQuery.style( elem, prop, orig[ prop ] ); 7859 } 7860 } ); 7861 } 7862 7863 // Per-property setup 7864 propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); 7865 if ( !( prop in dataShow ) ) { 7866 dataShow[ prop ] = propTween.start; 7867 if ( hidden ) { 7868 propTween.end = propTween.start; 7869 propTween.start = 0; 7870 } 7871 } 7872 } 7873 } 7874 7875 function propFilter( props, specialEasing ) { 7876 var index, name, easing, value, hooks; 7877 7878 // camelCase, specialEasing and expand cssHook pass 7879 for ( index in props ) { 7880 name = camelCase( index ); 7881 easing = specialEasing[ name ]; 7882 value = props[ index ]; 7883 if ( Array.isArray( value ) ) { 7884 easing = value[ 1 ]; 7885 value = props[ index ] = value[ 0 ]; 7886 } 7887 7888 if ( index !== name ) { 7889 props[ name ] = value; 7890 delete props[ index ]; 7891 } 7892 7893 hooks = jQuery.cssHooks[ name ]; 7894 if ( hooks && "expand" in hooks ) { 7895 value = hooks.expand( value ); 7896 delete props[ name ]; 7897 7898 // Not quite $.extend, this won't overwrite existing keys. 7899 // Reusing 'index' because we have the correct "name" 7900 for ( index in value ) { 7901 if ( !( index in props ) ) { 7902 props[ index ] = value[ index ]; 7903 specialEasing[ index ] = easing; 7904 } 7905 } 7906 } else { 7907 specialEasing[ name ] = easing; 7908 } 7909 } 7910 } 7911 7912 function Animation( elem, properties, options ) { 7913 var result, 7914 stopped, 7915 index = 0, 7916 length = Animation.prefilters.length, 7917 deferred = jQuery.Deferred().always( function() { 7918 7919 // Don't match elem in the :animated selector 7920 delete tick.elem; 7921 } ), 7922 tick = function() { 7923 if ( stopped ) { 7924 return false;
vendor: 20,456 bytes, lines 7925-8541
7925 } 7926 var currentTime = fxNow || createFxNow(), 7927 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), 7928 7929 // Support: Android 2.3 only 7930 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) 7931 temp = remaining / animation.duration || 0, 7932 percent = 1 - temp, 7933 index = 0, 7934 length = animation.tweens.length; 7935 7936 for ( ; index < length; index++ ) { 7937 animation.tweens[ index ].run( percent ); 7938 } 7939 7940 deferred.notifyWith( elem, [ animation, percent, remaining ] ); 7941 7942 // If there's more to do, yield 7943 if ( percent < 1 && length ) { 7944 return remaining; 7945 } 7946 7947 // If this was an empty animation, synthesize a final progress notification 7948 if ( !length ) { 7949 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 7950 } 7951 7952 // Resolve the animation and report its conclusion 7953 deferred.resolveWith( elem, [ animation ] ); 7954 return false; 7955 }, 7956 animation = deferred.promise( { 7957 elem: elem, 7958 props: jQuery.extend( {}, properties ), 7959 opts: jQuery.extend( true, { 7960 specialEasing: {}, 7961 easing: jQuery.easing._default 7962 }, options ), 7963 originalProperties: properties, 7964 originalOptions: options, 7965 startTime: fxNow || createFxNow(), 7966 duration: options.duration, 7967 tweens: [], 7968 createTween: function( prop, end ) { 7969 var tween = jQuery.Tween( elem, animation.opts, prop, end, 7970 animation.opts.specialEasing[ prop ] || animation.opts.easing ); 7971 animation.tweens.push( tween ); 7972 return tween; 7973 }, 7974 stop: function( gotoEnd ) { 7975 var index = 0, 7976 7977 // If we are going to the end, we want to run all the tweens 7978 // otherwise we skip this part 7979 length = gotoEnd ? animation.tweens.length : 0; 7980 if ( stopped ) { 7981 return this; 7982 } 7983 stopped = true; 7984 for ( ; index < length; index++ ) { 7985 animation.tweens[ index ].run( 1 ); 7986 } 7987 7988 // Resolve when we played the last frame; otherwise, reject 7989 if ( gotoEnd ) { 7990 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 7991 deferred.resolveWith( elem, [ animation, gotoEnd ] ); 7992 } else { 7993 deferred.rejectWith( elem, [ animation, gotoEnd ] ); 7994 } 7995 return this; 7996 } 7997 } ), 7998 props = animation.props; 7999 8000 propFilter( props, animation.opts.specialEasing ); 8001 8002 for ( ; index < length; index++ ) { 8003 result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); 8004 if ( result ) { 8005 if ( isFunction( result.stop ) ) { 8006 jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = 8007 result.stop.bind( result ); 8008 } 8009 return result; 8010 } 8011 } 8012 8013 jQuery.map( props, createTween, animation ); 8014 8015 if ( isFunction( animation.opts.start ) ) { 8016 animation.opts.start.call( elem, animation ); 8017 } 8018 8019 // Attach callbacks from options 8020 animation 8021 .progress( animation.opts.progress ) 8022 .done( animation.opts.done, animation.opts.complete ) 8023 .fail( animation.opts.fail ) 8024 .always( animation.opts.always ); 8025 8026 jQuery.fx.timer( 8027 jQuery.extend( tick, { 8028 elem: elem, 8029 anim: animation, 8030 queue: animation.opts.queue 8031 } ) 8032 ); 8033 8034 return animation; 8035 } 8036 8037 jQuery.Animation = jQuery.extend( Animation, { 8038 8039 tweeners: { 8040 "*": [ function( prop, value ) { 8041 var tween = this.createTween( prop, value ); 8042 adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); 8043 return tween; 8044 } ] 8045 }, 8046 8047 tweener: function( props, callback ) { 8048 if ( isFunction( props ) ) { 8049 callback = props; 8050 props = [ "*" ]; 8051 } else { 8052 props = props.match( rnothtmlwhite ); 8053 } 8054 8055 var prop, 8056 index = 0, 8057 length = props.length; 8058 8059 for ( ; index < length; index++ ) { 8060 prop = props[ index ]; 8061 Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; 8062 Animation.tweeners[ prop ].unshift( callback ); 8063 } 8064 }, 8065 8066 prefilters: [ defaultPrefilter ], 8067 8068 prefilter: function( callback, prepend ) { 8069 if ( prepend ) { 8070 Animation.prefilters.unshift( callback ); 8071 } else { 8072 Animation.prefilters.push( callback ); 8073 } 8074 } 8075 } ); 8076 8077 jQuery.speed = function( speed, easing, fn ) { 8078 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { 8079 complete: fn || !fn && easing || 8080 isFunction( speed ) && speed, 8081 duration: speed, 8082 easing: fn && easing || easing && !isFunction( easing ) && easing 8083 }; 8084 8085 // Go to the end state if fx are off 8086 if ( jQuery.fx.off ) { 8087 opt.duration = 0; 8088 8089 } else { 8090 if ( typeof opt.duration !== "number" ) { 8091 if ( opt.duration in jQuery.fx.speeds ) { 8092 opt.duration = jQuery.fx.speeds[ opt.duration ]; 8093 8094 } else { 8095 opt.duration = jQuery.fx.speeds._default; 8096 } 8097 } 8098 } 8099 8100 // Normalize opt.queue - true/undefined/null -> "fx" 8101 if ( opt.queue == null || opt.queue === true ) { 8102 opt.queue = "fx"; 8103 } 8104 8105 // Queueing 8106 opt.old = opt.complete; 8107 8108 opt.complete = function() { 8109 if ( isFunction( opt.old ) ) { 8110 opt.old.call( this ); 8111 } 8112 8113 if ( opt.queue ) { 8114 jQuery.dequeue( this, opt.queue ); 8115 } 8116 }; 8117 8118 return opt; 8119 }; 8120 8121 jQuery.fn.extend( { 8122 fadeTo: function( speed, to, easing, callback ) { 8123 8124 // Show any hidden elements after setting opacity to 0 8125 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() 8126 8127 // Animate to the value specified 8128 .end().animate( { opacity: to }, speed, easing, callback ); 8129 }, 8130 animate: function( prop, speed, easing, callback ) { 8131 var empty = jQuery.isEmptyObject( prop ), 8132 optall = jQuery.speed( speed, easing, callback ), 8133 doAnimation = function() { 8134 8135 // Operate on a copy of prop so per-property easing won't be lost 8136 var anim = Animation( this, jQuery.extend( {}, prop ), optall ); 8137 8138 // Empty animations, or finishing resolves immediately 8139 if ( empty || dataPriv.get( this, "finish" ) ) { 8140 anim.stop( true ); 8141 } 8142 }; 8143 8144 doAnimation.finish = doAnimation; 8145 8146 return empty || optall.queue === false ? 8147 this.each( doAnimation ) : 8148 this.queue( optall.queue, doAnimation ); 8149 }, 8150 stop: function( type, clearQueue, gotoEnd ) { 8151 var stopQueue = function( hooks ) { 8152 var stop = hooks.stop; 8153 delete hooks.stop; 8154 stop( gotoEnd ); 8155 }; 8156 8157 if ( typeof type !== "string" ) { 8158 gotoEnd = clearQueue; 8159 clearQueue = type; 8160 type = undefined; 8161 } 8162 if ( clearQueue ) { 8163 this.queue( type || "fx", [] ); 8164 } 8165 8166 return this.each( function() { 8167 var dequeue = true, 8168 index = type != null && type + "queueHooks", 8169 timers = jQuery.timers, 8170 data = dataPriv.get( this ); 8171 8172 if ( index ) { 8173 if ( data[ index ] && data[ index ].stop ) { 8174 stopQueue( data[ index ] ); 8175 } 8176 } else { 8177 for ( index in data ) { 8178 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { 8179 stopQueue( data[ index ] ); 8180 } 8181 } 8182 } 8183 8184 for ( index = timers.length; index--; ) { 8185 if ( timers[ index ].elem === this && 8186 ( type == null || timers[ index ].queue === type ) ) { 8187 8188 timers[ index ].anim.stop( gotoEnd ); 8189 dequeue = false; 8190 timers.splice( index, 1 ); 8191 } 8192 } 8193 8194 // Start the next in the queue if the last step wasn't forced. 8195 // Timers currently will call their complete callbacks, which 8196 // will dequeue but only if they were gotoEnd. 8197 if ( dequeue || !gotoEnd ) { 8198 jQuery.dequeue( this, type ); 8199 } 8200 } ); 8201 }, 8202 finish: function( type ) { 8203 if ( type !== false ) { 8204 type = type || "fx"; 8205 } 8206 return this.each( function() { 8207 var index, 8208 data = dataPriv.get( this ), 8209 queue = data[ type + "queue" ], 8210 hooks = data[ type + "queueHooks" ], 8211 timers = jQuery.timers, 8212 length = queue ? queue.length : 0; 8213 8214 // Enable finishing flag on private data 8215 data.finish = true; 8216 8217 // Empty the queue first 8218 jQuery.queue( this, type, [] ); 8219 8220 if ( hooks && hooks.stop ) { 8221 hooks.stop.call( this, true ); 8222 } 8223 8224 // Look for any active animations, and finish them 8225 for ( index = timers.length; index--; ) { 8226 if ( timers[ index ].elem === this && timers[ index ].queue === type ) { 8227 timers[ index ].anim.stop( true ); 8228 timers.splice( index, 1 ); 8229 } 8230 } 8231 8232 // Look for any animations in the old queue and finish them 8233 for ( index = 0; index < length; index++ ) { 8234 if ( queue[ index ] && queue[ index ].finish ) { 8235 queue[ index ].finish.call( this ); 8236 } 8237 } 8238 8239 // Turn off finishing flag 8240 delete data.finish; 8241 } ); 8242 } 8243 } ); 8244 8245 jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { 8246 var cssFn = jQuery.fn[ name ]; 8247 jQuery.fn[ name ] = function( speed, easing, callback ) { 8248 return speed == null || typeof speed === "boolean" ? 8249 cssFn.apply( this, arguments ) : 8250 this.animate( genFx( name, true ), speed, easing, callback ); 8251 }; 8252 } ); 8253 8254// Generate shortcuts for custom animations 8255 jQuery.each( { 8256 slideDown: genFx( "show" ), 8257 slideUp: genFx( "hide" ), 8258 slideToggle: genFx( "toggle" ), 8259 fadeIn: { opacity: "show" }, 8260 fadeOut: { opacity: "hide" }, 8261 fadeToggle: { opacity: "toggle" } 8262 }, function( name, props ) { 8263 jQuery.fn[ name ] = function( speed, easing, callback ) { 8264 return this.animate( props, speed, easing, callback ); 8265 }; 8266 } ); 8267 8268 jQuery.timers = []; 8269 jQuery.fx.tick = function() { 8270 var timer, 8271 i = 0, 8272 timers = jQuery.timers; 8273 8274 fxNow = Date.now(); 8275 8276 for ( ; i < timers.length; i++ ) { 8277 timer = timers[ i ]; 8278 8279 // Run the timer and safely remove it when done (allowing for external removal) 8280 if ( !timer() && timers[ i ] === timer ) { 8281 timers.splice( i--, 1 ); 8282 } 8283 } 8284 8285 if ( !timers.length ) { 8286 jQuery.fx.stop(); 8287 } 8288 fxNow = undefined; 8289 }; 8290 8291 jQuery.fx.timer = function( timer ) { 8292 jQuery.timers.push( timer ); 8293 jQuery.fx.start(); 8294 }; 8295 8296 jQuery.fx.interval = 13; 8297 jQuery.fx.start = function() { 8298 if ( inProgress ) { 8299 return; 8300 } 8301 8302 inProgress = true; 8303 schedule(); 8304 }; 8305 8306 jQuery.fx.stop = function() { 8307 inProgress = null; 8308 }; 8309 8310 jQuery.fx.speeds = { 8311 slow: 600, 8312 fast: 200, 8313 8314 // Default speed 8315 _default: 400 8316 }; 8317 8318 8319// Based off of the plugin by Clint Helfers, with permission. 8320// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ 8321 jQuery.fn.delay = function( time, type ) { 8322 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; 8323 type = type || "fx"; 8324 8325 return this.queue( type, function( next, hooks ) { 8326 var timeout = window.setTimeout( next, time ); 8327 hooks.stop = function() { 8328 window.clearTimeout( timeout ); 8329 }; 8330 } ); 8331 }; 8332 8333 8334 ( function() { 8335 var input = document.createElement( "input" ), 8336 select = document.createElement( "select" ), 8337 opt = select.appendChild( document.createElement( "option" ) ); 8338 8339 input.type = "checkbox"; 8340 8341 // Support: Android <=4.3 only 8342 // Default value for a checkbox should be "on" 8343 support.checkOn = input.value !== ""; 8344 8345 // Support: IE <=11 only 8346 // Must access selectedIndex to make default options select 8347 support.optSelected = opt.selected; 8348 8349 // Support: IE <=11 only 8350 // An input loses its value after becoming a radio 8351 input = document.createElement( "input" ); 8352 input.value = "t"; 8353 input.type = "radio"; 8354 support.radioValue = input.value === "t"; 8355 } )(); 8356 8357 8358 var boolHook, 8359 attrHandle = jQuery.expr.attrHandle; 8360 8361 jQuery.fn.extend( { 8362 attr: function( name, value ) { 8363 return access( this, jQuery.attr, name, value, arguments.length > 1 ); 8364 }, 8365 8366 removeAttr: function( name ) { 8367 return this.each( function() { 8368 jQuery.removeAttr( this, name ); 8369 } ); 8370 } 8371 } ); 8372 8373 jQuery.extend( { 8374 attr: function( elem, name, value ) { 8375 var ret, hooks, 8376 nType = elem.nodeType; 8377 8378 // Don't get/set attributes on text, comment and attribute nodes 8379 if ( nType === 3 || nType === 8 || nType === 2 ) { 8380 return; 8381 } 8382 8383 // Fallback to prop when attributes are not supported 8384 if ( typeof elem.getAttribute === "undefined" ) { 8385 return jQuery.prop( elem, name, value ); 8386 } 8387 8388 // Attribute hooks are determined by the lowercase version 8389 // Grab necessary hook if one is defined 8390 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 8391 hooks = jQuery.attrHooks[ name.toLowerCase() ] || 8392 ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); 8393 } 8394 8395 if ( value !== undefined ) { 8396 if ( value === null ) { 8397 jQuery.removeAttr( elem, name ); 8398 return; 8399 } 8400 8401 if ( hooks && "set" in hooks && 8402 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 8403 return ret; 8404 } 8405 8406 elem.setAttribute( name, value + "" ); 8407 return value; 8408 } 8409 8410 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 8411 return ret; 8412 } 8413 8414 ret = jQuery.find.attr( elem, name ); 8415 8416 // Non-existent attributes return null, we normalize to undefined 8417 return ret == null ? undefined : ret; 8418 }, 8419 8420 attrHooks: { 8421 type: { 8422 set: function( elem, value ) { 8423 if ( !support.radioValue && value === "radio" && 8424 nodeName( elem, "input" ) ) { 8425 var val = elem.value; 8426 elem.setAttribute( "type", value ); 8427 if ( val ) { 8428 elem.value = val; 8429 } 8430 return value; 8431 } 8432 } 8433 } 8434 }, 8435 8436 removeAttr: function( elem, value ) { 8437 var name, 8438 i = 0, 8439 8440 // Attribute names can contain non-HTML whitespace characters 8441 // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 8442 attrNames = value && value.match( rnothtmlwhite ); 8443 8444 if ( attrNames && elem.nodeType === 1 ) { 8445 while ( ( name = attrNames[ i++ ] ) ) { 8446 elem.removeAttribute( name ); 8447 } 8448 } 8449 } 8450 } ); 8451 8452// Hooks for boolean attributes 8453 boolHook = { 8454 set: function( elem, value, name ) { 8455 if ( value === false ) { 8456 8457 // Remove boolean attributes when set to false 8458 jQuery.removeAttr( elem, name ); 8459 } else { 8460 elem.setAttribute( name, name ); 8461 } 8462 return name; 8463 } 8464 }; 8465 8466 jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { 8467 var getter = attrHandle[ name ] || jQuery.find.attr; 8468 8469 attrHandle[ name ] = function( elem, name, isXML ) { 8470 var ret, handle, 8471 lowercaseName = name.toLowerCase(); 8472 8473 if ( !isXML ) { 8474 8475 // Avoid an infinite loop by temporarily removing this function from the getter 8476 handle = attrHandle[ lowercaseName ]; 8477 attrHandle[ lowercaseName ] = ret; 8478 ret = getter( elem, name, isXML ) != null ? 8479 lowercaseName : 8480 null; 8481 attrHandle[ lowercaseName ] = handle; 8482 } 8483 return ret; 8484 }; 8485 } ); 8486 8487 8488 8489 8490 var rfocusable = /^(?:input|select|textarea|button)$/i, 8491 rclickable = /^(?:a|area)$/i; 8492 8493 jQuery.fn.extend( { 8494 prop: function( name, value ) { 8495 return access( this, jQuery.prop, name, value, arguments.length > 1 ); 8496 }, 8497 8498 removeProp: function( name ) { 8499 return this.each( function() { 8500 delete this[ jQuery.propFix[ name ] || name ]; 8501 } ); 8502 } 8503 } ); 8504 8505 jQuery.extend( { 8506 prop: function( elem, name, value ) { 8507 var ret, hooks, 8508 nType = elem.nodeType; 8509 8510 // Don't get/set properties on text, comment and attribute nodes 8511 if ( nType === 3 || nType === 8 || nType === 2 ) { 8512 return; 8513 } 8514 8515 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 8516 8517 // Fix name and attach hooks 8518 name = jQuery.propFix[ name ] || name; 8519 hooks = jQuery.propHooks[ name ]; 8520 } 8521 8522 if ( value !== undefined ) { 8523 if ( hooks && "set" in hooks && 8524 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 8525 return ret; 8526 } 8527 8528 return ( elem[ name ] = value ); 8529 } 8530 8531 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 8532 return ret; 8533 } 8534 8535 return elem[ name ]; 8536 }, 8537 8538 propHooks: { 8539 tabIndex: { 8540 get: function( elem ) { 8541
vendor: 16,418 bytes, lines 8542-9030
8542 // Support: IE <=9 - 11 only 8543 // elem.tabIndex doesn't always return the 8544 // correct value when it hasn't been explicitly set 8545 // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 8546 // Use proper attribute retrieval(#12072) 8547 var tabindex = jQuery.find.attr( elem, "tabindex" ); 8548 8549 if ( tabindex ) { 8550 return parseInt( tabindex, 10 ); 8551 } 8552 8553 if ( 8554 rfocusable.test( elem.nodeName ) || 8555 rclickable.test( elem.nodeName ) && 8556 elem.href 8557 ) { 8558 return 0; 8559 } 8560 8561 return -1; 8562 } 8563 } 8564 }, 8565 8566 propFix: { 8567 "for": "htmlFor", 8568 "class": "className" 8569 } 8570 } ); 8571 8572// Support: IE <=11 only 8573// Accessing the selectedIndex property 8574// forces the browser to respect setting selected 8575// on the option 8576// The getter ensures a default option is selected 8577// when in an optgroup 8578// eslint rule "no-unused-expressions" is disabled for this code 8579// since it considers such accessions noop 8580 if ( !support.optSelected ) { 8581 jQuery.propHooks.selected = { 8582 get: function( elem ) { 8583 8584 /* eslint no-unused-expressions: "off" */ 8585 8586 var parent = elem.parentNode; 8587 if ( parent && parent.parentNode ) { 8588 parent.parentNode.selectedIndex; 8589 } 8590 return null; 8591 }, 8592 set: function( elem ) { 8593 8594 /* eslint no-unused-expressions: "off" */ 8595 8596 var parent = elem.parentNode; 8597 if ( parent ) { 8598 parent.selectedIndex; 8599 8600 if ( parent.parentNode ) { 8601 parent.parentNode.selectedIndex; 8602 } 8603 } 8604 } 8605 }; 8606 } 8607 8608 jQuery.each( [ 8609 "tabIndex", 8610 "readOnly", 8611 "maxLength", 8612 "cellSpacing", 8613 "cellPadding", 8614 "rowSpan", 8615 "colSpan", 8616 "useMap", 8617 "frameBorder", 8618 "contentEditable" 8619 ], function() { 8620 jQuery.propFix[ this.toLowerCase() ] = this; 8621 } ); 8622 8623 8624 8625 8626 // Strip and collapse whitespace according to HTML spec 8627 // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace 8628 function stripAndCollapse( value ) { 8629 var tokens = value.match( rnothtmlwhite ) || []; 8630 return tokens.join( " " ); 8631 } 8632 8633 8634 function getClass( elem ) { 8635 return elem.getAttribute && elem.getAttribute( "class" ) || ""; 8636 } 8637 8638 function classesToArray( value ) { 8639 if ( Array.isArray( value ) ) { 8640 return value; 8641 } 8642 if ( typeof value === "string" ) { 8643 return value.match( rnothtmlwhite ) || []; 8644 } 8645 return []; 8646 } 8647 8648 jQuery.fn.extend( { 8649 addClass: function( value ) { 8650 var classes, elem, cur, curValue, clazz, j, finalValue, 8651 i = 0; 8652 8653 if ( isFunction( value ) ) { 8654 return this.each( function( j ) { 8655 jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); 8656 } ); 8657 } 8658 8659 classes = classesToArray( value ); 8660 8661 if ( classes.length ) { 8662 while ( ( elem = this[ i++ ] ) ) { 8663 curValue = getClass( elem ); 8664 cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 8665 8666 if ( cur ) { 8667 j = 0; 8668 while ( ( clazz = classes[ j++ ] ) ) { 8669 if ( cur.indexOf( " " + clazz + " " ) < 0 ) { 8670 cur += clazz + " "; 8671 } 8672 } 8673 8674 // Only assign if different to avoid unneeded rendering. 8675 finalValue = stripAndCollapse( cur ); 8676 if ( curValue !== finalValue ) { 8677 elem.setAttribute( "class", finalValue ); 8678 } 8679 } 8680 } 8681 } 8682 8683 return this; 8684 }, 8685 8686 removeClass: function( value ) { 8687 var classes, elem, cur, curValue, clazz, j, finalValue, 8688 i = 0; 8689 8690 if ( isFunction( value ) ) { 8691 return this.each( function( j ) { 8692 jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); 8693 } ); 8694 } 8695 8696 if ( !arguments.length ) { 8697 return this.attr( "class", "" ); 8698 } 8699 8700 classes = classesToArray( value ); 8701 8702 if ( classes.length ) { 8703 while ( ( elem = this[ i++ ] ) ) { 8704 curValue = getClass( elem ); 8705 8706 // This expression is here for better compressibility (see addClass) 8707 cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 8708 8709 if ( cur ) { 8710 j = 0; 8711 while ( ( clazz = classes[ j++ ] ) ) { 8712 8713 // Remove *all* instances 8714 while ( cur.indexOf( " " + clazz + " " ) > -1 ) { 8715 cur = cur.replace( " " + clazz + " ", " " ); 8716 } 8717 } 8718 8719 // Only assign if different to avoid unneeded rendering. 8720 finalValue = stripAndCollapse( cur ); 8721 if ( curValue !== finalValue ) { 8722 elem.setAttribute( "class", finalValue ); 8723 } 8724 } 8725 } 8726 } 8727 8728 return this; 8729 }, 8730 8731 toggleClass: function( value, stateVal ) { 8732 var type = typeof value, 8733 isValidValue = type === "string" || Array.isArray( value ); 8734 8735 if ( typeof stateVal === "boolean" && isValidValue ) { 8736 return stateVal ? this.addClass( value ) : this.removeClass( value ); 8737 } 8738 8739 if ( isFunction( value ) ) { 8740 return this.each( function( i ) { 8741 jQuery( this ).toggleClass( 8742 value.call( this, i, getClass( this ), stateVal ), 8743 stateVal 8744 ); 8745 } ); 8746 } 8747 8748 return this.each( function() { 8749 var className, i, self, classNames; 8750 8751 if ( isValidValue ) { 8752 8753 // Toggle individual class names 8754 i = 0; 8755 self = jQuery( this ); 8756 classNames = classesToArray( value ); 8757 8758 while ( ( className = classNames[ i++ ] ) ) { 8759 8760 // Check each className given, space separated list 8761 if ( self.hasClass( className ) ) { 8762 self.removeClass( className ); 8763 } else { 8764 self.addClass( className ); 8765 } 8766 } 8767 8768 // Toggle whole class name 8769 } else if ( value === undefined || type === "boolean" ) { 8770 className = getClass( this ); 8771 if ( className ) { 8772 8773 // Store className if set 8774 dataPriv.set( this, "__className__", className ); 8775 } 8776 8777 // If the element has a class name or if we're passed `false`, 8778 // then remove the whole classname (if there was one, the above saved it). 8779 // Otherwise bring back whatever was previously saved (if anything), 8780 // falling back to the empty string if nothing was stored. 8781 if ( this.setAttribute ) { 8782 this.setAttribute( "class", 8783 className || value === false ? 8784 "" : 8785 dataPriv.get( this, "__className__" ) || "" 8786 ); 8787 } 8788 } 8789 } ); 8790 }, 8791 8792 hasClass: function( selector ) { 8793 var className, elem, 8794 i = 0; 8795 8796 className = " " + selector + " "; 8797 while ( ( elem = this[ i++ ] ) ) { 8798 if ( elem.nodeType === 1 && 8799 ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { 8800 return true; 8801 } 8802 } 8803 8804 return false; 8805 } 8806 } ); 8807 8808 8809 8810 8811 var rreturn = /\r/g; 8812 8813 jQuery.fn.extend( { 8814 val: function( value ) { 8815 var hooks, ret, valueIsFunction, 8816 elem = this[ 0 ]; 8817 8818 if ( !arguments.length ) { 8819 if ( elem ) { 8820 hooks = jQuery.valHooks[ elem.type ] || 8821 jQuery.valHooks[ elem.nodeName.toLowerCase() ]; 8822 8823 if ( hooks && 8824 "get" in hooks && 8825 ( ret = hooks.get( elem, "value" ) ) !== undefined 8826 ) { 8827 return ret; 8828 } 8829 8830 ret = elem.value; 8831 8832 // Handle most common string cases 8833 if ( typeof ret === "string" ) { 8834 return ret.replace( rreturn, "" ); 8835 } 8836 8837 // Handle cases where value is null/undef or number 8838 return ret == null ? "" : ret; 8839 } 8840 8841 return; 8842 } 8843 8844 valueIsFunction = isFunction( value ); 8845 8846 return this.each( function( i ) { 8847 var val; 8848 8849 if ( this.nodeType !== 1 ) { 8850 return; 8851 } 8852 8853 if ( valueIsFunction ) { 8854 val = value.call( this, i, jQuery( this ).val() ); 8855 } else { 8856 val = value; 8857 } 8858 8859 // Treat null/undefined as ""; convert numbers to string 8860 if ( val == null ) { 8861 val = ""; 8862 8863 } else if ( typeof val === "number" ) { 8864 val += ""; 8865 8866 } else if ( Array.isArray( val ) ) { 8867 val = jQuery.map( val, function( value ) { 8868 return value == null ? "" : value + ""; 8869 } ); 8870 } 8871 8872 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; 8873 8874 // If set returns undefined, fall back to normal setting 8875 if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { 8876 this.value = val; 8877 } 8878 } ); 8879 } 8880 } ); 8881 8882 jQuery.extend( { 8883 valHooks: { 8884 option: { 8885 get: function( elem ) { 8886 8887 var val = jQuery.find.attr( elem, "value" ); 8888 return val != null ? 8889 val : 8890 8891 // Support: IE <=10 - 11 only 8892 // option.text throws exceptions (#14686, #14858) 8893 // Strip and collapse whitespace 8894 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace 8895 stripAndCollapse( jQuery.text( elem ) ); 8896 } 8897 }, 8898 select: { 8899 get: function( elem ) { 8900 var value, option, i, 8901 options = elem.options, 8902 index = elem.selectedIndex, 8903 one = elem.type === "select-one", 8904 values = one ? null : [], 8905 max = one ? index + 1 : options.length; 8906 8907 if ( index < 0 ) { 8908 i = max; 8909 8910 } else { 8911 i = one ? index : 0; 8912 } 8913 8914 // Loop through all the selected options 8915 for ( ; i < max; i++ ) { 8916 option = options[ i ]; 8917 8918 // Support: IE <=9 only 8919 // IE8-9 doesn't update selected after form reset (#2551) 8920 if ( ( option.selected || i === index ) && 8921 8922 // Don't return options that are disabled or in a disabled optgroup 8923 !option.disabled && 8924 ( !option.parentNode.disabled || 8925 !nodeName( option.parentNode, "optgroup" ) ) ) { 8926 8927 // Get the specific value for the option 8928 value = jQuery( option ).val(); 8929 8930 // We don't need an array for one selects 8931 if ( one ) { 8932 return value; 8933 } 8934 8935 // Multi-Selects return an array 8936 values.push( value ); 8937 } 8938 } 8939 8940 return values; 8941 }, 8942 8943 set: function( elem, value ) { 8944 var optionSet, option, 8945 options = elem.options, 8946 values = jQuery.makeArray( value ), 8947 i = options.length; 8948 8949 while ( i-- ) { 8950 option = options[ i ]; 8951 8952 /* eslint-disable no-cond-assign */ 8953 8954 if ( option.selected = 8955 jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 8956 ) { 8957 optionSet = true; 8958 } 8959 8960 /* eslint-enable no-cond-assign */ 8961 } 8962 8963 // Force browsers to behave consistently when non-matching value is set 8964 if ( !optionSet ) { 8965 elem.selectedIndex = -1; 8966 } 8967 return values; 8968 } 8969 } 8970 } 8971 } ); 8972 8973// Radios and checkboxes getter/setter 8974 jQuery.each( [ "radio", "checkbox" ], function() { 8975 jQuery.valHooks[ this ] = { 8976 set: function( elem, value ) { 8977 if ( Array.isArray( value ) ) { 8978 return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); 8979 } 8980 } 8981 }; 8982 if ( !support.checkOn ) { 8983 jQuery.valHooks[ this ].get = function( elem ) { 8984 return elem.getAttribute( "value" ) === null ? "on" : elem.value; 8985 }; 8986 } 8987 } ); 8988 8989 8990 8991 8992// Return jQuery for attributes-only inclusion 8993 8994 8995 support.focusin = "onfocusin" in window; 8996 8997 8998 var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, 8999 stopPropagationCallback = function( e ) { 9000 e.stopPropagation(); 9001 }; 9002 9003 jQuery.extend( jQuery.event, { 9004 9005 trigger: function( event, data, elem, onlyHandlers ) { 9006 9007 var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, 9008 eventPath = [ elem || document ], 9009 type = hasOwn.call( event, "type" ) ? event.type : event, 9010 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; 9011 9012 cur = lastElement = tmp = elem = elem || document; 9013 9014 // Don't do events on text and comment nodes 9015 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 9016 return; 9017 } 9018 9019 // focus/blur morphs to focusin/out; ensure we're not firing them right now 9020 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { 9021 return; 9022 } 9023 9024 if ( type.indexOf( "." ) > -1 ) { 9025 9026 // Namespaced trigger; create a regexp to match event type in handle() 9027 namespaces = type.split( "." ); 9028 type = namespaces.shift(); 9029 namespaces.sort(); 9030 }
vendor: 15,916 bytes, lines 9031-9470
9031 ontype = type.indexOf( ":" ) < 0 && "on" + type; 9032 9033 // Caller can pass in a jQuery.Event object, Object, or just an event type string 9034 event = event[ jQuery.expando ] ? 9035 event : 9036 new jQuery.Event( type, typeof event === "object" && event ); 9037 9038 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) 9039 event.isTrigger = onlyHandlers ? 2 : 3; 9040 event.namespace = namespaces.join( "." ); 9041 event.rnamespace = event.namespace ? 9042 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : 9043 null; 9044 9045 // Clean up the event in case it is being reused 9046 event.result = undefined; 9047 if ( !event.target ) { 9048 event.target = elem; 9049 } 9050 9051 // Clone any incoming data and prepend the event, creating the handler arg list 9052 data = data == null ? 9053 [ event ] : 9054 jQuery.makeArray( data, [ event ] ); 9055 9056 // Allow special events to draw outside the lines 9057 special = jQuery.event.special[ type ] || {}; 9058 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { 9059 return; 9060 } 9061 9062 // Determine event propagation path in advance, per W3C events spec (#9951) 9063 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) 9064 if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { 9065 9066 bubbleType = special.delegateType || type; 9067 if ( !rfocusMorph.test( bubbleType + type ) ) { 9068 cur = cur.parentNode; 9069 } 9070 for ( ; cur; cur = cur.parentNode ) { 9071 eventPath.push( cur ); 9072 tmp = cur; 9073 } 9074 9075 // Only add window if we got to document (e.g., not plain obj or detached DOM) 9076 if ( tmp === ( elem.ownerDocument || document ) ) { 9077 eventPath.push( tmp.defaultView || tmp.parentWindow || window ); 9078 } 9079 } 9080 9081 // Fire handlers on the event path 9082 i = 0; 9083 while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { 9084 lastElement = cur; 9085 event.type = i > 1 ? 9086 bubbleType : 9087 special.bindType || type; 9088 9089 // jQuery handler 9090 handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && 9091 dataPriv.get( cur, "handle" ); 9092 if ( handle ) { 9093 handle.apply( cur, data ); 9094 } 9095 9096 // Native handler 9097 handle = ontype && cur[ ontype ]; 9098 if ( handle && handle.apply && acceptData( cur ) ) { 9099 event.result = handle.apply( cur, data ); 9100 if ( event.result === false ) { 9101 event.preventDefault(); 9102 } 9103 } 9104 } 9105 event.type = type; 9106 9107 // If nobody prevented the default action, do it now 9108 if ( !onlyHandlers && !event.isDefaultPrevented() ) { 9109 9110 if ( ( !special._default || 9111 special._default.apply( eventPath.pop(), data ) === false ) && 9112 acceptData( elem ) ) { 9113 9114 // Call a native DOM method on the target with the same name as the event. 9115 // Don't do default actions on window, that's where global variables be (#6170) 9116 if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { 9117 9118 // Don't re-trigger an onFOO event when we call its FOO() method 9119 tmp = elem[ ontype ]; 9120 9121 if ( tmp ) { 9122 elem[ ontype ] = null; 9123 } 9124 9125 // Prevent re-triggering of the same event, since we already bubbled it above 9126 jQuery.event.triggered = type; 9127 9128 if ( event.isPropagationStopped() ) { 9129 lastElement.addEventListener( type, stopPropagationCallback ); 9130 } 9131 9132 elem[ type ](); 9133 9134 if ( event.isPropagationStopped() ) { 9135 lastElement.removeEventListener( type, stopPropagationCallback ); 9136 } 9137 9138 jQuery.event.triggered = undefined; 9139 9140 if ( tmp ) { 9141 elem[ ontype ] = tmp; 9142 } 9143 } 9144 } 9145 } 9146 9147 return event.result; 9148 }, 9149 9150 // Piggyback on a donor event to simulate a different one 9151 // Used only for `focus(in | out)` events 9152 simulate: function( type, elem, event ) { 9153 var e = jQuery.extend( 9154 new jQuery.Event(), 9155 event, 9156 { 9157 type: type, 9158 isSimulated: true 9159 } 9160 ); 9161 9162 jQuery.event.trigger( e, null, elem ); 9163 } 9164 9165 } ); 9166 9167 jQuery.fn.extend( { 9168 9169 trigger: function( type, data ) { 9170 return this.each( function() { 9171 jQuery.event.trigger( type, data, this ); 9172 } ); 9173 }, 9174 triggerHandler: function( type, data ) { 9175 var elem = this[ 0 ]; 9176 if ( elem ) { 9177 return jQuery.event.trigger( type, data, elem, true ); 9178 } 9179 } 9180 } ); 9181 9182 9183// Support: Firefox <=44 9184// Firefox doesn't have focus(in | out) events 9185// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 9186// 9187// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 9188// focus(in | out) events fire after focus & blur events, 9189// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order 9190// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 9191 if ( !support.focusin ) { 9192 jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { 9193 9194 // Attach a single capturing handler on the document while someone wants focusin/focusout 9195 var handler = function( event ) { 9196 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); 9197 }; 9198 9199 jQuery.event.special[ fix ] = { 9200 setup: function() { 9201 9202 // Handle: regular nodes (via `this.ownerDocument`), window 9203 // (via `this.document`) & document (via `this`). 9204 var doc = this.ownerDocument || this.document || this, 9205 attaches = dataPriv.access( doc, fix ); 9206 9207 if ( !attaches ) { 9208 doc.addEventListener( orig, handler, true ); 9209 } 9210 dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); 9211 }, 9212 teardown: function() { 9213 var doc = this.ownerDocument || this.document || this, 9214 attaches = dataPriv.access( doc, fix ) - 1; 9215 9216 if ( !attaches ) { 9217 doc.removeEventListener( orig, handler, true ); 9218 dataPriv.remove( doc, fix ); 9219 9220 } else { 9221 dataPriv.access( doc, fix, attaches ); 9222 } 9223 } 9224 }; 9225 } ); 9226 } 9227 var location = window.location; 9228 9229 var nonce = { guid: Date.now() }; 9230 9231 var rquery = ( /\?/ ); 9232 9233 9234 9235// Cross-browser xml parsing 9236 jQuery.parseXML = function( data ) { 9237 var xml, parserErrorElem; 9238 if ( !data || typeof data !== "string" ) { 9239 return null; 9240 } 9241 9242 // Support: IE 9 - 11 only 9243 // IE throws on parseFromString with invalid input. 9244 try { 9245 xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); 9246 } catch ( e ) {} 9247 9248 parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; 9249 if ( !xml || parserErrorElem ) { 9250 jQuery.error( "Invalid XML: " + ( 9251 parserErrorElem ? 9252 jQuery.map( parserErrorElem.childNodes, function( el ) { 9253 return el.textContent; 9254 } ).join( "\n" ) : 9255 data 9256 ) ); 9257 } 9258 return xml; 9259 }; 9260 9261 9262 var 9263 rbracket = /\[\]$/, 9264 rCRLF = /\r?\n/g, 9265 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, 9266 rsubmittable = /^(?:input|select|textarea|keygen)/i; 9267 9268 function buildParams( prefix, obj, traditional, add ) { 9269 var name; 9270 9271 if ( Array.isArray( obj ) ) { 9272 9273 // Serialize array item. 9274 jQuery.each( obj, function( i, v ) { 9275 if ( traditional || rbracket.test( prefix ) ) { 9276 9277 // Treat each array item as a scalar. 9278 add( prefix, v ); 9279 9280 } else { 9281 9282 // Item is non-scalar (array or object), encode its numeric index. 9283 buildParams( 9284 prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", 9285 v, 9286 traditional, 9287 add 9288 ); 9289 } 9290 } ); 9291 9292 } else if ( !traditional && toType( obj ) === "object" ) { 9293 9294 // Serialize object item. 9295 for ( name in obj ) { 9296 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); 9297 } 9298 9299 } else { 9300 9301 // Serialize scalar item. 9302 add( prefix, obj ); 9303 } 9304 } 9305 9306// Serialize an array of form elements or a set of 9307// key/values into a query string 9308 jQuery.param = function( a, traditional ) { 9309 var prefix, 9310 s = [], 9311 add = function( key, valueOrFunction ) { 9312 9313 // If value is a function, invoke it and use its return value 9314 var value = isFunction( valueOrFunction ) ? 9315 valueOrFunction() : 9316 valueOrFunction; 9317 9318 s[ s.length ] = encodeURIComponent( key ) + "=" + 9319 encodeURIComponent( value == null ? "" : value ); 9320 }; 9321 9322 if ( a == null ) { 9323 return ""; 9324 } 9325 9326 // If an array was passed in, assume that it is an array of form elements. 9327 if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { 9328 9329 // Serialize the form elements 9330 jQuery.each( a, function() { 9331 add( this.name, this.value ); 9332 } ); 9333 9334 } else { 9335 9336 // If traditional, encode the "old" way (the way 1.3.2 or older 9337 // did it), otherwise encode params recursively. 9338 for ( prefix in a ) { 9339 buildParams( prefix, a[ prefix ], traditional, add ); 9340 } 9341 } 9342 9343 // Return the resulting serialization 9344 return s.join( "&" ); 9345 }; 9346 9347 jQuery.fn.extend( { 9348 serialize: function() { 9349 return jQuery.param( this.serializeArray() ); 9350 }, 9351 serializeArray: function() { 9352 return this.map( function() { 9353 9354 // Can add propHook for "elements" to filter or add form elements 9355 var elements = jQuery.prop( this, "elements" ); 9356 return elements ? jQuery.makeArray( elements ) : this; 9357 } ).filter( function() { 9358 var type = this.type; 9359 9360 // Use .is( ":disabled" ) so that fieldset[disabled] works 9361 return this.name && !jQuery( this ).is( ":disabled" ) && 9362 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && 9363 ( this.checked || !rcheckableType.test( type ) ); 9364 } ).map( function( _i, elem ) { 9365 var val = jQuery( this ).val(); 9366 9367 if ( val == null ) { 9368 return null; 9369 } 9370 9371 if ( Array.isArray( val ) ) { 9372 return jQuery.map( val, function( val ) { 9373 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 9374 } ); 9375 } 9376 9377 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 9378 } ).get(); 9379 } 9380 } ); 9381 9382 9383 var 9384 r20 = /%20/g, 9385 rhash = /#.*$/, 9386 rantiCache = /([?&])_=[^&]*/, 9387 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, 9388 9389 // #7653, #8125, #8152: local protocol detection 9390 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, 9391 rnoContent = /^(?:GET|HEAD)$/, 9392 rprotocol = /^\/\//, 9393 9394 /* Prefilters 9395 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 9396 * 2) These are called: 9397 * - BEFORE asking for a transport 9398 * - AFTER param serialization (s.data is a string if s.processData is true) 9399 * 3) key is the dataType 9400 * 4) the catchall symbol "*" can be used 9401 * 5) execution will start with transport dataType and THEN continue down to "*" if needed 9402 */ 9403 prefilters = {}, 9404 9405 /* Transports bindings 9406 * 1) key is the dataType 9407 * 2) the catchall symbol "*" can be used 9408 * 3) selection will start with transport dataType and THEN go to "*" if needed 9409 */ 9410 transports = {}, 9411 9412 // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression 9413 allTypes = "*/".concat( "*" ), 9414 9415 // Anchor tag for parsing the document origin 9416 originAnchor = document.createElement( "a" ); 9417 9418 originAnchor.href = location.href; 9419 9420// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 9421 function addToPrefiltersOrTransports( structure ) { 9422 9423 // dataTypeExpression is optional and defaults to "*" 9424 return function( dataTypeExpression, func ) { 9425 9426 if ( typeof dataTypeExpression !== "string" ) { 9427 func = dataTypeExpression; 9428 dataTypeExpression = "*"; 9429 } 9430 9431 var dataType, 9432 i = 0, 9433 dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; 9434 9435 if ( isFunction( func ) ) { 9436 9437 // For each dataType in the dataTypeExpression 9438 while ( ( dataType = dataTypes[ i++ ] ) ) { 9439 9440 // Prepend if requested 9441 if ( dataType[ 0 ] === "+" ) { 9442 dataType = dataType.slice( 1 ) || "*"; 9443 ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); 9444 9445 // Otherwise append 9446 } else { 9447 ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); 9448 } 9449 } 9450 } 9451 }; 9452 } 9453 9454// Base inspection function for prefilters and transports 9455 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { 9456 9457 var inspected = {}, 9458 seekingTransport = ( structure === transports ); 9459 9460 function inspect( dataType ) { 9461 var selected; 9462 inspected[ dataType ] = true; 9463 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { 9464 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); 9465 if ( typeof dataTypeOrTransport === "string" && 9466 !seekingTransport && !inspected[ dataTypeOrTransport ] ) { 9467 9468 options.dataTypes.unshift( dataTypeOrTransport ); 9469 inspect( dataTypeOrTransport ); 9470 return false;
vendor: 15,305 bytes, lines 9471-9908
9471 } else if ( seekingTransport ) { 9472 return !( selected = dataTypeOrTransport ); 9473 } 9474 } ); 9475 return selected; 9476 } 9477 9478 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); 9479 } 9480 9481// A special extend for ajax options 9482// that takes "flat" options (not to be deep extended) 9483// Fixes #9887 9484 function ajaxExtend( target, src ) { 9485 var key, deep, 9486 flatOptions = jQuery.ajaxSettings.flatOptions || {}; 9487 9488 for ( key in src ) { 9489 if ( src[ key ] !== undefined ) { 9490 ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; 9491 } 9492 } 9493 if ( deep ) { 9494 jQuery.extend( true, target, deep ); 9495 } 9496 9497 return target; 9498 } 9499 9500 /* Handles responses to an ajax request: 9501 * - finds the right dataType (mediates between content-type and expected dataType) 9502 * - returns the corresponding response 9503 */ 9504 function ajaxHandleResponses( s, jqXHR, responses ) { 9505 9506 var ct, type, finalDataType, firstDataType, 9507 contents = s.contents, 9508 dataTypes = s.dataTypes; 9509 9510 // Remove auto dataType and get content-type in the process 9511 while ( dataTypes[ 0 ] === "*" ) { 9512 dataTypes.shift(); 9513 if ( ct === undefined ) { 9514 ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); 9515 } 9516 } 9517 9518 // Check if we're dealing with a known content-type 9519 if ( ct ) { 9520 for ( type in contents ) { 9521 if ( contents[ type ] && contents[ type ].test( ct ) ) { 9522 dataTypes.unshift( type ); 9523 break; 9524 } 9525 } 9526 } 9527 9528 // Check to see if we have a response for the expected dataType 9529 if ( dataTypes[ 0 ] in responses ) { 9530 finalDataType = dataTypes[ 0 ]; 9531 } else { 9532 9533 // Try convertible dataTypes 9534 for ( type in responses ) { 9535 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { 9536 finalDataType = type; 9537 break; 9538 } 9539 if ( !firstDataType ) { 9540 firstDataType = type; 9541 } 9542 } 9543 9544 // Or just use first one 9545 finalDataType = finalDataType || firstDataType; 9546 } 9547 9548 // If we found a dataType 9549 // We add the dataType to the list if needed 9550 // and return the corresponding response 9551 if ( finalDataType ) { 9552 if ( finalDataType !== dataTypes[ 0 ] ) { 9553 dataTypes.unshift( finalDataType ); 9554 } 9555 return responses[ finalDataType ]; 9556 } 9557 } 9558 9559 /* Chain conversions given the request and the original response 9560 * Also sets the responseXXX fields on the jqXHR instance 9561 */ 9562 function ajaxConvert( s, response, jqXHR, isSuccess ) { 9563 var conv2, current, conv, tmp, prev, 9564 converters = {}, 9565 9566 // Work with a copy of dataTypes in case we need to modify it for conversion 9567 dataTypes = s.dataTypes.slice(); 9568 9569 // Create converters map with lowercased keys 9570 if ( dataTypes[ 1 ] ) { 9571 for ( conv in s.converters ) { 9572 converters[ conv.toLowerCase() ] = s.converters[ conv ]; 9573 } 9574 } 9575 9576 current = dataTypes.shift(); 9577 9578 // Convert to each sequential dataType 9579 while ( current ) { 9580 9581 if ( s.responseFields[ current ] ) { 9582 jqXHR[ s.responseFields[ current ] ] = response; 9583 } 9584 9585 // Apply the dataFilter if provided 9586 if ( !prev && isSuccess && s.dataFilter ) { 9587 response = s.dataFilter( response, s.dataType ); 9588 } 9589 9590 prev = current; 9591 current = dataTypes.shift(); 9592 9593 if ( current ) { 9594 9595 // There's only work to do if current dataType is non-auto 9596 if ( current === "*" ) { 9597 9598 current = prev; 9599 9600 // Convert response if prev dataType is non-auto and differs from current 9601 } else if ( prev !== "*" && prev !== current ) { 9602 9603 // Seek a direct converter 9604 conv = converters[ prev + " " + current ] || converters[ "* " + current ]; 9605 9606 // If none found, seek a pair 9607 if ( !conv ) { 9608 for ( conv2 in converters ) { 9609 9610 // If conv2 outputs current 9611 tmp = conv2.split( " " ); 9612 if ( tmp[ 1 ] === current ) { 9613 9614 // If prev can be converted to accepted input 9615 conv = converters[ prev + " " + tmp[ 0 ] ] || 9616 converters[ "* " + tmp[ 0 ] ]; 9617 if ( conv ) { 9618 9619 // Condense equivalence converters 9620 if ( conv === true ) { 9621 conv = converters[ conv2 ]; 9622 9623 // Otherwise, insert the intermediate dataType 9624 } else if ( converters[ conv2 ] !== true ) { 9625 current = tmp[ 0 ]; 9626 dataTypes.unshift( tmp[ 1 ] ); 9627 } 9628 break; 9629 } 9630 } 9631 } 9632 } 9633 9634 // Apply converter (if not an equivalence) 9635 if ( conv !== true ) { 9636 9637 // Unless errors are allowed to bubble, catch and return them 9638 if ( conv && s.throws ) { 9639 response = conv( response ); 9640 } else { 9641 try { 9642 response = conv( response ); 9643 } catch ( e ) { 9644 return { 9645 state: "parsererror", 9646 error: conv ? e : "No conversion from " + prev + " to " + current 9647 }; 9648 } 9649 } 9650 } 9651 } 9652 } 9653 } 9654 9655 return { state: "success", data: response }; 9656 } 9657 9658 jQuery.extend( { 9659 9660 // Counter for holding the number of active queries 9661 active: 0, 9662 9663 // Last-Modified header cache for next request 9664 lastModified: {}, 9665 etag: {}, 9666 9667 ajaxSettings: { 9668 url: location.href, 9669 type: "GET", 9670 isLocal: rlocalProtocol.test( location.protocol ), 9671 global: true, 9672 processData: true, 9673 async: true, 9674 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 9675 9676 /* 9677 timeout: 0, 9678 data: null, 9679 dataType: null, 9680 username: null, 9681 password: null, 9682 cache: null, 9683 throws: false, 9684 traditional: false, 9685 headers: {}, 9686 */ 9687 9688 accepts: { 9689 "*": allTypes, 9690 text: "text/plain", 9691 html: "text/html", 9692 xml: "application/xml, text/xml", 9693 json: "application/json, text/javascript" 9694 }, 9695 9696 contents: { 9697 xml: /\bxml\b/, 9698 html: /\bhtml/, 9699 json: /\bjson\b/ 9700 }, 9701 9702 responseFields: { 9703 xml: "responseXML", 9704 text: "responseText", 9705 json: "responseJSON" 9706 }, 9707 9708 // Data converters 9709 // Keys separate source (or catchall "*") and destination types with a single space 9710 converters: { 9711 9712 // Convert anything to text 9713 "* text": String, 9714 9715 // Text to html (true = no transformation) 9716 "text html": true, 9717 9718 // Evaluate text as a json expression 9719 "text json": JSON.parse, 9720 9721 // Parse text as xml 9722 "text xml": jQuery.parseXML 9723 }, 9724 9725 // For options that shouldn't be deep extended: 9726 // you can add your own custom options here if 9727 // and when you create one that shouldn't be 9728 // deep extended (see ajaxExtend) 9729 flatOptions: { 9730 url: true, 9731 context: true 9732 } 9733 }, 9734 9735 // Creates a full fledged settings object into target 9736 // with both ajaxSettings and settings fields. 9737 // If target is omitted, writes into ajaxSettings. 9738 ajaxSetup: function( target, settings ) { 9739 return settings ? 9740 9741 // Building a settings object 9742 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : 9743 9744 // Extending ajaxSettings 9745 ajaxExtend( jQuery.ajaxSettings, target ); 9746 }, 9747 9748 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), 9749 ajaxTransport: addToPrefiltersOrTransports( transports ), 9750 9751 // Main method 9752 ajax: function( url, options ) { 9753 9754 // If url is an object, simulate pre-1.5 signature 9755 if ( typeof url === "object" ) { 9756 options = url; 9757 url = undefined; 9758 } 9759 9760 // Force options to be an object 9761 options = options || {}; 9762 9763 var transport, 9764 9765 // URL without anti-cache param 9766 cacheURL, 9767 9768 // Response headers 9769 responseHeadersString, 9770 responseHeaders, 9771 9772 // timeout handle 9773 timeoutTimer, 9774 9775 // Url cleanup var 9776 urlAnchor, 9777 9778 // Request state (becomes false upon send and true upon completion) 9779 completed, 9780 9781 // To know if global events are to be dispatched 9782 fireGlobals, 9783 9784 // Loop variable 9785 i, 9786 9787 // uncached part of the url 9788 uncached, 9789 9790 // Create the final options object 9791 s = jQuery.ajaxSetup( {}, options ), 9792 9793 // Callbacks context 9794 callbackContext = s.context || s, 9795 9796 // Context for global events is callbackContext if it is a DOM node or jQuery collection 9797 globalEventContext = s.context && 9798 ( callbackContext.nodeType || callbackContext.jquery ) ? 9799 jQuery( callbackContext ) : 9800 jQuery.event, 9801 9802 // Deferreds 9803 deferred = jQuery.Deferred(), 9804 completeDeferred = jQuery.Callbacks( "once memory" ), 9805 9806 // Status-dependent callbacks 9807 statusCode = s.statusCode || {}, 9808 9809 // Headers (they are sent all at once) 9810 requestHeaders = {}, 9811 requestHeadersNames = {}, 9812 9813 // Default abort message 9814 strAbort = "canceled", 9815 9816 // Fake xhr 9817 jqXHR = { 9818 readyState: 0, 9819 9820 // Builds headers hashtable if needed 9821 getResponseHeader: function( key ) { 9822 var match; 9823 if ( completed ) { 9824 if ( !responseHeaders ) { 9825 responseHeaders = {}; 9826 while ( ( match = rheaders.exec( responseHeadersString ) ) ) { 9827 responseHeaders[ match[ 1 ].toLowerCase() + " " ] = 9828 ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) 9829 .concat( match[ 2 ] ); 9830 } 9831 } 9832 match = responseHeaders[ key.toLowerCase() + " " ]; 9833 } 9834 return match == null ? null : match.join( ", " ); 9835 }, 9836 9837 // Raw string 9838 getAllResponseHeaders: function() { 9839 return completed ? responseHeadersString : null; 9840 }, 9841 9842 // Caches the header 9843 setRequestHeader: function( name, value ) { 9844 if ( completed == null ) { 9845 name = requestHeadersNames[ name.toLowerCase() ] = 9846 requestHeadersNames[ name.toLowerCase() ] || name; 9847 requestHeaders[ name ] = value; 9848 } 9849 return this; 9850 }, 9851 9852 // Overrides response content-type header 9853 overrideMimeType: function( type ) { 9854 if ( completed == null ) { 9855 s.mimeType = type; 9856 } 9857 return this; 9858 }, 9859 9860 // Status-dependent callbacks 9861 statusCode: function( map ) { 9862 var code; 9863 if ( map ) { 9864 if ( completed ) { 9865 9866 // Execute the appropriate callbacks 9867 jqXHR.always( map[ jqXHR.status ] ); 9868 } else { 9869 9870 // Lazy-add the new callbacks in a way that preserves old ones 9871 for ( code in map ) { 9872 statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; 9873 } 9874 } 9875 } 9876 return this; 9877 }, 9878 9879 // Cancel the request 9880 abort: function( statusText ) { 9881 var finalText = statusText || strAbort; 9882 if ( transport ) { 9883 transport.abort( finalText ); 9884 } 9885 done( 0, finalText ); 9886 return this; 9887 } 9888 }; 9889 9890 // Attach deferreds 9891 deferred.promise( jqXHR ); 9892 9893 // Add protocol if not provided (prefilters might expect it) 9894 // Handle falsy url in the settings object (#10093: consistency with old signature) 9895 // We also use the url parameter if available 9896 s.url = ( ( url || s.url || location.href ) + "" ) 9897 .replace( rprotocol, location.protocol + "//" ); 9898 9899 // Alias method option to type as per ticket #12004 9900 s.type = options.method || options.type || s.method || s.type; 9901 9902 // Extract dataTypes list 9903 s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; 9904 9905 // A cross-domain request is in order when the origin doesn't match the current origin. 9906 if ( s.crossDomain == null ) { 9907 urlAnchor = document.createElement( "a" ); 9908
vendor: 46,739 bytes, lines 9909-11196
9909 // Support: IE <=8 - 11, Edge 12 - 15 9910 // IE throws exception on accessing the href property if url is malformed, 9911 // e.g. http://example.com:80x/ 9912 try { 9913 urlAnchor.href = s.url; 9914 9915 // Support: IE <=8 - 11 only 9916 // Anchor's host property isn't correctly set when s.url is relative 9917 urlAnchor.href = urlAnchor.href; 9918 s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== 9919 urlAnchor.protocol + "//" + urlAnchor.host; 9920 } catch ( e ) { 9921 9922 // If there is an error parsing the URL, assume it is crossDomain, 9923 // it can be rejected by the transport if it is invalid 9924 s.crossDomain = true; 9925 } 9926 } 9927 9928 // Convert data if not already a string 9929 if ( s.data && s.processData && typeof s.data !== "string" ) { 9930 s.data = jQuery.param( s.data, s.traditional ); 9931 } 9932 9933 // Apply prefilters 9934 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); 9935 9936 // If request was aborted inside a prefilter, stop there 9937 if ( completed ) { 9938 return jqXHR; 9939 } 9940 9941 // We can fire global events as of now if asked to 9942 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) 9943 fireGlobals = jQuery.event && s.global; 9944 9945 // Watch for a new set of requests 9946 if ( fireGlobals && jQuery.active++ === 0 ) { 9947 jQuery.event.trigger( "ajaxStart" ); 9948 } 9949 9950 // Uppercase the type 9951 s.type = s.type.toUpperCase(); 9952 9953 // Determine if request has content 9954 s.hasContent = !rnoContent.test( s.type ); 9955 9956 // Save the URL in case we're toying with the If-Modified-Since 9957 // and/or If-None-Match header later on 9958 // Remove hash to simplify url manipulation 9959 cacheURL = s.url.replace( rhash, "" ); 9960 9961 // More options handling for requests with no content 9962 if ( !s.hasContent ) { 9963 9964 // Remember the hash so we can put it back 9965 uncached = s.url.slice( cacheURL.length ); 9966 9967 // If data is available and should be processed, append data to url 9968 if ( s.data && ( s.processData || typeof s.data === "string" ) ) { 9969 cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; 9970 9971 // #9682: remove data so that it's not used in an eventual retry 9972 delete s.data; 9973 } 9974 9975 // Add or update anti-cache param if needed 9976 if ( s.cache === false ) { 9977 cacheURL = cacheURL.replace( rantiCache, "$1" ); 9978 uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + 9979 uncached; 9980 } 9981 9982 // Put hash and anti-cache on the URL that will be requested (gh-1732) 9983 s.url = cacheURL + uncached; 9984 9985 // Change '%20' to '+' if this is encoded form body content (gh-2658) 9986 } else if ( s.data && s.processData && 9987 ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { 9988 s.data = s.data.replace( r20, "+" ); 9989 } 9990 9991 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9992 if ( s.ifModified ) { 9993 if ( jQuery.lastModified[ cacheURL ] ) { 9994 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); 9995 } 9996 if ( jQuery.etag[ cacheURL ] ) { 9997 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); 9998 } 9999 } 10000 10001 // Set the correct header, if data is being sent 10002 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { 10003 jqXHR.setRequestHeader( "Content-Type", s.contentType ); 10004 } 10005 10006 // Set the Accepts header for the server, depending on the dataType 10007 jqXHR.setRequestHeader( 10008 "Accept", 10009 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? 10010 s.accepts[ s.dataTypes[ 0 ] ] + 10011 ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : 10012 s.accepts[ "*" ] 10013 ); 10014 10015 // Check for headers option 10016 for ( i in s.headers ) { 10017 jqXHR.setRequestHeader( i, s.headers[ i ] ); 10018 } 10019 10020 // Allow custom headers/mimetypes and early abort 10021 if ( s.beforeSend && 10022 ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { 10023 10024 // Abort if not done already and return 10025 return jqXHR.abort(); 10026 } 10027 10028 // Aborting is no longer a cancellation 10029 strAbort = "abort"; 10030 10031 // Install callbacks on deferreds 10032 completeDeferred.add( s.complete ); 10033 jqXHR.done( s.success ); 10034 jqXHR.fail( s.error ); 10035 10036 // Get transport 10037 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); 10038 10039 // If no transport, we auto-abort 10040 if ( !transport ) { 10041 done( -1, "No Transport" ); 10042 } else { 10043 jqXHR.readyState = 1; 10044 10045 // Send global event 10046 if ( fireGlobals ) { 10047 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); 10048 } 10049 10050 // If request was aborted inside ajaxSend, stop there 10051 if ( completed ) { 10052 return jqXHR; 10053 } 10054 10055 // Timeout 10056 if ( s.async && s.timeout > 0 ) { 10057 timeoutTimer = window.setTimeout( function() { 10058 jqXHR.abort( "timeout" ); 10059 }, s.timeout ); 10060 } 10061 10062 try { 10063 completed = false; 10064 transport.send( requestHeaders, done ); 10065 } catch ( e ) { 10066 10067 // Rethrow post-completion exceptions 10068 if ( completed ) { 10069 throw e; 10070 } 10071 10072 // Propagate others as results 10073 done( -1, e ); 10074 } 10075 } 10076 10077 // Callback for when everything is done 10078 function done( status, nativeStatusText, responses, headers ) { 10079 var isSuccess, success, error, response, modified, 10080 statusText = nativeStatusText; 10081 10082 // Ignore repeat invocations 10083 if ( completed ) { 10084 return; 10085 } 10086 10087 completed = true; 10088 10089 // Clear timeout if it exists 10090 if ( timeoutTimer ) { 10091 window.clearTimeout( timeoutTimer ); 10092 } 10093 10094 // Dereference transport for early garbage collection 10095 // (no matter how long the jqXHR object will be used) 10096 transport = undefined; 10097 10098 // Cache response headers 10099 responseHeadersString = headers || ""; 10100 10101 // Set readyState 10102 jqXHR.readyState = status > 0 ? 4 : 0; 10103 10104 // Determine if successful 10105 isSuccess = status >= 200 && status < 300 || status === 304; 10106 10107 // Get response data 10108 if ( responses ) { 10109 response = ajaxHandleResponses( s, jqXHR, responses ); 10110 } 10111 10112 // Use a noop converter for missing script but not if jsonp 10113 if ( !isSuccess && 10114 jQuery.inArray( "script", s.dataTypes ) > -1 && 10115 jQuery.inArray( "json", s.dataTypes ) < 0 ) { 10116 s.converters[ "text script" ] = function() {}; 10117 } 10118 10119 // Convert no matter what (that way responseXXX fields are always set) 10120 response = ajaxConvert( s, response, jqXHR, isSuccess ); 10121 10122 // If successful, handle type chaining 10123 if ( isSuccess ) { 10124 10125 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 10126 if ( s.ifModified ) { 10127 modified = jqXHR.getResponseHeader( "Last-Modified" ); 10128 if ( modified ) { 10129 jQuery.lastModified[ cacheURL ] = modified; 10130 } 10131 modified = jqXHR.getResponseHeader( "etag" ); 10132 if ( modified ) { 10133 jQuery.etag[ cacheURL ] = modified; 10134 } 10135 } 10136 10137 // if no content 10138 if ( status === 204 || s.type === "HEAD" ) { 10139 statusText = "nocontent"; 10140 10141 // if not modified 10142 } else if ( status === 304 ) { 10143 statusText = "notmodified"; 10144 10145 // If we have data, let's convert it 10146 } else { 10147 statusText = response.state; 10148 success = response.data; 10149 error = response.error; 10150 isSuccess = !error; 10151 } 10152 } else { 10153 10154 // Extract error from statusText and normalize for non-aborts 10155 error = statusText; 10156 if ( status || !statusText ) { 10157 statusText = "error"; 10158 if ( status < 0 ) { 10159 status = 0; 10160 } 10161 } 10162 } 10163 10164 // Set data for the fake xhr object 10165 jqXHR.status = status; 10166 jqXHR.statusText = ( nativeStatusText || statusText ) + ""; 10167 10168 // Success/Error 10169 if ( isSuccess ) { 10170 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); 10171 } else { 10172 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); 10173 } 10174 10175 // Status-dependent callbacks 10176 jqXHR.statusCode( statusCode ); 10177 statusCode = undefined; 10178 10179 if ( fireGlobals ) { 10180 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", 10181 [ jqXHR, s, isSuccess ? success : error ] ); 10182 } 10183 10184 // Complete 10185 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); 10186 10187 if ( fireGlobals ) { 10188 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); 10189 10190 // Handle the global AJAX counter 10191 if ( !( --jQuery.active ) ) { 10192 jQuery.event.trigger( "ajaxStop" ); 10193 } 10194 } 10195 } 10196 10197 return jqXHR; 10198 }, 10199 10200 getJSON: function( url, data, callback ) { 10201 return jQuery.get( url, data, callback, "json" ); 10202 }, 10203 10204 getScript: function( url, callback ) { 10205 return jQuery.get( url, undefined, callback, "script" ); 10206 } 10207 } ); 10208 10209 jQuery.each( [ "get", "post" ], function( _i, method ) { 10210 jQuery[ method ] = function( url, data, callback, type ) { 10211 10212 // Shift arguments if data argument was omitted 10213 if ( isFunction( data ) ) { 10214 type = type || callback; 10215 callback = data; 10216 data = undefined; 10217 } 10218 10219 // The url can be an options object (which then must have .url) 10220 return jQuery.ajax( jQuery.extend( { 10221 url: url, 10222 type: method, 10223 dataType: type, 10224 data: data, 10225 success: callback 10226 }, jQuery.isPlainObject( url ) && url ) ); 10227 }; 10228 } ); 10229 10230 jQuery.ajaxPrefilter( function( s ) { 10231 var i; 10232 for ( i in s.headers ) { 10233 if ( i.toLowerCase() === "content-type" ) { 10234 s.contentType = s.headers[ i ] || ""; 10235 } 10236 } 10237 } ); 10238 10239 10240 jQuery._evalUrl = function( url, options, doc ) { 10241 return jQuery.ajax( { 10242 url: url, 10243 10244 // Make this explicit, since user can override this through ajaxSetup (#11264) 10245 type: "GET", 10246 dataType: "script", 10247 cache: true, 10248 async: false, 10249 global: false, 10250 10251 // Only evaluate the response if it is successful (gh-4126) 10252 // dataFilter is not invoked for failure responses, so using it instead 10253 // of the default converter is kludgy but it works. 10254 converters: { 10255 "text script": function() {} 10256 }, 10257 dataFilter: function( response ) { 10258 jQuery.globalEval( response, options, doc ); 10259 } 10260 } ); 10261 }; 10262 10263 10264 jQuery.fn.extend( { 10265 wrapAll: function( html ) { 10266 var wrap; 10267 10268 if ( this[ 0 ] ) { 10269 if ( isFunction( html ) ) { 10270 html = html.call( this[ 0 ] ); 10271 } 10272 10273 // The elements to wrap the target around 10274 wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); 10275 10276 if ( this[ 0 ].parentNode ) { 10277 wrap.insertBefore( this[ 0 ] ); 10278 } 10279 10280 wrap.map( function() { 10281 var elem = this; 10282 10283 while ( elem.firstElementChild ) { 10284 elem = elem.firstElementChild; 10285 } 10286 10287 return elem; 10288 } ).append( this ); 10289 } 10290 10291 return this; 10292 }, 10293 10294 wrapInner: function( html ) { 10295 if ( isFunction( html ) ) { 10296 return this.each( function( i ) { 10297 jQuery( this ).wrapInner( html.call( this, i ) ); 10298 } ); 10299 } 10300 10301 return this.each( function() { 10302 var self = jQuery( this ), 10303 contents = self.contents(); 10304 10305 if ( contents.length ) { 10306 contents.wrapAll( html ); 10307 10308 } else { 10309 self.append( html ); 10310 } 10311 } ); 10312 }, 10313 10314 wrap: function( html ) { 10315 var htmlIsFunction = isFunction( html ); 10316 10317 return this.each( function( i ) { 10318 jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); 10319 } ); 10320 }, 10321 10322 unwrap: function( selector ) { 10323 this.parent( selector ).not( "body" ).each( function() { 10324 jQuery( this ).replaceWith( this.childNodes ); 10325 } ); 10326 return this; 10327 } 10328 } ); 10329 10330 10331 jQuery.expr.pseudos.hidden = function( elem ) { 10332 return !jQuery.expr.pseudos.visible( elem ); 10333 }; 10334 jQuery.expr.pseudos.visible = function( elem ) { 10335 return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); 10336 }; 10337 10338 10339 10340 10341 jQuery.ajaxSettings.xhr = function() { 10342 try { 10343 return new window.XMLHttpRequest(); 10344 } catch ( e ) {} 10345 }; 10346 10347 var xhrSuccessStatus = { 10348 10349 // File protocol always yields status code 0, assume 200 10350 0: 200, 10351 10352 // Support: IE <=9 only 10353 // #1450: sometimes IE returns 1223 when it should be 204 10354 1223: 204 10355 }, 10356 xhrSupported = jQuery.ajaxSettings.xhr(); 10357 10358 support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); 10359 support.ajax = xhrSupported = !!xhrSupported; 10360 10361 jQuery.ajaxTransport( function( options ) { 10362 var callback, errorCallback; 10363 10364 // Cross domain only allowed if supported through XMLHttpRequest 10365 if ( support.cors || xhrSupported && !options.crossDomain ) { 10366 return { 10367 send: function( headers, complete ) { 10368 var i, 10369 xhr = options.xhr(); 10370 10371 xhr.open( 10372 options.type, 10373 options.url, 10374 options.async, 10375 options.username, 10376 options.password 10377 ); 10378 10379 // Apply custom fields if provided 10380 if ( options.xhrFields ) { 10381 for ( i in options.xhrFields ) { 10382 xhr[ i ] = options.xhrFields[ i ]; 10383 } 10384 } 10385 10386 // Override mime type if needed 10387 if ( options.mimeType && xhr.overrideMimeType ) { 10388 xhr.overrideMimeType( options.mimeType ); 10389 } 10390 10391 // X-Requested-With header 10392 // For cross-domain requests, seeing as conditions for a preflight are 10393 // akin to a jigsaw puzzle, we simply never set it to be sure. 10394 // (it can always be set on a per-request basis or even using ajaxSetup) 10395 // For same-domain requests, won't change header if already provided. 10396 if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { 10397 headers[ "X-Requested-With" ] = "XMLHttpRequest"; 10398 } 10399 10400 // Set headers 10401 for ( i in headers ) { 10402 xhr.setRequestHeader( i, headers[ i ] ); 10403 } 10404 10405 // Callback 10406 callback = function( type ) { 10407 return function() { 10408 if ( callback ) { 10409 callback = errorCallback = xhr.onload = 10410 xhr.onerror = xhr.onabort = xhr.ontimeout = 10411 xhr.onreadystatechange = null; 10412 10413 if ( type === "abort" ) { 10414 xhr.abort(); 10415 } else if ( type === "error" ) { 10416 10417 // Support: IE <=9 only 10418 // On a manual native abort, IE9 throws 10419 // errors on any property access that is not readyState 10420 if ( typeof xhr.status !== "number" ) { 10421 complete( 0, "error" ); 10422 } else { 10423 complete( 10424 10425 // File: protocol always yields status 0; see #8605, #14207 10426 xhr.status, 10427 xhr.statusText 10428 ); 10429 } 10430 } else { 10431 complete( 10432 xhrSuccessStatus[ xhr.status ] || xhr.status, 10433 xhr.statusText, 10434 10435 // Support: IE <=9 only 10436 // IE9 has no XHR2 but throws on binary (trac-11426) 10437 // For XHR2 non-text, let the caller handle it (gh-2498) 10438 ( xhr.responseType || "text" ) !== "text" || 10439 typeof xhr.responseText !== "string" ? 10440 { binary: xhr.response } : 10441 { text: xhr.responseText }, 10442 xhr.getAllResponseHeaders() 10443 ); 10444 } 10445 } 10446 }; 10447 }; 10448 10449 // Listen to events 10450 xhr.onload = callback(); 10451 errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); 10452 10453 // Support: IE 9 only 10454 // Use onreadystatechange to replace onabort 10455 // to handle uncaught aborts 10456 if ( xhr.onabort !== undefined ) { 10457 xhr.onabort = errorCallback; 10458 } else { 10459 xhr.onreadystatechange = function() { 10460 10461 // Check readyState before timeout as it changes 10462 if ( xhr.readyState === 4 ) { 10463 10464 // Allow onerror to be called first, 10465 // but that will not handle a native abort 10466 // Also, save errorCallback to a variable 10467 // as xhr.onerror cannot be accessed 10468 window.setTimeout( function() { 10469 if ( callback ) { 10470 errorCallback(); 10471 } 10472 } ); 10473 } 10474 }; 10475 } 10476 10477 // Create the abort callback 10478 callback = callback( "abort" ); 10479 10480 try { 10481 10482 // Do send the request (this may raise an exception) 10483 xhr.send( options.hasContent && options.data || null ); 10484 } catch ( e ) { 10485 10486 // #14683: Only rethrow if this hasn't been notified as an error yet 10487 if ( callback ) { 10488 throw e; 10489 } 10490 } 10491 }, 10492 10493 abort: function() { 10494 if ( callback ) { 10495 callback(); 10496 } 10497 } 10498 }; 10499 } 10500 } ); 10501 10502 10503 10504 10505// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) 10506 jQuery.ajaxPrefilter( function( s ) { 10507 if ( s.crossDomain ) { 10508 s.contents.script = false; 10509 } 10510 } ); 10511 10512// Install script dataType 10513 jQuery.ajaxSetup( { 10514 accepts: { 10515 script: "text/javascript, application/javascript, " + 10516 "application/ecmascript, application/x-ecmascript" 10517 }, 10518 contents: { 10519 script: /\b(?:java|ecma)script\b/ 10520 }, 10521 converters: { 10522 "text script": function( text ) { 10523 jQuery.globalEval( text ); 10524 return text; 10525 } 10526 } 10527 } ); 10528 10529// Handle cache's special case and crossDomain 10530 jQuery.ajaxPrefilter( "script", function( s ) { 10531 if ( s.cache === undefined ) { 10532 s.cache = false; 10533 } 10534 if ( s.crossDomain ) { 10535 s.type = "GET"; 10536 } 10537 } ); 10538 10539// Bind script tag hack transport 10540 jQuery.ajaxTransport( "script", function( s ) { 10541 10542 // This transport only deals with cross domain or forced-by-attrs requests 10543 if ( s.crossDomain || s.scriptAttrs ) { 10544 var script, callback; 10545 return { 10546 send: function( _, complete ) { 10547 script = jQuery( "<script>" ) 10548 .attr( s.scriptAttrs || {} ) 10549 .prop( { charset: s.scriptCharset, src: s.url } ) 10550 .on( "load error", callback = function( evt ) { 10551 script.remove(); 10552 callback = null; 10553 if ( evt ) { 10554 complete( evt.type === "error" ? 404 : 200, evt.type ); 10555 } 10556 } ); 10557 10558 // Use native DOM manipulation to avoid our domManip AJAX trickery 10559 document.head.appendChild( script[ 0 ] ); 10560 }, 10561 abort: function() { 10562 if ( callback ) { 10563 callback(); 10564 } 10565 } 10566 }; 10567 } 10568 } ); 10569 10570 10571 10572 10573 var oldCallbacks = [], 10574 rjsonp = /(=)\?(?=&|$)|\?\?/; 10575 10576// Default jsonp settings 10577 jQuery.ajaxSetup( { 10578 jsonp: "callback", 10579 jsonpCallback: function() { 10580 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) ); 10581 this[ callback ] = true; 10582 return callback; 10583 } 10584 } ); 10585 10586// Detect, normalize options and install callbacks for jsonp requests 10587 jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 10588 10589 var callbackName, overwritten, responseContainer, 10590 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? 10591 "url" : 10592 typeof s.data === "string" && 10593 ( s.contentType || "" ) 10594 .indexOf( "application/x-www-form-urlencoded" ) === 0 && 10595 rjsonp.test( s.data ) && "data" 10596 ); 10597 10598 // Handle iff the expected data type is "jsonp" or we have a parameter to set 10599 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { 10600 10601 // Get callback name, remembering preexisting value associated with it 10602 callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? 10603 s.jsonpCallback() : 10604 s.jsonpCallback; 10605 10606 // Insert callback into url or form data 10607 if ( jsonProp ) { 10608 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); 10609 } else if ( s.jsonp !== false ) { 10610 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; 10611 } 10612 10613 // Use data converter to retrieve json after script execution 10614 s.converters[ "script json" ] = function() { 10615 if ( !responseContainer ) { 10616 jQuery.error( callbackName + " was not called" ); 10617 } 10618 return responseContainer[ 0 ]; 10619 }; 10620 10621 // Force json dataType 10622 s.dataTypes[ 0 ] = "json"; 10623 10624 // Install callback 10625 overwritten = window[ callbackName ]; 10626 window[ callbackName ] = function() { 10627 responseContainer = arguments; 10628 }; 10629 10630 // Clean-up function (fires after converters) 10631 jqXHR.always( function() { 10632 10633 // If previous value didn't exist - remove it 10634 if ( overwritten === undefined ) { 10635 jQuery( window ).removeProp( callbackName ); 10636 10637 // Otherwise restore preexisting value 10638 } else { 10639 window[ callbackName ] = overwritten; 10640 } 10641 10642 // Save back as free 10643 if ( s[ callbackName ] ) { 10644 10645 // Make sure that re-using the options doesn't screw things around 10646 s.jsonpCallback = originalSettings.jsonpCallback; 10647 10648 // Save the callback name for future use 10649 oldCallbacks.push( callbackName ); 10650 } 10651 10652 // Call if it was a function and we have a response 10653 if ( responseContainer && isFunction( overwritten ) ) { 10654 overwritten( responseContainer[ 0 ] ); 10655 } 10656 10657 responseContainer = overwritten = undefined; 10658 } ); 10659 10660 // Delegate to script 10661 return "script"; 10662 } 10663 } ); 10664 10665 10666 10667 10668// Support: Safari 8 only 10669// In Safari 8 documents created via document.implementation.createHTMLDocument 10670// collapse sibling forms: the second one becomes a child of the first one. 10671// Because of that, this security measure has to be disabled in Safari 8. 10672// https://bugs.webkit.org/show_bug.cgi?id=137337 10673 support.createHTMLDocument = ( function() { 10674 var body = document.implementation.createHTMLDocument( "" ).body; 10675 body.innerHTML = "<form></form><form></form>"; 10676 return body.childNodes.length === 2; 10677 } )(); 10678 10679 10680// Argument "data" should be string of html 10681// context (optional): If specified, the fragment will be created in this context, 10682// defaults to document 10683// keepScripts (optional): If true, will include scripts passed in the html string 10684 jQuery.parseHTML = function( data, context, keepScripts ) { 10685 if ( typeof data !== "string" ) { 10686 return []; 10687 } 10688 if ( typeof context === "boolean" ) { 10689 keepScripts = context; 10690 context = false; 10691 } 10692 10693 var base, parsed, scripts; 10694 10695 if ( !context ) { 10696 10697 // Stop scripts or inline event handlers from being executed immediately 10698 // by using document.implementation 10699 if ( support.createHTMLDocument ) { 10700 context = document.implementation.createHTMLDocument( "" ); 10701 10702 // Set the base href for the created document 10703 // so any parsed elements with URLs 10704 // are based on the document's URL (gh-2965) 10705 base = context.createElement( "base" ); 10706 base.href = document.location.href; 10707 context.head.appendChild( base ); 10708 } else { 10709 context = document; 10710 } 10711 } 10712 10713 parsed = rsingleTag.exec( data ); 10714 scripts = !keepScripts && []; 10715 10716 // Single tag 10717 if ( parsed ) { 10718 return [ context.createElement( parsed[ 1 ] ) ]; 10719 } 10720 10721 parsed = buildFragment( [ data ], context, scripts ); 10722 10723 if ( scripts && scripts.length ) { 10724 jQuery( scripts ).remove(); 10725 } 10726 10727 return jQuery.merge( [], parsed.childNodes ); 10728 }; 10729 10730 10731 /** 10732 * Load a url into a page 10733 */ 10734 jQuery.fn.load = function( url, params, callback ) { 10735 var selector, type, response, 10736 self = this, 10737 off = url.indexOf( " " ); 10738 10739 if ( off > -1 ) { 10740 selector = stripAndCollapse( url.slice( off ) ); 10741 url = url.slice( 0, off ); 10742 } 10743 10744 // If it's a function 10745 if ( isFunction( params ) ) { 10746 10747 // We assume that it's the callback 10748 callback = params; 10749 params = undefined; 10750 10751 // Otherwise, build a param string 10752 } else if ( params && typeof params === "object" ) { 10753 type = "POST"; 10754 } 10755 10756 // If we have elements to modify, make the request 10757 if ( self.length > 0 ) { 10758 jQuery.ajax( { 10759 url: url, 10760 10761 // If "type" variable is undefined, then "GET" method will be used. 10762 // Make value of this field explicit since 10763 // user can override it through ajaxSetup method 10764 type: type || "GET", 10765 dataType: "html", 10766 data: params 10767 } ).done( function( responseText ) { 10768 10769 // Save response for use in complete callback 10770 response = arguments; 10771 10772 self.html( selector ? 10773 10774 // If a selector was specified, locate the right elements in a dummy div 10775 // Exclude scripts to avoid IE 'Permission Denied' errors 10776 jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : 10777 10778 // Otherwise use the full result 10779 responseText ); 10780 10781 // If the request succeeds, this function gets "data", "status", "jqXHR" 10782 // but they are ignored because response was set above. 10783 // If it fails, this function gets "jqXHR", "status", "error" 10784 } ).always( callback && function( jqXHR, status ) { 10785 self.each( function() { 10786 callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); 10787 } ); 10788 } ); 10789 } 10790 10791 return this; 10792 }; 10793 10794 10795 10796 10797 jQuery.expr.pseudos.animated = function( elem ) { 10798 return jQuery.grep( jQuery.timers, function( fn ) { 10799 return elem === fn.elem; 10800 } ).length; 10801 }; 10802 10803 10804 10805 10806 jQuery.offset = { 10807 setOffset: function( elem, options, i ) { 10808 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, 10809 position = jQuery.css( elem, "position" ), 10810 curElem = jQuery( elem ), 10811 props = {}; 10812 10813 // Set position first, in-case top/left are set even on static elem 10814 if ( position === "static" ) { 10815 elem.style.position = "relative"; 10816 } 10817 10818 curOffset = curElem.offset(); 10819 curCSSTop = jQuery.css( elem, "top" ); 10820 curCSSLeft = jQuery.css( elem, "left" ); 10821 calculatePosition = ( position === "absolute" || position === "fixed" ) && 10822 ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; 10823 10824 // Need to be able to calculate position if either 10825 // top or left is auto and position is either absolute or fixed 10826 if ( calculatePosition ) { 10827 curPosition = curElem.position(); 10828 curTop = curPosition.top; 10829 curLeft = curPosition.left; 10830 10831 } else { 10832 curTop = parseFloat( curCSSTop ) || 0; 10833 curLeft = parseFloat( curCSSLeft ) || 0; 10834 } 10835 10836 if ( isFunction( options ) ) { 10837 10838 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) 10839 options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); 10840 } 10841 10842 if ( options.top != null ) { 10843 props.top = ( options.top - curOffset.top ) + curTop; 10844 } 10845 if ( options.left != null ) { 10846 props.left = ( options.left - curOffset.left ) + curLeft; 10847 } 10848 10849 if ( "using" in options ) { 10850 options.using.call( elem, props ); 10851 10852 } else { 10853 curElem.css( props ); 10854 } 10855 } 10856 }; 10857 10858 jQuery.fn.extend( { 10859 10860 // offset() relates an element's border box to the document origin 10861 offset: function( options ) { 10862 10863 // Preserve chaining for setter 10864 if ( arguments.length ) { 10865 return options === undefined ? 10866 this : 10867 this.each( function( i ) { 10868 jQuery.offset.setOffset( this, options, i ); 10869 } ); 10870 } 10871 10872 var rect, win, 10873 elem = this[ 0 ]; 10874 10875 if ( !elem ) { 10876 return; 10877 } 10878 10879 // Return zeros for disconnected and hidden (display: none) elements (gh-2310) 10880 // Support: IE <=11 only 10881 // Running getBoundingClientRect on a 10882 // disconnected node in IE throws an error 10883 if ( !elem.getClientRects().length ) { 10884 return { top: 0, left: 0 }; 10885 } 10886 10887 // Get document-relative position by adding viewport scroll to viewport-relative gBCR 10888 rect = elem.getBoundingClientRect(); 10889 win = elem.ownerDocument.defaultView; 10890 return { 10891 top: rect.top + win.pageYOffset, 10892 left: rect.left + win.pageXOffset 10893 }; 10894 }, 10895 10896 // position() relates an element's margin box to its offset parent's padding box 10897 // This corresponds to the behavior of CSS absolute positioning 10898 position: function() { 10899 if ( !this[ 0 ] ) { 10900 return; 10901 } 10902 10903 var offsetParent, offset, doc, 10904 elem = this[ 0 ], 10905 parentOffset = { top: 0, left: 0 }; 10906 10907 // position:fixed elements are offset from the viewport, which itself always has zero offset 10908 if ( jQuery.css( elem, "position" ) === "fixed" ) { 10909 10910 // Assume position:fixed implies availability of getBoundingClientRect 10911 offset = elem.getBoundingClientRect(); 10912 10913 } else { 10914 offset = this.offset(); 10915 10916 // Account for the *real* offset parent, which can be the document or its root element 10917 // when a statically positioned element is identified 10918 doc = elem.ownerDocument; 10919 offsetParent = elem.offsetParent || doc.documentElement; 10920 while ( offsetParent && 10921 ( offsetParent === doc.body || offsetParent === doc.documentElement ) && 10922 jQuery.css( offsetParent, "position" ) === "static" ) { 10923 10924 offsetParent = offsetParent.parentNode; 10925 } 10926 if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { 10927 10928 // Incorporate borders into its offset, since they are outside its content origin 10929 parentOffset = jQuery( offsetParent ).offset(); 10930 parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); 10931 parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); 10932 } 10933 } 10934 10935 // Subtract parent offsets and element margins 10936 return { 10937 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), 10938 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) 10939 }; 10940 }, 10941 10942 // This method will return documentElement in the following cases: 10943 // 1) For the element inside the iframe without offsetParent, this method will return 10944 // documentElement of the parent window 10945 // 2) For the hidden or detached element 10946 // 3) For body or html element, i.e. in case of the html node - it will return itself 10947 // 10948 // but those exceptions were never presented as a real life use-cases 10949 // and might be considered as more preferable results. 10950 // 10951 // This logic, however, is not guaranteed and can change at any point in the future 10952 offsetParent: function() { 10953 return this.map( function() { 10954 var offsetParent = this.offsetParent; 10955 10956 while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { 10957 offsetParent = offsetParent.offsetParent; 10958 } 10959 10960 return offsetParent || documentElement; 10961 } ); 10962 } 10963 } ); 10964 10965// Create scrollLeft and scrollTop methods 10966 jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { 10967 var top = "pageYOffset" === prop; 10968 10969 jQuery.fn[ method ] = function( val ) { 10970 return access( this, function( elem, method, val ) { 10971 10972 // Coalesce documents and windows 10973 var win; 10974 if ( isWindow( elem ) ) { 10975 win = elem; 10976 } else if ( elem.nodeType === 9 ) { 10977 win = elem.defaultView; 10978 } 10979 10980 if ( val === undefined ) { 10981 return win ? win[ prop ] : elem[ method ]; 10982 } 10983 10984 if ( win ) { 10985 win.scrollTo( 10986 !top ? val : win.pageXOffset, 10987 top ? val : win.pageYOffset 10988 ); 10989 10990 } else { 10991 elem[ method ] = val; 10992 } 10993 }, method, val, arguments.length ); 10994 }; 10995 } ); 10996 10997// Support: Safari <=7 - 9.1, Chrome <=37 - 49 10998// Add the top/left cssHooks using jQuery.fn.position 10999// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 11000// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 11001// getComputedStyle returns percent when specified for top/left/bottom/right; 11002// rather than make the css module depend on the offset module, just check for it here 11003 jQuery.each( [ "top", "left" ], function( _i, prop ) { 11004 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, 11005 function( elem, computed ) { 11006 if ( computed ) { 11007 computed = curCSS( elem, prop ); 11008 11009 // If curCSS returns percentage, fallback to offset 11010 return rnumnonpx.test( computed ) ? 11011 jQuery( elem ).position()[ prop ] + "px" : 11012 computed; 11013 } 11014 } 11015 ); 11016 } ); 11017 11018 11019// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods 11020 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { 11021 jQuery.each( { 11022 padding: "inner" + name, 11023 content: type, 11024 "": "outer" + name 11025 }, function( defaultExtra, funcName ) { 11026 11027 // Margin is only for outerHeight, outerWidth 11028 jQuery.fn[ funcName ] = function( margin, value ) { 11029 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), 11030 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); 11031 11032 return access( this, function( elem, type, value ) { 11033 var doc; 11034 11035 if ( isWindow( elem ) ) { 11036 11037 // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) 11038 return funcName.indexOf( "outer" ) === 0 ? 11039 elem[ "inner" + name ] : 11040 elem.document.documentElement[ "client" + name ]; 11041 } 11042 11043 // Get document width or height 11044 if ( elem.nodeType === 9 ) { 11045 doc = elem.documentElement; 11046 11047 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], 11048 // whichever is greatest 11049 return Math.max( 11050 elem.body[ "scroll" + name ], doc[ "scroll" + name ], 11051 elem.body[ "offset" + name ], doc[ "offset" + name ], 11052 doc[ "client" + name ] 11053 ); 11054 } 11055 11056 return value === undefined ? 11057 11058 // Get width or height on the element, requesting but not forcing parseFloat 11059 jQuery.css( elem, type, extra ) : 11060 11061 // Set width or height on the element 11062 jQuery.style( elem, type, value, extra ); 11063 }, type, chainable ? margin : undefined, chainable ); 11064 }; 11065 } ); 11066 } ); 11067 11068 11069 jQuery.each( [ 11070 "ajaxStart", 11071 "ajaxStop", 11072 "ajaxComplete", 11073 "ajaxError", 11074 "ajaxSuccess", 11075 "ajaxSend" 11076 ], function( _i, type ) { 11077 jQuery.fn[ type ] = function( fn ) { 11078 return this.on( type, fn ); 11079 }; 11080 } ); 11081 11082 11083 11084 11085 jQuery.fn.extend( { 11086 11087 bind: function( types, data, fn ) { 11088 return this.on( types, null, data, fn ); 11089 }, 11090 unbind: function( types, fn ) { 11091 return this.off( types, null, fn ); 11092 }, 11093 11094 delegate: function( selector, types, data, fn ) { 11095 return this.on( types, selector, data, fn ); 11096 }, 11097 undelegate: function( selector, types, fn ) { 11098 11099 // ( namespace ) or ( selector, types [, fn] ) 11100 return arguments.length === 1 ? 11101 this.off( selector, "**" ) : 11102 this.off( types, selector || "**", fn ); 11103 }, 11104 11105 hover: function( fnOver, fnOut ) { 11106 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); 11107 } 11108 } ); 11109 11110 jQuery.each( 11111 ( "blur focus focusin focusout resize scroll click dblclick " + 11112 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 11113 "change select submit keydown keypress keyup contextmenu" ).split( " " ), 11114 function( _i, name ) { 11115 11116 // Handle event binding 11117 jQuery.fn[ name ] = function( data, fn ) { 11118 return arguments.length > 0 ? 11119 this.on( name, null, data, fn ) : 11120 this.trigger( name ); 11121 }; 11122 } 11123 ); 11124 11125 11126 11127 11128// Support: Android <=4.0 only 11129// Make sure we trim BOM and NBSP 11130 var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; 11131 11132// Bind a function to a context, optionally partially applying any 11133// arguments. 11134// jQuery.proxy is deprecated to promote standards (specifically Function#bind) 11135// However, it is not slated for removal any time soon 11136 jQuery.proxy = function( fn, context ) { 11137 var tmp, args, proxy; 11138 11139 if ( typeof context === "string" ) { 11140 tmp = fn[ context ]; 11141 context = fn; 11142 fn = tmp; 11143 } 11144 11145 // Quick check to determine if target is callable, in the spec 11146 // this throws a TypeError, but we will just return undefined. 11147 if ( !isFunction( fn ) ) { 11148 return undefined; 11149 } 11150 11151 // Simulated bind 11152 args = slice.call( arguments, 2 ); 11153 proxy = function() { 11154 return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); 11155 }; 11156 11157 // Set the guid of unique handler to the same of original handler, so it can be removed 11158 proxy.guid = fn.guid = fn.guid || jQuery.guid++; 11159 11160 return proxy; 11161 }; 11162 11163 jQuery.holdReady = function( hold ) { 11164 if ( hold ) { 11165 jQuery.readyWait++; 11166 } else { 11167 jQuery.ready( true ); 11168 } 11169 }; 11170 jQuery.isArray = Array.isArray; 11171 jQuery.parseJSON = JSON.parse; 11172 jQuery.nodeName = nodeName; 11173 jQuery.isFunction = isFunction; 11174 jQuery.isWindow = isWindow; 11175 jQuery.camelCase = camelCase; 11176 jQuery.type = toType; 11177 11178 jQuery.now = Date.now; 11179 11180 jQuery.isNumeric = function( obj ) { 11181 11182 // As of jQuery 3.0, isNumeric is limited to 11183 // strings and numbers (primitives or objects) 11184 // that can be coerced to finite numbers (gh-2662) 11185 var type = jQuery.type( obj ); 11186 return ( type === "number" || type === "string" ) && 11187 11188 // parseFloat NaNs numeric-cast false positives ("") 11189 // ...but misinterprets leading-number strings, particularly hex literals ("0x...") 11190 // subtraction forces infinities to NaN 11191 !isNaN( obj - parseFloat( obj ) ); 11192 }; 11193 11194 jQuery.trim = function( text ) { 11195 return text == null ? 11196 "" :
11197 ( text + "" ).replace( rtrim, "" ); 11198 }; 11199 11200 11201 11202// Register as a named AMD module, since jQuery can be concatenated with other 11203// files that may use define, but not via a proper concatenation script that 11204// understands anonymous AMD modules. A named AMD is safest and most robust 11205// way to register. Lowercase jquery is used because AMD module names are 11206// derived from file names, and jQuery is normally delivered in a lowercase 11207// file name. Do this after creating the global so that if an AMD module wants 11208// to call noConflict to hide this version of jQuery, it will work. 11209 11210// Note that for maximum portability, libraries that are not jQuery should 11211// declare themselves as anonymous modules, and avoid setting a global if an 11212// AMD loader is present. jQuery is a special case. For more information, see 11213// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon 11214 11215 if ( typeof define === "function" && define.amd ) { 11216 define( "jquery", [], function() { 11217 return jQuery; 11218 } ); 11219 } 11220 11221 11222 11223 11224 var 11225 11226 // Map over jQuery in case of overwrite 11227 _jQuery = window.jQuery, 11228 11229 // Map over the $ in case of overwrite 11230 _$ = window.$; 11231 11232 jQuery.noConflict = function( deep ) { 11233 if ( window.$ === jQuery ) { 11234 window.$ = _$; 11235 } 11236 11237 if ( deep && window.jQuery === jQuery ) { 11238 window.jQuery = _jQuery; 11239 } 11240 11241 return jQuery; 11242 }; 11243 11244// Expose jQuery and $ identifiers, even in AMD 11245// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) 11246// and CommonJS for browser emulators (#13566) 11247 if ( typeof noGlobal === "undefined" ) { 11248 window.jQuery = window.$ = jQuery; 11249 } 11250 11251 11252 11253 11254 return jQuery; 11255} ); 11256/** 11257 * Cookie plugin 11258 * 11259 * Copyright (c) 2006 Klaus Hartl (stilbuero.de) 11260 * Dual licensed under the MIT and GPL licenses: 11261 * http://www.opensource.org/licenses/mit-license.php 11262 * http://www.gnu.org/licenses/gpl.html 11263 * 11264 */ 11265 11266/** 11267 * Create a cookie with the given name and value and other optional parameters. 11268 * 11269 * @example $.cookie('the_cookie', 'the_value'); 11270 * @desc Set the value of a cookie. 11271 * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true }); 11272 * @desc Create a cookie with all available options. 11273 * @example $.cookie('the_cookie', 'the_value'); 11274 * @desc Create a session cookie. 11275 * @example $.cookie('the_cookie', null); 11276 * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain 11277 * used when the cookie was set. 11278 * 11279 * @param String name The name of the cookie. 11280 * @param String value The value of the cookie. 11281 * @param Object options An object literal containing key/value pairs to provide optional cookie attributes. 11282 * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object. 11283 * If a negative value is specified (e.g. a date in the past), the cookie will be deleted. 11284 * If set to null or omitted, the cookie will be a session cookie and will not be retained 11285 * when the the browser exits. 11286 * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie). 11287 * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie). 11288 * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will 11289 * require a secure protocol (like HTTPS). 11290 * @type undefined 11291 * 11292 * @name $.cookie 11293 * @cat Plugins/Cookie 11294 * @author Klaus Hartl/[email protected] 11295 */ 11296 11297/** 11298 * Get the value of a cookie with the given name. 11299 * 11300 * @example $.cookie('the_cookie'); 11301 * @desc Get the value of a cookie. 11302 * 11303 * @param String name The name of the cookie. 11304 * @return The value of the cookie. 11305 * @type String 11306 * 11307 * @name $.cookie 11308 * @cat Plugins/Cookie 11309 * @author Klaus Hartl/[email protected] 11310 */ 11311jQuery.cookie = function(name, value, options) { 11312 if (typeof value != 'undefined') { // name and value given, set cookie 11313 options = options || {}; 11314 if (value === null) { 11315 value = ''; 11316 options = $.extend({}, options); // clone object since it's unexpected behavior if the expired property were changed 11317 options.expires = -1; 11318 } 11319 var expires = ''; 11320 if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { 11321 var date; 11322 if (typeof options.expires == 'number') { 11323 date = new Date(); 11324 date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); 11325 } else { 11326 date = options.expires; 11327 } 11328 expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE 11329 } 11330 // NOTE Needed to parenthesize options.path and options.domain 11331 // in the following expressions, otherwise they evaluate to undefined 11332 // in the packed version for some reason... 11333 var path = options.path ? '; path=' + (options.path) : ''; 11334 var domain = options.domain ? '; domain=' + (options.domain) : ''; 11335 var secure = options.secure ? '; secure' : ''; 11336 document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); 11337 } else { // only name given, get cookie 11338 var cookieValue = null; 11339 if (document.cookie && document.cookie != '') { 11340 var cookies = document.cookie.split(';'); 11341 for (var i = 0; i < cookies.length; i++) { 11342 var cookie = jQuery.trim(cookies[i]); 11343 // Does this cookie string begin with the name we want? 11344 if (cookie.substring(0, name.length + 1) == (name + '=')) { 11345 cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 11346 break; 11347 } 11348 } 11349 } 11350 return cookieValue; 11351 } 11352}; 11353// JQuery URL Parser plugin - https://github.com/allmarkedup/jQuery-URL-Parser 11354// Written by Mark Perkins, [email protected] 11355// License: http://unlicense.org/ (i.e. do what you want with it!) 11356 11357;(function($) { 11358 11359 var tag2attr = { 11360 a : 'href', 11361 img : 'src', 11362 form : 'action', 11363 base : 'href', 11364 script : 'src', 11365 iframe : 'src', 11366 link : 'href' 11367 }, 11368 11369 key = ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","fragment"], // keys available to query 11370 11371 aliases = { "anchor" : "fragment" }, // aliases for backwards compatability 11372 11373 parser = {
11374 strict : /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, //less intuitive, more accurate to the specs 11375 loose : /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // more intuitive, fails on relative paths and deviates from specs 11376 }, 11377 11378 querystring_parser = /(?:^|&|;)([^&=;]*)=?([^&;]*)/g, // supports both ampersand and semicolon-delimted query string key/value pairs 11379 11380 fragment_parser = /(?:^|&|;)([^&=;]*)=?([^&;]*)/g; // supports both ampersand and semicolon-delimted fragment key/value pairs 11381 11382 function parseUri( url, strictMode ) 11383 { 11384 var str = decodeURI( url ), 11385 res = parser[ strictMode || false ? "strict" : "loose" ].exec( str ), 11386 uri = { attr : {}, param : {}, seg : {} }, 11387 i = 14; 11388 11389 while ( i-- ) 11390 { 11391 uri.attr[ key[i] ] = res[i] || ""; 11392 } 11393 11394 // build query and fragment parameters 11395 11396 uri.param['query'] = {}; 11397 uri.param['fragment'] = {}; 11398 11399 uri.attr['query'].replace( querystring_parser, function ( $0, $1, $2 ){ 11400 if ($1) 11401 { 11402 uri.param['query'][$1] = $2; 11403 } 11404 }); 11405 11406 uri.attr['fragment'].replace( fragment_parser, function ( $0, $1, $2 ){ 11407 if ($1) 11408 { 11409 uri.param['fragment'][$1] = $2; 11410 } 11411 }); 11412 11413 // split path and fragement into segments 11414 11415 uri.seg['path'] = uri.attr.path.replace(/^\/+|\/+$/g,'').split('/'); 11416 11417 uri.seg['fragment'] = uri.attr.fragment.replace(/^\/+|\/+$/g,'').split('/'); 11418 11419 // compile a 'base' domain attribute 11420 11421 uri.attr['base'] = uri.attr.host ? uri.attr.protocol+"://"+uri.attr.host + (uri.attr.port ? ":"+uri.attr.port : '') : ''; 11422 11423 return uri; 11424 }; 11425 11426 function getAttrName( elm ) 11427 { 11428 var tn = elm.tagName; 11429 if ( tn !== undefined ) return tag2attr[tn.toLowerCase()]; 11430 return tn; 11431 } 11432 11433 $.fn.url = function( strictMode ) 11434 { 11435 var url = ''; 11436 11437 if ( this.length ) 11438 { 11439 url = $(this).attr( getAttrName(this[0]) ) || ''; 11440 } 11441 11442 return $.url({ url : url, strict : strictMode }); 11443 }; 11444 11445 $.url = function( opts ) 11446 { 11447 var url = '', 11448 strict = false; 11449 11450 if ( typeof opts === 'string' ) 11451 { 11452 url = opts; 11453 } 11454 else 11455 { 11456 opts = opts || {}; 11457 strict = opts.strict || strict; 11458 url = opts.url === undefined ? window.location.toString() : opts.url; 11459 } 11460 11461 return { 11462 11463 data : parseUri(url, strict), 11464 11465 // get various attributes from the URI 11466 attr : function( attr ) 11467 { 11468 attr = aliases[attr] || attr; 11469 return attr !== undefined ? this.data.attr[attr] : this.data.attr; 11470 }, 11471 11472 // return query string parameters 11473 param : function( param ) 11474 { 11475 return param !== undefined ? this.data.param.query[param] : this.data.param.query; 11476 }, 11477 11478 // return fragment parameters 11479 fparam : function( param ) 11480 { 11481 return param !== undefined ? this.data.param.fragment[param] : this.data.param.fragment; 11482 }, 11483 11484 // return path segments 11485 segment : function( seg ) 11486 { 11487 if ( seg === undefined ) 11488 { 11489 return this.data.seg.path; 11490 } 11491 else 11492 { 11493 seg = seg < 0 ? this.data.seg.path.length + seg : seg - 1; // negative segments count from the end 11494 return this.data.seg.path[seg]; 11495 } 11496 }, 11497 11498 // return fragment segments 11499 fsegment : function( seg ) 11500 { 11501 if ( seg === undefined ) 11502 { 11503 return this.data.seg.fragment; 11504 } 11505 else 11506 { 11507 seg = seg < 0 ? this.data.seg.fragment.length + seg : seg - 1; // negative segments count from the end 11508 return this.data.seg.fragment[seg]; 11509 } 11510 }, 11511 11512 replace : function( param, value ) 11513 { 11514 var sParamPattern = eval('/(&|\\?)'+param+'=[a-zA-Z0-9\_\-\|\+\^\#\@\$\%\*\/\;\:]+/'); 11515 var sIsParamPattern = /\?[a-zA-Z0-9_-]+/; 11516 if (sIsParamPattern.test(url) === true) { 11517 if (sParamPattern.test(url) === true) return url.replace(sParamPattern, '$1'+param+'='+value); 11518 return url + '&'+param+'='+value; 11519 } else { 11520 if (sParamPattern.test(url) === true) return url.replace(sParamPattern, '$1'+param+'='+value); 11521 return url + '?'+param+'='+value; 11522 } 11523 11524 } 11525 11526 }; 11527 11528 }; 11529 11530})(jQuery); 11531(function($) { 11532 $.fn.setValue = function(value) { 11533 if ($(this).is('SELECT') === true) { 11534 $(this).find('option[value="'+ value +'"]').prop('selected', true); 11535 } else { 11536 $(this).val(value); 11537 } 11538 }; 11539})(jQuery); 11540var EC$ = jQuery.noConflict(true); 11541/*! 11542 * jQuery JavaScript Library v1.4.4 11543 * http://jquery.com/ 11544 * 11545 * Copyright 2010, John Resig 11546 * Dual licensed under the MIT or GPL Version 2 licenses. 11547 * http://jquery.org/license 11548 * 11549 * Includes Sizzle.js 11550 * http://sizzlejs.com/ 11551 * Copyright 2010, The Dojo Foundation 11552 * Released under the MIT, BSD, and GPL Licenses. 11553 * 11554 * Date: Thu Nov 11 19:04:53 2010 -0500 11555 */ 11556(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h= 11557h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"|| 11558h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La, 11559"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this, 11560e);
11560if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a, 11561"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+ 11562a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/, 11563C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j, 11564s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this, 11565j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length}, 11566toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j=== 11567-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false; 11568if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(s==="__proto__")continue;if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--; 11569if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload", 11570b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&& 11571!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&& 11572l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z], 11573z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j, 11574s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="str
11574ing"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v= 11575s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)|| 11576[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u, 11577false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"), 11578k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false, 11579scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent= 11580false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom= 115811;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display= 11582"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h= 11583c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando); 11584else if(d)delete f[e];else for(var l in a)delete a[l]}}
11584,acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this, 11585a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e= 11586c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this, 11587a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan", 11588colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType=== 115891)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "), 11590l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this, 11591"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one"; 11592if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r= 11593a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});
11593if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true}, 11594attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&& 11595b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0}; 11596c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem, 11597arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid= 11598d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+ 11599c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b= 11600w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;
11600if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType=== 116018)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k=== 11602"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+ 11603d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), 11604fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| 11605d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this, 11606Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp= 11607c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U}; 11608var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};
11608c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!== 11609"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V, 11610xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired= 11611B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type=== 11612"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]=== 116130&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d, 11614a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d= 116151;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mou
11615seout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d=== 11616"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}}); 11617c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); 11618(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i, 11619[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3]; 11620break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr, 11621q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h= 11622l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*")); 11623return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!== 11624B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/, 11625POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}}
11625,relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()=== 11626i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m= 11627i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g, 11628"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n, 11629m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== 11630true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== 11631g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]- 116320===i},eq:function(g,i,n){return n[3]-0===i}}
11632,filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n=== 11633"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== 11634i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]]; 11635if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m, 11636g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1; 11637for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"), 11638i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g); 11639n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&& 11640function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F|| 11641p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");
11641if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g= 11642t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition? 11643function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML; 11644c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})}, 11645not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h= 11646h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context): 11647c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a, 116482,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a, 11649b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&& 11650e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1, 11651"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];
11651c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= 11652c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, 11653wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, 11654prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, 11655this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); 11656return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null; 11657else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d= 11658c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a, 11659b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")): 11660this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;
11660if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append", 11661prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument|| 11662b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length- 116631;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script")))); 11664d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i, 11665jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true, 11666zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b), 11667h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b); 11668if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);
11668if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f= 11669d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left; 11670e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, 11671ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b=== 11672"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& 11673!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, 11674getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", 11675script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| 11676!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache= 11677false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");
11677if(b.scriptCharset)A.charset=b.scriptCharset; 11678A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type", 11679b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& 11680c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| 11681c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]= 11682encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess", 11683[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"), 11684e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}}); 11685if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["o
11685pacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show", 116863),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay", 11687d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b, 11688d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)=== 11689"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L|| 116901)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, 11691d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* 11692Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)} 11693var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; 11694this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;
11694if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| 11695this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= 11696c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a=== 11697b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&& 11698h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle; 11699for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+= 11700parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px", 11701height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells= 11702f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a, 11703"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a, 11704e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;
11704return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&& 11705c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); 11706c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+ 11707b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window); 11708 11709(function($, jQuery) { 11710 // .uuid ë³µì 11711 if (typeof jQuery.uuid == 'undefined') { 11712 jQuery.uuid = 0; 11713 } 11714 11715 // .curCSS ë³µì 11716 if ( !jQuery.curCSS ) { 11717 jQuery.curCSS = jQuery.css; 11718 } 11719 11720 // .browser ë³µì 11721 if ( !$.browser ) { 11722 $.uaMatch = function( ua ) { 11723 ua = ua.toLowerCase(); 11724 11725 var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || 11726 /(webkit)[ \/]([\w.]+)/.exec( ua ) || 11727 /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || 11728 /(msie) ([\w.]+)/.exec( ua ) || 11729 ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || 11730 []; 11731 11732 return { 11733 browser: match[ 1 ] || "", 11734 version: match[ 2 ] || "0" 11735 }; 11736 }; 11737 11738 matched = $.uaMatch( navigator.userAgent ); 11739 browser = {}; 11740 11741 if ( matched.browser ) { 11742 browser[ matched.browser ] = true; 11743 browser.version = matched.version; 11744 } 11745 11746 // Chrome is Webkit, but Webkit is also Safari. 11747 if ( browser.chrome ) { 11748 browser.webkit = true; 11749 } else if ( browser.webkit ) { 11750 browser.safari = true; 11751 } 11752 11753 $.browser = browser; 11754 } 11755 11756 // $.escapeSelector Polyfill 11757 if ( !$.escapeSelector ) { 11758 $.escapeSelector = function( sel ) { 11759 var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g; 11760 var fcssescape = function( ch, asCodePoint ) { 11761 if ( asCodePoint ) { 11762 11763 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 11764 if ( ch === "\0" ) { 11765 return "\uFFFD"; 11766 } 11767 11768 // Control characters and (dependent upon position) numbers get escaped as code points 11769 return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; 11770 } 11771 11772 // Other potentially-special ASCII characters get backslash-escaped 11773 return "\\" + ch; 11774 }; 11775 11776 return ( sel + "" ).replace( rcssescape, fcssescape ); 11777 }; 11778 } 11779})($, jQuery); 11780(function(global) {if (global.moment) {global.moment_original = global.moment;} 11781!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var H;function _(){return H.apply(null,arguments)}function y(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function F(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function c(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function L(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;for(var t in e)if(c(e,t))return;return 1}function g(e){return void 0===e}function w(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function V(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function G(e,t){for(var n=[],s=e.length,i=0;i<s;++i)n.push(t(e[i],i));return n}function E(e,t){for(var n in t)c(t,n)&&(e[n]=t[n]);return c(t,"toString")&&(e.toString=t.toString),c(t,"valueOf")&&(e.valueOf=t.valueOf),e}function l(e,t,n,s){return Wt(e,t,n,s,!0).utc()}function p(e){return null==e._pf&&(e._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invali
vendor: 53,270 bytes, line 11781
11781dMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}),e._pf}function A(e){var t,n,s=e._d&&!isNaN(e._d.getTime());return s&&(t=p(e),n=j.call(t.parsedDateParts,function(e){return null!=e}),s=t.overflow<0&&!t.empty&&!t.invalidEra&&!t.invalidMonth&&!t.invalidWeekday&&!t.weekdayMismatch&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated&&(!t.meridiem||t.meridiem&&n),e._strict)&&(s=s&&0===t.charsLeftOver&&0===t.unusedTokens.length&&void 0===t.bigHour),null!=Object.isFrozen&&Object.isFrozen(e)?s:(e._isValid=s,e._isValid)}function I(e){var t=l(NaN);return null!=e?E(p(t),e):p(t).userInvalidated=!0,t}var j=Array.prototype.some||function(e){for(var t=Object(this),n=t.length>>>0,s=0;s<n;s++)if(s in t&&e.call(this,t[s],s,t))return!0;return!1},Z=_.momentProperties=[],z=!1;function q(e,t){var n,s,i,r=Z.length;if(g(t._isAMomentObject)||(e._isAMomentObject=t._isAMomentObject),g(t._i)||(e._i=t._i),g(t._f)||(e._f=t._f),g(t._l)||(e._l=t._l),g(t._strict)||(e._strict=t._strict),g(t._tzm)||(e._tzm=t._tzm),g(t._isUTC)||(e._isUTC=t._isUTC),g(t._offset)||(e._offset=t._offset),g(t._pf)||(e._pf=p(t)),g(t._locale)||(e._locale=t._locale),0<r)for(n=0;n<r;n++)g(i=t[s=Z[n]])||(e[s]=i);return e}function $(e){q(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===z&&(z=!0,_.updateOffset(this),z=!1)}function k(e){return e instanceof $||null!=e&&null!=e._isAMomentObject}function B(e){!1===_.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function e(r,a){var o=!0;return E(function(){if(null!=_.deprecationHandler&&_.deprecationHandler(null,r),o){for(var e,t,n=[],s=arguments.length,i=0;i<s;i++){if(e="","object"==typeof arguments[i]){for(t in e+="\n["+i+"] ",arguments[0])c(arguments[0],t)&&(e+=t+": "+arguments[0][t]+", ");e=e.slice(0,-2)}else e=arguments[i];n.push(e)}B(r+"\nArguments: "+Array.prototype.slice.call(n).join("")+"\n"+(new Error).stack),o=!1}return a.apply(this,arguments)},a)}var J={};function Q(e,t){null!=_.deprecationHandler&&_.deprecationHandler(e,t),J[e]||(B(t),J[e]=!0)}function a(e){return"undefined"!=typeof Function&&e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}function X(e,t){var n,s=E({},e);for(n in t)c(t,n)&&(F(e[n])&&F(t[n])?(s[n]={},E(s[n],e[n]),E(s[n],t[n])):null!=t[n]?s[n]=t[n]:delete s[n]);for(n in e)c(e,n)&&!c(t,n)&&F(e[n])&&(s[n]=E({},s[n]));return s}function K(e){null!=e&&this.set(e)}_.suppressDeprecationWarnings=!1,_.deprecationHandler=null;var ee=Object.keys||function(e){var t,n=[];for(t in e)c(e,t)&&n.push(t);return n};function r(e,t,n){var s=""+Math.abs(e);return(0<=e?n?"+":"":"-")+Math.pow(10,Math.max(0,t-s.length)).toString().substr(1)+s}var te=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,ne=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,se={},ie={};function s(e,t,n,s){var i="string"==typeof s?function(){return this[s]()}:s;e&&(ie[e]=i),t&&(ie[t[0]]=function(){return r(i.apply(this,arguments),t[1],t[2])}),n&&(ie[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function re(e,t){return e.isValid()?(t=ae(t,e.localeData()),se[t]=se[t]||function(s){for(var e,i=s.match(te),t=0,r=i.length;t<r;t++)ie[i[t]]?i[t]=ie[i[t]]:i[t]=(e=i[t]).match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"");return function(e){for(var t="",n=0;n<r;n++)t+=a(i[n])?i[n].call(e,s):i[n];return t}}(t),se[t](e)):e.localeData().invalidDate()}function ae(e,t){var n=5;function s(e){return t.longDateFormat(e)||e}for(ne.lastIndex=0;0<=n&&ne.test(e);)e=e.replace(ne,s),ne.lastIndex=0,--n;return e}var oe={D:"date",dates:"date",date:"date",d:"day",days:"day",day:"day",e:"weekday",weekdays:"weekday",weekday:"weekday",E:"isoWeekday",isoweekdays:"isoWeekday",isoweekday:"isoWeekday",DDD:"dayOfYear",dayofyears:"dayOfYear",dayofyear:"dayOfYear",h:"hour",hours:"hour",hour:"hour",ms:"millisecond",milliseconds:"millisecond",millisecond:"millisecond",m:"minute",minutes:"minute",minute:"minute",M:"month",months:"month",month:"month",Q:"quarter",quarters:"quarter",quarter:"quarter",s:"second",seconds:"second",second:"second",gg:"weekYear",weekyears:"weekYear",weekyear:"weekYear",GG:"isoWeekYear",isoweekyears:"isoWeekYear",isoweekyear:"isoWeekYear",w:"week",weeks:"week",week:"week",W:"isoWeek",isoweeks:"isoWeek",isoweek:"isoWeek",y:"year",years:"year",year:"year"};function o(e){return"string"==typeof e?oe[e]||oe[e.toLowerCase()]:void 0}function ue(e){var t,n,s={};for(n in e)c(e,n)&&(t=o(n))&&(s[t]=e[n]);return s}var le={date:9,day:11,weekday:11,isoWeekday:11,dayOfYear:4,hour:13,millisecond:16,minute:14,month:8,quarter:7,second:15,weekYear:1,isoWeekYear:1,week:5,isoWeek:5,year:1};var de=/\d/,t=/\d\d/,he=/\d{3}/,ce=/\d{4}/,fe=/[+-]?\d{6}/,n=/\d\d?/,me=/\d\d\d\d?/,_e=/\d\d\d\d\d\d?/,ye=/\d{1,3}/,ge=/\d{1,4}/,we=/[+-]?\d{1,6}/,pe=/\d+/,ke=/[+-]?\d+/,Me=/Z|[+-]\d\d:?\d\d/gi,ve=/Z|[+-]\d\d(?::?\d\d)?/gi,i=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,u=/^[1-9]\d?/,d=/^([1-9]\d|\d)/;function h(e,n,s){Ye[e]=a(n)?n:function(e,t){return e&&s?s:n}}function De(e,t){return c(Ye,e)?Ye[e](t._strict,t._locale):new RegExp(f(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,s,i){return t||n||s||i})))}function f(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function m(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function M(e){var e=+e,t=0;return t=0!=e&&isFinite(e)?m(e):t}var Ye={},Se={};function v(e,n){var t,s,i=n;for("string"==typeof e&&(e=[e]),w(n)&&(i=function(e,t){t[n]=M(e)}),s=e.length,t=0;t<s;t++)Se[e[t]]=i}function Oe(e,i){v(e,function(e,t,n,s){n._w=n._w||{},i(e,n._w,n,s)})}function be(e){return e%4==0&&e%100!=0||e%400==0}var D=0,Y=1,S=2,O=3,b=4,T=5,Te=6,xe=7,Ne=8;function We(e){return be(e)?366:365}s("Y",0,0,function(){var e=this.year();return e<=9999?r(e,4):"+"+e}),s(0,["YY",2],0,function(){return this.year()%100}),s(0,["YYYY",4],0,"year"),s(0,["YYYYY",5],0,"year"),s(0,["YYYYYY",6,!0],0,"year"),h("Y",ke),h("YY",n,t),h("YYYY",ge,ce),h("YYYYY",we,fe),h("YYYYYY",we,fe),v(["YYYYY","YYYYYY"],D),v("YYYY",function(e,t){t[D]=2===e.length?_.parseTwoDigitYear(e):M(e)}),v("YY",function(e,t){t[D]=_.parseTwoDigitYear(e)}),v("Y",function(e,t){t[D]=parseInt(e,10)}),_.parseTwoDigitYear=function(e){return M(e)+(68<M(e)?1900:2e3)};var x,Pe=Re("FullYear",!0);function Re(t,n){return function(e){return null!=e?(Ue(this,t,e),_.updateOffset(this,n),this):Ce(this,t)}}function Ce(e,t){if(!e.isValid())return NaN;var n=e._d,s=e._isUTC;switch(t){case"Milliseconds":return s?n.getUTCMilliseconds():n.getMilliseconds();case"Seconds":return s?n.getUTCSeconds():n.getSeconds();case"Minutes":return s?n.getUTCMinutes():n.getMinutes();case"Hours":return s?n.getUTCHours():n.getHours();case"Date":return s?n.getUTCDate():n.getDate();case"Day":return s?n.getUTCDay():n.getDay();case"Month":return s?n.getUTCMonth():n.getMonth();case"FullYear":return s?n.getUTCFullYear():n.getFullYear();default:return NaN}}function Ue(e,t,n){var s,i,r;if(e.isValid()&&!isNaN(n)){switch(s=e._d,i=e._isUTC,t){case"Milliseconds":return i?s.setUTCMilliseconds(n):s.setMilliseconds(n);case"Seconds":return i?s.setUTCSeconds(n):s.setSeconds(n);case"Minutes":return i?s.setUTCMinutes(n):s.setMinutes(n);case"Hours":return i?s.setUTCHours(n):s.setHours(n);case"Date":return i?s.setUTCDate(n):s.setDate(n);case"FullYear":break;default:return}t=n,r=e.month(),e=29!==(e=e.date())||1!==r||be(t)?e:28,i?s.setUTCFullYear(t,r,e):s.setFullYear(t,r,e)}}function He(e,t){var n;return isNaN(e)||isNaN(t)?NaN:(n=(t%(n=12)+n)%n,e+=(t-n)/12,1==n?be(e)?29:28:31-n%7%2)}x=Array.prototype.indexOf||function(e){for(var t=0;t<this.length;++t)if(this[t]===e)return t;return-1},s("M",["MM",2],"Mo",function(){return this.month()+1}),s("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),s("MMMM",0,0,function(e){return this.localeData().months(this,e)}),h("M",n,u),h("MM",n,t),h("MMM",function(e,t){return t.monthsShortRegex(e)}),h("MMMM",function(e,t){return t.monthsRegex(e)}),v(["M","MM"],function(e,t){t[Y]=M(e)-1}),v(["MMM","MMMM"],function(e,t,n,s){s=n._locale.monthsParse(e,s,n._strict);null!=s?t[Y]=s:p(n).invalidMonth=e});var Fe="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),Le="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),Ve=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Ge=i,Ee=i;function Ae(e,t){if(e.isValid()){if("string"==typeof t)if(/^\d+$/.test(t))t=M(t);else if(!w(t=e.localeData().monthsParse(t)))return;var n=(n=e.date())<29?n:Math.min(n,He(e.year(),t));e._isUTC?e._d.setUTCMonth(t,n):e._d.setMonth(t,n)}}function Ie(e){return null!=e?(Ae(this,e),_.updateOffset(this,!0),this):Ce(this,"Month")}function je(){function e(e,t){return t.length-e.length}for(var t,n,s=[],i=[],r=[],a=0;a<12;a++)n=l([2e3,a]),t=f(this.monthsShort(n,"")),n=f(this.months(n,"")),s.push(t),i.push(n),r.push(n),r.push(t);s.sort(e),i.sort(e),r.sort(e),this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+s.join("|")+")","i")}function Ze(e,t,n,s,i,r,a){var o;return e<100&&0<=e?(o=new Date(e+400,t,n,s,i,r,a),isFinite(o.getFullYear())&&o.setFullYear(e)):o=new Date(e,t,n,s,i,r,a),o}function ze(e){var t;return e<100&&0<=e?((t=Array.prototype.slice.call(arguments))[0]=e+400,t=new Date(Date.UTC.apply(null,t)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function qe(e,t,n){n=7+t-n;return n-(7+ze(e,0,n).getUTCDay()-t)%7-1}function $e(e,t,n,s,i){var r,t=1+7*(t-1)+(7+n-s)%7+qe(e,s,i),n=t<=0?We(r=e-1)+t:t>We(e)?(r=e+1,t-We(e)):(r=e,t);return{year:r,dayOfYear:n}}function Be(e,t,n){var s,i,r=qe(e.year(),t,n),r=Math.floor((e.dayOfYear()-r-1)/7)+1;return r<1?s=r+N(i=e.year()-1,t,n):r>N(e.year(),t,n)?(s=r-N(e.year(),t,n),i=e.year()+1):(i=e.year(),s=r),{week:s,year:i}}function N(e,t,n){var s=qe(e,t,n),t=qe(e+1,t,n);return(We(e)-s+t)/7}s("w",["ww",2],"wo","week"),s("W",["WW",2],"Wo","isoWeek"),h("w",n,u),h("ww",n,t),h("W",n,u),h("WW",n,t),Oe(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=M(e)});function Je(e,t){return e.slice(t,7).concat(e.slice(0,t))}s("d",0,"do","day"),s("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),s("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),s("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),s("e",0,0,"weekday"),s("E",0,0,"isoWeekday"),h("d",n),h("e",n),h("E",n),h("dd",function(e,t){return t.weekdaysMinRegex(e)}),h("ddd",function(e,t){return t.weekdaysShortRegex(e)}),h("dddd",function(e,t){return t.weekdaysRegex(e)}),Oe(["dd","ddd","dddd"],function(e,t,n,s){s=n._locale.weekdaysParse(e,s,n._strict);null!=s?t.d=s:p(n).invalidWeekday=e}),Oe(["d","e","E"],function(e,t,n,s){t[s]=M(e)});var Qe="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Xe="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Ke="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),et=i,tt=i,nt=i;function st(){function e(e,t){return t.length-e.length}for(var t,n,s,i=[],r=[],a=[],o=[],u=0;u<7;u++)s=l([2e3,1]).day(u),t=f(this.weekdaysMin(s,"")),n=f(this.weekdaysShort(s,"")),s=f(this.weekdays(s,"")),i.push(t),r.push(n),a.push(s),o.push(t),o.push(n),o.push(s);i.sort(e),r.sort(e),a.sort(e),o.sort(e),this._weekdaysRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+i.join("|")+")","i")}function it(){return this.hours()%12||12}function rt(e,t){s(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function at(e,t){return t._meridiemParse}s("H",["HH",2],0,"hour"),s("h",["hh",2],0,it),s("k",["kk",2],0,function(){return this.hours()||24}),s("hmm",0,0,function(){return""+it.apply(this)+r(this.minutes(),2)}),s("hmmss",0,0,function(){return""+it.apply(this)+r(this.minutes(),2)+r(this.seconds(),2)}),s("Hmm",0,0,function(){return""+this.hours()+r(this.minutes(),2)}),s("Hmmss",0,0,function(){return""+this.hours()+r(this.minutes(),2)+r(this.seconds(),2)}),rt("a",!0),rt("A",!1),h("a",at),h("A",at),h("H",n,d),h("h",n,u),h("k",n,u),h("HH",n,t),h("hh",n,t),h("kk",n,t),h("hmm",me),h("hmmss",_e),h("Hmm",me),h("Hmmss",_e),v(["H","HH"],O),v(["k","kk"],function(e,t,n){e=M(e);t[O]=24===e?0:e}),v(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),v(["h","hh"],function(e,t,n){t[O]=M(e),p(n).bigHour=!0}),v("hmm",function(e,t,n){var s=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s)),p(n).bigHour=!0}),v("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s,2)),t[T]=M(e.substr(i)),p(n).bigHour=!0}),v("Hmm",function(e,t,n){var s=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s))}),v("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[O]=M(e.substr(0,s)),t[b]=M(e.substr(s,2)),t[T]=M(e.substr(i))});i=Re("Hours",!0);var ot,ut={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Fe,monthsShort:Le,week:{dow:0,doy:6},weekdays:Qe,weekdaysMin:Ke,weekdaysShort:Xe,meridiemParse:/[ap]\.?m?\.?/i},W={},lt={};function dt(e){return e&&e.toLowerCase().replace("_","-")}function ht(e){for(var t,n,s,i,r=0;r<e.length;){for(t=(i=dt(e[r]).split("-")).length,n=(n=dt(e[r+1]))?n.split("-"):null;0<t;){if(s=ct(i.slice(0,t).join("-")))return s;if(n&&n.length>=t&&function(e,t){for(var n=Math.min(e.length,t.length),s=0;s<n;s+=1)if(e[s]!==t[s])return s;return n}(i,n)>=t-1)break;t--}r++}return ot}function ct(t){var e,n;if(void 0===W[t]&&"undefined"!=typeof module&&module&&module.exports&&(n=t)&&n.match("^[^/\\\\]*$"))try{e=ot._abbr,require("./locale/"+t),ft(e)}catch(e){W[t]=null}return W[t]}function ft(e,t){return e&&((t=g(t)?P(e):mt(e,t))?ot=t:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),ot._abbr}function mt(e,t){if(null===t)return delete W[e],null;var n,s=ut;if(t.abbr=e,null!=W[e])Q("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=W[e]._config;else if(null!=t.parentLocale)if(null!=W[t.parentLocale])s=W[t.parentLocale]._config;else{if(null==(n=ct(t.parentLocale)))return lt[t.parentLocale]||(lt[t.parentLocale]=[]),lt[t.parentLocale].push({name:e,config:t}),null;s=n._config}return W[e]=new K(X(s,t)),lt[e]&<[e].forEach(function(e){mt(e.name,e.config)}),ft(e),W[e]}function P(e){var t;if(!(e=e&&e._locale&&e._locale._abbr?e._locale._abbr:e))return ot;if(!y(e)){if(t=ct(e))return t;e=[e]}return ht(e)}function _t(e){var t=e._a;return t&&-2===p(e).overflow&&(t=t[Y]<0||11<t[Y]?Y:t[S]<1||t[S]>He(t[D],t[Y])?S:t[O]<0||24<t[O]||24===t[O]&&(0!==t[b]||0!==t[T]||0!==t[Te])?O:t[b]<0||59<t[b]?b:t[T]<0||59<t[T]?T:t[Te]<0||999<t[Te]?Te:-1,p(e)._overflowDayOfYear&&(t<D||S<t)&&(t=S),p(e)._overflowWeeks&&-1===t&&(t=xe),p(e)._overflowWeekday&&-1===t&&(t=Ne),p(e).overflow=t),e}var yt=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,gt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,wt=/Z|[+-]\d\d(?::?\d\d)?/,pt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],kt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Mt=/^\/?Date\((-?\d+)/i,vt=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,Dt={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Yt(e){var t,n,s,i,r,a,o=e._i,u=yt.exec(o)||gt.exec(o),o=pt.length,l=kt.length;if(u){for(p(e).iso=!0,t=0,n=o;t<n;t++)if(pt[t][1].exec(u[1])){i=pt[t][0],s=!1!==pt[t][2];break}if(null==i)e._isValid=!1;else{if(u[3]){for(t=0,n=l;t<n;t++)if(kt[t][1].exec(u[3])){r=(u[2]||" ")+kt[t][0];break}if(null==r)return void(e._isValid=!1)}if(s||null==r){if(u[4]){if(!wt.exec(u[4]))return void(e._isValid=!1);a="Z"}e._f=i+(r||"")+(a||""),xt(e)}else e._isValid=!1}}else e._isValid=!1}function St(e,t,n,s,i,r){e=[function(e){e=parseInt(e,10);{if(e<=49)return 2e3+e;if(e<=999)return 1900+e}return e}(e),Le.indexOf(t),parseInt(n,10),parseInt(s,10),parseInt(i,10)];return r&&e.push(parseInt(r,10)),e}function Ot(e){var t,n,s=vt.exec(e._i.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));s?(t=St(s[4],s[3],s[2],s[5],s[6],s[7]),function(e,t,n){if(!e||Xe.indexOf(e)===new Date(t[0],t[1],t[2]).getDay())return 1;p(n).weekdayMismatch=!0,n._isValid=!1}(s[1],t,e)&&(e._a=t,e._tzm=(t=s[8],n=s[9],s=s[10],t?Dt[t]:n?0:60*(((t=parseInt(s,10))-(n=t%100))/100)+n),e._d=ze.apply(null,e._a),e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),p(e).rfc2822=!0)):e._isValid=!1}function bt(e,t,n){return null!=e?e:null!=t?t:n}function Tt(e){var t,n,s,i,r,a,o,u,l,d,h,c=[];if(!e._d){for(s=e,i=new Date(_.now()),n=s._useUTC?[i.getUTCFullYear(),i.getUTCMonth(),i.getUTCDate()]:[i.getFullYear(),i.getMonth(),i.getDate()],e._w&&null==e._a[S]&&null==e._a[Y]&&(null!=(i=(s=e)._w).GG||null!=i.W||null!=i.E?(u=1,l=4,r=bt(i.GG,s._a[D],Be(R(),1,4).year),a=bt(i.W,1),((o=bt(i.E,1))<1||7<o)&&(d=!0)):(u=s._locale._week.dow,l=s._locale._week.doy,h=Be(R(),u,l),r=bt(i.gg,s._a[D],h.year),a=bt(i.w,h.week),null!=i.d?((o=i.d)<0||6<o)&&(d=!0):null!=i.e?(o=i.e+u,(i.e<0||6<i.e)&&(d=!0)):o=u),a<1||a>N(r,u,l)?p(s)._overflowWeeks=!0:null!=d?p(s)._overflowWeekday=!0:(h=$e(r,a,o,u,l),s._a[D]=h.year,s._dayOfYear=h.dayOfYear)),null!=e._dayOfYear&&(i=bt(e._a[D],n[D]),(e._dayOfYear>We(i)||0===e._dayOfYear)&&(p(e)._overflowDayOfYear=!0),d=ze(i,0,e._dayOfYear),e._a[Y]=d.getUTCMonth(),e._a[S]=d.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=c[t]=n[t];for(;t<7;t++)e._a[t]=c[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[O]&&0===e._a[b]&&0===e._a[T]&&0===e._a[Te]&&(e._nextDay=!0,e._a[O]=0),e._d=(e._useUTC?ze:Ze).apply(null,c),r=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[O]=24),e._w&&void 0!==e._w.d&&e._w.d!==r&&(p(e).weekdayMismatch=!0)}}function xt(e){if(e._f===_.ISO_8601)Yt(e);else if(e._f===_.RFC_2822)Ot(e);else{e._a=[],p(e).empty=!0;for(var t,n,s,i,r,a=""+e._i,o=a.length,u=0,l=ae(e._f,e._locale).match(te)||[],d=l.length,h=0;h<d;h++)n=l[h],(t=(a.match(De(n,e))||[])[0])&&(0<(s=a.substr(0,a.indexOf(t))).length&&p(e).unusedInput.push(s),a=a.slice(a.indexOf(t)+t.length),u+=t.length),ie[n]?(t?p(e).empty=!1:p(e).unusedTokens.push(n),s=n,r=e,null!=(i=t)&&c(Se,s)&&Se[s](i,r._a,r,s)):e._strict&&!t&&p(e).unusedTokens.push(n);p(e).charsLeftOver=o-u,0<a.length&&p(e).unusedInput.push(a),e._a[O]<=12&&!0===p(e).bigHour&&0<e._a[O]&&(p(e).bigHour=void 0),p(e).parsedDateParts=e._a.slice(0),p(e).meridiem=e._meridiem,e._a[O]=function(e,t,n){if(null==n)return t;return null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?((e=e.isPM(n))&&t<12&&(t+=12),t=e||12!==t?t:0):t}(e._locale,e._a[O],e._meridiem),null!==(o=p(e).era)&&(e._a[D]=e._locale.erasConvertYear(o,e._a[D])),Tt(e),_t(e)}}function Nt(e){var t,n,s,i=e._i,r=e._f;if(e._locale=e._locale||P(e._l),null===i||void 0===r&&""===i)return I({nullInput:!0});if("string"==typeof i&&(e._i=i=e._locale.preparse(i)),k(i))return new $(_t(i));if(V(i))e._d=i;else if(y(r)){var a,o,u,l,d,h,c=e,f=!1,m=c._f.length;if(0===m)p(c).invalidFormat=!0,c._d=new Date(NaN);else{for(l=0;l<m;l++)d=0,h=!1,a=q({},c),null!=c._useUTC&&(a._useUTC=c._useUTC),a._f=c._f[l],xt(a),A(a)&&(h=!0),d=(d+=p(a).charsLeftOver)+10*p(a).unusedTokens.length,p(a).score=d,f?d<u&&(u=d,o=a):(null==u||d<u||h)&&(u=d,o=a,h)&&(f=!0);E(c,o||a)}}else if(r)xt(e);else if(g(r=(i=e)._i))i._d=new Date(_.now());else V(r)?i._d=new Date(r.valueOf()):"string"==typeof r?(n=i,null!==(t=Mt.exec(n._i))?n._d=new Date(+t[1]):(Yt(n),!1===n._isValid&&(delete n._isValid,Ot(n),!1===n._isValid)&&(delete n._isValid,n._strict?n._isValid=!1:_.createFromInputFallback(n)))):y(r)?(i._a=G(r.slice(0),function(e){return parseInt(e,10)}),Tt(i)):F(r)?(t=i)._d||(s=void 0===(n=ue(t._i)).day?n.date:n.day,t._a=G([n.year,n.month,s,n.hour,n.minute,n.second,n.millisecond],function(e){return e&&parseInt(e,10)}),Tt(t)):w(r)?i._d=new Date(r):_.createFromInputFallback(i);return A(e)||(e._d=null),e}function Wt(e,t,n,s,i){var r={};return!0!==t&&!1!==t||(s=t,t=void 0),!0!==n&&!1!==n||(s=n,n=void 0),(F(e)&&L(e)||y(e)&&0===e.length)&&(e=void 0),r._isAMomentObject=!0,r._useUTC=r._isUTC=i,r._l=n,r._i=e,r._f=t,r._strict=s,(i=new $(_t(Nt(i=r))))._nextDay&&(i.add(1,"d"),i._nextDay=void 0),i}function R(e,t,n,s){return Wt(e,t,n,s,!1)}_.createFromInputFallback=e("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))}),_.ISO_8601=function(){},_.RFC_2822=function(){};me=e("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=R.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:I()}),_e=e("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=R.apply(null,arguments);return this.isValid()&&e.isValid()?this<e?this:e:I()});function Pt(e,t){var n,s;if(!(t=1===t.length&&y(t[0])?t[0]:t).length)return R();for(n=t[0],s=1;s<t.length;++s)t[s].isValid()&&!t[s][e](n)||(n=t[s]);return n}var Rt=["year","quarter","month","week","day","hour","minute","second","millisecond"];function Ct(e){var e=ue(e),t=e.year||0,n=e.quarter||0,s=e.month||0,i=e.week||e.isoWeek||0,r=e.day||0,a=e.hour||0,o=e.minute||0,u=e.second||0,l=e.millisecond||0;this._isValid=function(e){var t,n,s=!1,i=Rt.length;for(t in e)if(c(e,t)&&(-1===x.call(Rt,t)||null!=e[t]&&isNaN(e[t])))return!1;for(n=0;n<i;++n)if(e[Rt[n]]){if(s)return!1;parseFloat(e[Rt[n]])!==M(e[Rt[n]])&&(s=!0)}return!0}(e),this._milliseconds=+l+1e3*u+6e4*o+1e3*a*60*60,this._days=+r+7*i,this._months=+s+3*n+12*t,this._data={},this._locale=P(),this._bubble()}function Ut(e){return e instanceof Ct}function Ht(e){return e<0?-1*Math.round(-1*e):Math.round(e)}function Ft(e,n){s(e,0,0,function(){var e=this.utcOffset(),t="+";return e<0&&(e=-e,t="-"),t+r(~~(e/60),2)+n+r(~~e%60,2)})}Ft("Z",":"),Ft("ZZ",""),h("Z",ve),h("ZZ",ve),v(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=Vt(ve,e)});var Lt=/([\+\-]|\d\d)/gi;function Vt(e,t){var t=(t||"").match(e);return null===t?null:0===(t=60*(e=((t[t.length-1]||[])+"").match(Lt)||["-",0,0])[1]+M(e[2]))?0:"+"===e[0]?t:-t}function Gt(e,t){var n;return t._isUTC?(t=t.clone(),n=(k(e)||V(e)?e:R(e)).valueOf()-t.valueOf(),t._d.setTime(t._d.valueOf()+n),_.updateOffset(t,!1),t):R(e).local()}function Et(e){return-Math.round(e._d.getTimezoneOffset())}function At(){return!!this.isValid()&&this._isUTC&&0===this._offset}_.updateOffset=function(){};var It=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,jt=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function C(e,t){var n,s=e;return Ut(e)?s={ms:e._milliseconds,d:e._days,M:e._months}:w(e)||!isNaN(+e)?(s={},t?s[t]=+e:s.milliseconds=+e):(t=It.exec(e))?(n="-"===t[1]?-1:1,s={y:0,d:M(t[S])*n,h:M(t[O])*n,m:M(t[b])*n,s:M(t[T])*n,ms:M(Ht(1e3*t[Te]))*n}):(t=jt.exec(e))?(n="-"===t[1]?-1:1,s={y:Zt(t[2],n),M:Zt(t[3],n),w:Zt(t[4],n),d:Zt(t[5],n),h:Zt(t[6],n),m:Zt(t[7],n),s:Zt(t[8],n)}):null==s?s={}:"object"==typeof s&&("from"in s||"to"in s)&&(t=function(e,t){var n;if(!e.isValid()||!t.isValid())return{milliseconds:0,months:0};t=Gt(t,e),e.isBefore(t)?n=zt(e,t):((n=zt(t,e)).milliseconds=-n.milliseconds,n.months=-n.months);return n}(R(s.from),R(s.to)),(s={}).ms=t.milliseconds,s.M=t.months),n=new Ct(s),Ut(e)&&c(e,"_locale")&&(n._locale=e._locale),Ut(e)&&c(e,"_isValid")&&(n._isValid=e._isValid),n}function Zt(e,t){e=e&&parseFloat(e.replace(",","."));return(isNaN(e)?0:e)*t}function zt(e,t){var n={};return n.months=t.month()-e.month()+12*(t.year()-e.year()),e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,"M"),n}function qt(s,i){return function(e,t){var n;return null===t||isNaN(+t)||(Q(i,"moment()."+i+"(period, number) is deprecated. Please use moment()."+i+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),n=e,e=t,t=n),$t(this,C(e,t),s),this}}function $t(e,t,n,s){var i=t._milliseconds,r=Ht(t._days),t=Ht(t._months);e.isValid()&&(s=null==s||s,t&&Ae(e,Ce(e,"Month")+t*n),r&&Ue(e,"Date",Ce(e,"Date")+r*n),i&&e._d.setTime(e._d.valueOf()+i*n),s)&&_.updateOffset(e,r||t)}C.fn=Ct.prototype,C.invalid=function(){return C(NaN)};Fe=qt(1,"add"),Qe=qt(-1,"subtract");function Bt(e){return"string"==typeof e||e instanceof String}function Jt(e){return k(e)||V(e)||Bt(e)||w(e)||function(t){var e=y(t),n=!1;e&&(n=0===t.filter(function(e){return!w(e)&&Bt(t)}).length);return e&&n}(e)||function(e){var t,n,s=F(e)&&!L(e),i=!1,r=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],a=r.length;for(t=0;t<a;t+=1)n=r[t],i=i||c(e,n);return s&&i}(e)||null==e}function Qt(e,t){var n,s;return e.date()<t.date()?-Qt(t,e):-((n=12*(t.year()-e.year())+(t.month()-e.month()))+(t-(s=e.clone().add(n,"months"))<0?(t-s)/(s-e.clone().add(n-1,"months")):(t-s)/(e.clone().add(1+n,"months")-s)))||0}function Xt(e){return void 0===e?this._locale._abbr:(null!=(e=P(e))&&(this._locale=e),this)}_.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",_.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";Ke=e("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});function Kt(){return this._locale}var en=126227808e5;function tn(e,t){return(e%t+t)%t}function nn(e,t,n){return e<100&&0<=e?new Date(e+400,t,n)-en:new Date(e,t,n).valueOf()}function sn(e,t,n){return e<100&&0<=e?Date.UTC(e+400,t,n)-en:Date.UTC(e,t,n)}function rn(e,t){return t.erasAbbrRegex(e)}function an(){for(var e,t,n,s=[],i=[],r=[],a=[],o=this.eras(),u=0,l=o.length;u<l;++u)e=f(o[u].name),t=f(o[u].abbr),n=f(o[u].narrow),i.push(e),s.push(t),r.push(n),a.push(e),a.push(t),a.push(n);this._erasRegex=new RegExp("^("+a.join("|")+")","i"),this._erasNameRegex=new RegExp("^("+i.join("|")+")","i"),this._erasAbbrRegex=new RegExp("^("+s.join("|")+")","i"),this._erasNarrowRegex=new RegExp("^("+r.join("|")+")","i")}function on(e,t){s(0,[e,e.length],0,t)}function un(e,t,n,s,i){var r;return null==e?Be(this,s,i).year:(r=N(e,s,i),function(e,t,n,s,i){e=$e(e,t,n,s,i),t=ze(e.year,0,e.dayOfYear);return this.year(t.getUTCFullYear()),this.month(t.getUTCMonth()),this.date(t.getUTCDate()),this}.call(this,e,t=r<t?r:t,n,s,i))}s("N",0,0,"eraAbbr"),s("NN",0,0,"eraAbbr"),s("NNN",0,0,"eraAbbr"),s("NNNN",0,0,"eraName"),s("NNNNN",0,0,"eraNarrow"),s("y",["y",1],"yo","eraYear"),s("y",["yy",2],0,"eraYear"),s("y",["yyy",3],0,"eraYear"),s("y",["yyyy",4],0,"eraYear"),h("N",rn),h("NN",rn),h("NNN",rn),h("NNNN",function(e,t){return t.erasNameRegex(e)}),h("NNNNN",function(e,t){return t.erasNarrowRegex(e)}),v(["N","NN","NNN","NNNN","NNNNN"],function(e,t,n,s){s=n._locale.erasParse(e,s,n._strict);s?p(n).era=s:p(n).invalidEra=e}),h("y",pe),h("yy",pe),h("yyy",pe),h("yyyy",pe),h("yo",function(e,t){return t._eraYearOrdinalRegex||pe}),v(["y","yy","yyy","yyyy"],D),v(["yo"],function(e,t,n,s){var i;n._locale._eraYearOrdinalRegex&&(i=e.match(n._locale._eraYearOrdinalRegex)),n._locale.eraYearOrdinalParse?t[D]=n._locale.eraYearOrdinalParse(e,i):t[D]=parseInt(e,10)}),s(0,["gg",2],0,function(){return this.weekYear()%100}),s(0,["GG",2],0,function(){return this.isoWeekYear()%100}),on("gggg","weekYear"),on("ggggg","weekYear"),on("GGGG","isoWeekYear"),on("GGGGG","isoWeekYear"),h("G",ke),h("g",ke),h("GG",n,t),h("gg",n,t),h("GGGG",ge,ce),h("gggg",ge,ce),h("GGGGG",we,fe),h("ggggg",we,fe),Oe(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,s){t[s.substr(0,2)]=M(e)}),Oe(["gg","GG"],function(e,t,n,s){t[s]=_.parseTwoDigitYear(e)}),s("Q",0,"Qo","quarter"),h("Q",de),v("Q",function(e,t){t[Y]=3*(M(e)-1)}),s("D",["DD",2],"Do","date"),h("D",n,u),h("DD",n,t),h("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),v(["D","DD"],S),v("Do",function(e,t){t[S]=M(e.match(n)[0])});ge=Re("Date",!0);s("DDD",["DDDD",3],"DDDo","dayOfYear"),h("DDD",ye),h("DDDD",he),v(["DDD","DDDD"],function(e,t,n){n._dayOfYear=M(e)}),s("m",["mm",2],0,"minute"),h("m",n,d),h("mm",n,t),v(["m","mm"],b);var ln,ce=Re("Minutes",!1),we=(s("s",["ss",2],0,"second"),h("s",n,d),h("ss",n,t),v(["s","ss"],T),Re("Seconds",!1));for(s("S",0,0,function(){return~~(this.millisecond()/100)}),s(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),s(0,["SSS",3],0,"millisecond"),s(0,["SSSS",4],0,function(){return 10*this.millisecond()}),s(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),s(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),s(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),s(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),s(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),h("S",ye,de),h("SS",ye,t),h("SSS",ye,he),ln="SSSS";ln.length<=9;ln+="S")h(ln,pe);function dn(e,t){t[Te]=M(1e3*("0."+e))}for(ln="S";ln.length<=9;ln+="S")v(ln,dn);fe=Re("Milliseconds",!1),s("z",0,0,"zoneAbbr"),s("zz",0,0,"zoneName");u=$.prototype;function hn(e){return e}u.add=Fe,u.calendar=function(e,t){1===arguments.length&&(arguments[0]?Jt(arguments[0])?(e=arguments[0],t=void 0):function(e){for(var t=F(e)&&!L(e),n=!1,s=["sameDay","nextDay","lastDay","nextWeek","lastWeek","sameElse"],i=0;i<s.length;i+=1)n=n||c(e,s[i]);return t&&n}(arguments[0])&&(t=arguments[0],e=void 0):t=e=void 0);var e=e||R(),n=Gt(e,this).startOf("day"),n=_.calendarFormat(this,n)||"sameElse",t=t&&(a(t[n])?t[n].call(this,e):t[n]);return this.format(t||this.localeData().calendar(n,this,R(e)))},u.clone=function(){return new $(this)},u.diff=function(e,t,n){var s,i,r;if(!this.isValid())return NaN;if(!(s=Gt(e,this)).isValid())return NaN;switch(i=6e4*(s.utcOffset()-this.utcOffset()),t=o(t)){case"year":r=Qt(this,s)/12;break;case"month":r=Qt(this,s);break;case"quarter":r=Qt(this,s)/3;break;case"second":r=(this-s)/1e3;break;case"minute":r=(this-s)/6e4;break;case"hour":r=(this-s)/36e5;break;case"day":r=(this-s-i)/864e5;break;case"week":r=(this-s-i)/6048e5;break;default:r=this-s}return n?r:m(r)},u.endOf=function(e){var t,n;if(void 0!==(e=o(e))&&"millisecond"!==e&&this.isValid()){switch(n=this._isUTC?sn:nn,e){case"year":t=n(this.year()+1,0,1)-1;break;case"quarter":t=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=n(this.year(),this.month()+1,1)-1;break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=36e5-tn(t+(this._isUTC?0:6e4*this.utcOffset()),36e5)-1;break;case"minute":t=this._d.valueOf(),t+=6e4-tn(t,6e4)-1;break;case"second":t=this._d.valueOf(),t+=1e3-tn(t,1e3)-1;break}this._d.setTime(t),_.updateOffset(this,!0)}return this},u.format=function(e){return e=e||(this.isUtc()?_.defaultFormatUtc:_.defaultFormat),e=re(this,e),this.localeData().postformat(e)},u.from=function(e,t){return this.isValid()&&(k(e)&&e.isValid()||R(e).isValid())?C({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},u.fromNow=function(e){return this.from(R(),e)},u.to=function(e,t){return this.isValid()&&(k(e)&&e.isValid()||R(e).isValid())?C({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},u.toNow=function(e){return this.to(R(),e)},u.get=function(e){return a(this[e=o(e)])?this[e]():this},u.invalidAt=function(){return p(this).overflow},u.isAfter=function(e,t){return e=k(e)?e:R(e),!(!this.isValid()||!e.isValid())&&("millisecond"===(t=o(t)||"millisecond")?this.valueOf()>e.valueOf():e.valueOf()<this.clone().startOf(t).valueOf())},u.isBefore=function(e,t){return e=k(e)?e:R(e),!(!this.isValid()||!e.isValid())&&("millisecond"===(t=o(t)||"millisecond")?this.valueOf()<e.valueOf():this.clone().endOf(t).valueOf()<e.valueOf())},u.isBetween=function(e,t,n,s){return e=k(e)?e:R(e),t=k(t)?t:R(t),!!(this.isValid()&&e.isValid()&&t.isValid())&&("("===(s=s||"()")[0]?this.isAfter(e,n):!this.isBefore(e,n))&&(")"===s[1]?this.isBefore(t,n):!this.isAfter(t,n))},u.isSame=function(e,t){var e=k(e)?e:R(e);return!(!this.isValid()||!e.isValid())&&("millisecond"===(t=o(t)||"millisecond")?this.valueOf()===e.valueOf():(e=e.valueOf(),this.clone().startOf(t).valueOf()<=e&&e<=this.clone().endOf(t).valueOf()))},u.isSameOrAfter=function(e,t){return this.isSame(e,t)||this.isAfter(e,t)},u.isSameOrBefore=function(e,t){return this.isSame(e,t)||this.isBefore(e,t)},u.isValid=function(){return A(this)},u.lang=Ke,u.locale=Xt,u.localeData=Kt,u.max=_e,u.min=me,u.parsingFlags=function(){return E({},p(this))},u.set=function(e,t){if("object"==typeof e)for(var n=function(e){var t,n=[];for(t in e)c(e,t)&&n.push({unit:t,priority:le[t]});return n.sort(function(e,t){return e.priority-t.priority}),n}(e=ue(e)),s=n.length,i=0;i<s;i++)this[n[i].unit](e[n[i].unit]);else if(a(this[e=o(e)]))return this[e](t);return this},u.startOf=function(e){var t,n;if(void 0!==(e=o(e))&&"millisecond"!==e&&this.isValid()){switch(n=this._isUTC?sn:nn,e){case"year":t=n(this.year(),0,1);break;case"quarter":t=n(this.year(),this.month()-this.month()%3,1);break;case"month":t=n(this.year(),this.month(),1);break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=n(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=tn(t+(this._isUTC?0:6e4*this.utcOffset()),36e5);break;case"minute":t=this._d.valueOf(),t-=tn(t,6e4);break;case"second":t=this._d.valueOf(),t-=tn(t,1e3);break}this._d.setTime(t),_.updateOffset(this,!0)}return this},u.subtract=Qe,u.toArray=function(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]},u.toObject=function(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}},u.toDate=function(){return new Date(this.valueOf())},u.toISOString=function(e){var t;return this.isValid()?(t=(e=!0!==e)?this.clone().utc():this).year()<0||9999<t.year()?re(t,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):a(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",re(t,"Z")):re(t,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ"):null},u.inspect=function(){var e,t,n;return this.isValid()?(t="moment",e="",this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z"),t="["+t+'("]',n=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",this.format(t+n+"-MM-DD[T]HH:mm:ss.SSS"+(e+'[")]'))):"moment.invalid(/* "+this._i+" */)"},"undefined"!=typeof Symbol&&null!=Symbol.for&&(u[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),u.toJSON=function(){return this.isValid()?this.toISOString():null},u.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},u.unix=function(){return Math.floor(this.valueOf()/1e3)},u.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},u.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},u.eraName=function(){for(var e,t=this.localeData().eras(),n=0,s=t.length;n<s;++n){if(e=this.clone().startOf("day").valueOf(),t[n].since<=e&&e<=t[n].until)return t[n].name;if(t[n].until<=e&&e<=t[n].since)return t[n].name}return""},u.eraNarrow=function(){for(var e,t=this.localeData().eras(),n=0,s=t.length;n<s;++n){if(e=this.clone().startOf("day").valueOf(),t[n].since<=e&&e<=t[n].until)return t[n].narrow;if(t[n].until<=e&&e<=t[n].since)return t[n].narrow}return""},u.eraAbbr=function(){for(var e,t=this.localeData().eras(),n=0,s=t.length;n<s;++n){if(e=this.clone().startOf("day").valueOf(),t[n].since<=e&&e<=t[n].until)return t[n].abbr;if(t[n].until<=e&&e<=t[n].since)return t[n].abbr}return""},u.eraYear=function(){for(var e,t,n=this.localeData().eras(),s=0,i=n.length;s<i;++s)if(e=n[s].since<=n[s].until?1:-1,t=this.clone().startOf("day").valueOf(),n[s].since<=t&&t<=n[s].until||n[s].until<=t&&t<=n[s].since)return(this.year()-_(n[s].since).year())*e+n[s].offset;return this.year()},u.year=Pe,u.isLeapYear=function(){return be(this.year())},u.weekYear=function(e){return un.call(this,e,this.week(),this.weekday()+this.localeData()._week.dow,this.localeData()._week.dow,this.localeData()._week.doy)},u.isoWeekYear=function(e){return un.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},u.quarter=u.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},u.month=Ie,u.daysInMonth=function(){return He(this.year(),this.month())},u.week=u.weeks=function(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")},u.isoWeek=u.isoWeeks=function(e){var t=Be(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")},u.weeksInYear=function(){var e=this.localeData()._week;return N(this.year(),e.dow,e.doy)},u.weeksInWeekYear=function(){var e=this.localeData()._week;return N(this.weekYear(),e.dow,e.doy)},u.isoWeeksInYear=function(){return N(this.year(),1,4)},u.isoWeeksInISOWeekYear=function(){return N(this.isoWeekYear(),1,4)},u.date=ge,u.day=u.days=function(e){var t,n,s;return this.isValid()?(t=Ce(this,"Day"),null!=e?(n=e,s=this.localeData(),e="string"!=typeof n?n:isNaN(n)?"number"==typeof(n=s.weekdaysParse(n))?n:null:parseInt(n,10),this.add(e-t,"d")):t):null!=e?this:NaN},u.weekday=function(e){var t;return this.isValid()?(t=(this.day()+7-this.localeData()._week.dow)%7,null==e?t:this.add(e-t,"d")):null!=e?this:NaN},u.isoWeekday=function(e){var t,n;return this.isValid()?null!=e?(t=e,n=this.localeData(),n="string"==typeof t?n.weekdaysParse(t)%7||7:isNaN(t)?null:t,this.day(this.day()%7?n:n-7)):this.day()||7:null!=e?this:NaN},u.dayOfYear=function(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")},u.hour=u.hours=i,u.minute=u.minutes=ce,u.second=u.seconds=we,u.millisecond=u.milliseconds=fe,u.utcOffset=function(e,t,n){var s,i=this._offset||0;if(!this.isValid())return null!=e?this:NaN;if(null==e)return this._isUTC?i:Et(this);if("string"==typeof e){if(null===(e=Vt(ve,e)))return this}else Math.abs(e)<16&&!n&&(e*=60);return!this._isUTC&&t&&(s=Et(this)),this._offset=e,this._isUTC=!0,null!=s&&this.add(s,"m"),i!==e&&(!t||this._changeInProgress?$t(this,C(e-i,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,_.updateOffset(this,!0),this._changeInProgress=null)),this},u.utc=function(e){return this.utcOffset(0,e)},u.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e)&&this.subtract(Et(this),"m"),this},u.parseZone=function(){var e;return null!=this._tzm?this.utcOffset(this._tzm,!1,!0):"string"==typeof this._i&&(null!=(e=Vt(Me,this._i))?this.utcOffset(e):this.utcOffset(0,!0)),this},u.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?R(e).utcOffset():0,(this.utcOffset()-e)%60==0)},u.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},u.isLocal=function(){return!!this.isValid()&&!this._isUTC},u.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},u.isUtc=At,u.isUTC=At,u.zoneAbbr=function(){return this._isUTC?"UTC":""},u.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},u.dates=e("dates accessor is deprecated. Use date instead.",ge),u.months=e("months accessor is deprecated. Use month instead",Ie),u.years=e("years accessor is deprecated. Use year instead",Pe),u.zone=e("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?(this.utcOffset(e="string"!=typeof e?-e:e,t),this):-this.utcOffset()}),u.isDSTShifted=e("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){var e,t;return g(this._isDSTShifted)&&(q(e={},this),(e=Nt(e))._a?(t=(e._isUTC?l:R)(e._a),this._isDSTShifted=this.isValid()&&0<function(e,t,n){for(var s=Math.min(e.length,t.length),i=Math.abs(e.length-t.length),r=0,a=0;a<s;a++)(n&&e[a]!==t[a]||!n&&M(e[a])!==M(t[a]))&&r++;return r+i}(e._a,t.toArray())):this._isDSTShifted=!1),this._isDSTShifted});d=K.prototype;function cn(e,t,n,s){var i=P(),s=l().set(s,t);return i[n](s,e)}function fn(e,t,n){if(w(e)&&(t=e,e=void 0),e=e||"",null!=t)return cn(e,t,n,"month");for(var s=[],i=0;i<12;i++)s[i]=cn(e,i,n,"month");return s}function mn(e,t,n,s){t=("boolean"==typeof e?w(t)&&(n=t,t=void 0):(t=e,e=!1,w(n=t)&&(n=t,t=void 0)),t||"");var i,r=P(),a=e?r._week.dow:0,o=[];if(null!=n)return cn(t,(n+a)%7,s,"day");for(i=0;i<7;i++)o[i]=cn(t,(i+a)%7,s,"day");return o}d.calendar=function(e,t,n){return a(e=this._calendar[e]||this._calendar.sameElse)?e.call(t,n):e},d.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.match(te).map(function(e){return"MMMM"===e||"MM"===e||"DD"===e||"dddd"===e?e.slice(1):e}).join(""),this._longDateFormat[e])},d.invalidDate=function(){return this._invalidDate},d.ordinal=function(e){return this._ordinal.replace("%d",e)},d.preparse=hn,d.postformat=hn,d.relativeTime=function(e,t,n,s){var i=this._relativeTime[n];return a(i)?i(e,t,n,s):i.replace(/%d/i,e)},d.pastFuture=function(e,t){return a(e=this._relativeTime[0<e?"future":"past"])?e(t):e.replace(/%s/i,t)},d.set=function(e){var t,n;for(n in e)c(e,n)&&(a(t=e[n])?this[n]=t:this["_"+n]=t);this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},d.eras=function(e,t){for(var n,s=this._eras||P("en")._eras,i=0,r=s.length;i<r;++i){switch(typeof s[i].since){case"string":n=_(s[i].since).startOf("day"),s[i].since=n.valueOf();break}switch(typeof s[i].until){case"undefined":s[i].until=1/0;break;case"string":n=_(s[i].until).startOf("day").valueOf(),s[i].until=n.valueOf();break}}return s},d.erasParse=function(e,t,n){var s,i,r,a,o,u=this.eras();for(e=e.toUpperCase(),s=0,i=u.length;s<i;++s)if(r=u[s].name.toUpperCase(),a=u[s].abbr.toUpperCase(),o=u[s].narrow.toUpperCase(),n)switch(t){case"N":case"NN":case"NNN":if(a===e)return u[s];break;case"NNNN":if(r===e)return u[s];break;case"NNNNN":if(o===e)return u[s];break}else if(0<=[r,a,o].indexOf(e))return u[s]},d.erasConvertYear=function(e,t){var n=e.since<=e.until?1:-1;return void 0===t?_(e.since).year():_(e.since).year()+(t-e.offset)*n},d.erasAbbrRegex=function(e){return c(this,"_erasAbbrRegex")||an.call(this),e?this._erasAbbrRegex:this._erasRegex},d.erasNameRegex=function(e){return c(this,"_erasNameRegex")||an.call(this),e?this._erasNameRegex:this._erasRegex},d.erasNarrowRegex=function(e){return c(this,"_erasNarrowRegex")||an.call(this),e?this._erasNarrowRegex:this._erasRegex},d.months=function(e,t){return e?(y(this._months)?this._months:this._months[(this._months.isFormat||Ve).test(t)?"format":"standalone"])[e.month()]:y(this._months)?this._months:this._months.standalone},d.monthsShort=function(e,t){return e?(y(this._monthsShort)?this._monthsShort:this._monthsShort[Ve.test(t)?"format":"standalone"])[e.month()]:y(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},d.monthsParse=function(e,t,n){var s,i;if(this._monthsParseExact)return function(e,t,n){var s,i,r,e=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],s=0;s<12;++s)r=l([2e3,s]),this._shortMonthsParse[s]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[s]=this.months(r,"").toLocaleLowerCase();return n?"MMM"===t?-1!==(i=x.call(this._shortMonthsParse,e))?i:null:-1!==(i=x.call(this._longMonthsParse,e))?i:null:"MMM"===t?-1!==(i=x.call(this._shortMonthsParse,e))||-1!==(i=x.call(this._longMonthsParse,e))?i:null:-1!==(i=x.call(this._longMonthsParse,e))||-1!==(i=x.call(this._shortMonthsParse,e))?i:null}.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(i=l([2e3,s]),n&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[s]||(i="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[s]=new RegExp(i.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[s].test(e))return s;if(n&&"MMM"===t&&this._shortMonthsParse[s].test(e))return s;if(!n&&this._monthsParse[s].test(e))return s}},d.monthsRegex=function(e){return this._monthsParseExact?(c(this,"_monthsRegex")||je.call(this),e?this._monthsStrictRegex:this._monthsRegex):(c(this,"_monthsRegex")||(this._monthsRegex=Ee),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},d.monthsShortRegex=function(e){return this._monthsParseExact?(c(this,"_monthsRegex")||je.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(c(this,"_monthsShortRegex")||(this._monthsShortRegex=Ge),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},d.week=function(e){return Be(e,this._week.dow,this._week.doy).week},d.firstDayOfYear=function(){return this._week.doy},d.firstDayOfWeek=function(){return this._week.dow},d.weekdays=function(e,t){return t=y(this._weekdays)?this._weekdays:this._weekdays[e&&!0!==e&&this._weekdays.isFormat.test(t)?"format":"standalone"],!0===e?Je(t,this._week.dow):e?t[e.day()]:t},d.weekdaysMin=function(e){return!0===e?Je(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin},d.weekdaysShort=function(e){return!0===e?Je(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort},d.weekdaysParse=function(e,t,n){var s,i;if(this._weekdaysParseExact)return function(e,t,n){var s,i,r,e=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)r=l([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(i=x.call(this._weekdaysParse,e))?i:null:"ddd"===t?-1!==(i=x.call(this._shortWeekdaysParse,e))?i:null:-1!==(i=x.call(this._minWeekdaysParse,e))?i:null:"dddd"===t?-1!==(i=x.call(this._weekdaysParse,e))||-1!==(i=x.call(this._shortWeekdaysParse,e))||-1!==(i=x.call(this._minWeekdaysParse,e))?i:null:"ddd"===t?-1!==(i=x.call(this._shortWeekdaysParse,e))||-1!==(i=x.call(this._weekdaysParse,e))||-1!==(i=x.call(this._minWeekdaysParse,e))?i:null:-1!==(i=x.call(this._minWeekdaysParse,e))||-1!==(i=x.call(this._weekdaysParse,e))||-1!==(i=x.call(this._shortWeekdaysParse,e))?i:null}.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(i=l([2e3,1]).day(s),n&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[s]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[s]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[s]||(i="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[s]=new RegExp(i.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[s].test(e))return s;if(n&&"ddd"===t&&this._shortWeekdaysParse[s].test(e))return s;if(n&&"dd"===t&&this._minWeekdaysParse[s].test(e))return s;if(!n&&this._weekdaysParse[s].test(e))return s}},d.weekdaysRegex=function(e){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||st.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(c(this,"_weekdaysRegex")||(this._weekdaysRegex=et),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},d.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||st.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(c(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=tt),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},d.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||st.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(c(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=nt),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},d.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},d.meridiem=function(e,t,n){return 11<e?n?"pm":"PM":n?"am":"AM"},ft("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===M(e%100/10)?"th":1==t?"st":2==t?"nd":3==t?"rd":"th")}}),_.lang=e("moment.lang is deprecated. Use moment.locale instead.",ft),_.langData=e("moment.langData is deprecated. Use moment.localeData instead.",P);var _n=Math.abs;function yn(e,t,n,s){t=C(t,n);return e._milliseconds+=s*t._milliseconds,e._days+=s*t._days,e._months+=s*t._months,e._bubble()}function gn(e){return e<0?Math.floor(e):Math.ceil(e)}function wn(e){return 4800*e/146097}function pn(e){return 146097*e/4800}function kn(e){return function(){return this.as(e)}}de=kn("ms"),t=kn("s"),ye=kn("m"),he=kn("h"),Fe=kn("d"),_e=kn("w"),me=kn("M"),Qe=kn("Q"),i=kn("y"),ce=de;function Mn(e){return function(){return this.isValid()?this._data[e]:NaN}}var we=Mn("milliseconds"),fe=Mn("seconds"),ge=Mn("minutes"),Pe=Mn("hours"),d=Mn("days"),vn=Mn("months"),Dn=Mn("years");var Yn=Math.round,Sn={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function On(e,t,n,s){var i=C(e).abs(),r=Yn(i.as("s")),a=Yn(i.as("m")),o=Yn(i.as("h")),u=Yn(i.as("d")),l=Yn(i.as("M")),d=Yn(i.as("w")),i=Yn(i.as("y")),r=(r<=n.ss?["s",r]:r<n.s&&["ss",r])||(a<=1?["m"]:a<n.m&&["mm",a])||(o<=1?["h"]:o<n.h&&["hh",o])||(u<=1?["d"]:u<n.d&&["dd",u]);return(r=(r=null!=n.w?r||(d<=1?["w"]:d<n.w&&["ww",d]):r)||(l<=1?["M"]:l<n.M&&["MM",l])||(i<=1?["y"]:["yy",i]))[2]=t,r[3]=0<+e,r[4]=s,function(e,t,n,s,i){return i.relativeTime(t||1,!!n,e,s)}.apply(null,r)}var bn=Math.abs;function Tn(e){return(0<e)-(e<0)||+e}function xn(){var e,t,n,s,i,r,a,o,u,l,d;return this.isValid()?(e=bn(this._milliseconds)/1e3,t=bn(this._days),n=bn(this._months),(o=this.asSeconds())?(s=m(e/60),i=m(s/60),e%=60,s%=60,r=m(n/12),n%=12,a=e?e.toFixed(3).replace(/\.?0+$/,""):"",u=Tn(this._months)!==Tn(o)?"-":"",l=Tn(this._days)!==Tn(o)?"-":"",d=Tn(this._mil
vendor: 4,914 bytes, lines 11781-11782
11781liseconds)!==Tn(o)?"-":"",(o<0?"-":"")+"P"+(r?u+r+"Y":"")+(n?u+n+"M":"")+(t?l+t+"D":"")+(i||s||e?"T":"")+(i?d+i+"H":"")+(s?d+s+"M":"")+(e?d+a+"S":"")):"P0D"):this.localeData().invalidDate()}var U=Ct.prototype;return U.isValid=function(){return this._isValid},U.abs=function(){var e=this._data;return this._milliseconds=_n(this._milliseconds),this._days=_n(this._days),this._months=_n(this._months),e.milliseconds=_n(e.milliseconds),e.seconds=_n(e.seconds),e.minutes=_n(e.minutes),e.hours=_n(e.hours),e.months=_n(e.months),e.years=_n(e.years),this},U.add=function(e,t){return yn(this,e,t,1)},U.subtract=function(e,t){return yn(this,e,t,-1)},U.as=function(e){if(!this.isValid())return NaN;var t,n,s=this._milliseconds;if("month"===(e=o(e))||"quarter"===e||"year"===e)switch(t=this._days+s/864e5,n=this._months+wn(t),e){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(t=this._days+Math.round(pn(this._months)),e){case"week":return t/7+s/6048e5;case"day":return t+s/864e5;case"hour":return 24*t+s/36e5;case"minute":return 1440*t+s/6e4;case"second":return 86400*t+s/1e3;case"millisecond":return Math.floor(864e5*t)+s;default:throw new Error("Unknown unit "+e)}},U.asMilliseconds=de,U.asSeconds=t,U.asMinutes=ye,U.asHours=he,U.asDays=Fe,U.asWeeks=_e,U.asMonths=me,U.asQuarters=Qe,U.asYears=i,U.valueOf=ce,U._bubble=function(){var e=this._milliseconds,t=this._days,n=this._months,s=this._data;return 0<=e&&0<=t&&0<=n||e<=0&&t<=0&&n<=0||(e+=864e5*gn(pn(n)+t),n=t=0),s.milliseconds=e%1e3,e=m(e/1e3),s.seconds=e%60,e=m(e/60),s.minutes=e%60,e=m(e/60),s.hours=e%24,t+=m(e/24),n+=e=m(wn(t)),t-=gn(pn(e)),e=m(n/12),n%=12,s.days=t,s.months=n,s.years=e,this},U.clone=function(){return C(this)},U.get=function(e){return e=o(e),this.isValid()?this[e+"s"]():NaN},U.milliseconds=we,U.seconds=fe,U.minutes=ge,U.hours=Pe,U.days=d,U.weeks=function(){return m(this.days()/7)},U.months=vn,U.years=Dn,U.humanize=function(e,t){var n,s;return this.isValid()?(n=!1,s=Sn,"object"==typeof e&&(t=e,e=!1),"boolean"==typeof e&&(n=e),"object"==typeof t&&(s=Object.assign({},Sn,t),null!=t.s)&&null==t.ss&&(s.ss=t.s-1),e=this.localeData(),t=On(this,!n,s,e),n&&(t=e.pastFuture(+this,t)),e.postformat(t)):this.localeData().invalidDate()},U.toISOString=xn,U.toString=xn,U.toJSON=xn,U.locale=Xt,U.localeData=Kt,U.toIsoString=e("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",xn),U.lang=Ke,s("X",0,0,"unix"),s("x",0,0,"valueOf"),h("x",ke),h("X",/[+-]?\d+(\.\d{1,3})?/),v("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e))}),v("x",function(e,t,n){n._d=new Date(M(e))}),_.version="2.30.1",H=R,_.fn=u,_.min=function(){return Pt("isBefore",[].slice.call(arguments,0))},_.max=function(){return Pt("isAfter",[].slice.call(arguments,0))},_.now=function(){return Date.now?Date.now():+new Date},_.utc=l,_.unix=function(e){return R(1e3*e)},_.months=function(e,t){return fn(e,t,"months")},_.isDate=V,_.locale=ft,_.invalid=I,_.duration=C,_.isMoment=k,_.weekdays=function(e,t,n){return mn(e,t,n,"weekdays")},_.parseZone=function(){return R.apply(null,arguments).parseZone()},_.localeData=P,_.isDuration=Ut,_.monthsShort=function(e,t){return fn(e,t,"monthsShort")},_.weekdaysMin=function(e,t,n){return mn(e,t,n,"weekdaysMin")},_.defineLocale=mt,_.updateLocale=function(e,t){var n,s;return null!=t?(s=ut,null!=W[e]&&null!=W[e].parentLocale?W[e].set(X(W[e]._config,t)):(t=X(s=null!=(n=ct(e))?n._config:s,t),null==n&&(t.abbr=e),(s=new K(t)).parentLocale=W[e],W[e]=s),ft(e)):null!=W[e]&&(null!=W[e].parentLocale?(W[e]=W[e].parentLocale,e===ft()&&ft(e)):null!=W[e]&&delete W[e]),W[e]},_.locales=function(){return ee(W)},_.weekdaysShort=function(e,t,n){return mn(e,t,n,"weekdaysShort")},_.normalizeUnits=o,_.relativeTimeRounding=function(e){return void 0===e?Yn:"function"==typeof e&&(Yn=e,!0)},_.relativeTimeThreshold=function(e,t){return void 0!==Sn[e]&&(void 0===t?Sn[e]:(Sn[e]=t,"s"===e&&(Sn.ss=t-1),!0))},_.calendarFormat=function(e,t){return(e=e.diff(t,"days",!0))<-6?"sameElse":e<-1?"lastWeek":e<0?"lastDay":e<1?"sameDay":e<2?"nextDay":e<7?"nextWeek":"sameElse"},_.prototype=u,_.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},_}); 11782!function(a,i){"use strict";"object"==typeof module&&module.exports?module.exports=i(require("moment")):"function"==typeof define&&define.amd?define(["moment"],i):i(a.moment)}(this,function(o){"use strict";void 0===o.version&&o.default&&(o=o.default);var i,s={},c={},A={},u={},m={},a=(o&&"string"==typeof o.version||y("Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/"),o.version.split(".")),r=+a[0],e=+a[1];function n(a){return 96<a?a-87:64<a?a-29:a-48}function t(a){var i=0,r=a.split("."),e=r[0],o=r[1]||"",c=1,A=0,r=1;
vendor: 9,041 bytes, line 11782
11782for(45===a.charCodeAt(0)&&(r=-(i=1));i<e.length;i++)A=60*A+n(e.charCodeAt(i));for(i=0;i<o.length;i++)c/=60,A+=n(o.charCodeAt(i))*c;return A*r}function l(a){for(var i=0;i<a.length;i++)a[i]=t(a[i])}function f(a,i){for(var r=[],e=0;e<i.length;e++)r[e]=a[i[e]];return r}function p(a){for(var a=a.split("|"),i=a[2].split(" "),r=a[3].split(""),e=a[4].split(" "),o=(l(i),l(r),l(e),e),c=r.length,A=0;A<c;A++)o[A]=Math.round((o[A-1]||0)+6e4*o[A]);return o[c-1]=1/0,{name:a[0],abbrs:f(a[1].split(" "),r),offsets:f(i,r),untils:e,population:0|a[5]}}function M(a){a&&this._set(p(a))}function b(a,i){this.name=a,this.zones=i}function h(a){var i=a.toTimeString(),r=i.match(/\([a-z ]+\)/i);"GMT"===(r=r&&r[0]?(r=r[0].match(/[A-Z]/g))?r.join(""):void 0:(r=i.match(/[A-Z]{3,5}/g))?r[0]:void 0)&&(r=void 0),this.at=+a,this.abbr=r,this.offset=a.getTimezoneOffset()}function d(a){this.zone=a,this.offsetScore=0,this.abbrScore=0}function E(){for(var a,i,r,e=(new Date).getFullYear()-2,o=new h(new Date(e,0,1)),c=o.offset,A=[o],n=1;n<48;n++)(r=new Date(e,n,1).getTimezoneOffset())!==c&&(a=function(a,i){for(var r;r=6e4*((i.at-a.at)/12e4|0);)(r=new h(new Date(a.at+r))).offset===a.offset?a=r:i=r;return a}(o,i=new h(new Date(e,n,1))),A.push(a),A.push(new h(new Date(a.at+6e4))),o=i,c=r);for(n=0;n<4;n++)A.push(new h(new Date(e+n,0,1))),A.push(new h(new Date(e+n,6,1)));return A}function g(a,i){return a.offsetScore!==i.offsetScore?a.offsetScore-i.offsetScore:a.abbrScore!==i.abbrScore?a.abbrScore-i.abbrScore:a.zone.population!==i.zone.population?i.zone.population-a.zone.population:i.zone.name.localeCompare(a.zone.name)}function P(){try{var a=Intl.DateTimeFormat().resolvedOptions().timeZone;if(a&&3<a.length){var i=u[S(a)];if(i)return i;y("Moment Timezone found "+a+" from the Intl api, but did not have that data loaded.")}}catch(a){}for(var r,e,o=E(),c=o.length,A=function(a){for(var i,r,e,o=a.length,c={},A=[],n={},t=0;t<o;t++)if(r=a[t].offset,!n.hasOwnProperty(r)){for(i in e=m[r]||{})e.hasOwnProperty(i)&&(c[i]=!0);n[r]=!0}for(t in c)c.hasOwnProperty(t)&&A.push(u[t]);return A}(o),n=[],t=0;t<A.length;t++){for(r=new d(z(A[t])),e=0;e<c;e++)r.scoreOffsetAt(o[e]);n.push(r)}return n.sort(g),0<n.length?n[0].zone.name:void 0}function S(a){return(a||"").toLowerCase().replace(/\//g,"_")}function T(a){var i,r,e,o;for("string"==typeof a&&(a=[a]),i=0;i<a.length;i++){o=S(r=(e=a[i].split("|"))[0]),s[o]=a[i],u[o]=r,A=c=t=n=void 0;var c,A,n=o,t=e[2].split(" ");for(l(t),c=0;c<t.length;c++)A=t[c],m[A]=m[A]||{},m[A][n]=!0}}function z(a,i){a=S(a);var r=s[a];return r instanceof M?r:"string"==typeof r?(r=new M(r),s[a]=r):c[a]&&i!==z&&(i=z(c[a],z))?((r=s[a]=new M)._set(i),r.name=u[a],r):null}function k(a){var i,r,e,o;for("string"==typeof a&&(a=[a]),i=0;i<a.length;i++)e=S((r=a[i].split("|"))[0]),o=S(r[1]),c[e]=o,u[e]=r[0],c[o]=e,u[o]=r[1]}function _(a){T(a.zones),k(a.links);var i,r,e,o=a.countries;if(o&&o.length)for(i=0;i<o.length;i++)r=(e=o[i].split("|"))[0].toUpperCase(),e=e[1].split(" "),A[r]=new b(r,e);L.dataVersion=a.version}function C(a){return C.didShowError||(C.didShowError=!0,y("moment.tz.zoneExists('"+a+"') has been deprecated in favor of !moment.tz.zone('"+a+"')")),!!z(a)}function B(a){var i="X"===a._f||"x"===a._f;return!(!a._a||void 0!==a._tzm||i)}function y(a){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(a)}function L(a){var i=Array.prototype.slice.call(arguments,0,-1),r=arguments[arguments.length-1],i=o.utc.apply(null,i);return!o.isMoment(a)&&B(i)&&(a=z(r))&&i.add(a.parse(i),"minutes"),i.tz(r),i}(r<2||2==r&&e<6)&&y("Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js "+o.version+". See momentjs.com"),M.prototype={_set:function(a){this.name=a.name,this.abbrs=a.abbrs,this.untils=a.untils,this.offsets=a.offsets,this.population=a.population},_index:function(a){a=function(a,i){var r,e=i.length;if(a<i[0])return 0;if(1<e&&i[e-1]===1/0&&a>=i[e-2])return e-1;if(a>=i[e-1])return-1;for(var o=0,c=e-1;1<c-o;)i[r=Math.floor((o+c)/2)]<=a?o=r:c=r;return c}(+a,this.untils);if(0<=a)return a},countries:function(){var i=this.name;return Object.keys(A).filter(function(a){return-1!==A[a].zones.indexOf(i)})},parse:function(a){for(var i,r,e,o=+a,c=this.offsets,A=this.untils,n=A.length-1,t=0;t<n;t++)if(i=c[t],r=c[t+1],e=c[t&&t-1],i<r&&L.moveAmbiguousForward?i=r:e<i&&L.moveInvalidForward&&(i=e),o<A[t]-6e4*i)return c[t];return c[n]},abbr:function(a){return this.abbrs[this._index(a)]},offset:function(a){return y("zone.offset has been deprecated in favor of zone.utcOffset"),this.offsets[this._index(a)]},utcOffset:function(a){return this.offsets[this._index(a)]}},d.prototype.scoreOffsetAt=function(a){this.offsetScore+=Math.abs(this.zone.utcOffset(a.at)-a.offset),this.zone.abbr(a.at).replace(/[^A-Z]/g,"")!==a.abbr&&this.abbrScore++},L.version="0.5.45",L.dataVersion="",L._zones=s,L._links=c,L._names=u,L._countries=A,L.add=T,L.link=k,L.load=_,L.zone=z,L.zoneExists=C,L.guess=function(a){return i=i&&!a?i:P()},L.names=function(){var a,i=[];for(a in u)u.hasOwnProperty(a)&&(s[a]||s[c[a]])&&u[a]&&i.push(u[a]);return i.sort()},L.Zone=M,L.unpack=p,L.unpackBase60=t,L.needsOffset=B,L.moveInvalidForward=!0,L.moveAmbiguousForward=!1,L.countries=function(){return Object.keys(A)},L.zonesForCountry=function(a,i){var r;return r=(r=a).toUpperCase(),(a=A[r]||null)?(r=a.zones.sort(),i?r.map(function(a){return{name:a,offset:z(a).utcOffset(new Date)}}):r):null};var D,a=o.fn;function N(a){return function(){return this._z?this._z.abbr(this):a.call(this)}}function O(a){return function(){return this._z=null,a.apply(this,arguments)}}o.tz=L,o.defaultZone=null,o.updateOffset=function(a,i){var r,e=o.defaultZone;void 0===a._z&&(e&&B(a)&&!a._isUTC&&a.isValid()&&(a._d=o.utc(a._a)._d,a.utc().add(e.parse(a),"minutes")),a._z=e),a._z&&(e=a._z.utcOffset(a),Math.abs(e)<16&&(e/=60),void 0!==a.utcOffset?(r=a._z,a.utcOffset(-e,i),a._z=r):a.zone(e,i))},a.tz=function(a,i){if(a){if("string"!=typeof a)throw new Error("Time zone name must be a string, got "+a+" ["+typeof a+"]");return this._z=z(a),this._z?o.updateOffset(this,i):y("Moment Timezone has no data for "+a+". See http://momentjs.com/timezone/docs/#/data-loading/."),this}if(this._z)return this._z.name},a.zoneName=N(a.zoneName),a.zoneAbbr=N(a.zoneAbbr),a.utc=O(a.utc),a.local=O(a.local),a.utcOffset=(D=a.utcOffset,function(){return 0<arguments.length&&(this._z=null),D.apply(this,arguments)}),o.tz.setDefault=function(a){return(r<2||2==r&&e<9)&&y("Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js "+o.version+"."),o.defaultZone=a?z(a):null,o};a=o.momentProperties;return"[object Array]"===Object.prototype.toString.call(a)?(a.push("_z"),a.push("_a")):a&&(a._z=null),_({version:"2024a",zones:["Africa/Abidjan|GMT|0|0||48e5","Africa/Nairobi|EAT|-30|0||47e5","Africa/Algiers|CET|-10|0||26e5","Africa/Lagos|WAT|-10|0||17e6","Africa/Khartoum|CAT|-20|0||51e5","Africa/Cairo|EET EEST|-20 -30|010101010101010|29NW0 1cL0 1cN0 1fz0 1a10 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0|15e6","Africa/Casablanca|+01 +00|-10 0|010101010101010101010101|208q0 e00 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600|32e5","Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1XSp0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0|11e6","Africa/Johannesburg|SAST|-20|0||84e5","Africa/Juba|EAT CAT|-30 -20|01|24nx0|","Africa/Sao_Tome|WAT GMT|-10 0|01|1XiN0|","Africa/Tripoli|EET|-20|0||11e5","America/Adak|HST HDT|a0 90|01010101010101010101010|1XKc0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0|326","America/Anchorage|AKST AKDT|90 80|01010101010101010101010|1XKb0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0|30e4","America/Santo_Domingo|AST|40|0||29e5","America/Fortaleza|-03|30|0||34e5","America/Asuncion|-03 -04|30 40|01010101010101010101010|1XPD0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0|28e5","America/Panama|EST|50|0||15e5","America/Mexico_City|CST CDT|60 50|010101010|1XVk0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|20e6","America/Managua|CST|60|0||22e5","America/Caracas|-04|40|0||29e5","America/Lima|-05|50|0||11e6","America/Denver|MST MDT|70 60|01010101010101010101010|1XK90 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0|26e5","America/Campo_Grande|-03 -04|30 40|01|1XBD0|77e4","America/Chicago|CST CDT|60 50|01010101010101010101010|1XK80 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0|92e5","America/Chihuahua|MST MDT CST|70 60 60|010101012|1XVl0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|81e4","America/Ciudad_Juarez|MST MDT CST|70 60 60|010101012010101010101010|1XK90 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1wn0 cm0 EP0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0|","America/Phoenix|MST|70|0||42e5","America/Whitehorse|PST PDT MST|80 70 70|01012|1XKa0 1zb0 Op0 1z90|23e3","America/Ne
11782w_York|EST EDT|50 40|01010101010101010101010|1XK70 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0|21e6","America/Los_Angeles|PST PDT|80 70|01010101010101010101010|1XKa0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0|15e6","America/Halifax|AST ADT|40 30|01010101010101010101010|1XK60 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0|39e4","America/Godthab|-03 -02 -01|30 20 10|0101010101212121212121|1XSp0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 2so0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0|17e3","America/Havana|CST CDT|50 40|01010101010101010101010|1XK50 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5","America/Mazatlan|MST MDT|70 60|010101010|1XVl0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|44e4","America/Metlakatla|PST AKST AKDT|80 90 80|012121212121212121212121|1Xqy0 jB0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0|14e2","America/Miquelon|-03 -02|30 20|01010101010101010101010|1XK50 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0|61e2","America/Noronha|-02|20|0||30e2","America/Ojinaga|MST MDT CST CDT|70 60 60 50|01010101232323232323232|1XK90 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1wn0 Rc0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0|23e3","America/Santiago|-03 -04|30 40|01010101010101010101010|1XVf0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|62e5","America/Sao_Paulo|-02 -03|20 30|01|1XBC0|20e6","America/Scoresbysund|-01 +00 -02|10 0 20|0101010101020202020202|1XSp0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 2pA0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0|452","America/St_Johns|NST NDT|3u 2u|01010101010101010101010|1XK5u 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0|11e4","Antarctica/Casey|+11 +08|-b0 -80|0101010101|1XME0 1kr0 12l0 1o01 14kX 1lf1 14kX 1lf1 13bX|10","Asia/Bangkok|+07|-70|0||15e6","Asia/Vladivostok|+10|-a0|0||60e4","Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1XV40 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0|40e5","Asia/Tashkent|+05|-50|0||23e5","Pacific/Auckland|NZDT NZST|-d0 -c0|01010101010101010101010|1XV20 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0|14e5","Europe/Istanbul|+03|-30|0||13e6","Antarctica/Troll|+00 +02|0 -20|01010101010101010101010|1XSp0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0|40","Antarctica/Vostok|+07 +05|-70 -50|01|2bnv0|25","Asia/Almaty|+06 +05|-60 -50|01|2bR60|15e5","Asia/Amman|EET EEST +03|-20 -30 -30|010101012|1XRy0 1o00 11A0 1qM0 WM0 1qM0 LA0 1C00|25e5","Asia/Kamchatka|+12|-c0|0||18e4","Asia/Dubai|+04|-40|0||39e5","Asia/Beirut|EET EEST|-20 -30|01010101010101010101010|1XSm0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0|22e5","Asia/Dhaka|+06|-60|0||16e6","Asia/Kuala_Lumpur|+08|-80|0||71e5","Asia/Kolkata|IST|-5u|0||15e6","Asia/Chita|+09|-90|0||33e4","Asia/Shanghai|CST|-80|0||23e6","Asia/Colombo|+0530|-5u|0||22e5","Asia/Damascus|EET EEST +03|-20 -30 -30|010101012|1XRy0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0|26e5","Europe/Athens|EET EEST|-20 -30|01010101010101010101010|1XSp0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0|35e5","Asia/Gaza|EET EEST|-20 -30|01010101010101010101010|1XRy0 1on0 11B0 1o00 11A0 1qo0 XA0 1qp0 1cN0 1cL0 1a10 1fz0 17d0 1in0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0|18e5","Asia/Hong_Kong|HKT|-80|0||73e5","Asia/Jakarta|WIB|-70|0||31e6","Asia/Jayapura|WIT|-90|0||26e4","Asia/Jerusalem|IST IDT|-20 -30|01010101010101010101010|1XRA0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0|81e4","Asia/Kabul|+0430|-4u|0||46e5","Asia/Karachi|PKT|-50|0||24e6","Asia/Kathmandu|+0545|-5J|0||12e5","Asia/Sakhalin|+11|-b0|0||58e4","Asia/Makassar|WITA|-80|0||15e5","Asia/Manila|PST|-80|0||24e6","Asia/Seoul|KST|-90|0||23e6","Asia/Rangoon|+0630|-6u|0||48e5","Asia/Tehran|+0330 +0430|-3u -4u|010101010|1XOIu 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0|14e6","Asia/Tokyo|JST|-90|0||38e6","Atlantic/Azores|-01 +00|10 0|01010101010101010101010|1XSp0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0|25e4","Europe/Lisbon|WET WEST|0 -10|01010101010101010101010|1XSp0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0|27e5","Atlantic/Cape_Verde|-01|10|0||50e4","Australia/Adelaide|ACDT ACST|-au -9u|01010101010101010101010|1XV4u 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0|11e5","Australia/Brisbane|AEST|-a0|0||20e5","Australia/Darwin|ACST|-9u|0||12e4","Australia/Eucla|+0845|-8J|0||368","Australia/Lord_Howe|+11 +1030|-b0 -au|01010101010101010101010|1XV30 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu
117821cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu|347","Australia/Perth|AWST|-80|0||18e5","Pacific/Easter|-05 -06|50 60|01010101010101010101010|1XVf0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|30e2","Europe/Dublin|GMT IST|0 -10|01010101010101010101010|1XSp0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0|12e5","Etc/GMT-1|+01|-10|0||","Pacific/Tongatapu|+13|-d0|0||75e3","Pacific/Kiritimati|+14|-e0|0||51e2","Etc/GMT-2|+02|-20|0||","Pacific/Tahiti|-10|a0|0||18e4","Pacific/Niue|-11|b0|0||12e2","Etc/GMT+12|-12|c0|0||","Pacific/Galapagos|-06|60|0||25e3","Etc/GMT+7|-07|70|0||","Pacific/Pitcairn|-08|80|0||56","Pacific/Gambier|-09|90|0||125","Etc/UTC|UTC|0|0||","Europe/London|GMT BST|0 -10|01010101010101010101010|1XSp0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0|10e6","Europe/Chisinau|EET EEST|-20 -30|01010101010101010101010|1XSo0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0|67e4","Europe/Moscow|MSK|-30|0||16e6","Europe/Volgograd|+04 MSK|-40 -30|01|249a0|10e5","Pacific/Honolulu|HST|a0|0||37e4","MET|MET MEST|-10 -20|01010101010101010101010|1XSp0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0|","Pacific/Chatham|+1345 +1245|-dJ -cJ|01010101010101010101010|1XV20 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0|600","Pacific/Apia|+14 +13|-e0 -d0|010101|1XV20 1a00 1fA0 1a00 1fA0|37e3","Pacific/Fiji|+13 +12|-d0 -c0|010101|1Xnq0 20o0 pc0 2hc0 bc0|88e4","Pacific/Guam|ChST|-a0|0||17e4","Pacific/Marquesas|-0930|9u|0||86e2","Pacific/Pago_Pago|SST|b0|0||37e2","Pacific/Norfolk|+11 +12|-b0 -c0|0101010101010101010101|219P0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0|25e4"],links:["Africa/Abidjan|Africa/Accra","Africa/Abidjan|Africa/Bamako","Africa/Abidjan|Africa/Banjul","Africa/Abidjan|Africa/Bissau","Africa/Abidjan|Africa/Conakry","Africa/Abidjan|Africa/Dakar","Africa/Abidjan|Africa/Freetown","Africa/Abidjan|Africa/Lome","Africa/Abidjan|Africa/Monrovia","Africa/Abidjan|Africa/Nouakchott","Africa/Abidjan|Africa/Ouagadougou","Africa/Abidjan|Africa/Timbuktu","Africa/Abidjan|America/Danmarkshavn","Africa/Abidjan|Atlantic/Reykjavik","Africa/Abidjan|Atlantic/St_Helena","Africa/Abidjan|Etc/GMT","Africa/Abidjan|Etc/GMT+0","Africa/Abidjan|Etc/GMT-0","Africa/Abidjan|Etc/GMT0","Africa/Abidjan|Etc/Greenwich","Africa/Abidjan|GMT","Africa/Abidjan|GMT+0","Africa/Abidjan|GMT-0","Africa/Abidjan|GMT0","Africa/Abidjan|Greenwich","Africa/Abidjan|Iceland","Africa/Algiers|Africa/Tunis","Africa/Cairo|Egypt","Africa/Casablanca|Africa/El_Aaiun","Africa/Johannesburg|Africa/Maseru","Africa/Johannesburg|Africa/Mbabane","Africa/Khartoum|Africa/Blantyre","Africa/Khartoum|Africa/Bujumbura","Africa/Khartoum|Africa/Gaborone","Africa/Khartoum|Africa/Harare","Africa/Khartoum|Africa/Kigali","Africa/Khartoum|Africa/Lubumbashi","Africa/Khartoum|Africa/Lusaka","Africa/Khartoum|Africa/Maputo","Africa/Khartoum|Africa/Windhoek","Africa/Lagos|Africa/Bangui","Africa/Lagos|Africa/Brazzaville","Africa/Lagos|Africa/Douala","Africa/Lagos|Africa/Kinshasa","Africa/Lagos|Africa/Libreville","Africa/Lagos|Africa/Luanda","Africa/Lagos|Africa/Malabo","Africa/Lagos|Africa/Ndjamena","Africa/Lagos|Africa/Niamey","Africa/Lagos|Africa/Porto-Novo","Africa/Nairobi|Africa/Addis_Ababa","Africa/Nairobi|Africa/Asmara","Africa/Nairobi|Africa/Asmera","Africa/Nairobi|Africa/Dar_es_Salaam","Africa/Nairobi|Africa/Djibouti","Africa/Nairobi|Africa/Kampala","Africa/Nairobi|Africa/Mogadishu","Africa/Nairobi|Indian/Antananarivo","Africa/Nairobi|Indian/Comoro","Africa/Nairobi|Indian/Mayotte","Africa/Tripoli|Europe/Kaliningrad","Africa/Tripoli|Libya","America/Adak|America/Atka","America/Adak|US/Aleutian","America/Anchorage|America/Juneau","America/Anchorage|America/Nome","America/Anchorage|America/Sitka","America/Anchorage|America/Yakutat","America/Anchorage|US/Alaska","America/Campo_Grande|America/Cuiaba","America/Caracas|America/Boa_Vista","America/Caracas|America/Guyana","America/Caracas|America/La_Paz","America/Caracas|America/Manaus","America/Caracas|America/Porto_Velho","America/Caracas|Brazil/West","America/Caracas|Etc/GMT+4","America/Chicago|America/Indiana/Knox","America/Chicago|America/Indiana/Tell_City","America/Chicago|America/Knox_IN","America/Chicago|America/Matamoros","America/Chicago|America/Menominee","America/Chicago|America/North_Dakota/Beulah","America/Chicago|America/North_Dakota/Center","America/Chicago|America/North_Dakota/New_Salem","America/Chicago|America/Rainy_River","America/Chicago|America/Rankin_Inlet","America/Chicago|America/Resolute","America/Chicago|America/Winnipeg","America/Chicago|CST6CDT","America/Chicago|Canada
11782/Central","America/Chicago|US/Central","America/Chicago|US/Indiana-Starke","America/Denver|America/Boise","America/Denver|America/Cambridge_Bay","America/Denver|America/Edmonton","America/Denver|America/Inuvik","America/Denver|America/Shiprock","America/Denver|America/Yellowknife","America/Denver|Canada/Mountain","America/Denver|MST7MDT","America/Denver|Navajo","America/Denver|US/Mountain","America/Fortaleza|America/Araguaina","America/Fortaleza|America/Argentina/Buenos_Aires","America/Fortaleza|America/Argentina/Catamarca","America/Fortaleza|America/Argentina/ComodRivadavia","America/Fortaleza|America/Argentina/Cordoba","America/Fortaleza|America/Argentina/Jujuy","America/Fortaleza|America/Argentina/La_Rioja","America/Fortaleza|America/Argentina/Mendoza","America/Fortaleza|America/Argentina/Rio_Gallegos","America/Fortaleza|America/Argentina/Salta","America/Fortaleza|America/Argentina/San_Juan","America/Fortaleza|America/Argentina/San_Luis","America/Fortaleza|America/Argentina/Tucuman","America/Fortaleza|America/Argentina/Ushuaia","America/Fortaleza|America/Bahia","America/Fortaleza|America/Belem","America/Fortaleza|America/Buenos_Aires","America/Fortaleza|America/Catamarca","America/Fortaleza|America/Cayenne","America/Fortaleza|America/Cordoba","America/Fortaleza|America/Jujuy","America/Fortaleza|America/Maceio","America/Fortaleza|America/Mendoza","America/Fortaleza|America/Montevideo","America/Fortaleza|America/Paramaribo","America/Fortaleza|America/Punta_Arenas","America/Fortaleza|America/Recife","America/Fortaleza|America/Rosario","America/Fortaleza|America/Santarem","America/Fortaleza|Antarctica/Palmer","America/Fortaleza|Antarctica/Rothera","America/Fortaleza|Atlantic/Stanley","America/Fortaleza|Etc/GMT+3","America/Godthab|America/Nuuk","America/Halifax|America/Glace_Bay","America/Halifax|America/Goose_Bay","America/Halifax|America/Moncton","America/Halifax|America/Thule","America/Halifax|Atlantic/Bermuda","America/Halifax|Canada/Atlantic","America/Havana|Cuba","America/Lima|America/Bogota","America/Lima|America/Eirunepe","America/Lima|America/Guayaquil","America/Lima|America/Porto_Acre","America/Lima|America/Rio_Branco","America/Lima|Brazil/Acre","America/Lima|Etc/GMT+5","America/Los_Angeles|America/Ensenada","America/Los_Angeles|America/Santa_Isabel","America/Los_Angeles|America/Tijuana","America/Los_Angeles|America/Vancouver","America/Los_Angeles|Canada/Pacific","America/Los_Angeles|Mexico/BajaNorte","America/Los_Angeles|PST8PDT","America/Los_Angeles|US/Pacific","America/Managua|America/Belize","America/Managua|America/Costa_Rica","America/Managua|America/El_Salvador","America/Managua|America/Guatemala","America/Managua|America/Regina","America/Managua|America/Swift_Current","America/Managua|America/Tegucigalpa","America/Managua|Canada/Saskatchewan","America/Mazatlan|Mexico/BajaSur","America/Mexico_City|America/Bahia_Banderas","America/Mexico_City|America/Merida","America/Mexico_City|America/Monterrey","America/Mexico_City|Mexico/General","America/New_York|America/Detroit","America/New_York|America/Fort_Wayne","America/New_York|America/Grand_Turk","America/New_York|America/Indiana/Indianapolis","America/New_York|America/Indiana/Marengo","America/New_York|America/Indiana/Petersburg","America/New_York|America/Indiana/Vevay","America/New_York|America/Indiana/Vincennes","America/New_York|America/Indiana/Winamac","America/New_York|America/Indianapolis","America/New_York|America/Iqaluit","America/New_York|America/Kentucky/Louisville","America/New_York|America/Kentucky/Monticello","America/New_York|America/Louisville","America/New_York|America/Montreal","America/New_York|America/Nassau","America/New_York|America/Nipigon","America/New_York|America/Pangnirtung","America/New_York|America/Port-au-Prince","America/New_York|America/Thunder_Bay","America/New_York|America/Toronto","America/New_York|Canada/Eastern","America/New_York|EST5EDT","America/New_York|US/East-Indiana","America/New_York|US/Eastern","America/New_York|US/Michigan","America/Noronha|Atlantic/South_Georgia","America/Noronha|Brazil/DeNoronha","America/Noronha|Etc/GMT+2","America/Panama|America/Atikokan","America/Panama|America/Cancun","America/Panama|America/Cayman","America/Panama|America/Coral_Harbour","America/Panama|America/Jamaica","America/Panama|EST","America/Panama|Jamaica","America/Phoenix|America/Creston","America/Phoenix|America/Dawson_Creek","America/Phoenix|America/Fort_Nelson","America/Phoenix|America/Hermosillo","America/Phoenix|MST","America/Phoenix|
11782US/Arizona","America/Santiago|Chile/Continental","America/Santo_Domingo|America/Anguilla","America/Santo_Domingo|America/Antigua","America/Santo_Domingo|America/Aruba","America/Santo_Domingo|America/Barbados","America/Santo_Domingo|America/Blanc-Sablon","America/Santo_Domingo|America/Curacao","America/Santo_Domingo|America/Dominica","America/Santo_Domingo|America/Grenada","America/Santo_Domingo|America/Guadeloupe","America/Santo_Domingo|America/Kralendijk","America/Santo_Domingo|America/Lower_Princes","America/Santo_Domingo|America/Marigot","America/Santo_Domingo|America/Martinique","America/Santo_Domingo|America/Montserrat","America/Santo_Domingo|America/Port_of_Spain","America/Santo_Domingo|America/Puerto_Rico","America/Santo_Domingo|America/St_Barthelemy","America/Santo_Domingo|America/St_Kitts","America/Santo_Domingo|America/St_Lucia","America/Santo_Domingo|America/St_Thomas","America/Santo_Domingo|America/St_Vincent","America/Santo_Domingo|America/Tortola","America/Santo_Domingo|America/Virgin","America/Sao_Paulo|Brazil/East","America/St_Johns|Canada
11782/Newfoundland","America/Whitehorse|America/Dawson","America/Whitehorse|Canada/Yukon","Asia/Almaty|Asia/Qostanay","Asia/Bangkok|Antarctica/Davis","Asia/Bangkok|Asia/Barnaul","Asia/Bangkok|Asia/Ho_Chi_Minh","Asia/Bangkok|Asia/Hovd","Asia/Bangkok|Asia/Krasnoyarsk","Asia/Bangkok|Asia/Novokuznetsk","Asia/Bangkok|Asia/Novosibirsk","Asia/Bangkok|Asia/Phnom_Penh","Asia/Bangkok|Asia/Saigon","Asia/Bangkok|Asia/Tomsk","Asia/Bangkok|Asia/Vientiane","Asia/Bangkok|Etc/GMT-7","Asia/Bangkok|Indian/Christmas","Asia/Chita|Asia/Dili","Asia/Chita|Asia/Khandyga","Asia/Chita|Asia/Yakutsk","Asia/Chita|Etc/GMT-9","Asia/Chita|Pacific/Palau","Asia/Dhaka|Asia/Bishkek","Asia/Dhaka|Asia/Dacca","Asia/Dhaka|Asia/Kashgar","Asia/Dhaka|Asia/Omsk","Asia/Dhaka|Asia/Thimbu","Asia/Dhaka|Asia/Thimphu","Asia/Dhaka|Asia/Urumqi","Asia/Dhaka|Etc/GMT-6","Asia/Dhaka|Indian/Chagos","Asia/Dubai|Asia/Baku","Asia/Dubai|Asia/Muscat","Asia/Dubai|Asia/Tbilisi","Asia/Dubai|Asia/Yerevan","Asia/Dubai|Etc/GMT-4","Asia/Dubai|Europe/Astrakhan","Asia/Dubai|Europe/Samara","Asia/Dubai|Europe/Saratov","Asia/Dubai|Europe/Ulyanovsk","Asia/Dubai|Indian/Mahe","Asia/Dubai|Indian/Mauritius","Asia/Dubai|Indian/Reunion","Asia/Gaza|Asia/Hebron","Asia/Hong_Kong|Hongkong","Asia/Jakarta|Asia/Pontianak","Asia/Jerusalem|Asia/Tel_Aviv","Asia/Jerusalem|Israel","Asia/Kamchatka|Asia/Anadyr","Asia/Kamchatka|Etc/GMT-12","Asia/Kamchatka|Kwajalein","Asia/Kamchatka|Pacific/Funafuti","Asia/Kamchatka|Pacific/Kwajalein","Asia/Kamchatka|Pacific/Majuro","Asia/Kamchatka|Pacific/Nauru","Asia/Kamchatka|Pacific/Tarawa","Asia/Kamchatka|Pacific/Wake","Asia/Kamchatka|Pacific/Wallis","Asia/Kathmandu|Asia/Katmandu","Asia/Kolkata|Asia/Calcutta","Asia/Kuala_Lumpur|Asia/Brunei","Asia/Kuala_Lumpur|Asia/Choibalsan","Asia/Kuala_Lumpur|Asia/Irkutsk","Asia/Kuala_Lumpur|Asia/Kuching","Asia/Kuala_Lumpur|Asia/Singapore","Asia/Kuala_Lumpur|Asia/Ulaanbaatar","Asia/Kuala_Lumpur|Asia/Ulan_Bator","Asia/Kuala_Lumpur|Etc/GMT-8","Asia/Kuala_Lumpur|Singapore","Asia/Makassar|Asia/Ujung_Pandang","Asia/Rangoon|Asia/Yangon","Asia/Rangoon|Indian/Cocos","Asia/Sakhalin|Asia/Magadan","Asia/Sakhalin|Asia/Srednekolymsk","Asia/Sakhalin|Etc/GMT-11","Asia/Sakhalin|Pacific/Bougainville","Asia/Sakhalin|Pacific/Efate","Asia/Sakhalin|Pacific/Guadalcanal","Asia/Sakhalin|Pacific/Kosrae","Asia/Sakhalin|Pacific/Noumea","Asia/Sakhalin|Pacific/Pohnpei","Asia/Sakhalin|Pacific/Ponape","Asia/Seoul|Asia/Pyongyang","Asia/Seoul|ROK","Asia/Shanghai|Asia/Chongqing","Asia/Shanghai|Asia/Chungking","Asia/Shanghai|Asia/Harbin","Asia/Shanghai|Asia/Macao","Asia/Shanghai|Asia/Macau","Asia/Shanghai|Asia/Taipei","Asia/Shanghai|PRC","Asia/Shanghai|ROC","Asia/Tashkent|Antarctica/Mawson","Asia/Tashkent|Asia/Aqtau","Asia/Tashkent|Asia/Aqtobe","Asia/Tashkent|Asia/Ashgabat","Asia/Tashkent|Asia/Ashkhabad","Asia/Tashkent|Asia/Atyrau","Asia/Tashkent|Asia/Dushanbe","Asia/Tashkent|Asia/Oral","Asia/Tashkent|Asia/Qyzylorda","Asia/Tashkent|Asia/Samarkand","Asia/Tashkent|Asia/Yekaterinburg","Asia/Tashkent|Etc/GMT-5","Asia/Tashkent|Indian/Kerguelen","Asia/Tashkent|Indian/Maldives","Asia/Tehran|Iran","Asia/Tokyo|Japan","Asia/Vladivostok|Antarctica/DumontDUrville","Asia/Vladivostok|Asia/Ust-Nera","Asia/Vladivostok|Etc/GMT-10","Asia/Vladivostok|Pacific/Chuuk","Asia/Vladivostok|Pacific/Port_Moresby","Asia/Vladivostok|Pacific/Truk","Asia/Vladivostok|Pacific/Yap","Atlantic/Cape_Verde|Etc/GMT+1","Australia/Adelaide|Australia/Broken_Hill","Australia/Adelaide|Australia/South","Australia/Adelaide|Australia/Yancowinna","Australia/Brisbane|Australia/Lindeman","Australia/Brisbane|Australia/Queensland","Australia/Darwin|Australia/North","Australia/Lord_Howe|Australia/LHI","Australia/Perth|Australia/West","Australia/Sydney|Antarctica/Macquarie","Australia/Sydney|Australia/ACT","Australia/Sydney|Australia/Canberra","Australia/Sydney|Australia/Currie","Australia/Sydney|Australia/Hobart","Australia/Sydney|Australia/Melbourne","Australia/Sydney|Australia/NSW","Australia/Sydney|Australia/Tasmania","Australia/Sydney|Australia/Victoria","Etc/UTC|Etc/UCT","Etc/UTC|Etc/Universal","Etc/UTC|Etc/Zulu","Etc/UTC|UCT","Etc/UTC|UTC","Etc/UTC|Universal","Etc
11782/UTC|Zulu","Europe/Athens|Asia/Famagusta","Europe/Athens|Asia/Nicosia","Europe/Athens|EET","Europe/Athens|Europe/Bucharest","Europe/Athens|Europe/Helsinki","Europe/Athens|Europe/Kiev","Europe/Athens|Europe/Kyiv","Europe/Athens|Europe/Mariehamn","Europe/Athens|Europe/Nicosia","Europe/Athens|Europe/Riga","Europe/Athens|Europe/Sofia","Europe/Athens|Europe/Tallinn","Europe/Athens|Europe/Uzhgorod","Europe/Athens|Europe/Vilnius","Europe/Athens|Europe/Zaporozhye","Europe/Chisinau|Europe/Tiraspol","Europe/Dublin|Eire","Europe/Istanbul|Antarctica/Syowa","Europe/Istanbul|Asia/Aden","Europe/Istanbul|Asia/Baghdad","Europe/Istanbul|Asia/Bahrain","Europe/Istanbul|Asia/Istanbul","Europe/Istanbul|Asia/Kuwait","Europe/Istanbul|Asia/Qatar","Europe/Istanbul|Asia/Riyadh","Europe/Istanbul|Etc/GMT-3","Europe/Istanbul|Europe/Minsk","Europe/Istanbul|Turkey","Europe/Lisbon|Atlantic/Canary","Europe/Lisbon|Atlantic/Faeroe","Europe/Lisbon|Atlantic/Faroe","Europe/Lisbon|Atlantic/Madeira","Europe/Lisbon|Portugal","Europe/Lisbon|WET","Europe/London|Europe/Belfast","Europe/London|Europe/Guernsey","Europe/London|Europe/Isle_of_Man","Europe/London|Europe/Jersey","Europe/London|GB","Europe/London|GB-Eire","Europe/Moscow|Europe/Kirov","Europe/Moscow|Europe/Simferopol","Europe/Moscow|W-SU","Europe/Paris|Africa/Ceuta","Europe/Paris|Arctic/Longyearbyen","Europe/Paris|Atlantic/Jan_Mayen","Europe/Paris|CET","Europe/Paris|Europe/Amsterdam","Europe/Paris|Europe/Andorra","Europe/Paris|Europe/Belgrade","Europe/Paris|Europe/Berlin","Europe/Paris|Europe/Bratislava","Europe/Paris|Europe/Brussels","Europe/Paris|Europe/Budapest","Europe/Paris|Europe/Busingen","Europe/Paris|Europe/Copenhagen","Europe/Paris|Europe/Gibraltar","Europe/Paris|Europe/Ljubljana","Europe/Paris|Europe/Luxembourg","Europe/Paris|Europe/Madrid","Europe/Paris|Europe/Malta","Europe/Paris|Europe/Monaco","Europe/Paris|Europe/Oslo","Europe/Paris|Europe/Podgorica","Europe/Paris|Europe/Prague","Europe/Paris|Europe/Rome","Europe/Paris|Europe/San_Marino","Europe/Paris|Europe/Sarajevo","Europe/Paris|Europe/Skopje","Europe/Paris|Europe/Stockholm","Europe/Paris|Europe/Tirane","Europe/Paris|Europe/Vaduz","Europe/Paris|Europe/Vatican","Europe/Paris|Europe/Vienna","Europe/Paris|Europe/Warsaw","Europe/Paris|Europe/Zagreb","Europe/Paris|Europe/Zurich","Europe/Paris|Poland","Pacific/Auckland|Antarctica/McMurdo","Pacific/Auckland|Antarctica/South_Pole","Pacific/Auckland|NZ","Pacific/Chatham|NZ-CHAT","Pacific/Easter|Chile/EasterIsland","Pacific/Galapagos|Etc/GMT+6","Pacific/Gambier|Etc/GMT+9","Pacific/Guam|Pacific/Saipan","Pacific/Honolulu|HST","Pacific/Honolulu|Pacific/Johnston","Pacific/Honolulu|US/Hawaii","Pacific/Kiritimati|Etc/GMT-14","Pacific/Niue|Etc/GMT+11","Pacific/Pago_Pago|Pacific/Midway","Pacific/Pago_Pago|Pacific/Samoa","Pacific/Pago_Pago|US/Samoa","Pacific/Pitcairn|Etc/GMT+8","Pacific/Tahiti|Etc/GMT+10","Pacific/Tahiti|Pacific/Rarotonga","Pacific/Tongatapu|Etc/GMT-13","Pacific/Tongatapu|Pacific/Enderbury","Pacific/Tongatapu|Pacific/Fakaofo","Pacific/Tongatapu|Pacific/Kanton"],countries:["AD|Europe/Andorra","AE|Asia/Dubai","AF|Asia/Kabul","AG|America/Puerto_Rico America/Antigua","AI|America/Puerto_Rico America/Anguilla","AL|Europe/Tirane","AM|Asia/Yerevan","AO|Africa/Lagos Africa/Luanda","AQ|Antarctica/Casey Antarctica/Davis Antarctica/Mawson Antarctica/Palmer Antarctica/Rothera Antarctica/Troll Antarctica/Vostok Pacific/Auckland Pacific/Port_Moresby Asia/Riyadh Antarctica/McMurdo Antarctica/DumontDUrville Antarctica/Syowa
vendor: 9,310 bytes, line 11782
11782","AR|America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Salta America/Argentina/Jujuy America/Argentina/Tucuman America/Argentina/Catamarca America/Argentina/La_Rioja America/Argentina/San_Juan America/Argentina/Mendoza America/Argentina/San_Luis America/Argentina/Rio_Gallegos America/Argentina/Ushuaia","AS|Pacific/Pago_Pago","AT|Europe/Vienna","AU|Australia/Lord_Howe Antarctica/Macquarie Australia/Hobart Australia/Melbourne Australia/Sydney Australia/Broken_Hill Australia/Brisbane Australia/Lindeman Australia/Adelaide Australia/Darwin Australia/Perth Australia/Eucla","AW|America/Puerto_Rico America/Aruba","AX|Europe/Helsinki Europe/Mariehamn","AZ|Asia/Baku","BA|Europe/Belgrade Europe/Sarajevo","BB|America/Barbados","BD|Asia/Dhaka","BE|Europe/Brussels","BF|Africa/Abidjan Africa/Ouagadougou","BG|Europe/Sofia","BH|Asia/Qatar Asia/Bahrain","BI|Africa/Maputo Africa/Bujumbura","BJ|Africa/Lagos Africa/Porto-Novo","BL|America/Puerto_Rico America/St_Barthelemy","BM|Atlantic/Bermuda","BN|Asia/Kuching Asia/Brunei","BO|America/La_Paz","BQ|America/Puerto_Rico America/Kralendijk","BR|America/Noronha America/Belem America/Fortaleza America/Recife America/Araguaina America/Maceio America/Bahia America/Sao_Paulo America/Campo_Grande America/Cuiaba America/Santarem America/Porto_Velho America/Boa_Vista America/Manaus America/Eirunepe America/Rio_Branco","BS|America/Toronto America/Nassau","BT|Asia/Thimphu","BW|Africa/Maputo Africa/Gaborone","BY|Europe/Minsk","BZ|America/Belize","CA|America/St_Johns America/Halifax America/Glace_Bay America/Moncton America/Goose_Bay America/Toronto America/Iqaluit America/Winnipeg America/Resolute America/Rankin_Inlet America/Regina America/Swift_Current America/Edmonton America/Cambridge_Bay America/Inuvik America/Dawson_Creek America/Fort_Nelson America/Whitehorse America/Dawson America/Vancouver America/Panama America/Puerto_Rico America/Phoenix America/Blanc-Sablon America/Atikokan America/Creston","CC|Asia/Yangon Indian/Cocos","CD|Africa/Maputo Africa/Lagos Africa/Kinshasa Africa/Lubumbashi","CF|Africa/Lagos Africa/Bangui","CG|Africa/Lagos Africa/Brazzaville","CH|Europe/Zurich","CI|Africa/Abidjan","CK|Pacific/Rarotonga","CL|America/Santiago America/Punta_Arenas Pacific/Easter","CM|Africa/Lagos Africa/Douala","CN|Asia/Shanghai Asia/Urumqi","CO|America/Bogota","CR|America/Costa_Rica","CU|America/Havana","CV|Atlantic/Cape_Verde","CW|America/Puerto_Rico America/Curacao","CX|Asia/Bangkok Indian/Christmas","CY|Asia/Nicosia Asia/Famagusta","CZ|Europe/Prague","DE|Europe/Zurich Europe/Berlin Europe/Busingen","DJ|Africa/Nairobi Africa/Djibouti","DK|Europe/Berlin Europe/Copenhagen","DM|America/Puerto_Rico America/Dominica","DO|America/Santo_Domingo","DZ|Africa/Algiers","EC|America/Guayaquil Pacific/Galapagos","EE|Europe/Tallinn","EG|Africa/Cairo","EH|Africa/El_Aaiun","ER|Africa/Nairobi Africa/Asmara","ES|Europe/Madrid Africa/Ceuta Atlantic/Canary","ET|Africa/Nairobi Africa/Addis_Ababa","FI|Europe/Helsinki","FJ|Pacific/Fiji","FK|Atlantic/Stanley","FM|Pacific/Kosrae Pacific/Port_Moresby Pacific/Guadalcanal Pacific/Chuuk Pacific/Pohnpei","FO|Atlantic/Faroe","FR|Europe/Paris","GA|Africa/Lagos Africa/Libreville","GB|Europe/London","GD|America/Puerto_Rico America/Grenada","GE|Asia/Tbilisi","GF|America/Cayenne","GG|Europe/London Europe/Guernsey","GH|Africa/Abidjan Africa/Accra","GI|Europe/Gibraltar","GL|America/Nuuk America/Danmarkshavn America/Scoresbysund America/Thule","GM|Africa/Abidjan Africa/Banjul","GN|Africa/Abidjan Africa/Conakry","GP|America/Puerto_Rico America/Guadeloupe","GQ|Africa/Lagos Africa/Malabo","GR|Europe/Athens","GS|Atlantic/South_Georgia","GT|America/Guatemala","GU|Pacific/Guam","GW|Africa/Bissau","GY|America/Guyana","HK|Asia/Hong_Kong","HN|America/Tegucigalpa","HR|Europe/Belgrade Europe/Zagreb","HT|America/Port-au-Prince","HU|Europe/Budapest","ID|Asia/Jakarta Asia/Pontianak Asia/Makassar Asia/Jayapura","IE|Europe/Dublin","IL|Asia/Jerusalem","IM|Europe/London Europe/Isle_of_Man","IN|Asia/Kolkata","IO|Indian/Chagos","IQ|Asia/Baghdad","IR|Asia/Tehran","IS|Africa/Abidjan Atlantic/Reykjavik","IT|Europe/Rome","JE|Europe/London Europe/Jersey","JM|America/Jamaica","JO|Asia/Amman","JP|Asia/Tokyo","KE|Africa/Nairobi","KG|Asia/Bishkek","KH|Asia/Bangkok Asia/Phnom_Penh","KI|Pacific/Tarawa Pacific/Kanton Pacific/Kiritimati","KM|Africa/Nairobi Indian/Comoro","KN|America/Puerto_Rico America/St_Kitts","KP|Asia/Pyongyang","KR|Asia/Seoul","KW|Asia/Riyadh Asia/Kuwait","KY|America/Panama America/Cayman","KZ|Asia/Almaty Asia/Qyzylorda Asia/Qostanay Asia/Aqtobe Asia/Aqtau Asia/Atyrau Asia/Oral","LA|Asia/Bangkok Asia/Vientiane","LB|Asia/Beirut","LC|America/Puerto_Rico America/St_Lucia","LI|Europe/Zurich Europe/Vaduz","LK|Asia/Colombo","LR|Africa/Monrovia","LS|Africa/Johannesburg Africa/Maseru","LT|Europe/Vilnius","LU|Europe/Brussels Europe/Luxembourg","LV|Europe/Riga","LY|Africa/Tripoli","MA|Africa/Casablanca","MC|Europe/Paris Europe/Monaco","MD|Europe/Chisinau","ME|Europe/Belgrade Europe/Podgorica","MF|America/Puerto_Rico America/Marigot","MG|Africa/Nairobi Indian/Antananarivo","MH|Pacific/Tarawa Pacific/Kwajalein Pacific/Majuro","MK|Europe/Belgrade Europe/Skopje","ML|Africa/Abidjan Africa/Bamako","MM|Asia/Yangon","MN|Asia/Ulaanbaatar Asia/Hovd Asia/Choibalsan","MO|Asia/Macau","MP|Pacific/Guam Pacific/Saipan","MQ|America/Martinique","MR|Africa/Abidjan Africa/Nouakchott","MS|America/Puerto_Rico America/Montserrat","MT|Europe/Malta","MU|Indian/Mauritius","MV|Indian/Maldives","MW|Africa/Maputo Africa/Blantyre","MX|America/Mexico_City America/Cancun America/Merida America/Monterrey America/Matamoros America/Chihuahua America/Ciudad_Juarez America/Ojinaga America/Mazatlan America/Bahia_Banderas America/Hermosillo America/Tijuana","MY|Asia/Kuching Asia/Singapore Asia/Kuala_Lumpur","MZ|Africa/Maputo","NA|Africa/Windhoek","NC|Pacific/Noumea","NE|Africa/Lagos Africa/Niamey","NF|Pacific/Norfolk","NG|Africa/Lagos","NI|America/Managua","NL|Europe/Brussels Europe/Amsterdam","NO|Europe/Berlin Europe/Oslo","NP|Asia/Kathmandu","NR|Pacific/Nauru","NU|Pacific/Niue","NZ|Pacific/Auckland Pacific/Chatham","OM|Asia/Dubai Asia/Muscat","PA|America/Panama","PE|America/Lima","PF|Pacific/Tahiti Pacific/Marquesas Pacific/Gambier","PG|Pacific/Port_Moresby Pacific/Bougainville","PH|Asia/Manila","PK|Asia/Karachi","PL|Europe/Warsaw","PM|America/Miquelon","PN|Pacific/Pitcairn","PR|America/Puerto_Rico","PS|Asia/Gaza Asia/Hebron","PT|Europe/Lisbon Atlantic/Madeira Atlantic/Azores","PW|Pacific/Palau","PY|America/Asuncion","QA|Asia/Qatar","RE|Asia/Dubai Indian/Reunion","RO|Europe/Bucharest","RS|Europe/Belgrade","RU|Europe/Kaliningrad Europe/Moscow Europe/Simferopol Europe/Kirov Europe/Volgograd Europe/Astrakhan Europe/Saratov Europe/Ulyanovsk Europe/Samara Asia/Yekaterinburg Asia/Omsk Asia/Novosibirsk Asia/Barnaul Asia/Tomsk Asia/Novokuznetsk Asia/Krasnoyarsk Asia/Irkutsk Asia/Chita Asia/Yakutsk Asia/Khandyga Asia/Vladivostok Asia/Ust-Nera Asia/Magadan Asia/Sakhalin Asia/Srednekolymsk Asia/Kamchatka Asia/Anadyr","RW|Africa/Maputo Africa/Kigali","SA|Asia/Riyadh","SB|Pacific/Guadalcanal","SC|Asia/Dubai Indian/Mahe","SD|Africa/Khartoum","SE|Europe/Berlin Europe/Stockholm","SG|Asia/Singapore","SH|Africa/Abidjan Atlantic/St_Helena","SI|Europe/Belgrade Europe/Ljubljana","SJ|Europe/Berlin Arctic/Longyearbyen","SK|Europe/Prague Europe/Bratislava","SL|Africa/Abidjan Africa/Freetown","SM|Europe/Rome Europe/San_Marino","SN|Africa/Abidjan Africa/Dakar","SO|Africa/Nairobi Africa/Mogadishu","SR|America/Paramaribo","SS|Africa/Juba","ST|Africa/Sao_Tome","SV|America/El_Salvador","SX|America/Puerto_Rico America/Lower_Princes","SY|Asia/Damascus","SZ|Africa/Johannesburg Africa/Mbabane","TC|America/Grand_Turk","TD|Africa/Ndjamena","TF|Asia/Dubai Indian/Maldives Indian/Kerguelen","TG|Africa/Abidjan Africa/Lome","TH|Asia/Bangkok","TJ|Asia/Dushanbe","TK|Pacific/Fakaofo","TL|Asia/Dili","TM|Asia/Ashgabat","TN|Africa/Tunis","TO|Pacific/Tongatapu","TR|Europe/Istanbul","TT|America/Puerto_Rico America/Port_of_Spain","TV|Pacific/Tarawa Pacific/Funafuti","TW|Asia/Taipei","TZ|Africa/Nairobi Africa/Dar_es_Salaam","UA|Europe/Simferopol Europe/Kyiv","UG|Africa/Nairobi Africa/Kampala","UM|Pacific/Pago_Pago Pacific/Tarawa Pacific/Midway Pacific/Wake","US|America/New_York America/Detroit America/Kentucky/Louisville America/Kentucky/Monticello America/Indiana/Indianapolis America/Indiana/Vincennes America/Indiana/Winamac America/Indiana/Marengo America/Indiana/Petersburg America/Indiana/Vevay America/Chicago America/Indiana/Tell_City America/Indiana/Knox America/Menominee America/North_Dakota/Center America/North_Dakota/New_Salem America/North_Dakota/Beulah America/Denver America/Boise America/Phoenix America/Los_Angeles America/Anchorage America/Juneau America/Sitka America/Metlakatla America/Yakutat America/Nome America/Adak Pacific/Honolulu","UY|America/Montevideo","UZ|Asia/Samarkand Asia/Tashkent","VA|Europe/Rome Europe/Vatican","VC|America/Puerto_Rico America/St_Vincent","VE|America/Caracas","VG|America/Puerto_Rico America/Tortola","VI|America/Puerto_Rico America/St_Thomas","VN|Asia/Bangkok Asia/Ho_Chi_Minh","VU|Pacific/Efate","WF|Pacific/Tarawa Pacific/Wallis","WS|Pacific/Apia","YE|Asia/Riyadh Asia/Aden","YT|Africa/Nairobi Indian/Mayotte","ZA|Africa/Johannesburg","ZM|Africa
117822/Maputo Africa/Lusaka","ZW|Africa/Maputo Africa/Harare"]}),o}); 11783global.EC_GLOBAL_MOMENT = global.moment; global.moment = global.moment_original || (delete global.moment, undefined); 11784})(typeof window !== 'undefined' ? window : global); 11785CAFE24.GLOBAL_DATETIME = (function() { 11786 var getDateTimeInfo = function (sInfo, mDefault) { 11787 if (typeof window.CAFE24.GLOBAL_DATETIME_INFO === 'object' && sInfo in window.CAFE24.GLOBAL_DATETIME_INFO) { 11788 return window.CAFE24.GLOBAL_DATETIME_INFO[sInfo]; 11789 } 11790 11791 return mDefault; 11792 }; 11793 var oConstants = getDateTimeInfo('oConstants', {}); 11794 var oOptions = getDateTimeInfo('oOptions', {}); 11795 var oPolicies = getDateTimeInfo('oPolicies', {}); 11796 var sOverrideTimezone = getDateTimeInfo('sOverrideTimezone', ''); 11797 var sMomentNamespace = getDateTimeInfo('sMomentNamespace', ''); 11798 11799 var fMomentLoaded = function() { 11800 var bMomentLoaded = !!window[sMomentNamespace]; 11801 var bMomentTZLoaded = false; 11802 if (bMomentLoaded) { 11803 bMomentTZLoaded = !!window[sMomentNamespace].tz; 11804 } 11805 11806 return bMomentLoaded && bMomentTZLoaded; 11807 }; 11808 11809 var fMomentWrapper = function() { 11810 return window[sMomentNamespace]; 11811 }; 11812 11813 var fShallowMerge = function(oTarget, oSource) { 11814 oSource = oSource || {}; 11815 for (var sKey in oSource) { 11816 if (oSource.hasOwnProperty(sKey)) { 11817 oTarget[sKey] = oSource[sKey]; 11818 } 11819 } 11820 11821 return oTarget; 11822 }; 11823 11824 var getFormatFromFlag = function(oOptions, iFlag, bOpposite) { 11825 if (bOpposite) { 11826 switch (iFlag) { 11827 case 1: 11828 return oOptions[oConstants.IN_DATE_FORMAT]; 11829 case 2: 11830 return oOptions[oConstants.IN_TIME_FORMAT]; 11831 default: 11832 return oOptions[oConstants.IN_FORMAT]; 11833 } 11834 } 11835 11836 switch (iFlag) { 11837 case 1: 11838 return oOptions[oConstants.OUT_DATE_FORMAT]; 11839 case 2: 11840 return oOptions[oConstants.OUT_TIME_FORMAT]; 11841 default: 11842 return oOptions[oConstants.OUT_FORMAT]; 11843 } 11844 }; 11845 11846 return { 11847 'const': oConstants, 11848 11849 init: function(fCallback) { 11850 if (fMomentLoaded()) { 11851 if (typeof fCallback === 'function') { 11852 fCallback(); 11853 } 11854 11855 return; 11856 } 11857 11858 var oScript = document.createElement('script'); 11859 oScript.type = 'text/javascript'; 11860 oScript.async = true; 11861 oScript.src = '/ind-script/moment.php?convert={$sConvert}'; 11862 oScript.onload = oScript.onreadystatechange = function () { 11863 fMomentWrapper().defaultFormat = oOptions[oConstants.OUT_FORMAT]; 11864 fMomentWrapper().tz.setDefault(oOptions[oConstants.IN_ZONE]); 11865 11866 if (typeof fCallback === 'function') { 11867 fCallback(); 11868 } 11869 }; 11870 11871 var oFirstScript = document.getElementsByTagName('script')[0]; 11872 oFirstScript.parentNode.insertBefore(oScript, oFirstScript); 11873 }, 11874 11875 initPromise: function() { 11876 if (!window.Promise) { 11877 return; 11878 } 11879 11880 return new Promise(function(resolve) { 11881 this.init(resolve); 11882 }.bind(this)); 11883 }, 11884 11885 isLoaded: function() { 11886 return fMomentLoaded(); 11887 }, 11888 11889 setOptions: function(oNewOptions) { 11890 if (typeof oNewOptions === 'object') { 11891 for (var sKey in oNewOptions) { 11892 if (oNewOptions.hasOwnProperty(sKey) && oOptions.hasOwnProperty(sKey)) { 11893 oOptions[sKey] = oNewOptions[sKey]; 11894 } 11895 } 11896 } 11897 11898 return this; 11899 }, 11900 11901 now: function(mOptions, iFlag) { 11902 if (fMomentLoaded() === false) { 11903 return Math.floor(new Date().getTime() / 1000); 11904 } 11905 11906 var oFormatOptions = this.getOptions(mOptions); 11907 return fMomentWrapper()() 11908 .tz(oFormatOptions.outZone) 11909 .format(getFormatFromFlag(oFormatOptions, iFlag)); 11910 }, 11911 11912 format: function(sTime, mOptions, iFlag) { 11913 if (fMomentLoaded() === false) { 11914 return sTime; 11915 } 11916 11917 var oFormatOptions = this.getOptions(mOptions); 11918 return fMomentWrapper() 11919 .tz(sTime, oFormatOptions.inZone) 11920 .tz(oFormatOptions.outZone) 11921 .format(getFormatFromFlag(oFormatOptions, iFlag)); 11922 }, 11923 11924 parse: function(sTime, mOptions) { 11925 if (fMomentLoaded() === false) { 11926 return sTime; 11927 } 11928 11929 var oParseOptions = this.getOptions(mOptions); 11930 return fMomentWrapper().tz((sTime || new Date()), oParseOptions.inZone).tz(oParseOptions.outZone); 11931 }, 11932 11933 getOptions: function(mOptions, iFlag) { 11934 mOptions = mOptions || {}; 11935 11936 var oMergedOptions = fShallowMerge({}, oOptions); 11937 if (typeof mOptions === 'string' && oPolicies[mOptions]) { 11938 oMergedOptions = fShallowMerge(oMergedOptions, oPolicies[mOptions]); 11939 } else if (typeof mOptions === 'object') { 11940 oMergedOptions = fShallowMerge(oMergedOptions, mOptions); 11941 } 11942 11943 if (sOverrideTimezone) { 11944 if ((typeof mOptions === 'string' && mOptions === 'shop') || (typeof mOptions === 'object' && !mOptions[oConstants.OUT_ZONE])) { 11945 oMergedOptions[oConstants.OUT_ZONE] = sOverrideTimezone; 11946 } 11947 } 11948 11949 return oMergedOptions; 11950 }, 11951 11952 getRevertOptions: function(mOptions) { 11953 var oCurrentOptions = this.getOptions(mOptions); 11954 var oMergedOptions = fShallowMerge({}, oOptions); 11955 oMergedOptions[oConstants.IN_ZONE] = oCurrentOptions[oConstants.OUT_ZONE]; 11956 oMergedOptions[oConstants.IN_FORMAT] = oCurrentOptions[oConstants.OUT_FORMAT]; 11957 oMergedOptions[oConstants.IN_DATE_FORMAT] = oCurrentOptions[oConstants.OUT_DATE_FORMAT]; 11958 oMergedOptions[oConstants.IN_TIME_FORMAT] = oCurrentOptions[oConstants.OUT_TIME_FORMAT]; 11959 11960 return oMergedOptions; 11961 }, 11962 11963 today: function(sTime, mOptions, iFlag) { 11964 if (fMomentLoaded() === false) { 11965 throw new Error('MomentJS didnt initialize'); 11966 } 11967 11968 mOptions = mOptions || 'shop'; 11969 var oRevertOptions = this.getRevertOptions(mOptions); 11970 var oToday; 11971 if (!sTime || sTime === 'now') { 11972 oToday = this.parse('', mOptions); 11973 } else { 11974 iFlag = iFlag || oConstants.IN_FORMAT_ALL || 3; 11975 oToday = fMomentWrapper().tz(sTime, getFormatFromFlag(oRevertOptions, iFlag, true), oRevertOptions[oConstants.IN_ZONE]); 11976 if (oToday.isValid() === false) { 11977 var oStandardDateRegex = new RegExp(oConstants.STANDARD_DATE_REGEX.replace(/\//g, '')); 11978 if (oStandardDateRegex.test(sTime) === true) { 11979 oToday = fMomentWrapper().tz(sTime, oRevertOptions[oConstants.IN_ZONE]); 11980 } else { 11981 oToday = fMomentWrapper()(); 11982 } 11983 } 11984 } 11985 11986 var oStartOfDay = oToday.clone().startOf('day'); 11987 var oEndOfDay = oToday.clone().endOf('day'); 11988 11989 var sStartOfDayInSeoul = oStartOfDay.tz(oConstants.SEOUL).format(
11989oConstants.FULL_TIME); 11990 var sEndOfDayInSeoul = oEndOfDay.tz(oConstants.SEOUL).format(oConstants.FULL_TIME); 11991 11992 return [sStartOfDayInSeoul, sEndOfDayInSeoul]; 11993 }, 11994 11995 parseFromFormat: function(sTime, mOptions, iFlag) { 11996 if (fMomentLoaded() === false) { 11997 return sTime; 11998 } 11999 12000 mOptions = mOptions || 'shop'; 12001 iFlag = iFlag || oConstants.IN_FORMAT_ALL || 3; 12002 12003 var oRevertOptions = {}; 12004 if (typeof mOptions === 'string') { 12005 oRevertOptions = this.getRevertOptions(mOptions); 12006 } else { 12007 oRevertOptions = this.getOptions(mOptions); 12008 } 12009 12010 return fMomentWrapper()(sTime, getFormatFromFlag(oRevertOptions, iFlag, true)); 12011 } 12012 }; 12013})(); 12014 12015var EC_GLOBAL_DATETIME = CAFE24.getDeprecatedNamespace('EC_GLOBAL_DATETIME'); 12016 12017!function() { 12018 'use strict'; 12019 var re = { 12020 not_string: /[^s]/, 12021 not_bool: /[^t]/, 12022 not_type: /[^T]/, 12023 not_primitive: /[^v]/, 12024 number: /[diefg]/, 12025 numeric_arg: /[bcdiefguxX]/, 12026 json: /[j]/, 12027 not_json: /[^j]/, 12028 text: /^[^\x25]+/, 12029 modulo: /^\x25{2}/, 12030 placeholder: /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/, 12031 key: /^([a-z_][a-z_\d]*)/i, 12032 key_access: /^\.([a-z_][a-z_\d]*)/i, 12033 index_access: /^\[(\d+)\]/, 12034 sign: /^[\+\-]/ 12035 }; 12036 12037 function sprintf(key) { 12038 try { 12039 // `arguments` is not an array, but should be fine for this call 12040 return sprintf_format(sprintf_parse(key), arguments); 12041 } catch (e) { 12042 return key; 12043 } 12044 } 12045 12046 function vsprintf(fmt, argv) { 12047 return sprintf.apply(null, [fmt].concat(argv || [])); 12048 } 12049 12050 function sprintf_format(parse_tree, argv) { 12051 var cursor = 1, tree_length = parse_tree.length, arg, output = '', i, k, ph, pad, pad_character, pad_length, is_positive, sign; 12052 for (i = 0; i < tree_length; i++) { 12053 if (typeof parse_tree[i] === 'string') { 12054 output += parse_tree[i]; 12055 } 12056 else if (typeof parse_tree[i] === 'object') { 12057 ph = parse_tree[i]; // convenience purposes only 12058 if (ph.keys) { // keyword argument 12059 arg = argv[cursor]; 12060 for (k = 0; k < ph.keys.length; k++) { 12061 if (arg == undefined) { 12062 throw new Error(sprintf('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k-1])); 12063 } 12064 arg = arg[ph.keys[k]]; 12065 } 12066 } 12067 else if (ph.param_no) { // positional argument (explicit) 12068 arg = argv[ph.param_no]; 12069 } 12070 else { // positional argument (implicit) 12071 arg = argv[cursor++]; 12072 } 12073 12074 if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) { 12075 arg = arg(); 12076 } 12077 12078 if (re.numeric_arg.test(ph.type) && (typeof arg !== 'number' && isNaN(arg))) { 12079 throw new TypeError(sprintf('[sprintf] expecting number but found %T', arg)); 12080 } 12081 12082 if (re.number.test(ph.type)) { 12083 is_positive = arg >= 0; 12084 } 12085 12086 switch (ph.type) { 12087 case 'b': 12088 arg = parseInt(arg, 10).toString(2); 12089 break; 12090 case 'c': 12091 arg = String.fromCharCode(parseInt(arg, 10)); 12092 break; 12093 case 'd': 12094 case 'i': 12095 arg = parseInt(arg, 10); 12096 break; 12097 case 'j': 12098 arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0); 12099 break; 12100 case 'e': 12101 arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential(); 12102 break; 12103 case 'f': 12104 arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg); 12105 break; 12106 case 'g': 12107 arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg); 12108 break; 12109 case 'o': 12110 arg = (parseInt(arg, 10) >>> 0).toString(8); 12111 break; 12112 case 's': 12113 arg = String(arg); 12114 arg = (ph.precision ? arg.substring(0, ph.precision) : arg); 12115 break; 12116 case 't': 12117 arg = String(!!arg); 12118 arg = (ph.precision ? arg.substring(0, ph.precision) : arg); 12119 break; 12120 case 'T': 12121 arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase(); 12122 arg = (ph.precision ? arg.substring(0, ph.precision) : arg); 12123 break; 12124 case 'u': 12125 arg = parseInt(arg, 10) >>> 0; 12126 break; 12127 case 'v': 12128 arg = arg.valueOf(); 12129 arg = (ph.precision ? arg.substring(0, ph.precision) : arg); 12130 break; 12131 case 'x': 12132 arg = (parseInt(arg, 10) >>> 0).toString(16); 12133 break; 12134 case 'X': 12135 arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase(); 12136 break; 12137 } 12138 if (re.json.test(ph.type)) { 12139 output += arg; 12140 } 12141 else { 12142 if (re.number.test(ph.type) && (!is_positive || ph.sign)) { 12143 sign = is_positive ? '+' : '-'; 12144 arg = arg.toString().replace(re.sign, ''); 12145 } 12146 else { 12147 sign = ''; 12148 } 12149 pad_character = ph.pad_char ? ph.pad_char === '0' ? '0' : ph.pad_char.charAt(1) : ' '; 12150 pad_length = ph.width - (sign + arg).length; 12151 pad = ph.width ? (pad_length > 0 ? pad_character.repeat(pad_length) : '') : ''; 12152 output += ph.align ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg); 12153 } 12154 } 12155 } 12156 return output; 12157 } 12158 12159 var sprintf_cache = Object.create(null); 12160 12161 function sprintf_parse(fmt) { 12162 if (sprintf_cache[fmt]) { 12163 return sprintf_cache[fmt]; 12164 } 12165 12166 var _fmt = fmt, match, parse_tree = [], arg_names = 0; 12167 while (_fmt) { 12168 if ((match = re.text.exec(_fmt)) !== null) { 12169 parse_tree.push(match[0]); 12170 } 12171 else if ((match = re.modulo.exec(_fmt)) !== null) { 12172 parse_tree.push('%'); 12173 } 12174 else if ((match = re.placeholder.exec(_fmt)) !== null) { 12175 if (match[2]) { 12176 arg_names |= 1; 12177 var field_list = [], replacement_field = match[2], field_match = []; 12178 if ((field_match = re.key.exec(replacement_field)) !== null) { 12179 field_list.push(field_match[1]); 12180 while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { 12181 if ((field_match = re.key_access.exec(replacement_field)) !== null) { 12182 field_list.push(field_match[1]); 12183 } 12184 else if ((field_match = re.index_access.exec(replacement_field)) !== null) { 12185 field_list.push(field_match[1]); 12186 } 12187 else { 12188 throw new SyntaxError('[sprintf] failed to parse named argument key'); 12189 } 12190 } 12191 } 12192 else { 12193 throw new SyntaxError('[sprintf] failed to parse named argument key'); 12194 } 12195 match[2] = field_list; 12196 } 12197 else { 12198 arg_names |= 2; 12199 } 12200 if (arg_names === 3) { 12201 throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported'); 12202 } 12203 parse_tree.push( 12204 { 12205 placeholder: match[0], 12206 param_no: match[1], 12207 keys: match[2], 12208 sign: match[3], 12209 pad_char: match[4], 12210 align: match[5], 12211 width: match[6], 12212 precision: match[7], 12213 type: match[8] 12214 } 12215 ); 12216 } else { 12217 throw new SyntaxError('[sprintf] unexpected placeholder'); 12218 } 12219 _fmt = _fmt.substring(match[0].length); 12220 } 12221 return sprintf_cache[fmt] = parse_tree; 12222 } 12223 12224 /** 12225 * export to either browser or node.js 12226 */ 12227 /* eslint-disable quote-props */ 12228 if (typeof exports !== 'undefined') { 12229 exports['sprintf'] = sprintf; 12230 exports['vsprintf'] = vsprintf; 12231 } 12232 if (typeof window !== 'undefined') { 12233 window['sprintf'] = sprintf; 12234 window['vsprintf'] = vsprintf; 12235 12236 if (typeof define === 'function' && define['amd']) { 12237 define(function() { 12238 return { 12239 'sprintf': sprintf, 12240 'vsprintf': vsprintf 12241 }; 12242 }); 12243 } 12244 } 12245 /* eslint-enable quote-props */ 12246}(); 12247 12248/* 12249 * ê°ê°ì²´ ë³ í목 컨í¸ë¡¤ ì ìí´ì ì°¨í íì¥ì ê³ ë ¤ íì¬ ë³ëë¡ ì¶ì¶ 12250 * 12251 */ 12252var secondZipcodeHidden = function() { 12253 //Front Page ì°í¸ë²í¸ 2ë²ì§¸ ìë ë©í¸ 리ì¤í¸ 12254 var secondZipcodeElementId = ["postcode2", "rzipcode2", "ozipcode2", "zip2", "address_zip2"]; 12255 for (var i in secondZipcodeElementId) { 12256 try { 12257 document.getElementById(secondZipcodeElementId[i]).style.display = "none"; 12258 } catch (e) { } 12259 } 12260 12261 // 구ëìì¸ íì ê°ì ìì zip2 ì ê±° 12262 try { 12263 document.frm.zip2.style.display = "none"; 12264 } catch (e) { } 12265 12266 // 구ëìì¸ ë°°ì¡ëª©ë¡ zip2 ì ê±° 12267 try { 12268 document.addr_set.rcv_zipcode2.style.display = "none"; 12269 } catch (e) { } 12270
12271 // 구ëìì¸ ì£¼ë¬¸ì ìì± zip2 ì ê±° 12272 try { 12273 document.frm.rzipcode2.style.display = "none"; 12274 document.frm.ozipcode2.style.display = "none"; 12275 } catch (e) { } 12276 12277 // 구ëìì¸ ì¸ê¸ê³ì°ì ì ì²ì½ì zip2 ì ê±° 12278 try { 12279 document.frm.mall_zipcode2.style.display = "none"; 12280 } catch (e) { } 12281}; 12282 12283secondZipcodeHidden(); 12284 12285CAFE24.PLUSAPP_BRIDGE = (function() { 12286 var bUsePlusAppBridge = false; 12287 12288 return { 12289 /** 12290 * í´ë¹ ë©ìë를 ì¬ì©í´ì¼ íë¬ì¤ì±ì ë°ì´í° ì ë¬ ê°ë¥ 12291 */ 12292 setBridgeFunction: function () { 12293 bUsePlusAppBridge = true; 12294 }, 12295 12296 /** 12297 * íë¬ì¤ì±ì ì¬ë¬ ë°ì´í° ì ë¬ 12298 * @param oBridgeData JSON íì ì ë°ì´í° 12299 */ 12300 sendBridgeData: function (oBridgeData) { 12301 if (bUsePlusAppBridge && typeof (UsePlusAppBridge) !== undefined) { 12302 var browserInfo = navigator.userAgent; 12303 try { 12304 if (browserInfo.indexOf("Cafe24Plus") > -1) { 12305 var sBridgeData = JSON.stringify(oBridgeData); 12306 12307 // Flutter ë°ì´í° ì ì¡ 12308 if (window.flutter_inappwebview && window.flutter_inappwebview.callHandler) { 12309 window.flutter_inappwebview.callHandler("sendDatasToApp", sBridgeData); 12310 return; 12311 } else { 12312 if (window.flutter_inappwebview && window.flutter_inappwebview._callHandler) { 12313 window.flutter_inappwebview._callHandler("sendDatasToApp", sBridgeData); 12314 return; 12315 } 12316 } 12317 12318 if (browserInfo.indexOf("android") > -1) { 12319 if (window.PlusAppBridge.hasOwnProperty('sendDatasToApp') === true) { 12320 window.PlusAppBridge.sendDatasToApp(sBridgeData); 12321 } 12322 } else if (typeof (webkit.messageHandlers.sendDatasToApp) !== 'undefined') { 12323 webkit.messageHandlers.sendDatasToApp.postMessage(sBridgeData); 12324 } 12325 } 12326 } catch (e) {} 12327 } 12328 }, 12329 12330 /** 12331 * ìí ë²í¸ ë°í 12332 * @param sCheckedProduct 12333 */ 12334 getProductNo: function (sCheckedProduct) { 12335 return sCheckedProduct.split(':')[0]; 12336 }, 12337 12338 /** 12339 * serialize ë Formì Json Object í¬ë§·ì¼ë¡ ë³ê²½ 12340 * @param sParam 12341 */ 12342 unserialize: function (sParam) { 12343 var objParam, aParam; 12344 aParam = sParam.replace(/\?/, "").split("&"); 12345 objParam = {}; 12346 EC$.each(aParam, function(iKey, sValue) { 12347 var aValue = sValue.split('='); 12348 return objParam[aValue[0]] = aValue[1]; 12349 }); 12350 return objParam; 12351 }, 12352 12353 /** 12354 * ì¥ë°êµ¬ë ë±ë¡ ì´ë²¤í¸ì ë°ì´í° ì ì¡ ì²ë¦¬ 12355 * @param oParam 12356 */ 12357 addBasket: function (oParam) { 12358 var oData = { 12359 type: 'basket', 12360 raw_data: oParam 12361 }; 12362 12363 CAFE24.PLUSAPP_BRIDGE.sendBridgeData(oData); 12364 }, 12365 12366 /** 12367 * ìì리ì¤í¸ ë±ë¡ ì´ë²¤í¸ì ë°ì´í° ì ì¡ ì²ë¦¬ 12368 * @param iProductNo 12369 */ 12370 addWishList: function (iProductNo) { 12371 var oData = { 12372 type: 'wish', 12373 raw_data: { 12374 product_no: iProductNo 12375 } 12376 }; 12377 12378 CAFE24.PLUSAPP_BRIDGE.sendBridgeData(oData); 12379 }, 12380 12381 /** 12382 * SNS ë§í¬ ê³µì í기 ì´ë²¤í¸ì ë°ì´í° ì ì¡ ì²ë¦¬ 12383 * @param {string} sMedia ìì 미ëì´ 12384 * @param {int} iProductNo ìíë²í¸ 12385 */ 12386 shareSocialLink: function (sMedia, iProductNo) { 12387 var oData = { 12388 type: 'share', 12389 raw_data: { 12390 method: sMedia, 12391 product_no: iProductNo, 12392 } 12393 }; 12394 12395 CAFE24.PLUSAPP_BRIDGE.sendBridgeData(oData); 12396 }, 12397 12398 /** 12399 * ìë¦¬ì¼ ì¿ í° ë±ë¡ì ì±ê³µì ë°ì´í° ì ì¡ ì²ë¦¬ 12400 * @param string sCouponCode ìë¦¬ì¼ ì¿ í° ì½ë 12401 */ 12402 addSerialCoupon: function (sCouponCode) { 12403 var oData = { 12404 type: 'coupon', 12405 raw_data: { 12406 coupon_code: sCouponCode 12407 } 12408 }; 12409 12410 CAFE24.PLUSAPP_BRIDGE.sendBridgeData(oData); 12411 }, 12412 12413 /** 12414 * 주문 ìë£ í ë°ì´í° ì ì¡ ì²ë¦¬ 12415 * @param object oParam 주문 ìë£ ë°ì´í° 12416 */ 12417 addOrderResult: function (oParam) { 12418 CAFE24.PLUSAPP_BRIDGE.sendBridgeData(oParam); 12419 }, 12420 12421 /** 12422 * íë¡ í¸ ì£¼ë¬¸ììì ê²°ì ììì ë°ì´í° ì ì¡ ì²ë¦¬ 12423 * @param object oParam ê²°ì ìì ë°ì´í° (ê²°ì ê¸ì¡, íµí ì ë³´) 12424 */ 12425 addBeginCheckout: function (oParam) { 12426 var oData = { 12427 type: 'begin_checkout', 12428 raw_data: oParam 12429 }; 12430 12431 CAFE24.PLUSAPP_BRIDGE.sendBridgeData(oData); 12432 } 12433 }; 12434})(); 12435 12436var EC_PlusAppBridge = CAFE24.getDeprecatedNamespace('PLUSAPP_BRIDGE'); 12437 12438CAFE24.UTIL = CAFE24.UTIL || {}; 12439 12440// $.parseJSON ëì²´ 12441CAFE24.UTIL.parseJSON = function(data) { 12442 if (typeof data !== "string" || !data) { 12443 return null; 12444 } 12445 return JSON.parse(data.trim()); 12446}; 12447 12448// $.trim ëì²´ 12449CAFE24.UTIL.trim = function(text) { 12450 var trim = String.prototype.trim; 12451 12452 return text == null ? "" : trim.call(text); 12453}; 12454 12455// $.browser ëì²´ 12456CAFE24.UTIL.browser = (function() { 12457 var uaMatch = function(ua) { 12458 ua = ua.toLowerCase(); 12459 12460 var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || 12461 /(webkit)[ \/]([\w.]+)/.exec(ua) || 12462 /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || 12463 /(msie) ([\w.]+)/.exec(ua) || 12464 ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || 12465 []; 12466 12467 return { 12468 browser: match[1] || "", 12469 version: match[2] || "0" 12470 }; 12471 }; 12472 12473 matched = uaMatch(navigator.userAgent); 12474 browser = {}; 12475 12476 if (matched.browser) { 12477 browser[matched.browser] = true; 12478 browser.version = matched.version; 12479 } 12480 12481 // Chrome is Webkit, but Webkit is also Safari. 12482 if (browser.chrome) { 12483 browser.webkit = true; 12484 } else if (browser.webkit) { 12485 browser.safari = true; 12486 } 12487 return browser; 12488})(); 12489 12490 12491CAFE24.UTIL.topWindowJquery = function(selector) { 12492 if (window.top) { 12493 if (window.top.EC$) { 12494 return window.top.EC$(selector); 12495 } 12496 if (window.top.$) { 12497 return window.top.$(selector); 12498 } 12499 } 12500 return false;
12501}; 12502 12503CAFE24.UTIL.parentWindowJquery = function(selector) { 12504 if (window.parent) { 12505 if (window.parent.EC$) { 12506 return window.parent.EC$(selector); 12507 } 12508 if (window.parent.$) { 12509 return window.parent.$(selector); 12510 } 12511 } 12512 return false; 12513}; 12514 12515CAFE24.UTIL.openerWindowJquery = function(selector) { 12516 if (window.opener) { 12517 if (window.opener.EC$) { 12518 return window.opener.EC$(selector); 12519 } 12520 if (window.opener.$) { 12521 return window.opener.$(selector); 12522 } 12523 } 12524 return false; 12525}; 12526 12527var EC_UTIL = CAFE24.getDeprecatedNamespace('EC_UTIL'); 12528 12529/* ì¬ì©ì ìë´ë ë²í¼ 리ì¬ì´ì§ */ 12530EC$(function() { 12531 window.addEventListener("resize", handleEvent); 12532 window.addEventListener('scroll', handleEvent); 12533 12534 handleEvent(); 12535 12536 function handleEvent(){ 12537 var targetEl = document.querySelectorAll('.certifyBox'); 12538 var bodyWidth = document.body.offsetWidth, 12539 winWidth = window.innerWidth-16, 12540 rightNum = 48; 12541 12542 for(var i=0; i<targetEl.length; i++){ 12543 var btnElChk = targetEl[i].querySelector('.btnTxt span'); 12544 if(btnElChk){ 12545 var btnWidth = btnElChk.offsetWidth; 12546 if(winWidth < 600) winWidth = 600; 12547 var left = (winWidth-(btnWidth+rightNum)+window.scrollX), 12548 cul = bodyWidth - winWidth; 12549 12550 if(bodyWidth > winWidth && window.scrollX <= cul) { 12551 targetEl[i].querySelector('.btnTxt').style.left = left + "px"; 12552 }else{ 12553 targetEl[i].querySelector('.btnTxt').style.left = ""; 12554 } 12555 } 12556 } 12557 } 12558}); 12559EC$(function () { 12560 var oAgent = navigator.userAgent.toLowerCase(); 12561 if (!EC$.cookie('ec_ipad_device') || /[TF]/.exec(EC$.cookie('ec_ipad_device')) == undefined) { 12562 if ((oAgent.indexOf('macintosh') != -1 && 'ontouchend' in document) === true) { 12563 EC$.cookie('ec_ipad_device', 'T', {path: '/'}); 12564 } else { EC$.cookie('ec_ipad_device', 'F', {path: '/'}); } 12565 } 12566 12567 // ì¥ë°êµ¬ë linkì ch_ref íë¼ë¯¸í° ì¶ê° 12568 if (typeof CAFE24 !== 'undefined' && CAFE24.hasChRef && CAFE24.hasChRef()) { 12569 $('a[href*="/order/basket.html"]').each(function () { 12570 try { 12571 const $link = $(this); 12572 const href = $link.attr("href"); 12573 12574 // hrefê° ì í¨íì§ íì¸ 12575 if (!href || href.startsWith('javascript:') || href.startsWith('mailto:')) { 12576 return; 12577 } 12578 12579 // URL íì± (IE í¸íì± ê³ ë ¤) 12580 let url; 12581 try { 12582 url = new URL(href, window.location.origin); 12583 } catch (e) { 12584 // IE í¸íì±ì ìí í´ë°± 12585 const link = document.createElement('a'); 12586 link.href = href; 12587 url = { 12588 pathname: link.pathname, 12589 search: link.search, 12590 hash: link.hash, 12591 searchParams: { 12592 set: function(key, value) { 12593 const params = new URLSearchParams(this.toString()); 12594 params.set(key, value); 12595 this.toString = function() { return params.toString(); }; 12596 } 12597 } 12598 }; 12599 } 12600 12601 const chRef = CAFE24.getChRefData && CAFE24.getChRefData(); 12602 if (chRef) { 12603 url.searchParams.set('ch_ref', chRef); 12604 $link.attr("href", url.pathname + url.search + url.hash); 12605 } 12606 } catch (error) { 12607 console.warn('Error processing basket link:', error); 12608 } 12609 }); 12610 } 12611}); 12612 12613CAFE24.FRONT_XANS_INTERPRETER = (function() { 12614 // ë³ì ì ê·ííì 12615 var XANS_VAR_FULL_NAME_REGEXP = '\\{\\$([a-z0-9_\\.]+)(?:[\\s]*[\\|][\\s]*([a-z0-9]+)[\\s]*[:]?((?:[^\\{\\}]+)*))?\\}'; 12616 12617 // í í릿ìì 모ë ë³ì를 찾기 ìí ì ê·ì 12618 var regexpFindSDEVarFullName = new RegExp(XANS_VAR_FULL_NAME_REGEXP, 'ig'); 12619 12620 // '{$var_name|display}'ê³¼ ê°ì 문ìì´ìì ë³ìëª ê³¼ 모ëíì´ì´ë¥¼ ë¶ë¦¬í기 ìí ì ê·ì 12621 var regexpSDEVarFullname = new RegExp('^' + XANS_VAR_FULL_NAME_REGEXP + '$', 'i'); 12622 12623 // 모ëíì´ì´ 12624 var aSDEModifier = { 12625 display: function(sVar) 12626 { 12627 if (sVar) { 12628 return ''; 12629 } else { 12630 return 'displaynone'; 12631 } 12632 }, 12633 numberformat: function(sVar) 12634 { 12635 if (isFinite(sVar)) { 12636 return number_format(sVar); 12637 } else { 12638 return ''; 12639 } 12640 },
12641 striptag: function(sVar) 12642 { 12643 return sVar.replace(/(<([^>]+)>)/ig, ''); 12644 } 12645 }; 12646 12647 /** 12648 * ì«ì를 3ìë¦¬ì© ì½¤ë§(,)ë¡ ëì´ì 문ìì´ë¡ ë³ííì¬ ë¦¬í´í©ëë¤. 12649 * @param string sNumber ì«ì 12650 * @returns {string} ì½¤ë§ ë°ìë 문ìì´ 12651 */ 12652 function number_format(sNumber) 12653 { 12654 // 3ìë¦¬ì© ,ë¡ ëì´ì ë¦¬í´ 12655 var sNumber = String(parseInt(sNumber)); 12656 var regexp = /^(-?[0-9]+)([0-9]{3})($|\.|,)/; 12657 while (regexp.test(sNumber)) { 12658 sNumber = sNumber.replace(regexp, "$1,$2$3"); 12659 } 12660 return sNumber; 12661 } 12662 12663 /** 12664 * ì ì²´ ë³ìëª ìì ì¤ì ë³ìëª ê³¼ 모ëíì´ì´ ë±ì ë¶ë¦¬íì¬ ë¦¬í´í©ëë¤. 12665 * @param string sVarFullName '{$var_name|display}' ííì ì ì²´ ë³ìëª 12666 * @returns {{var_name: *, modifire: *}} 12667 */ 12668 function parseVariableInfo(sVarFullName) 12669 { 12670 var aMatches = sVarFullName.match(regexpSDEVarFullname); 12671 12672 return { 12673 var_name: aMatches[1], 12674 modifire: aMatches[2] 12675 }; 12676 } 12677 12678 /** 12679 * XANS í í릿ìì ë³ì를 ë°ìíì¬ ë¦¬í´í©ëë¤. 12680 * @param string sTemplate í í릿 (HTML) 12681 * @param array aVars ë³ì 리ì¤í¸ 12682 * @return string ìì±ë HTML 12683 */ 12684 function fetch(sTemplate, aVars) 12685 { 12686 var aHtml = sTemplate.split('<!--#-->'); 12687 var sHtml = ''; 12688 12689 EC$(aHtml).each(function(iIndex, sModuleHtml) { 12690 if (iIndex < 1 || (iIndex % 2) !== 1) { 12691 sHtml += convertHtmlVars(sModuleHtml, aVars); 12692 } else { 12693 var oObj = EC$(sModuleHtml); 12694 var sChildNode = EC$('<div>').append(oObj.children().first().clone()).html(); 12695 if (/<!--\$--><!--@-->([\s\S]+)<!--\$-->/gm.test(sModuleHtml) === true) { 12696 sChildNode = /<!--\$--><!--@-->([\s\S]+)<!--\$-->/gm.exec(sModuleHtml)[1].split('<!--@-->')[0]; 12697 } 12698 var sModuleClass = EC$(oObj).attr('class'); 12699 var sModuleName = ucfirst(sModuleClass.match(/xans-product-([^- ]+)/)[1]); 12700 12701 if (typeof(aVars['@' + sModuleName]) === 'object') { 12702 var s = ''; 12703 EC$(aVars['@' + sModuleName]).each(function(i, aData) { 12704 s += convertHtmlVars(sChildNode, aData); 12705 }); 12706 12707 if (s !== '') { 12708 sHtml += EC$('<div>').append(oObj.html(s).clone()).html(); 12709 } 12710 } 12711 } 12712 }); 12713 12714 return sHtml; 12715 } 12716 12717 function ucfirst(sString) 12718 { 12719 if (typeof(sString) !== 'string') { 12720 return ''; 12721 } 12722 return sString.substring(0, 1).toUpperCase() + sString.substring(1).toLowerCase(); 12723 } 12724 12725 function convertHtmlVars(sTemplate, aVars) 12726 { 12727 return sTemplate.replace(regexpFindSDEVarFullName, function(sVarFullName) { 12728 var aVarInfo = parseVariableInfo(sVarFullName); 12729 12730 var sValue = ''; 12731 if (aVars[aVarInfo.var_name] || aVars[aVarInfo.var_name] === 0) { 12732 sValue = aVars[aVarInfo.var_name]; 12733 } 12734 12735 if (aVarInfo.modifire !== undefined && aSDEModifier.hasOwnProperty(aVarInfo.modifire) === true) { 12736 return aSDEModifier[aVarInfo.modifire](sValue); 12737 12738 } else { 12739 return sValue; 12740 12741 } 12742 }); 12743 } 12744 12745 /** 12746 * XANS í í릿ìì ë³ì 리ì¤í¸ë¥¼ ì»ì´ì 리í´í©ëë¤. 12747 * @param string sTemplate í í릿 (HTML) 12748 * @return array ë³ì 리ì¤í¸ (ex: ['{$var_name}', '{$var_name|display}']) 12749 */ 12750 function getVariables(sTemplate) 12751 { 12752 return sTemplate.match(regexpFindSDEVarFullName); 12753 } 12754 12755 return { 12756 getVariables: getVariables, 12757 parseVariableInfo: parseVariableInfo, 12758 fetch: fetch 12759 }; 12760})(); 12761 12762var EC_FRONT_XANS_INTERPRETER = CAFE24.getDeprecatedNamespace('EC_FRONT_XANS_INTERPRETER'); 12763 12764CAFE24.FRONT_XANS_TEMPLATE = (function() { 12765 // 모ëë³ í í릿 12766 var aModuleTemplates = {}; 12767 12768 /** 12769 * 모ëë³ í í릿ì ì í í©ëë¤. 12770 * @param string sModuleName 모ëëª (xans-product-listmain-1) 12771 * @param string sModuleTemplate 모ë í í릿 12772 */ 12773 function setTemplate(sModuleName, sModuleTemplate) 12774 { 12775 aModuleTemplates[sModuleName] = sModuleTemplate; 12776 12777 if (/^xans-product-list|^xans-product-hashtaglist/.test(sModuleName) === true) { 12778 var sTemplateForVDOM = getTemplateForVDOM(sModuleName); 12779 var $li = EC$(sTemplateForVDOM).find('li').first(); 12780 var sLiHTMLForVDOM = EC$('<ul>').append($li).html(); 12781 12782 // í´ìíê·¸ 모ëì ëí ë³ë ìºì± ì²ë¦¬ 12783 if (/^xans-product-hashtaglist/.test(sModuleName) === true) { 12784 aModuleTemplates[sModuleName] = convertVDomHtmlToHTML(sLiHTMLForVDOM); 12785 } else { 12786 // oMobileDomData를 ì¬ì í ì¬ì©ì¤ì¸ ì¬ì©ìjsìì í¸íì±ì ìí ìì¸ì²ë¦¬ - ECHOSTING-142586 12787 window.oMobileDomData = { 12788 dom: convertVDomHtmlToHTML(sLiHTMLForVDOM), 12789 data: CAFE24.FRONT_XANS_INTERPRETER.getVariables(sLiHTMLForVDOM) 12790 }; 12791 } 12792 } 12793 } 12794 12795 /** 12796 * 모ëë³ í í릿ì ê°ì ¸ìµëë¤. 12797 * @param string sModuleName 모ëëª 12798 * @return string 모ëë³ í í릿 12799 */ 12800 function getTemplate(sModuleName) 12801 { 12802 if (aModuleTemplates.hasOwnProperty(sModuleName)) { 12803 return aModuleTemplates[sModuleName]; 12804 } else { 12805 return undefined; 12806 } 12807 } 12808 12809 /** 12810 * Virtual DOM ìì ì¬ì©í 모ëë³ í í릿ì ê°ì ¸ìµëë¤. 12811 * @param string sModuleName 모ëëª 12812 * @return string 모ëë³ í í릿 12813 */ 12814 function getTemplateForVDOM(sModuleName) 12815 { 12816 var sTemplate = getTemplate(sModuleName) || ''; 12817 12818 // src ìì±ì ëí´ "//:0" ì²ë¦¬í´ì¤ëë¤. 12819 var sTemplateForVDOM = sTemplate.replace(/(\s+src\s*=\s*["'])/g, '$1//:0#xansjs'); 12820 12821 return sTemplateForVDOM; 12822 } 12823 12824 /** 12825 * "Virtual DOM"ì© HTMLì ì¼ë° HTMLë¡ ë³ííì¬ ë¦¬í´í©ëë¤. 12826 * @param string sTemplateForVDOM "Virtual DOM"ì© ì¬ì©í í í릿 HTML 12827 * @return string ì¼ë° HTML 12828 */ 12829 function convertVDomHtmlToHTML(sTemplateForVDOM) 12830 { 12831 // src ìì±ìì "//:0#xansjs"를 ìì í©ëë¤. 12832 var sTemplate = sTemplateForVDOM.replace(/(\s+src\s*=\s*["'])\/\/:0#xansjs/g, '$1'); 12833 12834 return sTemplate; 12835 } 12836 12837 return { 12838 setTemplate: setTemplate, 12839 getTemplate: getTemplate, 12840 getTemplateForVDOM: getTemplateForVDOM, 12841 convertVDomHtmlToHTML: convertVDomHtmlToHTML 12842 }; 12843})(); 12844 12845var EC_FRONT_XANS_TEMPLATE = CAFE24.getDeprecatedNamespace('EC_FRONT_XANS_TEMPLATE'); 12846 12847/** 12848 * 모ë°ì¼ ì ì© Util 12849 */ 12850CAFE24.MOBILE_UTIL = { 12851 /* 12852 * get li 12853 */ 12854 convertNode: function(node) { 12855 return CAFE24.FRONT_XANS_INTERPRETER.fetch(oMobileDomData.dom, node); 12856 }, 12857 12858 /* 12859 * set default img 12860 */ 12861 setDefaultImage: function() { 12862 EC$(".thumbnail img,img.ThumbImage,img.BigImage").each(function($i,$item) { 12863 var $img = new Image(); 12864 $img.onerror = function () { 12865 $item.src="//img.echosting.cafe24.com/thumb/img_product_big.gif"; 12866 }; 12867 $img.src = this.src; 12868 }); 12869 }, 12870 12871 /* 12872 * get ajax url 12873 */ 12874 getAjaxUrl: function(sModule) {
12875 var aAjax = []; 12876 12877 aAjax['xans-product-listnormal'] = '/exec/front/Product/ApiProductNormal'; 12878 aAjax['xans-product-listmain'] = '/exec/front/Product/ApiProductMain'; 12879 12880 return aAjax[sModule]; 12881 }, 12882 12883 /* 12884 * set param 12885 */ 12886 setAjaxParam: function(aData, sModule) { 12887 var aParam = []; 12888 12889 if (typeof(aData['cate_no']) === 'number' && aData['cate_no'] > 0) { aParam.push('cate_no=' + aData['cate_no']); } 12890 if (typeof(aData['display_group']) === 'number' && aData['display_group'] > 0) { aParam.push('display_group=' + aData['display_group']); } 12891 if (typeof(aData['sort_method']) === 'number' && aData['sort_method'] > 0) { aParam.push('sort_method=' + aData['sort_method']); } 12892 if (typeof(aData['supplier_code']) === 'string' && aData['supplier_code'] !== '') { aParam.push('supplier_code=' + aData['supplier_code']); } 12893 if (typeof(aData['ec_soldout_display']) === 'string' && aData['ec_soldout_display'] !== '') { aParam.push('ec_soldout_display=' + aData['ec_soldout_display']); } 12894 aParam.push('page=' + aData['page']); 12895 aParam.push('bInitMore=' + aData['bInitMore']); 12896 aParam.push('count=' + aData['count']); 12897 12898 return this.getAjaxUrl(sModule) + '?' + aParam.join('&'); 12899 } 12900}; 12901 12902var EC_MOBILE_UTIL = CAFE24.getDeprecatedNamespace('EC_MOBILE_UTIL'); 12903 12904/* 12905 * Swipe 1.0 12906 * 12907 * Brad Birdsall, Prime 12908 * Copyright 2011, Licensed GPL & MIT 12909 * 12910*/ 12911window.SwipeClient = function(element, options) { 12912 // return immediately if element doesn't exist 12913 if (! element) { 12914 return null; 12915 } 12916 12917 var _this = this; 12918 12919 // retreive options 12920 this.options = options || {}; 12921 this.index = this.options.startSlide || 0; 12922 this.speed = this.options.speed || 300; 12923 this.callback = this.options.callback || function() {}; 12924 this.delay = this.options.auto || 0; 12925 this.postback = this.options.postback || true; 12926 12927 // ìºì± ì¬ì©ì 무 (기본ê°ì¼ë¡ ì´ë¯¸ ëì´ì¤ì§ë§ ê·¸ëë noë¡ íë² ë ì ì¥) 12928 this.cache = this.options.cache || 'no'; 12929 12930 // íì¬ ì¬ë¼ì´ë ê°ë³ 모ëì ìì(ì¸ë±ì¤)를 ì ì¥í기 ìí´ ì ì¥ (ìíë²í¸, ì¹´í ì½ë¦¬ ë²í¸ ë±ì¼ë¡ ì¡°í©ë ìíë³ ì ëí¬ ê°) 12931 this.storageId = this.options.elementId || ''; 12932 12933 // reference dom elements 12934 this.container = element; 12935 this.element = this.container.getElementsByTagName('ul')[0]; // the slide pane 12936 12937 // static css 12938 this.container.style.overflow = 'hidden'; 12939 this.element.style.listStyle = 'none'; 12940 this.element.style.margin = 0; 12941 12942 // trigger slider initialization 12943 this.setup(); 12944 12945 // begin auto slideshow 12946 this.begin(); 12947 12948 // add event listeners 12949 if (this.element.addEventListener) { 12950 this.element.addEventListener('touchstart', this, false); 12951 this.element.addEventListener('touchmove', this, false); 12952 this.element.addEventListener('touchend', this, false); 12953 this.element.addEventListener('touchcancel', this, false); 12954 this.element.addEventListener('webkitTransitionEnd', this, false); 12955 this.element.addEventListener('msTransitionEnd', this, false); 12956 this.element.addEventListener('oTransitionEnd', this, false); 12957 this.element.addEventListener('transitionend', this, false); 12958 12959 window.addEventListener('resize', this, false); 12960 } 12961}; 12962 12963SwipeClient.prototype = { 12964 setup: function() { 12965 // get and measure amt of slides 12966 this.slides = this.element.children; 12967 this.length = this.slides.length; 12968 12969 // return immediately if their are less than two slides 12970 if (this.length < 2) { 12971 return null; 12972 } 12973 12974 // determine width of each slide 12975 this.width = Math.ceil(('getBoundingClientRect' in this.container) ? this.container.getBoundingClientRect().width : this.container.offsetWidth); 12976 12977 // Fix width for Android WebView (i.e. PhoneGap) 12978 if (this.width === 0 && typeof window.getComputedStyle === 'function') { 12979 this.width = window.getComputedStyle(this.container, null).width.replace('px',''); 12980 } 12981 12982 // return immediately if measurement fails 12983 if (! this.width) { 12984 return null; 12985 } 12986 12987 // hide slider element but keep positioning during setup 12988 var origVisibility = this.container.style.visibility; 12989 12990 this.container.style.visibility = 'hidden'; 12991 12992 // dynamic css 12993 this.element.style.width = Math.ceil(this.slides.length * this.width) + 'px'; 12994 12995 var index = this.slides.length; 12996 12997 while (index--) { 12998 var el = this.slides[index]; 12999 13000 el.style.width = this.width + 'px'; 13001 el.style.display = 'table-cell'; 13002 el.style.verticalAlign = 'top'; 13003 } 13004 13005 // set start position and force translate to remove initial flickering 13006 13007 // ìºì± ì¬ì©ì¤ì¼ ê²½ì°ìë§ ì²ë¦¬ 13008 if (this.cache === 'yes') { 13009 // ì ì¥ë ì¸ì ì¤í ë¦¬ì§ ì½ì´ì ì²ë¦¬ 13010 // ê° ì¤ìì´íì ê°ë³ 모ëì í´ë¹ëë ì¸ì ì¤í ë¦¬ì§ ê° 13011 // NaN ë³´ë¤ë parseInt(null)ë¡ ëª ííê² êµ¬ë¶ 13012 var iStorageIndexData = parseInt(null); 13013 13014 // ìí ìì¸íì´ì§ìì ìì±ë ì¸ì ì¤í ë¦¬ì§ í¤ 13015 var sStorageDetailName = 'sStorageDetail'; 13016 13017 // ìí ìì¸íì´ì§ìì ìì±ë ì¸ì ì¤í ë¦¬ì§ ê° (Unix Timestamp) 13018 // NaN ë³´ë¤ë parseInt(null)ë¡ ëª ííê² êµ¬ë¶ 13019 var iStorageDetailData = parseInt(null); 13020 13021 // íì¬ ìê° Unix Timstamp 13022 var iNowTime = Math.floor(new Date().getTime() / 1000); 13023 13024 // ì¸ì ì¤í ë¦¬ì§ ì ì§ ìê° 13025 var iSessionTime = 60 * 5; 13026 13027 // ê° í ë¹ (int) 13028 try { 13029 iStorageIndexData = parseInt(sessionStorage.getItem(this.storageId)); 13030 iStorageDetailData = parseInt(sessionStorage.getItem(sStorageDetailName)); 13031 } catch (e) { 13032 } 13033 13034 // ì ì¥ë ê°(ì¶ê° ì´ë¯¸ì§)ì´ ìì ë ê²½ì° ë¹ íì´ì§ë¡ ì¤ìì´í ëë¯ë¡, ì ì¥ë ì¸ë±ì¤ì í´ë¹ëë ì´ë¯¸ì§ê° ìë ê²½ì°ë ì¸ì ì¤í ë¦¬ì§ ìì 13035 if (typeof($S.aButton[iStorageIndexData]) === 'undefined') { 13036 // í ë¹ë ê° ì´ê¸°í 13037 iStorageIndexData = parseInt(null); 13038 13039 // ì¤ì ì¸ì ì¤í 리ì§ììë ìì 13040 try { 13041 sessionStorage.removeItem(this.storageId); 13042 } catch (e) { 13043 } 13044 } 13045 13046 // ê°ì´ ìë¤ë©´ moveTabì í´ì¼ Circle(íì´ì§ ì)ê¹ì§ ë³ê²½ë¨ 13047 // ìì¸íì´ì§ìì ìì±ë ì¸ì ì¤í 리ì§ê° í¹ì ìê°ì´ 경과íì§ ìì ê²½ì°ìë§ ì²ë¦¬ 13048 // ë§ì½ 모ëìì ìíë²í¸ ë±ì ì ë³´(this.storageId)를 ê°ì ¸ì
13048¤ì§ 못í ê²½ì°ìë ì²ë¦¬íì§ ìì 13049 if (this.storageId !== '' && isNaN(iStorageIndexData) === false && isNaN(iStorageDetailData) === false && iStorageDetailData + iSessionTime >= iNowTime) { 13050 // ì¤ì ì´ë ì²ë¦¬ 13051 this.moveTab(iStorageIndexData, 0); 13052 } else { 13053 this.slide(this.index, 0); 13054 } 13055 } else { 13056 this.slide(this.index, 0); 13057 } 13058 13059 this.container.style.visibility = origVisibility; 13060 }, 13061 13062 slide: function(index, duration) { 13063 // if useing ajax load 13064 try { 13065 if (oMobileSliderData.sPictorialLoad === true) { 13066 if ($S.iAjax === index + 1 && $S.bAjax === true) { 13067 $S.callAjax(); 13068 } 13069 } 13070 } catch (e) {} 13071 13072 var style = this.element.style; 13073 13074 // fallback to default speed 13075 if (duration == undefined) { 13076 duration = this.speed; 13077 } 13078 13079 // set duration speed (0 represents 1-to-1 scrolling) 13080 style.webkitTransitionDuration = style.MozTransitionDuration = style.msTransitionDuration = style.OTransitionDuration = style.transitionDuration = duration + 'ms'; 13081 13082 // translate to given index position 13083 style.MozTransform = style.webkitTransform = 'translate3d(' + -(index * this.width) + 'px, 0, 0)'; 13084 style.msTransform = style.OTransform = 'translateX(' + -(index * this.width) + 'px)'; 13085 13086 // set new index to allow for expression arguments 13087 this.index = index; 13088 13089 // íì¬ ëª¨ëì ì¸ë±ì¤ë¥¼ ì¸ì ì¤í 리ì§ì ì ì¥ 13090 // ìºì ì¬ì©ì¤ì´ë©° ì¸ë±ì¤ê° ìì¼ë©´ì ì ì¥í ì¤í ë¦¬ì§ ID ê°ì´ ìë ê²½ì°ìë§ ì²ë¦¬ 13091 if (this.cache === 'yes' && isNaN(this.index) === false && this.storageId !== '') { 13092 try { 13093 sessionStorage.setItem(this.storageId, this.index); 13094 } catch (e) { 13095 } 13096 } 13097 }, 13098 13099 getPos: function() { 13100 // return current index position 13101 return this.index; 13102 }, 13103 13104 prev: function(delay, postback) { 13105 // cancel next scheduled automatic transition, if any 13106 this.delay = delay || 0; 13107 this.postback = (postback == undefined) ? true : postback; 13108 13109 clearTimeout(this.interval); 13110 13111 if (this.index) { 13112 this.slide(this.index - 1, this.speed); 13113 } else { 13114 if (this.postback !== false) { 13115 this.slide(this.length - 1, this.speed); //if first slide return to end 13116 } 13117 } 13118 }, 13119 13120 next: function(delay, postback) { 13121 // cancel next scheduled automatic transition, if any 13122 this.delay = delay || 0; 13123 this.postback = (postback == undefined) ? true : postback; 13124 13125 clearTimeout(this.interval); 13126 13127 if (this.index < this.length - 1) { 13128 this.slide(this.index + 1, this.speed); 13129 } else { 13130 if (this.postback !== false) { 13131 this.slide(0, this.speed); //if last slide return to start 13132 } 13133 } 13134 }, 13135 13136 moveTab: function(iPage, delay, oTarget) { 13137 // control current tab action 13138 // 모ë°ì¼ ìíìì¸ìì slideììì ë¤ì ìë³µí¨ 13139 this.index = iPage; 13140 this.delay = delay || 0; 13141 13142 clearTimeout(this.interval); 13143 13144 this.slide(this.index, this.speed); 13145 13146 if (typeof CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_IMAGE !== 'undefined') { 13147 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_IMAGE.setSwipeImage('', true, iPage, oTarget); 13148 } 13149 }, 13150 13151 begin: function() { 13152 var _this = this; 13153 13154 this.interval = (this.delay) ? setTimeout(function() { 13155 _this.next(_this.delay); 13156 }, this.delay) : 0; 13157 }, 13158 13159 stop: function() { 13160 this.delay = 0; 13161 13162 clearTimeout(this.interval); 13163 }, 13164 13165 resume: function() { 13166 this.delay = this.options.auto || 0; 13167 this.begin(); 13168 }, 13169 13170 setLength: function(expand) { 13171 this.length = expand; 13172 }, 13173 13174 handleEvent: function(e) { 13175 switch (e.type) { 13176 case 'touchstart': 13177 this.onTouchStart(e); 13178 break; 13179 case 'touchmove': 13180 this.onTouchMove(e); 13181 break; 13182 case 'touchcancel': 13183 case 'touchend': 13184 this.onTouchEnd(e); 13185 break; 13186 case 'webkitTransitionEnd': 13187 case 'msTransitionEnd': 13188 case 'oTransitionEnd': 13189 case 'transitionend': 13190 this.transitionEnd(e); 13191 break; 13192 case 'resize': 13193 this.setup(); 13194 break; 13195 } 13196 }, 13197 13198 transitionEnd: function(e) { 13199 if (this.delay) { 13200 this.begin(); 13201 } 13202 13203 this.callback(e, this.index, this.slides[this.index], this); 13204 }, 13205 13206 onTouchStart: function(e) { 13207 this.start = { 13208 // get touch coordinates for delta calculations in onTouchMove 13209 pageX: e.touches[0].pageX, 13210 pageY: e.touches[0].pageY, 13211 13212 // set initial timestamp of touch sequence 13213 time: Number(new Date()) 13214 }; 13215 13216 // used for testing first onTouchMove event 13217 this.isScrolling = undefined; 13218 13219 // reset deltaX 13220 this.deltaX = 0; 13221 13222 // set transition time to 0 for 1-to-1 touch movement 13223 this.element.style.MozTransitionDuration = this.element.style.webkitTransitionDuration = 0; 13224 13225 e.stopPropagation(); 13226 }, 13227 13228 onTouchMove: function(e) { 13229 // ensure swiping with one touch and not pinching 13230 if (e.touches.length > 1 || e.scale && e.scale !== 1) { 13231 return; 13232 } 13233 13234 this.deltaX = e.touches[0].pageX - this.start.pageX; 13235 13236 // determine if scrolling test has run - one time test 13237 if (typeof this.isScrolling === 'undefined') { 13238 this.isScrolling = !! (this.isScrolling || Math.abs(this.deltaX) < Math.abs(e.touches[0].pageY - this.start.pageY)); 13239 } 13240 13241 // if user is not trying to scroll vertically 13242 if (! this.isScrolling) { 13243 // prevent native scrolling 13244 e.preventDefault(); 13245 13246 // cancel slideshow 13247 clearTimeout(this.interval); 13248 13249 // increase resistance if first or last slide 13250 this.deltaX = 13251 this.deltaX / 13252 ((! this.index && this.deltaX > 0 // if first slide and sliding left 13253 || this.index == this.length - 1 // or if last slide and sliding right 13254 && this.deltaX < 0 // and if sliding at all 13255 ) ? 13256 (Math.abs(this.deltaX) / this.width + 1) // determine resistance level 13257 : 1); // no resistance if false 13258 13259 // translate immediately 1-to-1 13260 this.element.style.MozTransform = this.element.style.webkitTransform = 'translate3d(' + (this.deltaX - this.index * this.width) + 'px,0,0)'; 13261 13262 e.stopPropagation(); 13263 } 13264 }, 13265 13266 onTouchEnd: function(e) { 13267 // determine if slide attempt triggers next/prev slide 13268 var isValidSlide = 13269 Number(new Date()) - this.start.time < 250 // if slide duration is less than 250ms 13270 && Math.abs(this.deltaX) > 20 // and if slide amt is greater than 20px 13271 || Math.abs(this.deltaX) > this.width/2, // or if slide amt is greater than half the width 13272 13273 // determine if slide attempt is past start and end 13274 isPastBounds = 13275 ! this.index && this.deltaX > 0 // if first slide and slide amt is greater than 0 13276 || this.index == this.length - 1 && this.deltaX < 0; // or if last slide and slide amt is less than 0 13277 13278 // if not scrolling vertically 13279 if (! this.isScrolling) { 13280 // call slide function with slide end value based on isValidSlide and isPastBounds tests 13281 this.slide(this.index + (isValidSlide && ! isPastBounds ? (this.deltaX < 0 ? 1 : -1) : 0), this.speed); 13282 } 13283 13284 e.stopPropagation(); 13285 } 13286}; 13287 13288/** 13289 * 모ë°ì¼ ìí ë보기 모ë
13290 * @package app/Mobile 13291 * @subpackage Front/Disp/Product 13292 * @version 2.2 13293 * 13294 * 13295 * version 2.2 ë³ê²½ì¬í 13296 * 1. cache = yes ì¤ì ì¼ë¡ ë보기 리ì¤í¸ ì ì§ 13297 * 2. ì¬ì©ì html ìì ì 무ì ìê´ìì´ ë¦¬ì¤í 13298 * 3. apiì $review_cnt ì¶ê° 13299 */ 13300var $M = { 13301 /* 13302 * current module name 13303 */ 13304 sModule: 'xans-product-listnormal', 13305 /* 13306 * current module name 13307 */ 13308 sMore: 'xans-product-listmore', 13309 13310 /* 13311 * ë보기 ë²í¼ì ëí ì¤ë³µ ì¤íì ë§ê¸° ìí flag 13312 */ 13313 bLoading: false, 13314 13315 /* 13316 * 모ëë³ë¡ object ê° 13317 */ 13318 oModuleLoading: {}, 13319 13320 /* 13321 * init 13322 */ 13323 init: function() { 13324 if (this.sModule == 'xans-product-listnormal') { 13325 // ì¼ë°ìíì ëí´ ë보기 ê¸°ë¥ ì ì©ì íì´ì§ 모ë ìë ìì 13326 EC$('.xans-product-normalpaging').remove(); 13327 } 13328 }, 13329 /* 13330 * show more 13331 * @param int iActive 모ë key 13332 * @param int iDisplayGroup ì¶ì²/ì ìí ë¶ë¥ 13333 * @param int iCategoryNo ì¹´í ê³ ë¦¬ ë²í¸ 13334 * @param int iCount 주ìë³ì ìí ì 13335 * @param int iSortMethod ì ë ¬ë°©ë² 13336 * @param string sSupplierCode ê³µê¸ì¬ì½ë 13337 * @param bool bInitMore ë보기 ê¸°ë¥ ì´ê¸°í ì¬ë¶ 13338 * @param string íì ìí íì ì¬ë¶ 13339 */ 13340 displayMore: function(iActive, iDisplayGroup, iCategoryNo, iCount, iSortMethod, bCache, sSupplierCode, bInitMore, sSoldoutDisplay) { 13341 13342 if (this.oModuleLoading[iDisplayGroup] === true) { 13343 // ë¡ë© ì¤ìë ì¤í ìí¨ 13344 return; 13345 } 13346 13347 var EC_MORE = (function() { 13348 var sTargetModuleName, 13349 sLiTemplate, 13350 sFirstLiTemplate, 13351 $moreButton, 13352 $currentPageText, 13353 sCurrentPageCookieName, 13354 iRequestPageNum; 13355 13356 /** 13357 * ì¶ê°ë ìí ì ë³´ê° appendë 모ëëª 13358 * @returns {string} 13359 */ 13360 function getTargetModuleName() 13361 { 13362 if (iActive > 0) { 13363 return $M.sModule + '-' + iActive; 13364 } else { 13365 return $M.sModule; 13366 } 13367 } 13368 /** 13369 * LI í í릿ì 리í´í©ëë¤. 13370 * @returns {string} 13371 */ 13372 function getLiTemplate(sPos) 13373 { 13374 var sModuleHtmlForVDOM = CAFE24.FRONT_XANS_TEMPLATE.getTemplateForVDOM(sTargetModuleName); 13375 var oLiObejct = EC$(sModuleHtmlForVDOM).find('ul').first().children('li'); 13376 // ì¬ê³ íë¬ì¤ ì¬ì©ì ì¬ê³ íí© API ë¡ëì¬ë¶ attributeê° ìì 13377 oLiObejct.find('[module="ec-product-wms-stock-manage"]').removeAttr('hasLoaded'); 13378 var $li = EC$.fn[sPos].apply(oLiObejct); 13379 var sLiHtmlForVDOM = EC$('<ul>').append($li).html(); 13380 13381 return CAFE24.FRONT_XANS_TEMPLATE.convertVDomHtmlToHTML(sLiHtmlForVDOM); 13382 } 13383 /** 13384 * "ë보기" ë²í¼ 모ë 13385 * @returns {jQuery} 13386 */ 13387 function getMoreButtonElement() 13388 { 13389 if (iActive > 0) { 13390 return EC$('.' + $M.sMore + '-' + iActive); 13391 } else { 13392 return EC$('.' + $M.sMore); 13393 } 13394 } 13395 /** 13396 * "íì¬íì´ì§ íì" ìì 13397 * @returns {jQuery} 13398 */ 13399 function getCurrentPageTextElement() 13400 { 13401 if (iDisplayGroup > 1) { 13402 return EC$('#more_current_page_' + iDisplayGroup); 13403 } else { 13404 return EC$('#more_current_page'); 13405 } 13406 } 13407 /** 13408 * "ìºì¬ë íì¬íì´ì§" ì¿ í¤ëª 13409 * @returns {string} 13410 */ 13411 function getCachedCurrentPageCookieName() 13412 { 13413 var aCookieName = ['mobile_more_current_page']; 13414 if (iCategoryNo > 0) { 13415 aCookieName.push(iCategoryNo); 13416 } 13417 if (iDisplayGroup > 1) { 13418 aCookieName.push(iDisplayGroup); 13419 } 13420 return aCookieName.join('_'); 13421 } 13422 /** 13423 * ìì²í íì´ì§ ë²í¸ë¥¼ 구íì¬ ë¦¬í´í©ëë¤. 13424 * @return int 13425 * "ë보기 ì ì§ ê¸°ë¥ ì¬ì©" + "ë보기 ì´ê¸°í"ì¸ ê²½ì° íì¬ ì¿ í¤ì ì ì¥ë íì´ì§ ë²í¸ 13426 * ê·¸ ì¸ìë ë¤ìì ê°ì ¸ì¬ íì´ì§ ë²í¸ 13427 */
13428 function getRequestPageNum() 13429 { 13430 if (bCache === true && bInitMore === true) { 13431 // "ë보기 ì ì§ ê¸°ë¥ ì¬ì©" + "ë보기 ì´ê¸°í"ì¸ ê²½ì° 13432 var sCookieCurrentPage = EC$.cookie(sCurrentPageCookieName); 13433 if (isResetPage() === true) { 13434 EC$.cookie(sCurrentPageCookieName, 1, -1); 13435 $currentPageText.text(1); 13436 $moreButton.data('current_page', 1); 13437 return 1; 13438 } 13439 13440 if (sCookieCurrentPage) { 13441 return parseInt(sCookieCurrentPage, 10); 13442 } else { 13443 return 1; 13444 } 13445 13446 } else { 13447 // ê·¸ ì¸ 13448 var iCurrentPage = $moreButton.data('current_page'); 13449 13450 if (iCurrentPage === undefined) { 13451 iCurrentPage = 1; 13452 } 13453 13454 return iCurrentPage + 1; 13455 } 13456 } 13457 /** 13458 * ë¤ì íì´ì§ ìí ì 보를 ê°ì ¸ì¬ ì ìë ajax URLì 리í´í©ëë¤. 13459 * @returns string 13460 */ 13461 function getAjaxUrl() 13462 { 13463 13464 var aParam = { 13465 cate_no: iCategoryNo, 13466 display_group: iDisplayGroup, 13467 supplier_code: sSupplierCode, 13468 sort_method: iSortMethod, 13469 page: iRequestPageNum, 13470 count: iCount, 13471 bInitMore: (bInitMore === true) ? 'T' : 'F', 13472 ec_soldout_display: sSoldoutDisplay 13473 }; 13474 13475 return CAFE24.MOBILE_UTIL.setAjaxParam(aParam, $M.sModule); 13476 } 13477 /** 13478 * ë¤ì íì´ì§ ìí ì 보를 UL Elementì ì¶ê°í´ì¤ëë¤. 13479 * @param array aData ìí ì ë³´ 13480 */ 13481 function appendMoreData(aData) 13482 { 13483 EC_MORE.hideMoreButton(); 13484 13485 var aHtml = []; 13486 var sTemplate = sLiTemplate; 13487 EC$(aData).each(function(iIndex, aVar) { 13488 if (iIndex === 0) { 13489 sTemplate = sFirstLiTemplate; 13490 } else { 13491 sTemplate = sLiTemplate; 13492 } 13493 aHtml.push(CAFE24.FRONT_XANS_INTERPRETER.fetch(sTemplate, aVar)); 13494 }); 13495 var sHtml = aHtml.join(''); 13496 13497 EC$('.' + sTargetModuleName).each(function() { 13498 EC$(this).find('ul').first().append(sHtml); 13499 }); 13500 13501 // ì¬ê³ íí© API ë¡ë 13502 if (typeof CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS !== 'undefined') { 13503 CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.loadStock('ec-product-wms-stock-manage'); 13504 } 13505 13506 $currentPageText.text(iRequestPageNum); 13507 $moreButton.data('current_page', iRequestPageNum); 13508 13509 // GE í매ì í: ëë³´ê¸°ë¡ ì¶ê°ë ìíì í매ì í ë¼ë²¨ ì¬ì ì© (ECQAUNIT-74655) 13510 // appendMoreData ë ë보기 í´ë¦(ajax)/ë보기 ì ì§(storage) ë ê²½ë¡ ê³µíµ ì§ì ì 13511 if (typeof CAPP_ASYNC_METHODS !== 'undefined' 13512 && CAPP_ASYNC_METHODS.hasOwnProperty('GlobaleSellability') === true 13513 && CAPP_ASYNC_METHODS['GlobaleSellability'].isUse() === true) { 13514 CAPP_ASYNC_METHODS['GlobaleSellability'].refresh(); 13515 } 13516 13517 // GE íµí/íì¨: ëë³´ê¸°ë¡ ì¶ê°ë ìí ê°ê²©ì presentment ë¡ ë³í ì¬ì ì© (ECQAUNIT-74657) 13518 if (typeof CAPP_ASYNC_METHODS !== 'undefined' 13519 && CAPP_ASYNC_METHODS.hasOwnProperty('GlobalePrice') === true 13520 && CAPP_ASYNC_METHODS['GlobalePrice'].isUse() === true) { 13521 CAPP_ASYNC_METHODS['GlobalePrice'].refresh(); 13522 } 13523 13524 } 13525 13526 /** 13527 * ìµê·¼ íì´ì§ ì ì¥ 13528 */ 13529 function setCurrentPageCookie() 13530 { 13531 // ìºì ê¸°ë¥ ì¬ì©ì´ë©´ ì¿ í¤ì íì¬ íì´ì§ ì ì¥ 13532 if (bCache === true) { 13533 EC$.cookie(sCurrentPageCookieName, iRequestPageNum, { expires: 1 }); 13534 } 13535 } 13536 13537 /** 13538 * 'ë보기' ë²í¼ì ì¨ê¹ ì²ë¦¬í©ëë¤. 13539 */ 13540 function hideMoreButton() 13541 { 13542 $moreButton.hide(); 13543 } 13544 13545 /** 13546 * 'ë보기' ë²í¼ì ë ¸ì¶ ì²ë¦¬í©ëë¤. 13547 */ 13548 function showMoreButton() 13549 { 13550 $moreButton.show(); 13551 } 13552 13553 /** 13554 * Ajax ìì² ì¬ë¶ë¥¼ 리í´í©ëë¤. 13555 * @return bool trueì´ë©´ ajax ìì², falseì´ë©´ ajax ìì² ìí¨ 13556 */ 13557 function isCallAjax() 13558 { 13559 if (bInitMore === true && iRequestPageNum <= 1) { 13560 // ë보기 ì ì§ ê¸°ë¥ ëìì´ê³ iRequestPageNum ê°ì´ 1ì´íì´ë©´ ìì² ìí¨ 13561 return false;
13562 } 13563 13564 return true; 13565 } 13566 13567 function setMoreAction(data) 13568 { 13569 if (data.rtn_data.end === true) { 13570 EC_MORE.hideMoreButton(); 13571 } 13572 else { 13573 setTimeout(EC_MORE.showMoreButton,300); 13574 } 13575 13576 if (data.is_new_product === true) { 13577 CAFE24.SHOP_FRONT_REVIEW_TALK_REVIEW_COUNT.setReviewTalkCnt(); 13578 } 13579 } 13580 13581 /** 13582 * íì´ì§ ì´ê¸°íì¬ë¶ ë°í 13583 * @returns {boolean} 13584 */ 13585 function isResetPage() 13586 { 13587 return getStorageList(iCategoryNo || 1, iDisplayGroup || 1) === null; 13588 } 13589 13590 /** 13591 * ì¤í 리ì§ì ì ì¥ë ë°ì´í° ë°í 13592 * @param {number} iCategoryNo 13593 * @param {number} iDisplayGroup 13594 * @returns {object} 13595 */ 13596 function getStorageList(iCategoryNo, iDisplayGroup) 13597 { 13598 var sStorageListName = getStorageKey(iCategoryNo, iDisplayGroup); 13599 var oStorageListData = null; 13600 13601 try { 13602 oStorageListData = JSON.parse(sessionStorage.getItem(sStorageListName)); 13603 } catch (e) { 13604 return null; 13605 } 13606 13607 if (oStorageListData === null) { 13608 return null; 13609 } 13610 13611 if (isValidStorage(oStorageListData) === true) { 13612 sessionStorage.removeItem(sStorageListName); 13613 return null; 13614 } 13615 13616 return oStorageListData; 13617 } 13618 13619 /** 13620 * ì¤í ë¦¬ì§ ì í¨ì± ê²ì¬ (ìê°ë§ë£, ì ë ¬ìì ë³ê²½, ëì¼ëª¨ëì´ì§ë§ ë¤ë¥¸ ì¹´ì´í¸ë¥¼ ì¬ì©íëê²½ì°) 13621 * @param {object} oStorageListData 13622 * @returns {boolean} 13623 */ 13624 function isValidStorage(oStorageListData) 13625 { 13626 var iNowTime = Math.floor(new Date().getTime() / 1000); 13627 var iSessionTime = 60 * 5; 13628 13629 return parseInt(oStorageListData['iStorageTime']) + iSessionTime < iNowTime || 13630 oStorageListData['iSortMethod'] !== iSortMethod || 13631 oStorageListData['iCount'] !== iCount; 13632 } 13633 13634 /** 13635 * ë¤ë¥¸ëª¨ë ë°ì´í°ë¥¼ ìì . 13636 * @param {number} iCategoryNo 13637 * @param {number} iDisplayGroup 13638 * @returns {void} 13639 */ 13640 function clearOtherStorage(iCategoryNo, iDisplayGroup) 13641 { 13642 var sStorageListName = getStorageKey(iCategoryNo, iDisplayGroup); 13643 13644 // íì¬ ëª¨ë ë°ì´í° ì¸ ëª¨ë ë°ì´í° ìì 13645 for (var i = 0; i < sessionStorage.length; i++) { 13646 var sKey = sessionStorage.key(i); 13647 if (sKey !== sStorageListName && sKey.indexOf(getStoragePrefixKey()) === 0) { 13648 sessionStorage.removeItem(sKey); 13649 } 13650 } 13651 } 13652 13653 /** 13654 * ì¤í ë¦¬ì§ í¤ ë°í 13655 * @param {number} iCategoryNo 13656 * @param {number} iDisplayGroup 13657 * @returns {string} 13658 */ 13659 function getStorageKey(iCategoryNo, iDisplayGroup) 13660 { 13661 return getStoragePrefixKey() + '_' + iCategoryNo + '_' + iDisplayGroup; 13662 } 13663 13664 /** 13665 * ì¤í ë¦¬ì§ í¤ ì ëì¬ ë°í 13666 * @returns {string} 13667 */ 13668 function getStoragePrefixKey() 13669 { 13670 return 'mobile_more_' + ($M.sModule === 'xans-product-listnormal' ? 'listnormal' : 'listmain'); 13671 } 13672 13673 sTargetModuleName = getTargetModuleName(); 13674 sFirstLiTemplate = getLiTemplate('first'); 13675 sLiTemplate = getLiTemplate('last'); 13676 $moreButton = getMoreButtonElement(); 13677 $currentPageText = getCurrentPageTextElement(); 13678 sCurrentPageCookieName = getCachedCurrentPageCookieName();
13679 iRequestPageNum = getRequestPageNum(); 13680 13681 return { 13682 isCallAjax: isCallAjax, 13683 getAjaxUrl: getAjaxUrl, 13684 appendMoreData: appendMoreData, 13685 hideMoreButton: hideMoreButton, 13686 showMoreButton: showMoreButton, 13687 setMoreAction: setMoreAction, 13688 getStorageList: getStorageList, 13689 getStorageKey: getStorageKey, 13690 setCurrentPageCookie: setCurrentPageCookie, 13691 clearOtherStorage: clearOtherStorage 13692 }; 13693 })(); 13694 13695 // ajax 13696 if (EC_MORE.isCallAjax() === true) { 13697 13698 var aParamData = {}; 13699 if (EC$('#ec-product-searchdata-form').length > 0) { 13700 13701 EC$('#ec-product-searchdata-catenum').val(iCategoryNo); 13702 CAFE24.FRONT_PRODUCT_SEARCH_DATA.setSearchPriceData(); 13703 13704 EC$('#ec-product-searchdata-form .ec-product-searchdata-form:checked').each(function(idx) { 13705 var sValues = decodeURIComponent(EC$(this).val()); 13706 if (EC$(this).val() !== sValues) { 13707 EC$(this).val(encodeURIComponent(sValues)); 13708 } else { 13709 EC$(this).val(encodeURIComponent(EC$(this).val())); 13710 } 13711 }); 13712 13713 EC$('#ec-product-searchdata-form .ec-product-searchdata-form.ec_search_selected').each(function() { 13714 if (EC$(this).prop('type') !== 'checkbox') { 13715 EC$('<input>').attr({type: 'hidden',name: 'search_form[option_data][]',value: encodeURIComponent(EC$(this).attr('sValue'))}).appendTo('#ec-product-searchdata-form'); 13716 } 13717 }); 13718 13719 aParamData = EC$('#ec-product-searchdata-form').serialize(); 13720 13721 13722 } 13723 13724 var iGetCategory = iCategoryNo; 13725 var iGetDisplay = iDisplayGroup; 13726 13727 if (iGetCategory === 0) { 13728 iGetCategory = 1; 13729 } 13730 13731 if (iGetDisplay === 0) { 13732 iGetDisplay = 1; 13733 } 13734 13735 var oStorageListData = EC_MORE.getStorageList(iGetCategory, iGetDisplay); 13736 13737 // íì¬ ìê° Unix Timstamp 13738 var iNowTime = Math.floor(new Date().getTime() / 1000); 13739 13740 if (bInitMore === true && oStorageListData !== null) { 13741 // ë보기를 íë²ì´ë¼ë ëë ê³ , ì¤í ë¦¬ì§ ë°ì´í°ê° ë°íëë¤ë©´ ì¤í ë¦¬ì§ ë°ì´í°ë¡ ì¬ì© 13742 EC_MORE.appendMoreData(oStorageListData.rtn_data.data); 13743 EC_MORE.setMoreAction(oStorageListData); 13744 EC_MORE.setCurrentPageCookie(); 13745 return; 13746 } 13747 13748 EC$.ajax({ 13749 type: 'get',
13750 url: EC_MORE.getAjaxUrl(), 13751 data: aParamData, 13752 dataType: 'json', 13753 success: function(data) { 13754 if (data.rtn_code === '1000') { 13755 EC_MORE.appendMoreData(data.rtn_data.data); 13756 EC_MORE.setMoreAction(data); 13757 13758 if (bInitMore === false) { 13759 data.iStorageTime = iNowTime; 13760 data.iSortMethod = iSortMethod; 13761 data.iCount = iCount; 13762 13763 if (oStorageListData !== null) { 13764 // ì´ê¸° 구ëì´ ìëë©´ì ì¸ì ì¤í 리ì§ì ë°ì´í°ê° ìë ê²½ì°ìë append 13765 data.rtn_data.data = oStorageListData.rtn_data.data.concat(data.rtn_data.data); 13766 } 13767 } 13768 13769 // ìµì¢ ìì±ë ë°ì´í° ì¸ì ì¤í 리ì§ì ì ì¥ 13770 try { 13771 EC_MORE.clearOtherStorage(iGetCategory, iGetDisplay); 13772 sessionStorage.setItem(EC_MORE.getStorageKey(iGetCategory, iGetDisplay), JSON.stringify(data)); 13773 // ì¸ì ì¤í ë¦¬ì§ ì©ëì´ ì´ê³¼ëì§ììê²½ì°ìë§ ìµê·¼ë³¸íì´ì§ ê°±ì . 13774 EC_MORE.setCurrentPageCookie(); 13775 ReferenceCurrencyPrice.init(); 13776 } catch (e) { 13777 } 13778 if (CAPP_ASYNC_METHODS.hasOwnProperty('Soldouticon') === true && CAPP_ASYNC_METHODS["Soldouticon"].isUse() === true) { 13779 CAPP_ASYNC_METHODS["Soldouticon"].execute(); 13780 } 13781 } else { 13782 alert('ìíì ì¶ê°ë¡ ë ë¶ë¬ì¤ë ê³¼ì ì 문ì ê° ë°ìíìµëë¤. ì§ìì ì¼ë¡ ë°ìí ê²½ì° ì´ìììê² ë¬¸ìíì¸ì.'); 13783 13784 EC_MORE.hideMoreButton(); 13785 13786 return false; 13787 } 13788 }, 13789 error: function (xhr, status, error) { 13790 return false; 13791 }, 13792 beforeSend: function () { 13793 $M.oModuleLoading[iDisplayGroup] = true; 13794 }, 13795 complete: function () { 13796 $M.oModuleLoading[iDisplayGroup] = false; 13797 } 13798 }); 13799 } 13800 } , 13801 setDisplayPageMore: function(iActive, iDisplayGroup, iCategoryNo, iCount, iSortMethod, bCache, sSupplierCode, bInitMore, sSoldoutDisplay) { 13802 this.displayMore(iActive, iDisplayGroup, iCategoryNo, iCount, iSortMethod, bCache, sSupplierCode, true, sSoldoutDisplay); 13803 } 13804}; 13805 13806/** 13807 * 모ë°ì¼ ìí ì¤ìì´í 모ë 13808 * @package app/Shop 13809 * @subpackage Front/Disp/Product 13810 * @since 2014. 2. 12. 13811 * @update 2014. 5. 29. 13812 * @version 2.2 13813 * 13814 * 2.2 ê°ì ì¬í 13815 * 1. ë°ì´í° ajax ë¡ë© ì¶ê° 13816 * 2. multi, single íí ì¶ê° 13817 */ 13818var $S = { 13819 /* 13820 * current module name 13821 */ 13822 sModule: 'xans-product-listmain', 13823 13824 /* 13825 * swipe action name 13826 */ 13827 sModuleSwipe: '', 13828 13829 /* 13830 * mode 13831 */ 13832 sMode: 'multi', 13833 13834 /* 13835 * slider 13836 */ 13837 bSlider: false, 13838 13839 /* 13840 * swipeable 13841 */ 13842 sSwipeable: 'yes', 13843 13844 /* 13845 * sParam 13846 */ 13847 sParam: '', 13848 13849 /* 13850 * grid 13851 */ 13852 sGrid: 'grid3', 13853 13854 /* 13855 * grid array 13856 */ 13857 aGrid: {'grid2': 2, 'grid3': 3, 'grid4': 4, 'grid5': 5}, 13858 13859 /* 13860 * start slide 13861 */ 13862 iStart: 0, 13863 13864 /* 13865 * page 13866 */ 13867 iPage: 1, 13868 13869 /* 13870 * page block 13871 */ 13872 iPageBlock: 3, 13873 13874 /* 13875 * line 13876 */ 13877 iLine: 1, 13878 13879 /* 13880 * limit circle 13881 */ 13882 iLimit: 9, 13883 13884 /* 13885 * active div 13886 */ 13887 iActive: 0, 13888 13889 /* 13890 * save li element 13891 */ 13892 aElement: [], 13893 13894 /* 13895 * save circle element 13896 */ 13897 aButton: [], 13898 13899 /* 13900 * product class 13901 */ 13902 $product: null, 13903 13904 /* 13905 * product ul 13906 */ 13907 $productModule: null, 13908 13909 /* 13910 * product list li 13911 */ 13912 $productList: null, 13913 13914 /* 13915 * ajax loading 13916 */ 13917 bAjax: true, 13918 13919 /* 13920 * generate dom 13921 */ 13922 bGenerate: false, 13923 13924 /* 13925 * ajax count 13926 */ 13927 iAjax: 0, 13928 13929 /* 13930 * auto slide interval 13931 */ 13932 iAutoSlideInterval: 0, 13933 13934 /* 13935 * paging ui 13936 */ 13937 sPagingType: 'circle', 13938 13939 iProductTotal: 0, 13940 13941 /* 13942 * cache ì¬ì©ì¬ë¶ 13943 */ 13944 sCache: 'no', 13945 13946 /* 13947 * init 13948 */ 13949 init: function() { 13950 // set param 13951 this.setParam(); 13952 13953 // set obejct 13954 this.setObject(); 13955 13956 // set block 13957 this.setBlock(); 13958 13959 // validate 13960 if (this.validate() === false) return; 13961 13962 // generate 13963 this.generate(); 13964 13965 // load swipe 13966 this.load(); 13967 }, 13968 13969 /* 13970 * set param 13971 */ 13972 setParam: function() { 13973 try 13974 { 13975 this.sModuleSwipe = this.sModule.replace(/-/g, "_"); 13976 this.iAjax = oMobileSliderData.iSliderLimit; 13977 } 13978 catch (e) { } 13979 }, 13980 13981 /* 13982 * set block 13983 */ 13984 setBlock: function() { 13985 // set block num 13986 this.iPageBlock = (this.sMode == 'multi') ? this.iLine * this.aGrid[this.sGrid] : 1; 13987 }, 13988 13989 /* 13990 * set obejct 13991 */ 13992 setObject: function() { 13993 try 13994 { 13995 // current module class 13996 this.sActiveProduct = this.iActive > 0 ? this.sModule + '-'+this.iActive : this.sModule; 13997 13998 // div 13999 this.$product = $('.' + this.sActiveProduct); 14000 14001 // div > ul 14002 this.$productModule = this.$product.find('ul').first(); 14003 this.$productModule.css('webkit-backface-visibility', 'hidden'); 14004 14005 // div > ul > li > ul > li 14006 this.$productList = this.$productModule.find('>li'); 14007 } 14008 catch (e) { } 14009 }, 14010 14011 /* 14012 * validate 14013 */ 14014 validate: function() { 14015 // not use swipe 14016 if (this.sSwipeable != 'yes') return false;
14017 14018 // empty ul 14019 if (this.$productModule.length < 1) return false; 14020 14021 // empty li 14022 if (this.$productList.length < 1) return false; 14023 14024 // mobilemaincategory-slider exception 14025 if (this.$productModule.find('.afterNone').length > 0) return true; 14026 14027 // no condition swipe 14028 if (this.$productList.length <= this.iPageBlock) return false; 14029 }, 14030 14031 /* 14032 * ganerate swipe single dom 14033 */ 14034 generate: function() { 14035 if (this.sMode == 'single') { this.generateSingle(); } 14036 else { this.generateMulti(); } 14037 }, 14038 14039 /* 14040 * prepare for element 14041 */ 14042 prepare: function() { 14043 var $prepare = { 14044 /* 14045 * reset element and circle 14046 */ 14047 reset: function() { 14048 $S.aElement = []; 14049 $S.aButton = []; 14050 }, 14051 14052 /* 14053 * set target id 14054 */ 14055 setId: function() { 14056 $S.$product.attr('id', $S.sModule + '-slider-' + $S.iActive); 14057 } 14058 }; 14059 $prepare.reset(); 14060 $prepare.setId(); 14061 }, 14062 14063 /* 14064 * ganerate swipe single dom 14065 */ 14066 generateSingle: function() { 14067 // prepare 14068 this.prepare(); 14069 14070 // make li > ul > li 14071 for (var i=0; i<this.$productList.length; i++) { 14072 this.makeButton(i); 14073 } 14074 14075 // call pagenate 14076 this.makePagenate(); 14077 }, 14078 14079 14080 /* 14081 * reset grid 14082 */ 14083 resetGrid: function() { 14084 for (var sKey in this.aGrid) { 14085 if (this.$productModule.hasClass(sKey) === true) { this.$productModule.empty().removeClass(sKey); } 14086 } 14087 }, 14088 14089 /* 14090 * ganerate swipe multi dom 14091 */ 14092 generateMulti: function() { 14093 // prepare 14094 this.prepare(); 14095 14096 if (this.bGenerate === false) return; 14097 14098 // save li 14099 this.$productList.each(function() { $S.aElement.push($(this).clone(true)); }); 14100 14101 // delete li and grid2, gird3, grid4 14102 this.resetGrid(); 14103 14104 this.iProductTotal = this.aElement.length; 14105 this.iTotalPage = Math.ceil(this.iProductTotal / this.iPageBlock); 14106 14107 // make li > ul > li 14108 for (var i=0, k=1, j=0; i<this.iProductTotal; i++, k++) 14109 { 14110 // templete for li > ul 14111 var $template = (j == 0) ? $("<li>", { html: $("<ul>", {'class': this.sGrid}) }) : $('<li>', { html: $("<ul>", {'class': this.sGrid}), css: {'display': 'none'} }); 14112 14113 // add li > ul 14114 if (k == 1) 14115 { 14116 this.$productModule.append($template); 14117 // < íì¬íì´ì§ / ì´íì´ì§ > 14118 if (this.sPagingType !== 'number') { 14119 this.makeButton(j); 14120 } 14121 } 14122 14123 // add li > ul > li 14124 this.$product.children('ul').children('li').eq(j).children('ul').append(this.aElement[i]); 14125 14126 // see block 14127 if (k == this.iPageBlock) 14128 { 14129 k = 0; 14130 j++; 14131 } 14132 } 14133 14134 if (this.sPagingType === 'number') { 14135 this.makeNumber(); 14136 } 14137 // not necessary pagenate 14138 if (i < (parseInt(this.iPageBlock) + 1)) return; 14139 14140 // call pagenate 14141 this.makePagenate(); 14142 }, 14143 14144 makeButton: function(iCnt) { 14145 // ECQAINT-14112 ë¡¤ë§ ë° ëë²ë§ íì ì '모ë°ì¼ íê²½ì¤ì 'ì 기본 ì¬ìì ë°ë¼ ìµë ê°¯ì 5ê°ë¡ ì¤ì 14146 if (this.sPagingType == 'rolling' || this.sPagingType == 'numbering') { 14147 this.iLimit = 5; 14148 } else if (this.sPagingType !== 'circle') { 14149 this.iLimit = 4; 14150 } 14151 14152 var iNum = iCnt + 1, 14153 sSelected = (iCnt == 0) ? 'selected' : '', 14154 iPage = Math.ceil(iNum / this.iLimit), 14155 sLimitStyle = (iNum > this.iLimit) ? 'style="display:none"' : '', 14156 sName = this.sActiveProduct + '_page_'+iPage+'_'+iNum; 14157 14158 if (this.sPagingType === 'fix') { 14159 var sSelected = (iCnt == 0) ? 'this' : 'other'; 14160 this.divPaginateName = 'typeList'; 14161 this.aButton.push('<li name="'+sName+'" ' + sLimitStyle +'><a class="' + sSelected + '" onclick="$' + this.sModuleSwipe + '_slider_' + this.iActive + '.moveTab(' + iCnt + ', ' + this.iAutoSlideInterval +');return false;">' + iNum +'</a></li>'); 14162 } else if (this.sPagingType === 'numbering') { 14163 this.divPaginateName = 'typeNumber'; 14164 } else if (this.sPagingType === 'rolling') { 14165 this.divPaginateName = 'typeRoll'; 14166 this.aButton.push('<li class="' + sSelected + '" name="' + sName + '"><a href="#none" onclick="$' + this.sModuleSwipe + '_slider_' + this.iActive + '.moveTab(' + iCnt + ', ' + this.iAutoSlideInterval +');return false;">' + iNum + '</a></li>'); 14167 } else { 14168 // circle 14169 this.divPaginateName = 'typeSwipe'; 14170 this.aButton.push('<button name="'+sName+'" type="button" ' + sLimitStyle +' class="circle ' + sSelected + '" onclick="$' + this.sModuleSwipe + '_slider_' + this.iActive + '.moveTab(' + iCnt + ', ' + this.iAutoSlideInterval +', $(this));return false;"><span>' + iNum +'ë²ì§¸ 리ì¤í¸</span></button>'); 14171 } 14172 }, 14173 14174 /* 14175 * make fix number 14176 */ 14177 makeNumber: function() { 14178 this.divPaginateName = 'typeTotal'; 14179 sName = this.sModule+'-'+this.iActive+'_page'; 14180 this.aButton.push('<span name="' + sName + '" class="page"><strong>1</strong> / <span>' + this.iTotalPage + '</span></span>'); 14181 }, 14182 14183 /* 14184 * make pagenation 14185 */ 14186 makePagenate: function() {
14187 var sSwipeId = this.sModule + '-swipe-button-' + this.iActive; 14188 var sPaginateStyle = ''; 14189 var aBtn = []; 14190 if (this.sPagingType === 'fix') { 14191 aBtn.push('<p class="prev" onclick="$' + this.sModuleSwipe + '_slider_' + this.iActive + '.prev();return false;"><a href="#none"><span>ì´ì íì´ì§</span></a></p>'); 14192 aBtn.push('<ol id='+ sSwipeId +'>'+this.aButton.join('')+'</ol>'); 14193 aBtn.push('<p class="next" onclick="$' + this.sModuleSwipe + '_slider_' + this.iActive + '.next();return false;"><a href="#none"><span>ë¤ì íì´ì§</span></a></p>'); 14194 } else if (this.sPagingType === 'numbering') { 14195 aBtn.push('<p><strong>1</strong> / <span>' + this.$productList.length + '</span></p>'); 14196 } else if (this.sPagingType === 'rolling') { 14197 sPaginateStyle = 'position:static;'; 14198 aBtn.push('<ol id='+ sSwipeId +' class="grid' + this.$productList.length + '">'+this.aButton.join('')+'</ol>'); 14199 } else if (this.sPagingType === 'number') { 14200 aBtn.push('<p class="prev" onclick="$' + this.sModuleSwipe + '_slider_' + this.iActive + '.prev();return false;"><a href="#none"><span>ì´ì íì´ì§</span></a></p>'); 14201 aBtn.push(this.aButton.join('')); 14202 aBtn.push('<p class="next" onclick="$' + this.sModuleSwipe + '_slider_' + this.iActive + '.next();return false;"><a href="#none"><span>ë¤ì íì´ì§</span></a></p>'); 14203 } else { 14204 aBtn.push('<button type="button" class="prev" onclick="$' + this.sModuleSwipe + '_slider_' + this.iActive + '.prev();return false;"><span>ì´ì 리ì¤í¸</span></button>'); 14205 aBtn.push('<span id="' + sSwipeId + '">' + this.aButton.join('') +'</span>'); 14206 aBtn.push('<button type="button" class="next" onclick="$' + this.sModuleSwipe + '_slider_' + this.iActive + '.next();return false;"><span>ë¤ì 리ì¤í¸</span></button>'); 14207 } 14208 14209 var sPaginateForm = '<div class="paginate ec-base-paginate '+this.divPaginateName+'" style="' + sPaginateStyle + '">' + aBtn.join('') + '</div>'; 14210 14211 if ($S.bSlider === false) { this.$product.append(sPaginateForm); } 14212 }, 14213 14214 /* 14215 * call ajax 14216 */ 14217 callAjax: function() { 14218 this.iPage++; 14219 this.setAjaxParam(); 14220 14221 var $ajaxLoadContainer = { 14222 load: function() { 14223 var $load = '<div class="loading"><img src="//img.echosting.cafe24.com/design/skin/mobile/img_loading.gif" alt="" /></div>', 14224 $dimmed = '<div class="dimmed"></div>'; 14225 $('body').append($load + $dimmed); 14226 }, 14227 remove: function() { 14228 $('body').find('div.loading, div.dimmed').remove(); 14229 } 14230 }; 14231 14232 $.ajax({ 14233 type: "get", 14234 url: this.sParam, 14235 dataType: "json", 14236 success: function(data) { 14237 try { 14238 if (data.rtn_code == '1000') { 14239 $(data.rtn_data.data).each(function(index, node) { 14240 // new index 14241 var newElementIndex = $S.iAjax + index; 14242 // append new element 14243 $S.$productModule.append(CAFE24.MOBILE_UTIL.convertNode(node)); 14244 // set onerror img 14245 CAFE24.MOBILE_UTIL.setDefaultImage(); 14246 // element setting 14247 $S.$product.find('li').eq(newElementIndex).css({ 14248 width: $(window).width() + 'px', 14249 display: 'table-cell', 14250 'vertical-align': 'top' 14251 }).bind('click', function() { globalPictorlControl($S.$product); }); 14252 }); 14253 14254 var len = data.rtn_data.data.length, currentSlider = '$' + $S.sModuleSwipe + '_slider_' + $S.iActive; 14255 14256 // set swipe scale 14257 $S.$productModule.width($S.$productModule.width() + ($(window).width() * len)); 14258 // add ajax condition 14259 $S.iAjax += len; 14260 // stop ajax control 14261 if (len < oMobileSliderData.iSliderLimit) { $S.bAjax = false; } 14262 } else { 14263 alert('ìíì ì¶ê°ë¡ ë ë¶ë¬ì¤ë ê³¼ì ì 문ì ê° ë°ìíìµëë¤. ì§ìì ì¼ë¡ ë°ìí ê²½ì° ì´ìììê² ë¬¸ìíì¸ì.'); 14264 return false;
14265 } 14266 } catch (e) { 14267 $ajaxLoadContainer.remove(); 14268 } 14269 }, 14270 error: function(xhr,status,error) { 14271 //alert('ë¤í¬ìí¬ë ìíAPIì°ëì 문ì ê° ììµëë¤. ì§ìì ì¼ë¡ ë°ìí ê²½ì° ì´ìììê² ë¬¸ìíì¸ì.'); 14272 return false; 14273 }, 14274 beforeSend: function() { 14275 $ajaxLoadContainer.load(); 14276 }, 14277 complete: function() { 14278 $ajaxLoadContainer.remove(); 14279 // set swipe module length && excute next slider 14280 var currentSlider = '$' + $S.sModuleSwipe + '_slider_' + $S.iActive; 14281 eval(currentSlider + '.setLength(' + $S.iAjax + ');'); 14282 } 14283 }); 14284 }, 14285 14286 /* 14287 * set Param 14288 */ 14289 setAjaxParam: function() { 14290 var aParam = []; 14291 14292 aParam['cate_no'] = oMobileSliderData.iCategoryNo; 14293 aParam['page'] = this.iPage; 14294 aParam['count'] = oMobileSliderData.iSliderLimit; 14295 14296 this.sParam = CAFE24.MOBILE_UTIL.setAjaxParam(aParam, this.sModule); 14297 }, 14298 14299 /* 14300 * load swipe js 14301 */ 14302 load: function() { 14303 try 14304 { 14305 var aSwipeVars = [], 14306 $swipe = document.getElementById('' + this.sModule + '-slider-' + this.iActive + ''), 14307 $now = this.$product.find('div.swipePage').find('span.now'); 14308 14309 if (this.sPagingType !== 'circle') { 14310 this.$product.find('.typeSwipe .prev, .typeSwipe .next').show(); 14311 } 14312 14313 // ìíì ê³ ì í ê°(ìí ë²í¸ ë° ì¹´í ê³ ë¦¬ ë²í¸ ë±)ì ì§ì 14314 // ì´ë ê² íì§ ìì¼ë©´ ì¤ìì´í 모ëì íëë¡ ì¸ìíì¬ ì²ë¦¬ë기 ë문 14315 var sProductInfo = ''; 14316 14317 // try-catchë¡ ëª¨ëì ìí ì 보를 ë¶ë¬ìì ì²ë¦¬íê³ , ì ë³´ê° ìì¼ë©´ ì²ë¦¬íì§ ìì 14318 try { 14319 sProductInfo = this.$productModule.find('li').first().attr('data-param').replace(/\?/gi, '').replace(/\&\=/gi, '_'); 14320 } catch (e) { 14321 } 14322 14323 aSwipeVars.push('$' + this.sModuleSwipe + '_slider_' + this.iActive + ' = new SwipeClient($swipe, {'); 14324 aSwipeVars.push(' startSlide: ' + this.iStart + ','); 14325 aSwipeVars.push(' auto: ' + this.iAutoSlideInterval + ','); 14326 aSwipeVars.push(' cache: \'' + this.sCache + '\','); 14327 aSwipeVars.push(' elementId: \'' + this.sModuleSwipe + '_slider_' + sProductInfo + '\','); 14328 aSwipeVars.push(' callback: function(e, pos, ele, obj) {'); 14329 aSwipeVars.push(' if (obj.container.id == "xans-layout-mobilemaincategory-slider-0") { globalCategorySetUi(mode = "init", pos); }'); 14330 aSwipeVars.push(' try { if (globalPictorialLoad === true) { globalPictorialSetUi($S.$product, pos) } } catch(e) {}'); 14331 aSwipeVars.push(' var iSelectedPos = pos + 1;'); 14332 aSwipeVars.push(' if ($S.bSlider === true) { $now.text(iSelectedPos); }'); 14333 aSwipeVars.push(this.getSwipeButtonDisplay()); 14334 aSwipeVars.push(' }'); 14335 aSwipeVars.push('});'); 14336 14337 eval(aSwipeVars.join('')); 14338 } 14339 catch (e) { } 14340 }, 14341 14342 getSwipeButtonDisplay: function() { 14343 var sSelected = 'selected'; 14344 var sChildSelector = ''; 14345 if (this.sPagingType === 'fix') { 14346 sSelected = 'this'; 14347 sChildSelector = ' > a'; 14348 } 14349 14350 var sSwipeVars = ''; 14351 if (this.sPagingType === 'number') { 14352 sSwipeVars = ' $("[name^=\'' + this.sActiveProduct + '_page\'] > strong").text(iSelectedPos);'; 14353 } else if (this.sPagingType === 'numbering') { 14354 sSwipeVars = '$(".' + this.divPaginateName + ' > p > strong").text(iSelectedPos);'; 14355 } else if (this.sPagingType === 'rolling') { 14356 sSwipeVars = ' $("[name^=\'' + this.sActiveProduct + '_page\']").removeClass(\'' + sSelected + '\');'; 14357 sSwipeVars += ' $("[name=\'' + this.sActiveProduct + '_page_1_"+iSelectedPos+"\']").addClass(\'' + sSelected + '\');'; 14358 } else { 14359 sSwipeVars = ' var iPage = pos === ' + this.iTotalPage + ' ? Math.ceil(' + this.iTotalPage + ' / $S.iLimit) : Math.ceil(iSelectedPos / $S.iLimit);'; 14360 14361 /* 14362 ECHOSTING-251668 show/hide ì¡°ê±´ ìì 14363 14364 sSwipeVars += ' if ((pos % $S.iLimit === 0) || (iSelectedPos % $S.iLimit === 0 || iSelectedPos === ' + this.iTotalPage + ')) {'; 14365 sSwipeVars += ' $("[name^=\'' + this.sActiveProduct + '_page\']").hide();'; 14366 sSwipeVars += ' $("[name^=\'' + this.sActiveProduct + '_page_"+iPage+"\']").show();'; 14367 sSwipeVars += ' }'; 14368 sSwipeVars += ' $("[name^=\'' + this.sActiveProduct + '_page\']' + sChildSelector + '").removeClass(\'' + sSelected + '\');'; 14369 sSwipeVars += ' $("[name=\'' + this.sActiveProduct + '_page_"+iPage+"_"+iSelectedPos+"\']' + sChildSelector + '").addClass(\'' + sSelected + '\');'; 14370 */ 14371 14372 sSwipeVars += ' $("[name^=\'' + this.sActiveProduct + '_page\']").hide();'; 14373 sSwipeVars += ' $("[name^=\'' + this.sActiveProduct + '_page_"+iPage+"\']").show();'; 14374 sSwipeVars += ' $("[name^=\'' + this.sActiveProduct + '_page\']' + sChildSelector + '").removeClass(\'' + sSelected + '\');'; 14375 sSwipeVars += ' $("[name=\'' + this.sActiveProduct + '_page_"+iPage+"_"+iSelectedPos+"\']' + sChildSelector + '").addClass(\'' + sSelected + '\');'; 14376 } 14377 return sSwipeVars; 14378 } 14379 14380}; 14381 14382EC$(function() { 14383 sAttribute = 'ec-data-src'; 14384 if (EC$('img['+sAttribute+']').length > 0) { 14385 CAFE24.lazyload(); 14386 } 14387}); 14388 14389/** 14390 * IntersectionObserverì MutationObserver를 ì´ì©í Lazyload 14391 * @constructor 14392 */ 14393CAFE24.lazyload = function() { 14394 var oConfig = { 14395 rootMargin: '0px 0px 50px 0px', 14396 threshold: 0 14397 }; 14398 14399 var placeholder = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII='; 14400 EC$('img['+sAttribute+']').attr('src', placeholder); 14401 14402 /** 14403 * IntersectionObserverì ê°ì²´ë¥¼ ë±ë¡íë ë©ìë 14404 * @type {IntersectionObserver|*} 14405 */ 14406 var oIntersection = new IntersectionObserver(function (oEntry, self) { 14407 var iEntryLength = oEntry.length; 14408 for (var i = 0; i < iEntryLength; i++) { 14409 if (oEntry[i].target.tagName !== 'IMG') { 14410 continue; 14411 } 14412 if (oEntry[i].target.hasAttribute(sAttribute) === false) { 14413 continue; 14414 } 14415 oEntry[i].target.src = placeholder; 14416 if (oEntry[i].isIntersecting) { 14417 preloadImage(oEntry[i].target); 14418 self.unobserve(oEntry[i].target); 14419 } 14420 } 14421 // ìí목ë¡ì ë¸ëí ë ì´ì´ììì´ ì¡´ì¬í ëë§ ì´ë¯¸ì§ ë¡ë© ì´í í¸ì¶ 14422 if (typeof resizeContent === 'function') { 14423 resizeContent(); 14424 } 14425 }, oConfig); 14426 14427 /** 14428 * MutationObserverì ê°ì²´ë¥¼ ë±ë¡íë ë©ìë 14429 * @type {MutationObserver} 14430 */ 14431 var oMutation = new MutationObserver(function (oMutationElement) { 14432 var iMutationLength = oMutationElement.length; 14433 for (var i = 0; i < iMutationLength; i++) { 14434 if (oMutationElement[i].addedNodes.length > 0) {
14435 oMutationElement[i].addedNodes.forEach(function (currnetValue) { 14436 registIntersection(currnetValue); 14437 }); 14438 } 14439 } 14440 }); 14441 14442 /** 14443 * Mutationìì ê²ì¶ë ê°ì²´ë¥¼ Intersectionì¼ë¡ ë±ë¡íë ë©ìë 14444 * @param oParentElement 14445 */ 14446 function registIntersection(oParentElement) { 14447 if (typeof oParentElement.querySelectorAll !== 'function') { 14448 return; 14449 } 14450 var oImage = oParentElement.querySelectorAll('img['+sAttribute+']'); 14451 for (var i=0; i < oImage.length; i++) { 14452 oIntersection.observe(oImage[i]); 14453 } 14454 } 14455 14456 /** 14457 * ì¤ì ì´ë¯¸ì§ êµì²´ ë©ìë 14458 * @param img 14459 */ 14460 function preloadImage(img) { 14461 var src = img.getAttribute(sAttribute); 14462 if (!src) return; 14463 img.src = src; 14464 img.removeAttribute(sAttribute); 14465 } 14466 14467 var oNodeList = document.body.childNodes; 14468 var oMutationConfig = { 14469 childList: true, 14470 subtree: true 14471 }; 14472 var iNodeListLength = oNodeList.length; 14473 if (iNodeListLength === 0) { 14474 return; 14475 } 14476 for (var i = 0; i < iNodeListLength; i++) { 14477 registIntersection(oNodeList[i]); 14478 oMutation.observe(oNodeList[i], oMutationConfig); 14479 } 14480}; 14481 14482var EC_lazyload = CAFE24.lazyload; 14483 14484/*! 14485 * Shim for MutationObserver interface 14486 * Author: Graeme Yeates (github.com/megawac) 14487 * Repository: https://github.com/megawac/MutationObserver.js 14488 * License: WTFPL V2, 2004 (wtfpl.net). 14489 * Though credit and staring the repo will make me feel pretty, you can modify and redistribute as you please. 14490 * Attempts to follow spec (https://www.w3.org/TR/dom/#mutation-observers) as closely as possible for native javascript 14491 * See https://github.com/WebKit/webkit/blob/master/Source/WebCore/dom/MutationObserver.cpp for current webkit source c++ implementation 14492 */ 14493 14494/** 14495 * prefix bugs: 14496 - https://bugs.webkit.org/show_bug.cgi?id=85161 14497 - https://bugzilla.mozilla.org/show_bug.cgi?id=749920 14498 * Don't use WebKitMutationObserver as Safari (6.0.5-6.1) use a buggy implementation 14499 */ 14500window.MutationObserver = window.MutationObserver || (function(undefined) { 14501 "use strict"; 14502 /** 14503 * @param {function(Array.<MutationRecord>, MutationObserver)} listener 14504 * @constructor 14505 */ 14506 function MutationObserver(listener) { 14507 /** 14508 * @type {Array.<Object>} 14509 * @private 14510 */ 14511 this._watched = []; 14512 /** @private */ 14513 this._listener = listener; 14514 } 14515 14516 /** 14517 * Start a recursive timeout function to check all items being observed for mutations 14518 * @type {MutationObserver} observer 14519 * @private 14520 */ 14521 function startMutationChecker(observer) { 14522 (function check() { 14523 var mutations = observer.takeRecords(); 14524 14525 if (mutations.length) { // fire away 14526 // calling the listener with context is not spec but currently consistent with FF and WebKit 14527 observer._listener(mutations, observer); 14528 } 14529 /** @private */ 14530 observer._timeout = setTimeout(check, MutationObserver._period); 14531 })(); 14532 } 14533 14534 /** 14535 * Period to check for mutations (~32 times/sec) 14536 * @type {number} 14537 * @expose 14538 */ 14539 MutationObserver._period = 30; 14540 14541 /** 14542 * Exposed API 14543 * @expose 14544 * @final 14545 */ 14546 MutationObserver.prototype = { 14547 /** 14548 * see https://dom.spec.whatwg.org/#dom-mutationobserver-observe 14549 * not going to throw here but going to follow the current spec config sets 14550 * @param {Node|null} $target 14551 * @param {Object|null} config : MutationObserverInit configuration dictionary 14552 * @expose 14553 * @return undefined 14554 */ 14555 observe: function($target, config) { 14556 /** 14557 * Using slightly different names so closure can go ham
vendor: 3,935 bytes, lines 14558-14665
14558 * @type {!Object} : A custom mutation config 14559 */ 14560 var settings = { 14561 attr: !! (config.attributes || config.attributeFilter || config.attributeOldValue), 14562 14563 // some browsers enforce that subtree must be set with childList, attributes or characterData. 14564 // We don't care as spec doesn't specify this rule. 14565 kids: !! config.childList, 14566 descendents: !! config.subtree, 14567 charData: !! (config.characterData || config.characterDataOldValue) 14568 }; 14569 14570 var watched = this._watched; 14571 14572 // remove already observed target element from pool 14573 for (var i = 0; i < watched.length; i++) { 14574 if (watched[i].tar === $target) watched.splice(i, 1); 14575 } 14576 14577 if (config.attributeFilter) { 14578 /** 14579 * converts to a {key: true} dict for faster lookup 14580 * @type {Object.<String,Boolean>} 14581 */ 14582 settings.afilter = reduce(config.attributeFilter, function(a, b) { 14583 a[b] = true; 14584 return a; 14585 }, {}); 14586 } 14587 14588 watched.push({ 14589 tar: $target, 14590 fn: createMutationSearcher($target, settings) 14591 }); 14592 14593 // reconnect if not connected 14594 if (!this._timeout) { 14595 startMutationChecker(this); 14596 } 14597 }, 14598 14599 /** 14600 * Finds mutations since last check and empties the "record queue" i.e. mutations will only be found once 14601 * @expose 14602 * @return {Array.<MutationRecord>} 14603 */ 14604 takeRecords: function() { 14605 var mutations = []; 14606 var watched = this._watched; 14607 14608 for (var i = 0; i < watched.length; i++) { 14609 watched[i].fn(mutations); 14610 } 14611 14612 return mutations; 14613 }, 14614 14615 /** 14616 * @expose 14617 * @return undefined 14618 */ 14619 disconnect: function() { 14620 this._watched = []; // clear the stuff being observed 14621 clearTimeout(this._timeout); // ready for garbage collection 14622 /** @private */ 14623 this._timeout = null; 14624 } 14625 }; 14626 14627 /** 14628 * Simple MutationRecord pseudoclass. No longer exposing as its not fully compliant 14629 * @param {Object} data 14630 * @return {Object} a MutationRecord 14631 */ 14632 function MutationRecord(data) { 14633 var settings = { // technically these should be on proto so hasOwnProperty will return false for non explicitly props 14634 type: null, 14635 target: null, 14636 addedNodes: [], 14637 removedNodes: [], 14638 previousSibling: null, 14639 nextSibling: null, 14640 attributeName: null, 14641 attributeNamespace: null, 14642 oldValue: null 14643 }; 14644 for (var prop in data) { 14645 if (has(settings, prop) && data[prop] !== undefined) settings[prop] = data[prop]; 14646 } 14647 return settings; 14648 } 14649 14650 /** 14651 * Creates a func to find all the mutations 14652 * 14653 * @param {Node} $target 14654 * @param {!Object} config : A custom mutation config 14655 */ 14656 function createMutationSearcher($target, config) { 14657 /** type {Elestuct} */ 14658 var $oldstate = clone($target, config); // create the cloned datastructure 14659 14660 /** 14661 * consumes array of mutations we can push to 14662 * 14663 * @param {Array.<MutationRecord>} mutations 14664 */ 14665 return function
vendor: 16,374 bytes, lines 14665-14993
14665(mutations) { 14666 var olen = mutations.length, dirty; 14667 14668 if (config.charData && $target.nodeType === 3 && $target.nodeValue !== $oldstate.charData) { 14669 mutations.push(new MutationRecord({ 14670 type: "characterData", 14671 target: $target, 14672 oldValue: $oldstate.charData 14673 })); 14674 } 14675 14676 // Alright we check base level changes in attributes... easy 14677 if (config.attr && $oldstate.attr) { 14678 findAttributeMutations(mutations, $target, $oldstate.attr, config.afilter); 14679 } 14680 14681 // check childlist or subtree for mutations 14682 if (config.kids || config.descendents) { 14683 dirty = searchSubtree(mutations, $target, $oldstate, config); 14684 } 14685 14686 // reclone data structure if theres changes 14687 if (dirty || mutations.length !== olen) { 14688 /** type {Elestuct} */ 14689 $oldstate = clone($target, config); 14690 } 14691 }; 14692 } 14693 14694 /* attributes + attributeFilter helpers */ 14695 14696 // Check if the environment has the attribute bug (#4) which cause 14697 // element.attributes.style to always be null. 14698 var hasAttributeBug = document.createElement("i"); 14699 hasAttributeBug.style.top = 0; 14700 hasAttributeBug = hasAttributeBug.attributes.style.value != "null"; 14701 14702 /** 14703 * Gets an attribute value in an environment without attribute bug 14704 * 14705 * @param {Node} el 14706 * @param {Attr} attr 14707 * @return {String} an attribute value 14708 */ 14709 function getAttributeSimple(el, attr) { 14710 // There is a potential for a warning to occur here if the attribute is a 14711 // custom attribute in IE<9 with a custom .toString() method. This is 14712 // just a warning and doesn't affect execution (see #21) 14713 return attr.value; 14714 } 14715 14716 /** 14717 * Gets an attribute value with special hack for style attribute (see #4) 14718 * 14719 * @param {Node} el 14720 * @param {Attr} attr 14721 * @return {String} an attribute value 14722 */ 14723 function getAttributeWithStyleHack(el, attr) { 14724 // As with getAttributeSimple there is a potential warning for custom attribtues in IE7. 14725 return attr.name !== "style" ? attr.value : el.style.cssText; 14726 } 14727 14728 var getAttributeValue = hasAttributeBug ? getAttributeSimple : getAttributeWithStyleHack; 14729 14730 /** 14731 * fast helper to check to see if attributes object of an element has changed 14732 * doesnt handle the textnode case 14733 * 14734 * @param {Array.<MutationRecord>} mutations 14735 * @param {Node} $target 14736 * @param {Object.<string, string>} $oldstate : Custom attribute clone data structure from clone 14737 * @param {Object} filter 14738 */ 14739 function findAttributeMutations(mutations, $target, $oldstate, filter) { 14740 var checked = {}; 14741 var attributes = $target.attributes; 14742 var attr; 14743 var name; 14744 var i = attributes.length; 14745 while (i--) { 14746 attr = attributes[i]; 14747 name = attr.name; 14748 if (!filter || has(filter, name)) { 14749 if (getAttributeValue($target, attr) !== $oldstate[name]) { 14750 // The pushing is redundant but gzips very nicely 14751 mutations.push(MutationRecord({ 14752 type: "attributes", 14753 target: $target, 14754 attributeName: name, 14755 oldValue: $oldstate[name], 14756 attributeNamespace: attr.namespaceURI // in ie<8 it incorrectly will return undefined 14757 })); 14758 } 14759 checked[name] = true; 14760 } 14761 } 14762 for (name in $oldstate) { 14763 if (!(checked[name])) { 14764 mutations.push(MutationRecord({ 14765 target: $target, 14766 type: "attributes", 14767 attributeName: name, 14768 oldValue: $oldstate[name] 14769 })); 14770 } 14771 } 14772 } 14773 14774 /** 14775 * searchSubtree: array of mutations so far, element, element clone, bool 14776 * synchronous dfs comparision of two nodes 14777 * This function is applied to any observed element with childList or subtree specified 14778 * Sorry this is kind of confusing as shit, tried to comment it a bit... 14779 * codereview.stackexchange.com/questions/38351 discussion of an earlier version of this func 14780 * 14781 * @param {Array} mutations 14782 * @param {Node} $target 14783 * @param {!Object} $oldstate : A custom cloned node from clone() 14784 * @param {!Object} config : A custom mutation config 14785 */ 14786 function searchSubtree(mutations, $target, $oldstate, config) { 14787 // Track if the tree is dirty and has to be recomputed (#14). 14788 var dirty; 14789 /* 14790 * Helper to identify node rearrangment and stuff... 14791 * There is no gaurentee that the same node will be identified for both added and removed nodes 14792 * if the positions have been shuffled. 14793 * conflicts array will be emptied by end of operation 14794 */ 14795 function resolveConflicts(conflicts, node, $kids, $oldkids, numAddedNodes) { 14796 // the distance between the first conflicting node and the last 14797 var distance = conflicts.length - 1; 14798 // prevents same conflict being resolved twice consider when two nodes switch places. 14799 // only one should be given a mutation event (note -~ is used as a math.ceil shorthand) 14800 var counter = -~((distance - numAddedNodes) / 2); 14801 var $cur; 14802 var oldstruct; 14803 var conflict; 14804 while ((conflict = conflicts.pop())) { 14805 $cur = $kids[conflict.i]; 14806 oldstruct = $oldkids[conflict.j]; 14807 14808 // attempt to determine if there was node rearrangement... won't gaurentee all matches 14809 // also handles case where added/removed nodes cause nodes to be identified as conflicts 14810 if (config.kids && counter && Math.abs(conflict.i - conflict.j) >= distance) { 14811 mutations.push(MutationRecord({ 14812 type: "childList", 14813 target: node, 14814 addedNodes: [$cur], 14815 removedNodes: [$cur], 14816 // haha don't rely on this please 14817 nextSibling: $cur.nextSibling, 14818 previousSibling: $cur.previousSibling 14819 })); 14820 counter--; // found conflict 14821 } 14822 14823 // Alright we found the resorted nodes now check for other types of mutations 14824 if (config.attr && oldstruct.attr) findAttributeMutations(mutations, $cur, oldstruct.attr, config.afilter); 14825 if (config.charData && $cur.nodeType === 3 && $cur.nodeValue !== oldstruct.charData) { 14826 mutations.push(MutationRecord({ 14827 type: "characterData", 14828 target: $cur, 14829 oldValue: oldstruct.charData 14830 })); 14831 } 14832 // now look @ subtree 14833 if (config.descendents) findMutations($cur, oldstruct); 14834 } 14835 } 14836 14837 /** 14838 * Main worker. Finds and adds mutations if there are any 14839 * @param {Node} node 14840 * @param {!Object} old : A cloned data structure using internal clone 14841 */ 14842 function findMutations(node, old) { 14843 var $kids = node.childNodes; 14844 var $oldkids = old.kids; 14845 var klen = $kids.length; 14846 // $oldkids will be undefined for text and comment nodes 14847 var olen = $oldkids ? $oldkids.length : 0; 14848 // if (!olen && !klen) return; // both empty; clearly no changes 14849 14850 // we delay the intialization of these for marginal performance in the expected case (actually quite signficant on large subtrees when these would be otherwise unused) 14851 // map of checked element of ids to prevent registering the same conflict twice 14852 var map; 14853 // array of potential conflicts (ie nodes that may have been re arranged) 14854 var conflicts; 14855 var id; // element id from getElementId helper 14856 var idx; // index of a moved or inserted element 14857 14858 var oldstruct; 14859 // current and old nodes 14860 var $cur; 14861 var $old; 14862 // track the number of added nodes so we can resolve conflicts more accurately 14863 var numAddedNodes = 0; 14864 14865 // iterate over both old and current child nodes at the same time 14866 var i = 0, j = 0; 14867 // while there is still anything left in $kids or $oldkids (same as i < $kids.length || j < $oldkids.length;) 14868 while (i < klen || j < olen) { 14869 // current and old nodes at the indexs 14870 $cur = $kids[i]; 14871 oldstruct = $oldkids[j]; 14872 $old = oldstruct && oldstruct.node; 14873 14874 if ($cur === $old) { // expected case - optimized for this case 14875 // check attributes as specified by config 14876 if (config.attr && oldstruct.attr) /* oldstruct.attr instead of textnode check */findAttributeMutations(mutations, $cur, oldstruct.attr, config.afilter); 14877 // check character data if node is a comment or textNode and it's being observed 14878 if (config.charData && oldstruct.charData !== undefined && $cur.nodeValue !== oldstruct.charData) { 14879 mutations.push(MutationRecord({ 14880 type: "characterData", 14881 target: $cur, 14882 oldValue: oldstruct.charData 14883 })); 14884 } 14885 14886 // resolve conflicts; it will be undefined if there are no conflicts - otherwise an array 14887 if (conflicts) resolveConflicts(conflicts, node, $kids, $oldkids, numAddedNodes); 14888 14889 // recurse on next level of children. Avoids the recursive call when there are no children left to iterate 14890 if (config.descendents && ($cur.childNodes.length || oldstruct.kids && oldstruct.kids.length)) findMutations($cur, oldstruct); 14891 14892 i++; 14893 j++; 14894 } else { // (uncommon case) lookahead until they are the same again or the end of children 14895 dirty = true; 14896 if (!map) { // delayed initalization (big perf benefit) 14897 map = {}; 14898 conflicts = []; 14899 } 14900 if ($cur) { 14901 // check id is in the location map otherwise do a indexOf search 14902 if (!(map[id = getElementId($cur)])) { // to prevent double checking 14903 // mark id as found 14904 map[id] = true; 14905 // custom indexOf using comparitor checking oldkids[i].node === $cur 14906 if ((idx = indexOfCustomNode($oldkids, $cur, j)) === -1) { 14907 if (config.kids) { 14908 mutations.push(MutationRecord({ 14909 type: "childList", 14910 target: node, 14911 addedNodes: [$cur], // $cur is a new node 14912 nextSibling: $cur.nextSibling, 14913 previousSibling: $cur.previousSibling 14914 })); 14915 numAddedNodes++; 14916 } 14917 } else { 14918 conflicts.push({ // add conflict 14919 i: i, 14920 j: idx 14921 }); 14922 } 14923 } 14924 i++; 14925 } 14926 14927 if ($old && 14928 // special case: the changes may have been resolved: i and j appear congurent so we can continue using the expected case 14929 $old !== $kids[i] 14930 ) { 14931 if (!(map[id = getElementId($old)])) { 14932 map[id] = true; 14933 if ((idx = indexOf($kids, $old, i)) === -1) { 14934 if (config.kids) { 14935 mutations.push(MutationRecord({ 14936 type: "childList", 14937 target: old.node, 14938 removedNodes: [$old], 14939 nextSibling: $oldkids[j + 1], // praise no indexoutofbounds exception 14940 previousSibling: $oldkids[j - 1] 14941 })); 14942 numAddedNodes--; 14943 } 14944 } else { 14945 conflicts.push({ 14946 i: idx, 14947 j: j 14948 }); 14949 } 14950 } 14951 j++; 14952 } 14953 }// end uncommon case 14954 }// end loop 14955 14956 // resolve any remaining conflicts 14957 if (conflicts) resolveConflicts(conflicts, node, $kids, $oldkids, numAddedNodes); 14958 } 14959 findMutations($target, $oldstate); 14960 return dirty; 14961 } 14962 14963 /** 14964 * Utility 14965 * Cones a element into a custom data structure designed for comparision. https://gist.github.com/megawac/8201012 14966 * 14967 * @param {Node} $target 14968 * @param {!Object} config : A custom mutation config 14969 * @return {!Object} : Cloned data structure 14970 */ 14971 function clone($target, config) { 14972 var recurse = true; // set true so childList we'll always check the first level 14973 return (function copy($target) { 14974 var elestruct = { 14975 /** @type {Node} */ 14976 node: $target 14977 }; 14978 14979 // Store current character data of target text or comment node if the config requests 14980 // those properties to be observed. 14981 if (config.charData && ($target.nodeType === 3 || $target.nodeType === 8)) { 14982 elestruct.charData = $target.nodeValue; 14983 } 14984 // its either a element, comment, doc frag or document node 14985 else { 14986 // Add attr only if subtree is specified or top level and avoid if 14987 // attributes is a document object (#13). 14988 if (config.attr && recurse && $target.nodeType === 1) { 14989 /** 14990 * clone live attribute list to an object structure {name: val} 14991 * @type {Object.<string, string>} 14992 */ 14993 elestruct.attr = reduce($target.attributes, function
14993(memo, attr) { 14994 if (!config.afilter || config.afilter[attr.name]) { 14995 memo[attr.name] = getAttributeValue($target, attr); 14996 } 14997 return memo; 14998 }, {}); 14999 } 15000 15001 // whether we should iterate the children of $target node 15002 if (recurse && ((config.kids || config.charData) || (config.attr && config.descendents))) { 15003 /** @type {Array.<!Object>} : Array of custom clone */ 15004 elestruct.kids = map($target.childNodes, copy); 15005 } 15006 15007 recurse = config.descendents; 15008 } 15009 return elestruct; 15010 })($target); 15011 } 15012 15013 /** 15014 * indexOf an element in a collection of custom nodes 15015 * 15016 * @param {NodeList} set 15017 * @param {!Object} $node : A custom cloned node 15018 * @param {number} idx : index to start the loop 15019 * @return {number} 15020 */ 15021 function indexOfCustomNode(set, $node, idx) { 15022 return indexOf(set, $node, idx, JSCompiler_renameProperty("node")); 15023 } 15024 15025 // using a non id (eg outerHTML or nodeValue) is extremely naive and will run into issues with nodes that may appear the same like <li></li> 15026 var counter = 1; // don't use 0 as id (falsy) 15027 /** @const */ 15028 var expando = "mo_id"; 15029 15030 /** 15031 * Attempt to uniquely id an element for hashing. We could optimize this for legacy browsers but it hopefully wont be called enough to be a concern 15032 * 15033 * @param {Node} $ele 15034 * @return {(string|number)} 15035 */ 15036 function getElementId($ele) { 15037 try { 15038 return $ele.id || ($ele[expando] = $ele[expando] || counter++); 15039 } catch (o_O) { // ie <8 will throw if you set an unknown property on a text node 15040 try { 15041 return $ele.nodeValue; // naive 15042 } catch (shitie) { // when text node is removed: https://gist.github.com/megawac/8355978 :( 15043 return counter++; 15044 } 15045 } 15046 } 15047 15048 /** 15049 * **map** Apply a mapping function to each item of a set 15050 * @param {Array|NodeList} set 15051 * @param {Function} iterator 15052 */ 15053 function map(set, iterator) { 15054 var results = []; 15055 for (var index = 0; index < set.length; index++) { 15056 results[index] = iterator(set[index], index, set); 15057 } 15058 return results; 15059 } 15060 15061 /** 15062 * **Reduce** builds up a single result from a list of values 15063 * @param {Array|NodeList|NamedNodeMap} set 15064 * @param {Function} iterator 15065 * @param {*} [memo] Initial value of the memo. 15066 */ 15067 function reduce(set, iterator, memo) { 15068 for (var index = 0; index < set.length; index++) { 15069 memo = iterator(memo, set[index], index, set); 15070 } 15071 return memo; 15072 } 15073 15074 /** 15075 * **indexOf** find index of item in collection. 15076 * @param {Array|NodeList} set 15077 * @param {Object} item 15078 * @param {number} idx 15079 * @param {string} [prop] Property on set item to compare to item 15080 */ 15081 function indexOf(set, item, idx, prop) { 15082 for (/*idx = ~~idx*/; idx < set.length; idx++) {// start idx is always given as this is internal 15083 if ((prop ? set[idx][prop] : set[idx]) === item) return idx; 15084 } 15085 return -1; 15086 } 15087 15088 /** 15089 * @param {Object} obj 15090 * @param {(string|number)} prop 15091 * @return {boolean} 15092 */ 15093 function has(obj, prop) { 15094 return obj[prop] !== undefined; // will be nicely inlined by gcc 15095 } 15096 15097 // GCC hack see https://stackoverflow.com/a/23202438/1517919 15098 function JSCompiler_renameProperty(a) { 15099 return a; 15100 } 15101 15102 return MutationObserver; 15103 })(void 0); 15104 15105/** 15106 * Copyright 2016 Google Inc. All Rights Reserved. 15107 * 15108 * Licensed under the W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE. 15109 * 15110 * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document 15111 * 15112 */ 15113(function(window, document) { 15114 'use strict'; 15115 15116// Exits early if all IntersectionObserver and IntersectionObserverEntry 15117// features are natively supported. 15118 if ('IntersectionObserver' in window && 15119 'IntersectionObserverEntry' in window && 15120 'intersectionRatio' in window.IntersectionObserverEntry.prototype) { 15121 15122 // Minimal polyfill for Edge 15's lack of `isIntersecting` 15123 // See: https://github.com/w3c/IntersectionObserver/issues/211 15124 if (!('isIntersecting' in window.IntersectionObserverEntry.prototype)) { 15125 Object.defineProperty(window.IntersectionObserverEntry.prototype, 15126 'isIntersecting', { 15127 get: function () { 15128 return this.intersectionRatio > 0; 15129 } 15130 }); 15131 } 15132 return; 15133 } 15134 15135 /** 15136 * An IntersectionObserver registry. This registry exists to hold a strong 15137 * reference to IntersectionObserver instances currently observering a target 15138 * element. Without this registry, instances without another reference may be 15139 * garbage collected. 15140 */ 15141 var registry = []; 15142 15143 15144 /** 15145 * Creates the global IntersectionObserverEntry constructor. 15146 * https://w3c.github.io/IntersectionObserver/#intersection-observer-entry 15147 * @param {Object} entry A dictionary of instance properties. 15148 * @constructor 15149 */ 15150 function IntersectionObserverEntry(entry) { 15151 this.time = entry.time; 15152 this.target = entry.target; 15153 this.rootBounds = entry.rootBounds; 15154 this.boundingClientRect = entry.boundingClientRect; 15155 this.intersectionRect = entry.intersectionRect || getEmptyRect(); 15156 this.isIntersecting = !!entry.intersectionRect; 15157 15158 // Calculates the intersection ratio. 15159 var targetRect = this.boundingClientRect; 15160 var targetArea = targetRect.width * targetRect.height; 15161 var intersectionRect = this.intersectionRect; 15162 var intersectionArea = intersectionRect.width * intersectionRect.height; 15163 15164 // Sets intersection ratio. 15165 if (targetArea) { 15166 this.intersectionRatio = intersectionArea / targetArea; 15167 } else { 15168 // If area is zero and is intersecting, sets to 1, otherwise to 0 15169 this.intersectionRatio = this.isIntersecting ? 1 : 0; 15170 } 15171 } 15172 15173 15174 /** 15175 * Creates the global IntersectionObserver constructor. 15176 * https://w3c.github.io/IntersectionObserver/#intersection-observer-interface 15177 * @param {Function} callback The function to be invoked after intersection 15178 * changes have queued. The function is not invoked if the queue has 15179 * been emptied by calling the `takeRecords` method. 15180 * @param {Object=} opt_options Optional configuration options. 15181 * @constructor 15182 */ 15183 function IntersectionObserver(callback, opt_options) { 15184 15185 var options = opt_options || {}; 15186 15187 if (typeof callback !== 'function') { 15188 throw new Error('callback must be a function'); 15189 } 15190 15191 if (options.root && options.root.nodeType != 1) { 15192 throw new Error('root must be an Element'); 15193 } 15194 15195 // Binds and throttles `this._checkForIntersections`. 15196 this._checkForIntersections = throttle( 15197 this._checkForIntersections.bind(this), this.THROTTLE_TIMEOUT); 15198 15199 // Private properties. 15200 this._callback = callback; 15201 this._observationTargets = []; 15202 this._queuedEntries = []; 15203 this._rootMarginValues = this._parseRootMargin(options.rootMargin); 15204 15205 // Public properties. 15206 this.thresholds = this._initThresholds(options.threshold); 15207 this.root = options.root || null; 15208 this.rootMargin = this._rootMarginValues.map(function(margin) { 15209 return margin.value + margin.unit; 15210 }).join(' '); 15211 } 15212 15213 15214 /** 15215 * The minimum interval within which the document will be checked for 15216 * intersection changes. 15217 */ 15218 IntersectionObserver.prototype.THROTTLE_TIMEOUT = 100; 15219 15220 15221 /** 15222 * The frequency in which the polyfill polls for intersection changes. 15223 * this can be updated on a per instance basis and must be set prior to 15224 * calling `observe` on the first target. 15225 */ 15226 IntersectionObserver.prototype.POLL_INTERVAL = null; 15227 15228 /** 15229 * Use a mutation observer on the root element 15230 * to detect intersection changes. 15231 */ 15232 IntersectionObserver.prototype.USE_MUTATION_OBSERVER = true; 15233 15234 15235 /** 15236 * Starts observing a target element for intersection changes based on 15237 * the thresholds values. 15238 * @param {Element} target The DOM element to observe. 15239 */ 15240 IntersectionObserver.prototype.observe = function(target) { 15241 var isTargetAlreadyObserved = this._observationTargets.some(function(item) { 15242 return item.element == target; 15243 }); 15244 15245 if (isTargetAlreadyObserved) { 15246 return; 15247 } 15248
15249 if (!(target && target.nodeType == 1)) { 15250 throw new Error('target must be an Element'); 15251 } 15252 15253 this._registerInstance(); 15254 this._observationTargets.push({element: target, entry: null}); 15255 this._monitorIntersections(); 15256 this._checkForIntersections(); 15257 }; 15258 15259 15260 /** 15261 * Stops observing a target element for intersection changes. 15262 * @param {Element} target The DOM element to observe. 15263 */ 15264 IntersectionObserver.prototype.unobserve = function(target) { 15265 this._observationTargets = 15266 this._observationTargets.filter(function(item) { 15267 15268 return item.element != target; 15269 }); 15270 if (!this._observationTargets.length) { 15271 this._unmonitorIntersections(); 15272 this._unregisterInstance(); 15273 } 15274 }; 15275 15276 15277 /** 15278 * Stops observing all target elements for intersection changes. 15279 */ 15280 IntersectionObserver.prototype.disconnect = function() { 15281 this._observationTargets = []; 15282 this._unmonitorIntersections(); 15283 this._unregisterInstance(); 15284 }; 15285 15286 15287 /**
15288 * Returns any queue entries that have not yet been reported to the 15289 * callback and clears the queue. This can be used in conjunction with the 15290 * callback to obtain the absolute most up-to-date intersection information. 15291 * @return {Array} The currently queued entries. 15292 */ 15293 IntersectionObserver.prototype.takeRecords = function() { 15294 var records = this._queuedEntries.slice(); 15295 this._queuedEntries = []; 15296 return records; 15297 }; 15298 15299 15300 /** 15301 * Accepts the threshold value from the user configuration object and 15302 * returns a sorted array of unique threshold values. If a value is not 15303 * between 0 and 1 and error is thrown. 15304 * @private 15305 * @param {Array|number=} opt_threshold An optional threshold value or 15306 * a list of threshold values, defaulting to [0]. 15307 * @return {Array} A sorted list of unique and valid threshold values. 15308 */ 15309 IntersectionObserver.prototype._initThresholds = function(opt_threshold) { 15310 var threshold = opt_threshold || [0]; 15311 if (!Array.isArray(threshold)) threshold = [threshold]; 15312 15313 return threshold.sort().filter(function(t, i, a) { 15314 if (typeof t !== 'number' || isNaN(t) || t < 0 || t > 1) { 15315 throw new Error('threshold must be a number between 0 and 1 inclusively'); 15316 } 15317 return t !== a[i - 1]; 15318 }); 15319 }; 15320 15321 15322 /** 15323 * Accepts the rootMargin value from the user configuration object 15324 * and returns an array of the four margin values as an object c
15324ontaining 15325 * the value and unit properties. If any of the values are not properly 15326 * formatted or use a unit other than px or %, and error is thrown. 15327 * @private 15328 * @param {string=} opt_rootMargin An optional rootMargin value, 15329 * defaulting to '0px'. 15330 * @return {Array<Object>} An array of margin objects with the keys 15331 * value and unit. 15332 */ 15333 IntersectionObserver.prototype._parseRootMargin = function(opt_rootMargin) { 15334 var marginString = opt_rootMargin || '0px'; 15335 var margins = marginString.split(/\s+/).map(function(margin) { 15336 var parts = /^(-?\d*\.?\d+)(px|%)$/.exec(margin); 15337 if (!parts) { 15338 throw new Error('rootMargin must be specified in pixels or percent'); 15339 } 15340 return {value: parseFloat(parts[1]), unit: parts[2]}; 15341 }); 15342 15343 // Handles shorthand. 15344 margins[1] = margins[1] || margins[0]; 15345 margins[2] = margins[2] || margins[0]; 15346 margins[3] = margins[3] || margins[1]; 15347 15348 return margins; 15349 }; 15350 15351 15352 /** 15353 * Starts polling for intersection changes if the polling is not already 15354 * happening, and if the page's visibilty state is visible. 15355 * @private 15356 */ 15357 IntersectionObserver.prototype._monitorIntersections = function() { 15358 if (!this._monitoringIntersections) { 15359 this._monitoringIntersections = true; 15360 15361 // If a poll interval is set, use polling instead of listening to 15362 // resize and scroll events or DOM mutations. 15363 if (this.POLL_INTERVAL) { 15364 this._monitoringInterval = setInterval( 15365 this._checkForIntersections, this.POLL_INTERVAL); 15366 } 15367 else { 15368 addEvent(window, 'resize', this._checkForIntersections, true); 15369 addEvent(document, 'scroll', this._checkForIntersections, true); 15370 15371 if (this.USE_MUTATION_OBSERVER && 'MutationObserver' in window) { 15372 this._domObserver = new MutationObserver(this._checkForIntersections); 15373 this._domObserver.observe(document, { 15374 attributes: true, 15375 childList: true, 15376 characterData: true, 15377 subtree: true 15378 }); 15379 } 15380 } 15381 } 15382 }; 15383 15384 15385 /** 15386 * Stops polling for intersection changes. 15387 * @private 15388 */ 15389 IntersectionObserver.prototype._unmonitorIntersections = function() { 15390 if (this._monitoringIntersections) { 15391 this._monitoringIntersections = false; 15392 15393 clearInterval(this._monitoringInterval); 15394 this._monitoringInterval = null; 15395 15396 removeEvent(window, 'resize', this._checkForIntersections, true); 15397 removeEvent(document, 'scroll', this._checkForIntersections, true); 15398 15399 if (this._domObserver) { 15400 this._domObserver.disconnect(); 15401 this._domObserver = null; 15402 } 15403 } 15404 }; 15405 15406 15407 /** 15408 * Scans each observation target for intersection changes and adds them 15409 * to the internal entries queue. If new entries are found, it 15410 * schedules the callback to be invoked. 15411 * @private 15412 */ 15413 IntersectionObserver.prototype._checkForIntersections = function() { 15414 var rootIsInDom = this._rootIsInDom(); 15415 var rootRect = rootIsInDom ? this._getRootRect() : getEmptyRect(); 15416 15417 this._observationTargets.forEach(function(item) { 15418 var target = item.element; 15419 var targetRect = getBoundingClientRect(target); 15420 var rootContainsTarget = this._rootContainsTarget(target); 15421 var oldEntry = item.entry; 15422 var intersectionRect = rootIsInDom && rootContainsTarget && 15423 this._computeTargetAndRootIntersection(target, rootRect); 15424 15425 var newEntry = item.entry = new IntersectionObserverEntry({ 15426 time: now(), 15427 target: target, 15428 boundingClientRect: targetRect, 15429 rootBounds: rootRect, 15430 intersectionRect: intersectionRect 15431 }); 15432 15433 if (!oldEntry) { 15434 this._queuedEntries.push(newEntry); 15435 } else if (rootIsInDom && rootContainsTarget) { 15436 // If the new entry intersection ratio has crossed any of the 15437 // thresholds, add a new entry. 15438 if (this._hasCrossedThreshold(oldEntry, newEntry)) { 15439 this._queuedEntries.push(newEntry); 15440 } 15441 } else { 15442 // If the root is not in the DOM or target is not contained within 15443 // root but the previous entry for this target had an intersection, 15444 // add a new record indicating removal. 15445 if (oldEntry && oldEntry.isIntersecting) { 15446 this._queuedEntries.push(newEntry); 15447 } 15448 } 15449 }, this); 15450 15451 if (this._queuedEntries.length) { 15452 this._callback(this.takeRecords(), this); 15453 } 15454 }; 15455 15456 15457 /** 15458 * Accepts a target and root rect computes the intersection between then 15459 * following the algorithm in the spec. 15460 * TODO(philipwalton): at this time clip-path is not considered. 15461 * https://w3c.github.io/IntersectionObserver/#calculate-intersection-rect-algo 15462 * @param {Element} target The target DOM element 15463 * @param {Object} rootRect The bounding rect of the root after being 15464 * expanded by the rootMargin value. 15465 * @return {?Object} The final intersection rect object or undefined if no 15466 * intersection is found. 15467 * @private 15468 */ 15469 IntersectionObserver.prototype._computeTargetAndRootIntersection = 15470 function(target, rootRect) { 15471 15472 // If the element isn't displayed, an intersection can't happen. 15473 if (window.getComputedStyle(target).display == 'none') return; 15474 15475 var targetRect = getBoundingClientRect(target); 15476 var intersectionRect = targetRect; 15477 var parent = getParentNode(target); 15478 var atRoot = false;
vendor: 9,839 bytes, lines 15479-15749
15479 15480 while (!atRoot) { 15481 var parentRect = null; 15482 var parentComputedStyle = parent.nodeType == 1 ? 15483 window.getComputedStyle(parent) : {}; 15484 15485 // If the parent isn't displayed, an intersection can't happen. 15486 if (parentComputedStyle.display == 'none') return; 15487 15488 if (parent == this.root || parent == document) { 15489 atRoot = true; 15490 parentRect = rootRect; 15491 } else { 15492 // If the element has a non-visible overflow, and it's not the <body> 15493 // or <html> element, update the intersection rect. 15494 // Note: <body> and <html> cannot be clipped to a rect that's not also 15495 // the document rect, so no need to compute a new intersection. 15496 if (parent != document.body && 15497 parent != document.documentElement && 15498 parentComputedStyle.overflow != 'visible') { 15499 parentRect = getBoundingClientRect(parent); 15500 } 15501 } 15502 15503 // If either of the above conditionals set a new parentRect, 15504 // calculate new intersection data. 15505 if (parentRect) { 15506 intersectionRect = computeRectIntersection(parentRect, intersectionRect); 15507 15508 if (!intersectionRect) break; 15509 } 15510 parent = getParentNode(parent); 15511 } 15512 return intersectionRect; 15513 }; 15514 15515 15516 /** 15517 * Returns the root rect after being expanded by the rootMargin value. 15518 * @return {Object} The expanded root rect. 15519 * @private 15520 */ 15521 IntersectionObserver.prototype._getRootRect = function() { 15522 var rootRect; 15523 if (this.root) { 15524 rootRect = getBoundingClientRect(this.root); 15525 } else { 15526 // Use <html>/<body> instead of window since scroll bars affect size. 15527 var html = document.documentElement; 15528 var body = document.body; 15529 rootRect = { 15530 top: 0, 15531 left: 0, 15532 right: html.clientWidth || body.clientWidth, 15533 width: html.clientWidth || body.clientWidth, 15534 bottom: html.clientHeight || body.clientHeight, 15535 height: html.clientHeight || body.clientHeight 15536 }; 15537 } 15538 return this._expandRectByRootMargin(rootRect); 15539 }; 15540 15541 15542 /** 15543 * Accepts a rect and expands it by the rootMargin value. 15544 * @param {Object} rect The rect object to expand. 15545 * @return {Object} The expanded rect. 15546 * @private 15547 */ 15548 IntersectionObserver.prototype._expandRectByRootMargin = function(rect) { 15549 var margins = this._rootMarginValues.map(function(margin, i) { 15550 return margin.unit == 'px' ? margin.value : 15551 margin.value * (i % 2 ? rect.width : rect.height) / 100; 15552 }); 15553 var newRect = { 15554 top: rect.top - margins[0], 15555 right: rect.right + margins[1], 15556 bottom: rect.bottom + margins[2], 15557 left: rect.left - margins[3] 15558 }; 15559 newRect.width = newRect.right - newRect.left; 15560 newRect.height = newRect.bottom - newRect.top; 15561 15562 return newRect; 15563 }; 15564 15565 15566 /** 15567 * Accepts an old and new entry and returns true if at least one of the 15568 * threshold values has been crossed. 15569 * @param {?IntersectionObserverEntry} oldEntry The previous entry for a 15570 * particular target element or null if no previous entry exists. 15571 * @param {IntersectionObserverEntry} newEntry The current entry for a 15572 * particular target element. 15573 * @return {boolean} Returns true if a any threshold has been crossed. 15574 * @private 15575 */ 15576 IntersectionObserver.prototype._hasCrossedThreshold = 15577 function(oldEntry, newEntry) { 15578 15579 // To make comparing easier, an entry that has a ratio of 0 15580 // but does not actually intersect is given a value of -1 15581 var oldRatio = oldEntry && oldEntry.isIntersecting ? 15582 oldEntry.intersectionRatio || 0 : -1; 15583 var newRatio = newEntry.isIntersecting ? 15584 newEntry.intersectionRatio || 0 : -1; 15585 15586 // Ignore unchanged ratios 15587 if (oldRatio === newRatio) return; 15588 15589 for (var i = 0; i < this.thresholds.length; i++) { 15590 var threshold = this.thresholds[i]; 15591 15592 // Return true if an entry matches a threshold or if the new ratio 15593 // and the old ratio are on the opposite sides of a threshold. 15594 if (threshold == oldRatio || threshold == newRatio || 15595 threshold < oldRatio !== threshold < newRatio) { 15596 return true; 15597 } 15598 } 15599 }; 15600 15601 15602 /** 15603 * Returns whether or not the root element is an element and is in the DOM. 15604 * @return {boolean} True if the root element is an element and is in the DOM. 15605 * @private 15606 */ 15607 IntersectionObserver.prototype._rootIsInDom = function() { 15608 return !this.root || containsDeep(document, this.root); 15609 }; 15610 15611 15612 /** 15613 * Returns whether or not the target element is a child of root. 15614 * @param {Element} target The target element to check. 15615 * @return {boolean} True if the target element is a child of root. 15616 * @private 15617 */ 15618 IntersectionObserver.prototype._rootContainsTarget = function(target) { 15619 return containsDeep(this.root || document, target); 15620 }; 15621 15622 15623 /** 15624 * Adds the instance to the global IntersectionObserver registry if it isn't 15625 * already present. 15626 * @private 15627 */ 15628 IntersectionObserver.prototype._registerInstance = function() { 15629 if (registry.indexOf(this) < 0) { 15630 registry.push(this); 15631 } 15632 }; 15633 15634 15635 /** 15636 * Removes the instance from the global IntersectionObserver registry. 15637 * @private 15638 */ 15639 IntersectionObserver.prototype._unregisterInstance = function() { 15640 var index = registry.indexOf(this); 15641 if (index != -1) registry.splice(index, 1); 15642 }; 15643 15644 15645 /** 15646 * Returns the result of the performance.now() method or null in browsers 15647 * that don't support the API. 15648 * @return {number} The elapsed time since the page was requested. 15649 */ 15650 function now() { 15651 return window.performance && performance.now && performance.now(); 15652 } 15653 15654 15655 /** 15656 * Throttles a function and delays its executiong, so it's only called at most 15657 * once within a given time period. 15658 * @param {Function} fn The function to throttle. 15659 * @param {number} timeout The amount of time that must pass before the 15660 * function can be called again. 15661 * @return {Function} The throttled function. 15662 */ 15663 function throttle(fn, timeout) { 15664 var timer = null; 15665 return function () { 15666 if (!timer) { 15667 timer = setTimeout(function() { 15668 fn(); 15669 timer = null; 15670 }, timeout); 15671 } 15672 }; 15673 } 15674 15675 15676 /** 15677 * Adds an event handler to a DOM node ensuring cross-browser compatibility. 15678 * @param {Node} node The DOM node to add the event handler to. 15679 * @param {string} event The event name. 15680 * @param {Function} fn The event handler to add. 15681 * @param {boolean} opt_useCapture Optionally adds the even to the capture 15682 * phase. Note: this only works in modern browsers. 15683 */ 15684 function addEvent(node, event, fn, opt_useCapture) { 15685 if (typeof node.addEventListener === 'function') { 15686 node.addEventListener(event, fn, opt_useCapture || false); 15687 } 15688 else if (typeof node.attachEvent === 'function') { 15689 node.attachEvent('on' + event, fn); 15690 } 15691 } 15692 15693 15694 /** 15695 * Removes a previously added event handler from a DOM node. 15696 * @param {Node} node The DOM node to remove the event handler from. 15697 * @param {string} event The event name. 15698 * @param {Function} fn The event handler to remove. 15699 * @param {boolean} opt_useCapture If the event handler was added with this 15700 * flag set to true, it should be set to true here in order to remove it. 15701 */ 15702 function removeEvent(node, event, fn, opt_useCapture) { 15703 if (typeof node.removeEventListener === 'function') { 15704 node.removeEventListener(event, fn, opt_useCapture || false); 15705 } 15706 else if (typeof node.detatchEvent === 'function') { 15707 node.detatchEvent('on' + event, fn); 15708 } 15709 } 15710 15711 15712 /** 15713 * Returns the intersection between two rect objects. 15714 * @param {Object} rect1 The first rect. 15715 * @param {Object} rect2 The second rect. 15716 * @return {?Object} The intersection rect or undefined if no intersection 15717 * is found. 15718 */ 15719 function computeRectIntersection(rect1, rect2) { 15720 var top = Math.max(rect1.top, rect2.top); 15721 var bottom = Math.min(rect1.bottom, rect2.bottom); 15722 var left = Math.max(rect1.left, rect2.left); 15723 var right = Math.min(rect1.right, rect2.right); 15724 var width = right - left; 15725 var height = bottom - top; 15726 15727 return (width >= 0 && height >= 0) && { 15728 top: top, 15729 bottom: bottom, 15730 left: left, 15731 right: right, 15732 width: width, 15733 height: height 15734 }; 15735 } 15736 15737 15738 /** 15739 * Shims the native getBoundingClientRect for compatibility with older IE. 15740 * @param {Element} el The element whose bounding rect to get. 15741 * @return {Object} The (possibly shimmed) rect of the element. 15742 */ 15743 function getBoundingClientRect(el) { 15744 var rect; 15745 15746 try { 15747 rect = el.getBoundingClientRect(); 15748 } catch (err) { 15749 // Ignore Windows 7 IE11 "Unspecified error"
15750 // https://github.com/w3c/IntersectionObserver/pull/205 15751 } 15752 15753 if (!rect) return getEmptyRect(); 15754 15755 // Older IE 15756 if (!(rect.width && rect.height)) { 15757 rect = { 15758 top: rect.top, 15759 right: rect.right, 15760 bottom: rect.bottom, 15761 left: rect.left, 15762 width: rect.right - rect.left, 15763 height: rect.bottom - rect.top 15764 }; 15765 } 15766 return rect; 15767 } 15768 15769 15770 /** 15771 * Returns an empty rect object. An empty rect is returned when an element 15772 * is not in the DOM. 15773 * @return {Object} The empty rect. 15774 */ 15775 function getEmptyRect() { 15776 return { 15777 top: 0, 15778 bottom: 0, 15779 left: 0, 15780 right: 0, 15781 width: 0, 15782 height: 0 15783 }; 15784 } 15785 15786 /** 15787 * Checks to see if a parent element contains a child elemnt (including inside 15788 * shadow DOM). 15789 * @param {Node} parent The parent element. 15790 * @param {Node} child The child element. 15791 * @return {boolean} True if the parent node contains the child node. 15792 */ 15793 function containsDeep(parent, child) { 15794 var node = child; 15795 while (node) { 15796 if (node == parent) return true; 15797 15798 node = getParentNode(node); 15799 } 15800 return false; 15801 } 15802 15803 15804 /** 15805 * Gets the parent node of an element or its host element if the parent node 15806 * is a shadow root. 15807 * @param {Node} node The node whose parent to get. 15808 * @return {Node|null} The parent node or null if no parent exists. 15809 */ 15810 function getParentNode(node) { 15811 var parent = node.parentNode; 15812 15813 if (parent && parent.nodeType == 11 && parent.host) { 15814 // If the parent is a shadow root, return the host element. 15815 return parent.host; 15816 } 15817 return parent; 15818 } 15819 15820 15821// Exposes the constructors globally. 15822 window.IntersectionObserver = IntersectionObserver; 15823 window.IntersectionObserverEntry = IntersectionObserverEntry; 15824 15825}(window, document)); 15826 15827if (window.NodeList && !NodeList.prototype.forEach) { 15828 NodeList.prototype.forEach = function (callback, thisArg) { 15829 thisArg = thisArg || window; 15830 for (var i = 0; i < this.length; i++) { 15831 callback.call(thisArg, this[i], i, this); 15832 } 15833 }; 15834} 15835 15836CAFE24.SMART_BANNER_DEFAULT = { 15837 15838 /** 15839 * ECHOSTING-331346 : íë¡ í¸íë©´ìì ì¤ë§í¸ë°°ë ê°±ì ì íë©´ 리ë¡ë 15840 * @returns {boolean} 15841 */ 15842 reloadFrontPage: function () { 15843 addEventListener('message', function(e) { 15844 15845 if (e.origin.indexOf(EC_FRONT_JS_CONFIG_MANAGE.sDefaultAppDomain) < 0) { 15846 return false; 15847 } 15848 15849 var jsonData = JSON.parse(e.data); 15850 15851 if (jsonData == '' || jsonData.type == '') { 15852 return false; 15853 } 15854 15855 if (jsonData.type == 'frontReload') { 15856 window.location.reload(); 15857 return true; 15858 } 15859 15860 }, false); 15861 } 15862}; 15863 15864var SMART_BANNER_DEFAULT = CAFE24.getDeprecatedNamespace('SMART_BANNER_DEFAULT'); 15865 15866EC$(function () { 15867 15868 try { 15869 // ì¤ë§í¸ë°°ë 모ëëª ì´ ì¡´ì¬íëì§ íì¸ 15870 var smartBannerModuleCount = EC$("div[module*='smart-banner-admin'],div[app4you-smart-banner*='smart-banner-admin']").length; 15871 15872 if (!smartBannerModuleCount) { 15873 return false; 15874 } 15875 15876 // SDK ê° ë¡ëëì§ ììê²½ì° íìê° ì¤ì 15877 if (typeof CAFE24API === "undefined") { 15878 CAFE24API = { 15879 MALL_ID: EC_FRONT_JS_CONFIG_MANAGE.sMallId, 15880 SHOP_NO: CAFE24.SDE_SHOP_NUM 15881 }; 15882 } 15883 15884 // ì¤ë§í¸ë°°ë 모ëëª ì´ ì¡´ì¬í ê²½ì° ScriptTag Load 15885 var defaultAppScripts = document.createElement("script"); 15886 defaultAppScripts.type = "text/javascript"; 15887 defaultAppScripts.src = EC_FRONT_JS_CONFIG_MANAGE.sSmartBannerScriptUrl; 15888 EC$("head").append(defaultAppScripts); 15889 15890 // ECHOSTING-331346 : íë¡ í¸íë©´ìì ì¤ë§í¸ë°°ë ê°±ì ì íë©´ 리ë¡ë 15891 CAFE24.SMART_BANNER_DEFAULT.reloadFrontPage(); 15892 15893 } catch (e) { 15894 if (typeof(e) === 'object' && e.stack && window.console) { 15895 console.log(e); 15896 } 15897 } 15898}); 15899 15900/** 15901 * ê²ìí ê´ë ¨ JS 15902 */ 15903 15904EC$(function() { 15905 BOARD.event_bind(); 15906 // ê²ìíë©ë´ ì´ë¯¸ì§ 롤ì¤ë² 15907 BOARD.board_img_over(); 15908}); 15909 15910 15911var BOARD = { 15912 /** 15913 * ê²ìí ì²¨ë¶ ì´ë¯¸ì§ ë¡ëí 15914 */ 15915 aAttachImageLoadQueue: [], 15916 15917 /** 15918 * ì´ë²¤í¸ ë°ì¸ë©ì í©ëë¤. 15919 */ 15920 event_bind: function () 15921 { 15922 //ìíë¶ë¥ ê²ì ì ë í° ì´ë²¤í¸ ë°ì¸ë© 15923 BOARD.setProductCategorySelector.setEvent(); 15924 }, 15925 15926 /** 15927 * ê³µì§ê¸ 보기 15928 */ 15929 show_notice: function() 15930 { 15931 var bFlag = EC$('input[type="checkbox"][name="showNotice"]')[0].checked; 15932 if (bFlag === true) { 15933 EC$('.mNoticeFlag').each(function(index, node) { 15934 EC$(node).show(); 15935 }); 15936 } else { 15937 EC$('.mNoticeFlag').each(function(index, node) { 15938 EC$(node).hide(); 15939 }); 15940 } 15941 }, 15942 15943 /** 15944 * ê´ë¦¬ì ì¤ì ì ë°ë¥¸ ì 목, 컨í ì¸ ê³ ì í기 15945 */ 15946 fix_subject_content: function() 15947 { 15948 EC$("select[name='subject']").change(function() { 15949 if (EC$("#fix_content_" + this.selectedIndex).val() != undefined) { 15950 var content = EC$("#fix_content_" + this.selectedIndex).val() + EC$("#fix_add_content").val(); 15951 } else { 15952 if (EC$("#fix_add_content").val() != undefined) { 15953 var content = EC$("#fix_add_content").val(); 15954 } else { 15955 var content = ''; 15956 } 15957 } 15958 15959 // ëµë³, ìì 모ëììë 컨í ì¸ ììì´ ìì ëì§ ìëë¡ íë¤. 15960 // ê²ìê¸ ì ë ¥ ìì ì¤ì 'ë ¸ì¶ìí¨'ì¼ ê²½ì° contentì ë¹ê°ì¼ë¡ ì í 15961 if (EC$('#no').length == 0) { 15962 //IE10 ì´íë NNìëí° 15963 if (EC$('#content_IFRAME').length > 0 && EC$('#content_TEXTAREA').length > 0) { 15964 EC$("#content_IFRAME").get(0).contentWindow.document.body.innerHTML = content; 15965 EC$("#content_TEXTAREA").val(content); 15966 } else { 15967 applyContentToFroala(content); 15968 } 15969 } 15970 15971 }); 15972 }, 15973 15974 /** 15975 * íì ë¹ë°ê¸ ì¬ì©í기 15976 */ 15977 disable_secret: function() 15978 { 15979 EC$("#secure0").prop({ 15980 "checked": false, 15981 "disabled": true 15982 }); 15983 15984 EC$("#secure1").prop("checked", true); 15985 }, 15986 15987 /** 15988 * ê²ìíë©ë´ ì´ë¯¸ì§ 롤ì¤ë² 15989 */ 15990 board_img_over: function() 15991 { 15992 EC$(".board_img_over").hover(function() { 15993 EC$(this).attr('src',EC$(this).attr('eImgOver')); 15994 }, function() { 15995 EC$(this).attr('src',EC$(this).attr('eImgout')); 15996 }); 15997 }, 15998 15999 /** 16000 * í¼ submit 16001 * @param string sFormName í¼ name 16002 */ 16003 form_submit: function(sFormName) 16004 { 16005 // ìë° ìì¹ë¥¼ BOARD_WRITEë¡ ë³ê²½ 16006 EC$('#'+sFormName).submit(); 16007 }, 16008 16009 /** 16010 * 리ì¤í¸ ì ë ¬ submit 16011 * @param string sFormName í¼ name 16012 */ 16013 change_sort: function(sFormName, obj) 16014 { 16015 EC$('#'+sFormName+' [id="board_sort"]').val(obj.value); 16016 16017 EC$('#'+sFormName).submit(); 16018 }, 16019 16020 /** 16021 * ëµë³ì¬ë¶ ì í select 16022 * @param element obj select element 16023 */ 16024 change_reply_sort: function(obj) 16025 { 16026 var sQueryString = document.location.search.substr(1); 16027 var aParams = {}; 16028 16029 EC$.each(sQueryString.split('&'), function(i, str) { 16030 var sKey = str.substr(0, str.indexOf('=')); 16031 if ('page' !== sKey) { 16032 var sVal = str.substr(str.indexOf('=')+1); 16033 16034 aParams[sKey] = sVal; 16035 } 16036 }); 16037 16038 aParams['is_reply_sort'] = EC$(obj).val(); 16039 var aUrls = []; 16040 EC$.each(aParams, function(sKey, sVal) { 16041 if ('' !== CAFE24.UTIL.trim(sVal)) { 16042 aUrls.push(sKey+'='+CAFE24.UTIL.trim(sVal)); 16043 } 16044 }); 16045 16046 document.location.href = EC_ROUTE.getPrefixUrl(document.location.pathname)+'?'+aUrls.join('&'); 16047 }, 16048 16049 /** 16050 * ìíí기 리ì¤í¸ í¼ì¹¨ 16051 * @param int iNo ê¸ë²í¸ 16052 * @param int iBoardNo ê²ìíë²í¸ 16053 * @param object obj 16054 */ 16055 viewTarget: function(iNo, iBoardNo, obj) { 16056 var self = this; 16057 var elmTarget = EC$(obj); 16058 16059 if (elmTarget.parents('tr').next().attr('id') == 'content_view') { 16060 elmTarget.find('img').attr('src', function() { 16061 return this.src.replace('_fold','_unfold'); 16062 }); 16063 16064 self.changeFoldImg(obj); 16065 16066 EC$('#content_view').remove(); 16067 return; 16068 } else { 16069 EC$('#content_view').remove(); 16070 16071 var aData = { 16072 'no': iNo, 16073 'board_no': iBoardNo 16074 }; 16075 EC$.get('/exec/front/board/Get/'+iBoardNo, aData, function(req) { 16076 if (req.failed == false) { 16077 var rData = req.data; 16078 elmTarget.find('img').attr('src', function() { 16079 return this.src.replace('_unfold','_fold'); 16080 }); 16081 16082 self.changeFoldImg(obj); 16083 16084 var aHtml = []; 16085 aHtml.push('<tr id="content_view" class="'+ rData.block_target_class +'" '+ rData.block_data_attr +'>'); 16086 aHtml.push(' <td colspan='+elmTarget.parents('tr').find('td:not(.displaynone)').length+' class="'+ rData.block_content_class +'">'); 16087 if (rData.content_image != null) aHtml.push(''+rData.content_image+'<br />'); 16088 if (typeof(rData.content) !== 'undefined') { 16089 aHtml.push(rData.content); 16090 } 16091 aHtml.push(' </td>'); 16092 aHtml.push('</tr>'); 16093 16094 elmTarget.parents('tr').after(aHtml.join('')); 16095 16096 if (rData.ucc_url) EC$('.ec-ucc-media-box-'+ rData.no).replaceWith(APP_BOARD_UCC.getPreviewElement(rData.ucc_url)); 16097 APP_BOARD_BLOCK.setBlockList(); 16098 } else { 16099 BOARD.setBulletinSpreadFail(req.data); 16100 } 16101 }, 'json'); 16102 } 16103 }, 16104 setBulletinSpreadFail: function (sFailType) 16105 { 16106 switch (sFailType) { 16107 case 'S' : 16108 alert(__('ë¹ë°ê¸ì ë¯¸ë¦¬ë³´ê¸°ê° ë¶ê° í©ëë¤.')); 16109 break; 16110 case 'M' : 16111 alert(__('íììê²ë§ ì½ê¸° ê¶íì´ ììµëë¤')); 16112 break; 16113 case 'A' :
16114 alert(__('ê´ë¦¬ììê²ë§ ì½ê¸° ê¶íì´ ììµëë¤')); 16115 break; 16116 } 16117 }, 16118 16119 /** 16120 * í´ë© ì´ë¯¸ì§ ë³í 16121 * íì¬ í´ë¦í ì´ë¯¸ì§ ì´ì¸ìë 모ë 'ë«í' ì´ë¯¸ì§ë¡ ë§ë¤ê¸° ìí¨ 16122 * 16123 * @param HtmlElement obj 16124 */ 16125 changeFoldImg: function(obj) { 16126 var elmEventList = EC$('[onclick*="BOARD.viewTarget"]'); 16127 16128 elmEventList.each(function() { 16129 if (obj !== this) { 16130 EC$(this).find('img').attr('src', function() { 16131 return this.src.replace('_fold','_unfold'); 16132 }); 16133 } 16134 }); 16135 }, 16136 16137 /** 16138 * 첨ë¶ì´ë¯¸ì§ 미리보기 16139 * @param sId 16140 * @param sFlag 16141 */ 16142 afile_display: function (sId, sFlag) 16143 { 16144 if (sFlag == 1) { 16145 EC$('#'+sId).css('display', ''); 16146 EC$('#'+sId).css('position', 'absolute'); 16147 } else { 16148 EC$('#'+sId).css('display', 'none'); 16149 } 16150 }, 16151 16152 /** 16153 * 첨ë¶ì´ë¯¸ì§ ë¡ë© 16154 * @param sId ë¡ëë íê² ìì´ë 16155 * @param sFlag ë ¸ì¶ì¬ë¶ 16156 * @param iBoardNo ê²ìí ë²í¸ 16157 */ 16158 load_attached_image: function(sId, sFlag, iBoardNo) 16159 { 16160 /* 16161 * ê²ì물 ë²í¸ ê³ì° 16162 * sIdë íì "afile_" ì´ prefix ë¨ 16163 */ 16164 var iBulletinNo = sId.substr(6,sId.length); 16165 16166 //íìì í´ë¹ ê²ì물ì ì´ë¯¸ì§ê° ë¡ëì¤ ëë ë¡ëëìëì§ ì²´í¬ 16167 var iPosition = EC$.inArray(iBulletinNo, this.aAttachImageLoadQueue); 16168 16169 var oTarget = EC$('#'+sId); 16170 16171 //í ì²´í¬ 16172 if (iPosition === -1) { 16173 this.aAttachImageLoadQueue.push(iBulletinNo); 16174 16175 var sRequestUrl = '/exec/front/Board/Get?no='+ iBulletinNo +'&board_no='+iBoardNo; 16176 EC$.get(sRequestUrl, function(oResponse) { 16177 //ë¡ë ì±ê³µ 16178 if (oResponse.failed === false) { 16179 oTarget.append(oResponse.data.thumbnail_image); 16180 BOARD.afile_display(sId, sFlag); 16181 } 16182 //ë¡ë ì¤í¨ 16183 else { 16184 //íìì ì ê±°ì²ë¦¬íì¬, ë¤ì ë¡ë ê°ë¥íëë¡ ë³ê²½ 16185 BOARD.aAttachImageLoadQueue.splice(iPosition,1); 16186 } 16187 },'json'); 16188 } 16189 16190 //ì´ë¯¸ì§ ì¡´ì¬ ì²´í¬ 16191 if (oTarget.children().is('img') === true) { 16192 BOARD.afile_display(sId, sFlag); 16193 } 16194 }, 16195 16196 /** 16197 * ìí ë¶ë¥ ê²ì ì ë í° 16198 */ 16199 setProductCategorySelector: { 16200 /* 16201 * ì¤,ì,ì¸ ë¶ë¥ ì´ê¸°í 16202 */ 16203 resetCategory: function(oSelectBox) 16204 { 16205 for (var i=oSelectBox.children().length - 1; i>0; i--) { 16206 oSelectBox.children().eq(i).remove(); 16207 } 16208 }, 16209 16210 /* 16211 * íìë¶ë¥ ê°ì ¸ì¤ê¸° 16212 */ 16213 getChildCategory: function(iProductCategoryNumber, oSelectBox) 16214 { 16215 var regexp = /[0-9]+/; 16216 if (regexp.test(iProductCategoryNumber) === false || oSelectBox.length === 0) return; 16217 16218 var sUrl = "/exec/front/Product/SubCategory?parent_cate_no="+iProductCategoryNumber; 16219 EC$.get(sUrl, function(oResponse) { 16220 BOARD.setProductCategorySelector.setChildCategory(oSelectBox, oResponse); 16221 }, 'json'); 16222 }, 16223 16224 /* 16225 * íìë¶ë¥ ê°ì ¸ì¤ê¸° Callback í¨ì 16226 * íìë¶ë¥ ì ë í¸ë°ì¤ ìµì ì¶ê° 16227 */ 16228 // [ECHOSTING-633241] category_name ë±ì 문ìì´ê²°í©+append(htmlString)ì¼ë¡ 조립íë©´ HTMLë¡ íì±ëì´ 16229 // Stored XSS(ìë¸ë¶ë¥ëª 미ì´ì¤ì¼ì´í)ê° ë°ìíë¤. DOM ì리먼í¸ë¥¼ ì§ì ìì±í´ append(domElement)íë©´ 16230 // 문ìì´ì´ ë§í¬ì ì¼ë¡ í´ìëì§ ìì ê°ê³¼ 무ê´íê² ìì íë¤. 16231 setChildCategory: function(oSelectBox, aChildCategory) 16232 { 16233 if (aChildCategory.length === 0 || oSelectBox.length === 0) return; 16234 16235 for (const oChildCategory of aChildCategory) { 16236 const oOption = document.createElement('option'); 16237 oOption.value = oChildCategory['category_no']; 16238 oOption.textContent = oChildCategory['category_name']; 16239 oSelectBox.append(oOption); 16240 } 16241 }, 16242 16243 /** 16244 * ì´ë²¤í¸ ë°ì¸ë© 16245 */ 16246 setEvent: function() 16247 { 16248 var oSelector = BOARD.setProductCategorySelector; 16249 /* 16250 * 1ëì¤ ë³ê²½ì²ë¦¬ 16251 * - ì¤,ì,ì¸ ë¶ë¥ ì´ê¸°í 16252 * - ì¤ë¶ë¥ ìµì ì¶ê° 16253 */ 16254 EC$("#product_category_depth1").change(function() { 16255 if (EC$(this).val() !== EC$(this).attr("history")) { 16256 oSelector.resetCategory(EC$("#product_category_depth2")); 16257 oSelector.resetCategory(EC$("#product_category_depth3")); 16258 oSelector.resetCategory(EC$("#product_category_depth4")); 16259 EC$(this).attr("history", EC$(this).val()); 16260 } 16261 16262 oSelector.getChildCategory(EC$(this).val(), EC$("#product_category_depth2")); 16263 }); 16264 16265 /* 16266 * 2ëì¤ ë³ê²½ì²ë¦¬ 16267 * - ì,ì¸ë¶ë¥ ì´ê¸°í 16268 * - ìë¶ë¥ ìµì ì¶ê° 16269 */ 16270 EC$("#product_category_depth2").change(function() { 16271 if (EC$(this).val() !== EC$(this).attr("history")) { 16272 oSelector.resetCategory(EC$("#product_category_depth3")); 16273 oSelector.resetCategory(EC$("#product_category_depth4")); 16274 EC$(this).attr("history", EC$(this).val()); 16275 } 16276 16277 oSelector.getChildCategory(EC$(this).val(), EC$("#product_category_depth3")); 16278 }); 16279 16280 /* 16281 * 3ëì¤ ë³ê²½ì²ë¦¬ 16282 * - ì¸ë¶ë¥ ì´ê¸°í 16283 * - ì¸ë¶ë¥ ìµì ì¶ê° 16284 */ 16285 EC$("#product_category_depth3").change(function() { 16286 if (EC$(this).val() !== EC$(this).attr("history")) { 16287 oSelector.resetCategory(EC$("#product_category_depth4")); 16288 EC$(this).attr("history", EC$(this).val()); 16289 } 16290 16291 oSelector.getChildCategory(EC$(this).val(), EC$("#product_category_depth4")); 16292 }); 16293 } 16294 }, 16295 16296 /** 16297 * 캡차 ìë¡ê³ 침 16298 */ 16299 refresh_captcha: function(sType, iNo) 16300 { 16301 var sCaptchaId = 'captcha_' + sType; 16302 if (iNo != '') sCaptchaId += '_' + iNo; 16303 16304 EC$('#'+sCaptchaId).attr('src', '/exec/front/board/captcha?no='+iNo+'&type='+sType+'&'+new Date().getTime()); 16305 }, 16306 16307 END: function() {} 16308}; 16309 16310/*! Copyright (c) 2013 Brandon Aaron (http://brandonaaron.net) 16311 * Licensed under the MIT License (LICENSE.txt). 16312 * 16313 * Version 3.0.0 16314 */ 16315 16316(function (factory) { 16317 if (typeof define === 'function' && define.amd) { 16318 // AMD. Register as an anonymous module. 16319 define(['jquery'], factory); 16320 } else { 16321 // Browser globals 16322 factory(jQuery); 16323 } 16324}(function ($) { 16325 $.fn.bgiframe = function(s) { 16326 s = $.extend({ 16327 top : 'auto', // auto == borderTopWidth 16328 left : 'auto', // auto == borderLeftWidth 16329 width : 'auto', // auto == offsetWidth 16330 height : 'auto', // auto == offsetHeight 16331 opacity : true, 16332 src : 'javascript:false;', 16333 conditional : /MSIE 6.0/.test(navigator.userAgent) // expresion or function. return false to prevent iframe insertion 16334 }, s); 16335 16336 // wrap conditional in a function if it isn't already 16337 if (!$.isFunction(s.conditional)) { 16338 var condition = s.conditional; 16339 s.conditional = function() { return condition; }; 16340 } 16341 16342 var $iframe = $('<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+ 16343 'style="display:block;position:absolute;z-index:-1;"/>'); 16344 16345 return this.each(function() { 16346 var $this = $(this); 16347 if ( s.conditional(this) === false ) { return; } 16348 var existing = $this.children('iframe.bgiframe'); 16349 var $el = existing.length === 0 ? $iframe.clone() : existing; 16350 $el.css({ 16351 'top': s.top == 'auto' ? 16352 ((parseInt($this.css('borderTopWidth'),10)||0)*-1)+'px' : prop(s.top), 16353 'left': s.left == 'auto' ? 16354 ((parseInt($this.css('borderLeftWidth'),10)||0)*-1)+'px' : prop(s.left), 16355 'width': s.width == 'auto' ? (this.offsetWidth + 'px') : prop(s.width), 16356 'height': s.height == 'auto' ? (this.offsetHeight + 'px') : prop(s.height), 16357 'opacity': s.opacity === true ? 0 : undefined 16358 }); 16359 16360 if ( existing.length === 0 ) { 16361 $this.prepend($el); 16362 } 16363 }); 16364 }; 16365 16366 // old alias 16367 $.fn.bgIframe = $.fn.bgiframe; 16368 16369 function prop(n) { 16370 return n && n.constructor === Number ? n + 'px' : n; 16371 } 16372 16373})); 16374/** 16375 * Cookie plugin 16376 * 16377 * Copyright (c) 2006 Klaus Hartl (stilbuero.de) 16378 * Dual licensed under the MIT and GPL licenses: 16379 * http://www.opensource.org/licenses/mit-license.php 16380 * http://www.gnu.org/licenses/gpl.html 16381 * 16382 */ 16383 16384/** 16385 * Create a cookie with the given name and value and other optional parameters. 16386 * 16387 * @example $.cookie('the_cookie', 'the_value'); 16388 * @desc Set the value of a cookie. 16389 * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true }); 16390 * @desc Create a cookie with all available options. 16391 * @example $.cookie('the_cookie', 'the_value'); 16392 * @desc Create a session cookie. 16393 * @example $.cookie('the_cookie', null); 16394 * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain 16395 * used when the cookie was set. 16396 * 16397 * @param String name The name of the cookie. 16398 * @param String value The value of the cookie. 16399 * @param Object options An object literal containing key/value pairs to provide optional cookie attributes. 16400 * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object. 16401 * If a negative value is specified (e.g. a date in the past), the cookie will be deleted. 16402 * If set to null or omitted, the cookie will be a session cookie and will not be retained 16403 * when the the browser exits. 16404 * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie). 16405 * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie). 16406 * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will 16407 * require a secure protocol (like HTTPS). 16408 * @type undefined 16409 * 16410 * @name $.cookie 16411 * @cat Plugins/Cookie 16412 * @author Klaus Hartl/[email protected] 16413 */ 16414 16415/** 16416 * Get the value of a cookie with the given name. 16417 * 16418 * @example $.cookie('the_cookie'); 16419 * @desc Get the value of a cookie. 16420 * 16421 * @param String name The name of the cookie. 16422 * @return The value of the cookie.
16423 * @type String 16424 * 16425 * @name $.cookie 16426 * @cat Plugins/Cookie 16427 * @author Klaus Hartl/[email protected] 16428 */ 16429jQuery.cookie = function(name, value, options) { 16430 if (typeof value != 'undefined') { // name and value given, set cookie 16431 options = options || {}; 16432 if (value === null) { 16433 value = ''; 16434 options = $.extend({}, options); // clone object since it's unexpected behavior if the expired property were changed 16435 options.expires = -1; 16436 } 16437 var expires = ''; 16438 if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { 16439 var date; 16440 if (typeof options.expires == 'number') { 16441 date = new Date(); 16442 date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); 16443 } else { 16444 date = options.expires; 16445 } 16446 expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE 16447 } 16448 // NOTE Needed to parenthesize options.path and options.domain 16449 // in the following expressions, otherwise they evaluate to undefined 16450 // in the packed version for some reason... 16451 var path = options.path ? '; path=' + (options.path) : ''; 16452 var domain = options.domain ? '; domain=' + (options.domain) : ''; 16453 var secure = options.secure ? '; secure' : ''; 16454 document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); 16455 } else { // only name given, get cookie 16456 var cookieValue = null; 16457 if (document.cookie && document.cookie != '') { 16458 var cookies = document.cookie.split(';'); 16459 for (var i = 0; i < cookies.length; i++) { 16460 var cookie = jQuery.trim(cookies[i]); 16461 // Does this cookie string begin with the name we want? 16462 if (cookie.substring(0, name.length + 1) == (name + '=')) { 16463 cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 16464 break; 16465 } 16466 } 16467 } 16468 return cookieValue; 16469 } 16470}; 16471/* Copyright (c) 2007 Paul Bakaus ([email protected]) and Brandon Aaron ([email protected] || http://brandonaaron.net) 16472 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 16473 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. 16474 * 16475 * $LastChangedDate: 2007-12-20 08:46:55 -0600 (Thu, 20 Dec 2007) $ 16476 * $Rev: 4259 $ 16477 * 16478 * Version: 1.2 16479 * 16480 * Requires: jQuery 1.2+ 16481 * 16482 */ 16483 16484(function($){ 16485 16486$.dimensions = { 16487 version: '1.2' 16488}; 16489 16490// Create innerHeight, innerWidth, outerHeight and outerWidth methods 16491$.each( [ 'Height', 'Width' ], function(i, name){ 16492 if (!$.fn[ 'inner' + name ]) { 16493 // innerHeight and innerWidth 16494 $.fn[ 'inner' + name ] = function() { 16495 if (!this[0]) return; 16496 16497 var torl = name == 'Height' ? 'Top' : 'Left', // top or left 16498 borr = name == 'Height' ? 'Bottom' : 'Right'; // bottom or right 16499 16500 return this.is(':visible') ? this[0]['client' + name] : num( this, name.toLowerCase() ) + num(this, 'padding' + torl) + num(this, 'padding' + borr); 16501 }; 16502 16503 // outerHeight and outerWidth 16504 $.fn[ 'outer' + name ] = function(options) { 16505 if (!this[0]) return; 16506 16507 var torl = name == 'Height' ? 'Top' : 'Left', // top or left 16508 borr = name == 'Height' ? 'Bottom' : 'Right'; // bottom or right 16509 16510 options = $.extend({ margin: false }, options || {}); 16511 16512 var val = this.is(':visible') ? 16513 this[0]['offset' + name] : 16514 num( this, name.toLowerCase() ) 16515 + num(this, 'border' + torl + 'Width') + num(this, 'border' + borr + 'Width') 16516 + num(this, 'padding' + torl) + num(this, 'padding' + borr); 16517 16518 return val + (options.margin ? (num(this, 'margin' + torl) + num(this, 'margin' + borr)) : 0); 16519 }; 16520 } 16521}); 16522 16523// Create scrollLeft and scrollTop methods 16524$.each( ['Left', 'Top'], function(i, name) { 16525 if (!$.fn[ 'scroll' + name ]) { 16526 $.fn[ 'scroll' + name ] = function(val) { 16527 if (!this[0]) return; 16528 16529 return val != undefined ? 16530 16531 // Set the scroll offset 16532 this.each(function() { 16533 this == window || this == document ? 16534 window.scrollTo( 16535 name == 'Left' ? val : $(window)[ 'scrollLeft' ](), 16536 name == 'Top' ? val : $(window)[ 'scrollTop' ]() 16537 ) : 16538 this[ 'scroll' + name ] = val; 16539 }) : 16540 16541 // Return the scroll offset 16542 this[0] == window || this[0] == document ? 16543 self[ (name == 'Left' ? 'pageXOffset' : 'pageYOffset') ] || 16544 $.boxModel && document.documentElement[ 'scroll' + name ] || 16545 document.body[ 'scroll' + name ] : 16546 this[0][ 'scroll' + name ]; 16547 }; 16548 } 16549}); 16550 16551if (!$.fn.position) { 16552 $.fn.extend({ 16553 position: function() { 16554 var left = 0, top = 0, elem = this[0], offset, parentOffset, offsetParent, results; 16555 16556 if (elem) { 16557 // Get *real* offsetParent 16558 offsetParent = this.offsetParent(); 16559 16560 // Get correct offsets 16561 offset = this.offset(); 16562 parentOffset = offsetParent.offset(); 16563 16564 // Subtract element margins 16565 offset.top -= num(elem, 'marginTop'); 16566 offset.left -= num(elem, 'marginLeft'); 16567 16568 // Add offsetParent borders 16569 parentOffset.top += num(offsetParent, 'borderTopWidth'); 16570 parentOffset.left += num(offsetParent, 'borderLeftWidth'); 16571 16572 // Subtract the two offsets 16573 results = { 16574 top: offset.top - parentOffset.top, 16575 left: offset.left - parentOffset.left 16576 }; 16577 } 16578 return results; 16579 } 16580 }); 16581} 16582 16583if (!$.fn.offsetParent) { 16584 $.fn.extend({ 16585 offsetParent: function () { 16586 var offsetParent = this[0].offsetParent; 16587 while (offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && $.css(offsetParent, 'position') == 'static')) 16588 offsetParent = offsetParent.offsetParent; 16589 return $(offsetParent); 16590 } 16591 }); 16592} 16593 16594if (!$.fn.curCSS) { 16595 $.fn.extend({ 16596 curCss : function (element, prop, val) { 16597 return $(element).css(prop, val); 16598 } 16599 }); 16600} 16601 16602function num(el, prop) { 16603 return parseInt($.curCSS(el.jquery?el[0]:el,prop,true))||0; 16604}; 16605 16606})(jQuery); 16607 16608/* 16609 * jQuery Easing v1.1.1 - http://gsgd.co.uk/sandbox/jquery.easing.php 16610 * 16611 * Uses the built in easing capabilities added in jQuery 1.1 16612 * to offer multiple easing options 16613 * 16614 * Copyright (c) 2007 George Smith 16615 * Licensed under the MIT License: 16616 * http://www.opensource.org/licenses/mit-license.php 16617 */ 16618 16619jQuery.extend(jQuery.easing, { 16620 easein: function(x, t, b, c, d) { 16621 return c*(t/=d)*t + b; // in 16622 }, 16623 easeinout: function(x, t, b, c, d) { 16624 if (t < d/2) return 2*c*t*t/(d*d) + b; 16625 var ts = t - d/2; 16626 return -2*c*ts*ts/(d*d) + 2*c*ts/d + c/2 + b; 16627 }, 16628 easeout: function(x, t, b, c, d) { 16629 return -c*t*t/(d*d) + 2*c*t/d + b; 16630 }, 16631 expoin: function(x, t, b, c, d) { 16632 var flip = 1; 16633 if (c < 0) { 16634 flip *= -1; 16635 c *= -1; 16636 } 16637 return flip * (Math.exp(Math.log(c)/d * t)) + b; 16638 }, 16639 expoout: function(x, t, b, c, d) { 16640 var flip = 1; 16641 if (c < 0) { 16642 flip *= -1; 16643 c *= -1; 16644 } 16645 return flip * (-Math.exp(-Math.log(c)/d * (t-d)) + c + 1) + b; 16646 }, 16647 expoinout: function(x, t, b, c, d) { 16648 var flip = 1; 16649 if (c < 0) { 16650 flip *= -1; 16651 c *= -1; 16652 } 16653 if (t < d/2) return flip * (Math.exp(Math.log(c/2)/(d/2) * t)) + b; 16654 return flip * (-Math.exp(-2*Math.log(c/2)/d * (t-d)) + c + 1) + b; 16655 }, 16656 bouncein: function(x, t, b, c, d) { 16657 return c - jQuery.easing['bounceout'](x, d-t, 0, c, d) + b; 16658 }, 16659 bounceout: function(x, t, b, c, d) { 16660 if ((t/=d) < (1/2.75)) { 16661 return c*(7.5625*t*t) + b; 16662 } else if (t < (2/2.75)) { 16663 return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; 16664 } else if (t < (2.5/2.75)) { 16665 return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; 16666 } else { 16667 return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; 16668 } 16669 }, 16670 bounceinout: function(x, t, b, c, d) { 16671 if (t < d/2) return jQuery.easing['bouncein'] (x, t*2, 0, c, d) * .5 + b; 16672 return jQuery.easing['bounceout'] (x, t*2-d,0, c, d) * .5 + c*.5 + b; 16673 }, 16674 elasin: function(x, t, b, c, d) { 16675 var s=1.70158;var p=0;var a=c; 16676 if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; 16677 if (a < Math.abs(c)) { a=c; var s=p/4; } 16678 else var s = p/(2*Math.PI) * Math.asin (c/a); 16679 return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; 16680 }, 16681 elasout: function(x, t, b, c, d) { 16682 var s=1.70158;var p=0;var a=c; 16683 if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; 16684 if (a < Math.abs(c)) { a=c; var s=p/4; } 16685 else var s = p/(2*Math.PI) * Math.asin (c/a); 16686 return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; 16687 }, 16688 elasinout: function(x, t, b, c, d) { 16689 var s=1.70158;var p=0;var a=c; 16690 if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); 16691 if (a < Math.abs(c)) { a=c; var s=p/4; } 16692 else var s = p/(2*Math.PI) * Math.asin (c/a); 16693 if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; 16694 return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; 16695 }, 16696 backin: function(x, t, b, c, d) { 16697 var s=1.70158; 16698 return c*(t/=d)*t*((s+1)*t - s) + b; 16699 }, 16700 backout: function(x, t, b, c, d) { 16701 var s=1.70158; 16702 return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; 16703 }, 16704 backinout: function(x, t, b, c, d) { 16705 var s=1.70158; 16706 if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; 16707 return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; 16708 } 16709}); 16710/* 16711 * Metadata - jQuery plugin for parsing metadata from elements 16712 * 16713 * Copyright (c) 2006 John Resig, Yehuda Katz, J�örn Zaefferer, Paul McLanahan 16714 * 16715 * Dual licensed under the MIT and GPL licenses: 16716 * http://www.opensource.org/licenses/mit-license.php 16717 * http://www.gnu.org/licenses/gpl.html 16718 * 16719 * Revision: $Id$ 16720 * 16721 */ 16722 16723/** 16724 * Sets the type of metadata to use. Metadata is encoded in JSON, and each property 16725 * in the JSON will become a property of the element itself. 16726 * 16727 * There are three supported types of metadata storage: 16728 * 16729 * attr: Inside an attribute. The name parameter indicates *which* attribute. 16730 * 16731 * class: Inside the class attribute, wrapped in curly braces: { } 16732 * 16733 * elem: Inside a child element (e.g. a script tag). The 16734 * name parameter indicates *which* element. 16735 * 16736 * The metadata for an element is loaded the first time the element is accessed via jQuery. 16737 * 16738 * As a result, you can define the metadata type, use $(expr) to load the metadata into the elements 16739 * matched by expr, then redefine the metadata type and run another $(expr) for other elements. 16740 * 16741 * @name $.metadata.setType 16742 * 16743 * @example <p id="one" class="some_class {item_id: 1, item_label: 'Label'}">This is a p</p> 16744 * @before $.metadata.setType("class") 16745 * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" 16746 * @desc Reads metadata from the class attribute 16747 * 16748 * @example <p id="one" class="some_class" data="{item_id: 1, item_label: 'Label'}">This is a p</p> 16749 * @before $.metadata.setType("attr", "data") 16750 * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" 16751 * @desc Reads metadata from a "data" attribute 16752 * 16753 * @example <p id="one" class="some_class"><script>{item_id: 1, item_label: 'Label'}</script>This is a p</p> 16754 * @before $.metadata.setType("elem", "script") 16755 * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" 16756 * @desc Reads metadata from a nested script element 16757 * 16758 * @param String type The encoding type 16759 * @param String name The name of the attribute to be used to get metadata (optional) 16760 * @cat Plugins/Metadata 16761 * @descr Sets the type of encoding to be used when loading metadata for the first time 16762 * @type undefined 16763 * @see metadata() 16764 */ 16765 16766(function($) { 16767 16768$.extend({ 16769 metadata : { 16770 defaults : { 16771 type: 'class', 16772 name: 'metadata', 16773 cre: /({.*})/, 16774 single: 'metadata' 16775 }, 16776 setType: function( type, name ){ 16777 this.defaults.type = type; 16778 this.defaults.name = name; 16779 }, 16780 get: function( elem, opts ){ 16781 var settings = $.extend({},this.defaults,opts); 16782 // check for empty string in single property 16783 if ( !settings.single.length ) settings.single = 'metadata'; 16784 16785 var data = $.data(elem, settings.single); 16786 // returned cached data if it already exists 16787 if ( data ) return data; 16788 16789 data = "{}"; 16790 16791 if ( settings.type == "class" ) { 16792 var m = settings.cre.exec( elem.className ); 16793 if ( m ) 16794 data = m[1]; 16795 } else if ( settings.type == "elem" ) { 16796 if( !elem.getElementsByTagName ) 16797 return undefined; 16798 var e = elem.getElementsByTagName(settings.name); 16799 if ( e.length ) 16800 data = $.trim(e[0].innerHTML); 16801 } else if ( elem.getAttribute != undefined ) { 16802 var attr = elem.getAttribute( settings.name ); 16803 if ( attr ) 16804 data = attr; 16805 } 16806 16807 if ( data.indexOf( '{' ) <0 ) 16808 data = "{" + data + "}"; 16809 16810 data = eval("(" + data + ")"); 16811 16812 $.data( elem, settings.single, data ); 16813 return data; 16814 } 16815 } 16816}); 16817 16818/** 16819 * Returns the metadata object for the first member of the jQuery object. 16820 * 16821 * @name metadata 16822 * @descr Returns element's metadata object
16823 * @param Object opts An object contianing settings to override the defaults 16824 * @type jQuery 16825 * @cat Plugins/Metadata 16826 */ 16827$.fn.metadata = function( opts ){ 16828 return $.metadata.get( this[0], opts ); 16829}; 16830 16831})(jQuery); 16832 16833CAFE24.KAKAO_PIXEL_BRIDGE = (function() { 16834 var bUseKakaoPixel = false; 16835 var oKakaoPixelInstance; 16836 16837 return { 16838 16839 /** 16840 * ì¹´ì¹´ì¤ í½ì ì ë³´ ì¸í 16841 * @param sKakaoPixelId 16842 */ 16843 init: function (sKakaoPixelId) { 16844 if (typeof kakaoPixel !== 'function' || typeof sKakaoPixelId === 'undefined') { 16845 return; 16846 } 16847 16848 if (CAFE24.KAKAO_PIXEL_BRIDGE.bUseKakaoPixel === true) { 16849 return; 16850 } 16851 16852 try { 16853 CAFE24.KAKAO_PIXEL_BRIDGE.oKakaoPixelInstance = kakaoPixel(sKakaoPixelId); 16854 CAFE24.KAKAO_PIXEL_BRIDGE.bUseKakaoPixel = true; 16855 } catch (error) { 16856 CAFE24.KAKAO_PIXEL_BRIDGE.bUseKakaoPixel = false; 16857 } 16858 }, 16859 16860 /** 16861 * ìí ë²í¸ ë°í 16862 * @param sCheckedProduct ì íë ìí 16863 * @returns {string} 16864 */ 16865 getProductNo: function (sCheckedProduct) { 16866 return sCheckedProduct.split(':')[0]; 16867 }, 16868 16869 /** 16870 * ì¹´ì¹´ì¤í½ì validation 16871 * @param sAction ì´ë²¤í¸ ì¡ì ëª 16872 * @returns {boolean} 16873 */ 16874 getValidation: function(sAction) 16875 { 16876 return CAFE24.KAKAO_PIXEL_BRIDGE.bUseKakaoPixel === true && sAction in CAFE24.KAKAO_PIXEL_BRIDGE.oKakaoPixelInstance === true; 16877 }, 16878 16879 /** 16880 * 기본 ë°ì´í° ì¸í 16881 * @param iProductNo ìí ë²í¸ 16882 * @returns {object} 16883 */ 16884 getDefaultData: function(iProductNo) { 16885 var oData = {}; 16886 16887 if (typeof iProductNo !== 'undefined') { 16888 oData['products'] = CAFE24.KAKAO_PIXEL_BRIDGE.getProductData([iProductNo]); 16889 } 16890 16891 return oData; 16892 }, 16893 16894 /** 16895 * ìí ë°ì´í° ë°í 16896 * @param {Array} aProductNo ìíë²í¸ 16897 * @returns {Array} 16898 */ 16899 getProductData: function(aProductNo) { 16900 var aProductList = []; 16901 16902 if (Array.isArray(aProductNo) === false) { 16903 return aProductList; 16904 } 16905 16906 aProductNo.forEach(function(iProductNo) { 16907 aProductList.push({id: iProductNo}); 16908 }); 16909 16910 return aProductList; 16911 }, 16912 16913 /** 16914 * ì¥ë°êµ¬ë ë±ë¡ ì´ë²¤í¸ì ë°ì´í° ì ì¡ ì²ë¦¬ 16915 * @param iProductNo ìíë²í¸ 16916 */ 16917 addBasket: function (iProductNo) { 16918 if (CAFE24.KAKAO_PIXEL_BRIDGE.getValidation('addToCart') === false) { 16919 return; 16920 } 16921 16922 var oData = CAFE24.KAKAO_PIXEL_BRIDGE.getDefaultData(iProductNo); 16923 try { 16924 CAFE24.KAKAO_PIXEL_BRIDGE.oKakaoPixelInstance.addToCart(oData); 16925 } catch (error) {} 16926 }, 16927 16928 /** 16929 * ê´ì¬ìí ë±ë¡ ì´ë²¤í¸ì ë°ì´í° ì ì¡ ì²ë¦¬ 16930 * @param iProductNo ìíë²í¸ 16931 */ 16932 addWishList: function (iProductNo) { 16933 if (CAFE24.KAKAO_PIXEL_BRIDGE.getValidation('addToWishList') === false) { 16934 return; 16935 } 16936 16937 var oData = CAFE24.KAKAO_PIXEL_BRIDGE.getDefaultData(iProductNo); 16938 try { 16939 CAFE24.KAKAO_PIXEL_BRIDGE.oKakaoPixelInstance.addToWishList(oData); 16940 } catch (error) {} 16941 } 16942 16943 }; 16944})(); 16945 16946var EC_KakaoPixelBridge = CAFE24.getDeprecatedNamespace('KAKAO_PIXEL_BRIDGE'); 16947CAPP_SHOP_FRONT_COMMON_UTIL = { 16948 findTargetFrame: function() 16949 { 16950 //íì ì°½ ì¼ê²½ì°ìë ë°ë¡ opener를 ë°í 16951 if (CAPP_SHOP_FRONT_COMMON_UTIL.isPopupFromThisShopFront() === true) { 16952 return window.opener; 16953 } 16954 16955 try { 16956 var bIsIframe = false; 16957 var sUrl = document.location.pathname + document.location.search; 16958 16959 //parentì íë ìë´ì©ìì íì¬ì£¼ìì ëì¼ urlì ê°ì§ ìì´íë ìì´ ìë¤ë©´ ìì´íë ììì ì¤íëê²ì¼ë¡ íë¨íê³ parent를 ë°í 16960 EC$(parent.document).find('iframe').each(function() { 16961 if (sUrl === EC$(this).attr('src')) { 16962 bIsIframe = true; 16963 return false;
16964 } 16965 }); 16966 if (bIsIframe === true) { 16967 return parent; 16968 } 16969 } catch (e) {} 16970 16971 //ê·¸ ì´ì¸(ì¼ë°íì´ì§, íë ìì )ììë íì¬íì´ì§ìì ì´ëëëê²ì¼ë¡ í¨ 16972 return document; 16973 }, 16974 16975 /** 16976 * 기존 ì½ëìì í¸íì± ë문ì ë¨ê²¨ë 16977 * @return bool 16978 * @deprecated 16979 */ 16980 isAdminOpener: function() 16981 { 16982 return this.isPopupFromThisShopFront(); 16983 }, 16984 16985 /** 16986 * íì¬ ì°½ì´ ëì¼ ì¼í몰 ë´ì íë¡ í¸ìì ì´ë ¤ì§ íì ì°½ì¸ì§ ë¦¬í´ 16987 * @return bool ëì¼ ì¼í몰 ë´ì íë¡ í¸ìì ì´ë ¤ì§ íì ì°½ì´ë©´ true, ìëë©´ false 16988 */ 16989 isPopupFromThisShopFront: function() 16990 { 16991 try { 16992 // íì ì°½ì´ ìëë©´ false ë¦¬í´ 16993 if (window.opener === null) { 16994 return false; 16995 } 16996 16997 // íì¬ ì°½ì ëë©ì¸ê³¼ openerì ëë©ì¸ì´ ë¤ë¥´ë©´ false ë¦¬í´ 16998 if (window.location.host !== window.opener.location.host) { 16999 return false; 17000 } 17001 17002 // ì´ë민ì¼ë¡ë¶í° ì´ë ¤ì§ ê²½ì° false ë¦¬í´ 17003 var regAdminUrl = /^(\/admin\/php\/|\/disp\/admin\/)/; 17004 if (regAdminUrl.test(window.opener.location.pathname) === true) { 17005 return false; 17006 } 17007 17008 // íë¡ í¸ë¡ë¶í° ì´ë ¤ì§ ê²½ì°ì´ë¯ë¡ true ë¦¬í´ 17009 return true; 17010 17011 } catch (e) { 17012 // window.openerì ì ê·¼ ë¶ê°ë¥í ì¼ì´ì¤ë ì´ë¯¸ 본 ì°½ì´ ë«íê±°ë ëë©ì¸ì´ ë¤ë¥¸ ê²ì´ë¯ë¡ false ë¦¬í´ 17013 return false; 17014 17015 } 17016 }, 17017 17018 /** 17019 * urlìì íë¼ë¯¸í° ê°ì ¸ì¤ê¸° 17020 * @param string name íë¼ë¯¸í°ëª 17021 * @return string íë¼ë¯¸í° ê° 17022 */ 17023 getParameterByName: function (name) { 17024 name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); 17025 var regexS = "[\\?&]" + name + "=([^&#]*)"; 17026 var regex = new RegExp(regexS); 17027 var results = regex.exec(window.location.href); 17028 17029 if (results == null) { 17030 return ''; 17031 } else { 17032 return decodeURIComponent(results[1].replace(/\+/g, " ")); 17033 } 17034 }, 17035 17036 historyBack: function(sMsg) 17037 { 17038 if (typeof(sMsg) !== 'undefined' && sMsg !== '') { 17039 alert(sMsg); 17040 } 17041 17042 if (this.isPopupFromThisShopFront() === true) { 17043 opener = window; 17044 window.close(); 17045 } else { 17046 history.back(); 17047 } 17048 }, 17049 17050 /** 17051 * ECHOSTING-627626 ë¤ì´ë²íì´ navercheckout ì§ì ì POST í¼ ì ì¶ë¡ ì²ë¦¬íë¤. 17052 * - 기존 GET ë¤ë¹ê²ì´ì (location.href/window.open) ëì POST í¼ì¼ë¡ CA_JS ê´ê³ í¼ ë°ì´í°(analycis_form_data)를 ëë´ 17053 * (~5KB, ìµë 50KB â 쿼리ì¤í¸ë§ URL ê¸¸ì´ íê³ íí¼) 17054 * - 기존 쿼리 íë¼ë¯¸í°ë hidden ì¼ë¡ ì´ê´. CA_JS ê°ì ë²í¼ í´ë¦ ìì ì ì·¨ë(ìì¸ê²©ë¦¬, REQ-008) 17055 * - ëì ì°½(oTargetWin)ì document ì í¼ì ë§ë¤ì´ ì ì¶ â target/window.name ì¡°ì ìì´ í´ë¹ ì°½ì ì´ë 17056 * @param {string} sUrl navercheckout URL (쿼리 í¬í¨ ê°ë¥) 17057 * @param {object} oTargetWin ì´ë ëì window (self/opener/parent). 미ì§ì ì íì¬ ì°½ 17058 * @param {boolean} bNewWindow ì ì°½(window.open) ì¬ë¶ 17059 */ 17060 submitNaverCheckout: function(sUrl, oTargetWin, bNewWindow) 17061 { 17062 var sAction = sUrl; 17063 var sQuery = ''; 17064 var iPos = sUrl.indexOf('?'); 17065 if (iPos >= 0) { 17066 sAction = sUrl.substring(0, iPos); 17067 sQuery = sUrl.substring(iPos + 1); 17068 } 17069 17070 // ì ì°½ì´ë©´ íì¬ document ì ë§ë¤ê³ target ì¼ë¡ ì ì°½ ì§ì , ìëë©´ ëì ì°½ document ì ìì± 17071 var oDoc = document; 17072 if (bNewWindow !== true && oTargetWin && oTargetWin.document && oTargetWin !== window) { 17073 try { 17074 oDoc = oTargetWin.document; 17075 } catch (e) { 17076 oDoc = document; 17077 } 17078 } 17079 17080 var oForm = oDoc.createElement('form'); 17081 oForm.method = 'POST'; 17082 oForm.action = sAction; 17083 17084 // 기존 쿼리 íë¼ë¯¸í° hidden ì´ê´
17085 if (sQuery) { 17086 var aPairs = sQuery.split('&'); 17087 for (var i = 0; i < aPairs.length; i++) { 17088 if (!aPairs[i]) { continue; } 17089 var iEq = aPairs[i].indexOf('='); 17090 var sName = iEq >= 0 ? aPairs[i].substring(0, iEq) : aPairs[i]; 17091 var sVal = iEq >= 0 ? aPairs[i].substring(iEq + 1) : ''; 17092 try { sVal = decodeURIComponent(sVal); } catch (e) {} 17093 CAPP_SHOP_FRONT_COMMON_UTIL._appendHiddenInput(oForm, sName, sVal); 17094 } 17095 } 17096 17097 // CA_JS ê´ê³ í¼ ë°ì´í°(ë²í¼ í´ë¦ ìì ì·¨ë, ë¹ë¯¼ê°) â ìì¸ê²©ë¦¬ 17098 try { 17099 if (typeof CA_JS !== 'undefined' && typeof CA_JS.GET_ANLYTICS_FORM_DATA === 'function') { 17100 var oFormData = CA_JS.GET_ANLYTICS_FORM_DATA(); 17101 if (oFormData) { 17102 CAPP_SHOP_FRONT_COMMON_UTIL._appendHiddenInput(oForm, 'analycis_form_data', JSON.stringify(oFormData)); 17103 } 17104 } 17105 } catch (e) {} 17106 17107 if (bNewWindow === true) { 17108 var sName = 'navercheckout_' + (new Date()).getTime(); 17109 window.open('', sName); 17110 oForm.target = sName; 17111 } 17112 17113 oDoc.body.appendChild(oForm); 17114 oForm.submit(); 17115 if (oForm.parentNode) { 17116 oForm.parentNode.removeChild(oForm); 17117 } 17118 }, 17119 17120 /** 17121 * ECHOSTING-627626 í¼ì hidden input ì¶ê° (IE í¸í, í¼ê³¼ ëì¼ document ì¬ì©) 17122 * @param {object} oForm ëì form 17123 * @param {string} sName íëëª 17124 * @param {string} sValue ê° 17125 */ 17126 _appendHiddenInput: function(oForm, sName, sValue) 17127 { 17128 var oDoc = oForm.ownerDocument || document; 17129 var oInput; 17130 try { 17131 oInput = oDoc.createElement('<input name="' + sName + '">'); 17132 } catch (e) { 17133 oInput = oDoc.createElement('input'); 17134 oInput.setAttribute('name', sName); 17135 } 17136 oInput.setAttribute('type', 'hidden'); 17137 oInput.value = sValue; 17138 oForm.appendChild(oInput); 17139 }, 17140 17141 /** 17142 * [ECQAUNIT-75276] ìë² ë°í ìë¿(몰 ì¸ì´ 문구)ì jet-translator ë¡ íì¬ ì í ì¸ì´ë¡ ë²ìí´ íì. 17143 * ìë² __() ë 몰 ì¸ì´ 기ì¤ì´ë¼ êµê°ì í기 ì í ì¸ì´ì ë¤ë¥¼ ì ìë¤. 17144 * ìì§ ë¯¸ë¡ë/íì¬ì¸ì´==ìì¤ì¸ì´/ë²ì ì¤í¨ ì ì문 ê·¸ëë¡ íìíë¤. 17145 * (basket.js Basket._alertTranslated(ECQAINT-79580)를 ì íë¡ í¸ ê³µíµì¼ë¡ ì´ë â ë´ê¸°íì¸ì°½ 17146 * ë°ë¡êµ¬ë§¤/ê´ì¬ìí 주문 ë± basket.js 미ë¡ë íì´ì§ì 주문 exec ìë¿ë ëì¼ ì²ë¦¬) 17147 * @param {string} sMsg ìë¿ ì문 17148 */ 17149 alertTranslated: function(sMsg) 17150 { 17151 try { 17152 var fnNorm = function(sLocale) { 17153 sLocale = (sLocale == null) ? '' : String(sLocale); 17154 var oZhMap = {'zh_CN': 'zh-CN', 'zh_TW': 'zh-TW', 'zh-CN': 'zh-CN', 'zh-TW': 'zh-TW'}; 17155 if (oZhMap.hasOwnProperty(sLocale)) return oZhMap[sLocale]; 17156 return sLocale.split(/[_-]/)[0]; 17157 }; 17158 var oJT = (typeof JetTranslator === 'undefined') ? null : JetTranslator; 17159 var oShop = (typeof CAFE24 !== 'undefined' && CAFE24.SHOP) ? CAFE24.SHOP : null; 17160 var aCookie = /(?:^|; )ec_front_language=([^;]*)/.exec(document.cookie); 17161 var sCur = fnNorm(aCookie ? decodeURIComponent(aCookie[1]) : ''); 17162 var sSrc = fnNorm((oShop && typeof oShop.getLanguage === 'function') ? oShop.getLanguage() : ''); 17163 if (!oJT || typeof oJT.translateTexts !== 'function' || sCur === '' || sCur === sSrc) { 17164 alert(sMsg); 17165 return; 17166 } 17167 oJT.translateTexts([sMsg], sCur).then(function(aRes) { 17168 alert((aRes || [])[0] || sMsg); 17169 }).catch(function() { 17170 alert(sMsg); 17171 }); 17172 } catch (e) { 17173 // ë²ì ê²½ë¡ ì¤í¨ ì ì문 íìë¡ í´ë°± â ìì¸ë ì§í ì°¨ë¨ ìì´ ê¸°ë¡ë§ 17174 if (typeof console !== 'undefined' && console.debug) console.debug(e); 17175 alert(sMsg); 17176 } 17177 } 17178}; 17179 17180/** 17181 * console debug 17182 */ 17183var EC_SHOP_FRONT_DEBUG = { 17184 bConsoleOut: false, 17185 log: function() 17186 { 17187 if (this.bConsoleOut === false) { 17188 return; 17189 } 17190 if (window.console) { 17191 console.log.apply(console, arguments); 17192 } 17193 }, 17194 on: function() 17195 { 17196 this.bConsoleOut = true; 17197 localStorage.setItem('EC_SHOP_FRONT_DEBUG', '1'); 17198 console.log("%c-- debug mode ON --", "color:rgb(249, 249, 249); font-size: 15px;"); 17199 }, 17200 off: function() 17201 { 17202 this.bConsoleOut = false;
17203 localStorage.removeItem('EC_SHOP_FRONT_DEBUG'); 17204 console.log("%c-- debug mode OFF --", "color:rgb(249, 249, 249); font-size: 15px;"); 17205 } 17206}; 17207 17208// localStorage ê¸°ë° ìë íì±í 17209if (localStorage.getItem('EC_SHOP_FRONT_DEBUG') === '1') { 17210 EC_SHOP_FRONT_DEBUG.bConsoleOut = true; 17211} 17212EC$(function() { 17213 /** 17214 * ì´ë¯¸ì§ 롤ì¤ë² 17215 * */ 17216 EC$('img[id^="cate_img_"]') 17217 .parent() 17218 .mouseover(function() { 17219 var $img = EC$(this).find('img'); 17220 17221 if (!$img.attr('org_src')) $img.attr('org_src', $img.attr('src')); 17222 17223 $img.attr('src', $img.attr('rollover')); 17224 }) 17225 .mouseout(function() { 17226 var $img = EC$(this).find('img'); 17227 17228 $img.attr('src', $img.attr('org_src')); 17229 }); 17230 17231 /** 17232 * ì¹´í ê³ ë¦¬ ìì¸ë¶ë¥ë¥¼ 보기ìí ì²ë¦¬ 17233 * 모ë°ì¼ì ì¨ë§ì°ì¤ ìë¨ 17234 * -구ì¤í¨ì ë ì´ì´ 무조건 ë ¸ì¶ì¤ì´ë¼ì¬ì©ìí¨ 17235 */ 17236 if (mobileWeb != true) { 17237 EC$('.xans-product-displaycategory .button').hover( 17238 function() { 17239 EC$(this).addClass('selected'); 17240 }, 17241 function() { 17242 EC$(this).removeClass('selected'); 17243 } 17244 ); 17245 } else { 17246 try { 17247 EC$(document).on('click', '.icoClose', function (v) { 17248 EC$('.xans-product-displaycategory .button').removeClass('selected'); 17249 // event bubblingì¼ë¡ ì¶ê° 17250 return false; 17251 }); 17252 EC$(document).on('click', '.xans-product-displaycategory .button', function (v) { 17253 EC$('.xans-product-displaycategory .button').removeClass('selected'); 17254 EC$(this).closest('div .button').addClass('selected'); 17255 }); 17256 } catch (e) {} 17257 } 17258 17259 /** 17260 * ìë¸ì¹´í ê³ ë¦¬ display - mouseOver 17261 * */ 17262 /* 17263 EC$('.xans-product-listcategory a').mouseover(function(){ 17264 17265 var pNode = EC$(this).parents('li'); 17266 var sHref = EC$(this).attr('href') 17267 sHref = sHref.substr(sHref.indexOf('?')); 17268 var sUrl = '/product/sub_category.html'+sHref; 17269 17270 EC$.get(sUrl, '', function(result) { 17271 if (result != '') { 17272 EC$('#product-listcategory-read').remove(); 17273 EC$(pNode).append('<div id="product-listcategory-read">'+result+'</div>'); 17274 17275 EC$('.xans-product-subcategory').css('left', '100px'); 17276 subTop = EC$('.xans-product-subcategory').css('top').replace('px','') - 20; 17277 EC$('.xans-product-subcategory').css('top', subTop); 17278 EC$('.xans-product-subcategory').mouseover(function() { 17279 EC$('.xans-product-subcategory').show(); 17280 }); 17281 17282 } 17283 }); 17284 }); 17285 17286 EC$('.xans-product-listcategory a').mouseout(function(){ 17287 //EC$('#product-listcategory-read').remove(); 17288 }); 17289 17290 EC$('[id^="sub_cate"]').mouseout(function(){ 17291 EC$(this).css('display:none;'); 17292 }); 17293 */ 17294}); 17295 17296EC$(function() { 17297 ReferenceCurrencyPrice.init(); 17298}); 17299 17300var ReferenceCurrencyPrice = { 17301 sOriginReferCurrency : null, 17302 sReferCurrency : null, 17303 aCurrencyRate : null, 17304 aCurrencyInfo : null, 17305 sRefPrice : 'eRefPrice', 17306 sRefPriceUnitHead : 'eRefPriceUnitHead', 17307 sRefPriceUnitTail : 'eRefPriceUnitTail', 17308 17309 init : function () { 17310 var self = this; 17311 if (CAFE24.CURRENCY_INFO.isUseReferenceCurrency() !== true) { return; } 17312 this.getReferCurrency(); 17313 17314 if (this.sOriginReferCurrency !== this.sReferCurrency) { 17315 this.setShopPrice(); 17316 this.setCurrencyUnit(); 17317 } 17318 17319 }, 17320 getReferCurrency : function () { 17321 var self = this; 17322 this.sOriginReferCurrency = CAFE24.CURRENCY_INFO.getOriginReferenceCurrency(); 17323 this.sReferCurrency = EC$.cookie('EC_REFER_CURRENCY_' + CAFE24.SDE_SHOP_NUM); 17324 17325 var CURRENCY_RATE = localStorage.getItem('EC_CURRENCY_RATE'); 17326 this.aCurrencyRate = JSON.parse(CURRENCY_RATE); 17327 this.aCurrencyInfo = CAFE24.CURRENCY_INFO.getCurrencyList(this.sReferCurrency); 17328 }, 17329 setShopPrice : function () { 17330 var self = this; 17331 var rate = CAFE24.SHOP_PRICE_FORMAT.detachFormat(ReferenceCurrencyPrice.aCurrencyRate[ReferenceCurrencyPrice.sOriginReferCurrency]["rates"][ReferenceCurrencyPrice.sReferCurrency]); 17332 17333 EC$('.' + ReferenceCurrencyPrice.sRefPrice).each(function() { 17334 if (EC$(this).attr('changed') === 'changed') { return; } 17335 if (rate == 0) { 17336 var fRefPrice = 0; 17337 } else { 17338 var fOriginRefPrice = CAFE24.SHOP_PRICE_FORMAT.detachFormat(EC$(this).text()); 17339 var fRefPrice = fOriginRefPrice / rate; 17340 } 17341 17342 EC$(this).text(CAFE24.SHOP_PRICE.toPrice(fRefPrice, ReferenceCurrencyPrice.aCurrencyInfo)); 17343 EC$(this).attr('changed', 'changed'); 17344 }); 17345 17346 }, 17347 setCurrencyUnit : function () { 17348 var self = this; 17349 17350 //ííë¨ì 17351 var UnitFormat = this.aCurrencyInfo['currency_symbol']; 17352 //íµíë¨ì 17353 if (CAFE24.SHOP_CURRENCY_INFO[CAFE24.SDE_SHOP_NUM].aShopSubCurrencyInfo.display_type === 'M') { 17354 UnitFormat = this.sReferCurrency; 17355 } 17356 this.setUnitHead(UnitFormat); 17357 this.setUnitTail(); 17358 17359 }, 17360 setUnitHead : function (UnitFormat) { 17361 var self = this; 17362 EC$('.' + this.sRefPriceUnitHead).each(function() { 17363 if (EC$(this).attr('changed') === 'changed') { return; } 17364 17365 EC$(this).html(EC$(this).text().replace(/[^(\s]+/, UnitFormat)); 17366 EC$(this).attr('changed', 'changed'); 17367 }); 17368 17369 }, 17370 setUnitTail : function () { 17371 var self = this; 17372 EC$('.' + this.sRefPriceUnitTail).each(function() { 17373 if (EC$(this).attr('changed') === 'changed') { return; } 17374 17375 EC$(this).text(EC$(this).text().replace(/[^)\s]+/, '')); 17376 EC$(this).attr('changed', 'changed'); 17377 }); 17378 17379 } 17380 17381}; 17382CAFE24.SHOP_FRONT_NEW_LIKE_BROWSER_CACHE = { 17383 /** 17384 * ë¡ì»¬ ì¤í ë¦¬ì§ ì§ì ì¬ë¶ 17385 * @return bool ì§ìíë©´ true, ì§ìíì§ ìì¼ë©´ false 17386 */ 17387 isSupport: function() { 17388 if (window.localStorage) { 17389 return true; 17390 } else { 17391 return false;
17392 } 17393 }, 17394 17395 /** 17396 * ë¡ì»¬ ì¤í 리ì§ì ë°ì´í° ì í 17397 * @param string sKey í¤ 17398 * @param mixed mData ì ì¥í ë°ì´í° 17399 * @param int iLifeTime ì´ììë ìê°(ì´) (기본 1ì¼) 17400 * @return bool ì ì ì ì¥ ì¬ë¶ 17401 */ 17402 setItem: function(sKey, mData, iLifeTime) { 17403 if (this.isSupport() === false) { 17404 return false; 17405 } 17406 17407 iLifeTime = iLifeTime || 86400; 17408 17409 try { 17410 window.localStorage.setItem(sKey, JSON.stringify({ 17411 iExpireTime: Math.floor(new Date().getTime() / 1000) + iLifeTime, 17412 mContent: mData 17413 })); 17414 } catch (e) { 17415 return false; 17416 } 17417 17418 return true; 17419 }, 17420 17421 /** 17422 * ë¡ì»¬ ì¤í 리ì§ìì ë°ì´í° ë¦¬í´ 17423 * @param string sKey í¤ 17424 * @return mixed ë°ì´í° 17425 */ 17426 getItem: function(sKey) { 17427 if (this.isSupport() === false) { 17428 return null; 17429 } 17430 17431 var sData = window.localStorage.getItem(sKey); 17432 try { 17433 if (sData) { 17434 var aData = JSON.parse(sData); 17435 if (aData.iExpireTime > Math.floor(new Date().getTime() / 1000)) { 17436 return aData.mContent; 17437 } else { 17438 window.localStorage.removeItem(sKey); 17439 } 17440 } 17441 } catch (e) { } 17442 17443 return null; 17444 }, 17445 17446 /** 17447 * ë¡ì»¬ ì¤í 리ì§ìì ë°ì´í° ìì 17448 * @param string sKey í¤ 17449 */ 17450 removeItem: function(sKey) { 17451 if (this.isSupport() === false) { 17452 return; 17453 } 17454 17455 window.localStorage.removeItem(sKey); 17456 } 17457}; 17458 17459var EC_SHOP_FRONT_NEW_LIKE_BROWSER_CACHE = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_LIKE_BROWSER_CACHE'); 17460 17461/** 17462 * ì¢ìì ê´ë ¨ ê³µíµ 17463 */ 17464CAFE24.SHOP_FRONT_NEW_LIKE_COMMON = { 17465 CACHE_LIFE_TIME: 3600, 17466 CACHE_KEY_MY_LIKE_CATEGORY: 'localMyLikeCategoryNoList', 17467 CACHE_KEY_MY_LIKE_PRODUCT: 'localMyLikeProductNoList', 17468 17469 aConfig: { 17470 bIsUseLikeProduct: false, 17471 bIsUseLikeCategory: false 17472 }, 17473 17474 init: function(aConfig) { 17475 this.aConfig = aConfig; 17476 }, 17477 17478 /** 17479 * ë´ ë¶ë¥ ì¢ìì ë²í¸ 리ì¤í¸ë¥¼ ê°ì ¸ìì successCallbackFn ì½ë°± í¨ì를 ì¤íí©ëë¤. 17480 * @param function successCallbackFn ì±ê³µì ì¤íí ì½ë°± í¨ì 17481 * @param function completeCallbackFn ajax í¸ì¶ ìë£ í ì¤íí ì½ë°± í¨ì 17482 */ 17483 getMyLikeCategoryNoInList: function(successCallbackFn, completeCallbackFn) { 17484 var self = this; 17485 17486 var aData = CAFE24.SHOP_FRONT_NEW_LIKE_BROWSER_CACHE.getItem(self.CACHE_KEY_MY_LIKE_CATEGORY); 17487 if (aData !== null) { 17488 successCallbackFn(aData); 17489 if (typeof completeCallbackFn === 'function') { 17490 completeCallbackFn(); 17491 } 17492 } else { 17493 EC$.ajax({ 17494 url: '/exec/front/shop/LikeCommon', 17495 type: 'get', 17496 data: { 17497 'mode': 'getMyLikeCategoryNoInList' 17498 }, 17499 dataType: 'json', 17500 success: function(oReturn) { 17501 if (oReturn.bResult === true) { 17502 aData = oReturn.aData; 17503 CAFE24.SHOP_FRONT_NEW_LIKE_BROWSER_CACHE.setItem(self.CACHE_KEY_MY_LIKE_CATEGORY, aData, self.CACHE_LIFE_TIME); 17504 successCallbackFn(aData); 17505 } 17506 }, 17507 complete: function() { 17508 completeCallbackFn(); 17509 } 17510 }); 17511 } 17512 }, 17513 17514 /** 17515 * ë´ ë¶ë¥ ì¢ìì ë²í¸ 리ì¤í¸ ìºì를 í¼ì§í©ëë¤. 17516 */ 17517 purgeMyLikeCategoryNoInList: function() { 17518 CAFE24.SHOP_FRONT_NEW_LIKE_BROWSER_CACHE.removeItem(this.CACHE_KEY_MY_LIKE_CATEGORY); 17519 }, 17520 17521 /** 17522 * ë´ ìí ì¢ìì ë²í¸ 리ì¤í¸ë¥¼ ê°ì ¸ìì successCallbackFn ì½ë°± í¨ì를 ì¤íí©ëë¤. 17523 * @param function successCallbackFn ì±ê³µì ì¤íí ì½ë°± í¨ì 17524 * @param function completeCallbackFn ajax í¸ì¶ ìë£ í ì¤íí ì½ë°± í¨ì 17525 */ 17526 getMyLikeProductNoInList: function(successCallbackFn, completeCallbackFn) { 17527 var self = this; 17528 17529 var aData = CAFE24.SHOP_FRONT_NEW_LIKE_BROWSER_CACHE.getItem(self.CACHE_KEY_MY_LIKE_PRODUCT); 17530 if (aData !== null) { 17531 successCallbackFn(aData); 17532 if (typeof completeCallbackFn === 'function') { 17533 completeCallbackFn(); 17534 } 17535 } else { 17536 EC$.ajax({ 17537 url: '/exec/front/shop/LikeCommon', 17538 type: 'get', 17539 data: { 17540 'mode': 'getMyLikeProductNoInList' 17541 }, 17542 dataType: 'json', 17543 success: function(oReturn) { 17544 if (oReturn.bResult === true) { 17545 aData = oReturn.aData; 17546 CAFE24.SHOP_FRONT_NEW_LIKE_BROWSER_CACHE.setItem(self.CACHE_KEY_MY_LIKE_PRODUCT, aData, self.CACHE_LIFE_TIME); 17547 successCallbackFn(aData); 17548 } 17549 }, 17550 complete: function() { 17551 completeCallbackFn(); 17552 } 17553 }); 17554 } 17555 }, 17556 17557 /** 17558 * ë´ ìí ì¢ìì ë²í¸ 리ì¤í¸ ìºì를 í¼ì§í©ëë¤. 17559 */ 17560 purgeMyLikeProductNoInList: function() { 17561 CAFE24.SHOP_FRONT_NEW_LIKE_BROWSER_CACHE.removeItem(this.CACHE_KEY_MY_LIKE_PRODUCT); 17562 }, 17563 // ì«ì ê´ë ¨ ì½¤ë§ ì ê±° ì²ë¦¬(ECHOSTING-260504) 17564 getNumericRemoveCommas: function(mText) { 17565 var sSearchCommas = ','; 17566 var sReplaceEmpty = ''; 17567 17568 if (EC$.inArray(typeof(mText), ['number', 'undefined']) > -1) { 17569 return mText; 17570 } 17571 17572 while (mText.indexOf(sSearchCommas) > -1) { 17573 mText = mText.replace(sSearchCommas, sReplaceEmpty); 17574 } 17575 17576 return mText; 17577 }, 17578 // ì«ì ê´ë ¨ ì½¤ë§ ì²ë¦¬ (ECHOSTING-260504) 17579 getNumberFormat: function(iNumber) { 17580 iNumber += ''; 17581 17582 var objRegExp = new RegExp('(-?[0-9]+)([0-9]{3})'); 17583 while (objRegExp.test(iNumber)) { 17584 iNumber = iNumber.replace(objRegExp, '$1,$2'); 17585 } 17586 17587 return iNumber; 17588 } 17589}; 17590 17591var EC_SHOP_FRONT_NEW_LIKE_COMMON = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_LIKE_COMMON'); 17592 17593 17594/** 17595 * ëª©ë¡ > ë¶ë¥ ì¢ìì. 17596 */ 17597CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_CATEGORY = { 17598 bIsReady: false, // ì¢ìì í´ë¦ì¤ë¹ìë£ ì¬ë¶. 17599 bIsSetEvent: false, // ì¢ìì ë²í¼ ì´ë²¤í¸ ì§ì ì¬ë¶. 17600 aImgSrc: [], // ì¢ìì(On/Off) ìì´ì½ ê²½ë¡. 17601 aMyLikeCateNo: [], // ì ì ê° ì´ë¯¸ ì¢ìì ì íí ë¶ë¥ë²í¸ 17602 17603 // ë¶ë¥ ì¢ìì ì´ê¸°í 17604 init: function() { 17605 // ë¶ë¥ ì¢ìì ì¬ì©ìí¨ì 17606 if (CAFE24.SHOP_FRONT_NEW_LIKE_COMMON.aConfig.bIsUseLikeCategory !== true) { 17607 return; 17608 } 17609 17610 // ajax ì ì ê° ì´ë¯¸ ì¢ìì ì íí ë¶ë¥ë²í¸ ì»ê¸° + ìì´ì½ì¸í 17611 this.setLoadData(); 17612 }, 17613 17614 // ì ì ê° ì´ë¯¸ ì¢ìì ì íí ë¶ë¥ë²í¸ ì»ê¸° + ìì´ì½ì¸í
17615 setLoadData: function() { 17616 if (EC$('.likeCateIcon').count < 1) { 17617 return; 17618 } 17619 17620 var self = this; 17621 17622 CAFE24.SHOP_FRONT_NEW_LIKE_COMMON.getMyLikeCategoryNoInList(function(aData) { 17623 self.aImgSrc = aData.imgSrc; 17624 self.aMyLikeCateNo = aData.rows; 17625 17626 // ìì´ì½(on) ì¸í 17627 self.setMyLikeCategoryIconOn(); 17628 17629 // ì¢ìì í´ë¦ ì´ë²¤í¸í¸ë¤ë¬ ì§ì 17630 if (self.bIsSetEvent === false) { 17631 self.setEventHandler(); 17632 self.bIsSetEvent = true; 17633 } 17634 }, function() { 17635 self.bIsReady = true; 17636 }); 17637 }, 17638 17639 // íì´ì§ ë¡ëì ì ì ê° ì¢ììí ë¶ë¥ On.ìì´ì½ì¼ë¡ ë³ê²½ 17640 setMyLikeCategoryIconOn: function() { 17641 var aData = this.aMyLikeCateNo; 17642 17643 for (var i=0; i < aData.length; i++) { 17644 // selected ì¤íì¼ ì ì© 17645 EC$(".likeCate_" + aData[i].category_no).each(function() { 17646 EC$(this).addClass('selected'); 17647 }); 17648 17649 // ìì´ì½ ì´ë¯¸ì§ê²½ë¡ ë³ê²½ 17650 EC$(".likeCateIcon[category_no='" + aData[i].category_no + "']").each(function() { 17651 EC$(this).attr({'src': CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_CATEGORY.aImgSrc.on, 'icon_status': 'on'}); 17652 }); 17653 } 17654 }, 17655 17656 setEventHandler: function() { 17657 try { 17658 EC$(document).on('click', '.likeCate', CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_CATEGORY.clickLikeIcon); 17659 } catch (e) {} 17660 }, 17661 17662 clickLikeIcon: function() { 17663 if (CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_CATEGORY.bIsReady === false) { 17664 return; 17665 } 17666 17667 // í´ë¦í ë¶ë¥ ì¢ììì + ìì´ì½ ì ë³´ ì»ê¸° 17668 var iCateNo = EC$('.likeCateIcon', this).attr('category_no'); 17669 var sIconStatus= EC$('.likeCateIcon', this).attr('icon_status'); 17670 // ì¹´ì´í¸ string > int íì¼ë¡ ë³í (ECHOSTING-260504) 17671 var iLikeCount = CAFE24.SHOP_FRONT_NEW_LIKE_COMMON.getNumericRemoveCommas(EC$('.likeCateCount', this).text()); 17672 17673 // ìì´ì½ê²½ë¡ ë° ì¢ììì ì¦ê°ì²ë¦¬ 17674 var sNewImgSrc = sNewIconStatus = ""; 17675 var iNewLikeCount = 0; 17676 var oLikeWrapNode = EC$(".likeCate_" + iCateNo); 17677 17678 if (sIconStatus === 'on') { 17679 sNewIconStatus = 'off'; 17680 sNewImgSrc = CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_CATEGORY.aImgSrc.off; 17681 if (iLikeCount > 0) { 17682 iNewLikeCount = --iLikeCount; 17683 } 17684 17685 oLikeWrapNode.each(function() { 17686 EC$(this).removeClass('selected'); 17687 }); 17688 } else { 17689 sNewIconStatus = 'on'; 17690 sNewImgSrc = CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_CATEGORY.aImgSrc.on; 17691 iNewLikeCount = ++iLikeCount; 17692 17693 // ëì¼ìí selected ì¤íì¼ì ì© 17694 oLikeWrapNode.each(function() { 17695 EC$(this).addClass('selected'); 17696 }); 17697 } 17698 17699 // ì¢ìì ì¹´ì´í¸ number_format (ECHOSTING-260504) 17700 iNewLikeCount = CAFE24.SHOP_FRONT_NEW_LIKE_COMMON.getNumberFormat(iNewLikeCount); 17701 17702 // ëì¼ë¶ë¥ ìì´ì½ ë³ê²½ 17703 EC$(".likeCateIcon[category_no='" + iCateNo + "']").each(function() { 17704 EC$(this).attr({'src': sNewImgSrc, 'icon_status': sNewIconStatus}); 17705 }); 17706 17707 // ëì¼ë¶ë¥ ì¢ììì ë³ê²½ 17708 EC$('.likeCateCount_' + iCateNo).each(function() { 17709 EC$(this).text(iNewLikeCount); 17710 }); 17711 17712 // ajax í¸ì¶ ì¢ììì(ìí) + ë§ì´ì¼í ì¢ìì ì ì¥ 17713 CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_CATEGORY.submitMyLikeCategory(iCateNo, sNewIconStatus); 17714 }, 17715 17716 // ë¶ë¥ ì¢ììì + ë§ì´ì¼í ì¢ìì ì ì¥ 17717 submitMyLikeCategory: function(iCateNo, sIconStatus) { 17718 if (sIconStatus === 'on') { 17719 this.aMyLikeCateNo.push(iCateNo); 17720 } else { 17721 this.aMyLikeCateNo.pop(iCateNo); 17722 } 17723 17724 EC$.ajax({ 17725 url: '/exec/front/shop/LikeCommon', 17726 type: 'get', 17727 data: { 17728 'mode': 'saveMyLikeCategory', 17729 'iCateNo': iCateNo, 17730 'sIconStatus': sIconStatus 17731 }, 17732 dataType: 'json', 17733 success: function(oReturn) { 17734 if (oReturn.bResult === true) { 17735 CAFE24.SHOP_FRONT_NEW_LIKE_COMMON.purgeMyLikeCategoryNoInList(); 17736 } 17737 }, 17738 complete: function() { 17739 CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_CATEGORY.bIsReady = true; 17740 } 17741 }); 17742 } 17743}; 17744 17745var EC_SHOP_FRONT_NEW_LIKE_COMMON_CATEGORY = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_LIKE_COMMON_CATEGORY'); 17746 17747EC$(function() { 17748 CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_CATEGORY.init(); // ë¶ë¥ ì¢ìì. 17749}); 17750 17751CAFE24.SHOP_FRONT_REVIEW_TALK_REVIEW_COUNT = { 17752 aProductNo: [], bIsReviewTalk: 'F', setReviewTalkCnt: function () { 17753 var bIsUse = this.checkUseReviewTalk(); 17754 17755 if (bIsUse === true) { 17756 this.setDataProductNo(); 17757 this.setResponseCountData(); 17758 } 17759 }, 17760 17761 checkUseReviewTalk: function () { 17762 return (this.bIsReviewTalk === 'T' && EC$('.reviewtalk_review_count').length > 0) ? true : false;
17763 }, 17764 17765 setDataProductNo: function () { 17766 var aAllProductNo = []; 17767 EC$('.reviewtalk_review_count').each(function () { 17768 aAllProductNo.push(EC$(this).attr('data-product-no')); 17769 }); 17770 17771 CAFE24.SHOP_FRONT_REVIEW_TALK_REVIEW_COUNT.aProductNo = EC$.uniqueSort(aAllProductNo); 17772 }, 17773 17774 setResponseCountData: function () { 17775 if (this.aProductNo.length < 1) { 17776 return; 17777 } 17778 17779 EC$.ajax({ 17780 url: '/exec/front/shop/ApiReviewtalkReviewcnt', type: 'get', data: { 17781 'product_no': this.aProductNo.join('_') 17782 }, dataType: 'json', success: function (oResponse) { 17783 if (oResponse.result === true) { 17784 CAFE24.SHOP_FRONT_REVIEW_TALK_REVIEW_COUNT.setResponseData(oResponse.data); 17785 } 17786 } 17787 }); 17788 }, 17789 17790 //ì²ë¨ì ì½¤ë§ íì 17791 number_format: function(str) 17792 { 17793 // 3ìë¦¬ì© ,ë¡ ëì´ì ë¦¬í´ 17794 str = String(parseInt(str)); 17795 var regexp = /^(-?[0-9]+)([0-9]{3})($|\.|,)/; 17796 while (regexp.test(str)) { 17797 str = str.replace(regexp, "$1,$2$3"); 17798 } 17799 return str; 17800 }, 17801 17802 setResponseData: function (oResponseData) { 17803 var oProductReviewCnt = oResponseData; 17804 17805 if (this.checkUseReviewTalk() === true) { 17806 EC$('.reviewtalk_review_count').each(function () { 17807 var iProductNo = EC$(this).attr('data-product-no'); 17808 var sFormat = EC$(this).attr('data-format'); 17809 var iReviewCount = 0; 17810 17811 if (oProductReviewCnt.hasOwnProperty(iProductNo) === true && oProductReviewCnt[iProductNo].hasOwnProperty('review_count') === true) { 17812 iReviewCount = oProductReviewCnt[iProductNo].review_count; 17813 } 17814 17815 EC$(this).text(sFormat.replace('REVIEWTALKCOUNT', CAFE24.SHOP_FRONT_REVIEW_TALK_REVIEW_COUNT.number_format(iReviewCount))); 17816 17817 var sAddClass = 'reviewtalk_count_display_' + iReviewCount; 17818 EC$(this).parent().addClass(sAddClass); 17819 EC$(this).parent().siblings('.title').addClass(sAddClass); 17820 }); 17821 } 17822 } 17823}; 17824 17825var EC_SHOP_FRONT_REVIEW_TALK_REVIEW_COUNT = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_REVIEW_TALK_REVIEW_COUNT'); 17826 17827EC$(function () { 17828 CAFE24.SHOP_FRONT_REVIEW_TALK_REVIEW_COUNT.setReviewTalkCnt(); 17829}); 17830 17831 17832/** 17833 * ì¼í몰 ê¸ì¡ ë¼ì´ë¸ë¬ë¦¬ 17834 */ 17835CAFE24.SHOP_PRICE = { 17836 17837 /** 17838 * iShopNo ì¼í몰ì ê²°ì ííì ë§ê² 리í´í©ëë¤. 17839 * @param float fPrice ê¸ì¡ 17840 * @param bool bIsNumberFormat number_format ì ì© ì 무 17841 * @param int iShopNo ì¼í몰ë²í¸ 17842 * @return float|string 17843 */ 17844 toShopPrice: function(fPrice, bIsNumberFormat, iShopNo) 17845 { 17846 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 17847 17848 if (typeof CAFE24.SHOP_CURRENCY_INFO[undefined] == 'object') { 17849 var oCurrencyInfo = CAFE24.SHOP_CURRENCY_INFO[undefined]; 17850 } else { 17851 var oCurrencyInfo = CAFE24.SHOP_CURRENCY_INFO[iShopNo]; 17852 } 17853 17854 // ì¼í몰 ê²°ì íí ì ë³´ ì¬ì© (DB/Redis ì ì¥ì©, Presentment íì¨ ë¯¸ì ì©) 17855 var aCurrencyInfo = oCurrencyInfo.aShopCurrencyInfo; 17856 17857 return CAFE24.SHOP_PRICE.toPrice(fPrice, aCurrencyInfo, bIsNumberFormat); 17858 }, 17859 17860 /** 17861 * iShopNo ì¼í몰ì Presentment ííì ë§ê² 리í´í©ëë¤. (íë©´ íìì©) 17862 * Global-e Presentment íì± ì íì¨ ì ì© + Presentment íí ì ë³´ ì¬ì©, 17863 * ë¹íì± ì 기본 ê²°ì íí ì ë³´ ì¬ì© (toShopPriceì ëì¼ ëì) 17864 * @param float fPrice ê¸ì¡ 17865 * @param bool bIsNumberFormat number_format ì ì© ì 무 17866 * @param int iShopNo ì¼í몰ë²í¸ 17867 * @return float|string 17868 */ 17869 toShopPricePresentment: function(fPrice, bIsNumberFormat, iShopNo) 17870 { 17871 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 17872 17873 if (typeof CAFE24.SHOP_CURRENCY_INFO[undefined] == 'object') { 17874 var oCurrencyInfo = CAFE24.SHOP_CURRENCY_INFO[undefined]; 17875 } else { 17876 var oCurrencyInfo = CAFE24.SHOP_CURRENCY_INFO[iShopNo]; 17877 } 17878 17879 if (oCurrencyInfo.bPresentmentEnabled === true) { 17880 // Global-e Presentment: íì¨ ì ì© + Presentment íí ì ë³´ ì¬ì© 17881 fPrice = fPrice * (oCurrencyInfo.fExchangePresentmentRate || 0
17881); 17882 var aCurrencyInfo = oCurrencyInfo.aPresentmentCurrencyInfo; 17883 } else { 17884 // 기본: ì¼í몰 ê²°ì íí ì ë³´ ì¬ì© 17885 var aCurrencyInfo = oCurrencyInfo.aShopCurrencyInfo; 17886 } 17887 17888 return CAFE24.SHOP_PRICE.toPrice(fPrice, aCurrencyInfo, bIsNumberFormat); 17889 }, 17890 17891 /** 17892 * iShopNo ì¼í몰ì 참조ííì ë§ê² 리í´í©ëë¤. 17893 * @param float fPrice ê¸ì¡ 17894 * @param bool bIsNumberFormat number_format ì ì© ì 무 17895 * @param int iShopNo ì¼í몰ë²í¸ 17896 * @return float|string 17897 */ 17898 toShopSubPrice: function(fPrice, bIsNumberFormat, iShopNo) 17899 { 17900 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 17901 17902 if (typeof CAFE24.SHOP_CURRENCY_INFO[undefined] == 'object') { 17903 var oCurrencyInfo = CAFE24.SHOP_CURRENCY_INFO[undefined]; 17904 } else { 17905 var oCurrencyInfo = CAFE24.SHOP_CURRENCY_INFO[iShopNo]; 17906 } 17907 17908 // Presentment íì± ì 참조íí íì ë¹íì±í 17909 if (oCurrencyInfo.bPresentmentEnabled === true) { 17910 return ''; 17911 } 17912 17913 // 참조íí ì ë³´ 17914 var aSubCurrencyInfo = oCurrencyInfo.aShopSubCurrencyInfo; 17915 17916 if (! aSubCurrencyInfo) { 17917 // 참조ííê° ìì¼ë©´ 17918 return ''; 17919 17920 } else { 17921 var aCurrencyInfo = oCurrencyInfo.aShopCurrencyInfo; 17922 17923 if (aSubCurrencyInfo.currency_code === aCurrencyInfo.currency_code) { 17924 // ê²°ì ííì 참조ííê° ëì¼íë©´ 17925 return ''; 17926 } else { 17927 return CAFE24.SHOP_PRICE.toPrice(fPrice, aSubCurrencyInfo, bIsNumberFormat); 17928 } 17929 } 17930 }, 17931 17932 /** 17933 * ì¼í몰ì 기ì¤ííì ë§ê² 리í´í©ëë¤. 17934 * @param float fPrice ê¸ì¡ 17935 * @param bool bIsNumberFormat number_format ì ì© ì 무 17936 * @param int iShopNo ì¼í몰ë²í¸ 17937 * @return float 17938 */ 17939 toBasePrice: function(fPrice, bIsNumberFormat, iShopNo) 17940 { 17941 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 17942 17943 // 기ì¤íí ì ë³´ 17944 if (typeof CAFE24.SHOP_CURRENCY_INFO[undefined] == 'object') { 17945 var aBaseCurrencyInfo = CAFE24.SHOP_CURRENCY_INFO[undefined].aBaseCurrencyInfo; 17946 } else { 17947 var aBaseCurrencyInfo = CAFE24.SHOP_CURRENCY_INFO[iShopNo].aBaseCurrencyInfo; 17948 } 17949 17950 return CAFE24.SHOP_PRICE.toPrice(fPrice, aBaseCurrencyInfo, bIsNumberFormat); 17951 }, 17952 17953 /** 17954 * ê²°ì íí ê¸ì¡ì 참조íí ê¸ì¡ì¼ë¡ ë³ííì¬ ë¦¬í´í©ëë¤. 17955 * @param float fPrice ê¸ì¡ 17956 * @param bool bIsNumberFormat number_format ì ì© ì 무 17957 * @param int iShopNo ì¼í몰ë²í¸ 17958 * @return float 참조íí ê¸ì¡ 17959 */ 17960 shopPriceToSubPrice: function(fPrice, bIsNumberFormat, iShopNo) 17961 { 17962 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 17963 17964 if (typeof CAFE24.SHOP_CURRENCY_INFO[undefined] == 'object') { 17965 var oCurrencyInfo = CAFE24.SHOP_CURRENCY_INFO[undefined]; 17966 } else { 17967 var oCurrencyInfo = CAFE24.SHOP_CURRENCY_INFO[iShopNo]; 17968 } 17969 17970 // Presentment íì± ì 참조íí íì ë¹íì±í 17971 if (oCurrencyInfo.bPresentmentEnabled === true) { 17972 return ''; 17973 } 17974 17975 // ê²°ì íí ê¸ì¡ => 참조íí ê¸ì¡ 17976 fPrice = fPrice * (oCurrencyInfo.fExchangeSubRate || 0); 17977 17978 return CAFE24.SHOP_PRICE.toShopSubPrice(fPrice, bIsNumberFormat, iShopNo); 17979 }, 17980 17981 /** 17982 * ê²°ì íí ëë¹ ê¸°ì¤íí íì¨ ë¦¬í´ 17983 * @param int iShopNo ì¼í몰ë²í¸ 17984 * @return float ê²°ì íí ëë¹ ê¸°ì¤íí íì¨ 17985 */ 17986 getRate: function(iShopNo) 17987 { 17988 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 17989 17990 if (typeof CAFE24.SHOP_CURRENCY_INFO[undefined] == 'object') { 17991 return CAFE24.SHOP_CURRENCY_INFO[undefined].fExchangeRate; 17992 } else { 17993 return CAFE24.SHOP_CURRENCY_INFO[iShopNo].fExchangeRate; 17994 } 17995 }, 17996 17997 /** 17998 * ê²°ì íí ëë¹ ì°¸ì¡°íí íì¨ ë¦¬í´ 17999 * @param int iShopNo ì¼í몰ë²í¸ 18000 * @return float ê²°ì íí ëë¹ ì°¸ì¡°íí íì¨ (참조ííê° ìë ê²½ì° nullì 리í´í©ëë¤.) 18001 */ 18002 getSubRate: function(iShopNo) 18003 { 18004 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18005 18006 if (typeof CAFE24.SHOP_CURRENCY_INFO[undefined] == 'object') { 18007 return CAFE24.SHOP_CURRENCY_INFO[undefined].fExchangeSubRate; 18008 } else { 18009 return CAFE24.SHOP_CURRENCY_INFO[iShopNo].fExchangeSubRate; 18010 } 18011 }, 18012 18013 /**
18014 * ê¸ì¡ì ìíë ííì½ëì ì ì½ì¡°ê±´(ììì ì ì)ì ë§ì¶° 리í´í©ëë¤. 18015 * @param float fPrice ê¸ì¡ 18016 * @param string aCurrencyInfo ìíë ííì íí ì ë³´ 18017 * @param bool bIsNumberFormat number_format ì ì© ì 무 18018 * @return float|string 18019 */ 18020 toPrice: function(fPrice, aCurrencyInfo, bIsNumberFormat) 18021 { 18022 // ììì ìë ì ì 18023 var iPow = Math.pow(10, aCurrencyInfo['decimal_place']); 18024 fPrice = fPrice * iPow; 18025 if (aCurrencyInfo['round_method_type'] === 'F') { 18026 fPrice = Math.floor(fPrice); 18027 } else if (aCurrencyInfo['round_method_type'] === 'C') { 18028 fPrice = Math.ceil(fPrice); 18029 } else { 18030 fPrice = Math.round(fPrice); 18031 } 18032 fPrice = fPrice / iPow; 18033 18034 if (! fPrice) { 18035 // ê°ê²©ì´ ìë ê²½ì° 18036 return 0; 18037 18038 } else if (bIsNumberFormat === true) { 18039 // 3ìë¦¬ì© ,ë¡ ëì´ì ë¦¬í´ 18040 var sPrice = fPrice.toFixed(aCurrencyInfo['decimal_place']); 18041 var regexp = /^(-?[0-9]+)([0-9]{3})($|\.|,)/; 18042 while (regexp.test(sPrice)) { 18043 sPrice = sPrice.replace(regexp, "$1,$2$3"); 18044 } 18045 return sPrice; 18046 18047 } else { 18048 // ì«ìë§ ë¦¬í´ 18049 return fPrice; 18050 18051 } 18052 } 18053}; 18054 18055var SHOP_PRICE = CAFE24.getDeprecatedNamespace('SHOP_PRICE'); 18056/** 18057 * íí í¬ë§· 18058 */ 18059CAFE24.SHOP_CURRENCY_FORMAT = { 18060 /** 18061 * ì´ë민 íì´ì§ì¸ì§ 18062 * @var bool 18063 */ 18064 _bIsAdmin: /^\/(admin\/php|disp\/admin|exec\/admin)\//.test(location.pathname) ? true : false, 18065 18066 /** 18067 * iShopNo ì¼í몰ì ê²°ì íí í¬ë§·ì 리í´í©ëë¤. 18068 * @param int iShopNo ì¼í몰ë²í¸ 18069 * @return array head,tail 18070 */ 18071 getShopCurrencyFormat: function(iShopNo) 18072 { 18073 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18074 18075 // ê²°ì íí ì½ë 18076 var sCurrencyCode = CAFE24.SHOP_CURRENCY_INFO[iShopNo].aShopCurrencyInfo.currency_code; 18077 18078 if (CAFE24.SHOP_CURRENCY_FORMAT._bIsAdmin === true) { 18079 // ì´ë민 18080 18081 // 기ì¤íí ì½ë 18082 var sBaseCurrencyCode = CAFE24.SHOP_CURRENCY_INFO[iShopNo].aBaseCurrencyInfo.currency_code; 18083 18084 if (sCurrencyCode === sBaseCurrencyCode) { 18085 // ê²°ì ííì 기ì¤ííê° ëì¼í ê²½ì° 18086 return { 18087 'head': '', 18088 'tail': '' 18089 }; 18090 18091 } else { 18092 return { 18093 'head': sCurrencyCode + ' ', 18094 'tail': '' 18095 }; 18096 } 18097 18098 } else { 18099 // íë¡ í¸ 18100 if (CAFE24.SHOP_CURRENCY_INFO[iShopNo].bPresentmentEnabled === true) { 18101 return CAFE24.SHOP_CURRENCY_INFO[iShopNo].aFrontPresentmentCurrencyFormat; 18102 } 18103 return CAFE24.SHOP_CURRENCY_INFO[iShopNo].aFrontCurrencyFormat; 18104 } 18105 }, 18106 18107 /** 18108 * iShopNo ì¼í몰ì 참조ííì í¬ë§·ì 리í´í©ëë¤. 18109 * @param int iShopNo ì¼í몰ë²í¸ 18110 * @return array head,tail 18111 */ 18112 getShopSubCurrencyFormat: function(iShopNo) 18113 { 18114 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18115 18116 // 참조íí ì ë³´ 18117 var aSubCurrencyInfo = CAFE24.SHOP_CURRENCY_INFO[iShopNo].aShopSubCurrencyInfo; 18118 18119 if (! aSubCurrencyInfo) { 18120 // 참조ííê° ìì¼ë©´ 18121 return { 18122 'head': '', 18123 'tail': '' 18124 }; 18125 18126 } else if (CAFE24.SHOP_CURRENCY_FORMAT._bIsAdmin === true) { 18127 // ì´ë민 18128 return { 18129 'head': '(' + aSubCurrencyInfo.currency_code + ' ', 18130 'tail': ')' 18131 }; 18132 18133 } else { 18134 // íë¡ í¸ 18135 return CAFE24.SHOP_CURRENCY_INFO[iShopNo].aFrontSubCurrencyFormat; 18136 } 18137 18138 }, 18139 18140 /** 18141 * ì¼í몰ì 기ì¤ííì í¬ë§·ì 리í´í©ëë¤. 18142 * @param int iShopNo ì¼í몰ë²í¸ 18143 * @return array head,tail 18144 */ 18145 getBaseCurrencyFormat: function(iShopNo) 18146 { 18147 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18148 18149 // 기ì¤íí ì½ë 18150 var sBaseCurrencyCode = CAFE24.SHOP_CURRENCY_INFO[iShopNo].aBaseCurrencyInfo.currency_code; 18151 18152 // ê²°ì íí ì½ë 18153 var sCurrencyCode = CAFE24.SHOP_CURRENCY_INFO[iShopNo].aShopCurrencyInfo.currency_code; 18154 18155 if (sCurrencyCode === sBaseCurrencyCode) { 18156 // 기ì¤ííì ê²°ì ííê° ëì¼íë©´ 18157 return { 18158 'head': '', 18159 'tail': '' 18160 }; 18161 18162 } else { 18163 // ì´ë민 18164 return { 18165 'head': '(' + sBaseCurrencyCode + ' ', 18166 'tail': ')' 18167 }; 18168 18169 } 18170 }, 18171 18172 /** 18173 * ê¸ì¡ ì ë ¥ë íí í¬ë§·ì© head,tail 18174 * @param int iShopNo ì¼í몰ë²í¸ 18175 * @return array head,tail 18176 */ 18177 getInputFormat: function(iShopNo) 18178 { 18179 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18180 18181 var sCurrencyCode = CAFE24.SHOP_CURRENCY_INFO[iShopNo].aShopCurrencyInfo; 18182 18183 // ë©í°ì¼íëª°ì´ ìëê³ ë¨ìê° 'ìí'ì¸ ê²½ì° 18184 if (SHOP.isMultiShop() === false && sCurrencyCode === 'KRW') { 18185 return { 18186 'head': '', 18187 'tail': 'ì' 18188 }; 18189 18190 } else { 18191 return { 18192 'head': '', 18193 'tail': sCurrencyCode 18194 }; 18195 } 18196 }, 18197 18198 /** 18199 * í´ë¹ëª° ê²°ì íí ì½ë ë°í 18200 * ECHOSTING-266141 ëì 18201 * êµë¬¸ 기본몰 ì¼ ê²½ì°ìë ííì½ëê° ìë 'ì' ì¼ë¡ ë°í 18202 * 18203 * @param int iShopNo ì¼í몰ë²í¸ 18204 * @return string currency_code 18205 */ 18206 getCurrencyCode: function(iShopNo) 18207 { 18208 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18209 18210 var sCurrencyCode = CAFE24.SHOP_CURRENCY_INFO[iShopNo].aShopCurrencyInfo.currency_code; 18211 18212 // ë©í°ì¼íëª°ì´ ìëê³ ë¨ìê° 'ìí'ì¸ ê²½ì° 18213 if (SHOP.isMultiShop() === false && sCurrencyCode === 'KRW') { 18214 return 'ì'; 18215 } else { 18216 return sCurrencyCode; 18217 } 18218 } 18219 18220}; 18221 18222var SHOP_CURRENCY_FORMAT = CAFE24.getDeprecatedNamespace('SHOP_CURRENCY_FORMAT'); 18223 18224/** 18225 * ê¸ì¡ í¬ë§· 18226 */ 18227CAFE24.SHOP_PRICE_FORMAT = { 18228 /** 18229 * iShopNo ì¼í몰ì ê²°ì ííì ë§ëë¡ íê³ í¬ë§·í íì¬ ë¦¬í´í©ëë¤. 18230 * @param float fPrice ê¸ì¡ 18231 * @param int iShopNo ì¼í몰ë²í¸ 18232 * @return string 18233 */ 18234 toShopPrice: function(fPrice, iShopNo) 18235 { 18236 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18237 18238 var aFormat = CAFE24.SHOP_CURRENCY_FORMAT.getShopCurrencyFormat(iShopNo); 18239 var sPrice = CAFE24.SHOP_PRICE.toShopPrice(fPrice, true, iShopNo); 18240 return aFormat.head + sPrice + aFormat.tail; 18241 }, 18242 18243 /** 18244 * iShopNo ì¼í몰ì Presentment ííì ë§ëë¡ íê³ í¬ë§·í íì¬ ë¦¬í´í©ëë¤. (íë©´ íìì©) 18245 * Global-e Presentment íì± ì íì¨ ì ì© + Presentment íí í¬ë§· ì¬ì©, 18246 * ë¹íì± ì 기본 ê²°ì íí í¬ë§· ì¬ì© (toShopPriceì ëì¼ ëì) 18247 * @param float fPrice ê¸ì¡ 18248 * @param int iShopNo ì¼í몰ë²í¸ 18249 * @return string 18250 */ 18251 toShopPricePresentment: function(fPrice, iShopNo) 18252 { 18253 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18254 18255 var oCurrencyInfo = CAFE24.SHOP_CURRENCY_INFO[iShopNo] || CAFE24.SHOP_CURRENCY_INFO[undefined]; 18256 var aFormat; 18257 if (oCurrencyInfo && oCurrencyInfo.bPresentmentEnabled === true) { 18258 aFormat = oCurrencyInfo.aFrontPresentmentCurrencyFormat; 18259 } else { 18260 aFormat = CAFE24.SHOP_CURRENCY_FORMAT.getShopCurrencyFormat(iShopNo); 18261 } 18262 var sPrice = CAFE24.SHOP_PRICE.toShopPricePresentment(fPrice, true, iShopNo); 18263 return aFormat.head + sPrice + aFormat.tail; 18264 }, 18265 18266 /** 18267 * iShopNo ì¼í몰ì 참조ííì ë§ëë¡ íê³ í¬ë§·í íì¬ ë¦¬í´í©ëë¤. 18268 * @param float fPrice ê¸ì¡ 18269 * @param int iShopNo ì¼í몰ë²í¸ 18270 * @return string 18271 */ 18272 toShopSubPrice: function(fPrice, iShopNo) 18273 { 18274 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18275 18276 var aFormat = CAFE24.SHOP_CURRENCY_FORMAT.getShopSubCurrencyFormat(iShopNo); 18277 var sPrice = CAFE24.SHOP_PRICE.toShopSubPrice(fPrice, true, iShopNo); 18278 return aFormat.head + sPrice + aFormat.tail; 18279 }, 18280 18281 /** 18282 * ì¼í몰ì 기ì¤ííì ë§ëë¡ íê³ í¬ë§·í íì¬ ë¦¬í´í©ëë¤. 18283 * @param float fPrice ê¸ì¡ 18284 * @param int iShopNo ì¼í몰ë²í¸ 18285 * @return string 18286 */ 18287 toBasePrice: function(fPrice, iShopNo) 18288 { 18289 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18290 18291 var aFormat = CAFE24.SHOP_CURRENCY_FORMAT.getBaseCurrencyFormat(iShopNo); 18292 var sPrice = CAFE24.SHOP_PRICE.toBasePrice(fPrice, true, iShopNo); 18293 return aFormat.head + sPrice + aFormat.tail; 18294 }, 18295 18296 /** 18297 * ê²°ì íí ê¸ì¡ì 참조íí ê¸ì¡ì¼ë¡ ë³ííê³ í¬ë§·í íì¬ ë¦¬í´í©ëë¤. 18298 * @param float fPrice ê¸ì¡ 18299 * @param int iShopNo ì¼í몰ë²í¸ 18300 * @return string 18301 */ 18302 shopPriceToSubPrice: function(fPrice, iShopNo) 18303 { 18304 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18305 18306 18307 var aFormat = CAFE24.SHOP_CURRENCY_FORMAT.getShopSubCurrencyFormat(iShopNo); 18308 var sPrice = CAFE24.SHOP_PRICE.shopPriceToSubPrice(fPrice, true, iShopNo); 18309 18310 if (CAFE24.CURRENCY_INFO.isUseReferenceCurrency() !== true) { return sPrice; } 18311 18312 return '<span class="eRefPriceUnitHead">' + aFormat.head + '</span><span class="eRefPrice">' + sPrice + '</span><span class="eRefPriceUnitTail">' + aFormat.tail + '</span>'; 18313 }, 18314 18315 18316 /** 18317 * ê¸ì¡ì ì ë¦½ê¸ ë¨ì ëª ì¹ ì¤ì ì ë°ë¼ ë°í 18318 * @param float fPrice ê¸ì¡ 18319 * @return float|string 18320 */ 18321 toShopMileagePrice: function (fPrice, iShopNo) { 18322 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18323 18324 var sPrice = CAFE24.SHOP_PRICE.toShopPrice(fPrice, true, iShopNo); 18325 if (typeof sMileageUnit !== 'undefined' && CAFE24.UTIL.trim(sMileageUnit) != '') { 18326 sConvertMileageUnit = sMileageUnit.replace('[:PRICE:]', sPrice); 18327 return sConvertMileageUnit; 18328 } else { 18329 return CAFE24.SHOP_PRICE_FORMAT.toShopPrice(fPrice); 18330 } 18331 }, 18332 18333 /** 18334 * ê¸ì¡ì ìì¹ê¸ ë¨ì ëª ì¹ ì¤ì ì ë°ë¼ ë°í 18335 * @param float fPrice ê¸ì¡ 18336 * @return float|string 18337 */ 18338 toShopDepositPrice: function (fPrice, iShopNo) { 18339 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18340 18341 var sPrice = CAFE24.SHOP_PRICE.toShopPrice(fPrice, true, iShopNo); 18342 if (typeof sDepositUnit !== 'undefined' || CAFE24.UTIL.trim(sDepositUnit) != '') { 18343 return sPrice + sDepositUnit; 18344 } else { 18345 return CAFE24.SHOP_PRICE_FORMAT.toShopPrice(fPrice); 18346 } 18347 }, 18348 18349 /** 18350 * ECHOSTING-610183 Presentment: ê¸ì¡ì ì ë¦½ê¸ ë¨ì ëª ì¹ ì¤ì ì ë°ë¼ presentment ííë¡ ë°í 18351 * @param float fPrice ê¸ì¡ (KRW 기ì¤) 18352 * @param int iShopNo ì¼í몰ë²í¸ 18353 * @return string 18354 */ 18355 toShopMileagePricePresentment: function (fPrice, iShopNo) { 18356 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18357 18358 var sPrice = CAFE24.SHOP_PRICE.toShopPricePresentment(fPrice, true, iShopNo); 18359 if (typeof sMileageUnit !== 'undefined' && CAFE24.UTIL.trim(sMileageUnit) != '') { 18360 return sMileageUnit.replace('[:PRICE:]', sPrice); 18361 } else { 18362 return CAFE24.SHOP_PRICE_FORMAT.toShopPricePresentment(fPrice); 18363 } 18364 }, 18365 18366 /** 18367 * ECHOSTING-610183 Presentment: ê¸ì¡ì ìì¹ê¸ ë¨ì ëª ì¹ ì¤ì ì ë°ë¼ presentment ííë¡ ë°í 18368 * @param float fPrice ê¸ì¡ (KRW 기ì¤) 18369 * @param int iShopNo ì¼í몰ë²í¸ 18370 * @return string 18371 */ 18372 toShopDepositPricePresentment: function (fPrice, iShopNo) { 18373 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18374 18375 var sPrice = CAFE24.SHOP_PRICE.toShopPricePresentment(fPrice, true, iShopNo); 18376 if (typeof sDepositUnit !== 'undefined' || CAFE24.UTIL.trim(sDepositUnit) != '') { 18377 return sPrice + sDepositUnit; 18378 } else { 18379 return CAFE24.SHOP_PRICE_FORMAT.toShopPricePresentment(fPrice); 18380 } 18381 }, 18382 18383 /** 18384 * ê¸ì¡ì ë¶ê°ê²°ì ìë¨(íµí©í¬ì¸í¸) ë¨ì ëª ì¹ ì¤ì ì ë°ë¼ ë°í 18385 * @param float fPrice ê¸ì¡ 18386 * @return float|string 18387 */ 18388 toShopAddpaymentPrice: function (fPrice, sAddpaymentUnit, iShopNo) { 18389 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18390 18391 var sPrice = CAFE24.SHOP_PRICE.toShopPrice(fPrice, true, iShopNo); 18392 if (typeof sDepositUnit !== 'undefined' || CAFE24.UTIL.trim(sDepositUnit) != '') { 18393 return sPrice + sAddpaymentUnit; 18394 } else { 18395 return CAFE24.SHOP_PRICE_FORMAT.toShopPrice(fPrice); 18396 } 18397 }, 18398 18399 /** 18400 * í¬ë§·ì ì ì¸í ê¸ì¡ì ë³´ë§ ë¦¬í´í©ëë¤. 18401 * @param {string} sFormattedPrice 18402 * @returns {string} 18403 */ 18404 detachFormat: function(sFormattedPrice) { 18405 if (typeof sFormattedPrice === 'undefined' || sFormattedPrice === null) { 18406 return '0'; 18407 } 18408 18409 var sPattern = /[0-9.]/; 18410 var sPrice = ''; 18411 for (var i = 0; i < sFormattedPrice.length; i++) { 18412 if (sPattern.test(sFormattedPrice[i])) { 18413 sPrice += sFormattedPrice[i]; 18414 } 18415 } 18416 18417 return sPrice; 18418 } 18419}; 18420 18421var SHOP_PRICE_FORMAT = CAFE24.getDeprecatedNamespace('SHOP_PRICE_FORMAT'); 18422CAFE24.SHOP_PRICE_UTIL = { 18423 /** 18424 * iShopNo ì¼í몰ì ê²°ì íí ê¸ì¡ ì ë ¥í¼ì¼ë¡ ë§ëëë¤. 18425 * @param Element elem ì ë ¥í¼ 18426 * @param bool bUseMinus ë§ì´ëì¤ ì ë ¥ ì¬ì© ì¬ë¶ 18427 */ 18428 toShopPriceInput: function(elem, iShopNo, bUseMinus) 18429 { 18430 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18431 18432 var iDecimalPlace = CAFE24.SHOP_CURRENCY_INFO[iShopNo].aShopCurrencyInfo.decimal_place; 18433 bUseMinus ? CAFE24.SHOP_PRICE_UTIL._toPriceInput(elem, i
18433DecimalPlace, bUseMinus) : CAFE24.SHOP_PRICE_UTIL._toPriceInput(elem, iDecimalPlace); 18434 }, 18435 18436 /** 18437 * iShopNo ì¼í몰ì 참조íí ê¸ì¡ ì ë ¥í¼ì¼ë¡ ë§ëëë¤. 18438 * @param Element elem ì ë ¥í¼ 18439 */ 18440 toShopSubPriceInput: function(elem, iShopNo) 18441 { 18442 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18443 18444 var iDecimalPlace = CAFE24.SHOP_CURRENCY_INFO[iShopNo].aShopSubCurrencyInfo.decimal_place; 18445 CAFE24.SHOP_PRICE_UTIL._toPriceInput(elem, iDecimalPlace); 18446 }, 18447 18448 /** 18449 * iShopNo ì¼í몰ì 기ì¤íí ê¸ì¡ ì ë ¥í¼ì¼ë¡ ë§ëëë¤. 18450 * @param Element elem ì ë ¥í¼ 18451 */ 18452 toBasePriceInput: function(elem, iShopNo) 18453 { 18454 iShopNo = parseInt(iShopNo) || CAFE24.SDE_SHOP_NUM; 18455 18456 var iDecimalPlace = CAFE24.SHOP_CURRENCY_INFO[iShopNo].aBaseCurrencyInfo.decimal_place; 18457 CAFE24.SHOP_PRICE_UTIL._toPriceInput(elem, iDecimalPlace); 18458 }, 18459 18460 /** 18461 * ììì iDecimalPlaceê¹ì§ë§ ì ë ¥ ê°ë¥íëë¡ ì²ë¦¬ 18462 * @param Element elem ì ë ¥í¼ 18463 * @param int iDecimalPlace íì© ììì 18464 * @param bool bUseMinus ë§ì´ëì¤ ì ë ¥ ì¬ì© ì¬ë¶ 18465 */ 18466 _toPriceInput: function(elem, iDecimalPlace, bUseMinus) 18467 { 18468 attachEvent(elem, 'keyup', function(e) { 18469 e = e || window.event; 18470 bUseMinus ? replaceToMinusPrice(e.srcElement) : replaceToPrice(e.srcElement); 18471 }); 18472 attachEvent(elem, 'blur', function(e) { 18473 e = e || window.event; 18474 bUseMinus ? replaceToMinusPrice(e.srcElement) : replaceToPrice(e.srcElement); 18475 }); 18476 18477 // ì¶ê°ê¸ì¡ìì ë§ì´ëì¤ë¥¼ ì ë ¥ë°ê¸° ìí´ ì¬ì© 18478 function replaceToMinusPrice(target) { 18479 var value = target.value; 18480 18481 var regExpTest = new RegExp('^[0-9]*' + (iDecimalPlace ? '' : '\\.[0-9]{0, ' + iDecimalPlace + '}') + '$'); 18482 18483 if (regExpTest.test(value) === false) { 18484 value = value.replace(/[^0-9.|\-]/g, ''); 18485 if (parseInt(iDecimalPlace)) { 18486 value = value.replace(/^([0-9]+\.[0-9]+)\.+.*$/, '$1'); 18487 value = value.replace(new RegExp('(\\.[0-9]{' + iDecimalPlace + '})[0-9]*$'), '$1'); 18488 } else { 18489 value = value.replace(/[^(0-9|\-)]/g, ''); 18490 } 18491 target.value = value; 18492 } 18493 } 18494 18495 function replaceToPrice(target) 18496 { 18497 var value = target.value; 18498 18499 var regExpTest = new RegExp('^[0-9]*' + (iDecimalPlace ? '' : '\\.[0-9]{0, ' + iDecimalPlace + '}') + '$'); 18500 if (regExpTest.test(value) === false) { 18501 value = value.replace(/[^0-9.]/g, ''); 18502 if (parseInt(iDecimalPlace)) { 18503 value = value.replace(/^([0-9]+\.[0-9]+)\.+.*$/, '$1'); 18504 value = value.replace(new RegExp('(\\.[0-9]{' + iDecimalPlace + '})[0-9]*$'), '$1'); 18505 } else { 18506 value = value.replace(/\.+[0-9]*$/, ''); 18507 } 18508 target.value = value; 18509 } 18510 } 18511 18512 function attachEvent(elem, sEventName, fn) 18513 { 18514 if (elem.addEventListener) { 18515 elem.addEventListener(sEventName, fn, false); 18516 18517 } else if (elem.attachEvent) { 18518 elem.attachEvent("on" + sEventName, fn); 18519 } 18520 } 18521 18522 } 18523}; 18524 18525if (window.jQuery !== undefined) { 18526 $.fn.extend({ 18527 toShopPriceInput: function(iShopNo) 18528 { 18529 return this.each(function() { 18530 var iElementShopNo = $(this).data('shop_no') || iShopNo; 18531 CAFE24.SHOP_PRICE_UTIL.toShopPriceInput(this, iElementShopNo); 18532 }); 18533 }, 18534 toShopSubPriceInput: function(iShopNo) 18535 { 18536 return this.each(function() { 18537 var iElementShopNo = $(this).data('shop_no') || iShopNo; 18538 CAFE24.SHOP_PRICE_UTIL.toShopSubPriceInput(this, iElementShopNo); 18539 }); 18540 }, 18541 toBasePriceInput: function(iShopNo) 18542 { 18543 return this.each(function() { 18544 var iElementShopNo = $(this).data('shop_no') || iShopNo; 18545 CAFE24.SHOP_PRICE_UTIL.toBasePriceInput(this, iElementShopNo); 18546 }); 18547 } 18548 }); 18549} 18550 18551// EC$ ë³ì¹ì© 18552if (typeof window.EC$ === 'function') { 18553 EC$.fn.extend({ 18554 toShopPriceInput: function(iShopNo) 18555 { 18556 return this.each(function() { 18557 var iElementShopNo = EC$(this).data('shop_no') || iShopNo; 18558 CAFE24.SHOP_PRICE_UTIL.toShopPriceInput(this, iElementShopNo); 18559 }); 18560 }, 18561 toShopSubPriceInput: function(iShopNo) 18562 { 18563 return this.each(function() { 18564 var iElementShopNo = EC$(this).data('shop_no') || iShopNo; 18565 CAFE24.SHOP_PRICE_UTIL.toShopSubPriceInput(this, iElementShopNo); 18566 }); 18567 }, 18568 toBasePriceInput: function(iShopNo) 18569 { 18570 return this.each(function() { 18571 var iElementShopNo = EC$(this).data('shop_no') || iShopNo; 18572 CAFE24.SHOP_PRICE_UTIL.toBasePriceInput(this, iElementShopNo); 18573 }); 18574 } 18575 }); 18576} 18577 18578var SHOP_PRICE_UTIL = CAFE24.getDeprecatedNamespace('SHOP_PRICE_UTIL'); 18579/** 18580 * FwValidator 18581 * 18582 * @package jquery 18583 * @subpackage validator 18584 */ 18585 18586var FwValidator = { 18587 18588 /** 18589 * ëë²ê·¸ 모ë 18590 */ 18591 DEBUG_MODE : false, 18592 18593 /** 18594 * ê²°ê³¼ ì½ë 18595 */ 18596 CODE_SUCCESS : true, 18597 CODE_FAIL : false, 18598 18599 /** 18600 * ì´í¸ë¦¬ë·°í¸ ëª 18601 */ 18602 ATTR_FILTER : 'fw-filter', 18603 ATTR_MSG : 'fw-msg', 18604 ATTR_LABEL : 'fw-label', 18605 ATTR_FIREON : 'fw-fireon', 18606 ATTR_ALONE : 'fw-alone', 18607 18608 /** 18609 * ìëµê°ì²´ë¤ 18610 */ 18611 responses : {}, 18612 18613 /** 18614 * ì리먼í¸ë³ íì ì ë ¥ ìë¬ ë©ì¸ì§ 18615 */ 18616 requireMsgs : {}, 18617 18618 /** 18619 * ì리먼í¸ì í¹ì íí°ë³ ìë¬ ë©ì¸ì§ 18620 */ 18621 elmFilterMsgs : {}, 18622 18623 /** 18624 * jQuery ë³ì¹ ì ì 18625 * EC$ ê° ê¸°ë³¸ì¼ë¡ ë¡ëëì§ ìë íê²½ìì ì¬ì©ìì ëí ì²ë¦¬ 18626 */ 18627 jQuery : window.EC$ || window.$, 18628 18629 /** 18630 * Validator 기본 ì´ë²¤í¸ ë±ë¡ 18631 */ 18632 bind : function(formId, expand) { 18633 18634 var self = this; 18635 var formInfo = this.Helper.getFormInfo(formId); 18636 18637 if (formInfo === false) { 18638 alert('The form does not exist - bind'); 18639 return false;
18640 } 18641 18642 var elmForm = formInfo.instance; 18643 18644 var Response = this._response(formId); 18645 18646 this._fireon(formId, elmForm, Response); 18647 this._submit(formId, elmForm, expand); 18648 18649 return true; 18650 18651 }, 18652 18653 /** 18654 * Validator ê²ì¬ ì§í 18655 * 18656 * @param string formId 18657 * @return object | false 18658 */ 18659 inspection : function(formId, expand) { 18660 18661 expand = (expand === true) ? true : false; 18662 18663 var self = this; 18664 var Response = this._response(formId); 18665 18666 if (Response === false) { 18667 alert('The form does not exist - inspection'); 18668 return false; 18669 } 18670 18671 if (Response.elmsTarget.length == 0) { 18672 return this.Helper.getResult(Response, this.CODE_SUCCESS); 18673 } 18674 18675 Response.elmsTarget.each(function(){ 18676 self._execute(Response, this); 18677 }); 18678 18679 if (Response.elmsCurrErrorField.length > 0) { 18680 18681 if (expand !== true) { 18682 this.Handler.errorHandler(Response.elmsCurrErrorField[0]); 18683 } else { 18684 this.Handler.errorHandlerByExapnd(Response); 18685 } 18686 18687 return Response.elmsCurrErrorField[0]; 18688 18689 } 18690 18691 return this.Helper.getResult(Response, this.CODE_SUCCESS); 18692 18693 }, 18694 18695 /** 18696 * submit ì´ë²¤í¸ ë±ë¡ 18697 * 18698 * @param string formId 18699 * @param object elmForm 18700 */ 18701 _submit : function(formId, elmForm, expand) { 18702 var self = this; 18703 var handler = function(event){ 18704 var result = false;
18705 18706 // ì¤ë³µ ìì² ë°©ì§ë¡ ì¶ê° 18707 event.stopImmediatePropagation(); 18708 18709 try{ 18710 result = self.inspection(formId, expand); 18711 }catch(e){ 18712 alert(e); 18713 return false; 18714 } 18715 18716 if(!result || result.passed === self.CODE_FAIL){ 18717 return false; 18718 }; 18719 18720 var callback = self._beforeSubmit(elmForm); 18721 18722 return callback !== false ? true : false; 18723 }; 18724 18725 elmForm.unbind('submit'); 18726 elmForm.bind('submit', handler); 18727 18728 // window.$ìì submit() ì²ë¦¬ì ì¤ëìì¼ë¡ ì¸í´ ì¶ê° 18729 if (this.jQuery !== window.$) { 18730 $(elmForm).unbind('submit'); 18731 $(elmForm).bind('submit', handler); 18732 } 18733 }, 18734 18735 /** 18736 * fireon ì´ë²¤í¸ ë±ë¡ 18737 * 18738 * @param string formId 18739 * @param object elmForm 18740 * @param FwValidator.Response Response 18741 */ 18742 _fireon : function(formId, elmForm, Response) { 18743 var $ = this.jQuery; 18744 var self = this; 18745 var formInfo = this.Helper.getFormInfo(formId); 18746 18747 $(formInfo.selector).find('*['+this.ATTR_FILTER+']['+this.ATTR_FIREON+']').each(function(){ 18748 var elm = $(this); 18749 var evtName = self.Helper.trim(elm.attr(self.ATTR_FIREON)); 18750 var elmMsg = ''; 18751 18752 elm.unbind(evtName); 18753 elm.bind(evtName, function(){ 18754 var result = self._execute(Response, this); 18755 var targetField = Response.elmCurrField; 18756 18757 //ìë¬ ë©ì¸ì§ê° ì¶ë ¥ë ìë¤ë©´ ì¼ë¨ ì§ì°ê³ ì²´í¹ì ììíë¤. 18758 if(typeof elmMsg == 'object'){ 18759 elmMsg.remove(); 18760 } 18761 18762 if(result > -1){ 18763 elmMsg = self.Handler.errorHandlerByFireon(Response.elmsCurrErrorField[result]); 18764 }else{ 18765 self.Handler.successHandlerByFireon(self.Helper.getResult(Response, self.CODE_FAIL)); 18766 } 18767 }); 18768 }); 18769 }, 18770 18771 /** 18772 * Response ê°ì²´ ìì± 18773 * 18774 * @param string formId 18775 * @return FwValidator.Response | false 18776 */ 18777 _response : function(formId) { 18778 var $ = this.jQuery; 18779 var formInfo = this.Helper.getFormInfo(formId); 18780 18781 if (formInfo === false) { 18782 alert('The form does not exist - find'); 18783 return false; 18784 } 18785 18786 var elmForm = formInfo.instance; 18787 var elmsTarget = $(formInfo.selector).find('*[' + this.ATTR_FILTER + ']'); 18788 18789 this.responses[formId] = new FwValidator.Response(); 18790 18791 this.responses[formId].formId = formId; 18792 this.responses[formId].elmForm = elmForm; 18793 this.responses[formId].elmsTarget = elmsTarget; 18794 18795 return this.responses[formId]; 18796 18797 }, 18798 18799 /** 18800 * BeforeExecute ì½ë°±í¨ì ì¤í 18801 * 18802 * @param FwValidator.Response Response 18803 */ 18804 _beforeExecute : function(Response) { 18805 18806 var count = this.Handler.beforeExecute.length; 18807 18808 if (count == 0) return; 18809 18810 for (var i in this.Handler.beforeExecute) { 18811 this.Handler.beforeExecute[i].call(this, Response); 18812 } 18813 18814 }, 18815 18816 /** 18817 * BeforeSubmit ì½ë°±í¨ì ì¤í 18818 * 18819 * @param object elmForm (jquery ì ë í° ë¬¸ë²ì¼ë¡ ì°¾ìë¸ í¼ ê°ì²´) 18820 */ 18821 _beforeSubmit : function(elmForm) { 18822 18823 if(typeof this.Handler.beforeSubmit != 'function') return true; 18824 18825 return this.Handler.beforeSubmit.call(this, elmForm); 18826 18827 }, 18828 18829 /** 18830 * ì리먼í¸ë³ ì í¨ì± ê²ì¬ ì¤í 18831 * 18832 * @param FwValidator.Response Response 18833 * @param htmlElement elmTarget 18834 * @return int(ìë¬ê° ë°ìí elmCurrField ì ì¸ë±ì¤ê°) | -1(ì±ê³µ) 18835 */ 18836 _execute : function(Response, elmTarget) { 18837 var $ = this.jQuery; 18838 var RESULT_SUCCESS = -1; 18839 18840 Response.elmCurrField = $(elmTarget); 18841 Response.elmCurrLabel = Response.elmCurrField.attr(this.ATTR_LABEL); 18842 Response.elmCurrFieldType = this.Helper.getElmType(Response.elmCurrField); 18843 Response.elmCurrFieldDisabled = elmTarget.disabled; 18844 Response.elmCurrValue = this.Helper.getValue(Response.formId, Response.elmCurrField); 18845 Response.elmCurrErrorMsg = Response.elmCurrField.attr(this.ATTR_MSG); 18846 18847 //_beforeExecute ì½ë°±í¨ì ì¤í
18848 this._beforeExecute(Response); 18849 18850 //íëê° disabled ì¼ ê²½ì°ë ì²´í¬íì§ ìì. 18851 if (Response.elmCurrFieldDisabled === true) { 18852 return RESULT_SUCCESS; 18853 } 18854 18855 var filter = this.Helper.trim( Response.elmCurrField.attr(this.ATTR_FILTER) ); 18856 18857 if (filter == '') { 18858 return RESULT_SUCCESS; 18859 } 18860 18861 //isë¡ ììíì§ ìëê²ë¤ì ì ê·ííìì¼ë¡ ê°ì£¼ 18862 if (/^is/i.test(filter)) { 18863 var filters = filter.split('&'); 18864 var count = filters.length; 18865 18866 //íìíëª©ì´ ìëê²½ì° ë¹ê°ì´ ë¤ì´ììê²½ì°ë ì í¨ì± ì²´í¬ë¥¼ íµê³¼ìí´ 18867 18868 if ((/isFill/i.test(filter) === false) && !Response.elmCurrValue) { 18869 return RESULT_SUCCESS; 18870 } 18871 18872 for (var i=0; i < count; ++i) { 18873 var filter = filters[i]; 18874 var param = ''; 18875 var filtersInfo = this.Helper.getFilterInfo(filter); 18876 18877 filter = Response.elmCurrFilter = filtersInfo.id; 18878 param = filtersInfo.param; 18879 18880 //íì ì ë ¥ íí°ì ê²½ì° í목ê´ë¦¬ìì ì¬ì©ìê° ë©ì¸ì§ë¥¼ ì§ì ì§ì íë ë¶ë¶ì´ ìì´ ì´ë ê² ì²ë¦¬ 18881 if (filter == 'isFill') { 18882 Response.elmCurrValue = this.Helper.trim(Response.elmCurrValue); 18883 Response.elmCurrErrorMsg = this.requireMsgs[elmTarget.id] ? this.requireMsgs[elmTarget.id] : this.msgs['isFill']; 18884 } else { 18885 var msg = Response.elmCurrField.attr(this.ATTR_MSG); 18886 18887 if (msg) { 18888 Response.elmCurrErrorMsg = msg; 18889 } else if (this.Helper.getElmFilterMsg(elmTarget.id, filter)) { 18890 Response.elmCurrErrorMsg = this.Helper.getElmFilterMsg(elmTarget.id, filter); 18891 } else { 18892 Response.elmCurrErrorMsg = this.msgs[filter]; 18893 } 18894 18895 } 18896 18897 //ì¡´ì¬íì§ ìë íí°ì¸ ê²½ì° ìë¬ì½ë ë°í 18898 if(this.Filter[filter] === undefined){ 18899 Response.elmCurrErrorMsg = this.msgs['notMethod']; 18900 var result = this.Helper.getResult(Response, this.CODE_FAIL); 18901 18902 Response.elmsCurrErrorField.push(result); 18903 return Response.elmsCurrErrorField.length - 1; 18904 } 18905 18906 //íí° ì¤í 18907 var result = this.Filter[filter](Response, param); 18908 18909 if (result == undefined || result.passed === this.CODE_FAIL) { 18910 Response.elmsCurrErrorField.push(result); 18911 18912 //Debug를 ìí´ ë£ì´ë ì½ë(íì¥í íí°ë¥¼ ì못 ë±ë¡í´ì returnê°ì´ ìë ê²½ì°ë¥¼ ì²´í¬í기 ìí¨) 18913 if (result == undefined) { 18914 alert('Extension Filter Return error - ' + filter); 18915 } 18916 18917 return Response.elmsCurrErrorField.length - 1; 18918 } 18919 } 18920 } else { 18921 var msg = Response.elmCurrErrorMsg; 18922 Response.elmCurrErrorMsg = msg ? msg : this.msgs['isRegex']; 18923 var result = this.Filter.isRegex(Response, filter); 18924 18925 if(result.passed === this.CODE_FAIL){ 18926 Response.elmsCurrErrorField.push(result); 18927 18928 return Response.elmsCurrErrorField.length - 1; 18929 } 18930 } 18931 18932 return RESULT_SUCCESS; 18933 } 18934}; 18935 18936/** 18937 * FwValidator.Response 18938 * 18939 * @package jquery 18940 * @subpackage validator 18941 */ 18942 18943FwValidator.Response = function() { 18944 18945 this.formId = null; 18946 this.elmForm = null; 18947 this.elmsTarget = null; 18948 this.elmsCurrErrorField = []; 18949 18950 this.elmCurrField = null; 18951 this.elmCurrFieldType = null; 18952 this.elmCurrFieldDisabled = null; 18953 this.elmCurrLabel = null; 18954 this.elmCurrValue = null; 18955 this.elmCurrFilter = null; 18956 this.elmCurrErrorMsg = null; 18957 18958 this.requireMsgs = {}; 18959 18960}; 18961 18962/** 18963 * FwValidator.Helper 18964 * 18965 * @package jquery 18966 * @subpackage validator 18967 */ 18968 18969FwValidator.Helper = { 18970 18971 parent : FwValidator, 18972 18973 /** 18974 * ë©ì¸ì§ ì리먼í¸ì ìì´ë prefix 18975 */ 18976 msgIdPrefix : 'msg_', 18977 18978 /** 18979 * ë©ì¸ì§ ì리먼í¸ì í´ëì¤ ëª prefix 18980 */ 18981 msgClassNamePrefix : 'msg_error_mark_', 18982 18983 /** 18984 * ê²°ê³¼ ë°í 18985 */ 18986 getResult : function(Response, code, param) { 18987 18988 //í¹ì íë¼ë¯¸í° ì ë³´(í¹ì íí°ììë§ ì¬ì©í¨) 18989 param = param != undefined ? param : {}; 18990 18991 var msg = ''; 18992 18993 if (code === this.parent.CODE_FAIL) { 18994 18995 try { 18996 msg = Response.elmCurrErrorMsg.replace(/\{label\}/i, Response.elmCurrLabel); 18997 } catch(e) { 18998 msg = 'No Message'; 18999 } 19000 19001 } else { 19002 19003 msg = 'success'; 19004 19005 } 19006 19007 var result = {}; 19008 result.passed = code; 19009 result.formid = Response.formId; 19010 result.msg = msg; 19011 result.param = param; 19012 19013 try { 19014 result.element = Response.elmCurrField; 19015 result.elmid = Response.elmCurrField.attr('id'); 19016 result.filter = Response.elmCurrFilter; 19017 } catch(e) {} 19018 19019 return result; 19020 19021 }, 19022 19023 /** 19024 * íí° ì ë³´ ë°í(íí°ì´ë¦, íë¼ë¯¸í°) 19025 */ 19026 getFilterInfo : function(filter) { 19027 var matches = filter.match(/(is[a-z]*)((?:\[.*?\])*)/i); 19028 19029 return { 19030 id : matches[1], 19031 param : this.getFilterParams(matches[2]) 19032 }; 19033 }, 19034 19035 /** 19036 * íí°ì íë¼ë¯¸í° ì¤í¸ë§ íì± 19037 * isFill[a=1][b=1][c=1] ì´ë°ìì ë©í° íë¼ë¯¸í°ê° ì§ì ëì´ ìë ê²½ì°ë ë°°ì´ë¡ ë°íí¨ 19038 * isFill[a=1] ë¨ì¼ íë¼ë¯¸í°ë íë¼ë¯¸í°ë¡ ì§ì ë ì¤í¸ë§ê°ë§ ë°íí¨ 19039 */ 19040 getFilterParams : function(paramStr) { 19041 if (paramStr == undefined || paramStr == null || paramStr == '') { 19042 return ''; 19043 } 19044 19045 var matches = paramStr.match(/\[.*?\]/ig); 19046 19047 if (matches == null) { 19048 return ''; 19049 } 19050 19051 var count = matches.length; 19052 var result = []; 19053 19054 for (var i=0; i < count; i++) { 19055 var p = matches[i].match(/\[(.*?)\]/); 19056 result.push(p[1]); 19057 } 19058 19059 if (result.length == 1) { 19060 return result[0]; 19061 } 19062 19063 return result; 19064 }, 19065 19066 /** 19067 * íë íì ë°í(select, checkbox, radio, textbox) 19068 */ 19069 getElmType : function(elmField) { 19070 var $ = this.parent.jQuery; 19071 19072 elmField = $(elmField); 19073 19074 var elTag = elmField[0].tagName; 19075 var result = null; 19076 19077 switch (elTag) { 19078 case 'SELECT' : 19079 result = 'select'; 19080 break; 19081 19082 case 'INPUT' : 19083 if ($.fn.prop) { 19084 var _type = elmField.prop('type').toLowerCase(); 19085 } else { 19086 var _type = elmField.attr('type').toLowerCase(); 19087 } 19088 if(_type == 'checkbox') result = 'checkbox'; 19089 else if(_type =='radio') result = 'radio'; 19090 else result = 'textbox'; 19091 19092 break; 19093 19094 case 'TEXTAREA' : 19095 result = 'textbox'; 19096 break; 19097 19098 default : 19099 result = 'textbox'; 19100 break; 19101 } 19102 19103 return result; 19104 }, 19105 19106 /** 19107 * íë ê° ë°í 19108 */ 19109 getValue : function(formId, elmField) { 19110 var $ = this.parent.jQuery; 19111 var result = ''; 19112 var elmName = elmField.attr('name'); 19113 var fieldType = this.getElmType(elmField); 19114
19115 //checkbox ë radio ë°ì¤ë valueê°ì ë°ííì§ ìì 19116 if (fieldType == 'checkbox' || fieldType == 'radio') { 19117 if(elmField.get(0).checked === true){ 19118 result = elmField.val(); 19119 } 19120 return result; 19121 } 19122 19123 //alonefilter ìì±ì´ Y ë¡ ëì´ ìë¤ë©´ í´ë¹ ì리먼í¸ì ê°ë§ ë°íí¨ 19124 var aloneFilter = elmField.attr(this.parent.ATTR_ALONE); 19125 if(aloneFilter == 'Y' || aloneFilter == 'y'){ 19126 return elmField.val(); 19127 } 19128 19129 //nameì´ ë°°ì´ííë¡ ëì´ ìë¤ë©´ ê°ì 모ë í©ì³ì ë°í 19130 if( /\[.*?\]/.test(elmName) ){ 19131 var formInfo = this.getFormInfo(formId); 19132 19133 var groupElms = $(formInfo.selector +' [name="'+elmName+'"]'); 19134 groupElms.each(function(i){ 19135 var elm = $(this); 19136 result += elm.val(); 19137 }); 19138 }else{ 19139 result = elmField.val(); 19140 } 19141 19142 return result; 19143 }, 19144 19145 /** 19146 * ìë¬ë©ì¸ì§ ìë¦¬ë¨¼í¸ ìì± 19147 */ 19148 createMsg : function(elm, msg, formId) { 19149 var $ = this.parent.jQuery; 19150 var elmMsg = document.createElement('span'); 19151 19152 elmMsg.id = this.msgIdPrefix + elm.attr('id'); 19153 elmMsg.className = this.msgClassNamePrefix + formId; 19154 elmMsg.innerHTML = msg; 19155 19156 return $(elmMsg); 19157 }, 19158 19159 /** 19160 * ìë¬ë©ì¸ì§ ìë¦¬ë¨¼í¸ ì ê±° 19161 */ 19162 removeMsg : function(elm) { 19163 var $ = this.parent.jQuery; 19164 var id = this.msgIdPrefix + elm.attr('id'); 19165 var elmErr = $('#'+id); 19166 19167 if (elmErr) elmErr.remove(); 19168 }, 19169 19170 /** 19171 * ìë¬ë©ì¸ì§ ìë¦¬ë¨¼í¸ ëª¨ë ì ê±° 19172 */ 19173 removeAllMsg : function(formId) { 19174 var $ = this.parent.jQuery; 19175 var className = this.msgClassNamePrefix + formId; 19176 19177 $('.' + className).remove(); 19178 }, 19179 19180 /** 19181 * 문ìì´ì Byte ì ë°í 19182 */ 19183 getByte : function(str) { 19184 var encode = encodeURIComponent(str); 19185 var totalBytes = 0; 19186 var chr; 19187 var bytes; 19188 var code; 19189 19190 for(var i = 0; i < encode.length; i++) 19191 { 19192 chr = encode.charAt(i); 19193 if(chr != "%") totalBytes++; 19194 else 19195 { 19196 code = parseInt(encode.substr(i+1,2),16); 19197 if(!(code & 0x80)) totalBytes++; 19198 else 19199 { 19200 if((code & 0xE0) == 0xC0) bytes = 2; 19201 else if((code & 0xF0) == 0xE0) bytes = 3; 19202 else if((code & 0xF8) == 0xF0) bytes = 4; 19203 else return -1; 19204 19205 i += 3 * (bytes - 1); 19206 19207 totalBytes += 2; 19208 } 19209 i += 2; 19210 } 19211 } 19212 19213 return totalBytes; 19214 }, 19215 19216 /** 19217 * ì§ì í ì리먼í¸ì íí° ë©ì¸ì§ê° ì¡´ì¬íëê° 19218 * 19219 * @param elmId (ìë¦¬ë¨¼í¸ ìì´ë) 19220 * @param filter (íí°ëª ) 19221 * @return string | false 19222 */ 19223 getElmFilterMsg : function(elmId, filter) { 19224 if (this.parent.elmFilterMsgs[elmId] == undefined) return false; 19225 if (this.parent.elmFilterMsgs[elmId][filter] == undefined) return false; 19226 19227 return this.parent.elmFilterMsgs[elmId][filter]; 19228 }, 19229 19230 /** 19231 * í¼ ì ë³´ ë°í 19232 * 19233 * @param formId (í¼ ìì´ë í¹ì ë¤ì) 19234 * @return array( 19235 * 'selector' => ì ë í° ë¬¸ì, 19236 * 'instance' => ì ë í° ë¬¸ë²ì¼ë¡ ê²ìí´ë¸ í¼ ê°ì²´ 19237 * ) | false 19238 */ 19239 getFormInfo : function(formId) { 19240 var $ = this.parent.jQuery; 19241 var result = {}; 19242 var selector = '#' + formId; 19243 var instance = $(selector); 19244 19245 if (instance.length > 0) { 19246 result.selector = selector; 19247 result.instance = instance; 19248 19249 return result; 19250 } 19251 19252 selector = 'form[name="' + formId + '"]'; 19253 instance = $(selector); 19254 19255 if (instance.length > 0) { 19256 result.selector = selector; 19257 result.instance = instance; 19258 19259 return result; 19260 } 19261 19262 return false;
19263 }, 19264 19265 /** 19266 * ì«ìííì 문ìì´ë¡ ë°ê¿ì¤ 19267 * 123,123,123 19268 * 123123,123 19269 * 123% 19270 * 123 % 19271 * 123.4 19272 * -123 19273 * ,123 19274 * 19275 * @param value 19276 * @return float 19277 */ 19278 getNumberConv : function(value) { 19279 if (!value || value == undefined || value == null) return ''; 19280 19281 value = value + ""; 19282 19283 value = value.replace(/,/g, ''); 19284 value = value.replace(/%/g, ''); 19285 value = value.replace(/[\s]/g, ''); 19286 19287 if (this.parent.Verify.isFloat(value) === false) return ''; 19288 19289 return parseFloat(value); 19290 }, 19291 19292 /** 19293 * 문ìì´ ì ë¤ ê³µë°± ì ê±° 19294 * 19295 * @param string text 19296 * @return string 19297 */ 19298 trim: function(text) { 19299 var trim = String.prototype.trim; 19300 19301 return text == null ? "" : trim.call(text); 19302 } 19303}; 19304 19305/** 19306 * FwValidator.Handler 19307 * 19308 * @package jquery 19309 * @subpackage validator 19310 */ 19311 19312FwValidator.Handler = { 19313 19314 parent : FwValidator, 19315 19316 /** 19317 * ì¬ì©ì ì ìí ìë¬í¸ë¤ë¬(ìë¦¬ë¨¼í¸ ìì´ëë³ë¡ ì ì¥ë¨) 19318 */ 19319 customErrorHandler : {}, 19320 19321 /** 19322 * ì¬ì©ì ì ìí ìë¬í¸ë¤ë¬(íí°ë³ë¡ ì ì¥ë¨) 19323 */ 19324 customErrorHandlerByFilter : {}, 19325 19326 /** 19327 * ì¬ì©ì ì ìí ì±ê³µí¸ë¤ë¬(ìë¦¬ë¨¼í¸ ìì´ëë³ë¡ ì ì¥ë¨) 19328 */ 19329 customSuccessHandler : {}, 19330 19331 /** 19332 * ì¬ì©ì ì ìí ì±ê³µí¸ë¤ë¬(íí°ë³ë¡ ì ì¥ë¨) 19333 */ 19334 customSuccessHandlerByFilter : {}, 19335 19336 /** 19337 * FwValidator._executeì ìí´ ê²ì¬ë기 ì ì¤íëë ì½ë°±í¨ì 19338 */ 19339 beforeExecute : [], 19340 19341 /** 19342 * FwValidator._submitìì ë°ì¸ë©í onsubmit ì´ë²¤í¸ ë°ìí ì¤íëë ì½ë°±í¨ì 19343 * {í¼ìì´ë : ì½ë°±í¨ì, ...} 19344 */ 19345 beforeSubmit : {}, 19346 19347 /** 19348 * 기본 ë©ì¸ì§ ì 체를 ì¤ë²ë¼ì´ë© 19349 */ 19350 overrideMsgs : function(msgs) { 19351 if (typeof msgs != 'object') return; 19352 19353 this.parent.msgs = msgs; 19354 }, 19355 19356 /** 19357 * íëì ë°ë¥¸ íì ì ë ¥ ìë¬ë©ì¸ì§ ì¤ì 19358 */ 19359 setRequireErrorMsg : function(field, msg) { 19360 this.parent.requireMsgs[field] = msg; 19361 }, 19362 19363 /** 19364 * íí° íì ì ë°ë¥¸ ìë¬ë©ì¸ì§ ì¤ì 19365 */ 19366 setFilterErrorMsg : function(filter, msg) { 19367 this.parent.msgs[filter] = msg; 19368 }, 19369 19370 /** 19371 * ì리먼í¸ì í¹ì íí°ìë§ ìë¬ë©ì¸ì§ë¥¼ ì¤ì 19372 */ 19373 setFilterErrorMsgByElement : function(elmId, filter, msg) { 19374 if (this.parent.elmFilterMsgs[elmId] == undefined) { 19375 this.parent.elmFilterMsgs[elmId] = {}; 19376 } 19377 19378 this.parent.elmFilterMsgs[elmId][filter] = msg; 19379 }, 19380 19381 /** 19382 * ìë¦¬ë¨¼í¸ ìì´ëë³ ì¬ì©ìì ìí ìë¬í¸ë¤ë¬ ë±ë¡ 19383 */ 19384 setCustomErrorHandler : function(elmId, func) { 19385 if (typeof func != 'function') return; 19386 19387 this.customErrorHandler[elmId] = func; 19388 }, 19389 19390 /** 19391 * íí° íì ë³ ì¬ì©ìì ìí ìë¬í¸ë¤ë¬ ë±ë¡ 19392 */ 19393 setCustomErrorHandlerByFilter : function(filter, func) { 19394 if (typeof func != 'function') return; 19395 19396 this.customErrorHandlerByFilter[filter] = func; 19397 }, 19398 19399 /** 19400 * ìë¦¬ë¨¼í¸ ìì´ëë³ ì¬ì©ìì ìí ì±ê³µí¸ë¤ë¬ ë±ë¡ 19401 */ 19402 setCustomSuccessHandler : function(elmId, func) { 19403 if (typeof func != 'function') return; 19404 19405 this.customSuccessHandler[elmId] = func; 19406 }, 19407 19408 /** 19409 * íí° íì ë³ ì¬ì©ìì ìí ì±ê³µí¸ë¤ë¬ ë±ë¡ 19410 */ 19411 setCustomSuccessHandlerByFilter : function(filter, func) { 19412 if (typeof func != 'function') return; 19413 19414 this.customSuccessHandlerByFilter[filter] = func; 19415 }, 19416 19417 /** 19418 * íì¥í íí° ë±ë¡ 19419 */ 19420 setExtensionFilter : function(filter, func) { 19421 if (typeof func != 'function') return; 19422 19423 if (this.parent.Filter[filter] == undefined) { 19424 this.parent.Filter[filter] = func; 19425 } 19426 }, 19427 19428 /** 19429 * ê° ì리먼í¸ê° FwValidator._executeì ìí´ ê²ì¬ë기 ì ì¤íëë ì½ë°±í¨ì ë±ë¡ 19430 */ 19431 setBeforeExecute : function(func) { 19432 if (typeof func != 'function') return; 19433
19434 this.beforeExecute.push(func); 19435 }, 19436 19437 /** 19438 * FwValidator._submit ìì ë°ì¸ë©ë onsubmit ì´ë²¤í¸ì ì½ë°±í¨ì ë±ë¡(ì í¨ì± ê²ì¬ê° ì±ê³µíë©´ í¸ì¶ë¨) 19439 */ 19440 setBeforeSubmit : function(func) { 19441 if (typeof func != 'function') return; 19442 19443 this.beforeSubmit = func; 19444 }, 19445 19446 /** 19447 * ìë¬í¸ë¤ë¬ - 기본 19448 */ 19449 errorHandler : function(resultData) { 19450 if (this._callCustomErrorHandler(resultData) === true) return; 19451 19452 alert(resultData.msg); 19453 resultData.element.focus(); 19454 }, 19455 19456 /** 19457 * ìë¬í¸ë¤ë¬ - ì ì²´ í¼ì¹¨ 모ë 19458 */ 19459 errorHandlerByExapnd : function(Response) { 19460 var count = Response.elmsCurrErrorField.length; 19461 19462 //í´ë¹ í¼ì ì¶ë ¥ë ìë¬ë©ì¸ì§ë¥¼ ì¼ë¨ 모ë ì§ì´ë¤. 19463 this.parent.Helper.removeAllMsg(Response.formId); 19464 19465 for (var i=0; i < count; ++i) { 19466 var resultData = Response.elmsCurrErrorField[i]; 19467 19468 if (this._callCustomErrorHandler(resultData) === true) continue; 19469 19470 var elmMsg = this.parent.Helper.createMsg(resultData.element, resultData.msg, resultData.formid).css({'color':'#FF3300'}); 19471 elmMsg.appendTo(resultData.element.parent()); 19472 } 19473 }, 19474 19475 /** 19476 * ìë¬í¸ë¤ë¬ - fireon 19477 */ 19478 errorHandlerByFireon : function(resultData) { 19479 if (this._callCustomErrorHandler(resultData) === true) return; 19480 19481 //í´ë¹ í목ì ìë¬ë©ì¸ì§ ì리먼í¸ê° ìë¤ë©´ 먼ì ìì íë¤. 19482 this.parent.Helper.removeMsg(resultData.element); 19483 19484 var elmMsg = this.parent.Helper.createMsg(resultData.element, resultData.msg, resultData.formid).css({'color':'#FF3300'}); 19485 elmMsg.appendTo(resultData.element.parent()); 19486 19487 return elmMsg; 19488 }, 19489 19490 /** 19491 * ì±ê³µí¸ë¤ë¬ - fireon 19492 */ 19493 successHandlerByFireon : function(resultData) { 19494 19495 this._callCustomSuccessHandler(resultData); 19496 19497 }, 19498 19499 /** 19500 * ì ìí ìë¬ í¸ë¤ë¬ í¸ì¶ 19501 * 19502 * @return boolean (ì ìí ìë¬í¸ë¤ë¬ë¥¼ í¸ì¶íì ê²½ì° true ë°í) 19503 */ 19504 _callCustomErrorHandler : function(resultData) { 19505 //resultData ê° ì ìëì´ ìì§ ìì ê²½ì° 19506 if (resultData == undefined) { 19507 alert('errorHandler - resultData is not found'); 19508 return true; 19509 } 19510 19511 //í´ë¹ ì리먼í¸ì ëí Customìë¬í¸ë¤ë¬ê° ë±ë¡ëì´ ìë¤ë©´ íì¶ 19512 if (this.customErrorHandler[resultData.elmid] != undefined) { 19513 this.customErrorHandler[resultData.elmid].call(this.parent, resultData); 19514 return true; 19515 } 19516 19517 //í´ë¹ íí°ì ëí Customìë¬í¸ë¤ë¬ê° ë±ë¡ëì´ ìë¤ë©´ íì¶ 19518 if (this.customErrorHandlerByFilter[resultData.filter] != undefined) { 19519 this.customErrorHandlerByFilter[resultData.filter].call(this.parent, resultData); 19520 return true; 19521 } 19522 19523 return false; 19524 }, 19525 19526 /** 19527 * ì ìí ì±ê³µ í¸ë¤ë¬ í¸ì¶ - 기본ì ì¼ë¡ fireon ìì±ì´ ì ì©ë ì리먼í¸ìë§ ì ì©ë¨. 19528 */ 19529 _callCustomSuccessHandler : function(resultData) { 19530 19531 if (this.customSuccessHandler[resultData.elmid] != undefined) { 19532 this.customSuccessHandler[resultData.elmid].call(this.parent, resultData); 19533 return; 19534 } 19535 19536 if (this.customSuccessHandlerByFilter[resultData.filter] != undefined) { 19537 this.customSuccessHandlerByFilter[resultData.filter].call(this.parent, resultData); 19538 return; 19539 } 19540 19541 } 19542}; 19543 19544/** 19545 * FwValidator.Verify 19546 * 19547 * @package jquery 19548 * @subpackage validator 19549 */ 19550 19551FwValidator.Verify = { 19552 19553 parent : FwValidator, 19554 19555 isNumber : function(value, cond) { 19556 if (value == '') return true; 19557 19558 if (!cond) { 19559 cond = 1; 19560 } 19561 19562 cond = parseInt(cond); 19563 19564 pos = 1; 19565 nga = 2; 19566 minpos = 4; 19567 minnga = 8; 19568 19569 result = 0; 19570 19571 if ((/^[0-9]+$/).test(value) === true) { 19572 result = pos; 19573 } else if ((/^[-][0-9]+$/).test(value) === true) { 19574 result = nga; 19575 } else if ((/^[0-9]+[.][0-9]+$/).test(value) === true) { 19576 result = minpos; 19577 } else if ((/^[-][0-9]+[.][0-9]+$/).test(value) === true) { 19578 result = minnga; 19579 } 19580 19581 if (result & cond) { 19582 return true; 19583 } 19584 19585 return false;
19586 }, 19587 19588 isFloat : function(value) { 19589 if (value == '') return true; 19590 19591 return (/^[\-0-9]([0-9]+[\.]?)*$/).test(value); 19592 }, 19593 19594 isIdentity : function(value) { 19595 if (value == '') return true; 19596 19597 return (/^[a-z]+[a-z0-9_]+$/i).test(value); 19598 }, 19599 19600 isIdentitySearch : function(value) { 19601 if (value == '') return true; 19602 var bChk1 = (/^[a-zA-Z]+[a-zA-Z0-9_]+$/i).test(value); 19603 var bChk2 = (/^.*@.{1,2}$/i).test(value); 19604 return bChk1 || bChk2; 19605 }, 19606 19607 isKorean : function(value) { 19608 if (value == '') return true; 19609 19610 var count = value.length; 19611 19612 for(var i=0; i < count; ++i){ 19613 var cCode = value.charCodeAt(i); 19614 19615 //공백ì 무ì 19616 if(cCode == 0x20) continue; 19617 19618 if(cCode < 0x80){ 19619 return false; 19620 } 19621 } 19622 19623 return true; 19624 }, 19625 19626 isAlpha : function(value) { 19627 if (value == '') return true; 19628 19629 return (/^[a-z]+$/i).test(value); 19630 }, 19631 19632 isAlphaUpper : function(value) { 19633 if (value == '') return true; 19634 19635 return (/^[A-Z]+$/).test(value); 19636 }, 19637 19638 isAlphaLower : function(value) { 19639 if (value == '') return true; 19640 19641 return (/^[a-z]+$/).test(value); 19642 }, 19643 19644 isAlphaNum : function(value) { 19645 if (value == '') return true; 19646 19647 return (/^[a-z0-9]+$/i).test(value); 19648 }, 19649 19650 isAlphaSpace : function(value) { 19651 if (value == '') return true; 19652 19653 return (/^[a-zA-Z ]+$/).test(value); 19654 }, 19655 19656 isAlphaNumUpper : function(value) { 19657 if (value == '') return true; 19658 19659 return (/^[A-Z0-9]+$/).test(value); 19660 }, 19661 19662 isAlphaNumLower : function(value) { 19663 if (value == '') return true; 19664 19665 return (/^[a-z0-9]+$/).test(value); 19666 }, 19667 19668 isAlphaDash : function(value) { 19669 if (value == '') return true; 19670 19671 return (/^[a-z0-9_-]+$/i).test(value); 19672 }, 19673 19674 isAlphaDashUpper : function(value) { 19675 if (value == '') return true; 19676 19677 return (/^[A-Z0-9_-]+$/).test(value); 19678 }, 19679 19680 isAlphaDashLower : function(value) { 19681 if (value == '') return true; 19682 19683 return (/^[a-z0-9_-]+$/).test(value); 19684 }, 19685 19686 isSsn : function(value) { 19687 value = value.replace(/-/g, ''); 19688 if (value == '') return true; 19689 19690 if ( (/[0-9]{2}[01]{1}[0-9]{1}[0123]{1}[0-9]{1}[1234]{1}[0-9]{6}$/).test(value) === false ) { 19691 return false; 19692 } 19693 19694 var sum = 0; 19695 var last = value.charCodeAt(12) - 0x30; 19696 var bases = "234567892345"; 19697 for (var i=0; i<12; i++) { 19698 sum += (value.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30); 19699 }; 19700 var mod = sum % 11; 19701 19702 if ( (11 - mod) % 10 != last ) { 19703 return false; 19704 } 19705 19706 return true; 19707 }, 19708 19709 isForeignerNo : function(value) { 19710 value = value.replace(/-/g, ''); 19711 if (value == '') return true; 19712 19713 if ( (/[0-9]{2}[01]{1}[0-9]{1}[0123]{1}[0-9]{1}[5678]{1}[0-9]{1}[02468]{1}[0-9]{2}[6789]{1}[0-9]{1}$/).test(value) === false ) { 19714 return false; 19715 } 19716 19717 var sum = 0; 19718 var last = value.charCodeAt(12) - 0x30; 19719 var bases = "234567892345"; 19720 for (var i=0; i<12; i++) { 19721 sum += (value.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30); 19722 }; 19723 var mod = sum % 11; 19724 if ( (11 - mod + 2) % 10 != last ) { 19725 return false; 19726 } 19727 19728 return true; 19729 }, 19730 19731 isBizNo : function(value) { 19732 value = value.replace(/-/g, ''); 19733 if (value == '') return true; 19734 19735 if ( (/[0-9]{3}[0-9]{2}[0-9]{5}$/).test(value) === false ) { 19736 return false; 19737 } 19738 19739 var sum = parseInt(value.charAt(0)); 19740 var chkno = [0, 3, 7, 1, 3, 7, 1, 3]; 19741 for (var i = 1; i < 8; i++) { 19742 sum += (parseInt(value.charAt(i)) * chkno[i]) % 10; 19743 } 19744 sum += Math.floor(parseInt(parseInt(value.charAt(8))) * 5 / 10); 19745 sum += (parseInt(value.charAt(8)) * 5) % 10 + parseInt(value.charAt(9)); 19746 19747 if (sum % 10 != 0) { 19748 return false; 19749 } 19750 19751 return true; 19752 }, 19753 19754 isJuriNo : function(value) { 19755 value = value.replace(/-/g, ''); 19756 if (value == '') return true; 19757 19758 if ( (/^([0-9]{6})-?([0-9]{7})$/).test(value) === false ) { 19759 return false;
19760 } 19761 19762 var sum = 0; 19763 var last = parseInt(value.charAt(12), 10); 19764 for (var i=0; i<12; i++) { 19765 if (i % 2 == 0) { // * 1 19766 sum += parseInt(value.charAt(i), 10); 19767 } else { // * 2 19768 sum += parseInt(value.charAt(i), 10) * 2; 19769 }; 19770 }; 19771 19772 var mod = sum % 10; 19773 if( (10 - mod) % 10 != last ){ 19774 return false; 19775 } 19776 19777 return true; 19778 }, 19779 19780 isPhone : function(value) { 19781 value = value.replace(/-/g, ''); 19782 if (value == '') return true; 19783 19784 return (/^(02|0[0-9]{2,3})[1-9]{1}[0-9]{2,3}[0-9]{4}$/).test(value); 19785 }, 19786 19787 isMobile : function(value) { 19788 value = value.replace(/-/g, ''); 19789 if (value == '') return true; 19790 19791 return (/^01[016789][1-9]{1}[0-9]{2,3}[0-9]{4}$/).test(value); 19792 }, 19793 19794 isZipcode : function(value) { 19795 value = value.replace(/-/g, ''); 19796 if (value == '') return true; 19797 19798 return (/^[0-9]{3}[0-9]{3}$/).test(value); 19799 }, 19800 19801 isIp : function(value) { 19802 if (value == '') return true; 19803 19804 return (/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){2,}$/).test(value); 19805 }, 19806 19807 isEmail : function(value) { 19808 value = this.parent.Helper.trim(value); 19809 if (value == '') return true; 19810 19811 return (/^([a-z0-9\_\-\.\+]+)@([a-z0-9\_\-]+\.)+[a-z]{2,63}$/i).test(value); 19812 }, 19813 19814 isUrl : function(value) { 19815 if (value == '') return true; 19816 19817 return (/http[s]?:\/\/[a-z0-9_\-]+(\.[a-z0-9_\-]+)+/i).test(value); 19818 }, 19819 19820 isDate : function(value) { 19821 value = value.replace(/-/g, ''); 19822 if (value == '') return true; 19823 19824 return (/^[12][0-9]{3}(([0]?[1-9])|([1][012]))[0-3]?[0-9]$/).test(value); 19825 }, 19826 19827 isPassport : function(value) { 19828 if (value == '') return true; 19829 19830 //ì¼ë° ì¬ê¶ 19831 if ( (/^[A-Z]{2}[0-9]{7}$/).test(value) === true ) { 19832 return true; 19833 } 19834 19835 //ì ì ì¬ê¶ 19836 if ( (/^[A-Z]{1}[0-9]{8}$/).test(value) === true ) { 19837 return true; 19838 } 19839 19840 return false; 19841 }, 19842 19843 isNumberMin : function(value, limit) { 19844 value = this.parent.Helper.getNumberConv(value); 19845 limit = this.parent.Helper.getNumberConv(limit); 19846 19847 if (value < limit) { 19848 return false; 19849 } 19850 19851 return true; 19852 }, 19853 19854 isNumberMax : function(value, limit) { 19855 value = this.parent.Helper.getNumberConv(value); 19856 limit = this.parent.Helper.getNumberConv(limit); 19857 19858 if (value > limit) { 19859 return false; 19860 } 19861 19862 return true; 19863 }, 19864 19865 isNumberMinPrice : function(value, limit) { 19866 return this.isNumberMin(value, limit); 19867 }, 19868 19869 19870 isNumberMaxPrice : function(value, limit) { 19871 return this.isNumberMin(value, limit); 19872 }, 19873 19874 isNumberMinMonth : function(value, limit) { 19875 return this.isNumberMin(value, limit); 19876 }, 19877 19878 19879 isNumberMaxMonth : function(value, limit) { 19880 return this.isNumberMin(value, limit); 19881 }, 19882 19883 isNumberRange : function(value, min, max) { 19884 value = this.parent.Helper.getNumberConv(value); 19885 19886 min = this.parent.Helper.getNumberConv(min); 19887 max = this.parent.Helper.getNumberConv(max); 19888 19889 if (value < min || value > max) { 19890 return false; 19891 } 19892 19893 return true; 19894 } 19895}; 19896 19897/** 19898 * FwValidator.Filter 19899 * 19900 * @package jquery 19901 * @subpackage validator 19902 */ 19903 19904FwValidator.Filter = { 19905 19906 parent : FwValidator, 19907 19908 isFill : function(Response, cond) { 19909 if (typeof cond != 'string') { 19910 var count = cond.length; 19911 var result = this.parent.Helper.getResult(Response, parent.CODE_SUCCESS); 19912 19913 for (var i = 0; i < count; ++i) { 19914 result = this._fillConditionCheck(Response, cond[i]); 19915 19916 if (result.passed === true) { 19917 return result; 19918 } 19919 } 19920 19921 return result; 19922 } 19923 19924 return this._fillConditionCheck(Response, cond); 19925 }, 19926 19927 isMatch : function(Response, sField) { 19928 var $ = this.parent.jQuery; 19929 19930 if(Response.elmCurrValue == ''){ 19931 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 19932 } 19933 19934 //Radio ë Checkboxì ê²½ì° ë¬´ì 19935 if(Response.elmCurrFieldType == 'radio' || Response.elmCurrFieldType == 'checkbox'){ 19936 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 19937 } 19938 19939 var elmTarget = $('#'+sField); 19940 var elmTargetValue = elmTarget.val(); 19941 19942 if (Response.elmCurrValue != elmTargetValue) { 19943 var label = elmTarget.attr(this.parent.ATTR_LABEL); 19944 var match = label ? label : sField; 19945 19946 Response.elmCurrErrorMsg = Response.elmCurrErrorMsg.replace(/\{match\}/i, match); 19947 19948 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 19949 } 19950 19951 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 19952 }, 19953 19954 isMax : function(Response, iLen) { 19955 var $ = this.parent.jQuery; 19956 var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 19957 19958 if (Response.elmCurrFieldType == 'radio' || Response.elmCurrFieldType == 'checkbox') { 19959 var chkCount = 0; 19960 var sName = Response.elmCurrField.attr('name'); 19961 19962 $('input[name="'+sName+'"]').each(function(i){ 19963 if ($(this).get(0).checked === true) { 19964 ++chkCount; 19965 } 19966 }); 19967 19968 if (chkCount > iLen) { 19969 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 19970 } 19971 19972 } else { 19973 var len = Response.elmCurrValue.length; 19974 19975 if (len > iLen) { 19976 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 19977 } 19978 } 19979 19980 if (result.passed === this.parent.CODE_FAIL) { 19981 result.msg = result.msg.replace(/\{max\}/i, iLen); 19982 } 19983 19984 return result; 19985 }, 19986 19987 isMin : function(Response, iLen) { 19988 var $ = this.parent.jQuery; 19989 var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 19990 19991 if(Response.elmCurrFieldType == 'radio' || Response.elmCurrFieldType == 'checkbox'){ 19992 var chkCount = 0; 19993 var sName = Response.elmCurrField.attr('name'); 19994 19995 $('input[name="'+sName+'"]').each(function(i){ 19996 if($(this).get(0).checked === true){ 19997 ++chkCount; 19998 } 19999 }); 20000 20001 if (chkCount < iLen) { 20002 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20003 } 20004 20005 }else{ 20006 var len = Response.elmCurrValue.length; 20007 20008 if(len < iLen){ 20009 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20010 } 20011 } 20012 20013 if(result.passed === this.parent.CODE_FAIL){ 20014 result.msg = result.msg.replace(/\{min\}/i, iLen); 20015 } 20016 20017 return result; 20018 }, 20019 20020 isNumber : function(Response, iCond) { 20021 var result = this.parent.Verify.isNumber(Response.elmCurrValue, iCond); 20022 20023 if(result === false){ 20024 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20025 } 20026 20027 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20028 }, 20029 20030 isIdentity : function(Response){ 20031 var result = this.parent.Verify.isIdentity(Response.elmCurrValue); 20032 20033 if(result === false){ 20034 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20035 } 20036 20037 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20038 }, 20039 20040 isIdentitySearch : function(Response){ 20041 var result = this.parent.Verify.isIdentitySearch(Response.elmCurrValue); 20042 20043 if(result === false){ 20044 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20045 } 20046 20047 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20048 }, 20049 20050 isKorean : function(Response){ 20051 var result = this.parent.Verify.isKorean(Response.elmCurrValue); 20052 20053 if(result === false){ 20054 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20055 } 20056 20057 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20058 }, 20059 20060 isAlpha : function(Response){ 20061 var result = this.parent.Verify.isAlpha(Response.elmCurrValue); 20062 20063 if(result === false){ 20064 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20065 } 20066 20067 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20068 }, 20069 20070 isAlphaLower : function(Response){ 20071 var result = this.parent.Verify.isAlphaLower(Response.elmCurrValue); 20072 20073 if(result === false){ 20074 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20075 } 20076 20077 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20078 }, 20079 20080 20081 isAlphaSpace : function(Response){ 20082 var result = this.parent.Verify.isAlphaSpace(Response.elmCurrValue); 20083 20084 if(result === false){ 20085 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20086 } 20087 20088 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20089 }, 20090 20091 isAlphaUpper : function(Response){ 20092 var result = this.parent.Verify.isAlphaUpper(Response.elmCurrValue); 20093 20094 if(result === false){ 20095 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20096 } 20097 20098 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20099 }, 20100 20101 isAlphaNum : function(Response){ 20102 var result = this.parent.Verify.isAlphaNum(Response.elmCurrValue); 20103 20104 if(result === false){ 20105 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20106 } 20107 20108 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20109 }, 20110 20111 isAlphaNumLower : function(Response){ 20112 var result = this.parent.Verify.isAlphaNumLower(Response.elmCurrValue); 20113 20114 if(result === false){ 20115 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20116 } 20117 20118 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20119 }, 20120 20121 isAlphaNumUpper : function(Response){ 20122 var result = this.parent.Verify.isAlphaNumUpper(Response.elmCurrValue); 20123 20124 if(result === false){ 20125 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20126 } 20127 20128 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20129 }, 20130 20131 isAlphaDash : function(Response){ 20132 var result = this.parent.Verify.isAlphaDash(Response.elmCurrValue); 20133 20134 if(result === false){ 20135 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20136 } 20137 20138 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20139 }, 20140 20141 isAlphaDashLower : function(Response){ 20142 var result = this.parent.Verify.isAlphaDashLower(Response.elmCurrValue); 20143 20144 if(result === false){ 20145 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20146 } 20147 20148 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20149 }, 20150 20151 isAlphaDashUpper : function(Response){ 20152 var result = this.parent.Verify.isAlphaDashUpper(Response.elmCurrValue); 20153 20154 if(result === false){ 20155 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20156 } 20157 20158 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20159 }, 20160 20161 isSsn : function(Response){ 20162 var result = this.parent.Verify.isSsn(Response.elmCurrValue); 20163 20164 if(result === false){ 20165 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20166 } 20167 20168 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20169 }, 20170 20171 isForeignerNo : function(Response){ 20172 var result = this.parent.Verify.isForeignerNo(Response.elmCurrValue); 20173 20174 if(result === false){ 20175 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20176 } 20177 20178 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20179 }, 20180 20181 isBizNo : function(Response){ 20182 var result = this.parent.Verify.isBizNo(Response.elmCurrValue); 20183 20184 if(result === false){ 20185 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20186 } 20187 20188 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20189 }, 20190 20191 isJuriNo : function(Response){ 20192 var result = this.parent.Verify.isJuriNo(Response.elmCurrValue); 20193 20194 if(result === false){ 20195 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20196 } 20197 20198 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20199 }, 20200 20201 isPhone : function(Response){ 20202 var result = this.parent.Verify.isPhone(Response.elmCurrValue); 20203 20204 if(result === false){ 20205 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20206 } 20207 20208 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20209 }, 20210 20211 isMobile : function(Response){ 20212 var result = this.parent.Verify.isMobile(Response.elmCurrValue); 20213 20214 if(result === false){ 20215 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20216 } 20217 20218 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20219 }, 20220 20221 isZipcode : function(Response){ 20222 var result = this.parent.Verify.isZipcode(Response.elmCurrValue); 20223 20224 if(result === false){ 20225 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20226 } 20227 20228 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20229 }, 20230 20231 isIp : function(Response){ 20232 var result = this.parent.Verify.isIp(Response.elmCurrValue); 20233 20234 if(result === false){ 20235 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20236 } 20237 20238 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20239 }, 20240 20241 isEmail : function(Response){ 20242 var result = this.parent.Verify.isEmail(Response.elmCurrValue); 20243 20244 if(result === false){ 20245 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20246 } 20247 20248 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20249 }, 20250 20251 isUrl : function(Response){ 20252 var result = this.parent.Verify.isUrl(Response.elmCurrValue); 20253 20254 if(result === false){ 20255 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20256 } 20257 20258 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20259 }, 20260 20261 isDate : function(Response){ 20262 var result = this.parent.Verify.isDate(Response.elmCurrValue); 20263 20264 if(result === false){ 20265 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20266 } 20267 20268 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20269 }, 20270 20271 isRegex : function(Response, regex){ 20272 regex = eval(regex); 20273 20274 if( regex.test(Response.elmCurrValue) === false ){ 20275 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20276 } 20277 20278 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20279 }, 20280 20281 isPassport : function(Response){ 20282 var result = this.parent.Verify.isPassport(Response.elmCurrValue); 20283 20284 if(result === false){ 20285 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20286 } 20287 20288 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20289 }, 20290 20291 isSimplexEditorFill : function(Response){ 20292 20293 var result = eval(Response.elmCurrValue + ".isEmptyContent();"); 20294 20295 if(result === true){ 20296 return this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20297 } 20298 20299 return this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20300 20301 }, 20302 20303 isMaxByte : function(Response, iLen) { 20304 var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20305 20306 var len = this.pare
20306nt.Helper.getByte(Response.elmCurrValue); 20307 20308 if (len > iLen) { 20309 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20310 result.msg = result.msg.replace(/\{max\}/i, iLen); 20311 } 20312 20313 return result; 20314 }, 20315 20316 isMinByte : function(Response, iLen) { 20317 var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20318 20319 var len = this.parent.Helper.getByte(Response.elmCurrValue); 20320 20321 if (len < iLen) { 20322 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20323 result.msg = result.msg.replace(/\{min\}/i, iLen); 20324 } 20325 20326 return result; 20327 }, 20328 20329 isByteRange : function(Response, range) { 20330 var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20331 20332 var rangeInfo = this._getRangeNum(range); 20333 var iMin = rangeInfo.min; 20334 var iMax = rangeInfo.max; 20335 20336 var len = this.parent.Helper.getByte(Response.elmCurrValue); 20337 20338 if (len < iMin || len > iMax) { 20339 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20340 result.msg = result.msg.replace(/\{min\}/i, iMin); 20341 result.msg = result.msg.replace(/\{max\}/i, iMax); 20342 } 20343 20344 return result; 20345 }, 20346 20347 isLengthRange : function(Response, range) { 20348 var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20349 20350 var rangeInfo = this._getRangeNum(range); 20351 var iMin = rangeInfo.min; 20352 var iMax = rangeInfo.max; 20353 20354 var resultMin = this.isMin(Response, iMin); 20355 var resultMax = this.isMax(Response, iMax); 20356 20357 if (resultMin.passed === this.parent.CODE_FAIL || resultMax.passed === this.parent.CODE_FAIL) { 20358 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20359 result.msg = result.msg.replace(/\{min\}/i, iMin); 20360 result.msg = result.msg.replace(/\{max\}/i, iMax); 20361 } 20362 20363 return result; 20364 }, 20365 20366 isNumberMin : function(Response, iLimit) { 20367 var check = this.parent.Verify.isNumberMin(Response.elmCurrValue, iLimit); 20368 var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20369 20370 if(check === false){ 20371 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20372 result.msg = result.msg.replace(/\{min\}/i, iLimit); 20373 } 20374 20375 return result; 20376 }, 20377 20378 isNumberMax : function(Response, iLimit) { 20379 var check = this.parent.Verify.isNumberMax(Response.elmCurrValue, iLimit); 20380 var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20381 20382 if(check === false){ 20383 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20384 result.msg = result.msg.replace(/\{max\}/i, iLimit); 20385 } 20386 20387 return result; 20388 }, 20389 20390 isNumberMinPrice : function(Response, iLimit) { 20391 var check = this.parent.Verify.isNumberMin(Response.elmCurrValue, iLimit); 20392 var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20393 20394 if(check === false){ 20395 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20396 result.msg = result.msg.replace(/\{min\}/i, iLimit); 20397 } 20398 20399 return result; 20400 }, 20401 20402 isNumberMaxPrice : function(Response, iLimit) { 20403 var check = this.parent.Verify.isNumberMax(Response.elmCurrValue, iLimit); 20404 var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20405 20406 if(check === false){ 20407 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20408 result.msg = result.msg.replace(/\{max\}/i, iLimit); 20409 } 20410 20411 return result; 20412 }, 20413 20414 isNumberMinMonth : function(Response, iLimit) { 20415 var check = this.parent.Verify.isNumberMin(Response.elmCurrValue, iLimit); 20416 var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20417 20418 if(check === false){ 20419 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20420 result.msg = result.msg.replace(/\{min\}/i, iLimit); 20421 } 20422 20423 return result; 20424 }, 20425 20426 isNumberMaxMonth : function(Response, iLimit) { 20427 var check = this.parent.Verify.isNumberMax(Response.elmCurrValue, iLimit); 20428 var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20429 20430 if(check === false){ 20431 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20432 result.msg = result.msg.replace(/\{max\}/i, iLimit); 20433 } 20434 20435 return result; 20436 }, 20437 20438 isNumberRange : function(Response, range) { 20439 var iMin = range[0]; 20440 var iMax = range[1]; 20441 20442 var check = this.parent.Verify.isNumberRange(Response.elmCurrValue, iMin, iMax); 20443 var result = this.parent.Helper.getResult(Response, this.parent.CODE_SUCCESS); 20444 20445 if(check === false){ 20446 result = this.parent.Helper.getResult(Response, this.parent.CODE_FAIL); 20447 result.msg = result.msg.replace(/\{min\}/i, iMin); 20448 result.msg = result.msg.replace(/\{max\}
20448/i, iMax); 20449 } 20450 20451 return result; 20452 }, 20453 20454 _getRangeNum : function(range) { 20455 var result = {}; 20456 20457 result.min = range[0] <= 0 ? 0 : parseInt(range[0]); 20458 result.max = range[1] <= 0 ? 0 : parseInt(range[1]); 20459 20460 return result; 20461 }, 20462 20463 _fillConditionCheck : function(Response, cond) { 20464 var $ = this.parent.jQuery; 20465 var parent = this.parent; 20466 20467 20468 cond = parent.Helper.trim(cond); 20469 20470 //ì¡°ê±´ìì´ ë¤ì´ì¤ë©´ ì¡°ê±´ìì ë§ì ê²½ì°ë§ íìê°ì ì²´í¬í¨ 20471 if (cond) { 20472 var conditions = cond.split('='); 20473 var fieldId = parent.Helper.trim(conditions[0]); 20474 var fieldVal = parent.Helper.trim(conditions[1]); 20475 20476 try { 20477 var val = parent.Helper.getValue(Response.formId, $('#'+fieldId)); 20478 val = parent.Helper.trim(val); 20479 20480 if(fieldVal != val) { 20481 return parent.Helper.getResult(Response, parent.CODE_SUCCESS); 20482 } 20483 } catch(e) { 20484 if (parent.DEBUG_MODE == true) { 20485 Response.elmCurrErrorMsg = parent.msgs['isFillError']; 20486 Response.elmCurrErrorMsg = Response.elmCurrErrorMsg.replace(/\{condition\}/i, cond); 20487 return parent.Helper.getResult(Response, parent.CODE_FAIL); 20488 } 20489 20490 return parent.Helper.getResult(Response, parent.CODE_SUCCESS); 20491 } 20492 } 20493 20494 //Radio ë Checkboxì ê²½ì° ì ííê°ì´ ìëì§ ì¬ë¶ë¥¼ ì²´í¬í¨ 20495 if (Response.elmCurrFieldType == 'radio' || Response.elmCurrFieldType == 'checkbox') { 20496 20497 var sName = Response.elmCurrField.attr('name'); 20498 var result = parent.Helper.getResult(Response, parent.CODE_FAIL); 20499 20500 $('input[name="'+sName+'"]').each(function(i){ 20501 if ($(this).get(0).checked === true) { 20502 result = parent.Helper.getResult(Response, parent.CODE_SUCCESS); 20503 } 20504 }); 20505 20506 return result; 20507 20508 } 20509 20510 //ì¼ë° í ì¤í¸ ë°ì¤ 20511 if (Response.elmCurrValue != '') { 20512 return parent.Helper.getResult(Response, parent.CODE_SUCCESS); 20513 } 20514 20515 return parent.Helper.getResult(Response, parent.CODE_FAIL); 20516 } 20517}; 20518 20519FwValidator.msgs = { 20520 20521 //기본 20522 'isFill' : '{label} í목ì íì ì ë ¥ê°ì ëë¤.', 20523 20524 'isNumber' : '{label} íëª©ì´ ì«ì íìì´ ìëëë¤.', 20525 20526 'isEmail' : '{label} íëª©ì´ ì´ë©ì¼ íìì´ ìëëë¤.', 20527 20528 'isIdentity' : '{label} íëª©ì´ ìì´ë íìì´ ìëëë¤.', 20529 20530 'isIdentitySearch' : '{label} íëª©ì´ ìì´ë íìì´ ìëëë¤.', 20531 20532 'isMax' : '{label} ì(를) {max}ì ì´íë¡ ì ë ¥í´ì£¼ì¸ì.', 20533 20534 'isMin' : '{label} íëª©ì´ {min}ì(ê°) ì´ìì¼ë¡ í´ì£¼ììì¤ .', 20535 20536 'isRegex' : '{label} íëª©ì´ ì¬ë°ë¥¸ ì ë ¥ê°ì´ ìëëë¤.', 20537 20538 'isAlpha' : '{label} íëª©ì´ ìë¬¸ì´ ìëëë¤', 20539 20540 'isAlphaLower' : '{label} íëª©ì´ ì문 ì문ì íìì´ ìëëë¤', 20541 20542 'isAlphaUpper' : '{label} íëª©ì´ ì문 ë문ì íìì´ ìëëë¤', 20543 20544 'isAlphaNum' : '{label} íëª©ì´ ì문ì´ë ì«ì íìì´ ìëëë¤.', 20545 20546 'isAlphaNumLower' : '{label} íëª©ì´ ì문 ì문ì í¹ì ì«ì íìì´ ìëëë¤.', 20547 20548 'isAlphaNumUpper' : '{label} íëª©ì´ ì문 ë문ì í¹ì ì«ì íìì´ ìëëë¤.', 20549 20550 'isAlphaSpace' : '{label} íëª©ì´ ìë¬¸ì´ ìëëë¤', 20551 20552 'isAlphaDash' : '{label} íëª©ì´ [ì문,ì«ì,_,-] íìì´ ìëëë¤.', 20553 20554 'isAlphaDashLower' : '{label} íëª©ì´ [ì문 ì문ì,ì«ì,_,-] íìì´ ìëëë¤.', 20555 20556 'isAlphaDashUpper' : '{label} íëª©ì´ [ì문 ë문ì,ì«ì,_,-] íìì´ ìëëë¤.', 20557 20558 'isKorean' : '{label} íëª©ì´ íêµì´ íìì´ ìëëë¤.', 20559 20560 'isUrl' : '{label} íëª©ì´ URL íìì´ ìëëë¤.', 20561 20562 'isSsn' : '{label} íëª©ì´ ì£¼ë¯¼ë±ë¡ë²í¸ íìì´ ìëëë¤.', 20563 20564 'isForeignerNo' : '{label} íëª©ì´ ì¸êµì¸ë±ë¡ë²í¸ íìì´ ìëëë¤.', 20565 20566 'isBizNo' : '{label} íëª©ì´ ì¬ì ìë²í¸ íìì´ ìëëë¤.', 20567 20568 'isPhone' : '{label} íëª©ì´ ì íë²í¸ íìì´ ìëëë¤.', 20569 20570 'isMobile' : '{label} íëª©ì´ í¸ëí° íìì´ ìëëë¤.', 20571 20572 'isZipcode' : '{label} íëª©ì´ ì°í¸ë²í¸ íìì´ ìëëë¤.', 20573 20574 'isJuriNo' : '{label} íëª©ì´ ë²ì¸ë²í¸ íìì´ ìëëë¤.', 20575 20576 'isIp' : '{label} íëª©ì´ ìì´í¼ íìì´ ìëëë¤.', 20577 20578 'isDate' : '{label} íëª©ì´ ë ì§ íìì´ ìëëë¤.', 20579 20580 'isMatch' : '{label} í목과 {match} íëª©ì´ ê°ì§ ììµëë¤.', 20581 20582 'isSuccess' : '{label} í목ì ë°ì´í°ë ì ì¡í ì ììµëë¤.', 20583 20584 'isSimplexEditorFill' : '{label}(ì/를) ì ë ¥íì¸ì', 20585 20586 'isPassport' : '{label} íëª©ì´ ì¬ê¶ë²í¸ íìì´ ìëëë¤.', 20587 20588 'isMaxByte' : '{label} í목ì {max}bytes ì´íë¡ í´ì£¼ììì¤.', 20589 20590 'isMinByte' : '{label} í목ì {min}bytes ì´ìì¼ë¡ í´ì£¼ììì¤.', 20591 20592 'isByteRange' : '{label} í목ì {min} ~ {max}bytes ë²ìë¡ í´ì£¼ììì¤.', 20593 20594 'isLengthRange' : '{label} í목ì {min} ~ {max}ì(ê°) ë²ìë¡ í´ì£¼ììì¤.', 20595 20596 'isNumberMin' : '{label} í목ì {min} ì´ìì¼ë¡ í´ì£¼ììì¤.', 20597 20598 'isNumberMax' : '{label} í목ì {max} ì´íë¡ í´ì£¼ììì¤.', 20599 20600 'isNumberMinPrice' : '{label} í목ì {min}ì ì´ìì¼ë¡ ì ë ¥í´ ì£¼ì¸ì.', 20601 20602 'isNumberMaxPrice' : '{label} í목ì {max}ì ì´íë¡ ì ë ¥í´ ì£¼ì¸ì.', 20603 20604 'isNumberMinMonth' : '{label} í목ì {min}ê°ì ì´ìì¼ë¡ ì ë ¥í´ ì£¼ì¸ì.', 20605 20606 'isNumberMaxMonth' : '{label} í목ì {max}ê°ì ì´íë¡ ì ë ¥í´ ì£¼ì¸ì.', 20607 20608 'isNumberRange' : '{label} í목ì {min} ~ {max} ë²ìë¡ í´ì£¼ì¸ì.', 20609 20610 20611 //ëë²ê¹ 20612 'notMethod' : '{label} í목ì ì¡´ì¬íì§ ìë íí°ë¥¼ ì¬ì©íìµëë¤.', 20613 20614 'isFillError' : "[{label}
20614] íëì isFill {condition} 문ì¥ì´ ì못ëììµëë¤.\r\ní´ë¹ íëì ìì´ë를 íì¸íì¸ì." 20615 20616}; 20617 20618/** 20619 * front - ì¿ í°ê´ë ¨ jsì§í© 20620 * 20621 * @package app/Newcoupon 20622 * @subpackage Front 20623 * @author ë°±ë³í,ì í¸ì <[email protected]> 20624 * @since 2013. 05. 06. 20625 * @version 1.0 20626 * */ 20627 20628/** 20629 * ìë¦¬ì¼ ì¿ í° ë±ë¡í¼ì ìí°í¤ ëì ì²ë¦¬ì¶ê° 20630 */ 20631EC$('#frmSerialCoupon').on("keypress", function(e) { 20632 if (e.keyCode == 13) { 20633 return coupon_code_check(); 20634 } 20635}); 20636 20637EC$('#frmCouponlist').on("keypress", function(e) { 20638 if (e.keyCode == 13) { 20639 return COUPON.useCoupon(); 20640 } 20641}); 20642 20643 20644function coupon_code_submit() 20645{ 20646 if (coupon_code_check() === true) coupon_submit('frmSerialCoupon'); 20647} 20648 20649/** 20650 * ìë¦¬ì¼ ì¿ í° ì²´í¬ 20651 * @returns {Boolean} 20652 */ 20653function coupon_code_check() 20654{ 20655 if (COUPON.is_coupon_code_submit === true) { 20656 setTimeout(alert(__('TRY.FEW.MINUTES', 'NEWCOUPON.FRONT.COUPON.JS')), 3000); 20657 location.reload(); 20658 return; 20659 } 20660 20661 if (EC$('#frmSerialCoupon #coupon_code').val().length > 35 || EC$('#frmSerialCoupon #coupon_code').val().length < 10) { 20662 20663 if (EC$('#frmSerialCoupon #coupon_code').val().length == 0) { 20664 alert(__('ì¿ í°ë²í¸ë¥¼ ì ë ¥í´ì£¼ì¸ì')); 20665 } else { 20666 alert(__('ì¿ í°ë²í¸ë 10~35ì리 ì ëë¤.')); 20667 } 20668 20669 EC$('#frmSerialCoupon #coupon_code').focus(); 20670 20671 return false; 20672 } 20673 20674 COUPON.is_coupon_code_submit = true; 20675 return true; 20676 20677} 20678 20679function coupon_product_popup(url, coupon_no) 20680{ 20681 window.open(url+'?coupon_no='+coupon_no, 'myshop_coupon_pop_list','width=700,height=630,scrollbars=yes,resizable=yes,menubar=no,toolbar=no,location=no,status=no'); 20682 20683} 20684 20685function coupon_submit(sFormName) 20686{ 20687 EC$('#'+sFormName).submit(); 20688} 20689 20690 20691function listsize_change(sFormName) 20692{ 20693 var $f = EC$("#" + sFormName); 20694 if (EC$("#limit").length == 0) { 20695 $f.append("<input type='hidden' id='limit' name='limit'>"); 20696 } 20697 EC$("#limit").val(EC$("#list_size option:selected").val()); 20698 $f.submit(); 20699} 20700 20701function Layer_overload_pop(LayerName,Status) 20702{ 20703 try 20704 { 20705 var LayerN; 20706 20707 if (navigator.appName == "Netscape") 20708 { 20709 LayerN = document.getElementById(LayerName).style; 20710 if (Status == 'show') LayerN.visibility = 'visible'; 20711 if (Status == 'hide') LayerN.visibility = 'hidden'; 20712 } 20713 else 20714 { 20715 LayerN = document.all[LayerName].style; 20716 if (Status == 'show') LayerN.visibility = 'visible'; 20717 if (Status == 'hide') LayerN.visibility = 'hidden'; 20718 } 20719 } 20720 catch (e) 20721 { 20722 } 20723} 20724 20725 20726var COUPON = { 20727 is_coupon_code_submit: false, 20728 is_coupon_use_submit: false, 20729 20730 viewInfo: function(iCouponNo, oCouponElem) 20731 { 20732 var aPos = EC$(oCouponElem).offset(); 20733 20734 var oCoupon = aCouponInfo[iCouponNo]; 20735 EC$('#dCouponDetail').remove(); 20736 20737 var sHtml = '<div id="dCouponDetail" class="layerTheme"></div>'; 20738 20739 EC$('body').append(sHtml); 20740 if (mobileWeb === true) { 20741 try { 20742 EC$('#dCouponDetail').html('<h4><strong>' + __('ì¿ í°ì ë³´') + '</strong></h4>' + 20743 '<ul class="couponInfo">' + 20744 '<li><span>' + __('ì¿ í°ëª ') + ' :</span> ' + decodeURIComponent(oCoupon.coupon_name) + '</li>' + 20745 '<li><span>' + __('ì ì©ìí') + ' :</span> ' + decodeURIComponent(oCoupon.coupon_product_info) + '</li>' + 20746 '<li><span>' + __('COUPON.BENEFITS', 'NEWCOUPON.FRONT.COUPON.JS') + ' :</span> ' + decodeURIComponent(oCoupon.coupon_content) + ' ' + decodeURIComponent(oCoupon.coupon_max_benefit) + '</li>' + 20747 '<li><span>' + __('ì¬ì©ì¡°ê±´') + ' :</span> ' + decodeURIComponent(oCoupon.coupon_usecon) + ' ' + decodeURIComponent(oCoupon.region_delivery_msg) + ' ' + decodeURIComponent(oCoupon.foreign_delivery_msg) + '</li>' + 20748 '<li><span>' + __('ë°íìë') + ' :</span> ' + decodeURIComponent(oCoupon.coupon_issue) + '</li>' + 20749 '<li><span>' + __('ì¬ì©ê¸°ê°') + ' :</span> ' + decodeURIComponent(oCoupon.coupon_period_detail) + '</li>' + 20750 '</ul>' + 20751 '<p class="mButton">' + 20752 '<a href="' + oCoupon.coupon_issue_url + '" class="tSubmit1">' + '<span>' + __('ë¤ì´ë°ê¸°') + '</span></a>' + 20753 '<a href="#none" class="tSubmit2" onclick="EC$(\'#dCouponDetail\').remove();">' + '<span>' + __('ë«ê¸°') + '</span> </a>' + 20754 '</p>'); 20755 } catch (err) { 20756 EC$('#dCouponDetail').html('<h4><strong>' + __('ì¿ í°ì ë³´') + '</strong></h4>' + 20757 '<ul class="couponInfo">' + 20758 '<li><span>' + __('ì¿ í°ëª ') + ' :</span> ' + oCoupon.coupon_name + '</li>' + 20759 '<li><span>' + __('ì ì©ìí') + ' :</span> ' + oCoupon.coupon_product_info + '</li>' + 20760 '<li><span>
20760' + __('COUPON.BENEFITS', 'NEWCOUPON.FRONT.COUPON.JS') + ' :</span> ' + oCoupon.coupon_content + ' ' + oCoupon.coupon_max_benefit + '</li>' + 20761 '<li><span>' + __('ì¬ì©ì¡°ê±´') + ' :</span> ' + oCoupon.coupon_usecon + ' ' + oCoupon.region_delivery_msg + ' ' + oCoupon.foreign_delivery_msg + '</li>' + 20762 '<li><span>' + __('ë°íìë') + ' :</span> ' + oCoupon.coupon_issue + '</li>' + 20763 '<li><span>' + __('ì¬ì©ê¸°ê°') + ' :</span> ' + oCoupon.coupon_period_detail + '</li>' + 20764 '</ul>' + 20765 '<p class="mButton">' + 20766 '<a href="' + oCoupon.coupon_issue_url + '" class="tSubmit1">' + '<span>' + __('ë¤ì´ë°ê¸°') + '</span></a>' + 20767 '<a href="#none" class="tSubmit2" onclick="EC$(\'#dCouponDetail\').remove();">' + '<span>' + __('ë«ê¸°') + '</span> </a>' + 20768 '</p>'); 20769 } 20770 20771 //EC$('#dCouponDetail').offset({top:aPos.top,left:aPos.left-10}); 20772 var iLeft = '-' + EC$('#dCouponDetail').width() / 2 + 'px', iTop = '-' + EC$('#dCouponDetail').height() / 2 + 'px'; 20773 EC$('#dCouponDetail').css({top: '50%', left: '50%', position: 'fixed', marginTop: iTop, marginLeft: iLeft}); 20774 20775 } else { 20776 try { 20777 EC$('#dCouponDetail').html('<h3 class="title">' + __('ì¿ í°ì ë³´') + '</h3>' + 20778 '<a href="#none" onclick="EC$(\'#dCouponDetail\').remove();">' + 20779 '<img src="//img.cafe24.com/images/ec_hosting/front/btn_close_003.gif" />' + 20780 '</a>' + 20781 '<div class="content">' + 20782 '<ul>' + 20783 '<li><span>' + __('ì¿ í°ëª ') + ' :</span> ' + decodeURIComponent(oCoupon.coupon_name) + '</li>' + 20784 '<li><span>' + __('ì ì©ìí') + ' :</span> ' + decodeURIComponent(oCoupon.coupon_product_info) + '</li>' + 20785 '<li><span>' + __('COUPON.BENEFITS', 'NEWCOUPON.FRONT.COUPON.JS') + ' :</span> ' + decodeURIComponent(oCoupon.coupon_content) + ' ' + decodeURIComponent(oCoupon.coupon_max_benefit) + '</li>' + 20786 '<li><span>' + __('ì¬ì©ì¡°ê±´') + ' :</span> ' + decodeURIComponent(oCoupon.coupon_usecon) + ' ' + decodeURIComponent(oCoupon.region_delivery_msg) + ' ' + decodeURIComponent(oCoupon.foreign_delivery_msg) + '</li>' + 20787 '<li><span>' + __('ë°íìë') + ' :</span> ' + decodeURIComponent(oCoupon.coupon_issue) + '</li>' + 20788 '<li><span>' + __('ì¬ì©ê¸°ê°') + ' :</span> ' + decodeURIComponent(oCoupon.coupon_period_detail) + '</li>' + 20789 '</ul>' + 20790 '<a href="' + oCoupon.coupon_issue_url + '&is_popup=' + '&opener_url=' + document.URL + '">' + 20791 '<img src="//img.echosting.cafe24.com/skin/admin_' + SHOP.getLanguage() + '/product/btn_coupon_download.gif" />' + 20792 '</a>' + 20793 '</div>'); 20794 } catch (err) { 20795 EC$('#dCouponDetail').html('<h3 class="title">' + __('ì¿ í°ì ë³´') + '</h3>' + 20796 '<a href="#none" onclick="EC$(\'#dCouponDetail\').remove();">' + 20797 '<img src="//img.cafe24.com/images/ec_hosting/front/btn_close_003.gif" />' + 20798 '</a>' + 20799 '<div class="content">' + 20800 '<ul>' + 20801 '<li><span>' + __('ì¿ í°ëª ') + ' :</span> ' + oCoupon.coupon_name + '</li>' + 20802 '<li><span>' + __('ì ì©ìí') + ' :</span> ' + oCoupon.coupon_product_info + '</li>' + 20803 '<li><span>' + __('COUPON.BENEFITS', 'NEWCOUPON.FRONT.COUPON.JS') + ' :</span> ' + oCoupon.coupon_content + ' ' + oCoupon.coupon_max_benefit + '</li>' + 20804 '<li><span>' + __('ì¬ì©ì¡°ê±´') + ' :</span> ' + oCoupon.coupon_useco + ' ' + oCoupon.region_delivery_msg + ' ' + oCoupon.foreign_delivery_msg + '</li>' + 20805 '<li><span>' + __('ë°íìë') + ' :</span> ' + oCoupon.coupon_issue + '</li>' + 20806 '<li><span>' + __('ì¬ì©ê¸°ê°') + ' :</span> ' + oCoupon.coupon_period_detail + '</li>' + 20807 '</ul>' + 20808 '<a href="' + oCoupon.coupon_issue_url + '&is_popup=' + '&opener_url=' + document.URL + '">' + 20809 '<img src="//img.echosting.cafe24.com/skin/admin_' + SHOP.getLanguage() + '/product/btn_coupon_download.gif" />' + 20810 '</a>' + 20811 '</div>'); 20812 } 20813 20814 EC$('#dCouponDetail').offset({top: aPos.top+20,left: aPos.left+30}); 20815 } 20816 20817 }, 20818 20819 useCoupon: function() 20820 { 20821 if (COUPON.is_coupon_use_submit === true) { 20822 setTimeout(alert(__('USE.TRY.IN.FEW.MINUTES', 'NEWCOUPON.FRONT.COUPON.JS')), 3000); 20823 location.reload(); 20824 return; 20825 } 20826 20827 var cnt = 0; 20828 20829 for (var i=0;
20829 i<document.frmCouponlist.length; i++) { 20830 20831 if ((document.frmCouponlist.elements[i].type == "checkbox") && (document.frmCouponlist.elements[i].name == "coupon_code[]")) { 20832 if (document.frmCouponlist.elements[i].checked == true) 20833 cnt = cnt + 1; 20834 } 20835 } 20836 20837 if (cnt < 1) { 20838 alert(__("ì íë ì¿ í°ì´ ììµëë¤.")); 20839 return false; 20840 } 20841 20842 COUPON.is_coupon_use_submit = true; 20843 document.frmCouponlist.action = '/exec/front/Coupon/Mileage/'; 20844 document.frmCouponlist.submit(); 20845 20846 }, 20847 20848 //ì¿ í°ë°ê¸ê²°ê³¼ ì¶ë ¥ 20849 getDownCouponResultForm: function(data) 20850 { 20851 //var total = Object.keys(aCouponInfo).length; 20852 var total = data['total_list']; 20853 20854 var sContent = "<ul>"; 20855 if (typeof(data.message) === 'object') { 20856 EC$.each(data.message, function(key, val) { 20857 sContent += '<li>'+val+'</li>'; 20858 }); 20859 } else { 20860 sContent = '<li>'+data.message+'</li>'; 20861 } 20862 sContent += '</ul>'; 20863 20864 var iSuccessCnt = 0; 20865 if (typeof(data['issue_list']) !== 'undefined') { 20866 iSuccessCnt = data['issue_list'].length; 20867 } 20868 20869 var aData = { 20870 'total': total, 20871 'success_cnt': iSuccessCnt, 20872 'content': sContent 20873 }; 20874 20875 EC$.get(sCouponDownResultUrl, aData, function(formData) { 20876 formData = formData.replace(/\{\$total\}/, parseInt(total)) 20877 .replace(/\{\$success_cnt\}/, parseInt(iSuccessCnt)) 20878 .replace(/\{\$fail_cnt\}/, parseInt(total - iSuccessCnt)) 20879 .replace(/\{\$content\}/, sContent); 20880 20881 //EC$(".xans-coupon-productdetail").first().prepend(formData); 20882 EC$("body").prepend(formData); 20883 }); 20884 } 20885}; 20886 20887/** 20888 * ìíìì¸ ì¿ í° ìì 20889 */ 20890CAFE24.SHOP_FRONT_PRODUCT_INFO_COUPON = { 20891 20892 sCouponCacheKey: '', 20893 iExpireTime: 1000 * 60, //1ë¶ìºì 20894 20895 /** 20896 * ìíìì¸ ë¡ë©ì í¸ì¶ 20897 * @param iProductNo 20898 * @param iCategoryNo 20899 */ 20900 getPrdDetailCouponAjax: function (iProductNo, iCategoryNo) { 20901 var sPath = document.location.pathname; 20902 20903 // ECHOSTING-317844 ëì 20904 if (parseInt(iProductNo) < 1 || CAFE24.UTIL.trim(parent.EC$('.ec-product-coupon').html()) != "") { 20905 return; 20906 } 20907 20908 //ì¸ì ì¤í ë¦¬ì§ ì¬ì© ìí¨ì´ë©´.. 20909 if (!window.sessionStorage) { 20910 EC$.get(EC_FRONT_JS_CONFIG_SHOP.sCouponDownloadPage,{'product_no': iProductNo,'cate_no': iCategoryNo, 'sPath': sPath, 'asyncEmbededPage': 'T'} ,function(sHtml) { 20911 sHtml = sHtml.replace(/<script.*?ind-script\/(optimizer.php|i18n.php|moment.php).*?<\/script>/g, ''); 20912 sHtml = sHtml.replace(/<script.*?\/cid.generate.js.*?<\/script>/g, ''); 20913 CAFE24.SHOP_FRONT_PRODUCT_INFO_COUPON.displayCouponDownload(sHtml, 'F'); 20914 }); 20915 } else { 20916 if (this.getCouponCache(iProductNo) == false) { 20917 EC$.get(EC_FRONT_JS_CONFIG_SHOP.sCouponDownloadPage,{'product_no': iProductNo,'cate_no': iCategoryNo, 'sPath': sPath, 'asyncEmbededPage': 'T'} ,function(sHtml) { 20918 sHtml = sHtml.replace(/<script.*?ind-script\/(optimizer.php|i18n.php|moment.php).*?<\/script>/g, ''); 20919 sHtml = sHtml.replace(/<script.*?\/cid.generate.js.*?<\/script>/g, ''); 20920 CAFE24.SHOP_FRONT_PRODUCT_INFO_COUPON.setCouponcache(sHtml); 20921 }); 20922 } 20923 20924 } 20925 }, 20926 20927 /** 20928 * viewë¨ 20929 * @param sHtml 20930 */ 20931 displayCouponDownload: function(sHtml, bSessionStorageFlag) { 20932 document.getElementsByClassName('ec-product-coupon')[0].innerHTML = sHtml; 20933 20934 if (bSessionStorageFlag =='F') { //ì¿ í° ì¸ì ì¤í ë¦¬ì§ ì¬ì©ìì /layout/basic/js/common.js í ê¸ì´ë²¤í¸ê° ì ì©ëë¤. 20935 EC$('div.xans-coupon-productdetailajax .title').click(function (e) { 20936 var toggle = EC$(this).parent('.eToggle'); 20937 if (toggle.hasClass('disable') == false) { 20938 EC$(this).parent('.eToggle').toggleClass('selected'); 20939 } 20940 }); 20941 } 20942 }, 20943 20944 /** 20945 * ì¿ í° html ìºì ì²ë¦¬ 20946 * @param sHtml 20947 */ 20948 setCouponcache: function(sHtml) 20949 { 20950 window.sessionStorage.setItem(this.sCouponCacheKey, JSON.stringify({ 20951 exp: Date.now() + this.iExpireTime, 20952 data: {sHtml: sHtml} 20953 })); 20954 this.displayCouponDownload(sHtml, 'F'); 20955 }, 20956 20957 /**
20958 * ì¿ í° html ìºì ê°ì ¸ì¤ê¸° 20959 * @returns {boolean} 20960 */ 20961 getCouponCache: function(iProductNo) 20962 { 20963 this.sCouponCacheKey = 'coupon_download_' + iProductNo + '_' + CAFE24.SDE_SHOP_NUM; 20964 try { 20965 // ë°ì´í° 복구 20966 var oCache = JSON.parse(window.sessionStorage.getItem(this.sCouponCacheKey)); 20967 // expire ì²´í¬ 20968 if (oCache.exp < Date.now()) { 20969 throw 'cache has expired.'; 20970 } 20971 // ë°ì´í° ì²´í¬ 20972 if (typeof oCache.data.sHtml === 'undefined') { 20973 throw 'Invalid cache data.'; 20974 } 20975 this.displayCouponDownload(oCache.data.sHtml, 'T'); 20976 } catch (e) { 20977 // 복구 ì¤í¨ì ìºì ìì 20978 this.removeCouponCache(); 20979 return false; 20980 } 20981 return true; 20982 }, 20983 20984 /** 20985 * ì¿ í° htmlìºì ìì 20986 */ 20987 removeCouponCache: function() 20988 { 20989 // ìºì ìì 20990 window.sessionStorage.removeItem(this.sCouponCacheKey); 20991 } 20992}; 20993 20994var EC_SHOP_FRONT_PRODUCT_INFO_COUPON = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_PRODUCT_INFO_COUPON'); 20995 20996/** 20997 * jQuery JSON Plugin 20998 * version: 2.3 (2011-09-17) 20999 * 21000 * This document is licensed as free software under the terms of the 21001 * MIT License: http://www.opensource.org/licenses/mit-license.php 21002 * 21003 * Brantley Harris wrote this plugin. It is based somewhat on the JSON.org 21004 * website's http://www.json.org/json2.js, which proclaims: 21005 * "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that 21006 * I uphold. 21007 * 21008 * It is also influenced heavily by MochiKit's serializeJSON, which is 21009 * copyrighted 2005 by Bob Ippolito. 21010 */ 21011 21012(function($) { 21013 21014 var escapeable = /["\\\x00-\x1f\x7f-\x9f]/g, 21015 meta = { 21016 '\b': '\\b', 21017 '\t': '\\t', 21018 '\n': '\\n', 21019 '\f': '\\f', 21020 '\r': '\\r', 21021 '"': '\\"', 21022 '\\': '\\\\' 21023 }; 21024 21025 /** 21026 * jQuery.toJSON 21027 * Converts the given argument into a JSON respresentation. 21028 * 21029 * @param o {Mixed} The json-serializble *thing* to be converted 21030 * 21031 * If an object has a toJSON prototype, that will be used to get the representation. 21032 * Non-integer/string keys are skipped in the object, as are keys that point to a 21033 * function. 21034 * 21035 */ 21036 $.toJSON = typeof JSON === 'object' && JSON.stringify 21037 ? JSON.stringify 21038 : function(o) { 21039 21040 if (o === null) { 21041 return 'null'; 21042 } 21043 21044 var type = typeof o; 21045 21046 if (type === 'undefined') { 21047 return undefined; 21048 } 21049 if (type === 'number' || type === 'boolean') { 21050 return '' + o; 21051 } 21052 if (type === 'string') { 21053 return $.quoteString(o); 21054 } 21055 if (type === 'object') { 21056 if (typeof o.toJSON === 'function') { 21057 return $.toJSON(o.toJSON()); 21058 } 21059 if (o.constructor === Date) { 21060 var month = o.getUTCMonth() + 1, 21061 day = o.getUTCDate(), 21062 year = o.getUTCFullYear(), 21063 hours = o.getUTCHours(), 21064 minutes = o.getUTCMinutes(), 21065 seconds = o.getUTCSeconds(), 21066 milli = o.getUTCMilliseconds(); 21067 21068 if (month < 10) { 21069 month = '0' + month; 21070 } 21071 if (day < 10) { 21072 day = '0' + day; 21073 } 21074 if (hours < 10) { 21075 hours = '0' + hours; 21076 } 21077 if (minutes < 10) { 21078 minutes = '0' + minutes; 21079 } 21080 if (seconds < 10) { 21081 seconds = '0' + seconds; 21082 } 21083 if (milli < 100) { 21084 milli = '0' + milli; 21085 } 21086 if (milli < 10) { 21087 milli = '0' + milli; 21088 } 21089 return '"' + year + '-' + month + '-' + day + 'T' + 21090 hours + ':' + minutes + ':' + seconds + 21091 '.' + milli + 'Z"'; 21092 } 21093 if (o.constructor === Array) { 21094 var ret = []; 21095 for (var i = 0; i < o.length; i++) {
21096 ret.push($.toJSON(o[i]) || 'null'); 21097 } 21098 return '[' + ret.join(',') + ']'; 21099 } 21100 var name, 21101 val, 21102 pairs = []; 21103 for (var k in o) { 21104 type = typeof k; 21105 if (type === 'number') { 21106 name = '"' + k + '"'; 21107 } else if (type === 'string') { 21108 name = $.quoteString(k); 21109 } else { 21110 // Keys must be numerical or string. Skip others 21111 continue; 21112 } 21113 type = typeof o[k]; 21114 21115 if (type === 'function' || type === 'undefined') { 21116 // Invalid values like these return undefined 21117 // from toJSON, however those object members 21118 // shouldn't be included in the JSON string at all. 21119 continue; 21120 } 21121 val = $.toJSON(o[k]); 21122 pairs.push(name + ':' + val); 21123 } 21124 return '{' + pairs.join(',') + '}'; 21125 } 21126 }; 21127 21128 /** 21129 * jQuery.evalJSON 21130 * Evaluates a given piece of json source. 21131 * 21132 * @param src {String} 21133 */ 21134 $.evalJSON = typeof JSON === 'object' && JSON.parse 21135 ? JSON.parse 21136 : function(src) { 21137 return eval('(' + src + ')'); 21138 }; 21139 21140 /** 21141 * jQuery.secureEvalJSON 21142 * Evals JSON in a way that is *more* secure. 21143 * 21144 * @param src {String} 21145 */ 21146 $.secureEvalJSON = typeof JSON === 'object' && JSON.parse 21147 ? JSON.parse 21148 : function(src) { 21149 21150 var filtered = 21151 src 21152 .replace(/\\["\\\/bfnrtu]/g, '@') 21153 .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') 21154 .replace(/(?:^|:|,)(?:\s*\[)+/g, ''); 21155 21156 if (/^[\],:{}\s]*$/.test(filtered)) { 21157 return eval('(' + src + ')'); 21158 } else { 21159 throw new SyntaxError('Error parsing JSON, source is not valid.'); 21160 } 21161 }; 21162 21163 /** 21164 * jQuery.quoteString 21165 * Returns a string-repr of a string, escaping quotes intelligently. 21166 * Mostly a support function for toJSON. 21167 * Examples: 21168 * >>> jQuery.quoteString('apple') 21169 * "apple" 21170 * 21171 * >>> jQuery.quoteString('"Where are we going?", she asked.') 21172 * "\"Where are we going?\", she asked." 21173 */ 21174 $.quoteString = function(string) { 21175 if (string.match(escapeable)) { 21176 return '"' + string.replace(escapeable, function(a) { 21177 var c = meta[a]; 21178 if (typeof c === 'string') { 21179 return c; 21180 } 21181 c = a.charCodeAt(); 21182 return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); 21183 }) + '"'; 21184 } 21185 return '"' + string + '"'; 21186 }; 21187 21188})(jQuery); 21189 21190/** 21191 * jQuery JSON Plugin 21192 * version: 2.3 (2011-09-17) 21193 * 21194 * This document is licensed as free software under the terms of the 21195 * MIT License: http://www.opensource.org/licenses/mit-license.php 21196 * 21197 * Brantley Harris wrote this plugin. It is based somewhat on the JSON.org 21198 * website's http://www.json.org/json2.js, which proclaims: 21199 * "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that 21200 * I uphold. 21201 * 21202 * It is also influenced heavily by MochiKit's serializeJSON, which is 21203 * copyrighted 2005 by Bob Ippolito. 21204 */ 21205 21206(function($) { 21207 21208 var escapeable = /["\\\x00-\x1f\x7f-\x9f]/g, 21209 meta = { 21210 '\b': '\\b', 21211 '\t': '\\t', 21212 '\n': '\\n', 21213 '\f': '\\f', 21214 '\r': '\\r', 21215 '"': '\\"', 21216 '\\': '\\\\' 21217 }; 21218 21219 /** 21220 * jQuery.toJSON 21221 * Converts the given argument into a JSON respresentation. 21222 * 21223 * @param o {Mixed} The json-serializble *thing* to be converted 21224 * 21225 * If an object has a toJSON prototype, that will be used to get the representation. 21226 * Non-integer/string keys are skipped in the object, as are keys that point to a 21227 * function. 21228 * 21229 */ 21230 $.toJSON = typeof JSON === 'object' && JSON.stringify 21231 ? JSON.stringify 21232 : function(o) { 21233 21234 if (o === null) { 21235 return 'null';
21236 } 21237 21238 var type = typeof o; 21239 21240 if (type === 'undefined') { 21241 return undefined; 21242 } 21243 if (type === 'number' || type === 'boolean') { 21244 return '' + o; 21245 } 21246 if (type === 'string') { 21247 return $.quoteString(o); 21248 } 21249 if (type === 'object') { 21250 if (typeof o.toJSON === 'function') { 21251 return $.toJSON(o.toJSON()); 21252 } 21253 if (o.constructor === Date) { 21254 var month = o.getUTCMonth() + 1, 21255 day = o.getUTCDate(), 21256 year = o.getUTCFullYear(), 21257 hours = o.getUTCHours(), 21258 minutes = o.getUTCMinutes(), 21259 seconds = o.getUTCSeconds(), 21260 milli = o.getUTCMilliseconds(); 21261 21262 if (month < 10) { 21263 month = '0' + month; 21264 } 21265 if (day < 10) { 21266 day = '0' + day; 21267 } 21268 if (hours < 10) { 21269 hours = '0' + hours; 21270 } 21271 if (minutes < 10) { 21272 minutes = '0' + minutes; 21273 } 21274 if (seconds < 10) { 21275 seconds = '0' + seconds; 21276 } 21277 if (milli < 100) { 21278 milli = '0' + milli; 21279 } 21280 if (milli < 10) { 21281 milli = '0' + milli; 21282 } 21283 return '"' + year + '-' + month + '-' + day + 'T' + 21284 hours + ':' + minutes + ':' + seconds + 21285 '.' + milli + 'Z"'; 21286 } 21287 if (o.constructor === Array) { 21288 var ret = []; 21289 for (var i = 0; i < o.length; i++) { 21290 ret.push($.toJSON(o[i]) || 'null'); 21291 } 21292 return '[' + ret.join(',') + ']'; 21293 } 21294 var name, 21295 val, 21296 pairs = []; 21297 for (var k in o) { 21298 type = typeof k; 21299 if (type === 'number') { 21300 name = '"' + k + '"'; 21301 } else if (type === 'string') { 21302 name = $.quoteString(k); 21303 } else { 21304 // Keys must be numerical or string. Skip others 21305 continue; 21306 } 21307 type = typeof o[k]; 21308 21309 if (type === 'function' || type === 'undefined') { 21310 // Invalid values like these return undefined 21311 // from toJSON, however those object members 21312 // shouldn't be included in the JSON string at all. 21313 continue; 21314 } 21315 val = $.toJSON(o[k]); 21316 pairs.push(name + ':' + val); 21317 } 21318 return '{' + pairs.join(',') + '}'; 21319 } 21320 }; 21321 21322 /** 21323 * jQuery.evalJSON 21324 * Evaluates a given piece of json source. 21325 * 21326 * @param src {String} 21327 */ 21328 $.evalJSON = typeof JSON === 'object' && JSON.parse 21329 ? JSON.parse 21330 : function(src) { 21331 return eval('(' + src + ')'); 21332 }; 21333 21334 /** 21335 * jQuery.secureEvalJSON 21336 * Evals JSON in a way that is *more* secure. 21337 * 21338 * @param src {String} 21339 */ 21340 $.secureEvalJSON = typeof JSON === 'object' && JSON.parse 21341 ? JSON.parse 21342 : function(src) { 21343 21344 var filtered = 21345 src 21346 .replace(/\\["\\\/bfnrtu]/g, '@') 21347 .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') 21348 .replace(/(?:^|:|,)(?:\s*\[)+/g, ''); 21349 21350 if (/^[\],:{}\s]*$/.test(filtered)) { 21351 return eval('(' + src + ')'); 21352 } else { 21353 throw new SyntaxError('Error parsing JSON, source is not valid.'); 21354 } 21355 }; 21356 21357 /** 21358 * jQuery.quoteString 21359 * Returns a string-repr of a string, escaping quotes intelligently. 21360 * Mostly a support function for toJSON. 21361 * Examples: 21362 * >>> jQuery.quoteString('apple') 21363 * "apple" 21364 * 21365 * >>> jQuery.quoteString('"Where are we going?", she asked.') 21366 * "\"Where are we going?\", she asked." 21367 */ 21368 $.quoteString = function(string) { 21369 if (string.match(escapeable)) { 21370 return '"' + string.replace(escapeable, function(a) { 21371 var c = meta[a]; 21372 if (typeof c === 'string') { 21373 return c; 21374 } 21375 c = a.charCodeAt(); 21376 return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); 21377 }) + '"'; 21378 } 21379 return '"' + string + '"'; 21380 }; 21381 21382})(EC$ || jQuery); 21383 21384/** 21385 * ìíì°ëí js - for íë¡ í¸ 21386 */ 21387 21388 21389(function($) { 21390 21391 var $Olnk = { 21392 iOlinkTotalPrice: 0, // ì ì¥í ìµì ì ê°ê²© 21393 iAddOptionTotalPrice: 0, // ì¶ê° 구ì±ìíì ê°ê²© 21394 aOptionData: new Array(), // ìì°¨ì ë¡ë©ì ìí ë°°ì´ 21395 iOptionAddNum: 1, // íìê°ì íìí기 ìí ë²í¸ 21396 iOptionAddProductNum: 1, 21397 aOptionAddProductNum: new Array(), 21398 aOptionProductData: new Array(), 21399 aOptionProductDataListKey: new Array(), 21400 bAllSelectedOption: false, 21401 21402 getOlnkSelectedItem: function(aStockData, bButton, sDispNonePrice, iProductPrice) 21403 { 21404 var aOption = new Array(); 21405 var bItemSelected = false;
21406 var bResult = true; 21407 var sOptionId = ''; 21408 var iOptPrice = 0; 21409 var iPrdPrice = CAFE24.SHOP_PRICE.toShopPrice(iProductPrice); 21410 21411 // ì´ìë°©ìì¤ì > íì/ë¹íì ê°ê²©íì ì¤ì ë°ì 21412 if (sDispNonePrice == 'T') { 21413 iTotalPrice = 0; 21414 } else { 21415 var sSelector = 'select[id^="'+product_option_id+'"]'; 21416 if (typeof CAFE24.SHOP_FRONT_PRODUCT_FUNDING === 'object' && CAFE24.SHOP_FRONT_PRODUCT_FUNDING.isFundingProduct() === true) { 21417 var sCompositionCode = EC$(CAFE24.SHOP_FRONT_NEW_OPTION_BIND.oOptionObject).attr('composition-code'); 21418 sSelector = 'select[id^="'+product_option_id+'_'+sCompositionCode+'"]'; 21419 } 21420 if (typeof CAFE24.FRONT_JS_CONFIG_SHOP === 'object' && CAFE24.FRONT_JS_CONFIG_SHOP.hasOwnProperty('product_service_type') && CAFE24.FRONT_JS_CONFIG_SHOP.product_service_type === 'reservation') { 21421 var aValueNum = []; 21422 EC$(sSelector).each(function() { 21423 aValueNum.push(EC$(this).val()); 21424 }); 21425 sOptionId = aValueNum.join('-'); 21426 if (aStockData.hasOwnProperty(sOptionId) === false) { 21427 sOptionId = 'default'; 21428 } 21429 iTotalPrice = iPrdPrice + CAFE24.SHOP_PRICE.toShopPrice(aStockData[sOptionId].stock_price); 21430 } else { 21431 EC$(sSelector).each(function() { 21432 var iValNo = parseInt(EC$(this).val()); 21433 21434 if (isNaN(iValNo) === true) { 21435 return; 21436 } 21437 21438 iOptPrice += CAFE24.SHOP_PRICE.toShopPrice(aStockData[iValNo].option_price); 21439 sOptionId = iValNo; 21440 }); 21441 21442 iTotalPrice = iPrdPrice + iOptPrice; 21443 } 21444 } 21445 21446 EC$(sSelector).each(function() { 21447 21448 if (EC$(this).prop('required') === false && EC$(this).val() === '*') { 21449 return true; 21450 } 21451 aOption.push(EC$(this).val()); 21452 }); 21453 21454 // ì ë¶ ì íì¸ ìµì ë§ ìê³ ì íë ìµì ì´ ììë 21455 if ((Olnk.bAllSelectedOption === true || bButton === true) && aOption.length === 0) { 21456 bItemSelected = true; 21457 sOptionId = sProductCode; 21458 } else if (ITEM.isOptionSelected(aOption) === true) { 21459 bItemSelected = true; 21460 } 21461 21462 // ë²í¼ì¼ë¡ ì²ë¦¬ íìë ì íì´ ëª¨ë ëì´ ìì§ ìë¤ë©´ í겨 ë´ì 21463 if (bButton === true && bItemSelected === false && aOption.length > 0) { 21464 alert(__('íì ìµì ì ì íí´ì£¼ì¸ì.')); 21465 bResult = false;
21466 } 21467 21468 // ì¶ê°ì ë ¥ìµì ì²´í¬!! 21469 if (bButton === true && checkAddOption() === false) { 21470 bItemSelected = false; 21471 } 21472 21473 return {'bResult': bResult, 'bItemSelected': bItemSelected, 'aOption': aOption, 'sOptionId': sOptionId, 'iTotalPrice': iTotalPrice}; 21474 }, 21475 21476 /** 21477 * ìµì¢ ê°ê²© íì í¸ë¤ë§ - ìíìì¸ 21478 */ 21479 handleTotalPrice: function(sOptionStockData, iProductPrice, sDispNonePrice, bButton, iManualQuantity) { 21480 var aStockData = CAFE24.UTIL.parseJSON(option_stock_data); 21481 var sOptionId = ''; 21482 var iTotalPrice = 0; 21483 var iCnt = 1; 21484 var sQuantity = '('+sprintf(__('%sê°'), iCnt)+')'; 21485 var sPrice = ''; 21486 21487 // ìµì ì í ìë£ ëììë check 21488 var aOption = new Array(); 21489 var aRequiredData = new Array(); 21490 var sOptionText = ''; 21491 var aOptionText = new Array(); 21492 var bItemSelected = false, bSoldOut = false; 21493 var iTotalQuantity = 0; 21494 21495 var aItemSelectInfo = Olnk.getOlnkSelectedItem(aStockData, bButton, sDispNonePrice, iProductPrice); 21496 21497 bResult = aItemSelectInfo.bResult; 21498 bItemSelected = aItemSelectInfo.bItemSelected; 21499 aOption = aItemSelectInfo.aOption; 21500 if (aItemSelectInfo.sOptionId !== '') { 21501 sOptionId = aItemSelectInfo.sOptionId; 21502 } 21503 21504 iTotalPrice = aItemSelectInfo.iTotalPrice; 21505 21506 21507 if (bItemSelected === true) { 21508 var sOptionText = ''; 21509 var iStockNumber = aStockData[sOptionId].stock_number; 21510 var bStock = aStockData[sOptionId].use_stock; 21511 var useSoldOut = aStockData[sOptionId].use_soldout; 21512 var sIsDisplay = aStockData[sOptionId].is_display; 21513 var sIsSelling = aStockData[sOptionId].is_selling; 21514 var sIsReserveStat = aStockData[sOptionId].is_reserve_stat; //ìì½ì£¼ë¬¸R|Që¹ì¼ë°ì¡ 21515 if (typeof CAFE24.SHOP_FRONT_PRODUCT_FUNDING === 'object' && CAFE24.SHOP_FRONT_PRODUCT_FUNDING.isFundingProduct() === true) { 21516 useSoldOut = 'F'; 21517 } 21518 21519 var iBuyUnit = CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getBuyUnitQuantity('base'); 21520 var iProductMin = CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getProductMinQuantity(); 21521 21522 var iQuantity = (iBuyUnit >= iProductMin ? iBuyUnit : iProductMin); 21523 21524 if (typeof(iManualQuantity) !== 'undefined') { 21525 iQuantity = iManualQuantity; 21526 } 21527 if (sIsSelling == 'F' || ((iStockNumber < buy_unit || iStockNumber <= 0) && ((bStock === true && useSoldOut === 'T') || sIsDisplay == 'F'))) {
21528 bSoldOut = true; 21529 sOptionText = ' <span class="soldOut">['+__('íì ')+']</span>'; 21530 } 21531 21532 if (bSoldOut === true && isNewProductSkin() === false) { 21533 alert(__('ì´ ìíì íì¬ ì¬ê³ ê° ë¶ì¡±íì¬ íë§¤ê° ì ì ì¤ë¨ëê³ ììµëë¤.') + '\n\n' + __('ì íëª ') + ' : ' + product_name); 21534 return; 21535 } 21536 21537 //( íì or ì¶ê°ë©ìì§) 21538 if (aReserveStockMessage['show_stock_message'] === 'T' && sIsReserveStat !== 'N') { 21539 var sReserveStockMessage = ''; 21540 bSoldOut = false; //íì ì¬ì© ìí¨ 21541 21542 sReserveStockMessage = aReserveStockMessage[sIsReserveStat]; 21543 sReserveStockMessage = sReserveStockMessage.replace(aReserveStockMessage['stock_message_replace_name'], iStockNumber); 21544 sReserveStockMessage = sReserveStockMessage.replace('[:PRODUCT_STOCK:]', iStockNumber); 21545 21546 sOptionText = sOptionText.replace(sReserveStockMessage, '') + ' <span class="soldOut">'+sReserveStockMessage+'</span>'; 21547 } 21548 21549 // ìì½í ìíì ì íëì´ì§ ìµì ì í©ê³ë¡ ìëì ì²´í¬íì§ ìëë¤. 21550 if (typeof CAFE24.FRONT_JS_CONFIG_SHOP === 'object' && CAFE24.FRONT_JS_CONFIG_SHOP.hasOwnProperty('product_service_type') && CAFE24.FRONT_JS_CONFIG_SHOP.product_service_type === 'reservation') { 21551 iTotalQuantity = 0; 21552 } else { 21553 // ìµì ì íì ì¬ê³ ìëì´ íì¬ ì íëì´ì§ ìëë³´ë¤ ì ì ê²½ì° alertì²ë¦¬íì returní©ëë¤. 21554 EC$('.option_box_id').each(function(i) { 21555 sQuantitySelector = '#' + EC$(this).attr('id').replace('id','quantity'); 21556 if (typeof CAFE24.SHOP_FRONT_PRODUCT_FUNDING === 'object' && CAFE24.SHOP_FRONT_PRODUCT_FUNDING.isFundingProduct() === true) { 21557 var sCompositionCode = EC$(this).attr('composition-code'); 21558 sQuantitySelector = '#quantity_'+sCompositionCode; 21559 } 21560 iTotalQuantity += parseInt(EC$(sQuantitySelector).val()); 21561 }); 21562 } 21563 21564 21565 if (iTotalQuantity > 0) { 21566 iTotalQuantity += iQuantity; 21567 if (((iStockNumber < iTotalQuantity || iStockNumber <= 0) && ((bStock === true && useSoldOut === 'T') || sIsDisplay == 'F'))) { 21568 alert(__('ì¬ê³ ìëì´ ë¶ì¡±íì¬ ë ì´ì ìµì ì ì¶ê°íì¤ ì ììµëë¤.')); 21569 return; 21570 } 21571 } 21572 21573 var sSelector = 'select[id^="'+product_option_id+'"]'; 21574 if (typeof CAFE24.SHOP_FRONT_PRODUCT_FUNDING === 'object' && CAFE24.SHOP_FRONT_PRODUCT_FUNDING.isFundingProduct() === true) { 21575 var sCompositionCode = EC$(CAFE24.SHOP_FRONT_NEW_OPTION_BIND.oOptionObject).attr('composition-code'); 21576 if (CAFE24.SHOP_FRONT_NEW_OPTION_BIND.oOptionObject === null) { 21577 sCompositionCode = CAFE24.SHOP_FRONT_PRODUCT_FUNDING.sCurrentCompositionCode; 21578 } 21579 sSelector = 'select[id^="'+product_option_id+'_'+sCompositionCode+'"]'; 21580 } 21581 21582 sOptionId = ''; 21583 var aOptionTitle = []; 21584 if ((Olnk.bAllSelectedOption === true || bButton === true) && aOption.length === 0) { 21585 EC$(sSelector).each(function() { 21586 sSelectedOptionId = EC$(this).attr('id'); 21587 sOptionId += EC$(this).val() + '_'+EC$(this).attr('option_code') +'||'; 21588 }); 21589 aOptionText.push(__('ì íí ìµì ìì')); 21590 } else { 21591 EC$(sSelector).each(function() { 21592 if (EC$(this).prop('required') === false && EC$(this).val() === '*') { 21593 return true; 21594 } 21595 if (Olnk.getCheckValue(EC$(this).val(),'') === true) { 21596 sSelectedOptionId = EC$(this).attr('id'); 21597 var sOptionText = EC$('#'+sSelectedOptionId+ ' option:selected').text(); 21598 if (typeof CAFE24.FRONT_JS_CONFIG_SHOP === 'object' && CAFE24.FRONT_JS_CONFIG_SHOP.hasOwnProperty('product_service_type') && CAFE24.FRONT_JS_CONFIG_SHOP.product_service_type === 'reservation' && EC$(this).attr('option_title') === 'timestamp') { 21599 var sDateTimeFormat = sOptionText.includes('T') ? EC_GLOBAL_DATETIME.const.FULL_TIME : EC_GLOBAL_DATETIME.const.DATE_ONLY; 21600 var sOptionText = EC_GLOBAL_DATETIME.parse('20'+sOptionText, 'shop').format(sDateTimeFormat); 21601 } 21602 aOptionText.push(sOptionText); 21603 21604 aOptionTitle.push({ key: EC$(this).attr('option_title'), value: EC$('#'+sSelectedOptionId+ ' option:selected').text()}); 21605 } 21606 sOptionId += EC$(this).val() + '_'+EC$(this).attr('option_code') +'||'; 21607 }); 21608 } 21609 if (typeof CAFE24.FRONT_JS_CONFIG_SHOP === 'object' && CAFE24.FRONT_JS_CONFIG_SHOP.hasOwnProperty('product_service_type') && CAFE24.FRONT_JS_CONFIG_SHOP.product_service_type === 'reservation') { 21610 var aValueNum = []; 21611 EC$(sSelector).each(function() { 21612 aValueNum.push(EC$(this).val()); 21613 }); 21614 sOptionId = aValueNum.join('-'); 21615 TotalAddSale.setParam('product_service_type', 'reservation'); 21616 } 21617 21618 iProductPrice = getProductPrice(iQuantity, iTotalPrice, sOptionId, bSoldOut, function(iProductPrice) { 21619 let sOptionPriceText = ''; 21620 if (isNewProductSkin() === false) { 21621 if (sIsDisplayNonmemberPrice == 'T') { 21622 EC$('#span_product_price_text').html(sNonmemberPrice); 21623 } else { 21624 EC$('#span_product_price_text').html(CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iProductPrice)); 21625 } 21626 } else { 21627 if (typeof CAFE24.FRONT_JS_CONFIG_SHOP === 'object' && CAFE24.FRONT_JS_CONFIG_SHOP.hasOwnProperty('product_service_type') && CAFE24.FRONT_JS_CONFIG_SHOP.product_service_type === 'reservation') { 21628 let iOptionAddPrice = TotalAddSale.getReservationLinkAddPrice(sOptionId); 21629 if (iOptionAddPrice !== 0) { 21630 // ì¶ê°ê¸ì¡ í기: getOptionPriceë¡ ë¶í¸/íµíê¸°í¸ ì
21630ì를 ë¤ë¥¸ ìµì íì ê³¼ íµì¼ 21631 sOptionPriceText = '(' + getOptionPrice(iOptionAddPrice) + ')'; 21632 } 21633 } 21634 setOptionBox(sOptionId, (aOptionText.join('/')) + ' ' + sOptionText , iProductPrice, bSoldOut, sSelectedOptionId, sIsReserveStat, iManualQuantity, aOptionTitle, '', sOptionPriceText); 21635 } 21636 21637 }); 21638 21639 21640 } 21641 21642 }, 21643 getOlinkOptionKey: function() 21644 { 21645 var sOptionId = ''; 21646 EC$('select[id^="' + product_option_id + '"]').each(function() { 21647 if (EC$(this).prop('required') === false && EC$(this).val() === '*') { 21648 return true; 21649 } 21650 sOptionId += EC$(this).val() + '_'+EC$(this).attr('option_code') +'||'; 21651 }); 21652 return sOptionId; 21653 }, 21654 21655 /** 21656 * ì¥ë°êµ¬ë ë´ê¸°ì íìí íë¼ë¯¸í° ìì± 21657 */ 21658 getSelectedItemForBasket: function(sProductCode, oTargets, iQuantity) { 21659 var options = {}; 21660 var aOptionData ,aOptionTmp; 21661 var bCheckNum = false; 21662 oTargets.each(function() { 21663 aOptionData = {}; 21664 21665 if (EC$(this).val().indexOf('||') >= 0) { 21666 aOptionTmp = EC$(this).val().split('||'); 21667 for (i = 0; i < aOptionTmp.length; i++) { 21668 if (aOptionTmp[i] !== '') { 21669 aOptionData = aOptionTmp[i].split('_'); 21670 } 21671 21672 if (Olnk.getCheckValue(aOptionData[0],'') === true) { 21673 options[aOptionData[1]] = aOptionData[0]; 21674 bCheckNum = true; 21675 } 21676 } 21677 } else if (typeof CAFE24.FRONT_JS_CONFIG_SHOP === 'object' && CAFE24.FRONT_JS_CONFIG_SHOP.hasOwnProperty('product_service_type') && CAFE24.FRONT_JS_CONFIG_SHOP.product_service_type === 'reservation') { 21678 aOptionTemp = EC$(this).val().split('-'); 21679 for (i = 0; i < aOptionTemp.length; i++) { 21680 if (Olnk.getCheckValue(aOptionTemp[i],'') === true) { 21681 options[i] = aOptionTemp[i]; 21682 bCheckNum = true; 21683 } 21684 } 21685 } else { 21686 var optCode = EC$(this).attr('option_code'); 21687 var optValNo = parseInt(EC$(this).val()); 21688 21689 if (optCode == '' || optCode == null) { 21690 return null; 21691 } 21692 if (isNaN(optValNo) === true) { 21693 optValNo = ''; 21694 } 21695 21696 if (optValNo !== '') { 21697 options[optCode] = optValNo; 21698 bCheckNum = true; 21699 } 21700 21701 } 21702 }); 21703 21704 21705 return { 21706 'product_code': sProductCode, 21707 'quantity': iQuantity, 21708 'options': options, 21709 'bCheckNum': bCheckNum 21710 }; 21711 }, 21712 21713 /** 21714 * ê´ì¬ìí ë´ê¸°ì íìí íë¼ë¯¸í° ìì± 21715 */ 21716 getSelectedItemForWish: function(sProductCode, oTargets) { 21717 var options = {}; 21718 var bCheckNum = false; 21719 21720 var aOptionData ,aOptionTmp; 21721 EC$(oTargets).each(function() { 21722 21723 aOptionTmp = EC$(this).val().split('||'); 21724 aOptionData = {}; 21725 options = {}; 21726 21727 for (i = 0; i < aOptionTmp.length; i++) { 21728 if (aOptionTmp[i] !== '') { 21729 aOptionData = aOptionTmp[i].split('_'); 21730 } 21731 //if (/^\*+$/.test(aOptionData[0]) === false) { 21732 if (Olnk.getCheckValue(aOptionData[0],'') === true) { 21733 options[aOptionData[1]] = aOptionData[0]; 21734 bCheckNum = true; 21735 } 21736 } 21737 }); 21738 21739 return { 21740 'product_code': sProductCode, 21741 'options': options, 21742 'bCheckNum': bCheckNum 21743 }; 21744 }, 21745 21746 /** 21747 * ì íë í목ì ë³´ ë°í 21748 * ìíì°ëíììë item_code ê° ì íí ìµì ì ë»íì§ ìì¼ë¯ë¡ 21749 * í¸íì±ì ìí 모조 ê°ë§ í ë¹í´ì¤ë¤. 21750 */ 21751 getMockItemInfo: function(aInfo) { 21752 var aResult = { 21753 'product_no': aInfo.product_no, 21754 'item_code': aInfo.product_code + '000A', 21755 'opt_id': '000A', 21756 'opt_str': '' 21757 }; 21758 21759 return aResult; 21760 }, 21761 21762 /** 21763 * ìíì°ëí ìµì ì¸ì§ ì¬ë¶ ë°í 21764 */ 21765 isLinkageType: function(sOptionType) { 21766 if (typeof sOptionType === 'string' && sOptionType == 'E') { 21767 return true; 21768 } 21769 21770 return false;
21771 }, 21772 21773 /** 21774 * ìíìì¸(NewProductAction) ê´ë ¨ js ì¤í¬ë¦½í¸ë¥¼ ë³´ë©´, create_layer ë¼ë í¨ìê° ìë¤. 21775 * í´ë¹ í¨ìë ajax ì½ì í´ì ë ì´ì´ íì ì¼ë¡ ëì¸ ìì¤ì½ë를 ë¶ë¬ì¤ê² ëëë°, ì´ë ì¤í¬ë¦½í¸ íê·¸ë ê°ì´ ë°ë¼ì¨ë¤. 21776 * í´ë¹ ì¤í¬ë¦½í¸ íê·¸ìì ë¶ë¬ì¤ë js íì¼ë´ë¶ìë ëì¼í jquery ì½ëê° ë¤ìíë² ì¤ë²ë¼ì´ë©ì´ ëëë° 21777 * ì´ë ê² ëë©´ 기존ì ë¬¼ë ¤ìë extension ë©ìëë¤ì ì´ê¸°íëì´ ë ìê°ê² ëë¤. 21778 * 21779 * ë ì´ì´ íì ì´ ë¨ê³ ëì, $ ë´ì ì¡´ì¬í´ì¼í ë©ìëë 멤ë²ë³ìë¤ì´ ì¬ë¼ì¡ë¤ë©´ ì´ì ê°ì íìë문ì´ë¤. 21780 * ê°ì¥ ì´ìì ì¸ ì²ë¦¬ë ì¤í¬ë¦½í¸ í그를 ìì ëê² ê°ì¥ ì¢ì¼ë í¸ì¶ëë ì¤í¬ë¦½í¸ì ìì¡´ì ì¸ ì½ëê° ì¡´ì¬íëê²ì¼ë¡ ë³´ì¸ë¤. 21781 * í´ë¹ììì´ ìì í íì ë기 ì ê¹ì§ íìí ë¶ë¶ììë§ ìì¸ì ì¼ë¡ ëìí ì ìëë¡ íë¤. 21782 */ 21783 bugfixCreateLayerForWish: function() { 21784 var __nil = jQuery.noConflict(true); 21785 }, 21786 21787 /** 21788 * ì¥ë°êµ¬ë ë´ê¸°ì íìí íë¼ë¯¸í°ë¥¼ ì¼ë¶ ì¡°ì 21789 */ 21790 hookParamForBasket: function(aParam, aInfo) { 21791 if (aInfo.option_type != 'E') { 21792 return aParam; 21793 } 21794 21795 var aItemCode = this.getSelectedItemForBasket(aInfo.product_code, aInfo.targets, aInfo.quantity); 21796 21797 aParam['item_code_before'] = ''; 21798 aParam['option_type'] = 'E'; 21799 aParam['selected_item_by_etype[]'] = EC$.toJSON(aItemCode); 21800 21801 return aParam; 21802 }, 21803 21804 /** 21805 * ê´ì¬ìí ë´ê¸°ì íìí íë¼ë¯¸í°ë¥¼ ì¼ë¶ ì¡°ì 21806 */ 21807 hookParamForWish: function(aParam, aInfo) { 21808 if (aInfo.option_type != 'E') { 21809 return aParam; 21810 } 21811 21812 var aItemCode = {}; 21813 21814 // 21815 // aInfo.targets ë 구ì¤í¨ì ì¬ì©íì ë ì¶ë ¥ëë ìµì ì ë í¸ ë°ì¤ì ìë¦¬ë¨¼í¸ ê°ì²´ì¸ë°, 21816 // íì¬ ë´ì¤í¨ê³¼ 구ì¤í¨ 구ë¶ì ìì´ëê°ì´ wishlist_option_modify_layer_ ì í´ë¹ëë ë ¸ëê° 21817 // ìëì§ë¡ íë³í기 ë문ì 모í¸í¨ì´ ì¡´ì¬íë¤. 21818 // ì¦, ë´ì¤í¨ì ì¬ì©í´ë í´ë¹ ë ¸ëê° ì¡´ì¬íì§ ìë ì¡°ê±´ì´ ë°ìí ì ì기 ë문ì´ë¤. 21819 // ì를 ë¤ë©´, ê´ì¬ìíìì ë´ê¸´ 리ì¤í¸ê° 모ë ìµì ì´ ìë ìíë§ ìë ê²½ì°ì´ê±°ë ìëë©´ 21820 // ìµì ì´ ì¡´ì¬íì§ë§ ì무ê²ë ì íëì§ ìì ìíì¸ ê²½ì° ë°ê²¬ì´ ëì§ ìì ì ìë¤. 21821 // ê·¸ë¬ë¯ë¡ ì´ë° ê²½ì°ì ì ë í¸ë°ì¤ë¥¼ íµí´ ì íë ìµì ì íì íë ê²ì´ ìëë¼, 21822 // íì¬ í ë¹ëì´ ìë ë°ì´í°ë¥¼ 기ì¤ì¼ë¡ íë¼ë¯¸í°ë¥¼ ì¸í íëë¡ íë¤. 21823 // 21824 if (aInfo.targets.length > 0) { 21825 aItemCode = this.getSelectedItemForBasket(aInfo.product_code, aInfo.targets, aInfo.quantity); 21826 } else { 21827 aItemCode = aInfo.selected_item_by_etype; 21828 } 21829 21830 aParam.push('option_type=E'); 21831 aParam.push('selected_item_by_etype[]=' + EC$.toJSON(aItemCode)); 21832 21833 return aParam; 21834 }, 21835 /** 21836 * ì¥ë°êµ¬ë ë´ê¸°ì íìí íë¼ë¯¸í° ìì± - 구ì¤í¨ ì ì© ë´ì¤í¨ ì¬ì©ìí¨. 21837 */ 21838 getSelectedItemForBasketOldSkin: function(sProductCode, oTargets, iQuantity) { 21839 var options = {}; 21840 var optCode = ''; 21841 var optValNo = ''; 21842 var bCheckNum = false; 21843 oTargets.each(function() { 21844 optCode = EC$(this).attr('option_code'); 21845 optValNo = parseInt(EC$(this).val()); 21846 21847 if (optCode == '' || optCode == null) { 21848 return null; 21849 } 21850 21851 if (isNaN(optValNo) === false) { 21852 options[optCode] = EC$(this).val(); 21853 bCheckNum = true; 21854 } 21855 }); 21856 21857 return { 21858 'product_code': sProductCode, 21859 'quantity': iQuantity, 21860 'options': options, 21861 'bCheckNum': bCheckNum 21862 }; 21863 }, 21864 /** 21865 * ê´ì¬ìí ë´ê¸°ì íìí íë¼ë¯¸í° ìì± 21866 */ 21867 getSelectedItemForWishOldSkin: function(sProductCode, oTargets) { 21868 var options = {}; 21869 var isReturn = true; 21870 var bCheckNum = false;
21871 oTargets.each(function() { 21872 if (isReturn === false) { 21873 isReturn = false; 21874 return; 21875 } 21876 21877 var optCode = EC$(this).attr('option_code'); 21878 var optValNo = parseInt(EC$(this).val()); 21879 21880 // 21881 // íìì ë ¥ê° ì²´í¬ 21882 // 21883 if (EC$(this).prop('required') === true) { 21884 if (isNaN(optValNo) === true) { 21885 isReturn = false; 21886 return false; 21887 } 21888 } 21889 21890 if (optCode == '' || optCode == null) { 21891 isReturn = false; 21892 return; 21893 } 21894 21895 if (isNaN(optValNo) === false) { 21896 options[optCode] = optValNo; 21897 bCheckNum = true; 21898 } 21899 }); 21900 21901 if (isReturn === true) { 21902 return { 21903 'product_code': sProductCode, 21904 'options': options, 21905 'bCheckNum': bCheckNum 21906 }; 21907 } 21908 21909 return false; 21910 }, 21911 21912 /* 21913 * ìë¨ ìµì ì íí alertí ìµì ì¬ì¸í ( ìì ìµì ì´ ì¬ ì¸í ëë©´ í´ë¹ ìµì ì íë¨ ìµì ë¤ì reset) 21914 */ 21915 getOptionCheckData: function(oTarget) { 21916 //if ((/^\*+$/.test(oTarget.val()) === true && Boolean(oTarget.prop('required')) === true) || oTarget.attr('id') === undefined) { 21917 return !((Olnk.getCheckValue(oTarget.val(), '') === false && oTarget.prop('required') === true) || oTarget.attr('id') === undefined); 21918 21919 21920 }, 21921 /** 21922 * ì¬ê³ ì²´í¬ ( 구ì¤í¨ìì actionìì íìí¨. 21923 * ê°ê°ì ìëì ì ë¶ í©ì¹ê³ ê·¸ í©ì¹ ìëê³¼ ì¬ê³ ì²´í¬ 21924 * @param sOptionId ìµì id 21925 * @returns íì ì¬ë¶ 21926 */ 21927 getStockValidate: function (sOptionId , iQuantity) { 21928 var aStockData = CAFE24.UTIL.parseJSON(option_stock_data); 21929 var bSoldOut = false; 21930 var iStockNumber , bStock , bStockSoldOut; 21931 // get_stock_info 21932 if (aStockData[sOptionId] == undefined) { 21933 iStockNumber = -1;
21934 bStock = false; 21935 bStockSoldOut = 'F'; 21936 } else { 21937 iStockNumber = aStockData[sOptionId].stock_number; 21938 bStock = aStockData[sOptionId].use_stock; 21939 bStockSoldOut = aStockData[sOptionId].use_soldout; 21940 21941 } 21942 if (bStockSoldOut == 'T' && bStock === true && (iStockNumber < iQuantity)) { 21943 bSoldOut = true; 21944 } 21945 return bSoldOut; 21946 }, 21947 /* 21948 * check value 21949 */ 21950 getCheckValue: function (oTargetValue , oTarget) { 21951 if (/^\*+$/.test(oTargetValue) === true) { 21952 if (oTarget !== '') { 21953 oTarget.val('*'); 21954 } 21955 return false; 21956 } 21957 return true; 21958 }, 21959 /* 21960 * ì¶ê° 구ì±ìíì ì¬ê³ ì²´í¬ 21961 * @param aOptionBoxInfo ì¶ê° 구ì±ìí ë°ì´í° 21962 */ 21963 getAddProductStock: function (aOptionBoxInfo) { 21964 var iTotalQuantity = aOptionBoxInfo['iTotalQuantity']; 21965 if (this.isLinkageType(aOptionBoxInfo['option_type']) === true) { 21966 EC$('.option_add_box_'+aOptionBoxInfo['product_no']).each(function() { 21967 // ìë ì¦ê°ì 본ì¸êº¼ë ë¹¼ì¼ íë¤.. 21968 if (aOptionBoxInfo['sOptionBoxId'] !== EC$(this).attr('id')) { 21969 iTotalQuantity += parseInt(iQuantity = EC$('#' + EC$(this).attr('id').replace('id','quantity')).val()); 21970 } 21971 21972 }); 21973 if (aOptionBoxInfo['is_stock'] === true && aOptionBoxInfo['use_soldout'] === true && aOptionBoxInfo['stock_number'] < iTotalQuantity) { 21974 alert(sprintf(__('%sì ì¬ê³ ê° ë¶ì¡±í©ëë¤.'), aOptionBoxInfo['title'])); 21975 //alert(aOptionBoxInfo['title'] + ' - ' + __('ì ì¬ê³ ê° ë¶ì¡±í©ëë¤.')); 21976 return false; 21977 } 21978 } 21979 }, 21980 /* 21981 * 모ë ìíì ìµì ì´ ì íì¼ë ìµì ë°ì¤ê° ë¨ê¶ì§ì§ ììì ê²½ì° (ì무ê²ë ì íìíë©´ option_box ììê¹) 21982 * @param aOptionBoxInfo ì¶ê° 구ì±ìí ë°ì´í° 21983 */ 21984 getProductAllSelected: function (sProductCode, oTargets, iQuantity) { 21985 var bAllSelected = true; 21986 var options = {}; 21987 oTargets.each(function(i) { 21988 if (EC$(this).val().indexOf('||') >= 0) { 21989 aOptionTmp = EC$(this).val().split('||'); 21990 for (i = 0; i < aOptionTmp.length; i++) { 21991 if (aOptionTmp[i] !== '') { 21992 aOptionData = aOptionTmp[i].split('_'); 21993 } 21994 options[aOptionData[1]] = ''; 21995 } 21996 } else { 21997 if (EC$(this).prop('required') === true || Olnk.getCheckValue(EC$(this).val() , '') === true) { 21998 bAllSelected = false; 21999 return false; 22000 } 22001 var optCode = EC$(this).attr('option_code'); 22002 var optValNo = parseInt(EC$(this).val()); 22003 22004 if (optCode == '' || optCode == null) { 22005 return null; 22006 } 22007 if (isNaN(optValNo) === true) { 22008 optValNo = ''; 22009 } 22010 options[optCode] = optValNo; 22011 } 22012 }); 22013 22014 if (bAllSelected === true) { 22015 return { 22016 'product_code': sProductCode, 22017 'quantity': iQuantity, 22018 'options': options 22019 }; 22020 } else { 22021 return false; 22022 } 22023 22024 }, 22025 22026 /* 22027 * ìµì ì¶ê°ë²í¼ ( ì ê· ì¤í¨ì ì°ëí ìµì ì¼ë í목 ì¶ê° ë²í¼ ìê¹) 22028 * totalProductsê° ììë ì ê· ì¤í¨ 22029 * ( NewProductOption.jsì isNewProductSkinì´ ìì§ë§ ìì¡´ì ì²ë¦¬ê° ì´ë ¤ì) 22030 * oPushButton í목 ì¶ê° ë²í¼ Object 22031 */ 22032 getOptionPushbutton: function(oPushButton) { 22033 if (typeof(option_push_button) !== 'undefined' && option_push_button === 'T' && oPushButton.length > 0 && isNewProductSkin() === true) { 22034 return true; 22035 } else { 22036 return false;
22037 } 22038 22039 }, 22040 22041 /* 22042 * ìµì ì¶ê°ë²í¼ action. php ìì assignë í¨ì 22043 */ 22044 setOptionPushButton: function() { 22045 Olnk.handleTotalPrice(option_stock_data, product_price, sIsDisplayNonmemberPrice , true); 22046 }, 22047 /** 22048 * ìµì ì¶ê° ë²í¼ ì°ëí ìµì ì¸ ê²½ì°ìë§ ëì íì.(ì´ê±´ ì¶ê°êµ¬ì±ìí) 22049 * @param iProductNum ìíë²í¸ 22050 */ 22051 setAddOptionPushButton: function(iProductNum) { 22052 ProductAdd.setAddProductOptionPushButton(iProductNum); 22053 }, 22054 setSetOptionPushButton: function(iProductNum) { 22055 ProductSet.setSetProductOptionPushButton(iProductNum); 22056 }, 22057 22058 /** 22059 * custom_dataì íìí í주ì½ë 22060 * @param {string} sProductCode ìíì½ë 22061 * @param {int} iTotalOptionCount ì íë í목 ê°ì 22062 * @param {int} iCurrentIndex íì¬ ì¸ë±ì¤ 22063 * @returns {string} 22064 */ 22065 getCustomOptionItemCode: function (sProductCode, iTotalOptionCount, iCurrentIndex) { 22066 return sProductCode + '000A_' + (iTotalOptionCount - iCurrentIndex); 22067 } 22068 }; 22069 22070 // 22071 // ê³µê° ì¸í°íì´ì¤ 22072 // 22073 window['Olnk'] = $Olnk; 22074 22075})($); 22076 22077 22078CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS = { 22079 aLoadProductNo : [], 22080 aApiResponseData : [], 22081 oElement : null, 22082 initialize : function() { 22083 var sModuleName = (EC$('[module="ec-product-wms-stock-manage-detail"]').length > 0) ? 'ec-product-wms-stock-manage-detail' : 'ec-product-wms-stock-manage'; 22084 CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.oElement = EC$('[module="'+sModuleName+'"]'); 22085 if (CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.oElement.length < 1) { 22086 return; 22087 } 22088 22089 EC$(window).on('scrollEnd', function() { 22090 CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.loadStock(sModuleName); 22091 }); 22092 }, 22093 22094 loadStock : function(sModuleName) { 22095 CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.setStockStatus(sModuleName) 22096 CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.loadWmsStockStatus(sModuleName); 22097 }, 22098 22099 setStockStatus : function(sModuleName) { 22100 CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.oElement = EC$('[module="'+sModuleName+'"]').not('[hasLoaded="T"]'); // ì´ë¯¸ ë¶ë¬ì¨ê²ì ì ì¸ 22101 if (CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.oElement.length < 1) { 22102 return; 22103 } 22104 22105 var bDetailModule = sModuleName === 'ec-product-wms-stock-manage-detail'; 22106 CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.oElement.each(function () { 22107 var iElementTop = EC$(this).offset().top + EC$(this).height(); 22108 22109 var iWindowScroll = EC$(window).scrollTop(); 22110 var iWindowTop = iWindowScroll + EC$(window).height(); 22111 if ((iElementTop < iWindowTop && iElementTop > iWindowScroll) || bDetailModule === true) { 22112 CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.aLoadProductNo.push(EC$(this).attr('product_no')); 22113 } 22114 }); 22115 22116 CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.loadWmsStockStatus(sModuleName); 22117 }, 22118 22119 loadWmsStockStatus : function(sModuleName) { 22120 if (CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.aLoadProductNo.length < 1) { 22121 return; 22122 } 22123 22124 var sType = 'product'; 22125 // ìí ìì¸ 22126 var bDetailModule = EC$('[module="ec-product-wms-stock-manage-detail"]').length > 0; 22127 if (bDetailModule === true) { 22128 sType = 'option'; 22129 } 22130 22131 EC$.ajax({ 22132 url: '/exec/front/Shop/ApiProductWms', 22133 type: 'get', 22134 async: false, 22135 data: { 22136 'product_no': CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.aLoadProductNo.join(','), 22137 'type' : sType 22138 }, 22139 dataType: 'json', 22140 success: function(oReturn) { 22141 if (oReturn.passed === true) { 22142 CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.aApiResponseData = oReturn.data; 22143 22144 if (bDetailModule === false) { 22145 for (x in oReturn.data) { 22146 //IE8.. 22147 if (x !== 'indexOf') { 22148 EC$('[module="' + sModuleName + '"][product_no="' + x + '"]').removeAttr('class').addClass(oReturn.data[x].product.class).html(oReturn.data[x].product.text); 22149 } 22150 } 22151 } 22152 } 22153 }, 22154 complete: function() { 22155 CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.aLoadProductNo.forEac
22155h(function(iProductNo) { 22156 EC$('[module="'+sModuleName+'"][product_no="'+iProductNo+'"]').attr('hasLoaded', 'T') 22157 }); 22158 CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.aLoadProductNo = []; 22159 } 22160 }); 22161 } 22162}; 22163 22164EC$(document).ready(function() { 22165 CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.initialize(); 22166}); 22167 22168var ECFrontProductjQueryExtent = {}; 22169ECFrontProductjQueryExtent.scrollEndTimeout = null; 22170ECFrontProductjQueryExtent.scrollEnd = { 22171 delegateType:"scroll", 22172 bindType:"scroll", handle:function(event){ 22173 var me = this; 22174 var handleObj = event.handleObj; 22175 var arg = arguments; 22176 clearTimeout(ECFrontProductjQueryExtent.scrollEndTimeout); 22177 ECFrontProductjQueryExtent.scrollEndTimeout = setTimeout(function(){ 22178 handleObj.handler.apply( me, arg ); 22179 },50); 22180 } 22181}; 22182jQuery.event.special.scrollEnd = ECFrontProductjQueryExtent.scrollEnd; 22183 22184// ìí ëª©ë¡ 22185CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.setStockStatus('ec-product-wms-stock-manage'); 22186 22187// ìí ìì¸ 22188CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.setStockStatus('ec-product-wms-stock-manage-detail'); 22189 22190/** 22191 * íì íëª©ì¼ ê²½ì° íì 문구ìëí ì²ë¦¬ 22192 */ 22193CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_SOLDOUT = { 22194 /** 22195 * íì 문구 ì¤ì ì ë³´ 22196 */ 22197 aSoldoutText: null, 22198 22199 /** 22200 * íì ë©ìë 22201 * @param iProductNum ìíë²í¸ 22202 * @param sItemCode í목ì½ë 22203 * @returns ì¤ì ìë°ë¼ íì 문구 ë¦¬í´ 22204 * @final 22205 */ 22206 get: function(iProductNum, sItemCode) { 22207 return this.getStockText(iProductNum, sItemCode); 22208 }, 22209 22210 /** 22211 * íì 문구 ì¤ì (기존ë¡ì§ ê·¸ëë¡ 22212 * @param iProductNum ìíë²í¸ 22213 * @returns í´ë¹ ìíì íì ì¤ì 문구 22214 */ 22215 getSoldoutDiplayText: function (iProductNum) { 22216 if (typeof aSoldoutDisplay === 'undefined') { 22217 return CAFE24.SHOP_FRONT_NEW_OPTION_CONS.OPTION_SOLDOUT_DEFAULT_TEXT; 22218 } 22219 22220 if (this.aSoldoutText === null) { 22221 if (typeof aSoldoutDisplay === 'string') { 22222 this.aSoldoutText = CAFE24.UTIL.parseJSON(aSoldoutDisplay); 22223 } else { 22224 this.aSoldoutText = aSoldoutDisplay; 22225 } 22226 } 22227 22228 if (typeof this.aSoldoutText[iProductNum] === 'undefined') { 22229 this.aSoldoutText[iProductNum] = CAFE24.SHOP_FRONT_NEW_OPTION_CONS.OPTION_SOLDOUT_DEFAULT_TEXT; 22230 } 22231 22232 return this.aSoldoutText[iProductNum]; 22233 }, 22234 22235 /** 22236 * í´ë¹ íëª©ì´ íëª©ì¼ ê²½ì° íìë íì íì Text 22237 * @param iProductNum ìíë²í¸ 22238 * @param sItemCode ìì´í ì½ë 22239 * @returns íìë íì 문구 22240 */ 22241 getStockText: function(iProductNum, sItemCode) { 22242 var sSoldoutText = ''; 22243 var bIsSoldout = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isSoldout(iProductNum, sItemCode); 22244 22245 if (bIsSoldout === true) { 22246 sSoldoutText = ' [' + this.getSoldoutDiplayText(iProductNum) + ']'; 22247 } 22248 22249 if (typeof(aReserveStockMessage) === 'undefined') { 22250 return sSoldoutText; 22251 } 22252 22253 var aStockData = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getProductStockData(iProductNum); 22254 22255 if (typeof(aStockData[sItemCode]) === 'undefined') { 22256 return sSoldoutText; 22257 } 22258 22259 if (aStockData[sItemCode].is_reserve_stat !== 'N') { 22260 sSoldoutText = aReserveStockMessage[aStockData[sItemCode].is_reserve_stat]; 22261 sSoldoutText = sSoldoutText.replace(aReserveStockMessage['stock_message_replace_name'], aStockData[sItemCode].stock_number); 22262 sSoldoutText = sSoldoutText.replace('[:PRODUCT_STOCK:]', aStockData[sItemCode].stock_number); 22263 } 22264 22265 return sSoldoutText; 22266 } 22267}; 22268 22269var EC_SHOP_FRONT_NEW_OPTION_EXTRA_SOLDOUT = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_OPTION_EXTRA_SOLDOUT'); 22270 22271/** 22272 * í´ë¹ í목ì ëí ì¶ê°ê¸ì¡ íìì¬ë¶ 22273 */ 22274CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_PRICE = { 22275 /** 22276 * ì¶ê°ê¸ì¡ íìì¬ë¶ ì¤ì 22277 */ 22278 aOptionPriceDisplayConf: [], 22279 22280 oChooseObject: null, 22281 22282 /** 22283 * íì ë©ìë 22284 * @param iProductNum ìíë²í¸ 22285 * @param sItemCode í목ì½ë 22286 * @param eChooseObject íì¬ ì íí ìµì Object 22287 * @returns ì¤ì ìë°ë¼ íìí ê²½ì° í목ì ì¶ê°ê¸ì¡ ë¦¬í´ 22288 * @final 22289 */ 22290 get: function(iProductNum, sItemCode, eChooseObject) {
22291 this.oChooseObject = eChooseObject; 22292 return this.getAddPriceText(iProductNum, sItemCode); 22293 }, 22294 22295 /** 22296 * ê° ìµì ì íìë§ë¤ ì¤íëë ê°ê²©ê´ë ¨ ë©ìë 22297 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ object 22298 * @returns bool 22299 */ 22300 eachCallback: function(oOptionChoose) { 22301 //구ì¤í¨ìì ìµì ì íìë§ë¤ íìí목 í매ê°ë¶ë¶ì ê°ê²©ì ìµì ì¶ê°ë¬ì¡ ê³ì° 22302 this.setDisplayProductPriceForOldSkin(oOptionChoose); 22303 }, 22304 22305 /** 22306 * 구ì¤í¨ìì ìµì ì íìë§ë¤ íìí목 í매ê°ë¶ë¶ì ê°ê²©ì ìµì ì¶ê°ë¬ì¡ ê³ì° 22307 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ object 22308 */ 22309 setDisplayProductPriceForOldSkin: function(oOptionChoose) { 22310 //ë´ì¤í¨ì´ë¼ë©´ í¨ì¤ (ECHOSTING-241102 모ë°ì¼ ê´ì¬ìí리ì¤í¸ ì¤ë¥) 22311 if (EC$('#totalProducts').length > 0) { 22312 return; 22313 } 22314 22315 //í´ë¹ functionì´ ì¡´ì¬í ëë§ ì¤í 22316 if (typeof(setOldTotalPrice) !== 'function') { 22317 return; 22318 } 22319 22320 var sID = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionChooseID(oOptionChoose); 22321 22322 //ìíìì¸ ë©ì¸ìíì ëí´ìë§ ì¤í 22323 if (/^product_option_id+/.test(sID) !== true) { 22324 return; 22325 } 22326 22327 //구ì¤í¨ì¼ ê²½ì° ê° ìµì ì íìë§ë¤ ì¤í 22328 try { 22329 setOldTotalPrice(); 22330 } catch (e) { 22331 CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValue(oOptionCh
22331oose, '*'); 22332 } 22333 }, 22334 22335 /** 22336 * ìµì ì¶ê°ê¸ì¡ìëí Displayí ì¤í¸ 22337 * @param iProductNum ìíë²í¸ 22338 * @param sItemCode í목ì½ë 22339 * @returns string ìµì ì¶ê°ê¸ì¡ Text 22340 */ 22341 getAddPriceText: function(iProductNum, sItemCode) { 22342 //ì¶ê°ê¸ì¡ íìì¬ë¶ 22343 var bIsDisplayOptionPrice = this.getOptionPriceDisplay(iProductNum); 22344 22345 if (bIsDisplayOptionPrice === false) { 22346 return ''; 22347 } 22348 22349 var iAddPrice = this.getAddPrice(iProductNum, sItemCode); 22350 22351 if (iAddPrice !== false) { 22352 var sPrefix = ''; 22353 if (iAddPrice > 0.00) { 22354 sPrefix = '+'; 22355 } else { 22356 sPrefix = '-'; 22357 } 22358 22359 //ííë¨ìê° +- ê¸°í¸ ë¤ììì¼í´ì ì¬ê¸°ì ììë¡ ë°ê¿ 22360 iAddPrice = Math.abs(iAddPrice); 22361 // [ECQAINT-79686] presentment íì± ì ê²°ì íí íì°+íµíê¸°í¸ (ë¹íì± ì í¬í¼ ë´ë¶ìì 기존 í¬ë§· í´ë°±) 22362 var sStr = ' (' + sPrefix + (SHOP.isG2G() === true ? CAFE24.SHOP_PRICE.toShopPricePresentment(iAddPrice) : CAFE24.SHOP_PRICE_FORMAT.toShopPricePresentment(iAddPrice)) +')'; 22363 //ê·¸ë¥ ê°ì ëí ê²½ì° ìíì(\)ê° ₩ë¡ ë³íëì´ì cloneì¼ë¡ ë¤ìê°ì ¸ì¤ê² ì²ë¦¬ 22364 return EC$('<div>').append(sStr).html(); 22365 } 22366 22367 return ''; 22368 }, 22369 22370 /** 22371 * í´ë¹ í목ì ì¶ê°ê¸ì¡ì ê°ì ¸ì¨ë¤(ìì ê²½ì°ìë false를 ë¦¬í´ 22372 * @param iProductNum ìíë²í¸ 22373 * @param sItemCode í목ì½ë 22374 * @returns int|boolean ì¶ê°ê¸ì¡ 22375 */ 22376 getAddPrice: function(iProductNum, sItemCode) 22377 { 22378 var aStockData = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getProductStockData(iProductNum); 22379 if (typeof(aStockData[sItemCode].stock_price) !== 'undefined' && parseFloat(aStockData[sItemCode].stock_price) !== 0.00) { 22380 return parseFloat(aStockData[sItemCode].stock_price); 22381 } 22382 22383 return false; 22384 }, 22385 22386 /** 22387 * ìµì ì¶ê°ê¸ì¡ íìì¬ë¶ ì¤ì 22388 * @param iProductNum ìíë²í¸ 22389 * @returns íìì¬ë¶ 22390 */ 22391 getOptionPriceDisplay: function(iProductNum) { 22392 if (typeof CAFE24.SHOP_FRONT_NEW_OPTION_DATA.aOptionPriceDisplayConf[iProductNum] === 'undefined') { 22393 return 'T'; 22394 } 22395 22396 return (CAFE24.SHOP_FRONT_NEW_OPTION_DATA.aOptionPriceDisplayConf[iProductNum] === 'T'); 22397 } 22398}; 22399 22400var EC_SHOP_FRONT_NEW_OPTION_EXTRA_PRICE = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_OPTION_EXTRA_PRICE'); 22401 22402/** 22403 * ìµì ì í ëë í목ì íìë£ì ìì¸ì´ë¯¸ì§ ë³ê²½ 22404 */ 22405CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_IMAGE = { 22406 /** 22407 * 모ë°ì¼ê³¼ ìì¸ì´ë¯¸ì§ í´ëì¤ê° íë ¤ì 22408 */ 22409 sDetailImageClass: '', 22410 22411 /** 22412 * ì¸í¸ìíì ì´ë¯¸ì§ ìì 22413 */ 22414 sSetProductImageID: '', 22415 22416 /** 22417 * ì¤ìì´í기ë¥ì ì¬ì©íë ìíìì¸ì¸ì§ íì¸(모ë°ì¼ì ì©) 22418 */ 22419 isSwipe: false, 22420 22421 /** 22422 * ì¸í¸ìíì¸ì§ ì¬ë¶ 22423 */ 22424 bIsSetProduct: false, 22425 22426 /** 22427 * ê° ìµì ì íìë§ë¤ ì´ë¯¸ì§ê° ìë¤ë©´ ìì¸ì´ë¯¸ì§ì ë°ìëëë¡ í¨ 22428 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ object 22429 */ 22430 eachCallback: function(oOptionChoose) { 22431 this.bIsSetProduct = false; 22432 22433 //ì¸í¸ìíì¼ ê²½ì°ì ëí ì²ë¦¬ 22434 if (/^setproduct_option_+/.test(CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectGroup(oOptionChoose)) === true) { 22435 this.bIsSetProduct = true; 22436 this.sSetProductImageID = '#ec-set-product-composed-product-'; 22437 } 22438 22439 if (/^addproduct_option_+/.test(CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectGroup(oOptionChoose)) === true) { 22440 this.bIsSetProduct = true; 22441 this.sSetProductImageID = '#ec-add-product-composed-product-'; 22442 } 22443
22444 if (this.isDisplayImage(oOptionChoose) === false) { 22445 return; 22446 } 22447 22448 var oSelectedOption = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedElement(oOptionChoose); 22449 22450 if (typeof(oSelectedOption.attr('link_image')) === 'undefined' || oSelectedOption.attr('link_image').length < 1) { 22451 return; 22452 } 22453 22454 this.setImage(oSelectedOption.attr('link_image'), true, oOptionChoose); 22455 }, 22456 22457 /** 22458 * ìµì ì ì²´ ì íìë£í í´ë¹ ìµì í목ì ì°ê²°ë ì´ë¯¸ì§ë¥¼ ìì¸ì´ë¯¸ì§ì ë°ìëëë¡ í¨ 22459 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ object 22460 */ 22461 completeCallback: function(oOptionChoose) { 22462 //ì°ëíì ì ì¸ 22463 if (Olnk.isLinkageType(CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionType(oOptionChoose)) === true) { 22464 return; 22465 } 22466 22467 if (this.isDisplayImage(oOptionChoose) === false) { 22468 return; 22469 } 22470 22471 var sItemCode = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getItemCode(oOptionChoose); 22472 22473 if (sItemCode === false) { 22474 return; 22475 } 22476 22477 var iProductNo = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oOptionChoose); 22478 22479 var aStockData = CAFE24.SHOP_FRONT_NEW_OPTION_DATA.getProductStockData(iProductNo); 22480 22481 if (typeof(aStockData[sItemCode].item_image_file) !== 'undefined' && CAFE24.UTIL.trim(aStockData[sItemCode].item_image_file) !== '') { 22482 this.setImage(aStockData[sItemCode].item_image_file, false, oOptionChoose); 22483 } 22484 }, 22485 22486 /** 22487 * ì´ë¯¸ì§ ì¶ë ¥ì´ ê°ë¥íì§ íì¸ 22488 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ object 22489 * @returns bool 22490 */ 22491 isDisplayImage: function(oOptionChoose) { 22492 //ì¸í¸ìíì¼ ê²½ì°ì ëí ì²ë¦¬ 22493 if (this.bIsSetProduct === true) { 22494 return this.isDisplayImageDesignForSetProduct(CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oOptionChoose)); 22495 } else { 22496 //ì¶ê°êµ¬ì±ìíë±ì 모ë ì ì¸íê³ ìíìì¸ì ëíìíë§ ë³ê²½ 22497 return this.isDisplayImageDesign(); 22498 } 22499 }, 22500 22501 /** 22502 * ì¸í¸ìíìì 구ì±ìíì ìµì ì íì ì´ë¯¸ë¹ ë³ê²½ ê°ë¥ì¬ë¶ 22503 * @param iProductNum ìíë²í¸ 22504 * @returns {boolean} 22505 */ 22506 isDisplayImageDesignForSetProduct: function(iProductNum) 22507 { 22508 var oSetProductImageElement = EC$(this.sSetProductImageID + iProductNum); 22509 22510 //í´ë¹ 구ì±ìíì ì´ë¯¸ì§ììì´ ìê±°ë idê° ì§ì ëì§ ììì¼ë©´ false 22511 if (oSetProductImageElement.length < 1) { 22512 return false; 22513 } 22514 22515 return true; 22516 }, 22517 22518 /** 22519 * ëìì¸ìì ì´ë¯¸ì§ê° ë ¸ì¶ë ììë ëìì¸ì¸ì§ íì¸ 22520 * ìíìì¸ìì ëì¼íê² ì¬ì©í기ìí´ì ë°ë¡ ë©ìëë¡ ë¶ë¦¬ 22521 * @returns {boolean} 22522 */ 22523 isDisplayImageDesign: function() 22524 { 22525 var isMobile = false; 22526 if (typeof(mobileWeb) !== 'undefined' && mobileWeb === true) { 22527 isMobile = true; 22528 this.sDetailImageClass = '.bigImage'; 22529 } else { 22530 this.sDetailImageClass = '.BigImage'; 22531 } 22532 22533 if (isMobile === true) { 22534 if (EC$('.xans-product-mobileimage').length > 0) { 22535 this.isSwipe = true; 22536 } 22537 } 22538 22539 //ìì¸ì´ë¯¸ì§ê° ìë¤ë©´ í¨ì¤ 22540 if (this.isSwipe === false && EC$(this.sDetailImageClass).length < 1) { 22541 return false; 22542 } 22543 22544 return true; 22545 }, 22546 22547 /** 22548 * ê° ëìì¸ì ë°ë¼ ìµì ëë í목ì´ë¯¸ì§ë¥¼ ìì¸ì´ë¯¸ì§ì ë ¸ì¶ 22549 * @param sUrl ì´ë¯¸ì§ì£¼ì 22550 * @param isOptionFlag ê° ìµì ì ì´ë¯¸ì§ê° ìë 모ë ìµì ì íí í목ì ì´ë¯¸ì§ì´ë©´ false 22551 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ object 22552 */ 22553 setImage: function(sUrl, isOptionFlag, oOptionChoose) 22554 { 22555 if (this.bIsSetProduct === true) { 22556 EC$(this.sSetProductImageID + CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oOptionChoose)).attr('src', sUrl); 22557 } else { 22558 //ì¤ìì´í기ë¥ì ì¬ì©í ë 22559 if (this.isSwipe === true) { 22560 if (isOptionFlag === false) { 22561 //모ë ìµì ì íí í목ì ì°ê²°ì´ë¯¸ì§ 22562 this.setSwipeImage(sUrl, false); 22563 } else { 22564 //ê° ì ì ì ëí ìµì ì´ë¯¸ì§ 22565 this.setSwipeImage('', true); 22566 22567 var iIndex = EC$('div.xans-product-mobileimage').find('li img[src="' + sUrl + '"]').parent().index(); 22568 EC$('div.typeSwipe').find('span > button').eq(iIndex).trigger('click'); 22569 } 22570 } else { 22571 //ì¤ìì´í기ë¥ì ì¬ì©ìí ë 22572 EC$(this.sDetailImageClass).attr('src', sUrl); 22573 } 22574 } 22575 }, 22576 22577 /** 22578 * 모ë°ì¼ ìíìì¸ìì ì¤ìì´í ì¬ì©ì¤ì¼ë 22579 * ê° ìµì ì ì°ê²°ì´ë¯¸ì§ë 기존ì¤ìì´í ììì¼ë¡ 22580 * ê° í목ì ì°ê²°ì´ë¯¸ì§ë ìë ëíì´ë¯¸ì§ ììì´ ëì¤ëë¡ í¨ 22581 * @param sSrc í´ë¹ ì´ë¯¸ì§ 주ì(í목 ì°ê²°ì´ë¯¸ì§ì¼ëë§) 22582 * @param bIsShowSlide true => ê° ìµì ë³ ì°ê²°ì´ë¯¸ì§, false => ê° íëª©ë³ ì°ê²°ì´ë¯¸ì§ 22583 * @param iButtonIndex ì´ë¯¸ì§ ì í ë²í¼ ììê° 22584 * @param oTarget ì²ë¦¬í ì¤ìì´í 모ë Object 22585 */ 22586 setSwipeImage: function(sSrc, bIsShowSlide, iButtonIndex, oTarget) 22587 { 22588 var oElement = EC$('div.xans-product-mobileimage'); 22589 var oSwipe = EC$('div.typeSwipe'); 22590 if (bIsShowSlide === true) { 22591 oElement.find('ul.eOptionImageCloneTemplate').remove(); 22592 oElement.find('ul').show(); 22593
22594 //í목ì´ë¯¸ì§ê° ë ¸ì¶ëí ë¤ì ì¬ë¼ì´ëë²í¼ì ë르ë ìê°ì°¨ë¡ì¸ë cssê° ë¨¹ì§ ììì ì¶ê° 22595 if (typeof(iButtonIndex) !== 'undefined') { 22596 22597 // ë§ì½ íë¼ë¯¸í°ë¡ ë°ì í¹ì ì¤ìì´í 모ë Objectê° ì¡´ì¬íë©´ í´ë¹ 모ëììë§ ì²ë¦¬íëë¡ ì¶ê° 22598 if (typeof(oTarget) !== 'undefined') { 22599 oSwipe = oTarget; 22600 } 22601 22602 oSwipe.find('span > button').eq(iButtonIndex).addClass('selected'); 22603 } 22604 } else { 22605 22606 //첫ë²ì§¸ ì´ë¯¸ì§ë¥¼ 기ì¤ì¼ë¡ heightê° ì í´ì§ê¸°ë문ì 22607 //ëë²ì§¸ ì´ë¯¸ì§ì í ë¹í¨ 22608 oSwipe.find('span > button').eq(1).trigger('click'); 22609 var oClone = oElement.find('ul').clone(); 22610 oClone.addClass('eOptionImageCloneTemplate'); 22611 22612 //ì¶ê°ì´ë¯¸ì§ê° 1ê°ë§ ììê²½ì°ìë ë°ë¡ ìì íì§ ìì 22613 //ì¶ê°ì´ë¯¸ì§ê° íê°ì´ë©´ ë²í¼ì´ ìë ëê°ì´ë¯ë¡ ë°ë¡ ìì íì§ ììë ë¨ 22614 if (oSwipe.find('span > button').length > 2) { 22615 oClone.find('li').not('li').eq(0).not('li').eq(1).remove(); 22616 } 22617 oClone.find('li').eq(1).find('img').attr('src', sSrc); 22618 22619 oSwipe.find('span > button').removeClass('selected'); 22620 22621 oElement.find('ul').hide(); 22622 22623 oElement.find('ul').eq(0).before(oClone); 22624 } 22625 } 22626}; 22627 22628var EC_SHOP_FRONT_NEW_OPTION_EXTRA_IMAGE = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_OPTION_EXTRA_IMAGE'); 22629 22630/** 22631 * ë²í¼ ëë 미리보기 ìµì ì¼ ê²½ì° ì§ì ë ì리먼í¸ì ì íí ìµì ê° ë³´ì¬ì£¼ê¸° 22632 */ 22633CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_DISPLAYITEM = { 22634 TARGET_ELEMENT_CLASS: '.ec-shop-front-product-option-desc-trigger', 22635 /** 22636 * ê° ìµì ì íìë§ë¤ ì´ë¯¸ì§ê° ìë¤ë©´ ìì¸ì´ë¯¸ì§ì ë°ìëëë¡ í¨ 22637 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ objectboolean 22638 */ 22639 eachCallback: function(oOptionChoose) { 22640 //ë²í¼ ëë 미리보기 ìµì ì´ ìëë©´ ë¦¬í´ 22641 if (CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(oOptionChoose) === false) { 22642 return; 22643 } 22644 22645 //ì ë í°ì ""를 ìë¶ì´ë©´ ê°ë í¹ì ìí¡ìì ì¤í¬ë¦½í¸ì¤ë¥
22646 var oTargetOptionChoose = EC$(oOptionChoose).parent(); 22647 var oTarget = oTargetOptionChoose.find("" + this.TARGET_ELEMENT_CLASS + ""); 22648 22649 //ëìì¸ì´ ìë¤ë©´ í¨ì¤ 22650 if (EC$(oTarget).length < 1) { 22651 if (CAFE24.checkChannelUI() === true) { 22652 // ë¶ëª¨ì°½ì íë²ë 찾기 22653 var oTmpTarget = oTargetOptionChoose.parent().find("" + this.TARGET_ELEMENT_CLASS + ""); 22654 22655 //ê·¸ëë ìë¤ë©´ ì¢ ë£ 22656 if (EC$(oTmpTarget).length < 1) { 22657 return; 22658 } 22659 oTarget = oTmpTarget; 22660 } else { 22661 return; 22662 } 22663 } 22664 22665 var sText = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedText(oOptionChoose); 22666 22667 //ì íí목ì textê° ìë¤ë©´ 22668 //ì¶íì ì ë í¸ë°ì¤ê° ì¶ê°ëë¤ë©´... *ë **ê° ì íëìë¤ë©´ ìì¸ì²ë¦¬í´ì¼í¨ 22669 if (typeof(sText) !== 'undefined' && CAFE24.UTIL.trim(sText) !== '') { 22670 EC$(oTarget).removeClass('ec-product-value').addClass('ec-product-value'); 22671 EC$(oTarget).html(sText); 22672 } else { 22673 EC$(oTarget).removeClass('ec-product-value'); 22674 EC$(oTarget).html(EC$(oTarget).attr('data-option_msg')); 22675 } 22676 } 22677}; 22678 22679var EC_SHOP_FRONT_NEW_OPTION_EXTRA_DISPLAYITEM = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_OPTION_EXTRA_DISPLAYITEM'); 22680 22681CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_ITEMSELECTION = { 22682 oCommon: null, 22683 initObject: function() 22684 { 22685 if (this.oCommon !== null) { 22686 return; 22687 } 22688 this.oCommon = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON; 22689 }, 22690 sOptionKey: null, 22691 prefetch: function(oOptionChoose) 22692 { 22693 this.initObject(); 22694 22695 if (oSingleSelection.isItemSelectionTypeM() === true) { 22696 return; 22697 } 22698 22699 // ëì¼í í¤ë¡ ì íë ìíì´ ìë¤ë©´ prefetchë í ì¼ì´ ìì 22700 var oTarget = this.getDeleteTriggerElement(oOptionChoose); 22701 if (oTarget.length === 0) { 22702 return; 22703 } 22704 22705 if (this.oCommon.getOptionType(oOptionChoose) === 'F') { 22706 return this.prefetchOptionTypeF(oOptionChoose); 22707 } 22708 22709 if (this.oCommon.getOptionType(oOptionChoose) === 'E') { 22710 return this.prefetchOptionTypeE(oOptionChoose); 22711 } 22712 22713 oTarget.click(); 22714 }, 22715 prefetchOptionTypeE: function(oOptionChoose) 22716 { 22717 var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose); 22718 if (sOptionGroup.indexOf('setproduct') < 0) { 22719 this.getDeleteTriggerElement(oOptionChoose).click(); 22720 return; 22721 } 22722 var oTarget = this.getDeleteTriggerElement(oOptionChoose); 22723 22724 var sOptionId = oTarget.attr('id').substring(0, oTarget.attr('id').lastIndexOf('_')); 22725 var sOptionKey = EC$('#'+sOptionId+'_id').val(); 22726 this.sOptionKey = sOptionKey; 22727
22728 var sContext = this.getDeleteTriggerContext(oOptionChoose); 22729 EC$(sContext).remove(); 22730 22731 this.hookIndividualSetProductParameter(sOptionKey); 22732 }, 22733 prefetchOptionTypeF: function(oOptionChoose) 22734 { 22735 var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose); 22736 var oTarget = this.getDeleteTriggerElement(oOptionChoose); 22737 var sOptionId = oTarget.attr('id').substring(0, oTarget.attr('id').lastIndexOf('_')); 22738 var sOptionKey = EC$('#'+sOptionId+'_id').val(); 22739 this.sOptionKey = sOptionKey; 22740 22741 // ì¶ê°êµ¬ì±ìí 22742 if (sOptionGroup.indexOf('addproduct') > -1) { 22743 var aOptionInfo = EC$('#'+sOptionId+'_id').val().split('||'); 22744 sOptionKey = aOptionInfo[0]; 22745 this.sOptionKey = sOptionKey; 22746 ProductAdd.delOptionBoxData(sOptionKey); 22747 } 22748 22749 // ì¼ë°ìí, ì¶ê°êµ¬ì±ìí ëì¼ 22750 TotalAddSale.removeProductData(sOptionKey); 22751 22752 // ì¸í¸ìí 22753 if (sOptionGroup.indexOf('setproduct') > -1) { 22754 this.hookIndividualSetProductParameter(sOptionKey); 22755 } 22756 }, 22757 eachCallback: function(oOptionChoose) 22758 { 22759 if (oSingleSelection.isItemSelectionTypeM() === true) { 22760 return; 22761 } 22762 var sOptionType = this.oCommon.getOptionType(oOptionChoose); 22763 22764 if (sOptionType === 'F') { 22765 return this.eachCallbackOptionTypeF(oOptionChoose); 22766 } 22767 if (sOptionType === 'E') { 22768 return this.eachCallbackOptionTypeE(oOptionChoose); 22769 } 22770 }, 22771 eachCallbackOptionTypeE: function(oOptionChoose) 22772 { 22773 // ëê° ê°ì´ ì íëìëë ìë ëëëë¡ ë린ë¤
22774 if (this.oCommon.getOptionSelectedValue(oOptionChoose) !== '*') { 22775 return; 22776 } 22777 var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose); 22778 // ì íí ê°ì´ ì·¨ìë ê²½ì°ìë§ ì´ ë¡ì§ì ì¤ííë¤ 22779 // 모ë ì íì¸ ê²½ì°ìë íëë¼ë ì íëìëì§ 22780 if (this.oCommon.validation.checkRequiredOption(sOptionGroup) === false) { 22781 bIsSelectedRequiredOption = this.oCommon.validation.isOptionSelected(oOptionChoose); 22782 } else { 22783 bIsSelectedRequiredOption = this.oCommon.validation.isSelectedRequiredOption(sOptionGroup); 22784 } 22785 // ëê° íë ì íëì´ìë ê²½ì° 22786 if (this.oCommon.getItemCode(oOptionChoose) === false && bIsSelectedRequiredOption === true) { 22787 var oOptionGroup = this.oCommon.getOptionLastSelectedElement(sOptionGroup); 22788 if (sOptionGroup.indexOf('addproduct') > -1) { 22789 var iProductNum = this.oCommon.getOptionProductNum(oOptionChoose); 22790 if (this.oCommon.isOptionStyleButton(oOptionChoose) === true) { 22791 ProductAdd.setAddProductOptionPushButton(iProductNum); 22792 } 22793 } else { 22794 if (typeof(ProductSet) === 'object') { 22795 if (this.oCommon.isOptionStyleButton(oOptionGroup) === true) { 22796 var oOptionGroup = EC$('select[product_option_area_select="' + EC$(oOptionGroup).attr('product_option_area') + '"][id="' + EC$(oOptionGroup).attr('ec-dev-id') + '"]'); 22797 } 22798 oSingleSelection.setProductTargetKey(oOptionGroup, 'setproduct'); 22799 ProductSet.procOptionBox(oOptionGroup); 22800 } else { 22801 if (typeof(setPrice) === 'function') { 22802 var sID = this.oCommon.getOptionChooseID(oOptionGroup); 22803 setPrice(false, true, sID); 22804 } 22805 } 22806 } 22807 } else { 22808 if (sOptionGroup.indexOf('setproduct') === -1) { 22809 return; 22810 } 22811 this.hookIndividualSetProductParameter(this.sOptionKey); 22812 if (Object.keys(ProductSet.getSetIndividualList()).length > 0) { 22813 TotalAddSale.getCalculatorSalePrice(ProductSet.setTotalPrice); 22814 } 22815 } 22816 }, 22817 hookIndividualSetProductParameter: function(sOptionKey) 22818 { 22819 ProductSet.delOptionBoxData(sOptionKey); 22820 // ë¶ë¦¬ì¸í¸ ìí ì½ë ìì 22821 var oSetIndividualList = ProductSet.getSetIndividualList(); 22822 delete oSetIndividualList[sOptionKey]; 22823 TotalAddSale.setParam('unit_set_product_no', oSetIndividualList); 22824 22825 // í ì¸ ê¸ì¡ í목 ì½ë ìì 22826 TotalAddSale.removeProductData(sOptionKey); 22827 22828 // ì무 ìµì ì´ ìë ê²½ì° 22829 if (Object.keys(oSetIndividualList).length === 0) { 22830 TotalAddSale.setParam('product', oProductList); 22831 TotalAddSale.setTotalAddSalePrice(0); 22832 ProductSet.setTotalPrice(); 22833 } else { 22834 var aProductNo = []; 22835 for (var i = 0; i < Object.keys(oSetIndividualList).length; i++) { 22836 var iProductNum = oSetIndividualList[Object.keys(oSetIndividualList)[i]]; 22837 if (aProductNo.indexOf(iProductNum) === -1) { 22838 aProductNo.push(iProductNum); 22839 } 22840 } 22841 if (aProductNo.length === 1) { 22842 TotalAddSale.setParam('product_no', aProductNo[0]); 22843 TotalAddSale.setParam('is_set', false); 22844 } else { 22845 TotalAddSale.setParam('product_no', iProductNo); 22846 TotalAddSale.setParam('is_set', true); 22847 } 22848 } 22849 22850 }, 22851 eachCallbackOptionTypeF: function(oOptionChoose) 22852 {
22853 if (this.oCommon.getOptionSelectedValue(oOptionChoose) === '*') { 22854 var oTarget = this.getDeleteTriggerElement(oOptionChoose); 22855 // ìµì ì´ ì¤ì ë¡ ì·¨ìëìì 22856 oTarget.click(); 22857 } else { 22858 // ë¤ë¥¸ ìµì ì¼ë¡ ë³ê²½ëìì - ìì ì¡ì ì´ ìëë¼ ìì ëê±°ì²ë¼ ë§ë¤ì´ì¼í¨ 22859 var sContext = this.getDeleteTriggerContext(oOptionChoose); 22860 EC$(sContext).remove(); 22861 } 22862 return true; 22863 }, 22864 getDeleteTriggerElement: function(oOptionChoose) 22865 { 22866 var sSelector = this.getDeleteTriggerSelector(oOptionChoose); 22867 var sContext = this.getDeleteTriggerContext(oOptionChoose); 22868 22869 return EC$(sSelector, sContext); 22870 }, 22871 getTargetKey: function(oOptionChoose) 22872 { 22873 // 기본ìí(ìµì ìë ìí, ì¡°í©íìµì ìí, ì°ëí ìµì ìí, ì¼ì²´í ì¸í¸ìí) : ìíë²í¸ 22874 // ë 립í ìµì ìí : ìíë²í¸|ìµì ìì 22875 // ë¶ë¦¬ì¸í¸ ìí : 구ì±ìíë²í¸|ì¸í¸ìíë²í¸ 22876 // ë¶ë¦¬ì¸í¸ìíì ë 립í ìµì ìí : 구ì±ìíë²í¸|ì¸í¸ìíë²í¸|ìµì ìì 22877 var sTargetKey = this.oCommon.getOptionProductNum(oOptionChoose); 22878 var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose); 22879 if (sOptionGroup.indexOf('setproduct') > -1) { 22880 if (sSetProductType === 'S') { 22881 sTargetKey = sTargetKey + '|' + iProductNo; 22882 } else { 22883 sTargetKey = iProductNo; 22884 } 22885 } 22886 if (this.oCommon.getOptionType(oOptionChoose) === 'F') { 22887 sTargetKey = sTargetKey + '|' + this.oCommon.getOptionSortNum(oOptionChoose); 22888 } 22889 return sTargetKey; 22890 22891 }, 22892 getDeleteTriggerContext: function(oOptionChoose) 22893 { 22894 var sOptionElementType = 'tr'; 22895 22896 if (CAFE24.checkChannelUI() === true) { 22897 sOptionElementType = 'div'; 22898 } 22899 22900 if (typeof(ProductSet) === 'object') { 22901 sOptionElementType = ProductSet.getOptionElementType(); 22902 } 22903 22904 var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose); 22905 var sContext = sOptionElementType +'.add_product'; 22906 if (sOptionGroup.indexOf('addproduct') < 0) { 22907 sContext = sOptionElementType +'.option_product'; 22908 } 22909 var sTargetKey = this.getTargetKey(oOptionChoose); 22910 return sContext+'[target-key="'+ sTargetKey +'"]'; 22911 }, 22912 getDeleteTriggerSelector: function(oOptionChoose) 22913 { 22914 var sOptionGroup = this.oCommon.getOptionSelectGroup(oOptionChoose); 22915 var sSelector = '.option_add_box_del'; 22916 if (sOptionGroup.indexOf('addproduct') < 0) { 22917 sSelector = '.option_box_del'; 22918 } 22919 return sSelector; 22920 } 22921}; 22922 22923var EC_SHOP_FRONT_NEW_OPTION_EXTRA_ITEMSELECTION = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_OPTION_EXTRA_ITEMSELECTION'); 22924 22925var oSingleSelection = function() 22926{ 22927 var sProductTargetKey = null; 22928 var sSingleQuantityInputSelector = 'input.single-quantity-input'; 22929 var sIndexKey = '#PRODUCTNUM#'; 22930 var sSingleObjectName = 'oSingleItemData['+sIndexKey+']'; 22931 var sItemSelectionType = null; 22932 22933 var getTotalPriceSelector = function() 22934 { 22935 return EC$('#totalProducts .total:visible').length > 0 ? '#totalProducts .total' : '.xans-product-detail #totalPrice .total, .xans-product-zoom #totalPrice .total'; 22936 }; 22937 22938 var isItemSelectionTypeS = function() 22939 { 22940 var bSingleQuantityInputSelector = EC$(sSingleQuantityInputSelector).filter(':visible').length > 0; 22941 // ë°ìíì¼ììë ë ¸ì¶ëì§ ìì. íì§ë§ ì¡´ì¬í¨ 22942 if (bSingleQuantityInputSelector === false && CAFE24.checkChannelUI() === true) { 22943 if (sItemSelectionType === 'S') { 22944 return true; 22945 } 22946 } 22947 22948 return bSingleQuantityInputSelector; 22949 22950 }; 22951 22952 var isItemSelectionTypeM = function() 22953 { 22954 return EC$(sSingleQuantityInputSelector).filter(':visible').length === 0; 22955 }; 22956 22957 var getProductNum = function(oQuantityObject) 22958 { 22959 if (EC$(oQuantityObject).hasClass('single-quantity-input') === true) { 22960 return parseInt(EC$(oQuantityObject).attr('product-no'), 10); 22961 } 22962 if (EC$(oQuantityObject).attr('product-no')) { 22963 return EC$(oQuantityObject).attr('product-no'); 22964 } 22965 var sProductNumClass = EC$.grep(EC$(oQuantityObject).attr('class').split(' '), function(sClassName,i) { 22966 return CAFE24.UTIL.trim(sClassName).indexOf('product-no-') === 0; 22967 })[0]; 22968 return parseInt(sProductNumClass.replace('product-no-', ''), 10); 22969 }; 22970 22971 var getOptionSequenceNum = function(oQuantityObject) 22972 { 22973 if (EC$(oQuantityObject).hasClass('single-quantity-input') === true) { 22974 return parseInt(EC$(oQuantityObject).attr('option-sequence'), 10); 22975 } 22976 if (EC$(oQuantityObject).attr('has-option') === 'F') { 22977 return 1; 22978 } 22979 if (EC$(oQuantityObject).attr('option_type') === 'F' && EC$(oQuantityObject).attr('option_sort_no')) { 22980 return parseInt(EC$(oQuantityObject).attr('option_sort_no'), 10); 22981 } 22982 var sSequenceClass = EC$.grep(EC$(oQuantityObject).attr('class').split(' '), function(sClassName,i) { 22983 return CAFE24.UTIL.trim(sClassName).indexOf('option-sequence-') === 0; 22984 })[0]; 22985 22986 return parseInt(sSequenceClass.replace('option-sequence-', ''), 10); 22987 }; 22988 22989 var setProductTargetKey = function(oElement, sType) 22990 { 22991 var iTargetProductNum = iProductNo; 22992 var sTargetKey = iProductNo; 22993 var iOptionSequence = 1; 22994 if (typeof(oElement) !== 'undefined') { 22995 if (oElement.hasClass('single-quantity-input') === true || oElement.hasClass('quantity-h
22995andle') === true) { 22996 iTargetProductNum = getProductNum(oElement); 22997 iOptionSequence = getOptionSequenceNum(oElement); 22998 } else { 22999 var oOptionChoose = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setOptionBoxElement(oElement); 23000 iTargetProductNum = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oOptionChoose); 23001 if (isNaN(iTargetProductNum) === true) { 23002 iTargetProductNum = EC$(oElement).attr('product-no'); 23003 } 23004 iOptionSequence = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSortNum(oOptionChoose); 23005 } 23006 sTargetKey = iTargetProductNum; 23007 } 23008 if (sType === 'setproduct') { 23009 if (sSetProductType === 'S') { 23010 sTargetKey = iTargetProductNum+'|'+iProductNo; 23011 } 23012 } 23013 var bAddProductOptionF = false; 23014 var bSetProductOptionF = false; 23015 if (sType === 'addproduct') { 23016 var oOptionChoose = EC$('select#addproduct_option_id_'+iTargetProductNum+'_'+iOptionSequence); 23017 bAddProductOptionF = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionType(oOptionChoose) === 'F'; 23018 } 23019 if (sType === 'setproduct') { 23020 var oOptionChoose = EC$('select#setproduct_option_id_'+iTargetProductNum+'_'+iOptionSequence);
23021 bSetProductOptionF = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionType(oOptionChoose) === 'F'; 23022 } 23023 if ((typeof(sType) === 'undefined' && option_type === 'F') || bSetProductOptionF === true || bAddProductOptionF === true) { 23024 sTargetKey = sTargetKey+'|'+iOptionSequence; 23025 } 23026 sProductTargetKey = sTargetKey; 23027 }; 23028 23029 return { 23030 getProductTargetKey: function() 23031 { 23032 return sProductTargetKey; 23033 }, 23034 setProductTargetKey: function(oElement, sType) 23035 { 23036 return setProductTargetKey(oElement, sType); 23037 }, 23038 getTotalPriceSelector: function() 23039 { 23040 return getTotalPriceSelector(); 23041 }, 23042 getProductNum: function(oQuantityButtnObject) 23043 { 23044 return getProductNum(oQuantityButtnObject); 23045 }, 23046 getOptionSequence: function(oQuantityButtnObject) 23047 { 23048 return getOptionSequenceNum(oQuantityButtnObject); 23049 }, 23050 getQuantityInput: function(oQuantityButtonObject, sContext) 23051 { 23052 var iSequenceNum = getOptionSequenceNum(oQuantityButtonObject); 23053 var iProductNum = getProductNum(oQuantityButtonObject); 23054 if (typeof(sContext) === 'undefined') { 23055 sContext = null; 23056 } 23057 23058 return EC$(sSingleQuantityInputSelector+'[option-sequence='+iSequenceNum+'][product-no='+iProductNum+']', sContext); 23059 }, 23060 isItemSelectionTypeS: function() 23061 { 23062 return isItemSelectionTypeS(); 23063 }, 23064 isItemSelectionTypeM: function() 23065 { 23066 return isItemSelectionTypeM(); 23067 }, 23068 setItemSelectionType: function(sType) 23069 { 23070 if (typeof(sType) !== 'undefined') { 23071 sItemSelectionType = sType; 23072 } 23073 } 23074 }; 23075}(); 23076 23077CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_DIRECT_BASKET = { 23078 /** 23079 * ì¥ë°êµ¬ë ë´ê¸° Ajaxìë£ì¬ë¶ 23080 */ 23081 bIsLoadedPriceAjax: false, 23082 23083 /** 23084 * ìµì ì íì ì¥ë°êµ¬ë ë°ë¡ ë´ê¸° ê¸°ë¥ ì¬ì© ì¬ë¶ 23085 */ 23086 bIsUseDirectBasket: false, 23087 23088 /** 23089 * ìµì ì íí 주ììµì ì´ ì ì¸ëì´ìë¤ë©´ ë°ë¡ ì¥ë°êµ¬ëë´ê¸° 23090 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ object 23091 */ 23092 completeCallback: function(oOptionChoose) { 23093 if (this.isAvailableDirectBasket(oOptionChoose) === false) { 23094 return; 23095 } 23096 23097 var oInterval = setInterval(function () { 23098 if (CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_DIRECT_BASKET.bIsLoadedPriceAjax === true) { 23099 23100 //ì¥ë°êµ¬ë ë´ê¸° 23101 product_submit(2, '/exec/front/order/basket/', this); 23102 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_DIRECT_BASKET.bIsLoadedPriceAjax = false; 23103 23104 //ìµì ë°ì¤ ì ê±° 23105 EC$('.option_box_del').each(function() { 23106 EC$(this).trigger('click'); 23107 }); 23108 23109 //ìµì ì íê° ì´ê¸°í
23110 EC$('[product_option_area="' + EC$(oOptionChoose).attr('product_option_area') + '"]').each(function() { 23111 CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValue(this, '*', true, true); 23112 }); 23113 23114 clearInterval(oInterval); 23115 } 23116 }, 300); 23117 }, 23118 23119 /** 23120 * ì¬ì©ê°ë¥í ìíì¸ì§ íì¸ 23121 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 23122 * @return boolean true : ì¬ì©ê°ë¥, false : ì¬ì©ë¶ê° 23123 */ 23124 isAvailableDirectBasket: function (oOptionChoose) { 23125 23126 if (this.bIsUseDirectBasket === false) { 23127 return false; 23128 } 23129 23130 oOptionChoose = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setOptionBoxElement(oOptionChoose); 23131 if (EC$(oOptionChoose).attr('product_type') !== 'product_option') { 23132 return false; 23133 } 23134 23135 return true; 23136 }, 23137 23138 /** 23139 * ìµì ì íì ì¥ë°êµ¬ë ë°ë¡ë´ê¸° ê¸°ë¥ 23140 */ 23141 setUseDirectBasket: function () { 23142 this.bIsUseDirectBasket = true; 23143 } 23144}; 23145 23146var EC_SHOP_FRONT_NEW_OPTION_EXTRA_DIRECT_BASKET = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_OPTION_EXTRA_DIRECT_BASKET'); 23147 23148CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_FUNDING = { 23149 sCurrentCompositionCode: null, 23150 prefetch: function(oOptionChoose) 23151 { 23152 }, 23153 completeCallback: function(oOptionChoose) 23154 { 23155 }, 23156 eachCallback: function(oOptionChoose) 23157 {
23158 if (typeof(EC$(oOptionChoose).attr('composition-code')) === 'undefined') { 23159 return true; 23160 } 23161 var sCompositionCode = EC$(oOptionChoose).attr('composition-code'); 23162 EC$('input.selected-funding-item[composition-code="'+sCompositionCode+'"]').remove(); 23163 this.sCurrentCompositionCode = sCompositionCode; 23164 var sItemCode = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getItemCode(oOptionChoose); 23165 if (sItemCode === false) { 23166 return true; 23167 } 23168 /* 23169 var oItemCode = EC$('<input>').attr({ 23170 'type' : 'hidden', 23171 'composition-code' : sCompositionCode 23172 }).addClass('selected-funding-item option_box_id').val(sItemCode); 23173 EC$('.EC-funding-checkbox[value="'+sCompositionCode+'"]').append(oItemCode); 23174 */ 23175 } 23176}; 23177 23178var EC_SHOP_FRONT_NEW_OPTION_EXTRA_FUNDING = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_OPTION_EXTRA_FUNDING'); 23179 23180/** 23181 * ì¬ê³ íë¬ì¤ ì¬ì©íë 몰 ìíìì¸ ì¬ê³ íí© íì 23182 */ 23183CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_WMS = { 23184 23185 /** 23186 * ì¡°í© ë¶ë¦¬í ìµì ì¼ê²½ì° ë§ì§ë§ ìµì ì íì ì¶ê°ëì´ì¼í 문구 23187 * @param iProductNo ìíë²í¸ 23188 * @param sItemCode í목ì½ë 23189 * @returns string ì¬ê³ íí© í ì¤í¸ 23190 */ 23191 get: function(iProductNo, sItemCode) { 23192 return this.getStockStatus(iProductNo, sItemCode); 23193 }, 23194 23195 /** 23196 * ì¬ê³ íí© í ì¤í¸ ë°í 23197 * @param iProductNo ìíë²í¸ 23198 * @param sItemCode ìì´í ì½ë 23199 * @returns string ì¬ê³ íí© í ì¤í¸ 23200 */ 23201 getStockStatus: function(iProductNo, sItemCode) { 23202 var sStockText = ''; 23203 var oStock; 23204 23205 if (this.getCheckUseWms() === false) { 23206 return sStockText; 23207 } 23208 23209 var oResponse = CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.aApiResponseData; 23210 if (EC$.inArray(iProductNo.toString(), Object.keys(oResponse)) < 0) { 23211 return sStockText; 23212 } 23213 23214 if (typeof sItemCode === 'undefined') { 23215 oStock = oResponse[iProductNo]['product']; 23216 } else { 23217 if (EC$.inArray(sItemCode, Object.keys(oResponse[iProductNo]['option'])) < 0) { 23218 return sStockText; 23219 } 23220 oStock = oResponse[iProductNo]['option'][sItemCode]; 23221 } 23222 23223 sStockText = typeof oStock['text'] === 'string' ? ' [' +oStock['text'] + ']' : sStockText; 23224 return sStockText; 23225 }, 23226 23227 /** 23228 * ì¬ê³ íë¬ì¤ ì¬ì©ì¬ë¶ 23229 * @returns boolean 23230 */ 23231 getCheckUseWms: function() { 23232 return typeof CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS !== 'undefined' && CAFE24.SHOP_FRONT_NEW_PRODUCT_WMS_STOCK_STATUS.hasOwnProperty('aApiResponseData') === true; 23233 }, 23234 23235 /** 23236 * ì¬ê³ íí© í ì¤í¸ ì¤ì 23237 */ 23238 setStockStatus: function() { 23239 if (this.getCheckUseWms() === false) { 23240 return; 23241 } 23242 23243 if (has_option === 'T') { 23244 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_WMS.setHasOptionT(); 23245 } else { 23246 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_WMS.setHasOptionF(); 23247 } 23248 }, 23249 23250 /** 23251 * ìµì ìë ìí ì¬ê³ íí© í ì¤í¸ ì¤ì (ì¡°í© ì¼ì²´í) 23252 */ 23253 setHasOptionT: function() { 23254 EC$('select[option_select_element="ec-option-select-finder"], ul[option_select_element="ec-option-select-finder"]').each(function() { 23255 var oThis = this; 23256 var iProductNo = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oThis); 23257 23258 if (CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(oThis) === true) { 23259 EC$(oThis).find('li').each(function() { 23260 var sOptionText = EC$(this).attr('title') + CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_WMS.getStockStatus(iProductNo, EC$(this).attr('option_value')); 23261 EC$(this).attr('title', sOptionText); 23262 }); 23263 } else { 23264 EC$(oThis).find('option').each(function() { 23265 var sOptionText = EC$(this).text() + CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_WMS.getStockStatus(iProductNo, EC$(this).val()); 23266 EC$(this).text(sOptionText); 23267 }); 23268 } 23269 }); 23270 }, 23271 23272 /** 23273 * ìµì ìë ìí ì¬ê³ íí© í ì¤í¸ ì¤ì 23274 */ 23275 setHasOptionF: function() { 23276 var oStockText = EC$('.ec_product_stockText'); 23277 if (oStockText.length < 1) { 23278 return; 23279 } 23280 23281 var sStockText = CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_WMS.getStockStatus(iProductNo); 23282 if (sStockText === '') { 23283 return; 23284 } 23285 23286 var sProductStockText = oStockText.html() + sStockText; 23287 oStockText.html(sProductStockText); 23288 } 23289 23290}; 23291 23292 23293/** 23294 * ë´ìí ìµì ì ë í¸ ê³µíµíì¼ 23295 */ 23296CAFE24.SHOP_FRONT_NEW_OPTION_COMMON = { 23297 cons: null, 23298 23299 data: null, 23300 23301 bind: null, 23302 23303 validation: null, 23304 23305 /** 23306 * íì´ì§ ë¡ëê° ìë£ëìëì§ 23307 */ 23308 isLoad: false, 23309 23310 initObject: function() { 23311 this.cons = CAFE24.SHOP_FRONT_NEW_OPTION_CONS; 23312 this.data = CAFE24.SHOP_FRONT_NEW_OPTION_DATA; 23313 this.bind = CAFE24.SHOP_FRONT_NEW_OPTION_BIND; 23314 this.validation = CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION; 23315 }, 23316 23317 /** 23318 * íì´ì§ ë¡ë©ì ì´ê¸°í 23319 */ 23320 init: function() {
23321 var oThis = this; 23322 //ì¡°í©ë¶ë¦¬íì´ì§ë§ ìµì ì´ 1ê°ì¸ê²½ì° 23323 var bIsSolidOption = false; 23324 //첫 ë¡ëììë 첫ë²ì§¸ ìµì ë§ ê²ì 23325 EC$('select[option_select_element="ec-option-select-finder"][option_sort_no="1"], ul[option_select_element="ec-option-select-finder"][option_sort_no="1"]').each(function() { 23326 //ì°ëíì´ ìëê³ ë¶ë¦¬íì¼ëë§ ì¤í 23327 bIsSolidOption = false; 23328 if (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isSeparateOption(this) === true) { 23329 if (Olnk.isLinkageType(EC$(this).attr('option_type')) === false) { 23330 if (parseInt(EC$('[product_option_area="'+oThis.getOptionSelectGroup(this)+'"]').length) < 2) { 23331 bIsSolidOption = true; 23332 } 23333 23334 oThis.data.initializeSoldoutFlag(EC$(this)); 23335 23336 oThis.setOptionText(EC$(this), bIsSolidOption); 23337 } 23338 } 23339 }); 23340 }, 23341 23342 /** 23343 * ìµì ìíì¸ë° 모ë ìµì ì´ í매ìí¨+ì§ì´ìí¨ì¼ë ìì¸ì²ë¦¬ 23344 * @param sProductOptionID ìµì Selectbox ID 23345 */ 23346 isValidOptionDisplay: function(sProductOptionID) 23347 { 23348 var iOptionCount = 0; 23349 EC$('select[option_select_element="ec-option-select-finder"][id^="' + sProductOptionID + '"], ul[option_select_element="ec-option-select-finder"][ec-dev-id^="' + sProductOptionID + '"]').each(function() { 23350 23351 if (CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(this) === true) { 23352 iOptionCount += EC$(this).find('li').length; 23353 } else { 23354 iOptionCount += EC$(this).find('option').length - 2; 23355 } 23356 }); 23357 23358 return iOptionCount > 0; 23359 }, 23360 23361 /** 23362 * ê° ìµì ìëí´ ì ì²´íì ì¸ì§ íì¸í 23363 */ 23364 setOptionText: function(oOptionChoose, bIsSolidOption) { 23365 var bIsStyleButton = this.isOptionStyleButton(oOptionChoose); 23366 var oTargetOption = null; 23367 if (bIsStyleButton === true) {
23368 oTargetOption = EC$(oOptionChoose).find('li'); 23369 } else { 23370 oTargetOption = EC$(oOptionChoose).find('option').filter('[value!="*"][value!="**"]'); 23371 } 23372 23373 var bIsDisplaySolout = CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isSoldoutOptionDisplay(); 23374 var iProductNum = this.getOptionProductNum(oOptionChoose); 23375 var oThis = this; 23376 23377 EC$(oTargetOption).each(function() { 23378 var sValue = oThis.getOptionValue(oOptionChoose, EC$(this)); 23379 var isSoldout = CAFE24.SHOP_FRONT_NEW_OPTION_DATA.getSoldoutFlag(iProductNum, sValue); 23380 var bIsDisplay = CAFE24.SHOP_FRONT_NEW_OPTION_DATA.getDisplayFlag(iProductNum, sValue); 23381 var sOptionText = oThis.getOptionText(oOptionChoose, this); 23382 23383 if (bIsDisplay === false) { 23384 EC$(this).remove(); 23385 return; 23386 } 23387 23388 //ì¡°í©ë¶ë¦¬íì¸ë° ìµì ì´ 1ê°ì¸ê²½ì° ìµì ì¶ê°ê¸ì¡ì ì¸í ) 23389 if (bIsSolidOption === true) { 23390 var sItemCode = oThis.data.getItemCode(iProductNum, sValue); 23391 23392 var sAddText = CAFE24.SHOP_FRONT_NEW_OPTION_BIND.setAddText(iProductNum, sItemCode, oOptionChoose); 23393 if (sAddText !== '') {
23394 sOptionText = sOptionText + sAddText; 23395 } 23396 } 23397 23398 if (isSoldout === true) { 23399 //íì íììí¨ì¼ë ìë³´ì¬ì£¼ëë¡í¨(첫ë²ì§¸ìµì ì´ë¼ì.. ì´ì©ììì´ ì¬ê¸°ì ã ) 23400 //ëë²ì§¸ìµì ë¶í°ë ëì ìì±ì´ëê¹ bindììì²ë¦¬ 23401 if (bIsDisplaySolout === false) { 23402 EC$(this).remove(); 23403 return; 23404 } 23405 //í´ë¹ ìµì ê° ê°ì²´ê° ëì´ì¤ë©´ ë°ë¡ ì ì© 23406 if (bIsStyleButton === true && CAFE24.checkChannelUI() === false) { 23407 EC$(this).addClass(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_SOLDOUT_CLASS); 23408 } 23409 23410 //ë¶ë¦¬íì´ë©´ì ì ì²´ìíì´ íì ì´ë©´ 23411 if (bIsSolidOption !== true) { 23412 var sSoldoutText = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getSoldoutText(oOptionChoose, sValue); 23413 sOptionText = sOptionText + ' ' + sSoldoutText; 23414 23415 } 23416 } 23417 23418 oThis.setText(this, sOptionText); 23419 23420 }); 23421 }, 23422 23423 /** 23424 * íëª©ì´ ìë ê° ìµì ë³ë¡ ì ì²´íì ì¸ì§ í©ëí íì ì´ë©´ íì 문구 ë°í 23425 * @param oOptionChoose 23426 * @param sValue 23427 * @returns {String} 23428 */ 23429 getSoldoutText: function(oOptionChoose, sValue) { 23430 var sText = ''; 23431 23432 var iProductNum = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionProductNum(oOptionChoose); 23433 23434 if (CAFE24.SHOP_FRONT_NEW_OPTION_DATA.getSoldoutFlag(iProductNum, sValue) === true) { 23435 return '[' + CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_SOLDOUT.getSoldoutDiplayText(iProductNum) + ']'; 23436 } 23437 23438 return sText; 23439 }, 23440 23441 /** 23442 * ì ë í¸ë°ì¤í ìµì ì¸ì§ ë²í¼í ìµì ì´ì§ íì¸ 23443 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ object 23444 * @returns true => ë²í¼íìµì , false => 기존 selectí ìµì 23445 */ 23446 isOptionStyleButton: function(oOptionChoose) {
23447 var sOptionStyle = EC$(oOptionChoose).attr(this.cons.OPTION_STYLE); 23448 if (sOptionStyle === 'preview' || sOptionStyle === 'button' || sOptionStyle === 'radio') { 23449 return true; 23450 } 23451 23452 return false; 23453 }, 23454 23455 /** 23456 * div ì ë í¸ë°ì¤í ìµì ì¸ì§ íì¸ 23457 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ object 23458 * @returns true => ë²í¼íìµì , false => 기존 selectí ìµì 23459 */ 23460 isOptionStyleDivSelect: function(oOptionChoose) { 23461 return (EC$(oOptionChoose).hasClass(this.cons.OPTION_STYLE_DIV_SELECT_CLASS) === true) ? true : false; 23462 }, 23463 23464 /** 23465 * í´ë¹ ìµì ì ìµì ì¶ë ¥íì (ë¶ë¦¬í : S, ì¼ì²´í : C) 23466 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ object 23467 * @returns ìµì íì 23468 */ 23469 getOptionListingType: function(oOptionChoose) 23470 { 23471 oOptionChoose = this.setOptionBoxElement(oOptionChoose); 23472 return EC$(oOptionChoose).attr(this.cons.OPTION_LISTING_TYPE); 23473 }, 23474 23475 /** 23476 * í´ë¹ ìµì ì ìµì íì (ì¡°í©í : T, ì°ëí : E, ë 립í : F) 23477 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ object 23478 * @returns ìµì íì 23479 */ 23480 getOptionType: function(oOptionChoose) { 23481 oOptionChoose = this.setOptionBoxElement(oOptionChoose);
23482 return EC$(oOptionChoose).attr(this.cons.OPTION_TYPE); 23483 }, 23484 23485 /** 23486 * í´ë¹ ìµì ì ìµì ê·¸ë£¹ëª ì ê°ì ¸ì¨ë¤ 23487 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ object 23488 * @returns ìµì 그룹ì´ë¦ 23489 */ 23490 getOptionSelectGroup: function(oOptionChoose) { 23491 return EC$(oOptionChoose).attr(this.cons.GROUP_ATTR_NAME); 23492 }, 23493 23494 /** 23495 * sOptionStyleConfirm ì í´ë¹íë ìµì ì¸ì§ íì¸ 23496 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ object 23497 * @param sOptionStyleConfirm ìµì ì¤íì¼(CAFE24.SHOP_FRONT_NEW_OPTION_CONS : OPTION_STYLE_PREVIEW ëë OPTION_STYLE_BUTTON) 23498 * @return boolean íì¸ê²°ê³¼ 23499 */ 23500 isOptionStyle: function(oOptionChoose, sOptionStyleConfirm) { 23501 var sOptionStype = EC$(oOptionChoose).attr(this.cons.OPTION_STYLE); 23502 if (sOptionStype === sOptionStyleConfirm) { 23503 return true; 23504 } 23505 23506 return false; 23507 }, 23508 23509 /** 23510 * í´ë¹ ìµì ì ì íë Textë´ì©ì ê°ì ¸ì´ 23511 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 23512 * @returns ìµì ë´ì©Text 23513 */ 23514 getOptionSelectedText: function(oOptionChoose) { 23515 if (this.isOptionStyleButton(oOptionChoose) === true) {
23516 return EC$(oOptionChoose).find('li.' + this.cons.BUTTON_OPTION_SELECTED_CLASS).attr('title'); 23517 } else { 23518 return EC$(oOptionChoose).find('option:selected').text(); 23519 } 23520 }, 23521 23522 /** 23523 * í´ë¹ ìµì ì ì íë ê°ì ê°ì ¸ì´ 23524 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 23525 * @returns string ìµì ê° 23526 */ 23527 getOptionSelectedValue: function(oOptionChoose) { 23528 oOptionChoose = this.setOptionBoxElement(oOptionChoose); 23529 23530 if (this.isOptionStyleButton(oOptionChoose) === true) { 23531 var oTarget = EC$(oOptionChoose).find('li.' + this.cons.BUTTON_OPTION_SELECTED_CLASS); 23532 23533 //ë²í¼íìµì ì *, **ê°ì´ ì기ë문ì ì íëê² ìë¤ë©´ ê°ì ë¦¬í´ 23534 if (oTarget.length < 1) { 23535 return '*'; 23536 } else { 23537 return oTarget.attr('option_value'); 23538 } 23539 } else { 23540 var sValue = EC$(oOptionChoose).val(); 23541 return (CAFE24.UTIL.trim(sValue) === '') ? '*' : sValue; 23542 } 23543 }, 23544 23545 /** 23546 * í´ë¹ Elementì ê°ì ê°ì ¸ì´ 23547 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 23548 * @param oOptionChooseElement ê°ì ê°ì ¸ì¤ë ¤ë ìµì í목 23549 * @returns string ìµì ê° 23550 */ 23551 getOptionValue: function(oOptionChoose, oOptionChooseElement) { 23552 if (this.isOptionStyleButton(oOptionChoose) === true) {
23553 return EC$(oOptionChooseElement).attr('option_value'); 23554 } else { 23555 return EC$(oOptionChooseElement).val(); 23556 } 23557 }, 23558 23559 /** 23560 * í´ë¹ Elementì Textê°ì ê°ì ¸ì´ 23561 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 23562 * @param oOptionChooseElement ê°ì ê°ì ¸ì¤ë ¤ë ìµì í목 23563 * @returns string ìµì ê° 23564 */ 23565 getOptionText: function(oOptionChoose, oOptionChooseElement) { 23566 if (this.isOptionStyleButton(oOptionChoose) === true) { 23567 return EC$(oOptionChooseElement).attr('title'); 23568 } else { 23569 return EC$(oOptionChooseElement).text(); 23570 } 23571 }, 23572 23573 /** 23574 * ì íë ìµì ì Element를 ê°ì ¸ì¨ë¤ 23575 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 23576 * @returns ì íìµì ì DOM Element 23577 */ 23578 getOptionSelectedElement: function(oOptionChoose) { 23579 if (this.isOptionStyleButton(oOptionChoose) === true) { 23580 return EC$(oOptionChoose).find('li.' + this.cons.BUTTON_OPTION_SELECTED_CLASS); 23581 } else {
23582 return EC$(oOptionChoose).find('option:selected'); 23583 } 23584 }, 23585 23586 getOptionLastSelectedElement: function(sOptionGroup) 23587 { 23588 var oOptionGroup = this.getGroupOptionObject(sOptionGroup); 23589 var aTempResult = []; 23590 oOptionGroup.each(function(i) { 23591 if (CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedValue(oOptionGroup[i]) !== '*') { 23592 aTempResult.push(oOptionGroup[i]); 23593 } 23594 }); 23595 return EC$(aTempResult[aTempResult.length - 1]); 23596 }, 23597 23598 /** 23599 * í´ë¹ ìµì ì ìíë²í¸ë¥¼ ê°ì ¸ì´ 23600 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 23601 * @returns int ìíë²í¸ 23602 */ 23603 getOptionProductNum: function(oOptionChoose) { 23604 return parseInt(EC$(oOptionChoose).attr(this.cons.OPTION_PRODUCT_NUM)); 23605 }, 23606 23607 /** 23608 * í´ë¹ ìµì ì ìë²ì ê°ì ¸ì´ 23609 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 23610 * @returns int í´ë¹ ìµì ì ìì ë²í¸ 23611 */ 23612 getOptionSortNum: function(oOptionChoose) { 23613 oOptionChoose = this.setOptionBoxElement(oOptionChoose);
23614 return parseInt(EC$(oOptionChoose).attr(this.cons.OPTION_SORT_NUM)); 23615 }, 23616 23617 /** 23618 * ì´ë²¤í¸ ìµì ê¹ì§ìëí´ íì¬ê¹ì§ ì íë ìµì ê° ë°°ì´ 23619 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 23620 * @param bIsString ê°ì´ trueì´ë©´ ì íë ìµì ë¤ì 구ë¶ìë¡ joiní´ì ë°ìì¨ë¤ 23621 * @returns íì¬ê¹ì§ ì íë ìµì ê° ë°°ì´ 23622 */ 23623 getAllSelectedValue: function(oOptionChoose, bIsString) { 23624 var iOptionSortNum = this.getOptionSortNum(oOptionChoose); 23625 23626 //ì§ê¸ê¹ì§ ì íë ìµì ì ê° 23627 var aSelectedValue = []; 23628 EC$('[product_option_area="'+EC$(oOptionChoose).attr(this.cons.GROUP_ATTR_NAME)+'"]').each(function() { 23629 if (parseInt(EC$(this).attr('option_sort_no')) <= iOptionSortNum) { 23630 aSelectedValue.push(CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedValue(EC$(this))); 23631 } 23632 }); 23633 23634 return (bIsString === true) ? aSelectedValue.join(this.cons.OPTION_GLUE) : aSelectedValue; 23635 }, 23636 23637 /** 23638 * iSelectedOptionSortNum ì íììµì ì ì´ê¸°í(0ì¼ëë 모ëì´ê¸°í)ã 23639 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 23640 * @param iSelectedOptionSortNum íììµì ì ì´ê¸°íí ëì ìµì ìë² 23641 */ 23642 setInitializeDefault: function(oOptionChoose, iSelectedOptionSortNum) {
23643 var sOptionGroup = EC$(oOptionChoose).attr(this.cons.GROUP_ATTR_NAME); 23644 var iProductNum = this.getOptionProductNum(oOptionChoose); 23645 this.bind.setInitializeDefault(sOptionGroup, iSelectedOptionSortNum, iProductNum); 23646 }, 23647 23648 /** 23649 * ì¸ë¶ìì 기존ì¤í¬ë¦½í¸ê° í¸ì¶í ëë ë²í¼íìµì ê°ì²´ê° ìëë¼ ì¨ê²¨ì§ ì ë í¸ë°ì¤ìì í¸ì¶íë¯ë¡ ë²í¼íìµì ê°ì²´ë¥¼ ì°¾ìì ë¦¬í´ 23650 */ 23651 setOptionBoxElement: function(oOptionChoose) { 23652 if (typeof(EC$(oOptionChoose).attr('product_option_area_select')) !== 'undefined') { 23653 oOptionChoose = EC$('ul[product_option_area="'+EC$(oOptionChoose).attr('product_option_area_select')+'"][ec-dev-id="'+EC$(oOptionChoose).attr('id')+'"]'); 23654 } 23655 23656 return oOptionChoose; 23657 }, 23658 23659 /** 23660 * ì íí ìµì íììµì 모ë ì´ê¸°í(ì¶ê°êµ¬ì±ìíìì ì°ëíìµì ë문ì...) 23661 * @param oOptionChoose 23662 */ 23663 setAllClear: function(oOptionChoose) { 23664 oOptionChoose = this.setOptionBoxElement(oOptionChoose); 23665 23666 var iSortNo = parseInt(this.getOptionSortNum(oOptionChoose)); 23667 EC$(this.getGroupOptionObject(this.getOptionSelectGroup(oOptionChoose))).each(function() { 23668 if (iSortNo < parseInt(CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSortNum(EC$(this)))) { 23669 CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValue(EC$(this), '*'); 23670 } 23671 }); 23672 }, 23673 23674 /** 23675 * ë©í°ìµì (구ì¤í¨)ìì ì¬ì©í ë í´ë¹ ìµì ì idê°ì ë°ê¾¸ë기ë¥ì´ ìì´ì ì¶ê° 23676 * @param oOptionChooseOrg 23677 * @param sId 23678 */ 23679 setID: function(oOptionChooseOrg, sId) {
23680 if (EC$(oOptionChooseOrg).attr('option_style') === 'select') { 23681 oOptionChoose = oOptionChooseOrg; 23682 } else { 23683 oOptionChoose = EC$(oOptionChooseOrg).parent().find('ul[option_style="preview"], [option_style="button"], [option_style="radio"]'); 23684 } 23685 23686 if (this.isOptionStyleButton(oOptionChoose) === true) { 23687 EC$(oOptionChoose).attr('ec-dev-id', sId); 23688 EC$(oOptionChooseOrg).attr('id', sId); 23689 } else { 23690 EC$(oOptionChoose).attr('id', sId); 23691 } 23692 }, 23693 23694 /** 23695 * ë©í°ìµì (구ì¤í¨)ìì ì¬ì©í ë í´ë¹ ìµì ì idê°ì ë°ê¾¸ë기ë¥ì´ ìì´ì ì¶ê° 23696 * @param oOptionChooseOrg 23697 * @param sGroupID 23698 */ 23699 setGroupArea: function(oOptionChooseOrg, sGroupID) { 23700 var oOptionChoose = null; 23701 if (EC$(oOptionChooseOrg).attr('option_style') === 'select') { 23702 oOptionChoose = oOptionChooseOrg; 23703 } else { 23704 oOptionChoose = EC$(oOptionChooseOrg).parent().find('ul[option_style="preview"], [option_style="button"], [option_style="radio"]'); 23705 } 23706 23707 if (this.isOptionStyleButton(oOptionChoose) === true) {
23708 EC$(oOptionChoose).attr('product_option_area', sGroupID); 23709 EC$(oOptionChooseOrg).attr('product_option_area_select', sGroupID); 23710 } else { 23711 EC$(oOptionChoose).attr('product_option_area', sGroupID); 23712 } 23713 }, 23714 23715 /** 23716 * í´ë¹ ì íí ìµì ì textê°ì ì¸í 23717 */ 23718 setText: function(oSelectecOptionChoose, sText) { 23719 oOptionChoose = this.setOptionBoxElement(EC$(oSelectecOptionChoose).parent()); 23720 23721 if (this.isOptionStyleButton(oOptionChoose) === true) { 23722 var sValue = EC$(oSelectecOptionChoose).attr('option_value'); 23723 var oTarget = EC$(oOptionChoose).find('li[option_value="'+sValue+'"]'); 23724 EC$(oTarget).attr('title', sText); 23725 } 23726 23727 if (sYtshopping === 'T' || sIsYoutubeShops === 'T') { 23728 // ì¡°í©ë¶ë¦¬í, ìµì ì´ íê°, ì íë¸ìµì¤ì¸ê²½ì° 23729 EC$(oTarget).find('a>span').text(sText); 23730 } 23731 23732 if (this.isOptionStyleButton(EC$(oSelectecOptionChoose).parent()) !== true) { 23733 EC$(oSelectecOptionChoose).text(sText); 23734 } 23735 }, 23736 23737 /** 23738 * ì¶ê° ì´ë¯¸ì§ìì ì¶ì¶í í목 ì½ë를 ë°íì¼ë¡ ìµì ì í 23739 * @param sItemCode í목 ì½ë 23740 */ 23741 setValueByAddImage: function(sItemCode) { 23742 if (typeof(sItemCode) === 'undefined') { 23743 return; 23744 } 23745 23746 this.selectItemCode('product_option_' + iProductNo + '_0', sItemCode); 23747 }, 23748 23749 /** 23750 * ì¸ë¶ìì ìµì ì ì ííë걸 í¸ì¶í ê²½ì° í´ë¹ ìµì ì product_option_areaê°ê³¼ í목ì½ë를 ì ë¬ 23751 * @param sOptionArea ìµì elementì product_option_areaê° attributeê° 23752 * @param sItemCode í목ì½ë 23753 */ 23754 selectItemCode: function(sOptionArea, sItemCode) 23755 { 23756 var oSelect = EC$('[product_option_area="' + sOptionArea + '"]'); 23757 oSelect = this.setOptionBoxElement(oSelect); 23758 23759 var sOptionListType = this.getOptionListingType(oSelect); 23760 var sOptionType = this.getOptionType(oSelect); 23761 23762 //ì¡°í©ì¼ì²´íì´ë ë 립íì¸ê²½ì° 23763 if (sOptionListType === 'C' || sOptionType === 'F') { 23764 this.setValue(oSelect, sItemCode, true, true); 23765 } else { 23766 var iProductNo = this.getOptionProductNum(oSelect); 23767 var oItemData = this.getProductStockData(iProductNo); 23768 23769 if (oItemData === null) { 23770 return; 23771 } 23772 23773 if (oItemData.hasOwnProperty(sItemCode) === false) { 23774 return; 23775 } 23776 23777 var aOptionValue = oItemData[sItemCode].option_value_orginal; 23778 23779 oSelect.each(function (i) { 23780 CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValue(this, aOptionValue[i], true, true); 23781 }); 23782 } 23783 }, 23784 23785 /** 23786 * í´ë¹ Elementì ê°ì ê°ì ë¡ ì§ì 23787 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 23788 * @param sValue set íë ¤ë value 23789 * @param bIsInitialize falseì¸ ê²½ì°ìë í´ë¦ì´ë²¤í¸ë¥¼ ë°ìíì§ ìëë¡ íë¤ 23790 * @param bChange change ì´ë²¤í¸ ë°ì ì¬ë¶ 23791 */ 23792 setValue: function(oOptionChoose, sValue, bIsInitialize, bChange) { 23793 // ê° ì¸í ì ê° íì´ì§ìì EC$(this).val()ë¡ ê°ì ì§ì í ê²½ì° 23794 // 본ë ë²í¼í ìµì ì´ë©´ íê²ì ë²í¼í ìµì ì¼ë¡ ì´ì´ì¤ë¤ 23795 oOptionChoose = this.setOptionBoxElement(oOptionChoose); 23796 23797 if (this.isOptionStyleButton(oOptionChoose) === true) { 23798 //ìµì ì´ ì íëì´ìëìíë©´ ì´ê¸°íí ì í 23799 if (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isOptionSelected(oOptionChoose) === true) { 23800 23801 // div ì ë í¸ë°ì¤í ìµì ì ì ì¸íê³ ì¤í
23802 if (EC$(oOptionChoose).hasClass(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.OPTION_STYLE_DIV_SELECT_CLASS) === false) { 23803 EC$(oOptionChoose).find('li.' + this.cons.BUTTON_OPTION_SELECTED_CLASS).trigger('click'); 23804 } 23805 } 23806 23807 var oTarget = EC$(oOptionChoose).find('li[option_value="' + sValue + '"]'); 23808 23809 if (EC$(oTarget).length > 0) { 23810 EC$(oTarget).trigger('click'); 23811 } else { 23812 if (bIsInitialize !== false) { 23813 // ì íê°ì´ ìë¤ë©´ ì ë í¸ë°ì¤ ì´ê¸°í 23814 var iProductNum = this.getOptionProductNum(oOptionChoose); 23815 var iSelectedOptionSortNum = this.getOptionSortNum(oOptionChoose); 23816 var sOptionGroup = this.getOptionSelectGroup(oOptionChoose); 23817 var bIsRequired = CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isRequireOption(oOptionChoose); 23818 23819 if (CAFE24.SHOP_FRONT_NEW_OPTION_BIND.isEnabledOptionInit(oOptionChoose) === true) { 23820 CAFE24.SHOP_FRONT_NEW_OPTION_BIND.setInitializeDefault(sOptionGroup, iSelectedOptionSortNum, iProductNum, bIsRequired); 23821 } 23822 23823 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_DISPLAYITEM.eachCallback(oOptionChoose); 23824 CAFE24.SHOP_FRONT_NEW_OPTION_BIND.setRadioButtonSelect(oTarget, oOptionChoose, false); 23825 } 23826 23827 this.setTriggerSelectbox(oOptionChoose, sValue); 23828 } 23829 } else {
23830 EC$(oOptionChoose).val(sValue); 23831 23832 if (typeof(bChange) !== 'undefined') { 23833 EC$(oOptionChoose).trigger('change'); 23834 } 23835 } 23836 }, 23837 23838 /** 23839 * ë²í¼ ëë ì´ë¯¸ì§í ìµì ì¼ ê²½ì° ëì selectboxì ë기í ìí´ 23840 * @param oOptionChoose ì íí ìµì Object 23841 * @param sValue set íë ¤ë value 23842 * @param bIsTrigger ì ë í¸ë°ì¤ì change ì´ë²¤í¸ë¥¼ ë°ììí¤ì§ ììë(ex:모ë°ì¼ì ìµì ì í ë ì´ì´..) 23843 */ 23844 setTriggerSelectbox: function(oOptionChoose, sValue, bIsTrigger) 23845 { 23846 if (this.isOptionStyleButton(oOptionChoose) === true) { 23847 var oTargetSelect = EC$('select[product_option_area_select="' + EC$(oOptionChoose).attr('product_option_area') + '"][id="' + EC$(oOptionChoose).attr('ec-dev-id') + '"]'); 23848 var bChange = true; 23849 23850 var sText = ''; 23851 if (this.validation.isItemCode(sValue) === false) { 23852 sValue = '*'; 23853 sText = 'empty'; 23854 23855 bChange = false; 23856 } else {
23857 sValue = this.getOptionSelectedValue(oOptionChoose); 23858 sText = this.getOptionSelectedText(oOptionChoose); 23859 } 23860 23861 if (sValue !== '*') { 23862 EC$(oTargetSelect).find('option[value="' + sValue + '"]').remove('option'); 23863 23864 var sOptionsHtml = this.cons.OPTION_STYLE_SELECT_HTML.replace('[value]', sValue).replace('[text]', sText); 23865 23866 EC$(oTargetSelect).append(EC$(sOptionsHtml)); 23867 } 23868 23869 EC$(oTargetSelect).val(sValue); 23870 23871 if (bChange === true && bIsTrigger !== false) { 23872 EC$(oTargetSelect).trigger('change'); 23873 } 23874 } 23875 }, 23876 23877 /** 23878 * í´ë¹ ìíì ìµì ì¬ê³ ê´ë ¨ ë°ì´í°ë¥¼ ë¦¬í´ 23879 * @param iProductNum ìíë²í¸ 23880 * @returns option_stock_data ë°ì´í° 23881 */ 23882 getProductStockData: function(iProductNum) { 23883 return this.data.getProductStockData(iProductNum); 23884 }, 23885 23886 /** 23887 * ì íìíì ìì´í ì½ë를 ë°í(ì íì´ ìëì´ìë¤ë©´ false) 23888 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 23889 * @returns ìì´í ì½ë OR false 23890 */ 23891 getItemCode: function(oOptionChoose) { 23892 //ë¶ë¦¬ì¡°í©íì¼ê²½ì° 23893 if (this.validation.isSeparateOption(oOptionChoose) === true) { 23894 var sSelectedValue = this.getAllSelectedValue(oOptionCh
23894oose, true); 23895 var iProductNum = this.getOptionProductNum(oOptionChoose); 23896 return this.data.getItemCode(iProductNum, sSelectedValue); 23897 } 23898 23899 //ê·¸ì¸ì ê²½ì°ìë íì¬ ì íë ìµì ì valueê° ìì´í ì½ë 23900 var sItemCode = this.getOptionSelectedValue(oOptionChoose); 23901 23902 return (this.validation.isItemCode(sItemCode) === true) ? sItemCode : false; 23903 }, 23904 23905 /** 23906 * í´ë¹ 그룹ë´ì 모ë ìµì ìëí´ ì íë í목ì½ë를 ë°í 23907 * @param sOptionGroup ìµì 그룹 (@see : CAFE24.SHOP_FRONT_NEW_OPTION_GROUP_CONS) 23908 * @param bIsAbleSoldout íì í목ì ëí ìì´í ì½ëë í¬í¨ 23909 * @returns array ì íë ìì´í ì½ë ë°°ì´ 23910 */ 23911 getGroupItemCodes: function(sOptionGroup, bIsAbleSoldout) { 23912 var aItemCode = []; 23913 var sItemCode = ''; 23914 var oTarget = EC$('[' + this.cons.GROUP_ATTR_NAME + '^="' + sOptionGroup + '"]'); 23915 23916 //ë´ì¤í¨ì¸ ê²½ì°ìë ìµì ë°ì¤ ë ì´ì´ì ìì±ë inputìì ê°ì ¸ì¨ë¤ 23917 if (isNewProductSkin() === true) { 23918 EC$('.' + CAFE24.SHOP_FRONT_NEW_OPTION_GROUP_CONS.DETAIL_OPTION_BOX_PREFIX).each(function() { 23919 //ìµì ë°ì¤ì ìì±ë inputíê·¸ì´ë¯ë¡ val()ë¡ ê°ì ¸ì¨ë¤ 23920 sItemCode = EC$(this).val(); 23921 if (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isItemCode(sItemCode) === true) { 23922 aItemCode.push(sItemCode); 23923 } 23924 }); 23925 23926 //íì í목ì ëí ìì´í ì½ëë í¬í¨ìí¨ë¤ - íì¬ë ê´ì¬ìíë´ìê²½ì°ì ì°ì´ëê²ì¼ë¡ ë³´ì 23927 if (bIsAbleSoldout === true) { 23928 EC$('.' + CAFE24.SHOP_FRONT_NEW_OPTION_GROUP_CONS.DETAIL_OPTION_BOX_SOLDOUT_PREFIX).each(function() { 23929 aItemCode.push(EC$(this).val()); 23930 23931 if (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isItemCode(sItemCode) === true) { 23932 aItemCode.push(sItemCode); 23933 } 23934 }); 23935 } 23936 } else { 23937 //구ì¤í¨ì¸ ê²½ì°ìë í´ë¹íë ìµì ì ì íë ê°ë§ ê°ì ¸ì´ 23938 EC$(oTarget).each(function() { 23939 sItemCode = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getItemCode(this); 23940 23941 //ì´ë¯¸ ì ì¥ë ìì´í ì½ëì´ë©´ ì ì(ë¶ë¦¬íì¸ê²½ì° ê°ì ê°ì´ ì¬ë¬ê° ë¤ì´ì¬ììì) 23942 //ì¡°í©íì ë°ë¡ ì²ë¦¬í기보ë¤ë ê·¸ë¥ ëëê² ë ê°ë¨íë¤ë íê³ì 23943 if (EC$.inArray(sItemCode, aItemCode) > -1) { 23944 return true;//continue 23945 } 23946 23947 if (sItemCode !== false) { 23948 aItemCode.push(sItemCode); 23949 } 23950 }); 23951 } 23952 23953 return aItemCode; 23954 }, 23955 23956 /** 23957 * í´ë¹ í목ì íì ì¬ë¶ 23958 * @param iProductNum ìíë²í¸ 23959 * @param sItemCode í목ì½ë 23960 * @returns boolean íì ì¬ë¶ 23961 */ 23962 isSoldout: function(iProductNum, sItemCode) { 23963 var aStockData = this.getProductStockData(iProductNum); 23964 23965 if (typeof(aStockData[sItemCode]) === 'undefined') { 23966 return false; 23967 } 23968 23969 //ì¬ê³ 를 ì¬ì©íê³ ì¬ê³ ìëì´ 1ê°ë¯¸ë§ì´ë©´ íì 23970 if (aStockData[sItemCode].use_stock === true && parseInt(aStockData[sItemCode].stock_number) < 1) { 23971 return true; 23972 } 23973 23974 //í매ìí¨ ìíì´ë©´ íì 23975 if (aStockData[sItemCode].is_selling === 'F') { 23976 return true; 23977 } 23978 23979 return false; 23980 }, 23981 23982 /** 23983 * ì§ì´ì¬ë¶ íì¸ 23984 */ 23985 isDisplay: function(iProductNum, sItemCode) { 23986 var aStockData = this.getProductStockData(iProductNum); 23987 23988 if (typeof(aStockData[sItemCode]) === 'undefined') { 23989 return false; 23990 } 23991 23992 if (aStockData[sItemCode].is_display !== 'T') { 23993 return false; 23994 } 23995 23996 return true; 23997 }, 23998 23999 /** 24000 * sOptionGroupì í´ë¹íë ìµì ì ë í¸ë°ì¤ì Element를 ê°ì ¸ì¨ë¤ 24001 * @param sOptionGroup sOptionGroup ìµì 그룹 (@see : CAFE24.SHOP_FRONT_NEW_OPTION_GROUP_CONS) 24002 * @returns í´ë¹ ìµì ì ë í¸ë°ì¤ Elementì ì²´ 24003 */ 24004 getGroupOptionObject: function(sOptionGroup) { 24005 return EC$('[' + this.cons.GROUP_ATTR_NAME + '^="' + sOptionGroup + '"]'); 24006 }, 24007 24008 /** 24009 * í´ë¹ ìµì 그룹ìì íììµì ì ê°¯ì를 ê°ì ¸ì¨ë¤ 24010 * @param sOptionGroup sOptionGroup ìµì 그룹 (@see : CAFE24.SHOP_FRONT_NEW_OPTION_GROUP_CONS) 24011 * @returns íììµì ê°¯ì 24012 */ 24013 getRequiredOption: function(sOptionGroup) { 24014 return this.getGroupOptionObject(sOptionGroup).filter('[required="true"],[required="required"]'); 24015 }, 24016 24017 /**
24018 * í´ë¹ ìµì ì ì ì²´ Valueê°ì ê°ì ¸ì´(ìµì ê·¸ë£¹ì´ ìëë¼ ë¨ì¼ ìµì ì ë ì¸ ë°ì¤) 24019 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 24020 * @returns {Array} 24021 */ 24022 getAllOptionValues: function(oOptionChoose) { 24023 //ì¼ë° ì ë í¸ë°ì¤ì¼ë 24024 var aOptionValue = []; 24025 if (this.isOptionStyleButton(oOptionChoose) === false) { 24026 EC$(oOptionChoose).find('option[value!="*"][value!="**"]').each(function() { 24027 aOptionValue.push(EC$(this).val()); 24028 }); 24029 } else { 24030 //ë²í¼í ìµì ì¼ê²½ì° 24031 EC$(oOptionChoose).find('li[option_value!="*"][option_value!="**"]').each(function() { 24032 aOptionValue.push(EC$(this).attr('option_value')); 24033 }); 24034 } 24035 24036 return aOptionValue; 24037 }, 24038 24039 /** 24040 * í´ë¹ ìµì ì ì¤ì idê°ì ë¦¬í´ 24041 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 24042 * @returns {String} 24043 */ 24044 getOptionChooseID: function(oOptionChoose) { 24045 var sID = ''; 24046 if (this.isOptionStyleButton(oOptionChoose) === true) {
24047 sID = EC$(oOptionChoose).attr('ec-dev-id'); 24048 } else { 24049 sID = EC$(oOptionChoose).attr('id'); 24050 } 24051 24052 return sID; 24053 }, 24054 selectOptionItem: function (sItemCode) { 24055 try { 24056 if (typeof ProductSet !== 'undefined') { 24057 return ProductSet.selectOptionItem(sItemCode); 24058 } 24059 24060 if (typeof option_stock_data === 'undefined') { 24061 return; 24062 } 24063 24064 var aStockData = CAFE24.UTIL.parseJSON(option_stock_data); 24065 24066 if (typeof aStockData[sItemCode] === 'undefined') { 24067 return; 24068 } 24069 24070 EC_SHOP_FRONT_NEW_OPTION_COMMON.selectItemCode(CAFE24.SHOP_FRONT_NEW_OPTION_GROUP_CONS.DETAIL_OPTION_GROUP_ID + iProductNo + '_0', sItemCode); 24071 } catch (e) { 24072 console.error("option select error", e); 24073 } 24074 } 24075}; 24076 24077var EC_SHOP_FRONT_NEW_OPTION_COMMON = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_OPTION_COMMON'); 24078 24079EC$(function() { 24080 CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isLoad = true; 24081 24082 //íìë ìµì ì íë°ì¤ì ëí´ ëí´í¸ ìµì ë°ì´í° ì 리 24083 CAFE24.SHOP_FRONT_NEW_OPTION_DATA.setDefaultData(); 24084 24085 CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.init(); 24086}); 24087/** 24088 * ìµì ìëí Attribute ë° êµ¬ë¶ì 모ì 24089 */ 24090CAFE24.SHOP_FRONT_NEW_OPTION_CONS = { 24091 /** 24092 * ìµì 그룹 Attribute Key(ê° ìí ë° ììë³ êµ¬ë¶ì ìí ê°) 24093 */ 24094 GROUP_ATTR_NAME: 'product_option_area', 24095 24096 /** 24097 * ìµì ì¤íì¼ Attribute Key 24098 */ 24099 OPTION_STYLE: 'option_style', 24100 24101 /** 24102 * ìíë²í¸ Attribute Key 24103 */ 24104 OPTION_PRODUCT_NUM: 'option_product_no', 24105 24106 /** 24107 * ê° ìµì ì ìµì ìì Attribute Key 24108 */ 24109 OPTION_SORT_NUM: 'option_sort_no', 24110 24111 /** 24112 * ìµì íì Attribute Key 24113 */ 24114 OPTION_TYPE: 'option_type', 24115 24116 /** 24117 * ìµì ì¶ë ¥ íì Attribute Key 24118 */ 24119 OPTION_LISTING_TYPE: 'item_listing_type', 24120 24121 /** 24122 * ìµì ê° êµ¬ë¶ì 24123 */ 24124 OPTION_GLUE: '#$%', 24125 24126 /** 24127 * 미리보기í ìµì 24128 */ 24129 OPTION_STYLE_PREVIEW: 'preview', 24130 24131 /** 24132 * ë²í¼í ìµì 24133 */ 24134 OPTION_STYLE_BUTTON: 'button', 24135 24136 /** 24137 * 기존 ì ë í¸ë°ì¤í ìµì 24138 */ 24139 OPTION_STYLE_SELECT: 'select', 24140 24141 /** 24142 * ë¼ëì¤ë°ì¤í ìµì 24143 */ 24144 OPTION_STYLE_RADIO: 'radio', 24145 24146 /** 24147 * ê° ìµì ë§ë¤ ì°ê²°ë ì´ë¯¸ì§ Attribute 24148 */ 24149 OPTION_LINK_IMAGE: 'link_image', 24150 24151 /** 24152 * ì ë í¸ë°ì¤í ìµì ì Template 24153 */ 24154 OPTION_STYLE_SELECT_HTML: '<option value="[value]">[text]</option>', 24155 24156 /** 24157 * 기본 íì 문구 24158 */ 24159 OPTION_SOLDOUT_DEFAULT_TEXT: __("íì "), 24160 24161 /** 24162 * ë²í¼í ìµì ì íì íì class 24163 */ 24164 BUTTON_OPTION_SOLDOUT_CLASS: 'ec-product-soldout', 24165 24166 /** 24167 * ë²í¼í ìµì ì ì íë¶ê° class 24168 */ 24169 BUTTON_OPTION_DISABLE_CLASS: 'ec-product-disabled', 24170 24171 /** 24172 * ë²í¼í ìµì ì ì íë ìµì ê°ì 구ë¶í기ìí ìì 24173 */ 24174 BUTTON_OPTION_SELECTED_CLASS: 'ec-product-selected', 24175 24176 /** 24177 * div ì ë í¸ë°ì¤í ìµì class 24178 */ 24179 OPTION_STYLE_DIV_SELECT_CLASS: 'ec-option-div-select', 24180 24181 /** 24182 * ì¸í¸ìí ìµì ìì class 24183 */ 24184 OPTION_SET_PRODUCT_NONE_CLASS: 'ec-setproduct-option-none' 24185}; 24186 24187var EC_SHOP_FRONT_NEW_OPTION_CONS = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_OPTION_CONS'); 24188 24189/** 24190 * ê° ìµì 그룹ì ëí Key ì ì 24191 */ 24192CAFE24.SHOP_FRONT_NEW_OPTION_GROUP_CONS = { 24193 /** 24194 * ìíëí ì¼ì ë©ì¸ ìµì 그룹 24195 */ 24196 DETAIL_OPTION_GROUP_ID: 'product_option_', 24197 24198 /** 24199 * ë´ì¤í¨ ìíìì¸ì ìµì ì íì ì©ì´ì§ë ìµì ë°ì¤ë ì´ì´ classëª 24200 */ 24201 DETAIL_OPTION_BOX_PREFIX: 'option_box_id', 24202 24203 /** 24204 * ë´ì¤í¨ ìíìì¸ì ìµì ì íì ì©ì´ì§ë ìµì ë°ì¤ë ì´ì´ classëª (íì ì¼ê²½ì°ì prefix) 24205 * Prefixì¡´ë ë§ì 24206 */ 24207 DETAIL_OPTION_BOX_SOLDOUT_PREFIX: 'soldout_option_box_id' 24208}; 24209 24210var EC_SHOP_FRONT_NEW_OPTION_GROUP_CONS = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_OPTION_GROUP_CONS'); 24211 24212CAFE24.SHOP_FRONT_NEW_OPTION_BIND = { 24213 24214 /** 24215 * ì íí ìµì 그룹(product_option_ìíë²í¸ : ìíìì¸ì¼ë°ìí) 24216 */ 24217 sOptionGroup: null, 24218 24219 /** 24220 * ìµì ì´ ëª¨ë ì íëììë í´ë¹íë item_code를 Set 24221 */ 24222 sItemCode: false, 24223 24224 /** 24225 * ì íí ìµì ì ìíë²í¸ 24226 */ 24227 iProductNum: 0, 24228 24229 /** 24230 * ì íí ìµì ì ìë² 24231 */ 24232 iOptionIndex: null, 24233 24234 /** 24235 * ì íí ìµì ì ìµì ì¤íì¼(select : ì ë í¸ë°ì¤, preview : 미리보기, button : ë²í¼í) 24236 */ 24237 sOptionStyle: null, 24238 24239 /** 24240 * í´ë¹ ìí ìµì ê°¯ì 24241 */ 24242 iOptionCount: 0, 24243 24244 /** 24245 * íì ìµì íìì¬ë¶ 24246 */ 24247 bIsDisplaySolout: true, 24248 24249 /** 24250 * ì íí ìµì ì ê°ì²´(ì ë í¸ë°ì¤ ëë ë²í¼í ìµì ë°ì¤(ulíê·¸)) 24251 */ 24252 oOptionObject: null, 24253 24254 /** 24255 * ì íí ìµì ì ë¤ììµì Element 24256 */ 24257 oNextOptionTarget: null, 24258 24259 /** 24260 * ì íë ìµì ê° 24261 */ 24262 aOptionValue: [], 24263 24264 /** 24265 * ìµì í ì¤í¸ì ì¶ê°ë í목ìëí ì ì 24266 */ 24267 aExtraOptionText: [ 24268 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_PRICE, 24269 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_SOLDOUT, 24270 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_IMAGE, 24271 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_DISPLAYITEM, 24272 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_ITEMSELECTION, 24273 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_DIRECT_BASKET, 24274 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_FUNDING, 24275 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_WMS 24276 ], 24277 24278 /** 24279 * CAFE24.SHOP_FRONT_NEW_OPTION_CONS ê°ì²´ Alias 24280 */ 24281 cons: null, 24282 24283 /** 24284 * CAFE24.SHOP_FRONT_NEW_OPTION_COMMON ê°ì²´ Alias 24285 */ 24286 common: null, 24287 24288 /** 24289 * CAFE24.SHOP_FRONT_NEW_OPTION_DATA ê°ì²´ Alias 24290 */ 24291 data: null, 24292 24293 /** 24294 * CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION ê°ì²´ Alias 24295 */ 24296 validation: null, 24297
24298 isEnabledOptionInit: function(oOptionChoose) 24299 { 24300 var iProductNum = EC$(oOptionChoose).attr('option_product_no'); 24301 //ì°ëíì´ë©´ì ìµì ì¶ê°ë²í¼ì¤ì ì´ë©´ ìì°¨ë¡ë©ì ì¸ 24302 if (Olnk.isLinkageType(this.common.getOptionType(oOptionChoose)) === true && (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isUseOlnkButton() === true || CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isBindUseOlnkButton(iProductNum) === true)) { 24303 return false; 24304 } 24305 24306 if (this.common.getOptionType(oOptionChoose) === 'F') { 24307 return false; 24308 } 24309 24310 return true; 24311 }, 24312 24313 /** 24314 * ê° ìµì ê°ì ëí ì´ë²¤í¸ ì²ë¦¬ 24315 * @param oThis ìµì ì ë í¸ë°ì¤ ëë ë²í¼ë°ì¤ 24316 * @param oSelectedElement ì íí ìµì ê° 24317 * @param bIsUnset true ì´ëª deselectedëìíë¡ ì´ê¸°í(setValue를 íµí´ì íì´ììëë§ ê°ì´ ìì) 24318 */ 24319 initialize: function(oThis, oSelectedElement, bIsUnset) 24320 { 24321 this.sItemCode = false; 24322 this.oOptionObject = oThis; 24323 24324 // ì¤ì ìµì ì²ë¦¬ì ì ì²ë¦¬í´ì¼í ë´ì©ì 모ì ëëë¤ 24325 this.prefetch(oThis); 24326 24327 if (oSelectedElement !== null) { 24328 if (EC$(oSelectedElement).hasClass(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_DISABLE_CLASS) === true) { 24329 this.setRadioButtonSelect(oSelectedElement, oThis, false); 24330 return; 24331 } 24332 24333 //ì í ìµì ìëí disableì²ë¦¬ë íì±í ì²ë¦¬ 24334 this.setSelectButton(oSelectedElement, bIsUnset); 24335 24336 //íìì ë³´ Set 24337 this.setSelectedOptionConf(); 24338 24339 //ì°ëíì´ë©´ì ìµì ì¶ê°ë²í¼ì¤ì ì´ë©´ ìì°¨ë¡ë©ì ì¸.. 24340 if (this.isEnabledOptionInit(this.oOptionObject) === true) { 24341 var bIsDelete = true; 24342 var bIsRequired = CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isRequireOption(this.oOptionObject); 24343 //í´ë¹ ìµì ì´ ì°ëíì´ë©´ì ì íí ìµì ì´ë©´ íì ìµì ì ê°ë§ ì´ê¸°í 24344 if (Olnk.isLinkageType(this.common.getOptionType(this.oOptionObject)) === true && bIsRequired=== false) { 24345 bIsDelete = false; 24346 } 24347 24348 //ì íí ìµì ì´ ìµì ì´ ìëê²½ì° íììµì ì´ê¸°í 24349 //ì íí ìµì ì´ ìµì ì´ ìëë©´ ìë ë¡ì§ì íì§ ìê³ eachCallbackì ì¤íí¨ 24350 this.setInitializeDefault(this.sOptionGroup, this.iOptionIndex, this.iProductNum, bIsRequired); 24351 24352 if (bIsDelete === true && EC$(oSelectedElement).hasClass(this.cons.BUTTON_OPTION_DISABLE_CLASS) === false && this.validation.isOptionSelected(this.oOptionObject) === true) { 24353 //ì íí ìµì ì ë¤ììµì ê°ì Parse 24354 //ì°ëíì¼ê²½ì°ìë ì ì¸ / ì¡°í©ë¶ë¦¬íë§ ì²ë¦¬ëëë¡ í¨ 24355 if (Olnk.isLinkageType(this.sOptionType) === false && this.validation.isSeparateOption(this.oOptionObject) === true) { 24356 this.data.initializeOptionValue(this.oOptionObject); 24357 } 24358 24359 //ê° ìµì ì ì´ê¸°íë° ìµì 리ì¤í¸ HTMLìì± 24360 //ì¡°í©ë¶ë¦¬íì¼ëë§ ì²ë¦¬ 24361 if (this.validation.isSeparateOption(this.oOptionObject) === true) { 24362 this.setOptionHTML(); 24363 } 24364 } 24365 } 24366 24367 //í´ë¹ ê°ì´ trueë falseì´ë©´ setValue를 íµí´ì ë¤ì´ì¨ê²ì´ê¸°ë문ì ë¤ì ì¤íí íì ìì 24368 //if (typeof(bIsUnset) === 'undefined') { 24369 //ì ë í¸ë°ì¤ ë기í 24370 this.common.setTriggerSelectbox(this.oOptionObject, this.common.getOptionSelectedValue(this.oOptionObject)); 24371 //} 24372 24373 //ìµì ì´ ëª¨ë ì íëìë¤ë©´ ìì´í ì½ë를 ì¸í 24374 this.setItemCode(); 24375 } 24376 24377 //ìµì ì íì´ ëëë©´ ê° ìµì ë§ë¤ ì²ë¦¬í íë¡ì¸ì¤(ê° ì¶ê°ê¸°ë¥ìì) 24378 this.eachCallback(oThis); 24379 24380 //모ë ìµì ì´ ì íëìë¤ë©´ 24381 if (this.sItemCode !== false) { 24382 24383 var sID = this.common.getOptionChooseID(this.oOptionObject); 24384 24385 //ìì¸ ë©ì¸ ìíììë§ ì¤íëëë¡ ìì¸ì²ë¦¬ 24386 if (typeof(setPrice) === 'function' && /^product_option_id+/.test(sID) === true) { 24387 setPrice(false, true, sID); 24388 } 24389 24390 //모ë ìµì ì íì´ ëëë©´ ì²ë¦¬í íë¡ì¸ì¤(ê° ì¶ê°ê¸°ë¥ìì) 24391 this.completeCallback(oThis); 24392 } 24393 }, 24394 24395 /** 24396 * ì¤ì ìµì ì ì íì¬ë¶ë¥¼ í´ì í기ì ì¤ííë ì¡ì 24397 */ 24398 prefetch: function(oThis) 24399 { 24400 EC$(this.aExtraOptionText).each(function() { 24401 if (typeof(this.prefetch) === 'function') { 24402 this.prefetch(oThis); 24403 } 24404 }); 24405 }, 24406 24407 /** 24408 * ê° ìµì ì íìë§ë¤ ì²ë¦¬í Callback(Extraì ìë ì¶ê°ê¸°ë¥) 24409 */ 24410 eachCallback: function(oThis) 24411 { 24412 EC$(this.aExtraOptionText).each(function() { 24413 if (typeof(this.eachCallback) === 'function') { 24414 this.eachCallback(oThis); 24415 } 24416 }); 24417 }, 24418 24419 /** 24420 * ìµì ì íì íê³ íëª©ì´ ì í´ì¡ìë Callback(Extraì ìë ì¶ê°ê¸°ë¥) 24421 */ 24422 completeCallback: function(oThis) 24423 { 24424 EC$(this.aExtraOptionText).each(function() { 24425 if (typeof(this.completeCallback) === 'function') { 24426 this.completeCallback(oThis); 24427 } 24428 }); 24429 }, 24430 24431 /** 24432 * iSelectedOptionSortNumë³´ë¤ íì ìµì ë¤ì ì´ê¸°ìíë¡ ë³ê²½í¨ 24433 * @param sOptionGroup ìµì ì íë°ì¤ 그룹 24434 * @param iSelectedOptionSortNum íììµì ì ì´ê¸°íí ëì ìµì ìë² 24435 * @param iProductNum ìíë²í¸ 24436 * @param bIsSetValue COMMON.setValueìì í¸ì¶ììë ë¤ì setValue를 íì§ ìëë¤ 24437 */ 24438 setInitializeDefault: function(sOptionGroup, iSelectedOptionSortNum, iProductNum, bSelectedOptionRequired) { 24439 var iSortNum = 0; 24440 var sHtml = ''; 24441 var bIsDelete = null; 24442 24443 EC$('['+this.cons.GROUP_ATTR_NAME+'="'+sOptionGroup+'"]').each(function() { 24444 24445 iSortNum = parseInt(CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSortNum(this)); 24446 24447 //ì íí ìµì ì íììµì ë¤ì ì´ê¸°í 24448 if (iSelectedOptionSortNum < iSortNum) { 24449 24450 var bIsRequired = CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isRequireOption(this); 24451 24452 //ì ííë ìµì ì´ ì°ëíì´ë©´ì ì íí ìµì ì´ë©´ ê°ë§ ì´ê¸°í 24453 //bIsDelete = (bIsDelete = null && isOlnk === true && bSelectedOptionRequired === true && bIsRequired === false) ? false : true; 24454 if (bIsDelete === null) { 24455 //ì ííë ìµì ì´ ì íí ìµì ì´ë©´ ì²ë¦¬íì§ ìì 24456 if (bSelectedOptionRequired === false) { 24457 bIsDelete = false;
24458 } else if (bSelectedOptionRequired === true) {//ì ííë ìµì ì´ íììµì ì´ë©´ ì§í 24459 //ì ííë ìµì ì´ íìì´ë©´ì íì¬ ìµì ì´ íìì´ë©´ ì´ê¸°í 24460 if (bIsRequired === true) { 24461 bIsDelete = true; 24462 } else { 24463 //ì ííë ìµì ì´ íìì´ë©´ì íì¬ìµì ì´ ì ííìµì ì´ë©´ ë¤ììµì ìì ì²´í¬ 24464 bIsDelete = null; 24465 } 24466 } 24467 } 24468 24469 if (bIsDelete === true) { 24470 sHtml = CAFE24.SHOP_FRONT_NEW_OPTION_DATA.getDefaultOptionHTML(iProductNum, iSortNum); 24471 EC$(this).html(''); 24472 EC$(this).append(sHtml); 24473 } 24474 24475 //ì ë í¸ë°ì¤ì´ë©´ì íììµì ì´ë¼ë©´ 기본ê°ì ì ì¸íê³ optionìì 24476 if (CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyle(this, CAFE24.SHOP_FRONT_NEW_OPTION_CONS.OPTION_STYLE_SELECT) === true) { 24477 24478 if (bIsDelete === true && bIsRequired === true) { 24479 EC$(this).find('option').prop('disabled', false); 24480 EC$(this).find('option[value!="*"][value!="**"]').remove('option'); 24481 } else { 24482 CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValue(this, '*', false); 24483 } 24484 } 24485 24486 if (CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(this) === true) { 24487 if (bIsDelete === true && bIsRequired === true) { 24488 EC$(this).find('li').removeClass(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_DISABLE_CLASS).addClass(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_DISABLE_CLASS); 24489 var oDropDown = EC$(this).closest('.mDropDown'); 24490 oDropDown.addClass("ec-option-disabled").find('.eDropDown > span').html(__('ìµì ì í')); 24491 oDropDown.find('button').attr('disabled', 'disabled'); 24492 24493 } else { 24494 // íì ìµì ì¤ ì í(div)í 24495 if (EC$(this).hasClass(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.OPTION_STYLE_DIV_SELECT_CLASS) === true) { 24496 var oDropDown = EC$(this).closest('.mDropDown'); 24497 oDropDown.find('.eDropDown > span').html(__('ìµì ì í')); 24498 EC$(this).removeClass(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_SELECTED_CLASS); 24499 } 24500 } 24501 24502 CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValue(this, '*', false); 24503 //ìµì í ì¤í¸ ì´ê¸°í 24504 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_DISPLAYITEM.eachCallback(this); 24505 } 24506 24507 //첫ë²ì§¸ íì ìµì ì ê·¸ëë¡ ëê³ ëë²ì§¸ íììµì ë¶í° remove 24508 if (bIsDelete !== null && bIsRequired === true) { 24509 bIsDelete = true; 24510 } 24511 } 24512 }); 24513 }, 24514 24515 /** 24516 * ìµì ì´ ëª¨ë ì íëìë¤ë©´ ìì´í ì½ë Set 24517 */ 24518 setItemCode: function() { 24519 //ì°ëí ìí : ìì¸ì ì¸ê²½ì°ê° ë§ìì ì´ì©ìê° ìì... 24520 if (Olnk.isLinkageType(this.common.getOptionType(this.oOptionObject)) === true) { 24521 //ì íí ê°ì´ ìµì ì´ ìëë¼ë©´ false 24522 if (this.validation.isItemCode(this.common.getOptionSelectedValue(this.oOptionObject)) === false) { 24523 return false; 24524 } 24525 24526 //ì°ëí ìµì 24527 var aSelectedValues = this.common.getAllSelectedValue(this.oOptionObject); 24528 24529 //íììµì ê°¯ì 24530 var iRequiredOption = this.common.getRequiredOption(this.sOptionGroup).length; 24531 24532 //ì íí ìµì ê°¯ìë³´ë¤ íììµì ì´ ë§ë¤ë©´ false 24533 if (iRequiredOption > EC$(aSelectedValues).length) { 24534 return false; 24535 } 24536 //ì¤ì íììµì ì´ ì²´í¬ëì´ìëì§ 24537 var aOptionValues = []; 24538 var bIsExists = false;
24539 var iRequireSelectedOption = 0; 24540 24541 //íìíëª©ë§ ê²ì¬ 24542 this.common.getRequiredOption(this.sOptionGroup).each(function() { 24543 bIsExists = false; 24544 aOptionValues = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getAllOptionValues(this); 24545 24546 //íì í목 ìµì ì ê°ì ì¤ì ì ííìµì ê°ëë° ì¡´ì¬íëì§ ì¼ì¼í íì¸í´ì¼íë¤ 24547 EC$(aSelectedValues).each(function(i, iNo) { 24548 //ì íë ìµì ì¤ì ì¡´ì¬íë¤ë©´ íìê°ì´ ì íëê²ì¼ë¡ íì¸ 24549 if (EC$.inArray(iNo, aOptionValues) > -1) { 24550 bIsExists = true; 24551 return; 24552 } 24553 }); 24554 24555 if (bIsExists === true) { 24556 iRequireSelectedOption++; 24557 } 24558 }); 24559 24560 //ì ì²´ íìê° ê°¯ìê° ì íë íììµì ë³´ë¤ ë§ë¤ë©´ false 24561 if (iRequiredOption > iRequireSelectedOption) { 24562 return false; 24563 } 24564 24565 this.sItemCode = aSelectedValues; 24566 } else if (this.validation.isSeparateOption(this.oOptionObject) === true) { 24567 //ì¡°í©ë¶ë¦¬íì ìµì ê°ì¼ë¡ íì±í´ì ê°ì ¸ìì¼í¨ 24568 if (parseInt(this.iOptionCount) > parseInt(this.aOptionValue.length)) { 24569 return false; 24570 } 24571 24572 this.sItemCode = this.data.getItemCode(this.iProductNum, this.aOptionValue.join(this.cons.OPTION_GLUE)); 24573 } else { 24574 //ì¡°í©ë¶ë¦¬í ì´ì¸ìë ì íí ìµì ì valueê° ìì´í ì½ë 24575 this.sItemCode = this.common.getOptionSelectedValue(this.oOptionObject); 24576 } 24577 24578 }, 24579 24580 /** 24581 * ê° ìµì ì ì´ê¸°íë° ìµì 리ì¤í¸ HTMLìì± 24582 */ 24583 setOptionHTML: function() { 24584 //íììµì ì´ ìë¤ë©´(ë§ì§ë§ ìµì ì ì ííê²½ì°) íììµì ì´ ììì¼ë¡ ë°ë¡ ë§ë¤ì§ ììë ëë¤ 24585 if (parseInt(this.iOptionCount) === parseInt(this.aOptionValue.length)) { 24586 return; 24587 } 24588 24589 if (this.oNextOptionTarget === null) { 24590 return; 24591 } 24592 24593 var sSelectedOption = this.aOptionValue.join(this.cons.OPTION_GLUE); 24594 24595 var aOptions = this.data.getOptionValueArray(this.iProductNum, sSelectedOption); 24596 24597 //ì ë í¸ë°ì¤ì¼ë ë¤ììµì ë°ì¤ ì´ê¸°í 24598 if (this.common.isOptionStyleButton(this.oNextOptionTarget) === false) { 24599 this.setOptionHtmlForSelect(aOptions, sSelectedOption); 24600 } else { 24601 this.setOptionHtmlForButton(aOptions, sSelectedOption); 24602 } 24603 }, 24604 24605 /** 24606 * ë²í¼í ìµì ì¼ ê²½ì° í´ë¹ ë²í¼ HTMLì´ê¸°í ë° í´ë¹ ìµì ê° Set 24607 * @param aOptions ìµì ê° ë¦¬ì¤í¸ 24608 * @param sSelectedOption íì¬ê¹ì§ ì íë ìµì ì¡°í© 24609 */ 24610 setOptionHtmlForButton: function(aOptions, sSelectedOption) { 24611 //ì ííê°ì´ *sk ** ì´ë©´ ë¤ììµì ì disableì²ë¦¬ 24612 if (this.validation.isItemCode(this.common.getOptionSelectedValue(this.oOptionObject)) === false) { 24613 this.oNextOptionTarget.find('li').removeClass(this.cons.BUTTON_OPTION_DISABLE_CLASS).addClass(this.cons.BUTTON_OPTION_DISABLE_CLASS); 24614 } else { 24615 this.oNextOptionTarget.find('li').removeClass(this.cons.BUTTON_OPTION_DISABLE_CLASS); 24616 } 24617 24618 //ì°ëíì¼ê²½ì°ìë disable / selectë§ ì ê±° 24619 if (Olnk.isLinkageType(this.sOptionType) === true) { 24620 //íììµì ë¤ë§ selectedí´ëì¤ ìì 24621 if (parseInt(EC$(this.oOptionObject).attr('option_sort_no')) < parseInt(EC$(this.oNextOptionTarget).attr('option_sort_no'))) { 24622 EC$(this.oNextOptionTarget).find('li').removeClass(this.cons.BUTTON_OPTION_SELECTED_CLASS); 24623 CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValue(this.oNextOptionTarget, '*', false); 24624 24625 EC$(this.oNextOptionTarget).closest('.mDropDown.ec-option-disabled').removeClass('ec-option-disabled').find('button').removeAttr('disabled'); 24626 } 24627 return; 24628 } 24629 24630 this.oNextOptionTarget.find('li').remove('li'); 24631 24632 var iNextOptionSortNum = this.common.getOptionSortNum(this.oNextOptionTarget); 24633 24634 var bIsLastOption = false;
24635 //ìì±ë ìµì ì´ ë§ì§ë§ ìµì ì´ë©´ ìµì Textì ì¶ê° í목(ìµì ê° íì íìë±)ì ì²ë¦¬ 24636 if (parseInt(iNextOptionSortNum) === this.iOptionCount) { 24637 bIsLastOption = true; 24638 } 24639 24640 var oObject = this; 24641 var sOptionsHtml = ''; 24642 24643 //ìµì ì ë í¸ë°ì¤ Textì ì¶ê°ë 문구 ì²ë¦¬ 24644 var sAddText = ''; 24645 var sItemCode = false; 24646 //íì ìµì ì¸ë° íì ìµì íììí¨ì¤ì ì´ë©´ ìì 24647 var bIsSoldout = false; 24648 var bIsDisplay = true; 24649 24650 EC$(aOptions).each(function(i, oOption) { 24651 sAddText = ''; 24652 bIsSoldout = false; 24653 bIsDisplay = true; 24654 //íì´ì§ ë¡ë©ì ì ì¥ë í´ë¹ ìµì ì HTMLì ê°ì ¸ì¨ë¤ 24655 sOptionsHtml = oObject.data.getButonOptionHtml(oObject.iProductNum, iNextOptionSortNum, oOption.value); 24656 24657 sOptionsHtml = EC$(sOptionsHtml).clone().removeClass(oObject.cons.BUTTON_OPTION_DISABLE_CLASS); 24658 //ë§ì§ë§ ìµì ì¼ ê²½ì°ìë 24659 if (bIsLastOption === true) { 24660 sItemCode = oObject.data.getItemCode(oObject.iProductNum, sSelectedOption + oObject.cons.OPTION_GLUE + oOption.value); 24661 24662 //ì§ì´ìí¨ì´ë©´ í¨ì¤ 24663 if (oObject.common.isDisplay(oObject.iProductNum, sItemCode) === false) { 24664 bIsDisplay = false; 24665 } 24666 24667 sAddText = oObject.setAddText(oObject.iProductNum, sItemCode); 24668 24669 //íì ìíì¸ê²½ì° íì classì¶ê° 24670 if (oObject.common.isSoldout(oObject.iProductNum, sItemCode) === true) { 24671 EC$(sOptionsHtml).removeClass(oObject.cons.BUTTON_OPTION_SOLDOUT_CLASS).addClass(oObject.cons.BUTTON_OPTION_SOLDOUT_CLASS); 24672 bIsSoldout = true; 24673 } 24674 } else { 24675 var sOptionText = sSelectedOption + oObject.cons.OPTION_GLUE + oOption.value; 24676 sAddText = oObject.common.getSoldoutText(oObject.oNextOptionTarget, sOptionText); 24677 24678 if (sAddText !== '') { 24679 EC$(sOptionsHtml).addClass(oObject.cons.BUTTON_OPTION_SOLDOUT_CLASS); 24680 bIsSoldout = true; 24681 } 24682 24683 if (oObject.data.getDisplayFlag(oObject.iProductNum, sOptionText) === false) { 24684 bIsDisplay = false; 24685 } 24686 } 24687 24688 if ((oObject.bIsDisplaySolout === false && bIsSoldout === true) || bIsDisplay === false) { 24689 EC$(this).remove(); 24690 return; 24691 } 24692 24693 if (CAFE24.checkChannelUI() === true) { 24694 oObject.oNextOptionTarget.append(EC$(sOptionsHtml).find('span').html(function(_, oldText) { 24695 return oldText + sAddText; 24696 }).end().attr('title', oOption.value + sAddText)); 24697 } else { 24698 oObject.oNextOptionTarget.append(EC$(sOptionsHtml).attr('title', oOption.value + sAddText)); 24699 } 24700 }); 24701 24702 oObject.oNextOptionTarget.closest('.mDropDown.ec-option-disabled').removeClass('ec-option-disabled').find('button').removeAttr('disabled') 24703 24704 CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValue(this.oNextOptionTarget, '*', false); 24705 }, 24706 24707 /** 24708 * ì ë í¸ë°ì¤í ìµì ì¼ ê²½ì° selectboxì´ê¸°í ë° í´ë¹ ìµì ê° Set 24709 * @param aOptions ìµì ê° ë¦¬ì¤í¸ 24710 * @param sSelectedOption íì¬ê¹ì§ ì íë ìµì ì¡°í© ë°°ì´ 24711 */ 24712 setOptionHtmlForSelect: function(aOptions, sSelectedOption) { 24713 // 구ë¶ì ì ì¸ 24714 this.oNextOptionTarget.find('option[value!="**"]').prop('disabled', false); 24715 24716 //ì°ëíì¼ê²½ì°ìë ì´ê¸°í ìí¤ê³ disableì ê±° 24717 //if (Olnk.isLinkageType(this.sOptionType) === true && CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isRequireOption(this.oNextOptionTarget)) { 24718 if (Olnk.isLinkageType(this.sOptionType) === true) { 24719 var sHtml = this.data.getDefaultOptionHTML(this.common.getOptionProductNum(this.oNextOptionTarget), this.common.getOptionSortNum(this.oNextOptionTarget)); 24720 EC$(this.oNextOptionTarget).find('option').remove(); 24721 EC$(this.oNextOptionTarget).append(sHtml); 24722 EC$(this.oNextOptionTarget).find('option[value!="**"]').prop('disabled', false); 24723 EC$(this.oNextOptionTarget).val('*'); 24724 return; 24725 } 24726 24727 //ìµì ì´ ìë Defaultì íê°ì ì ì¸íê³ ëª¨ë ìì 24728 this.oNextOptionTarget.find('option[value!="*"][value!="**"]').remove(); 24729 24730 //ì íí ìµì ì ë¤ììììµì í목 24731 var iNextOptionSortNum = this.common.getOptionSortNum(this.oNextOptionTarget); 24732 24733 var bIsLastOption = false;
24734 //ìì±ë ìµì ì´ ë§ì§ë§ ìµì ì´ë©´ ìµì Textì ì¶ê° í목(ìµì ê° íì íìë±)ì ì²ë¦¬ 24735 if (parseInt(iNextOptionSortNum) === this.iOptionCount) { 24736 bIsLastOption = true; 24737 } 24738 24739 var oObject = this; 24740 var sOptionsHtml = ''; 24741 24742 var sItemCode = false; 24743 24744 //ìµì ì ë í¸ë°ì¤ Textì ì¶ê°ë 문구 ì²ë¦¬ 24745 var sAddText = ''; 24746 //íì ìµì ì¸ë° íì ìµì íììí¨ì¤ì ì´ë©´ ìì 24747 var bIsSoldout = false; 24748 EC$(aOptions).each(function(i, oOption) { 24749 sAddText = ''; 24750 bIsSoldout = false; 24751 bIsDisplay = true; 24752 24753 sOptionsHtml = oObject.data.getButonOptionHtml(oObject.iProductNum, iNextOptionSortNum, oOption.value); 24754 sOptionsHtml = EC$(sOptionsHtml).clone(); 24755 24756 //ë§ì§ë§ ìµì ì¼ ê²½ì°ìë ì¤ì ìë°ë¼ ìµì titleì ì¶ê°ê¸ì¡ë±ì text를 ë¶ì¸ë¤ 24757 if (bIsLastOption === true) { 24758 sItemCode = oObject.data.getItemCode(oObject.iProductNum, sSelectedOption + oObject.cons.OPTION_GLUE + oOption.value); 24759 24760 //ì§ì´ìí¨ì´ë©´ í¨ì¤ 24761 if (oObject.common.isDisplay(oObject.iProductNum, sItemCode) === false) { 24762 bIsDisplay = false; 24763 } 24764 24765 sAddText = oObject.setAddText(oObject.iProductNum, sItemCode); 24766 24767 bIsSoldout = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isSoldout(oObject.iProductNum, sItemCode); 24768 } else { 24769 //íì 문구(ê° ìµì ë§ë¤ë ë³´ì¬ì¤ì¼í¨...) 24770 var sOptionText = sSelectedOption + oObject.cons.OPTION_GLUE + oOption.value; 24771 sAddText = oObject.common.getSoldoutText(oObject.oNextOptionTarget, sOptionText); 24772 bIsSoldout = (sAddText === '') ? false : true; 24773 24774 if (oObject.data.getDisplayFlag(oObject.iProductNum, sOptionText) === false) { 24775 bIsDisplay = false; 24776 } 24777 } 24778 24779 if ((oObject.bIsDisplaySolout === false && bIsSoldout === true) || bIsDisplay === false) { 24780 EC$(this).remove(); 24781 return; 24782 } 24783 24784 EC$(sOptionsHtml).val(oOption.value); 24785 EC$(sOptionsHtml).prop('disabled', false); 24786 EC$(sOptionsHtml).text(oOption.value + sAddText); 24787 24788 oObject.oNextOptionTarget.append(EC$(sOptionsHtml)); 24789 }); 24790 }, 24791 24792 /** 24793 * ë§ì§ë§ ìµì ì ì¶ê°ë ì¶ê°í목ë¤(ì¶ê°ê¸ì¡, íì ë±) 24794 * @param iProductNum ìíë²í¸ 24795 * @param sItemCode ìì´í ì½ë 24796 * @param oOptionElement ìµì ì ë í¸ë°ì¤ë¥¼ ììë¡ ì§ì í ê²½ì° 24797 */ 24798 setAddText: function(iProductNum, sItemCode, oOptionElement) { 24799 var aText = []; 24800 24801 if (typeof(oOptionElement) !== 'object') { 24802 oOptionElement = this.oOptionObject; 24803 } 24804 24805 EC$(this.aExtraOptionText).each(function() { 24806 if (typeof(this.get) === 'function') { 24807 aText.push(this.get(iProductNum, sItemCode, oOptionElement)); 24808 } 24809 }); 24810 24811 return aText.join(''); 24812 }, 24813 24814 /** 24815 * ìµì ì íë°ì¤(ì ë í¸ë°ì¤ë ë²í¼)ì click ëë changeì ëí ì´ë²¤í¸ í ë¹ 24816 */ 24817 initChooseBox: function() { 24818 this.cons = CAFE24.SHOP_FRONT_NEW_OPTION_CONS; 24819 this.common = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON; 24820 this.data = CAFE24.SHOP_FRONT_NEW_OPTION_DATA; 24821 this.validation = CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION; 24822 24823 var oThis = this; 24824 24825 //liveë¡ í ê²½ì°ì 기존 ì´ë²¤í¸ê° ìì´ì§. 24826 EC$('select[option_select_element="ec-option-select-finder"]').off('change focus').change(function() { 24827 if (oThis.common.isOptionStyleButton(this) === true) { 24828 return false; 24829 } 24830 24831 //íì´ì§ ë¡ëê° ëìëì§ íì¸. 24832 if (typeof(oThis.common.isLoad) === false) { 24833 EC$(this).val('*'); 24834 return false; 24835 } 24836 24837 oThis.initialize(this, this); 24838 }).focus(function () { 24839 // select box change ì´ë²¤í¸ ë°ìì ìí´, selectedIndex ì´ê¸°í 24840 // @see ECHOSTING-438245 ë¤ì¤ì íí ìµì ì¸ ê²½ì°ìë§ ëìíëë¡ ì¡°ê±´ ì¶ê° 24841 if (oSingleSelection.isItemSelectionTypeM() === true && this.selectedIndex > 0) { 24842 this.selectedIndex = 0; 24843 } 24844 }); 24845 24846 try { 24847 const sOptionSelector = 'ul[option_select_element="ec-option-select-finder"] > li'; 24848 EC$(document).off('click', sOptionSelector).on('click', sOptionSelector, function (e) { 24849 // [ECHOSTING-573085] ë²í¼í ìµì ë´ a íê·¸ í´ë¦ ì íì´ì§ ì´ë ë°©ì§ 24850 if (EC$(e.target).closest('a').length > 0) { 24851 e.preventDefault(); 24852 }
24853 var oOptionChoose = EC$(this).parent('ul'); 24854 24855 /* 24856 ECHOSTING-194895 ì²ë¦¬ë¥¼ ìí´ ìì (ì¶ê° ì´ë¯¸ì§ í´ë¦ ì í´ë¹ í목 ì í 기ë¥) 24857 if (e.target.tagName === 'LI') { 24858 return false; 24859 } 24860 */ 24861 24862 if (CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(oOptionChoose) === false) { 24863 return false; 24864 } 24865 24866 //íì´ì§ ë¡ëê° ëìëì§ íì¸. 24867 if (typeof CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isLoad === false) { 24868 return false; 24869 } 24870 24871 //ë¼ëì¤ë²í¼ì¼ê²½ì° labelíê·¸ì ììë기ë문ì clickì´ë²¤í¸ê° label inputì ëí´ ëë² ë°ìí¨ 24872 //ë¼ëì¤ë²í¼ ìì±ì´ë©´ì ë°ììì¹ê° labelì´ë©´ ì´ë²¤í¸ ë°ìíì§ìê³ ê·¸ë¥ return 24873 //return falseì´ë©´ labelí´ë¦ì checkedê° ìëëê¹ ê·¸ë¥ return 24874 //input íê·¸ ìì²´ì ì´ë²¤í¸ë¥¼ 주면 ìê´ìì§ë§ liíê·¸ì ì´ë²¤í¸ë¥¼ í ë¹í기ë문ì ì기ë íìê°ì 24875 if (oThis.common.isOptionStyle(oOptionChoose, oThis.cons.OPTION_STYLE_RADIO) === true && e.target.tagName.toUpperCase() === 'LABEL') { 24876 return; 24877 } 24878 24879 oThis.initialize(EC$(this).parent('ul'), this); 24880 }); 24881 } catch (e) {} 24882 24883 try { 24884 EC$('.mDropDown > button').off('click').on('click', function() { 24885 // // ì íìµì div ì ë í¸ë°ì¤ 24886 var oUlElement = EC$(this).siblings('.dropdown').find('ul.' + CAFE24.SHOP_FRONT_NEW_OPTION_CONS.OPTION_STYLE_DIV_SELECT_CLASS + ':not([required])'); 24887 if (oUlElement.length > 0) { 24888 var mDropDownElement = oUlElement.closest('.mDropDown'); 24889 mDropDownElement.find('.eDropDown > span').text(__('ìµì ì í')); 24890 oUlElement.find('li.selected').removeClass('selected ' + CAFE24.SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_SELECTED_CLASS); 24891 CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValue(oUlElement, '*', false); 24892 oThis.initialize(oUlElement, null); 24893 } 24894 }); 24895 } catch (e) {} 24896 }, 24897 24898 /** 24899 * ë©íìµì ìì ìµì ì¶ê°ì ì´ë²¤í¸ ì¬ì ì(ë²í¼íì liveë¡ ëì´ìì¼ë ìê´ìê³ selectíë§) 24900 * @param oOptionElement 24901 */ 24902 initChooseBoxMulti: function() 24903 { 24904 var oThis = this; 24905 24906 //liveë¡ í ê²½ì°ì 기존 ì´ë²¤í¸ê° ìì´ì§. 24907 EC$('.xans-product-multioption select[option_select_element="ec-option-select-finder"]').off('change').change(function() { 24908 if (oThis.common.isOptionStyleButton(this) === true) { 24909 return false; 24910 } 24911 24912 //íì´ì§ ë¡ëê° ëìëì§ íì¸. 24913 if (typeof(oThis.common.isLoad) === false) { 24914 EC$(this).val('*'); 24915 return false; 24916 } 24917 24918 oThis.initialize(this, this); 24919 }); 24920 }, 24921 24922 /** 24923 * ìµì ì íì íìí attributeê°ë±ì SET 24924 */ 24925 setSelectedOptionConf: function() { 24926 //ì íí ìµì 그룹 24927 this.sOptionGroup = this.common.getOptionSelectGroup(this.oOptionObject); 24928 24929 //ì íí ìµì ê° ìë² 24930 this.iOptionIndex = parseInt(this.common.getOptionSortNum(this.oOptionObject)); 24931 24932 //ì íí ìµì ì¤íì¼ 24933 this.sOptionStyle = EC$(this.oOptionObject).attr(this.cons.OPTION_STYLE); 24934 24935 //íì¬ê¹ì§ ì íí ìµì ì valueê°ì ê°ì ¸ì¨ë¤ 24936 this.aOptionValue = this.common.getAllSelectedValue(this.oOptionObject); 24937 24938 //ìíë²í¸ 24939 this.iProductNum = this.common.getOptionProductNum(this.oOptionObject); 24940 24941 //ìµì íì 24942 this.sOptionType = this.common.getOptionType(this.oOptionObject); 24943 24944 //íì ìµì íìì¬ë¶ 24945 this.bIsDisplaySolout = this.validation.isSoldoutOptionDisplay(); 24946 24947 //ì íí ìµì ì ë¤ì ìµì Element 24948 //ì íìµì ì ì ê±°í ë¤ììµì 24949 //1 : íì, 2 : ì í, 3 : íìì¼ë 1ë²ìµì ì íí ë¤ììµì ì 3ë²(ì°ëí) 24950 //[option_sort_no"'+this.iOptionIndex+'"]
24951 oThis = this; 24952 this.oNextOptionTarget = null; 24953 EC$('[product_option_area="'+this.sOptionGroup+'"][option_product_no="'+this.iProductNum+'"]').each(function() { 24954 //íì¬ì íí ìµì ì íììµì ì´ ìëë¼ ìììµì ì´ë©´ í¨ì¤ 24955 if (oThis.iOptionIndex >= parseInt(oThis.common.getOptionSortNum(this))) { 24956 return true;//continue 24957 } 24958 //ì íìµì ì´ë©´ í¨ì¤ 24959 if (oThis.validation.isRequireOption(this) === false) { 24960 return true; 24961 } 24962 24963 oThis.oNextOptionTarget = EC$(this); 24964 return false;//break 24965 }); 24966 24967 //ìµì ê°¯ì 24968 this.iOptionCount = EC$('[product_option_area="'+this.sOptionGroup+'"]').length; 24969 }, 24970 24971 /** 24972 * ë²í¼ì ìµì ì¼ ê²½ì° ì íí ìµì ì ì íì²ë¦¬ 24973 */ 24974 setSelectButton: function(oSelectedOption, bIsUnset) { 24975 24976 if (this.common.isOptionStyleButton(this.oOptionObject) === true) { 24977 //모ë ì íì´ ìëìíë¡ ì´ë²¤í¸ ì¤íí ììëë¡ selected css를 ì§ì°ê³ ë¦¬í´ 24978 if (bIsUnset === true) { 24979 EC$(oSelectedOption).removeClass(this.cons.BUTTON_OPTION_SELECTED_CLASS); 24980 return; 24981 } 24982 24983 //ì´ë¯¸ ì íí ìµì ê°ì ë¤ì í´ë¦ììë ì íí´ì 24984 if (EC$(oSelectedOption).hasClass(this.cons.BUTTON_OPTION_SELECTED_CLASS) === true) { 24985 if (this.common.isOptionStyleDivSelect(this.oOptionObject) === false) { 24986 EC$(oSelectedOption).removeClass(this.cons.BUTTON_OPTION_SELECTED_CLASS); 24987 this.common.setValue(this.oOptionObject, '*', false); 24988 this.setRadioButtonSelect(oSelectedOption, this.oOptionObject, false); 24989 } 24990 } else { 24991 //ë²í¼íìì ìµì ì¼ ê²½ì° ì íí ìµì ì ì íì²ë¦¬(class ëª ì ì¶ê°) 24992 //ì íë¶ê°ì¼ëë ì íëìíë¡ ë³´ì´ì§ ìëë¡ íê³ í´ë¦¬ë§ ê°ë¥íëë¡ íë¤ 24993 //disableìíì´ë©´ ì íCSSë ì ì©ëì§ ìê² ì²ë¦¬ 24994 var oTargetOptionElement = EC$(oSelectedOption).parent('ul'); 24995 var sDevID = EC$(oTargetOptionElement).attr('ec-dev-id'); 24996 var self = this; 24997 24998 //ì¡°í©ì¼ì²´íìì 구ë¶ì ì´ ììê²½ì° ulíê·¸ê° ë°ë¡ìì§ë§ ëì¼ìµì ì´ë¯ë¡ 24999 //ëì¼ ulì 구í´ì 모ë unselectìí¨ë¤ 25000 EC$(oTargetOptionElement).parent().find('ul[ec-dev-id="'+sDevID+'"]').each(function() { 25001 EC$(this).find('li').removeClass(self.cons.BUTTON_OPTION_SELECTED_CLASS); 25002 }); 25003 25004 EC$(oSelectedOption).addClass(this.cons.BUTTON_OPTION_SELECTED_CLASS); 25005 this.setRadioButtonSelect(oSelectedOption, this.oOptionObject, true); 25006 } 25007 } else { 25008 //ì ë í¸ë°ì¤í ìµì ì¼ ê²½ì° **를 ì ííë¤ë©´ ìµì ì´ê¸°í 25009 if (this.validation.isItemCode(EC$(this.oOptionObject).val()) === false) { 25010 EC$(this.oOptionObject).val('*'); 25011 } 25012 } 25013 }, 25014 25015 /** 25016 * Disableì¸ ìµì ì¼ ê²½ì° ì²´í¬ë°ì¤ë¥¼ ë¤ì í´ì í¨ 25017 * @param oSelectedOption 25018 * @param oOptionObject 25019 * @param bIsCheck 25020 */ 25021 setRadioButtonSelect: function(oSelectedOption, oOptionObject, bIsCheck) 25022 { 25023 if (CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyle(oOptionObject, CAFE24.SHOP_FRONT_NEW_OPTION_CONS.OPTION_STYLE_RADIO) === false) { 25024 return; 25025 } 25026 25027 EC$(oOptionObject).find('input:radio').prop('checked', false); 25028 25029 //ì¬ì íì ì²´í¬í´ì íë ¤ë©´ e107c06faf31 ì°¸ê³ 25030 if (bIsCheck === true) { 25031 EC$(oSelectedOption).find('input:radio').prop('checked', true); 25032 } 25033 } 25034}; 25035 25036var EC_SHOP_FRONT_NEW_OPTION_BIND = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_OPTION_BIND'); 25037CAFE24.SHOP_FRONT_NEW_OPTION_DATA = { 25038 25039 /** 25040 * CAFE24.SHOP_FRONT_NEW_OPTION_CONS ê°ì²´ Alias 25041 */ 25042 cons: CAFE24.SHOP_FRONT_NEW_OPTION_CONS, 25043 25044 /** 25045 * CAFE24.SHOP_FRONT_NEW_OPTION_COMMON ê°ì²´ Alias 25046 */ 25047 common: CAFE24.SHOP_FRONT_NEW_OPTION_COMMON, 25048 25049 /** 25050 * ìµì ê°ê´ ìì´í ì½ë ë§¤ì¹ ë°ì´í°(option_value_mapper) 25051 */ 25052 aOptioValueMapper: [], 25053 25054 /** 25055 * ê° ì íë ìµì ê°ìëí ë¤ììµì ê° ë¦¬ì¤í¸ë¥¼ ì ì¥ 25056 * aOptionValueData[ìíë²í¸][빨ê°#$%ëí] = array(key : 1, value : ìµì ê°, text : ìµì Text) 25057 */ 25058 aOptionValueData: {}, 25059 25060 /** 25061 * ê° ìíì í목ë°ì´í°(ì¬ê³ ë° ì¶ê°ê¸ì¡ ì ë³´) 25062 */ 25063 aItemStockData: {}, 25064 25065 /** 25066 * ìµì ì ëí´í¸ HTMLì ì ì¥í´ë 25067 */ 25068 aOptionDefaultData: {}, 25069 25070 /** 25071 * ëí´í¸ ìµì ì ì ì¥í ë ì¤ë³µì ì ê±°í기ìí´ì ì¶ê° 25072 */ 25073 aCacheDefaultProduct: [], 25074 25075 /** 25076 * ë²í¼í ìµì Elementì ì¥ì ì¤ë³µì ê±° 25077 */ 25078 aCacheButtonOption: [], 25079 25080 /** 25081 * ë²í¼í ìµì ì ê²½ì° ê° ìµì ê°ë³ 컬ë¬ì¹©/ë²í¼ì´ë¯¸ì§/ë²í¼ì´ë¦ë±ì ì ì¥í´ëë¤ 25082 */ 25083 aButtonOptionDefaultData: [], 25084 25085 /** 25086 * ì¶ê°ê¸ì¡ ë ¸ì¶ ì¤ì 25087 */ 25088 aOptionPriceDisplayConf: [], 25089 25090 /** 25091 * ì°ëí ìµì ì ìµì ë´ì©ì ì ì¥ 25092 */ 25093 aOlnkOptionData: [], 25094 25095 /** 25096 * ê° ìµì (íëª©ì´ ìë)ë§ë¤ 모ë íì ì´ë©´ íì íì를 ìí´ì ì¶ê°... 25097 */ 25098 aOptionSoldoutFlag: [], 25099 25100 /** 25101 * ê° ìµì (íëª©ì´ ìë)ë§ë¤ 모ë ì§ì´ìí¨ì´ë©´ falseë¡ ëì¤ì§ ìê² í기 ìí´ì ì¶ê° 25102 */ 25103 aOptionDisplayFlag: [], 25104 25105 /** 25106 * íì´ì§ ë¡ë©ì ê° ìµì ì íë°ì¤ì ìµì ì 보를 Parse 25107 */ 25108 initData: function() {
25109 var oThis = this; 25110 EC$('select[option_select_element="ec-option-select-finder"], ul[option_select_element="ec-option-select-finder"]').each(function() { 25111 // ì¤ë³µ ë¡ë ì DOM ììë³ ì´ê¸°í ì¤ë³µ ë°©ì§ 25112 if (EC$(this).data('option-data-initialized') === true) { 25113 return true; 25114 } 25115 EC$(this).data('option-data-initialized', true); 25116 25117 //í´ë¹ ìµì ì ìíë²í¸ 25118 var iProductNum = oThis.common.getOptionProductNum(this); 25119 //í´ë¹ ìµì ì ìµì ììë²í¸ 25120 var iOptionSortNum = oThis.common.getOptionSortNum(this); 25121 25122 var sCacheKey = iProductNum + oThis.cons.OPTION_GLUE + iOptionSortNum; 25123 25124 CAFE24.SHOP_FRONT_NEW_OPTION_DATA.initializeOption(this, sCacheKey); 25125 25126 //ë²í¼í ìµì ì¼ ê²½ì° ê° Element를 ìºì± 25127 if (CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isOptionStyleButton(this) === true) { 25128 CAFE24.SHOP_FRONT_NEW_OPTION_DATA.initializeOptionForButtonOption(this, sCacheKey); 25129 } else { 25130 CAFE24.SHOP_FRONT_NEW_OPTION_DATA.initializeOptionForSelectOption(this, sCacheKey); 25131 //ì¼ë° ì ë í¸ì ê²½ì° ê¸°ë³¸ê° (*, **)ì ì ì¸íê³ ìì 25132 //첫ë²ì§¸ íìê°ì optionë¤ì´ disableì´ ìëë¯ë¡ disableë ìµì ë¤ë§ ìì 25133 var bIsProcLoading = true; 25134 25135 //íììµì ë§ ìì 25136 if (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isRequireOption(this) === false) { 25137 bIsProcLoading = false; 25138 } 25139 25140 //disableë§ íì´ì¤ë¤ 25141 //ì°ëíì´ì§ë§ ìµì ì¶ê°ë²í¼ ì¬ì©ììë ì§ì°ì§ ìì... 25142 //기본ì¼ë¡ ì íëê°ì´ ìë¤ë©´ ì§ì°ì§ ìì(구ì¤í¨ ê´ì¬ìí, ë´ì¤í¨ ì¥ë°êµ¬ëë±ììë ì¼ë¨ ì íí ìµì ì ë³´ì¬ì£¼ê³ ì ííë¶í° ìì°¨ë¡ë©) 25143 var sValue = EC$(this).find('option[selected="selected"]').val(); 25144 if (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isItemCode(sValue) === true || (Olnk.isLinkageType(oThis.common.getOptionType(this)) === true && (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isUseOlnkButton() === true || CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isBindUseOlnkButton(iProductNum) === true))) { 25145 bIsProcLoading = false; 25146 EC$(this).find('option[value!="**"]').prop('disabled', false); 25147 } 25148 25149 if (bIsProcLoading === true) { 25150 EC$(this).find('option[value!="*"][value!="**"]:disabled').remove('option'); 25151 } 25152 } 25153 }); 25154 }, 25155 25156 /** 25157 * ê° ìíì ìµì ëí´í¸ ìµì HTMLì ì ì¥í´ëë¤ 25158 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 25159 */ 25160 initializeOption: function(oOptionChoose, sCacheKey) { 25161 //ì´ë¯¸ ë°ì´í°ê° ìë¤ë©´ í¨ì¤ 25162 if (EC$.inArray(sCacheKey, this.aCacheDefaultProduct) > -1) { 25163 return; 25164 } 25165 25166 this.aCacheDefaultProduct.push(sCacheKey);
25167 this.aOptionDefaultData[sCacheKey] = EC$(oOptionChoose).html(); 25168 }, 25169 25170 initializeOptionForSelectOption: function(oOptionChoose, sCacheKey) { 25171 var iProductNum = EC$(oOptionChoose).attr('option_product_no'); 25172 var oThis = this; 25173 //ê°ì ìíì´ ì¬ë¬ê°ììììì¼ë¯ë¡ ì´ë¯¸ ìºì±ì´ ìë ìíë§ 25174 if (EC$.inArray(sCacheKey, this.aCacheButtonOption) < 0) { 25175 var bDisabled = false; 25176 if (Olnk.isLinkageType(this.common.getOptionType(oOptionChoose)) === true && (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isUseOlnkButton() === true || CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isBindUseOlnkButton(iProductNum) === true)) { 25177 bDisabled = true; 25178 } 25179 25180 this.aCacheButtonOption.push(sCacheKey); 25181 this.aButtonOptionDefaultData[sCacheKey] = []; 25182 25183 EC$(oOptionChoose).find('option').each(function() { 25184 if (bDisabled === true && this.value !== '**') { 25185 EC$(this).prop('disabled', false); 25186 } 25187 oThis.aButtonOptionDefaultData[sCacheKey][EC$(this).val()] = EC$('<div>').append(EC$(this).clone()).html(); 25188 }); 25189 } 25190 }, 25191 25192 /** 25193 * ì ë í¸ë°ì¤ íìì´ ìë ë²í¼ì´ë ì´ë¯¸ì§í ìµì ì¼ ê²½ì° HTMLì체를 ìµì ê° ë³ë¡ ì ì¥í´ëë¤. 25194 * writejsì°ê¸°ì«ìì¬ 25195 */ 25196 initializeOptionForButtonOption: function(oOptionChoose, sCacheKey) { 25197 var oThis = this;
25198 var iProductNum = EC$(oOptionChoose).attr('option_product_no'); 25199 25200 //ê°ì ìíì´ ì¬ë¬ê°ììììì¼ë¯ë¡ ì´ë¯¸ ìºì±ì´ ìë ìíë§ 25201 if (EC$.inArray(sCacheKey, this.aCacheButtonOption) < 0) { 25202 var bDisabled = false; 25203 if (Olnk.isLinkageType(this.common.getOptionType(oOptionChoose)) === true && (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isUseOlnkButton() === true || CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isBindUseOlnkButton(iProductNum) === true)) { 25204 bDisabled = true; 25205 } 25206 25207 this.aCacheButtonOption.push(sCacheKey); 25208 this.aButtonOptionDefaultData[sCacheKey] = []; 25209 25210 EC$(oOptionChoose).find('li').each(function() { 25211 if (bDisabled === true) { 25212 EC$(this).removeClass(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.BUTTON_OPTION_DISABLE_CLASS); 25213 } 25214 oThis.aButtonOptionDefaultData[sCacheKey][EC$(this).attr('option_value')] = EC$('<div>').append(EC$(this).clone()).html(); 25215 }); 25216 } 25217 25218 //ì¡°í©ì¼ì²´íì¸ ê²½ì° ê¸°ì¡´ìì±ë ì ë í¸ë°ì¤ë ìì
25219 if (EC$(oOptionChoose).attr('item_listing_type') === 'C') { 25220 EC$('select[product_option_area_select="addproduct_option_' + iProductNum + '"]').remove(); 25221 } 25222 25223 var oTriggerSelect = this.getSelectClone(oOptionChoose); 25224 25225 oTriggerSelect.append(EC$('<option>').val('*').text('empty')); 25226 25227 var sTitle = ''; 25228 var sValue = ''; 25229 for (x in this.aButtonOptionDefaultData[sCacheKey]) { 25230 //IE8.. 25231 if (x !== 'indexOf') { 25232 sTitle = EC$(oThis.aButtonOptionDefaultData[sCacheKey][x]).attr('title'); 25233 sValue = EC$(oThis.aButtonOptionDefaultData[sCacheKey][x]).attr('option_value'); 25234 25235 oTriggerSelect.append(EC$('<option>').val(sValue).text(sTitle)); 25236 } 25237 } 25238 25239 oTriggerSelect.val('*'); 25240 EC$(oOptionChoose).parent().append(oTriggerSelect); 25241 }, 25242 /** 25243 * ìµì ì í UIì 미ë¬ë§ ê°ì²´ ìì± 25244 * @param oOptionChoose 25245 * @returns {jQuery} 25246 */ 25247 getSelectClone: function(oOptionChoose) 25248 { 25249 var aAttribute = {
25250 'product_option_area_select': EC$(oOptionChoose).attr('product_option_area'), 25251 'id': EC$(oOptionChoose).attr('ec-dev-id'), 25252 'name': EC$(oOptionChoose).attr('ec-dev-name'), 25253 'option_title': EC$(oOptionChoose).attr('option_title'), 25254 'option_type': EC$(oOptionChoose).attr('option_type'), 25255 'item_listing_type': EC$(oOptionChoose).attr('item_listing_type'), 25256 'composition-code': EC$(oOptionChoose).attr('composition-code'), 25257 'option_code': EC$(oOptionChoose).attr('option_code') 25258 }; 25259 // ì ë í¸ ë°ì¤ì ì ë í°ê° ^=ë¼ì í´ëì¤ì ììê° ì¤ì 25260 var aClass = []; 25261 if (typeof(EC$(oOptionChoose).attr('ec-dev-class')) !== 'undefined') { 25262 aClass.push(EC$(oOptionChoose).attr('ec-dev-class')); 25263 } 25264 aClass.push('displaynone'); 25265 25266 if (EC$(oOptionChoose).hasClass(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.OPTION_STYLE_DIV_SELECT_CLASS) === true) { 25267 aClass.push(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.OPTION_STYLE_DIV_SELECT_CLASS); 25268 } 25269
25270 if (EC$(oOptionChoose).hasClass(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.OPTION_SET_PRODUCT_NONE_CLASS) === true) { 25271 aClass.push(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.OPTION_SET_PRODUCT_NONE_CLASS); 25272 } 25273 25274 var oReturn = EC$('<select required="true">').attr(aAttribute).addClass(aClass.join(' ')); 25275 if (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isRequireOption(oOptionChoose) === false) { 25276 // true/false를 stringì¼ë¡ ì§ì í´ì¼í´ì 먼ì stringì¼ë¡ ì§ì í´ì£¼ê³ íììì¼ë©´ ì ê±° 25277 oReturn.removeAttr('required'); 25278 } 25279 return oReturn; 25280 }, 25281 25282 /** 25283 * ë²í¼í ìµì ì ìí ìµì ê°ì ëí ìµì HTMLì ë°í 25284 * @param iProductNum ìíë²í¸ 25285 * @param iOptionSortNum ìµì ìì 25286 * @param sOptionValue ìµì ê° 25287 * @returns boolean í´ë¹ ìµì ê°ì ëí ë²í¼ HTML 25288 */ 25289 getButonOptionHtml: function(iProductNum, iOptionSortNum, sOptionValue) { 25290 var sCacheKey = iProductNum + this.cons.OPTION_GLUE + iOptionSortNum; 25291 25292 //ììê²½ì°ìë ë¤ì ì´ê¸°í 25293 if (typeof(this.aButtonOptionDefaultData[sCacheKey]) === 'undefined') { 25294 this.initData(); 25295 } 25296 25297 if (typeof(this.aButtonOptionDefaultData[sCacheKey][sOptionValue]) === 'undefined') { 25298 return false; 25299 } 25300 25301 return this.aButtonOptionDefaultData[sCacheKey][sOptionValue]; 25302 }, 25303 25304 /** 25305 * ìµì ì ì ííì§ ìììë íììµì ì ì´ê¸°íí기ìí´ì ëí´í¸ HTMLì ê°ì ¸ì´ 25306 * @param iProductNum ìíë²í¸ 25307 * @param iOptionSortNum ìµì ìì 25308 */ 25309 getDefaultOptionHTML: function(iProductNum, iOptionSortNum) 25310 { 25311 var sCacheKey = iProductNum + this.cons.OPTION_GLUE + iOptionSortNum; 25312 25313 if (typeof(this.aOptionDefaultData[sCacheKey]) === 'undefined') { 25314 return; 25315 } 25316 25317 return this.aOptionDefaultData[sCacheKey]; 25318 }, 25319 25320 /** 25321 * í´ë¹ ìíì ìµì ì¬ê³ ê´ë ¨ ë°ì´í°ë¥¼ ë¦¬í´ 25322 * @param iProductNum ìíë²í¸ 25323 */ 25324 getProductStockData: function(iProductNum) { 25325 if (typeof(this.aItemStockData[iProductNum]) === 'undefined') { 25326 try { 25327 var rawData = window["option_stock_data" + iProductNum]; 25328 if (rawData !== undefined) { 25329 this.aItemStockData[iProductNum] = CAFE24.UTIL.parseJSON(rawData); 25330 } 25331 } catch (e) { 25332 console.error('ìµì ë°ì´í°ë¥¼ ë¶ë¬ì¤ë ë° ì¤í¨íìµëë¤: ' + e.message); 25333 } 25334 } 25335 25336 if (this.aItemStockData.hasOwnProperty(iProductNum) === false) { 25337 return null; 25338 } 25339 25340 return this.aItemStockData[iProductNum]; 25341 }, 25342 25343 /** 25344 * ìµì ì´ ëª¨ë ì íëìë¤ë©´ ìµì ê° ë¦¬í´ 25345 * @param iProductNum ìíë²í¸ 25346 * @param sSelectedOptionValue ì íë ì ì²´ ìµì ê° 25347 * @returns boolean ìì´í ì½ë 25348 */ 25349 getItemCode: function(iProductNum, sSelectedOptionValue) { 25350 if (typeof(this.aOptioValueMapper[iProductNum]) === 'undefined') { 25351 return false; 25352 } 25353 25354 if (typeof(this.aOptioValueMapper[iProductNum][sSelectedOptionValue]) === 'undefined') { 25355 return false; 25356 } 25357 25358 return this.aOptioValueMapper[iProductNum][sSelectedOptionValue]; 25359 }, 25360 25361 /** 25362 * í´ë¹ ìíì ì íë ìµì ì íì ìµì ì ë¦¬í´ 25363 * @param iProductNum ìíë²í¸ 25364 * @param sSelectedValue íì¬ê¹ì§ ì íë ìµì ê° String(ìµì 1ê° + EC_SHOP_FRONT_NEW_OPTION_CONS.OPTION_GLUE + ìµì 2ê° íì) 25365 * @returns ìµì 리ì¤í¸ 25366 */ 25367 getOptionValueArray: function(iProductNum, sSelectedValue) { 25368 if (typeof(this.aOptionValueData[iProductNum]) === 'undefined') { 25369 return false; 25370 } 25371 25372 if (typeof(this.aOptionValueData[iProductNum][sSelectedValue]) === 'undefined') { 25373 return false; 25374 } 25375 25376 return this.aOptionValueData[iProductNum][sSelectedValue]; 25377 }, 25378 25379 /** 25380 * ìµì ìì±ì íìí 기본ë°ì´í° ì ì 25381 */ 25382 setDefaultData: function() { 25383 if (typeof(option_stock_data) !== 'undefined') { 25384 this.aItemStockData[iProductNo] = CAFE24.UTIL.parseJSON(option_stock_data); 25385 } 25386 if (typeof(option_value_mapper) !== 'undefined') { 25387 this.aOptioValueMapper[iProductNo] = CAFE24.UTIL.parseJSON(option_value_mapper); 25388 } 25389 if (typeof(product_option_price_display) !== 'undefined') { 25390 this.aOptionPriceDisplayConf[iProductNo] = product_option_price_display; 25391 } 25392 25393 if (typeof(add_option_data) !== 'undefined') { 25394 var aAddOptionJson = CAFE24.UTIL.parseJSON(add_option_data); 25395 for (var iAddProductNo in aAddOptionJson) { 25396 this.aItemStockData[iAddProductNo] = CAFE24.UTIL.parseJSON(aAddOptionJson[iAddProductNo].option_stock_data); 25397 if (typeof(aAddOptionJson[iAddProductNo].option_value_mapper) !== 'undefined') { 25398 this.aOptioValueMapper[iAddProductNo] = CAFE24.UTIL.parseJSON(aAddOptionJson[iAddProductNo].option_value_mapper); 25399 } 25400 25401 this.aOptionPriceDisplayConf[iAddProductNo] = aAddOptionJson[iAddProductNo].product_option_price_display; 25402 } 25403 } 25404 25405 if (typeof(set_option_data) !== 'undefined') { 25406 var aSetProductData = CAFE24.UTIL.parseJSON(set_option_data); 25407 for (var iSetProductNo in aSetProductData) { 25408 this.aItemStockData[iSetProductNo] = CAFE24.UTIL.parseJSON(aSetProductData[iSetProductNo].option_stock_data); 25409 25410 if (typeof(aSetProductData[iSetProductNo].option_value_mapper) !== 'undefined') { 25411 this.aOptioValueMapper[iSetProductNo] = CAFE24.UTIL.parseJSON(aSetProductData[iSetProductNo].option_value_mapper); 25412 } 25413 25414 this.aOptionPriceDisplayConf[iSetProductNo] = aSetProductData[iSetProductNo].product_option_price_display; 25415 } 25416 } 25417 }, 25418 25419 /** 25420 * ì´ë²¤í¸ ìµì ì ë¤ììµì ê°ì ì¸í
25421 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 25422 */ 25423 initializeOptionValue: function(oOptionChoose) { 25424 //ìíë²í¸ 25425 var iProductNum = this.common.getOptionProductNum(oOptionChoose); 25426 25427 //íì¬ê¹ì§ ì íë ìµì ê° ë°°ì´ 25428 var aSelectedValue = this.common.getAllSelectedValue(oOptionChoose); 25429 25430 var sSelectedValue = aSelectedValue.join(this.cons.OPTION_GLUE); 25431 25432 //기존 ì ì¸ëì§ ìì ìµì ìëí ì²ë¦¬ë©´ ë±ì´ë¡ 미리 ì ì¸ 25433 //ì´ë¯¸ ìµì ê°ì´ setëì´ìì¼ë©´ ë°ë¡ ë¦¬í´ 25434 if (typeof(this.aOptionValueData[iProductNum]) === 'undefined') { 25435 this.aOptionValueData[iProductNum] = {}; 25436 } 25437 if (typeof(this.aOptionValueData[iProductNum][sSelectedValue]) === 'undefined') { 25438 this.aOptionValueData[iProductNum][sSelectedValue] = new Array(); 25439 } else { 25440 return; 25441 } 25442 25443 //ì íí ìµì ì ìë² 25444 var iOptionSortNum = this.common.getOptionSortNum(oOptionChoose); 25445 25446 //ìµì ê° ìì 25447 var iCnt = 1; 25448 //ì¤ë³µìµì ê° ì ê±°í기 ìí´ì ì ì¥í ìµì ê° 25449 var aCheckDuplicate = []; 25450 25451 25452 //ì¥ë°êµ¬ë ê´ì¬ìí쪽ì ë°ì´í°ê° ì´ë ê²ëì´ìì´ì íì´ì§ë¡ëìì ì´ë»ê² í ìê° ìë¤ì.. 25453 if (typeof(this.aOptioValueMapper[iProductNum]) === 'undefined') { 25454 try { 25455 var rawData = window["option_value_mapper" + iProductNum]; 25456 if (rawData !== undefined) { 25457 this.aOptioValueMapper[iProductNum] = CAFE24.UTIL.parseJSON(rawData); 25458 } 25459 } catch (e) { 25460 console.error('ìµì ë°ì´í°ë¥¼ ë¶ë¬ì¤ë ë° ì¤í¨íìµëë¤: ' + e.message); 25461 } 25462 } 25463 25464 for (var x in this.aOptioValueMapper[iProductNum]) { 25465 25466 //ìµì ê°ì 구ë¶ìì ë°ë¼ ë°°ì´ë¡ ë¶ë¦¬(ìµì ê° => ìì´í ì½ë íí 25467 var aOptions = x.split(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.OPTION_GLUE); 25468 25469 //ìµì ê°ìì 기ì íë ê°ê³¼ ë¹êµí기ìí ìµì ê° 25470 var sOptionValue = aOptions.splice(0, iOptionSortNum).join(this.cons.OPTION_GLUE); 25471 25472 //첫ë²ì§¸ìµì ë¶í° ë§ì§ë§ì íí ìµì ê¹ì§ì ìµì ê°ì´ ëê°ì¼ë©´ì 기존ì²ë¦¬ë ìµì ê°ì´ ìëë¼ë©´ ë°°ì´ì ì ì¥ 25473 if (String(sOptionValue) === String(sSelectedValue) && EC$.inArray(aOptions[0], aCheckDuplicate) < 0) { 25474 this.aOptionValueData[iProductNum][sSelectedValue].push({key: iCnt, value: aOptions[0]}); 25475 iCnt++; 25476 aCheckDuplicate.push(aOptions[0]); 25477 } 25478 } 25479 }, 25480 25481 /** 25482 * ê° ìµì ê°ì ì ì²´íì ì¬ë¶ 25483 * @param iProductNum ìíë²í¸ 25484 * @param sValue ìµì ê° 25485 * @returns 25486 */ 25487 getSoldoutFlag: function(iProductNum, sValue) { 25488 if (typeof(this.aOptionSoldoutFlag[iProductNum][sValue]) === 'undefined') { 25489 return false; 25490 } 25491 25492 return this.aOptionSoldoutFlag[iProductNum][sValue]; 25493 }, 25494 25495 /** 25496 * ê° ìµì ê°ì ì§ì´ ì¬ë¶ 25497 * @param iProductNum ìíë²í¸ 25498 * @param sValue ìµì ê° 25499 * @returns 25500 */ 25501 getDisplayFlag: function(iProductNum, sValue) { 25502 25503 if (typeof(this.aOptionDisplayFlag[iProductNum][sValue]) === 'undefined') { 25504 return false; 25505 } 25506 25507 return this.aOptionDisplayFlag[iProductNum][sValue]; 25508 }, 25509 25510 /** 25511 * ê°ê°ì ìµì ê°(í목ë§ê³ )ë§ë¤ í´ë¹ ìµì ì ì²´ê° íì ì¸ì§ ì²´í¬... 25512 * @param oOptionChoose 25513 */ 25514 initializeSoldoutFlag: function(oOptionChoose) { 25515 //í´ë¹ ìµì ì ìíë²í¸ 25516 var iProductNum = this.common.getOptionProductNum(oOptionChoose); 25517 25518 if (typeof(this.aOptionSoldoutFlag[iProductNum]) === 'undefined') { 25519 this.aOptionSoldoutFlag[iProductNum] = []; 25520 } 25521 25522 if (typeof(this.aOptionDisplayFlag[iProductNum]) === 'undefined') { 25523 this.aOptionDisplayFlag[iProductNum] = []; 25524 } 25525 25526 //ì¥ë°êµ¬ë ê´ì¬ìí쪽ì ë°ì´í°ê° ì´ë ê²ëì´ìì´ì íì´ì§ë¡ëìì ì´ë»ê² í ìê° ìë¤ì.. 25527 if (typeof(this.aOptioValueMapper[iProductNum]) === 'undefined') { 25528 try { 25529 var rawData = window["option_value_mapper" + iProductNum]; 25530 if (rawData !== undefined) { 25531 this.aOptioValueMapper[iProductNum] = CAFE24.UTIL.parseJSON(rawData); 25532 } 25533 } catch (e) { 25534 console.error('ìµì ë°ì´í°ë¥¼ ë¶ë¬ì¤ë ë° ì¤í¨íìµëë¤: ' + e.message); 25535 } 25536 } 25537 25538 for (var x in this.aOptioValueMapper[iProductNum]) { 25539 //ìµì ê°ì 구ë¶ìì ë°ë¼ ë°°ì´ë¡ ë¶ë¦¬(ìµì ê° => ìì´í ì½ë íí 25540 var aOptions = x.split(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.OPTION_GLUE); 25541 25542 var bIsSoldout = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isSoldout(iProductNum, this.aOptioValueMapper[iProductNum][x]); 25543 25544 var bIsDisplay = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isDisplay(iProductNum, this.aOptioValueMapper[iProductNum][x]); 25545 25546 for (var i = 1; i <= EC$(aOptions).length; i++) { 25547 var sOption = aOptions.slice(0, i).join(CAFE24.SHOP_FRONT_NEW_OPTION_CONS.OPTION_GLUE); 25548 25549 //ì¼ë¨ íì ë¡ ì¸í íê³ íì ì´ ìëê² íëë¼ëìë¤ë©´ falseë¡ ë°ê¿ì¤ë¤ 25550 if (typeof(this.aOptionSoldoutFlag[iProductNum][sOption]) === 'undefined') { 25551 this.aOptionSoldoutFlag[iProductNum][sOption] = true; 25552 } 25553 25554 if (bIsSoldout === false) { 25555 this.aOptionSoldoutFlag[iProductNum][sOption] = false;
25556 } 25557 25558 //ì¼ë¨ ì§ì´ìí¨ì¼ë¡ ì¸í íì íê°ë¼ë ì§ì´í¨ì´ìë¤ë©´ trueë°ê¿ì¤ë¤ 25559 if (typeof(this.aOptionSoldoutFlag[iProductNum][sOption]) === 'undefined') { 25560 this.aOptionDisplayFlag[iProductNum][sOption] = false; 25561 } 25562 25563 if (bIsDisplay === true) { 25564 this.aOptionDisplayFlag[iProductNum][sOption] = true; 25565 } 25566 } 25567 } 25568 } 25569}; 25570 25571var EC_SHOP_FRONT_NEW_OPTION_DATA = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_OPTION_DATA'); 25572 25573CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION = { 25574 /** 25575 * CAFE24.SHOP_FRONT_NEW_OPTION_COMMON Obejct Alias 25576 */ 25577 common: CAFE24.SHOP_FRONT_NEW_OPTION_COMMON, 25578 25579 cons: CAFE24.SHOP_FRONT_NEW_OPTION_CONS, 25580 25581 /** 25582 * í´ë¹ ìµì 그룹ì íììµì ì´ ìí´ìëì§ ì¬ë¶ íì¸ 25583 * @param sOptionGroup ìµì 그룹 (@see : CAFE24.SHOP_FRONT_NEW_OPTION_GROUP_CONS) 25584 * @returns íììµì ì¡´ì¬ ì¬ë¶ 25585 */ 25586 checkRequiredOption: function(sOptionGroup) { 25587 //í´ë¹ ìµì 그룹ì íììµì ê°¯ì 25588 var iRequiredOption = EC$(this.common.getRequiredOption(sOptionGroup)).length; 25589 25590 return (parseInt(iRequiredOption) > 0) ? true : false; 25591 }, 25592 25593 /** 25594 * í´ë¹ ìµì ì´ íììµì ì¸ì§ íì¸ 25595 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 25596 */ 25597 isRequireOption: function(oOptionChoose) {
25598 return (Boolean(EC$(oOptionChoose).attr('required')) === true); 25599 }, 25600 25601 /** 25602 * í´ë¹ ê°ì´ ìì´í ì½ëì¸ì§ íì¸ 25603 * @param sItemCode ì íí ìì´í ì½ë 25604 * @returns trueì´ë©´ ìì´í ì½ë 25605 * @todo ìì´í ì½ë ì ê·ìì ì¶ê°..í´ì¼íë?? ê·¸ëì¼íë¤ë©´ ì íê°ì¬ë¶ë¥¼(*, **) ë°ë¡ëê³ ì¤ì ìì´í ì½ëì¸ì§ ì¬ë¶ë¥¼ ë íì¸í´ì¼í¨ 25606 */ 25607 isItemCode: function(sItemCode) { 25608 return (EC$.inArray(sItemCode, ['*', '**']) > -1 || typeof(sItemCode) === 'undefined') ? false : true; 25609 }, 25610 25611 /** 25612 * ìµì ê°ì´ ì íëì´ìëì§ íì¸ 25613 * @param oOptionChoose ê°ì ê°ì ¸ì¤ë ¤ë ìµì ë°ì¤ object 25614 */ 25615 isOptionSelected: function(oOptionChoose) { 25616 return (EC$.inArray(this.common.getOptionSelectedValue(oOptionChoose), ['*', '**']) > -1) ? false : true; 25617 }, 25618 25619 /** 25620 * ìµì 그룹ìì íëë¼ë ì íì´ ëìëì§ íì¸ 25621 */ 25622 isOptionGroupSelected: function(sOptionGroup) 25623 { 25624 var oThis = this; 25625 var bIsChoosen = false; 25626 EC$('[' + this.cons.GROUP_ATTR_NAME + '^="' + sOptionGroup + '"]').each(function() { 25627 if (oThis.isOptionSelected(this) === true) { 25628 bIsChoosen = true; 25629 return false; 25630 } 25631 }); 25632 return bIsChoosen; 25633 }, 25634 25635 /** 25636 * íì ìµì ì´ ëª¨ë ì íë ìíì¸ì§ ì¬ë¶ íì¸ 25637 * @param sOptionGroup ì íí ìì´í ì½ë 25638 * @returns boolean trueì´ë©´ ìì´í ì½ë 25639 */ 25640 isSelectedRequiredOption: function(sOptionGroup) { 25641 //íììµì ì´ íëë ìë¤ë©´ ë°ë¡ true 25642 if (this.checkRequiredOption(sOptionGroup) === false) { 25643 return true; 25644 } 25645 25646 var oThis = this; 25647 var bIsComplete = true; 25648 EC$('[' + this.cons.GROUP_ATTR_NAME + '^="' + sOptionGroup + '"]').each(function() { 25649 25650 //íììµì ì´ì§ë§ ê°ì´ ì íëì§ ìììê²½ì° false 25651 if (oThis.isRequireOption(this) === true && oThis.isOptionSelected(this) === false) { 25652 bIsComplete = false; 25653 return false; 25654 } 25655 }); 25656 25657 return bIsComplete; 25658 }, 25659 25660 /** 25661 * ì¡°í©ë¶ë¦¬íë§ ìì´í ì½ë를 ê°ì ¸ì¤ëë°©ìì´ íë ¤ì íì¸ì©ì ì¶ê°(ì°ëíë ì¼ë¨ ì¡°í©ë¶ë¦¬íì¼ë¡ ì¸ìíëë¡ í¨) 25662 * @param oOptionChoose 구ë¶í ìµì ë°ì¤ object 25663 * @returns true => ì¡°í©ë¶ë¦¬í, false => 기íìµì íì 25664 */ 25665 isSeparateOption: function(oOptionChoose) {
25666 var sOptionTypeStr = EC$(oOptionChoose).attr('option_type'); 25667 var sOptionListStr = EC$(oOptionChoose).attr('item_listing_type'); 25668 return (Olnk.isLinkageType(sOptionTypeStr) === true || (sOptionTypeStr === 'T' && sOptionListStr === 'S')) ? true : false; 25669 }, 25670 25671 /** 25672 * ì°ëí ìµì ì¶ê° ë²í¼ ì¬ì©ì¤ì ì ì¬ì©íë©´ ë ìì°¨ë¡ë© íì§ ìì 25673 * @returns 25674 */ 25675 isUseOlnkButton: function() { 25676 return Olnk.getOptionPushbutton(EC$('#option_push_button')); 25677 }, 25678 /** 25679 * ì¸í¸ìíìì ì°ëí ìµì ì¶ê° ë²í¼ ì¬ì©ì¤ì ì ì¬ì©íë©´ ë ìì°¨ë¡ë© íì§ ìì 25680 * @returns 25681 */ 25682 isBindUseOlnkButton: function(iProductNum) { 25683 return EC$('#add_option_push_button_'+iProductNum).length > 0; 25684 }, 25685 isSoldoutOptionDisplay: function() { 25686 return (typeof(bIsDisplaySoldoutOption) !== 'undefined') ? bIsDisplaySoldoutOption : true; 25687 } 25688}; 25689 25690var EC_SHOP_FRONT_NEW_OPTION_VALIDATION = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_OPTION_VALIDATION'); 25691 25692//ìë input id 25693var quantity_id = '#quantity:not(.ec-debug)'; 25694var bRestockChange = false; 25695 25696EC$(function() 25697{ 25698 // 기존 ë ê±°ì ì½ë(í¹ ì¬ì©íëëª°ì´ ììê¹ íì¬ ì ì§) 25699 if (EC$('.ec-product-couponAjax').length > 0) { 25700 getPrdDetailNewAjax(); 25701 } 25702 25703 // ì ê· ê¸°ë³¸ëìì¸ì ë°ì 25704 if (EC$('.ec-product-coupon').length > 0) { 25705 CAFE24.SHOP_FRONT_PRODUCT_INFO_COUPON.getPrdDetailCouponAjax(iProductNo,iCategoryNo); 25706 } 25707 25708 // ECHOSTING-90301 모ë°ì¼ zoom.html íì´ì§ìì ìë¬ - ìì¸ì²ë¦¬ 25709 try { TotalAddSale.setParam('product_no', iProductNo); } catch (e) {} 25710 25711 EC$("select[id*='product_option_id']").each(function () { 25712 EC$(this).val('*'); 25713 25714 }); 25715 25716 // ëìì¸ ë§ì´ê·¸ë ì´ì - ì´ê±¸ ì¬ê¸°ì í´ì¼í ê¹.. 25717 if (EC$('#NewProductQuantityDummy').length > 0 && EC$('#totalProducts').length > 0) { 25718 EC$('#NewProductQuantityDummy').parents('tr').remove(); 25719 } 25720 25721 // ìë ì´ê¸°í 25722 EC$(quantity_id).val(CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getProductMinQuantity()); 25723 EC$('input.single-quantity-input[product-no='+iProductNo+']').val(CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getProductMinQuantity()); 25724 // íë© 25725 EC$('input.quantity').val(CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getProductMinQuantity()); 25726 25727 // íì ì¼ ê²½ì° ìë 0 ì¤ì 25728 if (EC_FRONT_JS_CONFIG_SHOP.bDirectBuyOrderForm === true && EC_FRONT_JS_CONFIG_SHOP.bSoldout === true) { 25729 EC$(quantity_id).val(0); 25730 } 25731 25732 // íë§¤ê° ì´ê¸°í 25733 try { 25734 setPrice(true, false, ''); 25735 } catch (e) {} 25736 25737 25738 // ë°°ì¡íì ì´ê¸°í 25739 if (delvtype == 'A') { 25740 EC$('#delv_type_A').prop('checked', true); 25741 } 25742 25743 // ë°°ì¡íì ì í 25744 EC$('[id^="delv_type_"]').change(function() 25745 { 25746 delvtype = EC$(this).val(); 25747 25748 // í´ì¸ë°°ì¡ì´ë©´ ì ê²°ì ê³ ì 25749 if (delvtype == 'B') { 25750 EC$('#delivery_cost_prepaid').val('P'); 25751 if (EC$('.delv_price_C').length > 0) { 25752 EC$('.delv_price_B').hide(); 25753 EC$('.delv_price_C').show(); 25754 } 25755 try { 25756 if (document.getElementById('NaverChk_Button') != null) { 25757 document.getElementById('NaverChk_Button').style.display = 'none'; 25758 } 25759 if (document.getElementById('kakao-checkout-button') !== null) { 25760 document.getElementById('kakao-checkout-button').style.display = 'none'; 25761 } 25762 } catch (e) {} 25763 } else { 25764 EC$('.delv_price_B').show(); 25765 EC$('.delv_price_C').hide(); 25766 try { 25767 if (document.getElementById('NaverChk_Button') != null) { 25768 document.getElementById('NaverChk_Button').style.display = ''; 25769 } 25770 if (document.getElementById('kakao-checkout-button') !== null) { 25771 document.getElementById('kakao-checkout-button').style.display = ''; 25772 } 25773 } catch (e) {} 25774 } 25775 25776 }); 25777 25778 // í´ì¸ ë°°ì¡ ì ì© ìíì hiddenê° ì²ë¦¬ 25779 var oHiddenDeliveryType = EC$('[name="delv_type"]:hidden:not(:radio)'); 25780 if (oHiddenDeliveryType.length > 0) { 25781 if (EC$('input:radio[id^="delv_type_"]').is(':visible') === true) { 25782 delvtype = EC$('input:radio[id^="delv_type_"]:checked').val(); 25783 } else { 25784 oHiddenDeliveryType.each(function() { 25785 // delv_typeì inputíê·¸ ì¡´ì¬ ìì²´ê° í´ì¸ë°°ì¡ì ì¬ì©íë¤ë ì미 25786 if (EC$(this).attr('product_no') == iProductNo) { 25787 delvtype = 'B'; 25788 return false;
25789 } 25790 }); 25791 } 25792 } 25793 25794 if (oSingleSelection.isItemSelectionTypeS() === true) { 25795 25796 // 본체 ìíë§ 25797 oSingleSelection.setProductTargetKey(); 25798 25799 EC$(document).on('click change', 'input.single-quantity-input, img.quantity-handle.product-no-' + iProductNo + ', a.quantity-handle.product-no-' + iProductNo, function(e) { 25800 25801 var eSelf = EC$(this); 25802 oSingleSelection.setProductTargetKey(eSelf); 25803 var iBuyUnit = CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getBuyUnitQuantity(); 25804 var iQuantity = parseInt(oSingleSelection.getQuantityInput(eSelf).val(),10); 25805 if (eSelf.hasClass('up') === true) { 25806 iQuantity = iQuantity + iBuyUnit; 25807 } else if (eSelf.hasClass('down') === true) { 25808 iQuantity = iQuantity - iBuyUnit; 25809 } 25810 25811 var sQuantityInputSelector = ':text,input[type=tel]'; 25812 if (CAFE24.checkChannelUI() === true) { 25813 var sContext = 'div[target-key="'+oSingleSelection.getProductTargetKey()+'"]'; 25814 if (has_option === 'F') { 25815 sContext = '#totalProducts div:not(.add_products):not(#dynamic_option)'; 25816 } 25817 } else { 25818 var sContext = 'tr[target-key="'+oSingleSelection.getProductTargetKey()+'"]'; 25819 if (EC_MOBILE_DEVICE === true || EC_MOBILE === true) { 25820 sQuantityInputSelector = '[type=number]'; 25821 if (has_option === 'F') { 25822 sContext = ''; 25823 sQuantityInputSelector = quantity_id; 25824 } 25825 } else { 25826 if (has_option === 'F') { 25827 sContext = '#totalProducts tbody:not(.add_products)'; 25828 } 25829 } 25830 } 25831 25832 EC$('input'+sQuantityInputSelector, sContext).not('.ec-debug').val(iQuantity).trigger('change'); 25833 e.stopPropagation(); 25834 }); 25835 25836 EC$(document).on('click', '.xans-product-quantity a.eClearUp, .xans-product-quantity a.eClearDown', function () { 25837 EC$(this).find('.quantity-handle.product-no-' + iProductNo).click(); 25838 }); 25839 } 25840 25841 25842 try { 25843 var sContext = ((typeof(isOrderForm) !== 'undefined' && isOrderForm === 'T') || isNewProductSkin() === false || EC_MOBILE === true ? '' :'#totalProducts'); 25844 if (typeof CAFE24.SHOP_FRONT_PRODUCT_FUNDING === 'object' && CAFE24.SHOP_FRONT_PRODUCT_FUNDING.isFundingProduct() === true) { 25845 sContext = '.xans-product-funding'; 25846 quantity_id = '[id^="quantity_"]'; 25847 } 25848 // ìë ì¦ê° ë²í¼(ìµì ìë ìí) 25849 EC$(document).on({ 25850 click: function() { 25851 setQuantity('click', this); 25852 }, 25853 change: function() { 25854 setQuantity('change', this); 25855 } 25856 }, '.QuantityUp' + ',' + '.QuantityDown' + ',' + quantity_id+':not(.ec-debug)', sContext); 25857 } catch (e) {} 25858 25859 // ìµì ë°ì¤ ìë ì¦ê° ë²í¼ 25860 try { 25861 EC$(document).on({ 25862 click: function(e) { 25863 if (EC$(this).hasClass('eProductQuantityClass') === true) { 25864 return; 25865 } 25866 setOptionBoxQuantity('click', this); 25867 e.stopPropagation(); 25868 }, 25869 change: function(e) { 25870 e.preventDefault(); 25871 if (EC$(this).hasClass('single-quantity-input') === false && EC$(this).hasClass('eProductQuantityClass') === false) { 25872 return; 25873 } 25874 setOptionBoxQuantity('change', this); 25875 } 25876 }, '.eProductQuantityClass' + ',' + '.option_box_up' + ',' + '.option_box_down'); 25877 25878 EC$(document).on('click', 'a.eProductQuantityUpClass, a.eProductQuantityDownClass', function () { 25879 setOptionBoxQuantity('click', document.getElementById(EC$(this).data('target'))); 25880 }); 25881 } catch (e) {} 25882 25883 25884 // ìµì ë°ì¤ ì íìí ìì 25885 try { 25886 EC$(document).on('click', '#totalProducts a.delete', function () { 25887 EC$(this).find('.option_box_del').click(); 25888 }); 25889 EC$(document).on('click', '.option_box_del', function (event) { 25890 var oSelf = EC$(this); 25891 // onlyone ìµì ì ë í¸ ë°ì¤ ìë³µ 25892 var eSelectedItem = EC$('#' + oSelf.attr('id').replace('_del', '_id')); 25893 EC$('option[value="' + eSelectedItem.val() + '"]').parent().removeAttr('is_selected'); 25894 25895 if (CAFE24.checkChannelUI() === true) { 25896 oSelf.closest(".option_product").remove(); 25897 } else { 25898 oSelf.parents('tr,li').last().remove(); 25899 } 25900 25901 var sDelId = EC$(this).attr('id'); 25902 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isDisplayLayer(true) === true) { 25903 parent.EC$('option[value="' + eSelectedItem.val() + '"]').parent().removeAttr('is_selected'); 25904 parent.EC$('#' + sDelId + '').parents('tr,li').last().remove(); 25905 } 25906 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isExistLayer() === true) { 25907 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isDisplayLayer() === false) { 25908 EC$("#productOptionIframe").contents().find('option[value="' + eSelectedItem.val() + '"]').parent().removeAttr('is_selected'); 25909 EC$("#productOptionIframe").contents().find('#' + sDelId + '').parents('tr,li').last().remove(); 25910 } 25911 } 25912 25913 var sItemCode = NEWPRD_ADD_OPTION.getPerItemCode(eSelectedItem.data('option-index'), eSelectedItem.val()); 25914 FileOptionManager.remove('file_option_' + sItemCode); 25915 25916 if (EC_FRONT_JS_CONFIG_SHOP.bDirectBuyOrderForm === true) { 25917 CAFE24.SHOP_FRONT_ORDERFORM_DIRECTBUY.proc.deleteBasketProduct({ 25918 'item_code': eSelectedItem.val(), 25919 'opt_id': eSelectedItem.attr('data-option-id') 25920 }); 25921 } 25922 if (TotalAddSale.needRecalculatorSalePrice() === true) { 25923 oProductList = TotalAddSale.getProductList(); 25924 TotalAddSale.setSubscriptionParam(); 25925 // ìµì ìì í ì¬ê³ì° 25926 delete oProductList[eSelectedItem.val()]; 25927 25928 // ì íìµì ììì ajaxí¸ì¶ìí¨ 25929 if (EC$.isEmptyObject(oProductList)) { 25930 TotalAddSale.setParam('product', oProductList); 25931 TotalAddSale.setTotalAddSalePrice(0); 25932 setTotalData(); 25933 } else if (EC$('input.quantity_opt').length > 0) { 25934 TotalAddSale.setSoldOutFlag(false); 25935 TotalAddSale.setParam('product', oProductList); 25936 TotalAddSale.getCalculatorSalePrice(function () { 25937 setTotalData(); 25938 25939 // ì ë¦½ê¸ / í목ê¸ì¡ ê°±ì 25940 TotalAddSale.updatePrice(); 25941 }); 25942 } 25943 } else { 25944 setTotalData(); 25945 } 25946 25947 try { 25948 if (EC$('#NaverChk_Button').length > 0) { 25949 if (EC$('#NaverChk_Button').children().length < 1) { 25950 event.stopPropagation(); // ì´ë²¤í¸ ì í ì¤ë¨ 25951 return; 25952 } 25953 var iSoldOut = 0; 25954 EC$('.option_box_id, .soldout_option_box_id').each(function () { 25955 if (checkSoldOut(EC$(this).val()) === true) { 25956 iSoldOut++; 25957 } 25958 }); 25959 if (iSoldOut > 0) { 25960 EC$('#NaverChk_Button').css('display', 'none'); 25961 } else { 25962 EC$('#NaverChk_Button').css('display', 'block'); 25963 } 25964 } 25965 } catch (e) {} 25966 25967 event.stopPropagation(); 25968 }); 25969 } catch (e) {} 25970 25971 try { 25972 if (EC_MOBILE === true || EC_MOBILE_DEVICE === true) { 25973 EC$(document).on('click', '.differentialShipping > a', function() { 25974 EC$('.differentialShipping > .layerShipping').show(); 25975 return false;
25976 }); 25977 25978 EC$(document).on('click', '.layerShipping .btnClose', function() { 25979 EC$(this).parent().hide(); 25980 return false; 25981 }); 25982 } 25983 } catch (e) {} 25984 25985 // ì°¨ë± ë°°ì¡ë¹ ì¬ì©ì ToolTip ì´ê¸° 25986 try { 25987 EC$(document).on('click', '.btnTooltip > a', function () { 25988 EC$('.btnTooltip > .differentialShipping').show(); 25989 }); 25990 } catch (e) {} 25991 // ì°¨ë± ë°°ì¡ë¹ ì¬ì©ì ToolTip ë«ê¸° 25992 EC$('.btnTooltip > .differentialShipping a').off().click(function() { 25993 EC$('.btnTooltip > .differentialShipping').hide(); 25994 }); 25995 25996 // ì°¨ë± ë°°ì¡ë¹ ì¬ì©ì ToolTip ì´ê¸° (모ë°ì¼) 25997 EC$('.differentialShipping > .btnHelp').off().click(function() { 25998 EC$('.differentialShipping > .layerShipping').show(); 25999 }); 26000 // ì°¨ë± ë°°ì¡ë¹ ì¬ì©ì ToolTip ë«ê¸° (모ë°ì¼) 26001 EC$('.differentialShipping > .layerShipping > a').off().click(function() { 26002 EC$('.differentialShipping > .layerShipping').hide(); 26003 }); 26004 26005 try { 26006 // ì¶ê°ì ë ¥ìµì ê¸ì ê¸¸ì´ ì²´í¬ 26007 EC$(document).on('keyup', '.input_addoption',function() { 26008 var eSelf = EC$(this); 26009 var iLimit = eSelf.attr('maxlength'); 26010 addOptionWordWithObj(eSelf, eSelf.val(), iLimit); 26011 }); 26012 26013 EC$(document).on('blur', '.input_addoption',function() { 26014 EC$(this).siblings('.txt_help').remove(); 26015 EC$(this).parent('.ec-input-count').removeClass('error'); 26016 }); 26017 } catch (e) {} 26018 26019 EC$('ul.discountMember img.ec-front-product-show-benefit-icon').click(function() { 26020 26021 EC$('ul.discountMember li > div.discount_layer').hide(); 26022 26023 if (EC$(this).parent().parent().has('div.discount_layer').length == 0) { 26024 var sBenefitType = EC$(this).attr('benefit'); 26025 var oObj = EC$(this); 26026 var oHtml = EC$('<div>'); 26027 var iBenefitProductNo = EC$(this).attr('product-no'); 26028 oHtml.addClass('ec-base-tooltip discount_layer'); 26029 26030 //íìë±ê¸ê´ë¦¬ì ë±ê¸í ì¸ì¸ ê²½ì° classì¶ê° 26031 if (sBenefitType == 'MG') { 26032 oHtml.addClass('member_rating'); 26033 } 26034 26035 EC$(this).parent().parent().append(oHtml); 26036 EC$.post('/exec/front/Product/Benefitinfo', 'benefit_type='+sBenefitType+'&product_no=' + iBenefitProductNo, function(sHtml) { 26037 oHtml.html(sHtml); 26038 }); 26039 26040 } else { 26041 EC$(this).parent().parent().find('div.discount_layer').show(); 26042 } 26043 return false; 26044 }); 26045 26046 try { 26047 EC$(document).on('click', 'div.discount_layer .close', function () { 26048 EC$(this).parent().hide(); 26049 return false; 26050 }); 26051 } catch (e) {} 26052 26053 EC$('div.shippingFee a').click(function() { 26054 EC$('ul.discountMember li > div.discount_layer').hide(); 26055 EC$('ul.discountMember li > span.arrow').hide(); 26056 26057 if (EC$(this).parent().parent().has('div.ec-base-tooltip').length == 0) { 26058 var sBenefitType = EC$(this).attr('benefit'); 26059 var oObj = EC$(this); 26060 var oHtml = EC$('<div>'); 26061 oHtml.addClass('ec-base-tooltip'); 26062 oHtml.addClass('wrap'); 26063 26064 //íìë±ê¸ê´ë¦¬ì ë±ê¸í ì¸ì¸ ê²½ì° classì¶ê° 26065 if (sBenefitType == 'MG') { 26066 oHtml.addClass('member_rating'); 26067 } 26068 26069 EC$(this).parent().append(oHtml); 26070 EC$.post('/exec/front/Product/Benefitinfo', 'benefit_type=' + sBenefitType + '&product_no=' + iProductNo, function(sHtml) { 26071 oHtml.html(sHtml); 26072 }); 26073 } 26074 26075 EC$(this).parent().parent().find('div.ec-base-tooltip').show(); 26076 EC$(this).parent().parent().find('span.arrow').show(); 26077 return false; 26078 }); 26079 26080 try { 26081 EC$(document).on('click', '.ec-base-tooltip .close', function () { 26082 EC$(this).parent().hide(); 26083 EC$(this).parent().parent().find('span.arrow').hide(); 26084 EC$('.differentialShipping').hide(); 26085 return false; 26086 }); 26087 } catch (e) {} 26088 26089 var oMileageTooltipOrigin = $('#mileage_tooltip_origin'); 26090 var oMileageTooltipClone = oMileageTooltipOrigin.clone(); 26091 oMileageTooltipClone.attr('id', 'mileage_tooltip_clone').show(); 26092 oMileageTooltipOrigin.parents('td').append(oMileageTooltipClone); 26093 26094 // ì ë¦½ê¸ ìì¸í보기 26095 EC$('div.mileage_tooltip a').click(function() { 26096 26097 if (EC$(this).parent().parent().has('.ec-base-tooltip.mileage_layer').length === 0) {
26098 var oThis = EC$(this); 26099 var sParam = 'product_no=' + iProductNo; 26100 26101 EC$.post('/exec/front/Product/Mileageinfo', sParam, function(sHtml) { 26102 oThis.parent().append(sHtml); 26103 oThis.parent().parent().find('div.ec-base-tooltip').show(); 26104 }); 26105 } 26106 26107 EC$(this).parent().parent().find('div.ec-base-tooltip').show(); 26108 return false; 26109 }); 26110 26111 // ë¨ì¼ ìí íì ì¼ ê²½ì° ìë 0 ì¤ì 26112 if (EC_FRONT_JS_CONFIG_SHOP.bSoldout === true) { 26113 EC$(quantity_id).val(0); 26114 } 26115 26116 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_WMS.setStockStatus(iProductNo); 26117 26118 // 구매ìµì ë ì´ì´ ì¬ì©ê°ë¥ ì¬ë¶ ì¸í 26119 // Controllerìì íì¸íëë¡ ë°ê¿ê¹... 26120 CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.init(); 26121 // sms ì¬ì ê³ ì림 ë ì´ì´ íì ë ¸ì¶ì¬ë¶ íì¸ 26122 EC_SHOP_FRONT_PRODUCT_SMS_RESTOCK_LAYER.setCheckSmsRestockLayerPopup(); 26123 26124 // ë°ë¡êµ¬ë§¤ 주문ì ë¡ê·¸ì¸íì´ì§ë¡ ì´ë 26125 CAFE24.SHOP_FRONT_NEW_PRODUCT_DIRECT_BUY.setAccessRestriction(); 26126 26127 // ch_refê° ì¶ê°ì ë¬ 26128 try { TotalAddSale.setParam('ch_ref', CAFE24.getChRefData()); } catch (e) {} 26129 26130 // GE íì± ì íì´ì§ ë¡ë ìì ì ì¸ê¸/ê´ì¸ ìë´ ë¬¸êµ¬ ë¶ì°© 26131 // ìµì X ìí ëë ìµì 미ì í ìí(setProductTotalPrice 미í¸ì¶)ììë ë¶ì°©ëëë¡ í¸ë¦¬ê±° 26132 try { setGlobaleTaxPolicyText(); } catch (e) {} 26133}); 26134 26135/** 26136 * 모ë°ì¼ ìíìµì Layer ë«ê¸° 26137 * @param bIsOptionInit ìµì ì í ë ì´ì´ ë«ìë ì íë ìµì ì ë¶ëª¨ì°½ê³¼ ë기íí ê²ì¸ì§ ì¬ë¶ 26138 */ 26139function closeBuyLayer(bIsOptionInit) 26140{ 26141 if (bIsOptionInit !== false) { 26142 var iTotalOptCnt = EC$('select[id^="' + product_option_id + '"]').length; 26143 EC$('select[id^="' + product_option_id + '"]').each(function (i) { 26144 //ë 립íì ì´ë¯¸ ì íëì´ìë ìíì´ê¸°ë문ì Pass 26145 if (CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionType(this) === 'F') { 26146 return; 26147 } 26148 var sSelectOptionId = EC$(this).attr('id'); 26149 var sParentVal = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedValue(this); 26150 var oTarget = parent.EC$('#'+sSelectOptionId+''); 26151 parent.CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValue(oTarget, sParentVal); 26152 if (i < iTotalOptCnt - 1) { 26153 parent.EC$('#'+sSelectOptionId+'').trigger('change'); 26154 } 26155 }); 26156 26157 // @see ECHOSTING-419410 26158 // ë ì´ì´(iframe) ë´ë¶ì ì íë í목ì ë¶ëª¨ì°½ì¼ë¡ ì±í¬ 26159 var oSelectedItem = TotalAddSale.getProductList(); 26160 26161 if (Object.keys(oSelectedItem).length > 0) { 26162 EC$.each(oSelectedItem, function(sItemCode, iCount) { 26163 parent.TotalAddSale.setQuantity(sItemCode, iCount); 26164 }); 26165 } 26166 26167 // íì¼ì²¨ë¶ 리ì¤í¸ ë³µì¬ 26168 var eFileOption = EC$('[name^="file_option"]'); 26169 if (eFileOption.length > 0) { 26170 var sId = eFileOption.attr('id'); 26171 FileOptionManager.sync(sId, parent.EC$('ul#ul_' + sId)); 26172 } 26173 26174 // ì¶ê°ì ë ¥ ë³µì¬ 26175 var eAddOption = EC$('input.input_addoption'); 26176 eAddOption.each(function () { 26177 if (EC$(this).val() !== '') { 26178 parent.EC$('input#'+ EC$(this).attr('id')+ '[add_product_code="' + EC$(this).attr('add_product_code') + '"]').val(EC$(this).val()); 26179 } 26180 }); 26181 } 26182 parent.EC$('html, body').css({'overflowY': 'auto', height: 'auto', width: '100%'}); 26183 if (typeof(bIsOptionInit) === 'undefined') { 26184 parent.EC$('#opt_layer_window').remove(); 26185 } else { 26186 parent.EC$('#opt_layer_window').hide(); 26187 } 26188} 26189 26190 26191/** 26192 * ì íí ìµì íì ì¬ë¶ ì²´í¬ 26193 * @param sOptionId ìµì id 26194 * @returns íì ì¬ë¶ 26195 */ 26196function checkSoldOut(sOptionId) 26197{ 26198 var aStockData = CAFE24.UTIL.parseJSON(option_stock_data); 26199 var bSoldOut = false; 26200 26201 // get_stock_info 26202 if (aStockData[sOptionId] == undefined) { 26203 iStockNumber = -1; 26204 iOptionPrice = 0; 26205 bStock = false;
26206 sIsDisplay = 'T'; 26207 sIsSelling = 'T'; 26208 } else { 26209 iStockNumber = aStockData[sOptionId].stock_number; 26210 iOptionPrice = aStockData[sOptionId].option_price; 26211 bStock = aStockData[sOptionId].use_stock; 26212 sIsDisplay = aStockData[sOptionId].is_display; 26213 sIsSelling = aStockData[sOptionId].is_selling; 26214 } 26215 if (sIsSelling == 'F' || ((iStockNumber < buy_unit || iStockNumber <= 0) && (bStock === true || sIsDisplay == 'F'))) { 26216 bSoldOut = true; 26217 } 26218 return bSoldOut; 26219} 26220 26221 26222/** 26223 * ìµì ìë 구매ìë ì²´í¬ 26224 * @param sEventType ì´ë²¤í¸ íì 26225 * @param oObj Objectì ë³´ 26226 */ 26227function setQuantity(sEventType, oObj) 26228{ 26229 EC_SHOP_FRONT_DEBUG.log("fn - setQuantity"); 26230 26231 // ë¨ì¼ ìí íì ì¼ ê²½ì° ìë ê³ì° íì§ ìì. 26232 if (EC_FRONT_JS_CONFIG_SHOP.bSoldout === true) { 26233 return; 26234 } 26235 26236 var $oQuantityElement = EC$(quantity_id); 26237 if (EC$('.EC-funding-checkbox').length > 0) { 26238 $oQuantityElement = EC$(oObj).closest('.xans-product-funding').find('input.quantity'); 26239 } 26240 var iQuantity = parseInt($oQuantityElement.val(),10); 26241 var iBuyUnit = parseInt(buy_unit); 26242 var iProductMin = CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getProductMinQuantity(); 26243 26244 if (sEventType == 'click') { 26245 var iProductCustom = EC$('#product_custom').val(); 26246 var sQuantityClass = '.' + oObj.className; 26247 if (sQuantityClass.indexOf('.QuantityUp') >= 0 || EC$(oObj).hasClass('QuantityUp') || EC$(oObj).hasClass('up')) { 26248 iQuantity = iQuantity + iBuyUnit; 26249 } else if (sQuantityClass.indexOf('.QuantityDown') >= 0 || EC$(oObj).hasClass('QuantityDown') || EC$(oObj).hasClass('down')) { 26250 iQuantity = iQuantity - iBuyUnit; 26251 } 26252 } 26253 26254 // [ECHOSTING-604271] ì¬ê³ ìëê³¼ ìµë주문ìë ì¤ ìì ê°ì¼ë¡ ë³´ì 26255 var iMaxQuantity = (product_max > 0) ? parseInt(product_max, 10) : 0; 26256 if (typeof single_option_stock_data !== 'undefined') { 26257 var aSingleStock = CAFE24.UTIL.parseJSON(single_option_stock_data); 26258 if (aSingleStock.use_stock === true && aSingleStock.use_soldout === 'T') { 26259 var iStock = parseInt(aSingleStock.stock_number, 10); 26260 iMaxQuantity = (iMaxQuantity > 0) ? Math.min(iMaxQuantity, iStock) : iStock; 26261 } 26262 } 26263 // 구매ë¨ì(buy_unit) ë³´ì 26264 if (iBuyUnit > 1) { 26265 iMaxQuantity = Math.floor(iMaxQuantity / iBuyUnit) * iBuyUnit; 26266 } 26267 if (iQuantity > iMaxQuantity && iMaxQuantity > 0) { 26268 alert(sprintf(__('ìµë 주문ìëì %sê° ì ëë¤.'), iMaxQuantity)); 26269 $oQuantityElement.val(iMaxQuantity); 26270 return; 26271 } 26272 26273 // ìµë 구매ìëê³¼ íë© ì í ìëì ë³ê°ë¡ ëìí´ì¼í¨ 26274 if (EC$('.EC-funding-checkbox').length > 0) { 26275 var iCompositionLimit = parseInt($oQuantityElement.attr('limit-quantity'), 10); 26276 if (iCompositionLimit > 0 && iQuantity > iCompositionLimit) { 26277 alert(sprintf(__('ìµë 주문ìëì %sê° ì ëë¤.'), iCompositionLimit)); 26278 $oQuantityElement.val(iCompositionLimit); 26279 return; 26280 } 26281 } 26282 26283 if (iQuantity < iProductMin) { 26284 alert(sprintf(__('ìµì 주문ìëì %sê° ì ëë¤.'), iProductMin)); 26285 $oQuantityElement.val(iProductMin); 26286 return; 26287 } 26288 26289 26290 $oQuantityElement.val(iQuantity); 26291 if (oSingleSelection.isItemSelectionTypeS() === true) { 26292 EC$('input.single-quantity-input[product-no='+iProductNo+']').val(iQuantity); 26293 } 26294 if (EC$('.EC-funding-checkbox').length > 0) { 26295 var sCompositionCode = $oQuantityElement.attr('composition-code'); 26296 EC$('.selected-funding-item.option_box_price[composition-code="'+sCompositionCode+'"]').attr('quantity', iQuantity); 26297 } 26298 26299 setPrice(false, false, ''); 26300 26301 // ì´ ì£¼ë¬¸ê¸ì¡/ìë ì²ë¦¬ 26302 setTotalData(); 26303 26304 // 구ì¤í¨ì¸ê²½ì° í매ê¸ì¡ ê³ì° 26305 if (isNewProductSkin() === false) { 26306 setOldTotalPrice(); 26307 } 26308} 26309 26310/** 26311 * ìµì ë°ì¤ 구매ìë ì²´í¬ 26312 * @param sEventType ì´ë²¤í¸ë³ ìë ì²´í¬ 26313 * @param oObj Objectì ë³´ 26314 */ 26315function setOptionBoxQuantity(sEventType, oObj) 26316{ 26317 EC_SHOP_FRONT_DEBUG.log("fn - setOptionBoxQuantity"); 26318 26319 var sOptionId = '', sOptionBoxId = '', sProductPrice = ''; 26320 var iQuantity = 0; 26321 var iBuyUnit = CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getBuyUnitQuantity(); 26322 26323 if (sEventType == 'click') { 26324 // 구매ìë íì´íë¡ ì í 26325 var sType = EC$(oObj).attr('id').indexOf('_up') > 0 ? '_up' : '_down'; 26326 sOptionBoxId = '#' + EC$(oObj).attr('id').substr(0, EC$(oObj).attr('id').indexOf(sType)); 26327 iQuantity = parseInt(EC$(sOptionBoxId + '_quantity').val(), 10); 26328 sOptionId = EC$(sOptionBoxId + '_id').val(); 26329 if (sType == '_up') { 26330 iQuantity = iQuantity + iBuyUnit; 26331 } else if (sType == '_down') { 26332 iQuantity = iQuantity - iBuyUnit; 26333 } 26334 } else if (sEventType == 'change') { 26335 // 구매ìë ì§ì ì ë ¥ 26336 sOptionBoxId = '#' + EC$(oObj).attr('id').substr(0, EC$(oObj).attr('id').indexOf('_quantity')); 26337 iQuantity = parseInt(EC$(oObj).val(), 10); 26338 sOptionId = EC$(sOptionBoxId + '_id').val(); 26339 } 26340 // ìµì 구매 ìë ì²´í¬ 26341 var iProductMin = CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getProductMinQuantity(); 26342 26343 if (iQuantity < iProductMin) { 26344 alert(sprintf(__('ìµì 주문ìëì %sê° ì ëë¤.'), iProductMin)); 26345 iQuantity = iProductMin; 26346 EC$(oObj).val(iQuantity).blur(); 26347 return; 26348 } 26349 26350 if (iQuantity > product_max && product_max > 0) { 26351 alert(sprintf(__('ìµë 주문ìëì %sê° ì ëë¤.'), product_max)); 26352 iQuantity = product_max; 26353 EC$(oObj).val(iQuantity).blur(); 26354 return; 26355 } 26356 var aStockData = CAFE24.UTIL.parseJSON(option_stock_data); 26357 var iOptionPrice = 0; 26358 var iTotalQuantity = iQuantity; 26359 var iStockNumber = 0; 26360 var bUseStock = ''; 26361 var bUseSoldOut = ''; 26362 var iAddOptionPrice = 0; // ì°ëí ìµì ì¸ ê²½ì° í매ê°ë¥¼ ì ì¸í ìµì ìì²´ì ë¶ì ê¸ì¡ì ë°ë¡ ë³´ê´íì 26363 26364 if (Olnk.isLinkageType(sOptionType) === true) { 26365 var sOptionIdTemp = ''; 26366 if (typeof CAFE24.FRONT_JS_CONFIG_SHOP === 'object' && CAFE24.FRONT_JS_CONFIG_SHOP.hasOwnProperty('product_service_type') && CAFE24.FRONT_JS_CONFIG_SHOP.product_service_type === 'reservation') { 26367 sOptionIdTemp = sOptionId; 26368 if (aStockData.hasOwnProperty(sOptionId) === false) { 26369 sOptionIdTemp = 'default'; 26370 } 26371 // ì¤ì ë¡ ê¸ì¡ì´ ì¤ìíê² ìëë¼ 0ì¸ì§ ìëì§ë§ íë¨íë©´ ë기 ë문ì 0.00ì intë¡ ìºì¤í íì¬ ë¹êµ 26372 if (parseInt(aStockData[sOptionIdTemp].stock_price, 10) !== 0) { 26373 iOptionPrice = parseFloat(aStockData[sOptionIdTemp].option_price); 26374 iAddOptionPrice = parseFloat(aStockData[sOptionIdTemp].option_price); 26375 } 26376 } else { 26377 var aOptionTmp = sOptionId.split('||'); 26378 var aOptionIdTmp = new Array; 26379 for (i = 0; i < aOptionTmp.length; i++) { 26380 if (aOptionTmp[i] !== '') { 26381 aOptionIdTmp = aOptionTmp[i].split('_'); 26382 if (/^\*+$/.test(aOptionIdTmp[0]) === false) { 26383 iOptionPrice = iOptionPrice + parseFloat(aStockData[aOptionIdTmp[0]].option_price); 26384 iAddOptionPrice = parseFloat(aStockData[aOptionIdTmp[0]].option_price); 26385 sOptionIdTemp = aOptionIdTmp[0]; 26386 } 26387 } 26388 } 26389 } 26390 26391 if ((Olnk.bAllSelectedOption === true || Olnk.getOptionPushbutton(EC$('#option_push_button')) === true) && sOptionIdTemp === '') { 26392 sOptionIdTemp = sProductCode; 26393 } 26394 26395 iOptionPrice = parseFloat(product_price) + iOptionPrice; 26396 26397 iStockNumber = parseInt(aStockData[sOptionIdTemp].stock_number); 26398 bUseStock = aStockData[sOptionIdTemp].use_stock; 26399 bUseSoldOut = aStockData[sOptionIdTemp].use_soldout; 26400 26401 26402 if (typeof CAFE24.FRONT_JS_CONFIG_SHOP === 'object' && CAFE24.FRONT_JS_CONFIG_SHOP.hasOwnProperty('product_service_type') && CAFE24.FRONT_JS_CONFIG_SHOP.product_service_type === 'reservation') { 26403 // ìì½íì íì¬ ì íë ìµì ê³¼ì ë¹êµë§ íì 26404 iTotalQuantity = iQuantity; 26405 } else { 26406 // iTotalQuantity ì°ëí ìµì ì ê²½ì° íì¬ ìµì ë°ì¤ì ëì´ ìë 모ë í목ì ì¬ê³ 를 ëí´ì¼ íë¤.(ì¶ê° 구ì±ìíì ê²½ì° ë°ë¡ ì²´í¬í¨) 26407 var sAddOptionBoxNum = ''; 26408 EC$('[name="quantity_opt[]"]').each(function() { 26409 sAddOptionBoxNum = EC$(this).attr('id').replace('quantity',''); 26410 if (EC$(this).attr('id').indexOf('add_') < 0 && EC$(oObj).attr('id').indexOf(sAddOptionBoxNum) < 0) { 26411 iTotalQuantity += parseInt(EC$(this).val()); 26412 } 26413 }); 26414 } 26415 26416 // ìµë ì¬ê³ ìë ì²´í¬
26417 if (bUseSoldOut === 'T' && bUseStock === true && iTotalQuantity > iStockNumber) { 26418 alert(sprintf(__('ì¬ê³ ìëì´ %sê° ì¡´ì¬í©ëë¤. ì¬ê³ ìë ì´íë¡ ì ë ¥í´ì£¼ì¸ì.'), iStockNumber)); 26419 EC$(oObj).val(iStockNumber); 26420 return; 26421 } 26422 } else { 26423 iStockNumber = parseInt(aStockData[sOptionId].stock_number); 26424 iOptionPrice = parseFloat(aStockData[sOptionId].option_price); 26425 } 26426 26427 if (oSingleSelection.isItemSelectionTypeS() === true) { 26428 var iProductNum = iProductNo; 26429 var iOptionSequence = 1; 26430 if (option_type === 'F') { 26431 if (CAFE24.checkChannelUI() === true) { 26432 iOptionSequence = EC$(oObj).parents('div.option_product').attr('target-key').split('|')[1]; 26433 } else { 26434 iOptionSequence = EC$(oObj).parents('tr.option_product').attr('target-key').split('|')[1]; 26435 } 26436 } 26437 EC$('input.single-quantity-input[product-no='+iProductNum+'][option-sequence='+iOptionSequence+']').val(iQuantity); 26438 } 26439 26440 iProductPrice = getProductPrice(iQuantity, iOptionPrice, sOptionId, null, function(iProductPrice) 26441 { 26442 var bIsValidBundleObject = typeof CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE === 'object'; 26443 var iProductNum = (has_option === 'T') ? EC$(sOptionBoxId + '_quantity').attr('product-no') : iProductNo; 26444 //1+N ìíì¼ ê²½ì° íëª©ë³ ê°ê²©ì ë³ê²½ëì§ ìì 26445 var iTotalPrice = (bIsValidBundleObject === true && CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.oBundleConfig.hasOwnProperty(iProductNum) === true) ? iOptionPrice : iOptionPrice * iQuantity; 26446 sProductPrice = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iTotalPrice); 26447 26448 // ECHOSTING-58174 26449 if (sIsDisplayNonmemberPrice == 'T') { 26450 sProductPrice = sNonmemberPrice; 26451 iProductPrice = 0; 26452 } 26453 26454 EC$(sOptionBoxId + '_quantity').val(iQuantity); 26455 EC$(sOptionBoxId + '_price').find('span').html(sProductPrice); 26456 EC$(sOptionBoxId + '_price').find('input').val(iProductPrice); 26457 26458 // ì ë¦½ê¸ ê³ì° 26459 if (typeof (mileage_val) !== 'undefined') { 26460 26461 var iStockPrice = 0; 26462 if (Olnk.isLinkageType(sOptionType) === true) { 26463 iStockPrice = iAddOptionPrice; 26464 } else if (typeof (aStockData[sOptionId].stock_price) !== 'undefined') { 26465 iStockPrice = aStockData[sOptionId].stock_price; 26466 } 26467 var mileage_price = TotalAddSale.getMileageGenerateCalc(sOptionId, iQuantity); 26468 26469 if (EC_MOBILE === true || EC_MOBILE_DEVICE === true) { 26470 EC$(sOptionBoxId + '_mileage').html(CAFE24.SHOP_PRICE_FORMAT.toShopMileagePrice(mileage_price)); 26471 } else { 26472 if (mileage_price > 0) { 26473 EC$(sOptionBoxId + '_mileage').html(CAFE24.SHOP_PRICE_FORMAT.toShopMileagePrice(mileage_price)); 26474 } 26475 } 26476 if (sIsDisplayNonmemberPrice == 'T') { 26477 EC$(sOptionBoxId + '_mileage').html(sNonmemberPrice); 26478 } 26479 } 26480 26481 // 구매ë ì´ì´ 26482 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isDisplayLayer(true) === true) { 26483 parent.EC$(sOptionBoxId + '_quantity').val(iQuantity); 26484 parent.EC$(sOptionBoxId + '_price').find('span').html(sProductPrice); 26485 parent.EC$(sOptionBoxId + '_price').find('input').val(iProductPrice); 26486 if (typeof (mileage_val) !== 'undefined') { 26487 parent.EC$(sOptionBoxId + '_mileage').html(CAFE24.SHOP_PRICE_FORMAT.toShopMileagePrice(mileage_price)); 26488 if (sIsDisplayNonmemberPrice == 'T') { 26489 parent.EC$(sOptionBoxId + '_mileage').html(sNonmemberPrice); 26490 } 26491 } 26492 } 26493 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isExistLayer() === true) { 26494 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isDisplayLayer() === false) { 26495 EC$("#productOptionIframe").contents().find(sOptionBoxId + '_quantity').val(iQuantity); 26496 EC$("#productOptionIframe").contents().find(sOptionBoxId + '_price').find('span').html(sProductPrice); 26497 EC$("#productOptionIframe").contents().find(sOptionBoxId + '_price').find('input').val(iProductPrice); 26498 } 26499 if (typeof (mileage_val) !== 'undefined') { 26500 EC$("#productOptionIframe").contents().find(sOptionBoxId + '_mileage').html(CAFE24.SHOP_PRICE_FORMAT.toShopMileagePrice(mileage_price)); 26501 if (sIsDisplayNonmemberPrice == 'T') { 26502 EC$("#productOptionIframe").contents().find(sOptionBoxId + '_mileage').html(sNonmemberPrice); 26503 } 26504 } 26505 } 26506 // ì´ ì£¼ë¬¸ê¸ì¡/ìë ì²ë¦¬ 26507 setTotalData(); 26508 26509 // ì ë¦½ê¸ / í목ê¸ì¡ ê°±ì (íì¬ í목 ì ì¸) 26510 TotalAddSale.updatePrice(sOptionBoxId, sOptionId); 26511 }); 26512} 26513 26514// ìë°ì¤í¬ë¦½í¸ number_format jsyoon 26515function number_format(str) 26516{ 26517 str += ''; 26518 26519 var objRegExp = new RegExp('(-?[0-9]+)([0-9]{3})'); 26520 26521 while (objRegExp.test(str)) { 26522 str = str.replace(objRegExp,'$1,$2'); 26523 } 26524 26525 return str; 26526} 26527 26528/** 26529 * ê°ê²©ê³ì° í í매ê°ì ë°ì 26530 * @param bInit ì´ê¸°ê°ì¬ë¶ 26531 * @param bOption ìµì ì íì¬ë¶ 26532 * @param sOptionId ë¨ë 구ì±íì¼ëë SelectBoxê° ì¬ë¬ê°ì´ë¯ë¡ ì íí OptionId íì 26533 */ 26534function setPrice(bInit, bOption, sOptionId) 26535{ 26536 EC_SHOP_FRONT_DEBUG.log("fn - setPrice"); 26537 26538 var sQuantityString = '(' + sprintf(__('%sê°'),0) + ')'; 26539 26540 // íë§¤ê° ëì²´ 문구ì ê°ê²© ê³ì° ìí¨ 26541 if (product_price_content == true) { 26542 if (sIsDisplayNonmemberPrice == 'T') { 26543 EC$('#totalProducts .total').html('<strong><em>'+sNonmemberPrice+'</em></strong> ' + sQuantityString + '</span>'); 26544 } 26545 return false;
26546 } 26547 26548 // ìµì ì´ ìë ê²½ì° ìë ì´ê¸°í 26549 if (has_option == 'F' && (isNaN(EC$(quantity_id).val()) === true || EC$(quantity_id).val() == '' || EC$(quantity_id).val().indexOf('.') > 0)) { 26550 EC$(quantity_id).val(product_min); 26551 } 26552 26553 if (bInit === true) { 26554 setProductPriceText(); 26555 } 26556 // ìµì ì´ ìì ê²½ì° 26557 if (has_option == 'F') { 26558 setPriceHasOptionF(); 26559 } else if (has_option == 'T') { 26560 if (typeof sOptionType !== 'undefined' && Olnk.isLinkageType(sOptionType) === false) { 26561 setPriceHasOptionT(bOption, sOptionId); 26562 } else { 26563 if (Olnk.getOptionPushbutton(EC$('#option_push_button')) === false) { 26564 iQuantity = CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getProductMinQuantity(); 26565 if (oSingleSelection.isItemSelectionTypeS() === true) { 26566 iQuantity = PRODUCTSUBMIT.getQuantity(); 26567 Olnk.bAllSelectedOption = true; 26568 } 26569 if (EC$('.EC-funding-checkbox').length > 0) { 26570 var sCompositionCode = EC$(CAFE24.SHOP_FRONT_NEW_OPTION_BIND.oOptionObject).attr('composition-code'); 26571 if (CAFE24.SHOP_FRONT_NEW_OPTION_BIND.oOptionObject === null) { 26572 sCompositionCode = CAFE24.SHOP_FRONT_PRODUCT_FUNDING.sCurrentCompositionCode; 26573 } 26574 sSelector = EC$('#quantity_'+sCompositionCode); 26575 iQuantity = PRODUCTSUBMIT.getQuantity(sSelector); 26576 //Olnk.bAllSelectedOption = true; 26577 } 26578 Olnk.handleTotalPrice(option_stock_data, product_price, sIsDisplayNonmemberPrice,false, iQuantity); 26579 26580 // ì ë¦½ê¸ / í목ê¸ì¡ ê°±ì 26581 TotalAddSale.updatePrice(); 26582 } 26583 } 26584 } 26585 26586 // ì ë¦½ê¸ ì²ë¦¬ 26587 setMileage(bInit); 26588} 26589 26590/** 26591 * 모ë°ì¼ í ì¸ê° ê³ì° í ë¦¬í´ 26592*/ 26593function getMobileDcPrice(iPrice) { 26594 26595 var iReturnMobileDcPrice = 0; 26596 var iTmpBasePrice = 0; 26597 var iPer = 0; 26598 26599 // ì ì¨ í ì¸ì¼ ê²½ì° 26600 if (sc_mobile_dc_value_flag == 'P') { 26601 iPer = sc_mobile_dc_value * 0.01; 26602 iTmpBasePrice = iPrice * iPer; 26603 iTmpBasePrice = getMobileDcLimitPrice(iTmpBasePrice);
26604 iReturnMobileDcPrice = Math.ceil(iPrice - iTmpBasePrice); 26605 } 26606 // ê¸ì¡ í ì¸ì¼ ê²½ì° 26607 else { 26608 iReturnMobileDcPrice = iPrice - sc_mobile_dc_value; 26609 } 26610 26611 return iReturnMobileDcPrice; 26612} 26613 26614/** 26615 * 모ë°ì¼ í ì¸ê° ê¸ì¡ ì ì¬ í ë¦¬í´ 26616 * 26617*/ 26618function getMobileDcLimitPrice(MobileDcPrice) { 26619 26620 var iFloat = 0; 26621 var iOpp = 0; 26622 26623 switch (sc_mobile_dc_limit_value) { 26624 26625 // ì ì¬ ìí¨ 26626 case "F" : return MobileDcPrice; break; 26627 26628 // ìë¨ì ì ì¬ 26629 case "O" : 26630 iFloat = 0.1; 26631 iOpp = 10; 26632 break; 26633 26634 // ììë¨ì ì ì¬ 26635 case "T" : 26636 iFloat = 0.01; 26637 iOpp = 100; 26638 break; 26639 26640 // ë°±ìë¨ì ì ì¬ 26641 case "M" : 26642 iFloat = 0.001; 26643 iOpp = 1000; 26644 break; 26645 } 26646 26647 MobileDcPrice = MobileDcPrice * iFloat; 26648 26649 // ë°ì¬ë¦¼ì¸ì§ ë´ë¦¼ì¸ì§ 26650 if (sc_mobile_dc_limit_flag == 'L') { MobileDcPrice = Math.floor(MobileDcPrice) * iOpp; } 26651 else if (sc_mobile_dc_limit_flag == 'U') { MobileDcPrice = Math.round(MobileDcPrice) * iOpp; } 26652 26653 return MobileDcPrice; 26654} 26655/** 26656 * ì ë¦½ê¸ ê³ì° í ë°ì 26657 */ 26658function setMileage(bInit) 26659{ 26660 if (bInit === true && (EC_MOBILE === true || EC_MOBILE_DEVICE === true)) { 26661 if (sIsDisplayNonmemberPrice == 'T') { 26662 EC$('#span_mileage_text').html(sNonmemberPrice); 26663 } 26664 } 26665 26666} 26667 26668/** 26669 * ì¸ì´ìë ì¤í¬ë© í기 26670 * @param sMallId 몰ìì´ë 26671 * @param iPrdNo ìíë²í¸ 26672 * @param iCateNo ì¹´í ë²í¸ 26673 * @param iSid ì¹ì¸ë²í¸ 26674 * @author ê¹ì±ì£¼ <[email protected]> 26675 */ 26676function cyConnect(sMallId, iPrdNo, iCateNo, iSid) 26677{ 26678 return; 26679} 26680 26681/** 26682 * ì¸ì´ìë ì¤í¬ë© ì¤ëª ë³´ì¬ì£¼ê¸° 26683 * @author ê¹ì±ì£¼ <[email protected]> 26684 */ 26685function openNateInfo(num) 26686{ 26687 if (num == "1") { 26688 document.getElementById('divNate').style.display="none"; 26689 } else { 26690 document.getElementById('divNate').style.display=""; 26691 } 26692} 26693 26694/** 26695 * íë§¤ê° íìì¤ì 26696 */ 26697function setProductPriceText() 26698{ 26699 var sString = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(product_price); 26700 if (typeof product_price_ref !== 'undefined' && product_price_ref > 0) { 26701 // íí ë ¸ì¶ ìì ì¤ì ECHOSTING-56540 26702 if (currency_disp_type == 'P') { 26703 sString += ' ' + txt_product_price_ref; 26704 } else { 26705 sString = txt_product_price_ref + ' ' + sString; 26706 } 26707 } 26708 // ECHOSTING-58174 26709 if (sIsDisplayNonmemberPrice == 'T') { 26710 sString = sNonmemberPrice; 26711 } 26712 26713 // ECHOSTING-67418 구ìíì¼ëë íë§¤ê° ììì´ ë°ëê² ì²ë¦¬ (ì´ê¸°íì ìµì 구매ìë ê°ìì ë§ê² ë ¸ì¶) 26714 if (isNewProductSkin() === false && sIsDisplayNonmemberPrice !== 'T') { 26715 iPrice = getProductPrice(product_min, product_price, null, null, function(iPrice) { 26716 sString = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iPrice); 26717 EC$('#span_product_price_text').html(sString); 26718 }); 26719 } else { 26720 EC$('#span_product_price_text').html(sString); 26721 } 26722 var sMobileClass = ''; 26723 if (EC_MOBILE === true || EC_MOBILE_DEVICE === true) { 26724 sMobileClass = ' class = "price"'; 26725 } 26726 var sTotalPriceSelector = oSingleSelection.getTotalPriceSelector(); 26727 var sQuantityString = '('+sprintf(__('%sê°'),0)+')'; 26728 if (CAFE24.checkChannelUI() === true) { 26729 sQuantityString = ''; 26730 } 26731 if (oSingleSelection.isItemSelectionTypeS() === true) { 26732 var sStrPrice = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(0); 26733 26734 EC$(sTotalPriceSelector).html('<strong'+sMobileClass+'><em>'+sStrPrice+'</em></strong> '+sQuantityString+'</span>'); 26735 setTotalPriceRef(0, sQuantityString); 26736 } 26737 26738 // ECHOSTING-58174 26739 if (sIsDisplayNonmemberPrice == 'T') { 26740 if (sNonmemberPrice === "") { 26741 sNonmemberPrice = "-"; 26742 } 26743 EC$(sTotalPriceSelector).html('<strong'+sMobileClass+'><em>'+sNonmemberPrice+'</em></strong> ' + sQuantityString + '</span>'); 26744 } 26745 ReferenceCurrencyPrice.init(); 26746 26747} 26748 26749/** 26750 * ì ì²´ ê¸ì¡ ë¦¬í´ 26751 * @returns {Number} 26752 */ 26753function getTotalPrice() 26754{ 26755 var iTotalPrice = 0; 26756 EC$('.option_box_price').each(function() { 26757 iTotalPrice += parseInt(EC$(this).val()); 26758 }); 26759 26760 return iTotalPrice; 26761} 26762 26763/** 26764 * ê¸ì¡ì¤ì (ìµì ì´ ìë ê²½ì°) 26765 */ 26766function setPriceHasOptionF() 26767{ 26768 if (EC$('#totalProducts').length === 0) { 26769 return; 26770 } 26771 try { 26772 iQuantity = parseInt(EC$(quantity_id).val().replace(/^[\s]+|[\s]+$/g,'').match(/[\d\-]+/),10); 26773 } catch (e) {} 26774 var iMaxCnt = 2147483647; 26775 if (iQuantity > iMaxCnt) { 26776 EC$(quantity_id).val(iMaxCnt); 26777 iQuantity = iMaxCnt; 26778 } 26779 // 모ë°ì¼ í ì¸ê° ì¶ê°. 26780 if (typeof (EC$('#span_product_price_mobile_text')) !== 'undefined') { 26781 try { 26782 var iPriceMobile = parseFloat(product_price_mobile,10); 26783 } 26784 catch (e) { var iPriceMobile = product_price; } 26785 } 26786 TotalAddSale.setParam('ch_ref', CAFE24.getChRefData()); 26787 var iTotalPrice = getProductPrice(iQuantity, product_price, item_code, null, function(iTotalPrice) { 26788 var sTotalOriginPrice = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iTotalPrice); 26789 var iTotalOriginPrice = iTotalPrice; 26790 26791 var sItemCode = EC$('.option_box_price').attr('item_code'); 26792 sItemCode = (typeof(sItemCode) === 'undefined') ? item_code : sItemCode; 26793 iVatSubTotalPrice = TotalAddSale.getVatSubTotalPrice(sItemCode); 26794 26795 if (iVatSubTotalPrice != iTotalPrice && iVatSubTotalPrice != 0 && iTotalPrice != 0) { 26796 iTotalPrice = iVatSubTotalPrice; 26797 } 26798 26799 var sTotalPrice = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iTotalPrice); 26800 var sTotalSalePrice = sTotalPrice; 26801 iTotalAddSalePrice = TotalAddSale.getTotalAddSalePrice(); 26802 if (typeof(iTotalAddSalePrice) !== 'undefined' && iTotalAddSalePrice != 0) { 26803 iTotalSalePrice = iTotalPrice - parseFloat(iTotalAddSalePrice,
2680310); 26804 sTotalSalePrice = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iTotalSalePrice); 26805 } else { 26806 iTotalSalePrice = iTotalPrice; 26807 } 26808 26809 if (typeof CAFE24.SHOP_FRONT_PRODUCT_FUNDING === 'object' && CAFE24.SHOP_FRONT_PRODUCT_FUNDING.isFundingProduct() === true) { 26810 if (CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_FUNDING.sCurrentCompositionCode === null) { 26811 return true; 26812 } 26813 } 26814 //ìµì ì´ ìë ìíì´ê³ ì¶ê°êµ¬ì±ìí ì¶ê°ì ìëì²ë¦¬ ë° ìíê¸ì¡ ì²ë¦¬ 26815 var iAddQuantity = 0; 26816 if (EC$('.add_product_option_box_price').length > 0) { 26817 EC$('.quantity_opt').each(function() { 26818 iAddQuantity += parseFloat(EC$(this).val()); 26819 }); 26820 26821 sTotalSalePrice = getAddProductExistTotalSalePrice(iTotalSalePrice); 26822 } 26823 var iTotalQuantity = iQuantity + iAddQuantity; 26824 26825 var sQuantityString = '('+sprintf(__('%sê°'), iTotalQuantity) + ')'; 26826 // ECHOSTING-58174 26827 if (sIsDisplayNonmemberPrice == 'T') { 26828 sTotalOriginPrice = sNonmemberPrice; 26829 sTotalPrice = sNonmemberPrice; 26830 sTotalSalePrice = sNonmemberPrice; 26831 } 26832 26833 if (EC_MOBILE === true || EC_MOBILE_DEVICE === true || (typeof(isOrderForm) !== 'undefined' && isOrderForm === 'T')) { 26834 EC$(oSingleSelection.getTotalPriceSelector()).html('<strong class="price">'+sTotalSalePrice+' '+sQuantityString+'</strong>'); 26835 EC$('#quantity').html('<input type="hidden" name="option_box_price" class="option_box_price" value="'+iTotalOriginPrice+'" item_code="'+item_code+'">'); 26836 } else { 26837 EC$('#totalProducts .total').html('<strong><em>' + sTotalSalePrice + '</em></strong> ' + sQuantityString + '</span>'); 26838 26839 //í목 í ì¸ê° ë³´ì¬ì£¼ë ì¤ì ì¼ ê²½ì° í ì¸ê° ë ¸ì¶ 26840 var sDisplayPrice = sTotalOriginPrice; 26841 if (TotalAddSale.getIsUseSalePrice() === true) { 26842 //1+Nìíì í ì¸ê° ë³´ì¬ì£¼ì§ ìì 26843 sDisplayPrice = (TotalAddSale.getIsBundleProduct() === true) ? '' : sTotalSalePrice; 26844 sDisplayPrice = '<span class="ec-front-product-item-price" code="' + item_code + '" product-no="' + iProductNo + '">' + sDisplayPrice + '</span>'; 26845 } 26846 26847 EC$('#totalProducts').find('.quantity_price').addClass('notranslate').html(sDisplayPrice + '<input type="hidden" name="option_box_price" class="option_box_price" value="'+iTotalOriginPrice+'" item_code="'+item_code+'">'); 26848 if (typeof(mileage_val) !== 'undefined' && TotalAddSale.checkVaildMileageValue(mileage_val) === true) { 26849 var mileage_price = TotalAddSale.getMileageGenerateCalc(item_code, iQuantity); 26850 26851 if (sIsDisplayNonmemberPrice == 'T') { 26852 EC$('#totalProducts').find('.mileage_price').html(sNonmemberPrice); 26853 } else { 26854 EC$('#totalProducts').find('.mileage_price').html(CAFE24.SHOP_PRICE_FORMAT.toShopMileagePrice(mileage_price)); 26855 } 26856 } else { 26857 EC$('#totalProducts').find('.mileage').hide(); 26858 } 26859 } 26860 26861 if (typeof(iTotalAddSalePrice) !== 'undefined' && iTotalAddSalePrice != 0) { 26862 setTotalPriceRef(iTotalSalePrice, sQuantityString); 26863 } else { 26864 setTotalPriceRef(iTotalPrice, sQuantityString); 26865 } 26866 26867 if ((EC_MOBILE === true || EC_MOBILE_DEVICE === true) && EC$('.quantity_price').length > 0) { 26868 EC$('.quantity_price').html(sTotalSalePrice); 26869 } 26870 26871 // ì´ ì£¼ë¬¸ê¸ì¡/ìë ì²ë¦¬ 26872 setTotalData(); 26873 // ì ë¦½ê¸ / í목ê¸ì¡ ê°±ì 26874 TotalAddSale.updatePrice(); 26875 }); 26876} 26877 26878/** 26879 * ê¸ì¡ì¤ì (ìµì ì´ ìë ê²½ì°) 26880 * ë³µí©/ì¡°í© - ë¨ë /ì¼ì²´ 구ë¶ìì´ item_codeë§ì¼ë¡ ì²ë¦¬íëë¡ ë³ê²½ 26881 */ 26882function setPriceHasOptionT(bOption, sOptionId) 26883{ 26884 if (typeof(option_stock_data) === 'undefined') { 26885 return; 26886 } 26887 26888 if (sIsDisplayNonmemberPrice === 'T') { 26889 return; 26890 } 26891 26892 if (bOption !== true) { 26893 return; 26894 } 26895 26896 var sSelectElementId = sOptionId; 26897 var temp_product_option_id = product_option_id; 26898 26899 //ë´ìí+구ì¤í¨ : ìµì ì¶ê°ë²í¼ì ì´ì©í´ ì¶ê°ë ìµì select box id ìì¸ì²ë¦¬ 26900 if (sOptionId.split('_')[0] == 'add') { 26901 temp_product_option_id = sOptionId.split('_')[0]+'_'+sOptionId.split('_')[1]+'_'+temp_product_option_id; 26902 } 26903 if (typeof(EC$('#'+sSelectElementId).attr('composition-code')) !== 'undefined') { 26904 temp_product_option_id = temp_product_option_id+'_'+EC$('#'+sOptionId).attr('composition-code'); 26905 } 26906 26907 var sSoldoutDisplayText = CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_SOLDOUT.getSoldoutDiplayText(iProductNo); 26908 var aStockData = CAFE24.UTIL.parseJSON(option_stock_data); 26909 // bItemSelected : 모ë ì ë í¸ ë°ì¤ê° ì íëëì§ ì¬ë¶ 26910 var bItemSelected, bSoldOut = false;
26911 var sOptionId, sOptionText, sOptionPriceText = ''; 26912 var iPrice = 0; 26913 26914 var iBuyUnit = CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getBuyUnitQuantity('base'); 26915 var iProductMin = CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getProductMinQuantity(); 26916 var aOptionTitle = []; 26917 26918 var iQuantity = (iBuyUnit >= iProductMin ? iBuyUnit : iProductMin); 26919 // ì¡°í©êµ¬ì± & ë¶ë¦¬ì íí 26920 if (option_type == 'T' && item_listing_type == 'S') { 26921 var aOption = []; 26922 EC$('select[id^="' + temp_product_option_id + '"]').each(function() { 26923 var cVal = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedValue(this); 26924 aOption.push(cVal); 26925 26926 var sTmp = EC$(this).attr('option_title'); 26927 aOptionTitle.push({ key: sTmp, value: cVal }); 26928 }); 26929 26930 // ìì§ totalProductì Elementì¶ê°ê° ìëì getItemCode를 ì¬ì©í ì ìë¤. 26931 sOptionId = ITEM.getOldProductItemCode('[id^="'+temp_product_option_id+'"]'); 26932 sOptionValue = aOption.join('/'); 26933 sOptionText = aOption.join('#$%'); 26934 if (ITEM.isOptionSelected(aOption) === true) { 26935 bItemSelected = true; 26936 } 26937 26938 if (typeof(aStockData[sOptionId]) !== 'undefined' && aStockData[sOptionId].stock_price != 0) { 26939 if (typeof(product_option_price_display) === 'undefined' || product_option_price_display === 'T') { 26940 // ë¶ë¦¬ì ííì ì¶ê°ê¸ì¡ì sOptionTextì í¬í¨. sOptionPriceTextë ë¹ìëë¤(ë ë¤ ì±ì°ë©´ ì´ì¤ íì).
26941 sOptionText += '(' + getOptionPrice(aStockData[sOptionId].stock_price) + ')'; 26942 } 26943 } 26944 26945 var sWmsStockStatus = CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_WMS.getStockStatus(iProductNo, sOptionId); 26946 sOptionText += sWmsStockStatus; 26947 26948 if (bItemSelected === true && sOptionId === false) { 26949 alert(sprintf(__("ì ííì '%s' ìµì ì í매íì§ ìì ìµì ì ëë¤.\në¤ë¥¸ ìµì ì ì íí´ ì£¼ì¸ì."),sOptionValue)); 26950 return false; 26951 } 26952 } else { 26953 var sElementId = sOptionId; 26954 var oSelect = EC$('#'+sElementId); 26955 26956 if (oSelect.attr('is_selected') !== 'T') { 26957 sOptionText = EC$('#' + sOptionId + ' option:selected').text(); 26958 sOptionId = EC$('#' + sOptionId + ' option:selected').val(); 26959 bItemSelected = true; 26960 } else { 26961 if (isNewProductSkin() === true && NEWPRD_OPTION.isOptionSelectTitleOrDivider(CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedValue(oSelect)) !== true) { 26962 alert(__('PLEASE.DELETE.THE.OPTION', 'SHOP.JS.FRONT.NEW.PRODUCT.INFO')); 26963 NEWPRD_OPTION.resetSelectElement(oSelect); 26964 return false; 26965 } 26966 sOptionId = '*'; 26967 } 26968 26969 // ë 립ì íí ìµì ë³ë¡ íê°ì© ì íì 26970 if (oSingleSelection.isItemSelectionTypeM() === true && typeof(is_onlyone) === 'string' && is_onlyone === 'T' && isNewProductSkin() === true) { 26971 26972 if (NEWPRD_OPTION.isOptionSelectTitleOrDivider(oSelect.val()) !== true) { 26973 EC$('#'+sElementId).attr('is_selected','T'); 26974 } 26975 } 26976 26977 if (ITEM.isOptionSelected(sOptionId) === false) { 26978 bItemSelected = false; 26979 } 26980 } 26981 26982 26983 if (checkOptionBox(sOptionId) === true) { 26984 NEWPRD_OPTION.resetSelectElement(oSelect); 26985 return false; 26986 } 26987 26988 // get_stock_info 26989 if (aStockData[sOptionId] == undefined) { 26990 iStockNumber = -1; 26991 iOptionPrice = 0; 26992 bStock = false; 26993 sIsDisplay = 'T'; 26994 sIsSelling = 'T'; 26995 sIsReserveStat = 'N'; 26996 } else { 26997 iStockNumber = aStockData[sOptionId].stock_number; 26998 iOptionPrice = aStockData[sOptionId].option_price; 26999 bStock = aStockData[sOptionId].use_stock; 27000 sIsDisplay = aStockData[sOptionId].is_display; 27001 sIsSelling = aStockData[sOptionId].is_selling; 27002 sIsReserveStat = aStockData[sOptionId].is_reserve_stat; //ì´ê±´ ì´ëì 27003 } 27004 27005 if (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isItemCode(sOptionId) === true && typeof CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.oBundleConfig[iProductNo] === 'object') { 27006 iOptionPrice = aStockData[sOptionId].option_price - aStockData[sOptionId].stock_price; 27007 } 27008 if (sIsSelling == 'F' || ((iStockNumber < iBuyUnit || iStockNumber <= 0) && (bStock === true || sIsDisplay == 'F'))) { 27009 //ë´ìí+구ì¤ë ì¤í¨ (ìµì ì¶ê° ë²í¼ëì¤ë ëìì¸ - ìµì ì íì ì¬ê³ ì²´í¬) 27010 if (EC$('#totalProducts').length <= 0) { 27011 var aOptionName = new Array(); 27012 var aOptionText = new Array(); 27013 27014 aOptionName = option_name_mapper.split('#$%'); 27015 aOptionText = sOptionText.split('#$%'); 27016 for (var i = 0; i < aOptionName.length; i++) { 27017 aOptionText[i] = aOptionName[i]+':'+aOptionText[i]; 27018 } 27019 option_text = aOptionText.join('\n'); 27020 alert(__('ì´ ìíì íì¬ ì¬ê³ ê° ë¶ì¡±íì¬ íë§¤ê° ì ì ì¤ë¨ëê³ ììµëë¤.') + '\n\n' + __('ì íëª ') + ' : ' + product_name + '\n\n' + __('ì¬ê³ ìë ì íìµì ') + ' : \n' + option_text); 27021 CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValue(EC$('#' + sSelectElementId), '*'); 27022 } 27023 bSoldOut = true; 27024 sOptionText = sOptionText.split('#$%').join('/').replace('['+sSoldoutDisplayText+']', '') + ' <span class="soldOut">['+sSoldoutDisplayText+']</span>'; 27025 } else { 27026 sOptionText = sOptionText.split('#$%').join('/'); 27027 } 27028 27029 if (typeof(EC$('#'+sSelectElementId).attr('composition-code')) !== 'undefined') { 27030 iQuantity = PRODUCTSUBMIT.getQuantity(EC$('.xans-product-funding').find('#quantity_'+EC$('#'+sSelectElementId).attr('composition-code'))); 27031 } 27032 //ìì½ì£¼ë¬¸|ë¹ì¼ë°ì¡ 27033 if (aStockData[sOptionId] !== undefined) { 27034 if (aReserveStockMessage['show_stock_message'] === 'T' && sIsReserveStat !== 'N') { 27035 var sReserveStockMessage = '';
27036 bSoldOut = false; //íì ì¬ì© ìí¨ 27037 27038 sReserveStockMessage = aReserveStockMessage[sIsReserveStat]; 27039 sReserveStockMessage = sReserveStockMessage.replace(aReserveStockMessage['stock_message_replace_name'], iStockNumber); 27040 sReserveStockMessage = sReserveStockMessage.replace('[:PRODUCT_STOCK:]', iStockNumber); 27041 27042 sOptionText = sOptionText.replace(sReserveStockMessage, '') + ' <span class="soldOut">'+sReserveStockMessage+'</span>'; 27043 } 27044 } 27045 27046 if (oSingleSelection.isItemSelectionTypeS() === true) { 27047 iQuantity = PRODUCTSUBMIT.getQuantity(); 27048 if (option_type === 'F') { 27049 var iOptionSequence = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSortNum(oSelect); 27050 iQuantity = PRODUCTSUBMIT.getQuantity(EC$('[product-no='+iProductNo+'][option-sequence='+iOptionSequence+']')); 27051 } 27052 } 27053 27054 iPrice = getProductPrice(iQuantity, iOptionPrice, sOptionId, bSoldOut, function(iPrice) { 27055 // ìµì ë°ì¤ í¸ì¶ 27056 if (bItemSelected === true) { 27057 // 구ìíì¤í¨ì¼ëë ìµì ë°ì¤ í¸ì¶ìí¨ 27058 if (isNewProductSkin() === false) { 27059 if (sIsDisplayNonmemberPrice == 'T') { 27060 EC$('#span_product_price_text').html(sNonmemberPrice); 27061 } else { 27062 EC$('#span_product_price_text').html(CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iPrice)); 27063 } 27064 } else { 27065 setOptionBox(sOptionId, sOptionText, iPrice, bSoldOut, sSelectElementId, sIsReserveStat, iQuantity, aOptionTitle, sSoldoutDisplayText, sOptionPriceText); 27066 } 27067 27068 if (typeof CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_DIRECT_BASKET !== 'undefined') { 27069 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_DIRECT_BASKET.bIsLoadedPriceAjax = true; 27070 } 27071 } 27072 }); 27073} 27074 27075/** 27076 * ìµì ì¬ì©ê°ë¥ ì²´í¬ 27077 */ 27078function checkOptionBox(sOptionId) 27079{ 27080 if (oSingleSelection.isItemSelectionTypeS() === true) { 27081 return false; 27082 } 27083 if (typeof CAFE24.SHOP_FRONT_PRODUCT_FUNDING === 'object' && CAFE24.SHOP_FRONT_PRODUCT_FUNDING.isFundingProduct() === true) { 27084 return false; 27085 } 27086 27087 var bSelected = false; 27088 // ì´ë¯¸ ì íë ìµì ì ì무 ì²ë¦¬ë íì§ ìëë¡ ì²ë¦¬íë¤. 27089 EC$('.option_box_id').each(function(i) { 27090 if (EC$(this).val() == sOptionId) {
27091 bSelected = true; 27092 } 27093 }); 27094 27095 EC$('.soldout_option_box_id').each(function(i) { 27096 if (EC$(this).val() == sOptionId) { 27097 bSelected = true; 27098 } 27099 }); 27100 if (bSelected === true) { 27101 alert(__('PLEASE.DELETE.THE.OPTION', 'SHOP.JS.FRONT.NEW.PRODUCT.INFO')); 27102 } 27103 return bSelected; 27104} 27105 27106/* 27107 * ìµì ì í ë°ì¤ ì¤ì 27108 * @todo totalproduct id를 컨í¸ë¡¤ë¬ë¡ ë°ì´ì¼í¨ 27109 */ 27110function setOptionBox(sItemCode, sOptionText, iPrice, bSoldOut, sSelectElementId, sIsReserveStat, iManualQuantity, aOptionTitle, sSoldoutDisplayText, sOptionPriceText) 27111{ 27112 EC_SHOP_FRONT_DEBUG.log("fn - setOptionBox"); 27113 27114 if (CAFE24.checkChannelUI() === true) { 27115 setOptionBoxDiv(sItemCode, sOptionText, iPrice, bSoldOut, sSelectElementId, sIsReserveStat, iManualQuantity, aOptionTitle, sSoldoutDisplayText, sOptionPriceText); 27116 return; 27117 } 27118 27119 const oBoxBuilder = CAFE24.SHOP_FRONT_NEW_OPTION_BOX; 27120 27121 // Pipeline stages 1-3 27122 const optionBoxState = oBoxBuilder.validateAndPrepare({ 27123 sItemCode, sOptionText, iPrice, bSoldOut, sSelectElementId, 27124 sIsReserveStat, iManualQuantity, aOptionTitle, sSoldoutDisplayText, sOptionPriceText 27125 }); 27126 if (optionBoxState === null) return false; 27127 oBoxBuilder.computePricing(optionBoxState); 27128 oBoxBuilder.computeMeta(optionBoxState); 27129 27130 optionBoxState.sTableRow = `<tr class="option_product ${optionBoxState.sDisplayOption}" data-option-index="${optionBoxState.iIndex}" target-key="${optionBoxState.iTargetKey}">`; 27131 27132 // REFACTOR_BRANCH_START 27133 // Pipeline stage 4: device-specific row builder (Strategy í¨í´) 27134 optionBoxState.sTableRow = optionBoxState.bIsMobile 27135 ? oBoxBuilder.rowBuilders.mobile(optionBoxState) 27136 : oBoxBuilder.rowBuilders.pc(optionBoxState); 27137 // REFACTOR_BRANCH_END 27138 27139 // Pipeline stages 5-6 27140 oBoxBuilder.appendToTable(optionBoxState); 27141 oBoxBuilder.finalizeUpdates(optionBoxState); 27142} 27143 27144// REFACTOR_HELPERS_BEGIN 27145/** 27146 * ìµì ë°ì¤ ë¹ë â setOptionBox 모ë°ì¼/PC ë¶ê¸° ê³µíµ ë¡ì§ 모ë. 27147 * ìµì í ì¤í¸ë buildOptionTextLineì´ isMobile/isReservation ë íëê·¸ë¡ 4 ì¼ì´ì¤ë¥¼ íµí© ì²ë¦¬íë¤. 27148 */ 27149CAFE24.SHOP_FRONT_NEW_OPTION_BOX = { 27150 27151 /** 27152 * NaverChk_Button ì¨ê¹ ì²ë¦¬ (íì ë¶ê¸° ê³µíµ) 27153 */ 27154 hideNaverChkButton() { 27155 try { 27156 if (EC$('#NaverChk_Button').length > 0 && EC$('#NaverChk_Button').children().length > 0) { 27157 EC$('#NaverChk_Button').css('display', 'none'); 27158 } 27159 } catch (e) {} 27160 }, 27161 27162 /** 27163 * íì ìµì ë°ì¤ hidden input 27164 */ 27165 buildSoldoutHiddenInput(sOptionBoxId, sItemCode) { 27166 return `<input type="hidden" class="soldout_option_box_id" id="${sOptionBoxId}_id" value="${sItemCode}">`; 27167 }, 27168 27169 /** 27170 * ìµì ë°ì¤ ê°ê²© hidden input (ì ì ë¶ê¸° ê³µíµ) 27171 */ 27172 buildOptionPriceHiddenInput(iPrice, iProductNo, sItemCode) { 27173 return `<input type="hidden" class="option_box_price" value="${iPrice}" product-no="${iProductNo}" item_code="${sItemCode}">`; 27174 }, 27175 27176 /** 27177 * ë§ì¼ë¦¬ì§ ë°°ì§ (ì ì ë¶ê¸° ê³µíµ) 27178 */ 27179 buildMileageBadge(sOptionBoxId, sItemCode, sMileageIcon, sMileageAlt, sMileageVal) { 27180 return `<span class="mileage">(<img src="${sMileageIcon}" alt="${sMileageAlt}" /> <span id="${sOptionBoxId}_mileage" class="mileage_price" code="${sItemCode}">${sMileageVal}</span>)</span>`; 27181 }, 27182 27183 /** 27184 * ìì ìì´ì½ â mobile/pc 4ê° cellìì ëì¼ ë§í¬ì ì¼ë¡ ê³µì (sold-out/sold-in ì쪽). 27185 * ì¸ë¶ ë§í¬ì (`<a href="#none">` ëë `<a href="#none" class="delete">`, `<td>` ëí ì¬ë¶)ì í¸ì¶ 측 ì± ì. 27186 */ 27187 buildDeleteIcon(sOptionBoxId) { 27188 return `<img src="//img.echosting.cafe24.com/design/skin/default/product/btn_price_delete.gif" alt="ìì " id="${sOptionBoxId}_del" class="option_box_del" />`; 27189 }, 27190 27191 /** 27192 * ë§ì¼ë¦¬ì§ ì¹ì â bShowMileageê° trueì¼ ëë§ mileage badge ë§í¬ì ë°í, ìëë©´ ë¹ ë¬¸ìì´. 27193 * mobile sold-in / pc ë¶ê¸° ì쪽ìì ëì¼í conditional ë§í¬ì ì 캡ìííë wrapper. 27194 */ 27195 buildMileageSection(optionBoxState) { 27196 if (!optionBoxState.bShowMileage) return ''; 27197 return this.buildMileageBadge(optionBoxState.sOptionBoxId, optionBoxState.sItemCode, optionBoxState.sMileageIcon, optionBoxState.sMileageAlt, optionBoxState.sMileageVal); 27198 }, 27199 27200 /** 27201 * ìµì ë°ì¤ hidden input â ìì± ìì/공백 ë³´ì¡´ íì.
27202 * ì¬ì´ 공백: data-item-add-optionâreserved=0칸, reservedâoption-id=2칸, option-idâoption-index=2칸. 27203 * sIsReserveStat: ìì½ì£¼ë¬¸ ìíê°, ë´ë¶ìì data-item-reserved ìì± ë§í¬ì ì¼ë¡ ë³í. 27204 */ 27205 buildOptionBoxHiddenInput(sOptionBoxId, sItemCode, aAddOption, sIsReserveStat, sOptionId, iIndex) { 27206 // escape() ì¸ì½ë© í¬ë§· í¸í ì ì§ (encodeURIComponentì ê²°ê³¼ê° ë¤ë¦) 27207 const sEscapedAddOption = escape(aAddOption.join(NEWPRD_OPTION.DELIMITER_SEMICOLON)); // NOSONAR 27208 const sInputHiddenReserved = `data-item-reserved="${sIsReserveStat}" `; 27209 return `<input type="hidden" class="option_box_id" id="${sOptionBoxId}_id" value="${sItemCode}" name="item_code[]" data-item-add-option="${sEscapedAddOption}"${sInputHiddenReserved} data-option-id="${sOptionId}" data-option-index="${iIndex}">`; 27210 }, 27211 27212 /** 27213 * ìµì í ì¤í¸ ë¼ì¸. 모ë°ì¼/PC à ìì½/ë¹ìì½ 4 ì¼ì´ì¤ë¥¼ isMobile/isReservation íëê·¸ë¡ íµí©. 27214 */ 27215 buildOptionTextLine(sProductName, sAddOptionTitle, sOptionLabel, sOptionPriceText, isReservation, isMobile) { 27216 const sCombinedLabel = isReservation ? `${sOptionLabel}${sOptionPriceText}` : sOptionLabel; 27217 const sNamePart = isMobile ? `<strong>${sProductName}</strong>` : sProductName; 27218 const sSeparator = isReservation ? ' ' : ' - '; 27219 return `<p class="product">${sNamePart}<br />${sSeparator}<span>${sAddOptionTitle}${sCombinedLabel}</span> [#RESTOCK_BUTTON] </p>`; 27220 }, 27221 27222 /** 27223 * ì¶ê°ìµì í ì´ë¸ wrapper í¤ë (sHtml ë¶ê¸°). 모ë°ì¼/PC ì°¨ì´: colgroup width, í¤ë ë¼ë²¨, 모ë°ì¼ caption. 27224 */ 27225 buildAddOptionTableHeader(isMobile) { 27226 if (isMobile) { 27227 return '<td colspan="3">' + 27228 '<table summary="" border="1">' + 27229 '<caption>ìí 목ë¡</caption>' + 27230 '<colgroup>' + 27231 '<col style="width:auto;">' + 27232 '<col style="width:100px;">' + 27233 '<col style="width:35px;">' + 27234 '</colgroup>' + 27235 '<thead>' + 27236 '<tr>' + 27237 `<th scope="col">${__('ìí ì ë³´')}</th>` + 27238 `<th scope="col">${__('ê°ê²©')}</th>` + 27239 `<th scope="col">${__('ìì ')}</th>` + 27240 '</tr>' + 27241 '</thead>' + 27242 '<tbody><tr>'; 27243 } 27244 return '<td colspan="3">' + 27245 '<table>' + 27246 '<colgroup>' + 27247 '<col style="width:284px;">' + 27248 '<col style="width:80px;">' + 27249 '<col style="width:110px;">' + 27250 '</colgroup>' + 27251 '<thead>' + 27252 '<tr>' + 27253 `<th scope="col">${__('ìíëª ')}</th>` + 27254 `<th scope="col">${__('ìíì')}</th>` + 27255 `<th scope="col">${__('ê°ê²©')}</th>` + 27256 '</tr>' + 27257 '</thead>' + 27258 '<tbody><tr>'; 27259 }, 27260 27261 /** 27262 * ì¶ê°ìµì í ì´ë¸ wrapper í¸í° (sHtml ë¶ê¸°). inner tr ë«ì + sHtml + outer wrapper ë«ì. 27263 */ 27264 buildAddOptionTableFooter(sHtml) { 27265 return `</tr>${sHtml}</tbody></table></td>`; 27266 }, 27267 27268 /** 27269 * ì¶ê°ìµì í ì´ë¸ wrapper â sHtml ë¹ì´ìì¼ë©´ ë¹ ë¬¸ìì´, ìëë©´ header í¸ì¶. 27270 * mobile/pc rowBuilderì `if (sHtml) sTableRow += ...` ë¶ê¸° ì ê±°ì©. 27271 */ 27272 buildOptionalHeader(sHtml, isMobile) { 27273 return sHtml ? this.buildAddOptionTableHeader(isMobile) : ''; 27274 }, 27275 27276 /** 27277 * ì¶ê°ìµì í ì´ë¸ wrapper â sHtml ë¹ì´ìì¼ë©´ ë¹ ë¬¸ìì´, ìëë©´ footer í¸ì¶. 27278 */ 27279 buildOptionalFooter(sHtml) { 27280 return sHtml ? this.buildAddOptionTableFooter(sHtml) : ''; 27281 }, 27282 27283 // ============================================================ 27284 // Cell builders â rowBuilders.{mobile|pc}ì sold-out/sold-in ë¶ê¸° 본문ì 27285 // ë³ë ë©ìëë¡ ë¶ë¦¬íì¬ rowBuilders ì§ì ì ì ì¸ì§ì ë³µì¡ë를 ë®ì¶¤. 27286 // ê° ë©ìëë optionBoxState를 ë°ì í´ë¹ ë¶ê¸°ì ì ë§í¬ì (sTableRow ì¼ë¶) 문ìì´ë§ ë°í. 27287 // ë¶ìí¨ê³¼(hideNaverChkButton)ë sold-out cellsìì í¸ì¶, iframe appendë í¸ì¶ 측 mobileìì ì¸ë¼ì¸. 27288 // ============================================================ 27289 27290 /** 27291 * 모ë°ì¼ sold-out cells â option text td + quantity readonly + price + delete (3 cells). 27292 * ë¶ìí¨ê³¼: hideNaverChkButton í¸ì¶. 27293 */ 27294 buildMobileSoldOutCells(optionBoxState) { 27295 this.hideNaverChkButton(); 27296 const { sOptionBoxId, sItemCode, sOptionText, sStrPrice } = optionBoxState; 27297 let s = '<td>'; 27298 s += this.buildSoldoutHiddenInput(sOptionBoxId, sItemCode) + sOptionText; 27299 s += '<p><input type="number" readonly value="0"/> '; 27300 s += '<a href="#none" class="up"><img width="30" height="27" src="//img.echosting.cafe24.com/mobileWeb/common/btn_quantity_up.png"/></a> '; 27301 s += '<a href="#none" class="down"><img width="30" height="27" src="//img.echosting.cafe24.com/mobileWeb/common/btn_quantity_down.png"/></a></span></p></td>'; 27302 s += `<td class="right"><strong class="price">${sStrPrice}</strong></td>`;
27303 s += `<td class="center"><a href="#none">${this.buildDeleteIcon(sOptionBoxId)}</a></td>`; 27304 return s; 27305 }, 27306 27307 /** 27308 * 모ë°ì¼ sold-in cells â option text + quantity (id/value/data-target) + price (mileage í¬í¨) + delete (3 cells). 27309 * iProductNo ê¸ë¡ë² ì¬ì©. 27310 */ 27311 buildMobileSoldInCells(optionBoxState) { 27312 const { 27313 sOptionBoxId, sItemCode, aAddOption, sIsReserveStat, sOptionId, iIndex, 27314 sOptionText, sReadonly, iQuantity, iPrice, sStrPrice 27315 } = optionBoxState; 27316 let s = '<td>'; 27317 s += this.buildOptionBoxHiddenInput(sOptionBoxId, sItemCode, aAddOption, sIsReserveStat, sOptionId, iIndex) + sOptionText; 27318 s += `<p><input type="number" id="${sOptionBoxId}_quantity" name="quantity_opt[]" autocomplete="off" class="quantity_opt eProductQuantityClass" ${sReadonly} value="${iQuantity}" product-no="${iProductNo}"/> `; 27319 s += `<a href="#none" class="up eProductQuantityUpClass" data-target="${sOptionBoxId}_up"><img width="30" height="27" src="//img.echosting.cafe24.com/mobileWeb/common/btn_quantity_up.png" id="${sOptionBoxId}_up" class="option_box_up" alt="up" /></a> `; 27320 s += `<a href="#none" class="down eProductQuantityDownClass" data-target="${sOptionBoxId}_down"><img width="30" height="27" src="//img.echosting.cafe24.com/mobileWeb/common/btn_quantity_down.png" id="${sOptionBoxId}_down" class="option_box_down" alt="down" /></a></p></td>`; 27321 s += `<td class="right"><strong id="${sOptionBoxId}_price" class="price">${this.buildOptionPriceHiddenInput(iPrice, iProductNo, sItemCode)}<span class="ec-front-product-item-price" code="${sItemCode}" product-no="${iProductNo}">${sStrPrice}</span></strong>`; 27322 s += this.buildMileageSection(optionBoxState); 27323 s += '</td>'; 27324 s += `<td class="center"><a href="#none" class="delete">${this.buildDeleteIcon(sOptionBoxId)}</a></td>`; 27325 return s; 27326 }, 27327 27328 /** 27329 * PC sold-out cells â option text td + quantity wrapper td + price td-open. 27330 * ë¶ìí¨ê³¼: hideNaverChkButton í¸ì¶. 27331 * optionBoxState.sNoTranslateClass ì¬ì© (rowBuilder.pcìì ì¬ì ì¤ì ). 27332 * ë¹ëì¹: price `<td>` ë«ê¸°ë í¸ì¶ 측 íë¨(`</td></tr>`)ìì ìí. 27333 */ 27334 buildPcSoldOutCells(optionBoxState) { 27335 this.hideNaverChkButton(); 27336 const { sOptionBoxId, sItemCode, sOptionText, sReadonly, sStrPrice, sNoTranslateClass } = optionBoxState; 27337 let s = `<td>${this.buildSoldoutHiddenInput(sOptionBoxId, sItemCode)}${sOptionText}</td>`; 27338 s += '<td><span class="quantity" style="width:65px;">'; 27339 s += `<input type="text" ${sReadonly} value="0"/>`; 27340 s += '<a href="#none" class="up"><img src="//img.echosting.cafe24.com/design/skin/default/product/btn_count_up.gif" alt="ìëì¦ê°" /></a>'; 27341 s += '<a href="#none" class="down"><img src="//img.echosting.cafe24.com/design/skin/default/product/btn_count_down.gif" alt="ìëê°ì" /></a>'; 27342 s += '</span>'; 27343 s += `<a href="#none" class="delete">${this.buildDeleteIcon(sOptionBoxId)}</a></td>`; 27344 s += `<td class="right"><span id="${sOptionBoxId}_price"><span class="${sNoTranslateClass}">${sStrPrice}</span></span>`; 27345 return s; 27346 }, 27347 27348 /** 27349 * PC sold-in cells â option text td + quantity wrapper td + price td-open with hidden input. 27350 * iProductNo ê¸ë¡ë² ì¬ì©. optionBoxState.sNoTranslateClass ì¬ì©. 27351 * ìë up ë²í¼ ë§í¬ì ì ì´ì¤ ë°ì´í(`class="up eProductQuantityUpClass""`)ë 기존 ì¶ë ¥ í¸íì ìí´ ê·¸ëë¡ ëë¤. 27352 * ë¹ëì¹: price `<td>` ë«ê¸°ë í¸ì¶ 측 íë¨(`</td></tr>`)ìì ìí. 27353 */ 27354 buildPcSoldInCells(optionBoxState) { 27355 const { 27356 sOptionBoxId, sItemCode, aAddOption, sIsReserveStat, sOptionId, iIndex, 27357 sOptionText, sReadonly, iQuantity, iPrice, sStrPrice, sNoTranslateClass 27358 } = optionBoxState; 27359 let s = `<td>${this.buildOptionBoxHiddenInput(sOptionBoxId, sItemCode, aAddOption, sIsReserveStat, sOptionId, iIndex)}${sOptionText}</td>`; 27360 s += '<td>
27360<span class="quantity" style="width:65px;">'; 27361 s += `<input type="text" id="${sOptionBoxId}_quantity" name="quantity_opt[]" class="quantity_opt eProductQuantityClass" ${sReadonly} value="${iQuantity}" product-no="${iProductNo}"/>`; 27362 s += `<a href="#none" class="up eProductQuantityUpClass"" data-target="${sOptionBoxId}_up" ><img src="//img.echosting.cafe24.com/design/skin/default/product/btn_count_up.gif" id="${sOptionBoxId}_up" class="option_box_up" alt="ìëì¦ê°" /></a>`; 27363 s += `<a href="#none" class="down eProductQuantityDownClass" data-target="${sOptionBoxId}_down"><img src="//img.echosting.cafe24.com/design/skin/default/product/btn_count_down.gif" id="${sOptionBoxId}_down" class="option_box_down" alt="ìëê°ì" /></a>`; 27364 s += '</span>'; 27365 s += `<a href="#none" class="delete">${this.buildDeleteIcon(sOptionBoxId)}</a></td>`; 27366 s += `<td class="right"><span id="${sOptionBoxId}_price">`; 27367 s += this.buildOptionPriceHiddenInput(iPrice, iProductNo, sItemCode); 27368 s += `<span class="ec-front-product-item-price ${sNoTranslateClass}" code="${sItemCode}" product-no="${iProductNo}">${sStrPrice}</span></span>`; 27369 return s; 27370 }, 27371 27372 // ============================================================ 27373 // Pipeline stages â setOptionBox ì± ì ììì ë¨ì¼ ì± ì ë©ìëë¡ ë¶ë¦¬. 27374 // ëìì¸ í¨í´: Pipeline (ë¨ê³ë³ sequence) + Object as Context (DTO) 27375 // ê° stageë optionBoxState ê°ì²´ì 결과를 ëì íì¬ ë¤ì stageë¡ ì ë¬. 27376 // ============================================================ 27377 27378 /** 27379 * Pipeline stage 1: ì ë ¥ ê²ì¦ + ì¬ì ì¤ë¹ 27380 * - bIsAsyncOptionBox ê²°ì (parent iframe, option_type='F') 27381 * - checkAddOption / checkOptionBox ê²ì¦ 27382 * - sReadonly, iQuantity, sStrPrice ê²°ì 27383 * 27384 * @param {Object} oArgs setOptionBox ì§ì ì¸ì를 묶ì DTO (sItemCode, sOptionText, iPrice, 27385 * bSoldOut, sSelectElementId, sIsReserveStat, iManualQuantity, aOptionTitle, 27386 * sSoldoutDisplayText, sOptionPriceText) 27387 * @returns {Object|null} optionBoxState (ê²ì¦ íµê³¼) ëë null (ê²ì¦ ì¤í¨) 27388 */ 27389 validateAndPrepare(oArgs) {
27390 const { sItemCode, iPrice, sSelectElementId, iManualQuantity } = oArgs; 27391 const oSelect = EC$(`#${sSelectElementId}`); 27392 const bIsAsyncOptionBox = this.determineAsyncOptionBox(sSelectElementId, sItemCode); 27393 27394 // íì ì¶ê°ìµì ìì±ì¬ë¶ ê²ì¦ 27395 if (checkAddOption() !== true) { 27396 delete oProductList[sItemCode]; 27397 NEWPRD_ADD_OPTION.resetSelectElement(oSelect); 27398 // ë 립ì íí ìµì ë³ë¡ íê°ì© ì íì 27399 if (typeof(is_onlyone) === 'string' && is_onlyone === 'T' && isNewProductSkin() === true) { 27400 oSelect.removeAttr('is_selected'); 27401 } 27402 return null; 27403 } 27404 27405 if (checkOptionBox(sItemCode) === true) { 27406 NEWPRD_OPTION.resetSelectElement(oSelect); 27407 return null; 27408 } 27409 27410 const { sReadonly, iBuyUnit, iProductMin, iQuantity } = this.computeInitialQuantity(iManualQuantity); 27411 const sStrPrice = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iPrice); 27412 27413 return { 27414 // ì§ì ì¸ì (oArgs spread) 27415 ...oArgs, 27416 // Stage 1 ê²°ê³¼ 27417 sReadonly, 27418 oSelect, 27419 bIsAsyncOptionBox, 27420 iBuyUnit, 27421 iProductMin, 27422 sStrPrice, 27423 iQuantity 27424 }; 27425 }, 27426 27427 /** 27428 * Pipeline stage 1 helper â bIsAsyncOptionBox ê²°ì . 27429 * 모ë°ì¼ ìµì ì íë ì´ì´ / 미리보기 cors ìì¸ ì²ë¦¬ + option_type='F' ë¶ê¸°. 27430 * ë¶ìí¨ê³¼: parent iframeì none_create_option_box ìì± ì ê±° (cors ìì
27430¸ ì¼ì´ì¤). 27431 */ 27432 determineAsyncOptionBox(sSelectElementId, sItemCode) { 27433 let bIsAsyncOptionBox = true; 27434 try { 27435 if (parent && parent !== globalThis && parent.EC$(`#${sSelectElementId}`).attr('none_create_option_box') === 'true') { 27436 bIsAsyncOptionBox = false; 27437 parent.EC$(`#${sSelectElementId}`).removeAttr('none_create_option_box'); 27438 } 27439 } catch (e) {} 27440 27441 if (option_type === 'F' && parent.EC$(`input.option_box_id[value="${sItemCode}"]`).length > 0) { 27442 bIsAsyncOptionBox = false; 27443 } 27444 return bIsAsyncOptionBox; 27445 }, 27446 27447 /** 27448 * Pipeline stage 1 helper â ì´ê¸° ìë/readonly ê²°ì . 27449 * iBuyUnit/iProductMin ê²°ì í buy_unit > 1 â readonly, iManualQuantity ì°ì ì ì©. 27450 * @returns {{ sReadonly: string, iBuyUnit: number, iProductMin: number, iQuantity: number }} 27451 */ 27452 computeInitialQuantity(iManualQuantity) { 27453 const iBuyUnit = CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getBuyUnitQuantity('base'); 27454 const iProductMin = CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getProductMinQuantity(); 27455 const sReadonly = Number.parseInt(buy_unit, 10) > 1 ? 'readonly' : ''; 27456 const iQuantity = iManualQuantity === undefined 27457 ? Math.max(iBuyUnit, iProductMin) 27458 : iManualQuantity; 27459 return { sReadonly, iBuyUnit, iProductMin, iQuantity }; 27460 }, 27461 27462 /** 27463 * Pipeline stage 2: ê°ê²©/ë§ì¼ë¦¬ì§ ê³ì° 27464 * - aStockData íì± 27465 * - Olnk linkage type x reservation ë¶ê¸° ë§ì¼ë¦¬ì§ ê³ì° 27466 * - ë¹íìê° ë ¸ì¶ ì²ë¦¬ 27467 */ 27468 computePricing(optionBoxState) { 27469 optionBoxState.iMileageVal = 0; 27470 optionBoxState.sMileageIcon = typeof mileage_icon === 'undefined' ? '//img.echosting.cafe24.com/design/common/icon_sett04.gif' : mileage_icon; 27471 optionBoxState.sMileageAlt = typeof mileage_icon_alt === 'undefined' ? '' : mileage_icon_alt; 27472 27473 if (typeof option_stock_data !== 'undefined') { 27474 optionBoxState.aStockData = CAFE24.UTIL.parseJSON(option_stock_data); 27475 } 27476 27477 if (typeof mileage_val !== 'undefined') { 27478 optionBoxState.iStockPrice = this.computeStockPriceFromOptions(optionBoxState); 27479 optionBoxState.iMileageVal = TotalAddSale.getMileageGenerateCalc(optionBoxState.sItemCode, optionBoxState.iQuantity); 27480 } 27481 optionBoxState.sMileageVal = CAFE24.SHOP_PRICE_FORMAT.toShopMileagePrice(optionBoxState.iMileageVal); 27482 27483 // ë¹íìê° ë ¸ì¶ ì ê°ê²©/ë§ì¼ë¦¬ì§ ë®ì´ì°ê¸° 27484 if (sIsDisplayNonmemberPrice == 'T') { 27485 optionBoxState.sStrPrice = sNonmemberPrice; 27486 optionBoxState.sMileageVal = sNonmemberPrice; 27487 } 27488 }, 27489 27490 /** 27491 * Pipeline stage 2 helper â Olnk linkage type ë¶ê¸° + reservation ë¶ê¸° + non-linkage ë¶ê¸°. 27492 * ë¶ìí¨ê³¼: linkage type + reservation ì¼ì´ì¤ìì optionBoxState.sLinkageOptionId ì¤ì . 27493 * @returns {number} ê³ì°ë iStockPrice (0ì´ ê¸°ë³¸) 27494 */ 27495 computeStockPriceFromOptions(optionBoxState) { 27496 if (Olnk.isLinkageType(option_type) === true) { 27497 const aOptionTmp = optionBoxState.sItemCode.split('||'); 27498 if (this.isReservationLinkage()) { 27499 return this.computeReservationLinkageStockPrice(optionBoxState, aOptionTmp); 27500 } 27501 return this.computeOptionLinkageStockPrice(optionBoxState, aOptionTmp); 27502 } 27503 return optionBoxState.aStockData[optionBoxState.sItemCode].stock_price !== undefined 27504 ? optionBoxState.aStockData[optionBoxState.sItemCode].stock_price 27505 : 0; 27506 }, 27507 27508 /** 27509 * Pipeline stage 2 helper â reservation 몰 + linkage ìµì ì¼ì´ì¤ ì¡°ê±´ íì . 27510 * @returns {boolean} 27511 */ 27512 isReservationLinkage() { 27513 return typeof CAFE24.FRONT_JS_CONFIG_SHOP === 'object' 27514 && CAFE24.FRONT_JS_CONFIG_SHOP.hasOwnProperty('product_service_type') 27515 && CAFE24.FRONT_JS_CONFIG_SHOP.product_service_type === 'reservation'; 27516 }, 27517 27518 /** 27519 * Pipeline stage 2 helper â reservation + linkage type ë¶ê¸° stock price ê³ì°. 27520 * ë¶ìí¨ê³¼: optionBoxState.sLinkageOptionId ì¤ì . 27521 */ 27522 computeReservationLinkageStockPrice(optionBoxState, aOptionTmp) { 27523 const aValueNum = this.collectValidOptionIdHeads(aOptionTmp); 27524 optionBoxState.sLinkageOptionId = aValueNum.join('-'); 27525 return optionBoxState.aStockData.hasOwnProperty(optionBoxState.sLinkageOptionId) 27526 ? optionBoxState.aStockData[optionBoxState.sLinkageOptionId].stock_price 27527 : 0; 27528 }, 27529 27530 /** 27531 * Pipeline stage 2 helper â linkage type ì¼ë° ë¶ê¸° stock price ê³ì°. 27532 */ 27533 computeOptionLinkageStockPrice(optionBoxState, aOptionTmp) { 27534 const aValueNum = this.collectValidOptionIdHeads(aOptionTmp); 27535 if (aValueNum.length === 0) { 27536 return 0; 27537 } 27538 const sLastValidId = aValueNum.at(-1); 27539 return Number.parseFloat(optionBoxState.aStockData[sLastValidId].option_price); 27540 }, 27541 27542 /**
27543 * Pipeline stage 2 helper â itemCode ë¶í´ í ìµì ID head ì¤ ì í¨í ê²ë§ ìì§. 27544 * headë `*+` (ë³íë§ì¼ë¡ 구ì±)ì´ë©´ invalidë¡ ê°ì£¼. 27545 * @returns {string[]} 27546 */ 27547 collectValidOptionIdHeads(aOptionTmp) { 27548 const aValueNum = []; 27549 for (const sOptionEntry of aOptionTmp) { 27550 if (sOptionEntry === '') { 27551 continue; 27552 } 27553 const aOptionIdTmp = sOptionEntry.split('_'); 27554 if (/^\*+$/.test(aOptionIdTmp[0]) === false) { 27555 aValueNum.push(aOptionIdTmp[0]); 27556 } 27557 } 27558 return aValueNum; 27559 }, 27560 27561 /** 27562 * Pipeline stage 3: ë©íë°ì´í° ê²°ì (iIndex, sOptionBoxId, sHtml, ...) 27563 */ 27564 computeMeta(optionBoxState) { 27565 let sProductName = product_name; 27566 if (sProductName != null) { 27567 sProductName = product_name.replaceAll(String.raw`\"`, '"'); 27568 } 27569 optionBoxState.sProductName = sProductName; 27570 27571 optionBoxState.aAddOption = NEWPRD_ADD_OPTION.getCurrentAddOption(); 27572 27573 optionBoxState.iIndex = 1; 27574 if (Number.parseInt(EC$('#totalProducts > table > tbody').find('tr.option_product').length, 10) > 0) { 27575 optionBoxState.iIndex = Number.parseInt(EC$('#totalProducts > table > tbody').find('tr.option_product').last().data('option-index'), 10) + 1; 27576 } 27577 27578 optionBoxState.iTargetKey = iProductNo; 27579 if (option_type === 'F') { 27580 optionBoxState.iTargetKey = `${iProductNo}|${CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSortNum(optionBoxState.oSelect)}`; 27581 } 27582 27583 optionBoxState.sDisplayOption = ''; 27584 // ìµì ì íì ë°ë¡ ì¥ë°êµ¬ë ë´ê¸° ìíë¼ë©´ hideì²ë¦¬ 27585 if (CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_DIRECT_BASKET !== undefined && CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_DIRECT_BASKET.isAvailableDirectBasket(optionBoxState.oSelect) === true) { 27586 optionBoxState.sDisplayOption = 'displaynone'; 27587 } 27588 27589 optionBoxState.sOptionBoxId = `option_box${optionBoxState.iIndex}`; 27590 const oStockItem = optionBoxState.aStockData[optionBoxState.sItemCode]; 27591 optionBoxState.sOptionId = (oStockItem !== undefined && oStockItem.option_id !== undefined) ? oStockItem.option_id : ''; 27592 27593 // í목 구ë¶ì ìí ì½ë 27594 optionBoxState._sItemCode = NEWPRD_ADD_OPTION.getPerItemCode(optionBoxState.iIndex, optionBoxState.sItemCode); 27595 optionBoxState.sHtml = NEWPRD_ADD_OPTION.getPerAddOptionTemplate(optionBoxState._sItemCode); 27596 27597 optionBoxState.sAddOptionTitle = ''; 27598 if (NEWPRD_ADD_OPTION.isUsePerAddOption() === false) { 27599 optionBoxState.sAddOptionTitle = NEWPRD_ADD_OPTION.getCurrentAddOptionTitle(optionBoxState.aAddOption); 27600 optionBoxState.sAddOptionTitle = optionBoxState.sAddOptionTitle.replaceAll('<', '<').replaceAll('>', '>'); 27601 } 27602 27603 optionBoxState.bIsReservation = CAFE24.FRONT_JS_CONFIG_SHOP.product_service_type === 'reservation'; 27604 optionBoxState.bIsMobile = (EC_MOBILE === true || EC_MOBILE_DEVICE === true); 27605 optionBoxState.bShowMileage = TotalAddSale.checkVaildMileageValue(optionBoxState.iMileageVal) === true && sIsMileageDisplay === 'T'; 27606 }, 27607 27608 /** 27609 * Pipeline stage 5: tbody append + íë© ë¶ê¸° + FileOptionManager ë±ë¡ + G2G ì¬ë²ì 27610 */ 27611 appendToTable(optionBoxState) { 27612 if (0 == EC$('#totalProducts > table > tbody.option_products').length) { 27613 EC$('#totalProducts > table > tbody').last().addClass("option_products").after(EC$('<tbody class="add_products"/>')); 27614 } 27615 27616 if (EC$('.EC-funding-checkbox').length === 0) { 27617 EC$('#totalProducts > table > tbody.option_products').append(optionBoxState.sTableRow); 27618 if (typeof add_option_file_input !== 'undefined') { 27619 // FileOptionManagerìì ê´ë¦¬ ë ì ìëë¡ ë±ë¡ 27620 const sId = `file_option_${optionBoxState._sItemCode}`; 27621 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isDisplayLayer(true) === true) { 27622 parent.FileOptionManager.put(sId, add_option_file_input.option); 27623 } 27624 FileOptionManager.put(sId, add_option_file_input.option); 27625 } 27626 27627 if (SHOP.isG2G() === true) { 27628 // ìµì ì¶ê° í ì¬ë²ì ì´ë²¤í¸ ë°ì 27629 document.dispatchEvent(new CustomEvent('jet-retranslate', { 27630 detail: { element: document.querySelector('#totalProducts') } 27631 })); 27632 } 27633 } else { 27634 if (has_option === 'T') { 27635 const sCompositionCode = CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_FUNDING.sCurrentCompositionCode; 27636 CAFE24.SHOP_FRONT_PRODUCT_FUNDING.appendSelectedItem(optionBoxState.sItemCode, sCompositionCode); 27637 } 27638 } 27639 }, 27640 27641 /** 27642 * Pipeline stage 6: í©ê³/ì 립ê¸/í목ê¸ì¡ ê°±ì 27643 */ 27644 finalizeUpdates(optionBoxState) { 27645 // ì´ ì£¼ë¬¸ê¸ì¡/ìë ì²ë¦¬ 27646 setTotalData(); 27647 // ì ë¦½ê¸ / í목ê¸ì¡ ì ë°ì´í¸ 27648 TotalAddSale.updatePrice(optionBoxState.sOptionBoxId, optionBoxState.sItemCode); 27649 }, 27650 27651 // ============================================================ 27652 // ëë°ì´ì¤ë³ row builder (mobile / pc). ê° builderë optionBoxState를 ë°ì 27653 // sTableRow 문ìì´ì ë°ííë©°, 모ë°ì¼ì parent iframe append ë¶ìí¨ê³¼ë¥¼ í¬í¨íë¤. 27654 // ============================================================ 27655 27656 rowBuilders: { 27657 27658 /** 27659 * 모ë°ì¼ row builder â header/cells/footer 조립 + iframe append ë¶ìí¨ê³¼. 27660 * ì¸ì§ì ë³µì¡ë ê°ì를 ìí´ ì 본문ì buildMobileSold{Out|In}Cellsë¡ ìì. 27661 * - sOptionText ë³íì immutable í¨í´ì¼ë¡ ì optionBoxState ìì±íì¬ sub-methodì ì ë¬ 27662 * - ë¶ìí¨ê³¼ (iframe append)ë ì¸ë¼ì¸ ì ì§ 27663 */ 27664 mobile(optionBoxState) { 27665 const oBoxBuilder = CAFE24.SHOP_FRONT_NEW_OPTION_BOX; 27666 const { sItemCode, sProductName, sAddOptionTitle, sOptionPriceText, bIsReservation, bSoldOut, bIsAsyncOptionBox, sSelectElementId, sHtml } = optionBoxState; 27667 27668 const sProcessedOptionText = getReplaceRestockButton( 27669 sItemCode, 27670 oBoxBuilder.buildOptionTextLine(sProductName, sAddOptionTitle, optionBoxState.sOptionText, sOptionPriceText, bIsReservation, true),
27671 bSoldOut 27672 ); 27673 const optionBoxStateForCells = { ...optionBoxState, sOptionText: sProcessedOptionText }; 27674 27675 let sTableRow = optionBoxState.sTableRow; 27676 sTableRow += oBoxBuilder.buildOptionalHeader(sHtml, true); 27677 sTableRow += bSoldOut === true 27678 ? oBoxBuilder.buildMobileSoldOutCells(optionBoxStateForCells) 27679 : oBoxBuilder.buildMobileSoldInCells(optionBoxStateForCells); 27680 sTableRow += oBoxBuilder.buildOptionalFooter(sHtml); 27681 sTableRow += '</tr>'; 27682 27683 // ë¶ìí¨ê³¼: option layer iframe append (ì¸ë¼ì¸ ì ì§, bIsAsyncOptionBox ë¨ì¼ ê°ë) 27684 if (bIsAsyncOptionBox === true) { 27685 const optionLayer = CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER; 27686 if (optionLayer.isDisplayLayer(true) === true) { 27687 parent.EC$('#totalProducts > table > tbody').last().append(sTableRow); 27688 } 27689 if (optionLayer.isExistLayer() === true && optionLayer.isDisplayLayer() === false) { 27690 EC$("#productOptionIframe").contents().find('#totalProducts > table > tbody').last().append(sTableRow); 27691 parent.EC$("#"+sSelectElementId).removeAttr('none_create_option_box'); 27692 } 27693 } 27694 27695 return sTableRow; 27696 }, 27697 27698 /** 27699 * PC row builder â header/cells/mileage/footer 조립. 27700 * ì¸ì§ì ë³µì¡ë ê°ì를 ìí´ ì 본문ì buildPcSold{Out|In}Cellsë¡ ìì. 27701 * - sOptionText ë³íê³¼ sNoTranslateClass ê²°ì ì ì§ì ì ìì ìí í ì optionBoxStateë¡ sub-methodì ì ë¬ 27702 * - <td/tr> ë«ì ë¹ëì¹: mileage/footer ë¤ `</td></tr>` (ìëë 구조) 27703 */ 27704 pc(optionBoxState) { 27705 const oBoxBuilder = CAFE24.SHOP_FRONT_NEW_OPTION_BOX; 27706 const { sItemCode, sProductName, sAddOptionTitle, sOptionPriceText, bIsReservation, bSoldOut, sHtml } = optionBoxState; 27707 27708 const sProcessedOptionText = getReplaceRestockButton( 27709 sItemCode, 27710 oBoxBuilder.buildOptionTextLine(sProductName, sAddOptionTitle, optionBoxState.sOptionText, sOptionPriceText, bIsReservation, false),
27711 bSoldOut 27712 ); 27713 const sNoTranslateClass = SHOP.isG2G() === true ? 'notranslate' : ''; 27714 const optionBoxStateForCells = { ...optionBoxState, sOptionText: sProcessedOptionText, sNoTranslateClass }; 27715 27716 let sTableRow = optionBoxState.sTableRow; 27717 sTableRow += oBoxBuilder.buildOptionalHeader(sHtml, false); 27718 sTableRow += bSoldOut === true 27719 ? oBoxBuilder.buildPcSoldOutCells(optionBoxStateForCells) 27720 : oBoxBuilder.buildPcSoldInCells(optionBoxStateForCells); 27721 sTableRow += oBoxBuilder.buildMileageSection(optionBoxStateForCells); 27722 sTableRow += oBoxBuilder.buildOptionalFooter(sHtml); 27723 sTableRow += '</td></tr>'; 27724 27725 return sTableRow; 27726 } 27727 } 27728}; 27729// REFACTOR_HELPERS_END 27730 27731/** 27732 * ì¬ì ê³ ë²í¼ ë°í 27733 * @param sItemCode í목 ì½ë 27734 * @returns {string} 27735 */ 27736function getReplaceRestockButton(sItemCode, sOptionText, bSoldOut) 27737{ 27738 var aRestockButton = EC_FRONT_JS_CONFIG_SHOP.aRestockButton; 27739 var sReplaceText = ''; 27740 if (typeof aRestockButton !== 'undefined' && typeof sItemCode !== 'undefined' && bSoldOut === true) { 27741 sReplaceText = '<a href="#none" item_code = "' + sItemCode + '" id="btn_restock" class="btn_restock" onClick="' + aRestockButton.action + '">' + aRestockButton.image + '</a>'; 27742 } 27743 27744 return sOptionText.replace(['[#RESTOCK_BUTTON]'], sReplaceText); 27745} 27746 27747/** 27748 * ì´ ìíê¸ì¡/ìë ì ì© 27749 */ 27750function setTotalData() 27751{ 27752 EC_SHOP_FRONT_DEBUG.log("fn - setTotalData"); 27753 27754 if (CAFE24.checkChannelUI() === true) { 27755 setTotalDataDiv(); 27756 return; 27757 } 27758 27759 // ì¤ì ê³ì° 27760 var iTotalCount = 0; 27761 var iTotalPrice = 0; 27762 var iVatSubTotalPrice = 0; 27763 var aEventQuantity = new Array(); 27764 var aEventQuantityCheck = {}; 27765 //add_product_option_box_priceì¶ê°êµ¬ì±ìí 27766 var bIsValidBundleObject = typeof CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE === 'object'; 27767 var fEventProductPrice = 0; 27768 27769 EC$('.option_box_price, .option_add_box_price, .add_product_option_box_price').each(function(i) { 27770 var iProductNum = (has_option === 'T') ? EC$(this).attr('product-no') : iProductNo; 27771 var sItemCode = EC$(this).attr('item_code'); 27772 if (parseInt(iProductNum) === parseInt(iProductNo) && bIsValidBundleObject === true && CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.oBundleConfig.hasOwnProperty(iProductNum) === true) { 27773 if (has_option === 'T') { 27774 var iSingleQuantity = parseInt(EC$('.quantity_opt[product-no="'+iProductNum+'"]').eq(i).val(),10); 27775 } else { 27776 var iSingleQuantity = parseInt(EC$('input[name="quantity_opt[]"]').eq(i).val(),10); 27777 } 27778 27779 if (typeof(aEventQuantityCheck[iProductNum]) === 'undefined') { 27780 aEventQuantityCheck[iProductNum] = 0; 27781 aEventQuantity.push({'product_no': iProductNum}); 27782 } 27783 27784 aEventQuantityCheck[iProductNum] += iSingleQuantity; 27785 } else if (typeof(EC$(this).attr('composition-code')) !== 'undefined') { 27786 var sCompositionCode = EC$(this).attr('composition-code'); 27787 var iQuantity = EC$('#quantity_'+sCompositionCode).val(); 27788 iTotalPrice = iTotalPrice + (EC$(this).val() * iQuantity); 27789 } else { 27790 if (typeof EC_FRONT_JS_CONFIG_SHOP.bSoldout === 'undefined') { 27791 iTotalPrice += parseFloat(EC$(this).val()); 27792 iVatSubTotalPrice += TotalAddSale.getVatSubTotalPrice(sItemCode); 27793 } 27794 } 27795 }); 27796 EC$(aEventQuantity).each(function() { 27797 fEventProductPrice = fEventProductPrice + (product_price * CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.getQuantity(aEventQuantityCheck[this.product_no], this.product_no)); 27798 }); 27799 iTotalPrice = iTotalPrice + fEventProductPrice; 27800 27801 if (iVatSubTotalPrice != iTotalPrice && iVatSubTotalPrice != 0 && iTotalPrice != 0) { 27802 iTotalPrice = iVatSubTotalPrice; 27803 } 27804 iTotalAddSalePrice = TotalAddSale.getTotalAddSalePrice(); 27805 if (typeof(iTotalAddSalePrice) !== 'undefined' && iTotalAddSalePrice != 0) {
27806 iTotalPrice -= parseFloat(iTotalAddSalePrice, 10); 27807 } 27808 27809 iTotalPrice = (iTotalPrice <= 0) ? 0 : iTotalPrice; 27810 var sStrPrice = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iTotalPrice); 27811 27812 iTotalCount = CAFE24.SHOP_FRONT_PRODUCT_INFO.getTotalQuantity(); 27813 var sQuantityString = '('+sprintf(__('%sê°'),iTotalCount)+')'; 27814 27815 // ECHOSTING-58174 27816 if (sIsDisplayNonmemberPrice == 'T') { 27817 sStrPrice = sNonmemberPrice; 27818 } 27819 var sTotalPriceSelector = oSingleSelection.getTotalPriceSelector(); 27820 // ì¤ì ë ¸ì¶ 27821 if (EC_MOBILE === true || EC_MOBILE_DEVICE === true) { 27822 EC$(sTotalPriceSelector).html('<strong class="price">'+sStrPrice+'</strong> '+sQuantityString); 27823 27824 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isDisplayLayer(true) === true) { 27825 parent.EC$(sTotalPriceSelector).html('<strong class="price">'+sStrPrice+'</strong> '+sQuantityString); 27826 } 27827 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isExistLayer() === true) { 27828 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isDisplayLayer() === false) { 27829 EC$("#productOptionIframe").contents().find(sTotalPriceSelector).html('<strong class="price">'+sStrPrice+'</strong> '+sQuantityString); 27830 } 27831 } 27832 } else { 27833 let sNoTranslateClass = ''; 27834 if (SHOP.isG2G() === true) { 27835 sNoTranslateClass = 'notranslate'; 27836 } 27837 EC$(sTotalPriceSelector).html('<strong><em class="'+sNoTranslateClass+'">'+sStrPrice+'</em></strong> '+sQuantityString+'</span>'); 27838 } 27839 27840 setTotalPriceRef(iTotalPrice, sQuantityString); 27841 setProductPriceTaxTypeText(iTotalPrice); 27842 setGlobaleTaxPolicyText(); 27843 setActionButtonVisible(); 27844 ReferenceCurrencyPrice.init(); 27845} 27846 27847 27848/** 27849 * ìì½ì£¼ë¬¸, ë°ë¡êµ¬ë§¤ ë²í¼ , ì 기 ë°°ì¡ ë²í¼ 27850 */ 27851var setActionButtonVisible = function () 27852{ 27853 var sActionButtonSelector = '#btnBuy, #actionBuy, #actionBuyClone, #actionBuyCloneFixed'; 27854 var sReserveSelector = '#btnReserve, #actionReserve, #actionReserveClone, #actionReserveCloneFixed'; 27855 var sActionButtonRegular = '#btnRegularDeliveryCloneFixed, #btnRegularDelivery'; 27856 27857 var oOptionBox = EC$('.option_box_id'); 27858 var oSoldoutOptionBox = EC$('.soldout_option_box_id'); 27859 var bIsReserveStatus = oOptionBox.length === oOptionBox.filter('[data-item-reserved="R"]').length; 27860 27861 if (oOptionBox.length > 0) { 27862 EC$(sActionButtonSelector).show(); 27863 EC$(sReserveSelector).hide(); 27864 } 27865 27866 // ë¨íì¸ ê²½ì° ì¬ê³ ê´ë ¨ ì ë³´ ì¤í¬ë¦½í¸ 27867 if (typeof single_option_stock_data !== 'undefined') { 27868 var oSingleOptionData = EC$.parseJSON(single_option_stock_data); 27869 bIsReserveStatus = oSingleOptionData.is_reserve_stat === 'R'; 27870 } 27871 27872 // ìµì ì´ ìë ìíì íí´ìë§ ìµì ë°ì¤ ì²´í¬ 27873 if (typeof single_option_stock_data === 'undefined' && (oSoldoutOptionBox.length > 0 || oOptionBox.length < 1)) { 27874 EC$(sActionButtonSelector).show(); 27875 EC$(sReserveSelector).hide(); 27876 setActionButtonRegular(sActionButtonSelector, sReserveSelector, sActionButtonRegular); 27877 return; 27878 } 27879 27880 if (bIsReserveStatus) { 27881 EC$(sActionButtonSelector).hide(); 27882 EC$(sReserveSelector).removeClass("displaynone").show(); 27883 EC$(sActionButtonRegular).hide(); 27884 return; 27885 } 27886 27887 setActionButtonRegular(sActionButtonSelector, sReserveSelector, sActionButtonRegular); 27888}; 27889 27890/** 27891 * ì 기 ë°°ì¡ ë²í¼ 27892 */ 27893var setActionButtonRegular = function (sActionButtonSelector , sReserveSelector, sActionButtonRegular) 27894{ 27895 if (EC_FRONT_JS_CONFIG_SHOP.bRegularConfig === true && (EC$('#is_subscriptionT').is(":checked") === true || EC_FRONT_JS_CONFIG_SHOP.bIsUseRegularDelivery === 'T')) { 27896 EC$(sActionButtonSelector).hide(); 27897 EC$(sReserveSelector).hide(); 27898 EC$(sActionButtonRegular).removeClass("displaynone").show(); 27899 } else { 27900 EC$(sActionButtonRegular).hide(); 27901 } 27902}; 27903 27904/** 27905 * ì´ ìíê¸ì¡ì 참조íí ì¶ê° 27906 * @param iTotalPrice 27907 * @param sQuantityString 27908 */ 27909function setTotalPriceRef(iTotalPrice, sQuantityString) 27910{ 27911 var sPrePrice = ''; 27912 var sPostPrice = ''; 27913 var sTotalPrice = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iTotalPrice);
27914 var sTotalPriceRef = CAFE24.SHOP_PRICE_FORMAT.shopPriceToSubPrice(iTotalPrice); 27915 27916 if (sTotalPriceRef == '') { 27917 return; 27918 } 27919 27920 // ECHOSTING-58174 27921 if (sIsDisplayNonmemberPrice == 'T') { 27922 sTotalPrice = sNonmemberPrice; 27923 sTotalPriceRef = sNonmemberPrice; 27924 } 27925 27926 var sTotalPriceSelector = oSingleSelection.getTotalPriceSelector(); 27927 if (EC_MOBILE === true || EC_MOBILE_DEVICE === true) { 27928 if (currency_disp_type == 'P') { 27929 EC$(sTotalPriceSelector).find('strong').append(' / ' + sTotalPriceRef); 27930 } else { 27931 EC$(sTotalPriceSelector).html('<strong class="price">'+ sTotalPriceRef +' '+sQuantityString + '</strong> / ' + sTotalPrice); 27932 } 27933 27934 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isDisplayLayer(true) === true) { 27935 parent.EC$(sTotalPriceSelector).find('strong').append(' / ' + sTotalPriceRef); 27936 } 27937 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isExistLayer() === true) { 27938 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isDisplayLayer() === false) { 27939 EC$("#productOptionIframe").contents().find(sTotalPriceSelector).find('strong').append(' / ' + sTotalPriceRef); 27940 } 27941 } 27942 } else { 27943 if (currency_disp_type == 'P') { 27944 EC$(sTotalPriceSelector).append(' / ' + sTotalPriceRef); 27945 } else { 27946 EC$(sTotalPriceSelector).html('<strong><em>' + sTotalPriceRef + '</em></strong> ' + sQuantityString + '</span> / ' + sTotalPrice); 27947 } 27948 } 27949} 27950 27951/** 27952 * ë¶ê°ì¸ íì 문구 ì¤ì ë°ì 27953 * @param int iTotalPrice ì´ ìí ê¸ì¡ 27954 */ 27955function setProductPriceTaxTypeText(iTotalPrice) 27956{ 27957 var oProductTaxTypeText = TotalAddSale.getProductTaxTypeText(); 27958 if (typeof(oProductTaxTypeText) === 'undefined') { 27959 return; 27960 } 27961 27962 var iTotalOrderPrice = TotalAddSale.getTotalOrderPrice(); 27963 iTotalPrice = CAFE24.SHOP_PRICE.toShopPrice(iTotalPrice); 27964 var iTaxPrice = (oProductTaxTypeText.product_tax_type_per > 0) ? CAFE24.SHOP_PRICE.toShopPrice(iTotalOrderPrice - iTotalPrice) : 0; 27965 if (iTotalPrice == 0) { 27966 return; 27967 } 27968 27969 var iProductPrice = (oProductTaxTypeText.display_prd_vat_separately === 'T') ? iTotalOrderPrice : iTotalPrice; 27970 var iProductVatPrice = iTotalPrice; 27971 // ë¶ê°ì¸ì¨ ê³µì 27972 if (oProductTaxTypeText.display_prd_vat_separately === 'F' || oProductTaxTypeText.product_tax_type !== 'A') { 27973 iTaxPrice = (iProductPrice * oProductTaxTypeText.product_tax_type_per) / (100 + oProductTaxTypeText.product_tax_type_per); 27974 var iShopDecimal = (oProductTaxTypeText.shop_decimal_place > 0) ? oProductTaxTypeText.shop_decimal_place : 1; 27975 iTaxPrice = Math.round(iTaxPrice * iShopDecimal) / iShopDecimal; 27976 iProductVatPrice = iProductVatPrice - iTaxPrice; 27977 } 27978 27979 // ë¶ê°ì¸ê° 0ì ë¯¸ë§ ë° í매ê°ê° 0ì ì´í ì´ë©´ ë¶ê°ì¸ ë°ì ë¶ê° 27980 if (iTaxPrice < 0 || iProductPrice <= 0 || iProductVatPrice <= 0) { 27981 return; 27982 } 27983 27984 var sTaxPrice = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iTaxPrice); 27985 var sProductPrice = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iProductPrice); 27986 var sProductVatPrice = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iProductVatPrice); 27987 27988 var sProductTypeText = oProductTaxTypeText.product_tax_type_text.replace(/\[:ì ì¸ê¸ì¡:\]|\[:VAT_EXCLUDED_PRICE:\]/g, sProductVatPrice); 27989 sProductTypeText = sProductTypeText.replace(/\[:í¬í¨ê¸ì¡:\]|\[:VAT_INCLUDED_PRICE:\]/g, sProductPrice); 27990 sProductTypeText = sProductTypeText.replace(/\[:ë¶ê°ì¸:\]|\[:VAT:\]/g, sTaxPrice); 27991 27992 //Tags 27993 var sTags = 'font-size:' + parseInt(oProductTaxTypeText.product_tax_type_text_font_size, 10) + 'px;'; 27994 sTags += 'color:' + oProductTaxTypeText.product_tax_type_text_color + ';'; 27995 sTags += oProductTaxTypeText.product_tax_type_text_font_type; 27996 27997 sProductTypeText = ' <span style="' + sTags + '">' + sProductTypeText + '</span>'; 27998 27999 if (EC_MOBILE === true || EC_MOBILE_DEVICE === true) { 28000 EC$('#totalProducts .total').find('strong').append(sProductTypeText); 28001 28002 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isDisplayLayer(true) === true) { 28003 parent.EC$('#totalProducts .total').find('strong').append(sProductTypeText); 28004 } 28005 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isExistLayer() === true) { 28006 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isDisplayLayer() === false) { 28007 EC$("#productOptionIframe").contents().find('#totalProducts .total').find('strong').append(sProductTypeText); 28008 } 28009 } 28010 } else { 28011 EC$('#totalProducts .total').append(sProductTypeText); 28012 } 28013} 28014 28015/** 28016 * Global-e ì¸ê¸/ê´ì¸ ìë´ ë¬¸êµ¬ íì 28017 * 28018 * GE íì± ì êµê°/íµí ë¬´ê´ ë¨ì¼ ìë´ ë¬¸êµ¬ë¥¼ íìíë¤.
28019 * ì¸ê¸/ê´ì¸ ê³ì° ì± ìì´ GE 측ì ìì¼ë¯ë¡ í´ë¼ì´ì¸í¸ììë ë¶ê¸°íì§ ìëë¤. 28020 * 28021 * @see ECHOSTING-601718 28022 */ 28023function setGlobaleTaxPolicyText() 28024{ 28025 if (!window.GlobalePresentment || window.GlobalePresentment.isEnabled() === false) { 28026 return; 28027 } 28028 28029 var sTaxText = __('GLOBALE.TAX.DUTY.NOTICE', 'SHOP.JS.FRONT.NEW.PRODUCT.INFO'); 28030 var sTaxTypeHtml = ' <span class="globale-tax-policy">' + sTaxText + '</span>'; 28031 var sTotalPriceSelector = (typeof oSingleSelection === 'object' && oSingleSelection !== null) 28032 ? oSingleSelection.getTotalPriceSelector() 28033 : '#totalProducts .total:visible, #totalPrice .total'; 28034 28035 // 모ë°ì¼Â·PC ìµì ë°ì¤ ê³µíµ: ì´ìíê¸ì¡(ìë) 문구·íë¨ êµ¬ë¶ì ê³¼ ê²¹ì¹ì§ ìëë¡ ë¸ë¡ ë°ì¤ë¡ ë¶ë¦¬ + ìí ì¬ë°± (ECQAUNIT-74376, ECQAUNIT-74549) 28036 // ê³ ì height ë ë²ì/íë©´íì ë°ë¥¸ ì¤ì ë³ëì 깨ì§ë¯ë¡ margin ë°©ì ì¬ì©. 긴 문구ë ì í´ì§ í ììì ì¤ë°ê¿(word-break). 28037 // .total(ê°ê²© span) ë´ë¶ë íì´ ì¢ì ë¸ë¡ì´ ì°ê·¸ë¬ì§ë¯ë¡ .total íì ë¡ ë¶ì°©í´ 컨í ì´ë ì ì²´ í ì¬ì©. 28038 // íì ë¶ì°© ì ê°ê²© ì ììì´ ë기ë¯ë¡ ì¤í¨ì ê°ê²© strong ìì ë°íìì ì½ì´ ì ì§ 28039 var sPriceColor = EC$(sTotalPriceSelector).find('strong').first().css('color') || ''; 28040 var sBlockTaxTypeHtml = '<span class="globale-tax-policy" style="display:block;margin:8px 0;line-height:1.4;text-align:left;word-break:break-word;' 28041 + (sPriceColor !== '' ? 'color:' + sPriceColor + ';' : '') + '">' + sTaxText + '</span>'; 28042 28043 // ì¤ë³µ ë¶ì°© ë°©ì§: 기존 globale-tax-policy ì ê±° í ì¬ë¶ì°© 28044 EC$(sTotalPriceSelector).find('.globale-tax-policy').remove(); 28045 28046 if (EC_MOBILE === true || EC_MOBILE_DEVICE === true) { 28047 EC$(sTotalPriceSelector).siblings('.globale-tax-policy').remove(); 28048 EC$(sTotalPriceSelector).after(sBlockTaxTypeHtml); 28049 28050 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isDisplayLayer(true) === true) { 28051 parent.EC$(sTotalPriceSelector).siblings('.globale-tax-policy').remove(); 28052 parent.EC$(sTotalPriceSelector).after(sBlockTaxTypeHtml); 28053 } 28054 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isExistLayer() === true) { 28055 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isDisplayLayer() === false) { 28056 EC$("#productOptionIframe").contents().find(sTotalPriceSelector).siblings('.globale-tax-policy').remove(); 28057 EC$("#productOptionIframe").contents().find(sTotalPriceSelector).after(sBlockTaxTypeHtml); 28058 } 28059 } 28060 } else if (sTotalPriceSelector.indexOf('totalProducts') >= 0) { 28061 // PC ìµì ë ì´ì´/ìµì ë°ì¤(#totalProducts): íì´ ì¢ì .total ë´ë¶ inline ë¶ì°© ì ì´ê¸ì¡ê³¼ 28062 // í ì¤ë¡ ì´ì´ì ¸ 짤린ë¤. 모ë°ì¼ê³¼ ëì¼íê² .total íì ë¸ë¡ + í ë´ ì¤ë°ê¿ì¼ë¡ ë¶ë¦¬. (ECQAUNIT-74549) 28063 EC$(sTotalPriceSelector).siblings('.globale-tax-policy').remove(); 28064 EC$(sTotalPriceSelector).after(sBlockTaxTypeHtml); 28065 } else { 28066 // PC ìì¸ ê¸°ë³¸ê°ê²©(#totalPrice): íì´ ëì´ ê¸°ì¡´ ì(inline) ë ¸ì¶ ì ì§ 28067 EC$(sTotalPriceSelector).append(sTaxTypeHtml); 28068 } 28069} 28070 28071 28072/** 28073 * ìíê¸ì¡ ê³ì° (모ë°ì¼ ë° í ì¸íë§¤ê° ì²´í¬) 28074 * @param iQuantity ìë 28075 * @param iQuantity ê°ê²© 28076 * @param sItemCode ìµì ì½ë 28077 * @param bSoldout íì ì¬ë¶ 28078 * @param fCallback ì½ë°±í¨ì 28079 */ 28080function getProductPrice(iQuantity, iOptionPrice, sItemCode, bSoldOut, fCallback) 28081{ 28082 EC_SHOP_FRONT_DEBUG.log("fn - getProductPrice"); 28083 28084 var fProductPrice = CAFE24.SHOP_PRICE.toShopPrice(product_price); 28085 if (typeof(iQuantity) === 'undefined' || iQuantity == 0) { 28086 iQuantity = 1; 28087 } 28088 // 1+Nì´ë²¤í¸ì ê²½ì° 28089 iEventQuantity = CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.getQuantity(iQuantity, iProductNo); 28090 fProductPrice = iOptionPrice * parseInt(iEventQuantity, 10); 28091 oProductList = TotalAddSale.getProductList(); 28092 TotalAddSale.setSubscriptionParam(); 28093 if (CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_FUNDING.sCurrentCompositionCode !== null) { 28094 TotalAddSale.setParam('composition_code', CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_FUNDING.sCurrentCompositionCode); 28095 var iFundingNum = EC$('.EC-funding-checkbox[value="'+ CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_FUNDING.sCurrentCompositionCode+'"]').data('funding-no'); 28096 TotalAddSale.setParam('funding_no', iFundingNum); 28097 } 28098 28099 if (typeof(CAFE24.SHOP_FRONT_PRODUCT_RENTAL) === 'object') { 28100 CAFE24.SHOP_FRONT_PRODUCT_RENTAL.changeRentalPrice(fProductPrice); 28101 } 28102 28103 // í ì¸íë§¤ê° 28104 if (sItemCode != 'undefined' && sItemCode != '' && sItemCode != '*' && sItemCode != '**' && sItemCode !== null) { 28105 // ìµì ì´ ìë ê²½ì°ìë iOptionPriceê° í매ê°ë¡ ë¤ì´ê° ìì´ì 28106 // í ì¸ë ê¸ì¡ì´ ì²ë¦¬ëì§ ìì§ë§ ìµì ì´ ìë ê²½ì° ì´ìª½ì¼ë¡ í매ê°ê° í ì¸ í매ê°ë¡ ì¤ì ëì´ë²ë¦¼ 28107 // ìí ìì¸íì´ì§ë´ììë í ì¸ í매ê°ë¡ 컨í¸ë¡¤ ìì 28108 //fProductPrice = CAFE24.SHOP_PRICE.toShopPrice(product_sale_price); 28109 // íì ì ajaxí¸ì¶ìí¨ 28110 TotalAddSale.setProductOptionType(sItemCode, sOptionType); 28111 TotalAddSale.setSoldOutFlag(bSoldOut);
28112 TotalAddSale.setQuantity(sItemCode, iQuantity); 28113 TotalAddSale.setParam('product', oProductList); 28114 if (has_option === 'F') { 28115 iQuantity = iEventQuantity; 28116 } 28117 TotalAddSale.getCalculatorSalePrice(fCallback, fProductPrice); 28118 } else { 28119 if (bSoldOut) { 28120 TotalAddSale.setQuantity(sItemCode, 0); 28121 TotalAddSale.setParam('product', oProductList); 28122 } 28123 fCallback(fProductPrice); 28124 } 28125 28126 return fProductPrice; 28127} 28128 28129/** 28130 * ì´ë²¤í¸ 리ì¤ë Object를 íë¼ë¯¸í°ë¡ ë°ì ì¶ê°ì ë ¥ìµì ê¸¸ì´ ì²´í¬ 28131 * @param oObj 28132 * @param sVal 28133 * @param iLimit 28134 */ 28135function addOptionWordWithObj(oObj, sVal, iLimit) 28136{ 28137 var iStrLen = sVal.length; 28138 var sErrorMsg = sprintf(__('ë©ìì§ë %sì ì´íë¡ ì ë ¥í´ì£¼ì¸ì.'), iLimit); 28139 28140 if (iStrLen > iLimit) { 28141 if (CAFE24.checkChannelUI() === true) { 28142 oObj.siblings('.txt_help').remove(); // 기존ì ìë¬ ë©ìì§ê° ìë¤ë©´ ì ê±° 28143 oObj.after('<p class="txt_help">' + sErrorMsg + '</p>'); 28144 oObj.parent('.ec-input-count').addClass('error'); 28145 } else { 28146 alert(sErrorMsg); 28147 } 28148 28149 oObj.val(sVal.substr(0, sVal.length-1)); 28150 return; 28151 } 28152 oObj.parent().parent().find('.length').html(iStrLen); 28153} 28154 28155/** 28156 * ì¶ê°ì ë ¥ìµì ê¸¸ì´ ì²´í¬ 28157 * @param oObj 28158 * @param limit 28159 */ 28160function addOptionWord(sId, sVal, iLimit) 28161{ 28162 // ì문,íê¸ ìê´ìì´ iLimit ê¸ìë§í¼ ì ííëë¡ ìì (ECHOSTING-78226) 28163 //var iStrLen = stringByteSize(sVal); 28164 addOptionWordWithObj(EC$('#'+sId), sVal, iLimit); 28165} 28166 28167/** 28168 * 문ìì´ì UTF-8ë¡ ë³ííì ê²½ì° ì°¨ì§íê² ëë byte ì를 리í´íë¤. 28169 */ 28170function stringByteSize(str) 28171{ 28172 if (str == null || str.length == 0) return 0; 28173 var size = 0; 28174 for (var i = 0; i < str.length; i++) { 28175 size += charByteSize(str.charAt(i)); 28176 } 28177 return size; 28178} 28179 28180/** 28181 * ê¸ìì ì²´í¬ 28182 * @param ch 28183 * @returns {Number} 28184 */ 28185function charByteSize(ch) 28186{ 28187 if (ch == null || ch.length == 0) return 0; 28188 var charCode = ch.charCodeAt(0); 28189 if (escape(charCode).length > 4) { 28190 return 2; 28191 } else { 28192 return 1; 28193 } 28194} 28195 28196/** 28197 * 기존ì CAFE24.SHOP_PRICE_FORMAT.toShopPrice() ì ëí í¨ì 28198 * @param fPrice ìµì ì¶ê° ê¸ì¡ 28199 * @returns String ìµì ì¶ê° ê¸ì¡(ê¸ì¡ì´ 0ë³´ë¤ í´ê²½ì° '+' íê·¸ ì¶ê°) 28200 */ 28201function getOptionPrice(fPrice) 28202{ 28203 var sPricePlusTag = ''; 28204 28205 if (fPrice > 0) { 28206 sPricePlusTag = '+'; 28207 } else { 28208 sPricePlusTag = '-'; 28209 fPrice = Math.abs(fPrice); 28210 } 28211 28212 // [ECQAINT-79686] presentment íì± ì ê²°ì íí íì°+íµíê¸°í¸ (SHOP_PRICE/FORMAT í¬í¼ê° ë¹íì± ì 기존 í¬ë§· í´ë°±) 28213 if (SHOP.isG2G() === true) { 28214 return sPricePlusTag + CAFE24.SHOP_PRICE.toShopPricePresentment(fPrice, true); 28215 } 28216 var oCurrencyInfoMap79686 = CAFE24.SHOP_CURRENCY_INFO; 28217 if (oCurrencyInfoMap79686) { 28218 var oCurrencyInfo79686 = oCurrencyInfoMap79686[CAFE24.SDE_SHOP_NUM] || oCurrencyInfoMap79686[undefined]; 28219 if (oCurrencyInfo79686) { 28220 if (oCurrencyInfo79686.bPresentmentEnabled === true) { 28221 return sPricePlusTag + CAFE24.SHOP_PRICE_FORMAT.toShopPricePresentment(fPrice); 28222 } 28223 } 28224 } 28225 var sPrice = CAFE24.SHOP_PRICE.toShopPrice(fPrice, true); 28226 var aFormat = CAFE24.SHOP_CURRENCY_FORMAT.getShopCurrencyFormat(); 28227 return sPricePlusTag + aFormat.head + sPrice + aFormat.tail; 28228} 28229 28230/** 28231 * ì¶ê°êµ¬ì±ìí ì¬ë¶ íë¨í ìµì¢ ê¸ì¡ ì°ì¶ 28232 * @param string sTotalSalePrice ì´ ìí ê¸ì¡ 28233 * @param int iTotalSalePrice íë§¤ê° 28234 * @returns string ì¶ê°êµ¬ì± ì´ ìíê¸ì¡ 28235 */ 28236function getAddProductExistTotalSalePrice(iTotalSalePrice) 28237{ 28238 EC$('.add_product_option_box_price').each(function() { 28239 iTotalSalePrice += parseFloat(EC$(this).val()); 28240 }); 28241 28242 return CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iTotalSalePrice); 28243} 28244 28245/** 28246 * ìíìì¸íì´ì§ 기존 모ë ì ê±°íê³ ì ê· ëª¨ëë¡ (ajax) 28247 * coupon_productdetail_new.html ì ì¿ í°ë¤ì´ë¡ë ì ê·ëª¨ëì ì¶ê°íì¬ ajaxì²ë¦¬ 28248 */ 28249function getPrdDetailNewAjax() 28250{ 28251 var sPath = document.location.pathname; 28252 28253 if (CAFE24.UTIL.trim(parent.EC$('.ec-product-couponAjax').html()) !== "") { 28254 return; 28255 } 28256 28257 EC$.get('/product/coupon_productdetail_new.html',{'product_no': iProductNo,'cate_no': iCategoryNo, 'sPath': sPath} ,function(sHtml) { 28258 parent.EC$('.ec-product-couponAjax').html(sHtml); 28259 parent.EC$('.ec-product-couponAjax').show(); 28260 28261 EC$('div.eToggle .title').click(function() { 28262 var toggle = EC$(this).parent('.eToggle'); 28263 if (toggle.hasClass('disable') == false) { 28264 EC$(this).parent('.eToggle').toggleClass('selected'); 28265 } 28266 }); 28267 }); 28268} 28269 28270var SELECTEDITEM = { 28271 iSequence: 0, 28272 sElementIdPrefix: 'option_box', 28273 getElementId: function() 28274 { 28275 return this.sElementIdPrefix+this.getSequence(); 28276 }, 28277 getSequence: function() 28278 { 28279 return this.iSequence++; 28280 } 28281}; 28282 28283CAFE24.SHOP_FRONT_PRODUCT_INFO = { 28284 getTotalQuantity: function() 28285 { 28286 var sQuantitySelector = 'input[name="quantity_opt[]"]'; 28287 var sQuantityContext = (has_option === 'F' ? '' : '#totalProducts'); 28288 if (EC$('.EC-funding-checkbox').length > 0) { 28289 sQuantitySelector = 'input.quantity'; 28290 sQuantityContext = '.xans-product-funding'; 28291 } 28292 var iTotalCount = 0; 28293 EC$(sQuantitySelector, sQuantityContext).each(function() { 28294 var iQuantity = EC$(this).val(); 28295 if (typeof(EC$(this).attr('composition-code')) !== 'undefined') { 28296 iQuantity = 0; 28297 var sCompositionCode = EC$(this).attr('composition-code'); 28298 if (EC$('.selected-funding-item.option_box_price[composition-code="'+sCompositionCode+'"]').length > 0) { 28299 iQuantity = EC$('.selected-funding-item.option_box_price[composition-code="'+sCompositionCode+'"]').attr('quantity'); 28300 } 28301 } 28302 28303 iTotalCount = iTotalCount + parseInt(iQuantity, 10); 28304 }); 28305 return iTotalCount; 28306 } 28307}; 28308 28309var EC_SHOP_FRONT_PRODUCT_INFO = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_PRODUCT_INFO'); 28310var CAPP_SIZE_GUIDE = function() { 28311 // ì¬ì´ì¦ ê°ì´ë ë°ì´í° 28312 var aSizeGuide = {}; 28313 28314 var initialize = function() { 28315 try { 28316 EC$(document).on('click', '.size_guide_info', function() { 28317 var sProductNo = EC$(this).attr('product_no'); 28318 getSizeGuide(sProductNo); 28319 }); 28320 } catch (e) {} 28321 }; 28322 28323 /** 28324 * ì¬ì´ì¦ ê°ì´ë íì 28325 * @param sProductNo ìíë²í¸ 28326 */ 28327 var getSizeGuide = function(sProductNo) { 28328 EC$('.xans-product-sizeguide').remove(); 28329 if (typeof(aSizeGuide[sProductNo]) !== 'undefined') { 28330 layerSizeGuide(sProductNo); 28331 return; 28332 } 28333 28334 EC$.get('/product/sizeguide.html?product_no='+sProductNo, function(sHtml) 28335 { 28336 // optimizer.php ì¤í¬ë¦½í¸ ì ê±° - ëì HTML ì½ì ì ì´ë²¤í¸ ì¶©ë ë°©ì§ 28337 sHtml = sHtml.replace(/<script.*?ind-script\/optimizer.php.*?<\/script>/g, ''); 28338 setSizeGuide(sProductNo, sHtml); 28339 layerSizeGuide(sProductNo); 28340 }); 28341 }; 28342 28343 var setSizeGuide = function(sProductNo, sHtml) { 28344 aSizeGuide[sProductNo] = sHtml; 28345 }; 28346 28347 var layerSizeGuide = function(sProductNo) { 28348 if (EC_MOBILE_DEVICE) { 28349 window.open("/product/sizeguide.html?product_no=" + sProductNo, "popSizeGuide", "toolbar=no,scrollbars=no,resizable=yes,width=800,height=640,left=0,top=0"); 28350 } else {
28351 EC$('body').append(EC$('<div id="sSizeGuideLayer" style="z-index:10003; position:relative;"></div>')); 28352 EC$('#sSizeGuideLayer').html(aSizeGuide[sProductNo]); 28353 EC$('#sSizeGuideLayer').show(); 28354 } 28355 }; 28356 28357 return { 28358 init: function() { 28359 initialize(); 28360 } 28361 }; 28362 28363}(); 28364 28365EC$(function() { 28366 CAPP_SIZE_GUIDE.init(); 28367}); 28368 28369EC$(function() { 28370 // 모ë°ì¼ í ì¸ ì ì© ìíì¼ ê²½ì° 28371 if (typeof(isMobileDcStatus) !== 'undefined' && isMobileDcStatus == 'F') { 28372 // 모ë°ì¼ í ì¸ì´ ì ì© ëì§ ìë ìíì¼ ê²½ì° ê°ë ¤ì¤ë¤. 28373 try { 28374 EC$('#span_product_price_mobile_p_line').hide(); 28375 EC$('#span_optimum_discount_price_mobile_p_line').hide(); 28376 EC$('#span_product_price_mobile_d_line').hide(); 28377 } catch (e) {} 28378 } 28379 CAFE24.SHOP_FRONT_QRCODE.init(); 28380 28381 CAFE24.SHOP_FRONT_REGULAR_DELIVERY.init(); 28382}); 28383 28384CAFE24.SHOP_FRONT_QRCODE = { 28385 init: function() 28386 { 28387 if (typeof qrcode_class !== 'string' || qrcode_class.length < 1) { 28388 return; 28389 } 28390 EC$('.'+qrcode_class).click(CAFE24.SHOP_FRONT_QRCODE.bindUrlCopyButton); 28391 }, 28392 bindUrlCopyButton: function() 28393 { 28394 var sTargetUrl = EC$('img.EC_QRCODE_URL_BUTTON-'+qrcode_class).attr('target-url'); 28395 if (typeof sTargetUrl === 'undefined') { 28396 return; 28397 } 28398 if (typeof(window.clipboardData) === 'object') { 28399 window.clipboardData.setData('text', sTargetUrl); 28400 } else { 28401 EC$('<textarea id="qrcode_dummy">').css({'position': 'absolute','top': '-1000px'}).appendTo('body').text(sTargetUrl).select(); 28402 document.execCommand('copy'); 28403 } 28404 alert(__('URL.ADDRESS.COPIED.CTRL', 'SHOP.JS.FRONT.NEW.PRODUCT.INFO')); 28405 EC$('textarea#qrcode_dummy').remove(); 28406 } 28407}; 28408 28409var EC_SHOP_FRONT_QRCODE = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_QRCODE'); 28410 28411/** 28412 * SNS ë§í¬ ì ë³´ 28413 * @param sMedia 28414 * @param iProductNo 28415 */ 28416function SnsLinkAction(sMedia, iProductNo) 28417{ 28418 CAFE24.PLUSAPP_BRIDGE.shareSocialLink(sMedia, iProductNo); 28419 window.open(sSocialUrl + '?product_no=' + iProductNo + '&type=' + sMedia,sMedia); 28420} 28421 28422/** 28423 * ìí ìì¸ íì´ì§ ì´ë 28424 * @param iProductNo ìíë²í¸ 28425 * @param iCategoryNo ì¹´í ê³ ë¦¬ ë²í¸ 28426 * @param iDisplayGroup ì§ì´ê·¸ë£¹ 28427 * @param sLink URLì ë³´ 28428 */ 28429function product_detail(iProductNo, iCategoryNo, iDisplayGroup, sLink) 28430{ 28431 var sLink = sLink ? sLink : '/product/detail.html'; 28432 sLink += '?product_no=' + iProductNo + '&cate_no=' + iCategoryNo + '&display_group=' + iDisplayGroup; 28433 28434 try { 28435 opener.location.href = sLink; 28436 } catch (e) { 28437 location.href = sLink; 28438 } 28439 28440 self.close(); 28441} 28442 28443/** 28444 * ì¶ì²ë©ì¼ë³´ë´ê¸° 28445 * @param product_no ìíë²í¸ 28446 * @param category_no ì¹´í ê³ ë¦¬ë²í¸ 28447 * @param display_group ì§ì´ê·¸ë£¹ 28448 */ 28449function recommend_mail_pop(product_no, category_no, display_group) 28450{ 28451 option = "'toolbar=no," + "location=no," + "directories=no," + "status=no," + "menubar=no," + "scrollbars=yes," + "resizable=yes," + "width=576," + "height=568," + "top=300," + "left=200"; 28452 28453 filename = "/product/recommend_mail.html?product_no=" + product_no + "&category_no=" + category_no; 28454 filename += "&display_group=" + display_group; 28455 28456 window.open(filename,"recommend_mail_pop",option); 28457} 28458 28459/** 28460 * ìí조르기 íì í¸ì¶ 28461 * @param product_no ìíë²í¸ 28462 */ 28463function request_pop(product_no) 28464{ 28465 option = "'toolbar=no," + "location=no," + "directories=no," + "status=no," + "menubar=no," + "scrollbars=yes," + "resizable=yes," + "width=576," + "height=568," + "top=300," + "left=200"; 28466 filename = "/product/request.html?product_no[]=" + product_no; 28467 28468 window.open(filename,"request_pop",option); 28469} 28470 28471//모ë°ì¼ ìµì ì íë ì´ì´(ìµì 미ì íí 구매í기/ì¥ë°êµ¬ë/ê´ì¬ìíë²í¼ í´ë¦ì) íì²ë¦¬ 모ì... 28472CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER = { 28473 bIsUseOptionLayer: false, 28474 bIsUseRegularDelivery: 'F', 28475 /** 28476 * ì¤ì ê° Set 28477 * @param bIsExec ê°ì ì¤íì¬ë¶ 28478 * @param oCallBack ì½ë°±í¨ì(ê´ì¬ìíììë ë°ë¡ fixedActionButtonìì´ëê°ì íì¸íì§ìê³ ì¤íë기ë문ì ëìì¸íì¸íì§ ìê³ ë°ë¡ ì¤í) 28479 */ 28480 init: function(oCallBack) 28481 { 28482 //ë ì´ì´ê° ì¬ì©ê°ë¥í ìíì¸ì§ íì¸.. 28483 28484 //모ë°ì¼ì´ ìëë¼ë©´ ì¬ì©íì§ ìì 28485 if (EC_MOBILE !== true && EC_MOBILE_DEVICE !== true) { 28486 return; 28487 } 28488 28489 if (CAFE24.checkChannelUI() === true) { 28490 return; 28491 } 28492 28493 //ìì´íë ì ë´ììë ë ì´ì´ë¥¼ ë¤ìëì°ì§ ìì 28494 if (CAPP_SHOP_FRONT_COMMON_UTIL.findTargetFrame() === parent) { 28495 return; 28496 } 28497 28498 EC$.ajax({ 28499 url: '/exec/front/Product/Moduleexist?section=product&file=layer_option&module=product_detail', 28500 dataType: 'json', 28501 success: function (data) { 28502 if (data.result === true) { 28503 CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.bIsUseOptionLayer = true; 28504 if (typeof oCallBack === 'function') { 28505 oCallBack(); 28506 } 28507 } 28508 } 28509 }); 28510 }, 28511 28512 /** 28513 * ë ì´ì´ëì°ê¸°(기존 ë¡ì§ë문ì ìí¥ì´ ìì´ ë ì´ì´ë¥¼ ëì°ì§ 못íë ìí©ì´ë©´ falseë¡ ë¦¬í´íë ë¡ì§ë ê°ì´..) 28514 * @param iProductNo ìíë²í¸ 28515 * @param iCategoryNo ì¹´í ê³ ë¦¬ ë²í¸ 28516 * @param sType ê° ì¡ì ë³ ì ì(ì¼ë°ìí-normal / ì¸í¸ìí-set / ê´ì¬ìíìì í¸ì¶-wishlist) 28517 */ 28518 setLayer: function(iProductNo, iCategoryNo, sType) 28519 { 28520 var iCategoryNo = iCategoryNo || ''; 28521 var iProductNo = iProductNo || ''; 28522 28523 //ìíë²í¸ë íì 28524 if (iProductNo === '') return false;
28525 28526 //ë ì´ì´ ì¬ì©ê°ë¥ìíê° ìëë©´ falseë¡ ë°ë¡ ë¦¬í´ 28527 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.bIsUseOptionLayer === false) { 28528 return false; 28529 } 28530 28531 try { 28532 CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.createLayer(iProductNo, iCategoryNo, sType); 28533 } catch (e) { 28534 return false; 28535 } 28536 28537 return true; 28538 }, 28539 28540 /** 28541 * 모ëì´ ì¡´ì¬íëì§ íì¸íì ë ì´ì´ ìì´íë ì ìì± 28542 * @param iProductNo ìíë²í¸ 28543 * @param iCategoryNo ì¹´í ê³ ë¦¬ ë²í¸ 28544 * @param sType ê° ì¡ì ë³ ì ì(ì¼ë°ìí-normal / ì¸í¸ìí-set / ê´ì¬ìíìì í¸ì¶-wishlist) 28545 */ 28546 createLayer: function(iProductNo, iCategoryNo, sType) 28547 { 28548 try { 28549 EC$('#opt_layer_window').remove(); 28550 } catch (e) {} 28551 28552 CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.setHTML(iProductNo, iCategoryNo, sType); 28553 28554 // @see ECHOSTING-354154 28555 // ìì´íë ìì¼ë¡ íì´ì§ë¥¼ ë¡ëí ë ì¤í¬ë¦½í¸ì ì¤í ìê°ê³¼ íì´ì§ ë¡ë ìë£ ìì ì ìê°ì°¨ê° ë°ìíì¬ 28556 // ìµì ë° ê¸ì¡ ê³ì° ê´ë ¨ ì¤í¬ë¦½í¸ê° ì ìì ì¼ë¡ ëìíì§ ì기 ë문ì (display ìì± ë±) 28557 // ë¡ë ì ì 무조건 í´ë¹ íì´ì§ë¥¼ ë¿ë ¤ì£¼ê³ opacityë§ 0ì¼ë¡ ë³ê²½íì¬ ì ì ëìíëë¡ ì²ë¦¬ 28558 EC$('#opt_layer_window').show().css('opacity', 0); 28559 28560 // ìì´íë ìì´ ë¡ëëíì parent ìì¸íì´ì§ì ìµì ì ë³´ì ë기í 28561 EC$('#productOptionIframe').on('load', function() { 28562 setTimeout((function() { 28563 EC$('#opt_layer_window').css('opacity', 100); 28564 28565 // 구매ë²í¼ ëì´ 28566 var iActionHeight = EC$(this).contents().find('.xans-product-action').outerHeight(); 28567 // ë ì´ì´ ì ì²´ ëì´ 28568 var iTotalHeight = EC$(this).contents().find('#product_detail_option_layer').outerHeight(); 28569 // ë«ê¸°ë²í¼ ëì´ 28570 var iCloseButtonHeight = EC$(this).contents().find('#product_detail_option_layer .btnClose').outerHeight(); 28571 // ë¤ì´ë²ì²´í¬ìì ë²í¼ ëì´ 28572 var iCheckOuterHeight = EC$(this).contents().find('#product_detail_option_layer #NaverChk_Button').outerHeight() || 0; 28573 // ì¹´ì¹´ì¤ì²´í¬ìì ë²í¼ ëì´ 28574 var oKakaoButton = EC$(this).contents().find('#product_detail_option_layer #kakao-checkout-button'); 28575 if (oKakaoButton.length > 0) { 28576 var iKakaoHeight = oKakaoButton.outerHeight() < 1 ? 90 : oKakaoButton.outerHeight(); 28577 iCheckOuterHeight += iKakaoHeight; 28578 } 28579 28580 // 구매ë²í¼ + ë«ê¸°ë²í¼ì ì ì¸í ììì ëì´ê° 200ì´ ìëë¤ë©´ ìµìëì´ê°ì 구매ë²í¼ ëì´ë¥¼ ëí´ì ì§ì 28581 if (iTotalHeight - iActionHeight - iCloseButtonHeight < 200 + iCloseButtonHeight) { 28582 iTotalHeight = 200 + iCloseButtonHeight + iActionHeight; 28583 } 28584 28585 // ì²´í¬ììë²í¼ì´ ììê²½ì° í´ë¹ë²í¼ ëì´ë ëí¨ 28586 iTotalHeight += iCheckOuterHeight; 28587 EC$(this).css('height', iTotalHeight); 28588 28589 if (sType === 'normal') { 28590 // ì¼ë°ìí ìì¸íì´ì§ì ë ì´ì´ ë기í 28591 CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.setNormalInit(); 28592 } else if (sType === 'set') { 28593 // ì¸í¸ìí ìì¸íì´ì§ì ë ì´ì´ ë기í 28594 CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.setSetInit(); 28595 } 28596 28597 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.bIsUseRegularDelivery === 'T') { 28598 EC$(this).contents().find("#product_detail_option_layer #actionBuy").hide(); 28599 EC$(this).contents().find("#product_detail_option_layer #btnRegularDelivery").removeClass('displaynone').show(); 28600 EC$(this).contents().find("#product_detail_option_layer #btnRegularDelivery").append( 28601 '<input id="is_subscriptionT" style="display: none" checked="checked" class="EC_regular_delivery" name="is_subscription" value="T" type="radio">' 28602 ); 28603 } 28604 28605 CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.showLayer(); 28606 }).bind(this)); 28607 }); 28608 }, 28609 28610 /** 28611 * ë ì´ì´ë ¸ì¶ìí¤ê¸° 28612 */ 28613 showLayer: function() 28614 { 28615 //기존 ê³ ì ë ìì¹ì ëì¤ëê²ì ì¤í¬ë¡¤ì ë°ë¼ ìì§ì´ëë¡ ëìì¸ë³ê²½ - setHTML() 참조 28616 var iTop = parseInt((EC$(window).height() - EC$("#productOptionIframe").height()) / 2); 28617 EC$("#opt_layer_iframe_parent").css({"top": iTop, "left": 0}); 28618 EC$('#opt_layer_window').show(); 28619 }, 28620 28621 /** 28622 * ë ì´ì´ HTMLìì± 28623 * @param iProductNo ìíë²í¸ 28624 * @param iCategoryNo ì¹´í ê³ ë¦¬ ë²í¸ 28625 * @param sType ê° ì¡ì ë³ ì ì(ì¼ë°ìí-normal / ì¸í¸ìí-set / ê´ì¬ìíìì í¸ì¶-wishlist) 28626 */ 28627 setHTML: function(iProductNo, iCategoryNo, sType) 28628 { 28629 var sPrdOptUrl = "/product/layer_option.html?product_no="+iProductNo+'&cate_no='+iCategoryNo+'&bPrdOptLayer=T&bIsUseRegularDelivery=F';// + this.bIsUseRegularDelivery; 28630 if (sType === 'wishlist') { 28631 sPrdOptUrl += '&sActionType=' + sType; 28632 } 28633 if (CAFE24.getChRefData() !== undefined) { 28634 sPrdOptUrl += "&ch_ref=" + CAFE24.getChRefData(); 28635 } 28636 var aPrdOptLayerHtml = []; 28637 28638 aPrdOptLayerHtml.push('<div id="opt_layer_window">'); 28639 aPrdOptLayerHtml.push('<div id="opt_layer_background" style="position:fixed; top:0; left:0; width:100%; height:100%; background:#000; opacity:0.3; filter:alpha(opacity=30); z-index:9994;"></div>'); 28640 aPrdOptLayerHtml.push('<div id="opt_layer_iframe_parent" style="position:fixed; top:0; left:0; width:100%; z-index:9995;">'); 28641 aPrdOptLayerHtml.push('<iframe src="'+sPrdOptUrl+'" id="productOptionIframe" style="width:100%; height:100%; border:0;"></iframe>'); 28642 aPrdOptLayerHtml.push('</div>'); 28643 aPrdOptLayerHtml.push('</div>'); 28644 28645 EC$('body').append(aPrdOptLayerHtml.join('')); 28646 }, 28647 28648 /** 28649 * ì¼ë°ìí ë´ê¸°ì ë ì´ì´ ë기í 28650 * ìµì ì íë ì´ì´ê° ë¬íì ìì¸íì´ì§ììë ìµì ì íì ë³´ì ë기ííëë¯ 28651 */ 28652 setNormalInit: function() 28653 { 28654 var sValue = '*'; 28655 var oTarget = null; 28656 var oOptionIframe = EC$("#productOptionIframe")[0].contentWindow.CAFE24.SHOP_FRONT_NEW_OPTION_COMMON; 28657 28658 if (Olnk.isLinkageType(option_type) === true) { 28659 EC$('select[id^="' + product_option_id + '"]').each(function() { 28660 sValue = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedValue(this); 28661 if (Olnk.getCheckValue(sValue,'') === true) { 28662 oTarget = EC$("#productOptionIframe")[0].contentWindow.EC$('#product_detail_option_layer #'+ EC$(this).attr('id')+'').val(EC$(this).val()).trigger('change'); 28663 oOptionIframe.setValue(oTarget, sValue); 28664 } 28665 }) 28666 // ë 립í ìµì ìì ê°ì ìµì ìì ì¬ë¬ í목 ì íí ê²½ì° í목ë§í¼ ë³µì¬ ëì´ì¼ í¨ 28667 } else if (option_type === 'F') { 28668 var eOptionBox = EC$('input[class^="option_box_id"]'); 28669 if (eOptionBox.length > 0) { 28670 eOptionBox.each(function () { 28671 var sOptionId = CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.getOptionSelectId('product_option_id', EC$(this).val()); 28672 if (sOptionId !== '') { 28673 EC$('#' + sOptionId).attr('none_create_option_box', true); 28674 oTarget = EC$("#productOptionIframe")[0].contentWindow.EC$('#product_detail_option_layer #' + sOptionId + ''); 28675 oOptionIframe.setValue(oTarget, EC$(this).val(), true, true); 28676 } 28677 }); 28678 } 28679 } else { 28680 EC$('select[id^="' + product_option_id + '"]').each(function() { 28681 var sSelectOptionId = EC$(this).attr('id'); 28682 sValue = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedValue(this); 28683 oTarget = EC$("#productOptionIframe")[0].contentWindow.EC$('#product_detail_option_layer #'+sSelectOptionId+''); 28684 28685 if (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isSeparateOption(oTarget) === true || option_type === 'F') { 28686 // ë 립í ìµì ì¸ ê²½ì° ìµì ì´ ì íë ìíì´ë©´ attribute를 ì¶ê°í´ì 본íì´ì§ì ìµì ë°ì¤ë ìì±íì§ ìëë¡ í¨ (setOptionBox()) 28687 if (option_type === 'F' && CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isOptionSelected(EC$(this)) === true) { 28688 EC$(this).attr('none_create_option_box', true); 28689 } 28690 oOptionIframe.setValue(oTarget, sValue, true, true); 28691 } else { 28692 oOptionIframe.setValue(oTarget, sValue); 28693 } 28694 }); 28695 } 28696 28697 // íì¼ì²¨ë¶ 리ì¤í¸ ë³µì¬ 28698 var eFileOption = EC$('[name^="file_option"]'); 28699 if (eFileOption.length > 0) { 28700 var sId = eFileOption.attr('id'); 28701 FileOptionManager.sync(sId, EC$("#productOptionIframe")[0].contentWindow.EC$('ul#ul_' + sId)); 28702 } 28703 28704 // ì¶ê°êµ¬ì±ìí 리ì¤í¸ ë³µì¬ 28705 var eAddOptionBox = EC$('input[class^="option_add_box_"]'); 28706 if (eAddOptionBox.length > 0) { 28707 eAddOptionBox.each(function () { 28708 var aAddOptionBoxValue = EC$(this).val().split('||'); 28709 var sAddoptionId = CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.getOptionSelectId('addproduct_option_id_', aAddOptionBoxValue[0]); 28710 if (sAddoptionId !== '') { 28711 oTarget = EC$("#productOptionIframe")[0].contentWindow.EC$('#product_detail_option_layer #' + sAddoptionId + ''); 28712 oOptionIframe.setValue(oTarget, aAddOptionBoxValue[0], true, true); 28713 } 28714 }); 28715 } 28716 28717 }, 28718 /** 28719 * í목ì½ëë¡ ìµì selectbox id ì¡°í 28720 */ 28721 getOptionSelectId: function(sOptionId, sItemCode) 28722 { 28723 var eAddOption = EC$('select[id^="' + sOptionId + '"]'); 28724 var sAddOptionId = ''; 28725 eAddOption.each(function () { 28726 if (EC$(this).find('option[value="' + sItemCode + '"]').length > 0) { 28727 sAddOptionId = EC$(this).attr('id'); 28728 } 28729 }); 28730 return sAddOptionId; 28731 28732 }, 28733 /** 28734 * ì¸í¸ìí ë´ê¸°ì ë ì´ì´ ë기í 28735 * ìµì ì íë ì´ì´ê° ë¬íì ìì¸íì´ì§ììë ìµì ì íì ë³´ì ë기ííëë¯ 28736 */ 28737 setSetInit: function() 28738 { 28739 var oOptionIframe = EC$("#productOptionIframe")[0].contentWindow.CAFE24.SHOP_FRONT_NEW_OPTION_COMMON; 28740 var iTotalOptCnt = EC$('[class*='+set_option.setproduct_require+']').length; 28741 var iOptionSeq = 0; 28742 EC$('[class*='+set_option.setproduct_require+']').each(function(i) { 28743 if (EC$(this)[0].tagName == 'INPUT') { 28744 return; 28745 } 28746 var sSelectOptionId = EC$(this).attr('id'); 28747 var sParentVal = CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionSelectedValue(this); 28748 28749 if (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isOptionSelected(this) === true) { 28750 iOptionSeq = i + 2; 28751 } 28752 if (iTotalOptCnt >= iOptionSeq) { 28753 EC$("#productOptionIframe").contents().find('.'+set_option.setproduct_require+'_'+iOptionSeq).prop('disabled', false); 28754 } 28755 28756 var oTarget = EC$("#productOptionIframe")[0].contentWindow.EC$('#product_detail_option_layer #'+sSelectOptionId+'');//.val(sParentVal).trigger('change'); 28757 if (CAFE24.SHOP_FRONT_NEW_OPTION_VALIDATION.isSeparateOption(oTarget) === true) { 28758 EC$("#productOptionIframe")[0].contentWindow.CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValue(oTarget, sParentVal, true, true); 28759 } else { 28760 EC$("#productOptionIframe")[0].contentWindow.CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValue(oTarget, sParentVal); 28761 } 28762 28763 }); 28764 28765 // ì¶ê°êµ¬ì±ìí 리ì¤í¸ ë³µì¬ 28766 var eAddOptionBox = EC$('input[class^="option_add_box_"]'); 28767 if (eAddOptionBox.length > 0) { 28768 eAddOptionBox.each(function () { 28769 var aAddOptionBoxValue = EC$(this).val().split('||'); 28770 var sAddoptionId = CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.getOptionSelectId('addproduct_option_id_', aAddOptionBoxValue[0]); 28771 if (sAddoptionId !== '') { 28772 oTarget = EC$("#productOptionIframe")[0].contentWindow.EC$('#product_detail_option_layer #' + sAddoptionId + ''); 28773 oOptionIframe.setValue(oTarget, aAddOptionBoxValue[0], true, true); 28774 } 28775 }); 28776 } 28777 }, 28778 28779 /** 28780 * ìµì ì íë ì´ì´ê° ì¡´ì¬íëì§ ì¬ë¶(기존 ë¹êµ ê·¸ëë¡) 28781 * @param bIsParent ë¶ëª¨Elementìì ìµì ë ì´ì´ë¥¼ ì°¾ì ê²½ì° 28782 */ 28783 isExistLayer: function(bIsParent) 28784 { 28785 if (EC_MOBILE !== true && EC_MOBILE_DEVICE !== true) { 28786 return false;
28787 } 28788 28789 if (bIsParent === true) { 28790 return typeof(window.parent) === 'object' && parseInt(parent.EC$('#opt_layer_window').length) > 0; 28791 } else { 28792 return typeof(EC$('#opt_layer_window')) === 'object' && parseInt(EC$('#opt_layer_window').length) > 0; 28793 } 28794 }, 28795 28796 /** 28797 * ìµì ì í ë ì´ì´ê° displayìíì¸ì§ ì¬ë¶ 28798 * @param bIsParent ë¶ëª¨Elementìì ìµì ë ì´ì´ë¥¼ ì°¾ì ê²½ì° 28799 */ 28800 isDisplayLayer: function(bIsParent) 28801 { 28802 if (EC_MOBILE !== true && EC_MOBILE_DEVICE !== true) { 28803 return false; 28804 } 28805 28806 if (bIsParent === true) { 28807 return typeof(bPrdOptLayer) !== 'undefined' && bPrdOptLayer === 'T' && parent.EC$('#opt_layer_window').css('display') === 'block'; 28808 } else { 28809 return (EC$('#opt_layer_window').css('display') === 'none') ? false : true; 28810 } 28811 } 28812}; 28813 28814var EC_SHOP_FRONT_PRODUCT_OPTIONLAYER = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_PRODUCT_OPTIONLAYER'); 28815 28816/** 28817 * íë¡ í¸ ìµì ì ë³´ ê´ë¦¬ 28818 */ 28819CAFE24.SHOP_FRONT_PRODUCT_OPTION_INFO = { 28820 /** 28821 * ìµì íì ë¦¬í´ 28822 * @param int iProductNo ìí ë²í¸ 28823 * @return string ìµì íì 28824 */ 28825 getOptionType: function (oOptionChoose) { 28826 return CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionType(oOptionChoose); 28827 }, 28828 28829 /** 28830 * ìµì 리ì¤í íì ë¦¬í´ 28831 * @param int iProductNo ìí ë²í¸ 28832 * @return string ìµì 리ì¤í íì 28833 */ 28834 getItemListingType: function (oOptionChoose) { 28835 return CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getOptionListingType(oOptionChoose); 28836 }, 28837 28838 /** 28839 * ì ì²´ í목 ì¬ê³ ì ë³´ 28840 * @param int iProductNo ìí ë²í¸ 28841 * @return object íëª©ë³ ì¬ê³ ì ë³´ 리ì¤í¸ 28842 */ 28843 getAllItemStorkInfo: function (iProductNo) { 28844 return CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.getProductStockData(iProductNo); 28845 }, 28846 28847 /** 28848 * ìµì ê°ì¼ë¡ í목ì½ë 구íì¬ ë¦¬í´ 28849 * @param int iProductNo ìí ë²í¸ 28850 * @param array aOptionValue ìµì ê° 28851 * @return string í목ì½ë 28852 */ 28853 getItemCodeByOptionValue: function (iProductNo, aOptionValue) { 28854 var sOptionValue = aOptionValue.join("#$%"); 28855 28856 return CAFE24.SHOP_FRONT_NEW_OPTION_DATA.getItemCode(iProductNo, sOptionValue); 28857 } 28858}; 28859 28860var EC_SHOP_FRONT_PRODUCT_OPTION_INFO = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_PRODUCT_OPTION_INFO'); 28861 28862CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID = { 28863 setBuyUnitQuantity: function(iBuyUnit, iProductMin, sBuyUnitType, sOrderLimitType, iItemCount, sType) 28864 { 28865 // 구매주문ë¨ìê° ìíë³ì ê²½ì° 1ì© ì¦ê° 28866 if (sBuyUnitType === 'P') { 28867 iBuyUnit = (iItemCount > 1) ? 1 : iBuyUnit; 28868 // ìµì´ ì í ëë ìëì "ìí"ê¸°ì¤ êµ¬ë§¤ë¨ì ìì "í목"ê¸°ì¤ ìµì/ìµë ìë =? ìµììëì´ ê¸°ë³¸ìë 28869 if (sType === 'base' && sOrderLimitType === 'O') { 28870 iBuyUnit = iProductMin; 28871 } 28872 } 28873 return iBuyUnit; 28874 }, 28875 getBuyUnitQuantity: function(sType) 28876 { 28877 return this.setBuyUnitQuantity(parseInt(buy_unit,10), parseInt(product_min,10), buy_unit_type, order_limit_type, item_count, sType); 28878 }, 28879 getSetBuyUnitQuantity: function(aProductInfo, sType) { 28880 28881 return this.setBuyUnitQuantity(parseInt(aProductInfo.buy_unit,10), parseInt(aProductInfo.product_min,10), aProductInfo.buy_unit_type, aProductInfo.order_limit_type, aProductInfo.item_count, sType); 28882 }, 28883 setProductMinQuantity: function(iBuyUnit, iProductMin, sBuyUnitType, sOrderLimitType, iItemCount) 28884 { 28885 if (isNewProductSkin() === true) { 28886 var iItemCount = typeof(iItemCount) === "undefined" ? 1: parseInt(iItemCount, 10); 28887 // ë¨í or íëª©ì´ 1ê°ì¸ê²½ì° í목-í목 기ì¤ì¼ë¡ ëì 28888 if (iItemCount > 1) { 28889 // ìíê¸°ì¤ ë¨ì ì¦ì°¨ê° ë¨ìë 1 28890 if (sBuyUnitType === 'P' && sOrderLimitType === 'P') { 28891 iProductMin = 1; 28892 // "í목"ê¸°ì¤ ë¨ì ì´ë©´ì ìµì/ìµë "ìí"기ì¤ì ê²½ì° "í목"구매ë¨ìê° ìµììë 28893 } else if (sOrderLimitType === 'P') { 28894 iProductMin = iBuyUnit; 28895 } 28896 } 28897 } else { 28898 var iBuyUnit = parseInt(buy_unit, 10); 28899 iBuyUnit = iBuyUnit < 1 ? 1 : iBuyUnit;
28900 var iFactor = Math.ceil(iProductMin / iBuyUnit); 28901 iProductMin = iBuyUnit * iFactor; 28902 } 28903 28904 return iProductMin; 28905 }, 28906 getProductMinQuantity: function() 28907 { 28908 this.initProductOptionModule(); 28909 return this.setProductMinQuantity(parseInt(buy_unit,10), parseInt(product_min,10), buy_unit_type, order_limit_type, item_count); 28910 }, 28911 getSetProductMinQuantity: function(aProductInfo) 28912 { 28913 return this.setProductMinQuantity(parseInt(aProductInfo.buy_unit,10), parseInt(aProductInfo.product_min,10), aProductInfo.buy_unit_type, aProductInfo.order_limit_type, aProductInfo.item_count); 28914 }, 28915 getNumberValidate: function(e) 28916 { 28917 var keyCode = e.which; 28918 // Tab, Enter, Deleteí¤ í¬í¨ 28919 var isNumberPress = ((keyCode >= 48 && keyCode <= 57 && !e.shiftKey) // ì«ìí¤ 28920 || (keyCode >= 96 && keyCode <= 105) // í¤í¨ë 28921 || keyCode == 8 // BackSpace 28922 || keyCode == 9 // Tab 28923 || keyCode == 46); // Delete 28924 28925 if (!isNumberPress) { 28926 e.preventDefault(); 28927 } 28928 }, 28929 initProductOptionModule : function() { 28930 // product_option모ë 미ì¬ì©ì ì¤í¬ë¦½í¸ ì¤ë¥ ë°©ì´ 28931 if (typeof(item_count) === 'undefined') { 28932 item_count = 1; 28933 } 28934 if (typeof isNewProductSkin !== 'function') { 28935 window.isNewProductSkin = function() { return false; } 28936 } 28937 } 28938}; 28939 28940var EC_FRONT_NEW_PRODUCT_QUANTITY_VALID = CAFE24.getDeprecatedNamespace('EC_FRONT_NEW_PRODUCT_QUANTITY_VALID'); 28941 28942CAFE24.SHOP_FRONT_REGULAR_DELIVERY = { 28943 init: function() 28944 { 28945 EC$('#EC_cycle_count option').eq(0).prop('disabled', true); 28946 EC$('#EC_regular_count option').eq(0).prop('disabled', true); 28947 28948 EC$('.EC_regular_delivery').on('click', function() { 28949 CAFE24.SHOP_FRONT_REGULAR_DELIVERY.changeBuyButton(EC$(this).val()); 28950 if (typeof ProductSet !== 'undefined') { 28951 ProductSet.setOptionBoxQuantity(EC$('#option_box1_quantity'), 'change'); 28952 } else if (has_option === 'F') { 28953 setPrice(false, false, ''); 28954 } else { 28955 if (EC$('#option_box1_quantity').length > 0) { 28956 // ìµì ì í ì´íìë option_id를 í¹ì í ì ìì ìëì íë°ì¤ ìì¼ë©´ ì¬ê³ì° 28957 setOptionBoxQuantity('change', EC$('#option_box1_quantity')); 28958 } 28959 } 28960 }); 28961 28962 this.changeBuyButton(EC$('.EC_regular_delivery:checked').val()); 28963 28964 }, 28965 changeBuyButton: function(sUsedRegularDelivery) 28966 { 28967 28968 if (typeof(EC_FRONT_JS_CONFIG_SHOP) === 'undefined') { 28969 return; 28970 } 28971 28972 if (typeof(sUsedRegularDelivery) === 'undefined') { 28973 return; 28974 } 28975 28976 if (EC_FRONT_JS_CONFIG_SHOP.bRegularConfig === false) { 28977 return; 28978 } 28979 28980 if (EC$('#btnReserve').is(':visible') === true || EC$('#actionReserve').is(':visible') === true) { 28981 if (sUsedRegularDelivery === 'T') { 28982 EC$('#regular_cycle_period').removeClass('displaynone').show(); 28983 EC$('#regular_count').show(); 28984 } else { 28985 EC$('#regular_cycle_period').hide(); 28986 EC$('#regular_count').hide(); 28987 } 28988 return; 28989 } 28990 28991 var sActionButtonSelector = '#btnBuy, #actionBuy, #actionBuyClone, #actionBuyCloneFixed'; 28992 var sActionButtonRegular = '#btnRegularDeliveryCloneFixed, #btnRegularDelivery, #regular_cycle_period, #regular_info'; 28993 28994 if (sUsedRegularDelivery === 'T') { 28995 EC$(sActionButtonSelector).hide(); 28996 EC$(sActionButtonRegular).removeClass('displaynone').show(); 28997 EC$('#regular_count').show(); 28998 CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.bIsUseRegularDelivery = 'T'; 28999 } else { 29000 EC$(sActionButtonSelector).show(); 29001 EC$(sActionButtonRegular).hide(); 29002 EC$('#regular_count').hide(); 29003 CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.bIsUseRegularDelivery = 'F'; 29004 } 29005 } 29006}; 29007 29008var EC_SHOP_FRONT_REGULAR_DELIVERY = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_REGULAR_DELIVERY'); 29009
29010if (!Object.size) { 29011 Object.size = function(obj) { 29012 var size = 0, key; 29013 for (key in obj) { 29014 if (obj.hasOwnProperty(key)) size++; 29015 } 29016 return size; 29017 }; 29018} 29019var SHOP_FRONT_NEW_PRODUCT_COMMON = CAFE24.getDeprecatedNamespace('SHOP_FRONT_NEW_PRODUCT_COMMON'); 29020CAFE24.SHOP_FRONT_NEW_PRODUCT_COMMON = { 29021 /** 29022 * ë°ë¡êµ¬ë§¤ í´ë¦ì ì¥ë°êµ¬ëì ê°ì ìíì´ ìì ê²½ì° ê°ì´ 구매 ì¬ë¶ë¥¼ 묻ë ë©ì¸ì§ 29023 * @param iCount 29024 * @returns {string} 29025 */ 29026 getOverridePurchaseMessage: function(iCount) 29027 { 29028 let sReturnMessage = __('ëì¼ìíì´ ì¥ë°êµ¬ëì ììµëë¤. í¨ê» 구매íìê² ìµëê¹?'); 29029 if (typeof iCount !== 'undefined') { 29030 sReturnMessage = sprintf(__('ëì¼ìíì´ ì¥ë°êµ¬ëì %sê° ììµëë¤.'), iCount) + ' ' + __('í¨ê» 구매íìê² ìµëê¹?'); 29031 } 29032 return sReturnMessage + '\n' + __('IF.PRESS.CANCEL.BUY.SELECTED', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION'); 29033 } 29034}; 29035/** 29036 * 기존ì product_submití¨ìì ìë ë´ì©ë¤ì ë©ìë ë¨ìë¡ ë¦¬íí ë§í ê°ì²´ 29037 */ 29038var PRODUCTSUBMIT = { 29039 oConfig: { 29040 'sFormSelector': '#frm_image_zoom' 29041 }, 29042 /** 29043 * 1 : ë°ë¡ 구매, 2 : ì¥ë°êµ¬ë ë£ê¸° 29044 */ 29045 sType: null, 29046 sAction: null, 29047 oObject: null, 29048 oValidate: null, 29049 oForm: null, 29050 oDebug: null, 29051 bIsDebugConsoleOut: false, 29052 sPaymethod: null, 29053 aInfo: null, 29054 29055 /** 29056 * ì´ê¸°í 29057 */ 29058 initialize: function(sType, sAction, oObject, aInfo) 29059 { 29060 this.oDebug = this.DEBUG.initialize(this); 29061 this.oDebug.setInfo('PRODUCTSUBMIT.initialize ìì'); 29062 this.oDebug.setInfo('sType : ', sType); 29063 this.oDebug.setInfo('sAction : ', sAction); 29064 this.oDebug.setInfo('oObject : ', oObject); 29065 this.oDebug.setInfo('aInfo : ', aInfo); 29066 29067 if (typeof(sType) === 'undefined' || ((sType !== 'sms_restock' && sType !== 'email_restock') && typeof(sAction) === 'undefined')) { 29068 this.oDebug.setMessage('PRODUCTSUBMIT.initialize fail'); 29069 return false; 29070 } 29071 this.sType = sType; 29072 this.sAction = sAction; 29073 this.oObject = oObject; 29074 this.sPaymethod = $(oObject).data('paymethod'); 29075 this.oValidate = this.VALIDATION.initialize(this); 29076 this.UTIL.initialize(this); 29077 this.oForm = EC$(this.oConfig.sFormSelector); 29078 this.oForm.find(':hidden').remove(); 29079 this.aInfo = aInfo; 29080 NEWPRD_ADD_OPTION.initCustomData(); 29081 }, 29082 /** 29083 * ë°ì´í° ê²ì¦ 29084 */ 29085 isValidRequest: function() 29086 { 29087 try { 29088 this.oDebug.setInfo('PRODUCTSUBMIT.isValidRequest ìì'); 29089 29090 this.oDebug.setInfo('PRODUCTSUBMIT.oValidate.isValidFunding'); 29091 if (this.oValidate.isValidFunding() === false) { 29092 this.oDebug.setMessage('PRODUCTSUBMIT.oValidate.isValidFunding fail'); 29093 } 29094 29095 this.oDebug.setInfo('PRODUCTSUBMIT.oValidate.isRequireLogin'); 29096 if (this.oValidate.isRequireLogin() === false) { 29097 this.oDebug.setMessage('PRODUCTSUBMIT.oValidate.isRequireLogin fail'); 29098 } 29099 29100 // ECHOSTING-370710: ì ë¦½ê¸ ì ì© ìí ë¹íì 구매 ì°¨ë¨ 29101 this.oDebug.setInfo('PRODUCTSUBMIT.oValidate.isMileageOnlyForNonmember'); 29102 if (this.oValidate.isMileageOnlyForNonmember() === false) { 29103 this.oDebug.setMessage('PRODUCTSUBMIT.oValidate.isMileageOnlyForNonmember fail'); 29104 } 29105 29106 this.oDebug.setInfo('PRODUCTSUBMIT.oValidate.isPriceContent'); 29107 if (this.oValidate.isPriceContent() === false) { 29108 this.oDebug.setMessage('PRODUCTSUBMIT.oValidate.isPriceContent fail'); 29109 } 29110 29111 this.oDebug.setInfo('PRODUCTSUBMIT.oValidate.isOptionDisplay'); 29112 if (this.oValidate.isOptionDisplay() === false) { 29113 this.oDebug.setMessage('PRODUCTSUBMIT.oValidate.isOptionDisplay fail'); 29114 } 29115 29116 this.oDebug.setInfo('PRODUCTSUBMIT.oValidate.isItemInStock'); 29117 if (this.oValidate.isItemInStock() === false) { 29118 this.oDebug.setMessage('PRODUCTSUBMIT.oValidate.isItemInStock fail'); 29119 } 29120 29121 this.oDebug.setInfo('PRODUCTSUBMIT.oValidate.isValidRegularDelivery'); 29122 if (this.oValidate.isValidRegularDelivery() === false) { 29123 this.oDebug.setMessage('PRODUCTSUBMIT.oValidate.isValidRegularDelivery fail'); 29124 } 29125 29126 this.oDebug.setInfo('PRODUCTSUBMIT.oValidate.isValidOption'); 29127 if (this.oValidate.isValidOption() === false) { 29128 this.oDebug.setMessage('PRODUCTSUBMIT.oValidate.isValidOption fail'); 29129 } 29130 29131 this.oDebug.setInfo('PRODUCTSUBMIT.oValidate.isValidAddproduct'); 29132 if (this.oValidate.isValidAddproduct() === false) { 29133 this.oDebug.setMessage('PRODUCTSUBMIT.oValidate.isValidAddproduct fail'); 29134 } 29135 29136 this.oDebug.setInfo('PRODUCTSUBMIT.setDynamicCheckoutAppData'); 29137 if (this.setDynamicCheckoutAppData() === false) { 29138 this.oDebug.setMessage('PRODUCTSUBMIT.setDynamicCheckoutAppDatafail'); 29139 } 29140 29141 this.oDebug.setInfo('PRODUCTSUBMIT.oValidate.isExclusivePurchaseOnly'); 29142 if (this.oValidate.isExclusivePurchaseOnly() === false) { 29143 this.oDebug.setMessage('PRODUCTSUBMIT.oValidate.isExclusivePurchaseOnly fail'); 29144 } 29145 29146 this.oDebug.setInfo('PRODUCTSUBMIT.oValidate.isValidReservationItemData'); 29147 if (this.oValidate.isValidReservationItemData() === false) { 29148 this.oDebug.setMessage('PRODUCTSUBMIT.oValidate.isValidReservationItemData fail'); 29149 } 29150 29151 this.oDebug.setInfo('PRODUCTSUBMIT.oValidate.isValidCulturalTax'); 29152 if (this.oValidate.isValidCulturalTax() === false) { 29153 this.oDebug.setMessage('PRODUCTSUBMIT.oValidate.isValidCulturalTax fail'); 29154 } 29155 29156 } catch (mError) { 29157 return this.DEBUG.messageOut(mError, 'PRODUCT_ACTION.isValidRequest'); 29158 } 29159 return true; 29160 }, 29161 /** 29162 * ì ì¡í¼ ìì± 29163 */ 29164 setBasketForm: function() 29165 { 29166 try { 29167 this.oDebug.setInfo('PRODUCTSUBMIT.setBasketForm ìì'); 29168 // ìì½ ì£¼ë¬¸ ì²´í¬ 29169 STOCKTAKINGCHECKRESERVE.checkReserve(); 29170 29171 this.oForm.attr('method', 'POST'); 29172 this.oForm.attr('action', '/' + this.sAction); 29173 29174 this.oDebug.setInfo('PRODUCTSUBMIT.setCommonInput'); 29175 if (this.setCommonInput() === false) { 29176 this.oDebug.setMessage('PRODUCTSUBMIT.setCommonInput fail'); 29177 } 29178 29179 this.oDebug.setInfo('PRODUCTSUBMIT.setOptionId'); 29180 if (this.setOptionId() === false) { 29181 this.oDebug.setMessage('PRODUCTSUBMIT.setOptionId fail'); 29182 } 29183 29184 this.oDebug.setInfo('PRODUCTSUBMIT.setAddOption'); 29185 if (this.setAddOption() === false) { 29186 this.oDebug.setMessage('PRODUCTSUBMIT.setAddOption fail'); 29187 } 29188 29189 this.oDebug.setInfo('PRODUCTSUBMIT.setQuantityOveride'); 29190 if (this.setQuantityOveride() === false) { 29191 this.oDebug.setMessage('PRODUCTSUBMIT.setQuantityOveride fail'); 29192 } 29193 29194 this.oDebug.setInfo('PRODUCTSUBMIT.setSelectedItem'); 29195 if (this.setSelectedItemHasOptionT() === false || this.setSelectedItemHasOptionF() === false) { 29196// if (this.setSelectedItemHasOptionT() === false || this.setSelectedItemHasOptionF() === false || this.setSingleSelectedItem() === false) { 29197 this.oDebug.setMessage('PRODUCTSUBMIT.setSelectedItem fail'); 29198 } 29199 29200 this.oDebug.setInfo('PRODUCTSUBMIT.setFundingData'); 29201 if (this.setFundingData() === false) { 29202 this.oDebug.setMessage('PRODUCTSUBMIT.setFundingData fail'); 29203 } 29204 this.oDebug.setInfo('PRODUCTSUBMIT.setRegularDelivery'); 29205 if (this.setRegularDelivery() === false) { 29206 this.oDebug.setMessage('PRODUCTSUBMIT.setRegularDelivery fail'); 29207 } 29208 29209 this.oDebug.setInfo('PRODUCTSUBMIT.setReservationData'); 29210 if (this.setReservationData() === false) { 29211 this.oDebug.setMessage('PRODUCTSUBMIT.setReservationData fail'); 29212 } 29213 29214 this.oDebug.setInfo('PRODUCTSUBMIT.setCulturalTax'); 29215 if (this.setCulturalTax() === false) { 29216 this.oDebug.setMessage('PRODUCTSUBMIT.setCulturalTax fail'); 29217 } 29218 29219 } catch (mError) { 29220 return this.DEBUG.messageOut(mError, 'PRODUCT_ACTION.setBasketForm'); 29221 } 29222 29223 return true; 29224 }, 29225 setBasketAjax : function(defer) 29226 { 29227 this.oDebug.setInfo('PRODUCTSUBMIT.setBasketAjax ìì'); 29228 if (typeof(ACEWrap) !== 'undefined') { 29229 // ìì´ì¤ì¹´ì´í° 29230 ACEWrap.addBasket(); 29231 } 29232
29233 if (typeof(PRODUCTSUBMIT.sPaymethod) !== 'undefined') { 29234 this.oForm.prepend(getInputHidden('paymethod', this.sPaymethod)); 29235 } 29236 29237 // íì¼ì²¨ë¶ ìµì ì íì¼ì ë¡ëê° ìì ê²½ì° ë°ë¡ ì¥ë°êµ¬ëì ë£ê¸° 29238 if (FileOptionManager.existsFileUpload() === false) { 29239 NEWPRD_ADD_OPTION.setItemPerAddOptionForm(this.oForm); 29240 action_basket(this.sType, 'detail', this.sAction, this.oForm.serialize(), this.UTIL.getData('sBasketType'), null, defer); 29241 } else { 29242 // íì¼ì²¨ë¶ ìµì ì íì¼ì ë¡ëê° ìì¼ë©´ 29243 FileOptionManager.upload(function(mResult) { 29244 // íì¼ì ë¡ë ì¤í¨ 29245 if (mResult === false) { 29246 PRODUCTSUBMIT.DEBUG.setMessage('PRODUCTSUBMIT.setBasketAjax fail - íì¼ì ë¡ë ì¤í¨'); 29247 return false; 29248 } 29249 29250 // íì¼ì ë¡ë ì±ê³µ 29251 for (var sId in mResult) { 29252 // í´ë¹ í목ì íì¼ ì²¨ë¶ ìµì í목 ì¶ê° 29253 NEWPRD_ADD_OPTION.pushFileList(sId, mResult); 29254 PRODUCTSUBMIT.UTIL.appendHidden(sId, FileOptionManager.encode(mResult[sId])); 29255 } 29256 29257 NEWPRD_ADD_OPTION.setItemPerAddOptionForm(PRODUCTSUBMIT.oForm); 29258 action_basket(PRODUCTSUBMIT.sType, 'detail', PRODUCTSUBMIT.sAction, PRODUCTSUBMIT.oForm.serialize(), PRODUCTSUBMIT.UTIL.getData('sBasketType'), null, defer); 29259 }); 29260 } 29261 }, 29262 setSelectedItem: function(sItemCode, iQuantity, sParameterName, sAdditionalData) 29263 { 29264 iQuantity = parseInt(iQuantity, 10); 29265 if (isNaN(iQuantity) === true || iQuantity < 1) { 29266 this.oDebug.setMessage('PRODUCTSUBMIT.setSelectedItem fail - iQuantity Fault'); 29267 return false; 29268 } 29269 29270 if (typeof(sItemCode) !== 'string') { 29271 this.oDebug.setMessage('PRODUCTSUBMIT.setSelectedItem fail - sItemCode Fault'); 29272 return false; 29273 } 29274 29275 if (typeof(sParameterName) === 'undefined') { 29276 sParameterName = 'selected_item[]'; 29277 } 29278 29279 if (typeof(sAdditionalData) === 'undefined') { 29280 sAdditionalData = ''; 29281 } else { 29282 sAdditionalData = '||' + sAdditionalData; 29283 } 29284 29285 this.UTIL.prependHidden(sParameterName, iQuantity+'||'+sItemCode+sAdditionalData); 29286 return true; 29287 }, 29288 getQuantity: function(oQuantityElement) 29289 { 29290 if (typeof(quantity_id) === 'undefined') { 29291 var quantity_id = '#quantity'; 29292 } 29293 var $oQuantityElement = EC$(quantity_id); 29294 if (typeof(oQuantityElement) === 'object') { 29295 $oQuantityElement = oQuantityElement; 29296 } 29297 return parseInt($oQuantityElement.val(),10); 29298 }, 29299 setSelectedItemHasOptionF: function() 29300 { 29301 if (has_option !== 'F') { 29302 return true; 29303 } 29304 29305 if (item_code === undefined) { 29306 var sItemCode = product_code+'000A'; 29307 } else { 29308 var sItemCode = item_code; 29309 } 29310 if (this.sType === 'funding') { 29311 CAFE24.SHOP_FRONT_PRODUCT_FUNDING.setStandaloneProductItem(sItemCode); 29312 } else { 29313 if (NEWPRD_ADD_OPTION.checkSoldOutProductValid(this.oObject) === false && CAFE24.SHOP_FRONT_PRODUCT_RESTOCK.isRestock(this.sType) === false) { 29314 this.setSelectedItem(sItemCode, this.getQuantity()); 29315 } 29316 } 29317 29318 return true; 29319 }, 29320 setEtypeSelectedItem: function(bFormAppend) 29321 { 29322 var _sItemCode = sProductCode + '000A'; 29323 if (this.sType === 'reservation') { 29324 _sItemCode = ''; 29325 29326 } 29327 var iQuantity = 0; 29328 var sSelectedItemByEtype = ''; 29329 var _aItemValueNo = ''; 29330 if (isNewProductSkin() === false) { 29331 iQuantity = this.getQuantity(); 29332 29333 // ìëì´ ìë ê²½ì°ìë ìµì 구매 ìëì¼ë¡ ëì§ë¤!! 29334 if (iQuantity === undefined) { 29335 iQuantity = product_min; 29336 } 29337 var _aItemValueNo = Olnk.getSelectedItemForBasketOldSkin(sProductCode, EC$('[id^="product_option_id"]'), iQuantity); 29338 29339 if (_aItemValueNo.bCheckNum === false) { 29340 _aItemValueNo = Olnk.getProductAllSelected(sProductCode , EC$('[id^="product_option_id"]') , iQuantity); 29341 if (_aItemValueNo === false) { 29342 this.oDebug.setMessage('etype error'); 29343 } 29344 } 29345 sSelectedItemByEtype = 'selected_item_by_etype[]='+EC$.toJSON(_aItemValueNo) + '&'; 29346 if (bFormAppend === true) { 29347 this.setSelectedItem(_sItemCode, iQuantity); 29348 this.UTIL.appendHidden('selected_item_by_etype[]', EC$.toJSON(_aItemValueNo)); 29349 } 29350 } else { 29351 var bIsProductEmptyOption = this.UTIL.getData('bIsProductEmptyOption'); 29352 // ë©ì¸ìí ì íì¬ë¶ íì¸ false : ì íí¨ || true : ì íìí¨ 29353 if (bIsProductEmptyOption === false && NEWPRD_ADD_OPTION.checkSoldOutProductValid(this.oObject) === false) { 29354 var iOptionBoxLength = EC$('.option_box_id').length - 1; 29355 EC$('.option_box_id').each(function (i) { 29356 var sQuantityElement = EC$('#' + EC$(this).attr('id').replace('id', 'quantity')); 29357 if (typeof CAFE24.SHOP_FRONT_PRODUCT_FUNDING === 'object' && CAFE24.SHOP_FRONT_PRODUCT_FUNDING.isFundingProduct() === true) { 29358 sQuantityElement = EC$('#quantity_'+EC$(this).attr('composition-code')); 29359 } 29360 iQuantity = PRODUCTSUBMIT.getQuantity(sQuantityElement);
29361 _aItemValueNo = Olnk.getSelectedItemForBasket(sProductCode, EC$(this), iQuantity); 29362 29363 if (_aItemValueNo.bCheckNum === false) { // ìµì ë°ì¤ë ìì§ë§ ê°ì´ ì íì´ ìëê²½ì° 29364 _aItemValueNo = Olnk.getProductAllSelected(sProductCode, EC$(this), iQuantity); 29365 } 29366 if (bFormAppend === true) { 29367 PRODUCTSUBMIT.setSelectedItem(_sItemCode, iQuantity); 29368 PRODUCTSUBMIT.UTIL.prependHidden('selected_item_by_etype[]', EC$.toJSON(_aItemValueNo)); 29369 } 29370 sSelectedItemByEtype += 'selected_item_by_etype[]='+EC$.toJSON(_aItemValueNo) + '&'; 29371 var oItem = EC$('[name="item_code[]"]').eq(i); 29372 var sItemCode = _sItemCode + '_' + i; 29373 29374 //íëª©ë³ ì¶ê°ìµì ì í 29375 if (bFormAppend === true) { 29376 var ePerAddOption = EC$('.option_products .option').eq(i).find(".input_addoption:visible"); 29377 if (ePerAddOption.length > 0) { // ìµì ë°ì¤ììì ê°ë³ ì ë ¥ì 29378 sItemCode = Olnk.getCustomOptionItemCode(sProductCode, iOptionBoxLength, i); 29379 NEWPRD_ADD_OPTION.setItemPerAddOptionData(sItemCode, ePerAddOption, PRODUCTSUBMIT.oForm); 29380 } else { 29381 //íëª©ë³ ì¶ê°ìµì ì í 29382 var sItemAddOption = NEWPRD_ADD_OPTION.getAddOptionValue(oItem.attr('data-item-add-option')); 29383 NEWPRD_ADD_OPTION.setItemAddOption(sItemCode, sItemAddOption, PRODUCTSUBMIT.oForm); 29384 } 29385 } 29386 }); 29387 29388 // ì ë¶ ì íì¸ ê²½ì° íìê° ìì±íë¤. 29389 if (_aItemValueNo === '') { 29390 iQuantity = this.getQuantity(); 29391 _aItemValueNo = Olnk.getProductAllSelected(sProductCode, EC$('[id^="product_option_id"]'), iQuantity); 29392 if (_aItemValueNo !== false) { 29393 if (bFormAppend === true) { 29394 this.setSelectedItem(_sItemCode, iQuantity); 29395 this.UTIL.prependHidden('selected_item_by_etype[]', EC$.toJSON(_aItemValueNo)); 29396 } 29397 sSelectedItemByEtype += 'selected_item_by_etype[]='+EC$.toJSON(_aItemValueNo) + '&'; 29398 } 29399 } 29400 } 29401 } 29402 this.UTIL.setData('sSelectedItemByEtype', sSelectedItemByEtype); 29403 }, 29404 setSelectedItemHasOptionT: function() 29405 { 29406 if (has_option !== 'T') { 29407 return true; 29408 } 29409 29410 if (Olnk.isLinkageType(sOptionType) === true) { 29411 this.setEtypeSelectedItem(true); 29412 } else { 29413 if (isNewProductSkin() === true && NEWPRD_ADD_OPTION.checkSoldOutProductValid(this.oObject) === false) { 29414 if (this.sType === 'funding') { 29415 EC$('.xans-product-funding').each(function(i) { 29416 if (EC$(this).find('.EC-funding-checkbox:checked').length !== 1) { 29417 return; 29418 } 29419 var iQuantity = EC$(this).find('input.quantity').val(); 29420 var sItemCode = EC$(this).find('input.selected-funding-item').val(); 29421 PRODUCTSUBMIT.setSelectedItem(sItemCode, iQuantity); 29422 }); 29423 29424 } else { 29425 if (EC$('[name="quantity_opt[]"][id^="option_box"]').length > 0 && EC$('[name="quantity_opt[]"][id^="option_box"]').length == EC$('[name="item_code[]"]').length) { 29426 29427 EC$('[name="quantity_opt[]"][id^="option_box"]').each(function(i) { 29428 29429 var oItem = EC$('[name="item_code[]"]').eq(i); 29430 var sItemCode = oItem.val(); 29431 PRODUCTSUBMIT.setSelectedItem(sItemCode, PRODUCTSUBMIT.getQuantity(EC$(this))); 29432
29433 //íëª©ë³ ì¶ê°ìµì ì í 29434 var eProductBox = EC$('.option_products .option'); 29435 if (CAFE24.checkChannelUI() === true) { 29436 eProductBox = EC$('.option_product[data-option-index]'); 29437 } 29438 var ePerAddOption = eProductBox.eq(i).find(".input_addoption:visible"); 29439 if (ePerAddOption.length > 0) { // ìµì ë°ì¤ììì ê°ë³ ì ë ¥ì 29440 NEWPRD_ADD_OPTION.setItemPerAddOptionData(sItemCode, ePerAddOption, PRODUCTSUBMIT.oForm); 29441 } else { 29442 var sItemAddOption = NEWPRD_ADD_OPTION.getAddOptionValue(oItem.attr('data-item-add-option')); 29443 NEWPRD_ADD_OPTION.setItemAddOption(sItemCode, sItemAddOption, PRODUCTSUBMIT.oForm); 29444 } 29445 }); 29446 } 29447 } 29448 29449 } else { 29450 // ë´ ìí + 구ì¤ë ì¤í¨ 29451 var aItemCode = ITEM.getItemCode(); 29452 for (var i = 0; i < aItemCode.length; i++) { 29453 var sItemCode = aItemCode[i]; 29454 this.setSelectedItem(sItemCode, this.getQuantity(i)); 29455 } 29456 } 29457 } 29458 29459 if (this.sType === 'sms_restock' || this.sType === 'email_restock') { 29460 this.UTIL.appendHidden('item_code', EC$(this.oObject).attr('item_code')); 29461 } 29462 29463 // ìì½ìíì¸ ê²½ì° selected_item ì²ë¦¬ 29464 29465 return true; 29466 }, 29467 setQuantityOveride: function() 29468 { 29469 if (this.sType !== 1 && this.sType !== 'naver_checkout' && this.sType !== 'direct_buy' && this.sType !== 'simple_pay' && this.sType !== 'app' && this.sType !== 'checkout') { 29470 return true; 29471 } 29472 29473 // ì ìë³ìì 29474 sIsPrdOverride = 'F'; 29475 if (this.sType === 1 || this.sType == 'simple_pay') { 29476 var aItemParams = []; 29477 var aItemCode = ITEM.getItemCode(); 29478 for (var i = 0, length = aItemCode.length; i < length; i++) { 29479 aItemParams.push("item_code[]=" + aItemCode[i]); 29480 } 29481 var sOptionParam = this.UTIL.getData('sOptionParam'); 29482 sOptionParam = sOptionParam + '&delvtype=' + delvtype + '&' + aItemParams.join("&"); 29483 if (Olnk.isLinkageType(sOptionType) === true) { 29484 this.setEtypeSelectedItem(); 29485 var sSelectedItemByEtype = this.UTIL.getData('sSelectedItemByEtype', sSelectedItemByEtype); 29486 } 29487 selectbuy_action(sOptionParam, iProductNo, sSelectedItemByEtype); 29488 } 29489 29490 if (this.sType === 'naver_checkout' || this.sType === 'direct_buy' || this.sType === 'app' || this.sType === 'checkout') { 29491 sIsPrdOverride = 'T'; 29492 } 29493 this.UTIL.appendHidden('quantity_override_flag', sIsPrdOverride); 29494 }, 29495 /** 29496 * ì¤ì ìµì ì ëí ê²ì¦ì´ ìëë¼ êµ¬ìíê³¼ì í¸íì ìí´ ì¡´ì¬íë íë¼ë¯¸í°ë¤ì ì¸í í´ì£¼ë ë©ìë 29497 */ 29498 setOptionId: function() 29499 { 29500 var count = 1; 29501 var sOptionParam = ''; 29502 EC$('select[id^="' + product_option_id + '"]').each(function() 29503 { 29504 PRODUCTSUBMIT.UTIL.appendHidden('optionids[]', EC$(this).attr('name')); 29505 if (EC$(this).prop('required') === true || EC$(this).attr('required') === 'required') { 29506 PRODUCTSUBMIT.UTIL.appendHidden('needed[]', EC$(this).attr('name')); 29507 } 29508 var iSelectedIndex = EC$(this).get(0).selectedIndex; 29509 if (EC$(this).prop('required') && iSelectedIndex > 0) iSelectedIndex -= 1; 29510 29511 if (iSelectedIndex > 0) { 29512 sOptionParam += '&option' + count + '=' + iSelectedIndex; 29513 var sValue = EC$(this).val(); 29514 var aValue = sValue.split("|"); 29515 PRODUCTSUBMIT.UTIL.appendHidden(EC$(this).attr('name'), aValue[0]); 29516 ++count; 29517 } 29518 }); 29519 this.UTIL.setData('sOptionParam', sOptionParam); 29520 }, 29521 setAddOption: function() 29522 { 29523 if (add_option_name.length === 0) { 29524 return; 29525 } 29526 if (this.sType === 'funding') { 29527 // CAFE24.SHOP_FRONT_PRODUCT_FUNDING.getFundingBasketData를 참조íì¸ì. 29528 return; 29529 } 29530 29531 var iAddOptionNo = 0; 29532 var aAddOptionName = []; 29533 if (has_option === 'F') { 29534 NEWPRD_ADD_OPTION.addItem(item_code); 29535 var iAddOptionIndex = NEWPRD_ADD_OPTION.getLastIndex(); 29536 } 29537 for (var i = 0, iAddOptionNameLength = add_option_name.length; i < iAddOptionNameLength; i++) { 29538 var sValue = EC$('#' + add_option_id + i).val(); 29539 if (typeof sValue === 'undefined') { 29540 continue; 29541 } 29542 if (has_option === 'F') { 29543 NEWPRD_ADD_OPTION.addCustomOption(iAddOptionIndex, { 29544 type: 'text', 29545 value: sValue, 29546 info: add_option_name[i] 29547 }, 'input'); 29548 } 29549 if (sValue === '') { 29550 continue; 29551 } 29552 this.UTIL.appendHidden('option_add[]', sValue); 29553 aAddOptionName[iAddOptionNo++] = add_option_name[i]; 29554 } 29555 this.UTIL.appendHidden('add_option_name', aAddOptionName.join(';')); 29556 NEWPRD_ADD_OPTION.setItemAddOptionName(this.oForm); // íëª©ë³ ì¶ê°ìµì ëª ì¸ë° ì ìíë¨ìë¡ ëëì§ íì¸ì´ íìí¨ 29557 }, 29558 setFundingData: function() 29559 { 29560 if (this.sType !== 'funding') { 29561 return true; 29562 } 29563 if (typeof CAFE24.SHOP_FRONT_PRODUCT_FUNDING.getFundingBasketData !== 'function') { 29564 this.oDebug.setMessage('CAFE24.SHOP_FRONT_PRODUCT_FUNDING.getFundingBasketData error'); 29565 return false;
29566 } 29567 29568 var oFundingBasketData = CAFE24.SHOP_FRONT_PRODUCT_FUNDING.getFundingBasketData(); 29569 if (typeof(oFundingBasketData) !== 'object') { 29570 this.oDebug.setMessage(oFundingBasketData.sMessage); 29571 return false; 29572 } 29573 29574 delete oFundingBasketData.sMessage; 29575 delete oFundingBasketData.bIsResult; 29576 this.UTIL.appendHidden(oFundingBasketData); 29577 29578 29579 }, 29580 setRegularDelivery : function() 29581 { 29582 if (PRODUCTSUBMIT.isRegularDelivery() === false) { 29583 return true; 29584 } 29585 29586 var sSubscriptionCycleValue = PRODUCTSUBMIT.getRegularSelectedValue(); 29587 29588 // ëìì¸ììì ë³ë ì²ë¦¬ ë ì ê¸°ë°°ì¡ 29589 if (typeof(sSubscriptionCycleValue) === 'undefined') { 29590 return true; 29591 } 29592 29593 // 기존 íëì½ë©ì© 29594 var regex = /[W|M|Y]$/g; 29595 if (regex.test(sSubscriptionCycleValue) === false) { 29596 sSubscriptionCycleValue = sSubscriptionCycleValue + 'W'; 29597 } 29598 29599 var sSubscriptionCycleCount = sSubscriptionCycleValue.substring(sSubscriptionCycleValue.length-1, -1); 29600 var sSubscriptionCycle = sSubscriptionCycleValue.slice(-1); 29601 29602 this.UTIL.appendHidden('is_subscription', EC$('.EC_regular_delivery:checked').val()); 29603 this.UTIL.appendHidden('subscription_cycle', sSubscriptionCycle); // 주ë¨ì íì¬ë ê³ ì 29604 this.UTIL.appendHidden('subscription_cycle_count', sSubscriptionCycleCount); 29605 29606 var sSubscriptionCountValue = PRODUCTSUBMIT.getRegularCountSelectedValue(); 29607 29608 // ëìì¸ììì ë³ë ì²ë¦¬ ë ì ê¸°ë°°ì¡ 29609 if (typeof(sSubscriptionCountValue) === 'undefined') { 29610 return true; 29611 } 29612 this.UTIL.appendHidden('max_expected_pay_seq', sSubscriptionCountValue); 29613 }, 29614 setReservationData : function() 29615 { 29616 // ìì½ìíì´ ìëë¯ë¡ ë¤ë¥¸ ìì ì íì§ ìê³ í¨ì¤ 29617 if (this.sType !== 'reservation') { 29618 return true; 29619 } 29620 this.UTIL.appendHidden('product_service_type', 'reservation'); 29621 this.UTIL.appendHidden('reservation_type', (EC$('input#reservation_type').val() ?? '')); 29622 this.UTIL.appendHidden('service_start_date', (EC$('input#service_start_date').val() ?? '')); 29623 this.UTIL.appendHidden('service_end_date', (EC$('input#service_end_date').val() ?? '')); 29624 this.UTIL.appendHidden('quantity_override_flag', 'T'); 29625 }, 29626 setCulturalTax : function() 29627 { 29628 this.UTIL.appendHidden('is_cultural_tax', SHOP_FRONT_PRODUCT_CULTURAL_TAX.getIsCulturalTax()); 29629 return true; 29630 }, 29631 setDynamicCheckoutAppData : function() 29632 { 29633 if (this.sType !== 'app') { 29634 return true; 29635 } 29636 29637 this.UTIL.appendHidden(this.aInfo); 29638 }, 29639 29640 setCommonInput : function() 29641 { 29642 var sBasketType = (typeof(basket_type) === 'undefined') ? 'A0000' : basket_type; 29643 this.UTIL.setData('sBasketType', sBasketType); 29644 29645 var oCommon = { 29646 'product_no': iProductNo, 29647 'product_name': product_name, 29648 'main_cate_no': iCategoryNo, 29649 'display_group': iDisplayGroup, 29650 'option_type': option_type, 29651 'product_min': product_min, 29652 'command': 'add', 29653 'has_option': has_option, 29654 'product_price': product_price, 29655 'multi_option_schema': EC$('#multi_option').html(), 29656 'multi_option_data': '', 29657 'delvType': delvtype, 29658 'redirect': this.sType, 29659 'product_max_type': product_max_type, 29660 'product_max': product_max, 29661 'basket_type': sBasketType, 29662 'ch_ref': CAFE24.getChRefData() 29663 }; 29664 // ìíëª ì í¹ì문ìê° ë¤ì´ê°ë©´ ì¸ì½ë©/ëì½ë© ê´ê³ë¡ ë ì´ì´ê° ë¶ëª¨ì°½ì ê²ì¦íì§ ëª»íë ì´ìê° ë°ìíê³ , ì°ì´ì§ ìë ë³ìë¡ íë¨ëì´ ì ê±° 29665 if (this.sType === 'sms_restock') { 29666 delete oCommon.product_name; 29667 } 29668 this.UTIL.appendHidden(oCommon); 29669 29670 if (typeof(CAPP_FRONT_OPTION_SELECT_BASKETACTION) !== 'undefined' && CAPP_FRONT_OPTION_SELECT_BASKETACTION === true) { 29671 this.UTIL.appendHidden('basket_page_flag', 'T'); 29672 } else { 29673 var oDlvChannelElement = EC$('#delivery_cost_prepaid_channel > li.selected'); 29674 if (oDlvChannelElement.length > 0) { 29675 this.UTIL.appendHidden('prd_detail_ship_type', oDlvChannelElement.attr('data-value')); 29676 } else { 29677 this.UTIL.appendHidden('prd_detail_ship_type', EC$('#delivery_cost_prepaid').val()); 29678 } 29679 } 29680 if (this.sType !== 'funding') { 29681 // ìë ì²´í¬ 29682 var iQuantity = 1; 29683 if (CAFE24.SHOP_FRONT_PRODUCT_RESTOCK.isRestock(this.sType) === false) { 29684 iQuantity = checkQuantity(); 29685 if (iQuantity == false) { 29686 // íì¬ ê´ë ¨ìí ì í íëì§ ì¬ë¶ íì¸ 29687 // ê´ë ¨ ìí ìì²´ê° ììëë ë¤ì ì ë¡ì§ì í íìê° ìì(basket_info ê´ë ¨ìí ì²´í¬ë°ì¤) 29688 if (EC$('input[name="basket_info[]"]').length <= 0 || NEWPRD_ADD_OPTION.checkRelationProduct(this.oObject, this.sType) === false) { 29689 return false;
29690 } 29691 } 29692 } 29693 29694 // í¼ ì¸í 29695 if (iQuantity == undefined || isNaN(iQuantity) === true || iQuantity < 1) { 29696 iQuantity = 1; 29697 } 29698 this.UTIL.appendHidden('quantity', iQuantity); 29699 } 29700 29701 // ë°ë¡êµ¬ë§¤ 주문ì ì¬ë¶ 29702 if (this.sType == 'direct_buy') { 29703 this.UTIL.appendHidden('is_direct_buy', 'T'); 29704 } else { 29705 this.UTIL.appendHidden('is_direct_buy', 'F'); 29706 } 29707 }, 29708 VALIDATION: { 29709 initialize: function(oParent) 29710 { 29711 this.parent = oParent; 29712 return this; 29713 }, 29714 isRequireLogin: function() 29715 { 29716 // ECHOSTING-58174 29717 if (sIsDisplayNonmemberPrice !== 'T') { 29718 return true; 29719 } 29720 switch (this.parent.sType) { 29721 case 1 : 29722 case 'simple_pay' : // ê°í¸ê²°ì 29723 alert(__('ë¡ê·¸ì¸í ìíì 구매í´ì£¼ì¸ì.')); 29724 break; 29725 case 2 : 29726 alert(__('ë¡ê·¸ì¸í ì¥ë°êµ¬ë ë´ê¸°ë¥¼ í´ì£¼ì¸ì.')); 29727 break; 29728 case 'direct_buy' : 29729 alert(__('íìë§ êµ¬ë§¤ ê°ë¥í©ëë¤. ë¹íìì¸ ê²½ì° íìê°ì í ì´ì©íì¬ ì£¼ì¸ì.')); 29730 break; 29731 default : 29732 break; 29733 } 29734 btn_action_move_url('/member/login.html'); 29735 return false; 29736 }, 29737 // ECHOSTING-370710: ì ë¦½ê¸ ì ì© ìíì ë¹íì 구매 ë¶ê° - ìíìì¸ìì ë¡ê·¸ì¸ ì ë 29738 isMileageOnlyForNonmember: function() 29739 { 29740 if (typeof EC_FRONT_JS_CONFIG_SHOP === 'undefined' || EC_FRONT_JS_CONFIG_SHOP.sIsMileageOnlyProduct !== 'T') { 29741 return true; 29742 } 29743 if (EC_FRONT_JS_CONFIG_SHOP.sIsLoginMember === 'T') { 29744 return true; 29745 } 29746 alert(__('íìë§ ì£¼ë¬¸ ê°ë¥í ìíì´ ììµëë¤. ë¡ê·¸ì¸ í ì´ì©í´ 주ì¸ì.')); 29747 btn_action_move_url('/member/login.html'); 29748 return false; 29749 }, 29750 isPriceContent: function() 29751 { 29752 if (typeof(product_price_content) === 'undefined') { 29753 return true; 29754 } 29755 29756 var sProductcontent = product_price_content.replace(/\s/g, '').toString(); 29757 if (sProductcontent === '1') { 29758 alert(sprintf(__('%s ìíì 구매í ì ìë ìíì´ ìëëë¤.'), product_name)); 29759 return false; 29760 } 29761 29762 return true; 29763 }, 29764 isOptionDisplay: function() 29765 { 29766 if (typeof CAFE24.SHOP_FRONT_NEW_OPTION_COMMON !== 'undefined' 29767 && has_option === 'T' 29768 && Olnk.isLinkageType(sOptionType) === false 29769 && CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.isValidOptionDisplay(product_option_id) === false) { 29770 29771 alert(sprintf(__('%s ìíì 구매í ì ìë ìíì´ ìëëë¤.'), product_name)); 29772 return false; 29773 } 29774 return true; 29775 }, 29776 isItemInStock: function() 29777 { 29778 if (CAFE24.SHOP_FRONT_PRODUCT_RESTOCK.isRestock(this.parent.sType) === false && (EC$('.option_box_id').length == 0 && EC$('.soldout_option_box_id').length > 0) === true) { 29779 alert(__('íì ë ìíì êµ¬ë§¤ê° ë¶ê°ë¥í©ëë¤.')); 29780 return false; 29781 } 29782 29783 return true; 29784 }, 29785 isValidOption: function() 29786 { 29787 // íììµì ì²´í¬ 29788 var bIsProductEmptyOption = CAFE24.SHOP_FRONT_PRODUCT_RESTOCK.isRestock(this.parent.sType) === false && checkOptionRequired() == false; 29789 this.parent.UTIL.setData('bIsProductEmptyOption', bIsProductEmptyOption); 29790 29791 //ì¶ê°êµ¬ì±ìí ìµì ì²´í¬ 29792 var oValidAddProductCount = NEWPRD_ADD_OPTION.isValidAddOptionSelect(this.parent.oForm); 29793 29794 //ê´ë ¨ìí ìµì ì²´í¬ 29795 var oValidRelationProductCount = NEWPRD_ADD_OPTION.isValidRelationProductSelect(this.parent.oForm, this.parent.oObject, bIsProductEmptyOption); 29796 29797 // ê°ë³ 구매 ê´ë ¨ ê²ì¦ë ë°ì´í° 29798 var oIndividualValidData = NEWPRD_ADD_OPTION.getIndividualValidCheckData(oValidRelationProductCount, oValidAddProductCount, bIsProductEmptyOption, this.parent.oForm); 29799 29800 // ìµì ì²´í¬ 29801 if (bIsProductEmptyOption === true) { 29802 // ì¤í¨ íì ì¡´ì¬ í ê²½ì° 29803 if (oIndividualValidData.sFailType !== '') { 29804 return false;
29805 } 29806 //ê´ë ¨ìí ë° ì¶ê°êµ¬ì±ìí ë¨ë 구매ì ì í¨ì± ë©ìì§ ë ¸ì¶ì¬ë¶ ê²°ì (ìì°¨ ê²ì¦ì§í ì¶ê° or ê´ë ¨ + 본ìí) 29807 if (NEWPRD_ADD_OPTION.checkIndividualValidAction(oValidRelationProductCount, oValidAddProductCount) === false) { 29808 return false; 29809 } 29810 // ë 립í ì¼ë 29811 var oExistRequiredSelect = (option_type === 'F') ? EC$('select[id^="' + product_option_id + '"][required="true"]') : false; 29812 var sMsg = __('íì ìµì ì ì íí´ì£¼ì¸ì.'); 29813 try { 29814 // ê´ë ¨ìí ì²´í¬ íì¸ ì 무 29815 if (NEWPRD_ADD_OPTION.checkRelationProduct(this.parent.oObject, this.parent.sType) === false) { 29816 return false; 29817 } 29818 29819 if (oIndividualValidData.isValidInidual === false && CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.setLayer(iProductNo, iCategoryNo, 'normal') === true) { 29820 return false; 29821 } 29822 29823 if (Olnk.getOptionPushbutton(EC$('#option_push_button')) === true) { 29824 var bCheckOption = false; 29825 EC$('select[id^="' + product_option_id + '"]').each(function() { 29826 if (EC$(this).prop('required') === true && Olnk.getCheckValue(EC$(this).val(),'') === false) { 29827 bCheckOption = true; 29828 return false; 29829 } 29830 }); 29831 if (bCheckOption === false) { 29832 sMsg = __('í목ì ì íí´ ì£¼ì¸ì.'); 29833 } 29834 } 29835 } catch (e) { 29836 PRODUCTSUBMIT.DEBUG.messageOut(e, 'PRODUCT_ACTION.isValidOption'); 29837 } 29838 29839 // ë©ì¸ìí í목ë°ì´í° íì¸ 29840 var isEmptyItemData = ITEM.getItemCode().length == false || ITEM.getItemCode() === false; 29841 // ì¶ê°êµ¬ì±ìí ë° ê´ë ¨ìíì ê°ë³ì 구매 29842 if (isEmptyItemData === true && oIndividualValidData.isValidInidual === true) { 29843 if (NEWPRD_ADD_OPTION.checkVaildIndividualMsg(
29843oIndividualValidData, this.parent.sType, this.parent.oObject) === false) { 29844 return false; 29845 } 29846 29847 } else { 29848 if (option_type === 'F') { 29849 var aRequiredFalseOption = []; 29850 var aItemCodeList = ITEM.getItemCode(); 29851 // íì ìµì ì ë³´ì ì íí ìµì ì ë³´ ë¹êµ 29852 for (var i = 0; i < aItemCodeList.length; i++) { 29853 var sTargetItemCode = aItemCodeList[i]; 29854 // ì íëì§ìì íììµì ì ë³´ 29855 EC$('select[id^="' + product_option_id + '"][required="true"]').each(function () { 29856 var bResult = false; 29857 var sProductOptionId = EC$(this).attr('id'); 29858 29859 EC$(this).find('option').each(function () { 29860 if (EC$(this).val() == sTargetItemCode) { 29861 bResult = true; 29862 } 29863 }); 29864 if (bResult === false) { 29865 aRequiredFalseOption.push(sProductOptionId); 29866 } 29867 }); 29868 } 29869 // ì¤ì 첫ë²ì§¸ íìëë½ ìµì selector 29870 oExistRequiredSelect = EC$('select[id="' + aRequiredFalseOption[0] + '"][required="true"]'); 29871 29872 // íì í목과 ë¹êµ 29873 EC$('.soldout_option_box_id').each(function () { 29874 var sTargetItemCode = EC$(this).val(); 29875 for (var i = 0; i < aRequiredFalseOption.length; i++) { 29876 EC$('select[id="' + aRequiredFalseOption[i] + '"][required="true"] option').each(function () { 29877 if (EC$(this).val() == sTargetItemCode) { 29878 // íì ìµì selector 29879 oExistRequiredSelect = EC$(this).parent(); 29880 sMsg = __('íì ë ìíì êµ¬ë§¤ê° ë¶ê°ë¥í©ëë¤.'); 29881 } 29882 }); 29883 } 29884 }); 29885 } 29886 // 기존 ì í¨ì± ê²ì¦ ë©ì¸ì§ 29887 var sOrginalValidMsg = NEWPRD_ADD_OPTION.checkExistingValidMessage(this.parent.oObject, oValidAddProductCount); 29888 //ì¶ê°êµ¬ì±ìíì ì íëì´ìì¼ë©´ì 본ìíì ìµì ì´ ì í ìëììë 29889 sMsg = (sOrginalValidMsg === false) ? sMsg : sOrginalValidMsg; 29890 29891 alert(sMsg); 29892 if (oExistRequiredSelect !== false) { 29893 oExistRequiredSelect.focus(); 29894 } 29895 return false; 29896 } 29897 } else { 29898 // ê´ë ¨ìí ì²´í¬ íì¸ 29899 if (NEWPRD_ADD_OPTION.checkRelationProduct(this.parent.oObject, this.parent.sType) === false) { 29900 return false; 29901 } 29902 29903 // ë¨ë 구매ì ë©ì¸ìí íì ë ìíì¼ë ë©ìì§ ì²ë¦¬ 29904 if (NEWPRD_ADD_OPTION.checkSoldOutProductValid(this.parent.oObject) === true) { 29905 this.parent.UTIL.appendHidden('is_product_sold_out', 'T'); 29906 if (NEWPRD_ADD_OPTION.checkVaildIndividualMsg(
29906oIndividualValidData, this.parent.sType, this.parent.oObject) === false) { 29907 return false; 29908 } 29909 } 29910 if (FileOptionManager.checkValidation() === false) { 29911 return false; 29912 } 29913 } 29914 if (oValidAddProductCount.result === false) { 29915 if (oValidAddProductCount.message !== '') { 29916 alert(oValidAddProductCount.message); 29917 oValidAddProductCount.object.focus(); 29918 } 29919 return false; 29920 } 29921 if (oValidRelationProductCount.result === false) { 29922 if (oValidRelationProductCount.message !== '') { 29923 alert(oValidRelationProductCount.message); 29924 oValidRelationProductCount.object.focus(); 29925 } 29926 return false; 29927 } 29928 if (oIndividualValidData.isValidInidual === false) { 29929 // ì¶ê° ìµì ì²´í¬ (íëª©ê¸°ë° ì¶ê°ìµì ì¼ëë í¼ì ì¶ë ê²ì¦ ë¶íì) 29930 var oParent = (this.parent.sType === 'funding') ? EC$('.EC-funding-checkbox:checked').parents('.xans-product-funding') : null; 29931 if (NEWPRD_ADD_OPTION.isItemBasedAddOptionType() !== true && checkAddOption(null, oParent) === false) { 29932 this.parent.oDebug.setMessage('checkAddOption Fail'); 29933 return false; 29934 } 29935 } 29936 29937 if (NEWPRD_ADD_OPTION.checkPerAddInputOption() === false) { 29938 // íëª©ë³ ì¶ê° ìµì ì ë ¥ì ì²´í¬ 29939 return false; 29940 } 29941 return true; 29942 }, 29943 isValidAddproduct: function() 29944 { 29945 if (EC$('.add-product-checked:checked').length === 0) { 29946 return true; 29947 } 29948 29949 var aAddProduct = CAFE24.UTIL.parseJSON(add_option_data); 29950 var aItemCode = new Array(); 29951 var bCheckValidate = true; 29952 EC$('.add-product-checked:checked').each(function() { 29953 if (bCheckValidate === false) { 29954 return false; 29955 } 29956 var iProductNum = EC$(this).attr('product-no'); 29957 var iQuantity = EC$('#add-product-quantity-'+iProductNum).val(); 29958 var aData = aAddProduct[iProductNum]; 29959 if (aData.item_code === undefined) { 29960 if (aData.option_type === 'T') { 29961 if (aData.item_listing_type === 'S') { 29962 var aOptionValue = new Array(); 29963 EC$('[id^="addproduct_option_id_'+iProductNum+'"]').each(function() { 29964 aOptionValue.push(EC$(this).val()); 29965 }); 29966 if (ITEM.isOptionSelected(aOptionValue) === true) { 29967 sOptionValue = aOptionValue.join('#$%'); 29968 aItemCode.push([CAFE24.UTIL.parseJSON(aData.option_value_mapper)[sOptionValue],iQuantity]); 29969 } else { 29970 bCheckValidate = false; 29971 alert(__('íì ìµì ì ì íí´ì£¼ì¸ì.')); 29972 return false; 29973 } 29974 } else { 29975 var $eItemSelectbox = EC$('[name="addproduct_option_name_'+iProductNum+'"]'); 29976 29977 if (ITEM.isOptionSelected($eItemSelectbox.val()) === true) { 29978 aItemCode.push([$eItemSelectbox.val(),iQuantity]); 29979 } else { 29980 bCheckValidate = false; 29981 $eItemSelectbox.focus(); 29982 alert(__('íì ìµì ì ì íí´ì£¼ì¸ì.')); 29983 return false; 29984 } 29985 } 29986 } else if (Olnk.isLinkageType(sOptionType) === true) { 29987 EC$('[id^="addproduct_option_id_'+iProductNum+'"]').each(function() { 29988 alert(EC$(this).val()); 29989 if (EC$(this).prop('required') === true && ITEM.isOptionSelected(EC$(this).val()) === false) { 29990 bCheckValidate = false;
29991 EC$(this).focus(); 29992 alert(__('íì ìµì ì ì íí´ì£¼ì¸ì.')); 29993 return false; 29994 } 29995 29996 if (ITEM.isOptionSelected(EC$(this).val()) === true) { 29997 aItemCode.push([EC$(this).val(),iQuantity]); 29998 } 29999 }); 30000 } else { 30001 EC$('[id^="addproduct_option_id_'+iProductNum+'"]').each(function() { 30002 if (EC$(this).prop('required') === true && ITEM.isOptionSelected(EC$(this).val()) === false) { 30003 bCheckValidate = false; 30004 EC$(this).focus(); 30005 alert(__('íì ìµì ì ì íí´ì£¼ì¸ì.')); 30006 return false; 30007 } 30008 if (ITEM.isOptionSelected(EC$(this).val()) === true) { 30009 aItemCode.push([EC$(this).val(),iQuantity]); 30010 } 30011 }); 30012 } 30013 } else { 30014 aItemCode.push([aData.item_code,iQuantity]); 30015 } 30016 }); 30017 if (bCheckValidate === false) { 30018 return false; 30019 } 30020 for (var x = 0; x < aItemCode.length; x++) { 30021 this.UTIL.appendHidden('relation_item[]', aItemCode[x][1]+'||'+aItemCode[x][0]); 30022 } 30023 }, 30024 isValidRegularDelivery: function() // ì 기 ë°°ì¡ 30025 { 30026 if (PRODUCTSUBMIT.isRegularDelivery() === false) { 30027 return true; 30028 } 30029 if (EC_FRONT_JS_CONFIG_SHOP.bIsLogin === false) { 30030 alert(__('AVAILABLE.AFTER.LOGIN', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION')); 30031 btn_action_move_url('/member/login.html'); 30032 return false; 30033 } 30034 30035 var sSubscriptionCycleValue = PRODUCTSUBMIT.getRegularSelectedValue(); 30036 30037 if (sSubscriptionCycleValue === '') { 30038 alert(__('REGULAR.SHIPPING.CYCLE', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION')); 30039 return false; 30040 } 30041 30042 if (EC$('#EC_regular_count option:selected').val() === '') { 30043 alert(__('REGULAR.SHIPPING.COUNT', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION')); 30044 return false; 30045 } 30046 30047 return true; 30048 }, 30049 isValidFunding: function() 30050 { 30051 if (PRODUCTSUBMIT.sType !== 'funding') { 30052 return true; 30053 } 30054 30055 if (CAFE24.SHOP_FRONT_PRODUCT_FUNDING.isSelectComposition() === false) { 30056 alert(__('PRODUCT.CONFIGURATION', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION')); 30057 return false; 30058 } 30059 30060 if (CAFE24.SHOP_FRONT_PRODUCT_FUNDING.isItemSelected() === false) { 30061 alert(__('SELECT.REQUIRED.OPTION.001', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION')); 30062 return false; 30063 } 30064 30065 // ìµì 주문 ìë 30066 if (CAFE24.SHOP_FRONT_PRODUCT_FUNDING.isValidQuantity() === false) { 30067 alert(__('APPLY.RESERVATION', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION')); 30068 return false; 30069 } 30070 30071 return true; 30072 }, 30073 isExclusivePurchaseOnly: function() 30074 { 30075 if (PRODUCTSUBMIT.isExclusivePurchaseOnly() === false) { 30076 return true; 30077 } 30078 if (this.parent.sType === 2) { 30079 alert(__('EXCLUSIVE.PURCHASE.ONLY.CANNOT', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION')); 30080 return false; 30081 } 30082 30083 if (this.parent.sType === 1 && EC$('input[class^="option_add_box_"][name="basket_add_product[]"]').length > 0) { 30084 alert(__('EXCLUSIVE.PURCHASE.ONLY.BUY', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION')); 30085 return false; 30086 } 30087 return true; 30088 }, 30089 /** 30090 * ìì½ìí ë°ì´í° ê²ì¦ 30091 * @returns bool ìì½ìí ê²ì¦ íµê³¼í ê²½ì° true 30092 */ 30093 isValidReservationItemData: function() 30094 { 30095 return true; 30096 }, 30097 isValidCulturalTax: function() 30098 { 30099 // 본ìí : 문íë¹ì ì ê¸°ë°°ì¡ ëë¤ ëìì´ë©´ ì°¨ë¨ 30100 if (PRODUCTSUBMIT.isValidCulturalTax() === true && PRODUCTSUBMIT.isRegularDelivery() === true) { 30101 alert(__('THROUGH.REGULAR.DELIVERY', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION')); 30102 return false;
30103 } 30104 30105 // ì¶ê°êµ¬ì±ìí : 본íê³¼ ì¶ê°êµ¬ì±ìíì´ ë¬¸íë¹ì ì¼ë°ì´ ìì¬ ìì¼ë©´ ì°¨ë¨ 30106 if (EC$('input[class^="option_add_box_"][name="basket_add_product[]"]').length > 0) { 30107 const sCulturalTaxType = SHOP_FRONT_PRODUCT_CULTURAL_TAX.getIsCulturalTax(); 30108 const isConsistent = EC$('input[class^="option_add_box_"][name="basket_add_product[]"]').toArray().every(input => { 30109 const addProductValue = $(input).val(); 30110 const addProductArray = addProductValue.split('||'); 30111 const sAddCulturalTaxType = addProductArray.length > 12 ? addProductArray[12] : ''; 30112 if (sAddCulturalTaxType === 'T' || sAddCulturalTaxType === 'F') { 30113 return sCulturalTaxType === sAddCulturalTaxType; 30114 } 30115 return true; // 'T' ëë 'F'ê° ìë ê²½ì° ê²ì¦íì§ ìì 30116 }); 30117 30118 if (!isConsistent) { 30119 alert(__('CANNOT.PURCHASED.TOGETHER', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION')); 30120 return false; 30121 } 30122 } 30123 30124 return true; 30125 } 30126 }, 30127 getRegularSelectedValue : function() 30128 { 30129 var sSubscriptionCycleAttrName = '.EC_regular_cycle_count'; 30130 if (EC$('.EC_regular_cycle_count').prop('type') === 'select-one') { 30131 sSubscriptionCycleAttrName = '.EC_regular_cycle_count > option:selected'; 30132 } else if (EC$('.EC_regular_cycle_count:checked').length > 0) { 30133 sSubscriptionCycleAttrName = '.EC_regular_cycle_count:checked'; 30134 } 30135 30136 var sSubscriptionCycleValue = ''; 30137 if (EC$('.EC_regular_cycle_count').length === 0) { 30138 sSubscriptionCycleValue = parent.EC$(sSubscriptionCycleAttrName).val(); 30139 } else { 30140 sSubscriptionCycleValue = EC$(sSubscriptionCycleAttrName).val(); 30141 } 30142 30143 return sSubscriptionCycleValue; 30144 }, 30145 getRegularCountSelectedValue : function() 30146 { 30147 var sSubscriptionCountAttrName = '.EC_regular_count'; 30148 if (EC$('.EC_regular_count').prop('type') === 'select-one') { 30149 sSubscriptionCountAttrName = '.EC_regular_count > option:selected'; 30150 } else if (EC$('.EC_regular_count:checked').length > 0) { 30151 sSubscriptionCountAttrName = '.EC_regular_count:checked'; 30152 } 30153 30154 var sSubscriptionCountValue = ''; 30155 if (EC$('.EC_regular_count').length === 0) { 30156 sSubscriptionCountValue = parent.EC$(sSubscriptionCountAttrName).val(); 30157 } else { 30158 sSubscriptionCountValue = EC$(sSubscriptionCountAttrName).val(); 30159 } 30160 30161 return sSubscriptionCountValue; 30162 }, 30163 UTIL: { 30164 oData: {}, 30165 initialize: function(oParent) 30166 { 30167 this.parent = oParent; 30168 return this; 30169 }, 30170 appendHidden: function(mParam) 30171 { 30172 if (typeof(mParam) === 'string' && arguments.length === 2) { 30173 this.setHidden(arguments[0], arguments[1]); 30174 } 30175 if (typeof(mParam) === 'object') { 30176 for (var sName in mParam) { 30177 if (Array.isArray(mParam[sName]) === true) { 30178 EC$.each(mParam[sName], function(iIndex, mValue) { 30179 PRODUCTSUBMIT.UTIL.setHidden(sName+'[]', mValue); 30180 }); 30181 continue; 30182 } 30183 this.setHidden(sName, mParam[sName]); 30184 } 30185 } 30186 }, 30187 prependHidden: function(mParam) 30188 { 30189 if (typeof(mParam) === 'string' && arguments.length === 2) { 30190 this.setHidden(arguments[0], arguments[1], 'prepend'); 30191 } 30192 if (typeof(mParam) === 'object') { 30193 for (var sName in mParam) { 30194 if (Array.isArray(mParam[sName]) === true) { 30195 EC$.each(mParam[sName], function(iIndex, mValue) { 30196 PRODUCTSUBMIT.UTIL.setHidden(sName+'[]', mValue, 'prepend'); 30197 }); 30198 continue; 30199 } 30200 this.setHidden(sName, mParam[sName], 'prepend'); 30201 } 30202 } 30203 }, 30204 setHidden: function(sName, sValue, sAppendType) 30205 { 30206 //ECHOSTING-9736 30207 if (typeof(sValue) === "string" && (sName == "option_add[]" || sName.indexOf("item_option_add") === 0)) { 30208 sValue = sValue.replace(/'/g, '\\''); 30209 } 30210 30211 // íì ì´ string ì¼ë ì°ì°ì ë¨ì¼ ë°ìí " ' " 문ì를 " ` " ì¡ì¼í¸ 문ìë¡ ì¹ííì¬ ê¹¨ì§ì ë°©ì§ 30212 var oAttribute = { 30213 'name': sName, 30214 'type': 'hidden', 30215 'class': 'basket-hidden' 30216 }; 30217 if (sAppendType === 'prepend') { 30218 this.parent.oForm.prepend(EC$('<input>').attr(oAttribute).val(sValue)); 30219 30220 } else { 30221 this.parent.oForm.append(EC$('<input>').attr(oAttribute).val(sValue)); 30222 30223 } 30224 }, 30225 setData: function(sKey, mValue) 30226 { 30227 this.oData[sKey] = mValue; 30228 return true; 30229 }, 30230 getData: function(sKey) 30231 { 30232 return this.oData[sKey]; 30233 } 30234 }, 30235 DEBUG: { 30236 aMessage: [], 30237 initialize: function(oParent) 30238 { 30239 this.aMessage = []; 30240 this.parent = oParent; 30241 this.bIsDebugConsoleOut = this.parent.bIsDebugConsoleOut; 30242 return this; 30243 }, 30244 setInfo: function() 30245 { 30246 if (this.bIsDebugConsoleOut === false) { 30247 return; 30248 } 30249 if (window.console) { 30250 var aMessage = []; 30251 for (var i = 0; i < arguments.length; i++) { 30252 aMessage.push(arguments[i]); 30253 } 30254 console.info(aMessage.join('')); 30255 } 30256 }, 30257 setMessage: function(sMessage) 30258 { 30259 this.aMessage.push(sMessage); 30260 this.setConsoleDebug(); 30261 throw 'USER_DEFINED_ERROR'; 30262 }, 30263 setConsoleDebug: function() 30264 { 30265 if (this.bIsDebugConsoleOut === false) { 30266 return; 30267 } 30268 if (window.console) { 30269 console.warn(this.aMessage.join('\n')); 30270 } 30271 }, 30272 messageOut: function(mError, sLabel) 30273 { 30274 if (this.bIsDebugConsoleOut === true && mError !== 'USER_DEFINED_ERROR') { 30275 console.error(mError); 30276 } 30277 30278 if (typeof EC_JET === 'object' && EC_JET.hasOwnProperty('message') === true) { 30279 var oErrorMessage = mError === 'USER_DEFINED_ERROR' ? this.aMessage : mError; 30280 EC_JET.message(oErrorMessage, sLabel); 30281 } 30282 30283 return false;
30284 } 30285 }, 30286 setLoginMovePage: function(sUrl , sMessage) 30287 { 30288 if (sMessage !== '') { 30289 alert(sMessage); 30290 } 30291 if (typeof(sUrl) === 'undefined') { 30292 sUrl = '/member/login.html'; 30293 } 30294 var oTarget = CAPP_SHOP_FRONT_COMMON_UTIL.findTargetFrame(); 30295 sUrl += '?returnUrl=' + encodeURIComponent(oTarget.location.pathname + oTarget.location.search); 30296 oTarget.location.href = sUrl; 30297 }, 30298 isRegularDelivery : function() 30299 { 30300 if (EC_FRONT_JS_CONFIG_SHOP.bRegularConfig === false) { 30301 return false; 30302 } 30303 if (EC$('.EC_regular_delivery:checked').length === 0 || EC$('.EC_regular_delivery:checked').val() === 'F') { 30304 return false; 30305 } 30306 30307 return true; 30308 }, 30309 30310 sendLoginPage : function(iPrdNo, sBuyLimitType) { 30311 var sLoginPage = '/member/login.html?returnUrl=' + encodeURIComponent(location.pathname + location.search); 30312 var oTarget = document; 30313 // ë¶ë¥íì´ì§ìì ìµì ì íë ì´ì´ìì ì íììë ë¶ëª¨íì´ì§ë¥¼ ë¡ê·¸ì¸íì´ì§ë¡ ì´ë 30314 if (parent.$('#capp-shop-new-product-optionselect-layer').length > 0 || parent.$('#modalContent').length > 0) { 30315 oTarget = parent.top.document; 30316 } 30317 30318 if (typeof iPrdNo !== 'undefined') { 30319 EC$.ajax({ 30320 url: '/exec/front/Shop/ApiProductPurchase', 30321 type: 'get', 30322 async: false, 30323 data: { 30324 'product_no': iPrdNo 30325 }, 30326 dataType: 'json', 30327 success: function(oReturn) { 30328 if (oReturn.bIsSuccess === true) { 30329 //ìíì ë³´ê° ë³ê²½ëì´ êµ¬ë§¤í ì ììµëë¤. 30330 alert(sprintf(__('INFORMATION.CHANGED', 'SHOP.JS.FRONT.NEW.PRODUCT.SET'), '')); 30331 return; 30332 } 30333 30334 alert(oReturn.sMessage); 30335 if (oReturn.bReplaceLoginPage === true) { 30336 oTarget.location.href = sLoginPage; 30337 } 30338 } 30339 }); 30340 return; 30341 } else if (typeof iProductNo !== 'undefined') { 30342 if (typeof CAFE24.FRONT_JS_CONFIG_SHOP !== 'undefined' && CAFE24.FRONT_JS_CONFIG_SHOP.hasOwnProperty('aProductPurchaseInfo_' + iProductNo) === true) { 30343 var oPurchaseInfo = CAFE24.FRONT_JS_CONFIG_SHOP['aProductPurchaseInfo_' + iProductNo]; 30344 alert(oPurchaseInfo.sMessage); 30345 if (oPurchaseInfo.bReplaceLoginPage === true) { 30346 oTarget.location.href = sLoginPage; 30347 } 30348 return; 30349 } 30350 } 30351 30352 sMsg = __('CAN.PURCHASE.GROUP', 'GLOBAL.BUY.LIMIT'); 30353 if (sBuyLimitType == 'O' || sBuyLimitType == 'D') { 30354 sMsg = __('CAN.PURCHASE.MEMBER.USE', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION'); 30355 } 30356 alert(sMsg); 30357 }, 30358 isExclusivePurchaseOnly: function() 30359 { 30360 if (EC_FRONT_JS_CONFIG_SHOP.bIsExclusivePurchaseOnly === false) { 30361 return false; 30362 } 30363 return true; 30364 }, 30365 isValidCulturalTax: function() 30366 { 30367 return SHOP_FRONT_PRODUCT_CULTURAL_TAX.getIsCulturalTax() === 'T'; 30368 } 30369}; 30370 30371// ìí ìµì id 30372var product_option_id = 'product_option_id'; 30373 30374// ì¶ê°ìµì id 30375var add_option_id = 'add_option_'; 30376 30377// ì íë ìíë§ ì£¼ë¬¸í기 30378var sIsPrdOverride = 'F'; 30379 30380//모ë°ì¼ë¡ ì ìíëì§ 30381var bIsMobile = false; 30382 30383//ë¶ë¦¬í ì¸í¸ìíì 구ì±ìí(íì )ìì SMS ì¬ì ê³ ì림 íì í¸ì¶ 30384function set_sms_restock(iProductNo) { 30385 if (typeof(iProductNo) === 'undefined') { 30386 return; 30387 } 30388 30389 // 모ë°ì¼ ì ì ë° ë ì´ì´ íì ì¬ë¶ íì¸ 30390 if (typeof(EC_SHOP_FRONT_PRODUCT_SMS_RESTOCK_LAYER) !== 'undefined') { 30391 var sParam = 'product_no=' + iProductNo; 30392 if (EC_SHOP_FRONT_PRODUCT_SMS_RESTOCK_LAYER.createSmsRestockLayerDisplayResult(sParam) === true) { 30393 return; 30394 } 30395 } 30396 30397 window.open('/product/sms_restock.html?product_no=' + iProductNo, 'sms_restock', 200, 100, 459, 490); 30398} 30399 30400// ìì½ ì£¼ë¬¸ ì²´í¬ 30401var STOCKTAKINGCHECKRESERVE = { 30402 checkReserve: function() 30403 { 30404 var bIsReserveStatus = EC$('.option_box_id').filter('[data-item-reserved="R"]').length > 0; 30405 // ìì½ ì£¼ë¬¸ì´ ìëê²½ì° 30406 if (bIsReserveStatus === true) { 30407 alert(__('ITEMS.MAY.SHIPPED', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION')); 30408 } 30409 return false;
30410 } 30411}; 30412 30413 30414/** 30415 * sType - 1:ë°ë¡êµ¬ë§¤, 2:ì¥ë°êµ¬ë,naver_checkout:ë¤ì´ë² íì´ form.submit - ë°ë¡êµ¬ë§¤, ì¥ë°êµ¬ë, ê´ì¬ìí 30416 * app: app ìì íìí ì¥ë°êµ¬ëë°ì´í° "aAppBasketInsertItem" return 30417 * TODO ë°ë¡êµ¬ë§¤ - ì¥ë°êµ¬ëì ë£ì¼ë©´ì 주문í ìí íëë§ ì£¼ë¬¸í기 30418 * 30419 * @param string sAction action url 30420 */ 30421function product_submit(sType, sAction, oObj, aInfo, defer) 30422{ 30423 // jwtìì ì¤ë³µí¸ì¶ì´ ëì´ì¼íì¬ í¨ì¤í ì ìëë¡ ìì¸ì²ë¦¬ 30424 if (sType !== 'direct_buy' && unsetOnclikAction(oObj) === false) { 30425 return; 30426 } 30427 PRODUCTSUBMIT.initialize(sType, sAction, oObj, aInfo); 30428 30429 if (PRODUCTSUBMIT.isValidRequest() === false) { 30430 setTimeout(function() { 30431 setOnclikAction(); 30432 }, 1000); 30433 return { 30434 'result': false, 30435 'code': 422, 30436 'message': 'fail valid request' 30437 } 30438 } 30439 30440 if (PRODUCTSUBMIT.setBasketForm() === false) { 30441 setTimeout(function() { 30442 setOnclikAction(); 30443 }, 1000); 30444 return { 30445 'result': false, 30446 'code': 422, 30447 'message': 'fail basket form' 30448 } 30449 } 30450 30451 PRODUCTSUBMIT.setBasketAjax(defer); 30452 30453 setTimeout(function() { 30454 setOnclikAction(); 30455 }, 1000); 30456 30457 return; 30458} 30459 30460/** 30461 * ì ííìíë§ ì£¼ë¬¸í기 30462 * 30463 * @param string sOptionParam ìµì íëê° 30464 * @param int iProductNo ìíë²í¸ 30465 * @param string sSelectedItemByEtype ìíì°ëíì ê²½ì° ì ë ¥ëë ì íëìµì json ë°ì´í° 30466 */ 30467function selectbuy_action(sOptionParam, iProductNo, sSelectedItemByEtype) 30468{ 30469 var sAddParam = ''; 30470 if (typeof sSelectedItemByEtype !== 'undefined' && sSelectedItemByEtype != '') { 30471 sAddParam = '&' + sSelectedItemByEtype; 30472 } 30473 30474 var sChRefDataParam = ''; 30475 if (CAFE24.getChRefData()) { 30476 sChRefDataParam = '&ch_ref=' + CAFE24.getChRefData(); 30477 } 30478 30479 var sUrl = '/exec/front/order/basket/?command=select_prdcnt&product_no=' + iProductNo + '&option_type=' + (window['option_type'] || '') + sOptionParam + sAddParam + sChRefDataParam; 30480 30481 EC$.ajax( 30482 { 30483 url: sUrl, 30484 dataType: 'json', 30485 async: false, 30486 success: function(data) 30487 { 30488 if (data.result > 0) { 30489 //1+Nìíì´ë¼ë©´ 30490 if (typeof CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE !== 'undefined' && CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.oBundleConfig.hasOwnProperty(iProductNo) === true) { 30491 sIsPrdOverride = 'F'; 30492 } else { 30493 if (confirm(CAFE24.SHOP_FRONT_NEW_PRODUCT_COMMON.getOverridePurchaseMessage(data.result)) === false) { 30494 sIsPrdOverride = 'T'; 30495 } 30496 } 30497 } 30498 } 30499 }); 30500} 30501var sOnclick = null; 30502var oThisSelector = null; 30503 30504/** 30505 * ì¤ë³µí´ë¦ ë°©ì§ë¥¼ ìí onclick off ì²ë¦¬ 30506 * @param object oObject í´ë¦ë ì¤ë¸ì í¸ 30507 * @returns {boolean} 30508 */ 30509function unsetOnclikAction(oObject) 30510{ 30511 oSelector = EC$(oObject); 30512 // ì¤ë³µí´ë¦ ì ì´ 30513 if (sOnclick !== null) { 30514 //alert(__('ì²ë¦¬ì¤ì ëë¤. ì ìë§ ê¸°ë¤ë ¤ì£¼ì¸ì.')); 30515 return false; 30516 } 30517 // onclick ìì± ì ê±°í ìì ì ì¥ 30518 sOnclick = oSelector.attr('onclick'); 30519 oSelector.attr('onclick', ''); 30520 oThisSelector = oSelector; 30521 30522 return true; 30523 30524} 30525/** 30526 * ì¤ë³µí´ë¦ onclick 복구 30527 */ 30528function setOnclikAction() 30529{ 30530 // ì ê±°ë onclick ìì± ë³µêµ¬ 30531 if (sOnclick !== null) { 30532 oThisSelector.attr('onclick', sOnclick); 30533 } 30534 sOnclick = null; 30535 oThisSelector = null; 30536} 30537/** 30538 * ì¥ë°êµ¬ë ë´ê¸°(ì¹´í ê³ ë¦¬) 30539 * 30540 * @param int iProductNo ìíë²í¸ 30541 * @param int iCategoryNo ì¹´í ê³ ë¦¬ ë²í¸ 30542 * @param int iDisplayGroup display_group 30543 * @param string sBasketType 무ì´ì ì¤ì (A0000:ì¼ë°, A0001:무ì´ì) 30544 * @param string iQuantity 주문ìë 30545 * @param string sItemCode ìì´í ì½ë 30546 * @param string sDelvType ë°°ì¡íì 30547 */ 30548function category_add_basket(iProductNo, iCategoryNo, iDisplayGroup, sBasketType, bList, iQuantity, sItemCode, sDelvType, sProductMaxType, sProductMax) 30549{ 30550 if (unsetOnclikAction(this.event.target) === false) { 30551 return; 30552 } 30553 if (iQuantity == undefined) { 30554 iQuantity = 1; 30555 } 30556 if (typeof EC_FRONT_JS_CONFIG_SHOP !== 'undefined' && typeof EC_FRONT_JS_CONFIG_SHOP.aExclusivePurchase !== 'undefined' && EC_FRONT_JS_CONFIG_SHOP.aExclusivePurchase !== null) { 30557 if (EC_FRONT_JS_CONFIG_SHOP.aExclusivePurchase.hasOwnProperty(iProductNo) === true) { 30558 if (EC_FRONT_JS_CONFIG_SHOP.aExclusivePurchase[iProductNo]) { 30559 alert(__('EXCLUSIVE.PURCHASE.ONLY.CANNOT', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION')); 30560 setTimeout(function() { 30561 setOnclikAction(); 30562 }, 1000); 30563 return false;
30564 } 30565 } 30566 } 30567 if (bList == true) { 30568 try { 30569 if (typeof EC_ListAction === 'object') { 30570 EC_ListAction.getOptionSelect(iProductNo, iCategoryNo, iDisplayGroup, sBasketType); 30571 } 30572 } catch (e) { 30573 PRODUCTSUBMIT.DEBUG.messageOut(e, 'PRODUCT_ACTION.category_add_basket'); 30574 alert(__('ì¥ë°êµ¬ëì ë´ì ì ììµëë¤.')); 30575 setTimeout(function() { 30576 setOnclikAction(); 30577 }, 1000); 30578 return false; 30579 } 30580 } else { 30581 var sAction = '/exec/front/order/basket/'; 30582 var sData = 'command=add&quantity=' + iQuantity + '&product_no=' + iProductNo + '&main_cate_no=' + iCategoryNo + '&display_group=' 30583 + iDisplayGroup + '&basket_type=' + sBasketType + '&delvtype=' + sDelvType + '&product_max_type=' + sProductMaxType + '&product_max=' + sProductMax 30584 + '&iQuantity=' + iQuantity + '&sFrom=category'; 30585 // ì¥ë°êµ¬ë ìì리ì¤í¸ì¸ì§ ì¬ë¶ 30586 if (typeof (basket_page_flag) !== 'undefined' && basket_page_flag == 'T') { 30587 sData = sData + '&basket_page_flag=' + basket_page_flag; 30588 } 30589 30590 action_basket(2, 'category', sAction, sData, sBasketType); 30591 } 30592 30593} 30594 30595/** 30596 * 구매í기 30597 * 30598 * @param int iProductNo ìíë²í¸ 30599 * @param int iCategoryNo ì¹´í ê³ ë¦¬ ë²í¸ 30600 * @param int iDisplayGroup display_group 30601 * @param string sBasketType 무ì´ì ì¤ì (A0000:ì¼ë°, A0001:무ì´ì) 30602 * @param string iQuantity 주문ìë 30603 */ 30604function add_order(iProductNo, iCategoryNo, iDisplayGroup, sBasketType, iQuantity) 30605{ 30606 if (iQuantity == undefined) { 30607 iQuantity = 1; 30608 } 30609 30610 var sAction = '/exec/front/order/basket/'; 30611 var sData = 'command=add&quantity=' + iQuantity + '&product_no=' + iProductNo + '&main_cate_no=' + iCategoryNo + '&display_group=' 30612 + iDisplayGroup + '&basket_type=' + sBasketType; 30613 30614 action_basket(1, 'wishlist', sAction, sData, sBasketType); 30615} 30616 30617/** 30618 * ë ì´ì´ ìì± 30619 * 30620 * @param layerId 30621 * @param sHtml 30622 */ 30623function create_layer(layerId, sHtml, oTarget) 30624{ 30625 let sChRefData = CAFE24.getChRefData(); 30626 //ìì´íë ìì¼ëë§ ììê°ì²´ì ë ì´ì´ìì± 30627 if (oTarget === parent) { 30628 oTarget.EC$('#' + layerId).remove(); 30629 oTarget.EC$('body').append(EC$('<div id="' + layerId + '" style="position:absolute; z-index:10001;"></div>')); 30630 oTarget.EC$('#' + layerId).html(sHtml); 30631 oTarget.EC$('#' + layerId).show(); 30632 30633 parent.ReferenceCurrencyPrice.init(); 30634 //ìµì ì í ë ì´ì´ íë ìì¼ ê²½ì° ê·¸ëë¡ ëê²½ì° ìììëí´ í´ë¦ì´ ìëëë¶ë¶ë문ì ìì ì²ë¦¬ 30635 if (typeof(bIsOptionSelectFrame) !== 'undefined' && bIsOptionSelectFrame === true) { 30636 parent.CAPP_SHOP_NEW_PRODUCT_OPTIONSELECT.closeOptionCommon(); 30637 } 30638 } else { 30639 EC$('#' + layerId).remove(); 30640 EC$('<div id="' + layerId + '"></div>').appendTo('body'); 30641 EC$('#' + layerId).html(sHtml); 30642 EC$('#' + layerId).show(); 30643 30644 ReferenceCurrencyPrice.init(); 30645 } 30646 30647 let sBasketUrl = '/order/basket.html?delvtype=' + delvtype; 30648 if (sChRefData !== undefined) { 30649 sBasketUrl += "&ch_ref=" + sChRefData; 30650 } 30651 // set delvtype to basket 30652 try { 30653 EC$(".xans-product-basketadd").find("a[href^='/order/basket.html']").attr("href", sBasketUrl); 30654 } catch (e) {} 30655 try { 30656 EC$(".xans-order-layerbasket").find("a[href='/order/basket.html']").attr("href", sBasketUrl); 30657 } catch (e) {} 30658} 30659 30660/** 30661 * ë ì´ì´ ìì¹ ì¡°ì 30662 * 30663 * @param layerId 30664 */ 30665function position_layer(layerId) 30666{ 30667 var obj = EC$('#' + layerId); 30668 30669 var x = 0; 30670 var y = 0; 30671 try { 30672 var hWd = parseInt(document.body.clientWidth / 2 + EC$(window).scrollLeft()); 30673 var hHt = parseInt(document.body.clientHeight / 2 + EC$(window).scrollTop() / 2); 30674 var hBW = parseInt(obj.width()) / 2; 30675 var hBH = parseInt(hHt - EC$(window).scrollTop()); 30676 30677 x = hWd - hBW; 30678 if (x < 0) x = 0; 30679 y = hHt - hBH; 30680 if (y < 0) y = 0; 30681 30682 } catch (e) {} 30683 30684 obj.css( 30685 { 30686 position: 'absolute', 30687 display: 'block', 30688 top: y + "px", 30689 left: x + "px" 30690 }); 30691 30692} 30693 30694 30695// ì¥ë°êµ¬ë ë´ê¸° ì²ë¦¬ì¤ì¸ì§ ì²´í¬ - (ECHOSTING-85853, 2013.05.21 by wcchoi) 30696var bIsRunningAddBasket = false;
30697 30698var aAppBasketInsertItem = null; // ì¥ë°êµ¬ë insert ëì í, í´ë¹ ì¥ë°êµ¬ë ë°ì´í° 30699var aCheckoutBasketItem; 30700var bIsCheckoutBasketSet = false; // ì²´í¬ìì ê²°ì ìë¨ (kakaopay...) ì¥ë°êµ¬ë ì¸í ì¬ë¶ 30701 30702/** 30703 * ì¥ë°êµ¬ë/구매 í¸ì¶ 30704 * 30705 * @param sType 30706 * @param sGroup 30707 * @param sAction 30708 * @param sParam 30709 * @param aBasketType 30710 * @param bNonDuplicateChk 30711 */ 30712 30713function action_basket(sType, sGroup, sAction, sParam, sBasketType, bNonDuplicateChk, defer) 30714{ 30715 if (bIsRunningAddBasket) { 30716 //alert(__('ì²ë¦¬ì¤ì ëë¤. ì ìë§ ê¸°ë¤ë ¤ì£¼ì¸ì.')); 30717 return; 30718 } 30719 30720 // ì¥ë°êµ¬ë ë´ê¸°ì ëí´ìë§ ì²ë¦¬ 30721 // ì¤ë³µ ì²´í¬ ìí¨ ì´ trueê° ìëê²½ì°(falseë null)ìë§ ì¤ë³µì²´í¬ 30722 if (sType == 2 && bNonDuplicateChk != true) { 30723 if (bIsRunningAddBasket === false) { 30724 bIsRunningAddBasket = true; 30725 } 30726 } 30727 30728 if (sType == 'sms_restock') { 30729 action_sms_restock(sParam); 30730 return; 30731 } 30732 30733 if (sType == 'email_restock') { 30734 action_email_restock(); 30735 return; 30736 } 30737 30738 if (sType == 2 && CAFE24.SHOP_FRONT_BASKET_VALID.isBasketProductDuplicateValid(sParam) === false) { 30739 bIsRunningAddBasket = false; 30740 setTimeout(function() { 30741 setOnclikAction(); 30742 }, 1000); 30743 return false; 30744 } 30745 30746 // UA ì´ê¸°í ì´ìë¡ ë기í¸ì¶ë¡ ë³ê²½ (ECHOSTING-446124) 30747 EC$.ajax({ 30748 type: 'POST', 30749 url: sAction, 30750 data: sParam, 30751 async: false, 30752 success: function(data) { 30753 30754 // ë°ë¡êµ¬ë§¤(direct_buy)ë ì±ë UI ììë ì¼ë° ê²°ê³¼ í¸ë¤ë¬(basket_result_action)ë¡ ì²ë¦¬íë¤. (ECHOSTING-625233) 30755 // ì±ë ê²°ê³¼ í¸ë¤ë¬(basket_result_action_channel)ìë directbuy ì 주문ì ê°±ì (setOrderFormâformdirectbuy) ë¶ê¸°ê° ìì´ 30756 // ì ì©ëìì¸ ë°ë¡êµ¬ë§¤ìì ìí/ê²°ì ê¸ì¡ì´ ë ëëì§ ì기 ë문ì´ë¤. 30757 if (CAFE24.checkChannelUI() === true && sType !== 'direct_buy') { 30758 if (sType == 1) { 30759 CAFE24_CHANNEL_MANAGE.do(function(options) { 30760 var defaults = { 30761 _sType: sType, 30762 _sGroup: sGroup, 30763 _data: data, 30764 _sBasketType: sBasketType, 30765 _sParam: sParam, 30766 _defer: defer 30767 }; 30768 var settings = EC$.extend({}, defaults, options); 30769 30770 // settings ê°ì²´ë¥¼ ì¬ì©íì¬ ìì ìí 30771 basket_result_action_channel(settings._sType, settings._sGroup, settings._data, settings._sBasketType, settings._sParam, settings._defer); 30772 }); 30773 30774 /*CAFE24_CHANNEL_MANAGE.do(function(_sType = sType, _sGroup = sGroup, _data = data, _sBasketType = sBasketType, _sParam = sParam, _defer = defer) { 30775 basket_result_action_channel(_sType, _sGroup, _data, _sBasketType, _sParam, _defer); 30776 });*/ 30777 } else { 30778 basket_result_action_channel(sType, sGroup, data, sBasketType, sParam, defer); 30779 } 30780 } else { 30781 basket_result_action(sType, sGroup, data, sBasketType, sParam, defer); 30782 } 30783 30784 bIsRunningAddBasket = false; // ì¥ë°êµ¬ë ë´ê¸° ì²ë¦¬ ìë£ 30785 30786 setTimeout(function() { 30787 setOnclikAction(); 30788 }, 1000); 30789 30790 // ì¸ì ì¤í ë¦¬ì§ BasketProduct ìºì ìì 30791 EC$(function() { 30792 try { 30793 CAPP_ASYNC_METHODS.BasketProduct.removeCache(); 30794 } catch (e) { 30795 } 30796 }); 30797 }, 30798 dataType: 'json' 30799 }); 30800 30801} 30802 30803/** 30804 * 리ì¤í¸ë ìì¸ìì ì¥ë°êµ¬ë ì´íì ì¡ì ì ì²ë¦¬íê³ ì¶ì ê²½ì° ì´ë³ì를 íë¼ë¯¸í°ë¡ ì§ì í´ì¤ 30805 */ 30806var sProductLink = null; 30807/** 30808 * ì¥ë°êµ¬ë ê²°ê³¼ ì²ë¦¬ 30809 * 30810 * @param sType 30811 * @param sGroup 30812 * @param aData 30813 * @param sBasketType 30814 * @param sParam 30815 */ 30816function basket_result_action(sType, sGroup, aData, sBasketType, sParam, defer) 30817{ 30818 if (aData == null) { 30819 return; 30820 } 30821 30822 var sHtml = ''; 30823 var bOpener = false;
30824 var oTarget = CAPP_SHOP_FRONT_COMMON_UTIL.findTargetFrame(); 30825 var bIsProgressLink = true; 30826 30827 var oCheckZoomPopUp = { 30828 isPopUp: function() 30829 { 30830 var bIsPopup = false; 30831 if (bIsProgressLink === true || (typeof(sIsPopUpWindow) !== "undefined" && sIsPopUpWindow === "T")) { 30832 if (CAPP_SHOP_FRONT_COMMON_UTIL.isPopupFromThisShopFront() === true) { 30833 bIsPopup = true; 30834 } 30835 } 30836 return bIsPopup; 30837 } 30838 }; 30839 30840 //var oOpener = findMainFrame(); 30841 //var sLocation = location; 30842 var bBuyLayer = false; 30843 30844 // ì¿ í°ì ì© ê°ë¥ìí íì -> ìíëª í´ë¦íì¬ ìíìì¸ ì§ì -> ë°ë¡ 구매 ì, 30845 // ì¿ í°ì ì© ê°ë¥ìí íì ì´ ì´ë ¤ìì¼ë©´ 주문ì íì´ì§ë¡ ì´ëëì§ ìê³ , ì°½ì´ ë«ì´ë ì´ì ì²ë¦¬(ECHOSTING-266906) 30846 if (sType == 1 && window.opener !== null && oTarget.couponPopupClose !== undefined) { 30847 bOpener = true; 30848 } 30849 30850 if (aData.result >= 0) { 30851 try { 30852 bBuyLayer = ITEM.setBodyOverFlow(true); 30853 } catch (e) { 30854 PRODUCTSUBMIT.DEBUG.messageOut(e, 'PRODUCT_ACTION.basket_result_action'); 30855 } 30856 30857 // - insert ë ì¥ë°êµ¬ë ë°ì´í° : aAppBasketInsertItem 30858 if (sType == 'app') { 30859 aAppBasketInsertItem = aData['aBasketProduct']; 30860 defer(aAppBasketInsertItem); 30861 return; 30862 } 30863 30864 if (sType == 'checkout') { 30865 aCheckoutBasketItem = aData['aBasketProduct']; 30866 bIsCheckoutBasketSet = true; 30867 return; 30868 } 30869 30870 // ë¤ì´ë² íì´ 30871 if (sType == 'naver_checkout') { 30872 var sUrl = '/exec/front/order/navercheckout'; 30873 30874 // inflow param from naver common JS to Checkout Service 30875 try { 30876 if (typeof(wcs) === 'object') { 30877 var inflowParam = wcs.getMileageInfo(); 30878 if (inflowParam != false) { 30879 sUrl = sUrl + '?naver_inflow_param=' + inflowParam; 30880 } 30881 } 30882 } catch (e) {} 30883 30884 // ECHOSTING-627626 CA_JS ê´ê³ í¼ ë°ì´í° ëë´ ìí´ POST í¼ ì ì¶ë¡ ì í 30885 CAPP_SHOP_FRONT_COMMON_UTIL.submitNaverCheckout(sUrl, oTarget, (is_order_page == 'N' && bIsMobile == false)); 30886 return false; 30887 } 30888 30889 // ë°°ì¡ì í 30890 var sDelvType = ''; 30891 if (typeof(delvtype) !== 'undefined') { 30892 if (typeof(delvtype) === 'object') { 30893 sDelvType = EC$(delvtype).val(); 30894 } else { 30895 sDelvType = delvtype; 30896 } 30897 } else if (aData.sDelvType != null) { 30898 sDelvType = aData.sDelvType; 30899 } 30900 30901 if (sType == 1 || sType === 'funding' || sType === 'simple_pay' || sType === 'reservation') { // ë°ë¡êµ¬ë§¤í기 30902 var sSimplePayType = ''; 30903 if (sType === 'simple_pay' && aData.sPaymethod.length > 0) { 30904 sSimplePayType = '&paymethod=' + aData.sPaymethod; 30905 } 30906 30907 if (aData.isLogin == 'T') { // íì 30908 var sUrl = "/order/orderform.html?basket_type=" + sBasketType + "&delvtype=" + sDelvType + sSimplePayType; 30909 30910 // URL ì ch_ref íë¼ë¯¸í° ì¶ê° 30911 if (CAFE24.hasChRef()) { 30912 // ì´ë¯¸ ch_refê° í¬í¨ëì´ ìëì§ íì¸ 30913 var urlObj = new URL(sUrl, window.location.origin); 30914 if (!urlObj.searchParams.has('ch_ref')) { 30915 sUrl = CAFE24.attachChRef(sUrl); 30916 } 30917 } 30918 30919 if (bOpener === true) { 30920 // ì¿ í°ì ì© ê°ë¥ìí íì ì´ ì´ë ¤ìì ë, íì ì´ ìë íì¬ íì´ì§(ìíìì¸)ê° ì£¼ë¬¸ì íì´ì§ë¡ ì´ëëëë¡ ì²ë¦¬(ECHOSTING-266906) 30921 self.location.href = sUrl; 30922 } else { 30923 oTarget.location.href = sUrl; 30924 } 30925 } else { // ë¹íì 30926 sUrl = '/member/login.html?noMember=1&returnUrl=' + encodeURIComponent('/order/orderform.html?basket_type=' + sBasketType + "&delvtype=" + sDelvType + sSimplePayType); 30927 sUrl += '&delvtype=' + sDelvType; 30928 30929 // URL ì ch_ref íë¼ë¯¸í° ì¶ê° 30930 if (CAFE24.hasChRef()) { 30931 // ì´ë¯¸ ch_refê° í¬í¨ëì´ ìëì§ íì¸ 30932 var urlObj = new URL(sUrl, window.location.origin); 30933 if (!urlObj.searchParams.has('ch_ref')) { 30934 sUrl = CAFE24.attachChRef(sUrl); 30935 } 30936 } 30937 30938 oTarget.location.href = sUrl; 30939 } 30940 } else if (sType === 'direct_buy') { 30941 CAFE24.SHOP_FRONT_ORDERFORM_DIRECTBUY.proc.setOrderForm(TotalAddSale.getDirectBuyParam()); 30942 return; 30943 } else { // ì¥ë°êµ¬ëë´ê¸° 30944 var oData = CAFE24.PLUSAPP_BRIDGE.unserialize(sParam); 30945 CAFE24.PLUSAPP_BRIDGE.addBasket(oData); 30946 if (typeof CAFE24.KAKAO_PIXEL_BRIDGE !== 'undefined') { 30947 CAFE24.KAKAO_PIXEL_BRIDGE.addBasket(oData['product_no']); 30948 } 30949 30950 CAFE24.EC_SHOP_FRONT_BASKET_ACTION_EVENT.trigger(sParam, aData); 30951 30952 var oBasketEventData = CAFE24.EC_SHOP_FRONT_BASKET_ACTION_EVENT.getEventData(); 30953 parent.postMessage({event_type: 'add_cart_success', basket_event_data: oBasketEventData}, window.parent.origin); 30954 30955 if (sGroup == 'detail') { 30956 if (mobileWeb === true) { 30957 if (typeof (basket_page_flag) !== 'undefined' && basket_page_flag == 'T') { 30958 oTarget.reload(); 30959 return; 30960 } 30961 } 30962 30963 var oSearch = /basket.html/g; 30964 //ë ì´ì´ê° ë¨ë ì¤ì ì´ë¼ë©´ íì´ì§ì´ëì íì§ ìì§ë§ 30965 //ë ì´ì´ê° ë¨ì´ë¼ê³ íë보기íì ì´ë¼ë©´ íì´ì§ ì´ë 30966 30967 if (typeof(aData.isDisplayBasket) !== "undefined" && aData.isDisplayBasket == 'T' && oSearch.test(window.location.pathname) == false) { 30968 if ((typeof(aData.isDisplayLayerBasket) !== "undefined" && aData.isDisplayLayerBasket == 'T') && (typeof(aData.isBasketPopup) !== "undefined" && aData.isBasketPopup == 'T')) { 30969 layer_basket2(sDelvType, oTarget); 30970 } else { 30971 //ECQAINT-14010 Mergeì´ì : oTargetì´ ì ì 30972 layer_basket(sDelvType, oTarget); 30973 } 30974 30975 bIsProgressLink = false;
30976 } 30977 30978 //íì¸ ë ì´ì´ì¤ì ì´ ìëê±°ë íë보기 íì íì´ì§ë¼ë©´ íì´ì§ì´ë 30979 if (oCheckZoomPopUp.isPopUp() === true || bIsProgressLink === true) { 30980 var sBasketUrl = "/order/basket.html?" + "&delvtype=" + sDelvType; 30981 if (CAFE24.getChRefData() !== undefined) { 30982 sBasketUrl += "&ch_ref=" + CAFE24.getChRefData(); 30983 } 30984 oTarget.location.href = sBasketUrl; 30985 } 30986 } else { 30987 // fromì¼ë¡ ìì리ì¤í¸ìì ìì²íê±´ì§ íë¨. 30988 var bIsFromWishlist = false; 30989 if (typeof(aData.from) !== "undefined" && aData.from == "wishlist") { 30990 bIsFromWishlist = true; 30991 } 30992 30993 // ì¥ë°êµ¬ë ìì리ì¤í¸ì¸ì§ ì¬ë¶ 30994 if (typeof (basket_page_flag) !== 'undefined' && basket_page_flag == 'T' || bIsFromWishlist == true) { 30995 oTarget.reload(); 30996 return; 30997 } 30998 if (typeof(aData.isDisplayBasket) !== "undefined" && aData.isDisplayBasket === 'T') { 30999 if ((typeof(aData.isDisplayLayerBasket) !== "undefined" && aData.isDisplayLayerBasket == 'T') && (typeof(aData.isBasketPopup) !== "undefined" && aData.isBasketPopup == 'T')) { 31000 layer_basket2(sDelvType, oTarget); 31001 } else { 31002 layer_basket(sDelvType, oTarget); 31003 } 31004 } else { 31005 location.href = "/order/basket.html?" + "&delvtype=" + sDelvType; 31006 } 31007 } 31008 } 31009 } else { 31010 var msg = aData.alertMSG.replace('\\n', '\n'); 31011 31012 // ëì½ë© í기ì ì ì´ë¯¸ ì¸ì½ë© ë '\n' 문ì를 ì¤ì ê°í문ìë¡ ë³í 31013 // 목ë¡ìì í¸ì¶ë ê²½ì°ìë ì¸ì½ë© ëì§ ìì '\n' 문ì ê·¸ëë¡ ëì´ì¤ë¯ë¡ ì¶ê° ì²ë¦¬ 31014 msg = msg.replace(/%5Cn|\\n/g, '%0A'); 31015 31016 try { 31017 msg = decodeURIComponent(msg); 31018 } catch (err) { 31019 msg = unescape(msg); 31020 } 31021 31022 alert(msg); 31023 31024 if (aData.result == -111 && sProductLink !== null) { 31025 oTarget.href = '/product/detail.html?' + sProductLink; 31026 } 31027 if (aData.result == -101 || aData.result == -103) { 31028 31029 31030 sUrl = '/member/login.html?noMember=1&returnUrl=' + encodeURIComponent(oTarget.location.pathname + oTarget.location.search); 31031 oTarget.location.href = sUrl; 31032 } 31033 31034 if (aData.result == -113) { 31035 if (typeof(delvtype) !== 'undefined') { 31036 if (typeof(delvtype) === 'object') { 31037 sDelvTypeForMove = EC$(delvtype).val(); 31038 } else { 31039 sDelvTypeForMove = delvtype; 31040 } 31041 oTarget.location.href = "/order/basket.html?" + "&delvtype=" + sDelvTypeForMove; 31042 } else { 31043 oTarget.location.href = "/order/basket.html"; 31044 } 31045 } 31046 } 31047 31048 // ECHOSTING-130826 ëì, ì¿ í°ì ì©ìí 리ì¤í¸ìì ìµì ìí(ë´ìµì )ë´ê¸° ì²ë¦¬ì, íë©´ì´ ìëì¼ë¡ ë«íì§ ìì ìì¸ì²ë¦¬ ì¶ê° 31049 if (oTarget.couponPopupClose !== undefined) { 31050 oTarget.couponPopupClose(); 31051 } 31052 if (oCheckZoomPopUp.isPopUp() === true && bOpener === false) { 31053 self.close(); 31054 } else { 31055 // ECHOSTING-130826 ëì, í¹ì íë©´ìì ì¥ë°êµ¬ëì ìí ë´ê¸° ì async ê° ëìíì§ ìì, 31056 // ì¥ë°êµ¬ë ë´ê¸°ì²ë¦¬ íì²ë¦¬ 구ê°ì async ê°ì ì¤íì¶ê° 31057 // ì¿ í° ì ì© ê°ë¥ìí 리ì¤í¸ ìì ì¥ë°êµ¬ë ë´ê¸°ì, ì¬ê¸°ì ì¤íí ê²½ì° js ì¤ë¥ê° ë°ìíì¬, í¨ì ìë¨ì ë³ë ì²ë¦¬ ì¶ê° 31058 if (typeof(oTarget) !== 'undefined' && typeof(oTarget.CAPP_ASYNC_METHODS) !== 'undefined') { 31059 oTarget.CAPP_ASYNC_METHODS.init(); 31060 } else { 31061 CAPP_ASYNC_METHODS.init(); 31062 } 31063 } 31064} 31065 31066/** 31067 * ì¥ë°êµ¬ë ê²°ê³¼ ì²ë¦¬ by channel 31068 * 31069 * @param sType 31070 * @param sGroup 31071 * @param aData 31072 * @param sBasketType 31073 * @param sParam 31074 */ 31075function basket_result_action_channel(sType, sGroup, aData, sBasketType, sParam, defer) 31076{ 31077 if (aData == null) { 31078 return; 31079 } 31080 31081 var oTarget = CAPP_SHOP_FRONT_COMMON_UTIL.findTargetFrame(); 31082 var sBasketPageUrl = 'basket.html'; 31083 var sOrderFormPageUrl = 'orderform.html'; 31084 31085 if (aData.result >= 0) { 31086 // ë°°ì¡ì í 31087 var sDelvType = ''; 31088 if (typeof(delvtype) !== 'undefined') { 31089 if (typeof(delvtype) === 'object') { 31090 sDelvType = EC$(delvtype).val(); 31091 } else { 31092 sDelvType = delvtype; 31093 } 31094 } else if (aData.sDelvType != null) { 31095 sDelvType = aData.sDelvType; 31096 } 31097 31098 var sPrefixUrl = EC_ROUTE.isBaseDomain(location.href) === true ? '/shop' + EC_SDE_SHOP_NUM : ''; 31099 if (sType == 1) { // ë°ë¡êµ¬ë§¤í기 31100 oTarget.location.href = CAFE24.attachChRef(sPrefixUrl + '/order/' + sOrderFormPageUrl + '?basket_type=' + sBasketType + '&delvtype=' + sDelvType); 31101 } else { // ì¥ë°êµ¬ëë´ê¸° 31102 CAFE24.EC_SHOP_FRONT_BASKET_ACTION_EVENT.trigger(sParam, aData); 31103 var oBasketEventData = CAFE24.EC_SHOP_FRONT_BASKET_ACTION_EVENT.getEventData(); 31104 $("#basketAddLayer a.move").each(function() { 31105 $(this).attr("href", CAFE24.attachChRef(sPrefixUrl + '/order/' + sBasketPageUrl + '?delvtype=' + sDelvType)); 31106 }); 31107 31108 $('#basketAddLayer').addClass('on'); 31109 31110 parent.postMessage({event_type: 'add_cart_success', basket_event_data: oBasketEventData}, window.parent.origin); 31111 } 31112 } else { 31113 var msg = aData.alertMSG.replace('\\n', '\n'); 31114 31115 // ëì½ë© í기ì ì ì´ë¯¸ ì¸ì½ë© ë '\n' 문ì를 ì¤ì ê°í문ìë¡ ë³í 31116 // 목ë¡ìì í¸ì¶ë ê²½ì°ìë ì¸ì½ë© ëì§ ìì '\n' 문ì ê·¸ëë¡ ëì´ì¤ë¯ë¡ ì¶ê° ì²ë¦¬ 31117 msg = msg.replace(/%5Cn|\\n/g, '%0A'); 31118 31119 try { 31120 msg = decodeURIComponent(msg); 31121 } catch (err) { 31122 msg = unescape(msg); 31123 } 31124 31125 alert(msg); 31126 } 31127} 31128 31129function layer_basket(sDelvType, oTarget) 31130{ 31131 var oProductName = null; 31132 if (typeof(product_name) !== 'undefined') { 31133 oProductName = {'product_name': product_name}; 31134 } 31135 EC$('.xans-product-basketoption').remove(); 31136 EC$.get('/product/add_basket.html?delvtype='+sDelvType, oProductName, function(sHtml) 31137 { 31138 sHtml = sHtml.replace(/<script.*?ind-script\/optimizer.php.*?<\/script>/g, ''); 31139 // scirpt를 ì ê±°íë©´ì document.readyì Async 모ëì´ ì¤íìëì ê°ì ë¡ ì¤íí¨ 31140 CAPP_ASYNC_METHODS.init(); 31141 create_layer('confirmLayer', sHtml, oTarget); 31142 }); 31143} 31144 31145function layer_basket2(sDelvType, oTarget) 31146{ 31147 EC$('.xans-order-layerbasket').remove(); 31148 var oTarget = CAPP_SHOP_FRONT_COMMON_UTIL.findTargetFrame(); 31149 var sUrl = '/product/add_basket2.html?delvtype=' + sDelvType + '&layerbasket=T'; 31150 31151 // URL ì ch_ref íë¼ë¯¸í° ì¶ê° 31152 if (CAFE24.hasChRef()) { 31153 // ì´ë¯¸ ch_refê° í¬í¨ëì´ ìëì§ íì¸ 31154 var urlObj = new URL(sUrl, window.location.origin); 31155 if (!urlObj.searchParams.has('ch_ref')) { 31156 sUrl = CAFE24.attachChRef(sUrl); 31157 } 31158 } 31159 31160 EC$.get(sUrl, '', function(sHtml) 31161 { 31162 sHtml = sHtml.replace(/<script.*?ind-script\/optimizer.php.*?<\/script>/g, ''); 31163 31164 // ì¥ë°êµ¬ë linkì ch_ref íë¼ë¯¸í° ì¶ê° 31165 var chRefData = null; 31166 if (typeof CAFE24 !== 'undefined' && CAFE24.getChRefData && CAFE24.getChRefData()) { 31167 chRefData = CAFE24.getChRefData(); 31168 } else { 31169 chRefData = $(':input[name="ch_ref"]').val(); 31170 } 31171 31172 if (chRefData) { 31173 sHtml = sHtml.replace( 31174 /href\s*=\s*["']\/order\/basket\.html(?:\?([^"']*))?["']/g, 31175 function(match, existingQuery) { 31176 let newUrl = '/order/basket.html'; 31177 31178 if (existingQuery) { 31179 // 기존 쿼리ì¤í¸ë§ìì ch_ref ì ê±° ë° ì 리 31180 const cleanQuery = existingQuery 31181 .replace(/[?&]ch_ref=[^&]*/g, '') 31182 .replace(/(^&)|(&$)/g, ''); 31183 31184 // ìë¡ì´ 쿼리ì¤í¸ë§ êµ¬ì± 31185 const queryParams = cleanQuery 31186 ? `${cleanQuery}&ch_ref=${encodeURIComponent(chRefData)}` 31187 : `ch_ref=${encodeURIComponent(chRefData)}`; 31188 31189 newUrl += `?${queryParams}`; 31190 } else { 31191 newUrl += `?ch_ref=${encodeURIComponent(chRefData)}`; 31192 } 31193 31194 return `href="${newUrl}"`; 31195 } 31196 ); 31197 } 31198 31199 //scirpt를 ì ê±°íë©´ì document.readyì Async 모ëì´ ì¤íìëì ê°ì ë¡ ì¤íí¨ 31200 CAPP_ASYNC_METHODS.init(); 31201 create_layer('confirmLayer', sHtml, oTarget); 31202 }); 31203} 31204 31205function layer_wishlist(oTarget) 31206{ 31207 EC$('.layerWish').remove(); 31208 EC$.get('/product/layer_wish.html','' ,function(sHtml) 31209 { 31210 sHtml = sHtml.replace(/<script.*?ind-script\/optimizer.php.*?<\/script>/g, ''); 31211 create_layer('confirmLayer', sHtml, oTarget); 31212 }); 31213} 31214 31215function go_basket() 31216{ 31217 var oTarget = CAPP_SHOP_FRONT_COMMON_UTIL.findTargetFrame(); 31218 oTarget.location.href = '/order/basket.html'; 31219 if (CAPP_SHOP_FRONT_COMMON_UTIL.isPopupFromThisShopFront() === true) { 31220 self.close(); 31221 } 31222} 31223 31224function move_basket_page() 31225{ 31226 var sLocation = location; 31227 try { 31228 31229 sLocation = ITEM.setBodyOverFlow(location); 31230 } catch (e) { 31231 PRODUCTSUBMIT.DEBUG.messageOut(e, 'PRODUCT_ACTION.move_basket_page'); 31232 } 31233 31234 sLocation.href = '/order/basket.html'; 31235} 31236 31237/** 31238 * ì´ë¯¸ì§ íë보기 (ìíìì¸ ë²í¼) 31239 */ 31240function go_detail() 31241{ 31242 var sUrl = '/product/detail.html?product_no=' + iProductNo; 31243 var oTarget = CAPP_SHOP_FRONT_COMMON_UTIL.findTargetFrame(); 31244 31245 if (typeof(iCategoryNo) !== 'undefined') { 31246 sUrl += '&cate_no='+iCategoryNo; 31247 } 31248 31249 if (typeof(iDisplayGroup) !== 'undefined') { 31250 sUrl += '&display_group='+iDisplayGroup; 31251 } 31252 31253 oTarget.location.href = sUrl; 31254 if (CAPP_SHOP_FRONT_COMMON_UTIL.isPopupFromThisShopFront() === true) { 31255 self.close(); 31256 } 31257} 31258 31259/** 31260 * ë°ë¡êµ¬ë§¤í기/ì¥ë°êµ¬ëë´ê¸° Action - í매ì ë³´ > 구매ì í 31261 */ 31262function check_action_nologin(sBuyLimitType) 31263{ 31264 sMsg = __('CAN.PURCHASE.GROUP', 'GLOBAL.BUY.LIMIT'); 31265 if (sBuyLimitType == 'O' || sBuyLimitType == 'D') { 31266 sMsg = __('CAN.PURCHASE.MEMBER.USE', 'SHOP.JS.FRONT.NEW.PRODUCT.ACTION'); 31267 } 31268 alert(sMsg); 31269 return false;
31270} 31271 31272/** 31273 * ë°ë¡êµ¬ë§¤í기 Action - ë¶ëíì 구매ì í 31274 */ 31275function check_action_block(sMsg) 31276{ 31277 if (sMsg == '') { 31278 sMsg = __('ì¼í몰 ê´ë¦¬ìê° êµ¬ë§¤ ì íì ì¤ì íì¬ êµ¬ë§¤íì¤ ì ììµëë¤.'); 31279 } 31280 alert(sMsg); 31281} 31282 31283/** 31284 * ê´ì¬ìí ë±ë¡ - ë¡ê·¸ì¸íì§ ììì ê²½ì° 31285 */ 31286function add_wishlist_nologin(sUrl) 31287{ 31288 PRODUCTSUBMIT.setLoginMovePage(sUrl , __('ë¡ê·¸ì¸ í ê´ì¬ìí ë±ë¡ì í´ì£¼ì¸ì.')); 31289 31290} 31291 31292/** 31293 * ë°ë¡êµ¬ë§¤í기 / ì¥ë°êµ¬ë ë´ê¸° / ê´ì¬ìí ë±ë¡ ì url ì´ëì ì¬ì©íë ë©ìë 31294 * @param sUrl ì´ëí 주ì 31295 */ 31296function btn_action_move_url(sUrl) 31297{ 31298 var oTarget = CAPP_SHOP_FRONT_COMMON_UTIL.findTargetFrame(); 31299 31300 sLocation = ITEM.setBodyOverFlow(location); 31301 31302 sUrl += '?returnUrl=' + encodeURIComponent(oTarget.location.pathname + oTarget.location.search); 31303 oTarget.location.replace(sUrl); 31304} 31305 31306/** 31307 * return_url ìì´ url ì´ëì ì¬ì©íë ë©ìë 31308 * @param sUrl ì´ëí 주ì 31309 */ 31310function btn_action_move_no_return_url(sUrl) 31311{ 31312 var oTarget = CAPP_SHOP_FRONT_COMMON_UTIL.findTargetFrame(); 31313 oTarget.location.replace(sUrl); 31314} 31315 31316/** 31317 * ê´ì¬ìí ë±ë¡ - íë¼ë¯¸í° ìì± 31318 * @param bIsUseOptionSelect ì¥ë°êµ¬ëìµì ì í ì모ë ì¬ì©ì¬ë¶(basket_option.html, Product_OptionSelectLayer) 31319 */ 31320function add_wishlist(sMode, bIsUseOptionSelect) 31321{ 31322 var sUrl = '//' + location.hostname; 31323 sUrl += '/exec/front/Product/Wishlist/'; 31324 var param = location.search.substring(location.search.indexOf('?') + 1); 31325 sParam = param + '&command=add' + '&from=wish_icon'; 31326 sParam += '&referer=' + encodeURIComponent('//' + location.hostname + location.pathname + location.search); 31327 31328 add_wishlist_action(sUrl, sParam, sMode, bIsUseOptionSelect); 31329} 31330 31331var bWishlistSave = false; 31332/** 31333 * @param bIsUseOptionSelect ì¥ë°êµ¬ëìµì ì í ì모ë ì¬ì©ì¬ë¶(basket_option.html, Product_OptionSelectLayer) 31334 */ 31335function add_wishlist_action(sAction, sParam, sMode, bIsUseOptionSelect) 31336{ 31337 //ì°ëí ìµì ì¬ë¶ 31338 var bIsOlinkOption = Olnk.isLinkageType(sOptionType); 31339 if (bWishlistSave === true) { 31340 return false; 31341 } 31342 var required_msg = __('í목ì ì íí´ ì£¼ì¸ì.'); 31343 if (sOptionType !== 'F') { 31344 var aItemCode = ITEM.getWishItemCode(); 31345 } else { 31346 var aItemCode = null; 31347 } 31348 var sSelectedItemByEtype = ''; 31349 31350 var frm = EC$('#frm_image_zoom'); 31351 frm.find(":hidden").remove(); 31352 frm.attr('method', 'POST'); 31353 frm.attr('action', '/' + sAction); 31354 31355 if (bIsOlinkOption === true) { 31356 if (isNewProductSkin() === false) {
31357 sItemCode = Olnk.getSelectedItemForWishOldSkin(sProductCode, EC$('[id^="product_option_id"]')); 31358 31359 if (sItemCode !== false) { 31360 frm.append(getInputHidden('selected_item_by_etype[]', EC$.toJSON(sItemCode))); 31361 //sSelectedItemByEtype += 'selected_item_by_etype[]='+EC$.toJSON(sItemCode) + '&'; 31362 aItemCode.push(sItemCode); 31363 } 31364 31365 } else { 31366 EC$('.soldout_option_box_id,.option_box_id').each(function(i) { 31367 sItemCode = Olnk.getSelectedItemForWish(sProductCode, EC$(this)); 31368 if (sItemCode.bCheckNum === false) { 31369 sItemCode = Olnk.getProductAllSelected(sProductCode , EC$(this) , 1); 31370 } 31371 frm.append(getInputHidden('selected_item_by_etype[]', EC$.toJSON(sItemCode))); 31372 //sSelectedItemByEtype += 'selected_item_by_etype[]='+EC$.toJSON(sItemCode) + '&'; 31373 aItemCode.push(sItemCode); 31374 }); 31375 31376 // ì ë¶ ì íì¸ ê²½ì° íìê° ìì±íë¤. 31377 if (sSelectedItemByEtype === '') { 31378 iQuantity = (buy_unit >= product_min ? buy_unit : product_min); 31379 aItemValueNo = Olnk.getProductAllSelected(sProductCode , EC$('[id^="product_option_id"]') , 1); 31380 if (aItemValueNo !== false) { 31381 frm.append(getInputHidden('selected_item_by_etype[]', EC$.toJSON(aItemValueNo))); 31382 //sSelectedItemByEtype += 'selected_item_by_etype[]='+EC$.toJSON(aItemValueNo) + '&'; 31383 aItemCode.push(aItemValueNo); 31384 } 31385 } 31386 31387 NEWPRD_ADD_OPTION.setItemAddOptionName(frm); 31388 var iOptionBoxLength = EC$('.option_box_id').length - 1; 31389 EC$('.option_box_id').each(function(i) { 31390 31391 iQuantity = EC$('#' + EC$(this).attr('id').replace('id','quantity')).val(); 31392 _aItemValueNo = Olnk.getSelectedItemForBasket(sProductCode, EC$(this), iQuantity); 31393 31394 if (_aItemValueNo.bCheckNum === false) { // ìµì ë°ì¤ë ìì§ë§ ê°ì´ ì íì´ ìëê²½ì° 31395 _aItemValueNo = Olnk.getProductAllSelected(sProductCode , EC$(this) , iQuantity); 31396 } 31397 31398 var oItem = EC$('[name="item_code[]"]').eq(i); 31399 var sItemCode = sProductCode + '000A_' + i; 31400 31401 //íëª©ë³ ì¶ê°ìµì ì í 31402 var ePerAddOption = EC$('.option_products .option').eq(i).find(".input_addoption:visible"); 31403 if (ePerAddOption.length > 0) { // ìµì ë°ì¤ììì ê°ë³ ì ë ¥ì 31404 sItemCode = Olnk.getCustomOptionItemCode(sProductCode, iOptionBoxLength, i); 31405 NEWPRD_ADD_OPTION.setItemPerAddOptionData(sItemCode, ePerAddOption, frm); 31406 } else { 31407 var sItemAddOption = NEWPRD_ADD_OPTION.getAddOptionValue(oItem.attr('data-item-add-option')); 31408 NEWPRD_ADD_OPTION.setItemAddOption(sItemCode, sItemAddOption, frm); 31409 } 31410 }); 31411 31412 31413 } 31414 31415 if (bIsUseOptionSelect !== true && (/^\*+$/.test(aItemCode) === true || aItemCode == '')) { 31416 alert(required_msg); 31417 return false; 31418 } 31419 } else { 31420 if (isNewProductSkin() === true) { 31421 //íëª©ë³ ì¶ê°ìµì ì´ë¦ ì í 31422 NEWPRD_ADD_OPTION.setItemAddOptionName(frm); 31423 31424 EC$('[name="quantity_opt[]"][id^="option_box"]').each(function(i) { 31425 31426 var oItem = EC$('[name="item_code[]"]').eq(i); 31427 var sItemCode = oItem.val(); 31428 31429 //íëª©ë³ ì¶ê°ìµì ì í 31430 var ePerAddOption = EC$('.option_product').eq(i).find(".input_addoption:visible"); 31431 if (ePerAddOption.length > 0) { // ìµì ë°ì¤ììì ê°ë³ ì ë ¥ì 31432 NEWPRD_ADD_OPTION.setItemPerAddOptionData(sItemCode, ePerAddOption, frm); 31433 } else { 31434 var sItemAddOption = NEWPRD_ADD_OPTION.getAddOptionValue(oItem.attr('data-item-add-option'));
31435 NEWPRD_ADD_OPTION.setItemAddOption(sItemCode, sItemAddOption, frm); 31436 } 31437 31438 }); 31439 31440 } 31441 } 31442 31443 if (aItemCode === false && bIsUseOptionSelect !== true) { 31444 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.setLayer(iProductNo, iCategoryNo, 'normal') === true) { 31445 return; 31446 } 31447 alert(required_msg); 31448 return false; 31449 } 31450 31451 31452 if (aItemCode !== null) { 31453 var sItemCode = ''; 31454 var aTemp = []; 31455 31456 if (Olnk.isLinkageType(sOptionType) === true) { 31457 frm.append(getInputHidden('selected_item[]', '000A')); 31458 //sParam = sParam + '&' + 'selected_item[]=000A&' + sSelectedItemByEtype; 31459 } else { 31460 for (var x in aItemCode) { 31461 try { 31462 var opt_id = aItemCode[x].substr(aItemCode[x].length-4, aItemCode[x].length); 31463 frm.append(getInputHidden('selected_item[]', opt_id)); 31464 //aTemp.push('selected_item[]='+opt_id); 31465 } catch (e) { 31466 PRODUCTSUBMIT.DEBUG.messageOut(e, 'PRODUCT_ACTION.add_wishlist_action'); 31467 } 31468 } 31469 } 31470 } 31471 31472 // URLSearchParams ê°ì²´ë¥¼ ì¬ì©íì¬ íë¼ë¯¸í° íì± 31473 const params = new URLSearchParams(sParam); 31474 if (!params.has('product_no') && (typeof(iProductNo) !== 'undefined' && iProductNo !== '' && iProductNo !== null)) { 31475 frm.append(getInputHidden('product_no', iProductNo)); 31476 } 31477 if (!params.has('cate_no') && (typeof(iCategoryNo) !== 'undefined' && iCategoryNo !== '' && iCategoryNo !== null)) { 31478 frm.append(getInputHidden('cate_no', iCategoryNo)); 31479 } 31480 frm.append(getInputHidden('option_type', sOptionType)); 31481 //sParam = sParam + '&product_no='+iProductNo; 31482 31483 31484 // ì¶ê° ìµì ì²´í¬ (íëª©ê¸°ë° ì¶ê°ìµì ì¼ëë í¼ì ì¶ë ê²ì¦ ë¶íì) 31485 //ë´ëª¨ëì¬ì©ììë ì²´í¬ìí¨ 31486 if (bIsUseOptionSelect !== true && (NEWPRD_ADD_OPTION.isItemBasedAddOptionType() !== true && checkAddOption() === false)) { 31487 return false; 31488 } 31489 31490 // ì¶ê°ìµì 31491 var aAddOptionStr = new Array(); 31492 var aAddOptionRow = new Array(); 31493 if (add_option_name) { 31494 for (var i=0; i<add_option_name.length; i++) { 31495 if (add_option_name[i] !== '' && EC$('#' + add_option_id + i).length > 0) { 31496 aAddOptionRow.push(add_option_name[i] + '*' + EC$('#' + add_option_id + i).val()); 31497 } 31498 } 31499 } 31500 aAddOptionStr.push(aAddOptionRow); 31501 31502 // ë¨ì¼ ìíì ê°ë³ ì¶ê° ì ë ¥ ìµì ì²ë¦¬ 31503 if (has_option === 'F' && typeof add_option_input !== 'undefined') { 31504 NEWPRD_ADD_OPTION.addItem(ITEM.getItemCode()[0]); 31505 var iAddOptionIndex = NEWPRD_ADD_OPTION.getLastIndex(); 31506 for (var x in add_option_input) { 31507 if (add_option_input.hasOwnProperty(x) === true) { 31508 NEWPRD_ADD_OPTION.addCustomOption(iAddOptionIndex, { 31509 type: 'text', 31510 value: EC$('#' + add_option_input[x].id).val(), 31511 info: add_option_input[x].info 31512 }, 'input'); 31513 } 31514 } 31515 } 31516 31517 frm.append(getInputHidden('add_option', aAddOptionStr.join('|'))); 31518 //sParam += '&add_option=' + encodeURIComponent(aAddOptionStr.join('|')); 31519 31520 // íì¼ì²¨ë¶ ìµì ì í¨ì± ì²´í¬ 31521 if (bIsUseOptionSelect !== true && FileOptionManager.checkValidation() === false) return; 31522 31523 bWishlistSave = true; 31524 31525 // íì¼ì²¨ë¶ ìµì ì íì¼ì ë¡ëê° ìì ê²½ì° ë°ë¡ ê´ì¬ìí ë£ê¸° 31526 if (FileOptionManager.existsFileUpload() === false) { 31527 NEWPRD_ADD_OPTION.setItemPerAddOptionForm(frm); 31528 sParam = sParam + '&' + frm.serialize(); 31529 add_wishlist_request(sParam, sMode); 31530 // íì¼ì²¨ë¶ ìµì ì íì¼ì ë¡ëê° ìì¼ë©´ 31531 } else { 31532 FileOptionManager.upload(function(mResult) { 31533 // íì¼ì ë¡ë ì¤í¨ 31534 if (mResult===false) { 31535 bWishlistSave = false; 31536 return false; 31537 } 31538 31539 // íì¼ì ë¡ë ì±ê³µ 31540 for (var sId in mResult) { 31541 // í´ë¹ í목ì íì¼ ì²¨ë¶ ìµì í목 ì¶ê° 31542 NEWPRD_ADD_OPTION.pushFileList(sId, mResult); 31543 frm.append(getInputHidden(sId, FileOptionManager.encode(mResult[sId]))); 31544 //sParam += '&'+sId+'='+FileOptionManager.encode(mResult[sId]); 31545 } 31546 31547 31548 NEWPRD_ADD_OPTION.setItemPerAddOptionForm(frm); 31549 31550 sParam = sParam + '&' + frm.serialize(); 31551 add_wishlist_request(sParam, sMode); 31552 }); 31553 } 31554} 31555 31556function add_wishlist_request(sParam, sMode) 31557{ 31558 var sUrl = '/exec/front/Product/Wishlist/'; 31559 31560 EC$.post( 31561 sUrl, 31562 sParam, 31563 function(data) { 31564 if (sMode != 'back') { 31565 add_wishlist_result(data); 31566 } 31567 bWishlistSave = false;
31568 }, 31569 'json'); 31570} 31571 31572function add_wishlist_result(aData, aPrdData) 31573{ 31574 var oTarget = CAPP_SHOP_FRONT_COMMON_UTIL.findTargetFrame(); 31575 var agent = navigator.userAgent.toLowerCase(); 31576 31577 if (aData == null) return; 31578 //ìë¡ì´ 모ë ì¬ì©ììë ì¤ë³µëì´ìì´ë ì²ë¦¬ëê²ì¼ë¡ ê°ì£¼í¨.. ì ê·¸ë ê²íëì§ë ì´í´ë¶ê° 31579 if (aData.result == 'SUCCESS' || (aData.bIsUseOptionSelect === true && aData.result === 'NO_TARGET')) { 31580 31581 bBuyLayer = ITEM.setBodyOverFlow(true); 31582 31583 if (typeof iProductNo !== 'undefined') { 31584 var iSendProductNo = iProductNo; 31585 } else if (typeof aPrdData !== 'undefined') { 31586 var iSendProductNo = aPrdData.product_no; 31587 } 31588 31589 if (iSendProductNo) { 31590 CAFE24.PLUSAPP_BRIDGE.addWishList(iSendProductNo); 31591 if (typeof CAFE24.KAKAO_PIXEL_BRIDGE !== 'undefined') { 31592 CAFE24.KAKAO_PIXEL_BRIDGE.addWishList(iSendProductNo); 31593 } 31594 } 31595 31596 if (CAPP_ASYNC_METHODS.hasOwnProperty('WishList') === true && typeof iProductNo !== 'undefined') { 31597 // ê´ì¬ìí ì¶ê°ì sessionStorage ì¶ê° 31598 CAPP_ASYNC_METHODS.WishList.setSessionStorageItem(iProductNo, aData.command); 31599 } 31600 31601 if (CAPP_ASYNC_METHODS.hasOwnProperty('Wishcount') === true) { 31602 CAPP_ASYNC_METHODS.Wishcount.restoreCache(); 31603 CAPP_ASYNC_METHODS.Wishcount.execute(); 31604 } 31605 31606 if (aData.confirm == 'T') { 31607 layer_wishlist(CAPP_SHOP_FRONT_COMMON_UTIL.findTargetFrame()); 31608 return; 31609 } 31610 31611 if ($('.ec-product-listwishicon').attr('icon_status') === 'off') { 31612 CAPP_PRODUCT_LIST_WISHICON.getResultWishIconAjax(aData, $('.ec-product-listwishicon')); 31613 } 31614 alert(__('ê´ì¬ìíì¼ë¡ ë±ë¡ëììµëë¤.')); 31615 } else if (aData.result == 'ERROR') { 31616 alert(__('ì¤í¨íììµëë¤.')); 31617 } else if (aData.result == 'NOT_LOGIN') { 31618 alert(__('íì ë¡ê·¸ì¸ í ì´ì©íì¤ ì ììµëë¤.')); 31619 } else if (aData.result == 'INVALID_REQUEST') { 31620 alert(__('íë¼ë¯¸í°ê° ì못ëììµëë¤.')); 31621 } else if (aData.result == 'NO_TARGET') { 31622 alert(__('ì´ë¯¸ ë±ë¡ëì´ ììµëë¤.')); 31623 } else if (aData.result == 'INVALID_PRODUCT') { 31624 alert(__('íë¼ë¯¸í°ê° ì못ëììµëë¤.')); 31625 } 31626} 31627 31628/** 31629* ì¶ê°ë í¨ì 31630* í´ë¹ valueê°ì ë°ì replace ì²ë¦¬ 31631* @param string sValue value 31632* @return string replaceë sValue 31633*/ 31634function replaceCheck(sName,sValue) 31635{ 31636 //ECHOSTING-9736 31637 if (typeof(sValue) === "string" && (sName == "option_add[]" || sName.indexOf("item_option_add") === 0)) { 31638 sValue = sValue.replace(/'/g, '\\''); 31639 } 31640 // íì ì´ string ì¼ë ì°ì°ì ë¨ì¼ ë°ìí " ' " 문ì를 " ` " ì¡ì¼í¸ 문ìë¡ ì¹ííì¬ ê¹¨ì§ì ë°©ì§ 31641 return sValue; 31642} 31643 31644 31645/** 31646 * name, valueê°ì ë°ì input hidden íê·¸ ë°í 31647 * 31648 * @param string sName name 31649 * @param string sValue value 31650 * @return string input hidden íê·¸ 31651 */ 31652function getInputHidden(sName, sValue) 31653{ 31654 sValue = replaceCheck(sName,sValue); // ì¶ê°ë ë¶ë¶ (replaceCheck í¨ì í¸ì¶) 31655 return EC$('<input>').attr({'type': 'hidden', 'name': sName}).val(sValue); 31656} 31657 31658 31659/** 31660 * íììµì ì´ ì íëìëì§ ì²´í¬ 31661 * 31662 * @return bool íììµì ì´ ì íëìë¤ë©´ true, ìëë©´ false ë°í 31663 */ 31664function checkOptionRequired(sReq) 31665{ 31666 var bResult = true; 31667 // ìµì ì´ ìë¤ë©´ íìê° ì²´í¬ë íììì. 31668 if (has_option === 'F') { 31669 return bResult; 31670 } 31671 var sTargetOptionId = product_option_id; 31672 if (sReq != null) { 31673 sTargetOptionId = sReq; 31674 } 31675 31676 if (option_type === 'F') { 31677 // ë¨ë êµ¬ì± 31678 var iOptionCount = EC$('select[id^="' + sTargetOptionId + '"][required="true"]').length; 31679 if (iOptionCount > 0) { 31680 if (ITEM.getItemCode() === false) { 31681 bResult = false;
31682 return false; 31683 } 31684 31685 var aRequiredOption = new Object(); 31686 var aItemCodeList = ITEM.getItemCode(); 31687 // íì ìµì ì ë³´ì ì íí ìµì ì ë³´ ë¹êµ 31688 for (var i=0; i<aItemCodeList.length; i++) { 31689 var sTargetItemCode = aItemCodeList[i]; 31690 EC$('select[id^="' + sTargetOptionId + '"][required="true"] option').each(function() { 31691 if (EC$(this).val() == sTargetItemCode) { 31692 var sProductOptionId = EC$(this).parent().attr('id'); 31693 aRequiredOption[sProductOptionId] = true; 31694 } 31695 }); 31696 31697 } 31698 // íììµì ë³ ê°ìë³´ë¤ ì íí ìµì ê°ìê° ì ìê²½ì° ë¦¬í´ 31699 if (iOptionCount > Object.size(aRequiredOption)) { 31700 bResult = false; 31701 return bResult; 31702 } 31703 } 31704 } else { 31705 if (Olnk.isLinkageType(sOptionType) === true) { 31706 if (isNewProductSkin() === false) { 31707 EC$('select[id^="' + product_option_id + '"][required="true"]').each(function() { 31708 var sel = parseInt(EC$(this).val()); 31709 31710 if (isNaN(sel) === true) { 31711 EC$(this).focus(); 31712 bResult = false;
31713 return false; 31714 } 31715 }); 31716 // ì¶ê° 구매 check 31717 EC$('.' + EC$.data(document, 'multiple_option_select_class')).each(function(i) 31718 { 31719 if (EC$(this).prop('required') === true) { 31720 var sel = parseInt(EC$(this).val()); 31721 31722 if (isNaN(sel) === true) { 31723 EC$(this).focus(); 31724 bResult = false; 31725 return false; 31726 } 31727 } 31728 }); 31729 } else { // ì°ëí ì¬ì©ì¤ì´ë©´ì ë´ì¤í¨ 31730 var aItemCodeList = ITEM.getItemCode(); 31731 if (aItemCodeList === false) { 31732 bResult = false; 31733 return false; 31734 } 31735 // ì°ëí ìµì ì ë²í¼ ì¬ì©ì¤ì´ì§ë§ ì íë íëª©ì´ ìë ê²½ì° , ë´ì¤í¨ììë§ ëìí´ì¼ í¨. 31736 if (Olnk.getOptionPushbutton(EC$('#option_push_button')) === true && EC$('.option_box_id').length === 0) { 31737 bResult = false;
31738 return false; 31739 } 31740 } 31741 return bResult; 31742 } 31743 if (ITEM.getItemCode() === false) { 31744 bResult = false; 31745 return false; 31746 } 31747 // ì¡°í©êµ¬ì± 31748 if (item_listing_type == 'S') { 31749 // ë¶ë¦¬ì íí 31750 var eTarget = CAFE24.UTIL.parseJSON(option_value_mapper); 31751 for (var x in eTarget) { 31752 if (ITEM.getItemCode().indexOf(eTarget[x]) > -1) { 31753 bResult = true; 31754 break; 31755 } else { 31756 bResult = false; 31757 } 31758 } 31759 if (bResult === false) { 31760 bResult = false; 31761 return false; 31762 } 31763 } else { 31764 EC$('select[id^="' + product_option_id + '"][required="true"]').each(function() { 31765 var eTarget = EC$(this).find('option[value!="*"][value!="**"]'); 31766 bResult = false; 31767 eTarget.each(function() { 31768 if (ITEM.getItemCode().indexOf(EC$(this).val()) > -1) { 31769 bResult = true; 31770 return false; 31771 } 31772 }); 31773 if (bResult === false) { 31774 return false; 31775 } 31776 }); 31777 } 31778 } 31779 31780 return bResult; 31781} 31782 31783/** 31784 * ì¶ê° ìµì ì ë ¥ê° ì²´í¬ 31785 * 31786 * @return bool 모ë ì¶ê°ìµì ì ê°ì´ ì ë ¥ëìë¤ë©´ true, ìëë©´ false 31787 * 31788 */ 31789/** 31790 * ì¶ê° ì ë ¥ ìµì ì ê° ì²´í¬ 31791 * @param string sReq ì ë í°ë¥¼ ê¸°ë³¸ê° ì´ì¸ë¡ ì¬ì©í ê²½ì° 31792 * @param object oParent ì ì²´ ì¸íì´ ìë í¹ì ê°ì²´ íìì ì리먼í¸ë§ ê²ì¬í ê²½ì° 31793 * @returns {boolean} 31794 */ 31795function checkAddOption(sReq, oParent) 31796{ 31797 var sAddOptionField = add_option_id; 31798 31799 var sAddOptionSelector = '[id^="' + sAddOptionField + '"]:not(.input_peraddoption)'; 31800 if (sReq != null) { 31801 sAddOptionField = sReq; 31802 sAddOptionSelector = '[id="' + sAddOptionField + '"]:not(.input_peraddoption)'; 31803 } 31804 var oTargetElement = EC$(sAddOptionSelector); 31805 if (oParent !== null && typeof(oParent) !== 'undefined') { 31806 oTargetElement = oParent.find(sAddOptionSelector); 31807 } 31808 31809 return NEWPRD_ADD_OPTION.validateAddOptionForm(oTargetElement); 31810} 31811 31812/** 31813 * ìë ê°ì ¸ì¤ê¸° 31814 * 31815 * @return mixed ì ìì ì¸ ìëì´ë©´ ìë(integer) ë°í, ìëë©´ false ë°í 31816 */ 31817function getQuantity() 31818{ 31819 // ë´ìíì¸ë° ëìì¸ì´ ìì ìëì ì ìë¤. 31820 if (isNewProductSkin() === false) { 31821 iQuantity = parseInt(EC$(quantity_id).val(),10); 31822 } else { 31823 if (has_option == 'T') { 31824 var iQuantity = 0; 31825 31826 if (Olnk.isLinkageType(sOptionType) === true) { 31827 iQuantity = parseInt(EC$(quantity_id).val(),10); 31828 return iQuantity; 31829 } 31830 31831 EC$('[name="quantity_opt[]"]').each(function() { 31832 iQuantity = iQuantity + parseInt(EC$(this).val(),10); 31833 }); 31834 } else { 31835 var iQuantity = parseInt(EC$(quantity_id).val().replace(/^[\s]+|[\s]+$/g,'').match(/[\d\-]+/),10); 31836 if (isNaN(iQuantity) === true || EC$(quantity_id).val() == '' || EC$(quantity_id).val().indexOf('.') > 0) { 31837 return false; 31838 } 31839 } 31840 31841 } 31842 31843 return iQuantity; 31844} 31845 31846/** 31847 * ìë ì²´í¬ 31848 * 31849 * @return mixed ì¬ë°ë¥¸ ìëì´ë©´ ìëì, ìëë©´ false 31850 */ 31851function checkQuantity() 31852{ 31853 // ìë ê°ì ¸ì¤ê¸° 31854 var iQuantity = getQuantity(); 31855 31856 if (isNewProductSkin() === false) { 31857 if (iQuantity === false) return false; 31858 31859 // 구ì¤í¨ì ìµì ì¶ê°ì¸ ê²½ì° ìëì 모ë í©ì³ì¼ í¨..íëì ìì´ eachì¶ê° 31860 // ì¬ê³ ê´ë ¨ë ì¬ê¸°ì íë? 31861 if (Olnk.isLinkageType(option_type) === true) { 31862 var sOptionIdTmp = ''; 31863 EC$('select[id^="' + product_option_id + '"]').each(function() { 31864 if (/^\*+$/.test(EC$(this).val()) === false) { 31865 sOptionIdTmp = EC$(this).val(); 31866 return false;
31867 } 31868 }); 31869 31870 EC$('.EC_MultipleOption').each(function(i) { 31871 iQuantity += parseInt(EC$(this).find('.' + EC$.data(document,'multiple_option_quantity_class')).val(),10); 31872 }); 31873 31874 if (Olnk.getStockValidate(sOptionIdTmp , iQuantity) === true) { 31875 alert(__('ìíì ìëì´ ì¬ê³ ìë ë³´ë¤ ë§ìµëë¤.')); 31876 EC$(quantity_id).focus(); 31877 return false; 31878 } 31879 } 31880 31881 if (iQuantity < product_min) { 31882 alert(sprintf(__('ìµì 주문ìëì %sê° ì ëë¤.'), product_min)); 31883 EC$(quantity_id).focus(); 31884 return false; 31885 } 31886 if (iQuantity > product_max && product_max > 0) { 31887 alert(sprintf(__('ìµë 주문ìëì %sê° ì ëë¤.'), product_max)); 31888 EC$(quantity_id).focus(); 31889 return false; 31890 } 31891 31892 } else { 31893 var bResult = true; 31894 var bSaleMainProduct = false; 31895 var aQuantity = new Array(); 31896 var iTotalOuantity = 0; 31897 var iProductMin = product_min; 31898 var iProductMax = product_max; 31899 31900 var sTotalProductSelector = '#totalProducts > table > tbody'; 31901 if (CAFE24.checkChannelUI() === true) { 31902 sTotalProductSelector = '#totalProducts > div'; 31903 } 31904 EC$(sTotalProductSelector).not('.add_products').find('[name="quantity_opt[]"]').each(function() { 31905 // 본ìí 구매ì¬ë¶
31906 bSaleMainProduct = true; 31907 iQuantity = parseInt(EC$(this).val()); 31908 31909 var iProductNum = iProductNo; 31910 // ì¶ê° 구ì±ìíì¸ ê²½ì° product_min , product_max ê°ì ë¤ë¥¸ê°ì ë¹êµí´ì¼ í¨.. 31911 if (EC$(this).attr('id').indexOf('add_') > -1) { 31912 iProductMin = EC$('#'+EC$(this).attr('id').replace('quantity','productmin')).val(); 31913 iProductMax = EC$('#'+EC$(this).attr('id').replace('quantity','productmax')).val(); 31914 var iProductNum = EC$('#'+EC$(this).attr('id').replace('quantity','id')).attr('class').replace('option_add_box_',''); 31915 } 31916 if (typeof(aQuantity[iProductNum]) === 'undefined') { 31917 aQuantity[iProductNum] = new Array(); 31918 } 31919 aQuantity[iProductNum].push(iQuantity); 31920 31921 // ìí기ì¤ì ê²½ì° í목 ì´í©ì¼ë¡ íë¨ 31922 if (order_limit_type !== 'P') { 31923 if (iQuantity < iProductMin) { 31924 alert(sprintf(__('ìíë³ ìµì 주문ìëì %s ì ëë¤.'), iProductMin)); 31925 EC$(quantity_id).focus(); 31926 bResult = false;
31927 return false; 31928 } 31929 if (iQuantity > iProductMax && iProductMax > 0) { 31930 alert(sprintf(__('ìíë³ ìµë 주문ìëì %s ì ëë¤.'), iProductMax)); 31931 EC$(quantity_id).focus(); 31932 bResult = false; 31933 return false; 31934 } 31935 } 31936 iTotalOuantity = iTotalOuantity + iQuantity; 31937 }); 31938 31939 if (bResult == false) { 31940 return bResult; 31941 } 31942 if (typeof CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE === 'object') { 31943 for (var iProductNum in aQuantity) { 31944 if (aQuantity.hasOwnProperty(iProductNum) === false) { 31945 continue; 31946 } 31947 if (CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.oBundleConfig.hasOwnProperty(iProductNum) === false) { 31948 continue; 31949 } 31950 31951 if (CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.isValidQuantity(aQuantity[iProductNum], iProductNum) === false) { 31952 return false; 31953 } 31954 } 31955 } 31956 // 본ìí ìì´ êµ¬ë§¤ê°ë¥í기ë문ì 본ìíììëë§ ì²´í¬ 31957 if (bSaleMainProduct === true) { 31958 if (order_limit_type === 'P') { 31959 if (iTotalOuantity < iProductMin) { 31960 alert(sprintf(__('ìµì 주문ìëì %sê° ì ëë¤.'), iProductMin)); 31961 bResult = false;
31962 return false; 31963 } 31964 if (iTotalOuantity > iProductMax && iProductMax > 0) { 31965 alert(sprintf(__('ìµë 주문ìëì %sê° ì ëë¤.'), iProductMax)); 31966 bResult = false; 31967 return false; 31968 } 31969 } 31970 if (buy_unit_type === 'P') { 31971 if (iTotalOuantity % parseInt(buy_unit, 10) !== 0) { 31972 alert(sprintf(__('구매 주문ë¨ìë %sê° ì ëë¤.'), parseInt(buy_unit, 10))); 31973 bResult = false; 31974 return false; 31975 } 31976 } 31977 } 31978 if (EC$('.add_products').find('[name="quantity_opt[]"]').length > 0) { 31979 var aTotalQuantity = {}; 31980 EC$('.add_products').find('[name="quantity_opt[]"]').each(function () { 31981 iQuantity = parseInt(EC$(this).val()); 31982 if (typeof(aTotalQuantity[EC$(this).attr('product-no')]) === 'undefined' || aTotalQuantity[EC$(this).attr('product-no')] < 1) { 31983 aTotalQuantity[EC$(this).attr('product-no')] = 0; 31984 } 31985 aTotalQuantity[EC$(this).attr('product-no')] += parseInt(EC$(this).val(), 10); 31986 31987 } 31988 ); 31989 31990 for (var iProductNo in aTotalQuantity) { 31991 var aProductQuantityInfo = ProductAdd.getProductQuantityInfo(iProductNo); 31992 31993 if (aProductQuantityInfo.order_limit_type === 'P') { 31994 if (aTotalQuantity[iProductNo] < aProductQuantityInfo.product_min) { 31995 alert(sprintf(__('ìµì 주문ìëì %sê° ì ëë¤.'), aProductQuantityInfo.product_min)); 31996 bResult = false;
31997 return false; 31998 } 31999 if (aTotalQuantity[iProductNo] > aProductQuantityInfo.product_max && aProductQuantityInfo.product_max > 0) { 32000 alert(sprintf(__('ìµë 주문ìëì %sê° ì ëë¤.'), aProductQuantityInfo.product_max)); 32001 bResult = false; 32002 return false; 32003 } 32004 } 32005 if (aProductQuantityInfo.buy_unit_type === 'P') { 32006 if (aTotalQuantity[iProductNo] % parseInt(aProductQuantityInfo.buy_unit, 10) !== 0) { 32007 alert(sprintf(__('구매주문ë¨ìë %sê° ì ëë¤.'), parseInt(aProductQuantityInfo.buy_unit, 10))); 32008 bResult = false; 32009 return false; 32010 } 32011 } 32012 } 32013 } 32014 if (bResult == false) { 32015 return bResult; 32016 } 32017 } 32018 32019 return iQuantity; 32020} 32021 32022function commify(n) 32023{ 32024 var reg = /(^[+-]?\d+)(\d{3})/; // ì ê·ì 32025 n += ''; // ì«ì를 문ìì´ë¡ ë³í 32026 while (reg.test(n)) { 32027 n = n.replace(reg, '$1' + ',' + '$2'); 32028 } 32029 return n; 32030} 32031 32032var isClose = 'T'; 32033function optionPreview(obj, sAction, sProductNo, closeType) 32034{ 32035 var sPreviewId = 'btn_preview_'; 32036 var sUrl = '/product/option_preview.html'; 32037 var layerId = EC$('#opt_preview_' + sAction + '_' + sProductNo); 32038 32039 // layerId = actionëª + product_no ë¡ ì´ë£¨ì´ì§ (í íì´ì§ì ë¤ë¥¸ ì¢ ë¥ì ìí리ì¤í¸ê° ë ¸ì¶ë ë êµ¬ë¶ íì) 32040 if (EC$(layerId).length > 0) { 32041 EC$(layerId).show(); 32042 } else if (sProductNo != '') { 32043 EC$.post(sUrl, 'product_no=' + sProductNo + '&action=' + sAction, function(result) 32044 { 32045 EC$(obj).after(result.replace(/[<]script( [^ ]+)? src=\"[^>]*>([\s\S]*?)[<]\/script>/g,"")); 32046 }); 32047 } 32048} 32049 32050function closeOptionPreview(sAction, sProductNo) 32051{ 32052 isClose = 'T'; 32053 setTimeout("checkOptionPreview('" + sAction + "','" + sProductNo + "')", 150); 32054} 32055 32056function checkOptionPreview(sAction, sProductNo) 32057{ 32058 var layerId = EC$('#opt_preview_' + sAction + '_' + sProductNo); 32059 if (isClose == 'T') EC$(layerId).hide(); 32060} 32061 32062function openOptionPreview(sAction, sProductNo) 32063{ 32064 isClose = 'F'; 32065 var layerId = EC$('#opt_preview_' + sAction + '_' + sProductNo); 32066 EC$(layerId).show(); 32067 32068 EC$(layerId).mousemouseenter(function() 32069 { 32070 EC$(layerId).show(); 32071 }).mouseleave(function() 32072 { 32073 EC$(layerId).hide(); 32074 }); 32075 32076} 32077 32078/** 32079 * ë¤ì´ë² íì´ ì£¼ë¬¸í기 32080 */ 32081function nv_add_basket_1_product() 32082{ 32083 bIsMobile = false; 32084 32085 if (_isProc == 'F') { 32086 alert(__("ë¤ì´ë² íì´ ì ì ìí를 íì¸íììì¤.")); 32087 return; 32088 } 32089 32090 if (typeof(set_option_data) !== 'undefined') { 32091 alert(__('ì¸í¸ìíì ë¤ì´ë² íì´ êµ¬ë§¤ê° ë¶ê°íì¤ë, ì¼í몰 ë°ë¡êµ¬ë§¤ë¥¼ ì´ì©í´ì£¼ì¸ì. ê°ì¬í©ëë¤.')); 32092 return; 32093 } 32094 32095 product_submit('naver_checkout', '/exec/front/order/basket/'); 32096} 32097 32098/** 32099 * ë¤ì´ë² íì´ ì°í기 32100 */ 32101function nv_add_basket_2_product() 32102{ 32103 if (_isProc == 'F') { 32104 alert(__("ë¤ì´ë² íì´ ì ì ìí를 íì¸íììì¤.")); 32105 return; 32106 } 32107 32108 window.open("/exec/front/order/navercheckoutwish?product_no=" + iProductNo, "navercheckout_basket", 32109 'scrollbars=yes,status=no,toolbar=no,width=450,height=300'); 32110} 32111 32112/** 32113 * ë¤ì´ë² íì´ ì£¼ë¬¸í기 32114 */ 32115function nv_add_basket_1_m_product() 32116{ 32117 bIsMobile = true; 32118 32119 if (_isProc == 'F') { 32120 alert(__("ë¤ì´ë² íì´ ì ì ìí를 íì¸íììì¤.")); 32121 return; 32122 } 32123 32124 if (typeof(set_option_data) !== 'undefined') { 32125 alert(__('ì¸í¸ìíì ë¤ì´ë² íì´ êµ¬ë§¤ê° ë¶ê°íì¤ë, ì¼í몰 ë°ë¡êµ¬ë§¤ë¥¼ ì´ì©í´ì£¼ì¸ì. ê°ì¬í©ëë¤.')); 32126 return; 32127 } 32128 32129 product_submit('naver_checkout', '/exec/front/order/basket/'); 32130} 32131 32132/** 32133 * ë¤ì´ë² íì´ ì°í기 32134 */ 32135function nv_add_basket_2_m_product() 32136{ 32137 if (_isProc == 'F') { 32138 alert(__("ë¤ì´ë² íì´ ì ì ìí를 íì¸íììì¤.")); 32139 return; 32140 } 32141 32142 window.location.href = "/exec/front/order/navercheckoutwish?product_no=" + iProductNo; 32143 //window.open("/exec/front/order/navercheckoutwish?product_no=" + iProductNo, "navercheckout_basket", 'scrollbars=yes,status=no,toolbar=no,width=450,height=300'); 32144} 32145 32146/** 32147 * ìµì ì¶ê° 구매ìì ê°ì ìµì ì ê²ì¬íë í¨ì 32148 * 32149 * @returns Boolean 32150 */ 32151function duplicateOptionCheck() 32152{
32153 var bOptionDuplicate = getOptionDuplicate(); 32154 //var bAddOptionDuplicate = getAddOptionDuplicate(); 32155 32156 if (bOptionDuplicate !== true) { //}&& bAddOptionDuplicate !== true) { 32157 alert(__('ëì¼í ìµì ì ìíì´ ììµëë¤.')); 32158 return false; 32159 } 32160 32161 return true; 32162} 32163 32164/** 32165 * í ì¤í¸ ì¸í ìµì ì¤ë³µ ì²´í¬ 32166 * 32167 * @returns {Boolean} 32168 */ 32169function getAddOptionDuplicate() 32170{ 32171 var aOptionRow = new Array(); 32172 var iOptionLength = 0; 32173 var aOptionValue = new Array(); 32174 var bReturn = true; 32175 // 기본 ìµì 32176 EC$('[id^="' + add_option_id + '"]').each(function() 32177 { 32178 aOptionRow.push(EC$(this).val()); 32179 }); 32180 aOptionValue.push(aOptionRow.join(',@,')); 32181 EC$('.EC_MultipleOption').each(function() 32182 { 32183 aOptionRow = new Array(); 32184 EC$(EC$(this).find('.' + EC$.data(document, 'multiple_option_input_class'))).each(function() 32185 { 32186 aOptionRow.push(EC$(this).val()); 32187 }); 32188 var sOptionRow = aOptionRow.join(',@,'); 32189 if (EC$.inArray(sOptionRow, aOptionValue) > -1) { 32190 bReturn = false; 32191 return false; 32192 } else { 32193 aOptionValue.push(sOptionRow); 32194 } 32195 }); 32196 return bReturn; 32197} 32198/** 32199 * ì¼ë° ì ë í¸ë°ì¤í ìµì ì²´í¬ í¨ì 32200 * 32201 * @returns {Boolean} 32202 */ 32203function getOptionDuplicate() { 32204 // ì íì¬ë¶ë ì´ë¯¸ ì íì´ ëì´ ìì 32205 var aOptionId = new Array(); 32206 var aOptionValue = new Array(); 32207 var aOptionRow = new Array(); 32208 var iOptionLength = 0; 32209 // 기본 ìµì 32210 EC$('select[id^="' + product_option_id + '"]').each(function (i) { 32211 aOptionValue.push(EC$(this).val()); 32212 iOptionLength++; 32213 }); 32214 // ì¶ê° 구매 32215 EC$('.' + EC$.data(document, 'multiple_option_select_class')).each(function (i) { 32216 aOptionValue.push(EC$(this).val()); 32217 }); 32218 32219 var aOptionRow = new Array(); 32220 for (var x in aOptionValue) { 32221 var sOptionValue = aOptionValue[x]; 32222 aOptionRow.push(sOptionValue); 32223 if (x % iOptionLength == iOptionLength - 1) { 32224 var sOptionId = aOptionRow.join('-'); 32225 32226 if (EC$.inArray(sOptionId, aOptionId) > -1) { 32227 return false; 32228 } 32229 aOptionId.push(sOptionId); 32230 aOptionRow = new Array(); 32231 } 32232 } 32233 32234 return true; 32235} 32236 32237//sms ì¬ì ê³ 32238function action_sms_restock(sParam) 32239{ 32240 // 모ë°ì¼ ì ì ë° ë ì´ì´ íì ì¬ë¶ íì¸ 32241 if (typeof(EC_SHOP_FRONT_PRODUCT_SMS_RESTOCK_LAYER) !== 'undefined') { 32242 if (EC_SHOP_FRONT_PRODUCT_SMS_RESTOCK_LAYER.createSmsRestockLayerDisplayResult(sParam) === true) { 32243 return; 32244 } 32245 } 32246 32247 window.open('#none', 'sms_restock' ,'width=459, height=490, scrollbars=yes'); 32248 EC$('#frm_image_zoom').attr('target', 'sms_restock'); 32249 EC$('#frm_image_zoom').attr('action', '/product/sms_restock.html'); 32250 EC$('#frm_image_zoom').submit(); 32251} 32252 32253//email ì¬ì ê³ 32254function action_email_restock(iProductNo) 32255{ 32256 if (typeof(iProductNo) === 'undefined') { 32257 iProductNo = ''; 32258 } 32259 if ((window.navigator.standalone || (window.matchMedia && window.matchMedia('(display-mode: standalone)').matches)) === true) { 32260 window.open('/product/email_restock.html?' + EC$('#frm_image_zoom').serialize(), 'email_restock' ,'width=459, height=490, scrollbars=yes'); 32261 } else { 32262 window.open('#none', 'email_restock' ,'width=459, height=490, scrollbars=yes'); 32263 EC$('#frm_image_zoom').attr('target', 'email_restock'); 32264 EC$('#frm_image_zoom').attr('action', '/product/email_restock.html?product_no' + iProductNo); 32265 EC$('#frm_image_zoom').submit(); 32266 } 32267} 32268 32269// ìµë í ì¸ì¿ í° ë¤ì´ë°ê¸° íì 32270function popupDcCoupon(product_no, coupon_no, cate_no, opener_url, location) 32271{ 32272 var aUrl = []; 32273 if (location === 'Front' || typeof location === 'undefined') { 32274 aUrl.push('product'); 32275 } 32276 aUrl.push('coupon_popup.html'); 32277 window.open(EC_ROUTE.getPrefixUrl('/' + aUrl.join('/')) + "?product_no=" + product_no + "&coupon_no=" + coupon_no + "&cate_no=" + cate_no + "&opener_url=" + opener_url, "popupDcCoupon", "toolbar=no,scrollbars=no,resizable=yes,width=800,height=640,left=0,top=0"); 32278} 32279 32280/** 32281 * ê´ë ¨ìí ì´ê³ ë«ê¸° 32282 */ 32283function ShowAndHideRelation() 32284{ 32285 try { 32286 var sRelation = EC$('ul.mSetPrd').parent(); 32287 var sRelationDisp = sRelation.css('display'); 32288 if (sRelationDisp === 'none') { 32289 EC$('#setTitle').removeClass('show'); 32290 sRelation.show(); 32291 } else { 32292 EC$('#setTitle').addClass('show'); 32293 sRelation.hide(); 32294 } 32295 } catch (e) { } 32296} 32297 32298var ITEM = { 32299 getItemCode: function() 32300 {
32301 var chk_has_opt = ''; 32302 try { 32303 chk_has_opt = has_option; 32304 } catch (e) {chk_has_opt = 'T';} 32305 32306 if (chk_has_opt == 'F') { 32307 return [item_code]; 32308 } else { 32309 // íìê° ì²´í¬ 32310 var bRequire = false; 32311 // ìµì ì´ ìì 32312 if (EC$('[id^="product_option_id"]').length < 1) { 32313 return false; 32314 } 32315 EC$('[id^="product_option_id"]').each(function() { 32316 if (EC$(this).prop('required') === true || EC$(this).attr('required') === 'required') { 32317 bRequire = true; 32318 return false; 32319 } 32320 }); 32321 32322 var aItemCode = []; 32323 if (bRequire === true) { 32324 if (EC$('#totalProducts').length === 0 || (typeof CAFE24.SHOP_FRONT_PRODUCT_FUNDING === 'object' && CAFE24.SHOP_FRONT_PRODUCT_FUNDING.isFundingProduct() === false)) { 32325 sItemCode = this.getOldProductItemCode(); 32326 if (sItemCode !== false) { 32327 if (typeof(sItemCode) === 'string') { 32328 aItemCode.push(sItemCode); 32329 } else { 32330 aItemCode = sItemCode; 32331 } 32332 } else { 32333 // ìµì ì´ ì íëì§ ìì 32334 return false; 32335 } 32336 } else { 32337 if (EC$('.option_box_id').length == 0) { 32338 // ìµì ì´ ì íëì§ ìì 32339 return false; 32340 } 32341 EC$('.option_box_id').each(function() { 32342 aItemCode.push(EC$(this).val()); 32343 }); 32344 } 32345 } 32346 32347 32348 return aItemCode; 32349 } 32350 }, 32351 getWishItemCode: function() 32352 { 32353 var chk_has_opt = ''; 32354 try { 32355 chk_has_opt = has_option; 32356 } catch (e) {chk_has_opt = 'T';} 32357 32358 if (chk_has_opt == 'F') { 32359 return [item_code]; 32360 } else { 32361 // íìê° ì²´í¬ 32362 var bRequire = false; 32363 EC$('[id^="product_option_id"]').each(function() { 32364 if (EC$(this).prop('required') === true || EC$(this).attr('required') === 'required') { 32365 bRequire = true; 32366 return false; 32367 } 32368 }); 32369 32370 var aItemCode = new Array(); 32371 if (bRequire === true) { 32372 if (EC$('#totalProducts').length === 0) { 32373 sItemCode = this.getOldProductItemCode(); 32374 if (sItemCode !== false) { 32375 if (typeof(sItemCode) === 'string') { 32376 aItemCode.push(sItemCode); 32377 } else { 32378 aItemCode = sItemCode; 32379 } 32380 } else { 32381 // ìµì ì´ ì íëì§ ìì 32382 return false; 32383 } 32384 } else { 32385 if (EC$('.soldout_option_box_id,.option_box_id').length == 0) { 32386 // ìµì ì´ ì íëì§ ìì 32387 return false; 32388 } 32389 EC$('.soldout_option_box_id,.option_box_id').each(function() { 32390 aItemCode.push(EC$(this).val()); 32391 }); 32392 } 32393 } 32394 32395 return aItemCode; 32396 } 32397 }, 32398 getOldProductItemCode: function(sSelector) 32399 { 32400 if (sSelector === undefined) { 32401 sSelector = '[id^="product_option_id"]'; 32402 } 32403 var sItemCode = null; 32404 // ë´ìí ìµì ì í 구매 32405 if (has_option === 'F') { 32406 // íë©´ì ìì 32407 sItemCode = item_code; 32408 } else { 32409 if (item_listing_type == 'S') { 32410 var aOptionValue = new Array(); 32411 EC$(sSelector).each(function() { 32412 if (ITEM.isOptionSelected(EC$(this).val()) === true) { 32413 aOptionValue.push(EC$(this).val()); 32414 } 32415 }); 32416 32417 if (option_type === 'T') { 32418 var aCodeMap = CAFE24.UTIL.parseJSON(option_value_mapper); 32419 sItemCode = aCodeMap[aOptionValue.join('#$%')]; 32420 } else { 32421 sItemCode = aOptionValue; 32422 } 32423 } else { 32424 sItemCode = EC$(sSelector).val(); 32425 } 32426 } 32427 32428 if (sItemCode === undefined) { 32429 return false;
32430 } 32431 32432 return sItemCode; 32433 }, 32434 isOptionSelected: function(aOption) 32435 { 32436 var sOptionValue = null; 32437 if (typeof aOption === 'string') { 32438 sOptionValue = aOption; 32439 } else { 32440 if (aOption.length === 0) return false; 32441 sOptionValue = aOption.join('-|'); 32442 } 32443 32444 sOptionValue = '-|'+sOptionValue+'-|'; 32445 return !(/-\|\*{1,2}-\|/g).test(sOptionValue); 32446 }, 32447 setBodyOverFlow: function(sType) 32448 { 32449 var sLocation = location; 32450 var bBuyLayer = false; 32451 32452 //var oReturnData = new Object(); 32453 if (CAFE24.SHOP_FRONT_PRODUCT_OPTIONLAYER.isExistLayer(true) === true) { 32454 //parent.EC$('html, body').css('overflowY', 'auto'); 32455 closeBuyLayer(false); 32456 sLocation = parent.location; 32457 bBuyLayer = true; 32458 } 32459 32460 //íë ìì¼ë¡ ì ì¸ë íì´ì§ì¼ê²½ì° 32461 if (typeof(bIsOptionSelectFrame) !== 'undefined' && bIsOptionSelectFrame === true) { 32462 sLocation = parent.location; 32463 bBuyLayer = true; 32464 } 32465 /* 32466 oReturnData['sLocation'] = sLocation; 32467 oReturnData['bBuyLayer'] = bBuyLayer; 32468 */ 32469 32470 oReturnData = sLocation; 32471 32472 if (typeof(sType) === 'boolean') { 32473 oReturnData = bBuyLayer; 32474 } 32475 return oReturnData; 32476 } 32477}; 32478 32479CAFE24.SHOP_FRONT_PRODUCT_RESTOCK = (function() { 32480 32481 return { 32482 isRestock: function(sType) { 32483 32484 if (sType === 'sms_restock') { 32485 return true; 32486 } 32487 32488 if (sType === 'email_restock') { 32489 return true; 32490 } 32491 32492 return false; 32493 },
32494 openRestockEmailPopup: function() 32495 { 32496 product_submit('email_restock'); 32497 }, 32498 bindOpenRestockEmailPopup: function(product_no) 32499 { 32500 action_email_restock(product_no); 32501 32502 } 32503 }; 32504})(); 32505 32506var EC_SHOP_FRONT_PRODUCT_RESTOCK = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_PRODUCT_RESTOCK'); 32507 32508//ìì¸ ì¥ë°êµ¬ë ë´ê¸°íì¸ì°½ìì ì¤í¬ë¦½í¸ë¥¼ ì¤ëª©ì¼ë¡ ë³¼ë¬ì¤ëë¶ë¶ì ì ê±°í기ìí´ì ì¶ê° 32509//ì¬ì©ì ëìì¸ììë basket.jsì ìë í¨ìì ìì¡´ì ì´ë¼ì ì¶ê°ê° ìëì´ìë¤ë©´ ìë í¨ìë¤ì ì¤ííëë¡ í¨ 32510if (typeof(layer_basket_paging) !== 'function') { 32511 //ë ì´ì´ ì¥ë°êµ¬ë íì´ì§ 32512 function layer_basket_paging(page_no) 32513 { 32514 var sUrl = '/product/add_basket2.html?page=' + page_no + '&layerbasket=T'; 32515 if (typeof(sBasketDelvType) !== 'undefined') { 32516 sUrl += sUrl + '&delvtype=' + sBasketDelvType; 32517 } 32518 32519 // URL ì ch_ref íë¼ë¯¸í° ì¶ê° 32520 if (CAFE24.hasChRef()) { 32521 // ì´ë¯¸ ch_refê° í¬í¨ëì´ ìëì§ íì¸ 32522 var urlObj = new URL(sUrl, window.location.origin); 32523 if (!urlObj.searchParams.has('ch_ref')) { 32524 sUrl = CAFE24.attachChRef(sUrl); 32525 } 32526 } 32527 32528 EC$.get(sUrl, '', function(sHtml) 32529 { 32530 sHtml = sHtml.replace(/<script.*?ind-script\/optimizer.php.*?<\/script>/g, ''); 32531 EC$('#confirmLayer').html(sHtml); 32532 EC$('#confirmLayer').show(); 32533 32534 // set delvtype to basket 32535 try { 32536 EC$(".xans-order-layerbasket").find("a[href='/order/basket.html']").attr("href", "/order/basket.html?delvtype=" + delvtype); 32537 } catch (e) { 32538 PRODUCTSUBMIT.DEBUG.messageOut(e, 'PRODUCT_ACTION.layer_basket_paging'); 32539 } 32540 ReferenceCurrencyPrice.init(); 32541 }); 32542 } 32543} 32544 32545if (typeof(Basket) === 'undefined') { 32546 var Basket = { 32547 orderLayerAll: function(oElem) { 32548 var aParam = {basket_type: 'all_buy'}; 32549 var sOrderUrl = EC$(oElem).attr('link-order') || '/order/orderform.html?basket_type='+ aParam.basket_type; 32550 32551 if (sBasketDelvType != "") { 32552 sOrderUrl += '&delvtype=' + sBasketDelvType; 32553 } 32554 32555 // URL ì ch_ref íë¼ë¯¸í° ì¶ê° 32556 var sChRef = null; 32557 if (typeof CAFE24 !== 'undefined' && CAFE24.getChRefData && typeof CAFE24.getChRefData === 'function') { 32558 sChRef = CAFE24.getChRefData(); 32559 } else { 32560 sChRef = sessionStorage.getItem('ch_ref'); 32561 } 32562 32563 if (sChRef) { 32564 sOrderUrl = sOrderUrl.replace(/[?&]ch_ref=[^&]*/g, ''); 32565 var querySeparator = (sOrderUrl.includes('?')) ? '&' : '?'; 32566 sOrderUrl += querySeparator + 'ch_ref=' + encodeURIComponent(sChRef); 32567 32568 aParam['ch_ref'] = sChRef; 32569 } 32570 32571 var sLoginUrl = EC$(oElem).attr('link-login') || '/member/login.html'; 32572 32573 EC$.post('/exec/front/order/order/', aParam, function(data) { 32574 if (data.result < 0) { 32575 // [ECQAUNIT-75276] 몰 ì¸ì´ ìë¿ì ì í ì¸ì´ë¡ ë²ì íì (ë´ë¶ í´ë°± í¬í¨, CommonUtilì DispAbstract ê³µíµ ë¡ë) 32576 CAPP_SHOP_FRONT_COMMON_UTIL.alertTranslated(data.alertMSG); 32577 return; 32578 } 32579 32580 if (data.isLogin == 'F') { // ë¹ë¡ê·¸ì¸ 주문 > ë¡ê·¸ì¸íì´ì§ë¡ ì´ë 32581 sLoginUrl = sLoginUrl + '?noMember=1&returnUrl=' + escape(sOrderUrl); 32582 32583 // URL ì ch_ref íë¼ë¯¸í° ì¶ê° 32584 if (CAFE24.hasChRef()) { 32585 // ì´ë¯¸ ch_refê° í¬í¨ëì´ ìëì§ íì¸ 32586 var urlObj = new URL(sLoginUrl, window.location.origin); 32587 if (!urlObj.searchParams.has('ch_ref')) { 32588 sLoginUrl = CAFE24.attachChRef(sLoginUrl); 32589 } 32590 } 32591 32592 location.href = sLoginUrl; 32593 } else { 32594 // URL ì ch_ref íë¼ë¯¸í° ì¶ê° 32595 var sChRef = null; 32596 if (typeof CAFE24 !== 'undefined' && CAFE24.getChRefData && typeof CAFE24.getChRefData === 'function') { 32597 sChRef = CAFE24.getChRefData(); 32598 } else { 32599 sChRef = sessionStorage.getItem('ch_ref'); 32600 } 32601 32602 if (sChRef) { 32603 sOrderUrl = sOrderUrl.replace(/[?&]ch_ref=[^&]*/g, ''); 32604 var querySeparator = (sOrderUrl.includes('?')) ? '&' : '?'; 32605 sOrderUrl += querySeparator + 'ch_ref=' + encodeURIComponent(sChRef); 32606 } 32607 32608 location.href = sOrderUrl; 32609 } 32610 }, 'json'); 32611 } 32612 }; 32613} 32614 32615/** 32616 * ì¥ë°êµ¬ë ì í¨ì± ê²ì¦ validation 32617 */ 32618CAFE24.SHOP_FRONT_BASKET_VALID = { 32619 // ì¥ë°êµ¬ë ìí ì¤ë³µì¬ë¶ íì¸ 32620 isBasketProductDuplicateValid: function(sParam) { 32621 var bReturn = true; 32622 32623 EC$.ajax({ 32624 url: '/exec/front/order/Basketduplicate/', 32625 type: 'post', 32626 data: sParam, 32627 async: false, 32628 dataType: 'json', 32629 success: function(data) { 32630 if (data.result === true) { 32631 if (confirm(__('ì¥ë°êµ¬ëì ëì¼í ìíì´ ììµëë¤. ' + '\n' + 'ì¥ë°êµ¬ëì ì¶ê°íìê² ìµëê¹?')) === false) { 32632 bReturn = false;
32633 return false; 32634 } 32635 } 32636 } 32637 }); 32638 32639 return (bReturn !== false); 32640 } 32641}; 32642 32643/** 32644 * ì¹´í ê³ ë¦¬ ì¿ í¤ì ë³´ ì¸í 32645 * @param aCookieInfo 32646 */ 32647function setCategoryCookie(aCookieInfo) 32648{ 32649 // 4ì°¨ ëë©ì¸ ëìì¼ë¡ 모ë°ì¼ ëíëë©ì¸ì¸ ê²½ì° /m íì ê²½ë¡ë¡ ì¿ í¤ ì¤ì 32650 var sPath = EC_ROUTE.getMobile() === true && EC_ROUTE.isBaseDomain() === true ? '/m/product' : '/product'; 32651 if (EC$.cookie('ec_category') !== null) { 32652 EC$.cookie('ec_category', null, {'path': sPath}); 32653 } 32654 32655 if (aCookieInfo.hasOwnProperty('category_no') === false || aCookieInfo.hasOwnProperty('category_name') === false) { 32656 return; 32657 } 32658 32659 if (typeof aCookieInfo['category_no'] !== 'number' || typeof aCookieInfo['category_name'] !== 'string') { 32660 return; 32661 } 32662 32663 var sCookie = EC$.param(aCookieInfo); 32664 EC$.cookie('ec_category', sCookie, {'path': sPath}); 32665} 32666 32667/** 32668 * ìì¬ëª° ëë© ì¿ í¤ ì¸í 32669 */ 32670function setShoppingPayCookie() 32671{ 32672 EC$.cookie('ec_provide_shoppingpay', 'T', {'path': '/'}); 32673} 32674 32675function setInAppCookie() 32676{ 32677 EC$.cookie('co_linktype', 'in_app'); 32678} 32679 32680var EC_SHOP_FRONT_BASKET_VALIID = CAFE24.getDeprecatedNamespace('SHOP_FRONT_BASKET_VALID'); 32681 32682CAFE24.EC_SHOP_FRONT_BASKET_ACTION_EVENT = (function () { 32683 var sEventName = 'EC_PRODUCT_ACTION_BASKET'; 32684 var oParam = {}; 32685 var bIsProcess = false; 32686 return { 32687 init: function (iProductNo) { 32688 bIsProcess = true; 32689 oParam = { 32690 mall_id: SHOP.getMallID(), 32691 shop_no: CAFE24.SDE_SHOP_NUM, 32692 product_no: iProductNo, 32693 contents: [], 32694 currency: CAFE24.SHOP_CURRENCY_INFO[CAFE24.SDE_SHOP_NUM].aShopCurrencyInfo.currency_code, 32695 }; 32696 }, 32697 pushContent: function (oData) { 32698 oParam.contents.push(oData); 32699 }, 32700 trigger: function (sParam, aResult) { 32701 var oData = this.queryStringToJSON(sParam); 32702 this.init(oData.product_no); 32703 32704 // [ECHOSTING-623890] ì¶ê°í ì¸ì¡ ê³ì°(ë¹ë기 AJAX) ë°ì´í° 미ëì°©/timeout ì getSaleItem()ì´ false를 ë°ííì¬ 32705 // price:0 / variant_code ëë½ì ë¹ íì´ë¡ëê° ë°íëê³ ë©í í½ì ë± êµ¬ë ìê° ì´ë¥¼ ëë¡(ê°í 미ì§ê³)íë¤. 32706 // ê³ì°ê¸° 미ì¤ë¹ë©´ ìë² ì¥ë°êµ¬ë ìëµ ê¸°ë° ê¸°ì¡´ ê²½ë¡(setDataFromParam)ë¡ í´ë°±íë¤. 32707 if (typeof TotalAddSale !== 'undefined' && this.isTotalAddSaleReady()) { 32708 this.setDataFromTotalAddSale(); 32709 } else { 32710 this.setDataFromParam(oData, aResult); 32711 } 32712 32713 if (!bIsProcess) { 32714 EC$('body').trigger(sEventName, oParam); 32715 } 32716 }, 32717 isTotalAddSaleReady: function () { 32718 var oProductList = TotalAddSale.getProductList();
32719 if (typeof oProductList === 'undefined' || Object.keys(oProductList).length === 0) { 32720 return false; 32721 } 32722 for (var sItemCode in oProductList) { 32723 if (oProductList.hasOwnProperty(sItemCode) && TotalAddSale.getSaleItem(sItemCode) === false) { 32724 return false; 32725 } 32726 } 32727 return true; 32728 }, 32729 setDataFromTotalAddSale: function () { 32730 var basketProductList = TotalAddSale.getProductList(); 32731 if (typeof basketProductList !== 'undefined' && Object.keys(basketProductList).length > 0) { 32732 oParam.category = CAFE24.FRONT_JS_CONFIG_SHOP.oCategoryInfo; 32733 oParam.total_price = TotalAddSale.getTotalOrderPrice(); 32734 for (var sItemCode in basketProductList) { 32735 if (basketProductList.hasOwnProperty(sItemCode)) { 32736 var oSaleItem = TotalAddSale.getSaleItem(sItemCode); 32737 // sale ë°ì´í° 미ê³ì°(ë°ë¡êµ¬ë§¤ ë±) ì í´ë¹ í목 ì¤íµíì¬ ê²°ê³¼ ì½ë°± ì²´ì¸ ì¤ë¨ ë°©ì§ (ECHOSTING-625233) 32738 if (oSaleItem === false) { 32739 continue; 32740 } 32741 var sVariantCode = typeof(set_option_data) !== 'undefined' ? item_code : oSaleItem.item_code; 32742 this.pushContent({ 32743 price: Math.floor(parseFloat(oSaleItem.item_price) || 0), 32744 variant_code: sVariantCode, 32745 quantity: parseInt(oSaleItem.quantity, 10) || 1, 32746 name: product_name 32747 }); 32748 } 32749 } 32750 32751 bIsProcess = false; 32752 } 32753 }, 32754 setDataFromParam: function (oData, aResult) { 32755 if (typeof aResult !== 'undefined' && typeof aResult.aBasketProduct === 'object') { 32756 var iTotalPrice = 0; 32757 for (var i = 0; i < aResult.aBasketProduct.length; i++) { 32758 var iItemPrice = Math.floor(parseFloat(aResult.aBasketProduct[i].tax_included_product_price) || 0); 32759 var iQuantity = parseInt(aResult.aBasketProduct[i].quantity, 10) || 1; 32760 iTotalPrice += iItemPrice * iQuantity; 32761 this.pushContent({ 32762 variant_code: aResult.aBasketProduct[i].item_code, 32763 quantity: iQuantity, 32764 name: aResult.aBasketProduct[i].product_name, 32765 price: iItemPrice, 32766 }); 32767 } 32768 oParam.total_price = iTotalPrice; 32769 32770 bIsProcess = false; 32771 } 32772 }, 32773 getEventData: function () { 32774 // [ECHOSTING-623890] 미ë°í ê²°ì (bIsProcess=true: ê³ì°ê¸° 미ì¤ë¹ + í´ë°± ë°ì´í° ë¶ì¬) ì null ë°í â 32775 // relay ì¡ì ë¶(ìì¸/ë ì´ì´/ì¸í¸)ê° ë¹ payload를 ë¶ëª¨ë¡ ë³´ë´ì§ ìê² íì¬, 32776 // ìì ë¶(NewProductOptionSelect/Channel)ì truthy ê°ëê° ë¹ ì´ë²¤í¸ ì¬ë°ì¬ë¥¼ ì°¨ë¨íë¤. 32777 if (bIsProcess) { 32778 return null; 32779 } 32780 return JSON.parse(JSON.stringify(oParam)); 32781 }, 32782 queryStringToJSON: function (sParam) { 32783 var aParam = decodeURIComponent(sParam).split('&'); 32784 var oResult = {}; 32785 EC$.each(aParam, function (iKey, sText) { 32786 sText = sText.split('='); 32787 var sName = sText[0]; 32788 var sValue = sText[1]; 32789 if (sName.length) { 32790 if (oResult[sName] !== undefined) { 32791 if (!oResult[sName].push) { 32792 oResult[sName] = [oResult[sName]]; 32793 } 32794 oResult[sName].push(sValue || ''); 32795 } else { 32796 oResult[sName] = sValue || ''; 32797 } 32798 } 32799 }); 32800 return oResult; 32801 } 32802 }; 32803})(); 32804 32805EC$(function () { 32806 CAPP_PRODUCT_LIST_WISHICON.init(); 32807}); 32808var CAPP_PRODUCT_LIST_WISHICON = { 32809 iDuplicateSecond: 2000, //ì¤ë³µ í´ë¦ ì íìê° 32810 iClickCount: 0, 32811 iRecentClickProductNo: 0, 32812 iTimeoutId: 0, // ì¤ë³µë°©ì§ ë기ìê° ì¤í ìíì¤ ë²í¸ 32813 sCommand: 'add', 32814 init: function() 32815 { 32816 var iProductNo = 0; 32817 var iCategoryNo = 0; 32818 var oObj = null; 32819 var sLogin = ''; 32820 var bIsIndividualSetProduct = false;
32821 try { 32822 EC$(document).on('click', '.ec-product-listwishicon', function () { 32823 oObj = EC$(this); 32824 iProductNo = parseInt(oObj.attr('productno')); 32825 iCategoryNo = oObj.attr('categoryno'); 32826 sLogin = oObj.attr('login_status'); 32827 bIsIndividualSetProduct = oObj.attr('individual-set') === 'T'; 32828 if (oObj.data('ec-redirect') === 'T') { 32829 location.href = EC$(this).data('ec-redirect-url'); 32830 return; 32831 } 32832 32833 if (sLogin !== 'T') { 32834 alert(__('ë¡ê·¸ì¸ í ê´ì¬ìí ë±ë¡ì í´ì£¼ì¸ì.')); 32835 location.href = '/member/login.html?returnUrl=' + encodeURIComponent(location.pathname + location.search); 32836 return; 32837 } 32838 32839 32840 if (CAPP_PRODUCT_LIST_WISHICON.iRecentClickProductNo === iProductNo) { 32841 if (CAPP_PRODUCT_LIST_WISHICON.iClickCount === 1) { 32842 CAPP_PRODUCT_LIST_WISHICON.iClickCount++; 32843 CAPP_PRODUCT_LIST_WISHICON.initCount(); 32844 } else if (CAPP_PRODUCT_LIST_WISHICON.iClickCount > 1) { 32845 return; 32846 } 32847 } else { 32848 CAPP_PRODUCT_LIST_WISHICON.iClickCount = 0; 32849 CAPP_PRODUCT_LIST_WISHICON.iRecentClickProductNo = iProductNo; 32850 if (CAPP_PRODUCT_LIST_WISHICON.iTimeoutId > 0) { 32851 clearTimeout(CAPP_PRODUCT_LIST_WISHICON.iTimeoutId); 32852 } 32853 } 32854 32855 // DB ì²ë¦¬ì ì¹´ì´í¸ë¥¼ í´ì¼ ì íí ì¤ë³µì²´í¬ê°ë¥ 32856 CAPP_PRODUCT_LIST_WISHICON.iClickCount++; 32857 32858 if (oObj.attr('icon_status') === 'on') { 32859 CAPP_PRODUCT_LIST_WISHICON.sCommand = 'del'; 32860 } else { 32861 CAPP_PRODUCT_LIST_WISHICON.sCommand = 'add'; 32862 } 32863 32864 var sUrl = '/exec/front/Product/Wishlist/'; 32865 var sParam = 'command=' + CAPP_PRODUCT_LIST_WISHICON.sCommand + '&from=wish_icon'; 32866 sParam += '&referer=' + encodeURIComponent('//' + location.hostname + location.pathname + location.search); 32867 sParam += '&product_no=' + iProductNo + '&cate_no=' + iCategoryNo; 32868 if (bIsIndividualSetProduct === true) { 32869 sParam += '&set_product=T'; 32870 } 32871 32872 EC$.post( 32873 sUrl, 32874 sParam, 32875 function (data) { 32876 CAPP_PRODUCT_LIST_WISHICON.getResultWishIconAjax(data, oObj); 32877 }, 32878 'json'); 32879 }); 32880 } catch (e) {} 32881 }, 32882 32883 /** 32884 * í´ë¦í ìê°ì²´í¬ 32885 */ 32886 initCount: function() 32887 { 32888 CAPP_PRODUCT_LIST_WISHICON.iTimeoutId = setTimeout(function() { 32889 CAPP_PRODUCT_LIST_WISHICON.iClickCount = 0; 32890 }, CAPP_PRODUCT_LIST_WISHICON.iDuplicateSecond); 32891 }, 32892 32893 getResultWishIconAjax: function(aData, oObj) 32894 { 32895 var STORAGE_KEY = 'localWishList' + CAFE24.SDE_SHOP_NUM; 32896 if (aData == null) return; 32897 if (aData.result == 'SUCCESS') { 32898 var iProductNo = EC$(oObj).attr('productno'); 32899 32900 EC$('.ec-product-listwishicon[productno="'+iProductNo+'"]').each(function() { 32901 var oStorageData = CAFE24.UTIL.parseJSON(sessionStorage.getItem(STORAGE_KEY)); 32902 if (EC$(this).attr('icon_status') === 'off') { 32903 var src = aData.data.wish_icon.on; 32904 var alt = aData.data.wish_alt.on; 32905 if (oStorageData !== null && oStorageData.hasOwnProperty('on_tags') === true) { 32906 src = oStorageData.on_tags.src; 32907 alt = oStorageData.on_tags.alt; 32908 } 32909 EC$(this).attr('src', src); 32910 EC$(this).attr('alt', alt); 32911 EC$(this).attr('icon_status', 'on'); 32912 } else { 32913 var src = aData.data.wish_icon.off; 32914 var alt = aData.data.wish_alt.off; 32915 if (oStorageData !== null && oStorageData.hasOwnProperty('off_tags') === true) { 32916 src = oStorageData.off_tags.src; 32917 alt = oStorageData.off_tags.alt; 32918 } 32919 EC$(this).attr('src', src); 32920 EC$(this).attr('alt', alt); 32921 EC$(this).attr('icon_status', 'off'); 32922 } 32923 }); 32924 32925 if (CAPP_ASYNC_METHODS.hasOwnProperty('WishList') === true) { 32926 // ê´ì¬ìí ì¶ê°/ìì ì sessionStorage ì¶ê°/ìì ì²ë¦¬ 32927 CAPP_ASYNC_METHODS.WishList.setSessionStorageItem(iProductNo, CAPP_PRODUCT_LIST_WISHICON.sCommand); 32928 } 32929 32930 if (CAPP_ASYNC_METHODS.hasOwnProperty('Wishcount') === true) { 32931 CAPP_ASYNC_METHODS.Wishcount.restoreCache(); 32932 CAPP_ASYNC_METHODS.Wishcount.execute(); 32933 } 32934 32935 if (CAPP_PRODUCT_LIST_WISHICON.sCommand === 'add') { // ìì리ì¤í¸ ë±ë¡ììë§ ì¤í 32936 CAFE24.PLUSAPP_BRIDGE.addWishList(iProductNo); 32937 if (typeof CAFE24.KAKAO_PIXEL_BRIDGE !== 'undefined') { 32938 CAFE24.KAKAO_PIXEL_BRIDGE.addWishList(iProductNo); 32939 } 32940 } 32941 32942 } else if (aData.result == 'ERROR') { 32943 alert(__('ì¤í¨íììµëë¤.')); 32944 } else if (aData.result == 'NOT_LOGIN') { 32945 alert(__('íì ë¡ê·¸ì¸ í ì´ì©íì¤ ì ììµëë¤.')); 32946 } else if (aData.result == 'INVALID_REQUEST') { 32947 alert(__('íë¼ë¯¸í°ê° ì못ëììµëë¤.')); 32948 } 32949 } 32950}; 32951 32952/**
32953 * 문íì¸ ì ì© ì¬ë¶ë¥¼ ì¤ì íê³ ë°ííë ê°ì²´ 32954 */ 32955var SHOP_FRONT_PRODUCT_CULTURAL_TAX = { 32956 is_cultural_tax: 'F', 32957 32958 /** 32959 * 문íì¸ ì ì© ì¬ë¶ë¥¼ ë°íí©ëë¤. 32960 * @returns {string} 'T' ëë 'F'ë¡ ë¬¸íì¸ ì ì© ì¬ë¶ 32961 */ 32962 getIsCulturalTax: function() { 32963 return CAFE24.FRONT_JS_CONFIG_SHOP.is_cultural_tax || this.is_cultural_tax; 32964 } 32965}; 32966/** 32967 * ì¶ê°êµ¬ì± ìí ë¼ì´ë¸ë¬ë¦¬ 32968 */ 32969var TotalAddSale = function() { 32970 //ì¶ê°í ì¸ì¡ê³ì° 32971 var oProductList = new Object(); 32972 var oOlnkProductList = new Object(); 32973 var oTotalAddSaleParam = new Object(); 32974 var iTotalAddSalePrice = 0; 32975 var oTotalAddSaleData = new Object(); 32976 var oProductOptionType = new Object(); 32977 var bSoldOut = false; 32978 32979 var oDefaultOption = { 32980 url: "/exec/front/shop/CalculatorProduct", 32981 type: "GET", 32982 data: oTotalAddSaleParam, 32983 dataType: "json", 32984 timeout: 5000, 32985 compleat: function() { 32986 TotalAddSale.setAsyncMode(true); 32987 } 32988 }; 32989 32990 var updateItemPrice = function() { 32991 32992 //íë§¤ê° íì ê³µê°ì¸ ê²½ì° ì ì¸ 32993 if (sIsDisplayNonmemberPrice === 'T') { 32994 return; 32995 } 32996 32997 if (TotalAddSale.getIsUseSalePrice() === false) { 32998 return; 32999 } 33000 33001 var oData = TotalAddSale.oTotalAddSaleData; 33002 var iLayer = EC$('#product_detail_option_layer').length; 33003 33004 //1+Nííìíì ê°ê²©ì´ ë³´ì´ì§ ìê² ì²ë¦¬ 33005 if (TotalAddSale.getIsBundleProduct() === true) { 33006 EC$('.ec-front-product-item-price[product-no="' + iProductNo + '"]').html(''); 33007 if (iLayer > 0) { 33008 EC$(top.document).find('.ec-front-product-item-price[product-no="' + iProductNo + '"]').html(''); 33009 } 33010 33011 return; 33012 } 33013 33014 //ì¸í¸ìí ì ì¸ 33015 var bIsSetProduct = false; 33016 if (typeof(set_option_data) !== 'undefined') { 33017 bIsSetProduct = true; 33018 } 33019 33020 for (var sKey in oData) { 33021 if (oData.hasOwnProperty(sKey) === false) { 33022 continue; 33023 } 33024 33025 if (typeof(oData[sKey]) !== 'object') { 33026 continue; 33027 } 33028 33029 //íìí목ì¤ì > "íë§¤ê° ë¶ê°ì¸ íì문구"ì´ ì¬ì©í¨ì¼ê²½ì° keyê° objectë¡ ìê¹ 33030 if (sKey === 'product_tax_type_text') { 33031 continue; 33032 } 33033 33034 //본ìíì´ ì¸í¸ìíì¼ ê²½ì°ìë 본ìíì ì ì¸íê³ ì¶ê°êµ¬ì±ìíë§ í ì¸ê°ë¡ ì²ë¦¬ 33035 var oElement = EC$('.ec-front-product-item-price[code="' + sKey + '"]'); 33036 if (bIsSetProduct === true && parseInt(oElement.attr('product-no')) === parseInt(iProductNo)) { 33037 continue; 33038 } 33039 33040 var iProductItemPrice = 0; 33041 33042 if (oData[sKey].display_vat_separately === true) { 33043 //ë¶ê°ì¸ ë³ëíìì¼ê²½ì° 33044 iProductItemPrice = oData[sKey].vat_sub_total_price - oData[sKey].vat_sale_price; 33045 iProductItemPrice = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iProductItemPrice); 33046 } else { 33047 //ë¶ê°ì¸ í¬í¨ì¼ ê²½ì° 33048 iProductItemPrice = oData[sKey].item_quantity_price - oData[sKey].add_sale; 33049 iProductItemPrice = CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iProductItemPrice); 33050 } 33051 33052 oElement.html(iProductItemPrice); 33053 if (iLayer > 0) { 33054 EC$(top.document).find('.ec-front-product-item-price[code="' + sKey + '"]').html(iProductItemPrice); 33055 } 33056 } 33057 }; 33058 33059 /** 33060 * ì ë¦½ê¸ ê°±ì 33061 * @param sOptionBoxId 33062 * @param sWithoutOptionId 33063 */ 33064 var updateMileage = function(sOptionBoxId, sWithoutOptionId) { 33065 33066 33067 // ì ë¦½ê¸ íìì¤ì´ ìëê±°ë, íë§¤ê° íì ê³µê°ì¸ ê²½ì° ì ì¸ 33068 if (sIsMileageDisplay !== 'T' || sIsDisplayNonmemberPrice === 'T') { 33069 return; 33070 } 33071 33072 var oData = TotalAddSale.oTotalAddSaleData; 33073 var iQuantity = 1; 33074 var iLayer = EC$('#product_detail_option_layer').length; 33075 33076 // TotalAddSale.oTotalAddSaleData ìë ê²½ì° ë¦¬í´ 33077 if (typeof(oData) === 'undefined') { 33078 return; 33079 } 33080 33081 // deep copy 33082 oData = JSON.parse(JSON.stringify(oData)); 33083 33084 // ì´ë¯¸ ê°±ì ë íì¬ ì 립ê¸ì ì¶ê° ê°±ì íì§ ìëë¡ ìì 33085 if (typeof(sWithoutOptionId) !== 'undefined' && oData.hasOwnProperty(sWithoutOptionId) === true) { 33086 delete oData[sWithoutOptionId]; 33087 } 33088 33089 // ì ë¦½ê¸ ê°±ì 33090 for (var sKey in oData) { 33091 if (oData.hasOwnProperty(sKey) === true) { 33092 if (typeof(oData[sKey]) === 'object') { 33093 var sMileageVal = CAFE24.SHOP_PRICE_FORMAT.toShopMileagePrice(TotalAddSale.getMileageGenerateCalc(sKey, typeof(oData[sKey].quantity) !== 'undefined' ? oData[sKey].quantity : iQuantity)); 33094 33095 EC$('.mileage_price[code="' + sKey + '"]').html(sMileageVal); 33096 33097 if (iLayer > 0) { 33098 EC$(top.document).find('.mileage_price[code="' + sKey + '"]').html(sMileageVal); 33099 } 33100 } 33101 } 33102 } 33103 }; 33104 33105 /** 33106 * ì¶ê°í ì¸ì¡ 주문apiì¡°í 33107 * @param fCallback ì½ë°±í¨ì 33108 * @return TotalAddSale.iTotalAddSalePrice 33109 */ 33110 var getCalculatorSalePrice = function (fCallback, iPrice, sProductType) { 33111 33112 EC_SHOP_FRONT_DEBUG.log("getCalculatorSalePrice - fn"); 33113 33114 if (EC_FRONT_JS_CONFIG_SHOP.bDirectBuyOrderForm === true) { 33115 fCallback(iPrice); 33116 CAFE24.SHOP_FRONT_NEW_PRODUCT_DIRECT_BUY.setDirectBuyOrderBasket(); 33117 } else { 33118 var oOption = { 33119 success: function(oResponse) { 33120 if (oResponse.Result === false) { 33121 if (oResponse.hasOwnProperty('msg') === true) { 33122 alert(oResponse.msg); 33123 // [ECHOSTING-604271] ì¶ê°êµ¬ì±ìíì´ ì¬ê³ 를 ì´ê³¼íìë 본ìíì ì¬ê³ ê° ë³ê²½ëì§ìëë¡ ì²ë¦¬ 33124 if (oResponse.has_option === 'F' && sProductType !== 'addproduct') { 33125 var iStockNumber = parseInt(oResponse.stock_number, 10); 33126 33127 // 구매ë¨ì(buy_unit) ë³´ì : ìë²ìì ì´ë¯¸ ë³´ì íì§ë§ í´ë¼ì´ì¸í¸ììë ë°©ì´ì ì¼ë¡ ì²ë¦¬ 33128 // ì) buy_unit=3, ìë²ìëµ=5 -> floor(5/3)*3 = 3 (구매ë¨ìì ë§ë ìëì¼ë¡ ë³ê²½) 33129 if (typeof buy_unit !== 'undefined' && parseInt(buy_unit, 10) > 1) { 33130 var iBuyUnit = parseInt(buy_unit, 10); 33131 iStockNumber = Math.floor(iStockNumber / iBuyUnit) * iBuyUnit; 33132 } 33133 33134 EC$(quantity_id).val(iStockNumber); 33135 } 33136 delete oDefaultOption.data['product'][oResponse.sItemCode]; 33137 } 33138 return; 33139 } 33140 33141 //var oResponse = oResponseData.data;console.log(typeof oResponse.flag); 33142 // ê¸ë¡ë²ì´ë©´ì ì¼ì²´í ì¸í¸ìíì 구ì±ìí ê³¼ì¸ë¹ì¨ ëë ê³¼ì¸íì ì´ ë¤ë¥¸ ê²½ì°ìë 구매 ë¶ê° 33143 if (typeof oResponse.flag !== 'undefined' && oResponse.flag === false && oResponse.code === 4221) { 33144 // ìë¿ - [$ìíëª ] ìíì 구매í ì ìë ìíì´ ìëëë¤. 33145 ProductSet.getCompareSetAlert(); 33146 return; 33147 } 33148 33149 TotalAddSale.oTotalAddSaleData = oResponse; 33150 if (TotalAddSale.bSoldOut === false) { 33151 TotalAddSale.iTotalAddSalePrice = oResponse.iTotalAddSalePrice; 33152 TotalAddSale.iTotalOrderPrice = oResponse.iTotalOrderPrice; 33153 TotalAddSale.oProductTaxTypeText = oResponse.product_tax_type_text; 33154 TotalAddSale.sDisplayVatSeparately = oResponse.display_prd_vat_separately; 33155 } 33156 33157 fCallback(iPrice); 33158 }, error: function () { 33159 if (EC$('.EC-price-warning').length > 0) { 33160 EC$('.EC-price-warning').removeClass('displaynone').show(); 33161 } else { 33162 alert(__('í ì¸ê°ê° ì ì©ë ìµì¢ ê²°ì ìì ê¸ì¡ì 주문 ì íì¸í ì ììµëë¤.')); 33163 } 33164 fCallback(iPrice); 33165 } 33166 33167 }; 33168 33169 // íì ì¼ ê²½ì° í ì¸ì¡ ê³ì° ì ì¸ 33170 if (EC$('.soldout_option_box_id').length > 0) { 33171 EC$('.soldout_option_box_id').each(function () { 33172 delete oDefaultOption.data['product'][EC$(this).val()]; 33173 }); 33174 } 33175 33176 if (typeof (iCategoryNo) !== 'undefined' && parseInt(iCategoryNo) > 0) { 33177 oOption.data = EC$.extend(oDefaultOption.data, {cate_no: parseInt(iCategoryNo)}); 33178 } 33179 EC$.ajax(EC$.extend(oDefaultOption, oOption)); 33180 } 33181 }; 33182 /* ë¨ì¼ ì ííì¸ ê²½ì° ì²ë¦¬ê° íìí¨. ëë 구매 í ì¸ ì ì± ë문ì íë¼ë¯¸í° ì ê±° ì²ë¦¬ */ 33183 var setAddSaleParamRemove = function(sOptionId) { 33184 33185 // ë¨ì¼ ì ííì¸ì§ íì¸ 33186 if (oSingleSelection.isItemSelectionTypeS() === true && sOptionId !== '') { 33187 var oProductListData = TotalAddSale.getProductList(); 33188 var sUniqueProductId = ''; 33189 var bRegexp = false;
33190 33191 // ì°ëíì ê²½ì° ìì´í ì½ëê° ì¡°í©íê³¼ ë¤ë¥´ë¤. 33192 if (sOptionId.indexOf('||') > -1 || sOptionId.indexOf('#$%') > -1) { 33193 sUniqueProductId = sOptionId.replace(/[0-9]+/g, ''); 33194 bRegexp = true; 33195 } else if (oProductOptionType[sOptionId] === 'F') { // ë 립íì ê²½ì° ê° ê°ë³ì ì¼ë¡ ê°¯ìê° ì¡´ì¬í¨. 33196 sUniqueProductId = sOptionId; 33197 } else { 33198 sUniqueProductId = sOptionId.substring(0, 8); 33199 } 33200 33201 for (var sKey in oProductListData) { 33202 var sOptionKey = sKey; 33203 if (bRegexp === true) { 33204 sOptionKey = sOptionKey.replace(/[0-9]+/g, ''); 33205 } 33206 if (sOptionKey.indexOf(sUniqueProductId) > -1) { 33207 TotalAddSale.removeProductData(sKey); 33208 } 33209 } 33210 33211 } 33212 }; 33213 var getDirectBuyParam = function() { 33214 var aStockData = new Array(); 33215 if (typeof(option_stock_data) !== 'undefined') { 33216 aStockData = CAFE24.UTIL.parseJSON(option_stock_data); 33217 } 33218 var oProduct = TotalAddSale.getParam(); 33219 var oParam = new Object(); 33220 var oProductParam = new Object(); 33221 oParam['product_no'] = oProduct['product_no']; 33222 33223 if (typeof(oProduct['product']) !== 'undefined' && Object.keys(oProduct['product']).length > 0) { 33224 var i = 0; 33225 for (var sKey in oProduct['product']) { 33226 if (typeof(aStockData[sKey]) !== 'undefined' && aStockData[sKey].is_auto_soldout === 'T') { 33227 continue; 33228 } 33229 oProductParam[i] = {'item_code': sKey, 'quantity': oProduct['product'][sKey]}; 33230 oParam['items'] = oProductParam; 33231 i++; 33232 } 33233 } else { 33234 oParam['items'] = null; 33235 } 33236 return oParam; 33237 }; 33238 33239 return { 33240 updatePrice: function(sOptionBoxId, sWithoutOptionId) { 33241 updateItemPrice(); 33242 updateMileage(sOptionBoxId, sWithoutOptionId); 33243 }, 33244 33245 updateItemPrice: function() { 33246 updateItemPrice(); 33247 }, 33248 33249 removeProductData: function(sOptionKey) 33250 { 33251 delete oProductList[sOptionKey]; 33252 }, 33253 // ì´ ì¶ê°í ì¸ì¡ ë°í 33254 // GE presentment íì± ì iTotalAddSalePrice ë CalculatorProduct ìë² ìëµìì 33255 // convertGlobalePresentment() ë¡ ì´ë¯¸ íìíµí ë³íë ê°ì´ë¯ë¡ ì¬ê¸°ì íì¨ì ì¬ì ì©íì§ ìëë¤. 33256 // (íì¨ ì¬ì ì© ì ì´ì¤ ë³íëì´ ì´ ìíê¸ì¡ì´ ì´ê¸ëë¤ â ECQAUNIT-74832) 33257 getTotalAddSalePrice: function() { 33258 if (typeof CAFE24.SHOP_FRONT_PRODUCT_FUNDING === 'object' && CAFE24.SHOP_FRONT_PRODUCT_FUNDING.isFundingProduct() === true) { 33259 return 0; 33260 } 33261 return TotalAddSale.iTotalAddSalePrice; 33262 }, 33263 // ê³ì°í ì ë³´ ì í 33264 setParam: function(sKey, value) { 33265 oTotalAddSaleParam[sKey] = value; 33266 }, 33267 clearAddSaleParam: function(sKey) 33268 { 33269 delete oTotalAddSaleParam[sKey]; 33270 }, 33271 getParam: function() 33272 { 33273 return oTotalAddSaleParam; 33274 }, 33275 // ê³ì°ë ìí리ì¤í¸ 33276 getProductList: function() { 33277 return oProductList; 33278 }, 33279 // ì´ ì¶ê°í ì¸ê¸ì¡ 리ì 33280 setTotalAddSalePrice: function(iSalePrice) { 33281 TotalAddSale.iTotalAddSalePrice = iSalePrice; 33282 33283 if (EC_FRONT_JS_CONFIG_SHOP.bDirectBuyOrderForm === true) { 33284 CAFE24.SHOP_FRONT_NEW_PRODUCT_DIRECT_BUY.resetDirectBuyOrderBasket(); 33285 } 33286 }, 33287 // ê³ì°í ì ë³´ ìë ì í 33288 setQuantity: function(sItemCode, sQuantity) { 33289 TotalAddSale.setAddSaleParamRemove(sItemCode); 33290 oProductList[sItemCode] = sQuantity; 33291 }, 33292 setOlnkAddProduct: function(sItemCode, iProductNo) { 33293 oOlnkProductList[sItemCode] = iProductNo; 33294 }, 33295 getOlnkAddProductList: function() { 33296 return oOlnkProductList; 33297 }, 33298 // apií¸ì¶ 33299 getCalculatorSalePrice: function(fCallback, iPrice, sProductType) { 33300 getCalculatorSalePrice(fCallback, iPrice, sProductType); 33301 }, 33302 // ì´ ì¶ê°í ì¸ì¡ ë°í
33303 getItemAddSalePrice: function(sItemCode) { 33304 if (typeof(TotalAddSale.oTotalAddSaleData) !== 'undefined') { 33305 return parseFloat(TotalAddSale.oTotalAddSaleData[sItemCode].unit_add_sale , 10); 33306 } else { 33307 return 0; 33308 } 33309 }, 33310 // ì´ ì¶ê°í ì¸ê¸ì¡ 리ì 33311 setSoldOutFlag: function(bSoldOut) { 33312 if (typeof(bSoldOut) === 'undefined' || bSoldOut === null) { 33313 bSoldOut = false; 33314 } 33315 TotalAddSale.bSoldOut = bSoldOut; 33316 }, 33317 // ì ë¦½ê¸ ì´ ê³ì° 33318 getMileageGenerateCalc: function(sItemCode, iQuantity) { 33319 if (TotalAddSale.bSoldOut === false && typeof(TotalAddSale.oTotalAddSaleData) !== 'undefined') { 33320 if (typeof(TotalAddSale.oTotalAddSaleData[sItemCode]) !== 'undefined' && typeof(TotalAddSale.oTotalAddSaleData[sItemCode].mileage_generate_calc) !== 'undefined') { 33321 return parseFloat(TotalAddSale.oTotalAddSaleData[sItemCode].mileage_generate_calc, 10); 33322 } else { 33323 return 0; 33324 } 33325 } else { 33326 return (typeof(mileage_generate_calc) !== 'undefined') ? mileage_generate_calc * iQuantity : 0; 33327 } 33328 }, 33329 // ì ë¦½ê¸ ì í¨ì± ê²ì¦ 33330 checkVaildMileageValue: function(iMileageValue) { 33331 if (typeof (iMileageValue) === 'undefined' && iMileageValue === 0.00 || iMileageValue <= 0) { 33332 return false; 33333 } 33334 33335 return true; 33336 }, 33337 /** 33338 * @deprecated ì¶ê°í ì¸ê° ì¬ê³ì° íì ì¬ë¶ ë¦¬í´ 33339 * @returns true 33340 */ 33341 needRecalculatorSalePrice: function() { 33342 /* 33343 * í´ë¹ ë©ìë ëìì²ë¦¬ì ëë 구매 í ì¸ì ê²½ì° product_sale_price ê°ì´ ì¡´ì¬íì§ ìì¼ë©° 33344 * TotalAddSale.iTotalAddSalePrice ê°ë ëë 구매 í ì¸ì ê²½ì° íìíì§ ìê² ë¨ 33345 */ 33346 return true; 33347 }, 33348 // íë§¤ê° ë¶ê°ì¸ íì문구 ì¤ì 33349 getProductTaxTypeText: function() { 33350 return TotalAddSale.oProductTaxTypeText; 33351 }, 33352 // ì¤ì ì´ ì£¼ë¬¸ê¸ì¡ 33353 getTotalOrderPrice: function() { 33354 return TotalAddSale.iTotalOrderPrice; 33355 }, 33356 // ë¶ê°ì¸ ë³ë íì ì¤ì 33357 getDisplayVatSeparately: function() { 33358 return TotalAddSale.sDisplayVatSeparately; 33359 }, 33360 getItemSalePrice: function(sItemCode) 33361 { 33362 if (typeof(TotalAddSale.oTotalAddSaleData[sItemCode]) === 'undefined') { 33363 return false; 33364 } 33365 return TotalAddSale.oTotalAddSaleData[sItemCode].unit_sale_price; 33366 }, 33367 getSaleItem: function(sItemCode) 33368 { 33369 // ë°ë¡êµ¬ë§¤ ë± sale ë°ì´í° 미ê³ì° ìí(oTotalAddSaleData undefined)ììì ì ê·¼ ë°©ì´ (ECHOSTING-625233) 33370 if (typeof(TotalAddSale.oTotalAddSaleData) === 'undefined' || typeof(TotalAddSale.oTotalAddSaleData[sItemCode]) === 'undefined') { 33371 return false; 33372 } 33373 return TotalAddSale.oTotalAddSaleData[sItemCode]; 33374 }, 33375 // ë¶ê°ì¸ ê³ ì ì¸ì¨ ì´ìíê¸ì¡ 33376 getVatSubTotalPrice: function(sItemCode) { 33377 var sDisplayVatSeparately = TotalAddSale.getDisplayVatSeparately(); 33378 if (typeof(sDisplayVatSeparately) === 'undefined') { 33379 return 0; 33380 } 33381 33382 if (sDisplayVatSeparately !== true) { 33383 return 0; 33384 } 33385 33386 if (typeof(TotalAddSale.oTotalAddSaleData[sItemCode]) === 'undefined') { 33387 return 0; 33388 } 33389 33390 return TotalAddSale.oTotalAddSaleData[sItemCode].vat_sub_total_price; 33391 }, 33392 //í목 ì íì í ì¸ê°ë¥¼ ë³´ì¬ì¤ê²ì¸ì§ ì¬ë¶ 33393 getIsUseSalePrice: function () { 33394 33395 if (typeof (EC_FRONT_JS_CONFIG_SHOP) !== 'object') { 33396 return false; 33397 } 33398 33399 //ëìì¸ìì ìµì ì ì¤ì íì§ ìì¼ë©´ ì²ë¦¬íì§ ìì 33400 if (EC_FRONT_JS_CONFIG_SHOP.bECUseItemSalePrice === false) { 33401 return false;
33402 } 33403 33404 return true; 33405 }, 33406 33407 //1+Nìíì¸ì§ ì¬ë¶ 33408 getIsBundleProduct: function () { 33409 if (typeof CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE !== 'undefined' && CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.oBundleConfig.hasOwnProperty(iProductNo) === true) { 33410 return true; 33411 } 33412 33413 return false; 33414 } , 33415 // 33416 setAddSaleParamRemove: function(sOptionId) 33417 { 33418 return setAddSaleParamRemove(sOptionId); 33419 } , 33420 setProductOptionType: function (sOptionId, sOptType) { 33421 if (oSingleSelection.isItemSelectionTypeS() === true && sOptionId !== '') { 33422 oProductOptionType[sOptionId] = sOptType; 33423 } 33424 33425 }, 33426 getDirectBuyParam: function() 33427 { 33428 return getDirectBuyParam(); 33429 }, 33430 setSubscriptionParam: function() 33431 { 33432 var isSubscription = 'F'; 33433 if (EC$('.EC_regular_delivery:checked').val() === 'T') { 33434 isSubscription = 'T'; 33435 } 33436 TotalAddSale.setParam('is_subscription',isSubscription); 33437 33438 }, 33439 /** 33440 * ìì½í ìíì ì¶ê°ê¸ì¡ì ë°í 33441 * @param string sOptionLinkData ìµì ì½ë 33442 * @returns int ì¶ê°ê¸ì¡ 33443 */ 33444 getReservationLinkAddPrice : function(sOptionLinkData) 33445 { 33446 let iAddPrice = 0; 33447 // item_option_linkë number(ë¨ì¼ ìµì ) ëë "5-3" ííì string(ë¤ì¤ ìµì )ì¼ë¡ ë¤ì´ì¤ê³ 33448 // sOptionLinkDataë íì stringì´ë¯ë¡, ì쪽ì stringì¼ë¡ ì ê·íí´ ë¹êµíë¤. 33449 // (int ìºì¤í ì "5-3"ì´ 5ë¡ íì±ëì´ ë¤ë¥¸ í목과 ì¤ë§¤ì¹ë ì ìì) 33450 var sNormalizedLink = String(sOptionLinkData).trim(); 33451 for (var sItemCode in TotalAddSale.oTotalAddSaleData) { 33452 if (TotalAddSale.oTotalAddSaleData[sItemCode].hasOwnProperty('item_option_link') === false) { 33453 continue; 33454 } 33455 if (String(TotalAddSale.oTotalAddSaleData[sItemCode]['item_option_link']).trim() !== sNormalizedLink) { 33456 continue; 33457 } 33458 iAddPrice = TotalAddSale.oTotalAddSaleData[sItemCode]['opt_price']; 33459 break; 33460 } 33461 return iAddPrice; 33462 } 33463 }; 33464}(); 33465// sms ì¬ì ê³ ì림 모ë°ì¼ ë ì´ì´ íì 33466CAFE24.SHOP_FRONT_PRODUCT_SMS_RESTOCK_LAYER = { 33467 bExistMobileLayerModule: false, 33468 sRequireSmsRestockParam: '', 33469 33470 setCheckSmsRestockLayerPopup: function() 33471 { 33472 //모ë°ì¼ì´ ìëë¼ë©´ ì¬ì©íì§ ìì 33473 if (mobileWeb === false && EC_MOBILE_DEVICE === false) { 33474 return; 33475 } 33476 33477 if (EC$('a[id^="btn_restock"]').length < 1 && typeof EC_FRONT_JS_CONFIG_SHOP.aRestockButton === 'undefined') { 33478 return; 33479 } 33480 33481 //ìì´íë ì ë´ììë ë ì´ì´ë¥¼ ë¤ìëì°ì§ ìì 33482 if (CAPP_SHOP_FRONT_COMMON_UTIL.findTargetFrame() === parent) { 33483 return; 33484 } 33485 33486 EC$.ajax({ 33487 url: '/exec/front/Product/Moduleexist?section=product&file=sms_restock_layer&module=Product_RestockSms', 33488 dataType: 'json', 33489 success: function (data) { 33490 if (data.result === true) { 33491 EC_SHOP_FRONT_PRODUCT_SMS_RESTOCK_LAYER.bExistMobileLayerModule = true; 33492 } 33493 } 33494 }); 33495 }, 33496 createSmsRestockLayerDisplayResult: function(sParam) 33497 { 33498 //ë ì´ì´ ì¬ì©ê°ë¥ìíê° ìëë©´ falseë¡ ë°ë¡ ë¦¬í´ 33499 if (EC_SHOP_FRONT_PRODUCT_SMS_RESTOCK_LAYER.bExistMobileLayerModule === false) { 33500 return false; 33501 } 33502 33503 if (CAFE24.UTIL.trim(sParam).length < 1) { 33504 return false; 33505 } 33506 33507 try { 33508 EC_SHOP_FRONT_PRODUCT_SMS_RESTOCK_LAYER.sRequireSmsRestockParam = sParam; 33509 EC_SHOP_FRONT_PRODUCT_SMS_RESTOCK_LAYER.setProductSmsRestockCreateLayer(); 33510 } catch (e) { 33511 return false; 33512 } 33513 33514 return true; 33515 }, 33516 setProductSmsRestockCreateLayer: function() 33517 { 33518 try { 33519 EC$('#ec-product-sms-restock-layer').remove(); 33520 } catch (e) {} 33521 33522 var sSmsLayerUrl = '/product/sms_restock_layer.html?' + EC_SHOP_FRONT_PRODUCT_SMS_RESTOCK_LAYER.sRequireSmsRestockParam + '&bSmsRestockLayer=T'; 33523 var aSmsRestockLayerHtml = []; 33524 33525 aSmsRestockLayerHtml.push('<div id="ec-product-sms-restock-layer" style="position:fixed; top:0; left:0; right:0; bottom:0; webkit-overflow-scrolling:touch; z-index:999;">'); 33526 aSmsRestockLayerHtml.push('<iframe src="'+sSmsLayerUrl+'" id="smsRestockLayerIframe" frameborder="0" style="width:100%; height:100%;"></iframe>'); 33527 aSmsRestockLayerHtml.push('</div>'); 33528 33529 EC$('body').append(aSmsRestockLayerHtml.join('')); 33530 EC$('body').addClass('eMobilePopup'); 33531 }, 33532 closeSmsRestockLayer: function() 33533 { 33534 if (opener) { 33535 self.close(); 33536 } else { 33537 parent.EC$('body').attr('id', 'layout'); 33538 parent.EC$('body').removeClass('eMobilePopup'); 33539 parent.EC$('#ec-product-sms-restock-layer').remove(); 33540 } 33541 } 33542}; 33543 33544var EC_SHOP_FRONT_PRODUCT_SMS_RESTOCK_LAYER = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_PRODUCT_SMS_RESTOCK_LAYER'); 33545 33546/** 33547 * ëª©ë¡ > ìí ì¢ìì. 33548 */ 33549CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT = { 33550 bIsReady: false, // ì¢ìì í´ë¦ì¤ë¹ìë£ ì¬ë¶. 33551 bIsSetEvent: false, // ì¢ìì ë²í¼ ì´ë²¤í¸ ì§ì ì¬ë¶. 33552 aImgSrc: [], // ì¢ìì(On/Off) ìì´ì½ ê²½ë¡. 33553 aImgAlt: [], // ì¢ìì(On/Off) ìì´ì½ Altíê·¸ 33554 aMyLikePrdNo: [], // ì ì ê° ì´ë¯¸ ì¢ìì ì íí ìíë²í¸ 33555 oMyshopLikeCntNode: null, // layout_shopingInfo ì¢ìì span ë ¸ë 33556 33557 // ìí ì¢ìì ì´ê¸°í 33558 init: function() { 33559 // ìí ì¢ìì ì¬ì©ìí¨ì 33560 if (CAFE24.SHOP_FRONT_NEW_LIKE_COMMON.aConfig.bIsUseLikeProduct !== true) { 33561 return; 33562 } 33563 33564 // ajax ì ì ê° ì´ë¯¸ ì¢ìì ì íí ìíë²í¸ ì»ê¸° + ìì´ì½ì¸í 33565 this.setLoadData(); 33566 }, 33567 33568 // ì ì ê° ì´ë¯¸ ì¢ìì ì íí ìíë²í¸ ì»ê¸° + ìì´ì½ì¸í
33569 setLoadData: function() { 33570 if (EC$('.likePrdIcon').count < 1) { 33571 return; 33572 } 33573 33574 var self = this; 33575 33576 CAFE24.SHOP_FRONT_NEW_LIKE_COMMON.getMyLikeProductNoInList(function(aData) { 33577 self.aImgSrc = aData.imgSrc; 33578 self.aImgAlt = aData.imgAlt; 33579 self.aMyLikePrdNo = aData.rows; 33580 33581 // ìì´ì½(on) ì¸í 33582 self.setMyLikeProductIconOn(); 33583 33584 // ì¢ìì í´ë¦ ì´ë²¤í¸í¸ë¤ë¬ ì§ì 33585 if (self.bIsSetEvent === false) { 33586 self.setEventHandler(); 33587 self.bIsSetEvent = true; 33588 } 33589 }, function() { 33590 self.bIsReady = true; 33591 }); 33592 }, 33593 33594 // íì´ì§ ë¡ëì ì ì ê° ì¢ììí ìí On.ìì´ì½ì¼ë¡ ë³ê²½ 33595 setMyLikeProductIconOn: function() { 33596 var aData = this.aMyLikePrdNo; 33597 33598 for (var i=0; i < aData.length; i++) { 33599 // selected ì¤íì¼ ì ì© 33600 EC$(".likePrd_" + aData[i].product_no).each(function() { 33601 EC$(this).addClass('selected'); 33602 }); 33603 33604 // ìì´ì½ ì´ë¯¸ì§ê²½ë¡ ë³ê²½ 33605 EC$(".likePrdIcon[product_no='" + aData[i].product_no + "']").each(function() { 33606 EC$(this).attr({'src': CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.aImgSrc.on, 'icon_status': 'on', 'alt': CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.aImgAlt.on}); 33607 }); 33608 } 33609 }, 33610 33611 // ì´ë²¤í¸í¸ë¤ë¬ ì§ì 33612 setEventHandler: function() { 33613 // ì¢ìì ìì´ì½ í´ë¦ ì´ë²¤í¸ 33614 try { 33615 EC$(document).on('click', '.likePrd', CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.clickLikeIcon); 33616 var sContext = ''; 33617 if (typeof(PREVIEWPRDOUCT) === 'undefined') { 33618 sContext = window.parent.document; 33619 } 33620 } catch (e) {} 33621 33622 33623 // ë§ì´ì¼í > ìíì¢ìì íì´ì§ 33624 if (EC$(".xans-myshop-likeproductlist", sContext).length > 0) { 33625 // íì íë보기창 ë«ê¸° ì´ë²¤í¸ 33626 if (EC$(".xans-product-zoompackage").length > 0) { 33627 EC$('.xans-product-zoompackage div.close').on('click', CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.closeZoomReload); 33628 } 33629 } 33630 }, 33631 33632 // ì¢ìì ìì´ì½ í´ë¦ ì´ë²¤í¸í¸ë¤ë¬ 33633 clickLikeIcon: function() { 33634 if (CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.bIsReady === false) { 33635 return; 33636 } 33637 33638 // í´ë¦í ìíì ì¢ììì, ìì´ì½ ì ë³´ì»ê¸° 33639 var iPrdNo = EC$('.likePrdIcon', this).attr('product_no'); 33640 var iCateNo = EC$('.likePrdIcon', this).attr('category_no'); 33641 var sIconStatus= EC$('.likePrdIcon', this).attr('icon_status'); 33642 // ì¹´ì´í¸ string > int íì¼ë¡ ë³í (ECHOSTING-260504) 33643 var iLikeCount = CAFE24.SHOP_FRONT_NEW_LIKE_COMMON.getNumericRemoveCommas(EC$('.likePrdCount', this).text()); 33644 33645 // ìì´ì½ê²½ë¡ ë° ì¢ììì ì¦ê°ì²ë¦¬ 33646 var sNewImgSrc = sNewIconStatus = ""; 33647 var iNewLikeCount = 0; 33648 var oLikeWrapNode = EC$(".likePrd_" + iPrdNo); 33649 33650 if (sIconStatus === 'on') { 33651 sNewIconStatus = 'off'; 33652 sNewImgSrc = CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.aImgSrc.off; 33653 sNewImgAlt = CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.aImgAlt.off; 33654 if (iLikeCount > 0) { 33655 iNewLikeCount = --iLikeCount; 33656 } 33657 33658 oLikeWrapNode.each(function() { 33659 EC$(this).removeClass('selected'); 33660 }); 33661 } else { 33662 sNewIconStatus = 'on'; 33663 sNewImgSrc = CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.aImgSrc.on; 33664 sNewImgAlt = CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.aImgAlt.on; 33665 iNewLikeCount = ++iLikeCount; 33666 33667 // ëì¼ìí selected ì¤íì¼ì ì© 33668 oLikeWrapNode.each(function() { 33669 EC$(this).addClass('selected'); 33670 }); 33671 } 33672 // ì¢ìì ì¹´ì´í¸ number_format (ECHOSTING-260504) 33673 iNewLikeCount = CAFE24.SHOP_FRONT_NEW_LIKE_COMMON.getNumberFormat(iNewLikeCount); 33674 // ìë¨.layout_shopingInfo ì¢ììì ì ë°ì´í¸ 33675 CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.updateShopInfoCount(sNewIconStatus); 33676 33677 // ì¢ìì ìì´ì½ì´ë¯¸ì§ + ì¢ììì ì ë°ì´í¸ 33678 CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.updateLikeIconCount(iPrdNo, sNewImgSrc, sNewIconStatus, iNewLikeCount, sNewImgAlt); 33679 33680 // ajax í¸ì¶ ì¢ììì(ìí) + ë§ì´ì¼í ì¢ìì ì ì¥ 33681 CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.submitMyLikeProduct(iPrdNo, iCateNo, sNewIconStatus); 33682 33683 // íë보기 íì ìì ì¢ìì í´ë¦ì, ë¶ëª¨íë ì ì¢ìì ì ë°ì´í¸ 33684 if (EC$(".xans-product-zoompackage").length > 0) { 33685 window.parent.CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.updateShopInfoCount(sNewIconStatus); 33686 window.parent.CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.updateLikeIconCount(iPrdNo, sNewImgSrc, sNewIconStatus, iNewLikeCount); 33687 } 33688 }, 33689 33690 // ë§ì´ì¼í > ìíì¢ìì ëª©ë¡ > íì íë보기창 ë«ê¸° ì´ë²¤í¸í¸ë¤ë¬ 33691 closeZoomReload: function() { 33692 var sIconsStatus = EC$('.xans-product-zoompackage .likePrdIcon').attr('icon_status'); 33693 33694 // íì ìì ì¢ìì를 ì·¨ìíì¼ë©´ ì¢ìì ëª©ë¡ ìë¡ê³ 침 33695 if (sIconsStatus === 'off') { 33696 window.parent.location.reload(); 33697 } 33698 }, 33699 33700 // ì¢ìì ìì´ì½ì´ë¯¸ì§ + ì¢ììì ì ë°ì´í¸ 33701 updateLikeIconCount: function(iPrdNo, sImgSrc, sIconStatus, iLikeCount, sNewImgAlt) { 33702 // í´ë¦í ëì¼ìí ìì´ì½ ë³ê²½ 33703 EC$(".likePrdIcon[product_no='" + iPrdNo + "']").each(function() { 33704 EC$(this).attr({'src': sImgSrc, 'icon_status': sIconStatus, 'alt': sNewImgAlt}); 33705 }); 33706 33707 // í´ë¦í ëì¼ìí ì¢ììì ë³ê²½ 33708 EC$('.likePrdCount_' + iPrdNo).each(function() { 33709 EC$(this).text(iLikeCount); 33710 }); 33711 }, 33712 33713 // ìë¨.layout_shopingInfo ì¢ììì ì ë°ì´í¸ 33714 updateShopInfoCount: function(sIconStatus) { 33715 if (CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.oMyshopLikeCntNode === null) { 33716 CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.oMyshopLikeCntNode = EC$('#xans_myshop_like_prd_cnt'); 33717 } 33718 33719 var iMyshopLikeCnt; 33720 if (CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.oMyshopLikeCntNode !== null) {
33721 iMyshopLikeCnt = parseInt(EC$(CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.oMyshopLikeCntNode).text()); 33722 iMyshopLikeCnt = (sIconStatus === 'on') ? iMyshopLikeCnt + 1 : iMyshopLikeCnt - 1; 33723 iMyshopLikeCnt = (iMyshopLikeCnt < 0 || isNaN(iMyshopLikeCnt)) ? 0 : iMyshopLikeCnt; 33724 CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.oMyshopLikeCntNode.text(iMyshopLikeCnt + 'ê°'); 33725 } 33726 33727 if (EC$('#xans_myshop_main_like_prd_cnt').length > 0 && iMyshopLikeCnt >= 0) { 33728 EC$('#xans_myshop_main_like_prd_cnt').text(iMyshopLikeCnt); 33729 } 33730 }, 33731 33732 // ìí ì¢ììì + ë§ì´ì¼í ì¢ìì ì ì¥ 33733 submitMyLikeProduct: function(iPrdNo, iCateNo, sIconStatus) { 33734 if (sIconStatus === 'on') { 33735 this.aMyLikePrdNo.push(iPrdNo); 33736 } else { 33737 this.aMyLikePrdNo.pop(iPrdNo); 33738 } 33739 33740 EC$.ajax({ 33741 url: '/exec/front/shop/LikeCommon', 33742 type: 'get', 33743 data: { 33744 'mode': 'saveMyLikeProduct', 33745 'iPrdNo': iPrdNo, 33746 'iCateNo': iCateNo, 33747 'sIconStatus': sIconStatus 33748 }, 33749 dataType: 'json', 33750 success: function(oReturn) { 33751 if (oReturn.bResult === true) { 33752 CAFE24.SHOP_FRONT_NEW_LIKE_COMMON.purgeMyLikeProductNoInList(); 33753 } 33754 }, 33755 complete: function() { 33756 CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.bIsReady = true; 33757 } 33758 }); 33759 } 33760}; 33761 33762var EC_SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT'); 33763 33764EC$(function() { 33765 CAFE24.SHOP_FRONT_NEW_LIKE_COMMON_PRODUCT.init(); // ìí ì¢ìì. 33766}); 33767 33768CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE = { 33769 oBundleConfig: {}, 33770 33771 iProductQuantity: 0, 33772 33773 init: function(oInit) 33774 { 33775 if (typeof(oInit) === 'object') { 33776 this.oBundleConfig = oInit; 33777 } else { 33778 if (sBundlePromotion === '' || typeof(sBundlePromotion) === 'undefined') { 33779 return; 33780 } 33781 this.oBundleConfig = CAFE24.UTIL.parseJSON(sBundlePromotion); 33782 } 33783 // ê°ì ë¡ íí¹ 33784 buy_unit = 1; 33785 product_min = 1; 33786 product_max = 0; 33787 33788 EC$.data(document,'BundlePromotion', true); 33789 }, 33790 getQuantityStep: function(iProductNum) 33791 { 33792 return this.oBundleConfig[iProductNum].bundle_quantity + 1; 33793 }, 33794 /** 33795 * ì¤ì UIì ìëëì 1+N ì´ë²¤í¸ë¡ ì¸í´ íí¹ë ìí ìëì ë¦¬í´ 33796 */ 33797 getQuantity: function(iQuantity, iProductNum) 33798 { 33799 var iReturn = iQuantity; 33800 if (typeof(this.oBundleConfig[iProductNum]) === 'undefined') { 33801 return iReturn; 33802 } 33803 33804 iReturn = Math.ceil(iQuantity / this.getQuantityStep(iProductNum)); 33805 33806 return iReturn; 33807 }, 33808 /** 33809 * ì íí 구매 ìëì´ ë§ëì§ ê²ì¦ 33810 */ 33811 isValidQuantity: function(aQuantity, iProductNum) 33812 { 33813 var bReturn = true; 33814 if (typeof(this.oBundleConfig[iProductNum]) === 'undefined') { 33815 return bReturn; 33816 } 33817 33818 if (this.isValidQuantityCheck(aQuantity, iProductNum) === false) { 33819 alert(this.getAlertMessage([iProductNum])); 33820 return false; 33821 } 33822 return bReturn; 33823 }, 33824 isValidQuantityCheck: function(aQuantity, iProductNum) 33825 { 33826 var iQuantityStep = this.getQuantityStep(iProductNum); 33827 33828 if (this.oBundleConfig[iProductNum].bundle_apply_type === 'P') { 33829 CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.iProductQuantity = 0; 33830 EC$.map(aQuantity, function(pv) { 33831 CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.iProductQuantity += pv; 33832 }); 33833 return (CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.iProductQuantity % iQuantityStep) === 0; 33834 } 33835 33836 if (this.oBundleConfig[iProductNum].bundle_apply_type === 'I') { 33837 for (var i in aQuantity) { 33838 if (aQuantity.hasOwnProperty(i) === false) { 33839 continue; 33840 } 33841 if (aQuantity[i] % iQuantityStep !== 0) { 33842 return false;
33843 } 33844 } 33845 } 33846 return true; 33847 }, 33848 getAlertMessage: function(iProductNum) 33849 { 33850 var sSubject = this.oBundleConfig[iProductNum].bundle_apply_type === 'P' ? 'ìµì ì ìê´ìì´' : 'ëì¼í ìµì ì¼ë¡'; 33851 var sReturn = '1+%s ì´ë²¤í¸ìíì ëë¤.\n'+sSubject+' ìëì %sê° ë¨ìë¡ êµ¬ë§¤í´ì£¼ì¸ì.'; 33852 return sprintf(__(sReturn), this.oBundleConfig[iProductNum].bundle_quantity, this.getQuantityStep(iProductNum)); 33853 } 33854}; 33855 33856var EC_SHOP_FRONT_PRODUCT_DEATAIL_BUNDLE = CAFE24.getDeprecatedNamespace('SHOP_FRONT_PRODUCT_DETAIL_BUNDLE'); 33857 33858var isMobile = false; 33859var sInputMileBackground = ''; 33860EC$(function() { 33861 // 모ë°ì¼ì ì ì¬ë¶ 33862 // mobileWeb ê°ì´ ìì¼ë©´ 참조íê³ ìì¼ë©´ m. ëë©ì¸ ì²´í¬ 33863 if (mobileWeb == undefined) { 33864 if (window.location.hostname.substr(0, 2) == 'm.' || 33865 window.location.hostname.substr(0, 12) == 'mobile--shop' || 33866 window.location.hostname.substr(0, 11) == 'skin-mobile' || 33867 typeof EC_ROUTE !== 'undefined' && EC_ROUTE.getIsMobile() || 33868 typeof EC_MOBILE !== 'undefined' && EC_MOBILE 33869 ) { 33870 isMobile = true; 33871 } 33872 } else { 33873 isMobile = mobileWeb; 33874 } 33875 33876 // 주문ì ìì± íì´ì§ 33877 try { 33878 EC$('#np_use0').prop('checked', true); 33879 33880 EC$('#np_use0').click(function() { 33881 if (EC$(this).prop('checked') == false) { 33882 initNaverMileage(); 33883 if (isMobile == true && typeof(nbp) === 'object') { 33884 nbp.mileage.inactive(); 33885 } 33886 } else { 33887 if (isMobile == true && typeof(nbp) === 'object') { 33888 nbp.mileage.active(); 33889 } 33890 } 33891 if (isMobile == false) { 33892 setNaverPoint(); 33893 } 33894 }); 33895 } catch (e) {} 33896 33897 // ë¤ì´ë²ë§ì¼ë¦¬ì§ ì 립ê¸ê³¼ ëìì¬ì© ë¶ê°ì ë°ë¥¸ ì²ë¦¬ 33898 // ëìì¬ì© ë¶ê°ì¸ ê²½ì° ëìì¸ ìì ì ìíìë 기존꺼 ë ¸ì¶ 33899 try { 33900 if (isNMCanUseWithMileage() == false && isApplyDesignNMCanUseWithMileage() == false) { 33901 EC$('div.boardView').find('#input_mile').parents('div').first().removeClass('displaynone'); 33902 EC$('div.boardView').find('#np_use0').parents('div').first().removeClass('displaynone'); 33903 } 33904 } catch (e) {} 33905 33906 // ì 립ê¸ëìì¬ì©ë¶ê° ëìì¸ì ì©ì ë°ë¥¸ ì²ë¦¬ 33907 try { 33908 if (isApplyDesignNMCanUseWithMileage()) { 33909 EC$('#either_mileage_navermileage_select0').prop('checked', true); 33910 if (isMobile == true) { 33911 EC$('input[name^="mileage_use_select"]').click(function() { 33912 var oInputMile = getInputMileObject(); 33913 if (EC$(this).val() == 'mileage') { 33914 initNaverMileage(); 33915 oInputMile.css('background', sInputMileBackground); 33916 oInputMile.prop('readonly', false); 33917 if (isApplyDesignNMCanUseWithMileage() == true) { 33918 nbp.mileage.inactive(); 33919 } 33920 } else { 33921 sInputMileBackground = oInputMile.css('background'); 33922 oInputMile.val(0); 33923 oInputMile.prop('readonly', true); 33924 oInputMile.css('background', '#CCCCCC'); 33925 if (isApplyDesignNMCanUseWithMileage() == true) { 33926 nbp.mileage.active(); 33927 } 33928 33929 if (bInflowParam != false) { 33930 } else { 33931 EC$('#_either_mileage_acc').hide(); 33932 } 33933 } 33934 set_total_price(); 33935 }); 33936 } else { 33937 EC$('#navermileage_use_container').css({"display": "none"}); 33938 EC$('input[id^="either_mileage_navermileage_select1"]').css("margin-left", "10px"); 33939 EC$('label[for^="either_mileage_navermileage_select"]').css("padding-left", "3px"); 33940 33941 EC$('input[name^="mileage_use_select"]').click(function() { 33942 var oMileageUseContainer = EC$('#mileage_use_container'); 33943 var oNavermileageUseContainer = EC$('#navermileage_use_container'); 33944 var oNavermileageGuideContainer = EC$('#navermileage_guide_cotainer'); 33945 var oInputMile = getInputMileObject(); 33946 oMileageUseContainer.css('display', 'none'); 33947 oNavermileageUseContainer.css('display', 'none'); 33948 oNavermileageGuideContainer.css('display', 'none'); 33949 33950 if (EC$(this).val() == 'mileage') { 33951 oMileageUseContainer.css('display', ''); 33952 initNaverMileage(); 33953 } else { 33954 oNavermileageUseContainer.css('display', ''); 33955 oNavermileageGuideContainer.css('display', ''); 33956 oInputMile.val(0); 33957 33958 //ë¤ì´ë² ON ìíë ê¼ ì´ë ê² ë¹êµíë¼ê
33958³ í´ì ì´ë ê² í¨ 33959 if (bInflowParam != false) { 33960 } else { 33961 EC$('#either_divNvPointBtnAdd').hide(); 33962 EC$('#either_divNvDefaultGuide').html('ë¤ì´ë² íµí´ 방문 ì ì 립/ì¬ì© ê°ë¥'); 33963 } 33964 33965 } 33966 33967 if (bInflowParam != false) { 33968 setNaverPoint(); 33969 } 33970 set_total_price(); 33971 }); 33972 33973 var oNavermileageGuideContainer = EC$('#navermileage_guide_cotainer'); 33974 oNavermileageGuideContainer.css('display', 'none'); 33975 } 33976 } 33977 } catch (e) {} 33978 33979 33980 // PC ì¼í몰 > 주문ì ìì±íì´ì§ 33981 if (isMobile == false) { 33982 try { 33983 // ë¤ì´ë²ë§ì¼ë¦¬ì§ ê°ì´ë íì¡°ì (ëìì¬ì© ë¶ê°ë¥ UI) 33984 EC$('.navermileage_guide').css({'text-align': 'center', 'padding-top': '5px', 'padding-bottom': '5px', 'background-color': '#f7f7ff'}); 33985 33986 // ì ë¦½ë¥ ìì ë³ê²½ & boldì²ë¦¬ 33987 EC$('#txt_np_save').css({'color': '#1ec228', 'font-weight': 'bold'}); 33988 EC$('#divNvPointOpr').css({'color': '#1ec228', 'font-weight': 'bold'}); 33989 } catch (e) {} 33990 } 33991 33992 // ë¤ì´ë² ì¶ê° ì ë¦½ë¥ ë¤ì´ë²ê³µíµì¤í¬ë¦½í¸ë¡ ë¶í° ê°ì ¸ì¤ê¸° 33993 try { 33994 var oNaverMileage = { 33995 'def': 0, 33996 'base': 0, 33997 'add': 0 33998 }; 33999 oNaverMileage.def = EC$('#np_save_rate_default').val(); 34000 34001 var oNvSaveRateBase = EC$('#naver_mileage_save_rate_base'); 34002 var oNvMileageHelp = EC$('#imgNaverMileageHelp'); 34003 if (EC$('.naver_mileage_compare').length > 0 || mobileWeb === true) { // ìíë¹êµ, 모ë°ì¼ 34004 oNvSaveRateBase = EC$('.naver_mileage_save_rate_base'); 34005 oNvMileageHelp = EC$('.img_naver_mileage_help'); 34006 } 34007 34008 // get save rate of naverMileage 34009 if (typeof(wcs) === 'object') { 34010 var bInflowParam = wcs.getMileageInfo(); 34011 if (bInflowParam != false) { 34012 oNaverMileage.base = wcs.getBaseAccumRate(); 34013 oNaverMileage.add = wcs.getAddAccumRate(); 34014 34015 if (isMobile == false) { 34016 if (EC$('.xans-order-form').length > 0) {//주문ì 34017 var oNaverStateImg = '<img src="//img.echosting.cafe24.com/design/skin/default/product/txt_naver_on1.png" style="margin:3px">'; 34018 EC$('#either_mileage_navermileage_select0').parents('tbody').find('th > label').html('ì 립ê¸&<br>ë¤ì´ë²ë§ì¼ë¦¬ì§<br>' + oNaverStateImg + '(í1)'); 34019 34020 EC$('#naverPointStatus').html(oNaverStateImg); 34021 EC$('#naverPointStatus img').css({'margin': '-3px 3px 0'}); 34022 34023 EC$('#either_imgNaverMileageHelp').attr('//img.cafe24.com/images/ec_admin/btn/icon_q_green.gif'); 34024 34025 if (EC$('#np_use0').parent().find("img").attr("src") == null || EC$('#np_use0').parent().find("img").attr("src") == undefined) { 34026 EC$('#np_use0').parent().append(oNaverStateImg); 34027 } 34028 EC$('#imgNaverMileageHelp').attr('src', '//img.cafe24.com/images/ec_admin/btn/icon_q_green.gif'); 34029 } else { 34030 EC$('#imgNaverMileageHelp').css({'margin-top': '-2px'}); 34031 } 34032 } 34033 34034 } else { 34035 oNaverMileage.base = oNaverMileage.def; 34036 34037 if (isMobile == false) { 34038 if (EC$('.xans-order-form').length > 0) {//주문ì 34039 var oNaverStateImg = '<img src="//img.echosting.cafe24.com/design/skin/default/product/txt_naver_off1.png" style="margin:3px">'; 34040 34041 //í1 ì¼ ê²½ì° (ì´ì°¨í¼ display none ì¼ ëë ì ë³´ì) 34042 EC$('#either_mileage_navermileage_select0').parents('tbody').find('th > label').html('ì 립ê¸&<br>ë¤ì´ë²ë§ì¼ë¦¬ì§<br>' + oNaverStateImg + '(í1)'); 34043 34044 EC$('#naverPointStatus').html(oNaverStateImg); 34045 EC$('#naverPointStatus img').css({'margin': '-3px 3px 0'}); 34046 34047 EC$('#np_use0').hide(); 34048 EC$('#divNvPointBtnAdd').hide(); 34049 EC$('#divNvDefaultGuide').html('ë¤ì´ë² íµí´ 방문 ì ì 립/ì¬ì© ê°ë¥'); 34050 34051 34052 EC$('label[for="np_use0"]').parent().html('ë¤ì´ë² ë§ì¼ë¦¬ì§' + oNaverStateImg); 34053 EC$('#imgNaverMileageHelp').attr('src', '//img.cafe24.com/images/ec_admin/btn/icon_q_green.gif'); 34054 EC$('.naverInfo').hide(); 34055 }
34055 else {//ìíìì¸ 34056 var sNaverStateImg = '//img.echosting.cafe24.com/design/skin/default/product/txt_naver_off2.png'; 34057 var sOnClick = "NaverMileage.openMileageIntroPopup('http://static.mileage.naver.net/static/20130708/ext/intro.html');"; 34058 oNvSaveRateBase.parent().html('ë¤ì´ë² ë§ì¼ë¦¬ì§ <a href="#none" onclick="' + sOnClick + '"><img src="' + sNaverStateImg + '" style="margin-top:-2px;"></a><br>(ë¤ì´ë² íµí´ 방문 ì ì 립/ì¬ì© ê°ë¥)'); 34059 34060 } 34061 } 34062 34063 } 34064 } else { 34065 oNaverMileage.base = EC$('#np_save_rate').val(); 34066 oNaverMileage.add = EC$('#np_save_rate_add').val(); 34067 } 34068 34069 if (oNaverMileage.base == 0 || oNaverMileage.base == '') { 34070 oNaverMileage.base = oNaverMileage.def; 34071 } 34072 34073 // casting data type 34074 oNaverMileage.def = castDataType(oNaverMileage.def); 34075 oNaverMileage.base = castDataType(oNaverMileage.base); 34076 oNaverMileage.add = castDataType(oNaverMileage.add); 34077 34078 // true - ìíìì¸/ìíë¹êµ íì´ì§, false - 주문ì ìì± íì´ì§ 34079 if (document.getElementById('naver_mileage_save_rate_base') != undefined && document.getElementById('naver_mileage_save_rate_base') != null) { 34080 //ECHOSTING-73678 34081 oNvMileageHelp.attr('src','//img.echosting.cafe24.com/design/skin/default/product/txt_naver_on2.png'); 34082 34083 if (oNaverMileage.base > 0) { 34084 var iTotalNaverMileageRate = oNaverMileage.base + oNaverMileage.add; 34085 oNvSaveRateBase.html(iTotalNaverMileageRate + '%'); 34086 } else { 34087 oNvSaveRateBase.html(oNaverMileage.def + '%'); 34088 } 34089 } else { 34090 var iSaveRateSum = oNaverMileage.base; 34091 if (oNaverMileage.add > 0) { 34092 iSaveRateSum += oNaverMileage.add; 34093 } 34094 EC$('#divNvDefaultGuide .naver_mileage_save_rate_sum').html(castDataType(iSaveRateSum)); 34095 EC$('#either_divNvDefaultGuide .naver_mileage_save_rate_sum').html(castDataType(iSaveRateSum)); 34096 } 34097 // 모ë°ì¼ > 주문ì ìì± íì´ì§ì¸ ê²½ì°ìë§ ì¤í(ë§ì¼ë¦¬ì§ 모ë°ì¼ë²ì ì uië ¸ì¶ë¶ë¶ì´ ë¤ë¥´ë¤.) 34098 if (isMobile) { 34099 initNavermileageWithWcs(); 34100 34101 if (EC$('#frm_order_act').length > 0) {//주문ì 34102 var bUseSelectMileage = isApplyDesignNMCanUseWithMileage(); 34103 } 34104 34105 if (bInflowParam != false) { 34106 if (EC$('.xans-product-detail').length > 0 || EC$('.xans-product-detaildesign').length > 0) { //ìíìì¸ 34107 var sOnImg = '<img src="//img.echosting.cafe24.com/design/skin/mobile/txt_naver_on1.png" style="width:28px;margin-bottom:-1px;">'; 34108 EC$('.naver_mileage_save_rate_add').html('ì 립 ' + sOnImg); 34109 EC$('.naverMileageSaveText').hide(); 34110 } else {//주문ì 34111 EC$('#naverMileageTitle').append(' <img src="//img.echosting.cafe24.com/design/skin/default/product/txt_naver_on1.png" style="margin-bottom:-1px">'); 34112 34113 if (bUseSelectMileage) {//í1 34114 EC$('#navermileage_use_container').find('label > span').append(' <img src="//img.echosting.cafe24.com/design/skin/default/product/txt_naver_on1.png" style="margin-bottom:-1px">'); 34115 } 34116 } 34117 } else { 34118 if (EC$('#frm_order_act').length > 0) {//주문ì 34119 EC$('#np_use0').hide(); 34120 EC$('#naverMileageTitle').append(' <img src="//img.echosting.cafe24.com/design/skin/default/product/txt_naver_off1.png">'); 34121 EC$('#_mileage_acc').html('ë¤ì´ë² íµí´ 방문 ì ì 립/ì¬ì© ê°ë¥ '); 34122 34123 if (bUseSelectMileage) {//í1 34124 EC$('#navermileage_use_container').find('label > span').append(' <img src="//img.echosting.cafe24.com/design/skin/default/product/txt_naver_off1.png" style="margin-bottom:-1px">'); 34125 EC$('#_mile_acc_rate').parent().hide(); 34126 EC$('#navermileage_use_container').find('.either_navermileage_use_container').append('ë¤ì´ë² íµí´ 방문 ì ì 립/ì¬ì© ê°ë¥'); 34127 } 34128 34129 }
34129 else {//ìíìì¸ 34130 EC$('.naver_mileage_save_rate_base').hide(); 34131 var sOffImg = '<img src="//img.echosting.cafe24.com/design/skin/mobile/txt_naver_off1.png" style="width:28px;margin-bottom:-1px;">'; 34132 EC$('.naver_mileage_save_rate_add').html(sOffImg+ ' (ë¤ì´ë² íµí´ 방문 ì ì 립/ì¬ì© ê°ë¥) '); 34133 EC$('.naverMileageSaveText').hide(); 34134 } 34135 } 34136 } 34137 34138 } catch (e) {} 34139}); 34140 34141var naver_reqTxId; 34142var bNvOn = false; 34143var NaverMileage = { 34144 onNvPointLayer: function(dMode) 34145 { 34146 bNvOn = true; 34147 var obj = document.getElementById('divNvPointInfo'); 34148 EC$('#divNvPointInfo').show(); 34149 34150 var leftMargine = obj.offsetWidth; 34151 if (dMode == 1) { 34152 var XY = EC$('#imgNaverMileageHelp').position(); 34153 34154 obj.style.top = XY.top+14+'px'; 34155 obj.style.left = XY.left-150+'px'; 34156 34157 if (obj.attachEvent) { 34158 obj.attachEvent('onmouseover', NaverMileage.setNvOn); 34159 } else { 34160 obj.addEventListener('mouseover', NaverMileage.setNvOn, false); 34161 } 34162 } 34163 return true; 34164 }, 34165 setNvOn: function() { 34166 bNvOn = true; 34167 }, 34168 offNvPointLayerTic: function(bIntval) 34169 { 34170 bNvOn = false; 34171 if (bIntval == true) { 34172 setTimeout("NaverMileage.offNvPointLayer()", 200); 34173 } else { 34174 NaverMileage.offNvPointLayer(); 34175 } 34176 }, 34177 offNvPointLayer: function() 34178 { 34179 if (bNvOn == false) EC$('#divNvPointInfo').hide(); 34180 }, 34181 34182 openMileageIntroPopup: function(sUrl) 34183 { 34184 var iWidth = 404; 34185 var iHeight = 412; 34186 var iLeft = (screen.width - iWidth) / 2; 34187 var iTop = (screen.height - iHeight) / 2; 34188 var sOpt = 'width='+iWidth+', height='+iHeight+', left='+iLeft+', top='+iTop+', status=no, resizable=no'; 34189 34190 window.open(sUrl, 'mileageIntroPopup', sOpt); 34191 } 34192}; 34193 34194 34195function showNaverCashShowAccumPopup() 34196{ 34197 if (isNMCanUseWithMileage() == false && isApplyDesignNMCanUseWithMileage() == false) { 34198 var oInputMile = getInputMileObject(); 34199 if (parseInt(oInputMile.val()) > 0) { 34200 alert(__('ë¤ì´ë²ë§ì¼ë¦¬ì§ë ì 립ê¸ê³¼ ëìì¬ì©í ì ììµëë¤.')); 34201 return false; 34202 } 34203 } 34204 34205 if (document.getElementById('np_use0').checked == false) { 34206 alert(__('ë¤ì´ë² ë§ì¼ë¦¬ì§ ì¬ì©/ì 립 ììë ì¢ì¸¡ì ì²´í¬ë°ì¤ë¥¼ ì ííì ì¼ í©ëë¤.')); 34207 return false; 34208 } 34209 var sUrl = "https://service.mileage.naver.com/service/accumulation/"+EC$('#np_api_id').val()+"?doneUrl="+EC$('#np_done_url').val(); 34210 34211 var sUrl = "https://service.mileage.naver.com/service/v2/accumulation/"+EC$('#np_api_id').val()+"?doneUrl="+EC$('#np_done_url').val(); 34212 if (typeof(sIsNaverMileageSandbox) !== 'undefined') { 34213 if (sIsNaverMileageSandbox == 'T') { 34214 var sUrl = "https://sandbox-service.mileage.naver.com/service/v2/accumulation/"+EC$('#np_api_id').val()+"?doneUrl="+EC$('#np_done_url').val(); 34215 } 34216 } 34217 34218 if (naver_reqTxId) { 34219 sUrl = sUrl + "&reqTxId=" + naver_reqTxId; 34220 } 34221 34222 var sNcisy = new String(); 34223 if (typeof(wcs) === 'object') { 34224 var inflowParam = wcs.getMileageInfo(); 34225 if (inflowParam != false) { 34226 sNcisy = inflowParam; 34227 } 34228 } else { 34229 sNcisy = EC$('#np_ncisy').val(); 34230 } 34231 34232 sUrl = sUrl + "&Ncisy=" + sNcisy; 34233 sUrl = sUrl + "&sig=" + EC$('#np_req_sig').val(); 34234 sUrl = sUrl + "×tamp=" + EC$('#np_timestamp').val(); 34235 34236 try { 34237 if (typeof(EC$('#r_total_price').val()) !== 'undefined') { 34238 var iMaxUseAmount = CAFE24.SHOP_PRICE.toShopPrice(EC$('#r_total_price').val()); 34239 sUrl = sUrl + "&maxUseAmount=" + iMaxUseAmount; 34240 } 34241 } catch (e) {} 34242 34243 var sWinName = document.getElementById('np_window_name').value; 34244 window.open(sUrl , sWinName, "width=496,height=434,status=no,resizable=no"); 34245} 34246 34247function enableNaverCashPanel(baseAccumRate, addAccumRate, useAmount, balanceAmount, reqTxId, sig, resultCode, mileageUseAmount, cashUseAmount, totalUseAmount) 34248{ 34249 naver_reqTxId = reqTxId; 34250 34251 if (CAFE24.SHOP_PRICE.toShopPrice(stringReplace(',','',EC$('#total_price').val())) + parseInt(EC$('#np_use_amt').val()) < parseInt(totalUseAmount)) { 34252 alert(__('ê²°ì íì ì¼ í ê¸ì¡ë³´ë¤ ì¬ì©ê¸ì¡ì´ í½ëë¤. ë¤ì ì¬ì©ê¸ì¡ì ì ë ¥í´ì£¼ì¸ì')); 34253 return false;
34254 } 34255 34256 if (EC$('#np_req_tx_id').val() != null && reqTxId != '' && reqTxId != 0 && resultCode == 'E1000') { 34257 EC$('#np_req_tx_id').val(reqTxId); 34258 EC$('#np_save_rate').val(baseAccumRate); 34259 EC$('#np_save_rate_add').val(addAccumRate); 34260 EC$('#np_use_amt').val(useAmount); 34261 EC$('#np_mileage_use_amount').val(mileageUseAmount); 34262 EC$('#np_cash_use_amount').val(cashUseAmount); 34263 EC$('#np_total_use_amount').val(totalUseAmount); 34264 EC$('#np_use_amt').val(useAmount); 34265 EC$('#np_balance_amt').val(balanceAmount); 34266 EC$('#np_sig').val(sig); 34267 if (EC$('#np_use0').prop('checked') == true) { 34268 EC$('#np_use').val('T'); 34269 } else { 34270 EC$('#np_use').val(''); 34271 } 34272 } else { 34273 initNaverMileage(); 34274 } 34275 34276 EC$('#imgNaverMileageHelp').show(); 34277 34278 // PCì¼í몰ì¸ê²½ì°ë§ uiì ì¬ì© ë§ì¼ë¦¬ì§&ìºì¬ ì ë³´ ì ì© 34279 if (isMobile == false) { 34280 setNaverPoint(); 34281 } 34282} 34283 34284 34285function setNaverPoint() 34286{ 34287 try { 34288 34289 var bUseNaverMileage = false; 34290 if (isApplyDesignNMCanUseWithMileage()) { 34291 if (EC$('#either_mileage_navermileage_select1').prop('checked') == true) { 34292 bUseNaverMileage = true; 34293 } 34294 } else { 34295 if (EC$('#np_use0').prop('checked') == true) { 34296 bUseNaverMileage = true; 34297 } 34298 } 34299 34300 if (bUseNaverMileage == false) { 34301 initNaverMileage(); 34302 } 34303 34304 var sNpReqTxId = document.getElementById('np_req_tx_id').value; 34305 var iNpUseAmt = CAFE24.SHOP_PRICE.toShopPrice(document.getElementById('np_use_amt').value); 34306 var iNpMileageUseAmt = CAFE24.SHOP_PRICE.toShopPrice(document.getElementById('np_mileage_use_amount').value); 34307 var iNpCashUseAmt = CAFE24.SHOP_PRICE.toShopPrice(document.getElementById('np_cash_use_amount').value); 34308 var iNpTotalUseAmt = CAFE24.SHOP_PRICE.toShopPrice(document.getElementById('np_total_use_amount').value); 34309 var iNpBalanceAmt = CAFE24.SHOP_PRICE.toShopPrice(document.getElementById('np_balance_amt').value); 34310 var iNpSaveRate = parseFloat(document.getElementById('np_save_rate').value); 34311 var iNpSaveRateAdd = parseFloat(document.getElementById('np_save_rate_add').value); 34312 var iNpSaveRateTotal = iNpSaveRate + iNpSaveRateAdd; 34313 34314 if (isNMCanUseWithMileage() == false && isApplyDesignNMCanUseWithMileage() == true) { 34315 var elmNvDefaultGuide = document.getElementById('either_divNvDefaultGuide'); 34316 var oDivNvPointUse = document.getElementById('either_divNvPointUse'); 34317 var oDivNvPointSave = document.getElementById('either_divNvPointSave'); 34318 var oDivNvPointOpr = document.getElementById('either_divNvPointOpr'); 34319 var oDivNvPointBtnAdd = document.getElementById('either_divNvPointBtnAdd'); 34320 var oDivNvPointBtnMod = document.getElementById('either_divNvPointBtnMod'); 34321 var oTxtNpUse = document.getElementById('either_txt_np_use'); 34322 var oTxtNpSave = document.getElementById('either_txt_np_save'); 34323 var oExTxNpSave = document.getElementById('either_ex_tx_np_save'); 34324 var oExTxNpUse = document.getElementById('either_ex_tx_np_use'); 34325 34326 var bInflowParam = wcs.getMileageInfo(); 34327 34328 } else { 34329 var elmNvDefaultGuide = document.getElementById('divNvDefaultGuide'); 34330 var oDivNvPointUse = document.getElementById('divNvPointUse'); 34331 var oDivNvPointSave = document.getElementById('divNvPointSave'); 34332 var oDivNvPointOpr = document.getElementById('divNvPointOpr'); 34333 var oDivNvPointBtnAdd = document.getElementById('divNvPointBtnAdd'); 34334 var oDivNvPointBtnMod = document.getElementById('divNvPointBtnMod'); 34335 var oTxtNpUse = document.getElementById('txt_np_use'); 34336 var oTxtNpSave = document.getElementById('txt_np_save'); 34337 var oExTxNpSave = document.getElementById('ex_tx_np_save'); 34338 var oExTxNpUse = document.getElementById('ex_tx_np_use'); 34339 } 34340 34341 34342 if (isUseNaverMileage() == false) { 34343 elmNvDefaultGuide.style.display = ''; 34344 } 34345 34346 oDivNvPointUse.style.display = 'none'; 34347 oDivNvPointSave.style.display = 'none'; 34348 oDivNvPointOpr.style.display = 'none'; 34349 oDivNvPointBtnAdd.style.display = 'none';
34350 oDivNvPointBtnMod.style.display = 'none'; 34351 34352 if (iNpTotalUseAmt > 0 && iNpSaveRate > 0) {//& opr 34353 oDivNvPointOpr.style.display = 'inline'; 34354 } 34355 if (iNpTotalUseAmt > 0 || iNpSaveRateTotal > 0) { 34356 oDivNvPointBtnMod.style.display = 'inline'; 34357 } else { 34358 oDivNvPointBtnAdd.style.display = 'inline'; 34359 } 34360 if (iNpSaveRateTotal > 0) {//ì 립 34361 if (elmNvDefaultGuide) { 34362 elmNvDefaultGuide.style.display = 'none'; 34363 } 34364 34365 oDivNvPointSave.style.display = 'inline'; 34366 oTxtNpSave.innerHTML = oExTxNpSave.innerHTML.replace("[np_rate]", iNpSaveRateTotal); 34367 } 34368 34369 set_total_price(); 34370 34371 if (iNpTotalUseAmt > 0) { 34372 if (elmNvDefaultGuide) { 34373 elmNvDefaultGuide.style.display = 'none'; 34374 } 34375 34376 oDivNvPointUse.style.display = 'inline'; 34377 var sTmp = oExTxNpUse.innerHTML; 34378 34379 var aUseNaverValue = new Array(); 34380 if (iNpMileageUseAmt > 0) { 34381 aUseNaverValue.push('ë§ì¼ë¦¬ì§ ' + addCommas(iNpMileageUseAmt) + 'ì'); 34382 } 34383 if (iNpCashUseAmt > 0) { 34384 aUseNaverValue.push('ìºì¬ ' + addCommas(iNpCashUseAmt) + 'ì'); 34385 } 34386 34387 oTxtNpUse.innerHTML = aUseNaverValue.join(' + ') + ' ì¬ì©'; 34388 } 34389 34390 paymethod_display(EC$(':input:radio[name="addr_paymethod"]:checked').val()); 34391 34392 } catch (e) { 34393 initNaverMileage(); 34394 set_total_price(); 34395 } 34396 34397} 34398 34399 34400/** 34401 * ë¤ì´ë² ë§ì¼ë¦¬ì§/ìºì¬ reset 34402 * @return void 34403 */ 34404function resetNaverPoint() 34405{ 34406 try { 34407 EC$('#np_use0').prop('checked',false); 34408 setNaverPoint(); 34409 EC$('#np_use0').prop('checked',true); 34410 paymethod_display(EC$(':input:radio[name="addr_paymethod"]:checked').val()); 34411 } catch (e) {} 34412} 34413 34414 34415/** 34416 * ë¤ì´ë² ë§ì¼ë¦¬ì§/ìºì¬ ì¬ì©ìí¨ 34417 * @return void 34418 */ 34419function initNaverMileage() 34420{ 34421 // clear value 34422 try { 34423 document.getElementById('np_req_tx_id').value = ""; 34424 document.getElementById('np_use_amt').value = 0; 34425 document.getElementById('np_mileage_use_amount').value = 0; 34426 document.getElementById('np_cash_use_amount').value = 0; 34427 document.getElementById('np_total_use_amount').value = 0; 34428 document.getElementById('np_balance_amt').value = 0; 34429 document.getElementById('np_save_rate').value = 0; 34430 document.getElementById('np_save_rate_add').value = 0; 34431 document.getElementById('np_sig').value = ""; 34432 } catch (e) {} 34433 34434 // init design 34435 try { 34436 if (isNMCanUseWithMileage() == false && isApplyDesignNMCanUseWithMileage() == true) { 34437 var oDivNvPointUse = document.getElementById('either_divNvPointUse'); 34438 var oDivNvPointSave = document.getElementById('either_divNvPointSave'); 34439 var oDivNvPointOpr = document.getElementById('either_divNvPointOpr'); 34440 var oDivNvPointBtnAdd = document.getElementById('either_divNvPointBtnAdd'); 34441 var oDivNvPointBtnMod = document.getElementById('either_divNvPointBtnMod'); 34442 } else { 34443 var oDivNvPointUse = document.getElementById('divNvPointUse'); 34444 var oDivNvPointSave = document.getElementById('divNvPointSave'); 34445 var oDivNvPointOpr = document.getElementById('divNvPointOpr'); 34446 var oDivNvPointBtnAdd = document.getElementById('divNvPointBtnAdd'); 34447 var oDivNvPointBtnMod = document.getElementById('divNvPointBtnMod'); 34448 } 34449 oDivNvPointUse.style.display = 'none'; 34450 oDivNvPointSave.style.display = 'none'; 34451 oDivNvPointOpr.style.display = 'none'; 34452 oDivNvPointBtnAdd.style.display = 'inline'; 34453 oDivNvPointBtnMod.style.display = 'none'; 34454 } catch (e) {} 34455 34456 // clear trasaction id 34457 try { 34458 naver_reqTxId = ''; 34459 } catch (e) {} 34460} 34461 34462 34463/** 34464 * ë¤ì´ë² ë§ì¼ë¦¬ì§/ìºì¬ ì¬ì© ì¬ë¶ 34465 * @return boolean 34466 */ 34467function isUseNaverMileage() 34468{ 34469 var bIsUse = false; 34470 try { 34471 if (EC$('#np_req_tx_id').val() != '' || EC$('#np_save_rate').val() > 0) { 34472 bIsUse = true; 34473 } 34474 } catch (e) {} 34475 return bIsUse; 34476} 34477 34478/** 34479 * ìë£í cast 34480 * @param float fData ì«ì 34481 * @return mixed 34482 */ 34483function castDataType(fData) 34484{ 34485 if (isNaN(fData) == false) { 34486 if ((fData % 1) == 0) { 34487 return parseInt(fData); 34488 } else { 34489 return parseFloat(fData); 34490 } 34491 } else { 34492 return 0; 34493 } 34494} 34495 34496 34497/** 34498 * 모ë°ì¼ ë§ì¼ë¦¬ì§ Library ì´ê¸°í 34499 */ 34500function initNavermileageWithWcs() 34501{ 34502 try { 34503 // ë¤ì´ë²ë§ì¼ë¦¬ì§ ê´ë ¨ ë³ìê° controllerìì assignì´ ìëì´ ìì¼ë©´ ìëë¶ë¶ ì¤íìë를 ìíë¤. 34504 if (typeof(nbp) === 'object') { 34505 34506 var iMaxuseAmount = parseInt(EC$('#total_price').val().replace(/,/g, '')); 34507 var iBaseAccumRate = parseFloat(EC$('#np_save_rate_default').val()); 34508 var iTimestamp = parseInt(EC$('#np_timestamp').val()); 34509 var sId = '_mileage_acc'; 34510 if (isNMCanUseWithMileage() == false && isApplyDesignNMCanUseWithMileage() == true) { 34511 sId = '_either_mileage_acc'; 34512 } 34513 34514 var bResult = nbp.mileage.initWithWcs({ 34515 'sId': sId, 34516 'sApiId': EC$('#np_api_id').val(), 34517 'sDoneUrl': decodeURIComponent(EC$('#np_done_url').val()), 34518 'nMaxUseAmount': iMaxuseAmount, 34519 'sSig': EC$('#np_req_sig').val(), 34520 'nTimestamp': iTimestamp, 34521 'nBaseAccumRate': iBaseAccumRate, 34522 'bActive': true, 34523 'event': { 34524 'beforeAccum': function(oEvent) { //ì 립/ì¬ì©íì´ì§ê° ë¨ê¸° ì§ì í¸ì¶ëë¤. 34525 set_total_price(); 34526 nbp.mileage.setMaxUseAmount(getNavermileageMaxAmount()); 34527 if (oEvent.bActive === false) { //ë§ì¼ë¦¬ì§ 모ëì´ ë¹íì±í ìíìì ì 립/ì¬ì© ë²í¼ í´ë¦ callback 구í 34528 alert('ë¤ì´ë² ë§ì¼ë¦¬ì§ë¥¼ ì¬ì©/ì 립íë ¤ë©´, 먼ì \'ë¤ì´ë² ë§ì¼ë¦¬ì§\'를 ì íí´ì¼í©ëë¤. '); 34529 return false;
34530 } 34531 }, 34532 'accum': function(aRetVal) { 34533 aRetVal.resultCode = convertResultCode(aRetVal.resultCode); 34534 enableNaverCashPanel(aRetVal.baseAccumRate, aRetVal.addAccumRate, aRetVal.mileageUseAmount, aRetVal.balanceAmount, aRetVal.reqTxId, aRetVal.sig, aRetVal.resultCode, aRetVal.mileageUseAmount, aRetVal.cashUseAmount, aRetVal.totalUseAmount); 34535 set_total_price(); 34536 } 34537 } 34538 }); 34539 34540 if (bResult) { 34541 if (isNMCanUseWithMileage() == false && isApplyDesignNMCanUseWithMileage() == true) { 34542 nbp.mileage.inactive(); 34543 } 34544 } else { 34545 if (EC$('#np_is_use').val() == 'T' && document.getElementById('_mileage_acc') != null && document.getElementById('_mileage_acc') != undefined) { 34546 alert('ë¤ì´ë²ë§ì¼ë¦¬ì§ ì 립/ì¬ì© ì´ê¸°íê° ì ìì ì´ì§ ììµëë¤. ì§ìë°ìì ì´ìììê² ë¬¸ì í´ì£¼ì¸ì.'); 34547 } 34548 } 34549 } 34550 } catch (e) {} 34551} 34552 34553/** 34554 * pg모ëìì 리í´í´ì£¼ë íìì¼ë¡ ë³í 34555 * @param string sCode ì½ë 34556 * @return string 34557 */ 34558function convertResultCode(sCode) 34559{ 34560 if (sCode == 'OK') { 34561 return 'E1000'; 34562 } else if (sCode == 'CANCEL') { 34563 return 'E1001'; 34564 } else if (sCode == 'ERROR') { 34565 return 'E1002'; 34566 } else { 34567 return 'E1100'; 34568 } 34569} 34570 34571/** 34572 *모ë°ì¼ ë§ì¼ë¦¬ì§ ìµëì¬ì©ê°ë¥ ê¸ì¡(ê²°ì ê¸ì¡ + ë§ì¼ë¦¬ì§ ì¬ì©ê¸ì¡) 34573 * @return int 34574 */ 34575function getNavermileageMaxAmount() 34576{ 34577 var iMaxAmount = CAFE24.SHOP_PRICE.toShopPrice(EC$('#total_price').val().replace(/,/g, '')); 34578 iMaxAmount += check_parseInt(getUseNaverMileageCash()); 34579 34580 return iMaxAmount; 34581} 34582 34583var COLORCHIP_FRONT = { 34584 setFrontInit: function() 34585 { 34586 EC$('.xans-product-colorchip').find('.chips').each(function() { 34587 34588 var sColor = COLORCHIP_FRONT.RGB2Color(EC$(this).css('backgroundColor')); 34589 var sCursor = ''; 34590 if (COLORCHIP_FRONT.checkValidation(sColor) === true && EC_FRONT_JS_CONFIG_SHOP.aOptionColorchip[sColor] != '') { 34591 if (CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_IMAGE.isDisplayImageDesign() === false) { 34592 return; 34593 } 34594 sCursor = 'pointer'; 34595 EC$(this).on('mouseover click', function() { 34596 CAFE24.SHOP_FRONT_NEW_OPTION_EXTRA_IMAGE.setImage(EC_FRONT_JS_CONFIG_SHOP.aOptionColorchip[sColor], true); 34597 }); 34598 } 34599 EC$(this).css('cursor', sCursor); 34600 }); 34601 }, 34602 34603 RGB2Color: function (sRgb) 34604 { 34605 try { 34606 rgb = sRgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); 34607 if (rgb === null) { 34608 return sRgb.toString().toUpperCase(); 34609 } else { 34610 return '#' + COLORCHIP_FRONT.byte2Hex(rgb[1]) + COLORCHIP_FRONT.byte2Hex(rgb[2]) + COLORCHIP_FRONT.byte2Hex(rgb[3]); 34611 } 34612 } catch (e) { 34613 return ''; 34614 } 34615 }, 34616 34617 byte2Hex: function (n) 34618 { 34619 var nybHexString = "0123456789ABCDEF"; 34620 return String(nybHexString.substr((n >> 4) & 0x0F,1)) + nybHexString.substr(n & 0x0F,1); 34621 }, 34622 34623 checkValidation: function(sColor) 34624 { 34625 var regex = /^#?[0-9A-F]{6}$/i; 34626 return regex.test(sColor); 34627 } 34628}; 34629 34630EC$(function() { 34631 COLORCHIP_FRONT.setFrontInit(); 34632}); 34633 34634/** 34635 * ë°ë¡êµ¬ë§¤ì£¼ë¬¸ ìí모ë ë¼ì´ë¸ë¬ë¦¬ 34636 */ 34637CAFE24.SHOP_FRONT_NEW_PRODUCT_DIRECT_BUY = function() { 34638 // ì¥ë°êµ¬ë ë´ê¸° 34639 var setDirectBuyOrderBasket = function () 34640 { 34641 // ë°ë¡êµ¬ë§¤ 주문ì ìë 34642 if (EC_FRONT_JS_CONFIG_SHOP.bDirectBuyOrderForm !== true) { 34643 return; 34644 } 34645 // ë¹íì 구매ì í 34646 if (sIsDisplayNonmemberPrice === 'T' || is_soldout_icon === 'T') { 34647 return; 34648 } 34649 // 1+N ì í 34650 if (typeof CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE !== 'undefined' && CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.oBundleConfig.hasOwnProperty(iProductNo) === true) { 34651 return; 34652 } 34653 product_submit('direct_buy', '/exec/front/order/basket/'); 34654 }; 34655 34656 // ì¥ë°êµ¬ë 리ì 34657 var resetDirectBuyOrderBasket = function () 34658 { 34659 // reset basket 34660 CAFE24.SHOP_FRONT_ORDERFORM_DIRECTBUY.proc.setOrderForm(TotalAddSale.getDirectBuyParam()); 34661 }; 34662 34663 // ë°ë¡êµ¬ë§¤ì£¼ë¬¸ì ì ìì í 34664 var setAccessRestriction = function () 34665 { 34666 if (EC_FRONT_JS_CONFIG_SHOP.bDirectBuyOrderForm !== true) { 34667 return; 34668 } 34669 if (sIsDisplayNonmemberPrice === 'T' || sIsNonmemberLimit === 'T') { 34670 alert(__('íìë§ êµ¬ë§¤ ê°ë¥í©ëë¤. ë¹íìì¸ ê²½ì° íìê°ì í ì´ì©íì¬ ì£¼ì¸ì.')); 34671 btn_action_move_url('/member/login.html'); 34672 } else if (typeof CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE !== 'undefined' && CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.oBundleConfig.hasOwnProperty(iProductNo) === true) { 34673 // 1+N ì í 34674 alert(sprintf(__('EVENT.ITEM.ORDER.AT.MALL', 'SHOP.JS.FRONT.NEW.PRODUCT.DIRECTBUY'), CAFE24.SHOP_FRONT_PRODUCT_DETAIL_BUNDLE.oBundleConfig[iProductNo].bundle_quantity)); 34675 btn_action_move_url('/'); 34676 } 34677 }; 34678 // 주문ê°ë¥í í목ë°ì´í°ê° ìëì§ íì¸ 34679 var getValidOptionData = function () { 34680 var oParam = TotalAddSale.getDirectBuyParam(); 34681 if (oParam['items'] === null) { 34682 return false;
34683 } 34684 return true; 34685 34686 }; 34687 34688 return { 34689 setDirectBuyOrderBasket: function (iTotalCount) { 34690 setDirectBuyOrderBasket(iTotalCount); 34691 }, 34692 setAccessRestriction: function () { 34693 setAccessRestriction(); 34694 }, 34695 resetDirectBuyOrderBasket: function() { 34696 resetDirectBuyOrderBasket(); 34697 }, 34698 getValidOptionData: function() { 34699 return getValidOptionData(); 34700 } 34701 }; 34702}(); 34703 34704var EC_SHOP_FRONT_NEW_PRODUCT_DIRECT_BUY = CAFE24.getDeprecatedNamespace('EC_SHOP_FRONT_NEW_PRODUCT_DIRECT_BUY'); 34705 34706EC$(function() 34707{ 34708 // ì¸ë¤ì¼ ì´ë¯¸ì§ì ëí ë§ì°ì¤ ì¤ë² ì¡ì (sUseAddimageAction: ì¶ê° ì´ë¯¸ì§ ì¡ì ) 34709 EC$('.ThumbImage').mouseover(function() { 34710 if (ImageAction.sUseAddimageAction === 'O') { 34711 ImageAction.setThumbImageAction(EC$(this)); 34712 } 34713 }); 34714 34715 // ì¸ë¤ì¼ ì´ë¯¸ì§ì ëí ë§ì°ì¤ í´ë¦ ì¡ì (sUseAddimageAction: ì¶ê° ì´ë¯¸ì§ ì¡ì ) 34716 EC$('.ThumbImage').click(function() { 34717 if (ImageAction.sUseAddimageAction === 'C') { 34718 ImageAction.setThumbImageAction(EC$(this)); 34719 } 34720 }); 34721 34722 // ECHOSTING-456684 - webpì´ë¯¸ì§ê° 리ì¬ì´ì§ ìëìì ê²½ì° gifì´ë¯¸ì§ ë ¸ì¶ 34723 EC$('.BigImage').on('error', function() { 34724 var sSrc = EC$('.BigImage').attr('src'); 34725 if (sSrc.substring(sSrc.lastIndexOf('.')) !== '.webp') { 34726 return; 34727 } 34728 34729 sSrc = sSrc.substring(0, sSrc.lastIndexOf('.')) + '.gif'; 34730 EC$('.BigImage').attr('src', sSrc); 34731 }); 34732 34733 ImagePreview.eBigImgSrc = EC$('.BigImage').attr('src'); 34734 34735 var bPreview = (EC$.data(document,'Preview') == 'T') ? true : false; 34736 34737 // ì ì¼ ì²ì ë¡ë©ì ì´ë¯¸ì§ê° ì ì¥í´ëì..ë´ìíììë small == big ì´ì§ë§ 구ìí ì¤í¨ììë 34738 // tinyì bigì ì´ë¯¸ì§ëª í림!! 34739 ImagePreview.eBigImgSrc = EC$('.BigImage').attr('src'); 34740 34741 if (bPreview === true) { 34742 ImagePreview.Init(); 34743 } 34744}); 34745 34746var ImageAction = { 34747 // íë ì´ë¯¸ì§ 34748 sBigSrc: EC$('.BigImage').attr('src'), 34749 34750 // ì¶ê° ì´ë¯¸ì§ ì¡ì (ê¸°ë³¸ê° - O: ë§ì°ì¤ ì¤ë²) 34751 sUseAddimageAction: 'O', 34752 34753 // ì¸ë¤ì¼ ë§ì°ì¤ ì¡ì (ë§ì°ì¤ ì¤ë² ë° í´ë¦ì ëí ì¤ë³µì¼ë¡ ì¸í´ ë¶ê¸°) 34754 setThumbImageAction: function(target) 34755 { 34756 EC$('#prdDetailImg').attr('rel', EC$(this).parent().index()); 34757 34758 var sSrc = target.attr('src'); 34759 34760 if (sSrc.indexOf('/product/tiny/') > 0) { 34761 if (typeof this.sBigSrc === 'string' && sSrc.substring(sSrc.lastIndexOf('/')) === this.sBigSrc.substring(this.sBigSrc.lastIndexOf('/'))) { 34762 sSrc = sSrc.replace('/product/tiny/', '/product/big/'); 34763 } else { 34764 sSrc = ImagePreview.eBigImgSrc; 34765 } 34766 34767 EC$('.BigImage').attr('src', sSrc); 34768 34769 // ì¼ë¨ ë³µì¡í ê³¼ì ì ì ì¸íê³ íì¼ êµì²´ë§ ì²ë¦¬ 34770 } else if (sSrc.indexOf('/product/small/') > 0) { 34771 if (typeof this.sBigSrc === 'string' && sSrc.substring(sSrc.lastIndexOf('/')) === this.sBigSrc.substring(this.sBigSrc.lastIndexOf('/'))) { 34772 sSrc = sSrc.replace('/product/small/', '/product/big/'); 34773 } else { 34774 sSrc = ImagePreview.eBigImgSrc; 34775 } 34776 34777 EC$('.BigImage').attr('src', sSrc); 34778 } else if (sSrc.indexOf('/thumb/') > 0) { 34779 EC$('.BigImage').attr('src', ImagePreview.eBigImgSrc); 34780 } else { 34781 // ì¶ê° ì´ë¯¸ì§ 34782 sSrc = sSrc.replace('/product/extra/small/', '/product/extra/big/'); 34783 34784 EC$('.BigImage').attr('src', sSrc); 34785 34786 // ë¨ì¼ ì íí + ì¶ê° ì´ë¯¸ì§ ì¡ì ì´ C(ë§ì°ì¤ í´ë¦)ì¸ ê²½ì° ì¶ê° ì´ë¯¸ì§ì ì íì ëí í목 ì í ì²ë¦¬ 34787 if (oSingleSelection.isItemSelectionTypeS() === true && this.sUseAddimageAction === 'C') { 34788 // í목 ì½ëê° ìì ê²½ì° í´ë¹ëë UI ì í 34789 if (target.attr('item_code') !== '') { 34790 CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValueByAddImage(target.attr('item_code')); 34791 } 34792 } 34793 } 34794 } 34795}; 34796 34797var ImagePreview = 34798{ 34799 bNewProduct: false, 34800 eTarget: null, 34801 eBigImgSrc: null, 34802 Init: function() 34803 { 34804 this.eTarget = EC$('.xans-product-image img.BigImage'); 34805 this.eTarget.parent().addClass('cloud-zoom'); 34806 this.showNotice(); 34807 ImagePreview.setZoom(); 34808 34809 }, 34810 showNotice: function() 34811 { 34812 var sLang = SHOP.getLanguage(); 34813 if (sLang == 'ja_JP') { 34814 var iImgWidth = 107; 34815 } else { 34816 var iImgWidth = 85; 34817 } 34818 34819 var sZoomImage = '//img.echosting.cafe24.com/design/skin/admin/'+sLang+'/txt_product_zoom.gif'; 34820 34821 var sLeft = this.eTarget.width() / 2 - iImgWidth; 34822 EC$('<div id="zoomNotice"><img src="'+sZoomImage+'"></div>').css( 34823 { 34824 'height': '0px', 34825 'position': 'relative', 34826 'opacity': '0.75', 34827 'KHTMLOpacity': '0.75', 34828 'MozOpacity': '0.75', 34829 'filter': 'Alpha(opacity=75)', 34830 'top': '-27px', 34831 'margin-left': sLeft 34832 }).appendTo(this.eTarget.parent()); 34833 }, 34834 setZoom: function() 34835 { 34836 EC$('.cloud-zoom').mouseover(function() 34837 { 34838 EC$('.cloud-zoom').CloudZoom(); 34839 }); 34840 }, 34841 //ECHOSTING-236342 preview(íë보기) 기ë¥ìì ìì¸íì´ì§ ì°ê²° ì¤ë¥ 34842 setIframeSrcReplaceProductNo: function(iProductNo) 34843 { 34844 if (typeof(iProductNo) === 'undefined' || iProductNo == 0) { 34845 return; 34846 } 34847 34848 var oTargetIframe = EC$(parent.document).find('#modalContent'); 34849 34850 if (typeof(EC$(oTargetIframe).attr('src')) === 'undefined') { 34851 return; 34852 } 34853 34854 // 목ë¡ììì ìí íë 보기ì ìì iframe srcì íë¼ë¯¸í° product_no 를 ë¤ì,ì´ì íë©´ ì´ëì í´ë¹ ìíë²í¸ ë°ìì ë³í 34855 var sUrlReplaceProductNo = EC$(oTargetIframe).attr('src').replace(/product_no=[\d]+/,'product_no=' + iProductNo); 34856 34857 EC$(oTargetIframe).attr('src', sUrlReplaceProductNo); 34858 }, 34859 viewProductBtnClick: function(sActionType) 34860 { 34861 if (typeof(iProductNo) === 'undefined' || EC$.inArray(sActionType, ['next', 'prev']) < 0) { 34862 return; 34863 } 34864 34865 this.bNewProduct = true; 34866 var sParamUrl = ImagePreview.getViewProductUrl(iProductNo); 34867 var aMatchResult = ImagePreview.getLocationPathMatchResult(); 34868 var sRefDoc = (aMatchResult !== null) ? 'product' : location.pathname; 34869 34870 EC$.ajax({ 34871 url: '/exec/front/Product/Detailnavi'+ sParamUrl + '&refdoc='+ sRefDoc +'&navi_action='+ sActionType, 34872 type: 'GET', 34873 async: false, 34874 dataType: 'json', 34875 success: function(data) { 34876 if (data.result === true) { 34877 location.href = ImagePreview.getViewProductUrl(data.response.product_no, data.response.seo_url_link); 34878 } else { 34879 if (data.response.empty_msg !== null) { 34880 alert(data.response.empty_msg); 34881 } 34882 } 34883 } 34884 }); 34885 }, 34886 getLocationPathMatchResult: function() 34887 { 34888 var sPath = document.location.pathname; 34889 var sPattern = /^\/product\/(.+)\/([0-9]+)(\/.*)/; 34890 return sPath.match(sPattern); 34891 }, 34892 getViewProductUrl: function(iProductNo, sSeoUrl) 34893 { 34894 var aMatchResult = ImagePreview.getLocationPathMatchResult(); 34895 var bExistSeoUrl = (sSeoUrl !== '' && typeof(sSeoUrl) !== 'undefined') ? true : false;
34896 var sResultUrl = ''; 34897 34898 ImagePreview.setIframeSrcReplaceProductNo(iProductNo); 34899 34900 if (aMatchResult !== null) { 34901 if (bExistSeoUrl === true) { 34902 sResultUrl = sSeoUrl; 34903 } else { 34904 sResultUrl = (this.bNewProduct === false) ? ImagePreview.getOldProductDetailUrl(iProductNo) : '?product_no=' + iProductNo + '&cate_no='+ iCategoryNo + '&display_group=' + iDisplayGroup; 34905 } 34906 } else { 34907 var sSearchRelplace = location.search.replace(/product_no=[\d]+/,'product_no=' + iProductNo); 34908 sResultUrl = (this.bNewProduct === true) ? sSearchRelplace : location.pathname + sSearchRelplace; 34909 } 34910 34911 return sResultUrl; 34912 }, 34913 getOldProductDetailUrl: function(iProductNo) 34914 { 34915 var sSearchString = ''; 34916 34917 if (location.search) { 34918 sSearchString = '&' + location.search.replace(/\?/,''); 34919 } 34920 34921 return '/front/php/product.php?product_no=' + iProductNo + sSearchString; 34922 } 34923}; 34924 34925// ì´ì , ë¤ì ìí 보기 34926function viewProduct(iProductNo, sSeoUrl) 34927{ 34928 location.href = ImagePreview.getViewProductUrl(iProductNo, sSeoUrl); 34929} 34930 34931 34932// íì 34933function product_popup(sLink, sName, sOption, ele) 34934{ 34935 var aMatchResult = ImagePreview.getLocationPathMatchResult(); 34936 var sSearchQuery = location.search; 34937 34938 if (aMatchResult) { 34939 if (sSearchQuery) { 34940 sSearchQuery = sSearchQuery + '&product_no=' + aMatchResult[2]; 34941 } else { 34942 sSearchQuery = '?product_no=' + aMatchResult[2]; 34943 } 34944 } 34945 34946 try { 34947 var sDetailUri = ''; 34948 if (ele) { 34949 var iOrder = EC$(ele).attr('rel'); 34950 if (window.location.href.indexOf('/surl/P/') != -1) { 34951 sDetailUri = '?product_no=' + parseInt(window.location.href.split('/surl/P/')[1]) + '&order=' + iOrder; 34952 } else { 34953 sDetailUri = sSearchQuery + '&order=' + iOrder; 34954 } 34955 } 34956 window.open('/' + sLink + sDetailUri, sName, sOption); 34957 } catch (e) { 34958 window.open('/' + sLink + sSearchQuery, sName, sOption); 34959 } 34960} 34961 34962// window.open ë©ìë ì¸ì ê´ë ¨ ì¤ë¥ í¨ì¹ 34963(function() { 34964 var originWindowOpen = window.open; 34965 window.open = function() { 34966 return originWindowOpen.apply(null, Array.apply(null, arguments).slice(0, 3)); 34967 }; 34968})(); 34969 34970CAFE24.FRONT_NEW_PRODUCT_LAZYLOAD = { 34971 resetDetailContent: function() 34972 { 34973 var oProductDetailContent = null; 34974 if (EC$('.xans-product-additional').find('#prdDetailContent').html() !== null) { 34975 oProductDetailContent = EC$('.xans-product-additional').find('#prdDetailContent'); 34976 } else if (EC$('.xans-product-additional').find('div.prdDetailView') !== null) { 34977 oProductDetailContent = EC$('.xans-product-additional').find('div.prdDetailView'); 34978 EC$('div.moreBtn').hide(); 34979 } 34980 if (oProductDetailContent !== null && oProductDetailContent.html() !== '') { 34981 var sDetailContent = oProductDetailContent.html(); 34982 oProductDetailContent.html('').hide(); 34983 var sDetailForm = '<div id=\"prdDetailContentLazy\">'+ sDetailContent + '</div>'; 34984 oProductDetailContent.after(sDetailForm); 34985 } 34986 } 34987}; 34988 34989var EC_FRONT_NEW_PRODUCT_LAZYLOAD = CAFE24.getDeprecatedNamespace('EC_FRONT_NEW_PRODUCT_LAZYLOAD'); 34990 34991/** 34992 * 34993 */ 34994 34995var STOCKLAYER = (function() { 34996 34997 var sUrl = '/product/stocklayer.html'; 34998 34999 //ì¸í¸ ìí ì¬ë¶ 35000 function isSetProdct() 35001 { 35002 if (typeof(set_option_data) === 'undefined') { 35003 return false; 35004 } 35005 35006 return true; 35007 } 35008 35009 //모ë ì¬ê³ ë ì´ì´ Element Get 35010 function getAllStockLayer() 35011 { 35012 return EC$('.ec-shop-detail-stock-layer'); 35013 } 35014 35015 return { 35016 init: function() { 35017 try { 35018 EC$(document).on('click', 'a[name="EC-stockdesign"]', function(e) { 35019 e.preventDefault(); 35020 var iProductNo = EC$(this).attr('product_no'); 35021 var sPageType = EC$(this).attr('page_type'); 35022 STOCKLAYER.closeStockLayer(); 35023 35024 if (EC$(this).parent().find('.ec-shop-detail-stock-layer').length == 0) { 35025 var oParam = {}; 35026 35027 oParam['product_no'] = iProductNo; 35028 oParam['page_type'] = sPageType; 35029 35030 var oHtml = EC$('<div>'); 35031 oHtml.addClass('ec-shop-detail-stock-layer'); 35032 EC$(this).parent().append(oHtml); 35033 EC$.ajax({ 35034 type: 'GET', 35035 url: sUrl, 35036 data: oParam, 35037 success: function (sHtml) { 35038 sHtml = sHtml.replace(/[<]script( [^ ]+)? src=\"[^>]*>([\s\S]*?)[<]\/script>/g, ""); 35039 oHtml.html(sHtml); 35040 }, 35041 error: function (e) { 35042 __('ì¤ë¥ë°ì'); 35043 } 35044 }); 35045 } else { 35046 EC$(this).parent().find('.ec-shop-detail-stock-layer').show(); 35047 } 35048 35049 e.preventDefault(); 35050 }); 35051 } catch (e) {} 35052 }, 35053 35054 closeStockLayer: function() { 35055 var $oAllStockLayer = getAllStockLayer(); 35056 $oAllStockLayer.hide(); 35057 } 35058 }; 35059})(); 35060 35061EC$(function() { 35062 STOCKLAYER.init(); 35063}); 35064 35065//ìí ìµì id 35066var product_option_id = 'product_option_id'; 35067EC$(function() { 35068 NEWPRD_ADD_OPTION.init(); 35069 //ECHOSTING-77239 - 80113 : ë°°ì¡ì¤ë¹ì¤ê´ë¦¬ìì í¹ì ë ëê°ì 기í¸ê° í¬í¨ë ìµì ê°ë§ ê¹¨ì ¸ì ë ¸ì¶ 35070 35071 //íìë ìµì ì íë°ì¤ì ëí´ ì´ë²¤í¸ë°ì¸ë ì 리 35072 35073 //ì¶ê°ì ë ¥ ìµì ; ì ê±° > ECHOSTING-77239ê±´ê³¼ ëì¼ ì´ìë¡ ì¸í´ ìì¬ëì ê¸°í¸ ì¶ê°(ECHOSTING-182704) 35074 EC$(document).on('blur', '.input_addoption, .rel_input_addoption', function() { 35075 var regex = /[\;\\*\|]/g; 35076 if (regex.test(EC$(this).val()) === true) { 35077 alert(__('í¹ì문ìë ì ë ¥í ì ììµëë¤.')); 35078 EC$(this).val(EC$(this).val().replace(regex, '')); 35079 } 35080 }); 35081 35082 35083 //ì¶ê°ìµì ê¸ìì ì²´í¬ 35084 try { 35085 EC$(document).on('keyup', '.rel_input_addoption', function() { 35086 NEWPRD_ADD_OPTION.checkProductAddOptionWord(this); 35087 }); 35088 } catch (e) {} 35089}); 35090 35091// ë´ìíì ë´ìí ì¤í¨ì¸ì§ íì¸íë ë©ìë (ë´ìíì¸ë° 구ìíì¸ ê²½ì°ìë false) 35092function isNewProductSkin() 35093{ 35094 return EC$('#totalProducts').length > 0; 35095} 35096 35097// 구ì¤í¨ì ì¬ì©í ê²½ì° ì´ ê¸ì¡ ê³ì° 35098function setOldTotalPrice() 35099{ 35100 35101 if (product_price_content == true) { 35102 return; 35103 } 35104 35105 // íë§¤ê° íì ê³µê°ì¸ ê²½ì° ìµì ê° ê³ì° íììì! 35106 if (sIsDisplayNonmemberPrice === 'T') { 35107 EC$('#span_product_price_text').html(sNonmemberPrice); 35108 return; 35109 } 35110 35111 var iQuantity = 1; 35112 if (typeof(EC$(quantity_id).val()) !== 'undefined') { 35113 iQuantity = parseInt(EC$(quantity_id).val(),10); 35114 } 35115 35116 var iOptionPrice = 0; 35117 if (option_type === 'T') { 35118 iOptionPrice = CAFE24.SHOP_PRICE.toShopPrice(product_price); 35119 } 35120 var aStockData = new Array(); 35121 if (typeof(option_stock_data) !== 'undefined') { 35122 aStockData = CAFE24.UTIL.parseJSON(option_stock_data); 35123 } 35124 35125 // ë³µí©í 35126 if (option_type == 'T') { 35127 // ì¼ì²´ì íí 35128 if (item_listing_type == 'S') { 35129 sOptionId = ITEM.getOldProductItemCode(); 35130 if (sOptionId !== false) { 35131 iOptionPrice += (aStockData[sOptionId].option_price - product_price); 35132 } 35133 } else { 35134 EC$('select[id^="product_option_id"] option:selected').filter('[value!="*"]').each(function() { 35135 var sOptionId = EC$(this).val(); 35136 if (typeof(aStockData[sOptionId]) !== 'undefined' && aStockData[sOptionId].stock_price != 0) { 35137 iOptionPrice += (aStockData[sOptionId].option_price - product_price); 35138 } 35139 }); 35140 } 35141 } else if (Olnk.isLinkageType(option_type) === true) { // ì ì¥í 35142 var iPrdPrice = CAFE24.SHOP_PRICE.toShopPrice(product_price); 35143 var iOptPrice = 0; 35144 var sPrice = ''; 35145 EC$('select[id^="product_option_id"]').each(function() { 35146 var iValNo = parseInt(EC$(this).val()); 35147 if (isNaN(iValNo) === true) { 35148 return; 35149 } 35150 35151 iOptPrice += CAFE24.SHOP_PRICE.toShopPrice(aStockData[iValNo].stock_price); 35152 }); 35153 35154 iOptionPrice = iPrdPrice + iOptPrice; 35155 } else { 35156 // ë¨ë íì¼ëë 구ìíê³¼ ë¤ë¥´ê² í목ë¨ìë¡ ê³ì°ì´ íìí¨. 35157 EC$('select[id^="product_option_id"] option:selected').filter('[value!="*"]').each(function() { 35158 var sOptionId = EC$(this).val(); 35159 if (typeof(aStockData[sOptionId]) !== 'undefined' && aStockData[sOptionId].stock_price != 0) { 35160 iOptionPrice += aStockData[sOptionId].option_price; 35161 } else { 35162 iOptionPrice += aStockData[sOptionId].option_price; 35163 } 35164 }); 35165 } 35166 if (option_type === 'F' && iOptionPrice === 0) { 35167 iOptionPrice = product_price; 35168 } 35169 35170 35171 iPrice = getProductPrice(iQuantity, iOptionPrice, null, null, function(iPrice) { 35172 EC$('#span_product_price_text').html(CAFE24.SHOP_PRICE_FORMAT.toShopPrice(iPrice)); 35173 }); 35174 35175} 35176 35177/** 35178 * ë´ìí íë¡ í¸ ìµì ì ê´ë¦¬íë ê°ì²´ 35179 * ìì¼ë¡ ì ìì¼ë¡ í¨ì를 ì ì¸íì§ ë§ê³ ì¬ê¸°ì ì ì¸ 35180 */ 35181var NEWPRD_OPTION = { 35182 DELIMITER_SEMICOLON: ';', 35183 DELIMITER_SLASH: '/', 35184 iOptionBoxSequence: 0, 35185 /** 35186 * ì ë í¸ ì리먼í¸ì 첫ë²ì§¸ ìµì ì¼ë¡ ë³ê²½
35187 * @param oSelect object ì ë í¸ ìë¦¬ë¨¼í¸ ê°ì²´ 35188 */ 35189 resetSelectElement: function(oSelect) { 35190 if (typeof(oSelect) !== 'object' || typeof(oSelect.is) !== 'function' || oSelect.is('select') !== true) { 35191 return false; 35192 } 35193 35194 if (this.setOlnkOptionReset(oSelect) !== false) { 35195 CAFE24.SHOP_FRONT_NEW_OPTION_COMMON.setValue(oSelect, '*'); 35196 } 35197 }, 35198 35199 /** 35200 * ìµì ì ë í¸ë°ì¤ì 첫ë²ì§¸/ëë²ì§¸ ê°ì¸ì§ 35201 * @param sOptionValue ì íê° 35202 */ 35203 isOptionSelectTitleOrDivider: function(sOptionValue) { 35204 return (EC$.inArray(sOptionValue, ['*', '**']) !== -1) ? true : false; 35205 }, 35206 35207 setOlnkOptionReset: function(oSelect) { 35208 // option codeê° ìì¼ë©´ ì°ëíìµì 35209 // ë§ì¼ì ëë¹í´ì íë¨ 35210 if (oSelect.attr('option_code') != undefined && oSelect.attr('option_code') !== '') { 35211 35212 var aOptionIdArray = oSelect.attr('id').split('_'); 35213 var iOptionLength = aOptionIdArray.length; 35214 var sOptionIdTxt = 'product_option_id'; 35215 var iOptionNum = 0; 35216 var sOptionButtonIdTxt = 'option_push_button'; 35217 35218 if (iOptionLength === 3) { // product_option_idX 35219 iOptionNum = oSelect.attr('id').replace(sOptionIdTxt,''); 35220 } else if (iOptionLength === 5) { //addproduct_option_id_product_no_x 35221 sOptionIdTxt = 'addproduct_option_id_' + aOptionIdArray[3] + '_'; 35222 iOptionNum = aOptionIdArray[4]; 35223 sOptionButtonIdTxt = 'add_option_push_button_'+aOptionIdArray[3]; 35224 } 35225 35226 // ì°ëí ìµì ì ë²í¼íì¸ ê²½ì° ë¦¬ì ì²ë¦¬ ìì´ ê·¸ë¥ ë¦¬í´ 35227 if (Olnk.getOptionPushbutton(EC$('#'+sOptionButtonIdTxt)) === true) { 35228 return false; 35229 } 35230 } 35231 return true; 35232 } 35233}; 35234 35235/** 35236 * ë´ìí íë¡ í¸ ì¶ê°ìµì ì ê´ë¦¬íë ê°ì²´ 35237 * ìì¼ë¡ ì ìì¼ë¡ í¨ì를 ì ì¸íì§ ë§ê³ ì¬ê¸°ì ì ì¸ 35238 */ 35239var NEWPRD_ADD_OPTION = { 35240 aCustomData: [], 35241 init: function () { 35242 if (typeof add_option_input_setproduct === 'string') { 35243 window.add_option_input_setproduct = JSON.parse(add_option_input_setproduct); 35244 } 35245 if (typeof add_option_input_addproduct === 'string') { 35246 window.add_option_input_addproduct = JSON.parse(add_option_input_addproduct); 35247 } 35248 }, 35249 35250 /** 35251 * ê°ë³ ì ë ¥ ìµì ì¬ë¶ 35252 * @returns {boolean} 35253 */ 35254 isUsePerAddOption: function () { 35255 if (typeof add_option_input !== 'undefined') { // ê°ë³ ì ë ¥ ìµì 35256 return true; 35257 } 35258 35259 if (typeof add_option_file_input !== 'undefined') { // ê°ë³ íì¼ ì²¨ë¶ ìµì 35260 return true; 35261 } 35262 35263 if (typeof add_option_input_setproduct !== 'undefined') { // ì¸í¸ ê°ë³ ì ë ¥ ìµì 35264 return true; 35265 } 35266 35267 if (typeof add_option_input_addproduct !== 'undefined') { // ì¶ê° êµ¬ì± ìí ê°ë³ ì ë ¥ ìµì 35268 return true; 35269 } 35270 35271 return false; 35272 }, 35273 35274 /** 35275 * ì¶ê°ìµì 리ì¤í¸ ë¦¬í´ (íì, ì í모ë) 35276 * @returns array ì¶ê°ìµì 리ì¤í¸ 35277 */ 35278 getCurrentAddOption: function() { 35279 var aAddOption = []; 35280 35281 EC$('.input_addoption').not('[name^=addproduct_add_option_name_]').each(function () { 35282 aAddOption.push(EC$(this).val()); 35283 }); 35284 35285 return aAddOption; 35286 }, 35287 35288 getAddOptionValue: function(sDataAddOption) { 35289 return (oSingleSelection.isItemSelectionTypeS() === true) ? this.getCurrentAddOption().join(NEWPRD_OPTION.DELIMITER_SEMICOLON) : unescape(sDataAddOption); 35290 }, 35291 35292 /** 35293 * ê°ë³ ì ë ¥ ìµì DOM ì²ë¦¬ 35294 * @param sItemCode í목ì½ë 35295 * @returns {string} 35296 */ 35297 getPerAddOptionTemplate: function (sItemCode) { 35298 var sHtml = ''; 35299 // ê°ë³ ì¶ê° ì ë ¥ ìµì 35300 sHtml += this.getAddOptionTemplate(sItemCode); 35301 // ê°ë³ íì¼ ì²¨ë¶ ìµì 35302 sHtml += this.getFileOptionTemplate(sItemCode); 35303 35304 if (sHtml !== '') { 35305 sHtml = '<tr class="option">' + 35306 '<td class="middle" colspan="3">' + 35307 '<table summary="" border="1">' + 35308 NEWPRD_ADD_OPTION.getPerAddOptionCaptionTemplate() + 35309 NEWPRD_ADD_OPTION.getPerAddOptionColgroupTemplate() + 35310 '<tbody>
35310' + sHtml + '</tbody>' + 35311 '</table>' + 35312 '</td>' + 35313 '</tr>' + 35314 '</tbody>' + 35315 '</table>'; 35316 } 35317 return sHtml; 35318 }, 35319 /** 35320 * ê°ë³ ì ë ¥ ìµì DOM ì²ë¦¬ by div 35321 * @param sItemCode í목ì½ë 35322 * @returns {string} 35323 */ 35324 getPerAddOptionDivTemplate: function (sItemCode) { 35325 var sHtml = ''; 35326 35327 // ê°ë³ ì¶ê° ì ë ¥ ìµì 35328 sHtml += this.getAddOptionDivTemplate(sItemCode); 35329 // ê°ë³ íì¼ ì²¨ë¶ ìµì 35330 sHtml += this.getFileOptionDivTemplate(sItemCode); 35331 35332 return sHtml; 35333 }, 35334 getPerAddOptionColgroupTemplate: function() 35335 { 35336 var aReturn = [ 35337 '<colgroup>', 35338 '<col style="width:28%;">', 35339 '<col style="width:auto;">', 35340 '</colgroup>' 35341 ]; 35342 return aReturn.join(''); 35343 }, 35344 getPerAddOptionCaptionTemplate: function() 35345 { 35346 var aReturn = [ 35347 '<caption>', 35348 __('ìµì ì ë³´'), // ì´ ë´ì©ì´ ë³ê²½ëì´ì¼íë©´ íë¼ë¯¸í°ë±ì ì¶ê°íì¸ì. 35349 '</caption>' 35350 ]; 35351 return aReturn.join(''); 35352 }, 35353 35354 /** 35355 * íëª©ë³ ì ë ¥ ìµì í í릿 ìì± 35356 * @returns {string} 35357 */ 35358 getAddOptionTemplate: function(sItemCode) { 35359 var sHtml = ''; 35360 if (typeof add_option_input !== 'undefined') { 35361 EC$.each(add_option_input, function (iKey, oValue) { 35362 var sValue = ''; 35363 // ë¶ëª¨ì°½ ì ë ¥ê° ë ì´ì´ë¡ ë³µì¬ 35364 if (EC$('#product_detail_option_layer').is(':visible') === true && EC$(window.parent.document.body).find('#' + oValue.id + '[add_product_code="' + sItemCode + '"]').length > 0) { 35365 sValue = EC$(window.parent.document.body).find('#' + oValue.id + '[add_product_code="' + sItemCode + '"]').val(); 35366 } 35367 sHtml += '<tr class="xans-element- xans-product xans-product-addoption xans-record-"><th scope="row">' + oValue.title + '</th>' + 35368 '<td colspan="2">' + 35369 '<input name="' + oValue.id + '" value="' + oValue.info + '" type="hidden">' + 35370 '<input id="' + oValue.id + '" name="' + oValue.name + '" require="' + oValue.require + '" maxlength="' + oValue.maxlength + '" class="' + oValue.class + '" value="' + sValue + '" type="text" add_product_code="' + sItemCode + '">' + 35371 '<span class="txtByte" title="' + __("íì¬ê¸ìì/ìµëê¸ìì") + '">(<strong class="length">0</strong>/' + oValue.maxlength + ')</span></td></tr>'; 35372 }); 35373 } 35374 35375 return sHtml; 35376 }, 35377 35378 /** 35379 * íëª©ë³ ì ë ¥ ìµì í í릿 ìì± by div 35380 * @param sItemCode item code 35381 * @returns string 35382 */ 35383 getAddOptionDivTemplate: function(sItemCode) { 35384 var sHtml = ''; 35385 if (typeof add_option_input !== 'undefined') { 35386 EC$.each(add_option_input, function (iKey, oValue) { 35387 var sValue = ''; 35388 35389 _required_class = (oValue.require == 'T') ? 'required' : ''; 35390 let _required_text = (oValue.require == 'T') ? __('íì') : __('OPTIONAL', 'SHOP.PRODUCT.OPTION'); 35391 35392 sHtml += '' + 35393 '<div class="xans-element- xans-product xans-product-addoption xans-record- row '+ _required_class+ '">' + 35394 '<div class="th">' + 35395 '<strong class="tit_option_name">' + oValue.info + '</strong>' + 35396 '<span class="txt_value">(' +_required_text + ')</span>' + 35397 '</div>' + 35398 '<div class="td">' + 35399 '<div class="ec-addoption-input option">' + 35400 '<div class="ec-input-count">' + 35401 '<input name="' + oValue.id + '" value="' + oValue.info + '" type="hidden">' + 35402 '<input id="' + oValue.id + '" name="' + oValue.name + '" require="' + oValue.require + '" maxlength="' + oValue.maxlength + '" class="' + oValue.class + '" value="' + sValue + '" type="text" add_product_code="' + sItemCode + '" placeholder="' + __('ë´ì©ì ì ë ¥íì¸ì.') + '">' + 35403 '<div class="byte" title="' + __('íì¬ê¸ìì/ìµëê¸ìì') + '">[ <strong class="length">0</strong> / <span class="maxCount">' + oValue.maxlength + '</span> ]</div>' + 35404 '</div>' + 35405 '</div>' + 35406 '</div>' + 35407 '</div>'; 35408 }); 35409 } 35410 35411 return sHtml; 35412 }, 35413 35414 /** 35415 * íëª©ë³ íì¼ ì²¨ë¶ ìµì í í릿 ìì± 35416 * @param sItemCode 35417 * @returns {string} 35418 */
35419 getFileOptionTemplate: function(sItemCode) { 35420 var sHtml = ''; 35421 if (typeof add_option_file_input !== 'undefined') { 35422 var sFormTag = ''; 35423 // íëª©ë³ ê³ ì í¤ id를 ê°ì§ ì ìëë¡ ì²ë¦¬(id 기ì¤ì¼ë¡ fileManagerì property ì¶ê°ë¨) 35424 EC$(add_option_file_input['form.file_option']).each(function () { 35425 var eSelf = EC$(this); 35426 eSelf.attr('id', eSelf.attr('id') + '_' + sItemCode); 35427 sFormTag += eSelf.prop('outerHTML'); 35428 }); 35429 sHtml += '<tr class="xans-element- xans-product xans-product-fileoption xans-record-"><th scope="row">' + add_option_file_input.file_option_name + '</th>' + 35430 '<td class="fileInfo" colspan="2">' + 35431 sFormTag + 35432 '<ul class="infoDesc">' + 35433 '<li>- ' + sprintf(__('íì¼ì ìµë 5ê°ê¹ì§ %sM ì´íë¡ ê°ë³ì ë¡ë ê°ë¥í©ëë¤.'), add_option_file_input.file_option_limit) + '</li>' + 35434 '</ul>' + 35435 '<ul id="ul_file_option_' + sItemCode + '"></ul>' + 35436 '</td>' + 35437 '</tr>'; 35438 } 35439 return sHtml; 35440 }, 35441 35442 /** 35443 * íëª©ë³ íì¼ ì²¨ë¶ ìµì í í릿 ìì± by div 35444 * @param sItemCode 35445 * @returns string 35446 */ 35447 getFileOptionDivTemplate: function(sItemCode) { 35448 var sHtml = ''; 35449 if (typeof add_option_file_input !== 'undefined') { 35450 var sFormTag = ''; 35451 // íëª©ë³ ê³ ì í¤ id를 ê°ì§ ì ìëë¡ ì²ë¦¬(id 기ì¤ì¼ë¡ fileManagerì property ì¶ê°ë¨) 35452 EC$(add_option_file_input['form.file_option']).each(function () { 35453 var eSelf = EC$(this); 35454 eSelf.attr('id', eSelf.attr('id') + '_' + sItemCode); 35455 sFormTag += eSelf.prop('outerHTML'); 35456 }); 35457 35458 _required_class = (add_option_file_input.necessary == 'T') ? 'required' : ''; 35459 _required_text = (add_option_file_input.necessary == 'T') ? __('íì') : __('ì í'); 35460 35461 sHtml += '' + 35462 '<div class="xans-element- xans-product xans-product-fileoption xans-record- row ' + _required_class + '">' + 35463 '<div class="th">' + 35464 '<strong class="tit_option_name">' + add_option_file_input.option.name + '</strong>' + 35465 '<span class="txt_value">(' +_required_text + ')</span>' + 35466 '</div>' + 35467 '<div class="td">' + 35468 '<div class="fileInfo">' + 35469 '<div class="ec-product-file">' + 35470 sFormTag + 35471 '<span class="btn_option_select">' + __('íì¼ì²¨ë¶') + '</span>' + 35472 '<p class="txt_file_add">' + sprintf(__('ìµë 5ê° íì¼, ê° %sMBê¹ì§ 첨ë¶'), add_option_file_input.file_option_limit) + '</p>' + 35473 '</div>' + 35474 '<ul id="ul_file_option_' + sItemCode + '" class="list_file_option"></ul>' + 35475 '</ul>' + 35476 '</div>' + 35477 '</div>' + 35478 '</div>'; 35479 } 35480 return sHtml; 35481 }, 35482 /** 35483 * íì¬ ìì±ëì´ìë ì¶ê°ìµì ì¼ë¡ í목ì íìí íì´í ë¦¬í´ 35484 * @param aAddOption array ì¶ê°ìµì 리ì¤í¸ 35485 * @returns string íì¬ ìì±ë ì¶ê°ìµì íì´í 35486 */ 35487 getCurrentAddOptionTitle: function(aAddOption) { 35488 var aAddOptionTitle = []; 35489 35490 EC$.each(aAddOption, function(iIdx, sValue) { 35491 35492 if (!sValue) { 35493 return true; 35494 } 35495 35496 var sOptionName = add_option_name[iIdx]; 35497 if (sOptionName !== undefined) { 35498 var sAddOptionTitle = sOptionName+NEWPRD_OPTION.DELIMITER_SLASH+sValue; 35499 aAddOptionTitle.push(sAddOptionTitle); 35500 } 35501 35502 }); 35503 35504 var delimeter = ', '; 35505 return (aAddOptionTitle.length > 0) ? aAddOptionTitle.join(delimeter)+delimeter : ''; 35506 }, 35507 35508 /** 35509 * ì ë í¸ ì리먼í¸ì 첫ë²ì§¸ ìµì ì¼ë¡ ë³ê²½
35510 * @param oSelect object ì ë í¸ ìë¦¬ë¨¼í¸ ê°ì²´ 35511 */ 35512 resetSelectElement: function(oSelect) { 35513 return NEWPRD_OPTION.resetSelectElement(oSelect); 35514 }, 35515 35516 /** 35517 * íëª©ë³ ì¶ê°ìµì ì²ë¦¬ë¥¼ìí 모ë ì¶ê°ìµì í목ì í¼ì ì í 35518 */ 35519 setItemAddOptionName: function(frm) { 35520 if (!add_option_name) { 35521 return; 35522 } 35523 35524 frm.append(getInputHidden('item_add_option_name', add_option_name.join(NEWPRD_OPTION.DELIMITER_SEMICOLON))); 35525 }, 35526 35527 /** 35528 * ê°ë³ ì ë ¥ì DOMì 기ì¤ì¼ë¡ íì£¼ë³ ì¶ê° ì ë ¥ìµì ë°ì´í° ìì± 35529 * @param sItemCode 35530 * @param ePerAddOption 35531 * @param frm 35532 */ 35533 setItemPerAddOptionData: function (sItemCode, ePerAddOption, frm) { 35534 var aAddOption = ePerAddOption.not('[name^=addproduct_add_option_name_]').map(function() { 35535 return this.value; 35536 }).get(); 35537 35538 var iLength = aAddOption.length; 35539 35540 if (iLength < 1) { 35541 return; 35542 } 35543 35544 var iAddOptionIndex = this.addItem(sItemCode); 35545 for (var iIdx = 0; iIdx < iLength; iIdx++) { 35546 frm.prepend(getInputHidden('item_option_add[' + sItemCode + '][' + iIdx + ']', aAddOption[iIdx])); 35547 this.addCustomOption(iAddOptionIndex, { 35548 type: 'text', 35549 value: aAddOption[iIdx], 35550 info: add_option_name[iIdx] 35551 }, 'input'); 35552 } 35553 }, 35554 35555 /** 35556 * Formì íì£¼ë³ ì¶ê°ì ë ¥ìµì íë ì¶ê° 35557 * @param oForm 35558 */ 35559 setItemPerAddOptionForm: function (oForm) { 35560 if (this.isUsePerAddOption() === true && this.aCustomData.length > 0) { 35561 oForm.prepend(getInputHidden('custom_data', JSON.stringify(this.aCustomData))); 35562 } 35563 // reset custom data 35564 this.aCustomData = []; 35565 }, 35566 35567 /** 35568 * íëª©ë³ ì¶ê°ìµì ì ì í 35569 * @param sItemCode string í목ì½ë 35570 * @param sItemAddOption string íëª©ë³ ì¶ê°ìµì ì ë ¥ê° 35571 */ 35572 setItemAddOption: function(sItemCode, sItemAddOption, frm) { 35573 35574 if (!add_option_name || !sItemAddOption) { 35575 return; 35576 } 35577 35578 var aAddOption = sItemAddOption.split(NEWPRD_OPTION.DELIMITER_SEMICOLON); 35579 var iLength = aAddOption.length; 35580 35581 if (iLength < 1) { 35582 return; 35583 } 35584 35585 var iAddOptionIndex = this.addItem(sItemCode); 35586 for (var iIdx=0; iIdx<iLength; iIdx++) { 35587 frm.prepend(getInputHidden('item_option_add['+sItemCode+']['+iIdx+']', aAddOption[iIdx])); 35588 this.addCustomOption(iAddOptionIndex, { 35589 type: 'text', 35590 value: aAddOption[iIdx], 35591 info: add_option_name[iIdx] 35592 }, 'input'); 35593 } 35594 }, 35595 35596 /** 35597 * customData ë°ì´í° ì´ê¸°í 35598 */ 35599 initCustomData: function () { 35600 this.aCustomData = []; 35601 }, 35602 35603 /** 35604 * ì¬ì©ìì¶ê°ìµì ìíì´ í¬í¨ëì´ìëì§ íì¸ 35605 * @param sItemCode 35606 * @returns {boolean} 35607 */ 35608 getActiveCustomOption: function (sItemCode) 35609 { 35610 if (typeof add_option_data !== 'undefined') { // ì¶ê°êµ¬ì±ìí 35611 var sProductCode = sItemCode.substr(0,8); 35612 var aAddOptData = CAFE24.UTIL.parseJSON(add_option_data); 35613 for (var iAddProductNo in aAddOptData) { 35614 if (aAddOptData[iAddProductNo].product_code === sProductCode) { 35615 if (typeof add_option_input_addproduct === 'undefined') { // ê°ë³ì ë ¥ ì¶ê°ìµì ìíì´ ìì ê²½ì° 35616 return false 35617 } else if (typeof add_option_input_addproduct[iAddProductNo] === 'undefined') { 35618 return false; 35619 } else if (typeof add_option_input_addproduct[iAddProductNo] !== 'undefined') { 35620 return true; 35621 } 35622 } 35623 } 35624 } 35625 35626 if (typeof add_option_name !== 'undefined' && add_option_name.length > 0 ) { // ìíë³ ê°ë³ ì ë ¥ ìµì 35627 return true; 35628 } 35629 35630 if (typeof add_option_input !== 'undefined') { // í목 ê°ë³ ì ë ¥ ìµì 35631 return true; 35632 } 35633 35634 if (typeof add_option_file_input !== 'undefined') { // í목 ê°ë³íì¼ ì²¨ë¶ ìµì 35635 return true; 35636 } 35637 if (typeof add_option_input_setproduct !== 'undefined') { // ì¸í¸ìí 35638 return true; 35639 } 35640 35641 35642 return false;
35643 }, 35644 /** 35645 * customDataì í목 구ë¶ì ìí í목 ì½ë ì¶ê° í, ì¸ë±ì¤ ë¦¬í´ 35646 * @param {string} sItemCode 35647 */ 35648 addItem: function (sItemCode) { 35649 var bHasData = false; 35650 var iKey = 0; 35651 if (this.aCustomData.length > 0) { 35652 for (var x in this.aCustomData) { 35653 if (this.aCustomData.hasOwnProperty(x) === true && this.aCustomData[x].item_code === sItemCode) { 35654 bHasData = true; 35655 iKey = x; 35656 break; 35657 } 35658 } 35659 } 35660 if (bHasData === false && this.getActiveCustomOption(sItemCode) === true) { 35661 this.aCustomData.push({ 35662 item_code: sItemCode 35663 }); 35664 // last index 35665 iKey = this.aCustomData.length - 1; 35666 } 35667 35668 return iKey; 35669 }, 35670 35671 /** 35672 * aCustomDataì íëª©ë³ ì¶ê°ì ë ¥ / íì¼ ì²¨ë¶ ìµì ì ë³´ ì¶ê° íë ìì 35673 * @param {number} iKey ë°°ì´ ì¸ë±ì¤ 35674 * @param {object} oParam ì ì¡ ë°ì´í° ì ë³´ 35675 * @param {string} sType íì 구ë¶(file/input) 35676 * @returns {boolean} 35677 */ 35678 addCustomOption: function (iKey, oParam, sType) { 35679 if (oParam.value === null) { 35680 return true; 35681 } 35682 if (this.aCustomData.length < 1) { 35683 return true; 35684 } 35685 35686 // object íì ì´ ìëê±°ë custom_option í¤ê° ììë custom optionì ë£ì§ ìëë¡ ì²ë¦¬ 35687 if (typeof this.aCustomData[iKey] !== 'object' && this.aCustomData[iKey].hasOwnProperty('custom_option') === false) { 35688 return true; 35689 } 35690 35691 // íì êµ¬ë¶ 35692 var sKey = sType === 'file' ? 'file_option' : 'item_option_add'; 35693 35694 var oData = { 35695 key: sKey, 35696 type: oParam.type, 35697 value: oParam.value, 35698 info: oParam.info, 35699 }; 35700 35701 if (oParam.item_code !== null && oParam.item_code !== '') { 35702 oData.item_code = oParam.item_code; 35703 } 35704 35705 if (this.aCustomData[iKey].hasOwnProperty('custom_option') === false) { 35706 this.aCustomData[iKey].custom_option = []; 35707 } 35708 35709 this.aCustomData[iKey].custom_option.push(oData); 35710 }, 35711 35712 /** 35713 * íëª©ë³ íì¼ ì²¨ë¶ ìµì ì ë³´ ì¶ê° 35714 * @param aFileList 35715 * @param sTitle 35716 * @param sItemCode 35717 */ 35718 addCustomFile: function (aFileList, sTitle, sItemCode) { 35719 if (aFileList.length === 0) return; 35720 35721 var aValue = []; 35722 35723 // í목 ì¶ê° 35724 var iAddOptionIndex = this.addItem(sItemCode); 35725 EC$.each(aFileList, function (iKey, oValue) { 35726 aValue.push({ 35727 path: oValue.path, 35728 name: oValue.name, 35729 }); 35730 }); 35731 35732 // í´ë¹ í목ì íì¼ ì²¨ë¶ ìµì í목 ì¶ê° 35733 this.addCustomOption(iAddOptionIndex, { 35734 type: 'path', 35735 value: aValue, 35736 info: sTitle 35737 }, 'file'); 35738 }, 35739 35740 pushFileList: function (sId, oData) { 35741 // ìíë³ íì¼ì²¨ë¶ìµì ìíì ê²½ì° ê¸°ì¡´ë¡ì§ì¼ë¡ option_attached_file_info_json ì¬ì©íëë¡ 35742 if (typeof add_option_file_input === 'undefined') { 35743 return true; 35744 } 35745 var eOptionBox = EC$('.option_box_id'); 35746 var iOptionBoxLength = eOptionBox.length > 0 ? eOptionBox.length - 1 : 0; 35747 // íëª©ë³ íì¼ ì ë¡ë 35748 if (typeof add_option_file_input !== 'undefined' && has_option === 'T') { 35749 var sItemCode = sId.replace('file_option_', ''); 35750 if (Olnk.isLinkageType(sOptionType) === true) { 35751 sItemCode = Olnk.getCustomOptionItemCode(sProductCode, iOptionBoxLength, sItemCode.split('_').pop()); 35752 } 35753 NEWPRD_ADD_OPTION.addCustomFile(oData[sId].files, oData[sId].title, sItemCode); 35754 return true; 35755 } 35756 35757 // ì°ëí ìµì ì¼ë(í목ìë§í¼ íì¼ ë³µì¬ ì²ë¦¬) 35758 if (Olnk.isLinkageType(sOptionType) === true) { 35759 eOptionBox.each(function (i) { 35760 var sItemCode = sProductCode + '000A_' + (i + 1); 35761 NEWPRD_ADD_OPTION.addCustomFile(oData[sId].files, oData[sId].title, sItemCode); 35762 }); 35763 return true; 35764 } 35765 // ìµì ì´ ììë 35766 var aItemCode = ITEM.getItemCode();
35767 for (var iKey in aItemCode) { 35768 NEWPRD_ADD_OPTION.addCustomFile(oData[sId].files, oData[sId].title, aItemCode[iKey]); 35769 } 35770 }, 35771 35772 /** 35773 * íëª©ë³ ì¶ê°ì ë ¥ìµì /íì¼ì²¨ë¶ ìµì ì ë£ê¸° ìí´ ìµì¢ ì¸ë±ì¤ ì¡°í 35774 * @returns {number} 35775 */ 35776 getLastIndex: function () { 35777 return this.aCustomData.length > 0 ? this.aCustomData.length - 1 : 0; 35778 }, 35779 35780 /** 35781 * í목기ë°ì ì¶ê°ìµì íì ì ì¬ì©í´ì¼íëì§ 35782 * @returns bool í목기ë°ì ì¶ê°ìµì ì´ë©´ true ìëë©´ false 35783 */ 35784 isItemBasedAddOptionType: function() { 35785 // ìµì ì´ ììë 35786 if (has_option !== 'T') { 35787 return false; 35788 } 35789 35790 // ë´ì¤í¨ì´ ìëë 35791 if (isNewProductSkin() !== true) { 35792 return false; 35793 } 35794 35795 // ì°ëí ìµì ì¼ë (ì ì:sOptionType) 35796 if (Olnk.isLinkageType(sOptionType) === true) { 35797 return false; 35798 } 35799 35800 return true; 35801 }, 35802 35803 isValidAddOptionSelect: function(frm, bIsSetProduct) { 35804 var bReturn = true; 35805 var iCount = 0; 35806 var sMsg = ''; 35807 var oObject = null; 35808 35809 EC$('input[class^="option_add_box_"][name="basket_add_product[]"]').each(function() { 35810 var sAddOptionId = EC$(this).attr('id').replace('_id',''); 35811 var iAddProductNo = parseInt(EC$(this).attr('class').substr(EC$(this).attr('class').lastIndexOf('_')+1)); 35812 var iQuantity = EC$('#'+sAddOptionId+'_quantity').val(); 35813 var sItemCode = EC$(this).val(); 35814 EC$('select[name="addproduct_option_name_'+iAddProductNo+'"][required="true"]').filter(':visible').each(function() { 35815 if (EC$(this).val() === '*' || EC$(this).val() === '**') { 35816 sMsg = __('íì ìµì ì ì íí´ì£¼ì¸ì.'); 35817 oObject = EC$(this); 35818 bReturn = false; 35819 return false; 35820 } 35821 }); 35822 if (bReturn === false) { 35823 return false; 35824 } 35825 35826 if (bIsSetProduct === true) { 35827 bResult = ProductSetAction.checkAddProductAddOption('addproduct_add_option_id_'+iAddProductNo); 35828 } else { 35829 bResult = checkAddOption('addproduct_add_option_id_'+iAddProductNo); 35830 } 35831 if (bReturn === false) { 35832 return false; 35833 } 35834 35835 var addProductCode = sItemCode.split("||")[0].replace("#$%", "|"); 35836 var iAddOptionIndex = NEWPRD_ADD_OPTION.addItem(addProductCode); 35837 var sSelectedAddItem = iQuantity+'||'+sItemCode; 35838 var oElement = EC$('input[name="addproduct_add_option_name_' + iAddProductNo + '"]').filter(':visible'); 35839 35840 if (oElement.length > 0) { 35841 if (oSingleSelection.isItemSelectionTypeS() === false) { 35842 oElement = oElement.filter('[add_product_code="' + addProductCode + '"]'); 35843 } 35844 35845 oElement.each(function (key) { 35846 var sTitle = EC$('input[name=addproduct_add_option_id_' + iAddProductNo + '_' + (key + 1) + ']').val(); 35847 var oSelf = EC$(this); 35848 var sInputValue = oSelf.val(); 35849 var sAddProductCode = oSelf.attr('add_product_code'); 35850 NEWPRD_ADD_OPTION.addCustomOption(iAddOptionIndex, { 35851 type: 'text', 35852 value: sInputValue, 35853 info: sTitle, 35854 item_code: sAddProductCode 35855 }, 'input'); 35856 }); 35857 sSelectedAddItem = iQuantity + '||' + sItemCode; 35858 } 35859 frm.append(getInputHidden('selected_add_item[]', sSelectedAddItem)); 35860 35861 iCount++; 35862 }); 35863 35864 return {'result': bReturn, 'count': iCount, 'message': sMsg, 'object': oObject}; 35865 }, 35866 35867 isValidRelationProductSelect: function(frm, oObj, bIsMainProductCheck) { 35868 var bReturn = true; 35869 var iCount = 0; 35870 var sMsg = ''; 35871 var oObject = null; 35872 var sFailType = ''; 35873 35874 EC$('input[name="basket_info[]"]:checked').each(function() { 35875 var iRelationProductNum = EC$(this).val().substr(0, EC$(this).val().indexOf('|')); 35876 var eQuantity = EC$('#quantity_' + iRelationProductNum); 35877 var eOption = EC$('select[name="option_' + iRelationProductNum + '[]"]'); 35878 35879 var aValue = EC$(this).val().split('|'); 35880 var sOptionType = aValue[6]; // appShopUtilNewProductFetchRelation::getCheckboxForm참조 35881 var sIsAddOptionName = aValue[8]; //ê´ë ¨ìí ì¶ê°ìµì ì¬ë¶ 35882 var sRelationProductName = decodeURIComponent(aValue[4]); //ê´ë ¨ìíëª 35883 var sIsProductPriceContent = aValue[9]; //ê´ë ¨ìí íë§¤ê° ë체문구 35884 var user_option_id = 'user_option_'; //ê´ë ¨ìí ì¶ê°ìµì id 35885 35886 if (sIsProductPriceContent === 'T') { 35887 sMsg = sprintf(__('%s ìíì 구매í ì ìë ìíì´ ìëëë¤.'), sRelationProductName); 35888 NEWPRD_ADD_OPTION.checkVaildRelationProductObject(oObj, sMsg, bIsMainProductCheck, this); 35889 sFailType = 'bProductPriceContent'; 35890 oObject = EC$(this); 35891 iCount++; 35892 bReturn = false;
35893 return false; 35894 } 35895 35896 if (NEWPRD_ADD_OPTION.checkVaildRelationProductQuantity(iRelationProductNum, this) === false) { 35897 sFailType = 'bRelationQuantity'; 35898 oObject = EC$(this); 35899 iCount++; 35900 bReturn = false; 35901 return false; 35902 } 35903 35904 var addOptionItemCode = ''; 35905 if (eQuantity.attr('item_code')) { 35906 // ë¨íì¸ê° 35907 frm.append(getInputHidden('relation_item[' + iCount + ']', eQuantity.val()+'||'+eQuantity.attr('item_code'))); 35908 addOptionItemCode = eQuantity.attr('item_code'); 35909 iCount++; 35910 } else { 35911 // íëª©ì´ ìëê° 35912 bReturn = true; 35913 // ì¡°í©/ë¶ë¦¬ íì ê²½ì° value_mapperê° ìì´ì¼íë¤. ìì¼ë©´ ê°ì ì°ê³ ìì´ì undefinedê° ë¨ë©´ catch를 ì¤í - ìµì§ì½ëì. 35914 try { 35915 var aOptionMapper; 35916 var rawData = window["sOptionValueMapper" + iRelationProductNum]; 35917 if (rawData !== undefined) { 35918 aOptionMapper = CAFE24.UTIL.parseJSON(rawData); 35919 } 35920 35921 var aOptionValue = new Array(); 35922 eOption.each(function() { 35923 if (EC$(this).is('[required="true"]') === true && (EC$(this).val() == '*' || EC$(this).val() == '**')) { 35924 sMsg = __('íì ìµì ì ì íí´ì£¼ì¸ì.'); 35925 NEWPRD_ADD_OPTION.checkVaildRelationProductObject(oObj, sMsg, bIsMainProductCheck, this); 35926 sFailType = 'sRequiredVaild'; 35927 oObject = EC$(this); 35928 iCount++; 35929 bReturn = false; 35930 return false; 35931 } else { 35932 aOptionValue.push(EC$(this).val()); 35933 } 35934 }); 35935 sOptionValue = aOptionValue.join('#$%'); 35936 var sItemCode = aOptionMapper[sOptionValue]; 35937 } catch (e) { 35938 eOption.each(function() { 35939 if (EC$(this).is('[required="true"]') === true && (EC$(this).val() == '*' || EC$(this).val() == '**')) { 35940 sMsg = __('íì ìµì ì ì íí´ì£¼ì¸ì.'); 35941 NEWPRD_ADD_OPTION.checkVaildRelationProductObject(oObj, sMsg, bIsMainProductCheck, this); 35942 sFailType = 'sRequiredVaild'; 35943 oObject = EC$(this); 35944 iCount++; 35945 bReturn = false; 35946 return false; 35947 } 35948 }); 35949 var sItemCode = eOption.val(); 35950 } 35951 if (bReturn === true) { 35952 35953 if (Olnk.isLinkageType(eQuantity.attr('option_type')) === false) { 35954 if (sOptionType === 'F') { 35955 // ë 립í 35956 var aIndividualItemCode = []; 35957 eOption.each(function() { 35958 var _sIndividualItemCode = EC$(this).val(); 35959 frm.append(getInputHidden('relation_item[' + iCount + ']', eQuantity.val() + '||' + _sIndividualItemCode)); 35960 aIndividualItemCode.push(_sIndividualItemCode); 35961 iCount++; 35962 }); 35963 addOptionItemCode = aIndividualItemCode.join('|'); 35964 } else { 35965 // ì¡°í©í 35966 frm.append(getInputHidden('relation_item[' + iCount + ']', eQuantity.val()+'||'+sItemCode)); 35967 addOptionItemCode = sItemCode; 35968 iCount++; 35969 } 35970 } else { 35971 // ì°ëí 35972 var _sProductCode = eQuantity.attr('product_code'); 35973 var _iQuantity = eQuantity.val(); 35974 35975 var _sItemCode = _sProductCode + '000A';
35976 var _aItemValueNo = Olnk.getSelectedItemForBasket(_sProductCode, eOption, _iQuantity); 35977 35978 frm.append(getInputHidden('relation_item[' + iCount + ']', _iQuantity+'||'+_sItemCode)); 35979 frm.append(getInputHidden('relation_item_by_etype[' + iCount + ']', EC$.toJSON(_aItemValueNo))); 35980 35981 addOptionItemCode = _sItemCode; 35982 iCount++; 35983 } 35984 } else { 35985 return false; 35986 } 35987 } 35988 35989 if (typeof(rel_add_option_data) !== 'undefined' && CAFE24.UTIL.trim(rel_add_option_data) !== '') { 35990 var aRelAddOptData = CAFE24.UTIL.parseJSON(rel_add_option_data); 35991 var sRelAddOptName = '' + aRelAddOptData[iRelationProductNum] + ''; 35992 var aRelAddOptNameData = sRelAddOptName.split('#$%'); 35993 } 35994 35995 if (sIsAddOptionName === 'T' && EC$(aRelAddOptNameData).length > 0) { 35996 var iAddOptionIndex = NEWPRD_ADD_OPTION.addItem(addOptionItemCode); 35997 EC$(aRelAddOptNameData).each(function(iRelationIndex) { 35998 var sAddOptionKey = iRelationProductNum + '_' + iRelationIndex; 35999 var sRelAddOptionId = '#' + user_option_id + sAddOptionKey; 36000 36001 var eRelAddOption = EC$(sRelAddOptionId); 36002 if (CAFE24.UTIL.trim(eRelAddOption.val()) === '') { 36003 if (eRelAddOption.attr('require') === 'T') { 36004 sMsg = __('ì¶ê° ìµì ì ì ë ¥í´ì£¼ì¸ì.'); 36005 NEWPRD_ADD_OPTION.checkVaildRelationProductObject(oObj, sMsg, bIsMainProductCheck, sRelAddOptionId); 36006 oObject = eRelAddOption; 36007 sFailType = 'sRelAddOptionValid'; 36008 bReturn = false; 36009 return false; 36010 } 36011 } 36012 36013 NEWPRD_ADD_OPTION.addCustomOption(iAddOptionIndex, { 36014 type: 'text', 36015 value: eRelAddOption.val(), 36016 info: aRelAddOptNameData[iRelationIndex] 36017 }, 'input'); 36018 frm.append(getInputHidden('rel_option_add[' + sAddOptionKey + ']', eRelAddOption.val())); 36019 frm.append(getInputHidden('rel_add_option_name[' + sAddOptionKey + ']',aRelAddOptNameData[iRelationIndex])); 36020 }); 36021 if (bReturn === false) { 36022 return false; 36023 } 36024 } 36025 }); 36026 36027 if (EC$('input[name="basket_info[]"]:checked').length >= 0) { 36028 frm.append(getInputHidden('relation_product', 'yes')); 36029 } 36030 36031 return {'result': bReturn, 'count': iCount, 'message': sMsg, 'object': oObject, 'sFailType': sFailType}; 36032 }, 36033 36034 /** 36035 * ë¨ë 구매 ê´ë ¨ ì í¨ì± ê²ì¦ 36036 */ 36037 checkVaildIndividualMsg: function(oValidResultData, sBuyType, oObject) 36038 { 36039 var bReturn = true; 36040 var sBuyValidMsg = '본ìíì ìµì ì´ ì íëì§ ìììµëë¤. \n ì íí ìíë§ êµ¬ë§¤íìê² ìµëê¹?'; 36041 var sCartValidMsg = '본ìíì ìµì ì´ ì íëì§ ìììµëë¤. \n ì íí ìíë§ ì¥ë°êµ¬ëì ë´ì¼ìê² ìµëê¹?'; 36042 var sBuyTypeMessage = (sBuyType == true) ? sBuyValidMsg : sCartValidMsg; 36043 36044 if (this.checkRelationProduct(oObject) === false) { 36045 bReturn = false; 36046 return false; 36047 } 36048 36049 if (oValidResultData.sFailType !== '') { 36050 bReturn = false; 36051 return false; 36052 } 36053 36054 if (confirm(__('' + sBuyTypeMessage + '')) === false) { 36055 bReturn = false; 36056 return false; 36057 } 36058 36059 return bReturn; 36060 }, 36061 36062 /** 36063 * ë¨ë 구매 ê´ë ¨ ë°ì´í° ê²ì¦ 36064 */ 36065 getIndividualValidCheckData: function(oValidRelationProduct, oValidAddProduct, bIsMainProductEmpty, frm) 36066 { 36067 var bIsCheckRelationProduct = (oValidRelationProduct.count > 0) ? true : false; 36068 var bIsCheckAddProduct = (oValidAddProduct.count > 0) ? true : false;
36069 var bIsIndividual = false; 36070 // ë©ì¸ìíì ì¡´ì¬ì¬ë¶ 36071 if (isNewProductSkin() === true && bIsMainProductEmpty === true) { 36072 if (is_individual_buy === 'T') { 36073 bIsIndividual = (bIsCheckAddProduct === true || bIsCheckRelationProduct === true) ? true : false; 36074 } else { 36075 if (bIsCheckAddProduct === false) { 36076 bIsIndividual = bIsCheckRelationProduct; 36077 } 36078 } 36079 } 36080 var bIndividualBuyResult = (bIsIndividual === true) ? 'T' : 'F'; 36081 frm.append(getInputHidden('is_individual', bIndividualBuyResult)); 36082 36083 return { 36084 'isValidInidual': bIsIndividual, 36085 'isVaildRelationProduct': bIsCheckRelationProduct, 36086 'isVaildAddProduct': bIsCheckAddProduct, 36087 'sFailType': oValidRelationProduct.sFailType 36088 }; 36089 }, 36090 36091 /** 36092 * ê´ë ¨ìí ì íì¬ë¶ íì¸ 36093 */ 36094 checkRelationProduct: function(oObj, sType) 36095 { 36096 var aActionType = [1, 2]; 36097 36098 if (EC$.inArray(sType, aActionType) === -1) { 36099 return true; 36100 } 36101 36102 // @see ECHOSTING-358854 36103 // ê´ë ¨ìí 구매í 모ëìì ê´ë ¨ìíì´ ì íëì§ ìëë¼ë 본ìíì´ ë¨íì´ë¼ë©´ 구매(ì¥ë°êµ¬ë)ê° ê°ë¥í´ì¼ í¨ 36104 if (typeof(oObj) === 'undefined' && EC$('input[name="basket_info[]"]:checkbox:checked').length <= 0 && has_option !== 'F') { 36105 alert(__('ìíì ì íí´ì£¼ì¸ì.')); 36106 return false; 36107 } 36108 36109 return true; 36110 }, 36111 36112 /** 36113 * ê´ë ¨ìí ì¶ê°ìµì ê¸ìì ì í ì²´í¬ 36114 */ 36115 checkProductAddOptionWord: function (oObj) 36116 { 36117 var iLimit = EC$(oObj).attr('maxlength'); 36118 var sId = EC$(oObj).attr('id'); 36119 var sVal = EC$(oObj).val(); 36120 var iStrLen = sVal.length; 36121 36122 if (iStrLen > iLimit) { 36123 alert(sprintf(__('ë©ì¸ì§ë %sì ì´íë¡ ì ë ¥í´ì£¼ì¸ì.'), iLimit)); 36124 EC$('#'+sId).val(sVal.substr(0, sVal.length-1)); 36125 return; 36126 } 36127 36128 EC$('#'+sId).parent().find('.txtLength').text(iStrLen); 36129 }, 36130 36131 /** 36132 * ë©ì¸ìí ì¬ë¶íì¸ì ë°ë¥¸ ì¼ë¿ë©ìì§ ë ¸ì¶ ì²ë¦¬ 36133 */ 36134 checkVaildRelationProductObject: function(oObj, sMessage, bIsMainProductCheck, oSelected) 36135 { 36136 if (isNewProductSkin() === true && this.checkRelationProduct(oObj) === true && (bIsMainProductCheck === true || this.isSoldOutMainProduct() === true)) { 36137 alert(sMessage); 36138 EC$(oSelected).focus(); 36139 } 36140 }, 36141 36142 /** 36143 * 본ìíì íì ìì´ì½ì´ ì¡´ì¬íê³ ì¶ê°êµ¬ì±ìíì ë¨ë 구매 ì¬ë¶ ë° ê´ë ¨ìí 36144 */ 36145 checkSoldOutProductValid: function(oObj) 36146 { 36147 if (NEWPRD_ADD_OPTION.isSoldOutMainProduct() === true) { 36148 if (EC$('input[class^="option_add_box_"][name="basket_add_product[]"]').length > 0 || EC$('input[name="basket_info[]"]:checkbox:checked').length > 0) { 36149 return true; 36150 } else { 36151 return false; 36152 } 36153 } else if (isNewProductSkin() === true && is_soldout_icon === 'T' && this.checkRelationProduct(oObj) === true) { 36154 return true; 36155 } 36156 36157 return false; 36158 }, 36159 36160 /** 36161 * 본ìíì íì ì¬ë¶ (íë§¤ê° ë체문구 ë° í매ìí¨ ìí) 36162 */ 36163 isSoldOutMainProduct: function() 36164 { 36165 if (isNewProductSkin() === true && (is_soldout_icon === 'T' || product_price_content == true)) { 36166 return true; 36167 } 36168 36169 return false; 36170 }, 36171 36172 /** 36173 * ê´ë ¨ìí ìë ì²´í¬ ì í¨ì± ê²ì¦ 36174 */ 36175 checkVaildRelationProductQuantity: function(iRelationProductNum) 36176 { 36177 var bReturn = true; 36178 var aQuantityInfo = CAFE24.UTIL.parseJSON(relation_product); 36179 var sRelationQuantityId = 'quantity_' + iRelationProductNum; 36180 var oProductQuantity = EC$('input[id^= "'+ sRelationQuantityId +'"]'); 36181 var iRelationQuantity = oProductQuantity.val(); 36182 36183 var iProductMinimum = parseInt(aQuantityInfo[iRelationProductNum].product_min, 10); 36184 var iProductMaximum = parseInt(aQuantityInfo[iRelationProductNum].product_max, 10); 36185 36186 if (iRelationQuantity > iProductMaximum && iProductMaximum > 0) { 36187 alert(sprintf(__('ìµë 주문ìëì %sê° ì ëë¤.'), iProductMaximum)); 36188 oProductQuantity.val(iProductMaximum); 36189 EC$(oProductQuantity).focus(); 36190 return false;
36191 } 36192 36193 if (iRelationQuantity < iProductMinimum) { 36194 alert(sprintf(__('ìµì 주문ìëì %sê° ì ëë¤.'), iProductMinimum)); 36195 oProductQuantity.val(iProductMinimum); 36196 EC$(oProductQuantity).focus(); 36197 return false; 36198 } 36199 36200 if (bReturn === false) { 36201 return false; 36202 } 36203 36204 return bReturn; 36205 }, 36206 36207 /** 36208 * 구ì¤í¨ > ê´ë ¨ìí ë° ì¶ê° 구ì±ìíì© ì í¨ì± ê²ì¦ ë©ìì§ 36209 */ 36210 checkExistingValidMessage: function(oObj, oAddProductCount) 36211 { 36212 var sValidMsg = false; 36213 36214 // ë´ì¤í¨ì ê´ê³ ìì 36215 if (isNewProductSkin() === true) { 36216 return sValidMsg; 36217 } 36218 36219 if (typeof(oObj) === 'undefined') { 36220 sValidMsg = __('본ìíê³¼ í¨ê» êµ¬ë§¤ê° ê°ë¥í©ëë¤. \n 본ìíì íì ìµì ì ì íí´ ì£¼ì¸ì.'); 36221 } else if (oAddProductCount.count > 0) { 36222 //ì¶ê°êµ¬ì±ìíì ì íëì´ìì¼ë©´ì 본ìíì ìµì ì´ ì í ìëììë 36223 sValidMsg = __('본ìíì íì ìµì ì ì íí´ ì£¼ì¸ì'); 36224 } 36225 36226 return sValidMsg; 36227 }, 36228 36229 /** 36230 * ê´ë ¨ìí ë° ë¨ë ê¸°ë¥ ì¬ì© ì¶ê°êµ¬ì± ìíì ì í¨ì± ê²ì¦ì í´ë¹íë ë©ìì§ì ë ¸ì¶ì¬ë¶ ê²°ì 36231 */ 36232 checkIndividualValidAction: function(oRelationProductCount, oAddProductCount) 36233 { 36234 var bIsCheckValid = true; 36235 // 구ì¤í¨ì ê´ê³ ìì 36236 if (isNewProductSkin() === false) { 36237 return bIsCheckValid; 36238 } 36239 36240 if (is_individual_buy === 'T') { 36241 bIsCheckValid = (oAddProductCount.result === false || oRelationProductCount.result === false) ? false : true; 36242 if (bIsCheckValid === false && oAddProductCount.message !== '') { 36243 alert(oAddProductCount.message); 36244 return false; 36245 } 36246 } else { 36247 bIsCheckValid = (oRelationProductCount.result === false) ? false : true; 36248 } 36249 36250 return bIsCheckValid; 36251 }, 36252 36253 checkPerAddInputOption: function () { 36254 if (EC$('.input_peraddoption').filter(':visible').length === 0) { 36255 return true; 36256 } 36257 36258 return this.validateAddOptionForm(EC$('.input_peraddoption')); 36259 }, 36260 36261 validateAddOptionForm: function(oTargetElement) { 36262 var bResult = true; 36263 oTargetElement.filter(':visible').each(function() 36264 { 36265 var eSelf = EC$(this); 36266 if (eSelf.attr('require') !== false && eSelf.attr('require') === 'T') { 36267 if (eSelf.val().replace(/^[\s]+|[\s]+$/g, '').length === 0) { 36268 alert(__('ì¶ê° ìµì ì ì ë ¥í´ì£¼ì¸ì.')); 36269 eSelf.focus(); 36270 bResult = false;
36271 return false; 36272 } 36273 } 36274 }); 36275 36276 return bResult; 36277 }, 36278 36279 getPerItemCode: function(iIndex, sItemCode) 36280 { 36281 return Olnk.isLinkageType(sOptionType) === true ? sProductCode + '000A_' + (iIndex - 1) : sItemCode; 36282 }, 36283}; 36284EC$(function() { 36285 // íì¼ì²¨ë¶ìµì ì´ê¸°í 36286 try { 36287 FileOptionManager.init(); 36288 } catch (e) {} 36289}); 36290 36291 36292/** 36293 * JSON.stringify 36294 * @param object aData JSON.stringify í ë°ì´í° 36295 * @return string JSON.stringify ë ë°ì´í° ë°í 36296 */ 36297function JSON_stringify(aData) 36298{ 36299 if (!EC$.stringify) { 36300 // https://gist.github.com/chicagoworks/754454 36301 EC$.extend({ 36302 stringify: function stringify(obj) { 36303 if ("JSON" in window) { 36304 return JSON.stringify(obj); 36305 } 36306 36307 var t = typeof (obj); 36308 if (t != "object" || obj === null) { 36309 // simple data type 36310 if (t == "string") obj = '"' + obj + '"'; 36311 36312 return String(obj); 36313 } else { 36314 // recurse array or object 36315 var n, v, json = [], arr = (obj && obj.constructor == Array); 36316 36317 for (n in obj) { 36318 v = obj[n]; 36319 t = typeof(v); 36320 if (obj.hasOwnProperty(n)) { 36321 if (t == "string") { 36322 v = '"' + v + '"'; 36323 } else if (t == "object" && v !== null) { 36324 v = EC$.stringify(v); 36325 } 36326 36327 json.push((arr ? "" : '"' + n + '":') + String(v)); 36328 } 36329 } 36330 36331 return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); 36332 } 36333 } 36334 }); 36335 } 36336 36337 return EC$.stringify(aData); 36338} 36339 36340/** 36341 * FileOptionManager 36342 * íì¼ìµì ê°ì²´ë¥¼ ê´ë¦¬íë class - íì´ì§ ë´ì íì¼ì²¨ë¶ ìµì ì 체를 ê´ì¥ 36343 * @author 백충ë <[email protected]> 36344 */ 36345var FileOptionManager = { 36346 bIsInputFileSupport: null, 36347 /** 36348 * FileOption ê°ì²´ 리ì¤í¸ 36349 * @var object 36350 */ 36351 aList: {}, 36352 36353 /** 36354 * ì´ê¸°í 36355 * - FileOptionManager.add()를 íµí´ ì¶ê°ë FileOption ê°ì²´ ì´ê¸°í ì²ë¦¬ 36356 */ 36357 init: function() 36358 { 36359 // íëª©ë³ íì¼ ì²¨ë¶ì 기본 íì¼ì²¨ë¶ ìµì ì ê±° 36360 if (typeof add_option_file_input !== 'undefined' && has_option === 'T') { 36361 if (FileOptionManager.aList.hasOwnProperty('file_option') === true) { 36362 delete FileOptionManager.aList['file_option']; 36363 } 36364 } 36365 36366 // 모ë°ì¼ ìµì ìë ìíìì ëìì¸ì íì¼ì²¨ë¶ HTMLì´ ìì ë ëì ìì± 36367 if (typeof EC_MOBILE !== 'undefined' && EC_MOBILE === true && typeof add_option_file_input !== 'undefined' && has_option === 'F') { 36368 if (EC$('#file_option').length === 0) { 36369 var sHtml = '<tr class="xans-element- xans-product xans-product-fileoption xans-record-">' + 36370 '<th scope="row">' + add_option_file_input.file_option_name + '</th>' + 36371 '<td class="fileInfo">' + 36372 add_option_file_input['form.file_option'] + 36373 '<ul class="ec-base-help typeDash">' + 36374 '<li>' + sprintf(__('íì¼ì ìµë 5ê°ê¹ì§ %sM ì´íë¡ ê°ë³ì ë¡ë ê°ë¥í©ëë¤.'), add_option_file_input.file_option_limit) + '</li>' + 36375 '</ul>' + 36376 '<ul id="ul_file_option"></ul>' + 36377 '</td>' + 36378 '</tr>'; 36379 36380 var eQuantityTr = EC$('tr').has('[name="quantity_opt[]"]').first(); 36381 if (eQuantityTr.length > 0) { 36382 eQuantityTr.before(sHtml); 36383 } else { 36384 EC$('#totalProducts table tbody').append(sHtml); 36385 } 36386 } 36387 } 36388 36389 for (var sId in this.aList) { 36390 if (this.aList.hasOwnProperty(sId)===false) continue; 36391 36392 // ì´ê¸°í ê³¼ì ì 문ì ê° ì긴 ê°ì²´ë 리ì¤í¸ìì ì ê±° 36393 if (this.aList[sId].init() === false) delete this.aList[sId]; 36394 } 36395 }, 36396 36397 /**
36398 * íì¼ì ë¡ëì© input:fileì change ì´ë²¤í¸ í¸ë¤ë¬ 36399 * @param object eFileInput change ì´ë²¤í¸ê° ë°ìí input:file 36400 */ 36401 onChange: function(eFileInput) 36402 { 36403 var sId = eFileInput.id; 36404 this.aList[sId].onChange(eFileInput); 36405 }, 36406 36407 /** 36408 * 리ì¤í¸ì sInputId, aOpt íë¼ë©í°ë¡ ìì±í FileOption ê°ì²´ ì¶ê° 36409 * @param string sId ê³ ì ID (input:fileì idë¡ë ì°ì) 36410 * @param object aOpt ìì± íë¼ë©í° 36411 */ 36412 add: function(sId, aOpt) 36413 { 36414 this.aList[sId] = new FileOption(sId, aOpt); 36415 }, 36416 36417 /** 36418 * 리ì¤í¸ì sInputId, aOpt ë¡ FileOption ê°ì²´ ìì± ë° ì´ê¸°í 36419 * @param {string} sId ê³ ì ID (input:fileì idë¡ë ì°ì) 36420 * @param {object} aOpt ìì± íë¼ë¯¸í° 36421 */ 36422 put: function(sId, aOpt) 36423 { 36424 // ëì¼í ê°ì²´ê° ìì ê²½ì° ìì 36425 this.remove(sId); 36426 this.add(sId, aOpt); 36427 if (this.aList[sId].init() === false) delete this.aList[sId]; 36428 }, 36429 36430 /** 36431 * ì ë¡ëí´ì¼ í input:fileì´ ìëì§ ì²´í¬ 36432 * @param mixed mId ì ë¡ë í´ì¼í íì¼ì´ ìëì§ ì²´í¬í FileOption id. ìê±°ë íë í¹ì ì¬ë¬ê°. 36433 * @return bool íì¼ì ë¡ëê° ìì¼ë©´ true, ìëë©´ false 36434 */ 36435 existsFileUpload: function(mId) 36436 { 36437 var aId = this._getList(mId); 36438 36439 for (var i=0; i<aId.length; i++) { 36440 var sId = aId[i]; 36441 36442 // ì ë¡ëí´ì¼ í íì¼ ìì 36443 if (this.aList[sId].existsFileUpload() === true) return true; 36444 } 36445 36446 return false; 36447 }, 36448 36449 /** 36450 * ì í¨ì± ì²´í¬ 36451 * @param mixed mId ì í¨ì± ì²´í¬í FileOption id. ìê±°ë íë í¹ì ì¬ë¬ê°. 36452 * @return bool ì í¨íë©´ true, ìëë©´ false 36453 */ 36454 checkValidation: function(mId) 36455 { 36456 var aId = this._getList(mId); 36457 36458 // ì í¨ì± ì²´í¬ 36459 for (var i=0; i<aId.length; i++) { 36460 var sId = aId[i]; 36461 36462 if (this.aList[sId].checkValidation() === false) return false; 36463 } 36464 36465 return true; 36466 }, 36467 36468 /** 36469 * íì¼ì²¨ë¶ ìµì ì ë¡ë ì¤í 36470 * @param mixed mId íì¼ì ë¡ë를 ì¤íí FileOption id. ìê±°ë íë í¹ì ì¬ë¬ê°. 36471 * @param function callback íì¼ì ë¡ë ìë£ í ì¤íí callback 36472 */ 36473 upload: function(mId, callback) 36474 { 36475 var self = this; 36476 36477 // mId ì§ì íì§ ìì 36478 if (typeof mId === 'function') { 36479 callback = mId; 36480 mId = null; 36481 } 36482 var aId = this._getList(mId); 36483 36484 // ì ë¡ë í´ì¼í input:file ì¶ì¶ 36485 var aFile = []; 36486 var aMaxSize = {}; 36487 for (var i=0; i<aId.length; i++) { 36488 var sId = aId[i]; 36489 aMaxSize[sId] = this.aList[sId].aOpt.maxSize; 36490 36491 this.aList[sId].getInputFileUpload().each(function(idx) { 36492 var sVal = CAFE24.UTIL.trim(EC$(this).val()); 36493 if (sVal.length < 1) return; 36494 36495 aFile.push({ 36496 eFile: EC$(this), 36497 eParent: EC$(this).parent() 36498 }); 36499 }); 36500 } 36501 36502 // ì ë¡ë í íì¼ì´ ìì ê²½ì° ì¤ì§ (ì ë¡ëë ì±ê³µíë¤ê³ ë°í) 36503 if (aFile.length < 1) { 36504 callback(true); 36505 return true; 36506 } 36507 36508 var sTargetName = 'iframe_add_option_file_upload'; 36509 var sAction = '/api/product/fileupload/'; 36510 36511 // form 36512 var form = EC$('<form action="'+sAction+'" method="post" enctype="multipart/form-data" style="display:none;" target="'+sTargetName+'"></form>'); 36513 EC$('body').append(form); 36514 // ì ë¡ëí input:file append 36515 for (var i=0; i<aFile.length; i++) { 36516 aFile[i].eFile.appendTo(form); 36517 } 36518 36519 // 커맨ë ì§ì 36520 EC$('<input type="hidden" name="cmd" value="upload" />').prependTo(form); 36521 // íì¼ ì ë¡ë ì¬ì´ì¦ íê³ 36522 EC$('<input type="hidden" name="max_size" value="'+encodeURIComponent(JSON_stringify(aMaxSize))+'" />').prependTo(form); 36523 36524 // iframe 36525 var iframe = EC$('<iframe src="javascript:false;" name="'+sTargetName+'" style="display:none;"></iframe>'); 36526 EC$('body').append(iframe); 36527 36528 // iframe onload(form.submit response) ì´ë²¤í¸ í¸ë¤ë¬ 36529 iframe.on('load', function() { 36530 var doc = this.contentWindow ? this.contentWindow.document : (this.contentDocument ? this.contentDocument : this.document); 36531 var root = doc.documentElement ? doc.documentElement : doc.body; 36532 var sResult = root.textContent ? root.textContent : root.innerText; 36533 var aResult = CAFE24.UTIL.parseJSON(sResult); 36534 var mReturn = false;
36535 36536 if (typeof aResult==='object') { 36537 // ì ë¡ë ì±ê³µ 36538 if (aResult.err=='') { 36539 // ì ë¡ë ì±ê³µí íì¼ì 보를 ê°ì ¸ì input:hiddenì valueë¡ ì ì¥ 36540 for (var sId in aResult.files) { 36541 var eInputHidden = EC$('#'+sId+'_hidden'); 36542 var aVal = { 36543 title: self.aList[sId].aOpt.name, 36544 files: [] 36545 }; 36546 for (var i=0; i<aResult.files[sId].length; i++) { 36547 aVal.files.push({ 36548 path: aResult.files[sId][i].path, 36549 name: aResult.files[sId][i].name 36550 }); 36551 } 36552 36553 eInputHidden.val(encodeURIComponent(JSON_stringify(aVal))); 36554 36555 // ë°íê° ì¸í 36556 if (mReturn===false) mReturn = {}; 36557 mReturn[sId] = aVal; 36558 } 36559 // ì ë¡ë ì¤í¨ 36560 } else { 36561 alert(aResult.err); 36562 } 36563 } 36564 36565 // file element ìë ìì¹ë¡ ì´ë 36566 for (var i=0; i<aFile.length; i++) { 36567 aFile[i].eFile.appendTo(aFile[i].eParent); 36568 } 36569 36570 // ìì element ìì 36571 form.remove(); 36572 iframe.remove(); 36573 36574 callback(mReturn); 36575 }); 36576 36577 // íì¼ì ì¡ 36578 form.submit(); 36579 }, 36580 36581 /** 36582 * ë¸ë¼ì°ì ê° input file ì§ìì¬ë¶ ë°í 36583 * @return bool input file ì§ìì true, ìëë©´ false 36584 */ 36585 isInputFileSupport: function() 36586 { 36587 if (this.bIsInputFileSupport===null) { 36588 this.bIsInputFileSupport = true; 36589 36590 try { 36591 var eInputFile = document.createElement('input'); 36592 eInputFile.type = 'file'; 36593 eInputFile.style.display = 'none'; 36594 document.getElementsByTagName('body')[0].appendChild(eInputFile); 36595 36596 if (eInputFile.disabled) this.bIsInputFileSupport = false; 36597 } catch (e) { 36598 this.bIsInputFileSupport = false; 36599 } finally { 36600 if (eInputFile) eInputFile.parentNode.removeChild(eInputFile); 36601 } 36602 } 36603 36604 return this.bIsInputFileSupport; 36605 }, 36606 36607 // íë¼ë©í°ë¡ ë기기 ìí´ ì¸ì½ë© 36608 encode: function(sVal) 36609 { 36610 return encodeURIComponent(JSON_stringify(sVal)).replace(/'/g, "%27"); 36611 }, 36612 36613 /** 36614 * ë겨ë°ì idì í´ë¹íë ì í¨í FileOption id 리ì¤í¸ ë°í 36615 * @param mixed mId 리ì¤í¸ë¡ ì¶ì¶í FileOption id. ìê±°ë íë í¹ì ì¬ë¬ê°. 36616 * @return array ì í¨í FileOption id 리ì¤í¸ 36617 */ 36618 _getList: function(mId) 36619 { 36620 var aId = []; 36621 36622 // ì§ì í idê° ìë¤ë©´ ì ì²´ëì 36623 if (!mId) { 36624 for (var sId in this.aList) { 36625 if (this.aList.hasOwnProperty(sId)===false) continue; 36626 36627 aId.push(sId); 36628 } 36629 // ì§ì í idê° ë¬¸ìì´ íë 36630 } else if (typeof mId === 'string') { 36631 aId.push(mId); 36632 // ì§ì í idê° Array(object) 36633 } else { 36634 aId = mId; 36635 } 36636 36637 // ëê° ë¬¸ì ê° ìì ê²½ì° ë¹ ë°°ì´ ë°í 36638 if (Array.isArray(aId)===false || aId.length<1) return []; 36639 36640 // ì í¨í idë§ ì¶ì¶ 36641 var sId = ''; 36642 var aResult = []; 36643 for (var i=0; i<aId.length; i++) { 36644 sId = aId[i]; 36645 if (!(sId in this.aList)) continue; 36646 36647 aResult.push(sId); 36648 } 36649 36650 return aResult; 36651 }, 36652 36653 /** 36654 * ëì¼í ê°ì²´ê° ìì ê²½ì° FileOptionManager.aListìì ê°ì²´ ìì 36655 * @param sId 36656 */ 36657 remove: function(sId) 36658 { 36659 // ëì¼í ê°ì²´ê° ìì ê²½ì° ìì 36660 if (this.aList.hasOwnProperty(sId) === true) { 36661 delete this.aList[sId]; 36662 } 36663 }, 36664 36665 /** 36666 * ë¶ëª¨ì°½ - ììì°½ íì¼ ë¦¬ì¤í¸ ë³µì¬ 36667 */ 36668 sync: function(sId, target) 36669 { 36670 this.aList[sId].sync(sId, target); 36671 } 36672}; 36673 36674/** 36675 * FileOption 36676 * íì¼ìµì class - íì¼ì²¨ë¶ ìµì íëë¹ íëì© 36677 * @author 백충ë <[email protected]> 36678 */ 36679var FileOption = function(sInputId, aParam) 36680{ 36681 this.aOpt = { 36682 inputId: sInputId, 36683 name: null, 36684 maxLen: null, 36685 maxSize: null, 36686 btnDel: '<a href="#none"><img src="//img.echosting.cafe24.com/skin/base_ko_KR/common/btn_attach_close.gif" /></a>', 36687 btnDelSelector: 'a', 36688 eInputFile: null 36689 }; 36690 36691 EC$.extend(this.aOpt, aParam); 36692 36693 var self = this; 36694 36695 /** 36696 * ì´ê¸°í 36697 */ 36698 this.init = function() 36699 { 36700 self.aOpt.eInputFile = EC$('#'+self.aOpt.inputId); 36701 36702 // ì§ì ë id를 ê°ì§ input fileì´ ìì ê²½ì° 36703 if (!self.aOpt.eInputFile) return false;
36704 36705 // íì¼ë¦¬ì¤í¸ ëª©ë¡ ì´ê¸°í 36706 var aFileListContainer = self._getFileListContainer(self.aOpt.inputId); 36707 if (aFileListContainer.length < 1) { 36708 self.aOpt.eInputFile.parent().append('<ul id="'+self._getFileListContainerId(self.aOpt.inputId)+'"></ul>'); 36709 aFileListContainer = self._getFileListContainer(self.aOpt.inputId); 36710 } 36711 36712 // 모ë°ì¼ì ê²½ì° ìì ë²í¼ ë³ê²½ 36713 if (self._isMobileBrowser()===true) { 36714 self.aOpt.btnDel = '<button type="button" class="btnDelete">' + __('ìì ') + '</button></li>'; 36715 self.aOpt.btnDelSelector = 'button.btnDelete'; 36716 } 36717 36718 // ìì ë²í¼ ì´ë²¤í¸ í¸ë¤ë¬ ì¸í 36719 aFileListContainer.on('click', this.aOpt.btnDelSelector, function() { 36720 EC$(this).parent().remove(); 36721 return false; 36722 }); 36723 }; 36724 36725 /** 36726 * íì¼ ì ë ¥í¼ì ì´ê¸°í 36727 * @param jQuery eFile íì¼ ì ë ¥í¼ 36728 */ 36729 this.resetFileInput = function(eFile) 36730 { 36731 // MSIE 36732 if (navigator.appVersion.indexOf('MSIE') > -1) { 36733 eFile.replaceWith(eFile = eFile.clone(true)); 36734 } else { 36735 eFile.val(''); 36736 } 36737 }; 36738 36739 /** 36740 * input:file change ì´ë²¤í¸ í¸ë¤ë¬ 36741 * @param object eFileInput changeì´ë²¤í¸ê° ë°ìí input:file 36742 */ 36743 this.onChange = function(eFileInput) 36744 { 36745 var eFile = EC$(eFileInput); 36746 36747 // ì ë¡ë íì¼ëª 36748 var sFileName = this._getFileName(eFile.val()); 36749 if (sFileName.length<1) return false; 36750 36751 var eFileList = this._getFileListContainer(eFile.attr('id')); 36752 36753 // 첨ë¶íì¼ ìµë ê°¯ì ì í 36754 var iCntFile = eFileList.find('li').length; 36755 if (iCntFile >= this.aOpt.maxLen) { 36756 if (eFile.val().length>0) alert(sprintf(__('첨ë¶íì¼ì ìµë %sê°ê¹ì§ë§ ì ë¡ë ê°ë¥í©ëë¤.'), self.aOpt.maxLen)); 36757 this.resetFileInput(eFile); 36758 return false; 36759 } 36760 36761 // ì ë¡ë íì¼ë¦¬ì¤í¸ ì¶ê° 36762 var eFileItem = EC$('<li>'+sFileName+' '+this.aOpt.btnDel+'</li>'); 36763 var sId = eFile.attr('id'); 36764 var sRequire = eFile.attr('require'); 36765 var sAccept = eFile.attr('accept'); 36766 36767 // IE8 ì´íììë displayê° ë°ëì´ë onChangeê° triggerëë¯ë¡ onChange ì ê±° 36768 eFile.get(0).onchange = null; 36769 36770 eFile.css('display', 'none'); 36771 eFile.attr({ 36772 id: '', 36773 name: this.aOpt.inputId+'[]' 36774 }); 36775 eFileItem.append(eFile); 36776 eFileList.append(eFileItem); 36777 36778 // ì íì¼ì ë¡ë input ë°°ì¹ 36779 var eFileNew = EC$('<input type="file" onchange="FileOptionManager.onChange(this)"/>'); 36780 eFileNew.attr({ 36781 id: sId, 36782 name: sId, 36783 require: sRequire, 36784 accept: sAccept 36785 }); 36786 eFileList.parent().prepend(eFileNew); 36787 36788 // ì ë¡ë ê°ë¥í íì¼ì¸ì§ë¥¼ ë¹ëê¸°ë¡ íì¸ 36789 this.checkUpload(sFileName, eFileItem, String(sAccept)); 36790 }; 36791 36792 /** 36793 * íì¼ì ë¡ë ì ì²´í¬ 36794 * @param string sFileName íì¼ëª 36795 * @param jQuery eFileItem íì¼ ì²¨ë¶ 36796 * @param string sAccept accept ìì±ê° (.jpg,.jpeg,.gif) 36797 */ 36798 this.checkUpload = function(sFileName, eFileItem, sAccept) 36799 { 36800 var self = this; 36801 var sFileExtension = sFileName.replace(/^.+\.([^.]+)$/, '$1'); 36802 if (EC$.inArray('.' + sFileExtension, sAccept.split(',')) > -1) { 36803 // accept ìì±ì í¬í¨ë íì¥ìì¸ ê²½ì° íì¸ ìí¨ 36804 return; 36805 } 36806 36807 EC$.ajax({ 36808 url: "/api/product/fileupload/", 36809 method: "GET", 36810 data: { 36811 cmd: "check_upload", 36812 file_extension: sFileExtension 36813 }, 36814 dataType: "json", 36815 success: function(result) { 36816 if (result && result.err) { 36817 eFileItem.find(self.aOpt.btnDelSelector).click(); 36818 alert(result.err); 36819 } 36820 } 36821 }); 36822 }; 36823 36824 /** 36825 * ì í¨ì± ì²´í¬ 36826 * @return bool ì í¨íë©´ true, ìëë©´ false 36827 */ 36828 this.checkValidation = function() 36829 { 36830 // íì¼ì²¨ë¶ ìµì ì´ 'íì'ê° ìë ê²½ì° OK 36831 if (self.aOpt.eInputFile.attr('require') !== 'T') return true; 36832 36833 // íì¼ì²¨ë¶ ìµì ì´ 'íì'ì¸ë° ì ë¡ë ì í íì¼ì´ ìì ê²½ì° 36834 if (self.existsFileUpload()===false) {
36835 alert(self.aOpt.name+' '+__('íì¼ì ì ë¡ë í´ì£¼ì¸ì.')); 36836 self.aOpt.eInputFile.focus(); 36837 return false; 36838 } 36839 36840 return true; 36841 }; 36842 36843 /** 36844 * ì ë¡ë í´ì¼í input:file 리ì¤í¸ ë°í 36845 * @return array ì ë¡ë í´ì¼í input:file 리ì¤í¸ 36846 */ 36847 this.getInputFileUpload = function() 36848 { 36849 return self._getFileListContainer(self.aOpt.inputId).find('input:file:hidden'); 36850 }; 36851 36852 /** 36853 * ì ë¡ë í´ì¼í input:fileì´ ìëì§ ì¬ë¶ ì²´í¬ 36854 * @return bool ì ë¡ë í´ì¼í input:fileì´ ìì¼ë©´ true, ìì¼ë©´ false 36855 */ 36856 this.existsFileUpload = function() 36857 { 36858 return self.getInputFileUpload().length > 0; 36859 }; 36860 36861 /* 36862 * íì¼ì ë¡ë 리ì¤í¸ë¥¼ ë´ì ë ¸ë ë°í 36863 * @param string sSuffix 36864 * @return element 36865 */ 36866 this._getFileListContainer = function(sSuffix) 36867 { 36868 var sFileListId = self._getFileListContainerId(sSuffix); 36869 36870 return EC$('ul[id="'+sFileListId+'"]'); 36871 }; 36872 36873 /** 36874 * íì¼ì ë¡ë 리ì¤í¸ë¥¼ ë´ì ë ¸ëì ID ë°í 36875 * @param string sSuffix idë¡ ì¬ì©í suffix 36876 * @return string ë ¸ëì ID 36877 */ 36878 this._getFileListContainerId = function(sSuffix) 36879 { 36880 return 'ul_'+sSuffix; 36881 }; 36882 36883 /** 36884 * íì¼ ê²½ë¡ìì íì¼ëª ë§ ì¶ì¶ 36885 * @param string sFilePath íì¼ ê²½ë¡ 36886 * @return mixed ì¶ì¶ë íì¼ëª ë°í, ì¤í¨ì false ë°í 36887 */ 36888 this._getFileName = function(sFilePath) 36889 { 36890 sFilePath = CAFE24.UTIL.trim(sFilePath); 36891 if (sFilePath.length<1) return false; 36892 36893 return CAFE24.UTIL.trim(sFilePath.split('/').pop().split('\\').pop()); 36894 }; 36895 36896 /** 36897 * 모ë°ì¼ ë¸ë¼ì°ì ì¸ì§ ì²´í¬ 36898 * @return bool 모ë°ì¼ ë¸ë¼ì°ì ì´ë©´ true, ìëë©´ false ë°í 36899 */ 36900 this._isMobileBrowser = function() 36901 { 36902 // ì ì isMobile ë³ìê° ì¸í ëì´ìì ê²½ì° isMobile ë³ìê° ë°í 36903 if (typeof isMobile !== 'undefined') { 36904 return isMobile; 36905 // ì ì isMobile ë³ìê° ìì ê²½ì° location.hostnameì¼ë¡ íë³ 36906 } else { 36907 return location.hostname.indexOf('m.')===0; 36908 } 36909 }; 36910 36911 /** 36912 * ë¶ëª¨ì°½ - ììì°½ íì¼ ë¦¬ì¤í¸ ë³µì¬ 36913 */ 36914 this.sync = function(inputId, targetUl) 36915 { 36916 self.aOpt.eInputFile = EC$('#'+inputId); 36917 // íì¼ë¦¬ì¤í¸ ëª©ë¡ 36918 var aFileListContainer = self._getFileListContainer(inputId); 36919 // ì¶ê°ë íì¼ ë¦¬ì¤í¸ ìì ê²½ì° ì²ë¦¬ìí¨ 36920 if (aFileListContainer.find('li').length < 1) return false; 36921 // íì¼ë¦¬ì¤í¸ ë³µì¬ 36922 targetUl.append(aFileListContainer.find('li')); 36923 36924 36925 }; 36926}; 36927 36928EC$(function() { 36929 // ìµê·¼ 본 ìí ì¿ í¤ ì¸í í기 36930 var sPath = document.location.pathname; 36931 var sPattern = /[\/a-zA-Z\-01]{0,7}\/product\/(.+?)\/([0-9]+)(\/.*|)/; 36932 var aMatchResult = sPath.match(sPattern); 36933 36934 if (aMatchResult) { 36935 var iProductNo = aMatchResult[2]; 36936 } else { 36937 var iProductNo = NEWPRODUCT_Recent.getParameterByName('product_no'); 36938 } 36939 36940 var sCookieName = 'recent_plist' + (SHOP.isDefaultShop() ? '' : CAFE24.SDE_SHOP_NUM); 36941 var sCookieVal = EC$.cookie(sCookieName); 36942 36943 EC$.cookie(sCookieName, NEWPRODUCT_Recent.getRecentUnique(iProductNo , sCookieVal), { 36944 'path': '/', 36945 'expires': 365 36946 }); 36947 36948 // ieíì ë²ì ¼ììë ë¡ì»¬ ì¤í ë¦¬ì§ ëì ìí¨ì¼ë¡ ì¸í´ì ìëë ìí¨! 36949 // 기존 ì¿ í¤ ë°©ì ê·¸ëë¡ ì 36950 if (NEWPRODUCT_Recent.getIsLocalStorageAble() === true) { 36951 NEWPRODUCT_Recent.setProductRecentInfo(parseInt(iProductNo, 10)); 36952 } 36953}); 36954 36955var NEWPRODUCT_Recent = 36956 { 36957 iMaxLength: 50, 36958 sStorageKey: 'localRecentProduct' + CAFE24.SDE_SHOP_NUM, 36959 /** 36960 * urlìì íë¼ë¯¸í° ê°ì ¸ì¤ê¸° 36961 * @param string name íë¼ë¯¸í°ëª 36962 * @return string íë¼ë¯¸í° ê° 36963 */ 36964 getParameterByName: function (name) { 36965 name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
36966 var regexS = "[\\?&]" + name + "=([^&#]*)"; 36967 var regex = new RegExp(regexS); 36968 var results = regex.exec(window.location.href); 36969 36970 if (results == null) { 36971 return ''; 36972 } else { 36973 return decodeURIComponent(results[1].replace(/\+/g, " ")); 36974 } 36975 }, 36976 36977 /** 36978 * SEO URL ìì name íë¼ë©í° ê° ê°ì ¸ì¤ê¸°, SEO URL ì´ ìëë©´ getParameterByName ìì ìì² 36979 * @param string name íë¼ë¯¸í°ëª 36980 * @param string sRegexPattern seo url ìì category ê° ê°ì ¸ì¤ê¸° í¨í´ 36981 * @return string íë¼ë¯¸í° ê° 36982 */ 36983 getParameterFromSeoUrl: function (name, sRegexPattern) { 36984 var regex = new RegExp(sRegexPattern); 36985 var results = regex.exec(window.location.href); 36986 36987 if (results == null) { 36988 return NEWPRODUCT_Recent.getParameterByName(name); 36989 } else { 36990 return decodeURIComponent(results[2].replace(/\+/g, " ")); 36991 } 36992 }, 36993 36994 /** 36995 * ìµê·¼ìíë²í¸ 리ì¤í¸ ê°ì ¸ì¤ê¸° 36996 * @param int iProductNo product_no 36997 * @return string 기존 ì¿ í¤ê°ì íì¬ ìí리ì¤í¸ ì¶ê°í ì¿ í¤ê° 36998 */ 36999 getRecentUnique: function (iProductNo, sCookieVal) 37000 { 37001 var newList = []; 37002 var aList = sCookieVal ? sCookieVal.split('|') : []; 37003 37004 for (var i = 0; i < aList.length; i++) { 37005 var sNo = CAFE24.UTIL.trim(aList[i]); 37006 if (sNo == '' || sNo == iProductNo) { 37007 continue; // ì´ë¯¸ ìì¼ë©´ skip... 37008 } 37009 newList.push(sNo); 37010 } 37011 newList.push(iProductNo); 37012 37013 if (newList.length >= this.iMaxLength) { 37014 newList = newList.slice(newList.length - this.iMaxLength); 37015 } 37016 return newList.join('|'); 37017 }, 37018 /** 37019 * ìµê·¼ìí ìíëª ì ì¥ì ìíëª ì르기 37020 * @return string ìíëª 37021 */ 37022 getCutProductName: function() { 37023 var iByte = 0; 37024 var sProductNameTmp = product_name.replace(/(<([^>]+)>)/ig,''); 37025 var iStrLength = product_name.length; 37026 var iMaxItem = 10; 37027 var sProductName = ''; 37028 var iMaxLimit = 10; 37029 37030 // ìíëª ì íê·¸ê° í¬í¨ëì´ ìì§ ìì ê²½ì° 37031 if (sProductNameTmp === '') { 37032 sProductNameTmp = product_name; 37033 } 37034 37035 for (var i=0; i < iStrLength; i++) { 37036 if (escape(sProductNameTmp.charCodeAt(i)).length > 4) { 37037 iByte +=2; //íê¸ì´ë©´ 2를 ëíë¤ 37038 iMaxItem -= 1; 37039 } 37040 if (iByte > iMaxItem) { 37041 sProductName = sProductNameTmp.slice(0,iMaxItem); 37042 break; 37043 } 37044 } 37045 37046 if (sProductName === '') { 37047 sProductName = sProductNameTmp.slice(0,iMaxLimit); 37048 } 37049 return sProductName; 37050 }, 37051 37052 /* 37053 * sessionStorage ì¬ì© 37054 */ 37055 setProductRecentInfo: function (iProductNo) 37056 { 37057 var oJsonData = this.getSessionStorageData(this.sStorageKey); 37058 var iObjectKeyCount = 0; 37059 var sRegexCategoryNumberBySeoUrl = '(\/product\/.+?\/[0-9]+\/category\/)([0-9]+)(\/.*|)'; 37060 var sRegexDisplayNumberBySeoUrl = '(\/product\/.+?\/[0-9]+\/category\/[0-9]+\/display\/)([0-9]+)(\/.*|)'; 37061 37062 var iCateNum = parseInt(NEWPRODUCT_Recent.getParameterFromSeoUrl('cate_no', sRegexCategoryNumberBySeoUrl), 10); 37063 var iDisplayGroup = parseInt(NEWPRODUCT_Recent.getParameterFromSeoUrl('display_group', sRegexDisplayNumberBySeoUrl), 10); 37064 var sProductName = NEWPRODUCT_Recent.getCutProductName(); 37065 37066 var oNewStorageData = new Object(); 37067 var iDelProductNum = 0; 37068 37069 var aParam = { 37070 product_no: iProductNo, 37071 cate_no: iCateNum, 37072 display_group: iDisplayGroup 37073 }; 37074 var sParam = '?' + EC$.param(aParam); 37075 var aNewStorageData = { 37076 'iProductNo': iProductNo, 37077 'sProductName': sProductName, 37078 'sImgSrc': product_image_tiny, 37079 'isAdultProduct': is_adult_product, 37080 'link_product_detail': link_product_detail, 37081 'sParam': sParam 37082 }; 37083 37084 oNewStorageData[iObjectKeyCount] = aNewStorageData; 37085 if (oJsonData !== null) { 37086 var aStorageData = CAFE24.UTIL.parseJSON(oJsonData); 37087 for (var iKey in aStorageData) { 37088 if (isFinite(iKey) === false) { 37089 continue; 37090 } 37091 if (aStorageData[iKey].iProductNo !== iProductNo) { 37092 iObjectKeyCount++; 37093 oNewStorageData[iObjectKeyCount] = aStorageData[iKey]; 37094 iDelProductNum = aStorageData[iKey].iProductNo; 37095 } 37096 } 37097 } 37098 this.setSessionStorageData(this.sStorageKey , oNewStorageData); 37099 37100 if (iObjectKeyCount >= this.iMaxLength) { 37101 this.setUpdateStorageData(CAFE24.UTIL.trim(iDelProductNum)); 37102 } 37103 }, 37104 /* 37105 * ìì ë ì¤í ë¦¬ì§ ë²ìê° ë²ì´ë¬ì ê²½ì° ì²ë¦¬ íìí´ì 37106 */ 37107 setUpdateStorageData: function (iProductNo) {
37108 var oJsonData = this.getSessionStorageData(this.sStorageKey); 37109 37110 if (oJsonData === null) { 37111 return; 37112 } 37113 var iCount = 0; 37114 var oNewStorageData = new Object(); 37115 var aStorageData = CAFE24.UTIL.parseJSON(oJsonData); 37116 var iStorageLength = aStorageData.length; 37117 37118 var sDeleteKey = this.iMaxLength + ''; 37119 // ë§ì§ë§ì ì¶ê°ëì´ ìë ìíì ì§ì´ë¤. 37120 delete aStorageData[sDeleteKey]; 37121 this.setSessionStorageData(this.sStorageKey , aStorageData); 37122 37123 }, 37124 37125 /** 37126 * ì¤ë³µë ìíë²í¸ê° ìëê° íì¸ íë ë©ìë 37127 */ 37128 isDulicateCheck: function (iProductNo , oJsonData) { 37129 var bDulicate = false; 37130 37131 if (oJsonData === null) { 37132 return false; 37133 } 37134 iProductNo = CAFE24.UTIL.trim(iProductNo); 37135 var aStorageData = CAFE24.UTIL.parseJSON(oJsonData); 37136 for (var iKey in aStorageData) { 37137 if (CAFE24.UTIL.trim(aStorageData[iKey].iProductNo) === iProductNo) { 37138 bDulicate = true; 37139 break; 37140 } 37141 } 37142 return bDulicate; 37143 }, 37144 /** 37145 * get SessionStorage 37146 * @param sStorageKey SessionStorageì ì ì¥ëì´ ìë keyê° 37147 */ 37148 getSessionStorageData: function (sStorageKey) 37149 { 37150 return sessionStorage.getItem(sStorageKey); 37151 }, 37152 /** 37153 * set SessionStorage 37154 * @param sStorageKey SessionStorageì ì ì¥í keyê° 37155 * @param sStorageValue SessionStorageì ì ì¥í valueê° 37156 */ 37157 setSessionStorageData: function (sStorageKey , sStorageValue) 37158 { 37159 return sessionStorage.setItem(sStorageKey , EC$.toJSON(sStorageValue)); 37160 }, 37161 37162 /** 37163 * ì¸ì ì¤í 리ì§ê° ì¬ì©ê°ë¥íì§ íì¸ 37164 */ 37165 getIsLocalStorageAble: function() { 37166 var sTestKey = 'CAPP_TMP_KEY'; 37167 try { 37168 window.localStorage.setItem(sTestKey, 1); 37169 window.localStorage.removeItem(sTestKey); 37170 return true; 37171 } catch (e) { 37172 return false; 37173 } 37174 } 37175}; 37176// ìëì¦ê° ë²í¼ 37177var RelationQuantityUpBt = '.RelationQuantityUp'; 37178// ìëê°ì ë²í¼ 37179var RelationQuantityDownBt = '.RelationQuantityDown'; 37180// ìë ì¸í ë°ì¤ í´ëì¤ 37181var RelationQuantityClass = '.RelationQuantity'; 37182 37183// ECHOSTING-18402 ì¤ë§í¸ëìì¸ ê´ë ¨ìí ìë ê´ë ¨ 문ì 37184// ì¤í¬ë¦½í¸ ì¤ë¥ ìì 37185 37186EC$(function() { 37187 EC$('#prdRelated').on('keydown', '.RelationQuantity', function(e) { 37188 CAFE24.FRONT_NEW_PRODUCT_QUANTITY_VALID.getNumberValidate(e); 37189 }); 37190 37191 EC$('.RelationQuantity').blur(function() { 37192 if (CAFE24.UTIL.trim(this.value) === '') { 37193 this.value = this.defaultValue; 37194 return; 37195 } 37196 }); 37197 37198 var aQuantityInfo = CAFE24.UTIL.parseJSON(relation_product); 37199 var iCurrentQuantity = 0; 37200 // ìë ì¦ê°ì ê°ìì ëí íë ë°ì¸ë 37201 // ìëë íëë¡ í©ì³ììì¼ë, ëìì¸ì´ ì´ë»ê² ëì¬ì§ 몰ë¼ì ë°°ì´ì ì¤ë³µì¼ë¡ ë¤ì´ê°ë ìì를 ì ê±°í기 ìí´ì ì¤ë³µì½ëë¼ë ë°ë¡ ë¶ë¦¬í¨ 37202 EC$(RelationQuantityUpBt).each(function(i) { 37203 EC$(this).attr('idx' , i); 37204 EC$(this).mousedown(function() { 37205 var iProductNo = EC$(RelationQuantityClass).eq(i).attr('product_no'); 37206 var iBuyUnit = aQuantityInfo[iProductNo].buy_unit; 37207 var iProductMin = aQuantityInfo[iProductNo].product_min; 37208 var iProductMax = aQuantityInfo[iProductNo].product_max; 37209 var iQuantity = getQuantityValue(EC$(this).attr('idx')); 37210 iQuantity += iBuyUnit; 37211 if (iQuantity > iProductMax && iProductMax > 0) { 37212 alert(sprintf(__('ìµë 주문ìëì %sê° ì ëë¤.'), iProductMax)); 37213 return false; 37214 } 37215 37216 iCurrentQuantity = (isNaN(iQuantity) === true) ? iProductMin : iQuantity; 37217 }); 37218 EC$(this).mouseup(function() { 37219 setQuantityValue(i,iCurrentQuantity); 37220 }); 37221 }); 37222 EC$(RelationQuantityDownBt).each(function(i) { 37223 EC$(this).attr('idx' , i); 37224 EC$(this).mousedown(function() { 37225 var iProductNo = EC$(RelationQuantityClass).eq(i).attr('product_no'); 37226 var iBuyUnit = aQuantityInfo[iProductNo].buy_unit; 37227 var iProductMin = aQuantityInfo[iProductNo].product_min; 37228 var iProductMax = aQuantityInfo[iProductNo].product_max; 37229 var iQuantity = getQuantityValue(EC$(this).attr('idx')); 37230 if (iQuantity > 1) { 37231 iQuantity -= iBuyUnit; 37232 } 37233 if (iQuantity < iProductMin) { 37234 alert(sprintf(__('ìµì 주문ìëì %sê° ì ëë¤.'), iProductMin)); 37235 return false;
37236 37237 } 37238 37239 iCurrentQuantity = (isNaN(iQuantity) === true) ? iProductMin : iQuantity; 37240 }); 37241 EC$(this).mouseup(function() { 37242 setQuantityValue(i,iCurrentQuantity); 37243 }); 37244 }); 37245}); 37246 37247/** 37248 * ìëì ëí ê°ì²´ë¥¼ ë¦¬í´ í´ì¤ 37249 * @param iReq Index Number 37250 * @return element 37251 */ 37252function getQuantityElement(iReq) 37253{ 37254 return EC$(RelationQuantityClass)[iReq]; 37255} 37256 37257/** 37258 * í´ë¹ ê°ì²´ì ìëì ë¦¬í´ 37259 * @param iReq Index Number 37260 * @returns integer 37261 */ 37262function getQuantityValue(iReq) 37263{ 37264 var iQuantity = parseInt(getQuantityElement(iReq).value,10); 37265 return iQuantity; 37266} 37267 37268/** 37269 * ê°ì²´ì ìëì ì¸í í´ì¤ 37270 * @param iReq 37271 * @param iQuantity 37272 */ 37273function setQuantityValue(iReq, iQuantity) 37274{ 37275 getQuantityElement(iReq).value = iQuantity; 37276} 37277 37278 37279EC$(function() { 37280 EC$('.btn_review').click(function() { 37281 var cont_id = EC$(this).attr('rel'); 37282 37283 EC$('#review_'+cont_id).toggle(); 37284 }); 37285 37286 EC_PRODUCT_FRONT_BOARD_REVIEW.init(); 37287}); 37288 37289var EC_PRODUCT_FRONT_BOARD_REVIEW = { 37290 bInit : false, 37291 init : function() { 37292 if (this.bInit === true) { 37293 return; 37294 } 37295 this.bInit = true; 37296 this.board_link_alert(); 37297 }, 37298 37299 board_link_alert: function() { 37300 EC$('.xans-product-review').on('click', 'a', function(event) { 37301 // URL ìì± ì ì í¨ì± ê²ì¬ ì¶ê° 37302 try { 37303 var link = event.target.href; 37304 var linkDomain = new URL(link).hostname; 37305 } catch (e) { 37306 return; 37307 } 37308 37309 var currentDomain = window.location.hostname; 37310 37311 if (linkDomain != '' && linkDomain !== currentDomain) { 37312 if (confirm(__('PAGE.ARE.TRYING.ACCESS', 'BOARD.JS.APP.BOARD.READ')) === false) { 37313 event.preventDefault(); 37314 return false; 37315 } 37316 } 37317 }); 37318 }, 37319 modify: function (iBulletinNo, iProductNo) { 37320 if (typeof CAFE24.FRONT_EXTERNAL_SCRIPT_VARIABLE_DATA.common_member_id_crypt !== 'undefined' 37321 && CAFE24.FRONT_EXTERNAL_SCRIPT_VARIABLE_DATA.common_member_id_crypt.length > 0) { 37322 var sUrl = '/board/product/modify.html?board_act=edit&no=' + iBulletinNo + '&board_no=4&link_product_no=' + iProductNo; 37323 37324 var oEncryptedStr = document.createElement('input'); 37325 oEncryptedStr.setAttribute('type', 'hidden'); 37326 oEncryptedStr.setAttribute('name', 'encrypted_str'); 37327 oEncryptedStr.setAttribute('value', 'dummy'); // íì ë¹ë°ë²í¸ ê²ì¦ ë¡ì§ì íì°ê¸° ìí íì ë³ìì´ë¯ë¡ dummy ê°ì ì¤ì´ ë³´ë 37328 37329 var oForm = document.createElement('form'); 37330 oForm.action = sUrl; 37331 oForm.method = 'post'; 37332 37333 oForm.appendChild(oEncryptedStr); 37334 37335 document.body.appendChild(oForm); 37336 oForm.submit(); 37337 } else { 37338 var sMessage = __('PLEASE.ENTER.PASSWORD', 'JS.FRONT.PRODUCT.QNA'); 37339 37340 if (confirm(sMessage)) { 37341 location.href = '/board/product/read.html?no=' + iBulletinNo + '&board_no=4'; 37342 } 37343 } 37344 } 37345}; 37346var iSecretFormNo = ''; 37347var sSecretFormAction = ''; 37348 37349var PRODUCT_COMMENT = { 37350 //ëê¸ ì ì¥ ìì² URL 37351 sCommentInsertUrl: false, 37352 //ëê¸ì ëê¸ ì ì¥ ìì² URL 37353 sCommentReplyInsertUrl: false, 37354 //ë¹ë°ëê¸ í¨ì¤ìë íì¸ URL 37355 sCommentSecretUrl: false, 37356 //ëê¸ ì ì¥ì íì¬ ë°ë¼ë³´ë ê²ìí ë²í¸ 37357 iCommentInsertBoardNo: false, 37358 //ëê¸ì ëê¸ ì ì¥ì íì¬ ë°ë¼ë³´ë ê²ìí ë²í¸ 37359 iCommentReplyInsertBoardNo: false, 37360 37361 /** 37362 * í¤ë³´ë ì ë ¥ì ì²´í¬í기 37363 */ 37364 comment_byte: function(iBoardNo, iKey, sFormName) 37365 { 37366 var iBoardNo = iBoardNo + iKey; 37367 if (!sFormName) { 37368 sFormName ='commentWriteForm_'+iBoardNo; 37369 } else { 37370 sFormName =sFormName+'_'+iBoardNo; 37371 } 37372 37373 var targetByte = EC$('#'+sFormName).find('#comment_byte'); 37374 var comment_size = CAFE24.UTIL.trim(targetByte.attr('title')); 37375 var content = 'comment'; 37376 if (comment_size == '') return false; 37377 if (comment_size > 0) { 37378 EC$('#'+sFormName).find('#'+content).off('keyup', function() { 37379 PRODUCT_COMMENT.limitWord(this, comment_size, sFormName); 37380 }); 37381 } 37382 }, 37383 37384 /** 37385 * ê¸ì ì íí기 37386 * @param txt 37387 * @param limit 37388 */ 37389 limitWord: function(txt, limit, sFormName) 37390 { 37391 var strLen = this.stringByteSize(txt.value); 37392 if (strLen > limit) { 37393 alert(sprintf(__('ë©ìì§ë %s Byte ì´íë¡ ì ë ¥í´ì£¼ì¸ì.'), limit)); 37394 txt.value = txt.value.substring(0, limit); 37395 return; 37396 } 37397 EC$('#'+sFormName).find("#comment_byte").text(strLen); 37398 }, 37399 37400 /** 37401 * 문ìì´ì UTF-8ë¡ ë³ííì ê²½ì° ì°¨ì§íê² ëë byte ì를 리í´íë¤. 37402 */ 37403 stringByteSize: function(str) 37404 { 37405 if (str == null || str.length == 0) return 0; 37406 var size = 0; 37407 for (var i = 0; i < str.length; i++) { 37408 size += this.charByteSize(str.charAt(i)); 37409 } 37410 return size; 37411 }, 37412 37413 /** 37414 * ê¸ìì ì²´í¬ 37415 * @param ch 37416 * @returns {Number} 37417 */ 37418 charByteSize: function(ch) 37419 { 37420 if (ch == null || ch.length == 0) return 0;
37421 var charCode = ch.charCodeAt(0); 37422 if (escape(charCode).length > 4) { 37423 return 2; 37424 } else { 37425 return 1; 37426 } 37427 }, 37428 37429 /** 37430 * ëê¸ì ëê¸ ì ë ¥í¼ ì¶ë ¥ 37431 * @param bbs_no 37432 * @param comment_no 37433 * @param iBoardNo 37434 * @param e 37435 */ 37436 comment_reply_write: function(iBoardNo, iCommentNo, e) 37437 { 37438 var $form = EC$("#commentReplyWriteForm_"+iBoardNo); 37439 $form.css('display', 'block'); 37440 $form.get(0).reset(); 37441 if ($form.find('#comment_no').length < 1) { 37442 $form.append('<input type="hidden" name="comment_no" value="'+iCommentNo+'" />'); 37443 } else { 37444 alert('update'); 37445 //$form.find('#comment_no').val(iCommentNo); 37446 } 37447 37448 var $p = EC$(e).parent(); 37449 //if ( $p.parent().find('#commentReplyWriteForm_'+iBoardNo).length < 1 ) { 37450 $p.after($form); 37451 //} 37452 }, 37453 37454 /** 37455 * ëê¸ì ëê¸ ëª¨ë°ì¼ ì ê·ì¤í¨ ì ë ¥í¼ ì¶ë ¥ 37456 * @param comment_no 37457 * @param iBoardNo 37458 * @param e 37459 */ 37460 comment_reply_write_new: function(iBoardNo, iCommentNo, e) 37461 { 37462 var $form = EC$("#commentReplyWriteForm_"+iBoardNo); 37463 if ($form.css('display') == 'none') { 37464 $form.css('display', 'block'); 37465 $form.get(0).reset(); 37466 if ($form.find('#comment_no').length < 1) { 37467 $form.append('<input type="hidden" name="comment_no" value="'+iCommentNo+'" />'); 37468 } else { 37469 alert('update'); 37470 } 37471 EC$(e).parent().parent().after($form); 37472 } else { 37473 $form.css('display', 'none'); 37474 } 37475 }, 37476 37477 /** 37478 * ëê¸ ì ì¥ 37479 * @param action_url 37480 * @param form_name 37481 * @returns {Boolean} 37482 */ 37483 comment_insert: function(action_url, iBoardNo) 37484 { 37485 this.sCommentInsertUrl = action_url; 37486 this.iCommentInsertBoardNo = iBoardNo; 37487 37488 var label = EC$('#comment_password').attr('fw-label'); 37489 37490 try { 37491 label = decodeURIComponent(label); 37492 } catch (err) { 37493 37494 } 37495 37496 EC$('#comment_password').attr('fw-label', label); 37497 37498 var form = EC$('#commentWriteForm_'+iBoardNo); 37499 var result = FwValidator.inspection('commentWriteForm_'+iBoardNo); 37500 if (result.passed) { 37501 37502 //SSL ì²ë¦¬ 37503 var aEleId = [EC$("#commentWriteForm_"+iBoardNo+" #comment_name"), 37504 EC$("#commentWriteForm_"+iBoardNo+" #comment_password")]; 37505 37506 AuthSSLManager.weave({ 37507 'auth_mode': 'encrypt', 37508 'aEleId': aEleId, 37509 'auth_callbackName': 'PRODUCT_COMMENT.comment_insert_ajax' 37510 }); 37511 } 37512 37513 return false; 37514 }, 37515 37516 /** 37517 * ëê¸ ì ì¥ ì½ë°±í¨ì. 37518 * ëê¸ì ì ì¥íë ìì²ì í¨. 37519 * 37520 * @param callbackParam 37521 */ 37522 comment_insert_ajax: function(output) 37523 { 37524 //SSL ì¤í¨íì¸ 37525 var output = decodeURIComponent(output); 37526 if (AuthSSLManager.isError(output) == true) { 37527 return; 37528 } 37529 37530 var iBoardNo = this.iCommentInsertBoardNo; 37531 var action_url = this.sCommentInsertUrl; 37532 37533 this.sCommentInsertUrl = false; 37534 this.iCommentInsertBoardNo = false; 37535 37536 var form = EC$('#commentWriteForm_'+iBoardNo); 37537 37538 //ìí¸íë íë ë´ ê° ì ê±° 37539 var sTempCommentName = ''; 37540 sTempCommentName = EC$("#commentWriteForm_"+iBoardNo+" #comment_name").val(); 37541 37542 EC$("#commentWriteForm_"+iBoardNo+" #comment_name").val(''); 37543 EC$("#commentWriteForm_"+iBoardNo+" #comment_password").val(''); 37544 37545 //ìí¸í 문ìì´ì ì ì¡í기ìí´ input ì½ì 37546 var oInput = document.createElement('input'); 37547 oInput.type = 'hidden'; 37548 oInput.name = oInput.id = AuthSSL.sEncryptId; 37549 oInput.value = output; 37550 form.append(oInput); 37551 37552 var formData = form.serializeArray() || []; 37553 // ë¹ë°ê¸ ì íëì´ ìê³ , disabledë ê²½ì° 37554 if (EC$('[name=secure]:disabled', form).val() == 'T') { 37555 formData.push({name: 'secure', value: 'T'}); 37556 } 37557 EC$.post(action_url+iBoardNo, EC$.param(formData), function(req) { 37558 if (!req.failed) { 37559 self.location.reload(); 37560 } else { 37561 EC$("#commentWriteForm_"+iBoardNo+" #comment_name").val(sTempCommentName); 37562 alert(decodeURIComponent(req.msg)); 37563 return false;
37564 } 37565 },'json'); 37566 }, 37567 37568 /** 37569 * ëê¸ì ëê¸ ì ì¥ 37570 * @param action_url 37571 * @param form_name 37572 * @returns {Boolean} 37573 */ 37574 comment_reply_insert: function(action_url, iBoardNo) 37575 { 37576 this.sCommentReplyInsertUrl = action_url; 37577 this.iCommentReplyInsertBoardNo = iBoardNo; 37578 37579 var form = EC$('#commentReplyWriteForm_'+iBoardNo); 37580 var result = FwValidator.inspection('commentReplyWriteForm_'+iBoardNo); 37581 if (result.passed) { 37582 37583 //SSL ì²ë¦¬ 37584 var aEleId = [EC$("#commentReplyWriteForm_"+iBoardNo+" #comment_name"), 37585 EC$("#commentReplyWriteForm_"+iBoardNo+" #comment_password")]; 37586 37587 AuthSSLManager.weave({ 37588 'auth_mode': 'encrypt', 37589 'aEleId': aEleId, 37590 'auth_callbackName': 'PRODUCT_COMMENT.comment_reply_insert_ajax' 37591 }); 37592 } 37593 37594 return false; 37595 }, 37596 37597 /** 37598 * ëê¸ì ëê¸ ì ì¥ ì½ë°±í¨ì. 37599 * ëê¸ì ëê¸ì ì ì¥íë ìì²ì í¨. 37600 * 37601 * @param callbackParam 37602 */ 37603 comment_reply_insert_ajax: function(output) 37604 { 37605 //SSL ì¤í¨íì¸ 37606 var output = decodeURIComponent(output); 37607 if (AuthSSLManager.isError(output) == true) { 37608 return; 37609 } 37610 37611 var iBoardNo = this.iCommentReplyInsertBoardNo; 37612 var action_url = this.sCommentReplyInsertUrl; 37613 37614 this.iCommentReplyInsertBoardNo = false; 37615 this.sCommentReplyInsertUrl = false; 37616 37617 var form = EC$('#commentReplyWriteForm_'+iBoardNo); 37618 37619 //ìí¸íë íë ë´ ê° ì ê±° 37620 var sTempCommentName = ''; 37621 sTempCommentName = EC$("#commentReplyWriteForm_"+iBoardNo+" #comment_name").val(); 37622 37623 EC$("#commentReplyWriteForm_"+iBoardNo+" #comment_name").val(''); 37624 EC$("#commentReplyWriteForm_"+iBoardNo+" #comment_password").val(''); 37625 37626 //ìí¸í 문ìì´ì ì ì¡í기ìí´ input ì½ì 37627 var oInput = document.createElement('input'); 37628 oInput.type = 'hidden'; 37629 oInput.name = oInput.id = AuthSSL.sEncryptId; 37630 oInput.value = output; 37631 form.append(oInput); 37632 37633 var formData = form.serializeArray() || []; 37634 // ë¹ë°ê¸ ì íëì´ ìê³ , disabledë ê²½ì° 37635 if (EC$('[name=secure]:disabled', form).val() == 'T') { 37636 formData.push({name: 'secure', value: 'T'}); 37637 } 37638 EC$.post(action_url+iBoardNo, EC$.param(formData), function(req) { 37639 if (!req.failed) { 37640 self.location.reload(); 37641 } else { 37642 EC$("#commentReplyWriteForm_"+iBoardNo+" #comment_name").val(sTempCommentName); 37643 alert(decodeURIComponent(req.msg)); 37644 return false; 37645 } 37646 },'json'); 37647 37648 37649 return false; 37650 }, 37651 37652 /** 37653 * ëê¸ìëê¸ ë³´ê¸° 37654 * @param comment_no 37655 */ 37656 comment_reply_view: function (iCommentNo) 37657 { 37658 EC$('[id^="replyArea_'+iCommentNo+'_"]').each(function(e) { 37659 if (EC$(this).css('display') == 'none') { 37660 EC$(this).show(); 37661 } else { 37662 EC$(this).hide(); 37663 } 37664 }); 37665 }, 37666 37667 form_submit: function(sFormName, iNo, sAction) 37668 { 37669 var aId = new Array(); 37670 var iId = 0; 37671 iSecretFormNo = iNo; 37672 sSecretFormAction = sAction; 37673 37674 if (EC$('#'+sFormName+' [id="secure_password"]').val()) { 37675 aId[iId] = sFormName+'::secure_password'; 37676 } 37677 37678 AuthSSL.init(sFormName, aId); 37679 37680 // ìí¸í ë ê°ì ë°ì input_hidden ìì± 37681 var oInput = document.createElement('input'); 37682 oInput.type = 'hidden'; 37683 oInput.name = oInput.id = AuthSSL.sEncryptId; 37684 AuthSSL.oFormSubmit.append(oInput); 37685 37686 AuthSSL.encrypt(AuthSSL.aEleId, 'PRODUCT_COMMENT.form_submit_go'); 37687 }, 37688 37689 form_submit_go: function(sOutput) 37690 { 37691 // ìí¸í ê° ìì 37692 var sFormName = AuthSSL.sFormId; 37693 AuthSSL.delInputValue(); 37694 EC$('#'+sFormName).find('[id="'+AuthSSL.sEncryptId+'"]').val(sOutput); 37695 37696 var oNoInput = document.createElement('input'); 37697 oNoInput.type = 'hidden'; 37698 oNoInput.name = 'no'; 37699 oNoInput.value = iSecretFormNo; 37700 AuthSSL.oFormSubmit.append(oNoInput); 37701
37702 EC$.post(sSecretFormAction, EC$('#'+sFormName).serialize(), function(req) { 37703 if (req.failed) { 37704 alert(req.msg); 37705 EC$('#' + sFormName + ' [id="secure_password"]').focus(); 37706 return; 37707 } else { 37708 if (sFormName == 'SecretForm_4') { 37709 REVIEW.getReadData(); 37710 } else if (sFormName == 'SecretForm_6') { 37711 QNA.getReadData(); 37712 } 37713 } 37714 }, 'json'); 37715 }, 37716 37717 /** 37718 * ìíìì¸íì´ì§ë´ì ìíì¬ì©í기ë Q&A ê²ìíì íì ê¸°ë¥ ì¬ì© ìí¨ì¼ë 37719 * displayëì´ìë tdê°¯ìì ë°ë¼ ìì¸ë´ì©ì tdì colspanì ìì í¨ 37720 * 37721 * @param tr ì íë ê²ì물ì ì ëª©ì´ ìë tr 37722 */ 37723 comment_colspan: function(tr) 37724 { 37725 var $tr = EC$(tr); 37726 var iColspan = $tr.children('td:not(.displaynone)').length; 37727 37728 var $comment = $tr.next('tr'); 37729 $comment.hide(); 37730 if ($comment.children('td').first().attr('colspan') != iColspan) { 37731 $comment.children('td').first().attr('colspan', iColspan); 37732 var aTds = []; 37733 for (var i = 0; i < $tr.children('td').length-iColspan; i++) { 37734 aTds.push('<td class="displaynone"></td>'); 37735 } 37736 $comment.children('td').first().after(aTds.join('')); 37737 } 37738 $comment.show(); 37739 }, 37740 37741 /** 37742 * ë¹ë°ëê¸ ë¹ë°ë²í¸ íì¸ í¼ ì¶ë ¥ 37743 * 37744 * @param sBoardNo 37745 * @param iCommentNo 37746 * @param e 37747 */ 37748 show_secret_comment_form: function(sBoardNo, iCommentNo, e) 37749 { 37750 var $form = EC$('#commentSecretForm_'+sBoardNo); 37751 if ($form.length > 0) { 37752 $form.css('display', 'block'); 37753 $form[0].reset(); 37754 var $comment_no = EC$('[name=comment_no]', $form); 37755 if ($comment_no.length < 1) { 37756 $comment_no = EC$('<input type="hidden" name="comment_no"/>'); 37757 $form.append($comment_no); 37758 } 37759 $comment_no.val(iCommentNo); 37760 37761 EC$(e).parent().after($form); 37762 } 37763 return false; 37764 }, 37765 37766 /** 37767 * ë¹ë°ëê¸ íì¸ 37768 * 37769 * @param sActionUrl 37770 * @param sBoardNo 37771 */ 37772 show_secret_comment: function(sActionUrl, sBoardNo) 37773 { 37774 this.sCommentSecretUrl = sActionUrl; 37775 this.iCommentInsertBoardNo = sBoardNo; 37776 37777 var $form = EC$('#commentSecretForm_'+sBoardNo); 37778 var result = FwValidator.inspection('commentSecretForm_'+sBoardNo); 37779 if (result.passed) { 37780 //SSL ì²ë¦¬ 37781 var aEleId = [EC$('#secure_password', $form)]; 37782 37783 AuthSSLManager.weave({ 37784 'auth_mode': 'encrypt', 37785 'aEleId': aEleId, 37786 'auth_callbackName': 'PRODUCT_COMMENT.show_secret_comment_ajax' 37787 }); 37788 } 37789 return false; 37790 }, 37791 37792 /** 37793 * ë¹ë°ëê¸ íì¸ ìí¸í ì½ë°±í¨ì 37794 * 37795 * @param sOutput 37796 */ 37797 show_secret_comment_ajax: function(sOutput) 37798 { 37799 //SSL ì¤í¨íì¸ 37800 var sOutput = decodeURIComponent(sOutput); 37801 if (AuthSSLManager.isError(sOutput) == true) { 37802 return; 37803 } 37804 37805 var sBoardNo = this.iCommentInsertBoardNo; 37806 var sActionUrl = this.sCommentSecretUrl; 37807 37808 this.sCommentSecretUrl = false; 37809 this.iCommentInsertBoardNo = false; 37810 37811 var $form = EC$('#commentSecretForm_'+sBoardNo); 37812 37813 //ìí¸íë íë ë´ ê° ì ê±° 37814 EC$('#secure_password', $form).val(''); 37815 var oEncryptElement = EC$('<input/>', { 37816 type: 'hidden', 37817 name: AuthSSL.sEncryptId, 37818 id: AuthSSL.sEncryptId, 37819 value: sOutput 37820 }); 37821 $form.append(oEncryptElement); 37822 EC$.post(sActionUrl+sBoardNo, $form.serialize(), function(req) { 37823 if (req.failed) { 37824 alert(req.msg); 37825 EC$("input[name='"+ AuthSSL.sEncryptId +"']", $form).remove(); 37826 EC$('#secure_password', $form).focus(); 37827 return false; 37828 } 37829 37830 var aData = req.data; 37831 EC$('#comment_contents' + aData.comment_no).html(aData.comment); 37832 PRODUCT_COMMENT.hide_secret_comment_form(sBoardNo); 37833 },'json'); 37834 }, 37835 37836 /** 37837 * ë¹ë°ëê¸ ë¹ë°ë²í¸ íì¸ í¼ ì¨ê¹ 37838 * 37839 * @param sBoardNo 37840 */ 37841 hide_secret_comment_form: function(sBoardNo) 37842 { 37843 var $form = EC$('#commentSecretForm_'+sBoardNo); 37844 $form.css('display', 'none'); 37845 37846 return false;
37847 }, 37848 37849 END: function() {} 37850}; 37851 37852var APP_BOARD_UCC = { 37853 bInit: false, 37854 oRegex: /(http:|https:|)\/\/(player\.|www\.|embed\.|media\.)?((vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|dailymotion\.com|dai\.ly|google.com\/maps|gettyimages\.com\/embed|gettyimages\.com\/videos|gettyimages.com\/detail|video|instagram\.com|facebook\.com)\/(news-photo\/[^\/]+\/|video\/[^\/]+\/|photo\/[^\/]+\/|embed\/video\/|shorts\/|video\/|embed\/|watch\?v=|v\/|embed\?pb=|p\/|plugins\/video\.php\?href=|plugins\/post\.php\?href=|[a-z0-9.]+\/posts\/|[a-z0-9]+\/videos\/)?([^\&\#\"\'\/<\s]*)|([^\&\#\"\'<\s]+)(\.avi|\.mpg|\.mpeg|\.wmv|\.dat|\.k3g|\.ogm|\.m2v|\.mov|\.3gp|\.mp4)+)/i, 37855 oTemplate: { 37856 iframe: '<iframe src="%1$s" frameborder="0" style="border:0" webkitAllowFullScreen mozallowfullscreen allowfullscreen></iframe>', 37857 instagram: [ 37858 '<blockquote class="instagram-media" data-instgrm-permalink="%1$s" data-instgrm-version="12"></blockquote>' 37859 ].join("\n"), 37860 facebook: [ 37861 '<div class="fb-%1$s" data-href="%2$s"></div>' 37862 ].join("\n"), 37863 mp4: [ 37864 '<video width="100%" height="100%" controls>', 37865 '<source src="" type="video/mp4">', 37866 '</video>' 37867 ].join(''), 37868 img: [ 37869 '<img src="%s">' 37870 ].join('') 37871 }, 37872 sUrl: '', 37873 iWidth: 0, 37874 iHeight: 0, 37875 init: function () 37876 { 37877 var self = APP_BOARD_UCC; 37878 if (self.bInit === true) { 37879 return; 37880 } 37881 self.bInit = true; 37882 self.setEvent(); 37883 self.setPreview(); 37884 }, 37885 setEvent: function () { 37886 var self = APP_BOARD_UCC; 37887 if (self.isExist() === false) { 37888 return; 37889 } 37890 self.getUccInput().keyup(function () { 37891 if (self.sUrl != self.getUccText()) { 37892 self.sUrl = self.getUccText(); 37893 self.setWritePreview(); 37894 } 37895 }).focusout(function () { 37896 self.setUccText(self.getEmbedUrl()); 37897 }); 37898 }, 37899 setPreview: function () 37900 { 37901 var self = APP_BOARD_UCC; 37902 37903 self.setWritePreview(); 37904 self.setReadPreview(); 37905 }, 37906 isFrontRead: function () 37907 { 37908 return typeof EC_FRONT_JS_ARTICLES !== 'undefined'; 37909 }, 37910 isFrontWrite: function () 37911 { 37912 var self = APP_BOARD_UCC; 37913 return self.getUccInput().length > 0; 37914 }, 37915 setReadPreview: function() 37916 { 37917 var self = APP_BOARD_UCC; 37918 if (self.isFrontRead()) { 37919 EC$.each(EC_FRONT_JS_ARTICLES, function (iNo, oArticle) { 37920 var $oPreviewElement = self.getPreviewElement(oArticle.ucc_url); 37921 if ($oPreviewElement) { 37922 $oPreviewElement.attr('class', 'ec-ucc-media-box-' + iNo); 37923 EC$('.ec-ucc-media-box-' + iNo).replaceWith($oPreviewElement); 37924 } 37925 }); 37926 } 37927 }, 37928 setWritePreview: function() 37929 { 37930 var self = APP_BOARD_UCC; 37931 if (self.isFrontWrite()) { 37932 var sType = self.getUrlType(); 37933 if (sType != 'NONE') { 37934 var $oPreviewElement = self._getPreviewElement(); 37935 if (self.getUccInput().length > 0) { // ì¶ê°/ìì íì´ì§ 37936 self.removePreviewElement(); 37937 self.getUccInput().parent().append($oPreviewElement); 37938 } 37939 } else { 37940 self.removePreviewElement(); 37941 } 37942 } 37943 }, 37944 removePreviewElement: function() 37945 { 37946 EC$('.ec-ucc-media-box').fadeOut(200).remove(); 37947 }, 37948 getPreviewElement: function (sUccText) 37949 { 37950 var self = APP_BOARD_UCC; 37951 var sOldUccText = self.getUccText(); 37952 self.setUccText(sUccText); 37953 var $oPreviewElement = self._getPreviewElement(); 37954 self.setUccText(sOldUccText); 37955 37956 return $oPreviewElement; 37957 }, 37958 _getPreviewElement: function () 37959 { 37960 var self = APP_BOARD_UCC; 37961 37962 var sType = self.getUrlType(); 37963 var $oMediaBox = null; 37964 var $oElement = null; 37965 switch (sType) { 37966 case 'VIMEO' : 37967 case 'YOUTUBE' : 37968 case 'DAILYMOTION' : 37969 case 'GOOGLE_MAP' : 37970 $oElement = EC$(sprintf(self.oTemplate.iframe, self.getEmbedUrl())); 37971 break; 37972 case 'MP4' : 37973 $oElement = EC$(self.oTemplate.mp4); 37974 $oElement.find('source').attr('src', self.getEmbedUrl()); 37975 $oElement[0].load(); 37976 break; 37977 default : 37978 break; 37979 } 37980 if ($oElement) { 37981 $oElement.css({ 37982 position: 'absolute', 37983 top: 0, 37984 left: 0, 37985 width: '100%', 37986 height: '100%' 37987 }); 37988 $oMediaBox = EC$('<div class="ec-ucc-media-box">'); 37989 $oMediaBox.css({ 37990 'position': 'relative', 37991 'max-height': '100%', 37992 'padding-bottom': '56.25%', 37993 'overflow': 'hidden', 37994 'margin-bottom': '14px' 37995 }).append($oElement); 37996 } 37997 return $oMediaBox; 37998 }, 37999 getUrlType: function () { 38000 var self = APP_BOARD_UCC; 38001 var aUrl = self.getUccText().match(self.oRegex); 38002 var sType = 'NONE'; 38003 if (aUrl && aUrl[0]) { 38004 switch (aUrl[4]) { 38005 case 'vimeo.com' : 38006 sType = 'VIMEO'; 38007 break; 38008 case 'youtube.com' : 38009 case 'youtube.googleapis.com' : 38010 case 'youtu.be' : 38011 sType = 'YOUTUBE'; 38012 break; 38013 case 'dai.ly' : 38014 case 'dailymotion.com' : 38015 sType = 'DAILYMOTION'; 38016 break; 38017 case 'google.com/maps' : 38018 case 'goo.gl/maps' : 38019 sType = 'GOOGLE_MAP'; 38020 break; 38021 default : 38022 if (aUrl[9] && aUrl[9].length > 0) { 38023 sType = 'MP4'; 38024 } 38025 break; 38026 } 38027 } 38028 return sType; 38029 }, 38030 getEmbedUrl: function () { 38031 var self = APP_BOARD_UCC; 38032 var aUrl = self.getUccText().match(self.oRegex); 38033 var sUrl = ''; 38034 if (aUrl && aUrl[0]) { 38035 var sType = self.getUrlType(); 38036 switch (sType) { 38037 case 'YOUTUBE' : 38038 sUrl = sprintf('https://www.youtube.com/embed/%s', aUrl[7]); 38039 break; 38040 case 'VIMEO' : 38041 sUrl = sprintf('https://player.vimeo.com/video/%s', aUrl[7]); 38042 break; 38043 case 'DAILYMOTION' : 38044 sUrl = sprintf('https://www.dailymotion.com/embed/video/%s', aUrl[7]); 38045 break; 38046 case 'GOOGLE_MAP' : 38047 sUrl = sprintf('https://www.google.com/maps/embed?pb=%s', aUrl[7]); 38048 break; 38049 case 'MP4' : 38050 sUrl = aUrl[0]; 38051 break; 38052 default : 38053 break; 38054 } 38055 } 38056 return sUrl; 38057 }, 38058 getUccText: function () 38059 { 38060 try { 38061 if (this.getUccInput().length > 0) { 38062 return this.getUccInput().val(); 38063 } else if (this.sUrl.length > 0) { 38064 return this.sUrl; 38065 } 38066 } catch (e) {} 38067 38068 return ''; 38069 }, 38070 setUccText: function (sText) 38071 { 38072 this.sUrl = sText; 38073 this.getUccInput().val(sText); 38074 },
38075 getUccInput: function () 38076 { 38077 return EC$('input#ucc'); 38078 }, 38079 isExist: function() 38080 { 38081 var self = APP_BOARD_UCC; 38082 if (self.getUccInput().length > 0) { 38083 return true; 38084 } 38085 return false; 38086 } 38087}; 38088 38089EC$(function () { 38090 APP_BOARD_UCC.init(); 38091}); 38092 38093var APP_BOARD_REPORT = { 38094 bInit: false, 38095 STORAGE_KEY: 'APP_BOARD_REPORT_' + CAFE24.SHOP.getMallID() + '_' + CAFE24.SDE_SHOP_NUM, 38096 aBlockList: null, 38097 bAction: false, 38098 iMax: 1000, 38099 init: function () 38100 { 38101 var self = APP_BOARD_REPORT; 38102 if (self.bInit === true) { 38103 return; 38104 } 38105 self.bInit = true; 38106 38107 if (this.isRun() === false) { 38108 return; 38109 } 38110 //ê²ìí ì¤í©ê³¼ ëì¼íê² ë¹íì ìíì¼ ê²½ì° ì²ë¦¬ê° ëì¼ 38111 // if (CAPP_ASYNC_METHODS.IS_LOGIN === false) { 38112 // return; 38113 // } 38114 // this.setEvent(); 38115 // this.setBlockList(); 38116 }, 38117 setDefaultUI: function () 38118 { 38119 EC$('.ec-report-target').hide(); 38120 }, 38121 useReport: function (iBoardNo) 38122 { 38123 if (iBoardNo > 0 38124 && typeof CAFE24.BOARD['config_' + String(iBoardNo)] !== 'undefined' 38125 && CAFE24.BOARD['config_' + String(iBoardNo)].use_report === 'T') { 38126 return true; 38127 } 38128 return false; 38129 }, 38130 /** 38131 * ëì ì¬ë¶ë¥¼ ê²°ì 38132 * @returns {boolean} 38133 */ 38134 isRun: function () 38135 { 38136 if (typeof CAFE24.BOARD === 'undefined') { 38137 return false; 38138 } 38139 var iBoardNo = 0; 38140 for (var sConfigKey in CAFE24.BOARD) { 38141 if (sConfigKey.indexOf('config_') !== -1) { 38142 iBoardNo = parseInt(sConfigKey.replace('config_', ''), 10); 38143 if (this.useReport(iBoardNo) === true) { 38144 return true; 38145 } 38146 } 38147 } 38148 return false; 38149 }, 38150 getBoardNo: function (actionName) 38151 { 38152 var aMatched = actionName.match(/APP_BOARD_REPORT\.(setReport)\('(\S+)','(\d+)'\);/); 38153 if (aMatched !== false) { 38154 var aSplitMatched = aMatched[2].split('/'); 38155 return parseInt(aSplitMatched[aSplitMatched.length - 1], 10); 38156 } 38157 38158 return 0; 38159 }, 38160 setReportLayerActions: function (reportAction, reportCloseAction, write_auth) 38161 { 38162 APP_BOARD_REPORT.setDefaultUI(); 38163 if (APP_BOARD_REPORT.useReport(APP_BOARD_REPORT.getBoardNo(reportAction)) === false || write_auth) { 38164 EC$('.ec-report-target').hide(); 38165 } else { 38166 EC$('.ec-report-target').attr("style", "display:inline-block !important;"); 38167 } 38168 EC$('.boardReport .ecReportAction').attr('onclick', reportAction); 38169 EC$('.boardReport .ecReportCloseLayer').attr('onclick', reportCloseAction); 38170 38171 38172 }, 38173 setReport: function (actionUrl, bulletin_no) 38174 { 38175 var report_reason = EC$("input[name='report_reason']:checked").val(); 38176 var aData = { 38177 'no': bulletin_no, 38178 'report_reason': report_reason 38179 }; 38180 38181 var aActionUrl = actionUrl.split('/'); 38182 var iBoardNo = aActionUrl[aActionUrl.length - 1]; 38183 38184 if (APP_BOARD_REPORT.isUserCanReport(iBoardNo, bulletin_no) === false) { 38185 return false; 38186 } 38187 38188 actionUrl += "?shop_no=" + CAFE24.SDE_SHOP_NUM; 38189 38190 EC$.post(actionUrl, aData, function(req) { 38191 alert(req.alertMSG); 38192 self.location.reload(); 38193 }, 'json'); 38194 }, 38195 isUserCanReport: function (iBoardNo, iNo) 38196 { 38197 var bIsLogin = (document.cookie.match(/(?:^| |;)iscache=F/) ? true : false); 38198 if (bIsLogin === false) { 38199 alert(__('YOU.NEED.SHOPPING.MALL', 'B.BOARD.BULLETIN.REPORT.L')); 38200 38201 if (EC_ROUTE.getIsEasyUrl()) { // ì¬ì´ 주ì 38202 location.replace("/member/login.html?returnUrl=" + window.location.pathname); 38203 } else { 38204 location.replace("/member/login.html?returnUrl=" + encodeURIComponent(window.location.pathname + "?board_no=" + iBoardNo + "&no=" + iNo)); 38205 } 38206 38207 return false; 38208 } 38209 return true; 38210 }, 38211 openReportLayer: function (iBoardNo, iNo) 38212 { 38213 if (APP_BOARD_REPORT.isUserCanReport(iBoardNo, iNo) === false) { 38214 return false;
38215 } 38216 EC$('.boardReport').removeClass('displaynone'); 38217 }, 38218 closeReportLayer: function () 38219 { 38220 EC$("input[name='report_reason'][value='1']").prop('checked', true); 38221 EC$('.boardReport').addClass('displaynone'); 38222 } 38223}; 38224 38225EC$(function () { 38226 try { 38227 APP_BOARD_REPORT.init(); 38228 } catch (e) { 38229 console.log(e); // íë¡ í¸ì ìí¥ê°ì§ ìëë¡ ì²ë¦¬ 38230 } 38231}); 38232var APP_BOARD_BLOCK = { 38233 bInit: false, 38234 STORAGE_KEY: 'APP_BOARD_BLOCK_' + CAFE24.SHOP.getMallID() + '_' + CAFE24.SDE_SHOP_NUM, 38235 aBlockList: null, 38236 bAction: false, 38237 iMax: 1000, 38238 init: function () 38239 { 38240 var self = APP_BOARD_BLOCK; 38241 if (self.bInit === true) { 38242 return ; 38243 } 38244 self.bInit = true; 38245 this.setDefaultUI(); 38246 if (this.isRun() === false) { 38247 return ; 38248 } 38249 if (CAPP_ASYNC_METHODS.IS_LOGIN === false) { 38250 self.setDefaultUINoneMember(); 38251 self.deleteBlockListCache(); 38252 return; 38253 } 38254 this.setEvent(); 38255 this.setBlockList(); 38256 }, 38257 setEvent: function () 38258 { 38259 38260 }, 38261 setDefaultUI: function () 38262 { 38263 EC$('.ec-block-target-request-btn').each(function () { 38264 if (APP_BOARD_BLOCK.useBlock(APP_BOARD_BLOCK.getRequestBtnBoardNo(this)) === false) { 38265 EC$(this).remove(); 38266 } else { 38267 EC$(this).hide(); 38268 } 38269 }); 38270 EC$('.ec-unblock-target-request-btn').each(function () { 38271 if (APP_BOARD_BLOCK.useBlock(APP_BOARD_BLOCK.getRequestBtnBoardNo(this)) === false) { 38272 EC$(this).remove(); 38273 } else { 38274 EC$(this).hide(); 38275 } 38276 }); 38277 }, 38278 useBlock : function (iBoardNo) 38279 { 38280 if (iBoardNo > 0 38281 && typeof CAFE24.BOARD['config_' + String(iBoardNo)] !== 'undefined' 38282 && CAFE24.BOARD['config_' + String(iBoardNo)].use_block === 'T') { 38283 return true; 38284 } 38285 return false; 38286 }, 38287 /** 38288 * ëì ì¬ë¶ë¥¼ ê²°ì 38289 * @returns {boolean} 38290 */ 38291 isRun : function () 38292 { 38293 if (typeof CAFE24.BOARD === 'undefined') { 38294 return false; 38295 } 38296 var iBoardNo = 0; 38297 for (var sConfigKey in CAFE24.BOARD) { 38298 if (sConfigKey.indexOf('config_') !== -1) { 38299 iBoardNo = parseInt(sConfigKey.replace('config_', ''), 10); 38300 if (this.useBlock(iBoardNo) === true) { 38301 return true; 38302 } 38303 } 38304 } 38305 return false; 38306 }, 38307 getRequestBtnBoardNo : function (oBtn) 38308 { 38309 var aMatched = EC$(oBtn).attr('onclick').match(/APP_BOARD_BLOCK\.(setBlock|unBlock)\('(\d+)','(\d+)','(\S+)'\);/); 38310 return aMatched !== false ? parseInt(aMatched[2], 10) : 0; 38311 }, 38312 setDefaultUINoneMember : function () 38313 { 38314 EC$('.ec-block-target-request-btn').attr("style", "display:inline-block !important;"); 38315 EC$('.ec-unblock-target-request-btn').hide(); 38316 }, 38317 setDisplayListBlock: function () 38318 { 38319 APP_BOARD_BLOCK.setDefaultUI(); 38320 EC$('.ec-block-target').each(function (iIndex, oItem) { 38321 var sBlockData = EC$(oItem).data('ec-block-data'); 38322 if (typeof sBlockData == 'undefined') { 38323 return; 38324 } 38325 var sBlockType = APP_BOARD_BLOCK.findBlockList(sBlockData); 38326 if (sBlockType === false) { 38327 if (sBlockData !== APP_BOARD_BLOCK.getSelfBlockData()) {// ë´ ê¸ì´ ìë ëë§ ì°¨ë¨ ë²í¼ì ë ¸ì¶íë¤. 38328 EC$(oItem).find('.ec-block-target-request-btn').attr("style", "display:inline-block !important;"); 38329 } 38330 EC$(oItem).find('.ec-block-target-content').show(); 38331 return; 38332 } 38333 EC$(oItem).find('.ec-unblock-target-request-btn').attr("style", "display:inline-block !important;"); 38334 EC$(oItem).find('.ec-block-target-content').each(function(iSubIndex, oContentItem){ 38335 var sNewDisplayStr = (sBlockType === 'NO_M_BULLETIN')? __('THIS.IS.BLOCKED.POST', 'APP.BOARD.BLOCK.JS') : __('POST.FROM.BLOCKED.AUTHOR', 'APP.BOARD.BLOCK.JS'); 38336 38337 if (EC$(oContentItem).prop('tagName') !== "DIV") { 38338 EC$(oContentItem).html(sNewDisplayStr); 38339 } else { 38340 EC$(oContentItem).find("> :not(.ec-base-button)").remove(); 38341 EC$(oContentItem).prepend(sNewDisplayStr); 38342 } 38343 EC$(oContentItem).show(); 38344 }); 38345 }); 38346 38347 // UI ê° ë³íëë©´ action ì¢ ë£ë¡ íë¨. 38348 APP_BOARD_BLOCK.bAction = false;
38349 }, 38350 getSelfBlockData: function () 38351 { 38352 if (this.aBlockList != null && typeof this.aBlockList.data !== 'undefined') { 38353 return this.aBlockList.data.block_data; 38354 } 38355 return ''; 38356 }, 38357 findBlockList: function (sBlockKey) 38358 { 38359 if (this.aBlockList == null || this.aBlockList.length < 1) { 38360 return false; 38361 } 38362 var aBlockKeyList = Object.keys(this.aBlockList.data.list); 38363 var iFindIndex = aBlockKeyList.indexOf(sBlockKey); 38364 if (iFindIndex === -1) { 38365 return false; 38366 } 38367 return aBlockKeyList[iFindIndex]; 38368 }, 38369 setBlockList: function () 38370 { 38371 this.loadBlockListCache(); 38372 if (this.aBlockList === null) { 38373 this.setBlockListAjax(this.setDisplayListBlock); 38374 } else { 38375 this.setDisplayListBlock(); 38376 } 38377 }, 38378 setBlockListCache: function (oStorageData) 38379 { 38380 this.aBlockList = oStorageData; 38381 // sessionStorage ì§ì ì¬ë¶ íì¸ 38382 if (!window.localStorage) { 38383 return false; 38384 } 38385 window.localStorage.setItem(this.STORAGE_KEY, JSON.stringify(oStorageData)); 38386 }, 38387 loadBlockListCache: function () 38388 { 38389 // sessionStorage ì§ì ì¬ë¶ íì¸ 38390 if (!window.localStorage) { 38391 return false; 38392 } 38393 try { 38394 var sStorageData = window.localStorage.getItem(this.STORAGE_KEY); 38395 var oStorageData = JSON.parse(sStorageData); 38396 38397 // ë°ì´í° ì²´í¬ 38398 if (typeof oStorageData.code === 'undefined' || typeof oStorageData.data === 'undefined') { 38399 throw 'Invalid cache data.'; 38400 } 38401 38402 if (oStorageData.data.expire_time < (Date.now() / 1000)) { 38403 throw 'expired time.'; 38404 } 38405 38406 if (oStorageData.data.member_id != CAPP_ASYNC_METHODS.member.getData().member_id) { 38407 throw 'Failed to match member information.'; 38408 } 38409 this.aBlockList = oStorageData; 38410 } catch (e) { 38411 this.deleteBlockListCache(); 38412 } 38413 }, 38414 deleteBlockListCache: function () 38415 { 38416 // sessionStorage ì§ì ì¬ë¶ íì¸ 38417 if (!window.localStorage) { 38418 return; 38419 } 38420 // ìºì ìì 38421 this.aBlockList = null; 38422 window.localStorage.removeItem(this.STORAGE_KEY); 38423 }, 38424 setBlockListAjax: function (oCallback) 38425 { 38426 EC$.ajax({ 38427 type: 'get', 38428 dataType: 'json', 38429 url: '/exec/front/shop' + CAFE24.SDE_SHOP_NUM + '/board/blockGet', 38430 data: { }, 38431 success: function(oResult) { 38432 switch (oResult.code) { 38433 case '0000' : 38434 APP_BOARD_BLOCK.setBlockListCache(oResult); 38435 oCallback(); 38436 break; 38437 case '1001' : //ìí ìì¸íì´ì§ ë¹ë¡ê·¸ì¸ ì ì ë²í¼ ë ¸ì¶ 38438 if (APP_BOARD_BLOCK.isRun() === false) { 38439 APP_BOARD_BLOCK.setDefaultUI(); 38440 return ; 38441 } 38442 APP_BOARD_BLOCK.setDefaultUINoneMember(); 38443 break; 38444 default : 38445 break; 38446 } 38447 } 38448 }); 38449 }, 38450 setBlock: function (iBoardNo, iNo, sTargetType) 38451 { 38452 if (APP_BOARD_BLOCK.bAction) { 38453 return ; 38454 } 38455 if (CAPP_ASYNC_METHODS.IS_LOGIN === false) { 38456 alert(__('YOU.NEED.SHOPPING.MALL', 'APP.BOARD.BLOCK.JS')); 38457 38458 if (EC_ROUTE.getIsEasyUrl()) { // ì¬ì´ 주ì 38459 location.replace("/member/login.html?returnUrl=" + window.location.pathname); 38460 } else { 38461 location.replace("/member/login.html?returnUrl=" + encodeURIComponent(window.location.pathname + "?board_no=" + iBoardNo + "&no=" + iNo)); 38462 } 38463 38464 return ; 38465 } 38466 if (Object.keys(APP_BOARD_BLOCK.aBlockList.data.list).length >= APP_BOARD_BLOCK.iMax) { 38467 alert(__('CAN.BLOCKED.EXCEEDED', 'APP.BOARD.BLOCK.JS')); 38468 return ; 38469 } 38470 var iBoardNo = parseInt(iBoardNo, 10); 38471 var iNo = parseInt(iNo, 10); 38472 if (iNo < 1 || iBoardNo < 1) { 38473 return ; 38474 } 38475 38476 var sQuestion = ''; 38477 if (sTargetType === 'NO_M_BULLETIN') {
38478 sQuestion = __('ARE.SURE.THE.POST', 'APP.BOARD.BLOCK.JS'); 38479 } else { 38480 sQuestion = __('ARE.SURE.THE.AUTHOR', 'APP.BOARD.BLOCK.JS'); 38481 } 38482 var bAnswer =confirm(sQuestion); 38483 if (bAnswer === false) { 38484 return ; 38485 } 38486 APP_BOARD_BLOCK.bAction = true; 38487 this.setBlockCore(iBoardNo, iNo); 38488 }, 38489 setBlockCore: function (iBoardNo, iNo) 38490 { 38491 var self = APP_BOARD_BLOCK; 38492 EC$.ajax({ 38493 type: 'get', 38494 dataType: 'json', 38495 url: '/exec/front/shop' + CAFE24.SDE_SHOP_NUM + '/board/blockPost', 38496 data: { 38497 'board_no': iBoardNo, 38498 'no': iNo 38499 }, 38500 success: function(oResult) { 38501 switch (oResult.code) { 38502 case '0000' : 38503 self.deleteBlockListCache(); 38504 self.setBlockList(); 38505 self.setBlockAfterUI(); 38506 break; 38507 default : 38508 break; 38509 } 38510 } 38511 }); 38512 }, 38513 setBlockAfterUI: function () 38514 { 38515 alert(__('AUTHOR.BLOCKED', 'APP.BOARD.BLOCK.JS')); 38516 }, 38517 unBlock: function (iBoardNo, iNo, sTargetType) 38518 { 38519 if (APP_BOARD_BLOCK.bAction) { 38520 return; 38521 } 38522 if (CAPP_ASYNC_METHODS.IS_LOGIN === false) { 38523 alert(__('YOU.NEED.SHOPPING.MALL', 'APP.BOARD.BLOCK.JS')); 38524 location.replace("/member/login.html?returnUrl=" + window.location.pathname); 38525 return; 38526 } 38527 var iBoardNo = parseInt(iBoardNo, 10); 38528 var iNo = parseInt(iNo, 10); 38529 if (iNo < 1 || iBoardNo < 1) { 38530 return; 38531 } 38532 var sQuestion = ''; 38533 if (sTargetType === 'NO_M_BULLETIN') { 38534 sQuestion = __('ARE.SURE.POST', 'APP.BOARD.BLOCK.JS'); 38535 } else { 38536 sQuestion = __('ARE.SURE.THE.AUTHOR.UNBLOCK', 'APP.BOARD.BLOCK.JS'); 38537 } 38538 var bAnswer =confirm(sQuestion); 38539 if (bAnswer === false) { 38540 return; 38541 } 38542 APP_BOARD_BLOCK.bAction = true; 38543 this.unBlockCore(iBoardNo, iNo); 38544 }, 38545 unBlockCore: function (iBoardNo, iNo) 38546 { 38547 var self = APP_BOARD_BLOCK; 38548 EC$.ajax({ 38549 type: 'get', 38550 dataType: 'json', 38551 url: '/exec/front/shop' + CAFE24.SDE_SHOP_NUM + '/board/blockDelete', 38552 data: { 38553 'board_no': iBoardNo, 38554 'no': iNo 38555 }, 38556 success: function(oResult) { 38557 switch (oResult.code) { 38558 case '0000': 38559 self.deleteBlockListCache(); 38560 location.reload(); // íë©´ì ë ¸ì¶ìí¤ê¸° ìí´ ìë¡ê³ 침 38561 break; 38562 default: 38563 break; 38564 } 38565 } 38566 }); 38567 }, 38568}; 38569 38570EC$(function () { 38571 try { 38572 APP_BOARD_BLOCK.init(); 38573 } catch (e) { 38574 console.log(e); // íë¡ í¸ì ìí¥ê°ì§ ìëë¡ ì²ë¦¬ 38575 } 38576}); 38577 38578/** 38579 * ìíìì¸ ê²ìí ìº¡ì± ê´ë¦¬ 38580 */ 38581var APP_BOARD_CAPTCHA = { 38582 /** 38583 * ì´ê¸°í 38584 */ 38585 init: function () { 38586 if (!CAFE24 && !CAFE24.BOARD) { 38587 return; 38588 } 38589 38590 this.initCaptchaObserver(CAFE24.BOARD.captcha_config_review, 'review'); 38591 this.initCaptchaObserver(CAFE24.BOARD.captcha_config_qna, 'qna'); 38592 }, 38593 38594 /** 38595 * ìº¡ì± ê´ë¦¬ 38596 * @param {object} oConfig 38597 * @param {string} sType 38598 */ 38599 initCaptchaObserver: function (oConfig, sType) { 38600 // configê° ì ìì ì¼ë¡ ì¤ì ëì§ ììê±°ë, ëê¸ì ì¬ì©íì§ ìê±°ë, ìº¡ì± ì¬ì© ìí¨ ì¤ì ì´ë©´ ì¢ ë£ 38601 if (!oConfig || oConfig.use_comment !== 'T' || oConfig.use_captcha_comment !== 'T') { 38602 return; 38603 } 38604 38605 // CAPP_ASYNC_METHODSê° ì ìëì§ ììì¼ë©´ ì¢ ë£ 38606 if (typeof CAPP_ASYNC_METHODS === 'undefined') { 38607 return; 38608 } 38609 38610 // ë¹íìì´ë íì ìº¡ì± ì¬ì© ì¬ë¶ íì¸ 38611 var bShouldUseCaptcha = (CAPP_ASYNC_METHODS.IS_LOGIN === false && oConfig.use_captcha_non_member === 'T') || 38612 (CAPP_ASYNC_METHODS.IS_LOGIN === true && oConfig.use_captcha_member === 'T'); 38613 38614 if (!bShouldUseCaptcha) { 38615 return; 38616 } 38617 38618 // MutationObserver ì§ì íì¸ 38619 if (window.MutationObserver) { 38620 this.observeWithMutation(sType); 38621 } else { 38622 // fallback: MutationObserver를 ì§ìíì§ ìë ê²½ì° interval ì¬ì© 38623 setInterval(() => this.setCaptchaVisible(sType), 500); 38624 } 38625 }, 38626 38627 /** 38628 * MutationObserver ì¬ì© 38629 * @param {string} sType 38630 */ 38631 observeWithMutation: function (sType) { 38632 var observer = new MutationObserver(() => { 38633 this.setCaptchaVisible(sType); 38634 }); 38635 38636 var targetNode = document.querySelector('.xans-product-' + sType); 38637 if (targetNode) { 38638 observer.observe(targetNode, { 38639 childList: true, 38640 subtree: true 38641 }); 38642 // ì´ê¸° ìí ì²´í¬ 38643 this.setCaptchaVisible(sType); 38644 } 38645 }, 38646 38647 /** 38648 * ìº¡ì± ë ¸ì¶ ì²ë¦¬ 38649 * @param {string} sType 38650 */ 38651 setCaptchaVisible: function (sType) { 38652 var aCaptchaElements = document.querySelectorAll('.xans-product-' + sType + ' .captcha'); 38653 38654 if (aCaptchaElements.length < 1) { 38655 return; 38656 } 38657
38658 aCaptchaElements.forEach(function (oCaptchaElement) { 38659 var oCaptchaInput = oCaptchaElement.querySelector('input[name="captcha"]'); 38660 if (oCaptchaInput) { 38661 // validation ìì± ì¶ê° 38662 oCaptchaInput.setAttribute('fw-filter', 'isFill'); 38663 // ë ¸ì¶ ì²ë¦¬ 38664 oCaptchaElement.classList.remove('displaynone'); 38665 } 38666 }); 38667 } 38668}; 38669 38670window.addEventListener('load', function() { 38671 APP_BOARD_CAPTCHA.init(); 38672}); 38673 38674/** 38675 * ìë¦¬ë¨¼í¸ ì¢ ë¥ë³ ê° ê°ì ¸ì¤ê¸° form ì ìí ëì¼í name ê° êµ¬ë³ 38676 * 38677 * - ì¤ë¸ì í¸ë¥¼ ë°ìì ì¬ì©í ì ìê²í¨. 38678 * 38679 * @param String id 38680 * @return 38681 * @author ë°ëí <[email protected]>, 백충ë <[email protected]>, ì´ì¬ì± <[email protected]> 38682 */ 38683AuthSSLManager.getValue = function(id) { 38684 //id ê° stringì¸ ê²½ì° 38685 if (typeof id === 'string') { 38686 var divide, o, type; 38687 38688 divide = id.split('::'); 38689 if (divide.length == 1) { 38690 o = document.getElementsByName(id); 38691 } else { 38692 var frm = divide[0], id = divide[1]; 38693 38694 // radio, checkbox 38695 if (EC$('#'+ EC$.escapeSelector(id)).length==0) { 38696 val = this.checkbox({'name': id, 'mode': 'val'}); 38697 return val; 38698 } 38699 o = document.forms[frm][id]; 38700 } 38701 38702 if (o == null || o == undefined || o.value == null || o.value == undefined) { 38703 o = document.getElementsByName(id); 38704 // ì ì²´ html ìì id ê°ì´ ìì§ë§ form ë°ì ììì ìì¼ë¯ë¡ ì¡°ê±´ì¶ê° (ECHOSTING-265537) 38705 val = (o[0] == undefined) ? '' : o[0].value; 38706 } else { 38707 val = o.value; 38708 } 38709 38710 return val; 38711 38712 } else if (typeof id === 'object') { 38713 //idê° objectì¸ ê²½ì° 38714 38715 //ì¤ì§ íëì ì¤ë¸ì í¸ì ëí´ìë§ ì²ë¦¬ 38716 if (EC$(id).length == 1) { 38717 return EC$(id).val(); 38718 } else { 38719 return ''; 38720 } 38721 38722 } else { 38723 // idê° string ëë objectê° ìë ê²½ì° ë¹ ê° ë¦¬í´ 38724 return ''; 38725 } 38726}; 38727 38728/** 38729 * ìë¦¬ë¨¼í¸ ì¢ ë¥ë³ ê° ê°ì ¸ì¤ê¸° form ì ìí ëì¼í name ê° êµ¬ë³ 38730 * @param String id 38731 * @return 38732 * @author ë°ëí <[email protected]>, 백충ë <[email protected]> 38733 */ 38734AuthSSLManager.getValuePay = function(id) { 38735 var divide, o, type; 38736 38737 // idê° stringì´ ìë ê²½ì° ë¹ ê° ë¦¬í´ 38738 if (typeof id !== 'string') return ''; 38739 38740 divide = id.split('::'); 38741 var frm = divide[0], id = divide[1]; 38742 38743 // radio, checkbox 38744 if (EC$('#'+id).length==0) { 38745 val = this.checkbox({'name': id, 'mode': 'val'}); 38746 return val; 38747 } 38748 38749 o = document.forms[frm][id]; 38750 38751 if (o == null || o == undefined || o.value == null || o.value == undefined) { 38752 o = document.getElementsByName(id); 38753 val = o[0].value; 38754 } else { 38755 val = o.value; 38756 } 38757 38758 return val; 38759}; 38760 38761/** 38762 * ìí¸í param ë°ì´í° ì¸í 38763 * @param array param ìí¸í ê´ë ¨ 38764 * @return string p ìí¸í param 38765 * @author ë°ëí <[email protected]> 38766 * */ 38767AuthSSLManager.setParam = function(param) { 38768 var p = []; 38769 if (param['auth_mode'] == 'encrypt1.9') { 38770 p.push('auth_mode=encrypt'); 38771 } else { 38772 p.push('auth_mode=' + param['auth_mode']); 38773 } 38774 p.push('auth_callbackName=' + param['auth_callbackName']); 38775 switch (param['auth_mode']) { 38776 case 'encrypt1.9': 38777 var aEle = param['aEleId'], o, p2 = {}, v; 38778 var divide = ''; 38779 var id = ''; 38780 for (var i in aEle) { 38781 if (aEle.hasOwnProperty(i) == false) continue; 38782 v = this.getValuePay(aEle[i]); 38783 38784 if (v == -1) continue; 38785 38786 divide = aEle[i].split('::'); 38787 id = divide[1]; 38788 38789 p2[id] = this.getValuePay(aEle[i]); 38790 } 38791 p.push('auth_string=' + encodeURIComponent(__JSON.stringify(p2))); 38792 break; 38793 case 'encrypt': 38794 var aEle = param['aEleId'], o, p2 = {}, v; 38795 for (var i in aEle) { 38796 if (aEle.hasOwnProperty(i) == false) continue; 38797 v = this.getValue(aEle[i]); 38798 38799 if (v == -1) continue; 38800 38801 //ìí¸í ëìì´ ì¤ë¸ì í¸ì¸ê²½ì° idê°ì´ keyê° ëë¤. 38802 if (typeof aEle[i] === 'object') { 38803 p2[EC$(aEle[i]).attr('id')] = this.getValue(aEle[i]); 38804 } else { 38805 p2[aEle[i]] = this.getValue(aEle[i]); 38806 } 38807 } 38808 p.push('auth_string=' + encodeURIComponent(__JSON.stringify(p2))); 38809 break; 38810 case 'decrypt': 38811 case 'decryptClient': 38812 p.push('auth_string=' + encodeURIComponent(param['auth_string'])); 38813 break; 38814 } 38815 38816 return p; 38817}; 38818 38819 38820/**
38821 * radio, checkbox ê° ê°ì ¸ì¤ê¸° 38822 * @param object options ìµì 38823 * @return string radio ëë checkbox value ë°í 38824 * @author ë°ëí <[email protected]>, 백충ë <[email protected]> 38825 * */ 38826AuthSSLManager.checkbox = function(options) 38827{ 38828 var o = document.getElementsByName(options.name); 38829 if (o == null) return; 38830 38831 // element ìì 38832 if (o.length<1) { 38833 var chk = false; 38834 var o = document.getElementById(options.name); 38835 if (o == null) return ''; 38836 if (o.checked == true) var chk = true; 38837 return chk == true ? o.value : ''; 38838 } 38839 38840 var bChecked = false; 38841 var aChk = new Array(); 38842 for (var i = 0; i < o.length; i++) { 38843 var el = EC$('#'+o[i].id); 38844 38845 if (el.prop('checked') == true) { 38846 // RADIO 38847 if (el.prop('type') == 'radio') return el.val(); 38848 // CHECKBOX 38849 else if (el.prop('type') == 'checkbox') { 38850 aChk.push(el.val()); 38851 bChecked = true; 38852 } 38853 } 38854 } 38855 38856 if (options.mode == 'val') { 38857 if (bChecked == false) return ''; 38858 38859 if (aChk.length>0) return aChk.join('|'); 38860 } 38861}; 38862 38863 38864/** 38865 * AuthSSLì íµí´ submitì í í¼ í´ëì¤ 38866 * @author 백충ë <[email protected]> 38867 * @since 2011. 6. 16 38868 * */ 38869var FormSSL = function() 38870{ 38871 /** 38872 * í¼ ìì´ë 38873 * @var string 38874 * */ 38875 this.sFormId = null; 38876 /** 38877 * ìí¸í ìí¬ ìë¦¬ë¨¼í¸ id ë°°ì´ 38878 * @var array 38879 * */ 38880 this.aEleId = null; 38881 38882 /** 38883 * onsubmit bind 38884 * @param string sFormId bind í í¼ ìì´ë 38885 * @param array aEleId ìí¸íí ìë¦¬ë¨¼í¸ id ë°°ì´ 38886 * */ 38887 this.bind = function(sFormId, aEleId) 38888 { 38889 var self = this; 38890 38891 this.sFormId = sFormId; 38892 this.aEleId = aEleId; 38893 38894 var oForm = EC$('#'+sFormId); 38895 oForm.off('submit'); 38896 oForm.on('submit', function() { 38897 AuthSSL.Submit(self.sFormId, self.aEleId); 38898 38899 return false; 38900 }); 38901 }; 38902 38903 /** 38904 * AuthSSL submit ì¤í 38905 * */ 38906 this.submit = function() 38907 { 38908 AuthSSL.Submit(this.sFormId, this.aEleId); 38909 return false; 38910 }; 38911}; 38912 38913 38914/** 38915 * AuthSSL í¼ ê°ì²´ 리ì¤í¸ ê´ë¦¬ 38916 * @author 백충ë <[email protected]> 38917 * @since 2011. 6. 16 38918 * */ 38919var FormSSLContainer = { 38920 /** 38921 * í¼ ê°ì²´ 리ì¤í¸ 38922 * @var object 38923 * */ 38924 aFormSSL: {}, 38925 38926 /** 38927 * í¼ ê°ì²´ ìì± ë° ë¦¬ì¤í¸ì ì¶ê° 38928 * @param string sFormId ê°ì²´ë¡ ìì±í í¼ ìì´ë 38929 * @param array aEleId ìí¸í í ìë¦¬ë¨¼í¸ ìì´ë 38930 * */ 38931 create: function (sFormId, aEleId) 38932 { 38933 if (this.formExists(sFormId)==false) { 38934 var oFormSSL = new FormSSL(); 38935 oFormSSL.bind(sFormId, aEleId); 38936 this.aFormSSL[sFormId] = oFormSSL; 38937 } 38938 }, 38939 38940 /** 38941 * í¼ ìì´ëë¡ AuthSSL submit ì¤í 38942 * @param string sFormId í¼ ìì´ë 38943 * */ 38944 submit: function (sFormId) 38945 { 38946 if (this.formExists(sFormId)==false) return; 38947 38948 this.aFormSSL[sFormId].submit(); 38949 }, 38950 38951 /** 38952 * í¼ ìì´ëë¡ FormSSLContainerì í´ë¹ í¼ì´ ìëì§ ì²´í¬ 38953 * @param string sFormId ì²´í¬í í¼ ìì´ë 38954 * @return bool í¼ì´ ìì¼ë©´ true, ìì¼ë©´ false 38955 * */ 38956 formExists: function (sFormId) 38957 { 38958 if (!this.aFormSSL[sFormId]) return false; 38959 else return true; 38960 } 38961}; 38962 38963 38964/** 38965 * AuthSSL í´ëì¤ 38966 * @author 백충ë <[email protected]> 38967 * @since 2011. 6. 16 38968 * */ 38969var AuthSSL = { 38970 /** 38971 * SSL on/off 38972 * @var bool 38973 * */ 38974 bIsSsl: true, 38975 /** 38976 * í¼ ìì´ë 38977 * @var string 38978 * */ 38979 sFormId: null, 38980 /** 38981 * ìë¦¬ë¨¼í¸ ìì´ë 38982 * @var array 38983 * */ 38984 aEleId: null, 38985 /** 38986 * í¼ ê°ì²´ (jQuery) 38987 * @var object 38988 * */ 38989 oFormSubmit: null, 38990 /** 38991 * ìí¸í ë 문ìì´ì´ ì ì¥ë input hidden id 38992 * @var string 38993 * */ 38994 sEncryptId: 'encrypted_str', 38995 /** 38996 * callback í¨ì ì´ë¦ 38997 * @var string 38998 * */ 38999 sCallbackName: 'AuthSSL.encryptSubmit_Complete', 39000 39001 /** 39002 * 멤ë²ë³ì ì¸í 39003 * @param string sFormId í¼ ìì´ë 39004 * @param array aEleId ìë¦¬ë¨¼í¸ ìì´ë 39005 * */ 39006 init: function(sFormId, aEleId) 39007 { 39008 this.sFormId = sFormId; 39009 this.aEleId = aEleId; 39010 this.oFormSubmit = EC$('#' + sFormId); 39011 }, 39012 39013 /** 39014 * AuthSSLManager ì¡´ì¬ì¬ë¶ ì²´í¬ 39015 * @return bool ì¡´ì¬íë©´ true, ìëë©´ false ë°í 39016 * */ 39017 checkAvailable: function() 39018 { 39019 // AuthSSLManagerê° ìì 39020 if (typeof AuthSSLManager!=='object') { 39021 alert('[Error]\nneed SSL Manager'); 39022 return false;
39023 } 39024 39025 return true; 39026 }, 39027 39028 /** 39029 * onsubmit bind 39030 * @param string sFormId í¼ ìì´ë 39031 * @param array aEleId ìí¸ííê³ ì íë íëì id 39032 * */ 39033 Bind: function(sFormId, aEleId) 39034 { 39035 FormSSLContainer.create(sFormId, aEleId); 39036 }, 39037 39038 /** 39039 * ìí¸í ìì² í¨ì - submit 39040 * @param string sFormId í¼ ìì´ë 39041 * @param array aEleId ìë¦¬ë¨¼í¸ ìì´ë 39042 * */ 39043 Submit: function(sFormId, aEleId) { 39044 // AuthSSLManager ì¡´ì¬ì¬ë¶ ì²´í¬ 39045 if (this.checkAvailable()==false) return false; 39046 39047 // í¼ ìì´ë, ìë¦¬ë¨¼í¸ ìì´ë ì¸í 39048 this.init(sFormId, aEleId); 39049 39050 // ìí¸í ìì²ì´ ìë ê²½ì° ê·¸ë¥ submit 39051 if (this.bIsSsl == false) { 39052 this.disabledSslSubmit(); 39053 return false; 39054 } 39055 39056 // ìí¸í ë ê°ì ë°ì input_hidden ìì± 39057 var oInput = document.createElement('input'); 39058 oInput.type = 'hidden'; 39059 oInput.name = oInput.id = this.sEncryptId; 39060 this.oFormSubmit.append(oInput); 39061 39062 // ìí¸í ìì² 39063 this.encrypt(this.aEleId, this.sCallbackName); 39064 }, 39065 39066 /** 39067 * ìí¸í ìì² 39068 * @param array aEleId ìí¸íí ìë¦¬ë¨¼í¸ id 39069 * @param string sCallbackName ì½ë°±í¨ì ì´ë¦ 39070 * */ 39071 encrypt: function(aEleId, sCallbackName) { 39072 AuthSSLManager.weave({ 39073 'auth_mode': 'encrypt', 39074 'aEleId': aEleId, 39075 'auth_callbackName': sCallbackName 39076 }); 39077 }, 39078 39079 /** 39080 * ìí¸í ì²ë¦¬ê²°ê³¼ callback í¨ì 39081 * @param string sOutput ìí¸í ë ì²ë¦¬ê²°ê³¼ 39082 * */ 39083 encryptSubmit_Complete: function(sOutput) { 39084 // Error 39085 if (AuthSSLManager.isError(sOutput) == true) { 39086 alert('[Error]\n'+sOutput); 39087 return; 39088 } 39089 39090 // ìí¸í ì²ë¦¬ë ì리먼í¸ì value ì ê±° 39091 this.delInputValue(); 39092 39093 // input_hiddenì ìí¸í ë ê²°ê³¼ê° ëì 39094 this.oFormSubmit.find('[id="'+this.sEncryptId+'"]').val(sOutput); 39095 39096 // Form Submit 39097 this.oFormSubmit.off('submit'); 39098 39099 this.delInputValue(); 39100 39101 this.oFormSubmit.submit(); 39102 }, 39103 39104 /** 39105 * INPUT.RADIO, INPUT.CHECKBOXì value ì§ì 39106 * @param string sName ê°ì ì§ì°ê³ ì íë elementì name 39107 * */ 39108 delRadioValue: function(sName) { 39109 var oEle = document.getElementsByName(sName); 39110 if (oEle.length>0) { 39111 39112 for (var i = 0; i < oEle.length; i++) { 39113 39114 oEle[i].value = ''; 39115 39116 if (oEle[i].defaultValue) { 39117 39118 oEle[i].defaultValue = ''; 39119 } 39120 } 39121 } 39122 }, 39123 39124 /** 39125 * ìí¸í ë í¼ ììë¤ì ê°ì ì§ì 39126 */ 39127 delInputValue: function() { 39128 for (var i=0; i<this.aEleId.length; i++) { 39129 39130 // ê°ì ì§ì¸ elementì id ê°ì ¸ì¤ê¸° 39131 var sID = AuthSSL.getEleId(this.aEleId[i]); 39132 var oEle = this.oFormSubmit.find('[id="' + sID + '"]'); 39133 39134 // id를 í기íì§ ìê³ nameë§ í기í radio, checkbox 39135 if (oEle.length == 0) { 39136 39137 this.delRadioValue(sID); 39138 continue; 39139 } 39140 39141 // SELECT 39142 if (oEle.is('SELECT')) { 39143 39144 var oSelect = oEle.children('option:selected'); 39145 oSelect.val(''); 39146 oSelect.prop('value', ''); 39147 oSelect.prop('defaultValue', ''); 39148 } 39149 // INPUT.TEXT, INPUT.PASSWORD, TEXTAREA 39150 else { 39151 39152 oEle.val(''); 39153 oEle.prop('value', ''); 39154 oEle.prop('defaultValue', ''); 39155 } 39156 } // for 39157 }, 39158 39159 /** 39160 * ë겨ë°ì idìì í¼ ìì´ëì 구ë¶ì를 ì ê±°íì¬ ê°ì ¸ì¤ê¸° 39161 * @param string sOrgID ì본 í¼ ìì´ë 39162 * @return string í¼ ìì´ëì 구ë¶ìê° ì ê±°ë ìì´ë ë°í 39163 * */ 39164 getEleId: function(sOrgID) 39165 { 39166 var sID = sOrgID; 39167 if (/::/.test(sID)==true) { 39168 var aTmp = sID.split('::'); 39169 sID = aTmp[1]; 39170 } 39171 39172 return sID; 39173 }, 39174 39175 /** 39176 * bIsSslì´ false ì¼ë ì¤í 39177 */ 39178 disabledSslSubmit: function() { 39179 this.oFormSubmit.off('submit'); 39180 this.oFormSubmit.submit(); 39181 } 39182}; 39183 39184 39185// validator submit hook 39186EC$(function() { 39187 if (typeof FwValidator === 'undefined') return; 39188 39189 FwValidator.Handler.setBeforeSubmit(function(elmForm) { 39190 // AuthSSL ì¬ì©í¼ 39191 if (FormSSLContainer.formExists(elmForm.attr('id'))==true) { 39192 if (!FormSSLContainer) return true; 39193 39194 FormSSLContainer.submit(elmForm.attr('id')); 39195 return false;
39196 } 39197 39198 // AuthSSL ì¬ì©í¼ì´ ìë ê²½ì° ê·¸ë¥ submit 39199 return true; 39200 }); 39201}); 39202 39203EC$(function() { 39204 EC$('.btn_qna').click(function() { 39205 var cont_id = EC$(this).attr('rel'); 39206 39207 EC$('#qna_'+cont_id).toggle(); 39208 }); 39209 39210 EC_PRODUCT_FRONT_BOARD_QNA.init(); 39211}); 39212 39213var EC_PRODUCT_FRONT_BOARD_QNA = { 39214 bInit : false, 39215 init : function() { 39216 if (this.bInit === true) { 39217 return; 39218 } 39219 this.bInit = true; 39220 this.board_link_alert(); 39221 }, 39222 39223 board_link_alert: function() { 39224 EC$('.xans-product-qna').on('click', 'a', function(event) { 39225 // URL ìì± ì ì í¨ì± ê²ì¬ ì¶ê° 39226 try { 39227 var link = event.target.href; 39228 var linkDomain = new URL(link).hostname; 39229 } catch (e) { 39230 return; 39231 } 39232 39233 var currentDomain = window.location.hostname; 39234 39235 if (linkDomain != '' && linkDomain !== currentDomain) { 39236 if (confirm(__('PAGE.ARE.TRYING.ACCESS', 'BOARD.JS.APP.BOARD.READ')) === false) { 39237 event.preventDefault(); 39238 return false; 39239 } 39240 } 39241 }); 39242 }, 39243 39244 modify: function (iBulletinNo, iProductNo) { 39245 if (typeof CAFE24.FRONT_EXTERNAL_SCRIPT_VARIABLE_DATA.common_member_id_crypt !== 'undefined' 39246 && CAFE24.FRONT_EXTERNAL_SCRIPT_VARIABLE_DATA.common_member_id_crypt.length > 0) { 39247 var sUrl = '/board/product/modify.html?board_act=edit&no=' + iBulletinNo + '&board_no=6&link_product_no=' + iProductNo; 39248 39249 var oEncryptedStr = document.createElement('input'); 39250 oEncryptedStr.setAttribute('type', 'hidden'); 39251 oEncryptedStr.setAttribute('name', 'encrypted_str'); 39252 oEncryptedStr.setAttribute('value', 'dummy'); // íì ë¹ë°ë²í¸ ê²ì¦ ë¡ì§ì íì°ê¸° ìí íì ë³ìì´ë¯ë¡ dummy ê°ì ì¤ì´ ë³´ë 39253 39254 var oForm = document.createElement('form'); 39255 oForm.action = sUrl; 39256 oForm.method = 'post'; 39257 39258 oForm.appendChild(oEncryptedStr); 39259 39260 document.body.appendChild(oForm); 39261 oForm.submit(); 39262 } else { 39263 var sMessage = __('PLEASE.ENTER.PASSWORD', 'JS.FRONT.PRODUCT.QNA'); 39264 39265 if (confirm(sMessage)) { 39266 location.href = '/board/product/read.html?no=' + iBulletinNo + '&board_no=6'; 39267 } 39268 } 39269 } 39270}; 39271 39272/** 39273 * ì ìíµê³ & ì¤ìê°ì ìíµê³ 39274 */ 39275EC$(function() { 39276 // ì´ë¯¸ ì¤í ëìì ê²½ì° ì¢ ë£ 39277 // ECHOSTING-631556 ì ìíµê³ V3 IFrame(#log_realtime) ì ê±°ë¡ DOM ê¸°ì¤ ì¤ë³µ ì¤í ê°ë를 íëê·¸ë¡ ëì²´ 39278 if (window.bEcWeblogLoaded === true) { 39279 return; 39280 } 39281 window.bEcWeblogLoaded = true; 39282 39283 // ECHOSTING-631556 ì ìíµê³ V3 IFrame(/exec/front/eclog/main/) ì ì¡ ì¤ë¨ 39284 // - IFrame ì½ì ë¶ ë° ì ì© í¬í¼(stripDebug) ì ê±° 39285 // - cfa.js ë¡ëë ì ìíµê³ì 무ê´í ë³ë ìì§ê¸°ì´ë¯ë¡ ì ì§íë¤. 39286 39287 // eclog2.0, eclog1.9 39288 var sTime = new Date().getTime(); //ECHOSTING-54575 39289 39290 // ì ìíµê³ ìë²ê°ì´ ìë¤ë©´ weblog.js í¸ì¶ 39291 // ECHOSTING-427891 ì ì¡ íì§ ìëë¡ ì ê±° 39292// if (aLogData.log_server1 != null && aLogData.log_server1 != '') { 39293// var sScriptSrc = '//' + aLogData.log_server1 + '/weblog.js?uid=' + aLogData.mid + '&uname=' + aLogData.mid + '&r_ref=' + document.referrer + '&shop_no=' + aLogData.shop_no; 39294// if (mobileWeb === true) sScriptSrc += '&cafe_ec=mobile'; 39295// sScriptSrc += '&t=' + sTime;//ECHOSTING-54575 39296// var node = document.createElement('script'); 39297// node.setAttribute('type', 'text/javascript'); 39298// node.setAttribute('src', sScriptSrc); 39299// node.setAttribute('id', 'log_script'); 39300// document.body.appendChild(node); 39301// } 39302 39303 // CA (Cafe24 Analytics 39304 if (aLogData.ca != null) { 39305 (function (i, s, o, g, r, a, m, n, d) { 39306 i['cfaObject'] = g; 39307 i['cfaUid'] = r; 39308 i['cfaStype'] = a; 39309 i['cfaDomain'] = m; 39310 i['cfaSno'] = n; 39311 i['cfaEtc'] = d; 39312 a = s.createElement(o), m = s.getElementsByTagName(o)[0]; 39313 a.async = 1; 39314 a.src = g; 39315 a.setAttribute('crossorigin', 'anonymous'); 39316 m.parentNode.insertBefore(a, m); 39317 })(window, document, 'script', '//' + aLogData.ca +'?v=' + sTime, aLogData.mid, aLogData.stype, aLogData.domain, aLogData.shop_no, aLogData.etc); 39318 } 39319}); 39320 39321(function(window) { 39322 window.htmlentities = { 39323 /** 39324 * Converts a string to its html characters completely. 39325 * 39326 * @param {String} str String with unescaped HTML characters 39327 **/ 39328 encode: function(str) { 39329 var buf = []; 39330 39331 for (var i=str.length-1; i>=0; i--) {
39332 buf.unshift(['&#', str[i].charCodeAt(), ';'].join('')); 39333 } 39334 39335 return buf.join(''); 39336 }, 39337 /** 39338 * Converts an html characterSet into its original character. 39339 * 39340 * @param {String} str htmlSet entities 39341 **/ 39342 decode: function(str) { 39343 return str.replace(/&#(\d+);/g, function(match, dec) { 39344 return String.fromCharCode(dec); 39345 }); 39346 } 39347 }; 39348})(window); 39349 39350CAFE24.CRYPTOKEY = (function () { 39351 const algorithm = { 39352 name: "AES-CBC", 39353 length: 256 39354 }; 39355 39356 const DB_NAME = "d1"; 39357 const DB_VERSION = 1; 39358 const STORE_NAME = "s1"; 39359 const STORE_KEY = "eto3"; 39360 const KEY_MAX_AGE_MS = 24 * 60 * 60 * 1000; // 1 day 39361 39362 function openDB() { 39363 return new Promise((resolve, reject) => { 39364 const request = window.indexedDB.open(DB_NAME, DB_VERSION); 39365 39366 request.onupgradeneeded = function (event) { 39367 const db = event.target.result; 39368 if (!db.objectStoreNames.contains(STORE_NAME)) { 39369 db.createObjectStore(STORE_NAME); 39370 } 39371 }; 39372 39373 request.onsuccess = function () { 39374 resolve(request.result); 39375 }; 39376 39377 request.onerror = function () { 39378 reject(request.error); 39379 }; 39380 }); 39381 } 39382 39383 async function saveKey(key) { 39384 const db = await openDB(); 39385 39386 return new Promise((resolve, reject) => { 39387 const tx = db.transaction(STORE_NAME, "readwrite"); 39388 const store = tx.objectStore(STORE_NAME); 39389 const request = store.put({ ts: Date.now(), key: key }, STORE_KEY); 39390 39391 request.onsuccess = function () { 39392 resolve(true); 39393 }; 39394 39395 request.onerror = function () { 39396 reject(request.error); 39397 }; 39398 39399 tx.oncomplete = function () { 39400 db.close(); 39401 }; 39402 }); 39403 } 39404 39405 async function loadKey() { 39406 const db = await openDB(); 39407 39408 return new Promise((resolve, reject) => { 39409 const tx = db.transaction(STORE_NAME, "readonly"); 39410 const store = tx.objectStore(STORE_NAME); 39411 const request = store.get(STORE_KEY); 39412 39413 request.onsuccess = async function () { 39414 const record = request.result; 39415 39416 if (!record || !record.key) { 39417 resolve(null); 39418 return; 39419 } 39420 39421 if (!record.ts || (Date.now() - record.ts) > KEY_MAX_AGE_MS) { 39422 tx.oncomplete = function () { 39423 db.close(); 39424 }; 39425 39426 try { 39427 await CAFE24.CRYPTOKEY.deleteKey(); 39428 } catch (e) { 39429 // ignore delete failure 39430 } 39431 39432 resolve(null); 39433 return; 39434 } 39435 39436 resolve(record.key); 39437 }; 39438 39439 request.onerror = function () { 39440 reject(request.error); 39441 }; 39442 39443 tx.oncomplete = function () { 39444 db.close(); 39445 }; 39446 }); 39447 } 39448 39449 async function deleteKey() { 39450 const db = await openDB(); 39451 39452 return new Promise((resolve, reject) => { 39453 const tx = db.transaction(STORE_NAME, "readwrite"); 39454 const store = tx.objectStore(STORE_NAME); 39455 const request = store.delete(STORE_KEY); 39456 39457 request.onsuccess = function () { 39458 resolve(true); 39459 }; 39460 39461 request.onerror = function () { 39462 reject(request.error); 39463 }; 39464 39465 tx.oncomplete = function () { 39466 db.close(); 39467 }; 39468 }); 39469 } 39470 39471 async function generateKey() { 39472 const key = await window.crypto.subtle.generateKey( 39473 algorithm, 39474 false, 39475 ["encrypt", "decrypt"] 39476 ); 39477 return key; 39478 } 39479 39480 async function encryptData(data, key) {
39481 const encodedData = new TextEncoder().encode(data); 39482 const iv = window.crypto.getRandomValues(new Uint8Array(16)); 39483 const encryptedData = await window.crypto.subtle.encrypt( 39484 { name: "AES-CBC", iv: iv }, 39485 key, 39486 encodedData 39487 ); 39488 return { encryptedData, iv }; 39489 } 39490 39491 async function decryptData(encryptedData, iv, key) { 39492 const decryptedData = await window.crypto.subtle.decrypt( 39493 { name: "AES-CBC", iv: iv }, 39494 key, 39495 encryptedData 39496 ); 39497 return new TextDecoder().decode(decryptedData); 39498 } 39499 39500 return { 39501 generateKey, 39502 saveKey, 39503 loadKey, 39504 deleteKey, 39505 encryptData, 39506 decryptData 39507 }; 39508})(); 39509 39510 39511CAFE24.CRYPTOKEY.encryptAndSave = async function (name, data) { 39512 let key = await CAFE24.CRYPTOKEY.loadKey(); 39513 39514 if (!key) { 39515 key = await CAFE24.CRYPTOKEY.generateKey(); 39516 await CAFE24.CRYPTOKEY.saveKey(key); 39517 } 39518 39519 const result = await CAFE24.CRYPTOKEY.encryptData(data, key); 39520 const encryptedData = new Uint8Array(result.encryptedData); 39521 const iv = new Uint8Array(result.iv); 39522 39523 window.sessionStorage.setItem(`eto4${name}`, JSON.stringify(Array.from(encryptedData))); 39524 window.sessionStorage.setItem(`eto5${name}`, JSON.stringify(Array.from(iv))); 39525}; 39526 39527 39528CAFE24.CRYPTOKEY.decryptAndLoad = async function (name) { 39529 const loadedKey = await CAFE24.CRYPTOKEY.loadKey(); 39530 if (!loadedKey) return null; 39531 39532 const encryptedData = window.sessionStorage.getItem(`eto4${name}`); 39533 const iv = window.sessionStorage.getItem(`eto5${name}`); 39534 39535 if (!encryptedData || !iv) return null; 39536 39537 const encryptedArray = new Uint8Array(JSON.parse(encryptedData)); 39538 const ivArray = new Uint8Array(JSON.parse(iv)); 39539 39540 return await CAFE24.CRYPTOKEY.decryptData( 39541 encryptedArray.buffer, 39542 ivArray.buffer, 39543 loadedKey 39544 ); 39545}; 39546/** 39547 * íë¡ í¸ ë¡ê·¸ì¸ ìí ê°ë 39548 * 39549 * bfcache ë³µì(pageshow persisted) ëë ë¸ë¼ì°ì HTTP ìºì ì¬ì¬ì©ì¼ë¡ íìë 문ìê° 39550 * íì¬ ë¡ê·¸ì¸ ìí(ec_mem_level ì¿ í¤)ì ë¤ë¥´ë©´ ì¬ë¡ëíì¬ íë©´ê³¼ ì¤ì ìí를 ì¼ì¹ìí¨ë¤. 39551 * - bfcache ê²½ë¡: JS íì´ ë³´ì¡´ëë¯ë¡ ë ë ìì ì¿ í¤ ì¤ë ì·ê³¼ íì¬ ì¿ í¤ë¥¼ ë¹êµ 39552 * - HTTP ìºì ì¬ì¬ì© ê²½ë¡: JSê° ì¬ì¤íëì´ ì¤ë ì·ì´ 무í¨ì´ë¯ë¡ ìë² ë ë ì°ì¶ë¬¼(ë¡ê·¸ì¸/ë¡ê·¸ìì 모ë DOM)ê³¼ íì¬ ì¿ í¤ë¥¼ ë¹êµ 39553 * ë¶ì¼ì¹ì¼ ëë§ ì¬ë¡ëíë¯ë¡ ë¹ë¡ê·¸ì¸ ì¬ì©ìì bfcache ë³µì(ë¤ë¡ê°ê¸° 목ë¡/ì¤í¬ë¡¤ ì ì§)ì ê·¸ëë¡ ëìíë¤. 39554 * 39555 * @package app/Manage 39556 * @since 2026. 7. 30. 39557 * @see https://jira.simplexi.com/browse/ECQAUNIT-75013 39558 * @see https://jira.simplexi.com/browse/ECHOSTING-385628 39559 * @see https://jira.simplexi.com/browse/ECHOSTING-635932 39560 * @see https://jira.simplexi.com/browse/ECHOSTING-636994 39561 * @see https://jira.simplexi.com/browse/ECHOSTING-636472 39562 * @see https://jira.simplexi.com/browse/ECHOSTING-637169 39563 * @see https://jira.simplexi.com/browse/PLUSAPP-56623 39564 */ 39565(function() { 39566 // ìë¸íë ìììë ëìíì§ ìëë¤ - ê°ëì 목ì ì ìºì ë³µìë "ìµìì 문ì" ì ë¡ê·¸ì¸ íì ë¶ì¼ì¹ 39567 // êµì ì´ê³ , íë ì ìì location.reload() ë íë ìë§ ë¤ì ê·¸ë ¤ êµì í¨ê³¼ê° ìì¼ë©´ì ë¸ë ì´í¬ 39568 // (sessionStorage) ë§ ê³µì í´ ë¶ëª¨ë¥¼ ë°©í´íë¤. ë¡ê·¸ì¸ íì´ì§ê° same-origin ì¼ë¡ íë 39569 // /protected/loginSns.html iframe ì´ ì´ ê²½ë¡ë¤ (appMemberFrontDispLogin -> agreement_layer.tpl). 39570 // pageshow 리ì¤ë ë±ë¡ ì ì ë°íí´ì¼ íë ì 문ìê° ì¬ë¡ë íì ìì²´ì ì§ì íì§ ìëë¤. 39571 // window.top !== window.self ë 참조 ë¹êµë¿ì´ë¼ cross-origin ììììë SecurityError ê° ìë¤. 39572 if (window.top !== window.self) { 39573 return; 39574 } 39575 39576 // ë¸ë ì´í¬ë "ì´ ë¬¸ì를 ì´ë¯¸ í ë² ë¦¬ë¡ëíë¤" ë 기ìµì´ë¯ë¡ 문ì ë¨ìì¬ì¼ íë¤. ë¨ì¼ í¤ìì ë 39577 // (1) same-origin iframe ì´ ë¶ëª¨ì ê°ì 칸ì ë²ê°ì ë®ì´ì¨ ë¸ë ì´í¬ê° ë§¤ë² íë ¸ê³ (무í ì¬ë¡ëì ì§ì ìì¸) 39578 // (2) ê°ì íìì ë¤ë¥¸ 문ìë¡ ì´ëíë©´ ì 문ìì 기ìµì´ ì§ìì ¸ ëëìì¬ ë ë reload ëë¤. 39579 // (1) ì ì ìë¸íë ì ë°íì¼ë¡ë ë§íì§ë§ ìì ì¥ì¹ ì¤í¨ìë ë§í¼ ì´ì¤ì¼ë¡ ê±´ë¤. [ECHOSTING-636994] 39580 var sBrakeKey = 'EC_STATE_GUARD_RELOADED_' + location.pathname; 39581 39582 // íì¬ ë¡ê·¸ì¸ ì¬ë¶ (ë¡ê·¸ì¸ì ìì±/ë¡ê·¸ììì ìì ëë ec_mem_level ì¿ í¤ ê¸°ì¤) 39583 var hasAuthCookie = function() { 39584 return /(?:^|;\s*)ec_mem_level=/.test(document.cookie); 39585 }; 39586
39587 // ë ë ìì ë¡ê·¸ì¸ ìí ì¤ë ì· (bfcache ë³µìì íì ë³´ì¡´ë¨) 39588 var bRenderedAuth = hasAuthCookie(); 39589 39590 // ìë²ê° ë ëí ë¡ê·¸ì¸ ìí 39591 // 1ìì: ìë² ì¶ë ¥ê°(CAFE24.FRONTEND.IS_RENDERED_LOGIN) - HTML ì ë°í ìì´ ìºì ì¬ì¬ì© 문ìììë ë ë ìì ê°ì´ ì ì§ëë©° ì¤í¨ ë¬´ê´ 39592 // 2ìì: ë¡ê·¸ì¸/ë¡ê·¸ìì 모ë DOM (ìë² ì¶ë ¥ê°ì´ ìë 구ë²ì ìºì 문ì í´ë°±. íë³ ë¶ê°ì null - ëìíì§ ìì) 39593 var getRenderedAuthState = function() { 39594 try { 39595 if (window.CAFE24 && CAFE24.FRONTEND && (CAFE24.FRONTEND.IS_RENDERED_LOGIN === 'T' || CAFE24.FRONTEND.IS_RENDERED_LOGIN === 'F')) { 39596 return CAFE24.FRONTEND.IS_RENDERED_LOGIN === 'T'; 39597 } 39598 } catch (e) { 39599 } 39600 var oLogon = document.querySelector('.xans-layout-statelogon, .xans-layout-logon'); 39601 var oLogoff = document.querySelector('.xans-layout-statelogoff'); 39602 if (oLogon !== null && oLogoff === null) return true; 39603 if (oLogoff !== null && oLogon === null) return false; 39604 return null; 39605 }; 39606 39607 // ì¼ë° ë¡ëììë ë¤í¸ìí¬ ì ì¡ì´ ììê³ reload ê° ìë 문ìë§ HTTP ìºì ì¬ì¬ì©ì¼ë¡ íì íë¤. 39608 // ì ìëµì´ë reload ìëµê¹ì§ êµì íë©´ ìë² ìíì ì¿ í¤ê° ê³ì ì´ê¸ëë ë©í°ìµ íê²½ìì 39609 // sessionStorage ì¬ì©ì´ ì íë ë reload 를 ë©ì¶ ì ìë¤. [ECHOSTING-636472, ECHOSTING-637169, PLUSAPP-56623] 39610 var isCacheReusedDocument = function() { 39611 try { 39612 if (!window.performance || typeof performance.getEntriesByType !== 'function') return false; 39613 var aEntries = performance.getEntriesByType('navigation'); 39614 if (aEntries.length < 1 || typeof aEntries[0].transferSize !== 'number') return false; 39615 return aEntries[0].type !== 'reload' && aEntries[0].transferSize === 0; 39616 } catch (e) { 39617 return false; 39618 } 39619 }; 39620 39621 // ëì¼ URL ì¬ë°ë ë°©ì§ (ìë² ë ëì ì¿ í¤ê° ê³ì ì´ê¸ëë ìì¸ ìí©ìì ì¬ë¡ë ë°ë³µ ì°¨ë¨) 39622 var reloadOnce = function() { 39623 // ëìì¸ í¸ì§ê¸° 미리보기(blob:)ë ì¿ í¤ë¥¼ ì¬ì©í ì ìì´ ìë² ë ë ìíì ë¹êµí ì ìë¤. 39624 if (location.protocol === 'blob:') { 39625 return; 39626 } 39627 try { 39628 if (window.sessionStorage) { 39629 if (sessionStorage.getItem(sBrakeKey) === location.href) return; 39630 sessionStorage.setItem(sBrakeKey, location.href); 39631 } 39632 } catch (e) { 39633 } 39634 location.reload(); 39635 }; 39636 39637 var clearBrake = function() { 39638 try { 39639 if (window.sessionStorage) sessionStorage.removeItem(sBrakeKey); 39640 } catch (e) { 39641 } 39642 }; 39643 39644 window.addEventListener('pageshow', function(e) { 39645 // bfcache ë³µì: ë ë ìì ì¤ë ì·ê³¼ íì¬ ì¿ í¤ ë¹êµ 39646 if (e.persisted === true && hasAuthCookie() !== bRenderedAuth) { 39647 reloadOnce(); 39648 return; 39649 } 39650 39651 // ì¼ë° ë¡ë(HTTP ìºì ì¬ì¬ì© í¬í¨): ìë² ë ë ìíì íì¬ ì¿ í¤ ë¹êµ 39652 var bRenderedState = getRenderedAuthState(); 39653 if (bRenderedState !== null && bRenderedState !== hasAuthCookie() && isCacheReusedDocument()) { 39654 reloadOnce(); 39655 return; 39656 } 39657 39658 clearBrake(); 39659 }); 39660})(); 39661 39662/** 39663 * ë¹ë기ì ë°ì´í° 39664 */ 39665var CAPP_ASYNC_METHODS = { 39666 STATUS: 'unready', 39667 DEBUG: false, 39668 IS_LOGIN: (document.cookie.match(/(?:^| |;)iscache=F/) ? true : false), 39669 EC_PATH_ROLE: EC$('meta[name="path_role"]').attr('content') || '', 39670 aDatasetList: [], 39671 $xansMyshopMain: EC$('.xans-myshop-main'), 39672 init: function() 39673 { 39674 CAPP_ASYNC_METHODS.STATUS = 'ready'; 39675 var bDebug = CAPP_ASYNC_METHODS.DEBUG; 39676 39677 var aUseModules = []; 39678 var aNoCachedModules = []; 39679 39680 EC$(CAPP_ASYNC_METHODS.aDatasetList).each(function() { 39681 var sKey = this; 39682 39683 var oTarget = CAPP_ASYNC_METHODS[sKey]; 39684 39685 if (bDebug) { 39686 console.log(sKey); 39687 } 39688 var bIsUse = oTarget.isUse(); 39689 if (bDebug) { 39690 console.log(' isUse() : ' + bIsUse); 39691 } 39692 39693 if (bIsUse === true) { 39694 aUseModules.push(sKey); 39695 39696 if (oTarget.restoreCache === undefined || oTarget.restoreCache() === false) { 39697 if (bDebug) { 39698 console.log(' restoreCache() : true'); 39699 } 39700 aNoCachedModules.push(sKey); 39701 } 39702 } 39703 }); 39704 39705 if (aNoCachedModules.length > 0) { 39706 var sEditor = ''; 39707 try { 39708 if (bEditor === true) { 39709 // ìëí°ìì ì ê·¼íì ê²½ì° ììì ìí ì§ì 39710 sEditor = '&PREVIEW_SDE=1'; 39711 } 39712 } catch (e) { } 39713 39714 var sPathRole = '&path_role=' + CAPP_ASYNC_METHODS.EC_PATH_ROLE; 39715 var sEcMobile = '&EC_MOBILE=' + EC_MOBILE; 39716 39717 // 모ëë³ ì¶ê° íë¼ë¯¸í° ìì§ (getParam í ) 39718 var sModuleParam = ''; 39719 for (var i = 0; i < aNoCachedModules.length; i++) { 39720 var oMod = CAPP_ASYNC_METHODS[aNoCachedModules[i]]; 39721 if (typeof oMod.getParam === 'function') { 39722 var sParam = oMod.getParam(); 39723 if (sParam) { 39724 sModuleParam += '&' + sParam; 39725 } 39726 } 39727 } 39728 39729 var sUrl = '/exec/front/manage/async?module=' + aNoCachedModules.join(',') + sModuleParam + sEditor + sPathRole + sEcMobile; 39730 EC$.ajax( 39731 { 39732 url: sUrl, 39733 dataType: 'json', 39734 success: function(aData) 39735 { 39736 CAPP_ASYNC_METHODS.setData(aData, aUseModules); 39737 } 39738 }); 39739 39740 } else { 39741 CAPP_ASYNC_METHODS.setData({}, aUseModules); 39742 39743 } 39744 }, 39745 setData: function(aData, aUseModules) 39746 { 39747 aData = aData || {}; 39748 39749 EC$(aUseModules).each(function() { 39750 var sKey = this; 39751 39752 var oTarget = CAPP_ASYNC_METHODS[sKey]; 39753 39754 if (oTarget.setData !== undefined && aData.hasOwnProperty(sKey) === true) { 39755 oTarget.setData(aData[sKey]); 39756 } 39757 39758 if (oTarget.execute !== undefined) { 39759 oTarget.execute(); 39760 } 39761 }); 39762 39763 CAPP_ASYNC_METHODS.STATUS = 'complete'; 39764 }, 39765 39766 _getCookie: function(sCookieName) 39767 { 39768 var re = new RegExp('(?:^| |;)' + sCookieName + '=([^;]+)'); 39769 var aCookieValue = document.cookie.match(re); 39770 return aCookieValue ? aCookieValue[1] : null; 39771 } 39772}; 39773 39774var eCache = null; 39775if (window.location.protocol === 'https:' && (typeof CAFE24.CRYPTOKEY) == 'object') { 39776 CAFE24.CRYPTOKEY.decryptAndLoad('member_' + CAFE24.SDE_SHOP_NUM).then(function(o) { 39777 eCache = o; 39778 }).catch(function(err) { 39779 // console.log(err); 39780 }); 39781} 39782 39783 39784/** 39785 * ë¹ë기ì ë°ì´í° - íì ì ë³´ 39786 */ 39787CAPP_ASYNC_METHODS.aDatasetList.push('member'); 39788CAPP_ASYNC_METHODS.member = { 39789 __sEncryptedString: null, 39790 __isAdult: 'F', 39791 39792 // íì ë°ì´í° 39793 __sMemberId: null, 39794 __sHMemberId: null, 39795 __sName: null, 39796 __sNickName: null, 39797 __sGroupName: null, 39798 __sEmail: null, 39799 __sNewsMail: null, 39800 __sPhone: null, 39801 __sCellphone: null, 39802 __sSms: null, 39803 __sBirthday: null, 39804 __sGroupNo: null, 39805 __sBoardWriteName: null, 39806 __sAdditionalInformation: null, 39807 __sAuthenticationMethod: null, 39808 __sCreatedDate: null, 39809 39810 isUse: function() 39811 { 39812 if (CAPP_ASYNC_METHODS.IS_LOGIN === true) { 39813 if (EC$('.xans-layout-statelogon, .xans-layout-logon').length > 0) { 39814 return true; 39815 } 39816 39817 if (CAPP_ASYNC_METHODS.recent.isUse() === true 39818 && typeof(EC_FRONT_JS_CONFIG_SHOP) !== 'undefined' 39819 && EC_FRONT_JS_CONFIG_SHOP.adult19Warning === 'T') { 39820 return true; 39821 } 39822 39823 if (typeof CAFE24.APPSCRIPT_SDK_DATA !== "undefined" && EC$.inArray('customer', CAFE24.APPSCRIPT_SDK_DATA) > -1) { 39824 return true; 39825 } 39826 39827 } else { 39828 // ë¹ ë¡ê·¸ì¸ ìíìì ìì ì²ë¦¬ 39829 this.removeCache(); 39830 } 39831 39832 return false;
39833 }, 39834 39835 restoreCache: function() 39836 { 39837 // sessionStorage ì§ì ì¬ë¶ íì¸ 39838 if (!window.sessionStorage) { 39839 return false; 39840 } 39841 39842 // ë°ì´í° 복구 ì 무 39843 var bRestored = false; 39844 39845 try { 39846 // ë°ì´í° 복구 39847 var oCache = null; 39848 if (window.location.protocol === 'https:' && (typeof CAFE24.CRYPTOKEY) == 'object') { 39849 if (eCache) { 39850 oCache = JSON.parse(eCache); 39851 } 39852 } else if (window.location.protocol === 'http:' && (typeof CryptoJS) == 'object') { 39853 if (window.sessionStorage.getItem('member_' + CAFE24.SDE_SHOP_NUM)) { 39854 oCache = window.sessionStorage.getItem('member_' + CAFE24.SDE_SHOP_NUM); 39855 oCache = CryptoJS.AES.decrypt(oCache, SHOP.getMallID() + '_' + EC_SDE_SHOP_NUM).toString(CryptoJS.enc.Utf8); 39856 oCache = JSON.parse(oCache); 39857 } 39858 } 39859 39860 // expire ì²´í¬ 39861 if (oCache.exp < Date.now()) { 39862 throw 'cache has expired.'; 39863 } 39864 39865 // ë°ì´í° ì²´í¬ 39866 if (typeof oCache.data.member_id === 'undefined' 39867 || oCache.data.member_id === '' 39868 || typeof oCache.data.h_member_id === 'undefined' 39869 || oCache.data.h_member_id === '' 39870 || typeof oCache.data.name === 'undefined' 39871 || typeof oCache.data.nick_name === 'undefined' 39872 || typeof oCache.data.group_name === 'undefined' 39873 || typeof oCache.data.group_no === 'undefined' 39874 || typeof oCache.data.email === 'undefined' 39875 || typeof oCache.data.news_mail === 'undefined' 39876 || typeof oCache.data.phone === 'undefined' 39877 || typeof oCache.data.cellphone === 'undefined' 39878 || typeof oCache.data.sms === 'undefined' 39879 || typeof oCache.data.birthday === 'undefined' 39880 || typeof oCache.data.board_write_name === 'undefined' 39881 || typeof oCache.data.additional_information === 'undefined' 39882 || typeof oCache.data.authentication_method === 'undefined' 39883 || typeof oCache.data.created_date === 'undefined' 39884 ) { 39885 throw 'Invalid cache data.'; 39886 } 39887 39888 // ë°ì´í° 복구 39889 this.__sMemberId = oCache.data.member_id; 39890 this.__sHMemberId = oCache.data.h_member_id; 39891 this.__sName = oCache.data.name; 39892 this.__sNickName = oCache.data.nick_name; 39893 this.__sGroupName = oCache.data.group_name; 39894 this.__sGroupNo = oCache.data.group_no; 39895 this.__sEmail = oCache.data.email; 39896 this.__sNewsMail = oCache.data.news_mail; 39897 this.__sPhone = oCache.data.phone; 39898 this.__sCellphone = oCache.data.cellphone; 39899 this.__sSms = oCache.data.sms; 39900 this.__sBirthday = oCache.data.birthday; 39901 this.__sBoardWriteName = oCache.data.board_write_name; 39902 this.__sAdditionalInformation = oCache.data.additional_information; 39903 this.__sAuthenticationMethod = oCache.data.authentication_method; 39904 this.__sCreatedDate = oCache.data.created_date; 39905 39906 bRestored = true; 39907 } catch (e) { 39908 // 복구 ì¤í¨ì ìºì ìì 39909 this.removeCache(); 39910 } 39911 39912 return bRestored; 39913 }, 39914 39915 cache: function() 39916 { 39917 // sessionStorage ì§ì ì¬ë¶ íì¸ 39918 if (!window.sessionStorage) { 39919 return; 39920 } 39921 // ìºì 39922 var sData = JSON.stringify({exp: Date.now() + (1000 * 60 * 10),data: this.getData()}) 39923 39924 if (window.location.protocol === 'https:' && (typeof CAFE24.CRYPTOKEY) == 'object') { 39925 CAFE24.CRYPTOKEY.encryptAndSave('member_' + CAFE24.SDE_SHOP_NUM, sData); 39926 } else if (window.location.protocol === 'http:' && (typeof CryptoJS) == 'object') { 39927 sData = CryptoJS.AES.encrypt(sData, SHOP.getMallID() + '_' + EC_SDE_SHOP_NUM).toString(); 39928 window.sessionStorage.setItem('member_' + CAFE24.SDE_SHOP_NUM, sData); 39929 } 39930 }, 39931 39932 removeCache: function() 39933 { 39934 // sessionStorage ì§ì ì¬ë¶ íì¸ 39935 if (!window.sessionStorage) { 39936 return; 39937 } 39938 39939 // ìºì ìì 39940 window.sessionStorage.removeItem('encryptedData_member_' + CAFE24.SDE_SHOP_NUM); 39941 window.sessionStorage.removeItem('iv_member_' + CAFE24.SDE_SHOP_NUM); 39942 window.sessionStorage.removeItem('eto4member_' + CAFE24.SDE_SHOP_NUM); 39943 window.sessionStorage.removeItem('eto5member_' + CAFE24.SDE_SHOP_NUM); 39944 window.sessionStorage.removeItem('member_' + CAFE24.SDE_SHOP_NUM); 39945 }, 39946
39947 setData: function(oData) 39948 { 39949 this.__sEncryptedString = oData.memberData; 39950 this.__isAdult = oData.memberIsAdult; 39951 }, 39952 39953 execute: function() 39954 { 39955 if (this.__sMemberId === null) { 39956 if (this.__sEncryptedString.id) { 39957 this.setDataCallback(this.__sEncryptedString); 39958 } else { 39959 AuthSSLManager.weave({ 39960 'auth_mode': 'decryptClient', 39961 'auth_string': this.__sEncryptedString, 39962 'auth_callbackName': 'CAPP_ASYNC_METHODS.member.setDataCallback' 39963 }); 39964 } 39965 } else { 39966 this.render(); 39967 } 39968 }, 39969 39970 setDataCallback: function(sData) 39971 { 39972 try { 39973 if (sData.id) { 39974 var oData = sData; 39975 } else { 39976 var sDecodedData = decodeURIComponent(sData); 39977 if (AuthSSLManager.isError(sDecodedData) == true) { 39978 console.log(sDecodedData); 39979 return; 39980 } 39981 var oData = AuthSSLManager.unserialize(sDecodedData); 39982 } 39983 39984 this.__sMemberId = oData.id || ''; 39985 this.__sHMemberId = oData.h_member_id || ''; 39986 this.__sName = oData.name || ''; 39987 this.__sNickName = oData.nick || ''; 39988 this.__sGroupName = oData.group_name || ''; 39989 this.__sGroupNo = oData.group_no || ''; 39990 this.__sEmail = oData.email || ''; 39991 this.__sNewsMail = oData.news_mail || ''; 39992 this.__sPhone = oData.phone || ''; 39993 this.__sCellphone = oData.cellphone || ''; 39994 this.__sSms = oData.sms || ''; 39995 this.__sBirthday = oData.birthday || 'F'; 39996 this.__sBoardWriteName = oData.board_write_name || ''; 39997 this.__sAdditionalInformation = oData.additional_information || ''; 39998 this.__sAuthenticationMethod = oData.personal_type || null; 39999 this.__sCreatedDate = oData.created_date || ''; 40000 40001 // ë°ì´í° ëëë§ 40002 this.render(); 40003 40004 // ë°ì´í° ìºì 40005 this.cache(); 40006 } catch (e) {} 40007 }, 40008 40009 render: function() 40010 { 40011 // ì¹êµ¬ì´ë 40012 if (EC$('.xans-myshop-asyncbenefit').length > 0) { 40013 if (EC$('#reco_url').val() && EC$('#reco_url').val().split('=')[1] == '') { 40014 EC$('#reco_url').attr({value: EC$('#reco_url').val() + this.__sMemberId}); 40015 } 40016 } 40017 40018 EC$('.authssl_member_name').html(this.__sName); 40019 EC$('.xans-member-var-id').html(this.__sMemberId); 40020 EC$('.xans-member-var-h_id').html(this.__sHMemberId); 40021 EC$('.xans-member-var-name').html(this.__sName); 40022 EC$('.xans-member-var-nick').html(this.__sNickName); 40023 EC$('.xans-member-var-group_name').html(this.__sGroupName); 40024 EC$('.xans-member-var-group_no').html(this.__sGroupNo); 40025 EC$('.xans-member-var-email').html(this.__sEmail); 40026 EC$('.xans-member-var-phone').html(this.__sPhone); 40027 40028 if (EC$('.xans-board-commentwrite').length > 0 && typeof BOARD_COMMENT !== 'undefined') { 40029 BOARD_COMMENT.setCmtData(); 40030 } 40031 }, 40032 40033 getMemberIsAdult: function() 40034 { 40035 if (CAPP_ASYNC_METHODS.STATUS == 'unready') { 40036 CAPP_ASYNC_METHODS.init(); 40037 } 40038 return this.__isAdult; 40039 }, 40040 40041 getData: function() 40042 { 40043 if (CAPP_ASYNC_METHODS.STATUS == 'unready') { 40044 CAPP_ASYNC_METHODS.init(); 40045 } 40046 return { 40047 member_id: this.__sMemberId, 40048 h_member_id: this.__sHMemberId, 40049 name: this.__sName, 40050 nick_name: this.__sNickName, 40051 group_name: this.__sGroupName, 40052 group_no: this.__sGroupNo, 40053 email: this.__sEmail, 40054 news_mail: this.__sNewsMail, 40055 phone: this.__sPhone, 40056 cellphone: this.__sCellphone, 40057 sms: this.__sSms, 40058 birthday: this.__sBirthday, 40059 board_write_name: this.__sBoardWriteName, 40060 additional_information: this.__sAdditionalInformation, 40061 authentication_method: this.__sAuthenticationMethod, 40062 created_date: this.__sCreatedDate 40063 }; 40064 } 40065}; 40066 40067/** 40068 * ë¹ë기ì ë°ì´í° - ìì¹ê¸ 40069 */ 40070CAPP_ASYNC_METHODS.aDatasetList.push('Ordercnt'); 40071CAPP_ASYNC_METHODS.Ordercnt = { 40072 __iOrderShppiedBeforeCount: null, 40073 __iOrderShppiedStandbyCount: null, 40074 __iOrderShppiedBeginCount: null, 40075 __iOrderShppiedComplateCount: null,
40076 __iOrderShppiedCancelCount: null, 40077 __iOrderShppiedExchangeCount: null, 40078 __iOrderShppiedReturnCount: null, 40079 40080 __$target: EC$('#xans_myshop_orderstate_shppied_before_count'), 40081 __$target2: EC$('#xans_myshop_orderstate_shppied_standby_count'), 40082 __$target3: EC$('#xans_myshop_orderstate_shppied_begin_count'), 40083 __$target4: EC$('#xans_myshop_orderstate_shppied_complate_count'), 40084 __$target5: EC$('#xans_myshop_orderstate_order_cancel_count'), 40085 __$target6: EC$('#xans_myshop_orderstate_order_exchange_count'), 40086 __$target7: EC$('#xans_myshop_orderstate_order_return_count'), 40087 40088 isUse: function() 40089 { 40090 if (EC$('.xans-myshop-orderstate').length > 0) { 40091 return true; 40092 } 40093 40094 return false; 40095 }, 40096 40097 restoreCache: function() 40098 { 40099 var sCookieName = 'ordercnt_' + CAFE24.SDE_SHOP_NUM; 40100 var re = new RegExp('(?:^| |;)' + sCookieName + '=([^;]+)'); 40101 var aCookieValue = document.cookie.match(re); 40102 if (aCookieValue) { 40103 var aData = CAFE24.UTIL.parseJSON(decodeURIComponent(aCookieValue[1])); 40104 this.__iOrderShppiedBeforeCount = aData.shipped_before_count; 40105 this.__iOrderShppiedStandbyCount = aData.shipped_standby_count; 40106 this.__iOrderShppiedBeginCount = aData.shipped_begin_count; 40107 this.__iOrderShppiedComplateCount = aData.shipped_complate_count; 40108 this.__iOrderShppiedCancelCount = aData.order_cancel_count; 40109 this.__iOrderShppiedExchangeCount = aData.order_exchange_count; 40110 this.__iOrderShppiedReturnCount = aData.order_return_count; 40111 return true; 40112 } 40113 40114 return false; 40115 }, 40116 40117 setData: function(aData) 40118 { 40119 this.__iOrderShppiedBeforeCount = aData['shipped_before_count']; 40120 this.__iOrderShppiedStandbyCount = aData['shipped_standby_count']; 40121 this.__iOrderShppiedBeginCount = aData['shipped_begin_count']; 40122 this.__iOrderShppiedComplateCount = aData['shipped_complate_count']; 40123 this.__iOrderShppiedCancelCount = aData['order_cancel_count']; 40124 this.__iOrderShppiedExchangeCount = aData['order_exchange_count']; 40125 this.__iOrderShppiedReturnCount = aData['order_return_count']; 40126 }, 40127 40128 execute: function() 40129 { 40130 this.__$target.html(this.__iOrderShppiedBeforeCount); 40131 this.__$target2.html(this.__iOrderShppiedStandbyCount); 40132 this.__$target3.html(this.__iOrderShppiedBeginCount); 40133 this.__$target4.html(this.__iOrderShppiedComplateCount); 40134 this.__$target5.html(this.__iOrderShppiedCancelCount); 40135 this.__$target6.html(this.__iOrderShppiedExchangeCount); 40136 this.__$target7.html(this.__iOrderShppiedReturnCount); 40137 }, 40138 40139 getData: function() 40140 { 40141 return { 40142 shipped_before_count: this.__iOrderShppiedBeforeCount, 40143 shipped_standby_count: this.__iOrderShppiedStandbyCount, 40144 shipped_begin_count: this.__iOrderShppiedBeginCount, 40145 shipped_complate_count: this.__iOrderShppiedComplateCount, 40146 order_cancel_count: this.__iOrderShppiedCancelCount, 40147 order_exchange_count: this.__iOrderShppiedExchangeCount, 40148 order_return_count: this.__iOrderShppiedReturnCount 40149 }; 40150 } 40151}; 40152 40153/** 40154 * ë¹ë기ì ë°ì´í° - ì¥ë°êµ¬ë ê°¯ì 40155 */ 40156CAPP_ASYNC_METHODS.aDatasetList.push('Basketcnt'); 40157CAPP_ASYNC_METHODS.Basketcnt = { 40158 __iBasketCount: null, 40159 40160 __$target: EC$('.xans-layout-orderbasketcount span a'), 40161 __$target2: EC$('#xans_myshop_basket_cnt'), 40162 __$target3: CAPP_ASYNC_METHODS.$xansMyshopMain.find('.xans_myshop_main_basket_cnt'), 40163 __$target4: EC$('.EC-Layout-Basket-count'), 40164 40165 isUse: function() 40166 { 40167 if (this.__$target.length > 0) { 40168 return true; 40169 } 40170 if (this.__$target2.length > 0) { 40171 return true; 40172 } 40173 if (this.__$target3.length > 0) { 40174 return true; 40175 } 40176 if (this.__$target4.length > 0) { 40177 return true; 40178 } 40179 40180 if (typeof CAFE24.APPSCRIPT_SDK_DATA !== "undefined" && EC$.inArray('personal', CAFE24.APPSCRIPT_SDK_DATA) > -1) { 40181 return true; 40182 } 40183 40184 return false;
40185 }, 40186 40187 restoreCache: function() 40188 { 40189 var sCookieName = 'basketcount_' + CAFE24.SDE_SHOP_NUM; 40190 40191 // ì¿ í¤ëª ì ch_ref íë¼ë¯¸í° ì¶ê° 40192 if (typeof CAFE24 !== 'undefined' && CAFE24.getChRefData && CAFE24.getChRefData()) { 40193 sCookieName += '_' + CAFE24.getChRefData(); 40194 } 40195 40196 var re = new RegExp('(?:^| |;)' + sCookieName + '=([^;]+)'); 40197 var aCookieValue = document.cookie.match(re); 40198 if (aCookieValue) { 40199 this.__iBasketCount = parseInt(aCookieValue[1], 10); 40200 return true; 40201 } 40202 40203 return false; 40204 }, 40205 40206 setData: function(sData) 40207 { 40208 this.__iBasketCount = Number(sData); 40209 }, 40210 40211 execute: function() 40212 { 40213 this.__$target.html(this.__iBasketCount); 40214 40215 if (SHOP.getLanguage() === 'ko_KR') { 40216 this.__$target2.html(this.__iBasketCount + 'ê°'); 40217 } else { 40218 this.__$target2.html(this.__iBasketCount); 40219 } 40220 40221 this.__$target3.html(this.__iBasketCount); 40222 40223 this.__$target4.html(this.__iBasketCount); 40224 40225 if (this.__iBasketCount > 0 && this.__$target4.length > 0) { 40226 var $oCountDisplay = EC$('.EC-Layout_Basket-count-display'); 40227 40228 if ($oCountDisplay.length > 0) { 40229 $oCountDisplay.removeClass('displaynone'); 40230 } 40231 } 40232 }, 40233 40234 getData: function() 40235 { 40236 return { 40237 count: this.__iBasketCount 40238 }; 40239 } 40240}; 40241 40242/** 40243 * ë¹ë기ì ë°ì´í° - ì¥ë°êµ¬ë ê¸ì¡ 40244 */ 40245CAPP_ASYNC_METHODS.aDatasetList.push('Basketprice'); 40246CAPP_ASYNC_METHODS.Basketprice = { 40247 __sBasketPrice: null, 40248 40249 __$target: EC$('#xans_myshop_basket_price'), 40250 40251 isUse: function() 40252 { 40253 if (this.__$target.length > 0) { 40254 return true; 40255 } 40256 40257 if (typeof CAFE24.APPSCRIPT_SDK_DATA !== "undefined" && EC$.inArray('personal', CAFE24.APPSCRIPT_SDK_DATA) > -1) { 40258 return true; 40259 } 40260 40261 return false; 40262 }, 40263 40264 restoreCache: function() 40265 { 40266 var sCookieName = 'basketprice_' + CAFE24.SDE_SHOP_NUM; 40267 40268 // ì¿ í¤ëª ì ch_ref íë¼ë¯¸í° ì¶ê° 40269 if (typeof CAFE24 !== 'undefined' && CAFE24.getChRefData && CAFE24.getChRefData()) { 40270 sCookieName += CAFE24.getChRefData(); 40271 } 40272 40273 var re = new RegExp('(?:^| |;)' + sCookieName + '=([^;]+)'); 40274 var aCookieValue = document.cookie.match(re); 40275 if (aCookieValue) { 40276 this.__sBasketPrice = decodeURIComponent((aCookieValue[1]+ '').replace(/\+/g, '%20')); 40277 return true; 40278 } 40279 40280 return false; 40281 }, 40282 40283 setData: function(sData) 40284 { 40285 this.__sBasketPrice = sData; 40286 }, 40287 40288 execute: function() 40289 { 40290 // ECHOSTING-610183: presentment íí ë³í 40291 var sPrice = this.__sBasketPrice; 40292 var oCurrInfo = CAFE24.SHOP_CURRENCY_INFO ? CAFE24.SHOP_CURRENCY_INFO[CAFE24.SDE_SHOP_NUM] : null; 40293 if (oCurrInfo && oCurrInfo.bPresentmentEnabled && oCurrInfo.aPresentmentCurrencyInfo) { 40294 var fRaw = parseFloat(CAFE24.SHOP_PRICE_FORMAT.detachFormat(htmlentities.decode((sPrice || '0') + ''))); 40295 if (!isNaN(fRaw)) { 40296 sPrice = CAFE24.SHOP_PRICE_FORMAT.toShopPricePresentment(fRaw); 40297 } 40298 } 40299 this.__$target.html(sPrice); 40300 }, 40301 40302 getData: function() 40303 { 40304 // ë°ì´í° ìëê²½ì° 0 40305 var sBasketPrice = (this.__sBasketPrice || 0) + ''; 40306 40307 return { 40308 basket_price: parseFloat(CAFE24.SHOP_PRICE_FORMAT.detachFormat(htmlentities.decode(sBasketPrice))).toFixed(2) 40309 }; 40310 } 40311}; 40312 40313/* 40314 * ë¹ë기ì ë°ì´í° - ì¥ë°êµ¬ë ìí리ì¤í¸ 40315 */ 40316CAPP_ASYNC_METHODS.aDatasetList.push('BasketProduct'); 40317CAPP_ASYNC_METHODS.BasketProduct = { 40318 40319 STORAGE_KEY: 'BasketProduct_' + CAFE24.SDE_SHOP_NUM, 40320 40321 __aData: null, 40322 40323 __$target: EC$('.xans-layout-orderbasketcount span a'), 40324 __$target2: EC$('#xans_myshop_basket_cnt'), 40325 __$target3: CAPP_ASYNC_METHODS.$xansMyshopMain.find('.xans_myshop_main_basket_cnt'), 40326 __$target4: EC$('.EC-Layout-Basket-count'), 40327 40328 isUse: function() 40329 { 40330 if (this.__$target.length > 0) { 40331 return true; 40332 } 40333 if (this.__$target2.length > 0) { 40334 return true; 40335 } 40336 if (this.__$target3.length > 0) { 40337 return true; 40338 } 40339 if (this.__$target4.length > 0) { 40340 return true; 40341 } 40342 40343 if (typeof CAFE24.APPSCRIPT_SDK_DATA !== "undefined" && EC$.inArray('personal', CAFE24.APPSCRIPT_SDK_DATA) > -1) { 40344 return true; 40345 } 40346 }, 40347 40348 restoreCache: function() 40349 { 40350 // sessionStorage ì§ì ì¬ë¶ íì¸ 40351 if (!window.sessionStorage) { 40352 return false;
40353 } 40354 40355 var sSessionStorageData = window.sessionStorage.getItem(this.STORAGE_KEY); 40356 if (sSessionStorageData === null) { 40357 return false; 40358 } 40359 40360 try { 40361 this.__aData = []; 40362 var aStorageData = JSON.parse(sSessionStorageData); 40363 40364 for (var iKey in aStorageData) { 40365 this.__aData.push(aStorageData[iKey]); 40366 } 40367 40368 return true; 40369 } catch (e) { 40370 40371 // 복구 ì¤í¨ì ìºì ìì 40372 this.removeCache(); 40373 40374 return false; 40375 } 40376 }, 40377 40378 removeCache: function() 40379 { 40380 // sessionStorage ì§ì ì¬ë¶ íì¸ 40381 if (!window.sessionStorage) { 40382 return; 40383 } 40384 // ìºì ìì 40385 window.sessionStorage.removeItem(this.STORAGE_KEY); 40386 }, 40387 40388 setData: function(oData) 40389 { 40390 this.__aData = oData; 40391 40392 // sessionStorage ì§ì ì¬ë¶ íì¸ 40393 if (!window.sessionStorage) { 40394 return; 40395 } 40396 40397 try { 40398 sessionStorage.setItem(this.STORAGE_KEY, JSON.stringify(this.getData())); 40399 } catch (error) { 40400 } 40401 }, 40402 40403 execute: function() 40404 { 40405 40406 }, 40407 40408 getData: function() 40409 { 40410 var aStorageData = this.__aData; 40411 var aResult = []; 40412 return new Promise(function (resolve, reject) { 40413 40414 if (aStorageData != null && aStorageData.length > 1) { 40415 var oNewStorageData = []; 40416 40417 for (var iKey in aStorageData) { 40418 oNewStorageData.push(aStorageData[iKey]); 40419 } 40420 40421 aResult = oNewStorageData; 40422 resolve(aResult); 40423 } else { 40424 var sUrl = '/exec/front/manage/async?module=BasketProduct'; 40425 //ëë©ê²°ì : ch_ref ë¶ì¬ì£¼ê¸° 40426 sUrl = CAFE24.attachChRef(sUrl); 40427 EC$.ajax({ 40428 url: sUrl, 40429 success: function (aData) { 40430 aResult = aData.BasketProduct; 40431 resolve(aResult); 40432 } 40433 }); 40434 } 40435 40436 }); 40437 }, 40438 40439 setAsyncData: function (aPostData) { 40440 return new Promise(function (resolve, reject) { 40441 EC$.post('/exec/front/order/basket/', aPostData, function (data) { 40442 resolve(data); 40443 }).catch(function (data) { 40444 reject(data); 40445 }); 40446 }); 40447 }, 40448 deleteAllAsyncData: function (basket_shipping_type) { 40449 return new Promise(function (resolve, reject) { 40450 EC$.post('/exec/front/order/basket/', {command: 'delete', delvtype: basket_shipping_type}, function(data) { 40451 resolve(data); 40452 }, 'json').catch(function (data) { 40453 reject(data); 40454 }); 40455 }); 40456 }, 40457 40458 deleteCartItems: function (basket_shipping_type, product_list) { 40459 var aDeleteProducts = []; 40460 var idx = 0; 40461 if (product_list.length > 0) { 40462 for (var iKey in product_list) { 40463 aDeleteProducts[idx] = product_list[iKey].product_no + ':' + product_list[iKey].option_id + ':F:' + product_list[iKey].basket_product_no + ':null:'+basket_shipping_type; 40464 idx ++; 40465 } 40466 } 40467 40468 var sDeleteProducts = aDeleteProducts.join(); 40469 return new Promise(function (resolve, reject) { 40470 EC$.post('/exec/front/order/basket/', {command: 'select_delete', checked_product:sDeleteProducts, calls:'CAFE24_SDK'}, function(data) { 40471 CAPP_ASYNC_METHODS.BasketProduct.setData(); 40472 resolve(data.aResultDeleteCartItems); 40473 }, 'json').catch(function (data) { 40474 reject(data); 40475 }); 40476 }); 40477 } 40478}; 40479 40480/** 40481 * ë¹ë기ì ë°ì´í° - ì¿ í° ê°¯ì 40482 */ 40483CAPP_ASYNC_METHODS.aDatasetList.push('Couponcnt'); 40484CAPP_ASYNC_METHODS.Couponcnt = { 40485 __iCouponCount: null, 40486 40487 __$target: EC$('.xans-layout-myshopcouponcount'), 40488 __$target2: EC$('#xans_myshop_coupon_cnt'), 40489 __$target3: CAPP_ASYNC_METHODS.$xansMyshopMain.find('.xans_myshop_main_coupon_cnt'), 40490 __$target4: EC$('#xans_myshop_bankbook_coupon_cnt'), 40491 40492 isUse: function() 40493 { 40494 if (CAPP_ASYNC_METHODS.IS_LOGIN === true) { 40495 if (this.__$target.length > 0) { 40496 return true; 40497 } 40498 40499 if (this.__$target2.length > 0) { 40500 return true; 40501 } 40502 40503 if (this.__$target3.length > 0) { 40504 return true; 40505 } 40506 40507 if (this.__$target4.length > 0) { 40508 return true; 40509 } 40510 40511 if (typeof CAFE24.APPSCRIPT_SDK_DATA !== "undefined" && EC$.inArray('promotion', CAFE24.APPSCRIPT_SDK_DATA) > -1) { 40512 return true; 40513 } 40514 } 40515 40516 return false;
40517 }, 40518 40519 restoreCache: function() 40520 { 40521 var sCookieName = 'couponcount_' + CAFE24.SDE_SHOP_NUM; 40522 var re = new RegExp('(?:^| |;)' + sCookieName + '=([^;]+)'); 40523 var aCookieValue = document.cookie.match(re); 40524 if (aCookieValue) { 40525 this.__iCouponCount = parseInt(aCookieValue[1], 10); 40526 return true; 40527 } 40528 40529 return false; 40530 }, 40531 setData: function(sData) 40532 { 40533 this.__iCouponCount = Number(sData); 40534 }, 40535 40536 execute: function() 40537 { 40538 this.__$target.html(this.__iCouponCount); 40539 40540 if (SHOP.getLanguage() === 'ko_KR') { 40541 this.__$target2.html(this.__iCouponCount + 'ê°'); 40542 } else { 40543 this.__$target2.html(this.__iCouponCount); 40544 } 40545 40546 this.__$target3.html(this.__iCouponCount); 40547 this.__$target4.html(this.__iCouponCount); 40548 }, 40549 40550 getData: function() 40551 { 40552 return { 40553 count: this.__iCouponCount 40554 }; 40555 } 40556}; 40557 40558/** 40559 * ë¹ë기ì ë°ì´í° - ì ë¦½ê¸ 40560 */ 40561CAPP_ASYNC_METHODS.aDatasetList.push('Mileage'); 40562CAPP_ASYNC_METHODS.Mileage = { 40563 __sAvailMileage: null, 40564 __sUsedMileage: null, 40565 __sTotalMileage: null, 40566 __sUnavailMileage: null, 40567 __sReturnedMileage: null, 40568 40569 __$target: EC$('#xans_myshop_mileage'), 40570 __$target2: EC$('#xans_myshop_bankbook_avail_mileage, #xans_myshop_summary_avail_mileage'), 40571 __$target3: EC$('#xans_myshop_bankbook_used_mileage, #xans_myshop_summary_used_mileage'), 40572 __$target4: EC$('#xans_myshop_bankbook_total_mileage, #xans_myshop_summary_total_mileage'), 40573 __$target5: EC$('#xans_myshop_summary_unavail_mileage'), 40574 __$target6: EC$('#xans_myshop_summary_returned_mileage'), 40575 __$target7: EC$('#xans_myshop_avail_mileage'), 40576 40577 isUse: function() 40578 { 40579 if (CAPP_ASYNC_METHODS.IS_LOGIN === true) { 40580 if (this.__$target.length > 0) { 40581 return true; 40582 } 40583 40584 if (this.__$target2.length > 0) { 40585 return true; 40586 } 40587 40588 if (this.__$target3.length > 0) { 40589 return true; 40590 } 40591 40592 if (this.__$target4.length > 0) { 40593 return true; 40594 } 40595 40596 if (this.__$target5.length > 0) { 40597 return true; 40598 } 40599 40600 if (this.__$target6.length > 0) { 40601 return true; 40602 } 40603 40604 if (this.__$target7.length > 0) { 40605 return true; 40606 } 40607 40608 if (typeof CAFE24.APPSCRIPT_SDK_DATA !== "undefined" && EC$.inArray('customer', CAFE24.APPSCRIPT_SDK_DATA) > -1) { 40609 return true; 40610 } 40611 } 40612 40613 return false; 40614 }, 40615 40616 restoreCache: function() 40617 { 40618 // í¹ì ê²½ë¡ ë£°ì ê²½ì° ë³µêµ¬ ì·¨ì 40619 if (PathRoleValidator.isInvalidPathRole()) { 40620 return false; 40621 } 40622 40623 // ì¿ í¤ë¡ë¶í° ë°ì´í° íë 40624 var sAvailMileage = CAPP_ASYNC_METHODS._getCookie('ec_async_cache_avail_mileage_' + CAFE24.SDE_SHOP_NUM); 40625 var sReturnedMileage = CAPP_ASYNC_METHODS._getCookie('ec_async_cache_returned_mileage_' + CAFE24.SDE_SHOP_NUM); 40626 var sUnavailMileage = CAPP_ASYNC_METHODS._getCookie('ec_async_cache_unavail_mileage_' + CAFE24.SDE_SHOP_NUM); 40627 var sUsedMileage = CAPP_ASYNC_METHODS._getCookie('ec_async_cache_used_mileage_' + CAFE24.SDE_SHOP_NUM); 40628 40629 // ë°ì´í°ê° íëë¼ë ìëê²½ì° ë³µêµ¬ ì¤í¨ 40630 if (sAvailMileage === null 40631 || sReturnedMileage === null 40632 || sUnavailMileage === null 40633 || sUsedMileage === null 40634 ) { 40635 return false; 40636 } 40637 40638 // ì ì²´ ë§ì¼ë¦¬ì§ ê³ì° 40639 var sTotalMileage = (parseFloat(sAvailMileage) + 40640 parseFloat(sUnavailMileage) + 40641 parseFloat(sUsedMileage)).toString(); 40642 40643 // ë¨ìì 보를 ê³ì°íì¬ íëì ì 40644 this.__sAvailMileage = parseFloat(sAvailMileage).toFixed(2); 40645 this.__sReturnedMileage = parseFloat(sReturnedMileage).toFixed(2); 40646 this.__sUnavailMileage = parseFloat(sUnavailMileage).toFixed(2); 40647 this.__sUsedMileage = parseFloat(sUsedMileage).toFixed(2); 40648 this.__sTotalMileage = parseFloat(sTotalMileage).toFixed(2); 40649 40650 return true; 40651 }, 40652 40653 setData: function(aData) 40654 { 40655 this.__sAvailMileage = parseFloat(aData['avail_mileage'] || 0).toFixed(2); 40656 this.__sUsedMileage = parseFloat(aData['used_mileage'] || 0).toFixed(2); 40657 this.__sTotalMileage = parseFloat(aData['total_mileage'] || 0).toFixed(2); 40658 this.__sUnavailMileage = parseFloat(aData['unavail_mileage'] || 0).toFixed(2); 40659 this.__sReturnedMileage = parseFloat(aData['returned_mileage'] || 0).toFixed(2); 40660 }, 40661 40662 execute: function() 40663 { 40664 // ECHOSTING-610183: presentment íí ë³í 40665 var fnFormat = CAFE24.SHOP_PRICE_FORMAT.toShopMileagePrice; 40666 var oCurrInfo = CAFE24.SHOP_CURRENCY_INFO ? CAFE24.SHOP_CURRENCY_INFO[CAFE24.SDE_SHOP_NUM] : null; 40667 if (oCurrInfo && oCurrInfo.bPresentmentEnabled && oCurrInfo.aPresentmentCurrencyInfo) { 40668 fnFormat = CAFE24.SHOP_PRICE_FORMAT.toShopMileagePricePresentment; 40669 } 40670 this.__$target.html(fnFormat(this.__sAvailMileage)); 40671 this.__$target2.html(fnFormat(this.__sAvailMileage)); 40672 this.__$target3.html(fnFormat(this.__sUsedMileage)); 40673 this.__$target4.html(fnFormat(this.__sTotalMileage)); 40674 this.__$target5.html(fnFormat(this.__sUnavailMileage)); 40675 this.__$target6.html(fnFormat(this.__sReturnedMileage)); 40676 this.__$target7.html(fnFormat(this.__sAvailMileage)); 40677 }, 40678 40679 getData: function() 40680 { 40681 return { 40682 available_mileage: this.__sAvailMileage, 40683 used_mileage: this.__sUsedMileage, 40684 total_mileage: this.__sTotalMileage, 40685 returned_mileage: this.__sReturnedMileage, 40686 unavailable_mileage: this.__sUnavailMileage 40687 }; 40688 } 40689}; 40690 40691/** 40692 * ë¹ë기ì ë°ì´í° - ìì¹ê¸ 40693 */ 40694CAPP_ASYNC_METHODS.aDatasetList.push('Deposit'); 40695CAPP_ASYNC_METHODS.Deposit = { 40696 __sTotalDeposit: null, 40697 __sAllDeposit: null, 40698 __sUsedDeposit: null, 40699 __sRefundWaitDeposit: null, 40700 __sMemberTotalDeposit: null, 40701 40702 __$target: EC$('#xans_myshop_deposit'), 40703 __$target2: EC$('#xans_myshop_bankbook_deposit'), 40704 __$target3: EC$('#xans_myshop_summary_deposit'), 40705 __$target4: EC$('#xans_myshop_summary_all_deposit'), 40706 __$target5: EC$('#xans_myshop_summary_used_deposit'), 40707 __$target6: EC$('#xans_myshop_summary_refund_wait_deposit'), 40708 __$target7: EC$('#xans_myshop_total_deposit'), 40709 40710 isUse: function() 40711 { 40712 if (CAPP_ASYNC_METHODS.IS_LOGIN === true) { 40713 if (this.__$target.length > 0) { 40714 return true; 40715 } 40716 40717 if (this.__$target2.length > 0) { 40718 return true; 40719 } 40720 40721 if (this.__$target3.length > 0) { 40722 return true; 40723 } 40724 40725 if (this.__$target4.length > 0) { 40726 return true; 40727 } 40728 40729 if (this.__$target5.length > 0) { 40730 return true; 40731 } 40732 40733 if (this.__$target6.length > 0) { 40734 return true; 40735 } 40736 40737 if (this.__$target7.length > 0) { 40738 return true; 40739 } 40740 40741 if (typeof CAFE24.APPSCRIPT_SDK_DATA !== "undefined" && EC$.inArray('customer', CAFE24.APPSCRIPT_SDK_DATA) > -1) { 40742 return true; 40743 } 40744 } 40745 40746 return false;
40747 }, 40748 40749 restoreCache: function() 40750 { 40751 // í¹ì ê²½ë¡ ë£°ì ê²½ì° ë³µêµ¬ ì·¨ì 40752 if (PathRoleValidator.isInvalidPathRole()) { 40753 return false; 40754 } 40755 40756 // ì¿ í¤ë¡ë¶í° ë°ì´í° íë 40757 var sAllDeposit = CAPP_ASYNC_METHODS._getCookie('ec_async_cache_all_deposit_' + CAFE24.SDE_SHOP_NUM); 40758 var sUsedDeposit = CAPP_ASYNC_METHODS._getCookie('ec_async_cache_used_deposit_' + CAFE24.SDE_SHOP_NUM); 40759 var sRefundWaitDeposit = CAPP_ASYNC_METHODS._getCookie('ec_async_cache_deposit_refund_wait_' + CAFE24.SDE_SHOP_NUM); 40760 var sMemberTotalDeposit = CAPP_ASYNC_METHODS._getCookie('ec_async_cache_member_total_deposit_' + CAFE24.SDE_SHOP_NUM); 40761 40762 // ë°ì´í°ê° íëë¼ë ìëê²½ì° ë³µêµ¬ ì¤í¨ 40763 if (sAllDeposit === null 40764 || sUsedDeposit === null 40765 || sRefundWaitDeposit === null 40766 || sMemberTotalDeposit === null 40767 ) { 40768 return false; 40769 } 40770 40771 // ì¬ì© ê°ë¥í ìì¹ê¸ ê³ì° 40772 var sTotalDeposit = (parseFloat(sAllDeposit) - 40773 parseFloat(sUsedDeposit) - 40774 parseFloat(sRefundWaitDeposit)).toString(); 40775 40776 // ë¨ìì 보를 ê³ì°íì¬ íëì ì 40777 this.__sTotalDeposit = parseFloat(sTotalDeposit).toFixed(2); 40778 this.__sAllDeposit = parseFloat(sAllDeposit).toFixed(2); 40779 this.__sUsedDeposit = parseFloat(sUsedDeposit).toFixed(2); 40780 this.__sRefundWaitDeposit = parseFloat(sRefundWaitDeposit).toFixed(2); 40781 this.__sMemberTotalDeposit = parseFloat(sMemberTotalDeposit).toFixed(2); 40782 40783 return true; 40784 }, 40785 40786 setData: function(aData) 40787 { 40788 this.__sTotalDeposit = parseFloat(aData['total_deposit'] || 0).toFixed(2); 40789 this.__sAllDeposit = parseFloat(aData['all_deposit'] || 0).toFixed(2); 40790 this.__sUsedDeposit = parseFloat(aData['used_deposit'] || 0).toFixed(2); 40791 this.__sRefundWaitDeposit = parseFloat(aData['deposit_refund_wait'] || 0).toFixed(2); 40792 this.__sMemberTotalDeposit = parseFloat(aData['member_total_deposit'] || 0).toFixed(2); 40793 }, 40794 40795 execute: function() 40796 { 40797 // ECHOSTING-616370: presentment íí ë³í 40798 var fnFormat = CAFE24.SHOP_PRICE_FORMAT.toShopDepositPrice; 40799 var oCurrInfo = CAFE24.SHOP_CURRENCY_INFO ? CAFE24.SHOP_CURRENCY_INFO[CAFE24.SDE_SHOP_NUM] : null; 40800 if (oCurrInfo && oCurrInfo.bPresentmentEnabled && oCurrInfo.aPresentmentCurrencyInfo) { 40801 fnFormat = CAFE24.SHOP_PRICE_FORMAT.toShopDepositPricePresentment; 40802 } 40803 this.__$target.html(fnFormat(this.__sTotalDeposit)); 40804 this.__$target2.html(fnFormat(this.__sTotalDeposit)); 40805 this.__$target3.html(fnFormat(this.__sTotalDeposit)); 40806 this.__$target4.html(fnFormat(this.__sAllDeposit)); 40807 this.__$target5.html(fnFormat(this.__sUsedDeposit)); 40808 this.__$target6.html(fnFormat(this.__sRefundWaitDeposit)); 40809 this.__$target7.html(fnFormat(this.__sMemberTotalDeposit)); 40810 }, 40811 40812 getData: function() 40813 { 40814 return { 40815 total_deposit: this.__sTotalDeposit, 40816 used_deposit: this.__sUsedDeposit, 40817 refund_wait_deposit: this.__sRefundWaitDeposit, 40818 all_deposit: this.__sAllDeposit, 40819 member_total_deposit: this.__sMemberTotalDeposit 40820 }; 40821 } 40822}; 40823 40824/** 40825 * ë¹ë기ì ë°ì´í° - ìì리ì¤í¸ 40826 */ 40827CAPP_ASYNC_METHODS.aDatasetList.push('WishList'); 40828CAPP_ASYNC_METHODS.WishList = { 40829 STORAGE_KEY: 'localWishList' + CAFE24.SDE_SHOP_NUM, 40830 __$targetWishIcon: EC$('.icon_img.ec-product-listwishicon'), 40831 __$targetWishList: EC$('.xans-myshop-wishlist'), 40832 __aWishList: null, 40833 __aTags_on: null, 40834 __aTags_off: null, 40835 40836 isUse: function() 40837 { 40838 if (this.__$targetWishIcon.length > 0 || this.__$targetWishList.length > 0 40839 || CAPP_ASYNC_METHODS.EC_PATH_ROLE === 'PRODUCT_DETAIL') { 40840 return true; 40841 } 40842 return false; 40843 }, 40844 40845 restoreCache: function() 40846 { 40847 if (!window.sessionStorage) { 40848 return false; 40849 } 40850 40851 var sSessionStorageData = window.sessionStorage.getItem(this.STORAGE_KEY); 40852 if (sSessionStorageData === null) { 40853 return false;
40854 } 40855 40856 var aStorageData = CAFE24.UTIL.parseJSON(sSessionStorageData); 40857 if (this.__$targetWishList.length > 0 || aStorageData['isLogin'] !== CAPP_ASYNC_METHODS.IS_LOGIN) { 40858 this.clearStorage(); 40859 return false; 40860 } 40861 40862 var aWishList = aStorageData['wishList']; 40863 this.__aTags_on = aStorageData['on_tags']; 40864 this.__aTags_off = aStorageData['off_tags']; 40865 this.__aWishList = []; 40866 for (var i = 0; i < aWishList.length; i++) { 40867 var aTempWishList = []; 40868 aTempWishList.product_no = aWishList[i]; 40869 this.__aWishList.push(aTempWishList); 40870 } 40871 return true; 40872 }, 40873 40874 setData: function(aData) 40875 { 40876 if (aData.hasOwnProperty('wishList') === false || aData.hasOwnProperty('on_tags') === false) { 40877 return; 40878 } 40879 40880 this.__aWishList = aData.wishList; 40881 this.__aTags_on = aData.on_tags; 40882 this.__aTags_off = aData.off_tags; 40883 40884 if (window.sessionStorage) { 40885 var aWishList = []; 40886 40887 for (var i = 0; i < aData.wishList.length; i++) { 40888 aWishList.push(aData.wishList[i].product_no); 40889 } 40890 40891 var oNewStorageData = { 40892 'wishList': aWishList, 40893 'on_tags': aData.on_tags, 40894 'off_tags': aData.off_tags, 40895 'isLogin': CAPP_ASYNC_METHODS.IS_LOGIN 40896 }; 40897 40898 if (typeof oNewStorageData !== 'undefined') { 40899 sessionStorage.setItem(this.STORAGE_KEY , JSON.stringify(oNewStorageData)); 40900 } 40901 } 40902 }, 40903 40904 execute: function() 40905 { 40906 var aWishList = this.__aWishList; 40907 var aTagsOn = this.__aTags_on; 40908 var aTagsOff = this.__aTags_off; 40909 40910 if (aWishList === null || typeof aWishList === 'undefined') { 40911 aWishList = []; 40912 } 40913 40914 var oTarget = EC$('.ec-product-listwishicon'); 40915 for (var sKey in aTagsOff) { 40916 oTarget.attr(sKey, aTagsOff[sKey]); 40917 } 40918 40919 for (var i = 0; i < aWishList.length; i++) { 40920 assignAttribute(aWishList[i]); 40921 } 40922 40923 /** 40924 * oTarget ìë 먼í¸ì aDataì ì 보를 ì´ì¸ì¸í¨. 40925 * @param array aData ìì리ì¤í¸ ì ë³´ 40926 */ 40927 function assignAttribute(aData) 40928 { 40929 var iProductNo = aData['product_no']; 40930 var oTarget = EC$('.ec-product-listwishicon[productno="'+iProductNo+'"]'); 40931 40932 // oTargetì src, alt, icon_status attributeì ê°ì í ë¹ 40933 for (var sKey in aTagsOn) { 40934 oTarget.attr(sKey, aTagsOn[sKey]); 40935 } 40936 } 40937 40938 }, 40939 40940 /** 40941 * ì¸ì ì¤í ë¦¬ì§ ìì 40942 */ 40943 clearStorage: function() 40944 { 40945 if (!window.sessionStorage) { 40946 return; 40947 } 40948 window.sessionStorage.removeItem(this.STORAGE_KEY); 40949 }, 40950 40951 /** 40952 * sCommandì ë°ë¥¸ sessionStorage Set 40953 * @param iProductNo 40954 * @param sCommand ì¶ê°(add)/ìì (del) sCommand 40955 */ 40956 setSessionStorageItem: function(iProductNo, sCommand) 40957 { 40958 if (this.isUse() === false) { 40959 return; 40960 } 40961 40962 var oStorageData = CAFE24.UTIL.parseJSON(sessionStorage.getItem(this.STORAGE_KEY)); 40963 var aWishList = oStorageData['wishList']; 40964 var iLimit = 200; 40965 40966 if (aWishList === null) { 40967 aWishList = []; 40968 } 40969 40970 var iProductNo = parseInt(iProductNo, 10); 40971 var iIndex = aWishList.indexOf(iProductNo); 40972 40973 if (sCommand === 'add') { 40974 if (aWishList.length >= iLimit) { 40975 aWishList.splice(aWishList.length - 1, 1); 40976 } 40977 if (iIndex < 0) { 40978 aWishList.unshift(iProductNo); 40979 } 40980 } else { 40981 if (iIndex > -1) { 40982 aWishList.splice(iIndex, 1); 40983 } 40984 } 40985 40986 oStorageData['wishList'] = aWishList; 40987 sessionStorage.setItem(this.STORAGE_KEY, JSON.stringify(oStorageData)); 40988 } 40989}; 40990 40991/** 40992 * ë¹ë기ì ë°ì´í° - ê´ì¬ìí ê°¯ì 40993 */ 40994CAPP_ASYNC_METHODS.aDatasetList.push('Wishcount'); 40995CAPP_ASYNC_METHODS.Wishcount = { 40996 __iWishCount: null, 40997 40998 __$target: EC$('#xans_myshop_interest_prd_cnt'), 40999 __$target2: CAPP_ASYNC_METHODS.$xansMyshopMain.find('.xans_myshop_main_interest_prd_cnt'), 41000 41001 isUse: function() 41002 { 41003 if (this.__$target.length > 0) { 41004 return true; 41005 } 41006 if (this.__$target2.length > 0) { 41007 return true; 41008 } 41009 41010 if (typeof CAFE24.APPSCRIPT_SDK_DATA !== "undefined" && EC$.inArray('personal', CAFE24.APPSCRIPT_SDK_DATA) > -1) { 41011 return true; 41012 } 41013 41014 return false;
41015 }, 41016 41017 restoreCache: function() 41018 { 41019 var sCookieName = 'wishcount_' + CAFE24.SDE_SHOP_NUM; 41020 var re = new RegExp('(?:^| |;)' + sCookieName + '=([^;]+)'); 41021 var aCookieValue = document.cookie.match(re); 41022 if (aCookieValue) { 41023 this.__iWishCount = parseInt(aCookieValue[1], 10); 41024 return true; 41025 } 41026 41027 return false; 41028 }, 41029 41030 setData: function(sData) 41031 { 41032 this.__iWishCount = Number(sData); 41033 }, 41034 41035 execute: function() 41036 { 41037 if (SHOP.getLanguage() === 'ko_KR') { 41038 this.__$target.html(this.__iWishCount + 'ê°'); 41039 } else { 41040 this.__$target.html(this.__iWishCount); 41041 } 41042 41043 this.__$target2.html(this.__iWishCount); 41044 }, 41045 41046 getData: function() 41047 { 41048 return { 41049 count: this.__iWishCount 41050 }; 41051 } 41052}; 41053 41054/** 41055 * ë¹ë기ì ë°ì´í° - ìµê·¼ 본 ìí 41056 */ 41057CAPP_ASYNC_METHODS.aDatasetList.push('recent'); 41058CAPP_ASYNC_METHODS.recent = { 41059 STORAGE_KEY: 'localRecentProduct' + CAFE24.SDE_SHOP_NUM, 41060 41061 __$target: EC$('.xans-layout-productrecent'), 41062 41063 __aData: null, 41064 41065 isUse: function() 41066 { 41067 this.__$target.hide(); 41068 41069 if (this.__$target.find('.xans-record-').length > 0) { 41070 return true; 41071 } 41072 41073 return false; 41074 }, 41075 41076 restoreCache: function() 41077 { 41078 this.__aData = []; 41079 41080 var iTotalCount = CAPP_ASYNC_METHODS.RecentTotalCount.getData(); 41081 if (iTotalCount == 0) { 41082 // ì´ ê°¯ìê° ìë ê²½ì° ë³µêµ¬í ê²ì´ ìì¼ë¯ë¡ 복구í ê²ì¼ë¡ ë¦¬í´ 41083 return true; 41084 } 41085 41086 var sAdultImage = ''; 41087 41088 if (window.sessionStorage === undefined) { 41089 return false; 41090 } 41091 41092 var sSessionStorageData = window.sessionStorage.getItem(this.STORAGE_KEY); 41093 if (sSessionStorageData === null) { 41094 return false; 41095 } 41096 41097 var iViewCount = EC_FRONT_JS_CONFIG_SHOP.recent_count; 41098 41099 this.__aData = []; 41100 var aStorageData = CAFE24.UTIL.parseJSON(sSessionStorageData); 41101 var iCount = 1; 41102 var bDispRecent = true; 41103 for (var iKey in aStorageData) { 41104 var sProductImgSrc = aStorageData[iKey].sImgSrc; 41105 41106 if (isFinite(iKey) === false) { 41107 continue; 41108 } 41109 41110 var aDataTmp = []; 41111 aDataTmp.recent_img = getImageUrl(sProductImgSrc); 41112 aDataTmp.name = aStorageData[iKey].sProductName; 41113 aDataTmp.disp_recent = true; 41114 aDataTmp.is_adult_product = aStorageData[iKey].isAdultProduct; 41115 aDataTmp.link_product_detail = aStorageData[iKey].link_product_detail; 41116 41117 //aDataTmp.param = '?product_no=' + aStorageData[iKey].iProductNo + '&cate_no=' + aStorageData[iKey].iCateNum + '&display_group=' + aStorageData[iKey].iDisplayGroup; 41118 aDataTmp.param = filterXssUrlParameter(aStorageData[iKey].sParam); 41119 if (iViewCount < iCount) { 41120 bDispRecent = false; 41121 } 41122 aDataTmp.disp_recent = bDispRecent; 41123 41124 iCount++; 41125 this.__aData.push(aDataTmp); 41126 } 41127 41128 return true; 41129 41130 /** 41131 * get SessionStorage image url 41132 * @param sNewImgUrl DBì ì ì¥ëì´ ìë tinyê° 41133 */ 41134 function getImageUrl(sImgUrl) 41135 { 41136 if (typeof(sImgUrl) === 'undefined' || sImgUrl === null) { 41137 return; 41138 } 41139 var sNewImgUrl = ''; 41140 41141 if (sImgUrl.indexOf('http://') >= 0 || sImgUrl.indexOf('https://') >= 0 || sImgUrl.substr(0, 2) === '//') { 41142 sNewImgUrl = sImgUrl; 41143 } else { 41144 sNewImgUrl = EC_FRONT_JS_CONFIG_SHOP.cdnUrl + '/web/product/tiny/' + sImgUrl; 41145 } 41146 41147 return sNewImgUrl; 41148 } 41149 41150 /** 41151 * íë¼ë¯¸í° URLìì XSS 공격 ê´ë ¨ íë¼ë¯¸í°ë¥¼ íí°ë§í©ëë¤. ECHOSTING-162977 41152 * @param string sParam íë¼ë¯¸í° 41153 * @return string íí°ë§ë íë¼ë¯¸í° 41154 */ 41155 function filterXssUrlParameter(sParam) 41156 { 41157 sParam = sParam || ''; 41158 41159 var sPrefix = ''; 41160 if (sParam.substr(0, 1) === '?') { 41161 sPrefix = '?'; 41162 sParam = sParam.substr(1); 41163 } 41164 41165 var aParam = {}; 41166 41167 var aParamList = (sParam).split('&'); 41168 EC$.each(aParamList, function() { 41169 var aMatch = this.match(/^([^=]+)=(.*)$/); 41170 if (aMatch) { 41171 aParam[aMatch[1]] = aMatch[2]; 41172 } 41173 }); 41174 41175 return sPrefix + EC$.param(aParam); 41176 } 41177 41178 }, 41179 41180 setData: function(aData) 41181 { 41182 this.__aData = aData; 41183
41184 // ì¿ í¤ì ìì§ë§ sessionStorageì ìë ë°ì´í° 복구 41185 if (window.sessionStorage) { 41186 41187 var oNewStorageData = []; 41188 41189 for (var i = 0; i < aData.length; i++) { 41190 if (aData[i].bNewProduct !== true) { 41191 continue; 41192 } 41193 41194 var aNewStorageData = { 41195 'iProductNo': aData[i].product_no, 41196 'sProductName': aData[i].name, 41197 'sImgSrc': aData[i].recent_img, 41198 'sParam': aData[i].param, 41199 'link_product_detail': aData[i].link_product_detail 41200 }; 41201 41202 oNewStorageData.push(aNewStorageData); 41203 } 41204 41205 if (oNewStorageData.length > 0) { 41206 sessionStorage.setItem(this.STORAGE_KEY , JSON.stringify(oNewStorageData)); 41207 } 41208 } 41209 }, 41210 41211 execute: function() 41212 { 41213 var sAdult19Warning = EC_FRONT_JS_CONFIG_SHOP.adult19Warning; 41214 41215 var aData = this.__aData; 41216 41217 var aNodes = this.__$target.find('.xans-record-'); 41218 var iRecordCnt = aNodes.length; 41219 var iAddedElementCount = 0; 41220 41221 var aNodesParent = EC$(aNodes[0]).parent(); 41222 for (var i = 0; i < aData.length; i++) { 41223 if (!aNodes[i]) { 41224 EC$(aNodes[iRecordCnt - 1]).clone().appendTo(aNodesParent); 41225 iAddedElementCount++; 41226 } 41227 } 41228 41229 if (iAddedElementCount > 0) { 41230 aNodes = this.__$target.find('.xans-record-'); 41231 } 41232 41233 if (aData.length > 0) { 41234 this.__$target.show(); 41235 } 41236 41237 for (var i = 0; i < aData.length; i++) { 41238 assignVariables(aNodes[i], aData[i]); 41239 } 41240 41241 // ì¢ ë£ ì¹´ì´í¸ ì§ì 41242 if (aData.length < aNodes.length) { 41243 iLength = aData.length; 41244 deleteNode(); 41245 } 41246 41247 recentBntInit(this.__$target); 41248 41249 /** 41250 * í¨ì¹ëì§ ìì ë ¸ë를 ì ê±° 41251 */ 41252 function deleteNode() 41253 { 41254 for (var i = iLength; i < aNodes.length; i++) { 41255 EC$(aNodes[i]).remove(); 41256 } 41257 } 41258 41259 /** 41260 * oTarget ìë 먼í¸ì aDataì ë³ì를 ì´ì¸ì¸í©ëë¤. 41261 * @param Element oTarget ë³ì를 ì´ì¸ì¸í ìë ë¨¼í¸ 41262 * @param array aData ë³ì ë°ì´í° 41263 */ 41264 function assignVariables(oTarget, aData) 41265 { 41266 var recentImage = aData.recent_img; 41267 41268 if (sAdult19Warning === 'T' && CAPP_ASYNC_METHODS.member.getMemberIsAdult() === 'F' && aData.is_adult_product === 'T') { 41269 recentImage = EC_FRONT_JS_CONFIG_SHOP.adult19BaseTinyImage; 41270 } 41271 41272 var $oTarget = EC$(oTarget); 41273 41274 var sHtml = $oTarget.html(); 41275 41276 sHtml = sHtml.replace('about:blank', recentImage) 41277 .replace('##param##', aData.param) 41278 .replace('##name##',aData.name) 41279 .replace('##link_product_detail##', aData.link_product_detail); 41280 $oTarget.html(sHtml); 41281 41282 if (aData.disp_recent === true) { 41283 $oTarget.removeClass('displaynone'); 41284 } 41285 } 41286 41287 function recentBntInit($target) 41288 { 41289 // íë©´ì ë¿ë ¤ì§ ê°¯ì 41290 var iDisplayCount = 0; 41291 // ë³´ì¬ì§ë style 41292 var sDisplay = ''; 41293 var iIdx = 0; 41294 // 41295 var iDisplayNoneIdx = 0; 41296 41297 var nodes = $target.find('.xans-record-').each(function() 41298 { 41299 sDisplay = EC$(this).css('display'); 41300 if (sDisplay != 'none') { 41301 iDisplayCount++; 41302 } else { 41303 if (iDisplayNoneIdx == 0) { 41304 iDisplayNoneIdx = iIdx; 41305 } 41306 41307 } 41308 iIdx++; 41309 }); 41310 41311 var iRecentCount = nodes.length; 41312 var bBtnActive = iDisplayCount > 0; 41313 EC$('.xans-layout-productrecent .prev').off('click').click(function() 41314 { 41315 if (bBtnActive !== true) return; 41316 var iFirstNode = iDisplayNoneIdx - iDisplayCount; 41317 if (iFirstNode == 0 || iDisplayCount == iRecentCount) { 41318 alert(__('ìµê·¼ 본 첫ë²ì§¸ ìíì ëë¤.')); 41319 return; 41320 } else { 41321 iDisplayNoneIdx--; 41322 EC$(nodes[iDisplayNoneIdx]).hide(); 41323 EC$(nodes[iFirstNode - 1]).removeClass('displaynone'); 41324 EC$(nodes[iFirstNode - 1]).fadeIn('fast'); 41325 41326 } 41327 }).css( 41328 { 41329 cursor: 'pointer' 41330 }); 41331 41332 EC$('.xans-layout-productrecent .next').off('click').click(function() 41333 { 41334 if (bBtnActive !== true) return; 41335 if ((iRecentCount) == iDisplayNoneIdx || iDisplayCount == iRecentCount) { 41336 alert(__('ìµê·¼ 본 ë§ì§ë§ ìíì ëë¤.')); 41337 } else { 41338 EC$(nodes[iDisplayNoneIdx]).fadeIn('fast'); 41339 EC$(nodes[iDisplayNoneIdx]).removeClass('displaynone'); 41340 EC$(nodes[ (iDisplayNoneIdx - iDisplayCount)]).hide(); 41341 iDisplayNoneIdx++; 41342 } 41343 }).css( 41344 { 41345 cursor: 'pointer' 41346 }); 41347 41348 } 41349 41350 } 41351}; 41352 41353/** 41354 * ë¹ë기ì ë°ì´í° - Recentkeyword 41355 */ 41356CAPP_ASYNC_METHODS.aDatasetList.push('Recentkeyword'); 41357CAPP_ASYNC_METHODS.Recentkeyword = { 41358 __$target: EC$('div.xans-search-recentkeyword'), 41359 RECENT_WORD_KEY: 'RECENT_WORD_' + EC_SDE_SHOP_NUM + '_', 41360 RECENT_WORD_COUNT: 10, 41361 41362 isUse: function() 41363 { 41364 if (this.__$target.length > 0) { 41365 return true; 41366 } 41367 }, 41368 //restoreCache: function() 41369 // { 41370 // var sCookieName = 'RECENT_WORD_' + CAFE24.SDE_SHOP_NUM; 41371 // var re = new RegExp('(?:^| |;)' + sCookieName + '=([^;]+)'); 41372 // var aCookieValue = document.cookie.match(re); 41373 // if (aCookieValue) { 41374 // this.recentword = aCookieValue[1]; 41375 // return true; 41376 // } 41377 // 41378 // return false;
41379 // }, 41380 41381 setData: function() 41382 { 41383 }, 41384 execute: function() 41385 { 41386 var oTemplate = this.getTemplate(); 41387 var sHtml = ''; 41388 var sRecentSearchUrl = '/product/search.html?keyword='; 41389 if (typeof(EC_FRONT_JS_CONFIG_SHOP.sSearchUrl) !== 'undefined') { 41390 sRecentSearchUrl = EC_FRONT_JS_CONFIG_SHOP.sSearchUrl; 41391 } 41392 41393 for (var i=1; i <= this.RECENT_WORD_COUNT; i++) { 41394 var sRecentKeyword = CAPP_ASYNC_METHODS._getCookie(this.RECENT_WORD_KEY + i); 41395 41396 if (sRecentKeyword !== null) { 41397 sRecentKeyword = decodeURIComponent(sRecentKeyword); 41398 var oLi = oTemplate.clone(); 41399 oLi.find('a').attr('href', sRecentSearchUrl + sRecentKeyword); 41400 oLi.find('a').text(sRecentKeyword); 41401 oLi.find('button').addClass('recent_keyword_remove'); 41402 oLi.find('button').attr('index', i); 41403 oLi.find('button').removeAttr('onclick'); 41404 sHtml += '<li data-index="' + i + '">' + oLi.html() + '</li>' ; 41405 41406 } 41407 } 41408 41409 CAPP_ASYNC_METHODS.Recentkeyword.__$target.find('ul').html(sHtml); 41410 CAPP_ASYNC_METHODS.Recentkeyword.__$target.find('button.btnDeleteAll').addClass('recent_keyword_remove_all').removeAttr('onclick'); 41411 }, 41412 getTemplate: function () 41413 { 41414 return this.__$target.find('ul > li:eq(0)').clone(); 41415 41416 } 41417} 41418/** 41419 * ë¹ë기ì ë°ì´í° - ìµê·¼ë³¸ìí ì´ ê°¯ì 41420 */ 41421CAPP_ASYNC_METHODS.aDatasetList.push('RecentTotalCount'); 41422CAPP_ASYNC_METHODS.RecentTotalCount = { 41423 __iRecentCount: null, 41424 41425 __$target: CAPP_ASYNC_METHODS.$xansMyshopMain.find('.xans_myshop_main_recent_cnt'), 41426 41427 isUse: function() 41428 { 41429 if (this.__$target.length > 0) { 41430 return true; 41431 } 41432 41433 return false; 41434 }, 41435 41436 restoreCache: function() 41437 { 41438 var sCookieName = 'recent_plist'; 41439 if (CAFE24.SDE_SHOP_NUM > 1) { 41440 sCookieName = 'recent_plist' + CAFE24.SDE_SHOP_NUM; 41441 } 41442 var re = new RegExp('(?:^| |;)' + sCookieName + '=([^;]+)'); 41443 var aCookieValue = document.cookie.match(re); 41444 if (aCookieValue) { 41445 this.__iRecentCount = decodeURI(aCookieValue[1]).split('|').length; 41446 } else { 41447 this.__iRecentCount = 0; 41448 } 41449 }, 41450 41451 execute: function() 41452 { 41453 this.__$target.html(this.__iRecentCount); 41454 }, 41455 41456 getData: function() 41457 { 41458 if (this.__iRecentCount === null) { 41459 // this.isUseê°ì´ falseë¼ì 복구ëì§ ììëë° ì´ ê°ì´ íìí ê²½ì° ë³µêµ¬ 41460 this.restoreCache(); 41461 } 41462 41463 return this.__iRecentCount; 41464 } 41465}; 41466 41467/** 41468 * ë¹ë기ì ë°ì´í° - 주문ì ë³´ 41469 */ 41470CAPP_ASYNC_METHODS.aDatasetList.push('Order'); 41471CAPP_ASYNC_METHODS.Order = { 41472 __iOrderCount: null, 41473 __iOrderTotalPrice: null, 41474 __iGradeIncreaseValue: null, 41475 41476 __$target: EC$('#xans_myshop_bankbook_order_count'), 41477 __$target2: EC$('#xans_myshop_bankbook_order_price'), 41478 __$target3: EC$('#xans_myshop_bankbook_grade_increase_value'), 41479 41480 isUse: function() 41481 { 41482 if (CAPP_ASYNC_METHODS.IS_LOGIN === true) { 41483 if (this.__$target.length > 0) { 41484 return true; 41485 } 41486 41487 if (this.__$target2.length > 0) { 41488 return true; 41489 } 41490 41491 if (this.__$target3.length > 0) { 41492 return true; 41493 } 41494 } 41495 41496 return false; 41497 }, 41498 41499 restoreCache: function() 41500 { 41501 var sCookieName = 'order_' + CAFE24.SDE_SHOP_NUM; 41502 var re = new RegExp('(?:^| |;)' + sCookieName + '=([^;]+)'); 41503 var aCookieValue = document.cookie.match(re); 41504 if (aCookieValue) { 41505 var aData = CAFE24.UTIL.parseJSON(decodeURIComponent(aCookieValue[1])); 41506 this.__iOrderCount = aData.total_order_count; 41507 this.__iOrderTotalPrice = aData.total_order_price; 41508 this.__iGradeIncreaseValue = Number(aData.grade_increase_value); 41509 return true; 41510 } 41511 41512 return false; 41513 }, 41514 41515 setData: function(aData) 41516 { 41517 this.__iOrderCount = aData['total_order_count']; 41518 this.__iOrderTotalPrice = aData['total_order_price']; 41519 this.__iGradeIncreaseValue = Number(aData['grade_increase_value']); 41520 }, 41521 41522 execute: function() 41523 { 41524 this.__$target.html(this.__iOrderCount); 41525 this.__$target2.html(this.__iOrderTotalPrice); 41526 this.__$target3.html(this.__iGradeIncreaseValue); 41527 }, 41528 41529 getData: function() 41530 { 41531 return { 41532 total_order_count: this.__iOrderCount, 41533 total_order_price: this.__iOrderTotalPrice, 41534 grade_increase_value: this.__iGradeIncreaseValue 41535 }; 41536 } 41537}; 41538 41539/** 41540 * ë¹ë기ì ë°ì´í° - Benefit 41541 */ 41542CAPP_ASYNC_METHODS.aDatasetList.push('Benefit'); 41543CAPP_ASYNC_METHODS.Benefit = { 41544 __aBenefit: null, 41545 __$target: EC$('.xans-myshop-asyncbenefit'), 41546 41547 isUse: function() 41548 { 41549 if (CAPP_ASYNC_METHODS.IS_LOGIN === true) { 41550 if (this.__$target.length > 0) { 41551 return true; 41552 } 41553 } 41554 41555 return false;
41556 }, 41557 41558 setData: function(aData) 41559 { 41560 this.__aBenefit = aData; 41561 }, 41562 41563 execute: function() 41564 { 41565 var aFilter = [ 41566 'group_image_tag', 41567 'group_icon_tag', 41568 'display_no_benefit', 41569 'display_with_all', 41570 'display_mobile_use_dc', 41571 'display_mobile_use_mileage', 41572 'display_member_group_dc_limit' 41573 ]; 41574 var __aData = this.__aBenefit; 41575 41576 // 그룹ì´ë¯¸ì§ 41577 EC$('.myshop_benefit_group_image_tag').attr({alt: __aData['group_name'], src: __aData['group_image']}); 41578 41579 // 그룹ìì´ì½ 41580 EC$('.myshop_benefit_group_icon_tag').attr({alt: __aData['group_name'], src: __aData['group_icon']}); 41581 41582 if (__aData['display_no_benefit'] === true) { 41583 EC$('.myshop_benefit_display_no_benefit').removeClass('displaynone').show(); 41584 } 41585 41586 if (__aData['display_with_all'] === true) { 41587 EC$('.myshop_benefit_display_with_all').removeClass('displaynone').show(); 41588 } 41589 41590 if (__aData['display_mobile_use_dc'] === true) { 41591 EC$('.myshop_benefit_display_mobile_use_dc').removeClass('displaynone').show(); 41592 } 41593 41594 if (__aData['display_mobile_use_mileage'] === true) { 41595 EC$('.myshop_benefit_display_mobile_use_mileage').removeClass('displaynone').show(); 41596 } 41597 41598 if (__aData['display_member_group_dc_limit'] === true) { 41599 EC$('.myshop_benefit_display_member_group_dc_limit').removeClass('displaynone').show(); 41600 } 41601 41602 EC$.each(__aData, function(key, val) { 41603 if (EC$.inArray(key, aFilter) === -1) { 41604 EC$('.myshop_benefit_' + key).html(val); 41605 } 41606 }); 41607 } 41608}; 41609 41610/** 41611 * ë¹ë기ì ë°ì´í° - ë¹ë기ì¥ë°êµ¬ë ë ì´ì´ 41612 */ 41613CAPP_ASYNC_METHODS.aDatasetList.push('BasketLayer'); 41614CAPP_ASYNC_METHODS.BasketLayer = { 41615 __sBasketLayerHtml: null, 41616 __$target: document.getElementById('ec_async_basket_layer_container'), 41617 41618 isUse: function() 41619 { 41620 if (this.__$target !== null) { 41621 return true; 41622 } 41623 return false; 41624 }, 41625 41626 execute: function() 41627 { 41628 EC$.ajax({ 41629 url: '/order/async_basket_layer.html?__popupPage=T', 41630 async: false, 41631 success: function(data) { 41632 var sBasketLayerHtml = data; 41633 var sBasketLayerStyle = ''; 41634 var sBasketLayerBody = ''; 41635 41636 sBasketLayerHtml = sBasketLayerHtml.replace(/<script([\s\S]*?)<\/script>/gi,''); // ì¤í¬ë¦½í¸ ì ê±° 41637 sBasketLayerHtml = sBasketLayerHtml.replace(/<link([\s\S]*?)\/>/gi,''); // ìµí°ë§ì´ì ¸ ì ê±° 41638 41639 var regexStyle = /<style([\s\S]*?)<\/style>/; // Style ì¶ì¶ 41640 if (regexStyle.exec(sBasketLayerHtml) != null) sBasketLayerStyle = regexStyle.exec(sBasketLayerHtml)[0]; 41641 41642 var regexBody = /<body[\s\S]*?>([\s\S]*?)<\/body>/; // Body ì¶ì¶ 41643 var aBasketLayerBodyMatch = regexBody.exec(sBasketLayerHtml); 41644 if (aBasketLayerBodyMatch) { 41645 // 구ìì§(libxml2): fragment를 html/head/bodyë¡ ê°ì¸ë¯ë¡ body ë´ë¶ë§ ì¬ì© 41646 sBasketLayerBody = aBasketLayerBodyMatch[1]; 41647 } else { 41648 // ììì§(xrlib): body ëí ìì´ style+fragmentë§ ë°ííë¯ë¡ ê·¸ëë¡ ì¬ì© 41649 // (styleì ìëìì í©ì¹ë¯ë¡ ì¤ë³µ ë°©ì§ ìí´ ë³ë ì¶ì¶ë³¸ì ë¹ì) 41650 sBasketLayerStyle = ''; 41651 sBasketLayerBody = sBasketLayerHtml; 41652 } 41653 41654 CAPP_ASYNC_METHODS.BasketLayer.__sBasketLayerHtml = sBasketLayerStyle + sBasketLayerBody; 41655 } 41656 }); 41657 this.__$target.innerHTML = this.__sBasketLayerHtml; 41658 } 41659}; 41660 41661/** 41662 * ë¹ë기ì ë°ì´í° - Benefit 41663 */ 41664CAPP_ASYNC_METHODS.aDatasetList.push('Grade'); 41665CAPP_ASYNC_METHODS.Grade = { 41666 __aGrade: null, 41667 __$target: EC$('#sGradeAutoDisplayArea'), 41668 41669 isUse: function() 41670 { 41671 if (CAPP_ASYNC_METHODS.IS_LOGIN === true) { 41672 if (this.__$target.length > 0) { 41673 return true; 41674 } 41675 } 41676 41677 return false;
41678 }, 41679 41680 setData: function(aData) 41681 { 41682 this.__aGrade = aData; 41683 }, 41684 41685 execute: function() 41686 { 41687 var __aData = this.__aGrade; 41688 var aFilter = ['bChangeMaxTypePrice', 'bChangeMaxTypePriceAndCount', 'bChangeMaxTypePriceOrCount', 'bChangeMaxTypeCount']; 41689 41690 var aMaxDisplayJson = { 41691 "bChangeMaxTypePrice": [ 41692 {"sId": "sChangeMaxTypePriceArea"} 41693 ], 41694 "bChangeMaxTypePriceAndCount": [ 41695 {"sId": "sChangeMaxTypePriceAndCountArea"} 41696 ], 41697 "bChangeMaxTypePriceOrCount": [ 41698 {"sId": "sChangeMaxTypePriceOrCountArea"} 41699 ], 41700 "bChangeMaxTypeCount": [ 41701 {"sId": "sChangeMaxTypeCountArea"} 41702 ] 41703 }; 41704 41705 if (EC$('.sNextGroupIconArea').length > 0) { 41706 if (__aData['bDisplayNextGroupIcon'] === true) { 41707 EC$('.sNextGroupIconArea').removeClass('displaynone').show(); 41708 EC$('.myshop_benefit_next_group_icon_tag').attr({alt: __aData['sNextGrade'], src: __aData['sNextGroupIcon']}); 41709 } else { 41710 EC$('.sNextGroupIconArea').addClass('displaynone'); 41711 } 41712 } 41713 41714 var sIsAutoGradeDisplay = "F"; 41715 EC$.each(__aData, function(key, val) { 41716 if (EC$.inArray(key, aFilter) === -1) { 41717 return true; 41718 } 41719 if (val === true) { 41720 if (EC$('#'+aMaxDisplayJson[key][0].sId).length > 0) { 41721 EC$('#' + aMaxDisplayJson[key][0].sId).removeClass('displaynone').show(); 41722 } 41723 sIsAutoGradeDisplay = "T"; 41724 } 41725 }); 41726 if (sIsAutoGradeDisplay == "T" && EC$('#sGradeAutoDisplayArea .sAutoGradeDisplay').length > 0) { 41727 EC$('#sGradeAutoDisplayArea .sAutoGradeDisplay').addClass('displaynone'); 41728 } 41729 41730 EC$.each(__aData, function(key, val) { 41731 if (EC$.inArray(key, aFilter) === -1) { 41732 if (EC$('.xans-member-var-' + key).length > 0) { 41733 EC$('.xans-member-var-' + key).html(val); 41734 } 41735 } 41736 }); 41737 } 41738}; 41739 41740/** 41741 * ë¹ë기ì ë°ì´í° - Benefit 41742 */ 41743CAPP_ASYNC_METHODS.aDatasetList.push('AutomaticGradeShow'); 41744CAPP_ASYNC_METHODS.AutomaticGradeShow = { 41745 __aGrade: null, 41746 __$target: EC$('#sAutomaticGradeShowArea'), 41747 41748 isUse: function() 41749 { 41750 if (CAPP_ASYNC_METHODS.IS_LOGIN === true) { 41751 if (this.__$target.length > 0) { 41752 return true; 41753 } 41754 } 41755 return false; 41756 }, 41757 41758 setData: function(aData) 41759 { 41760 this.__aGrade = aData; 41761 }, 41762 41763 execute: function() 41764 { 41765 var __aData = this.__aGrade; 41766 41767 /** 41768 * ìì´ì½ í기 ì ì¸ 41769 if (EC$('.sNextGroupIconArea').length > 0) { 41770 if (__aData['bDisplayNextGroupIcon'] === true) { 41771 EC$('.sNextGroupIconArea').removeClass('displaynone').show(); 41772 EC$('.myshop_benefit_next_group_icon_tag').attr({alt: __aData['sNextGrade'], src: __aData['sNextGroupIcon']}); 41773 } else { 41774 EC$('.sNextGroupIconArea').addClass('displaynone'); 41775 } 41776 } 41777 */ 41778 41779 var sIsAutoGradeDisplay = "F"; 41780 EC$.each(__aData, function(key, val) { 41781 if (val === true) { 41782 sIsAutoGradeDisplay = "T"; 41783 return false; 41784 } 41785 }); 41786 if (sIsAutoGradeDisplay == "T" && EC$('#sAutomaticGradeShowArea .sAutoGradeDisplay').length > 0) { 41787 EC$('#sAutomaticGradeShowArea .sAutoGradeDisplay').addClass('displaynone'); 41788 } 41789 41790 EC$.each(__aData, function(key, val) { 41791 if (EC$('.xans-member-var-' + key).length > 0) { 41792 EC$('.xans-member-var-' + key).html(val); 41793 } 41794 }); 41795 } 41796}; 41797 41798/** 41799 * ë¹ë기ì ë°ì´í° - ë¹ë기ì¥ë°êµ¬ë ë ì´ì´ 41800 */ 41801CAPP_ASYNC_METHODS.aDatasetList.push('MobileMutiPopup'); 41802CAPP_ASYNC_METHODS.MobileMutiPopup = { 41803 __$target: EC$('div[class^="ec-async-multi-popup-layer-container"]'), 41804 41805 isUse: function() 41806 { 41807 if (this.__$target.length > 0) { 41808 return true; 41809 } 41810 return false;
41811 }, 41812 41813 execute: function() 41814 { 41815 for (var i=0; i < this.__$target.length; i++) { 41816 EC$.ajax({ 41817 url: '/exec/front/popup/AjaxMultiPopup?index='+i, 41818 data: EC_ASYNC_MULTI_POPUP_OPTION[i], 41819 dataType: "json", 41820 success: function (oResult) { 41821 switch (oResult.code) { 41822 case '0000' : 41823 if (oResult.data.length < 1) { 41824 break; 41825 } 41826 EC$('.ec-async-multi-popup-layer-container-' + oResult.data.html_index).html(oResult.data.html_text); 41827 if (oResult.data.type == 'P') { 41828 BANNER_POPUP_OPEN.setPopupSetting(); 41829 BANNER_POPUP_OPEN.setPopupWidth(); 41830 BANNER_POPUP_OPEN.setPopupClose(); 41831 } else { 41832 /** 41833 * ì´ì¤ ì¤í¬ë¡¤ ë°©ì§ í´ëì¤ ì¶ê°(ë¹ë기) 41834 * 41835 */ 41836 EC$('body').addClass('eMobilePopup'); 41837 EC$('body').width('100%'); 41838 41839 BANNER_POPUP_OPEN.setFullPopupSetting(); 41840 BANNER_POPUP_OPEN.setFullPopupClose(); 41841 } 41842 break; 41843 default : 41844 break; 41845 } 41846 }, 41847 error: function () { 41848 } 41849 }); 41850 } 41851 } 41852}; 41853 41854/** 41855 * sns ì°ë ì ë³´ 41856 */ 41857CAPP_ASYNC_METHODS.aDatasetList.push('CustomerProvider'); 41858CAPP_ASYNC_METHODS.CustomerProvider = { 41859 STORAGE_KEY: 'CustomerProvider_' + CAFE24.SDE_SHOP_NUM, 41860 aData: {member_id: null, provider: null}, 41861 41862 isUse: function() 41863 { 41864 return false; 41865 }, 41866 41867 restoreCache: function() { 41868 // sessionStorage ì§ì ì¬ë¶ íì¸ 41869 if (!window.sessionStorage) { 41870 return false; 41871 } 41872 41873 var sSessionStorageData = window.sessionStorage.getItem(this.STORAGE_KEY); 41874 if (sSessionStorageData === null) { 41875 return false; 41876 } 41877 41878 try { 41879 41880 var jsonData = JSON.parse(this.aData); 41881 var aStorageData = JSON.parse(sSessionStorageData); 41882 41883 // ìºì¬ ë°ì´í° ì¤ì 41884 jsonData.member_id = aStorageData.membr_id; 41885 jsonData.provider = aStorageData.provider; 41886 41887 this.aData = jsonData; 41888 41889 return true; 41890 } catch (e) { 41891 41892 // 복구 ì¤í¨ì ìºì ìì 41893 this.removeCache(); 41894 41895 return false; 41896 } 41897 }, 41898 41899 removeCache: function() 41900 { 41901 // sessionStorage ì§ì ì¬ë¶ íì¸ 41902 if (!window.sessionStorage) { 41903 return; 41904 } 41905 // ìºì ìì 41906 window.sessionStorage.removeItem(this.STORAGE_KEY); 41907 }, 41908 41909 setData: function(aData) 41910 { 41911 this.aData = JSON.stringify(aData); 41912 // sessionStorage ì§ì ì¬ë¶ íì¸ 41913 if (!window.sessionStorage) { 41914 return false; 41915 } 41916 41917 try { 41918 sessionStorage.setItem(this.STORAGE_KEY, this.aData); 41919 } catch (error) { 41920 } 41921 }, 41922 41923 execute: function() 41924 { 41925 41926 }, 41927 41928 getData: function() 41929 { 41930 if (typeof this.aData.member_id === 'object') return this.aData; 41931 return JSON.parse(this.aData); 41932 } 41933}; 41934 41935var eCacheDefaultShippingAddress = null; 41936if (window.location.protocol === 'https:' && (typeof CAFE24.CRYPTOKEY) == 'object') { 41937 CAFE24.CRYPTOKEY.decryptAndLoad('DefaultShippingAddress_' + CAFE24.SDE_SHOP_NUM).then(function(o) { 41938 eCacheDefaultShippingAddress = o; 41939 }).catch(function(err) { 41940 // console.log(err); 41941 }); 41942} 41943 41944 41945/** 41946 * ë¹ë기ì ë°ì´í° - 기본 ë°°ì¡ì£¼ì 41947 */ 41948CAPP_ASYNC_METHODS.aDatasetList.push('DefaultShippingAddress'); 41949CAPP_ASYNC_METHODS.DefaultShippingAddress = { 41950 41951 __sShippingAlias: null, 41952 __sZipCode: null, 41953 __sAddress1: null, 41954 __sAddress2: null,
41955 __bRestoredFromCache: false, 41956 41957 isUse: function() 41958 { 41959 if (CAPP_ASYNC_METHODS.IS_LOGIN === true) { 41960 // ECHOSTING-635081: ì¡°í ê²°ê³¼ì ì ì¼í ìë¹ì²ë App Script SDK 41961 // (CAFE24API.getDefaultShippingAddress -> AppCommon -> getData) ì´ë©°, 41962 // ê·¸ ì§ì ì ì´ 'customer' scope 를 ì´ë¯¸ ê²ì¬íë¤. ë¡ê·¸ì¸ UI ì¡´ì¬ ì¬ë¶ë 41963 // ë°°ì¡ì§ ìë¹ì 무ê´íë°ë ì íì´ì§ë·° ì ì¡°í를 ì ë°íì¼ë¯ë¡ íì ìì ì ì¸íë¤. 41964 if (typeof CAFE24.APPSCRIPT_SDK_DATA !== "undefined" && EC$.inArray('customer', CAFE24.APPSCRIPT_SDK_DATA) > -1) { 41965 return true; 41966 } 41967 41968 } else { 41969 // ë¹ ë¡ê·¸ì¸ ìíìì ìì ì²ë¦¬ 41970 this.removeCache(); 41971 } 41972 41973 return false; 41974 }, 41975 41976 restoreCache: function() 41977 { 41978 // sessionStorage ì§ì ì¬ë¶ íì¸ 41979 if (!window.sessionStorage) { 41980 return false; 41981 } 41982 41983 // ë°ì´í° 복구 ì 무 41984 var bRestored = false; 41985 41986 try { 41987 // ë°ì´í° 복구 41988 var oCache = null; 41989 if (window.location.protocol === 'https:' && (typeof CAFE24.CRYPTOKEY) == 'object') { 41990 if (eCacheDefaultShippingAddress) { 41991 oCache = JSON.parse(eCacheDefaultShippingAddress); 41992 } 41993 } else if (window.location.protocol === 'http:' && (typeof CryptoJS) == 'object') { 41994 if (window.sessionStorage.getItem('DefaultShippingAddress_' + CAFE24.SDE_SHOP_NUM)) { 41995 oCache = window.sessionStorage.getItem('DefaultShippingAddress_' + CAFE24.SDE_SHOP_NUM); 41996 oCache = CryptoJS.AES.decrypt(oCache, SHOP.getMallID() + '_' + EC_SDE_SHOP_NUM).toString(CryptoJS.enc.Utf8); 41997 oCache = JSON.parse(oCache); 41998 } 41999 } 42000 42001 // expire ì²´í¬ 42002 if (oCache.exp < Date.now()) { 42003 throw new Error('cache has expired.'); 42004 } 42005 42006 // ë°ì´í° ì²´í¬ 42007 if (typeof oCache.data === 'undefined' 42008 || oCache.data === null 42009 || typeof oCache.data.shipping_alias === 'undefined' 42010 || typeof oCache.data.zip_code === 'undefined' 42011 || typeof oCache.data.address1 === 'undefined' 42012 || typeof oCache.data.address2 === 'undefined' 42013 ) { 42014 throw new Error('Invalid cache data.'); 42015 } 42016 42017 // ë°ì´í° 복구 42018 this.__sShippingAlias = oCache.data.shipping_alias; 42019 this.__sZipCode = oCache.data.zip_code; 42020 this.__sAddress1 = oCache.data.address1; 42021 this.__sAddress2 = oCache.data.address2; 42022 42023 this.__bRestoredFromCache = true; 42024 bRestored = true; 42025 } catch (e) { 42026 // 복구 ì¤í¨ì ìºì ìì 42027 this.removeCache(); 42028 } 42029 42030 return bRestored; 42031 }, 42032 42033 cache: function() 42034 { 42035 // sessionStorage ì§ì ì¬ë¶ íì¸ 42036 if (!window.sessionStorage) { 42037 return; 42038 } 42039 // ìºì 42040 var sData = JSON.stringify({exp: Date.now() + (1000 * 60 * 10), data: this.getData()}); 42041 42042 if (window.location.protocol === 'https:' && (typeof CAFE24.CRYPTOKEY) == 'object') { 42043 CAFE24.CRYPTOKEY.encryptAndSave('DefaultShippingAddress_' + CAFE24.SDE_SHOP_NUM, sData); 42044 } else if (window.location.protocol === 'http:' && (typeof CryptoJS) == 'object') { 42045 sData = CryptoJS.AES.encrypt(sData, SHOP.getMallID() + '_' + EC_SDE_SHOP_NUM).toString(); 42046 window.sessionStorage.setItem('DefaultShippingAddress_' + CAFE24.SDE_SHOP_NUM, sData); 42047 } 42048 }, 42049 42050 removeCache: function() 42051 { 42052 // sessionStorage ì§ì ì¬ë¶ íì¸ 42053 if (!window.sessionStorage) { 42054 return; 42055 } 42056 42057 // ìºì ìì 42058 window.sessionStorage.removeItem('encryptedData_DefaultShippingAddress_' + CAFE24.SDE_SHOP_NUM); 42059 window.sessionStorage.removeItem('iv_DefaultShippingAddress_' + CAFE24.SDE_SHOP_NUM); 42060 window.sessionStorage.removeItem('eto4DefaultShippingAddress_' + CAFE24.SDE_SHOP_NUM); 42061 window.sessionStorage.removeItem('eto5DefaultShippingAddress_' + CAFE24.SDE_SHOP_NUM); 42062 window.sessionStorage.removeItem('DefaultShippingAddress_' + CAFE24.SDE_SHOP_NUM); 42063 }, 42064
42065 setData: function(oData) 42066 { 42067 if (oData === null || typeof oData === 'undefined') { 42068 return; 42069 } 42070 42071 var val = function(v) { 42072 return (v === null || typeof v === 'undefined') ? null : v; 42073 }; 42074 42075 this.__sShippingAlias = val(oData.shipping_alias); 42076 this.__sZipCode = val(oData.zip_code); 42077 this.__sAddress1 = val(oData.address1); 42078 this.__sAddress2 = val(oData.address2); 42079 }, 42080 42081 execute: function() 42082 { 42083 // ECHOSTING-635081: ìºììì ë³µìë ê²½ì° ì¬ì ì¥íì§ ìëë¤. 42084 // async.js setData() ë ìºì íí¸ ëª¨ëìë execute() 를 í¸ì¶íë¯ë¡, ê·¸ëë¡ ëë©´ 42085 // 매 íì´ì§ë·°ë§ë¤ exp ê° ê°±ì ëì´ TTL ì´ ì¬ë¼ì´ë© ìëì°ê° ëë¤(= íì± ì¸ì ëì ë§ë£ ì ë¨). 42086 // ì´ë민/API ë¡ ë°°ì¡ì§ê° ë°ëìì ëì ë ¸ì¶ ì°½ì 10ë¶ì¼ë¡ ê³ ì í기 ìí´ ë¶ê¸°íë¤. 42087 if (this.__bRestoredFromCache === true) { 42088 return; 42089 } 42090 this.cache(); 42091 }, 42092 42093 getData: function() 42094 { 42095 if (CAPP_ASYNC_METHODS.STATUS == 'unready') { 42096 CAPP_ASYNC_METHODS.init(); 42097 } 42098 42099 if (this.__sShippingAlias === null 42100 && this.__sZipCode === null 42101 && this.__sAddress1 === null 42102 && this.__sAddress2 === null) { 42103 return null; 42104 } 42105 42106 return { 42107 shipping_alias: this.__sShippingAlias, 42108 zip_code: this.__sZipCode, 42109 address1: this.__sAddress1, 42110 address2: this.__sAddress2 42111 }; 42112 } 42113}; 42114 42115/** 42116 * ë¹ë기ì ë°ì´í° - ì¢ìì ìí ê°¯ì 42117 */ 42118CAPP_ASYNC_METHODS.aDatasetList.push('MyLikeProductCount'); 42119CAPP_ASYNC_METHODS.MyLikeProductCount = { 42120 __iMyLikeCount: null, 42121 42122 __$target: EC$('#xans_myshop_like_prd_cnt'), 42123 __$target_main: EC$('#xans_myshop_main_like_prd_cnt'), 42124 isUse: function() 42125 { 42126 if (this.__$target.length > 0 && SHOP.getLanguage() === 'ko_KR') { 42127 return true; 42128 } 42129 42130 if (this.__$target_main.length > 0 && SHOP.getLanguage() === 'ko_KR') { 42131 return true; 42132 } 42133 42134 return false; 42135 }, 42136 restoreCache: function() 42137 { 42138 var sCookieName = 'like_product_cnt' + CAFE24.SDE_SHOP_NUM; 42139 var re = new RegExp('(?:^| |;)' + sCookieName + '=([^;]+)'); 42140 var aCookieValue = document.cookie.match(re); 42141 if (aCookieValue) { 42142 this.__iMyLikeCount = parseInt(aCookieValue[1], 10); 42143 return true; 42144 } 42145 42146 return false; 42147 }, 42148 42149 setData: function(sData) 42150 { 42151 this.__iMyLikeCount = Number(sData); 42152 }, 42153 42154 execute: function() 42155 { 42156 if (SHOP.getLanguage() === 'ko_KR') { 42157 this.__$target.html(this.__iMyLikeCount + 'ê°'); 42158 this.__$target_main.html(this.__iMyLikeCount); 42159 } 42160 } 42161}; 42162 42163/** 42164 * ë¹ë기ì ë°ì´í° - ì¢ìì ìí list 42165 */ 42166CAPP_ASYNC_METHODS.aDatasetList.push('MyLikeProductList'); 42167CAPP_ASYNC_METHODS.MyLikeProductList = { 42168 __aMyLikeList: null, 42169 __iMyLikeListLimit: 10, 42170 __$target: EC$('.xans-product-likeproductasync'), 42171 isUse: function() 42172 { 42173 if (this.__$target.length > 0 && SHOP.getLanguage() === 'ko_KR') { 42174 return true; 42175 } 42176 42177 if (EC$('#EC_LIKE_ASYNC_LINK_DATA_LIST').length > 0) { 42178 return true; 42179 } 42180 return false; 42181 }, 42182 setData: function(aData) 42183 { 42184 this.__iMyLikeListLimit = EC_FRONT_JS_CONFIG_SHOP.aSyncLikeLimit; 42185 this.__aMyLikeList = aData; 42186 }, 42187 execute: function() 42188 { 42189 42190 if (this.__aMyLikeList === null || this.__aMyLikeList.length === 0) { 42191 EC$('#EC_LIKE_ASYNC_LINK_DATA_EMPTY').html(''); 42192 return; 42193 } 42194 42195 //EC$('#EC_LIKE_ASYNC_LINK_DATA_EMPTY').remove(); 42196 var sSpaceIcon = ' '; 42197 for (var iKey = 0; iKey < this.__aMyLikeList.length; iKey++) { 42198 var oRowData = EC$('#EC_LIKE_ASYNC_LINK_DATA_LIST_TEMP').clone().removeAttr('id'); 42199 oRowData.find('a[href^="/product/detail.html"').attr('href', this.__aMyLikeList[iKey].link_product_detail); 42200 oRowData.find('.thumb img').attr('src',this.__aMyLikeList[iKey].image_medium); 42201 oRowData.find('.EC_LIKE_ASYNC_LINK_DATA_PRODUCT_NAME').html('<a href="' + this.__aMyLikeList[iKey].link_product_detail + '">' + this.__aMyLikeList[iKey].disp_product_name + '</a>'); 42202 42203 var sIconListHtml = this.__aMyLikeList[iKey].soldout_icon + sSpaceIcon + this.__aMyLikeList[iKey].stock_icon + sSpaceIcon + this.__aMyLikeList[iKey].recommend_icon + sSpaceIcon + 42204 this.__aMyLikeList[iKey].new_icon + sSpaceIcon + this.__aMyLikeList[iKey].product_icons + sSpaceIcon + this.__aMyLikeList[iKey].benef
42204it_icons; 42205 if (sIconListHtml !== '') { 42206 oRowData.find('.EC_LIKE_ASYNC_LINK_DATA_ICON_LIST').html(sIconListHtml); 42207 } 42208 42209 EC$('#EC_LIKE_ASYNC_LINK_DATA_APPEND').append(oRowData); 42210 42211 if (iKey >= (this.__iMyLikeListLimit - 1)) { 42212 break; 42213 } 42214 } 42215 EC$('#EC_LIKE_ASYNC_LINK_DATA_LIST_TEMP').remove(); 42216 if (this.__aMyLikeList.length < this.__iMyLikeListLimit) { 42217 EC$('#EC_LIKE_ASYNC_LINK_DATA_MORE_VIEW').remove(); 42218 } 42219 42220 if (EC_FRONT_JS_CONFIG_SHOP.bAutoView === 'T') { 42221 document.getElementById('EC_LIKE_ASYNC_LINK_DATA_LIST').style.display = 'block'; 42222 } 42223 42224 } 42225}; 42226 42227/** 42228 * ë¹ë기ì ë°ì´í° - ë§ì´ì¼í > 주문 ì¹´ì´í¸ (주문 ê±´ì / CSê±´ì / ìì 주문) 42229 */ 42230CAPP_ASYNC_METHODS.aDatasetList.push('OrderHistoryCount'); 42231CAPP_ASYNC_METHODS.OrderHistoryCount = { 42232 __sTotalOrder: null, 42233 __sTotalOrderCs: null, 42234 __sTotalOrderOld: null, 42235 42236 __$target: EC$('#ec_myshop_total_orders'), 42237 __$target2: EC$('#ec_myshop_total_orders_cs'), 42238 __$target3: EC$('#ec_myshop_total_orders_old'), 42239 42240 isUse: function() 42241 { 42242 if (CAPP_ASYNC_METHODS.IS_LOGIN === true) { 42243 if (this.__$target.length > 0) { 42244 return true; 42245 } 42246 42247 if (this.__$target2.length > 0) { 42248 return true; 42249 } 42250 42251 if (this.__$target3.length > 0) { 42252 return true; 42253 } 42254 } 42255 42256 return false; 42257 }, 42258 42259 setData: function(aData) 42260 { 42261 this.__sTotalOrder = aData['total_orders']; 42262 this.__sTotalOrderCs = aData['total_orders_cs']; 42263 this.__sTotalOrderOld = aData['total_orders_old']; 42264 42265 }, 42266 42267 execute: function() 42268 { 42269 this.__$target.html(this.__sTotalOrder); 42270 this.__$target2.html(this.__sTotalOrderCs); 42271 this.__$target3.html(this.__sTotalOrderOld); 42272 } 42273}; 42274 42275/** 42276 * 주문조í > 주문ë´ìì¡°í ë° ì·¨ì/êµí/ë°íë´ì ë± í(OrderHistoryTab) ê°¯ì ë¹ë기í¸ì¶ 42277 */ 42278CAPP_ASYNC_METHODS.aDatasetList.push('OrderHistoryTab'); 42279CAPP_ASYNC_METHODS.OrderHistoryTab = { 42280 __$targetTotalOrders: EC$('#xans_myshop_total_orders'), 42281 __$targetTotalOrdersCs: EC$('#xans_myshop_total_orders_cs'), 42282 __$targetTotalOrdersPast: EC$('#xans_myshop_total_orders_past'), 42283 __$targetTotalOrdersOld: EC$('#xans_myshop_total_orders_old'), 42284 42285 isUse: function() 42286 { 42287 if (EC$('.xans-myshop-orderhistorytab').length > 0) { 42288 return true; 42289 } 42290 return false; 42291 }, 42292 execute: function() 42293 { 42294 try { 42295 var mode = this.getUrlParam('mode'); 42296 var order_id = this.getUrlParam('order_id'); 42297 var order_status = this.getUrlParam('order_status'); 42298 var history_start_date = this.getUrlParam('history_start_date'); 42299 var history_end_date = this.getUrlParam('history_end_date'); 42300 var past_year = this.getUrlParam('past_year'); 42301 var count = this.getUrlParam('count'); 42302 42303 var sPathName = window.location.pathname; 42304 42305 var oParameters = { 42306 'mode': mode == null ? '' : mode, 42307 'order_id': order_id == null ? '' : order_id, 42308 'order_status': order_status == null ? '' : order_status, 42309 'history_start_date': history_start_date == null ? '' : history_start_date, 42310 'history_end_date': history_end_date == null ? '' : history_end_date, 42311 'past_year': past_year == null ? '' : past_year, 42312 'count': count == null ? '' : count, 42313 'page_name': sPathName.substring(sPathName.lastIndexOf("/") + 1, sPathName.indexOf('.')) 42314 }; 42315 42316 if (typeof EC_ASYNC_ORDERHISTORYTAB_ORDER_ID !== 'undefined') { 42317 oParameters['encrypted_str'] = EC_ASYNC_ORDERHISTORYTAB_ORDER_ID; 42318 } 42319 42320 var oThis = this; 42321 42322 EC$.ajax({ 42323 url: '/exec/front/Myshop/OrderHistoryTab', 42324 dataType: 'json', 42325 data: oParameters, 42326 success: function (aData) { 42327 if (aData['result'] === true) { 42328 oThis.__$targetTotalOrders.html(aData['total_orders']); 42329 oThis.__$targetTotalOrdersCs.html(aData['total_orders_cs']); 42330 oThis.__$targetTotalOrdersOld.html(aData['total_orders_old']); 42331 oThis.__$targetTotalOrdersPast.html(aData['total_orders_past']); 42332 42333 var oTabATagList = { 42334 'param': EC$('.tab_class a'), 42335 'param_cs': EC$('.tab_class_cs a'), 42336 'param_past': EC$('.tab_class_past a'), 42337 'param_old': EC$('.tab_class_old a'), 42338 }; 42339 var sHref; 42340 EC$.each(oTabATagList, function(sKey, oTarget) { 42341 if (oTarget.length > 0) { 42342 sHref = oTarget.attr("href"); 42343 sHref = sHref.replace("$" + sKey, aData[sKey]); 42344 oTarget.attr("href", sHref); 42345 } 42346 }); 42347 42348 EC$("." + aData['selected_tab_class']).addClass('selected'); 42349 42350 if (aData['is_past_list_display'] === false) { 42351 EC$('.tab_class_past').addClass("displaynone"); 42352 } else { 42353 EC$('.tab_class_past').removeClass("displaynone"); 42354 } 42355 42356 if (aData['old_list_display'] === false) { 42357 EC$('.tab_class_old').addClass("displaynone"); 42358 } else { 42359 EC$('.tab_class_old').removeClass("displaynone"); 42360 } 42361 } 42362 } 42363 }); 42364 } catch (oError) { 42365 this.errorAjaxCall(oError); 42366 } 42367 }, 42368 getUrlParam: function(name) 42369 { 42370 var param = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href); 42371 if (param == null) { 42372 return null; 42373 } else { 42374 return decodeURI(param[1]) || null; 42375 } 42376 }, 42377 errorAjaxCall: function(oError) 42378 { 42379 var sError = oError.toString(); 42380 var aMatch = sError.match(/Error*/g); 42381 42382 if (typeof(oError) !== 'object' || aMatch == null || aMatch.length < 1 || !oError.stack) return; 42383 42384 EC$.ajax({ 42385 url: '/exec/front/order/FormJserror/', 42386 method: 'POST', 42387 cache: false, 42388 async: false, 42389 data: { 42390 errorMessage: oError.message, 42391 errorStack: oError.stack, 42392 errorName: oError.name 42393 } 42394 }); 42395 } 42396}; 42397 42398/* 42399 * ë¹ë기ì ë°ì´í° - 주문조í í목 리ì¤í¸ 42400 */ 42401CAPP_ASYNC_METHODS.aDatasetList.push('OrderHistoryItemList'); 42402CAPP_ASYNC_METHODS.OrderHistoryItemList = { 42403 42404 STORAGE_KEY: 'OrderHistoryItemList_' + EC_SDE_SHOP_NUM, 42405 42406 __aData: null, 42407 42408 isUse: function() 42409 { 42410 // 주문조í íì´ì§ && SDK orderê¶íì´ ìëê²½ì°ìë§ ë ¸ì¶ 42411 if (EC$('.xans-myshop-orderhistorylistitem').length > 0 && typeof EC_APPSCRIPT_SDK_DATA !== "undefined" && EC$.inArray('order', EC_APPSCRIPT_SDK_DATA) > -1) { 42412 return true; 42413 } 42414 42415 // ë¹ ë¡ê·¸ì¸ ìíìì ìì ì²ë¦¬ 42416 if (CAPP_ASYNC_METHODS.IS_LOGIN === false) { 42417 this.removeCache(); 42418 } 42419 }, 42420 42421 restoreCache: function() 42422 { 42423 // sessionStorage ì§ì ì¬ë¶ íì¸ 42424 if (!window.sessionStorage) { 42425 return false;
42426 } 42427 42428 var sSessionStorageData = window.sessionStorage.getItem(this.STORAGE_KEY); 42429 if (sSessionStorageData === null || !sSessionStorageData) { 42430 return false; 42431 } 42432 42433 try { 42434 var aStorageData = JSON.parse(sSessionStorageData); 42435 42436 // expire ì²´í¬ 42437 if (aStorageData.exp < Date.now()) { 42438 throw 'cache has expired.'; 42439 } 42440 42441 this.__aData = []; 42442 for (var iKey in aStorageData.data) { 42443 this.__aData.push(aStorageData.data[iKey]); 42444 } 42445 42446 return true; 42447 } catch (e) { 42448 42449 // 복구 ì¤í¨ì ìºì ìì 42450 this.removeCache(); 42451 42452 return false; 42453 } 42454 }, 42455 42456 removeCache: function() 42457 { 42458 // sessionStorage ì§ì ì¬ë¶ íì¸ 42459 if (!window.sessionStorage) { 42460 return; 42461 } 42462 // ìºì ìì 42463 window.sessionStorage.removeItem(this.STORAGE_KEY); 42464 }, 42465 42466 setData: function(oData) 42467 { 42468 this.__aData = oData; 42469 42470 // sessionStorage ì§ì ì¬ë¶ íì¸ 42471 if (!window.sessionStorage) { 42472 return; 42473 } 42474 42475 try { 42476 sessionStorage.setItem(this.STORAGE_KEY, JSON.stringify({ 42477 exp: Date.now() + (1000 * 60 * 1), 42478 data: this.getData() 42479 })); 42480 } catch (error) { 42481 } 42482 }, 42483 42484 getData: function() 42485 { 42486 this.restoreCache(); 42487 var aStorageData = this.__aData; 42488 42489 if (aStorageData !== null && aStorageData !== false) { 42490 var oNewStorageData = []; 42491 for (var iKey in aStorageData) { 42492 oNewStorageData.push(aStorageData[iKey]); 42493 } 42494 return oNewStorageData; 42495 } 42496 return false; 42497 }, 42498 42499 getAsyncData: function(start_date, end_date, order_status, page, count, order_id) 42500 { 42501 return new Promise(function (res) { 42502 var oParameters = { 42503 'order_id': order_id === null ? '' : order_id, 42504 'order_status': order_status === null ? '' : order_status, 42505 'start_date': start_date === null ? '' : start_date, 42506 'end_date': end_date === null ? '' : end_date, 42507 'count': count === null ? '' : count, 42508 'page': page === null ? '' : page, 42509 }; 42510 42511 if (typeof EC_ASYNC_ORDERHISTORYTAB_ORDER_ID !== 'undefined') { 42512 oParameters['encrypted_str'] = EC_ASYNC_ORDERHISTORYTAB_ORDER_ID; 42513 } 42514 42515 EC$.ajax( 42516 { 42517 url: '/exec/front/manage/async?module=OrderHistoryItemList', 42518 data: oParameters, 42519 dataType: 'json', 42520 success: function (aData) { 42521 var aResult = []; 42522 var aStorageData = aData.OrderHistoryItemList; 42523 42524 for (var iKey in aStorageData) { 42525 aResult.push(aStorageData[iKey]); 42526 } 42527 res(aResult); 42528 } 42529 }); 42530 }); 42531 } 42532}; 42533/** 42534 * ë¹ë기ì ë°ì´í° - 주문ìì¸ ì¡°í 42535 */ 42536CAPP_ASYNC_METHODS.aDatasetList.push('OrderDetailInfo'); 42537CAPP_ASYNC_METHODS.OrderDetailInfo = { 42538 STORAGE_KEY: 'OrderDetailInfo_' + EC_SDE_SHOP_NUM, 42539 __aData: null, 42540 42541 42542 isUse: function() 42543 { 42544 // 주문ìì¸ íì´ì§ && SDK orderê¶íì´ ìëê²½ì°ìë§ ë ¸ì¶ 42545 if (EC$('.xans-myshop-orderhistorydetail').length > 0 && typeof EC_APPSCRIPT_SDK_DATA !== "undefined" && EC$.inArray('order', EC_APPSCRIPT_SDK_DATA) > -1) { 42546 return true; 42547 } 42548 42549 // ë¹ ë¡ê·¸ì¸ ìíìì ìì ì²ë¦¬ 42550 if (CAPP_ASYNC_METHODS.IS_LOGIN === false) { 42551 this.removeCache(); 42552 } 42553 }, 42554 42555 restoreCache: function() 42556 { 42557 // sessionStorage ì§ì ì¬ë¶ íì¸ 42558 if (!window.sessionStorage) { 42559 return false; 42560 } 42561 42562 var sSessionStorageData = window.sessionStorage.getItem(this.STORAGE_KEY); 42563 if (sSessionStorageData === null || !sSessionStorageData) { 42564 return false;
42565 } 42566 42567 try { 42568 var aStorageData = JSON.parse(sSessionStorageData); 42569 42570 // expire ì²´í¬ 42571 if (aStorageData.exp < Date.now()) { 42572 throw 'cache has expired.'; 42573 } 42574 42575 this.__aData = []; 42576 for (var iKey in aStorageData.data) { 42577 this.__aData.push(aStorageData.data[iKey]); 42578 } 42579 42580 return true; 42581 } catch (e) { 42582 42583 // 복구 ì¤í¨ì ìºì ìì 42584 this.removeCache(); 42585 42586 return false; 42587 } 42588 }, 42589 42590 42591 removeCache: function() 42592 { 42593 // sessionStorage ì§ì ì¬ë¶ íì¸ 42594 if (!window.sessionStorage) { 42595 return; 42596 } 42597 // ìºì ìì 42598 window.sessionStorage.removeItem(this.STORAGE_KEY); 42599 }, 42600 42601 setData: function(oData) 42602 { 42603 this.__aData = oData; 42604 42605 // sessionStorage ì§ì ì¬ë¶ íì¸ 42606 if (!window.sessionStorage) { 42607 return; 42608 } 42609 42610 try { 42611 sessionStorage.setItem(this.STORAGE_KEY, JSON.stringify({ 42612 exp: Date.now() + (1000 * 60 * 1), 42613 data: this.getData() 42614 })); 42615 } catch (error) { 42616 } 42617 }, 42618 42619 getData: function() 42620 { 42621 this.restoreCache(); 42622 var aStorageData = this.__aData; 42623 42624 if (aStorageData !== null && aStorageData !== false) { 42625 var oNewStorageData = []; 42626 for (var iKey in aStorageData) { 42627 oNewStorageData.push(aStorageData[iKey]); 42628 } 42629 return oNewStorageData; 42630 } 42631 return false; 42632 }, 42633 42634 getAsyncData: function (shop_no, order_id) { 42635 return new Promise(function (res) { 42636 var oParameters = { 42637 'shop_no': shop_no === null ? '' : shop_no, 42638 'order_id': order_id === null ? '' : order_id, 42639 }; 42640 42641 if (typeof EC_ASYNC_ORDERHISTORYTAB_ORDER_ID !== 'undefined') { 42642 oParameters['encrypted_str'] = EC_ASYNC_ORDERHISTORYTAB_ORDER_ID; 42643 } 42644 42645 EC$.ajax( 42646 { 42647 url: '/exec/front/manage/async?module=OrderDetailInfo', 42648 data: oParameters, 42649 dataType: 'json', 42650 success: function (aData) { 42651 var aResult = []; 42652 var aStorageData = aData.OrderDetailInfo; 42653 42654 for (var iKey in aStorageData) { 42655 aResult.push(aStorageData[iKey]); 42656 } 42657 res(aResult); 42658 } 42659 }); 42660 }); 42661 } 42662} 42663/** 42664 * ë¹ë기ì ë°ì´í° - 주문 ì·¨ì/êµí/ë°í ê°ë¥ í목리ì¤í¸ 42665 */ 42666CAPP_ASYNC_METHODS.aDatasetList.push('ClaimableItemList'); 42667CAPP_ASYNC_METHODS.ClaimableItemList = { 42668 STORAGE_KEY: 'ClaimableItemList_' + EC_SDE_SHOP_NUM, 42669 __aData: null, 42670 __$target: EC$('.xans-myshop-orderhistoryapplycancel'), //ì·¨ì 42671 __$target2: EC$('.xans-myshop-orderhistoryapplyexchange'), //êµí 42672 __$target3: EC$('.xans-myshop-orderhistoryapplyreturn'), //ë°í 42673 42674 isUse: function() 42675 { 42676 // 주문ìì¸ íì´ì§ && SDK orderê¶íì´ ìëê²½ì°ìë§ ë ¸ì¶ 42677 if (typeof EC_APPSCRIPT_SDK_DATA !== "undefined" && EC$.inArray('order', EC_APPSCRIPT_SDK_DATA) > -1) { 42678 if (this.__$target.length > 0) { 42679 return true; 42680 } 42681 if (this.__$target2.length > 0) { 42682 return true; 42683 } 42684 if (this.__$target3.length > 0) { 42685 return true; 42686 } 42687 } 42688 42689 // ë¹ ë¡ê·¸ì¸ ìíìì ìì ì²ë¦¬ 42690 if (CAPP_ASYNC_METHODS.IS_LOGIN === false) { 42691 this.removeCache(); 42692 } 42693 }, 42694 42695 restoreCache: function() 42696 { 42697 // sessionStorage ì§ì ì¬ë¶ íì¸ 42698 if (!window.sessionStorage) { 42699 return false; 42700 } 42701 42702 var sSessionStorageData = window.sessionStorage.getItem(this.STORAGE_KEY); 42703 if (sSessionStorageData === null || !sSessionStorageData) { 42704 return false;
42705 } 42706 42707 try { 42708 var aStorageData = JSON.parse(sSessionStorageData); 42709 42710 // expire ì²´í¬ 42711 if (aStorageData.exp < Date.now()) { 42712 throw new Error('cache has expired.'); 42713 } 42714 42715 this.__aData = []; 42716 for (var iKey in aStorageData.data) { 42717 this.__aData.push(aStorageData.data[iKey]); 42718 } 42719 42720 return true; 42721 } catch (e) { 42722 // 복구 ì¤í¨ì ìºì ìì 42723 this.removeCache(); 42724 return false; 42725 } 42726 }, 42727 42728 42729 removeCache: function() 42730 { 42731 // sessionStorage ì§ì ì¬ë¶ íì¸ 42732 if (!window.sessionStorage) { 42733 return; 42734 } 42735 // ìºì ìì 42736 window.sessionStorage.removeItem(this.STORAGE_KEY); 42737 }, 42738 42739 setData: function(oData) 42740 { 42741 this.__aData = oData; 42742 42743 // sessionStorage ì§ì ì¬ë¶ íì¸ 42744 if (!window.sessionStorage) { 42745 return; 42746 } 42747 42748 try { 42749 sessionStorage.setItem(this.STORAGE_KEY, JSON.stringify({ 42750 exp: Date.now() + (1000 * 60 * 1), 42751 data: this.getData() 42752 })); 42753 } catch (error) { 42754 } 42755 }, 42756 42757 getData: function() 42758 { 42759 this.restoreCache(); 42760 var aStorageData = this.__aData; 42761 42762 if (aStorageData !== null && aStorageData !== false && aStorageData.length > 0) { 42763 var oNewStorageData = []; 42764 for (var iKey in aStorageData) { 42765 oNewStorageData.push(aStorageData[iKey]); 42766 } 42767 return oNewStorageData; 42768 } 42769 return false; 42770 }, 42771 42772 getAsyncData: function (order_id, customer_service_type) { 42773 return new Promise(function (res,rej) { 42774 if (customer_service_type === null) { 42775 if (CAPP_ASYNC_METHODS.ClaimableItemList.__$target.length > 0) { 42776 customer_service_type = 'C'; 42777 } else if (CAPP_ASYNC_METHODS.ClaimableItemList.__$target2.length > 0) { 42778 customer_service_type = 'E'; 42779 } else if (CAPP_ASYNC_METHODS.ClaimableItemList.__$target3.length > 0) { 42780 customer_service_type = 'R'; 42781 } 42782 } 42783 order_id = order_id === null ? CAPP_ASYNC_METHODS.ClaimableItemList.getUrlParam('order_id') : order_id; 42784 42785 if (order_id === '' || order_id === null) { 42786 rej({code: 422, message: 'order_id is empty'}) 42787 } 42788 42789 var oParameters = { 42790 'order_id': order_id, 42791 'customer_service_type': customer_service_type 42792 }; 42793 42794 EC$.ajax( 42795 { 42796 url: '/exec/front/manage/async?module=ClaimableItemList', 42797 data: oParameters, 42798 dataType: 'json', 42799 success: function (aData) { 42800 var aResult = []; 42801 var aStorageData = aData.ClaimableItemList; 42802 42803 CAPP_ASYNC_METHODS.ClaimableItemList.removeCache(); 42804 CAPP_ASYNC_METHODS.ClaimableItemList.setData(aStorageData); 42805 42806 for (var iKey in aStorageData) { 42807 aResult.push(aStorageData[iKey]); 42808 } 42809 res(aResult); 42810 } 42811 }); 42812 }); 42813 }, 42814 getUrlParam: function(name) 42815 { 42816 var param = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href); 42817 if (param === null) { 42818 return null; 42819 } else { 42820 return decodeURI(param[1]) || null; 42821 } 42822 } 42823}; 42824var PathRoleValidator = (function() { 42825 /** 42826 * Milage, Deposit ì ê²½ì° ì²ë¦¬ëì§ ë§ìì¼í íì´ì§ íì¸ 42827 * @returns {boolean} 42828 */ 42829 function isInvalidPathRole() 42830 { 42831 // path role 42832 var sCurrentPathRole = null; 42833 42834 // // euckr íê²½ìì path role íë 42835 if (SHOP.getProductVer() === 1) { 42836 // path ì role 매í 42837 var aPathRoleMap = { 42838 '/myshop/index.html': 'MYSHOP_MAIN', 42839 '/myshop/mileage/historyList.html': 'MYSHOP_MILEAGE_LIST', 42840 '/myshop/deposits/historyList.html': 'MYSHOP_DEPOSIT_LIST', 42841 '/order/orderform.html': 'ORDER_ORDERFORM' 42842 }; 42843 42844 // íì´ì§ ê²½ë¡ë¡ë¶í° path role íë 42845 sCurrentPathRole = aPathRoleMap[document.location.pathname]; 42846 42847 // utf8 íê²½ìì path role íë 42848 } else { 42849 // íì¬ íì´ì§ path role íë 42850 sCurrentPathRole = EC$('meta[name="path_role"]').attr('content'); 42851 } 42852 42853 // ì²ë¦¬ëë©´ ìëë ê²½ë¡ 42854 var aInvalidPathRole = [ 42855 'MYSHOP_MAIN', 42856 'MYSHOP_MILEAGE_LIST', 42857 'MYSHOP_DEPOSIT_LIST', 42858 'ORDER_ORDERFORM' 42859 ]; 42860 42861 return EC$.inArray(sCurrentPathRole, aInvalidPathRole) >= 0; 42862 } 42863 42864 return { 42865 isInvalidPathRole: isInvalidPathRole 42866 }; 42867})(); 42868 42869EC$(function() 42870{ 42871 CAPP_ASYNC_METHODS.init(); 42872}); 42873 42874CAFE24.MANAGE_PRODUCT_RECENT = { 42875 getRecentImageUrl: function() { 42876 var sStorageKey = 'localRecentProduct' + CAFE24.SDE_SHOP_NUM; 42877 42878 if (typeof sessionStorage[sStorageKey] !== 'undefined') { 42879 var sRecentData = sessionStorage.getItem(sStorageKey); 42880 var oJsonData = JSON.parse(sRecentData); 42881 var sImageSrc = ''; 42882 42883 if (oJsonData[0] !== undefined) { 42884 sImageSrc = oJsonData[0].sImgSrc; 42885 if (typeof EC_FRONT_JS_CONFIG_MANAGE !== 'undefined' && typeof EC_FRONT_JS_CONFIG_MANAGE.cdnUrl !== 'undefined' && EC_FRONT_JS_CONFIG_MANAGE.cdnUrl !== '') { 42886 sImageSrc = EC_FRONT_JS_CONFIG_MANAGE.cdnUrl + '/web/product/tiny/' + sImageSrc; 42887 } 42888 } 42889 42890 document.location.replace('recentproduct://setinfo?simg_src=' + sImageSrc); 42891 } 42892 } 42893}; 42894 42895var EC_MANAGE_PRODUCT_RECENT = CAFE24.getDeprecatedNamespace('EC_MANAGE_PRODUCT_RECENT'); 42896 42897CAFE24.MANAGE_MEMBER = { 42898 // ì¹´ì¹´ì¤ì±í¬ ë¡ê·¸ì¸
42899 kakaosyncLogin: function(clientSecret) { 42900 if (Kakao.isInitialized()) { 42901 Kakao.cleanup(); 42902 } 42903 Kakao.init(clientSecret); 42904 42905 Kakao.Auth.authorize({ 42906 redirectUri: location.origin + EC_ROUTE.getPrefixUrl('/Api/Member/Oauth2ClientCallback/kakao/'), 42907 throughTalk: true 42908 }); 42909 } 42910}; 42911 42912var EC_MANAGE_MEMBER = CAFE24.getDeprecatedNamespace('EC_MANAGE_MEMBER'); 42913 42914// íë¡í ì½ ì²´í¬ í¬í¨ 42915if (window.navigator && 'serviceWorker' in window.navigator) { 42916 window.addEventListener('load', function () { 42917 var getFrontendConfig = function (sOption) { 42918 if (typeof window.CAFE24 === 'object' && typeof window.CAFE24.FRONTEND === 'object') { 42919 return window.CAFE24.FRONTEND[sOption]; 42920 } 42921 42922 return null; 42923 }; 42924 42925 var sCafeSWName = '/ind-script/sw.php'; 42926 var sA2hsLogKey = 'a2hs_manifest_name'; 42927 var oManifest = document.querySelector('link[rel="manifest"]'); 42928 var bHasManifest = !!oManifest; 42929 if (bHasManifest === true) { 42930 // start_url ë¡ ë¤ì´ì¨ ê²½ì° ë¡ê¹ 42931 if (location.pathname === '/' && location.search.indexOf('a2hs=1') !== -1) { 42932 var sManifestName = oManifest.href.split('/').pop(); 42933 42934 var sStoredManifestName = localStorage.getItem(sA2hsLogKey); 42935 if (!sStoredManifestName || sStoredManifestName !== sManifestName) { 42936 if (window.fetch) { 42937 fetch('/exec/front/manage/a2hs', { 42938 headers: { 42939 'Content-Type': 'application/json' 42940 }, 42941 method: 'POST', 42942 body: JSON.stringify({ 42943 ua: navigator.userAgent 42944 }) 42945 }).then(function (oResponse) { 42946 localStorage.setItem(sA2hsLogKey, sManifestName); 42947 }); 42948 } 42949 } 42950 } 42951 } 42952 42953 var sUserAgent = (navigator.userAgent || '').toLowerCase(); 42954 var sClientWebView = ((sUserAgent.indexOf('android') !== -1 && sUserAgent.indexOf('wv') !== -1) 42955 || sUserAgent.indexOf('cafe24plus') !== -1) 42956 ? 'T' 42957 : 'F'; 42958 42959 // ìë¹ì¤ì커 ì¤ì¹ ê²ì¦ 42960 var bIsWebView = getFrontendConfig('IS_WEB_VIEW') === 'T' || sClientWebView === 'T'; 42961 var oRegistrationPromise = navigator.serviceWorker.getRegistration('/'); 42962 if (!oRegistrationPromise) { 42963 return; 42964 } 42965 42966 oRegistrationPromise.then(function (oSWRegistration) { 42967 var bInstallable = true; 42968 // ë±ë¡ë ìë¹ì¤ìì»¤ê° ìì ê²½ì°, Cafe24 ìë¹ì¤ì커ì¸ì§ íì¸ 42969 if (oSWRegistration) { 42970 var oSW = oSWRegistration.installing || oSWRegistration.waiting || oSWRegistration.active; 42971 if (oSW && oSW.scriptURL.indexOf(sCafeSWName) === -1) { 42972 bInstallable = false; 42973 } else if (bIsWebView === true) { 42974 // cafe24 ìë¹ì¤ì커면ì ì¹ë·° ì ê·¼ì¼ ê²½ì° ìë¹ì¤ì커 ìì (í¬ë¡¬ 75.0.3770.67 ë²ì ëì) 42975 return oSWRegistration.unregister().then(function () { 42976 return false; 42977 }).catch(function (oError) { 42978 if (window.EC_JET && EC_JET.message) { 42979 EC_JET.message(oError, 'ServiceWorker'); 42980 } 42981 console.warn('unregisterError => ', oError, oError.message, oError.name); 42982 return false; 42983 }); 42984 } 42985 } 42986 42987 if (bIsWebView) { 42988 bInstallable = false; 42989 } 42990 42991 return bInstallable; 42992 }) 42993 .then(function (bInstallable) { 42994 if (!bInstallable) { 42995 return; 42996 } 42997 42998 var sRevision = getFrontendConfig('FW_MANIFEST_CACHE_REVISION'); 42999 if (sRevision) { 43000 sCafeSWName = sCafeSWName + '?v=' + sRevision; 43001 } 43002 43003 return navigator.serviceWorker.register(sCafeSWName, { 43004 scope: '/', 43005 updateViaCache: 'all' 43006 }).catch(function (oError) { 43007 if (window.EC_JET && EC_JET.message) { 43008 EC_JET.message(oError, 'ServiceWorker'); 43009 } 43010 console.warn('registerError => ', oError, oError.message, oError.name); 43011 }); 43012 }); 43013 }); 43014} 43015 43016CAFE24.EXTERNAL_FRONT_APPSCRIPT = { 43017 insertAppScript: function() { 43018 if (typeof CAFE24.APPSCRIPT_ASSIGN_DATA !== "undefined" && Array.isArray(CAFE24.APPSCRIPT_ASSIGN_DATA)) { 43019 while (CAFE24.APPSCRIPT_ASSIGN_DATA.length > 0) { 43020 var oSrcData = CAFE24.APPSCRIPT_ASSIGN_DATA.pop(); 43021 CAFE24.EXTERNAL_FRONT_APPSCRIPT.appendAppScript(oSrcData['src'], oSrcData['integrity']); 43022 } 43023 } 43024 if (typeof CAFE24.APPSCRIPT_SOURCE_DATA !== "undefined" && Array.isArray(CAFE24.APPSCRIPT_SOURCE_DATA)) { 43025 while (CAFE24.APPSCRIPT_SOURCE_DATA.length > 0) { 43026 CAFE24.EXTERNAL_FRONT_APPSCRIPT.appendSourceTypeScript(CAFE24.APPSCRIPT_SOURCE_DATA.pop()); 43027 } 43028 } 43029 }, 43030 appendAppScript: function(sSrc, sIntegrity) { 43031 var js = document.createElement('script'); 43032 js.src = sSrc; 43033 // integrity íëê° ì¡´ì¬íë ê²½ì° ì¤í¬ë¦½í¸ ë¬´ê²°ì± ì²´í¹ì ìí´ ì¶ê°. 43034 if (sIntegrity && sIntegrity !== null) { 43035 js.integrity = sIntegrity; 43036 js.crossOrigin = "anonymous"; 43037 } 43038 document.body.appendChild(js); 43039 }, 43040 appendSourceTypeScript: function (sSrc) { 43041 var js = document.createElement('script'); 43042 js.type = 'text/javascript'; 43043 js.text = CAFE24.EXTERNAL_FRONT_APPSCRIPT.base64Decode(sSrc); 43044 document.body.appendChild(js); 43045 }, 43046 base64Decode: function (sEncoded) { 43047 return decodeURIComponent(atob(sEncoded).split('').map(function(c) {
43048 return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); 43049 }).join('')); 43050 } 43051}; 43052if (document.readyState === 'complete') { 43053 CAFE24.EXTERNAL_FRONT_APPSCRIPT.insertAppScript(); 43054} else if (window.addEventListener) { 43055 window.addEventListener('load', CAFE24.EXTERNAL_FRONT_APPSCRIPT.insertAppScript); 43056} else if (window.attachEvent) { 43057 window.attachEvent('onload', CAFE24.EXTERNAL_FRONT_APPSCRIPT.insertAppScript); 43058} 43059 43060var EC_EXTERNAL_FRONT_APPSCRIPT = CAFE24.getDeprecatedNamespace('EC_EXTERNAL_FRONT_APPSCRIPT'); 43061 43062/** 43063 * SDK spec interface 43064 */ 43065EC_EXTERNAL_UTIL_APP_SPECINTERFACE = { 43066 43067 oLoginProvider: { 43068 member_id: null, 43069 provider: null, 43070 client_id: null 43071 }, 43072 43073 oCustomerProvider: { 43074 member_id: null, 43075 provider: null 43076 }, 43077 43078 oMemberInfo: { 43079 member_id: null, 43080 group_no: null, 43081 guest_id: null 43082 }, 43083 43084 oCustomerIDInfo: { 43085 member_id: null, 43086 guest_id: null 43087 }, 43088 43089 oCustomerInfo: { 43090 member_id: null, 43091 name: null, 43092 nick_name: null, 43093 group_name: null, 43094 group_no: null, 43095 email: null, 43096 news_mail: null, 43097 phone: null, 43098 cellphone: null, 43099 sms: null, 43100 birthday: null, 43101 additional_information: null, 43102 authentication_method: null, 43103 created_date: null 43104 }, 43105 43106 oDefaultShippingAddress: { 43107 shipping_alias: null, 43108 zip_code: null, 43109 address1: null, 43110 address2: null 43111 }, 43112 43113 // @todo deprecated 43114 oMileageInfo: { 43115 available_mileage: null, 43116 returned_mileage: null, 43117 total_mileage: null, 43118 unavailable_mileage: null, 43119 used_mileage: null 43120 }, 43121 43122 // @todo deprecated 43123 oDepositInfo: { 43124 all_deposit: null, 43125 member_total_deposit: null, 43126 refund_wait_deposit: null, 43127 total_deposit: null, 43128 used_deposit: null 43129 }, 43130 43131 oPointInfo: { 43132 available_point: null, 43133 returned_point: null, 43134 total_point: null, 43135 unavailable_point: null, 43136 used_point: null 43137 }, 43138 43139 oCreditInfo: { 43140 all_credit: null, 43141 member_total_credit: null, 43142 refund_wait_credit: null, 43143 total_credit: null, 43144 used_credit: null 43145 }, 43146 43147 oCartList: { 43148 shop_no: null, 43149 product_no: null, 43150 additional_option: null, 43151 attached_file_option: null, 43152 basket_product_no: null, 43153 product_price: null, 43154 quantity: null, 43155 selected_product: null, 43156 variant_code: null, 43157 option_id: null, 43158 is_set_product: null, 43159 set_product_no: null, 43160 delvtype: null 43161 }, 43162 43163 oCartInfo: { 43164 basket_price: null 43165 }, 43166 43167 oCartItemList: { 43168 basket_product_no: null, 43169 product_no: null, 43170 price: null, 43171 option_price: null, 43172 quantity: null, 43173 discount_price: null, 43174 variant_code: null, 43175 product_weight: null, 43176 display_group: null, 43177 quantity_based_discount: null, 43178 non_quantity_based_discount: null, 43179 product_volume: null, 43180 additional_option_values: null, 43181 product_bundle: null, 43182 product_bundle_no: null, 43183 option_id: null, 43184 product_name: null, 43185 product_image: null, 43186 option_value: null, 43187 shipping_fee_type: null, 43188 categories: null 43189 }, 43190 43191 oCount: { 43192 count: 0 43193 }, 43194 43195 oShopInfo: { 43196 language_code: null, 43197 currency_code: null, 43198 timezone: null 43199 }, 43200 43201 oAddedProductToCart : { 43202 shop_no: null, 43203 category_no: null, 43204 quantity: null, 43205 additional_option_value: null, 43206 variant_code: null, 43207 product_bundle: null, 43208 prefaid_shipping_fee: null, 43209 attached_file_option: null, 43210 created_date: null, 43211 product_price: null, 43212 option_price: null, 43213 product_bundle_price: null, 43214 product_no: null, 43215 option_id: null, 43216 product_bundle_no: null, 43217 shipping_type : null, 43218 subscription: null, 43219 subscription_cycle: null, 43220 subscription_shipments_cycle_count: null, 43221 basket_product_no: null, 43222 additional_option_values: null, 43223 product_name: null, 43224 checked_products : null, 43225 option_text : null 43226 }, 43227 43228 oOrderItemList: { 43229 order_id: null, 43230 order_item_code: null, 43231 order_status: null 43232 }, 43233 43234 oOrderDetailInfo: { 43235 shop_no: null, 43236 order_id: null, 43237 initial_order_amount: null, 43238 actual_order_amount: null, 43239 payment_method: null, 43240 order_date: null, 43241 first_payment_method: null, 43242 items: null 43243 }, 43244 43245 oClaimableItemList: { 43246 order_id: null, 43247 item_no: null, 43248 order_item_code: null, 43249 variant_code: null, 43250 product_no: null, 43251 product_code: null, 43252 custom_product_code: null, 43253 custom_variant_code: null, 43254 option_id: null, 43255 quantity: null, 43256 price: null, 43257 order_status: null,
43258 supplier_code: null, 43259 supplier_name: null 43260 }, 43261 43262 oPrecreateOrder : { 43263 products: null, 43264 hmac: null, 43265 response_time: null, 43266 order_id: null, 43267 return_notification_url: null, 43268 is_nointerest: null, 43269 nointerest_quota: null 43270 }, 43271 43272 oPrecreateOrderProduct : { 43273 shop_no: null, 43274 category_no: null, 43275 quantity: null, 43276 additional_option_values: null, 43277 variant_code: null, 43278 product_bundle: null, 43279 prefaid_shipping_fee: null, 43280 attached_file_option: null, 43281 created_date: null, 43282 product_price: null, 43283 option_price: null, 43284 product_bundle_price: null, 43285 product_no: null, 43286 option_id: null, 43287 product_bundle_no: null, 43288 shipping_type : null, 43289 subscription: null, 43290 subscription_cycle: null, 43291 subscription_shipments_cycle_count: null, 43292 basket_product_no: null, 43293 product_name: null, 43294 checked_products : null, 43295 option_text : null, 43296 product_bundle_list: null 43297 }, 43298 43299 oBatchBasketAddItem : { 43300 product_no: null, 43301 variants_code: null, 43302 quantity: null, 43303 options: null, 43304 additional_option_values: null 43305 }, 43306 43307 oBatchBasketAddSetItem : { 43308 product_no: null, 43309 variants_code: null, 43310 quantity: null, 43311 bundle_product_components: null 43312 } 43313}; 43314 43315/** 43316 * ë¹ë기ì ë°ì´í° - App Common ( ì± ê³µíµì ë³´ ) 43317 */ 43318CAPP_ASYNC_METHODS.aDatasetList.push('AppCommon'); 43319CAPP_ASYNC_METHODS.AppCommon = { 43320 43321 STORAGE_KEY: 'AppCommon_' + CAFE24.SDE_SHOP_NUM, 43322 43323 __sGuestId: null, 43324 43325 isUse: function() 43326 { 43327 if (typeof CAFE24.APPSCRIPT_SDK_DATA !== "undefined" && EC$.inArray('application', CAFE24.APPSCRIPT_SDK_DATA) > -1) { 43328 return true; 43329 } 43330 43331 return false; 43332 }, 43333 43334 restoreCache: function() 43335 { 43336 // sessionStorage ì§ì ì¬ë¶ íì¸ 43337 if (!window.sessionStorage) { 43338 return false; 43339 } 43340 43341 try { 43342 var aStorageData = JSON.parse(window.sessionStorage.getItem(this.STORAGE_KEY)); 43343 43344 // expire ì²´í¬ 43345 if (aStorageData.exp < Date.now()) { 43346 throw 'cache has expired.'; 43347 } 43348 43349 // ë°ì´í° ì²´í¬ 43350 if (typeof aStorageData.data.guest_id === 'undefined') { 43351 throw 'Invalid cache data.'; 43352 } 43353 43354 // ë°ì´í° 복구 43355 this.__sGuestId = aStorageData.data.guest_id; 43356 43357 return true; 43358 43359 } catch (e) { 43360 // 복구 ì¤í¨ì ìºì ìì 43361 this.removeCache(); 43362 return false; 43363 } 43364 }, 43365 43366 removeCache: function() 43367 { 43368 // sessionStorage ì§ì ì¬ë¶ íì¸ 43369 if (!window.sessionStorage) { 43370 return; 43371 } 43372 // ìºì ìì 43373 window.sessionStorage.removeItem(this.STORAGE_KEY); 43374 }, 43375 43376 setData: function(oData) 43377 { 43378 // sessionStorage ì§ì ì¬ë¶ íì¸ 43379 if (!window.sessionStorage) { 43380 return; 43381 } 43382 43383 this.__sGuestId = oData.guest_id || ''; 43384 43385 try { 43386 sessionStorage.setItem(this.STORAGE_KEY, JSON.stringify({ 43387 exp: Date.now() + (1000 * 60 * 10), 43388 data: this.getData() 43389 })); 43390 } catch (error) { 43391 } 43392 }, 43393 43394 execute: function() 43395 { 43396 }, 43397 43398 getData: function() 43399 { 43400 return { 43401 guest_id: this.__sGuestId 43402 }; 43403 }, 43404 43405 setSpecData: function(oSpec, oData) { 43406 var aData = {}; 43407 for (var prop in oSpec) { 43408 if (oData.hasOwnProperty(prop) === true) { 43409 aData[prop] = oData[prop]; 43410 } else { 43411 aData[prop] = oSpec[prop]; 43412 } 43413 } 43414 return aData; 43415 }, 43416 43417 setSpecDataMap: function(oSpec, oData, oMapData) { 43418 var aData = {}; 43419 for (var prop in oSpec) { 43420 if (oData.hasOwnProperty(oMapData[prop]) === true) { 43421 aData[prop] = oData[oMapData[prop]]; 43422 } else { 43423 aData[prop] = oSpec[prop]; 43424 } 43425 } 43426 return aData; 43427 }, 43428 43429 // sdk function list 43430 getMemberID: function() 43431 { 43432 return CAPP_ASYNC_METHODS.member.getData().member_id; 43433 }, 43434 43435 getEncryptedMemberId: function(sClientId) 43436 { 43437 var sUrl = '/shop' + EC_SDE_SHOP_NUM + '/Api/Member/Encryptmemberid'; 43438 var aParams = { 43439 'client_id': sClientId 43440 }; 43441 43442 var aReturn = null; 43443 EC$.ajax({ 43444 dataType: "json", 43445 type: "POST", 43446 url: sUrl, 43447 data: aParams, 43448 async: false, 43449 43450 success: function(response) { 43451 var sReturnCode = response.return_code; 43452 var aEncryptedId = response.result.member_id; 43453 43454 if (sReturnCode === '0000') { 43455 aEncryptedId = ''; 43456 } 43457 43458 aReturn = CAPP_ASYNC_METHODS.AppCommon.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCustomerIDInfo, {member_id: aEncryptedId}); 43459 } 43460 }); 43461 return aReturn; 43462 }, 43463 43464 getLoginProvider: function() 43465 { 43466 var sCookieName = "login_provider_"+CAFE24.SDE_SHOP_NUM; 43467 var sLoginProvider = CAPP_ASYNC_METHODS._getCookie(sCookieName); 43468 if (sLoginProvider === null) { 43469 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oLoginProvider, EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oLoginProvider); 43470 } 43471 43472 var oLoginProvider = JSON.parse(decodeURIComponent(sLoginProvider)); 43473 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oLoginProvider, oLoginProvider); 43474 }, 43475 43476 getCustomerProvider: function() 43477 { 43478 if (CAPP_ASYNC_METHODS.IS_LOGIN !== true) { 43479 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCustomerProvider, EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCustomerProvider); 43480 } 43481 43482 if (typeof CAPP_ASYNC_METHODS.CustomerProvider.getData().member_id !== 'undefined') { 43483 if (CAPP_ASYNC_METHODS.CustomerProvider.getData().member_id !== null) { 43484 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCustomerProvider, CAPP_ASYNC_METHODS.CustomerProvider.getData()); 43485 } 43486 } 43487 43488 var sUrl = EC_ROUTE.getPrefixUrl('/Api/Member/Customerprovider'); 43489 43490 var oReturn = EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCustomerProvider; 43491 EC$.ajax({ 43492 dataType: "json", 43493 type: "GET", 43494 url: sUrl, 43495 async: false, 43496 43497 success: function(response) { 43498 var sReturnCode = response.return_code; 43499 43500 if (sReturnCode === '0000') { 43501 return oReturn; 43502 } 43503 oReturn = response.result; 43504 43505 return oReturn; 43506 } 43507 }); 43508 CAPP_ASYNC_METHODS.CustomerProvider.setData(oReturn); 43509 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCustomerProvider, oReturn); 43510 }, 43511 43512 getMemberInfo: function() 43513 { 43514 if (CAPP_ASYNC_METHODS.IS_LOGIN === true) { 43515 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oMemberInfo, {group_no: CAPP_ASYNC_METHODS.member.getData().group_no, member_id: CAPP_ASYNC_METHODS.member.getData().member_id}); 43516 } else { 43517 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oMemberInfo, {guest_id: CAPP_ASYNC_METHODS.AppCommon.getData().guest_id}); 43518 } 43519 }, 43520 43521 getCustomerIDInfo: function() 43522 { 43523 if (CAPP_ASYNC_METHODS.IS_LOGIN === true) { 43524 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCustomerIDInfo, {member_id: CAPP_ASYNC_METHODS.member.getData().member_id}); 43525 } else { 43526 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCustomerIDInfo, {guest_id: CAPP_ASYNC_METHODS.AppCommon.getData().guest_id}); 43527 } 43528 }, 43529 43530 getCustomerInfo: function() 43531 { 43532 var oMember = CAPP_ASYNC_METHODS.member.getData(); 43533 if (oMember.created_date && typeof oMember.created_date === 'string') { 43534 oMember.created_date = oMember.created_date.replace(/(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}).+/, '$1'); 43535 } 43536 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCustomerInfo, oMember); 43537 }, 43538 43539 getDefaultShippingAddress: function() 43540 { 43541 var oData = CAPP_ASYNC_METHODS.DefaultShippingAddress.getData(); 43542 if (oData === null) { 43543 return null; 43544 } 43545 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oDefaultShippingAddress, oData); 43546 }, 43547 43548 // @todo deprecated 43549 getMileageInfo: function() 43550 { 43551 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oMileageInfo, CAPP_ASYNC_METHODS.Mileage.getData()); 43552 }, 43553 43554 // @todo deprecated 43555 getDepositInfo: function() 43556 { 43557 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oDepositInfo, CAPP_ASYNC_METHODS.Deposit.getData()); 43558 }, 43559 43560 getPointInfo: function() 43561 { 43562 var oMapData = { 43563 available_point: 'available_mileage', 43564 returned_point: 'returned_mileage', 43565 total_point: 'total_mileage', 43566 unavailable_point: 'unavailable_mileage', 43567 used_point: 'used_mileage' 43568 }; 43569 43570 return this.setSpecDataMap(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oPointInfo, CAPP_ASYNC_METHODS.Mileage.getData(), oMap
43570Data); 43571 }, 43572 43573 getCreditInfo: function() 43574 { 43575 var oMapData = { 43576 all_credit: 'all_deposit', 43577 member_total_credit: 'member_total_deposit', 43578 refund_wait_credit: 'refund_wait_deposit', 43579 total_credit: 'total_deposit', 43580 used_credit: 'used_deposit' 43581 }; 43582 43583 return this.setSpecDataMap(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCreditInfo, CAPP_ASYNC_METHODS.Deposit.getData(), oMapData); 43584 }, 43585 43586 getCartList: function() 43587 { 43588 var oCartList = EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCartList; 43589 var aCartList = []; 43590 return new Promise(function (resolve, reject) { 43591 CAPP_ASYNC_METHODS.BasketProduct.getData().then(function(oData) { 43592 for (var iKey in oData) { 43593 aCartList.push(CAPP_ASYNC_METHODS.AppCommon.setSpecData(oCartList, oData[iKey])); 43594 } 43595 resolve(aCartList); 43596 }).catch(function(data) { 43597 reject(data); 43598 }); 43599 }); 43600 }, 43601 43602 getCartInfo: function() 43603 { 43604 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCartInfo, CAPP_ASYNC_METHODS.Basketprice.getData()); 43605 }, 43606 43607 getCartItemList: function() 43608 { 43609 var aCartItemList = []; 43610 if (typeof aBasketProductData === "undefined" && typeof aBasketProductOrderData === "undefined") { 43611 return aCartItemList; 43612 } 43613 43614 //aBasketProductOrderData : 주문ì 43615 //aBasketProductData : ì¥ë°êµ¬ë 43616 var aData = (typeof aBasketProductOrderData !== "undefined") ? aBasketProductOrderData : aBasketProductData; 43617 43618 var oMapData = { 43619 basket_product_no: 'basket_prd_no', 43620 product_no: 'product_no', 43621 price: 'product_price', 43622 option_price: 'opt_price', 43623 quantity: 'product_qty', 43624 discount_price: 'product_sale_price', 43625 variant_code: 'item_code', 43626 product_weight: 'product_weight', 43627 display_group: 'main_cate_no', 43628 quantity_based_discount: 'add_sale_related_qty', 43629 non_quantity_based_discount: 'add_sale_not_related_qty', 43630 product_volume: 'volume_size_serial', 43631 product_bundle: 'is_set_product', 43632 product_bundle_no: 'set_product_no', 43633 option_id: 'opt_id', 43634 product_name: 'product_name', 43635 product_image: 'product_image', //tiny ìì목ë¡ì´ë¯¸ì§ 43636 option_value: 'option_str', 43637 shipping_fee_type : 'shipping_fee_type', 43638 categories: 'categories' 43639 }; 43640 43641 var idx = 0; 43642 var iOldBpPrdNo = null; 43643 var iNewBpPrdNo = null; 43644 for (var iKey in aData) { 43645 if (typeof aData[iKey].basket_prd_no === "undefined" || aData[iKey].basket_prd_no === null) { 43646 continue; 43647 } 43648 iNewBpPrdNo = aData[iKey].basket_prd_no; 43649 if (iOldBpPrdNo !== iNewBpPrdNo) { 43650 aCartItemList[idx] = this.setSpecDataMap(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCartItemList, aData[iKey], oMapData); 43651 43652 if (aCartItemList[idx]['product_volume'] !== '' && aCartItemList[idx]['product_volume'] !== null && aCartItemList[idx]['product_volume'] !== undefined) { 43653 var aProductVolume = aCartItemList[idx]['product_volume'].split('|'); 43654 aCartItemList[idx]['product_volume'] = { 43655 'product_width': parseFloat(aProductVolume[0]), 43656 'product_height': parseFloat(aProductVolume[1]), 43657 'product_length': parseFloat(aProductVolume[2]), 43658 }; 43659 } else { 43660 aCartItemList[idx]['product_volume'] = { 43661 'product_width': null, 43662 'product_height': null, 43663 'product_length': null, 43664 }; 43665 } 43666 43667 if (aCartItemList[idx]['product_bundle_no'] == '0') { //ì¸í¸ìíë²í¸ ê¸°ë³¸ê° null ë¡ ë ¸ì¶ëëë¡ 43668 aCartItemList[idx]['product_bundle_no'] = null; 43669 } 43670 43671 if (aCartItemList[idx]['product_image'] == '') { 43672 aCartItemList[idx]['product_image'] = null; 43673 } 43674 43675 if (aCartItemList[idx]['option_value'] !== null && aCartItemList[idx]['option_value'].length < 1) { 43676 aCartItemList[idx]['option_value'] = null; 43677 } 43678 43679 if (aData[iKey].custom_data != null) { 43680 aCartItemList[idx]['additional_option_values'] = []; 43681 aCartItemList[idx]['additional_option_values'].push(aData[iKey].custom_data); 43682 } 43683 idx++; 43684 43685 } else { 43686 aCartItemList[idx - 1]['quantity'] += aData[iKey].product_qty; 43687 43688 if (aData[iKey].custom_data != null) { 43689 aCartItemList[idx - 1]['additional_option_values'].push(aData[iKey].custom_data); 43690 } 43691 } 43692 43693 iOldBpPrdNo = iNewBpPrdNo; 43694 } 43695 43696 return aCartItemList; 43697 }, 43698 43699 getCartCount: function() 43700 { 43701 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCount, CAPP_ASYNC_METHODS.Basketcnt.getData()); 43702 }, 43703 43704 getCouponCount: function() 43705 { 43706 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCount, CAPP_ASYNC_METHODS.Couponcnt.getData()); 43707 }, 43708 43709 getWishCount: function() 43710 { 43711 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oCount, CAPP_ASYNC_METHODS.Wishcount.getData()); 43712 }, 43713 43714 getShopInfo: function() 43715 { 43716 return this.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oShopInfo, {language_code: SHOP.getLanguage(), currency_code: SHOP.getCurrency(), timezone: SHOP.getTimezone()}); 43717 }, 43718 43719 getCartMapData : function () { 43720 var oMapData = { 43721 shop_no: 'shop_no', 43722 category_no: 'main_cate_no', 43723 quantity: 'quantity', 43724 additional_option_value: 'option_add', 43725 variant_code: 'item_code', 43726 product_bundle: 'is_set_product', 43727 prefaid_shipping_fee: 'prd_detail_ship_type', 43728 attached_file_option: 'option_attached_file_info_json', 43729 created_date: 'ins_timestamp', 43730 product_price: 'product_price', 43731 option_price: 'opt_price', 43732 product_bundle_price: 'set_discount_price', 43733 product_no: 'product_no', 43734 option_id: 'opt_id', 43735 product_bundle_no: 'set_product_no', 43736 shipping_type : 'delvtype', 43737 subscription: 'is_subscription', 43738 subscription_shipments_cycle : 'subscription_cycle', 43739 subscription_shipments_cycle_count: 'subscription_cycle_count', 43740 basket_product_no: 'basket_prd_no', 43741 additional_option_values: 'custom_data', 43742 product_name: 'product_name', 43743 checked_products : 'is_prd', 43744 option_text: 'opt_str', 43745 product_bundle_list: 'product_bundle_list' 43746 }; 43747 return oMapData; 43748 }, 43749 43750 getPrecreateOrderMapData : function () { 43751 var oMapData = { 43752 products: 'products', 43753 hmac: 'hmac', 43754 response_time: 'response_time', 43755 order_id: 'order_id', 43756 return_notification_url: 'return_noty_url', 43757 is_nointerest: 'nointerest', 43758 nointerest_quota: 'nointerestQuota' 43759 }; 43760 43761 return oMapData; 43762 }, 43763 43764 addCurrentProductToCart: function(mall_id, request_time, app_key, member_id, hmac, isOrderPurpose = 'F', request_data_json = null) 43765 {
43766 if (isOrderPurpose !== 'T') { 43767 isOrderPurpose = 'F'; 43768 } 43769 43770 return new Promise(function (resolve, reject) { 43771 new Promise(function (res, rej) { 43772 var aInfo = { 43773 mall_id: mall_id, 43774 request_time: request_time, 43775 app_key: app_key, 43776 request_member_id: member_id, 43777 hmac: hmac, 43778 isOrderPurpose: isOrderPurpose, 43779 request_data_json: request_data_json 43780 }; 43781 43782 var proc = (typeof(set_option_data) === 'undefined') ? product_submit : product_set_submit; 43783 if(proc === 'undefined') reject(); 43784 43785 var procResult = proc('app', '/exec/front/order/basket/', null, aInfo, res); 43786 if (procResult && procResult.result === false) reject(procResult); 43787 43788 }).then(function (data) { 43789 var oMapData = CAPP_ASYNC_METHODS.AppCommon.getCartMapData(); 43790 var aCurrentProductToCartResult = []; 43791 for (var index in data) { 43792 aCurrentProductToCartResult[index] = CAPP_ASYNC_METHODS.AppCommon.setSpecDataMap(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oAddedProductToCart, data[index], oMapData); 43793 } 43794 resolve(aCurrentProductToCartResult); 43795 }).catch(function (data) { 43796 reject(data); 43797 }) 43798 }); 43799 }, 43800 43801 precreateOrder: function(mall_id, request_time, app_key, member_id, hmac) 43802 { 43803 var self = this; 43804 return new Promise(function (resolve, reject) { 43805 var aInfo = { 43806 mall_id: mall_id, 43807 request_time: request_time, 43808 app_key: app_key, 43809 member_id: member_id, 43810 hmac: hmac, 43811 shipping_type : (typeof(delvtype) == "undefined") ? sBasketDelvType : delvtype 43812 }; 43813 43814 self.handleBasketOrCart(mall_id, request_time, app_key, member_id, hmac, null, aInfo).then(function () { 43815 EC$.post('/exec/front/order/reserve/', aInfo, function(data) { 43816 43817 if (data['result'] == false) { 43818 reject(data); 43819 } 43820 43821 var oPrecreateOrderMapData = CAPP_ASYNC_METHODS.AppCommon.getPrecreateOrderMapData(); 43822 var oOrderProductMapData = CAPP_ASYNC_METHODS.AppCommon.getCartMapData(); 43823 var aPrecreateOrderResult = []; 43824 43825 var aSpecData = CAPP_ASYNC_METHODS.AppCommon.setSpecDataMap(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oPrecreateOrder, data, oPrecreateOrderMapData); 43826 43827 for (var key in aSpecData) { 43828 aPrecreateOrderResult[key] = aSpecData[key]; 43829 } 43830 43831 var prodList = data['products']; 43832 for (var index in prodList) { 43833 // temp, amazon, paypal ë¤ ê±·ì´ë´ë©´ ìì¨ì½ë 43834 aPrecreateOrderResult[index] = CAPP_ASYNC_METHODS.AppCommon.setSpecDataMap(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oPrecreateOrderProduct, prodList[index], oOrderProductMapData); 43835 aPrecreateOrderResult['products'][index] = CAPP_ASYNC_METHODS.AppCommon.setSpecDataMap(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oPrecreateOrderProduct, prodList[index], oOrderProductMapData); 43836 } 43837 43838 resolve(aPrecreateOrderResult); 43839 }, 'json'); 43840 }).catch(function (data) { 43841 reject(data); 43842 }) 43843 }); 43844 }, 43845 43846 calculatePayment: function(mall_id, request_time, app_key, member_id, request_data_json, hmac) // ê²°ì ìì ê¸ì¡ ê³ì° 43847 { 43848 // request_data_json : mobile, member_id, shipping_type, payment_method, country_code, carrier_id, zipcode, address_full, address_state, points_spent_amount, order_coupons, items 43849 var aRequestData = this.parseRequestDataJson(request_data_json); 43850 43851 var self = this; 43852 return new Promise(function (resolve, reject) { 43853 var aInfo = self.createApiRequestInfo(mall_id, request_time, app_key, member_id, request_data_json, hmac, aRequestData); 43854 43855 self.handleBasketOrCart(mall_id, request_time, app_key, member_id, hmac, request_data_json, aInfo).then(function (addedCartItems) { 43856 EC$.post('/exec/front/order/Calculationcreate/', aInfo, function(data) { 43857 if (data['result'] === false) { 43858 reject(data); 43859 } 43860 43861 data['added_cart_items'] = addedCartItems || []; //ì¥ë°êµ¬ëì ì¶ê°ë í목 ì ë³´ (addCurrentProductToCart result) 43862 resolve(data); 43863 }, 'json'); 43864 }).catch(function (data) { 43865 reject(data); 43866 }) 43867 }); 43868 }, 43869 43870 /** 43871 * ECHOSTING-608244 43872 * ê²°ì ìì½ ìì² ì¤í¨ ìëµì { code, message } ííë¡ ì ê·ííë¤. 43873 * ìëµ ë³¸ë¬¸ì´ JSON ì´ ìëê±°ë ë¹ì´ ìì´ë íì ê°ì²´ë¥¼ ëë ¤ì£¼ì´ ì½ë°± 미í¸ì¶ì ë§ëë¤. 43874 * 43875 * @param {object} oXhr jqXHR 43876 * @returns {{code: number, message: string}} 43877 */ 43878 parseReserveErrorResponse: function (oXhr) 43879 { 43880 var oFallback = { code: 422, message: 'Failed to create a preliminary order.' }; 43881 43882 if (!oXhr) { 43883 return oFallback; 43884 } 43885 43886 if (oXhr.responseJSON && oXhr.responseJSON.message) { 43887 return { code: 422, message: oXhr.responseJSON.message }; 43888 } 43889 43890 return oFallback; 43891 }, 43892 43893 precreateOrderV2: function(mall_id, request_time, app_key, member_id, request_data_json, hmac) // ê²°ì ìì½ V2 43894 { 43895 // request_data_json : mobile, member_id, shipping_type, payment_method, country_code, carrier_id, zipcode, address_full, address_state, points_spent_amount, order_coupons, items 43896 var aRequestData = this.parseRequestDataJson(request_data_json); 43897 43898 var self = this; 43899 return new Promise(function (resolve, reject) { 43900 var aInfo = self.createApiRequestInfo(mall_id, request_time, app_key, member_id, request_data_json, hmac, aRequestData); 43901 43902 self.handleBasketOrCart(mall_id, request_time, app_key, member_id, hmac, request_data_json, aInfo).then(function () { 43903 // ECHOSTING-608244 : ìë²ê° precreateOrderV2 í¸ì¶ìì ìë³í기 ìí ë´ë¶ ë§ì»¤ 43904 aInfo['sdk_version'] = 'v2'; 43905 43906 EC$.post('/exec/front/order/reserve/', aInfo, function(data) { 43907 43908 if (data['result'] == false) { 43909 reject(data); 43910 // ECHOSTING-608244 : reject íìë ìë 매íì´ ê³ì ì¤íëë ê²°í¨ êµì 43911 return; 43912 } 43913 43914 var oPrecreateOrderMapData = CAPP_ASYNC_METHODS.AppCommon.getPre
43914createOrderMapData(); 43915 var oOrderProductMapData = CAPP_ASYNC_METHODS.AppCommon.getCartMapData(); 43916 var aPrecreateOrderResult = []; 43917 43918 var aSpecData = CAPP_ASYNC_METHODS.AppCommon.setSpecDataMap(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oPrecreateOrder, data, oPrecreateOrderMapData); 43919 43920 for (var key in aSpecData) { 43921 aPrecreateOrderResult[key] = aSpecData[key]; 43922 } 43923 43924 var prodList = data['products']; 43925 for (var index in prodList) { 43926 // temp, amazon, paypal ë¤ ê±·ì´ë´ë©´ ìì¨ì½ë 43927 aPrecreateOrderResult[index] = CAPP_ASYNC_METHODS.AppCommon.setSpecDataMap(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oPrecreateOrderProduct, prodList[index], oOrderProductMapData); 43928 aPrecreateOrderResult['products'][index] = CAPP_ASYNC_METHODS.AppCommon.setSpecDataMap(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oPrecreateOrderProduct, prodList[index], oOrderProductMapData); 43929 } 43930 43931 resolve(aPrecreateOrderResult); 43932 }, 'json').fail(function (oXhr) { 43933 // ECHOSTING-608244 : ë¤í¸ìí¬ ì¤ë¥Â·íììì·JSON íì± ì¤í¨ìë ë°ëì ì½ë°±ì´ ë¶ë¦¬ëë¡ íë¤. 43934 reject(CAPP_ASYNC_METHODS.AppCommon.parseReserveErrorResponse(oXhr)); 43935 }); 43936 }).catch(function (data) { 43937 reject(data); 43938 }) 43939 }); 43940 }, 43941 43942 getOrderItemList: function(start_date, end_date, order_status, page, count, order_id) 43943 { 43944 count = count === null ? iOrderHistoryLimit : count; 43945 return new Promise(function (resolve, reject) { 43946 if (start_date || end_date || order_status || order_id || page || count != iOrderHistoryLimit ) { //기본조íê°ê³¼ ì¡°ê±´ì´ ë¤ë¥¸ê²½ì° ìë¡ê² ê°±ì 43947 CAPP_ASYNC_METHODS.OrderHistoryItemList.getAsyncData(start_date, end_date, order_status, page, count, order_id) 43948 .then(function(oData) { 43949 resolve(oData); 43950 }).catch(function(data) { 43951 reject(data); 43952 }); 43953 } else { 43954 var oData = CAPP_ASYNC_METHODS.OrderHistoryItemList.getData(); 43955 43956 // 주문조ííì´ì§ììë§ ë¡ë©ì íì´ì§ 리ë¡ëí ë°ìë¨ 43957 // async.js í¸ì¶ê³¼ sdkí¸ì¶ì´ ìì°¨ì ì´ì§ ììì ì¸ì ì¤í 리ì§ì ë°ì´í°ë¥¼ 못ê°ì ¸ì¤ë ê²½ì°ê° ë°ìíì¬ ë°ì´í°ê° ìëê²½ì° asyncíë²ë í¸ì¶ íëë¡ ìì 43958 if (oData) { 43959 var oOrderItemList = EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oOrderItemList; 43960 var aOrderHistoryItemList = []; 43961 43962 for (var iKey in oData) { 43963 aOrderHistoryItemList.push(CAPP_ASYNC_METHODS.AppCommon.setSpecData(oOrderItemList, oData[iKey])); 43964 } 43965 resolve(aOrderHistoryItemList); 43966 } else { 43967 CAPP_ASYNC_METHODS.OrderHistoryItemList.getAsyncData(start_date, end_date, order_status, page, count, order_id) 43968 .then(function(oData) { 43969 resolve(oData); 43970 }).catch(function(data) { 43971 reject(data); 43972 }); 43973 } 43974 } 43975 }); 43976 }, 43977 43978 getOrderDetailInfo: function (shop_no, order_id) { 43979 return new Promise(function (resolve, reject) { 43980 var oData = CAPP_ASYNC_METHODS.OrderDetailInfo.getData(); 43981 if (oData[0] != null) { 43982 for (var iKey in oData){ 43983 if (oData[iKey].order_id == order_id){ 43984 var oOrderDetailInfo = EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oOrderDetailInfo; 43985 var aOrderDetailInfo = []; 43986 43987 for (var iKey in oData) { 43988 aOrderDetailInfo.push(CAPP_ASYNC_METHODS.AppCommon.setSpecData(oOrderDetailInfo, oData[iKey])); 43989 } 43990 resolve(aOrderDetailInfo); 43991 } else { 43992 CAPP_ASYNC_METHODS.OrderDetailInfo.getAsyncData(shop_no, order_id) 43993 .then(function (oData) { 43994 resolve(oData); 43995 }).catch(function () { 43996 reject(oData); 43997 }); 43998 } 43999 } 44000 } else { 44001 CAPP_ASYNC_METHODS.OrderDetailInfo.getAsyncData(shop_no, order_id) 44002 .then(function (oData) { 44003 resolve(oData); 44004 }).catch(function () { 44005 reject(oData); 44006 }); 44007 } 44008 }); 44009 }, 44010 44011 getClaimableItemList: function (order_id, customer_service_type) { 44012 return new Promise(function (resolve, reject) { 44013 var orderPattern = /^[0-9]{8}-[0-9]{7}$/; 44014 44015 if (order_id !== null && orderPattern.test(order_id) === false) { 44016 reject({code: 422, message: 'order_id is not val
44016id'}); 44017 } 44018 if (customer_service_type !== null && $.inArray(customer_service_type, ['C','E','R']) === -1) { 44019 reject({code: 422, message: 'customer_service_type is not valid'}); 44020 } 44021 var oData = CAPP_ASYNC_METHODS.ClaimableItemList.getData(); 44022 if (oData) { 44023 if (oData[0].order_id === order_id) { 44024 var oClaimableItemList = EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oClaimableItemList; 44025 var aClaimableItemList = []; 44026 44027 for (var iKey in oData) { 44028 aClaimableItemList.push(CAPP_ASYNC_METHODS.AppCommon.setSpecData(oClaimableItemList, oData[iKey])); 44029 } 44030 resolve(aClaimableItemList); 44031 } else { 44032 CAPP_ASYNC_METHODS.ClaimableItemList.getAsyncData(order_id, customer_service_type) 44033 .then(function (oData) { 44034 resolve(oData); 44035 }).catch(function (oData) { 44036 reject(oData); 44037 }); 44038 } 44039 } else { 44040 CAPP_ASYNC_METHODS.ClaimableItemList.getAsyncData(order_id, customer_service_type) 44041 .then(function (oData) { 44042 resolve(oData); 44043 }).catch(function (oData) { 44044 reject(oData); 44045 }); 44046 } 44047 }); 44048 }, 44049 44050 emptyCart: function (basket_shipping_type) { 44051 return new Promise(function (resolve, reject) { 44052 if (basket_shipping_type !== null && EC$.inArray(basket_shipping_type, ['A', 'B']) === -1) { 44053 reject({code: 422, message: '"basket_shipping_type" must be provided as one of "A, B".'}); 44054 return; 44055 } 44056 44057 CAPP_ASYNC_METHODS.BasketProduct.deleteAllAsyncData(basket_shipping_type).then(function (oData) { 44058 if (oData.result < 0) { 44059 reject({code: 500, message: 'Empty shopping cart failed.'}); 44060 } else { 44061 resolve('success'); 44062 } 44063 }).catch(function () { 44064 reject({code: 500, message: 'Empty shopping cart failed.'}); 44065 }); 44066 }); 44067 }, 44068 44069 deleteCartItems: function (basket_shipping_type, product_list) { 44070 return new Promise(function (resolve, reject) { 44071 // 1) basket_shipping_type ì í¨ì± 44072 if (EC$.inArray(basket_shipping_type, ['A', 'B']) === -1) { 44073 reject({code: 422, message: '"basket_shipping_type" must be provided as one of "A, B".'}); 44074 return; 44075 } 44076 44077 // 2) product_list ì í¨ì± 44078 if (!EC$.isArray(product_list) || product_list.length < 1) { 44079 reject({code: 422, message: '"product_list" is not valid.'}); 44080 return; 44081 } 44082 for (var idx in product_list) { 44083 if (product_list[idx] === null || product_list[idx] === undefined) { 44084 reject({code: 422, message: '"product_list" is not valid.'}); 44085 return; 44086 } 44087 } 44088 44089 CAPP_ASYNC_METHODS.BasketProduct.deleteCartItems(basket_shipping_type, product_list).then(function (oData) { 44090 if (oData.result < 0) { 44091 reject({code: 500, message: 'Delete Cart Items failed.'}); 44092 } else { 44093 resolve(oData); 44094 } 44095 }).catch(function () { 44096 reject({code: 500, message: 'Delete Cart Items failed.'}); 44097 }); 44098 }); 44099 }, 44100 44101 addCart: function (basket_type, prepaid_shipping_fee, product_list) { 44102 return new Promise(function (resolve, reject) {
44103 ////////////////////// ì ë ¥ê° valid ì²´í¬ ////////////////////// 44104 if (product_list.length > 10) { 44105 reject({code: 422, message: 'The maximum number of "product_list" has been exceeded. (Maximum number of requests: 10)'}); 44106 return; 44107 } 44108 // 1) basket_type valid ì²´í¬ 44109 if (basket_type !== null && EC$.inArray(basket_type, ['A0000', 'A0001']) === -1) { 44110 reject({code: 422, message: '"basket_type" must be provided as one of "A0000 : General, A0001 : Interest-free".'}); 44111 return; 44112 } 44113 44114 // 2) prepaid_shipping_fee ì²´í¬ 44115 if (prepaid_shipping_fee !== null && EC$.inArray(prepaid_shipping_fee, ['P','C']) === -1) { 44116 reject({code: 422, message: '"prepaid_shipping_fee" should be provided as one of "P : Prepaid, C : Collected".'}); 44117 return; 44118 } 44119 44120 var errorProductMapping = {}; // ì¤í¨ë°ì´í° ì¸í 44121 var aProductListRequest = []; // ì¤ì ì¥ë°êµ¬ë exec ì ìì²í ìííë¼ë¯¸í° 44122 44123 // 3) product_list ì í¨ì± ì²´í¬ 44124 for (var i in product_list) { 44125 var sInvalidField = ''; // ì í¨íì§ ìì íë 44126 44127 if (isNaN(product_list[i]['product_no']) || product_list[i]['product_no'] < 1) { 44128 sInvalidField = 'product_no'; 44129 } else if (isNaN(product_list[i]['quantity']) || product_list[i]['quantity'] < 1) { 44130 sInvalidField = 'quantity'; 44131 } else if (/^P.{11}$/.test(product_list[i]['variants_code']) === false) { 44132 sInvalidField = 'variants_code'; 44133 } else if (Array.isArray(product_list[i]['additional_option_values'])) { 44134 for (var j in product_list[i]['additional_option_values']) { 44135 if (product_list[i]['additional_option_values'][j]['key'] != 'item_option_add') { 44136 sInvalidField = 'additional_option_values.key'; 44137 break; 44138 } 44139 44140 if (product_list[i]['additional_option_values'][j]['type'] != 'text') { 44141 sInvalidField = 'additional_option_values.type'; 44142 break; 44143 } 44144 } 44145 } 44146 44147 // ì í¨íì§ ìì íëê° ìë ê²½ì° 44148 if (sInvalidField !== '') { 44149 if (errorProductMapping[sprintf('%s is not valid', sInvalidField)] === undefined) { 44150 errorProductMapping[sprintf('%s is not valid', sInvalidField)] = []; 44151 } 44152 44153 errorProductMapping[sprintf('%s is not valid', sInvalidField)].push( 44154 CAPP_ASYNC_METHODS.AppCommon.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oBatchBasketAddItem, product_list[i]) 44155 ); 44156 } else { 44157 aProductListRequest.push(product_list[i]); // íë¼ë¯¸í° ì í¨ì±ì íµê³¼í ìì²ë°ì´í°ë§ ì¥ë°êµ¬ë exec ì§í 44158 } 44159 }
44160 ////////////////////// ì ë ¥ê° valid ì²´í¬ ////////////////////// 44161 44162 // ì¥ë°êµ¬ë ë´ê¸° exec ìì²ë°ì´í° 44163 var addCartParam = CAPP_ASYNC_METHODS.AppCommon.getAddCartParam(basket_type, prepaid_shipping_fee, aProductListRequest); 44164 44165 if (addCartParam.batch_add_item.length === 0) { // íë¼ë¯¸í° valid ì²´í¬ ì´í, ì¥ë°êµ¬ë insert í ë°ì´í°ê° ìë ê²½ì° 44166 var aResponse = {}; // sdk ìëµê° 44167 44168 // ì¤í¨ ë°ì´í° (message, more_info) ì¸í 44169 for (let error_message of Object.keys(errorProductMapping)) { 44170 if (aResponse['errors'] === undefined) { 44171 aResponse['errors'] = []; 44172 } 44173 aResponse['errors'].push({code: 422, message: error_message, more_info: errorProductMapping[error_message]}); 44174 } 44175 44176 resolve(aResponse); 44177 } 44178 44179 CAPP_ASYNC_METHODS.BasketProduct.setAsyncData(addCartParam).then(function (oData) { 44180 var aResponse = {}; // sdk ìëµê° 44181 44182 if (oData.result.code === 0) { // ì¥ë°êµ¬ë ë´ê¸° ì±ê³µ 44183 if (oData.aBatchAddResult.success !== undefined) { 44184 aResponse['cart'] = []; 44185 oData.aBatchAddResult.success.forEach(function (successData) { 44186 aResponse['cart'].push( 44187 CAPP_ASYNC_METHODS.AppCommon.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oBatchBasketAddItem, successData) 44188 ); 44189 }); 44190 } 44191 44192 if (oData.aBatchAddResult.fail !== undefined) { 44193 // ì¥ë°êµ¬ë exec ì´í ì¤í¨í ë°ì´í°ë ìëìì failMapping ì ë±ë¡ 44194 oData.aBatchAddResult.fail.forEach(function (failData) { 44195 var errMsg = failData.errMsg ? failData.errMsg : 'Failed to add the product to the cart'; 44196 if (errorProductMapping[errMsg] === undefined) { 44197 errorProductMapping[errMsg] = []; 44198 } 44199 44200 errorProductMapping[errMsg].push( 44201 CAPP_ASYNC_METHODS.AppCommon.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oBatchBasketAddItem, failData) 44202 ); 44203 }); 44204 } 44205 44206 // ì¤í¨ ë°ì´í° (message, more_info) ì¸í 44207 for (let error_message of Object.keys(errorProductMapping)) { 44208 if (aResponse['errors'] === undefined) { 44209 aResponse['errors'] = []; 44210 } 44211 aResponse['errors'].push({code: 422, message: error_message, more_info: errorProductMapping[error_message]}); 44212 } 44213 44214 resolve(aResponse); 44215 } else { // ì¥ë°êµ¬ë ë´ê¸° ì ì²´ ì¤í¨ 44216 const errorMessage = oData.result === -998 44217 ? 'You can add up to 400 items to the cart.' 44218 : 'Failed to add the product to the cart'; 44219 44220 reject({code: 422, message: errorMessage}); 44221 } 44222 }).catch(function () { 44223 reject({code: 422, message: 'Failed to add the product to the cart'}); 44224 }); 44225 }); 44226 }, 44227 addBundleProductsCart: function (basket_type, prepaid_shipping_fee, product_list) { 44228 return new Promise(function (resolve, reject) {
44229 ////////////////////// ì ë ¥ê° valid ì²´í¬ ////////////////////// 44230 if (product_list.length > 10) { 44231 reject({code: 422, message: 'The maximum number of "product_list" has been exceeded. (Maximum number of requests: 10)'}); 44232 return; 44233 } 44234 // 1) basket_type valid ì²´í¬ 44235 if (basket_type !== null && EC$.inArray(basket_type, ['A0000', 'A0001']) === -1) { 44236 reject({code: 422, message: '"basket_type" must be provided as one of "A0000 : General, A0001 : Interest-free".'}); 44237 return; 44238 } 44239 44240 // 2) prepaid_shipping_fee ì²´í¬ 44241 if (prepaid_shipping_fee !== null && EC$.inArray(prepaid_shipping_fee, ['P','C']) === -1) { 44242 reject({code: 422, message: '"prepaid_shipping_fee" should be provided as one of "P : Prepaid, C : Collected".'}); 44243 return; 44244 } 44245 44246 var errorProductMapping = {}; // ì¤í¨ë°ì´í° ì¸í 44247 var aProductListRequest = []; // ì¤ì ì¥ë°êµ¬ë exec ì ìì²í ìííë¼ë¯¸í° 44248 44249 // 3) aProductList ì í¨ì± ì²´í¬ 44250 for (var i = 0; i < product_list.length; i++) { 44251 var sInvalidField = ''; // ì í¨íì§ ìì íë 44252 44253 if (isNaN(product_list[i]['product_no']) || product_list[i]['product_no'] < 1) { 44254 sInvalidField = 'product_no'; 44255 } else if (isNaN(product_list[i]['quantity']) || product_list[i]['quantity'] < 1) { 44256 sInvalidField = 'quantity'; 44257 } else if (typeof product_list[i]['bundle_product_components'] == 'undefined') { 44258 sInvalidField = 'bundle_product_components'; 44259 } 44260 44261 if (Array.isArray(product_list[i]['bundle_product_components'])) { 44262 if (product_list[i]['bundle_product_components'].length < 1) { 44263 sInvalidField = 'bundle_product_components'; 44264 } 44265 44266 for (var j = 0; j < product_list[i]['bundle_product_components'].length; j++) { 44267 if (Array.isArray(product_list[i]['bundle_product_components'][j]['additional_option_values'])) { 44268 for (var k = 0; k < product_list[i]['bundle_product_components'][j]['additional_option_values'].length; k++) { 44269 if (product_list[i]['bundle_product_components'][j]['additional_option_values'][k]['key'] != 'item_option_add') { 44270 sInvalidField = 'bundle_product_components.additional_option_values.key'; 44271 break; 44272 } 44273 44274 if (product_list[i]['bundle_product_components'][j]['additional_option_values'][k]['type'] != 'text') { 44275 sInvalidField = 'bundle_product_components.additional_option_values.type'; 44276 break; 44277 } 44278 } 44279 } 44280 } 44281 } 44282 44283 // ì í¨íì§ ìì íëê° ìë ê²½ì° 44284 if (sInvalidField !== '') { 44285 if (errorProductMapping[sprintf('%s is not valid', sInvalidField)] === undefined) { 44286 errorProductMapping[sprintf('%s is not valid', sInvalidField)] = []; 44287 } 44288 44289 errorProductMapping[sprintf('%s is not valid', sInvalidField)].push( 44290 CAPP_ASYNC_METHODS.AppCommon.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oBatchBasketAddSetItem, product_list[i]) 44291 ); 44292 } else { 44293 aProductListRequest.push(product_list[i]); // íë¼ë¯¸í° ì í¨ì±ì íµê³¼í ìì²ë°ì´í°ë§ ì¥ë°êµ¬ë exec ì§í 44294 } 44295 }
44296 ////////////////////// ì ë ¥ê° valid ì²´í¬ ////////////////////// 44297 44298 // ì¥ë°êµ¬ë ë´ê¸° exec ìì²ë°ì´í° 44299 var addCartParam = CAPP_ASYNC_METHODS.AppCommon.getAddSetProductCartParam(basket_type, prepaid_shipping_fee, aProductListRequest); 44300 44301 if (addCartParam.batch_add_item.length === 0) { // íë¼ë¯¸í° valid ì²´í¬ ì´í, ì¥ë°êµ¬ë insert í ë°ì´í°ê° ìë ê²½ì° 44302 var aResponse = {}; // sdk ìëµê° 44303 44304 // ì¤í¨ ë°ì´í° (message, more_info) ì¸í 44305 for (let error_message of Object.keys(errorProductMapping)) { 44306 if (aResponse['errors'] === undefined) { 44307 aResponse['errors'] = []; 44308 } 44309 aResponse['errors'].push({code: 422, message: error_message, more_info: errorProductMapping[error_message]}); 44310 } 44311 44312 resolve(aResponse); 44313 } 44314 44315 CAPP_ASYNC_METHODS.BasketProduct.setAsyncData(addCartParam).then(function (oData) { 44316 var aResponse = {}; // sdk ìëµê° 44317 44318 if (oData.result.code === 0) { // ì¥ë°êµ¬ë ë´ê¸° ì±ê³µ 44319 if (oData.aBatchAddResult.success !== undefined) { 44320 aResponse['cart'] = []; 44321 oData.aBatchAddResult.success.forEach(function (successData) { 44322 aResponse['cart'].push( 44323 CAPP_ASYNC_METHODS.AppCommon.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oBatchBasketAddSetItem, successData) 44324 ); 44325 }); 44326 } 44327 44328 if (oData.aBatchAddResult.fail !== undefined) { 44329 // ì¥ë°êµ¬ë exec ì´í ì¤í¨í ë°ì´í°ë ìëìì failMapping ì ë±ë¡ 44330 oData.aBatchAddResult.fail.forEach(function (failData) { 44331 var errMsg = failData.errMsg ? failData.errMsg : 'Failed to add the product to the cart'; 44332 if (errorProductMapping[errMsg] === undefined) { 44333 errorProductMapping[errMsg] = []; 44334 } 44335 44336 errorProductMapping[errMsg].push( 44337 CAPP_ASYNC_METHODS.AppCommon.setSpecData(EC_EXTERNAL_UTIL_APP_SPECINTERFACE.oBatchBasketAddSetItem, failData) 44338 ); 44339 }); 44340 } 44341 44342 // ì¤í¨ ë°ì´í° (message, more_info) ì¸í 44343 for (let error_message of Object.keys(errorProductMapping)) { 44344 if (aResponse['errors'] === undefined) { 44345 aResponse['errors'] = []; 44346 } 44347 aResponse['errors'].push({code: 422, message: error_message, more_info: errorProductMapping[error_message]}); 44348 } 44349 44350 resolve(aResponse); 44351 } else { // ì¥ë°êµ¬ë ë´ê¸° ì ì²´ ì¤í¨ 44352 const errorMessage = oData.result === -998 44353 ? 'You can add up to 400 items to the cart.' 44354 : 'Failed to add the product to the cart'; 44355 44356 reject({code: 422, message: errorMessage}); 44357 } 44358 }).catch(function () { 44359 reject({code: 422, message: 'Failed to add the product to the cart'}); 44360 }); 44361 }); 44362 }, 44363 getAddCartParam: function (basket_type, prepaid_shipping_fee, aProductList) { 44364 var aPostData = { 44365 'command': 'add', 44366 'basket_type': basket_type, 44367 'prd_detail_ship_type': prepaid_shipping_fee, 44368 'is_set_product': 'F', 44369 'batch_add_item': [] // ë¤ìí목 ëë insert íë 44370 }; 44371 44372 for (var idx in aProductList) { 44373 aPostData['batch_add_item'].push({ 44374 'product_no': aProductList[idx]['product_no'], 44375 'variants_code': aProductList[idx]['variants_code'], 44376 'quantity': aProductList[idx]['quantity'], 44377 'options': aProductList[idx]['options'], // ìíì°ëí ìµì ì ë³´ 44378 'additional_option_values': aProductList[idx]['additional_option_values'] // ì¬ì©ì ì§ì ìµì 44379 }); 44380 } 44381 44382 return aPostData; 44383 },
44384 getAddSetProductCartParam: function (basket_type, prepaid_shipping_fee, aProductList) { 44385 var aPostData = { 44386 'command': 'add', 44387 'basket_type': basket_type, 44388 'prd_detail_ship_type': prepaid_shipping_fee, 44389 'is_set_product': 'T', 44390 'batch_add_item': [] // ë¤ìí목 ëë insert íë 44391 }; 44392 44393 for (var idx in aProductList) { 44394 aPostData['batch_add_item'].push({ 44395 'product_no': aProductList[idx]['product_no'], 44396 'quantity': aProductList[idx]['quantity'], 44397 'bundle_product_components': aProductList[idx]['bundle_product_components'] // ì¸í¸ êµ¬ì± ìí 44398 }); 44399 } 44400 44401 return aPostData; 44402 }, 44403 44404 /** 44405 * 주문 ë°ì¤ì¼ íì´ì§ ì¬ë¶ íì¸ (ê³µíµ í¨ì) 44406 * @returns {boolean} ORDER_BASKET íì´ì§ ì¬ë¶ 44407 */ 44408 isOrderBasketPage: function() { 44409 const metaTag = document.querySelector('meta[name="path_role"]'); 44410 return metaTag && metaTag.content === 'ORDER_BASKET'; 44411 }, 44412 44413 /** 44414 * JSON íì± ì²ë¦¬ (ê³µíµ í¨ì) 44415 * @param {string} request_data_json JSON 문ìì´ 44416 * @returns {Array} íì±ë ë°°ì´ ëë ë¹ ë°°ì´ 44417 */ 44418 parseRequestDataJson: function(request_data_json) { 44419 var aRequestData = []; 44420 if (request_data_json) { // ê°ì´ ìê³ 44421 try { 44422 aRequestData = JSON.parse(request_data_json); // íì± ìë 44423 } catch (e) { 44424 console.error("JSON íì± ì¤í¨:", e); 44425 aRequestData = []; // ì¤í¨ ì ê¸°ë³¸ê° 44426 } 44427 } else { 44428 aRequestData = []; // ê°ì´ ìì ê²½ì° ê¸°ë³¸ê° 44429 } 44430 return aRequestData; 44431 }, 44432 44433 /** 44434 * shipping_type ì¤ì (ê³µíµ í¨ì) 44435 * @param {Object} aRequestData íì±ë ìì² ë°ì´í° 44436 * @returns {string} shipping_type 44437 */ 44438 getShippingType: function(aRequestData) { 44439 let shipping_type; 44440 if (aRequestData.shipping_type) { 44441 shipping_type = aRequestData.shipping_type; 44442 } else if (typeof delvtype === "undefined") { 44443 shipping_type = sBasketDelvType; 44444 } else { 44445 shipping_type = delvtype; 44446 } 44447 return shipping_type; 44448 }, 44449 44450 /** 44451 * API ìì² ì ë³´ ê°ì²´ ìì± (ê³µíµ í¨ì) 44452 * @param {string} mall_id ì¼í몰 ID 44453 * @param {string} request_time ìì² ìê° 44454 * @param {string} app_key ì± í¤ 44455 * @param {string} member_id íì ID 44456 * @param {string} request_data_json JSON 문ìì´ 44457 * @param {string} hmac HMAC 44458 * @param {Object} aRequestData íì±ë ìì² ë°ì´í° 44459 * @returns {Object} API ìì² ì ë³´ ê°ì²´ 44460 */ 44461 createApiRequestInfo: function(mall_id, request_time, app_key, member_id, request_data_json, hmac, aRequestData) { 44462 var shipping_type = this.getShippingType(aRequestData); 44463 44464 return { 44465 mall_id: mall_id, 44466 request_time: request_time, 44467 app_key: app_key, 44468 mobile: aRequestData.mobile, 44469 member_id: member_id, 44470 shipping_type: shipping_type, 44471 payment_method: aRequestData.payment_method, 44472 country_code: aRequestData.country_code, 44473 carrier_id: aRequestData.carrier_id, 44474 zipcode: aRequestData.zipcode, 44475 address_full: aRequestData.address_full, 44476 address_state: aRequestData.address_state, 44477 points_spent_amount: aRequestData.points_spent_amount, 44478 order_coupons: aRequestData.order_coupons, 44479 items: aRequestData.items, 44480 gifts: aRequestData.gifts, // ì í ì¬ìí (ECHOSTING-630597) 44481 basket_type: "A0000", 44482 request_data_json: request_data_json, 44483 hmac: hmac, 44484 from: "precreateOrder" 44485 }; 44486 }, 44487 44488 /** 44489 * ë°ì¤ì¼ ì²ë¦¬ ëë ì¥ë°êµ¬ë ì¶ê° (ê³µíµ í¨ì) 44490 * @param {string} mall_id ì¼í몰 ID 44491 * @param {string} request_time ìì² ìê° 44492 * @param {string} app_key ì± í¤ 44493 * @param {string} member_id íì ID 44494 * @param {string} hmac HMAC 44495 * @param {string} request_data_json JSON 문ìì´ 44496 * @param {Object} aInfo API ìì² ì ë³´ ê°ì²´ 44497 * @param {boolean} bIsOrderBasket 주문 ë°ì¤ì¼ íì´ì§ ì¬ë¶ 44498 * @returns {Promise} Promise ê°ì²´ 44499 */ 44500 handleBasketOrCart: function(mall_id, request_time, app_key, member_id, hmac, request_data_json, aInfo) { 44501 let bIsOrderBasket = this.isOrderBasketPage(); 44502 44503 return new Promise(function (res, rej) { 44504 if (Basket.orderSelectBasket != undefined && bIsOrderBasket) { 44505 var result = Basket.orderSelectBasket(this, aInfo['shipping_type'], 'app', res); 44506 if(result == false) rej(); 44507 } else { 44508 if (request_data_json) { 44509 // request_data_jsonì´ ìë ê²½ì° (calculatePayment, precreateOrderV2) 44510 CAPP_ASYNC_METHODS.AppCommon.addCurrentProductToCart(mall_id, request_time, app_key, member_id, hmac, 'T', request_data_json).then(function(addedCartItems){ 44511 res(addedCartItems); 44512 }).catch(function (result) { 44513 rej(result); 44514 }); 44515 } else { 44516 // request_data_jsonì´ ìë ê²½ì° (precreateOrder) 44517 CAPP_ASYNC_METHODS.AppCommon.addCurrentProductToCart(mall_id, request_time, app_key, member_id, hmac, 'T').then(function(addedCartItems){ 44518 res(addedCartItems); 44519 }).catch(function (result) { 44520 rej(result); 44521 }); 44522 } 44523 } 44524 }); 44525 } 44526}; 44527 44528/** 44529 * ëë©ì¸ ê°ì ì¼ë¡ ì¸í ì´ë¯¸ì§ ë¡ë ì´ì ì¼ì´ì¤ë¥¼ ìì 44530 * @type {{bInit: boolean, init: EC_ROUTE_FIX.init}} 44531 */ 44532EC$(function () { 44533 var EC_ROUTE_FIX = { 44534 bInit: false, 44535 init: function () { 44536 if (this.bInit || typeof EC_ROUTE === 'undefined') { 44537 return ; 44538 } 44539 this.bInit = true; 44540 44541 this.setEvent(); 44542 this.setFix(); 44543 }, 44544 setEvent: function () { 44545 this.setErrorSrcEvent(); 44546 this.setErrorHrefEvent(); 44547 }, 44548 setFix: function () 44549 { 44550 // ì¤í¨ 미리보기ìì ì¿ í¤ê° ì¤ì ëì§ ìëë¡ ì¤ì í ì¬ë°í ê²½ì° ì²ë¦¬ëëë¡ íë¤. 44551 // this.setFixDomainCookie(); 44552 }, 44553 /** 44554 * EP ìºì ëìì© ECHOSTING-475508 44555 * ìë²ì¬ì´ë ê¹ì§ ì ë¬ëì§ ëª»í´ url ì í¬í¨ë ëë©ì¸ ì ë³´ê° ì¿ í¤ì ì ì¥ëì§ ëª»í ê²½ì° 44556 * ì¤ì ì ì ë url ê³¼ ì¿ í¤ì ì ì¥ë ëë©ì¸ ì ë³´ê° ë¤ë¥¼ ì ìë¤. 44557 * ë°ë¼ì ì¿ í¤ê° ì¡´ì¬íë¤ë©´ ì¿ í¤ì ì ì¥ë ì 보를 url ì ë°ë¼ ìºì±ë ep ì assign ë javascript ë³ì를 ì¬ì©íì¬ 44558 * ì¬ ê°±ì ìì¼ ì¤ë¤. 44559 */ 44560 setFixDomainCookie: function () 44561 { 44562 if (EC$.cookie(EC_ROUTE.EC_DOMAIN_PATH_INFO) === null) { 44563 return; 44564 } 44565 if (typeof EC_ROUTE.isNeedRoute() !== 'undefined' && EC_ROUTE.isNeedRoute() === false) { 44566 EC$.cookie(EC_ROUTE.EC_DOMAIN_PATH_INFO, null, {path: '/', domain: '.' + window.location.host}); 44567 return; 44568 } 44569 44570 var oOverwriteCookie = {}, bWrite = false;
44571 if (typeof EC_ROUTE.getShopNo() !== 'undefined' 44572 && EC_ROUTE.getShopNo() > 0) { 44573 oOverwriteCookie['shop_no'] = EC_ROUTE.getShopNo(); 44574 bWrite = true; 44575 } 44576 if (typeof EC_ROUTE.getMobile() !== 'undefined' 44577 && EC_ROUTE.getMobile() === true) { 44578 oOverwriteCookie['is_mobile'] = EC_ROUTE.getMobile(); 44579 bWrite = true; 44580 } 44581 if (typeof EC_ROUTE.getLanguageCode() !== 'undefined' 44582 && EC_ROUTE.getLanguageCode() !== 'ZZ') { 44583 oOverwriteCookie['language_code'] = EC_ROUTE.getLanguageCode(); 44584 bWrite = true; 44585 } 44586 if (typeof EC_ROUTE.getSkinCode() !== 'undefined' 44587 && EC_ROUTE.getSkinCode() !== 'default') { 44588 oOverwriteCookie['skin_code'] = EC_ROUTE.getSkinCode(); 44589 bWrite = true; 44590 } 44591 44592 if (bWrite) { 44593 EC$.cookie(EC_ROUTE.EC_DOMAIN_PATH_INFO, JSON.stringify(oOverwriteCookie), {path: '/', domain: '.' + window.location.host}); 44594 } else { 44595 EC$.cookie(EC_ROUTE.EC_DOMAIN_PATH_INFO, null, {path: '/', domain: '.' + window.location.host}); 44596 } 44597 }, 44598 setErrorSrcEvent: function () 44599 { 44600 EC$("img, input[type='image'], script").on("error", function(e){ 44601 this.onerror = null; 44602 if (EC$(this).attr('src') != EC_ROUTE.getPrefixUrl(EC$(this).attr('src'))) { 44603 this.src = EC_ROUTE.getPrefixUrl(EC$(this).attr('src')); 44604 } 44605 }); 44606 }, 44607 setErrorHrefEvent: function () 44608 { 44609 EC$("link").on("error", function(e){ 44610 this.onerror = null; 44611 if (EC$(this).attr('href') != EC_ROUTE.getPrefixUrl(EC$(this).attr('href'))) { 44612 this.href = EC_ROUTE.getPrefixUrl(EC$(this).attr('href')); 44613 } 44614 }); 44615 } 44616 }; 44617 44618 EC_ROUTE_FIX.init(); 44619}); 44620
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.