{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/modal.js","webpack:///./node_modules/tingle.js/dist/tingle.min.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/util/form.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/util/common.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/product/sizePanel.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/helpers/helper.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/product/base.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/product/wishlistHeart.js","webpack:///./assets/scripts/woosmap.js","webpack:///./node_modules/fabric/dist/fabric.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/account/customer.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/productTileComponent/productTile.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/productSlider.js","webpack:///(webpack)/buildin/global.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/account/registrationHelper.js","webpack:///./assets/scripts/util/plugins.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/productTileComponent/productTileCarousel.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/product/quickView.js","webpack:///./assets/scripts/components/modal.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/product/notify.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/product/productBox.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/customCarousel.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/customize.js","webpack:///(webpack)/node_modules/buffer/index.js","webpack:///./node_modules/base64-js/index.js","webpack:///./node_modules/ieee754/index.js","webpack:///./node_modules/isarray/index.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/personalization/generateSvgForOTP.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/personalization/selectors.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/personalization/classes.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/product/detail.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/product/smartGiftHelper.js","webpack:///./assets/scripts/util/url.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/analytics.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/cart/bonusProductModal.js","webpack:///./node_modules/lodash/isObject.js","webpack:///./node_modules/lodash/_root.js","webpack:///./node_modules/lodash/_Symbol.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/accordion.js","webpack:///./node_modules/lodash/debounce.js","webpack:///./node_modules/lodash/now.js","webpack:///./node_modules/lodash/_freeGlobal.js","webpack:///./node_modules/lodash/toNumber.js","webpack:///./node_modules/lodash/_baseTrim.js","webpack:///./node_modules/lodash/_trimmedEndIndex.js","webpack:///./node_modules/lodash/isSymbol.js","webpack:///./node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/lodash/_getRawTag.js","webpack:///./node_modules/lodash/_objectToString.js","webpack:///./node_modules/lodash/isObjectLike.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/profileEnrich.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/main.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/accordionPdp.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/search.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/footer.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/homepage/newsletterPopup.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/privacyPolicyPopup.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/externalscripts.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/homepage/multilanguage.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/webFormRequest.js","webpack:///./assets/scripts/components/webFormRequest.js","webpack:///./assets/scripts/components/accordion.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/mainMenu.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/header.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/scroller.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/miniCart.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/product/quickUpdate.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analyticsHelper.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/index.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/helpers/quickImpressions/index.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/helpers/quickImpressions/global.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/helpers/quickImpressions/account.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/helpers/quickImpressions/cart.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/helpers/quickImpressions/newsletter.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/helpers/quickImpressions/wishlist.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/helpers/quickImpressions/promotionAndInfo.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/helpers/quickImpressions/findYourStore.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/helpers/quickImpressions/product.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/helpers/quickImpressions/scalaPay.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/helpers/quickImpressions/afterpay.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/helpers/quickImpressions/refund.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/cartInteraction.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/checkoutFunnel.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/minicart.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/account.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/promoAndInfo.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/findYourStore.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/listing.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/analytics/refund.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/geoblock.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/homepage.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/primaryImagesScroller.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/privacyPolicyPopUp.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/promoStrip.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/prehome.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/messageHeroBanner.js","webpack:///./cartridges/app_intimissimi/cartridge/client/default/js/components/carouselComponents.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","footer","cssClass","modalOptions","closeMethods","onClose","modal","destroy","onOpen","$","addClass","beforeClose","length","removeClass","tingle","selectorID","contentModal","document","getElementById","setContent","innerHTML","html","ModalShowHide","selector","newModalType","toPropagateClick","classToPreventHide","this","$el","_scrollposition","isOpenTypeCustom","isOpen","events","_scrollPosition","window","pageYOffset","parent","scrollTo","on","e","target","hasClass","closest","data","hide","stopPropagation","define","beforeOpen","stickyFooter","closeLabel","opts","init","modalBoxFooter","style","width","modalBox","clientWidth","left","offsetLeft","createElement","classList","add","indexOf","display","forEach","modalCloseBtn","modalCloseBtnIcon","modalCloseBtnLabel","appendChild","modalBoxContent","_events","clickCloseBtn","close","clickOverlay","resize","checkOverflow","keyboardNav","addEventListener","which","clientX","parentElement","contains","a","removeEventListener","arguments","h","transition","OTransition","MozTransition","WebkitTransition","body","insertBefore","firstChild","addFooter","parentNode","removeChild","open","removeProperty","removeAttribute","top","setStickyFooter","remove","getContent","setFooterContent","getFooterContent","isOverflow","clientHeight","addFooterBtn","split","console","warn","innerHeight","addInputClearIcon","inputItem","$inputFieldContainer","clearIconTopPos","outerHeight","find","append","css","formElement","payload","form","empty","Foundation","MediaQuery","atLeast","selects","chosen","disable_search","each","ariaLabel","attr","next","fields","keys","feedbackElement","children","Array","isArray","join","siblings","show","error","index","currentTarget","val","firstNameIdList","lastNameIdList","firstNameId","lastNameId","parents","after","swapFirstLastName","parentSelector","fieldErrors","trigger","cardFieldSelector","cardTypeSelector","cleave","Cleave","creditCard","onCreditCardTypeChanged","type","creditCardTypes","amex","cardType","visa","mastercard","discover","jcb","diners","unknown","wasAmexSelected","serializedArray","serializeArray","item","getRawValue","param","task","requestAnimationFrame","preventDefault","off","url","method","hideSpinner","spinner","start","Promise","resolve","reject","ajax","success","response","stop","include","map","el","htmlMap","querySelector","params","newUrl","encodeURIComponent","cookie","filter","trim","expires","days","date","Date","setTime","getTime","toGMTString","parts","pop","shift","navigator","maxTouchPoints","msMaxTouchPoints","idName","openSizePanel","_self","infoURL","dataType","product","readyToOrder","sizeDisplayValue","text","pid","id","ADDTOCART","ADDTOCART_BUNDLE","PERSONALIZE","WISHILIST","SMARTGIFT","operation","Types","$sizeElements","bundleQuantity","element","parseInt","stopSpinner","selectedSize","removeAttr","testEnabled","productGenderMap","1","2","3","4","5","6","brandsMapping","ListType","getSkuCodes","sku","substring","color","size","replace","formatStringForAnalytics","str","toLowerCase","formatStringProductPropertyIfExists","avoidFormatting","getFormatSkuForAnalytics","formatFloatProductPropertyIfExists","parseFloat","formatIntegerProductPropertyIfExists","stringOrNotAvailable","String","numberOrZero","getStringAnalyticsValueFromStorage","sessionStorage","getItem","formattedSku","match","toUpperCase","skuComponents","isTestEnabled","getAvailableListTypes","listingItemsBaseClass","types","push","getSkuComponents","getProductGender","sapCategoryCode","categoryCode","getProductBaseInfo","colorObject","promo","promotions","enabled","appliedPromotions","productType","components","k","variationAttributes","variationAttribute","attributeId","j","values","selected","selectedVariation","formatProductForAnalytics","formatStringProductSalePropertyIfExists","checkPage","location","href","formatString","format4DigitNumber","number","toString","insertParameter","encodeURI","x","kvp","search","substr","insertParam","existsParameter","hasParam","pushObject","dataLayer","log","getFormatSku","formatNameForAnalytics","formatSkus","skus","formattedSkus","getProductNameEngFromPdp","getFormatedNewsletterPreferenceBrands","list","brandsStr","brand","getListId","container","provider","getProductList","items","obj","eq","item_list_name","item_list_id","quantity","getGrandTotal","getAppliedCoupon","coupon","getUpsellingMessage","upsellingMessage","vals","localStorage","setItem","getBeginCheckoutData","context","upselling_message","currency","helperData","getTypeOfAccount","typeOfAccount","storeGtmData","item_id","item_variant","JSON","stringify","getGtmData","GTMData","GTMItem","parse","setBonusProductData","$container","isMiniCartOpen","getPidValue","attributeSelectQuickAdd","selectedValueUrl","$productContainer","imagesShouldUpdate","handleVariantResponseQuickAdd","updateOptions","options","updateQuantities","quantities","selectedQuantity","activatePromoAnimationMessage","reactivatePromoAnimationMessage","promotionId","pdpCalloutMsgText","attributeSelect","ignoreCTA","prevObject","analyticsPromotion","isSize","variation","handleVariantResponse","handleVariationUrlsSelectSizeModal","variationUrls","handlePromotionTag","handleVariationUrlsSelectNotifyModal","handleVariationComingSoonNotifyModal","handleVariationComingSoon","comingSoon","handleVariationWishlistModal","updateImageSaveForLater","getPID","promoContainer","promoMessage","promoLoyaltyMessage","selectorPrefix","onSaleSelected","price","saleType","discountValue","calloutMsg","totalQuantityPrice","handleInexistentSizeQuickView","handleWishlistContainer","err","responseJSON","redirectUrl","current_url","pathname","localized_error_page","protocol","host","then","sizePanel","afterSizeSelection","getQuantitySelector","getQuantitySelected","updateAttrs","attrs","variantType","attrsWithSwatches","attrValue","$attrValue","$swatchAnchor","displayValue","displayName","images","swatch","outerHTML","selectable","isSoldout","processSwatchValues","$attr","resetUrl","$attrValueMobile","variationUrl","isComingSoon","selectedSizeSpan","prop","lowAvailability","toggleClass","disabled","$sizeSelectorContainer","processNonSwatchValues","updateScanTrustLink","$productAuthenticity","scanTrustUrlWithParams","updateAvailability","availabilityValue","availabilityMessages","availability","messages","orderable","message","resources","info_selectforstock","available","isSizeInexistent","option","$optionEl","valueEl","updateColorFamily","colorFamily","updatePrices","priceSelector","priceInfoSelector","$oldPriceInfoSelector","$regularPriceInfoDiscountSelector","$oldPriceInfoDiscountSelector","$pricePercentage","$priceSelector","$priceInfoSelector","$priceInfoInSaleContainerSelector","$priceInfoInSaleContainerSelector2","$omnibusPricelForSpecificCountries","onSalesInfoPrice","replaceWith","currentCountryOmnibus","isRegularOmnibusCountry","sales","formattedPriceInfo","tooltip_omnibus","oldPriceOmnibus","priceInfoDiscountValue","formatted","doubleCurrency","$doubleCurrencyContainer","innerContent","New","isGreen","small","title","partTypes","comp","percentage","material","endTag","mainComposition","primaryImageUrls","slick","selectedProductUrl","large","imageUrl","idx","$carouselInner","$imgContainer","slidesToShow","slidesToScroll","dots","arrows","infinite","responsive","breakpoint","settings","resizedUrls","sizes","scaleWidth","$imgContainerDesktop","$imgZoomModal","$imgZoomModalMobile","newCarouselSlideHtml","replaceAll","$galleryItemContainer","$zoomTemplate","videoUrl","videoURL","tmpl","clone","setAttribute","$secondItem","insertAfter","videoBlock","load","autoplay","videoListener","updatePrimaryImagesSlider","careAndMaintenance","countryEnabled","PersonalizationEnabledCountries","isPersonalizedVal","positions","showButton","updateModelSize","modelSize","promotionClass","cleanId","allocation","comingSoons","customizations","personalizationImgTop","personalizationImgDown","link","linkPlp","optionsHtml","getAddToCartUrl","$html","parseHTML","$results","undefined","handlePostCartAdd","cookies","cookieSizebaySessionId","startsWith","urlSessionId","getAttribute","fetch","ok","Error","json","createCookie","callSizebayAPI","brandURL","currentCountry","includes","permaURL","urlSizebay","URL","searchParams","has","set","device","referrerURL","referrerPolicy","headers","accept","tenant_id","referer","hostname","updateQuantityPicker","source","calculateWatchedTime","video","currentTime","duration","triggerVideoInteractionEvent","action","fullPageLoad","$videoBlockContainer","$videoPlayMiniatureIcon","percentageWatched","firstPlayback","watchedFullVideo","videoStartInSeconds","videoEndInSeconds","myVideo","onended","onplaying","onpause","loop","pause","paused","play","reorderSwatches","$swatchContainer","$soldoutColorsContainers","$lastNonSoldoutColorContainer","not","last","freeGiftDetailsModal","bonusProductModal","methods","colorAttribute","colorAttributeQuickAddListing","sizeAttribute","sizeAttributeQuickAddListing","sizeAttributeQuickAddPDP","sizeAttributeSet","addToCart","careAndMaintenanceClick","personalizationButton","sizeTU","quickAddListener","NotifyHelper","notifyMeModal","checkSoldoutAvailability","SmartGiftHelper","run","registerAttributionTokenSending","loadGoogleRecommendations","createNextPageToken","isSizeSelected","newModalFromString","runPersonalizationListener","description","firstPart","firstPartSplit","firstPartSKU","productId","first","colorValue","selectedColor","updateProductDetailUrl","$productTile","startCarouselTileImageFunction","selectedValue","isPdp","isPeronalizePage","sizeData","skuData","decodeURI","splitSkuData","originalEvent","code","$sizeSelected","addToCartFromListing","$button","$target","$input","newValue","addToCartUrl","pidsObj","setPids","_openStickySizeSelectorModal","isPersonalizedProduct","personalizationTextFont","personalizationText","personalizationTextColor","personalizationColorPref","PersonalizationColor","personalizationColor","personalizationColorJson","alt","src","lastIndexOf","personalizationPositionKey","customizationClassPref","CustomizationClass","customizationClass","customizationClassJson","category","personalizationTextSVG","personalizationFullSVG","personalizationSmallSVG","uniqueIdentifiers","random","Math","personalizedObj","isDate","isLove","GTMItemListName","GTMItemListId","GTMIndex","uniqueIdentifier","toggle","is","animate","scrollTop","offset","qty","pidSet","uid","buttonAdd","promoId","childProducts","uuid","completePromoItems","completePromoItemsLabel","quantityTotal","cart","numItems","cartModel","click","mustAdd","showQuickAddItems","sizeChecked","quantitySelected","attributesUpdateUrl","attributionToken","$googleConfig","servingConfig","nodeToAppendTo","cgid","route","appendTo","$googleAttributionToken","previousPageToken","searchTerm","displayMessageAndChangeIcon","icon","isAddAction","wishlistTotal","sender","updateAriaLabelForWishlistLink","blur","offsetTop","closeNotification","setTimeout","showWishlistNotification","renderedTemplate","newItems","oldItems","oldIdx","splice","updateWishlistInternalState","addDefinitelyToWishlist","productID","btn","addURL","removeURL","optionId","optionVal","shouldAdd","isAdding","added","labelAddWishlist","labelRemoveWishlist","checkItemInWishlist","itemCode","highlightIconsForAllItemsInWishlist","itemsInWishlist","plpWishlist","productDetailWishlist","moveToWishlistHelper","$btn","moveToWishlistHelperSaveForLater","addToWishlist","sizeModal","newModalFromSelector","$clickedButton","sizeValue","$inputToClick","_","getCountryAndLang","country","contentLang","language","countryList","getQueryMinimumLength","countryAndLang","minimumLength","localitiesWidgetFindInStore","woosmap","localities","Autocomplete","addListener","selection","getSelectedSuggestionDetails","_e","removeListener","resultsContainer","localitiesWidgetUPS","localitiesWidgetInPost","localitiesWidgetBRT","localitiesWidgetPPL","localitiesWidgetDHL","localitiesWidgetDPD","localitiesWidgetMenu","inputValue","selectionMenu","filterByCountry","config","localitiesWidgetFindYourStore","predictions","localitiesWidgetSPS","isReturnFlow","className","_initWoosmap","localitiesWidgetFooter","localitiesWidgetRUPup","localitiesWidgetHermes","localitiesWidgetCollisimo","localitiesWidgetPDB","shippingMethodType","localitiesWidget","pudoModalSelector","chooseOptionSelector","global","sqrt","atan2","pow","PiBy180","PiBy2","couldUseAttachEvent","parseEl","supportsOpacity","supportsFilters","reOpacity","setOpacity","proto","toFixed","min","max","degreesToRadians","originXOffset","originYOffset","fabric","version","HTMLDocument","Document","implementation","createHTMLDocument","virtualWindow","require","JSDOM","decodeURIComponent","features","FetchExternalResources","jsdomImplForWrapper","implForWrapper","nodeCanvas","Canvas","DOMParser","copyGLTo2DDrawImage","gl","pipelineState","glCanvas","canvas","targetCanvas","ctx","getContext","translate","height","scale","sourceY","drawImage","copyGLTo2DPutImageData","dWidth","destinationWidth","dHeight","destinationHeight","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","RGBA","UNSIGNED_BYTE","imgData","ImageData","putImageData","isTouchSupported","isLikelyNode","Buffer","SHARED_ATTRIBUTES","DPI","reNum","rePathCommand","reNonWord","fontPaths","iMatrix","svgNS","perfLimitSizeTotal","maxCacheSideLimit","minCacheSideLimit","charWidthsCache","textureSize","disableStyleCopyPaste","enableGLFiltering","devicePixelRatio","webkitDevicePixelRatio","mozDevicePixelRatio","browserShadowBlurConstant","arcToSegmentsCache","boundsOfCurveCache","cachesBoundsOfCurve","forceGLPutImageData","initFilterBackend","isWebglSupported","maxTextureSize","WebglFilterBackend","tileSize","Canvas2dFilterBackend","_removeEventListener","eventName","handler","__eventListeners","eventListener","util","array","fill","observe","stopObserving","fire","listenersForEvent","len","Observable","Collection","_objects","apply","_onObjectAdded","renderOnAddRemove","requestRenderAll","insertAt","nonSplicing","objects","somethingRemoved","_onObjectRemoved","forEachObject","callback","getObjects","concat","isEmpty","complexity","reduce","memo","current","CommonMethods","_setOptions","_initGradient","filler","colorStops","Gradient","_initPattern","Pattern","_initClipping","clipTo","functionBody","getFunctionBody","Function","_setObject","_set","PI","cos","angle","sin","sign","removeFromArray","getRandomInt","floor","degrees","radiansToDegrees","radians","rotatePoint","point","origin","subtractEquals","v","rotateVector","Point","y","addEquals","vector","transformPoint","ignoreOffset","makeBoundingBoxFromPoints","points","transform","xPoints","minX","yPoints","minY","invertTransform","fractionDigits","Number","parseUnit","fontSize","unit","exec","Text","DEFAULT_SVG_FONT_SIZE","falseFunction","getKlass","namespace","string","camelize","charAt","slice","resolveNamespace","getSvgAttributes","attributes","loadImage","crossOrigin","img","createImage","onLoadCallback","onload","onerror","loadImageInDom","div","position","enlivenObjects","reviver","enlivenedObjects","numLoadedObjects","numTotalObjects","onLoaded","fromObject","enlivenPatterns","patterns","numLoadedPatterns","numPatterns","enlivenedPatterns","pattern","groupSVGElements","elements","path","centerPoint","Group","sourcePath","populateWithProperties","destination","properties","drawDashedLine","x2","y2","da","dx","dy","rot","dc","di","draw","save","moveTo","rotate","restore","createCanvasElement","copyCanvasElement","newCanvas","toDataURL","canvasEl","format","quality","clipContext","receiver","beginPath","clip","multiplyTransformMatrices","b","is2x2","qrDecompose","denom","scaleX","scaleY","skewX","skewY","translateX","translateY","calcRotateMatrix","theta","calcDimensionsMatrix","scaleMatrix","flipX","flipY","multiply","tan","composeMatrix","matrix","customTransformMatrix","resetObjectTransform","saveObjectTransform","fn","isTransparent","tolerance","_isTransparent","imageData","getImageData","parsePreserveAspectRatioAttribute","attribute","align","meetOrSlice","aspectRatioAttrs","alignX","alignY","clearFabricFontCache","fontFamily","limitDimsByArea","ar","maximumArea","roughWidth","perfLimitSizeY","capValue","findScaleToFit","findScaleToCover","matrixToSVG","NUM_FRACTION_DIGITS","_join","arcToSegments","toX","toY","rx","ry","sweep","rotateX","argsString","th","sinTh","cosTh","fromX","fromY","px","py","rx2","abs","ry2","py2","px2","pl","root","cx","cy","cx1","cy1","mTheta","calcVectorAngle","dtheta","segments","ceil","result","mDelta","mT","th3","segmentToBezier","th2","costh2","sinth2","costh3","sinth3","ux","uy","vx","vy","ta","tb","getBoundsOfCurve","x0","y0","x1","y1","x3","y3","t1","t2","b2ac","sqrtb2ac","tvalues","bounds","mt","jlen","drawArc","fx","fy","coords","segs","segsNorm","bezierCurveTo","getBoundsOfArc","tx","ty","bound","byProperty","condition","invoke","args","value1","value2","extend","deep","Element","getWholeChar","charCodeAt","isNaN","prev","character","capitalize","firstLetterOnly","escapeXml","graphemeSplit","textstring","chr","graphemes","emptyFunction","IS_DONTENUM_BUGGY","addMethods","klass","superclass","constructor","returnValue","valueOf","Subclass","callSuper","methodName","parentMethod","_this","superClassMethod","createClass","initialize","subclasses","attachEvent","getPointer","event","scroll","getScrollLeftTop","_evt","touchProp","changedTouches","getTouchInfo","clientY","opacity","es","currentStyle","hasLayout","zoom","test","setStyle","styles","elementStyle","cssText","styleFloat","_slice","sliceCanConvertNodelists","getElementStyle","selectProp","toArray","arrayLike","childNodes","makeElement","tagName","htmlFor","docElement","documentElement","scrollLeft","nodeType","arr","defaultView","getComputedStyle","makeElementUnselectable","onselectstart","unselectable","makeElementSelectable","getScript","headEl","getElementsByTagName","scriptEl","loading","onreadystatechange","readyState","getById","wrapElement","wrapper","replaceChild","getElementOffset","docElem","scrollLeftTop","doc","ownerDocument","box","offsetAttributes","borderLeftWidth","borderTopWidth","paddingLeft","paddingTop","getBoundingClientRect","clientLeft","clientTop","getNodeCanvas","impl","_canvas","_image","cleanUpJsdomNode","_currentSrc","_attributes","_classList","emptyFn","request","onComplete","xhr","XMLHttpRequest","parameters","addParamToUrl","setRequestHeader","send","noop","defaultEasing","_requestAnimFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","_cancelAnimFrame","cancelAnimationFrame","clearTimeout","requestAnimFrame","timestamp","time","finish","onChange","abort","easing","startValue","endValue","byValue","onStart","tick","ticktime","timePerc","valuePerc","cancelAnimFrame","animateColor","fromColor","toColor","startColor","Color","getSource","endColor","begin","end","pos","posValue","colorEasing","normalize","asin","elastic","easeInBounce","easeOutBounce","ease","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInOutBounce","attributesMap","visibility","colorAttributes","stroke","fSize","cPath","normalizeAttr","normalizeValue","parentAttributes","parsed","transformMatrix","parseTransformAttribute","visible","fillIndex","strokeIndex","getSvgRegex","RegExp","_getMultipleNodes","nodeNames","nodeName","nodeList","nodeArray","elementMatchesRule","selectors","firstMatching","parentMatching","selectorMatches","doesSomeParentMatch","matcher","classNames","elementById","node","nodelist","svgValidTagNamesRegEx","svgViewBoxElementsRegEx","svgInvalidAncestorsRegEx","svgValidParentsRegEx","cssRules","gradientDefs","clipPaths","skewMatrix","commaWsp","reTransformList","reTransform","attributeValue","matrices","translateMatrix","rotateMatrix","multiplierX","multiplierY","combinedMatrix","reViewBoxAttrValue","applyViewboxTransform","viewBoxWidth","viewBoxHeight","viewBoxAttr","widthAttr","heightAttr","preserveAspectRatio","missingViewBox","missingDimAttr","toBeParsed","parsedDim","widthDiff","heightDiff","viewboxTransform","createElementNS","recursivelyParseGradientsXlink","gradient","xlinkAttr","referencedGradient","hasAttribute","referenceClone","cloneNode","parseSVGDocument","parsingOptions","xlink","el2","currentTrans","oldLength","el3","setAttributeNS","nodeValue","parseUseDirectives","svgUid","__uid","descendants","selectNodes","hasAncestorWithNodeName","getGradientDefs","getCSSRules","parseElements","instances","reFontDeclaration","parseFontDeclaration","oStyle","fontStyle","fontWeight","lineHeight","elList","parseAttributes","parentFontSize","ownAttributes","cssAttrs","rule","getGlobalStylesForElement","parseStyleAttribute","normalizedAttr","normalizedValue","normalizedStyle","font","mergedAttrs","setAlpha","getAlpha","toRgba","_setStrokeFillOpacity","ElementsParser","chunk","pair","parseStyleString","parseStyleObject","parsePointsAttribute","parsedPoints","allRules","styleContents","textContent","ruleObj","propertyValuePairs","_rule","loadSVGFromURL","xml","responseXML","ActiveXObject","responseText","async","loadXML","results","_options","allElements","loadSVGFromString","parser","parseFromString","regexUrl","numElements","createObjects","createObject","findTag","fromElement","createCallback","checkIfDone","resolveGradient","Image","_originalElement","_removeTransformMatrix","resolveClipPath","extractPropertyDefinition","storage","regex","lastIndex","gradientDef","opacityAttr","createClipPathCallback","_newObj","fillRule","clipRule","usingElement","objTransformInv","gTransform","clipPath","calcTransformMatrix","clipPathTag","clipPathOwner","setPositionByOrigin","that","scalarAdd","scalar","scalarAddEquals","subtract","scalarSubtract","scalarSubtractEquals","multiplyEquals","divide","divideEquals","lt","lte","gt","gte","lerp","distanceFrom","midPointFrom","setXY","setX","setY","setFromPoint","swap","Intersection","status","appendPoint","appendPoints","intersectLineLine","a1","a2","b1","b2","uaT","ubT","uB","ua","ub","intersectLinePolygon","inter","intersectPolygonPolygon","points1","points2","intersectPolygonRectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","_tryParsingColor","setSource","hue2rgb","q","colorNameMap","sourceFromHex","sourceFromRgb","sourceFromHsl","_rgbToHsl","g","round","_source","toRgb","toHsl","hsl","toHsla","toHex","toHexa","alpha","toGrayscale","average","currentAlpha","toBlackWhite","threshold","overlayWith","otherColor","otherSource","reRGBa","reHSLa","reHex","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","fromRgb","fromSource","fromRgba","fromHsl","fromHsla","fromHex","isShortNotation","isRGBa","oColor","getColorStop","multiplier","colorAlpha","keyValuePairs","__convertPercentUnitsToValues","instance","svgOptions","gradientUnits","propValue","finalValue","offsetX","offsetY","gradientTransform","addColorStop","toObject","propertiesToInclude","toSVG","markup","commonAttributes","needsSwap","withViewport","additionalTransform","sort","pathOffset","reverse","minRadius","percentageShift","colorStop","toLive","stops","createLinearGradient","createRadialGradient","colorStopEls","getLinearCoords","getRadialCoords","forObject","repeat","patternTransform","setOptions","patternSource","patternWidth","patternHeight","patternOffsetX","patternOffsetY","patternImgSrc","complete","naturalWidth","naturalHeight","createPattern","Shadow","affectStroke","includeDefaultValues","nonScaling","_parseShadow","shadow","shadowStr","offsetsAndBlur","reOffsetsAndBlur","fBoxX","fBoxY","StaticCanvas","CANVAS_INIT_ERROR","renderAndResetBound","renderAndReset","requestRenderAllBound","_initStatic","backgroundColor","backgroundImage","overlayColor","overlayImage","stateful","controlsAboveOverlay","allowTouchScrolling","imageSmoothingEnabled","viewportTransform","backgroundVpt","overlayVpt","onBeforeScaleRotate","enableRetinaScaling","vptCoords","skipOffscreen","cb","_createLowerCanvas","_initOptions","_setImageSmoothing","interactive","_initRetinaScaling","setOverlayImage","setBackgroundImage","setBackgroundColor","setOverlayColor","calcOffset","_isRetinaScaling","getRetinaScaling","scaleRatio","__initRetinaScaling","lowerCanvasEl","contextContainer","upperCanvasEl","contextTop","_offset","image","__setBgOverlayImage","__setBgOverlayColor","webkitImageSmoothingEnabled","mozImageSmoothingEnabled","msImageSmoothingEnabled","oImageSmoothingEnabled","_createCanvasElement","_applyCanvasStyle","getWidth","getHeight","setWidth","setDimensions","setHeight","dimensions","cssValue","cssOnly","_setBackstoreDimension","hasLostContext","backstoreOnly","_setCssDimension","_isCurrentlyDrawing","freeDrawingBrush","_setBrushStyles","cacheCanvasEl","wrapperEl","getZoom","setViewportTransform","vpt","activeObject","_activeObject","group","setCoords","calcViewportBoundaries","zoomToPoint","before","setZoom","absolutePan","relativePan","getElement","setupState","clearContext","clearRect","clear","_hasITextHandlers","_mouseUpITextHandler","_iTextInstances","renderAll","canvasToDrawOn","renderCanvas","isRendering","iVpt","tl","br","tr","bl","cancelRequestedRender","_renderBackground","_renderObjects","drawControls","shouldCache","_transformDone","renderCache","forClipping","drawClipPathOnCanvas","_renderOverlay","globalCompositeOperation","zoomX","zoomY","_cacheCanvas","cacheTranslationX","cacheTranslationY","render","_renderBackgroundOrOverlay","needsVpt","lineTo","closePath","fillStyle","getCenter","centerObjectH","_centerObject","getCenterPoint","centerObjectV","centerObject","center","viewportCenterObject","vpCenter","getVpCenter","viewportCenterObjectH","viewportCenterObjectV","toDatalessJSON","toDatalessObject","_toObjectMethod","_toObjects","_toObject","__serializeBgOverlay","excludeFromExport","originalValue","bgImage","overlay","background","svgViewportTransformation","_setSVGPreamble","_setSVGHeader","clipPathId","_setSVGBgOverlayColor","_setSVGBgOverlayImage","_setSVGObjects","suppressPreamble","encoding","viewBox","createSVGFontFacesMarkup","createSVGRefElementsMarkup","createSVGClipPathMarkup","toClipPathSVG","shouldTransform","row","rowIndex","charIndex","fontList","_setSVGObject","finalWidth","finalHeight","sendToBack","objs","activeSelection","unshift","bringToFront","sendBackwards","intersecting","newIdx","objsMoved","_findNewLowerIndex","intersectsWithObject","isContainedWithinObject","bringForward","_findNewUpperIndex","dispose","DataURLExporter","EMPTY_JSON","supports","setLineDash","toJSON","createPNGStream","createJPEGStream","BaseBrush","strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeDashArray","setShadow","strokeStyle","lineWidth","lineCap","miterLimit","lineJoin","_saveAndTransform","_setShadow","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","needsFullRender","_resetShadow","PencilBrush","decimate","_points","_drawSegment","p1","p2","midPoint","quadraticCurveTo","onMouseDown","pointer","_isMainEvent","_prepareForDrawing","_captureDrawingPath","_render","onMouseMove","oldEnd","onMouseUp","_finalizeAndAddPath","_reset","_addPoint","pointerPoint","convertPointsToSVGPath","multSignX","multSignY","manyPoints","createPath","pathData","Path","strokeWidth","decimatePoints","distance","adjustedDistance","lastPoint","newPoints","CircleBrush","drawDot","addPoint","dot","arc","radius","originalRenderOnAddRemove","circles","circle","Circle","originX","originY","circleRadius","circleColor","SprayBrush","density","dotWidth","dotWidthVariance","randomOpacity","optimizeOverlapping","sprayChunks","addSprayChunk","sprayChunkPoints","rects","ilen","sprayChunk","rect","Rect","_getOptimizedRects","uniqueRects","uniqueRectsArray","globalAlpha","fillRect","PatternBrush","getPatternSrc","patternCanvas","patternCtx","getPatternSrcFunction","getPattern","topLeft","_getLeftTopCoords","supportLineDash","STROKE_OFFSET","_initInteractive","_createCacheCanvas","uniScaleTransform","uniScaleKey","centeredScaling","centeredRotation","centeredKey","altActionKey","selectionKey","altSelectionKey","selectionColor","selectionDashArray","selectionBorderColor","selectionLineWidth","selectionFullyContained","hoverCursor","moveCursor","defaultCursor","freeDrawingCursor","rotationCursor","notAllowedCursor","containerClass","perPixelTargetFind","targetFindTolerance","skipTargetFind","isDrawingMode","preserveObjectStacking","snapAngle","snapThreshold","stopContextMenu","fireRightClick","fireMiddleClick","targets","_hoveredTarget","_hoveredTargets","_currentTransform","_groupSelector","_initWrapperElement","_createUpperCanvas","_initEventListeners","_chooseObjectsToRender","objsToRender","activeGroupObjects","activeObjects","getActiveObjects","contextTopDirty","renderTopLayer","_drawSelection","renderTop","_resetCurrentTransform","original","_shouldCenterTransform","mouseXSign","mouseYSign","containsPoint","xy","_normalizePointer","_findTargetCorner","invertedM","vptPointer","restorePointerVpt","isTargetTransparent","normalizedPointer","targetRelativeX","targetRelativeY","_cacheContext","contextCache","originalColor","selectionBackgroundColor","_renderControls","hasBorders","transparentCorners","_isSelectionKeyPressed","_shouldClearSelection","evented","centerTransform","altKey","_getOriginFromCorner","corner","_getActionFromCorner","alreadySelected","_setupCurrentTransform","ex","ey","lastX","lastY","shiftKey","_beforeTransform","_translateObject","newLeft","newTop","moveX","moveY","_changeSkewTransformOrigin","mouseMove","by","origins","0","skew","originA","originB","flipSign","skewSign","_skewObject","skewed","lockSkewingX","lockSkewingY","actualMouseByOrigin","constraintPosition","actualMouseByCenter","toLocalPoint","lastMouseByCenter","dim","_getTransformedDimensions","translateToOriginPoint","_setObjectSkew","localMouse","_dim","newDim","dimNoSkew","otherBy","_otherBy","_by","newDimMouse","atan","_scaleObject","lockScalingX","lockScalingY","lockScalingFlip","scaled","_setLocalMouse","_setObjectScale","forbidScalingX","forbidScalingY","changeX","changeY","newScaleX","newScaleY","Textbox","w","getMinWidth","_scaleObjectEqually","_flipObject","dist","lastDist","signX","signY","padding","_rotateObject","lockRotation","lastAngle","curAngle","hasRotated","rightAngleLocked","leftAngleLocked","setCursor","cursor","groupSelector","aleft","atop","_setLineDash","strokeRect","findTarget","skipGroup","activeTarget","activeTargetSubs","aObjects","_searchPossibleTargets","_checkTarget","globalPointer","isEditing","subTarget","objToCheck","pointerToUse","subTargetCheck","ignoreZoom","_absolutePointer","_pointer","cssScale","boundsWidth","boundsHeight","bottom","right","retinaScaling","lowerCanvasClass","_copyCanvasStyle","fromEl","toEl","getSelectionContext","getSelectionElement","getActiveObject","active","_discardActiveObject","_fireSelectionEvents","oldObjects","somethingChanged","removed","opt","oldObject","deselected","updated","setActiveObject","currentActives","_setActiveObject","onSelect","onDeselect","discardActiveObject","removeListeners","originalProperties","_realizeGroupTransformOnObject","_unwindGroupTransformOnObject","originalValues","realizeTransform","clearContextTop","cursorOffset","mr","mb","ml","addEventOptions","passive","checkClick","button","cursorMap","mainTouchId","_bindEvents","addOrRemove","_getEventPrefix","enablePointerEvents","functor","eventjsFunctor","canvasElement","eventTypePrefix","_onResize","_onMouseDown","_onMouseMove","_onMouseOut","_onMouseEnter","_onMouseWheel","_onContextMenu","_onDoubleClick","_onDragOver","_onDragEnter","_onDragLeave","_onDrop","_onTouchStart","eventjs","_onGesture","_onDrag","_onOrientationChange","_onShake","_onLongPress","_onMouseUp","_onTouchEnd","eventsBound","_simpleEventHandler","self","__onTransformGesture","__onDrag","__onMouseWheel","_target","hiddenTextarea","focus","currentTransform","__onOrientationChange","__onShake","__onLongPress","_fireEnterLeaveEvents","_cacheTransformEventData","_handleEvent","_resetTransformEventData","getPointerId","evt","identifier","pointerId","isPrimary","touches","__onMouseDown","__onMouseUp","_willAddMouseDown","__onMouseMove","_shouldRender","shouldRender","isClick","_onMouseUpInDrawingMode","_finalizeCurrentTransform","actionPerformed","_maybeGroupObjects","isMoving","_setCursorFromEvent","__corner","eventType","subTargets","absolutePointer","_scaling","hasStateChanged","_addEventOptions","_fire","_onMouseDownInDrawingMode","_onMouseMoveInDrawingMode","_previousPointer","shouldGroup","_shouldGroup","_handleGrouping","saveState","_transformObject","_fireOverOutEvents","fireSyntheticInOutEvents","oldTarget","evtOut","canvasEvtOut","evtIn","canvasEvtIn","_draggedoverTarget","inOpt","outOpt","inFires","targetChanged","previousTarget","nextTarget","reset","_beforeScaleTransform","_performTransformAction","_onScale","_isUniscalePossible","currentAction","getCornerCursor","actionIsDisabled","_getRotatedCornerCursor","hasRotatingPoint","_updateActiveSelection","_createActiveSelection","currentActiveObjects","removeWithUpdate","addWithUpdate","_createGroup","groupObjects","exitEditing","ActiveSelection","_groupSelectedObjects","aGroup","_collectObjects","currentObject","selectionX1Y1","selectionX2Y2","allowIntersect","intersectsWithRect","isContainedWithinRect","toCanvasElement","cropping","scaledWidth","scaledHeight","originalWidth","originalHeight","newZoom","vp","originalInteractive","newVp","originalRetina","originalContextTop","loadFromDatalessJSON","loadFromJSON","serialized","_enlivenObjects","_setBgOverlay","enlivenedCanvasClip","__setupCanvas","loaded","cbIfLoaded","__setBgOverlay","enlivedObject","_toDataURL","_toDataURLWithMultiplier","toDataURLWithMultiplier","cloneWithoutData","backgroundImageOpacity","backgroundImageStretch","supportsLineDash","objectCaching","cornerSize","borderColor","borderDashArray","cornerColor","cornerStrokeColor","cornerStyle","cornerDashArray","strokeDashOffset","borderOpacityWhenMoving","borderScaleFactor","minScaleLimit","hasControls","rotatingPointOffset","lockMovementX","lockMovementY","lockUniScaling","statefullCache","noScaleCache","strokeUniform","dirty","paintFirst","stateProperties","cacheProperties","inverted","absolutePositioned","_cacheProperties","_updateCacheCanvas","_limitCacheSize","dims","limitedDims","capped","_getCacheCanvasDimensions","objectScale","getTotalObjectScaling","neededX","neededY","drawingWidth","drawingHeight","minCacheSize","dimensionsChanged","cacheWidth","cacheHeight","zoomChanged","shouldRedraw","additionalWidth","additionalHeight","shouldResizeCanvas","canvasWidth","canvasHeight","sizeGrowing","setTransform","calcOwnMatrix","_removeDefaultValues","getObjectScaling","retina","getObjectOpacity","shouldConstrainValue","isChanged","groupNeedsUpdate","_constrainScale","isOnACache","setOnGroup","getViewportTransform","isNotVisible","isOnScreen","_setupCompositeOperation","drawSelectionBackground","_setOpacity","drawCacheOnCanvas","_removeCacheCanvas","drawObject","propertySet","isCacheDirty","hasStroke","hasFill","needsItsOwnCache","ownCaching","willDrawShadow","drawClipPathOnCache","originalFill","originalStroke","_setClippingProperties","_setStrokeStyles","_setFillStyles","_drawClipPath","skipCanvas","_getNonTransformedDimensions","_removeShadow","decl","lineDashOffset","dashArray","alternative","styleOverride","drawBorders","forActiveSelection","drawBordersInGroup","scaling","multX","multY","_applyPatternGradientTransform","_renderPaintInOrder","_renderStroke","_renderFill","_renderDashedStroke","_applyPatternForTransformedGradient","pCtx","pCanvas","_findCenterFromElement","_assignTransformMatrixProps","preserveAspectRatioOptions","cropX","cropY","objectForm","_fromObject","cloneAsImage","utils","origParams","originalGroup","originalShadow","withoutTransform","withoutShadow","boundingRect","getBoundingRect","shadowOffset","originalCanvas","isType","setGradient","setPatternFill","setColor","shouldCenterOrigin","_setOriginToCenter","_resetOrigin","centerH","viewportCenterH","centerV","viewportCenterV","viewportCenter","getLocalPointer","pClicked","objectLeftTop","createAccessors","extraParam","enlivedProps","translateToGivenOrigin","fromOriginX","fromOriginY","toOriginX","toOriginY","translateToCenterPoint","leftTop","getPointByOrigin","adjustPosition","to","offsetFrom","offsetTo","hypotFull","getScaledWidth","xFull","yFull","_originalOriginX","_originalOriginY","originPoint","multiplyMatrices","oCoords","aCoords","ownMatrixCache","matrixCache","getCoords","absolute","calculate","calcCoords","pointTL","pointBR","other","lines","_getImageLines","_findCrossPoints","_containsCenterOfCanvas","isPartiallyOnScreen","topline","rightline","bottomline","leftline","xi","iLine","xcount","lineKey","getScaledHeight","scaleToWidth","boundingRectFactor","scaleToHeight","_calcRotateMatrix","_calcTranslateMatrix","startMatrix","finalMatrix","cosP","sinP","cosPSinP","cosPMinusSinP","mtr","skipAbsolute","_setCornerCoords","transformMatrixKey","sep","prefix","cache","tMatrix","_calcDimensionsTransformMatrix","flipping","dimX","dimY","noSkew","_finalizeDimensions","bbox","_calculateCurrentDimensions","getSvgColorString","getSvgStyles","skipShadow","getSvgFilter","getSvgSpanStyles","useWhiteSpace","term","textDecoration","getSvgTextDecoration","deltaY","decoration","getSvgCommons","getSvgTransform","full","getSvgTransformMatrix","_setSVGBg","textBgRects","_getFillAttributes","_createBaseSVGMarkup","_toSVG","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","clipPathMarkup","noStyle","styleInfo","shadowInfo","withShadow","vectorEffect","absoluteClipPath","addPaintOrder","originalSet","saveProps","props","tmpObj","_isEqual","origValue","currentValue","firstPass","dashedPropertySet","_controlsVisibility","isControlVisible","newTheta","cornerHypotenuse","cosHalfOffset","sinHalfOffset","wh","drawRotatingPoint","rotateHeight","scaleOffset","_drawControl","control","controlName","_getControlsVisibility","setControlVisible","setControlsVisibility","FX_DURATION","fxCenterObjectH","callbacks","fxCenterObjectV","fxRemove","skipCallbacks","propsToAnimate","_animate","propPair","from","valueProgress","timeProgress","coordProps","makeEdgeToOriginGetter","propertyNames","originValues","axis1","axis2","dimension","nearest","farthest","Line","_setWidthHeight","_getLeftToOriginX","_getTopToOriginY","calcLinePoints","origStrokeStyle","xMult","yMult","ATTRIBUTE_NAMES","parsedAttributes","pi","startAngle","endAngle","setRadius","svgString","startX","startY","endX","endY","largeFlag","getRadiusX","getRadiusY","Triangle","widthBy2","heightBy2","piBy2","Ellipse","getRx","getRy","_initRxRy","isRounded","Polyline","_setPositionDimensions","correctLeftTop","calcDim","_calcDimensions","fromSVG","diffX","diffY","commonRender","fromElementGenerator","_class","Polygon","_toString","commandLengths","repeatedCommands","M","fromArray","_parsePath","_renderPathCommands","tempX","tempY","previous","subpathStartX","subpathStartY","controlX","controlY","_getOffsetTransform","digits","currentPath","coordsStr","coordsParsed","re","command","commandLength","repeatedCommand","klen","aX","aY","pathUrl","useSetOnGroup","isAlreadyGrouped","_updateObjectsACoords","_calcBounds","_updateObjectsCoords","_updateObjectCoords","objectLeft","objectTop","_restoreObjectsState","_includeDefaultValues","objsToObject","originalDefaults","_obj","ownCache","_restoreObjectState","toActiveSelection","ungroupOnCanvas","setObjectsCoords","onlyWidthHeight","iLen","jLen","_getBounds","minXY","maxXY","enlivedClipPath","toGroup","newGroup","childrenOverride","srcFromAttribute","_lastScaleX","_lastScaleY","_filterScalingX","_filterScalingY","minimumScaleTrigger","cacheKey","filters","_initElement","_element","setElement","removeTexture","_initConfig","applyFilters","resizeFilter","applyResizeFilters","backend","filterBackend","evictCachesForKey","setCrossOrigin","getOriginalSize","_stroke","filterObj","getSrc","hasCrop","strokeSvg","imageMarkup","getSvgSrc","origFill","filtered","setSrc","minimumScale","elementToFilter","_filteredEl","sourceWidth","sourceHeight","isNeutralState","imgElement","_needsResize","elementToDraw","elWidth","elHeight","sX","sY","sW","sH","maxDestW","maxDestH","_resetWidthHeight","CSS_CANVAS","_initFilters","pAR","rWidth","rHeight","pWidth","pHeight","_object","resizeFilters","fromURL","imgOptions","_getAngleValueForStraighten","straighten","fxStraighten","straightenObject","fxStraightenObject","testPrecision","precision","fragmentSource","fragmentShader","createShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","setupGLContext","captureGPUInfo","isSupported","getParameter","MAX_TEXTURE_SIZE","precisions","webGlPrecision","createWebGLCanvas","aPosition","Float32Array","chooseFastestCopyGLTo2DMethod","canUseImageData","canMeasurePerf","performance","canUseArrayBuffer","ArrayBuffer","canUseUint8Clamped","copyGLTo2D","startTime","drawImageTime","testContext","now","glOptions","premultipliedAlpha","depth","stencil","antialias","clearColor","cachedTexture","getCachedTexture","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","programCache","pass","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","applyTo","resizeCanvasIfNeeded","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","clearWebGLCaches","textureCache","textureImageSource","texture","texParameteri","TEXTURE_MAG_FILTER","NEAREST","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","texImage2D","uniqueId","gpuInfo","renderer","vendor","ext","getExtension","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","sourceElement","originalEl","originalImageData","BaseFilter","vertexSource","createProgram","vertexShader","VERTEX_SHADER","getShaderInfoLog","program","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","attributeLocations","getAttributeLocations","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","getAttribLocation","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","framebufferTexture2D","COLOR_ATTACHMENT0","_swapTextures","temp","main","mainParameter","applyToWebGL","applyTo2d","retrieveShader","shader","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","getMainParameter","setMainParameter","createHelpLayer","helpLayer","mainP","ColorMatrix","colorsOnly","uColorMatrix","uConstants","constants","uniformMatrix4fv","uniform4fv","Brightness","brightness","uBrightness","Convolute","opaque","Convolute_3_1","Convolute_3_0","Convolute_5_1","Convolute_5_0","Convolute_7_1","Convolute_7_0","Convolute_9_1","Convolute_9_0","dstOff","scx","scy","srcOff","wt","weights","side","halfSide","sw","sh","output","createImageData","dst","alphaFac","uMatrix","uOpaque","uHalfSize","uSize","uniform1fv","Grayscale","lightness","luminosity","uMode","uniform1i","Invert","invert","uInvert","Noise","noise","rand","uNoise","uSeed","Pixelate","blocksize","_i","_j","_iLen","_jLen","uBlocksize","RemoveColor","useAlpha","lowC","highC","uLow","uHigh","Brownie","Vintage","Kodachrome","Technicolor","Polaroid","Sepia","BlackWhite","BlendColor","screen","diff","lighten","darken","exclusion","tint","buildSource","tg","alpha1","uColor","BlendImage","mask","TEXTURE1","calculateMatrix","canvas1","blendData","blendImage","uTransformMatrix","uImage","uniformMatrix3fv","Resize","resizeType","lanczosLobes","uDelta","uTaps","uniform2fv","horizontal","taps","filterWindow","getFilterWindow","generateShader","tempScale","getTaps","lobeFunction","lanczosCreate","offsets","fragmentSourceTOP","dW","dH","lobes","xx","rcpScaleX","rcpScaleY","newData","oW","oH","sliceByTwo","hermiteFastResize","bilinearFiltering","lanczosResize","tmpCanvas","mult","doneW","doneH","stepW","stepH","dX","dY","srcData","destImg","destData","lanczos","ratioX","ratioY","rcpRatioX","rcpRatioY","range2X","range2Y","cacheLanc","icenter","process","u","weight","fX","fY","xDiff","yDiff","chnl","origPix","w4","pixels","destImage","destPixels","ratioW","ratioH","ratioWHalf","ratioHHalf","img2","data2","weightsAlpha","gxR","gxG","gxB","gxA","centerY","yy","centerX","w0","Contrast","contrast","contrastF","uContrast","Saturation","saturation","adjust","uSaturation","Blur","aspectRatio","simpleBlur","canvas2","blurLayer1","blurLayer2","percent","ctx1","ctx2","nSamples","newImageData","delta","chooseRightDelta","blurScale","Gamma","gamma","rInv","gInv","bInv","rVals","gVals","bVals","uGamma","uniform3fv","Composed","subFilters","some","HueRotation","rotation","rad","aThird","aThirdSqtSin","OneMinusCos","_dimensionAffectingProps","_reNewline","_reSpacesAndTabs","_reSpaceAndTab","_reWords","underline","overline","linethrough","textAlign","superscript","baseline","subscript","textBackgroundColor","_fontSizeFraction","_fontSizeMult","charSpacing","_measuringContext","_styleProperties","__charBounds","CACHE_FONT_SIZE","MIN_TEXT_WIDTH","__skipDimension","initDimensions","getMeasuringContext","_splitText","newLines","_splitTextIntoLines","textLines","_textLines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","_clearCache","calcTextWidth","cursorWidth","enlargeSpaces","calcTextHeight","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","line","charBound","spaces","isEndOfWrapping","getLineWidth","kernedWidth","lineIndex","missingNewlineOffset","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderText","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","_getFontDeclaration","maxWidth","_renderTextLine","_renderChars","styleHas","heightOfLine","lineLeftOffset","lastColor","charBox","currentColor","lineTopOffset","leftOffset","_getLeftOffset","topOffset","_getTopOffset","boxStart","boxWidth","getHeightOfLine","_getLineLeftOffset","getValueOfPropertyAt","getFontCache","cacheProp","_applyCharStyles","styleDeclaration","_measureChar","_char","previousChar","prevCharStyle","coupleWidth","previousWidth","fontCache","couple","stylesAreEqual","fontMultiplier","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","grapheme","prevGrapheme","graphemeInfo","lineBounds","_getGraphemeBox","numOfSpaces","skipLeft","getCompleteStyleDeclaration","prevStyle","info","previousBox","__lineHeights","maxHeight","_renderTextCommon","lineHeights","isEmptyStyles","actualStyle","nextStyle","timeToRender","isJustify","charsToRender","shortCut","_renderChar","_hasStyleChanged","_getStyleDeclaration","fullDecl","shouldFill","shouldStroke","fillText","strokeText","setSuperscript","_setScript","setSubscript","schema","loc","get2DCursorLocation","setSelectionStyles","thisStyle","_hasStyleChangedForSvg","__lineWidths","_shouldClearDimensionCache","shouldClear","_forceClearCache","_size","_dy","lastDecoration","currentDecoration","currentFill","lastFill","styleObject","family","fontIsGeneric","genericFonts","newLine","newText","additionalProperties","needsDims","_key","parsedAnchor","textAnchor","originalStrokeWidth","textHeightScaleFactor","scaledDiff","textHeight","offX","p3","cleanStyle","letterCount","stylePropertyValue","stylesCount","allStyleObjectPropertiesMatch","graphemeCount","removeStyle","lineNum","charNum","_extendStyles","_getLineStyle","_setLineStyle","_setStyleDeclaration","selectionStart","skipWrapping","getSelectionStyles","startIndex","endIndex","selectionEnd","getStyleAtPosition","lineStyle","_deleteStyleDeclaration","_deleteLineStyle","parseDecoration","IText","editable","editingBorderColor","cursorColor","cursorDelay","cursorDuration","caching","_reSpace","_currentCursorOpacity","_selectionDirection","_abortCursorAnimation","__widthOfSpace","inCompositionMode","initBehavior","setSelectionStart","_updateAndFire","setSelectionEnd","_fireSelectionChanged","_updateTextarea","initDelayedCursor","cursorOffsetCache","renderCursorOrSelection","skipRestore","_clearTextArea","boundaries","_getCursorBoundaries","renderCursor","renderSelection","_getCursorBoundariesOffsets","cursorPosition","cursorLocation","charHeight","__isMousedown","startLine","endLine","startChar","endChar","realLineHeight","lineOffset","boxEnd","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","getCurrentCharColor","initAddedHandler","initRemovedHandler","initCursorSelectionHandlers","initDoubleClickSimulation","mouseMoveHandler","_initCanvasHandlers","_removeCanvasHandlers","_tick","_currentTickState","_animateCursor","targetOpacity","completeMethod","tickState","isAborted","_onTickComplete","_cursorTimeout1","_currentTickCompleteState","restart","delay","abortCursorAnimation","_cursorTimeout2","selectAll","getSelectedText","findWordBoundaryLeft","startFrom","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","direction","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditing","exitEditingOnOthers","initHiddenTextarea","_saveEditingProps","_setEditingProps","_textBeforeEdit","initMouseMoveHandler","getSelectionStartFromPointer","currentStart","currentEnd","__selectionStartOnMouseDown","restartCursorIfNeeded","fromStringToGraphemeSelection","smallerTextStart","graphemeStart","smallerTextEnd","fromGraphemeToStringSelection","newSelection","updateTextareaPosition","updateFromTextArea","_calcTextareaPosition","desiredPosition","compositionStart","upperCanvas","upperCanvasWidth","upperCanvasHeight","_savedProps","_restoreEditingProps","isTextChanged","_removeExtraneousStyles","removeStyleFromTo","styleObj","cursorStart","cursorEnd","lineStart","charStart","lineEnd","charEnd","shiftLineStyles","numericChar","clonedStyles","numericLine","insertNewlineStyleObject","copiedStyle","currentCharStyle","newLineStyles","somethingAdded","isEndOfLine","numIndex","styleCarriedOver","insertCharStyleObject","currentLineStyles","currentLineStylesCloned","numericIndex","newStyle","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","setSelectionStartEndWithShift","setSelectionInBoundaries","__lastClickTime","__lastLastClickTime","__lastPointer","__newClickTime","newPointer","isTripleClick","_stopEvent","__lastIsEditing","__lastSelected","initMousedownHandler","initMouseupHandler","initClicks","doubleClickHandler","tripleClickHandler","_mouseDownHandler","setCursorByClick","_mouseDownHandlerBefore","mouseUpHandler","currentActive","mouseOffset","prevWidth","_getNewSelectionStartFromOffset","distanceBtwLastCharAndCursor","distanceBtwNextCharAndCursor","onKeyDown","onKeyUp","onInput","copy","paste","onCompositionStart","onCompositionUpdate","onCompositionEnd","_clickHandlerInitialized","onClick","keysMap","9","27","33","34","35","36","37","38","39","40","ctrlKeysMapUp","67","88","ctrlKeysMapDown","65","keyCode","ctrlKey","metaKey","stopImmediatePropagation","_copyDone","fromPaste","removedText","removeFrom","removeTo","nextText","charCount","nextCharCount","charDiff","textareaSelection","backDelete","copiedText","copiedTextStyle","compositionEnd","_getClipboardData","clipboardData","_getWidthBeforeCursor","widthBeforeCursor","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","indexOnOtherLine","_getIndexOnLine","getUpCursorOffset","textBeforeCursor","charWidth","foundMatch","widthOfCharsOnLine","indexOnLine","leftEdge","rightEdge","offsetFromLeftEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","moveCursorWithShift","moveCursorWithoutShift","moveCursorLeft","_moveCursorLeftOrRight","_move","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","actionName","moveCursorRightWithShift","moveCursorRightWithoutShift","changed","removeChars","insertChars","multipleSpacesRegex","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","lineTop","textSpans","textTopOffset","textLeftOffset","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","styleDecl","shouldUseWhitespace","styleProps","fillStyles","dySpan","_pushTextBgRect","fillColor","_getSVGLineTopOffset","lastHeight","minWidth","dynamicMinWidth","__cachedLines","_wordJoiners","splitByGrapheme","_styleMap","_generateStyleMap","textInfo","realLineCount","realLineCharCount","isWrapping","nextOffset","shouldLimit","mapNextLine","_wrapText","desiredWidth","wrapped","_wrapLine","_measureWord","word","charOffset","_line","reservedSpace","words","infix","wordWidth","infixWidth","largestWordWidth","lineJustStarted","additionalSpace","linesToKeep","toggleLoyaltyPopover","state","fadeIn","fadeOut","toggleRememberPopover","fromLayer","checkRememberFlag","rememberMeFlagState","initNewsletterAnalyticsBrands","newsletterPreferenceBrands","formatDate","formatPattern","getDate","getMonth","getFullYear","accountLogin","accountRegister","accountLoyalty","resetPassword","checkoutLogin","checkoutRegister","editProfile","editPassword","userAgent","password","step","errorMsg","mainType","subType","rememberMe","sessionExpired","eventMode","htmlContent","redirectToHomepageInsteadClosing","onErrorHandler","rurlDynamic","enableLoginAnalyticsObserver","targetLoginNode","MutationObserver","mutationsList","observer","inputSet","Set","genericEventAlreadyFired","mutation","attributeName","fireGenericAnalyticsErrorEvent","fireSpecificAnalyticsErrorEvent","disconnect","childList","subtree","ready","turnLoginImg","submit","serialize","RegistrationHelper","isNewRegistrationActive","isUserLoyaltyForThisBrand","customerFidelitySubscriptions","isLoyaltyAvailable","reload","socialCustomer","socialLoginOpenForgotPasswordModal","email","FormHelpers","submitButtonAnalytics","resetPasswordForm","socialTitle","associationForm","querySelectorAll","hkCustomerId","clearPreviousErrors","stateObj","foo","history","pushState","isRegistrationModalFlow","customerInfo","nextStep","modalRegistrationStep","moveToNextStep","handleCustomerInfo","loadFormErrors","alreadyRegistered","targetLoyaltyNode","loyaltyObserver","checked","enableCTA","handleMyAccountFlow","loyalty","loyaltyPhysicalCard","cardValues","isRegistrationLoyaltyModalFlow","loyaltyFlagState","checkLoyaltyFlag","dataForm","phoneNumber","analyticsMode","type_reg","phone","fillPhoneText","fieldsFormPrefill","statusText","cardError","phone2Opt","birthDateError","fireSpecificEventModeAnalyticsErrorEvent","registrationFormObj","emailFromForm","fillEmailText","hiddenPhonePlaceholder","handleExistingAccount","bluColor","closeRegistrationOpenLoginInit","socialRegistrationError","targetRegistrationStep1Node","registrationStep1Observer","allForms","localIndex","generalTrackingEventAlreadyTriggered","targetRegistrationNode","registrationObserver","getElementsByClassName","alreadyTriggeredOnceForPrivacy","targetEmailPrivacyFlagsNode","privacyFlagsObserver","alreadyTriggeredOnce","targetNewsPrivacyFlagsNode","privacyNewsFlagsObserver","targetGenderFlagsNode","genderFlagsObserver","targetLoyaltyFlagsNode","loyaltyFlagsObserver","enableFinalRegistrationAnalyticsObservers","modalToClose","emailField","errorContainer","receivedMsgHeading","receivedMsgBody","mobile","returnUrl","buttonText","loginEmail","newsletterPrefAnalyticsRegister","brandName","$accordion","newsletterFormData","direktMarketingAgreement","profilingAgreement","form2","fdatepicker","disableDblClickSelection","leftArrow","rightArrow","closeIcon","closeButton","ev","datestring","getTimezoneOffset","formattedDate","checkPreferencesEnabled","$form","newPasswordInput","newPasswordConfirmInput","isPasswordFilled","isPasswordConfirmedFilled","changeEmailForm","$form3","parsley","validate","modalContent","f","errorChangeEmail","herokuError","sfccError","validDomainError","errorMessage","birthDate","physicalCardLoyaltyForCurrentCountry","loginResult","user","socialLogin","rurl","sfccRegisteredUser","socialName","PRODUCT_GRID_PLP","initProdTileCarousel","initSlotCarousel","QUICKADD_BUTTON","openQuickAdd","PREVENT_DEFAULT","onResizeFunction","QUICKADD_CLOSE","QUICKADD_PROCEEDBUTTON","QUICKADD_SIZEBUTTON","isOpened","STYLE_QUICKADD_SIZEBUTTON_SELECTED","QUICKADD_MODAL_OPEN","containerClassName","$this","$modal","$modalForSlider","isCompletePromo","genericAjaxCall","newDOMModal","closeQuickAddShoppable","prepareAddToCart","searchSelectedSize","openQuickAddShoppable","$quickAddOutsideModal","prepend","analytics","slideDown","closeQuickAdd","forceLockScroll","exc","forceUnlockScroll","slideUp","closeQuickButton","closeAllQuickAdd","allQAopen","selectSize","sizeButton","prepareData","makeAddToCart","dataValue","scrollRestoration","variableWidth","currentStage","closeLoginModal","Plugins","Customer","accountRegisterForm","accountLoyaltyForm","buttonSubmissionInit","buttonBackInit","datePickerInit","updateButtonStatusInit","singleNumberOTPinput","shiftFieldWhileTypingInit","proceedToRegistrationLoyaltyInit","gender","mobileNumber","firstName","lastName","fieldsForm","prefillCustomerData","prefillPrivacyFlag","directMarketingAgreement","otpCodeInput","formData","unmatchOtp","expiredOtp","closeRegistrationOpenLoginRegistered","loginAfterRegistration","$registrationModal","closeRegistrationOpenLogin","fieldsFormClear","forgotPassword","loginPassword","csrf_token","loginRememberMe","sanitizedInput","maxLength","currentInputIndex","nextInputIndex","nextInput","prevInputIndex","prevInput","fname","lname","confirmPassword","updateButtonStatus","isEmailFilled","isPhoneFilled","subscriptionNodeBrandCode","select","forms","foundation","validator","Parsley","addValidator","validateString","excluded","en","Resources","payments","mandatoryField","errorClass","successClass","errorsWrapper","errorTemplate","$element","label","$tileCarousel","IMAGE_CONTAINER_CAROUSEL_CLASS","lazyloadclass","lazyVideos","lazyVideoObserver","IntersectionObserver","entries","isIntersecting","videoSource","dataset","unobserve","lazyVideo","previousLabel","nextLabel","lazyLoad","draggable","accessibility","showQuickview","observeQuickBuy","productUrl","destroyModal","fillModalElement","newModal","actualDiv","notifyMeAction","notifyMeDiv","paramUrl","innerText","quickAddFlow","rsp","productName","cta","isValid","validateEmail","queryString","analyticsSku","owner","messageComingSoon","duplicate","carousel","swipe","swipeToSlide","touchMove","gotoPDP","startCarouselTileImage","afterAttributesSelectionEvent","additionalData","newPriceData","checkCarouselLength","carouselContainer","carouselWidth","outerWidth","carouselItemsNumber","carouselItemsWidth","carouselItemsWidthSum","carouselScrolled","carouselScroll","dir","customizePosition","customizeSide","customizeText","customizeFont","customizePattern","customizeColor","allowedCharactersRegex","canvasText","canvasRect","canvasGroup","canvasImage","topBack","leftBack","badWords","loadingTime","isStepTwo","rectColor","switchDisable","initText","textInput","SELECTORS","fontsButtons","colorsButtons","initVariables","pixelText","initCanvas","imageToLoad","imgFront","transformX","transformY","personalizationCanvas","transformOrigin","zoomButton","canvasRatio","initForm","updateCanvasElem","elem","choicePosition","page","mainChoice","showOtherSide","stepOne","stepTwo","termsBottomDesktop","CLASSES","pageStepOne","pageStepTwo","selectPosition","imgBack","hotspotOne","hotspotTwo","updateCanvas","defer","imagesNumber","loadComplete","jQuery","Deferred","one","promise","imageFront","imageBack","topPercentage","leftPercentage","topBackPercentage","leftBackPercentage","$position1","$position2","backChoicePosition","personalizeAddToCart","canvasOptions","svgAllFormat","generateSvgForOTP","base64FullSVG","base64TextFullSVG","base64TextSmallSVG","termsAndConditionsModal","analyticsCustomizeAction","pageClose","positionChoice","badWordsFlag","editTextOnCanvas","colorName","scaleValue","base64","ieee754","kMaxLength","TYPED_ARRAY_SUPPORT","RangeError","__proto__","arg","encodingOrOffset","allocUnsafe","TypeError","byteOffset","byteLength","fromArrayLike","fromArrayBuffer","isEncoding","actual","write","fromString","isBuffer","assertSize","isView","loweredCase","utf8ToBytes","base64ToBytes","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","bidirectionalIndexOf","arrayIndexOf","indexSize","arrLength","valLength","read","buf","readUInt16BE","foundIndex","found","hexWrite","remaining","strLen","utf8Write","blitBuffer","asciiWrite","byteArray","asciiToBytes","latin1Write","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","fromByteArray","res","secondByte","thirdByte","fourthByte","tempCodePoint","firstByte","codePoint","bytesPerSequence","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","decodeCodePointsArray","SlowBuffer","alloc","INSPECT_MAX_BYTES","subarray","typedArraySupport","poolSize","_augment","species","configurable","allocUnsafeSlow","_isBuffer","compare","swap16","swap32","swap64","equals","inspect","thisStart","thisEnd","thisCopy","targetCopy","isFinite","_arr","ret","out","bytes","checkOffset","checkInt","objectWriteUInt16","littleEndian","objectWriteUInt32","checkIEEE754","writeFloat","noAssert","writeDouble","newBuf","sliceLen","readUIntLE","mul","readUIntBE","readUInt8","readUInt16LE","readUInt32LE","readUInt32BE","readIntLE","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUIntLE","writeUIntBE","writeUInt8","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","INVALID_BASE64_RE","Infinity","leadSurrogate","toByteArray","stringtrim","base64clean","b64","lens","getLens","validLen","placeHoldersLen","tmp","Arr","_byteLength","curByte","revLookup","uint8","extraBytes","maxChunkLength","len2","encodeChunk","lookup","num","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","NaN","rt","LN2","createSvgFromCanvas","canvasToConvert","svg","canvasNode","computeCurrentlyVisibleImage","handleDetailsTabs","clickedTab","openQuickView","modalClass","setMinHeightPromoPanel","_array","_array2","maxHeightTitle","crossSellItems","getProductVariationGroup","requestUrl","isSizeChange","$result","$completePromoData","$completePromoSection","$completePromoProducts","$completePromoContainer","$completeLookData","$completeLookSection","$completeLookProducts","quickview","closeAllOpenMenus","removeNulls","updatePrimaryImagesSlide","enableImageSlideHeightObservers","imgNode","slickNode","initializePrimaryImagesSlider","primaryImages","carouselItems","ProductHelpers","showSpinner","updateAttribute","updateAddToCart","getCrossSellItems","afterUpdateImages","recentlyViewedItems","buyNowQuichview","suggedtedProductsPDP","observeCurtainTap","removeNullCrossSell","pdpCrossSell","handleAccordionsInPDP","changeAddToBagButton","$buyNowCta","initProductTile","cs","$csItem","$detailsAccordionShipping","$detailsAccordionDescription","basketBeforeRemovedProduct","basketObserverEnabled","basketAlreadyFetched","addSmartGift","enableAnalyticsBasketObserver","analyticsDataButton","basketButtonsSelector","SGBasket","getSkus","getSkusQuantity","eachSuggestion","dataSuggestion","suggestionLength","suggestionItem","infoSuggestion","imgSuggestion","hrefSuggestion","skuCode","skuUrl","recommendedItems","nameEng","addRecommendedItems","addItem","basket","removedProduct","targetWidgetNode","setAnalyticsProductIndex","getBasket","productIndex","triggerRemoveProduct","needle","qsKeyToUpdate","urlObject","qsKey","qsValue","replaceState","Analytics","helper","quickImpressionSender","logName","testMode","globalContainer","helperContainer","inline","openBonusModal","freeGlobal","freeSelf","accordionElement","_closeAllAcordion","closeAllAcordionItems","_closeActiveAccordion","closeActiveAccordion","$item","$content","closeAllOpenPanels","closeActivePanel","progress","$accordionContainer","$accordionItem","isObject","toNumber","nativeMax","nativeMin","func","wait","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","thisArg","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","cancel","flush","baseTrim","isSymbol","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","isBinary","trimmedEndIndex","reTrimStart","reWhitespace","baseGetTag","isObjectLike","getRawTag","objectToString","symToStringTag","objectProto","nativeObjectToString","isOwn","tag","unmasked","initNextButton","initPrevButton","enableNextButton","initCheckboxes","clickedElement","$isOutsideClicked","openExitModal","checkboxesChecked","currentStep","preferences","analyticsData","categories","subcategories","isLastStep","isFinalEditStep","callSavePreference","applyDependences","allSectionsValid","sections","moveToPrevStep","lastStep","mainPageUrl","$mappingContainer","getCurrentStep","dependencies","getCurrentStepDependencies","currentStepIndex","dependenciesCodes","checkbox","loyaltyPageUrl","raf","processInclude","ProfileEnrich","initOutsideClickHandler","Header","Geoblock","Footer","Menu","Minicart","PromoStrip","Prehome","enqueueTask","Accordion","setup","AccordionPdp","Scroller","PrimaryImagesScroller","HomepageComponents","AnalyticsHelper","PrivacyPopUpFlag","closeButshipping","debounce","JS_ELEM","openSearchModal","CC_ELEM","emailPattern","containsEmail","searchString","validateInput","lockScroll","closeSearchModal","selectMainCategory","clearAllInput","debounceSuggestions","prepareGetSuggestion","addEventSearchModal","getSuggestions","unlockScroll","alternativeCategory","catSelectionCookie","getCookie","currentDate","setDate","expiryDate","toUTCString","suggestionsUrl","newDom","slide","associatedClass","listType","input","toggleCountrySelector","toggleLanguageSelector","registerEvents","multilanguageSubmit","newsletterForm","webFormRequest","orderStatusForm","cookieBannerHandler","cookieBannerCloseHandler","ExternalScript","WebFormRequest","storeLocator","cookieExists","Multilanguage","NewsletterPopup","newsletterEmail","showPopup","newsletterEmailContacts","scrollHeight","$clickedCheckbox","locale","KAMPYLE_ONSITE_SDK","showForm","lock","fixRequired","SitePreferences","NewsletterPopupExpiryDays","_initWebformRequest","recaptchaSiteKey","grecaptcha","tabContent","errors","isWorldWebsite","woosmapInitFooter","geometry","lat","lng","long","updatedAction","appendToUrl","firstVisitNewsletterPopUp","showNewsletterPopup","Urls","getNewsletterPopup","onPopupClose","imagePopUp","newsletterTitle","proceedStepZeroMobile","proceedStepZeroDesktop","stepZero","newsletterGender","stepOnePointOne","proceedStepOnePointOne","stepOnePointTwo","proceedStepOnePointTwo","newsletterEmailVal","newsletterEmailValContacts","newsletterStep","confirmSubscription","checkPromotionOne","checkPromotionTwo","backStepOnePointOne","alreadySubscribed","registeredEmail","newsletterPopupControl","elementName","$errorLocation","NewsletterPopupEnabled","NewsletterPopupDelay","popupPrivacyPolicyListener","deleteCookie","external","liveChatConfig","legacyScript","liveagentInitLegacy","chatId","onlineBtn","liveagentInit","proactiveChatInit","getChatId","liveChatContainer","scriptContainer","livechatConfigElement","liveagent","addCustomDetail","customerName","customerEmail","liveChatCurrentCountry","initParam1","initParam2","initParam3","_laq","showWhenOnline","staticChatId","showWhenOffline","openLiveChat","mutations","embedded_svc","menu","initESW","initUrl","script","chat","paramName","paramMail","paramBrand","paramCountry","initParam4","pageName","appendEmbeddedStyling","paramMobPosition","styleEmb","isProductionEnvironment","showMultilanguagePopup","getMultilanguagePopup","newModalWithSelector","MultilanguagePopupExpiryDays","isTouchDevice","question","defaultLabel","$select","selectedType","getSelectedType","subtype","getSelectedSubtype","$inputs","enableButtonListener","fromModal","responseSuccess","responseError","observeSelection","observeFormSubmit","captcha","contactName","contactLastName","contactEmail","contactQuestion","contacDespription","contactType","contactSubType","contacOrder","$itemclose","_toggleAccordionStatus","woosmapInitFindYourStoreMenu","openLeftMenu","closeMenu","selectedCategory","appendHtml","categorySelected","categoryBlockActive","openFirstLevelCategory","switchGender","subCat","subCatID","subCatBlock","goBacktoFirstLevelCategories","topLevelCat","topLevelCatActive","topLevelCatID","block","varUrl","allCategoryColumns","categoryId","putIn","getIn","getHtml","updateWishlistCounter","layerLogin","animateHeaderOnScroll","changeLogosPosition","setPageOnDOMLoaded","setPopupOnHoverTopPosition","setWishlistMinicartCounterOnDOMLoaded","setVideoWallButtons","modalLoyaltyRegistrationInit","resendActivationEmail","toggleVisiblePassword","total","$counter","currentPage","isLayerLoginDisabled","isFromCart","modalRegistrationInit","accountLoginForm","e1","socialLoginHandler","sovraHeaderHeight","headerHeight","dashboardHeight","setProperty","positionTop","back","onScroll","ticking","scrollY","requestTick","update","timer","addedAnother","setMiniCartOpen","createErrorNotification","errorHtml","hideMiniCart","fromWishlist","miniCartModal","forceShowMinicart","needsUpdate","locationIsCart","personalizationImageSrcMiniCart","formSymbolType","symbol","spinStopped","centerMode","bonusProductModalListener","orig","scrollBy","triggers","renderRicamo","updateQuantity","productListeners","bonusProductListeners","applicablePromotion","$minusInput","selectedAllocation","$plusButton","$addToCartButton","isManPromo","promoPrice","promoPriceItemsTotal","showResidualToTrigger","loadHead","poductsAdded","triggeringAmount","minicartModal","isLoyalPromo","cartApplicablePromo","newModalWithOptions","currentlyOpenedModal","valuesAllocations","$productItem","$productItemcopy","$productItemAdd","count","isNumeric","QuickUpdate","getBonusProductModal","UUID","pliUUID","totalCount","uniqueIdentifierPers","uniqueIdentifierNew","addAnotherProductFromMiniCart","actionUrl","removeProductFromMiniCart","outDiv","productData","remove_type","bonusProductIdRemoveAction","preselectedSize","noedit","chooseBonusProducts","updateImageChooseBonusProductModal","updateProceedButtonQuickUpdateModal","skuOld","updateProceedButtonChooseBonusProductModal","bonusUrl","bonusChoiceRuleBased","showProductsUrlRuleBased","showProductsUrlListBased","parseHtml","promotionDetails","isMobile","$modalContainer","bonusProductItems","bpi","isVariant","selectedColorUrl","selectedColorSwatchHTML","initChooseBonusProductModal","closeBonusProductModal","newProductId","pliuuid","proceedChooseBonusProduct","backChooseBonusProduct","pidsObject","bonusProducts","totalQty","bonusProductPid","pids","_setupBonusProductsListeners","accordion","setBonusProductModal","products","updateAttrsQuickUpdate","isSoldOut","isMobileDevice","processSwatchValuesQuickUpdate","$anchor","processNonSwatchValuesQuickUpdate","handleVariantResponseQuickUpdate","isChoiceOfBonusProducts","isChooseBonusProductModalOpen","attributeSelectQuickUpdate","isQuickUpdateFromModal","QuickUpdateSingleton","_init_","quickUpdateListener","quickUpdateProduct","showFreeGiftDetails","updateProductUrl","amountSelectorOk","destinationName","destinationMail","senderName","amount","dateString","imgUrl","imgCodes","shippingDate","imageCode","oldSku","msg","sizeDropdown","promotionType","$anchorTarget","productSku","dataAttributes","moveModalCloseButton","getInstance","analyticsHelper","manager","screenWidth","screenHeight","orientation","isPortrait","isHighResolution","analyticProviders","pushPDPData","prepareHeaderObservers","prepareMenuObservers","preparePerfectBraObservers","prepareSearchObservers","prepareNewsletterObservers","observeWishlistChanges","handleContactUs","handleUnsubscribePhone","observeFooterChanges","observeProductChanges","prepareScalaPayObservers","prepareKlarnaObservers","prepareAfterpayObservers","observeSoldOutPopupChanges","prepareGiftcardObservers","observeContentChanges","observeOrderChanges","observeSplashPageChanges","observeMadeInClick","handleBuyGiftCard","handleSmartGift","handleVideoInteraction","handleRatingAndReviewsPdp","handleRatingAndReviewsForm","prepareNeedHelpObservers","prepareEcoChoiceObservers","prepareTrackYourOrderObservers","preparePersonalAreaNavigationOrderSectionObservers","cookiePolicyObservers","replaceTagsPrivacyConsentModal","prepareVWObservers","rawProduct","productBaseInfo","productGender","productVariant","item_name","item_brand","item_category","categoryPath","item_category2","item_category3","secondLevelCategory","item_category4","thirdLevelCategory","item_category5","fourthLevelCategory","item_on_sale","item_availability","item_color","colorFamilyEng","item_sfcc","item_customization","item_sustainable","discount","getPDPInfo","URLSearchParams","assign","searchAttributionToken","ss_event_id","ecommerce","pushMenuIconOnVW","pushMenuGenderVW","pushMenuCategoryVW","menuId","elementsToHandle","addedNodes","searchObject","pushSearchInteractionForVW","attributeFilter","pushHeaderClickInteractionFor","pushSearchInteraction","pushMainMenuClickInteraction","pushPerfectBraModelInteraction","pushMenuItemClickInteractionFor","pushMenuContentClickInteraction","voice","pushOutOfMenuClickInteraction","pushSearchFilterSelectInteraction","filterIsInUse","refinementsChecked","orderType","pushSearchSortInteraction","section","pushSearchLiveSuggestionResults","pushSearchOnCloseBtn","errorEmailOne","pushNewsletterError","pushNewsletterStep1","pushNewsletterStep2","errorGender","errorPrivacy","joinedErrors","pushNewsletterUnsubscribe","pushNewsletterStep3","checkValidity","getResponse","pushContactUsInteraction","pushUnsubscribePhone","pushAddToWishlistInteraction","pushRemoveFromWishlistInteraction","pushSocialClickInteractionFooter","pushPreFooterCtaClick","pushFooterLinkClickInteraction","pushProductChangeImageInteraction","pushProductChangeColorInteraction","getProductFromRaw","isFreeGist","pushProductChangeSizeInteraction","pushProductStyleAndGuidesClickInteraction","pushProductDetailPageGuideInteraction","pushProductInformationalMenuChange","pushProductZoomInteraction","sizeList","ind","sizeListPdp","sizeNotAbailableNotifyMe","sizeNotAvailableNoNotifyMe","notAvailable","isNotAvailable","pushSelectSize","pushCustomizeProduct","pushCustomizeProductAction","pushFindStoreFindInteraction","pushFindStoreGeolocationImpression","pushFindStoreGeolocationImpressionCheckout","skuList","skuListPdp","pushLoyaltyCta","pushPromoAncor","pushShopTheLook","pushCompleteThePromoInteraction","pushFindOutMoreTraceabilityInteraction","pushSearchNearestStorePDP","pushNotifyMeSoldOutSize","pushActionsOnTheNotifyMePopup","pushCheckAvailabilitySoldOutSize","pushCheckAvailabilityChangeSize","isDispo","pushFindInStoreForNotAvailableProductInteraction","pushFindInStoreForAvailableProductInteraction","pushNotfyMeCtaClickSoldout","pushScalaAndKlarnPayModalInteraction","pushAfterpayModalInteraction","giftcardCheckBalance","pushActionOnTheBottoms","pushCancelYourOrderInteraction","orderId","pushCancelYourOrderInteractionAction","pushSplashPageChanges","plant","eventID","eventname","product_id","pushReadTheWholeInterview","pushMadeInPlantInteraction","project","pushMadeInTheProjectsInteraction","eventId","ctaName","pushHandleGiftCard","pushSmartGift","pushSmartGiftBasketInteraction106","pushSmartGiftBasketInteraction107","pushSmartGiftBasketInteraction108","pushSmartGiftMoreInfo","generateAnalyticsSku","pushVideoPlayEvent","pushVideoPauseEvent","pushVideo25Event","pushVideo50Event","pushVideo75Event","pushFullVideoEvent","pushRatingAndReviewsInteraction101","formattedName","pushRatingAndReviewsInteraction102","overallRating","sizeRating","qualityRating","comfortabilityRating","pushRatingAndReviewsInteraction103","pushRatingAndReviewsInteraction104","pushReviewsButtonOnPdpInteraction","stars","pushLikeDislikeToReview","pageType","pushBubbleClickInteraction","pushESWInteraction","privacyNews","privacyCustomNews","pushPrivacyPolicyPopUP","frequentlyUser","refundPageselector","pushEcoChoiceClick","transactionID","pushTrackYourOrder","pushPersonalAreaNavigationOrderSection","pushCookieBanner","targetNode","isBannerChanged","isPrivacyConsentChanged","modalPrivacyConsent","replaceElementIfExists","modalBanner","oldElement","newTag","newElement","requestType","social","gcType","gcCode","ctaClicked","pushLoginInteraction","pushRegisterInteraction","pushRegisterInteractionTelephone","pushRegisterInteractionPersonalData","typeReg","pushRegisterConfirmInteraction","pushRegisterConfirmInteractionDoubleOptin","pushRegisterInteractionLoyaltyRegistration","pushUpdateAddress","eventAction","pushSubmitUpdateAddress","pushLoginOrRegistrationError","pushAddCreditCard","pushSaveCreditCard","pushUpdateCreditCard","pushRegisterInteractionLoyalty","flow","pushRegisterInteractionLoyaltyStep2","pushRegisterInteractionLoyaltyStep3","pushRegisterInteractionLoyaltyStep4","pushRegisterInteractionLoyaltyStep5","pushRegisterInteractionLoyaltyStep6","pushLoyaltyUnsubscribeInteraction","pushRegisterLoyalty","userID","pushSocialRegistrationInteraction","pushSocialRegistrationStep1Interaction","pushSocialRegistrationStep2Interaction","pushSocialRegistrationStep3Interaction","pushSocialRegistrationThankYouInteraction","pushSocialRegistrationConfirmInteraction","pushPersistentLoginTooltipInteraction","pushRatingAndReviewsTabsInteraction","topic","pushNavigationRelatedToMyAccount","pushNewsletterPreferenceSave","brandCodes","pushMyAccountRemoveConfirmation","pushSaveToWallet","walletType","pushProfileEnrichmentLoyaltyOnly","pushProfileEnrichmentLoyaltyOnlyStep01","choice","pushProfileEnrichmentLoyaltyOnlyStep02","pushProfileEnrichmentLoyaltyOnlyStep03","pushProfileEnrichmentLoyaltyOnlyStep04","pushProfileEnrichmentLoyaltyOnlyFinished","pushProfileEnrichmentLoyaltyOnlyLeavingSurvey","pushProfileEnrichmentLoyaltyOnlyEditingPreferences","pushCheckoutButtonsFromCartInteraction","pushCartAppliedCouponCode","btnAction","where","pushShippingMethodsMoreInfo","pushMinicartCheckoutClickInteraction","pushExpressCheckoutClickInteraction","pushFastShippingMethodClickInteraction","pushFastPaymentClickInteraction","pushChangeShippingFastInteraction","pushProductsInsideGiftWrap","productsname","pushGiftKit","pushShippingMoreInfo","pushPaymentMoreInfo","pushOrderReviewProceed","pushOrderReview","pushMinicartInteraction","pushBeginCheckout","effect","errorStep","errorType","formatPromotionForAnalytics","promotionsToSend","objToPush","creative","pushPromotionListImpression","pushPromotionClickImpression","promotion","promotionToSend","pushInfoBannerClickImpression","pushCustomerServiceItemClick","pushCustomerServicePopularQuestionItemClick","pushCustomerServiceItemExpand","zipCode","when","skuSplit","skuMoreSize","pushFindStoreClickResultAction","storeName","getFormattedSkuForAnalytics","splitSku","payment","pushRefundOptionMotivationSelect","motivation","pushRefundOptionShippingMethod","shippingMethod","pushRefundOptionPaymentMethod","paymentMethod","pushRefundOptionConfirmation","priceTotal","priceValue","itemCustomization","oldCart","toRemoveQuantity","prepareObservers","setListPathObservers","itemsInCart","bonusProduct","editedProductId","itemColor","bonusPromotion","getAddType","googleSearchContainer","allAddToCartItems","getGiftcardFromRaw","order","rawItem","listName","cartInteractionProductList","cartInteractionProduct","getRemoveType","analyticsProducts","pageData","outerDiv","varianturl","pushRemoveFromCartInteraction","couponCode","pushAddToCartInteraction","updateCartAbandoned","pushAddToCartGiftCardInteraction","pushCartGiftWrapInteraction","pushGiftKitInteraction","pushUserRemovedAllItems","pushRemoveAllFromCartInteraction","pushRemoveFromCartData","pushLoyaltyCoupon","pushAddAllToCartWishlistInteraction","localStorageListType","getListType","checkoutStages","paymentMap","stageEventMap","getPaymentMethod","rawMethod","mapped","isCart","isShipping","pushChangeStep","wSetupEvent","pageTemplate","pushLandingInteraction","prepareCartInteractionObservers","discounts","stage","giftkitCard","giftkitCardQuantity","giftkitTotal","extrascost","savedKlarna","giftwrappedProducts","purchaseData","epid","pushForStage","pushFinalStage","storageSelectedPaymentMethod","selectedPaymentMethodId","selectedShippingMethod","giftcardActive","selectedPaymentMethod","selectedPaymentMethodMapped","giftCardNumber","newCountry","previousCountry","handleNextStage","applyGiftCard","removeGiftCard","checkGiftCard","handleAddressInteraction","lastAction","pushSubmitUpdateAddressInteraction","confirmChangeCountryInCheckout","changeCountryInCheckout","applyGiftWrapOrPaper","shippingType","prepareMinicartObservers","prepareObserversRegistration","prepareErrorObservers","pushRegisterConfirmInteractionLoyalty","pushRegisterConfirmInteractionSocial","removeItem","pushRegisterConfirmInteractionDoubleOptinLoyalty","pushRegisterConfirmInteractionDoubleOptinSocial","prepareAccountObservers","prepareObserversSocialRegistration","prepareSavingCardObservers","prepareAccountNavigationObservers","prepareSaveToWalletObservers","prepareProfileEnrichObservers","anyErrors","loyaltyMethod","userId","brands","registrationMethod","socialFirstStepMail","getTopic","descriptionPreferences","amountOfPreferences","tempPreferences","tempPreferences4Letters","checkForSpaces","subcategory","subcategory4Letters","amountOfSubcategory","tempSubcategory","tempSubcategory4Letters","checkForSpacesSubcategory","promotion_id","promotion_name","creative_name","getPromotionItem","fillPositions","getPromotionsList","tab","pushClickInteraction","triggerEventForRefundFlow","prepareStoresObservers","city","stores","store","getSortingType","sortingContainer","lists","indexes","analyticsDataContainer","pushedSlickSlides","pushedItems","completeYourLookPushedItems","cmBestSellersPushedItems","cmNewArrivalsPushedItems","pushedSkus","pushedHomeSkus","pushedRecentlySkus","listsAvailable","pushedIndexes","pushIndexesFor","prepareProductObservers","pushAllLists","prepareBestSellersObservers","prepareTilesObservers","searchContainer","associatedObject","listing","fillListData","fillAllListData","itemListName","itemListId","currentSlide","nextSlide","allActive","totalProductsNumber","allActiveCmProducts","getInfo","itemsToPush","searchEventTrigger","pushObjectMax","pushData","clickedContainer","additionalDataContainer","googleTokenContainer","productsDetail","bonusUnitPriceValue","item_category1","item_size","fifthLevelCategory","checkVisibility","hasPrice","skippedProducts","elementsToAdd","analyticsItems","analyticsItem","pushSelectInteraction","alreadyStart","pushSelectQuickViewInteraction","pushSelectInteractionInCart","itemToProvide","recentlyViewed","prepareEinsteinRecentlyProducts","pushList","dataGiftcard","triggerOnlyOnce","prepareEinsteinProducts","pushBonusProductDetails","dataArray","analyticsDivElements","nItems","returnFormatedPaymentMethod","prepareRefundObservers","itemSkus","doubleRun","productLineItems","productsInfo","productInfoLineItem","productLineItem","returnDataForProduct","returnReasonId","refundMotivation","selectedRefundMethod","orderNo","orderID","lastCountryVisitedKey","isBannerVisible","observeCloseButton","countryCheck","updateBubbleChatPosition","updateSmartGiftBasketButton","getCurrentCountry","lastCountryVisited","nameEQ","ca","readCookie","physicalCountry","getPhysicalCountry","$bubbleChat","newBottomValue","checkWidget","setInterval","clearInterval","tabComponents","autoplaySpeed","tabId","$tab","beforeScroll","policyPrivacyFlag","day","firstEnter","date1","optanonConsent","cookieOpta","optanonConsentSplit","groupSplit","openPopUP","dataUser","modalP","profilengAgreement","directMarketingAgreementFlag","initialPaddingTop","initStripSlider","pageElement","initialPagePaddingTop","offsetHeight","pagePaddingTop","promoStripElement","activeSlideSelector","todaysPromoTitleSelector","leftSlideSelector","imageWrapperSelector","activateTodaysPromoImageTitleCursor","progressBarTopInitial","changeSlideButtonTopInitial","progressBarSelector","changeSlideButtonSelector","rightSlideSelector","shadowBoxSelector","productsGridSelector","shadowBoxTopInitial","imageWrapperTopInitial","moveLeftSlideImage","progressBarTopOffset","shadowBoxTopOffset","imageWrapperTopOffset","moveSliderNavigationButtons","changeSlideButtonTopOffset","previousScroll","applyStickyBehaviorForSlider","currentScroll","activeSlideProductsGridHeight","activeSlideImageWrapperTop","activeSlideImageWrapperHeight","imageIsInsideTheContainer","adaptiveHeight","updateTodaysPromoImages","buttonTotalHeight","imageHeightDecrease","imageHeight","leftSlideMarginLeft","updateTodaysPromoTitleAndProgressBar","smooth","lastSlideCover","slideCountCover","optionsCover","sliderBlockedForScrolling","sliderBlockedTimeout","onSliderWheel","$currentSlider","currentSlickIndex","vertical","speed","slideCount","hammer","Hammer","Manager","Swipe","hammerRed","swipeRed","magnetiSliderHandler","pixelsToAdd","newSliderHeight","slider","showArrows","$slides","refresh"],"mappings":"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","file":"main.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 127);\n","import tingle from 'tingle.js';\n\n/* eslint-disable new-cap */\n\n/**\n * This function retrieves another page of content to display in the content search grid\n * @param {Boolean} footer - HTML string\n * @return {Tingle} - https://robinparisi.github.io/tingle/\n */\nconst newModal = (footer, cssClass = []) => {\n // set optionts\n const modalOptions = {\n closeMethods: ['overlay', 'button', 'escape'],\n cssClass,\n onClose: () => {\n modal.destroy();\n },\n onOpen: () => { $('html').addClass('html-tingle-enabled'); },\n beforeClose: () => {\n if (($('.jsPersonalizationToolModal.tingle-modal--visible').length <= 0) || ($('.tingle-modal.tingle-modal--visible').length < 2)) {\n $('html').removeClass('html-tingle-enabled');\n }\n return true;\n }\n };\n if (footer) { modalOptions.footer = true; };\n\n // create modal\n const modal = new tingle.modal(modalOptions);\n\n return modal;\n};\n\n/**\n * This function retrieves another page of content to display in the content search grid\n * @param {String} selectorID - ID of the modal DOM element to clone\n * @return {Tingle} - https://robinparisi.github.io/tingle/\n */\nconst newModalFromSelector = (selectorID, footer, cssClass = [], onClose = null) => {\n // set optionts\n const modalOptions = {\n closeMethods: ['overlay', 'escape'],\n cssClass,\n onClose: () => {\n modal.destroy();\n if (typeof onClose === 'function') {\n onClose();\n }\n },\n onOpen: () => { $('html').addClass('html-tingle-enabled'); },\n beforeClose: () => {\n if (($('.jsPersonalizationToolModal.tingle-modal--visible').length <= 0) || ($('.tingle-modal.tingle-modal--visible').length < 2)) {\n $('html').removeClass('html-tingle-enabled');\n }\n return true;\n }\n };\n if (footer) { modalOptions.footer = true; };\n\n // create modal\n const modal = new tingle.modal(modalOptions);\n\n // clone content\n if (selectorID) {\n const contentModal = document.getElementById(selectorID);\n if (contentModal) {\n modal.setContent(contentModal.innerHTML);\n }\n }\n\n return modal;\n};\n\n/**\n * This function retrieves another page of content to display in the content search grid\n * @param {String} html - HTML string\n * @return {Tingle} - https://robinparisi.github.io/tingle/\n */\nconst newModalFromString = (html, footer, cssClass = [], onOpen, onClose) => {\n // set optionts\n const modalOptions = {\n closeMethods: ['overlay', 'button', 'escape'],\n cssClass,\n onClose: () => {\n modal.destroy();\n if (typeof onClose === 'function') {\n onClose();\n }\n },\n onOpen: () => {\n $('html').addClass('html-tingle-enabled');\n if (typeof onOpen === 'function') {\n onOpen();\n }\n },\n beforeClose: () => {\n if (($('.jsPersonalizationToolModal.tingle-modal--visible').length <= 0) || ($('.tingle-modal.tingle-modal--visible').length < 2)) {\n $('html').removeClass('html-tingle-enabled');\n }\n return true;\n }\n };\n if (footer) { modalOptions.footer = true; };\n\n // create modal\n const modal = new tingle.modal(modalOptions);\n\n // add content\n if (html) {\n modal.setContent(html);\n }\n\n return modal;\n};\n\n/**\n * This function creates a modal starting from supplied options\n * @return {Tingle} - https://robinparisi.github.io/tingle/\n */\nconst newModalWithOptions = (modalOptions) => {\n // create modal\n const modal = new tingle.modal(modalOptions);\n\n return modal;\n};\n\n// modal with forced choice\nconst newModalWithSelector = (html, footer, cssClass = [], onOpen, onClose) => {\n // set optionts\n const modalOptions = {\n closeMethods: [],\n cssClass,\n onClose: () => {\n modal.destroy();\n if (typeof onClose === 'function') {\n onClose();\n }\n },\n onOpen: () => {\n $('html').addClass('html-tingle-enabled');\n if (typeof onOpen === 'function') {\n onOpen();\n }\n },\n beforeClose: () => {\n if (($('.jsPersonalizationToolModal.tingle-modal--visible').length <= 0) || ($('.tingle-modal.tingle-modal--visible').length < 2)) {\n $('html').removeClass('html-tingle-enabled');\n }\n return true;\n }\n };\n if (footer) { modalOptions.footer = true; };\n\n // create modal\n const modal = new tingle.modal(modalOptions);\n\n // add content\n if (html) {\n modal.setContent(html);\n }\n\n return modal;\n};\n\n/**\n * This class creates a modal without copying or moving any HTML,\n * but simply showing and hiding an existing Node.\n * This is to avoid problems with manipulated elements such as Google Maps\n */\nclass ModalShowHide {\n constructor (selector = '', newModalType, toPropagateClick, classToPreventHide) {\n this.$el = $(selector);\n this.selector = selector;\n this._scrollposition = 0;\n this.toPropagateClick = toPropagateClick;\n this.classToPreventHide = classToPreventHide;\n if (newModalType) {\n this.isOpenTypeCustom = false;\n } else {\n this.isOpen = false;\n }\n\n this.events();\n }\n\n show (newModalType) {\n if (newModalType) {\n if (this.isOpenTypeCustom) {\n return;\n }\n this.isOpenTypeCustom = true;\n } else {\n if (this.isOpen) {\n return;\n }\n this.isOpen = true;\n }\n\n // mimic tingle scroll lock\n this._scrollPosition = window.pageYOffset;\n $('body').addClass('tingle-enabled');\n $('html').addClass('html-tingle-enabled');\n this.$el.parent('.tingle-modal').addClass('tingle-modal--visible');\n }\n\n hide (newModalType) {\n if (newModalType) {\n if (!this.isOpenTypeCustom) {\n return;\n }\n this.isOpenTypeCustom = false;\n } else {\n if (!this.isOpen) {\n return;\n }\n this.isOpen = false;\n }\n\n // mimic tingle scroll lock\n if (($('.jsPersonalizationToolModal.tingle-modal--visible').length <= 0) || ($('.tingle-modal.tingle-modal--visible').length < 2)) {\n $('body').removeClass('tingle-enabled');\n $('html').removeClass('html-tingle-enabled');\n window.scrollTo(0, this._scrollPosition);\n }\n this.$el.parent('.tingle-modal').removeClass('tingle-modal--visible');\n }\n\n events () {\n $('body').on('click', '.tingle-modal', (e) => {\n if ($(e.target).hasClass('tingle-modal') || !$(e.target).closest(this.classToPreventHide)) {\n var newModalType = $(e.target).data('modalType') || null;\n this.hide(newModalType);\n e.stopPropagation();\n }\n });\n $('body').on('click', '.modal-close', (e) => {\n var newModalType = $(e.target).data('modalType') || null;\n this.hide(newModalType);\n e.stopPropagation();\n });\n\n if (!this.toPropagateClick) {\n $('body').on('click', this.selector, (e) => {\n e.stopPropagation();\n });\n }\n }\n};\n\nexport {\n newModal,\n newModalFromSelector,\n newModalFromString,\n newModalWithOptions,\n ModalShowHide,\n newModalWithSelector\n};\n","!function(t,o){\"function\"==typeof define&&define.amd?define(o):\"object\"==typeof exports?module.exports=o():t.tingle=o()}(this,function(){function t(t){var o={onClose:null,onOpen:null,beforeOpen:null,beforeClose:null,stickyFooter:!1,footer:!1,cssClass:[],closeLabel:\"Close\",closeMethods:[\"overlay\",\"button\",\"escape\"]};this.opts=r({},o,t),this.init()}function o(){this.modalBoxFooter&&(this.modalBoxFooter.style.width=this.modalBox.clientWidth+\"px\",this.modalBoxFooter.style.left=this.modalBox.offsetLeft+\"px\")}function e(){this.modal=document.createElement(\"div\"),this.modal.classList.add(\"tingle-modal\"),0!==this.opts.closeMethods.length&&this.opts.closeMethods.indexOf(\"overlay\")!==-1||this.modal.classList.add(\"tingle-modal--noOverlayClose\"),this.modal.style.display=\"none\",this.opts.cssClass.forEach(function(t){\"string\"==typeof t&&this.modal.classList.add(t)},this),this.opts.closeMethods.indexOf(\"button\")!==-1&&(this.modalCloseBtn=document.createElement(\"button\"),this.modalCloseBtn.classList.add(\"tingle-modal__close\"),this.modalCloseBtnIcon=document.createElement(\"span\"),this.modalCloseBtnIcon.classList.add(\"tingle-modal__closeIcon\"),this.modalCloseBtnIcon.innerHTML=\"×\",this.modalCloseBtnLabel=document.createElement(\"span\"),this.modalCloseBtnLabel.classList.add(\"tingle-modal__closeLabel\"),this.modalCloseBtnLabel.innerHTML=this.opts.closeLabel,this.modalCloseBtn.appendChild(this.modalCloseBtnIcon),this.modalCloseBtn.appendChild(this.modalCloseBtnLabel)),this.modalBox=document.createElement(\"div\"),this.modalBox.classList.add(\"tingle-modal-box\"),this.modalBoxContent=document.createElement(\"div\"),this.modalBoxContent.classList.add(\"tingle-modal-box__content\"),this.modalBox.appendChild(this.modalBoxContent),this.opts.closeMethods.indexOf(\"button\")!==-1&&this.modal.appendChild(this.modalCloseBtn),this.modal.appendChild(this.modalBox)}function s(){this.modalBoxFooter=document.createElement(\"div\"),this.modalBoxFooter.classList.add(\"tingle-modal-box__footer\"),this.modalBox.appendChild(this.modalBoxFooter)}function i(){this._events={clickCloseBtn:this.close.bind(this),clickOverlay:l.bind(this),resize:this.checkOverflow.bind(this),keyboardNav:n.bind(this)},this.opts.closeMethods.indexOf(\"button\")!==-1&&this.modalCloseBtn.addEventListener(\"click\",this._events.clickCloseBtn),this.modal.addEventListener(\"mousedown\",this._events.clickOverlay),window.addEventListener(\"resize\",this._events.resize),document.addEventListener(\"keydown\",this._events.keyboardNav)}function n(t){this.opts.closeMethods.indexOf(\"escape\")!==-1&&27===t.which&&this.isOpen()&&this.close()}function l(t){this.opts.closeMethods.indexOf(\"overlay\")!==-1&&!d(t.target,\"tingle-modal\")&&t.clientX=t},t.prototype.checkOverflow=function(){this.modal.classList.contains(\"tingle-modal--visible\")&&(this.isOverflow()?this.modal.classList.add(\"tingle-modal--overflow\"):this.modal.classList.remove(\"tingle-modal--overflow\"),!this.isOverflow()&&this.opts.stickyFooter?this.setStickyFooter(!1):this.isOverflow()&&this.opts.stickyFooter&&(o.call(this),this.setStickyFooter(!0)))},{modal:t}});","/**\n * Remove all validation. Should be called every time before revalidating form\n * @param {element} form - Form to be cleared\n * @returns {void}\n */\nconst clearFormErrors = (form) => {\n $(form).find('.form-control.is-invalid').removeClass('is-invalid');\n $(form).find('.login-form-error').empty();\n $(form).find('.login-form-error').removeClass('login-form-error-block');\n $(form)\n .find('.login-form-error-generic')\n .removeClass('login-form-error-block')\n .addClass('hidden');\n};\n\n// If ja-JP language set, swap name and last name input form\nconst swapFirstLastName = () => {\n if ($('meta[http-equiv=content-language]').attr('content') != 'ja-JP') {\n return;\n }\n\n var firstNameIdList = [\n 'shippingFirstName', // 'Checkout' page\n 'nameformemail', // 'Send us an e-mail' page\n 'registration-form-fname', // 'Register' page\n 'billingFirstName', // 'Edit Billing' page\n 'firstName', // 'Add Address' page\n 'name-frm', // 'Fiscal code calc' modal\n ];\n\n var lastNameIdList = [\n 'shippingLastName',\n 'secondnameformemail',\n 'registration-form-lname',\n 'billingLastName',\n 'lastName',\n 'surname-frm',\n ];\n\n for (var i = 0; i < firstNameIdList.length; i++) {\n var firstNameId = firstNameIdList[i];\n var lastNameId = lastNameIdList[i];\n\n // Skip to next loop if one input doesn't exist\n if (!$('#' + firstNameId).length || !$('#' + lastNameId).length) {\n continue;\n }\n\n // Check two inputs are next to each other\n if (\n $('#' + firstNameId)\n .parents('.cell')\n .next('.cell')\n .find('#' + lastNameId)\n .length\n ) {\n $('#' + lastNameId)\n .closest('.cell')\n .after($('#' + firstNameId).closest('.cell'));\n\n // Adjust padding on 'Register' page\n if (i == 2) {\n $('#' + firstNameId)\n .parents('.register-form-final-padding-right')\n .removeClass('register-form-final-padding-right')\n .addClass('register-form-final-padding-left');\n $('#' + lastNameId)\n .parents('.register-form-final-padding-left')\n .removeClass('register-form-final-padding-left')\n .addClass('register-form-final-padding-right');\n }\n }\n }\n};\n\nexport const addInputClearIcon = (inputItem) => {\n var $inputFieldContainer = $(inputItem).closest(\n '.form-fields-item__label:not(.form-fields-item__label--select)'\n );\n var clearIconTopPos =\n $(inputItem).outerHeight() / 2 +\n ($('.form-fields-item__input-label', $inputFieldContainer).length > 0\n ? $('.form-fields-item__input-label', $inputFieldContainer).outerHeight(true)\n : 0);\n\n if ($inputFieldContainer.find('.form-fields-item__clearIcon').length === 0) {\n $inputFieldContainer.append('');\n }\n $('.form-fields-item__clearIcon', $inputFieldContainer).css('top', clearIconTopPos);\n\n if (inputItem.value !== '') {\n $(inputItem).addClass('cc-isPrefilled');\n }\n\n $(inputItem)\n .on('focus', function () {\n $inputFieldContainer.addClass('focused');\n $(this).removeClass('cc-isPrefilled');\n })\n .on('blur', function () {\n $inputFieldContainer.removeClass('focused');\n });\n};\nclass FormHelpers {\n init(formElement, payload) {\n // clear form validation first\n clearFormErrors(formElement);\n $('.alert', formElement).remove();\n\n // Chosen select\n if (Foundation.MediaQuery.atLeast('medium')) {\n const selects = $('select.chosen, select.custom-select');\n selects.chosen({ disable_search: true });\n selects.each(function () {\n const ariaLabel = $(this).attr('aria-label');\n \n $(this).next('.chosen-container')\n .find('.chosen-search-input')\n .attr('aria-label', ariaLabel);\n });\n }\n\n if (typeof payload === 'object' && payload.fields) {\n Object.keys(payload.fields).forEach(function (key) {\n if (payload.fields[key]) {\n var feedbackElement = $(formElement)\n .find('[name=\"' + key + '\"]')\n .parent()\n .children('.invalid-feedback');\n\n if (feedbackElement.length > 0) {\n if (Array.isArray(payload[key])) {\n feedbackElement.html(payload.fields[key].join('
'));\n } else {\n feedbackElement.html(payload.fields[key]);\n }\n feedbackElement.siblings('.form-control').addClass('is-invalid');\n feedbackElement.show();\n }\n }\n });\n }\n if (payload && payload.error) {\n $(formElement).find('.login-form-error').html(payload.error.join('
'));\n $(formElement).find('.login-form-error').addClass('login-form-error-block');\n }\n\n $('input[type=text], input[type=email], input[type=number]').each(function (index, inputItem) {\n if ($(inputItem).attr('name') !== 'q') {\n addInputClearIcon(inputItem);\n }\n });\n\n $('.form-fields-item__clearIcon').on('click touchstart', function (e) {\n $(e.currentTarget).siblings('.form-fields-item__input-field').val('');\n });\n\n swapFirstLastName();\n }\n\n /**\n * Display error messages and highlight form fields with errors.\n * @param {string} parentSelector - the form which contains the fields\n * @param {Object} fieldErrors - the fields with errors\n */\n loadFormErrors(parentSelector, fieldErrors) {\n // eslint-disable-line\n // Display error messages and highlight form fields with errors.\n $.each(fieldErrors, (attr) => {\n $('*[name=' + attr + ']', parentSelector)\n .addClass('is-invalid')\n .siblings('.invalid-feedback')\n .html(fieldErrors[attr])\n .show();\n });\n if (fieldErrors.length) {\n $(`*[name=${fieldErrors[0]}]`).trigger('focus');\n }\n }\n\n /**\n * Clear the form errors.\n * @param {string} parentSelector - the parent form selector.\n */\n clearPreviousErrors(parentSelector) {\n $(parentSelector).find('.form-control.is-invalid').removeClass('is-invalid');\n $('.error-message').hide();\n }\n\n handleAmexNumber(cardFieldSelector, cardTypeSelector) {\n var cleave = new Cleave(cardFieldSelector, {\n creditCard: true,\n onCreditCardTypeChanged: (type) => {\n const creditCardTypes = {\n amex: 'Amex',\n };\n\n const cardType =\n creditCardTypes[\n Object.keys(creditCardTypes).indexOf(type) > -1 ? type : 'unknown'\n ];\n $(cardTypeSelector).val(cardType);\n $('.card-number-wrapper').attr('data-type', type);\n if (type === 'visa' || type === 'mastercard' || type === 'discover') {\n $('#securityCode').attr('maxlength', 3);\n } else {\n $('#securityCode').attr('maxlength', 4);\n }\n },\n });\n\n $(cardFieldSelector).data('cleave', cleave);\n }\n handleCreditCardNumber(cardFieldSelector, cardTypeSelector) {\n var cleave = new Cleave(cardFieldSelector, {\n creditCard: true,\n onCreditCardTypeChanged: (type) => {\n const creditCardTypes = {\n visa: 'Visa',\n mastercard: 'Master Card',\n amex: 'Amex',\n discover: 'Discover',\n jcb: 'jcb',\n diners: 'diners',\n unknown: 'Unknown',\n };\n\n const cardType =\n creditCardTypes[\n Object.keys(creditCardTypes).indexOf(type) > -1 ? type : 'unknown'\n ];\n $(cardTypeSelector).val(cardType);\n $('.card-number-wrapper').attr('data-type', type);\n if (type === 'visa' || type === 'mastercard' || type === 'discover') {\n $('#securityCode').attr('maxlength', 3);\n } else {\n $('#securityCode').attr('maxlength', 4);\n }\n },\n });\n\n $(cardFieldSelector).data('cleave', cleave);\n }\n\n serializeData(form, wasAmexSelected) {\n const serializedArray = form.serializeArray();\n\n serializedArray.forEach((item) => {\n if (item.name.indexOf('cardNumber') > -1) {\n if (wasAmexSelected === true) {\n item.value = $('#cardNumberAmex').data('cleave').getRawValue(); // eslint-disable-line\n } else {\n item.value = $('#cardNumber').data('cleave').getRawValue(); // eslint-disable-line\n }\n }\n });\n\n return $.param(serializedArray);\n }\n}\n\nconst formHelpers = new FormHelpers();\nexport default formHelpers;\n","/**\n * Core SFRA function for run everything everywhere\n * @param {Function || Object} include - stuff to run\n */\nconst processInclude = (include) => {\n if (typeof include === 'function') {\n include();\n } else if (typeof include === 'object') {\n Object.keys(include).forEach(function (key) {\n if (typeof include[key] === 'function') {\n include[key]();\n }\n });\n }\n};\n\n// Enqueues tasks to be executed afterwards\nfunction enqueueTask(task) {\n window.requestAnimationFrame(task);\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nconst parseHtml = (html, map) => {\n const el = document.createElement('div');\n el.innerHTML = html;\n\n let htmlMap = {};\n for (var key in map) {\n if (map.hasOwnProperty(key)) {\n htmlMap[key] = el.querySelector(map[key]);\n }\n }\n\n return htmlMap;\n};\n\n/**\n * appends params to a url\n * @param {string} url - Original url\n * @param {Object} params - Parameters to append\n * @returns {string} result url with appended parameters\n */\nconst appendToUrl = (url, params) => {\n var newUrl = url;\n newUrl +=\n (newUrl.indexOf('?') !== -1 ? '&' : '?') +\n Object.keys(params)\n .map(function (key) {\n return key + '=' + encodeURIComponent(params[key]);\n })\n .join('&');\n\n return newUrl;\n};\n\nconst lockScroll = () => {\n $('body, html').css('overflow-y', 'hidden');\n};\n\nconst unlockScroll = () => {\n $('body, html').css('overflow-y', '');\n};\n\n/**\n * function for force lock scroll when open a modal or a drawer.\n * CAN CREATE SOME ISSUE WITH TOUCH EVENT - CHECK ON REAL DEVICE\n * the event is for prevent scrolling in iOS device\n */\nfunction forceLockScroll() {\n $('body, html,.page')\n .css({'overflow-y': 'hidden', 'touch-action': 'none'})\n .on('touchmove', preventDefault);\n}\n\nfunction forceUnlockScroll() {\n $('body, html,.page')\n .css({'overflow-y': '', 'touch-action': ''})\n .off('touchmove', preventDefault);\n}\n\nfunction preventDefault(e) {\n e.preventDefault();\n}\n\nconst cookieExists = (name) => {\n return document.cookie.split(';').filter((item) => {\n return item.trim().indexOf(`${name}=`) === 0;\n }).length;\n};\n\nconst createCookie = (name, value = false, days = 0) => {\n var expires;\n if (days) {\n var date = new Date();\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n expires = '; expires=' + date.toGMTString();\n } else {\n expires = '';\n }\n document.cookie = name + '=' + value + expires + '; path=/';\n};\n\nconst getCookie = (name) => {\n var value = '; ' + document.cookie;\n var parts = value.split('; ' + name + '=');\n if (parts.length == 2) return parts.pop().split(';').shift();\n return '';\n};\n\nconst deleteCookie = (name) => {\n document.cookie = name + '=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';\n};\n\nconst isTouchDevice = () => {\n return (\n 'ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0\n );\n};\n\n/**\n * Generic Ajax Call\n * @param {string} url - url for the ajax call\n * @param {string} method - default GET (is possible to use POST,PUT)\n * @param {object} data - use in POST method\n * @param {boolean} hideSpinner - default false, use true to hide the spinner\n * @returns Promise with the response of the ajax call\n */\nfunction genericAjaxCall(url, method = 'GET', data = {}, hideSpinner = false) {\n if (!url) {\n console.error('Missing Url in ajax call');\n return;\n }\n if (hideSpinner !== true) {\n $.spinner().start();\n }\n return new Promise((resolve, reject) => {\n $.ajax({\n url: url,\n method: method,\n data: data,\n success: function (response) {\n if (hideSpinner !== true) {\n $.spinner().stop();\n }\n resolve(response);\n },\n error: function (error) {\n if (hideSpinner !== true) {\n $.spinner().stop();\n }\n console.error(error);\n reject(error);\n },\n });\n });\n}\n\nexport {\n appendToUrl,\n cookieExists,\n createCookie,\n deleteCookie,\n enqueueTask,\n forceLockScroll,\n forceUnlockScroll,\n genericAjaxCall,\n getCookie,\n isTouchDevice,\n lockScroll,\n parseHtml,\n preventDefault,\n processInclude,\n unlockScroll,\n};\n","import { ModalShowHide } from '../components/modal';\n\nclass SizePanel {\n #mobileSizeModal;\n Types = {\n ADDTOCART: 'add_to_cart',\n ADDTOCART_BUNDLE: 'add_to_cart_bundle',\n PERSONALIZE: 'personalize',\n WISHILIST: 'wishlist',\n SMARTGIFT: 'smartgift'\n }\n\n init (idName = '#size-panel-mobile') {\n this.idName = idName\n this.#onPanelOpenerClick();\n this.#onNotifyMeSizeClicked();\n this.#onCloseSizeModalMobile();\n this.#mobileSizeModal = new ModalShowHide(this.idName);\n this.#mobileSizeModal.hide();\n }\n\n openSizePanel (operation) {\n if (Foundation.MediaQuery.atLeast('large')) {\n $('.js-page-size-box').addClass('cc-sizeBox-isOpen');\n } else {\n this.#mobileSizeModal.show();\n }\n $(this.idName).data('operation', operation);\n if (operation === this.Types.ADDTOCART_BUNDLE) {\n let $sizeElements = $(\"[data-attr='size'] input,[data-attr='size-mobile'] input\");\n let bundleQuantity = $('.js-add-to-cart-multipack').data('bundle-quantity');\n $sizeElements.each(function (element){\n if(parseInt($(this).attr('data-allocation'), 10) < parseInt(bundleQuantity, 10)) {\n $(this).closest('label').addClass('cc-no-bundle');\n }\n })\n } else {\n $('.cc-no-bundle').removeClass('cc-no-bundle');\n }\n if(operation === this.Types.WISHILIST) {\n $('.notifyMe,.wishlistOnly').addClass('select-size-for-wishlist');\n } else {\n $('.notifyMe,.wishlistOnly').removeClass('select-size-for-wishlist');\n }\n }\n\n #closeSizePanel () {\n if (Foundation.MediaQuery.atLeast('large')) {\n $('.pdp-size-box').removeClass('cc-sizeBox-isOpen');\n } else {\n this.#mobileSizeModal.hide();\n }\n $('.pdp-size-box .js-sizeBox-openPanel').removeClass('cc-sizeBox-openPanel_error');\n $('#newsletter-error-msg').hide();\n $(this.idName).data('operation', '');\n $('.notifyMe,.wishlistOnly').removeClass('select-size-for-wishlist');\n $('.cc-no-bundle').removeClass('cc-no-bundle');\n }\n\n #onPanelOpenerClick () {\n $('.pdp-size-box .js-sizeBox-openPanel').on('click', e => {\n if ($('.pdp-size-box').hasClass('cc-sizeBox-isOpen')) {\n this.#closeSizePanel();\n } else {\n this.openSizePanel();\n }\n });\n $('.js-pdpStickyBar-size-openPanel').on('click', e => {\n if ($('.js-pdpStickyBar-select').hasClass('cc-sizeBox-isOpen')) {\n $('.js-pdpStickyBar-select').removeClass('cc-sizeBox-isOpen');\n } else {\n $('.js-pdpStickyBar-select').addClass('cc-sizeBox-isOpen');\n }\n });\n }\n\n afterSizeSelection (data, type) {\n let operation = $(this.idName).data('operation');\n this.#closeSizePanel();\n let stopSpinner = true;\n let selectedSize = $('[data-attr=\"size\"] input:checked');\n if (!selectedSize.length) {\n $('.pdp-size-box').removeClass('size-selected');\n return stopSpinner;\n } else {\n $('#newsletter-error-msg').hide();\n }\n if (type !== 'size') {\n return stopSpinner;\n }\n let sizeDisplayValue = selectedSize.closest('label').find('.js-size-button__span').text();\n $('.pdp-size-box .js-sizeBox-openPanel').attr('aria-invalid', 'false');\n $('.pdp-size-box .selected-size-value').text(sizeDisplayValue);\n $('.pdp-size-box').addClass('size-selected');\n if ($('.js-add-to-cart-multipack').length > 0) {\n let bundleQuantity = $('.js-add-to-cart-multipack').data('bundle-quantity');\n if(parseInt($(selectedSize).attr('data-allocation'), 10) < parseInt(bundleQuantity, 10)) {\n $('.js-add-to-cart-multipack').attr('disabled', true);\n } else {\n $('.js-add-to-cart-multipack').removeAttr('disabled');\n }\n }\n\n stopSpinner = false;\n switch (operation) {\n case this.Types.ADDTOCART:\n $('#add-to-cart-cta-pdp').trigger('click');\n break;\n case this.Types.ADDTOCART_BUNDLE:\n $('#add-to-cart-multipack-cta-pdp').trigger('click');\n break;\n case this.Types.PERSONALIZE:\n $('#personalizeButton .persButt').trigger('click');\n break\n case this.Types.WISHILIST:\n $('body').trigger('wishlist:add-pid', {pid: data.product.id});\n break;\n case this.Types.SMARTGIFT:\n $('.add-to-cart-actions .js-smart-gift').trigger('click');\n $('#smartgiftButton').trigger('click');\n break;\n default:\n stopSpinner = true;\n }\n return stopSpinner;\n }\n\n #onNotifyMeSizeClicked () {\n const _self = this;\n $('.notifyMe,.wishlistOnly').on('click', (e) => {\n if (!$(e.currentTarget).hasClass('select-size-for-wishlist')) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n $.spinner().start();\n const infoURL = $(e.currentTarget).closest('label').find('input').data('url');\n $.ajax({\n url: infoURL,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n if (data.product.readyToOrder) {\n if ($(e.currentTarget).hasClass('wishlistOnly')) {\n let sizeDisplayValue = $(e.currentTarget).closest('label').find('.size-list-item-display-value').text();\n $('.pdp-size-box .selected-size-value').text(sizeDisplayValue);\n $('.pdp-size-box').addClass('size-selected');\n }\n const pid = encodeURIComponent(data.product.id)\n $('body').trigger('wishlist:add-pid', {pid: pid});\n } else {\n $.spinner().stop();\n _self.#closeSizePanel();\n }\n },\n error: function () {\n $.spinner().stop();\n _self.#closeSizePanel();\n }\n });\n });\n\n $('body').on('wishlist:update', () => {\n $.spinner().stop();\n _self.#closeSizePanel();\n });\n }\n\n #onCloseSizeModalMobile () {\n const _self = this;\n $('body').on('click', '.size-selector-mobile-modal', () => {\n _self.#closeSizePanel();\n });\n }\n}\n\nconst sizePanel = new SizePanel();\nexport default sizePanel;\n","'use strict';\n\nvar testEnabled = false;\n\nlet productGenderMap = {\n 1: 'Woman',\n 2: 'Man',\n 3: 'Girl',\n 4: 'Boy',\n 5: 'Unisex',\n 6: 'Baby'\n};\n\nlet brandsMapping = {\n 'CALZEDONIA': 'clz',\n 'INTIMISSIMI': 'int',\n 'TEZENIS': 'tzn',\n 'FALCONERI': 'flc',\n 'SIGNORVINO': 'sgv',\n 'ATELIER_EME': 'eme'\n};\n\nvar ListType = {\n 'listing': {\n 'class': 'category',\n 'value': 'listing',\n 'associatedObject': '.search-results'\n },\n 'wishlist': {\n 'class': 'wishlist-container',\n 'value': 'wishlist',\n 'associatedObject': '.wishlistItemCards'\n },\n 'search': {\n 'class': 'search',\n 'value': 'search',\n 'associatedObject': '.search-results'\n },\n 'completeYourLook': {\n 'class': 'completeYourLook',\n 'value': 'complete_your_look',\n 'associatedObject': '.completeYourLookContainer'\n },\n 'recentlyViewed': {\n 'class': 'recentlyViewed',\n 'value': 'recently_viewed',\n 'associatedObject': '.recentlyViewedContainer'\n },\n 'suggestedProducts': {\n 'class': 'suggestedProducts',\n 'value': 'suggested_products',\n 'associatedObject': '.suggestedProductsContainer'\n },\n 'filteredProducts': {\n 'class': 'filteredProducts',\n 'value': 'filter_applied',\n 'associatedObject': '.filteredProducts'\n },\n 'bestSellers': {\n 'class': 'bestSellers',\n 'value': 'best_sellers',\n 'associatedObject': '.bestSellers'\n },\n 'cmBestSellers': {\n 'class': 'cmBestSellers',\n 'value': 'best_sellers',\n 'associatedObject': '.cm-bestsellerCarousel-carouselWrapper .cm-carouselCustom.js-plp-productGrid'\n },\n 'sortDecreasing': {\n 'class': 'sortDecreasing',\n 'value': 'sorting_decreasing_price',\n 'associatedObject': '.sortDecreasing'\n },\n 'sortIncreasing': {\n 'class': 'sortIncreasing',\n 'value': 'sorting_increasing_price',\n 'associatedObject': '.sortIncreasing'\n },\n 'newArrivals': {\n 'class': 'newArrivals',\n 'value': 'new_arrivals',\n 'associatedObject': '.newArrivals'\n },\n 'cmNewArrivals': {\n 'class': 'cmNewArrivals',\n 'value': 'new_arrivals',\n 'associatedObject': '.cm-productCarousel-cardWrp.cm-carouselCustom'\n },\n 'completeYourLookMiniCart': {\n 'class': 'completeYourLookMiniCart',\n 'value': 'complete_your_look_minicart',\n 'associatedObject': '.miniCartCrossSellContainer-carousel'\n },\n 'js-suggestedForYou': {\n 'class': 'js-suggestedForYou',\n 'value': 'suggested_for_you',\n 'associatedObject': '.js-slotCarousel_suggestedProducts-carousel'\n },\n 'js-completeThePromo': {\n 'class': 'completeThePromo',\n 'value': 'complete_your_look',\n 'associatedObject': '.js-completeThePromoContainer'\n },\n 'js-youMayAlsoLike': {\n 'class': 'js-youMayAlsoLike',\n 'value': 'you_may_also_like',\n 'associatedObject': '.js-youMayAlsoLikeContainer'\n }\n};\n\nfunction getProductGender (product) {\n if (product.sapCategoryCode) {\n let categoryCode = product.sapCategoryCode;\n return productGenderMap[parseInt(categoryCode[categoryCode.length - 1])];\n }\n return '';\n}\n\nfunction insertParam (key, value) {\n key = encodeURI(key); value = encodeURI(value);\n\n var kvp = document.location.search.substr(1).split('&');\n\n var i = kvp.length; var x; while (i--) {\n x = kvp[i].split('=');\n\n if (x[0] === key) {\n x[1] = value;\n kvp[i] = x.join('=');\n break;\n }\n }\n\n if (i < 0) { kvp[kvp.length] = [key, value].join('='); }\n\n // this will reload the page, it's likely better to store this until finished\n document.location.search = kvp.join('&');\n}\n\nfunction hasParam (key) {\n key = encodeURI(key);\n\n return document.location.search.substr(1).indexOf(key) !== -1;\n}\n\nfunction getSkuCodes (sku) {\n if (sku.length >= 13) {\n let style = sku.substring(0, 9).trim();\n let color = sku.substring(9, 13).trim();\n let size = sku.substring(13).trim().replace('~', '/');\n return { id: style, color: color, size: size };\n } else {\n let color = sku.split('_')[1];\n return { id: sku, color: color };\n }\n}\n\nfunction formatStringForAnalytics (str) {\n return ('' + str).split(' ').join('_').toLowerCase().replace(/-/g, '_');\n}\n\nfunction formatStringProductPropertyIfExists (product, property, avoidFormatting = false) {\n if (property in product) {\n if (property === 'item_sfcc') {\n product[property] = '' + getFormatSkuForAnalytics(product[property]);\n } else if (avoidFormatting) {\n product[property] = '' + product[property];\n } else {\n product[property] = formatStringForAnalytics(product[property]);\n }\n }\n return product;\n}\n\n/* function formatStringProductPricePropertyIfExists (product, property, avoidFormatting = false) {\n if (property in product) {\n if (avoidFormatting) {\n product[property] = '' + product[property];\n } else {\n product[property] = formatStringForAnalytics(product[property]);\n }\n if (product['discount'] && product['discount'] < 0) {\n product[property] = '0.00';\n product['discount'] = 0.00;\n }\n }\n return product;\n} */\n\nfunction formatStringProductSalePropertyIfExists (product, property, avoidFormatting = false) {\n if (property in product) {\n if (avoidFormatting) {\n product[property] = '' + product[property];\n } else {\n product[property] = formatStringForAnalytics(product[property]);\n }\n if (product['discount'] && parseFloat(product['discount'])) {\n product[property] = 'yes';\n }\n }\n return product;\n}\n\nfunction formatFloatProductPropertyIfExists (product, property) {\n if (property in product) {\n product[property] = (product[property] <= 0) ? 0.00 : parseFloat(product[property]);\n }\n return product;\n}\n\nfunction formatIntegerForAnalytics (value) {\n return parseInt(value);\n}\n\nfunction formatIntegerProductPropertyIfExists (product, property) {\n if (property in product) {\n product[property] = formatIntegerForAnalytics(product[property]);\n }\n return product;\n}\n\nfunction stringOrNotAvailable (s) {\n return (s !== null && typeof s !== 'undefined' && String(s)) || 'not_available';\n}\n\nfunction numberOrZero (n) {\n return parseFloat(n) || 0;\n}\n\nfunction getStringAnalyticsValueFromStorage (key) {\n return stringOrNotAvailable(window.sessionStorage.getItem(key));\n}\n\nfunction getNumberAnalyticsValueFromStorage (key) {\n return numberOrZero(window.sessionStorage.getItem(key));\n}\n\nfunction getFormatSkuForAnalytics (sku) {\n let id, color, size, formattedSku;\n if (sku.toLowerCase().indexOf('color') !== -1) { // variant group\n id = sku.split('_')[0].trim();\n color = sku.split('_')[2].trim();\n formattedSku = id + '_' + color;\n } else {\n if (sku.match('[^_]+_[^_]+_[^_]+')) {\n return sku.toUpperCase();\n }\n let skuComponents = getSkuCodes(sku);\n id = skuComponents.id;\n color = skuComponents.color;\n size = skuComponents.size;\n if (color && size) {\n formattedSku = id + '_' + color + '_' + size;\n } else { // master product\n formattedSku = id;\n }\n }\n return formattedSku.toUpperCase().replace(/_+/g, '_');\n}\n\nmodule.exports = {\n\n isTestEnabled () {\n return testEnabled;\n },\n\n getAvailableListTypes (listingItemsBaseClass) {\n let types = [];\n\n for (let key in ListType) {\n if (ListType.hasOwnProperty(key)) {\n if ($(listingItemsBaseClass + '.' + ListType[key].class).length > 0) {\n let item = ListType[key];\n types.push(item);\n }\n }\n }\n\n return types;\n },\n\n getSkuComponents (sku) {\n return getSkuCodes(sku);\n },\n\n getProductGender (product) {\n return getProductGender(product);\n },\n\n getProductBaseInfo (product) {\n let id = '';\n let color = '';\n let size = '';\n\n let colorObject = null;\n\n let promo = 'no_promotion';\n if ('promotions' in product && product.promotions && product.promotions.length > 0) {\n promo = product.promotions.map(function (el) { return el.enabled ? el.id : null; }).filter(function (el) { return el !== null; }).join('-');\n } else if ('appliedPromotions' in product && product.appliedPromotions && product.appliedPromotions.length > 0) {\n promo = product.appliedPromotions.map(function (el) { return el.name; }).join('-');\n }\n\n if (product.productType === 'variant') {\n let components = getSkuCodes(product.id);\n id = components.id;\n color = components.color;\n size = components.size;\n\n for (let k in product.variationAttributes) {\n const variationAttribute = product.variationAttributes[k];\n if (variationAttribute.attributeId === 'color') {\n if ('values' in variationAttribute) {\n for (let j in variationAttribute.values) {\n if (variationAttribute.values[j].selected === true) {\n colorObject = variationAttribute.values[j];\n break;\n }\n }\n } else {\n colorObject = variationAttribute;\n }\n break;\n }\n }\n } else if (product.productType === 'variationGroup') {\n // in this case the user only chose the color, and not the size\n id = product.id.split('_')[0].trim();\n color = product.id.split('_')[2].trim();\n\n let selectedVariation;\n\n for (let k in product.variationAttributes) {\n const variationAttribute = product.variationAttributes[k];\n if (variationAttribute.attributeId === 'color') {\n for (let j in variationAttribute.values) {\n if (variationAttribute.values[j].selected === true) {\n colorObject = variationAttribute.values[j];\n break;\n }\n }\n }\n if (selectedVariation !== undefined) {\n break;\n }\n }\n }\n\n return {\n id: id,\n color: color,\n colorObject: colorObject,\n size: size,\n promo: promo\n };\n },\n\n formatProductForAnalytics (product) {\n product = formatStringProductPropertyIfExists(product, 'item_name');\n product = formatStringProductPropertyIfExists(product, 'item_brand');\n product = formatStringProductPropertyIfExists(product, 'item_list_name');\n product = formatStringProductPropertyIfExists(product, 'item_list_id');\n product = formatStringProductPropertyIfExists(product, 'item_variant', true);\n product = formatFloatProductPropertyIfExists(product, 'price');\n product = formatStringProductPropertyIfExists(product, 'item_category');\n product = formatStringProductPropertyIfExists(product, 'item_category2');\n product = formatStringProductPropertyIfExists(product, 'item_category3');\n product = formatStringProductPropertyIfExists(product, 'item_category4');\n product = formatStringProductPropertyIfExists(product, 'item_category5');\n product = formatIntegerProductPropertyIfExists(product, 'quantity');\n product = formatStringProductPropertyIfExists(product, 'size', true);\n product = formatStringProductSalePropertyIfExists(product, 'item_on_sale');\n product = formatStringProductPropertyIfExists(product, 'item_availability');\n product = formatStringProductPropertyIfExists(product, 'coupon');\n product = formatStringProductPropertyIfExists(product, 'item_color');\n product = formatStringProductPropertyIfExists(product, 'item_sfcc');\n product = formatStringProductPropertyIfExists(product, 'item_customization');\n product = formatStringProductPropertyIfExists(product, 'item_sustainable');\n product = formatFloatProductPropertyIfExists(product, 'discount');\n return product;\n },\n\n checkPage (str) {\n return window.location.href.toLowerCase().indexOf(str) !== -1;\n },\n\n // Formatting\n formatString (str) {\n return formatStringForAnalytics(str);\n },\n\n format4DigitNumber (number) {\n if (number < 0) {\n return '0000';\n } else if (number < 10) {\n return '000' + number;\n } else if (number < 100) {\n return '00' + number;\n } else if (number < 1000) {\n return '0' + number;\n }\n return number.toString();\n },\n\n // URL Parameters\n insertParameter (key, value) {\n insertParam(key, value);\n },\n existsParameter (key) {\n return hasParam(key);\n },\n\n // Push on DataLayer\n push (pushObject, log = true) {\n // eslint-disable-next-line\n dataLayer.push(pushObject);\n\n if (log && testEnabled) {\n console.info(pushObject);\n }\n },\n\n log (data, inline = false) {\n if (!testEnabled) {\n return;\n }\n if (inline) {\n console.info('Analytics: ' + data);\n } else {\n console.info('Analytics: ');\n console.info(data);\n }\n },\n\n getFormatSku (sku) {\n return getFormatSkuForAnalytics(sku);\n },\n\n formatNameForAnalytics (name) {\n if (!name) {\n return '';\n }\n let formattedPlus = name.toLowerCase().replace(/[+]/g, '_plus_');\n let formattedName = formattedPlus.replace(/\\W/g, '_');\n let analyticsName = formattedName.split('_').filter((el) => { return el; }).join('_');\n return analyticsName;\n },\n\n formatSkus (skus) {\n let formattedSkus = '';\n for (let i = 0; i < skus.length; i++) {\n let formattedSku = getFormatSkuForAnalytics(skus[i]).replace(/\\W/g, '_');\n if (i === 0) {\n formattedSkus += formattedSku;\n } else {\n formattedSkus += '-' + formattedSku;\n }\n }\n return formattedSkus;\n },\n\n getProductNameEngFromPdp () {\n let nameEng = $('.analytics.product').data('name');\n return nameEng;\n },\n\n getFormatedNewsletterPreferenceBrands (list) {\n let brandsStr = '';\n for (let brand of list) {\n brandsStr += brandsMapping[brand] + '-';\n }\n\n brandsStr = brandsStr.substring(0, brandsStr.length - 1);\n\n return brandsStr;\n },\n\n getListId (container, provider) {\n let list = '';\n if (container && $(container).parents('.analytics-mini-cart').length > 0) {\n list = 'minicart';\n } else if ($(container).parents('.js-site-search-suggestions-products').length > 0) { // Search results\n list = 'plp';\n } else if ($('.page[data-action=\"Product-Show\"]').length > 0) {\n list = 'pdp';\n } else if ($('.page[data-action=\"Search-Show\"]').length > 0) {\n list = $('.page.js-page-home-gender').length > 0 ? 'home' : 'plp';\n } else if ($('.page[data-action=\"Cart-Show\"]').length > 0 || $('.page[data-action=\"Checkout-Begin\"]').length > 0) {\n list = 'cart';\n } else if ($('.page[data-action=\"Wishlist-Show\"]').length > 0) {\n list = 'wishlist';\n }\n\n if (list && provider && (list === 'pdp' || list === 'home' || list === 'cart')) {\n list = `${provider}_${list}`;\n }\n\n return list;\n },\n\n getProductList () {\n let items = [];\n let container = $('.analytics.checkout.checkout-product');\n\n for (let i = 0; i < container.length; i++) {\n let obj = container.eq(i).data();\n\n // Fix values for MEC-30160\n if (obj.item_list_name === 'not_available') {\n obj.item_list_name = 'listing'\n }\n \n if (obj.item_list_id === 'not_available') {\n obj.item_list_id = 'pdp'\n }\n\n if (obj.id !== 'PERS_PROD') {\n obj['quantity'] = obj.quantity;\n obj['index'] = i;\n items.push(this.formatProductForAnalytics(obj));\n }\n }\n return items;\n },\n\n getGrandTotal () {\n return $('.analytics-totals').data('grand-total');\n },\n\n getAppliedCoupon () {\n const coupon = [];\n $('#couponCode.coupon-code-field--applied').val() && coupon.push($('#couponCode.coupon-code-field--applied').val());\n $('.analytics-shipping-discount').length && coupon.push('shipping_discount');\n $('.analytics-order-discount').length && coupon.push('order_discount');\n return coupon.join(',');\n },\n\n getUpsellingMessage () {\n let upsellingMessage = 'no_message';\n const vals = [];\n $('.analytics-message').each(function () {\n if (vals.indexOf($(this).data('analytics-type')) === -1) {\n vals.push($(this).data('analytics-type'));\n }\n });\n if (vals.length > 0) {\n upsellingMessage = vals.join('-');\n }\n localStorage.setItem('upsellingMessage', upsellingMessage);\n return upsellingMessage;\n },\n\n getBeginCheckoutData (context) {\n return {\n upselling_message: this.getUpsellingMessage(),\n currency: context.helperData.currency,\n value: this.getGrandTotal(),\n coupon: this.getAppliedCoupon(),\n items: this.getProductList()\n };\n },\n\n getTypeOfAccount () {\n let typeOfAccount = 'only_registration';\n if ($('.loyalty-flag:checked').length === 1) {\n typeOfAccount = 'profile_loyalty';\n }\n return typeOfAccount;\n },\n storeGtmData (data) {\n if (data && data.item_list_name && data.item_list_id && (data.index || data.index === 0)) {\n if (data.item_id && data.item_variant) {\n window.sessionStorage.setItem('GTM_' + data.item_id + '_color_' + data.item_variant, JSON.stringify({'item_list_name': data.item_list_name, 'item_list_id': data.item_list_id, 'index': data.index}));\n }\n // Adding values for color change event\n window.sessionStorage.setItem('GTM_item_list_name', data.item_list_name);\n window.sessionStorage.setItem('GTM_item_list_id', data.item_list_id);\n window.sessionStorage.setItem('GTM_index', data.index);\n }\n },\n getGtmData (data) {\n const GTMData = {};\n if (data && data.item_id && data.item_variant) {\n const GTMItem = JSON.parse(window.sessionStorage.getItem('GTM_' + data.item_id + '_color_' + data.item_variant)) || {};\n GTMData.item_list_name = stringOrNotAvailable(GTMItem.item_list_name);\n GTMData.item_list_id = stringOrNotAvailable(GTMItem.item_list_id);\n GTMData.index = numberOrZero(GTMItem.index);\n } else {\n GTMData.item_list_name = getStringAnalyticsValueFromStorage('GTM_item_list_name');\n GTMData.item_list_id = getStringAnalyticsValueFromStorage('GTM_item_list_id');\n GTMData.index = getNumberAnalyticsValueFromStorage('GTM_index');\n }\n return GTMData;\n },\n setBonusProductData ($container, index) {\n $container.data('item_list_name', 'free_product');\n $container.data('item_list_id', this.getListId());\n $container.data('index', index);\n $container.data('discount', $container.data('price'));\n $container.data('price', 0);\n }\n};\n","import NotifyHelper from './notify';\nimport SmartGiftHelper from './smartGiftHelper';\nimport { startCarouselTileImageFunction } from './productBox';\nimport { updatePrimaryImagesSlider } from './detail';\nimport sizePanel from './sizePanel';\nimport { addToCartFromListing } from './quickView.js';\nimport { newModalFromString } from '../components/modal';\nimport { runPersonalizationListener } from '../customize';\nimport { updateProductDetailUrl } from 'util/url';\nimport { createCookie } from '../util/common';\nimport { getGtmData } from '../analytics/helpers/helper';\nimport { handleWishlistContainer } from './wishlistHeart.js';\n\nconst isMiniCartOpen = () => {\n return localStorage.getItem('isMiniCartOpen') === 'true';\n};\n\nfunction isChooseBonusProductModalOpen () {\n return ($('.js-chooseBonusProductModal').length > 0);\n}\n\nfunction isQuickUpdateFromModal () {\n return $('.js-quickUpdateModal').length > 0;\n}\n\nconst isMobileDevice = () => {\n return !Foundation.MediaQuery.atLeast('large');\n};\n/**\n * Move close button inside modal content box\n */\nconst moveModalCloseButton = () => {\n var close = document.querySelector('.tingle-modal__close');\n var modalContent = document.querySelector('.tingle-modal-box__content');\n modalContent.appendChild(close);\n};\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nconst getPidValue = ($el) => {\n let pid;\n\n if ($('.quickview-modal').hasClass('tingle-modal--visible') && !$('.product-set').length) {\n pid = $('.quickview-modal').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el).closest('.product-detail').find('.product-id').text();\n } else if ($('.modal-size-show').length) {\n pid = $('.modal-size-show').find('.js-add-to-cart').data('pid');\n } else if (isMiniCartOpen()) {\n pid = $($el).data('pid');\n } else {\n pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n }\n\n return pid;\n};\n\n/**\n * updates the product view when a product attribute of quickAdd is selected or deselected or when\n * changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n * @param {string} type - type of filter selected\n */\nconst attributeSelectQuickAdd = (selectedValueUrl, $productContainer, type = '_', imagesShouldUpdate = true) => {\n if (selectedValueUrl) {\n $('body').trigger('product:beforeAttributeSelect', {\n url: selectedValueUrl,\n container: $productContainer\n });\n\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: data => {\n handleVariantResponseQuickAdd(data, $productContainer, imagesShouldUpdate);\n updateOptions(data.product.options, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n $productContainer.attr('data-pid', data.product.id);\n $productContainer.find('.add-to-cart-quick-add').attr('data-pid', data.product.id);\n $productContainer.find('.add-to-cart-quick-add').attr('data-quantity', data.product.selectedQuantity);\n if ($productContainer.find('.add-to-cart-quick-add').data('mustAdd') === true) {\n $productContainer.find('.add-to-cart-quick-add').trigger('click');\n } else {\n $productContainer.find('.js-panel-opener-size-quick-add').trigger('click');\n $.spinner().stop();\n }\n },\n error: () => {\n $.spinner().stop();\n }\n });\n }\n};\n\nconst activatePromoAnimationMessage = () => {\n $('.js-pdpPromo').removeClass('hide');\n};\n\nconst reactivatePromoAnimationMessage = (promotionId, pdpCalloutMsgText) => {\n $('.js-pdpPromo').attr('data-promotion-id', promotionId);\n $('.js-pdpPromo-message').html(pdpCalloutMsgText);\n activatePromoAnimationMessage();\n};\n\n/**\n * updates the product view when a product attribute is selected or deselected or when changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n * @param {string} type - type of filter selected\n * @param {boolean} imagesShouldUpdate - update images on attribute selection\n * @param {boolean} ignoreCTA - add immediately to cart without clicking on CTA\n */\nconst attributeSelect = (selectedValueUrl, $productContainer, type = '_', imagesShouldUpdate = true, ignoreCTA = false) => {\n if (selectedValueUrl) {\n // destroyPrimaryImagesSlider();\n $productContainer.prevObject.analyticsPromotion = false;\n\n $('body').trigger('product:beforeAttributeSelect', {\n url: selectedValueUrl,\n container: $productContainer\n });\n\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: data => {\n var isSize = data.variation.isSize;\n var isQuickViewModal = $productContainer.hasClass('product-quickview');\n\n if (isQuickViewModal && type !== 'color') {\n imagesShouldUpdate = false;\n }\n\n handleVariantResponse(data, $productContainer, imagesShouldUpdate, type);\n\n // Update PDP link if we are in QuickView and a color was selected\n if (type === 'color' && $('.quickview-modal').length) {\n let container = $('.quickview-modal').find('.see-product-details-link');\n container.attr('href', data.product.url);\n }\n\n handleVariationUrlsSelectSizeModal(data.variation.variationUrls);\n handlePromotionTag(data.product ,$productContainer);\n handleVariationUrlsSelectNotifyModal(data.product.variationAttributes[1].values);\n handleVariationComingSoonNotifyModal(data.product.variationAttributes[1].values);\n handleVariationComingSoon(data.product.comingSoon);\n handleVariationWishlistModal(data.product.variationAttributes[1].values);\n\n // here we check if the selected product has the size, if not we put a flag on isToLoad\n if (isSize == false) {\n $('#pidToAdd').attr('isToLoad', 'true');\n } else {\n $('#pidToAdd').attr('isToLoad', 'false');\n }\n $('.persButtonPdpPers').attr('disabled', false);\n $('#custom-page').attr('data-pid', data.product.id);\n $('.js-personalizeButtonCheckout').removeClass('disabled');\n $('.js-personalizeButtonCheckout').attr('disabled', false);\n updateOptions(data.product.options, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n updateImageSaveForLater(data.product, $productContainer);\n if ($('.product-detail-keeper').length) {\n var pid = getPID(data.product);\n try {\n $($productContainer).find('.product-set').attr('data-pid', pid);\n } catch (e) {\n }\n $('.product-detail-keeper').attr('data-variant-pid', encodeURIComponent(pid));\n }\n\n if (isSize) {\n $('body').trigger('product:afterAttributeSelect', {\n data: data,\n container: $productContainer,\n type: type\n });\n }\n\n if (type === 'color') {\n if (data.product.promotions && data.product.promotions.length > 0) {\n const promoContainer = $('.js-promo-loyalty-message-pdp-underprice');\n const promoMessage = data.product.promotions[0].promoLoyaltyMessage;\n if (promoContainer && promoMessage && promoMessage.length) {\n promoContainer.html(promoMessage);\n } else {\n promoContainer.html('');\n }\n } else {\n $('.js-promo-loyalty-message-pdp-underprice').html('');\n }\n }\n\n const _updateInformation = (product) => {\n let selectorPrefix = '';\n if (product.variationAttributes[0].onSaleSelected || product.price.saleType) {\n selectorPrefix = '.onSaleContainer';\n } else {\n selectorPrefix = '.notOnSaleContainer';\n }\n\n $productContainer.find(selectorPrefix + ' .js-discount-msg').addClass('hidden');\n $productContainer.find(selectorPrefix + ' .js-promo-msg').addClass('hidden');\n\n if (product.price.discountValue) {\n $productContainer.prevObject.analyticsPromotion = true;\n $productContainer.find(selectorPrefix + ' .js-discount-msg')\n .html(`(${product.price.discountValue}%)`)\n .removeClass('hidden');\n if (product.promotions && product.promotions.length > 0) {\n if (product.promotions[0].calloutMsg) {\n $productContainer.find(selectorPrefix + ' .js-promo-msg')\n .html(product.promotions[0].calloutMsg)\n .removeClass('hidden');\n } else if (product.promotions[1] && product.promotions[1].calloutMsg) {\n $productContainer.find(selectorPrefix + ' .js-promo-msg')\n .html(product.promotions[1].calloutMsg)\n .removeClass('hidden');\n }\n }\n } else if (product.promotions && product.promotions.length > 0) {\n $productContainer.prevObject.analyticsPromotion = true;\n if (product.promotions[0].calloutMsg) {\n $productContainer.find(selectorPrefix + ' .js-promo-msg')\n .html(product.promotions[0].calloutMsg)\n .removeClass('hidden');\n } else if (product.promotions[1] && product.promotions[1].calloutMsg) {\n $productContainer.find(selectorPrefix + ' .js-promo-msg')\n .html(product.promotions[1].calloutMsg)\n .removeClass('hidden');\n }\n }\n };\n\n if (type !== 'size') {\n _updateInformation(data.product);\n }\n\n if ($('.modal-size-show').length) {\n $.spinner().stop();\n if (type === 'size') {\n $('body').trigger('quickBuy:addToCart', data);\n }\n }\n\n if ($('.js-customizePage').length > 0 && data.totalQuantityPrice) {\n $('.js-personalizePrice').text(data.totalQuantityPrice);\n }\n\n handleInexistentSizeQuickView(data);\n handleWishlistContainer(data.product.id);\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n let current_url = window.location.pathname.split('/');\n var localized_error_page = window.location.protocol + '://' + window.location.host;\n for (var i = 0; i < current_url.length; i++) {\n if (current_url[i] !== 'product') {\n localized_error_page += '/' + current_url[i];\n } else {\n localized_error_page += '/404/';\n break;\n }\n }\n console.log('localized_error_page = ' + localized_error_page);\n window.location.href = localized_error_page;\n }\n $.spinner().stop();\n }\n }).then(function (data) {\n let stopSpinner = sizePanel.afterSizeSelection(data, type);\n if (stopSpinner) {\n $.spinner().stop();\n }\n if (ignoreCTA) {\n $('.js-prod-select-size-modal').find('button.js-add-to-cart').trigger('click');\n }\n if (type === 'color') {\n if (data.product.promotions.length === 0) {\n $('.js-pdpPromo').addClass('hide');\n } else if (data.product.promotions[0].id && data.product.promotions[0].id != $('.js-pdpPromo').attr('data-promotion-id')) {\n reactivatePromoAnimationMessage(data.product.promotions[0].id, data.product.promotions[0].pdpCalloutMsgText);\n } else {\n $('.js-pdpPromo').removeClass('hide');\n }\n }\n });\n }\n};\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nconst getQuantitySelector = ($el) => {\n return $el && $('.set-items').length ?\n $($el).closest('.product-detail').find('.quantity-select') :\n $('.quantity-select');\n};\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nconst getQuantitySelected = ($el) => {\n let quantity = 1;\n if ($el.hasClass('js-add-to-cart-multipack') && $el.data('bundle-quantity')) {\n quantity = $el.data('bundle-quantity');\n } else if ($el.closest('.js-complete-your-promo-quick-view').length > 0) {\n quantity = $el.closest('.wrapper-inner-quick-bottom').find('.js-quick-quantity').val();\n } else if (getQuantitySelector($el).val()) {\n quantity = getQuantitySelector($el).val();\n }\n return quantity;\n};\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nconst processSwatchValues = (attr, $productContainer) => {\n attr.values.forEach(attrValue => {\n const $attrValue = $productContainer.find(`[data-attr=\"${attr.id}\"] [data-attr-value=\"${attrValue.value}\"]`);\n const $swatchAnchor = $attrValue.parent();\n\n if (attrValue.selected) {\n $productContainer.find('.attribute-label').text(attrValue.id.toLowerCase() + ' - ' + attrValue.displayValue.toLowerCase());\n if ($('.js-pdpStickyBar-colorWrapper').length > 0) {\n $('.js-pdpStickyBar-colorWrapper .label-inside').text(attr.displayName + ': ' + attrValue.displayValue.toLowerCase() + ' - ' + attrValue.id.toLowerCase());\n $('.js-pdpStickyBar-colorWrapper img').attr('src', attrValue.images.swatch[0].url);\n $('.js-pdpStickyBar-colorWrapper img').attr('alt', attrValue.displayValue.toLowerCase() + ' - ' + attrValue.id.toLowerCase());\n }\n if ($attrValue[0]) {\n $productContainer.find(`[data-opener=\"${attr.id}\"] .attribute-selection`).html($attrValue[0].outerHTML);\n $attrValue.addClass('selected');\n }\n } else {\n $attrValue.removeClass('selected');\n }\n\n if (attrValue.url) {\n $swatchAnchor.attr('href', attrValue.url);\n } else {\n $swatchAnchor.removeAttr('href');\n }\n\n // Disable if not selectable\n $attrValue.removeClass('selectable unselectable soldout');\n $attrValue.addClass((attrValue.selectable || attrValue.isSoldout) ? 'selectable' : 'unselectable');\n if (attrValue.isSoldout) {\n $attrValue.addClass('soldout');\n }\n });\n};\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nconst processNonSwatchValues = (attr, $productContainer, variantType) => {\n const $attr = `[data-attr=\"${attr.id}\"]`;\n const $defaultOption = $productContainer.find(`${$attr} .select-${attr.id} option:first`);\n $defaultOption.attr('value', attr.resetUrl);\n $productContainer.find(`[data-opener=\"${attr.id}\"] .attribute-selection`).html('');\n\n $productContainer.find('.js-intProductDetail-size-item').addClass('hide');\n attr.values.forEach(attrValue => {\n if ($('.page').data('action') && $('.page').data('action').toLowerCase().indexOf('product-show') > -1 && $('#personalize-page') && !$productContainer.hasClass('js-complete-your-promo-quick-view')) {\n $productContainer = $('.js-intProductDetail');\n }\n const $attrValue = $productContainer.find(`${$attr} [data-attr-value=\"${attrValue.value}\"]`);\n const $attrValueMobile = $productContainer.find(`.size-panel-mobile-content [data-attr-value=\"${attrValue.value}_mobile\"]`);\n $attrValue.attr('value', attrValue.url).removeAttr('disabled');\n $attrValueMobile.attr('value', attrValue.variationUrl);\n if (!attrValue.selected) {\n $attrValueMobile.removeAttr('disabled');\n }\n $attrValue.attr('disabled', !attrValue.selectable);\n if (attrValue.isComingSoon && $productContainer.hasClass('product-quickview')) {\n $attrValue.attr('disabled', attrValue.isComingSoon);\n }\n\n if (attrValue.selected && attrValue.selectable && attrValue.id !== 'TU') {\n $productContainer.find(`[data-opener=\"${attr.id}\"] .attribute-selection`).html(attrValue.displayValue);\n $productContainer.find('.product-quickview').data('pid', attrValue.sku);\n }\n\n if (attrValue.selected && attrValue.selectable) {\n const selectedSizeSpan = $productContainer.find('.js-selected-size');\n\n if (selectedSizeSpan.length) {\n selectedSizeSpan.text(attrValue.displayValue);\n }\n }\n\n if ($attrValue.length > 1) {\n $attrValue.each((i, el) => {\n $(el).prop('checked', attrValue.selected && attrValue.selectable);\n });\n } else {\n $attrValue.prop('checked', attrValue.selected && attrValue.selectable);\n }\n\n if (variantType !== 'size') {\n if (!attrValue.selectable || attrValue.isComingSoon) {\n if ($('#isNotifyActive').val() == 'true') {\n $attrValue.siblings().addClass('notifyMe');\n $attrValueMobile.siblings().addClass('notifyMe');\n } else {\n $attrValue.siblings().addClass('wishlistOnly');\n $attrValueMobile.siblings().addClass('wishlistOnly');\n }\n } else {\n $attrValue.siblings().removeClass('notifyMe wishlistOnly');\n $attrValueMobile.siblings().removeClass('notifyMe wishlistOnly');\n }\n if (attrValue.lowAvailability) {\n $attrValue.siblings().addClass('low-stock');\n $attrValueMobile.siblings().addClass('low-stock');\n } else {\n $attrValue.siblings().removeClass('low-stock');\n $attrValueMobile.siblings().removeClass('low-stock');\n }\n }\n\n // Toggle size if disabled or not\n $attrValue.closest('label').toggleClass('hide', attrValue.disabled);\n $attrValueMobile.closest('label').toggleClass('hide', attrValue.disabled);\n\n // Toggle size in stickybar\n $('.js-pdpStickyBar').find('#' + $attrValue[0].id.replace('/', '\\\\/')).closest('label').toggleClass('hide', attrValue.disabled);\n\n // Same check on quick view mobile\n $attrValue.closest('.label-wrapper').toggleClass('hide', attrValue.disabled);\n\n // Toggle selectable size on cart quickview\n if ($('.quickview-modal').length) {\n $attrValue.closest('.boolean-field').toggleClass('cc-cartQuickView_selectedSize', attrValue.selected);\n }\n });\n\n // Update also size selection modal\n const $sizeSelectorContainer = $('#fis-select-size');\n attr.values.forEach(attrValue => {\n const $attrValue = $sizeSelectorContainer.find(`[data-attr-value=\"${attrValue.value}\"]`);\n $attrValue.attr('disabled', !attrValue.selectable);\n if (attrValue.isComingSoon && $productContainer.hasClass('product-quickview')) {\n $attrValue.attr('disabled', attrValue.isComingSoon);\n }\n\n if ($('#isNotifyActive').val() == 'true') {\n if (!attrValue.selectable || attrValue.isComingSoon) {\n $attrValue.addClass('notifyMe notifyPopup');\n $attrValue.find('.notifyIcon').removeClass('hide');\n } else {\n $attrValue.removeClass('notifyMe notifyPopup');\n $attrValue.find('.notifyIcon').addClass('hide');\n }\n } else {\n if (!attrValue.selectable) {\n $attrValue.addClass('wishlistOnly');\n } else {\n $attrValue.removeClass('wishlistOnly');\n }\n }\n\n // Toggle size if disabled or not\n $attrValue.parent('li').toggleClass('hide', attrValue.disabled);\n\n // TODO: improve check. Force size selection of quick add on PDP mobile\n if (!Foundation.MediaQuery.atLeast('large') && $productContainer.closest('.product-quickview').length) {\n $productContainer.find(`.mobile-attributes-container input[id=\"${attrValue.value}\"]`).prop('checked', attrValue.selected && attrValue.selectable);\n }\n });\n};\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {string} variantType - Size or Color selection\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nconst updateAttrs = (attrs, $productContainer, variantType) => {\n // Currently, the only attribute type that has image swatches is Color.\n const attrsWithSwatches = ['color'];\n\n if ($('.js-personalizeButtonModal').attr('data-personalized') === 'true') {\n $productContainer = $('.fis-select-size');\n }\n\n attrs.forEach(attr => {\n if (attrsWithSwatches.indexOf(attr.attributeId) > -1) {\n processSwatchValues(attr, $productContainer);\n } else {\n processNonSwatchValues(attr, $productContainer, variantType);\n }\n });\n};\n\nconst updateScanTrustLink = (attr, $productContainer) => {\n let $productAuthenticity = $productContainer.find('.cc-details-authenticity-paragraph');\n if ($productAuthenticity.length > 0) {\n $productAuthenticity.find('.js-update-scantrustUrl').attr('href', attr.scanTrustUrlWithParams);\n } \n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n * attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nconst updateAvailability = (response, $productContainer) => {\n let availabilityValue = '';\n let availabilityMessages = response.product.availability.messages;\n if (!response.product.readyToOrder) {\n availabilityValue = `
${response.resources.info_selectforstock}
`;\n } else if (response.product.availability.orderable) {\n availabilityMessages.forEach(message => {\n availabilityValue += `
${message}
`;\n });\n }\n\n if ($('.js-personalizeButtonModal').length > 0) {\n $productContainer = $('.tingle-modal-box__content');\n }\n\n $('.js-soldOut-message').addClass('hidden');\n if (!response.product.available || response.product.comingSoon || response.product.isSizeInexistent) {\n $('.js-soldOut-message').removeClass('hidden');\n $('.js-selected-size:not(.js-selected-size-not-available)').text('-');\n }\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n\n if ($productContainer.hasClass('js-intProductDetail')) {\n if (response.product.isSoldout === true) {\n $productContainer.addClass('cc-isSoldOut js-isSoldOut');\n } else {\n $productContainer.removeClass('cc-isSoldOut js-isSoldOut');\n }\n }\n};\n\n/**\n * Generates html for quick add form\n *\n * @param {string} pid - pid used to get variation\n * @param {string} url - url of the Controller\n * @return Compiled HTML\n */\nconst showQuickAddItems = (pid, url) => {\n if ($('.js-modal-quick-add-size-quantity').attr('data-pid') === pid) {\n $('.js-modal-quick-add-size-quantity').removeClass('hidden');\n return;\n }\n $('.select-size-quick-add-container').empty();\n $.spinner().start();\n $.ajax({\n url: url,\n method: 'GET',\n data: {\n pid: pid\n },\n success: function (data) {\n $('.select-size-quick-add-container[data-pid=\"' + pid + '\"]').html(data);\n const $productContainer = $('.select-size-quick-add-container[data-pid=\"' + pid + '\"]').closest('.product-detail-quick-add');\n $productContainer.find('.add-to-cart-quick-add').attr('data-quantity', 1);\n var selectedValue = $productContainer.find('.add-to-cart-quick-add').attr('data-size-selected');\n if (selectedValue) {\n $productContainer.find('[data-attr-id=\"' + selectedValue + '\"]').attr('checked', true);\n $productContainer.find('.add-to-cart-quick-add').attr('data-size-available', true);\n } else {\n $productContainer.find('.add-to-cart-quick-add').attr('data-size-available', false);\n $productContainer.find('.size-selected').empty();\n }\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n};\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} options - Ajax response options from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nconst updateOptions = (options, $productContainer) => {\n options.forEach(option => {\n const $optionEl = $productContainer.find(`.product-option[data-option-id*=\"${option.id}\"]`);\n option.values.forEach(value => {\n const valueEl = $optionEl.find(`option[data-value-id*=\"${value.id}\"]`);\n valueEl.val(value.url);\n });\n\n option.values.forEach(value => {\n const valueEl = $optionEl.find(`input[id=\"${value.id}\"]`);\n valueEl.data('href', value.url);\n valueEl.attr('href', value.url);\n });\n });\n};\n\nconst updateColorFamily = (product, $productContainer) => {\n $productContainer.find('.family-color').text(product.colorFamily.toLowerCase() + ' - ');\n\n for (let attr of product.variationAttributes) {\n if (attr.attributeId === 'color') {\n if (attr.onSaleSelected) {\n $productContainer.find('.product-color-sales.on-sale').removeClass('hidden');\n $productContainer.find('.product-color-sales.not-on-sale').addClass('hidden');\n } else {\n $productContainer.find('.product-color-sales.on-sale').addClass('hidden');\n $productContainer.find('.product-color-sales.not-on-sale').removeClass('hidden');\n }\n }\n }\n};\n\nconst updatePrices = (product, $productContainer, resources) => {\n if (!product.variationAttributes ||\n !product.variationAttributes[0] ||\n product.variationAttributes[0].attributeId !== 'color') {\n return;\n }\n let selectorPrefix = '';\n if (product.variationAttributes[0].onSaleSelected || product.price.discountValue) {\n selectorPrefix = '.onSaleContainer';\n } else {\n selectorPrefix = '.notOnSaleContainer';\n }\n const priceSelector = selectorPrefix + '.prices .price';\n const priceInfoSelector = ':not(.js-omnibusLabel-wrapper) > .cc-priceOmnibusLabel .price-info';\n const $oldPriceInfoSelector = $(':not(.js-omnibusLabel-wrapper) > .cc-priceOmnibusLabel .js-oldPriceInfo');\n const $regularPriceInfoDiscountSelector = $('.js-priceInfo-discountValue');\n const $oldPriceInfoDiscountSelector = $('.js-oldPriceInfo-discountValue');\n const $pricePercentage = $('.js-pricePercentage');\n const $priceSelector = $(priceSelector, $productContainer).length ?\n $(priceSelector, $productContainer) :\n $(priceSelector);\n const $priceInfoSelector = $(priceInfoSelector, $productContainer).length ?\n $(priceInfoSelector, $productContainer) :\n $(priceInfoSelector);\n const priceInfoInSaleContainerSelector = '.cc-intProductDetail-colors .cc-priceOmnibusLabel .price-info';\n const $priceInfoInSaleContainerSelector = $(priceInfoInSaleContainerSelector, $productContainer);\n const priceInfoInSaleContainerSelector2 = '.cc-intProductDetail-colors .cc-priceOmnibusLabel .js-oldPriceInfo';\n const $priceInfoInSaleContainerSelector2 = $(priceInfoInSaleContainerSelector2, $productContainer);\n const $omnibusPricelForSpecificCountries = $('.js-intProductDetail-attributes-wrapper .js-priceOmnibusLabel .price-info');\n window.onSalesInfoPrice = $priceInfoInSaleContainerSelector.text();\n $priceSelector.replaceWith(product.price.html);\n const currentCountryOmnibus = $oldPriceInfoSelector.closest('.js-omnibusStack').data('currentcountry');\n const isRegularOmnibusCountry = $oldPriceInfoSelector.closest('.js-omnibusStack').data('omnibuscountry');\n if (product.price.sales.formattedPriceInfo) {\n $priceInfoSelector.parent().show();\n $priceInfoSelector.html(product.price.sales.formattedPriceInfo);\n const isCountryWithTooltip = currentCountryOmnibus === 'IT' || currentCountryOmnibus === 'ES' || currentCountryOmnibus === 'SI';\n if (isCountryWithTooltip && resources.tooltip_omnibus && $('i.omnibus-tooltip').length === 0) {\n $('.product-main-price.onSaleContainer .price').append('i

' + resources.tooltip_omnibus + '

');\n }\n if (isRegularOmnibusCountry) {\n $oldPriceInfoSelector.parent().show();\n $oldPriceInfoDiscountSelector.html(product.price.sales.oldPriceOmnibus.priceInfoDiscountValue + '%');\n $oldPriceInfoDiscountSelector.show();\n }\n $oldPriceInfoSelector.html(product.price.list.formatted);\n $regularPriceInfoDiscountSelector.html(product.price.discountValue + '%');\n $priceInfoInSaleContainerSelector.parent().addClass('hidden');\n $priceInfoInSaleContainerSelector2.parent().addClass('hidden');\n $omnibusPricelForSpecificCountries.parent().addClass('hidden');\n window.onSalesInfoPrice = product.price.sales.formattedPriceInfo;\n $priceInfoInSaleContainerSelector2.html(product.price.sales.oldPriceOmnibus.price);\n $pricePercentage.hide();\n } else {\n $priceInfoSelector.parent().hide();\n $priceInfoSelector.html('');\n if (window.onSalesInfoPrice) {\n if (currentCountryOmnibus === 'IT' || currentCountryOmnibus === 'ES' || currentCountryOmnibus === 'SI') {\n $omnibusPricelForSpecificCountries.parent().removeClass('hidden');\n $omnibusPricelForSpecificCountries.html(window.onSalesInfoPrice);\n } else if (isRegularOmnibusCountry) {\n $priceInfoInSaleContainerSelector.parent().removeClass('hidden');\n $priceInfoInSaleContainerSelector.html(window.onSalesInfoPrice);\n $priceInfoInSaleContainerSelector2.parent().removeClass('hidden');\n } else {\n $priceInfoInSaleContainerSelector.parent().removeClass('hidden');\n $priceInfoInSaleContainerSelector.html(window.onSalesInfoPrice);\n }\n }\n $oldPriceInfoSelector.parent().hide();\n $oldPriceInfoSelector.html('');\n if (product.price.discountValue) {\n $pricePercentage.show();\n }\n }\n\n if (product.doubleCurrency && product.doubleCurrency.html) {\n const $doubleCurrencyContainer = $('#descriptionSidebar .js-priceSecondCurrency', $productContainer);\n const innerContent = $(product.doubleCurrency.html).html();\n $doubleCurrencyContainer.html(innerContent);\n }\n\n $productContainer.find(selectorPrefix + ' .js-discount-msg').addClass('hidden');\n $productContainer.find(selectorPrefix + ' .js-promo-msg').addClass('hidden');\n if (product.price.discountValue) {\n $productContainer.find(selectorPrefix + ' .js-discount-msg')\n .html(`(${product.price.discountValue}%)`)\n .removeClass('hidden');\n if (product.promotions && product.promotions.length > 0) {\n if (product.promotions[0].calloutMsg) {\n $productContainer.find(selectorPrefix + ' .js-promo-msg')\n .html(product.promotions[0].calloutMsg)\n .removeClass('hidden');\n } else if (product.promotions[1] && product.promotions[1].calloutMsg) {\n $productContainer.find(selectorPrefix + ' .js-promo-msg')\n .html(product.promotions[1].calloutMsg)\n .removeClass('hidden');\n }\n }\n } else if (product.promotions && product.promotions.length > 0) {\n if (product.promotions[0].calloutMsg) {\n $productContainer.find(selectorPrefix + ' .js-promo-msg')\n .html(product.promotions[0].calloutMsg)\n .removeClass('hidden');\n } else if (product.promotions[1] && product.promotions[1].calloutMsg) {\n $productContainer.find(selectorPrefix + ' .js-promo-msg')\n .html(product.promotions[1].calloutMsg)\n .removeClass('hidden');\n }\n }\n\n $productContainer.find(selectorPrefix + ' .js-loyalty').addClass('hidden');\n $productContainer.find(selectorPrefix + ' .js-loyaltysale').addClass('hidden');\n if (product.price.saleType) {\n let saleType = product.price.saleType;\n if (saleType === 'loyalty1' || saleType === 'loyalty2' || saleType === 'loyalty3' || saleType === 'loyalty4') {\n saleType = 'loyalty';\n } else if (saleType === 'loyaltysale1' || saleType === 'loyaltysale2' || saleType === 'loyaltysale3' || saleType === 'loyaltysale4') {\n saleType = 'loyaltysale';\n }\n $productContainer.find(selectorPrefix + ' .js-' + saleType).removeClass('hidden');\n }\n\n if (product.comingSoon) {\n $productContainer.find('.comingSoonBox').removeClass('hide');\n $productContainer.find('.comingSoonLabel-pdp').removeClass('hidden');\n $productContainer.find(selectorPrefix + ' .js-new-msg').addClass('hidden');\n $productContainer.find(selectorPrefix + ' .js-green-msg').addClass('hidden');\n // $productContainer.find(selectorPrefix + '.js-promo-msg').addClass('hidden');\n } else {\n $productContainer.find('.comingSoonBox').addClass('hide');\n $productContainer.find('.comingSoonLabel-pdp').addClass('hidden');\n $productContainer.find(selectorPrefix + ' .js-new-msg').addClass('hidden');\n $productContainer.find(selectorPrefix + ' .js-green-msg').addClass('hidden');\n if (product.New) {\n $productContainer.find(selectorPrefix + ' .js-new-msg').removeClass('hidden');\n }\n if (product.isGreen) {\n $productContainer.find(selectorPrefix + ' .js-new-msg').addClass('hidden');\n $productContainer.find(selectorPrefix + ' .js-green-msg').removeClass('hidden');\n }\n // $productContainer.find(selectorPrefix + '.js-promo-msg').removeClass('hidden');\n }\n};\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nconst handleVariantResponseQuickAdd = (response, $productContainer, imagesShouldUpdate = true) => {\n if (response.product.variationAttributes) {\n updateAttrs(response.product.variationAttributes, $productContainer);\n }\n\n updateAvailability(response, $productContainer);\n\n $('body').trigger('product:updateAddToCartQuickAdd', {\n product: response.product,\n $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n};\n\nconst updateImageSaveForLater = (product, $productContainer) => {\n $productContainer.find('.js-product-image-saveForLater').attr('src', product.images.small[0].url);\n $productContainer.find('.js-product-image-saveForLater').attr('alt', product.images.small[0].url);\n $productContainer.find('.js-product-image-saveForLater').attr('title', product.images.small[0].title);\n};\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nconst handleVariantResponse = (response, $productContainer, imagesShouldUpdate = true, variantType) => {\n if (response.product.variationAttributes) {\n updateAttrs(response.product.variationAttributes, $productContainer, variantType);\n updateColorFamily(response.product, $productContainer);\n updateScanTrustLink(response, $productContainer);\n }\n const $container = $('.js-composition-info');\n\n if (response.product.partTypes) {\n $container.empty();\n const html = `
`;\n $container.append(html);\n\n for (var k = 0; k < response.product.partTypes.length; k++) {\n if (k == 0) {\n var type = `${response.product.partTypes[k].type}: `;\n $container.append(type);\n }\n if (k < response.product.partTypes.length - 1) {\n if (response.product.partTypes[k].type == response.product.partTypes[k + 1].type) {\n var comp = `${response.product.partTypes[k].percentage} % ${response.product.partTypes[k].material}, `;\n $container.append(comp);\n } else {\n var comp = `${response.product.partTypes[k].percentage} % ${response.product.partTypes[k].material}`;\n var type = `
${response.product.partTypes[k + 1].type}: `;\n\n $container.append(comp);\n $container.append(type);\n }\n } else {\n var comp = `${response.product.partTypes[k].percentage} % ${response.product.partTypes[k].material} `;\n $container.append(comp);\n }\n }\n const endTag = `
`;\n $container.append(endTag);\n } else if (response.product.mainComposition) {\n $container.empty();\n const html = `
`;\n $container.append(html);\n\n for (var k = 0; k < response.product.mainComposition.length; k++) {\n if (k == response.product.mainComposition.length - 1) {\n var comp = `${response.product.mainComposition[k].percentage} % ${response.product.mainComposition[k].material} `;\n } else {\n var comp = `${response.product.mainComposition[k].percentage} % ${response.product.mainComposition[k].material}, `;\n }\n\n $container.append(comp);\n }\n const endTag = `
`;\n $container.append(endTag);\n }\n\n // Update primary images\n if (imagesShouldUpdate) {\n const primaryImageUrls = response.product.images;\n if ($productContainer.hasClass('product-quickview:not(.product-quickview--get-product)')) {\n if ($productContainer.find('.carousel-inner').hasClass('slick-initialized')) {\n $productContainer.find('.carousel-inner').slick('destroy');\n }\n $productContainer.find('.carousel-inner').empty();\n $productContainer.find('.product-link-carousel').attr('href', response.product.selectedProductUrl);\n\n primaryImageUrls.large.forEach((imageUrl, idx) => {\n let $carouselInner = $($('#outer').html());\n $productContainer.find('.carousel-inner').append($carouselInner);\n\n let $imgContainer = $carouselInner.find('img');\n $imgContainer.data('index', idx);\n $imgContainer.attr('id', null);\n $imgContainer.attr('src', imageUrl.url).removeClass('hidden');\n });\n\n if (Foundation.MediaQuery.atLeast('large')) {\n $productContainer.find('.carousel-inner').slick({\n slidesToShow: 1,\n slidesToScroll: 1,\n dots: false\n });\n }\n } else if ($productContainer.hasClass('product-quickview--get-product')) {\n if ($productContainer.find('.carousel-inner').hasClass('slick-initialized')) {\n $productContainer.find('.carousel-inner').slick('destroy');\n }\n $productContainer.find('.carousel-inner').empty();\n $productContainer.find('.product-link-carousel').attr('href', response.product.selectedProductUrl);\n\n primaryImageUrls.large.forEach((imageUrl, idx) => {\n let $carouselInner = $($('#outer').html());\n $productContainer.find('.carousel-inner').append($carouselInner);\n\n let $imgContainer = $carouselInner.find('img');\n $imgContainer.data('index', idx);\n $imgContainer.attr('id', null);\n $imgContainer.attr('src', imageUrl.url).removeClass('hidden');\n });\n\n $productContainer.find('.carousel-inner').slick({\n dots: false,\n arrows: false,\n slidesToShow: 2.35,\n infinite: false,\n slidesToScroll: 1,\n responsive: [\n {\n breakpoint: 1023,\n settings: {\n slidesToShow: 2.5\n }\n }]\n });\n } else {\n $('.mobile-gallery').slick('slickUnfilter');\n $productContainer.find('.primary-images .carousel-item').addClass('hidden');\n $productContainer.find('.js-intProductDetail-images-container .desktop-gallery-item').addClass('hidden');\n $productContainer.find('.cc-intProductDetail-images').addClass('hidden');\n $('#zoomModal').data('numberOfImages', primaryImageUrls.large.length);\n // For each image check if tag is generated otherwise generate it and change its src\n primaryImageUrls.large.forEach((imageUrl, idx) => {\n var resizedUrls = '';\n if (imageUrl.resizedUrls) {\n var srcSetArray = imageUrl.resizedUrls.map((element, index) => {\n return element + ' ' + imageUrl.sizes[index].scaleWidth + 'w';\n });\n resizedUrls = srcSetArray.join(',');\n }\n let $imgContainer = $productContainer.find('.primary-images').find(`img[data-index=\"${idx}\"]`);\n let $imgContainerDesktop = $productContainer.find('.js-intProductDetail-images-container').find(`img[data-index=\"${idx}\"]`);\n let $imgZoomModal = $productContainer.find('.js-zoomModal').find(`img[data-index=\"${idx}\"]`);\n let $imgZoomModalMobile = $productContainer.find('.js-zoomModalMobile').find(`img[data-index=\"${idx}\"]`);\n\n if (!$imgContainer.length) {\n let newCarouselSlideHtml = $('#outer').html().replaceAll('{imgIdx}', idx);\n $productContainer.find('.primary-images').slick('slickAdd', newCarouselSlideHtml);\n $imgContainer = $productContainer.find(`.primary-images img[data-index=\"${idx}\"]`);\n }\n if (!$imgContainerDesktop.length) {\n let $galleryItemContainer = $($('#outer-desktop').html().replaceAll('{imgIdx}', idx));\n $productContainer.find('.js-intProductDetail-images-container').append($galleryItemContainer);\n\n $imgContainerDesktop = $galleryItemContainer.find('img');\n $imgContainerDesktop.attr('data-index', idx);\n }\n if (!$imgZoomModal.length) {\n let $zoomTemplate = $($('#zoom-template').html());\n $productContainer.find('.js-zoomModal-content').append($zoomTemplate);\n\n $imgZoomModal = $zoomTemplate.find('img');\n $imgZoomModal.attr('data-index', idx);\n }\n\n if (!$imgZoomModalMobile.length) {\n let $zoomTemplate = $($('#zoom-template').html().replaceAll('{imgIdx}', idx));\n $productContainer.find('.js-zoomModal-content').append($zoomTemplate);\n\n $imgZoomModalMobile = $zoomTemplate.find('img');\n $imgZoomModalMobile.attr('data-index', idx);\n }\n\n if (imageUrl.resizedUrls) {\n $productContainer.find('.primary-images').find(`img[data-index=\"${idx}\"]`).attr('data-srcset', resizedUrls);\n $productContainer.find('.js-intProductDetail-images-container').find(`img[data-index=\"${idx}\"]`).attr('data-srcset', resizedUrls);\n if ($imgZoomModal.length) {\n $imgZoomModal.attr('srcset', resizedUrls).attr('data-srcset', resizedUrls);\n }\n if ($imgZoomModalMobile.length) {\n $imgZoomModalMobile.attr('srcset', resizedUrls).attr('data-srcset', resizedUrls);\n }\n }\n $imgZoomModalMobile.attr('src', imageUrl.url).attr('data-src', imageUrl.url).removeClass('hidden');\n $imgZoomModal.attr('src', imageUrl.url).attr('data-src', imageUrl.url).removeClass('hidden');\n $productContainer.find(`.cc-intProductDetail-images[data-index=\"${idx}\"]`).removeClass('hidden');\n $productContainer.find('.primary-images').find(`img[data-index=\"${idx}\"]`).attr('src', imageUrl.url).attr('data-src', imageUrl.url).removeClass('lazyloaded').addClass('lazyload');\n $productContainer.find('.js-intProductDetail-images-container').find(`img[data-index=\"${idx}\"]`).attr('src', imageUrl.url).attr('data-src', imageUrl.url).removeClass('lazyloaded').addClass('lazyload');\n $productContainer.find('.primary-images').find(`.carousel-item[data-index=${idx}]`).removeClass('hidden');\n $productContainer.find('.js-intProductDetail-images-container').find(`.desktop-gallery-item[data-index=${idx}]`).removeClass('hidden');\n });\n const videoUrl = response.product.videoURL;\n $('.primary-images .js-productVideoContainer').remove();\n $('.js-intProductDetail-images-container .js-productVideoContainer').remove();\n if (videoUrl) {\n // insert primary video in mobile carousel\n let tmpl = $('.js-productVideoContainerOuter').clone()[0];\n tmpl.setAttribute('class', 'carousel-item cc-productVideoContaner js-productVideoContainer');\n $productContainer.find('.primary-images').slick('slickAdd', tmpl, 2, true);\n\n // insert primary video in desktop gallery\n tmpl = $($('#pdp-video-template-desktop').html());\n let $secondItem = $productContainer.find('.js-intProductDetail-images-container .desktop-gallery-item')[1];\n tmpl.insertAfter($secondItem);\n\n $productContainer.find('.js-productVideoContainer source').attr('src', videoUrl);\n\n let videoBlock = $productContainer.find('.js-productVideoContainer video');\n if (videoBlock && videoBlock.length > 0) {\n videoBlock[0].load();\n videoBlock[0].autoplay = true;\n }\n videoListener();\n }\n $('.primary-images').slick('slickGoTo', 0);\n $('.primary-images').slick('slickFilter', ':not(.hidden)');\n if (primaryImageUrls.small.length > 0) {\n $('.still-life-img').data('still-life', primaryImageUrls.small[0].url);\n }\n\n updatePrimaryImagesSlider(primaryImageUrls.large);\n }\n }\n\n // Update pricing\n if (response.product.price) {\n updatePrices(response.product, $productContainer, response.resources);\n }\n\n updateAvailability(response, $productContainer);\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $('button.js-add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n product: response.product,\n $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n\n if ($('.js-personalizeButtonModal').length == 0) {\n careAndMaintenance(response.product.id);\n }\n\n var countryEnabled = window.PersonalizationEnabledCountries.PersonalizationEnabledCountries;\n if (response.variation.isPersonalizedVal && response.variation.positions > 0 && countryEnabled) {\n showButton(response);\n } else {\n $('#personalizeButton').addClass('hidden');\n }\n\n updateModelSize(response, $productContainer);\n};\n\nconst updateModelSize = (response, $productContainer) => {\n $('.js-product-model-size').addClass('hide');\n var modelSize = response.product.modelSize;\n if (!modelSize) {\n return;\n }\n\n $('.js-product-model-size').removeClass('hide').find('.js-modelSizeValue').text(modelSize);\n};\n\nconst handleVariationUrlsSelectSizeModal = (variationUrls) => {\n variationUrls.forEach(function (element) {\n $('#whislistSizeSelection-' + element.id).attr('data-attr-info-url', element.variationUrl);\n });\n};\nconst handlePromotionTag = (product, $productContainer) => {\n $productContainer.find('.js-promo-msg').addClass('hidden');\n if (product.promotions && product.promotions.length > 0) {\n for (var i = 0; i < product.promotions.length; i++) {\n if (product.promotions[i].promotionClass === 'PRODUCT' && product.promotions[i].calloutMsg) {\n $productContainer.find('.js-promo-msg').html(product.promotions[i].calloutMsg).removeClass('hidden');\n break;\n }\n }\n }\n};\n\nconst handleVariationUrlsSelectNotifyModal = (variationUrls) => {\n variationUrls.forEach(function (element) {\n if ((element.id).indexOf('/') != -1) {\n let cleanId = (element.id).split('/')[0] + '\\\\/' + (element.id).split('/')[1];\n $('#' + cleanId).attr('data-url', element.variationUrl);\n $('#' + cleanId).parent().attr('sku', element.sku);\n $('.add-size-saveForLater input[data-attr-value=\"' + cleanId + '\"]').parent().removeClass('disabled');\n if (!element.selectable) {\n $('.add-size-saveForLater input[data-attr-value=\"' + cleanId + '\"][data-sku=\"' + element.sku + '\"]').parent().addClass('disabled');\n }\n } else {\n $('#' + element.id).attr('data-url', element.variationUrl);\n $('#' + element.id).parent().attr('data-sku', element.sku);\n $('#' + element.id).attr('data-sku', element.sku);\n $('#' + element.id).attr('data-allocation', element.allocation);\n $('#' + element.id).parent().find('.js-container').removeClass('notifyPopup').removeClass('notifyMe');\n $('#' + element.id + '_mobile').parent().find('.js-container').removeClass('notifyPopup').removeClass('notifyMe');\n $('.js-add-size-saveForLater input[data-attr-value=\"' + element.id + '\"]').parent().removeClass('cc-disabled');\n $('.js-add-size-saveForLater input[data-attr-value=\"' + element.id + '\"]').parent().removeClass('cc-selected');\n if (element.selectable === false) {\n $('.js-add-size-saveForLater input[data-attr-value=\"' + element.id + '\"]').parent().addClass('cc-disabled');\n }\n if (element.selected === true) {\n $('.js-add-size-saveForLater input[data-attr-value=\"' + element.id + '\"]').parent().addClass('cc-selected');\n }\n if (element.allocation === 0 || element.isComingSoon) {\n $('.js-add-size-saveForLater input[data-attr-value=\"' + element.id + '\"]').parent().addClass('cc-disabled');\n $('#' + element.id).parent().find('.js-container').addClass('notifyMe').addClass('notifyPopup');\n $('#' + element.id + '_mobile').parent().find('.js-container').addClass('notifyMe').addClass('notifyPopup');\n }\n }\n });\n};\n\nconst handleVariationComingSoonNotifyModal = (comingSoons) => {\n comingSoons.forEach(function (element) {\n if ((element.id).indexOf('/') != -1) {\n let cleanId = (element.id).split('/')[0] + '\\\\/' + (element.id).split('/')[1];\n $('#' + cleanId).attr('data-isComingSoon', element.isComingSoon);\n } else {\n $('#' + element.id).attr('data-isComingSoon', element.isComingSoon);\n }\n });\n};\nconst handleVariationComingSoon = (comingSoons) => {\n if (!comingSoons) {\n $('.marketing-budge.js-comingSoonBox').addClass('hide');\n $('.js-comingSoonBox.pdp-comingSoonBox').addClass('hide');\n } else {\n $('.marketing-budge.js-comingSoonBox').removeClass('hide');\n $('.js-comingSoonBox.pdp-comingSoonBox').removeClass('hide');\n }\n};\n\nconst handleVariationWishlistModal = (variationUrls) => {\n variationUrls.forEach(function (element) {\n if ((element.id).indexOf('/') != -1) {\n let cleanId = (element.id).split('/')[0] + '\\\\/' + (element.id).split('/')[1];\n $('#fis-select-size-wishlist').find('#whislistSizeSelection').find('button*[data-attr-value=\"' + cleanId + '\"]').attr('data-attr-info-url', element.variationUrl);\n $('#fis-select-size-wishlist').find('#whislistSizeSelection').find('button*[data-attr-value=\"' + cleanId + '\"]').attr('data-attr-selectable', element.selectable ? 'selectable' : 'not-selectable');\n } else {\n $('#fis-select-size-wishlist').find('#whislistSizeSelection').find('button*[data-attr-value=\"' + element.id + '\"]').attr('data-attr-info-url', element.variationUrl);\n $('#fis-select-size-wishlist').find('#whislistSizeSelection').find('button*[data-attr-value=\"' + element.id + '\"]').attr('data-attr-selectable', element.selectable ? 'selectable' : 'not-selectable');\n }\n });\n};\n\n/**\n * This is a workaround for inexisting sizes for the cart's quick view.\n * It should be handled at decorator level but the list of actual variants is incoherent.\n */\nconst handleInexistentSizeQuickView = (data) => {\n if (!data.product.isSizeInexistent || !$('.quickview-modal').length) {\n return;\n }\n\n $('.product-content-size').find('input[data-size-id]').removeClass('hide')\n .closest('.boolean-field').removeClass('hide')\n .closest('.label-wrapper').removeClass('hide');\n};\n\nfunction showButton (response) {\n // $('#iconPersMobile').removeClass('hidden');\n if (response.variation.isPersonalizedVal === true) {\n $('#personalizeButton').removeClass('hidden');\n } else {\n $('#personalizeButton').addClass('hidden');\n }\n $('#personalizeButton')\n .attr('product-id', response.product.id)\n .attr('data-positions', response.variation.positions)\n .attr('data-customizations', response.variation.customizations)\n .attr('data-personalizationImgTop', response.variation.personalizationImgTop)\n .attr('data-personalizationImgDown', response.variation.personalizationImgDown);\n\n var link = $('#personalizeButton').attr('data-url') + '?pid=' + response.product.id +\n '&positions=' + response.variation.positions +\n '&quantity=' + response.product.selectedQuantity;\n $('#personalizeButton a').attr('href', link);\n $('#personalizeButton button').attr('data-url', link);\n\n var linkPlp = $('#personalizeButton').attr('data-url') + '?pid=' + response.product.id +\n '&positions=' + response.variation.positions +\n '&quantity=' + response.product.selectedQuantity +\n '&sizeAttribute=' + $('.persButtonPdpPers').attr('size-attribute');\n\n $('#persButtonPdpPersLink').attr('href', linkPlp);\n}\n\nfunction careAndMaintenance (pid) {\n $('#main-and-care-label-wash-description').removeClass('hidden');\n $('#main-and-care-label').addClass('hidden');\n\n if (!$('#main-and-care').length) {\n return;\n }\n\n $.ajax({\n url: $('#main-and-care').attr('data-url'),\n data: {\n pid: pid\n },\n method: 'GET',\n success: data => {\n $('#cm-container').empty().html(data.html);\n $.spinner().stop();\n },\n error: () => {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n * etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nconst updateQuantities = (quantities, $productContainer) => {\n if (!($productContainer.parent('.bonus-product-item').length > 0)) {\n const optionsHtml = quantities.map(quantity => {\n const selected = quantity.selected ? 'selected' : '';\n return ``;\n }).join('');\n if ($productContainer.hasClass('product-detail-quick-add')) {\n $('.quantity-select-quick-add').empty().html(optionsHtml);\n } else {\n getQuantitySelector($productContainer).empty().html(optionsHtml);\n }\n }\n};\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nconst getAddToCartUrl = () => {\n return $('.add-to-cart-url').val();\n};\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nconst parseHtml = html => {\n var $html = $('
').append($.parseHTML(html));\n\n var body = '';\n let $results = $html.find('.choice-of-bonus-product');\n for (let i = 0; i < $results.length; i++) {\n body += $results[i].outerHTML;\n }\n var footer = $html.find('.modal-footer').children().html();\n\n return {\n body: body,\n footer: footer\n };\n};\n\n// Generates a PID based on the current selected attributes\nconst getPID = (product) => {\n if (typeof product === 'string') {\n return product.trim();\n }\n\n // size and color have already been selected. In this case, the variation\n // group is built with the style of the product, 'color' and the selected\n // color variation\n if (product.productType === 'variant') {\n let sku = product.id;\n return sku;\n } else if (product.productType === 'variationGroup') {\n // in this case the user only chose the color, and not the size\n let pid = product.id.split('_')[0].trim();\n\n let selectedVariation;\n\n for (let k in product.variationAttributes) {\n const variationAttribute = product.variationAttributes[k];\n if (variationAttribute.attributeId === 'color') {\n for (let j in variationAttribute.values) {\n if (variationAttribute.values[j].selected === true) {\n selectedVariation = variationAttribute.values[j].value;\n break;\n }\n }\n }\n if (selectedVariation !== undefined) {\n break;\n }\n }\n\n return pid + '_color_' + selectedVariation;\n }\n\n return '';\n};\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nconst handlePostCartAdd = (response) => {\n $('.js-mainHeader-minicart').trigger('count:update', response);\n \n const cookies = document.cookie.split(';');\n let cookieSizebaySessionId = null;\n for (let i = 0; i < cookies.length; i++) {\n const cookie = cookies[i].trim();\n if (cookie.startsWith('SIZEBAY_SESSION_ID_V4')) {\n cookieSizebaySessionId = cookie.substring('SIZEBAY_SESSION_ID_V4='.length).replaceAll('\"', '');\n break;\n }\n };\n\n if (cookieSizebaySessionId === null) {\n let urlSessionId = document.querySelector('#sizebayAddProduct').getAttribute('data-sizebaysessionidurl');\n fetch(urlSessionId)\n .then(response => {\n if (!response.ok) {\n throw new Error('Network response was not ok');\n }\n return response.json();\n })\n .then(data => {\n createCookie('SIZEBAY_SESSION_ID_V4', data);\n callSizebayAPI(data);\n })\n } else {\n callSizebayAPI(cookieSizebaySessionId);\n }\n};\n\nfunction callSizebayAPI(data) {\n let url = document.querySelector('#sizebayAddProduct').getAttribute('data-sizebay-link') + '=' + data;\n let brandURL = document.querySelector('#sizebayAddProduct').getAttribute('data-referrer-sizebay-link');\n let currentCountry = document.querySelector('#sizebayAddProduct').getAttribute('data-sizebay-locale');\n if (!brandURL.includes(currentCountry)) {\n brandURL += '/' + currentCountry + '/';\n }\n let permaURL = brandURL + document.querySelector('.analytics.product.hidden').getAttribute('data-item_id');\n let urlSizebay = new URL(url);\n if (urlSizebay.searchParams.has('sid') && urlSizebay.searchParams.get('sid') === 'null') {\n urlSizebay.searchParams.set('sid', data.trim().replace(/^\"|\"$/g, ''));\n url = urlSizebay.toString();\n }\n let payload = JSON.stringify({\n \"products\": [\n {\n \"permalink\": permaURL\n }\n ],\n \"tenantId\": 2399\n });\n\n let device = $('.cc-intProductDetail-left-content .cell .js-intProductDetail-images-container.cc-intProductDetail-images-container').css('display') === 'block' ? 'mobile' : 'desktop';\n let referrerURL = new URL(window.location.href);\n try {\n fetch(url, {\n method: 'POST',\n body: payload,\n referrerPolicy: \"origin-when-cross-origin\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n tenant_id: '2399',\n device: device,\n referer: referrerURL.hostname\n }\n });\n } catch (error) {\n console.error(\"Error: \", error);\n }\n}\n\nfunction updateQuantityPicker (source) {\n if (source === null || source.closest('.js-pdpStickyBar-btn').length > 0 || source.closest('.js-customizePage').length > 0) {\n source = $('.attribute-container.quantity');\n } else {\n source = source.closest('.attribute-container.quantity');\n }\n\n let value = parseInt(source.find('.js-quantity-value').html());\n if (value === 10) {\n source.find('.js-quantity-button[data-action=\"increase\"]').addClass('disabled');\n source.find('.js-quantity-button[data-action=\"decrease\"]').removeClass('disabled');\n if ($('.js-pdpStickyBar-btn').length > 0) {\n $('.js-pdpStickyBar-btn .js-quantity-button[data-action=\"increase\"]').addClass('disabled');\n $('.js-pdpStickyBar-btn .js-quantity-button[data-action=\"decrease\"]').removeClass('disabled');\n }\n } else if (value === 1) {\n source.find('.js-quantity-button[data-action=\"decrease\"]').addClass('disabled');\n source.find('.js-quantity-button[data-action=\"increase\"]').removeClass('disabled');\n if ($('.js-pdpStickyBar-btn').length > 0) {\n $('.js-pdpStickyBar-btn .js-quantity-button[data-action=\"decrease\"]').addClass('disabled');\n $('.js-pdpStickyBar-btn .js-quantity-button[data-action=\"increase\"]').removeClass('disabled');\n }\n } else {\n source.find('.js-quantity-button[data-action=\"increase\"]').removeClass('disabled');\n source.find('.js-quantity-button[data-action=\"decrease\"]').removeClass('disabled');\n if ($('.js-pdpStickyBar-btn').length > 0) {\n $('.js-pdpStickyBar-btn .js-quantity-button[data-action=\"increase\"]').removeClass('disabled');\n $('.js-pdpStickyBar-btn .js-quantity-button[data-action=\"decrease\"]').removeClass('disabled');\n }\n }\n}\n\nconst calculateWatchedTime = (video) => {\n let percentageWatched = video.currentTime * 100 / video.duration;\n return percentageWatched;\n};\n\nconst triggerVideoInteractionEvent = (action, fullPageLoad) => {\n $('body').trigger('analytics:videoInteraction', {action: action, fullPageLoad: fullPageLoad});\n};\n\nconst videoListener = (fullPageLoad = false) => {\n const $videoBlockContainer = $('.js-productVideoContainer');\n const $videoPlayMiniatureIcon = $('.productVideoMiniatureMobile.js-productVideoMiniatureMobile').find('.videoMiniatureIcon');\n let percentageWatched = 0;\n let firstPlayback = true;\n let watchedFullVideo = false;\n let videoStartInSeconds = 0;\n let videoEndInSeconds = 0;\n if ($videoBlockContainer.length > 0 && !$videoBlockContainer.hasClass('hidden')) {\n var myVideo = $videoBlockContainer.find('video')[0];\n myVideo.onended = function () {\n myVideo.currentTime = 0;\n };\n myVideo.onplaying = function () {\n if (myVideo.autoplay) {\n triggerVideoInteractionEvent('auto_play', fullPageLoad);\n }\n myVideo.autoplay = false;\n };\n myVideo.onpause = function () {\n if (!firstPlayback) {\n watchedFullVideo = videoEndInSeconds - videoStartInSeconds > myVideo.duration;\n triggerVideoInteractionEvent('pause', fullPageLoad);\n if (watchedFullVideo) {\n triggerVideoInteractionEvent('full_view', fullPageLoad);\n } else if (percentageWatched >= 25 && percentageWatched < 50) {\n triggerVideoInteractionEvent('view25', fullPageLoad);\n } else if (percentageWatched >= 50 && percentageWatched < 75) {\n triggerVideoInteractionEvent('view50', fullPageLoad);\n } else if (percentageWatched >= 75 && percentageWatched < 100) {\n triggerVideoInteractionEvent('view75', fullPageLoad);\n } else if (percentageWatched === 100) {\n triggerVideoInteractionEvent('full_view', fullPageLoad);\n }\n }\n firstPlayback = false;\n };\n $('.js-pauseVideoIcon').on('click', function () {\n myVideo.loop = false;\n percentageWatched = calculateWatchedTime(myVideo);\n videoEndInSeconds = new Date().getTime() / 1000;\n myVideo.pause();\n myVideo.currentTime = 0;\n $videoBlockContainer.find('.js-pauseVideoIcon').addClass('hide');\n $videoBlockContainer.find('.js-playVideoIcon').removeClass('hide');\n $videoPlayMiniatureIcon.removeClass('black-border');\n });\n $('.js-playVideoIcon').on('click', function () {\n myVideo.loop = true;\n $videoBlockContainer.find('.js-pauseVideoIcon').removeClass('hide');\n $videoBlockContainer.find('.js-playVideoIcon').addClass('hide');\n $videoPlayMiniatureIcon.addClass('black-border');\n if (myVideo.paused && !myVideo.autoplay) {\n triggerVideoInteractionEvent('play', fullPageLoad);\n }\n videoStartInSeconds = new Date().getTime() / 1000;\n myVideo.play();\n });\n }\n};\n\n/**\n * reorder the swatches in $swatchContainer in order to push the soldout ones at the end\n */\nconst reorderSwatches = ($swatchContainer) => {\n if ($swatchContainer.find('span.swatch-value.soldout').length === 0) {\n return;\n }\n var $soldoutColorsContainers = $swatchContainer.find('span.swatch-value.soldout').closest('div');\n var $lastNonSoldoutColorContainer = $swatchContainer.find('span.swatch-value').closest('div').not($soldoutColorsContainers).last();\n $soldoutColorsContainers.insertAfter($lastNonSoldoutColorContainer);\n};\n\nclass ProductHelpers {\n constructor () {\n this.freeGiftDetailsModal = 'freeGiftDetailsModal';\n this.bonusProductModal = null;\n this.methods = {\n getPidValue: function ($el) {\n return getPidValue($el);\n }\n };\n }\n\n run () {\n this.colorAttribute();\n this.colorAttributeQuickAddListing();\n this.sizeAttribute();\n this.sizeAttributeQuickAddListing();\n this.sizeAttributeQuickAddPDP();\n this.sizeAttributeSet();\n this.quantity();\n this.availability();\n this.addToCart();\n // this.selectBonusProduct();\n // this.removeBonusProduct();\n // this.enableBonusProductSelection();\n // this.showMoreBonusProducts();\n // this.closeBonusProductModal();\n // this.enableAddAfterBonusColorSelection();\n // this.removeSizePickerPopup();\n // this.addBonusProductsToCart();\n // this.handleBonusSize();\n // this.handleBonusColor();\n // this.removeColorPickerPopup();\n this.careAndMaintenanceClick();\n this.personalizationButton();\n this.sizeTU();\n this.quickAddListener();\n videoListener(true);\n NotifyHelper.notifyMeModal();\n this.checkSoldoutAvailability();\n SmartGiftHelper.run();\n sizePanel.init();\n this.registerAttributionTokenSending();\n this.loadGoogleRecommendations();\n this.createNextPageToken();\n }\n\n personalizationButton () {\n $('body').on('click', '.persButt', (e) => {\n e.preventDefault();\n // Simulate disabled button with class to allow click and event\n if ($(e.currentTarget).data('disabled') || !this.isSizeSelected()) {\n // If no size is selected, open modal to choose one\n\n if ($(e.currentTarget).closest('.quickview-modal').length) {\n // QuickView (Open the other modal type)\n\n let modal = $('.js-modal-quick-size-quantity');\n // First check if it is open\n if (modal.hasClass('open')) {\n // Check if size is selected, then add to cart\n } else {\n // Show it\n modal.removeClass('hidden').addClass('open');\n modal.find('.slick-slider.slick-initialized').slick('refresh');\n\n modal.find('.js-close-select-size').on('click', function (e) {\n modal.addClass('hidden').removeClass('open');\n });\n }\n } else if (!($(e.currentTarget).hasClass('persButtMobile') && !$('.pdp-buy-look-container').hasClass('hidden'))) {\n sizePanel.openSizePanel(sizePanel.Types.PERSONALIZE);\n }\n\n // Prevent further progress until a size is selected\n e.preventDefault();\n } else {\n if ($('.jsPersonalizationToolModal').length === 0) {\n let url = $(e.currentTarget).attr('data-url') || $(e.currentTarget).data('url');\n $.get(url, function (data) {\n if (data && data !== '') {\n let modal = newModalFromString(data, true, ['jsPersonalizationToolModal'], () => {\n // TODO: On Open Actions\n $('.tingle-modal .close').on('click touchstart', function (e) {\n e.preventDefault();\n modal.close();\n modal.destroy();\n });\n }, () => {\n // TODO: On Close Actions\n $('[data-attr=\"size\"] input.js-mobile-size-selected').prop('checked', true);\n });\n $(modal.modalBox).addClass('rightModalAttribute cc-detailsPopup-modalBox rightModalAttribute_sizeXtraLarge');\n modal.open();\n runPersonalizationListener();\n }\n });\n }\n }\n });\n }\n\n careAndMaintenanceClick () {\n $(document).on('click', '.js-caremaintenance-container ul.tabs li', function () {\n $('.js-caremaintenance-container ul.tabs li').removeClass('current');\n $('.tab-content').removeClass('current');\n $(this).addClass('current');\n const description = $(this).data('tab');\n $(`#${description}`).addClass('current');\n });\n }\n\n colorAttribute () {\n $('body').on('click', '[data-attr=\"color\"] a', e => {\n e.preventDefault();\n if ($(e.currentTarget).attr('disabled') || $(e.currentTarget).find('.swatch-value').hasClass('selected')) {\n return;\n }\n var $productContainer = $(e.currentTarget).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(e.currentTarget).closest('.product-detail');\n }\n\n if (!$productContainer.length && $(e.currentTarget).hasClass('saveToLater')) {\n $productContainer = $('.wishlist-product-card').closest('.product-detail');\n }\n\n let imagesShouldUpdate = true;\n if ($productContainer.hasClass('cart-line-item')) {\n imagesShouldUpdate = false;\n }\n attributeSelect(e.currentTarget.href, $productContainer, 'color', imagesShouldUpdate);\n let color = $productContainer.prevObject.children('span').data('attr-value');\n var firstPart = $productContainer.attr('data-pid');\n var firstPartSplit = firstPart.split('_');\n var firstPartSKU = '';\n if (firstPartSplit.length > 1) {\n firstPartSKU = firstPartSplit[0];\n } else {\n firstPartSKU = firstPart;\n }\n\n var sku = null;\n let splitSku = firstPartSKU ? firstPartSKU.replace(/\\s+/g, '_').split('_') : [];\n let productId = splitSku[0];\n\n if ($('.page[data-action=\"Product-Show\"]').length > 0) {\n let size = $('.selected-size-value').first().text().trim();\n $('#analyticsSelectedColor').val(color);\n\n sku = size && size !== 'false' ? productId + '_' + color + '_' + size : productId + '_' + color;\n $('body').trigger('product:didChangeColor', {sku: sku});\n } else if ($('.page[data-action=\"Cart-Show\"]').length > 0) {\n let selectedSize = $('.cc-cartQuickView_selectedSize').attr('for');\n let colorValue = $(e.currentTarget).data('color-value');\n $('#analyticsSelectedColor').val(colorValue);\n\n sku = selectedSize ? productId + '_' + colorValue + '_' + selectedSize : productId + '_' + colorValue;\n $('body').trigger('product:didChangeColor', {sku: sku});\n }\n });\n\n $('body').on('click', '.product-detail [data-attr=\"color\"] a', e => {\n if ($(e.currentTarget).parents('.quickview-modal').length !== 0) {\n return;\n }\n // Get new color to push to query string\n var selectedColor = $(e.currentTarget).data('color-value');\n if (!selectedColor) {\n return;\n }\n // Perform URL query string update\n updateProductDetailUrl('_col_', selectedColor);\n });\n }\n\n colorAttributeQuickAddListing () {\n $('body').on('click', '[data-attr=\"color-listing\"] a', e => {\n e.preventDefault();\n if ($(e.currentTarget).attr('disabled') || $(e.currentTarget).find('.swatch-value').hasClass('selected')) {\n return;\n }\n\n var url = $(e.currentTarget).attr('href');\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'GET',\n success: function (data) {\n const $productTile = $(e.target).closest('.product-tile-cell');\n $productTile.html(data);\n startCarouselTileImageFunction($productTile.find('.js-tileImageCarousel'));\n $('body').trigger('product:didChangeColor');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n }\n\n sizeAttribute () {\n $('body').on('change', '[data-attr=\"size\"] input', e => {\n e.preventDefault();\n $('.size-available').attr('available', true);\n const selectedValue = $(e.currentTarget).attr('value');\n $('#size').attr('size-attribute', $(e.currentTarget).attr('data-attr-value'));\n $('.persButtonPdpPers').attr('size-attribute', $(e.currentTarget).attr('data-attr-value'));\n if (selectedValue === 'null') {\n return;\n }\n\n let $productContainer = $(e.currentTarget).closest('.set-item');\n if (!$productContainer.length) {\n if ($(e.currentTarget).hasClass('js-add-size-saveForLater')) {\n var sku = $(e.currentTarget).data('sku');\n $productContainer = $(e.currentTarget).closest('.cart-line-item-sku-' + sku);\n } else {\n $productContainer = $(e.currentTarget).closest('.product-detail');\n }\n }\n if ($(e.currentTarget).closest('.product-quickview') && $(e.currentTarget).closest('.product-quickview').length) {\n $('.selectSizeQuickView').removeClass('toSelect');\n }\n if ($(e.currentTarget).closest('.js-complete-your-promo-quick-view')) {\n $(e.currentTarget).closest('.js-complete-your-promo-quick-view').find('.add-to-cart-global').data('disabled', false);\n }\n\n let ignoreCTA = $('.js-prod-select-size-modal').length && !Foundation.MediaQuery.atLeast('large');\n let isPdp = $('.page').data('action') && $('.page').data('action').toLowerCase().indexOf('product-show') > -1;\n let isPeronalizePage = $('#personalize-page');\n if (isPdp && isPeronalizePage) {\n $productContainer = $('.js-intProductDetail');\n }\n if ($('.js-complete-your-promo-quick-view').length > 0) {\n $productContainer = $('.js-complete-your-promo-quick-view');\n }\n if (isPdp && $('.js-prod-select-size-modal').length || isPeronalizePage && $('.js-prod-select-size-modal').length) {\n ignoreCTA = false;\n }\n\n let imagesShouldUpdate = true;\n if ($productContainer.hasClass('cart-line-item') || $productContainer.hasClass('js-complete-your-promo-quick-view') ) {\n imagesShouldUpdate = false;\n }\n attributeSelect(selectedValue, $productContainer, 'size', imagesShouldUpdate, ignoreCTA);\n var sizeData = $(e.currentTarget).data('attr-value');\n var skuData = $productContainer.data('variant-pid');\n skuData = skuData ? decodeURI(skuData).replace(/\\s+/g, '_') : '';\n\n let color = $('#analyticsSelectedColor').val();\n let splitSkuData = skuData ? skuData.split('_') : [];\n\n skuData = splitSkuData.length >= 2 && color.trim().length > 0 ? splitSkuData[0] + '_' + color : skuData;\n\n if ($('.page[data-action=\"Product-Show\"]').length > 0) {\n $('body').trigger('product:didChangeSize', { size: sizeData, sku: skuData });\n } else if ($('.page[data-action=\"Cart-Show\"]').length > 0) {\n $('body').trigger('product:didChangeSize', { size: sizeData, sku: skuData });\n }\n });\n $('.js-container').on('keydown', function (e) {\n if (e.type === 'keydown' && e.originalEvent.code === 'Enter') {\n $(e.currentTarget).trigger('click');\n }\n });\n $('body').on('change', '[data-attr=\"size-mobile\"] input', e => {\n e.preventDefault();\n $(\"[data-attr='size-mobile'] input\")\n .removeClass('js-mobile-size-selected')\n .closest('.js-intProductDetail-size-item')\n .removeClass('cc-intProductDetail-size-item_selected');\n $(e.currentTarget)\n .addClass('js-mobile-size-selected')\n .closest('.js-intProductDetail-size-item')\n .addClass('cc-intProductDetail-size-item_selected');\n let selectedSize = $(e.currentTarget).data('size-id');\n let $sizeSelectedeElem = $(`[data-size-id=\"${selectedSize}\"]`);\n $sizeSelectedeElem.each(function (element) {\n $(this).closest('.js-intProductDetail-size-item').addClass('cc-intProductDetail-size-item_selected');\n });\n $('js-sizeBox-openPanel').attr('');\n $('.js-selectedSizeMobile').text($(e.currentTarget).data('size-value'));\n $('#product-error-msg-mobile').addClass('invisible');\n $('#product-error-msg').hide();\n });\n $('body').on('click', '.js-linkMobileModalConfirmSize', e => {\n let $sizeSelected = $(\"[data-attr='size-mobile'] input.js-mobile-size-selected\");\n $('.size-available').attr('available', true);\n const selectedValue = $sizeSelected.attr('value');\n $('#size').attr('size-attribute', $sizeSelected.attr('data-attr-value'));\n $('.persButtonPdpPers').attr('size-attribute', $sizeSelected.attr('data-attr-value'));\n if (selectedValue === undefined || selectedValue === null || selectedValue === 'null') {\n $('#product-error-msg-mobile').removeClass('invisible');\n return;\n }\n $('#product-error-msg-mobile').addClass('invisible');\n\n let $productContainer = $sizeSelected.closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $sizeSelected.closest('.product-detail');\n }\n if ($sizeSelected.closest('.product-quickview') && $sizeSelected.closest('.product-quickview').length) {\n $('.selectSizeQuickView').removeClass('toSelect');\n }\n\n let ignoreCTA = $('.js-prod-select-size-modal').length && !Foundation.MediaQuery.atLeast('large');\n let isPdp = $('.page').data('action') && $('.page').data('action').toLowerCase().indexOf('product-show') > -1;\n let isPeronalizePage = $('#personalize-page');\n if (isPdp && $('.js-prod-select-size-modal').length || isPeronalizePage && $('.js-prod-select-size-modal').length) {\n ignoreCTA = false;\n }\n\n let imagesShouldUpdate = true;\n if ($productContainer.hasClass('cart-line-item')) {\n imagesShouldUpdate = false;\n }\n attributeSelect(selectedValue, $productContainer, 'size', imagesShouldUpdate, ignoreCTA);\n var sizeData = null;\n var skuData = null;\n if ($('.page[data-action=\"Product-Show\"]').length > 0) {\n sizeData = $sizeSelected.attr('data-attr-value');\n skuData = $productContainer.data('master-pid');\n }\n $('body').trigger('product:didChangeSize', { size: sizeData, sku: skuData });\n });\n $('body').on('change', '[data-attr=\"size\"] input', e => {\n e.preventDefault();\n $(\"[data-attr='size'] input\")\n .removeClass('js-mobile-size-selected')\n .closest('.js-intProductDetail-size-item')\n .removeClass('cc-intProductDetail-size-item_selected');\n $(e.currentTarget)\n .addClass('js-mobile-size-selected');\n let selectedSize = $(e.currentTarget).data('size-id');\n let $sizeSelectedeElem = $(`[data-size-id=\"${selectedSize}\"]`);\n $sizeSelectedeElem.each(function (element) {\n $(this).closest('.js-intProductDetail-size-item').addClass('cc-intProductDetail-size-item_selected');\n });\n $('#product-error-msg').hide();\n });\n }\n\n sizeAttributeQuickAddListing () {\n $('body').on('click', '.quick-buy-sizes-item', function (e) {\n e.preventDefault();\n\n const selectedValue = $(e.currentTarget).data('url');\n if (selectedValue === 'null') {\n return;\n }\n\n let $productContainer = $(e.currentTarget).closest('.product-tile');\n let imagesShouldUpdate = true;\n if ($productContainer.hasClass('cart-line-item')) {\n imagesShouldUpdate = false;\n }\n attributeSelect(selectedValue, $productContainer, 'size', imagesShouldUpdate, true);\n $('body').trigger('product:didChangeSize');\n });\n\n $('body').on('quickBuy:addToCart', function (e, data) {\n if (!$('.modal-size-show').length) {\n return;\n }\n\n $('.modal-size-show').find('.js-add-to-cart').data('pid', data.product.id).trigger('click');\n $('body').trigger('quickBuy:afterAddToCart');\n });\n }\n\n sizeAttributeQuickAddPDP () {\n if ($('.page').data('action') !== 'Product-Show') {\n return;\n }\n $('body').on('click', '.js-quick-buy-sizes-item-pdp', function (e) {\n e.preventDefault();\n if ($(this).hasClass('disable') || !$(this).data('variant')) {\n return false;\n }\n\n var url = $(this).data('variant');\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'GET',\n dataType: 'json',\n success: function (response) {\n $.spinner().stop();\n const $productContainer = $(e.target);\n\n // For minicart promo carousel\n var promotionId = $productContainer.closest('.product').find('.promotion-info-plp').data('promo-id') || false;\n\n if (response.product.available && !response.product.comingSoon) {\n addToCartFromListing(response.product.id, promotionId, $productContainer);\n } else {\n $('body').trigger('product:afterAddToCartFailed', {\n ...response,\n $productContainer\n });\n }\n },\n error: function (err) {\n console.error('ErrorCase: ' + err.message);\n $.spinner().stop();\n }\n });\n });\n }\n\n sizeAttributeSet () {\n $('.set-size').on('click', function (e) {\n $($(e.currentTarget).closest('.product-content-size')[0]).children('.set-size').children('.radio-label-set').removeClass('setsize-selected');\n $(e.currentTarget).children('.radio-label-set').addClass('setsize-selected');\n const selectedValue = e.currentTarget.children[0].value;\n if (selectedValue === 'null') {\n return;\n }\n\n var $productContainer = $(e.currentTarget).closest('.product-detail');\n attributeSelect(selectedValue, $productContainer, 'size', false);\n\n $('body').trigger('product:didChangeSize');\n });\n }\n\n isSizeSelected () {\n if ($('.page-checkout').length > 0 || $('.cart-page').length > 0 || $('.modal-size-show').length > 0 || isMiniCartOpen()) {\n return true;\n }\n return $('[data-attr=\"size\"] input:checked').length > 0;\n };\n\n quantity () {\n updateQuantityPicker(null);\n\n $('body').on('click', '.js-quantity-button', function (e) {\n const $button = $(this);\n var $target = $button.closest('.quantity').find('.js-quantity-value');\n var $input = $button.closest('.quantity').find('.quantity-select');\n if ($button.hasClass('js-quantity-button-quick-add')) {\n $target = $button.closest('.quantity').find('.js-quantity-value-quick-add');\n $input = $button.closest('.quantity').find('.quantity-select-quick-add');\n }\n const value = parseInt($target.text());\n if ($button.data('action') === 'increase' && value < 10 && !$button.hasClass('disabled')) {\n let newValue = value + 1;\n $('.js-quantity-value').text(newValue);\n $input.val(newValue);\n\n $('.update-cart-url').data('selected-quantity', newValue);\n $(`[data-opener=\"QNT\"] .attribute-selection`).html(newValue);\n\n updateQuantityPicker($button);\n $input.trigger('change');\n } else if ($button.data('action') === 'decrease' && value > 1 && !$button.hasClass('disabled')) {\n let newValue = value - 1;\n $('.js-quantity-value').text(newValue);\n $input.val(newValue);\n $('.update-cart-url').data('selected-quantity', newValue);\n $(`[data-opener=\"QNT\"] .attribute-selection`).html(newValue);\n\n updateQuantityPicker($button);\n $input.trigger('change');\n }\n });\n }\n\n availability () {\n $('body').on('change', '.quantity-select', e => {\n e.preventDefault();\n\n var $productContainer = $(e.currentTarget).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(e.currentTarget).closest('.modal-content').find('.product-quickview');\n }\n if (!$productContainer.length) {\n $productContainer = $(e.currentTarget).closest('.product-tile-modal');\n }\n\n if ($('.bundle-items', $productContainer).length === 0) {\n attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n $productContainer, '_', false);\n }\n });\n $('body').on('change', '.quantity-select-quick-add', e => {\n e.preventDefault();\n\n var $productContainer = $(e.currentTarget).closest('.product-detail-quick-add');\n if ($('.bundle-items', $productContainer).length === 0) {\n attributeSelectQuickAdd($(e.currentTarget).find('option:selected').data('url'),\n $productContainer, '_', false);\n }\n });\n }\n\n addToCart () {\n $('body').on('click', 'button.js-add-to-cart, button.add-to-cart-global, button.js-add-to-cart-multipack', (e) => {\n const _openStickySizeSelectorModal = (target) => {\n if ($(e.currentTarget).hasClass('add-to-cart-multipack')) {\n sizePanel.openSizePanel(sizePanel.Types.ADDTOCART_BUNDLE);\n } else if ($(e.currentTarget).closest('.js-pdpStickyBar-btn').length > 0) {\n $('.js-pdpStickyBar-select').addClass('cc-sizeBox-isOpen');\n } else {\n if ($('.cc-intProductDetail-size-item_selected').length === 0) {\n $('#product-error-msg-mobile').removeClass('invisible');\n }\n sizePanel.openSizePanel(sizePanel.Types.ADDTOCART);\n }\n $('.pdp-size-box .js-sizeBox-openPanel').addClass('cc-sizeBox-openPanel_error');\n $('#product-error-msg').show();\n $('.pdp-size-box .js-sizeBox-openPanel').attr('aria-invalid', 'true');\n };\n\n let addToCartUrl;\n let pid;\n let pidsObj;\n let setPids;\n let isPersonalizedProduct = $('.js-personalizeButtonCheckout').length > 0;\n\n let target = e.currentTarget;\n if ($(target).closest('.js-addToCartStickyBar').length > 0) {\n // open the size modal\n _openStickySizeSelectorModal(target);\n return;\n }\n if ($(target).closest('.js-addToCartStickyBar').length > 0) {\n // close quickview modal\n _openStickySizeSelectorModal(target);\n }\n\n var $productContainer = $(e.currentTarget).closest('.product-detail');\n\n if (!$productContainer.length) {\n $productContainer = $(e.currentTarget).closest('.quickview-modal').find('.product-detail');\n }\n\n if (!$productContainer.length) {\n $productContainer = $('.quickview-modal').find('.product-detail');\n }\n\n if (!$productContainer.length) {\n $productContainer = $('.product-detail');\n }\n\n const GTMItem = getGtmData({\n item_id: $('.analytics.product').attr('data-item_id'),\n item_variant: $('.analytics.product').attr('data-item_variant')\n });\n\n // here we add the personalized product - if there is the personalizeButtonCheckout button, we are adding a pers product\n if (isPersonalizedProduct) {\n var text = $('.form-text').val();\n\n // here we check the symbolType - in personalization we store the symbols with a number. Here we substitute them with character\n /*\n if ($('.form-symbolType').val() != '') {\n var symbol = $('.form-symbol').val();\n\n switch (symbol) {\n case '1':\n symbol = '/_%*_';\n break;\n case '2':\n symbol = '-_%*_';\n break;\n case '3':\n symbol = '__%*_';\n break;\n case '4':\n symbol = '*_%*_';\n break;\n }\n\n switch ($('.form-symbolType').val()) {\n case 'letters':\n switch ($('.form-text').val().length) {\n case 1:\n text = $('.form-text').val()[0] + symbol;\n break;\n case 2:\n text = $('.form-text').val()[0] + symbol + $('.form-text').val()[1];\n break;\n case 3:\n text = $('.form-text').val()[0] + $('.form-text').val()[1] + symbol + $('.form-text').val()[2];\n break;\n case 4:\n text = $('.form-text').val()[0] + $('.form-text').val()[1] + symbol + $('.form-text').val()[2] + $('.form-text').val()[3];\n break;\n }\n\n break;\n case 'nameSymbol':\n text = $('.form-text').val() + symbol;\n break;\n case 'symbolName':\n text = symbol + $('.form-text').val();\n break;\n default:\n text = $('.form-text').val();\n }\n }\n */\n var personalizationText = text;\n var personalizationTextFont;\n personalizationTextFont = $('.form-font').val().indexOf('GillSansNova') > -1\n ? 'Avant'\n : ($('.form-font').val().indexOf('Didot') > -1\n ? 'Didot'\n : $('.form-font').val().indexOf('Altastgreeting') > -1\n ? 'Altastgreeting'\n : '');\n\n var personalizationColorPref = window.PersonalizationColor.personalizationColor;\n var personalizationColorJson = JSON.parse(personalizationColorPref);\n\n var personalizationTextColor;\n for (var i = 0; i < personalizationColorJson.length; i++) {\n if (personalizationColorJson[i].alt === $('.form-color').val()) {\n var src = personalizationColorJson[i].src;\n src = src.substring(0, src.lastIndexOf('.'));\n personalizationTextColor = src;\n }\n }\n\n var personalizationPositionKey = $('.form-position').val();\n\n // ----\n\n var customizationClassPref = window.CustomizationClass.customizationClass;\n var customizationClassJson = JSON.parse(customizationClassPref);\n var category = $('#category').attr('category-attribute');\n personalizationPositionKey = (customizationClassJson[category]['customizationPositions'] === 1)\n ? customizationClassJson[category]['0']\n : customizationClassJson[category][($('.form-position').val()).toString()];\n\n // ----\n\n var personalizationTextSVG = $('#base64').attr('data-fullTextSVG');\n var personalizationFullSVG = $('#base64').attr('data-fullSVG');\n var personalizationSmallSVG = $('#base64').attr('data-smallSVG');\n\n $.spinner().start();\n\n addToCartUrl = $('#custom-page').attr('data-url');\n var quantity = $('.js-quantity-value').html();\n var uniqueIdentifiers = {};\n for (var i = 0; i < quantity; i++) {\n var random = Math.random();\n var id = 'uniqueIdentifier' + i;\n uniqueIdentifiers[id] = random;\n }\n uniqueIdentifiers = JSON.stringify(uniqueIdentifiers);\n\n if ($('#pidToAdd').attr('pidRecentlyAdded') == undefined) {\n // $('#custom-page').attr('data-pid', $('#pidToAdd').attr('data-pid'));\n $('#pidToAdd').attr('isToLoad', 'false');\n }\n\n if ($('#pidToAdd').attr('isToLoad') == 'true') {\n $('#custom-page').attr('data-pid', $('#pidToAdd').attr('pidRecentlyAdded'));\n }\n\n $('#pidToAdd').attr('pidRecentlyAdded', $('.personalizeButtonBtn').attr('product-id'));\n\n if (quantity > 1) {\n var form = {\n pid: $('.personalizeButtonBtn').attr('product-id'),\n quantity: quantity,\n personalizedObj: true,\n uniqueIdentifiers: uniqueIdentifiers, // Random value\n personalizationText: personalizationText,\n personalizationTextFont: personalizationTextFont,\n personalizationTextColor: personalizationTextColor,\n personalizationPositionKey: personalizationPositionKey,\n personalizationTextSVG: personalizationTextSVG,\n personalizationFullSVG: personalizationFullSVG,\n personalizationSmallSVG: personalizationSmallSVG,\n isDate: $('.choice-item.choice-item-3').hasClass('active'),\n isLove: $('#love').hasClass('active'),\n GTMItemListName: GTMItem.item_list_name,\n GTMItemListId: GTMItem.item_list_id,\n GTMIndex: GTMItem.index\n };\n } else {\n var form = {\n pid: $('.personalizeButtonBtn').attr('product-id'),\n quantity: quantity,\n personalizedObj: true,\n uniqueIdentifier: Math.random(), // Random value\n personalizationText: personalizationText,\n personalizationTextFont: personalizationTextFont,\n personalizationTextColor: personalizationTextColor,\n personalizationPositionKey: personalizationPositionKey,\n personalizationTextSVG: personalizationTextSVG,\n personalizationFullSVG: personalizationFullSVG,\n personalizationSmallSVG: personalizationSmallSVG,\n isDate: $('.choice-item.choice-item-3').hasClass('active'),\n isLove: $('#love').hasClass('active'),\n GTMItemListName: GTMItem.item_list_name,\n GTMItemListId: GTMItem.item_list_id,\n GTMIndex: GTMItem.index\n };\n }\n $('.js-customizePage .js-customizePage-icon_pageClose').trigger('click');\n } else {\n // ------\n if (!$(e.currentTarget).hasClass('product-set')) {\n // Simulate disabled button with class to allow click and event\n if ($(e.currentTarget).data('disabled') || !this.isSizeSelected()) {\n $('.persButtonPdpAdd').show();\n $('.persButtonPdpPers').hide();\n // If no size is selected, open modal to choose one\n if (!$('.cc-text.selected-size-msg.show-when-size-selected')) {\n $('#newsletter-error-msg').toggle();\n }\n if ($(e.currentTarget).closest('.quickview-modal').length) {\n // QuickView (Open the other modal type)\n\n let modal = $('.js-modal-quick-size-quantity');\n // First check if it is open\n if (modal.hasClass('open')) {\n // Check if size is selected, then add to cart\n } else {\n // Show it\n modal.removeClass('hidden').addClass('open');\n modal.find('.slick-slider.slick-initialized').slick('refresh');\n\n modal.find('.js-close-select-size').on('click', function (e) {\n modal.addClass('hidden').removeClass('open');\n });\n if ($('.js-modal-quick-size-quantity [data-attr=\"size\"] input#TU:checked').length > 0\n && $('.quickview-modal .global-availability').data('ready-to-order')) {\n $('.quickview-modal').find('button.add-to-cart-global').data('disabled', false);\n }\n if (Foundation.MediaQuery.is('small')) {\n $('.quickview-modal .wrapper-details').animate({\n scrollTop: $('.wrapper-inner-quick-bottom').eq(0).offset().top\n }, 500);\n }\n }\n } else {\n _openStickySizeSelectorModal(e.currentTarget);\n }\n\n // Prevent further progress until a size is selected\n return;\n }\n }\n\n $('body').trigger('product:beforeAddToCart', e.currentTarget);\n\n if ($('.set-items').length && $(e.currentTarget).hasClass('add-to-cart-global')) {\n setPids = [];\n\n $('.product-detail').each(function () {\n if (!$(e.currentTarget).hasClass('product-set-detail')) {\n setPids.push({\n pid: $(e.currentTarget).find('.product-id').text(),\n qty: $(e.currentTarget).find('.quantity-select').val(),\n options: []\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(e.currentTarget));\n // console.log(pid);\n\n if ($(target).closest('div.js-pdpStickyBar-btn').length > 0) {\n $productContainer.addClass('analytics-addToCart-sticky');\n }\n\n addToCartUrl = getAddToCartUrl();\n\n let uid = $(e.currentTarget).data('uid');\n\n var pidSet;\n var buttonAdd = $('button.js-add-to-cart, button.add-to-cart-global, button.update-cart-product-global');\n\n for (var j = 0; j < buttonAdd.length; j++) {\n if (uid === $(buttonAdd[i]).data('uid')) {\n pidSet = $(buttonAdd[i]).attr('data-pid');\n }\n }\n\n var promoId = $('.js-promo-msg.marketing-budge', $productContainer).first().data('promotion-id') || false;\n\n // ------\n var form = {\n pid: pid || pidSet,\n pidsObj: pidsObj,\n childProducts: [],\n quantity: getQuantitySelected($(e.currentTarget)),\n uuid: uid,\n promoId: promoId,\n GTMItemListName: GTMItem.item_list_name,\n GTMItemListId: GTMItem.item_list_id,\n GTMIndex: GTMItem.index\n };\n\n if (!$('.bundle-item').length) {\n form.options = [];\n }\n\n if ($('.js-complete-your-promo').length > 0) {\n $('.js-complete-the-promo-status').val($('.js-complete-the-promo-status').val() - form.quantity);\n form.completePromoItems = $('.js-complete-the-promo-status').val();\n $productContainer.addClass('analytics-completeYourPromo');\n }\n }\n\n $(e.currentTarget).trigger('updateAddToCartFormData', form);\n $('body').trigger('updateQuickAddToCartModal', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: data => {\n $.spinner().stop();\n if (data.error && isPersonalizedProduct) {\n $('.content-input-err').removeClass('hidden');\n } else {\n if (data.completePromoItemsLabel && data.completePromoItemsLabel !== '' && $('.js-completeYourPromo-header_remaining').length > 0) {\n $('.js-completeYourPromo-header_remaining').html(data.completePromoItemsLabel);\n if (form.completePromoItems === '0') {\n $('.js-completeYourPromo-header_remaining').addClass('cc-cartPromotionModal-footer_completed');\n }\n }\n $('body').trigger('product:afterAddToCart', {\n ...data,\n form,\n $productContainer\n });\n data.quantityTotal = data.cart ? data.cart.numItems : data.cartModel.numItems;\n handlePostCartAdd(data);\n }\n },\n error: () => {\n $.spinner().stop();\n }\n });\n }\n });\n }\n\n /*\n selectBonusProduct () {\n $('body').on('click', '.select-bonus-product', function () {\n var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\n var pid = $(this).data('pid');\n var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\n var submittedQty = parseInt($(this).parents('.choice-of-bonus-product').find('.bonus-quantity-select').val(), 10);\n var totalQty = 0;\n $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\n totalQty += $(this).data('qty');\n });\n totalQty += submittedQty;\n var optionID = $(this).parents('.choice-of-bonus-product').find('.product-option').data('option-id');\n var valueId = $(this).parents('.choice-of-bonus-product').find('.options-select option:selected').data('valueId');\n if (totalQty <= maxPids) {\n const selectedBonusProductHtml = `\n
\n\n
${$choiceOfBonusProduct.find('.product-name').html()}
'\n
\n \n
\n
`;\n\n $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n $('.pre-cart-products').html(totalQty);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n } else {\n $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n }\n });\n }\n */\n\n sizeTU () {\n if (document.getElementById('TU')) {\n document.getElementById('TU').click();\n }\n }\n\n quickAddListener () {\n $('body').on('click', '.js-panel-opener-size-quick-add', function (e, data) {\n /** open/close quickAdd modal**/\n e.preventDefault();\n if ($(this).find('.icon-toggle-top.triangle-dropdown-pdp').hasClass('icon-toggle-opened')) {\n $('.js-modal-quick-add-size-quantity').addClass('hidden');\n $('.product-detail-quick-add .icon-toggle-top.triangle-dropdown-pdp').removeClass('icon-toggle-opened');\n $('.product-detail-quick-add .size-opener-opened').addClass('hidden');\n $('.product-detail-quick-add .size-opener-closed').removeClass('hidden');\n } else {\n $('.product-detail-quick-add .icon-toggle-top.triangle-dropdown-pdp').removeClass('icon-toggle-opened');\n $(this).find('.icon-toggle-top.triangle-dropdown-pdp').addClass('icon-toggle-opened');\n var mustAdd = (data && data.mustAdd === true) || false;\n $(this).closest('.product-detail-quick-add').find('.add-to-cart-quick-add').data('mustAdd', mustAdd);\n const pid = $(this).attr('data-pid');\n const url = $(this).attr('data-get-url');\n $(this).find('.size-opener-opened').removeClass('hidden');\n $(this).find('.size-opener-closed').addClass('hidden');\n showQuickAddItems(pid, url);\n }\n });\n\n $('body').on('click', '.js-close-select-size-quick-add', function (e) {\n /** close quickAdd modal**/\n e.preventDefault();\n $('.js-modal-quick-add-size-quantity').addClass('hidden');\n $('.product-detail-quick-add .icon-toggle-top.triangle-dropdown-pdp').removeClass('icon-toggle-opened');\n $('.product-detail-quick-add .size-opener-opened').addClass('hidden');\n $('.product-detail-quick-add .size-opener-closed').removeClass('hidden');\n });\n\n $('body').on('change', '[data-attr=\"size_qa\"] input ', e => {\n /** change size and update attribute for the cart**/\n e.preventDefault();\n const selectedValue = $(e.currentTarget).attr('value');\n if (selectedValue === 'null') {\n return;\n }\n\n let $productContainer = $(e.currentTarget).closest('.product-detail-quick-add');\n if ($productContainer && $productContainer.length > 0) {\n attributeSelectQuickAdd(selectedValue, $productContainer, '_', false);\n $productContainer.find('.add-to-cart-quick-add').attr('data-size-available', true);\n $productContainer.find('.add-to-cart-quick-add').attr('data-size-selected', $(e.currentTarget).data('attr-id'));\n $productContainer.find('.add-to-cart-quick-add').removeClass('item-added-quick');\n }\n $('body').trigger('product:didChangeSize');\n });\n\n $('body').on('product:updateAddToCartQuickAdd', (e, response) => {\n /** manage response variation after size selection **/\n let availabilityValue = '';\n let availabilityMessages = response.product.availability.messages;\n var $productContainer = response.$productContainer;\n $productContainer.find('.response-message-quick-add').empty();\n if ($productContainer.find('[data-attr=\"size_qa\"] input:checked') && $productContainer.find('[data-attr=\"size_qa\"] input:checked').length > 0) {\n var sizeChecked = $productContainer.find('[data-attr=\"size_qa\"] input:checked').attr('data-display-value');\n $productContainer.find('.size-selected').text(sizeChecked);\n $productContainer.find('.response-message-quick-add').addClass('hidden');\n $productContainer.find('.add-to-cart-quick-add').attr('data-size-available', true);\n $productContainer.find('.add-to-cart-quick-add').attr('data-pid', response.product.id);\n $productContainer.find('.response-error-quick-add').addClass('hidden');\n }\n if (!response.product.readyToOrder) {\n $productContainer.find('.add-to-cart-quick-add').attr('data-disabled', true);\n $productContainer.find('.add-to-cart-quick-add').attr('disabled', true);\n } else if (!response.product.available || response.product.comingSoon) {\n $productContainer.find('.add-to-cart-quick-add').attr('data-disabled', true);\n $productContainer.find('.add-to-cart-quick-add').attr('disabled', true);\n availabilityMessages.forEach(message => {\n availabilityValue += `
${message}
`;\n });\n $productContainer.find('.response-message-quick-add').html(availabilityValue);\n } else {\n $productContainer.find('.add-to-cart-quick-add').attr('data-disabled', false);\n $productContainer.find('.add-to-cart-quick-add').attr('disabled', false);\n }\n });\n\n $('body').on('click', 'button.add-to-cart-quick-add', (e) => {\n if ($(e.currentTarget).closest('.completeYourLookContainer').length > 0) {\n localStorage.setItem('prevlisttypeforcart', localStorage.getItem('listtypeforcart'));\n localStorage.setItem('listtypeforcart', 'complete_your_look');\n }\n\n let addToCartUrl;\n let pidsObj;\n const $productContainer = $(e.currentTarget).closest('.product-detail-quick-add');\n // Simulate disabled button with class to allow click and event\n if ($(e.currentTarget).attr('data-size-available') !== 'true') {\n $productContainer.find('.response-message-quick-add').removeClass('hidden');\n return;\n } else if ($(e.currentTarget).attr('data-disabled') === 'true' || $(e.currentTarget).attr('data-disabled') === 'NaN') {\n return;\n }\n $productContainer.find('.response-message-quick-add').addClass('hidden');\n $productContainer.find('.response-error-quick-add').addClass('hidden');\n\n $('body').trigger('product:beforeAddToCart', e.currentTarget);\n\n let pid = $(e.currentTarget).attr('data-pid');\n let uid = $(e.currentTarget).attr('data-uid');\n let quantitySelected = parseInt($(e.currentTarget).attr('data-quantity')) || 1;\n\n addToCartUrl = getAddToCartUrl();\n\n let promoId = false;\n if ($('.promoCrossSellEnabled').length > 0) {\n promoId = $('.js-promo-msg.marketing-budge').first().data('promotion-id') || false;\n }\n\n const GTMItem = getGtmData({\n item_id: $('.analytics.product').attr('data-item_id'),\n item_variant: $('.analytics.product').attr('data-item_variant')\n });\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: [],\n quantity: quantitySelected,\n uuid: uid,\n promoId: promoId,\n GTMItemListName: GTMItem.item_list_name,\n GTMItemListId: GTMItem.item_list_id,\n GTMIndex: GTMItem.index\n };\n\n $(e.currentTarget).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: data => {\n $.spinner().stop();\n if (data.error) {\n $productContainer.find('.response-error-quick-add').removeClass('hidden');\n } else {\n $('body').trigger('product:afterAddToCart', {\n ...data,\n form,\n $productContainer\n });\n data.quantityTotal = data.cart.numItems;\n handlePostCartAdd(data);\n $productContainer.find('.add-to-cart-quick-add').addClass('item-added-quick');\n $('.js-modal-quick-add-size-quantity').addClass('hidden');\n $('.product-detail-quick-add .icon-toggle-top.triangle-dropdown-pdp').removeClass('icon-toggle-opened');\n $('.product-detail-quick-add .size-opener-opened').addClass('hidden');\n $('.product-detail-quick-add .size-opener-closed').removeClass('hidden');\n }\n },\n error: () => {\n $.spinner().stop();\n }\n });\n }\n });\n }\n\n checkSoldoutAvailability () {\n if ($('.page').data('action') !== 'Product-Show') {\n return;\n }\n var $productContainer = $('div.product-detail.container').first();\n var attributesUpdateUrl = $productContainer.data('variationAttrUpdate');\n if (!attributesUpdateUrl) {\n return;\n }\n $.ajax({\n url: attributesUpdateUrl,\n method: 'GET',\n dataType: 'json',\n success: data => {\n if (data.product && data.product.variationAttributes) {\n updateAttrs(data.product.variationAttributes, $productContainer);\n updateAvailability(data, $productContainer);\n $('body').trigger('product:updateAddToCart', {\n product: data.product,\n $productContainer: $productContainer\n });\n // reorder swatches in order to push soldout colors in the laste positions\n reorderSwatches($('.js-carousel-select-color.not-sale-container'));\n reorderSwatches($('.js-carousel-select-color.on-sale-container'));\n }\n }\n });\n }\n registerAttributionTokenSending () {\n $('body').on('click', '.js-google-recommendations-container .js-prodTile', function () {\n const attributionToken = $(this).closest('.js-google-recommendations-container').data('attributionToken');\n createCookie('attribution_token', attributionToken);\n });\n }\n loadGoogleRecommendations () {\n const $googleConfig = $('.js-googleRecommendationConfig');\n if ($googleConfig.length) {\n const url = $('#googleRecommendationsUrl').val();\n const servingConfig = $googleConfig.data('servingConfig');\n const nodeToAppendTo = $googleConfig.data('nodeToAppendTo');\n const cgid = $('#primaryCategoryId').val();\n const sku = $('#variationGroupSku').val();\n const route = $('.page').data('action');\n\n $.ajax({\n type: 'GET',\n url: url,\n data: {\n cgid: cgid,\n sku: sku,\n route: route,\n servingConfig: servingConfig\n },\n success: function (html) {\n const $outputContainer = $(nodeToAppendTo).find('.google-recommendation-results');\n if (!$outputContainer.length) {\n $('
').appendTo(nodeToAppendTo);\n }\n $(nodeToAppendTo).find('.google-recommendation-results').empty().append(html);\n },\n error: function () {\n $('#youMayAlsoLikeContainer').addClass('hidden');\n }\n });\n }\n }\n\n createNextPageToken () {\n const $googleAttributionToken = $('.js-google-search-token');\n if ($googleAttributionToken.length) {\n const attributionToken = $googleAttributionToken.data('attributiontoken');\n const previousPageToken = $googleAttributionToken.data('nextpagetoken');\n const url = new URL(window.location.href);\n const searchTerm = url.searchParams.get('q');\n createCookie('prev_search_query', searchTerm);\n createCookie('search_attribution_token', attributionToken);\n if (previousPageToken !== null) {\n createCookie('previousPageToken', previousPageToken);\n }\n }\n }\n}\n\nconst productHelpers = new ProductHelpers();\nexport default productHelpers;\nexport {\n moveModalCloseButton,\n parseHtml,\n activatePromoAnimationMessage,\n updateColorFamily,\n updatePrices,\n updateAvailability,\n updateOptions,\n updateQuantities,\n isMiniCartOpen,\n isChooseBonusProductModalOpen,\n isQuickUpdateFromModal,\n isMobileDevice\n};\n","'use strict';\n\nimport {\n newModalFromSelector\n} from '../components/modal';\n\nimport sizePanel from './sizePanel';\n\n// Checks if size is selected before adding to wishlist\nfunction isSizeSelected () {\n if ($('.page-checkout').length > 0 || $('.cart-page').length > 0) {\n return true;\n }\n if ($('.form-control.pdp-size-box.checkbox-size').length > 0 || $('.form-control.pdp-size-box.checkbox-quickview-mobile').length > 0) {\n return ($('.form-control.pdp-size-box.checkbox-size input:checked').length > 0 || $('.form-control.pdp-size-box.checkbox-quickview-mobile input:checked').length > 0);\n } else {\n return $('[data-attr=\"size\"] input:checked').length > 0;\n }\n};\n\n\n/**\n * Adapts FE to the current state of the wishlist:\n * - Add / Remove the `added` class to the correct target (either button or icon)\n * - Shows the \"correctly added\" / \"correctly removed\" notification\n * - Triggers ADD event for analytics\n * - Add/remove the PID from the ID in page to always have the correct state\n * (updateWishlistInternalState)\n * @param {string} data - data returned from the server's ajax call\n * @param {Object} icon - icon that was clicked to toggle a product to the wishlist\n * @param {boolean} isAddAction - if the te action was add or remove\n */\nfunction displayMessageAndChangeIcon (data, icon, isAddAction) {\n if (data.success) {\n $('body').trigger('wishlist:update', data.wishlistTotal);\n\n if (icon) {\n if (isAddAction) {\n if ($('.page').data('action') === 'Product-Show' && $('.js-pdpStickyBar').length > 0) {\n $('.wishlist-icon').addClass('added');\n $('.wishlist-icon').find('use').attr('href', icon.data('full-heart'));\n } else {\n icon.addClass('added');\n icon.find('use').attr('href', icon.data('full-heart'));\n }\n let sender = icon.data('analytics-sender') ? icon.data('analytics-sender') : '';\n $('body').trigger('wishlist:add', { sku: data.pid, sender: sender });\n } else {\n if ($('.page').data('action') === 'Product-Show' && $('.js-pdpStickyBar').length > 0) {\n $('.wishlist-icon').removeClass('added');\n $('.wishlist-icon').find('use').attr('href', icon.data('empty-heart'));\n } else {\n icon.removeClass('added');\n icon.find('use').attr('href', icon.data('empty-heart'));\n }\n }\n updateAriaLabelForWishlistLink($('.wishlist-icon'));\n icon.blur();\n }\n\n showWishlistNotification(data.renderedTemplate);\n\n updateWishlistInternalState(data.pid, isAddAction);\n }\n}\n\nfunction showWishlistNotification (html) {\n $('body').append(html);\n let offsetTop = 12;\n if (Foundation.MediaQuery.atLeast('large')) {\n offsetTop = $('.js-mainHeader').outerHeight() + 10;\n }\n $('.js-add-to-wishlist-notification').css({\n top: offsetTop\n });\n\n function closeNotification () {\n $('.js-add-to-wishlist-notification').off('click', '.js-close-notification');\n $('.js-add-to-wishlist-notification').remove();\n }\n\n $('.js-add-to-wishlist-notification').on('click', '.js-close-notification', closeNotification);\n\n setTimeout(closeNotification, 5000);\n}\n\n/**\n * Updates the internal state of the wishlist with the new item:\n * - adds the item in the state if the item was added\n * - removes the item if the item was removed\n * @param {string} pid - The PID of the product changed in the wishlist\n * @param {boolean} isAddAction - true if the item has been added, false is it has been removed\n */\nfunction updateWishlistInternalState (pid, isAddAction) {\n /** @type {Array.} */\n let oldItems = $('#wishlistItems').val().split(',');\n let newItems;\n if (isAddAction) {\n oldItems.push(pid);\n newItems = oldItems.join(',');\n } else {\n let oldIdx = oldItems.indexOf(pid);\n if (oldIdx > -1) {\n oldItems.splice(oldIdx, 1);\n newItems = oldItems.join(',');\n }\n }\n $('#wishlistItems').val(newItems);\n};\n\nfunction addDefinitelyToWishlist (sender, productID, e) {\n // If productID is set then it means that it belongs to an unavailable size\n // Add or remove from wishlist now!\n\n var btn = sender;\n var addURL = btn.data('href');\n var removeURL = btn.data('remove');\n\n let pid = '';\n if (productID === null) {\n pid = $('.product-detail-keeper').attr('data-variant-pid');\n } else {\n pid = productID;\n }\n var optionId = btn.closest('.product-detail-keeper').find('.product-option').attr('data-option-id');\n var optionVal = btn.closest('.product-detail-keeper').find('.options-select option:selected').attr('data-value-id');\n optionId = optionId || null;\n optionVal = optionVal || null;\n\n var shouldAdd = !btn.hasClass('added');\n\n if (!(addURL && removeURL) || !pid) {\n return;\n }\n\n $.spinner().start();\n $.ajax({\n url: shouldAdd ? addURL : removeURL,\n type: shouldAdd ? 'post' : 'get',\n dataType: 'json',\n data: {\n pid: pid,\n optionId: optionId,\n optionVal: optionVal\n },\n success: function (data) {\n // if (productID === null) {\n // displayMessageAndChangeIcon(data, btn, shouldAdd);\n // }\n if ($('.size-available').attr('available') != 'false') {\n displayMessageAndChangeIcon(data, btn, shouldAdd);\n }\n\n $('body').trigger('wishlist:changedSuccessfully', {\n data: data,\n isAdding: shouldAdd,\n pid: pid\n });\n var $productContainer = $(e.currentTarget).closest('.product-detail');\n\n if (!$productContainer.length) {\n $productContainer = $(e.currentTarget).closest('.quickview-modal').find('.product-detail');\n }\n\n if (!$productContainer.length) {\n $productContainer = $('.quickview-modal').find('.product-detail');\n }\n\n if (!$productContainer.length) {\n $productContainer = $('.product-detail');\n }\n if (shouldAdd) {\n $('body').trigger('product:afterAddToWishlist', { ...data, $productContainer });\n } else {\n $('body').trigger('product:afterRemoveFromWishlist');\n }\n $('body').trigger('wishlist:update', data.wishlistTotal);\n\n $.spinner().stop();\n },\n error: function (err) {\n $.spinner().stop();\n $('body').trigger('product:failedAddToWishlist');\n displayMessageAndChangeIcon(err, btn, shouldAdd);\n }\n });\n}\n\nfunction updateAriaLabelForWishlistLink (product) {\n var added = $(product).hasClass('added');\n var labelAddWishlist = product.data('label-add-wishlist');\n var labelRemoveWishlist = product.data('label-remove-wishlist');\n if (added) {\n product.attr('aria-label', labelRemoveWishlist);\n } else {\n product.attr('aria-label', labelAddWishlist);\n }\n}\n\nmodule.exports = {\n handleWishlistContainer: function (item) {\n if (module.exports.checkItemInWishlist(item)) {\n $('.wishlist-icon').addClass('added');\n $('.wishlist-icon').find('use').attr('href', $('.wishlist-icon').data('full-heart'));\n } else {\n $('.wishlist-icon').removeClass('added');\n $('.wishlist-icon').find('use').attr('href', $('.wishlist-icon').data('empty-heart'));\n }\n updateAriaLabelForWishlistLink($('.wishlist-icon'));\n },\n\n checkItemInWishlist: function (itemCode) {\n return $('#wishlistItems').length > 0 && $('#wishlistItems').val().split(',').indexOf(itemCode) > -1;\n },\n\n /**\n * Add the `added' class to the wishlist icon if the item is available in the wishlist.\n * It is not possible to do it in ISML because both the PDP and the PLP are cached\n *\n * Read the DOM element `#wishlistItems` and adds the `added` class to all the\n * `plp-wishlist` or `add-to-wish-list` items available in>\n * - quickview\n * - PDP\n * - PLP\n */\n highlightIconsForAllItemsInWishlist: function () {\n if (!$('#wishlistItems').length) {\n return;\n }\n\n var itemsInWishlist = $('#wishlistItems').val().split(',');\n for (var i = 0; i < itemsInWishlist.length; i++) {\n var itemCode = itemsInWishlist[i];\n\n let plpWishlist = $(`.product[data-pid=\"${itemCode}\"] .plp-wishlist`);\n let productDetailWishlist = $(`.product-detail[data-pid=\"${itemCode}\"] .add-to-wish-list`);\n\n plpWishlist.addClass('added');\n updateAriaLabelForWishlistLink(plpWishlist);\n plpWishlist.find('use').attr('xlink:href', plpWishlist.data('full-heart'));\n plpWishlist.blur();\n\n productDetailWishlist.addClass('added');\n updateAriaLabelForWishlistLink(productDetailWishlist);\n productDetailWishlist.find('use').attr('xlink:href', productDetailWishlist.data('full-heart'));\n productDetailWishlist.blur();\n }\n },\n\n moveToWishlistHelper: function (e) {\n if (!e) {\n return;\n }\n e.preventDefault();\n\n var $btn = $(e.currentTarget);\n var url = $btn.data('href');\n var pid = $btn.data('pid');\n\n $.spinner().start();\n return $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: {\n pid: pid,\n optionId: null,\n optionVal: null\n },\n success: function (data) {\n displayMessageAndChangeIcon(data, null);\n },\n error: function (err) {\n displayMessageAndChangeIcon(err, null);\n }\n });\n },\n\n\n moveToWishlistHelperSaveForLater: function (e) {\n if (!e) {\n return;\n }\n e.preventDefault();\n\n var $btn = $(e.currentTarget);\n var url = $btn.data('href');\n var pid = $btn.data('pid');\n\n $.spinner().start();\n return $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: {\n pid: pid,\n optionId: null,\n optionVal: null\n },\n success: function (data) {\n //displayMessageAndChangeIcon(data, null);\n },\n error: function (err) {\n displayMessageAndChangeIcon(err, null);\n }\n });\n },\n\n /**\n * Adds the current item referenced by the current target to the wishlist\n * and updates the front-end\n */\n addToWishlist () {\n $('body').on('click', '.add-to-wish-list', (e) => {\n e.preventDefault();\n let target = $(e.currentTarget);\n // Simulate disabled button with class to allow click and event\n if (($(e.currentTarget).hasClass('add-to-wish-list-quickview-mobile') && !isSizeSelected()) || ($(e.currentTarget).hasClass('wishlistButtMobile') && !$('.pdp-buy-look-container').hasClass('hidden'))) {\n return;\n } else if (!isSizeSelected()) {\n // If no size is selected, open modal to choose one\n if (target.closest('.product-quickview').length) {\n this.sizeModal = newModalFromSelector('fis-select-size-wishlist', false, ['js-prod-select-size-modal']);\n this.sizeModal.open();\n\n $(this.sizeModal.modalBox).find('.add-to-wish-list-confirm').attr('disabled', true);\n\n $(this.sizeModal.modalBox)\n .on('click', '.modal__closeIcon', (e) => {\n this.sizeModal.close();\n this.sizeModal.destroy();\n })\n .on('click', '.size-selector', (e) => {\n const $clickedButton = $(e.currentTarget);\n const sizeValue = $clickedButton.data('size-fixed');\n $clickedButton.closest('ul').find('button').not(e.currentTarget).removeClass('selected');\n $clickedButton.addClass('selected');\n\n const $inputToClick = $('[data-attr=\"size\"] input').filter(`[data-size-fixed=\"${sizeValue}\"]`);\n\n if ($clickedButton.data('attr-selectable') === 'selectable' && $inputToClick.prop('disabled') === false) {\n // Select size in PDP by passing click to attribute selector click only if selectable\n $inputToClick.trigger('click');\n $(this.sizeModal.modalBox).find('.add-to-wish-list-confirm').prop('disabled', false);\n $('.size-available').attr('available', true);\n } else {\n // Only if the size is not available\n let infoURL = $clickedButton.data('attr-info-url');\n if ($('.product-quickview').length > 0) {\n $('.product-quickview').find('.wishlist-icon').removeClass('added');\n $('.product-quickview').find('.wishlist-icon').find('use').attr('xlink:href', $('.wishlist-icon').data('empty-heart'));\n }\n var _self = this;\n $.spinner().start();\n $.ajax({\n url: infoURL,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n $(_self.sizeModal.modalBox)\n .find('.add-to-wish-list-confirm')\n .prop('disabled', !data.product.readyToOrder);\n $('.product-detail-keeper').attr('data-variant-pid', encodeURIComponent(data.product.id));\n $('.product-detail').data('pid', data.product.id);\n $('.size-available').attr('available', false);\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n });\n\n $(this.sizeModal.modalBox).on('click', '.add-to-wish-list-confirm', (e) => {\n // Add to wishlist definitely\n let pid = null;\n if ($('.product-detail')) {\n pid = $('.product-detail').data('pid');\n } else if ($('.product-quickview')) {\n pid = $('.product-quickview').data('pid');\n }\n addDefinitelyToWishlist(target, pid, e);\n });\n\n $('body').on('product:afterAddToWishlist', (e) => {\n if (this.sizeModal.modal) {\n this.sizeModal.close();\n this.sizeModal.destroy();\n }\n });\n\n $('body').on('product:failedAddToWishlist', (e) => {\n if (this.sizeModal.modal) {\n this.sizeModal.close();\n this.sizeModal.destroy();\n }\n });\n } else {\n sizePanel.openSizePanel(sizePanel.Types.WISHILIST);\n $('.pdp-size-box .js-sizeBox-openPanel').addClass('cc-sizeBox-openPanel_error');\n }\n return;\n }\n addDefinitelyToWishlist(target, null, e);\n });\n\n $('body').on('wishlist:add-pid', (_, d) => {\n const target = $('.add-to-wish-list').eq(0);\n addDefinitelyToWishlist(target, d.pid, {currentTarget: target});\n });\n }\n};\n","/* globals woosmap sessionStorage */\n\nfunction getCountryAndLang () {\n var country = $('#country-code').val() || '';\n var contentLang = $('meta[http-equiv=content-language]').attr('content') || '';\n var language = '';\n if (contentLang) {\n language = contentLang.split('-')[0] || '';\n }\n var countryList = [];\n if (country) {\n country = country.toLowerCase();\n countryList = [country];\n } else {\n country = contentLang.split('-')[1] || '';\n if (country) {\n countryList = [country];\n }\n }\n\n // Fix for Hong Kong\n if (countryList[0] && countryList[0].toLowerCase() === 'hk') {\n countryList = ['cn'];\n }\n\n return [countryList, language];\n}\n\nfunction getQueryMinimumLength (countryList) {\n var country = countryList[0];\n\n /* eslint-disable */\n switch (country) {\n case 'JP' :\n case 'HK' :\n return 2;\n default :\n return 3;\n }\n /* eslint-enable */\n}\n\nfunction woosmapInitFindInStore () {\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n var minimumLength = getQueryMinimumLength(countryList);\n\n let localitiesWidgetFindInStore = new woosmap.localities.Autocomplete(\n 'input-text-woosmap-findinstore', {\n 'minLength': minimumLength,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n }\n );\n localitiesWidgetFindInStore.addListener('selected_suggestion', () => {\n let selection = localitiesWidgetFindInStore.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionFindInStore', selection);\n });\n\n $('body').on('woosmap:modalClose', function (_e) {\n localitiesWidgetFindInStore.removeListener('selected_suggestion');\n $(localitiesWidgetFindInStore.resultsContainer).addClass('hidden');\n });\n}\n\nfunction woosmapInitUPS () {\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n\n let localitiesWidgetUPS = new woosmap.localities.Autocomplete(\n 'input-text-woosmap-ups', {\n 'minLength': 3,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n }\n );\n localitiesWidgetUPS.addListener('selected_suggestion', () => {\n let selection = localitiesWidgetUPS.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionUPS', selection);\n });\n\n $('body').on('woosmap:modalClose', function (_e) {\n localitiesWidgetUPS.removeListener('selected_suggestion');\n $(localitiesWidgetUPS.resultsContainer).addClass('hidden');\n });\n}\n\nfunction woosmapInitInPost () {\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n\n let localitiesWidgetInPost = new woosmap.localities.Autocomplete(\n 'input-text-woosmap-inpost', {\n 'minLength': 3,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n }\n );\n\n localitiesWidgetInPost.addListener('selected_suggestion', () => {\n let selection = localitiesWidgetInPost.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionInPost', selection);\n });\n\n $('body').on('woosmap:modalClose', function (_e) {\n localitiesWidgetInPost.removeListener('selected_suggestion');\n $(localitiesWidgetInPost.resultsContainer).addClass('hidden');\n });\n}\n\nfunction woosmapInitPPL () {\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n\n // PPL\n let localitiesWidgetPPL = new woosmap.localities.Autocomplete(\n 'input-text-woosmap-ppl', {\n 'minLength': 3,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n }\n );\n\n localitiesWidgetPPL.addListener('selected_suggestion', () => {\n let selection = localitiesWidgetPPL.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionPPL', selection);\n });\n\n $('body').on('woosmap:modalClose', function (_e) {\n localitiesWidgetPPL.removeListener('selected_suggestion');\n $(localitiesWidgetPPL.resultsContainer).addClass('hidden');\n });\n}\n\nfunction woosmapInitBRT () {\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n\n let localitiesWidgetBRT = new woosmap.localities.Autocomplete(\n 'input-text-woosmap-brt', {\n 'minLength': 3,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n }\n );\n\n localitiesWidgetBRT.addListener('selected_suggestion', () => {\n let selection = localitiesWidgetBRT.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionBRT', selection);\n });\n\n $('body').on('woosmap:modalClose', function (_e) {\n localitiesWidgetBRT.removeListener('selected_suggestion');\n $(localitiesWidgetBRT.resultsContainer).addClass('hidden');\n });\n}\n\nfunction woosmapInitFindYourStoreMenu () {\n if (!$('#store-locator-menu').length) {\n return;\n }\n\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n var minimumLength = getQueryMinimumLength(countryList);\n\n let localitiesWidgetMenu = new woosmap.localities.Autocomplete(\n 'store-locator-menu', {\n 'minLength': minimumLength,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n }\n );\n\n localitiesWidgetMenu.addListener('selected_suggestion', () => {\n let inputValue = $('#store-locator-menu').val();\n\n let redirectUrl = $('#store-locator-menu').closest('[data-url]').data('url');\n let selectionMenu = localitiesWidgetMenu.getSelectedSuggestionDetails();\n selectionMenu = JSON.stringify(selectionMenu);\n\n sessionStorage.setItem('selectionMenu', selectionMenu);\n sessionStorage.setItem('inputValue', inputValue);\n\n window.location.href = redirectUrl;\n });\n}\n\nfunction woosmapInitFindYourStore (filterByCountry = true) {\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n var minimumLength = getQueryMinimumLength(countryList);\n\n var config = {};\n if (filterByCountry) {\n config = {\n 'minLength': minimumLength,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n };\n } else {\n config = {\n 'minLength': minimumLength,\n 'data': 'advanced',\n 'language': language\n };\n }\n\n let localitiesWidgetFindYourStore = new woosmap.localities.Autocomplete('store-postal-code', config);\n localitiesWidgetFindYourStore.addListener('selected_suggestion', () => {\n var selection = localitiesWidgetFindYourStore.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionFindYourStore', selection);\n });\n\n $('body').on('woosmap:openDropdownStoreLocator', () => {\n localitiesWidgetFindYourStore.predictions();\n });\n}\n\nfunction woosmapInitFooter (filterByCountry = true) {\n const _initWoosmap = () => {\n if (!$('#footer-find-store').length) {\n return;\n }\n\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n var minimumLength = getQueryMinimumLength(countryList);\n\n var config = {};\n if (filterByCountry) {\n config = {\n 'minLength': minimumLength,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n };\n } else {\n config = {\n 'minLength': minimumLength,\n 'data': 'advanced',\n 'language': language\n };\n }\n\n // eslint-disable-next-line no-undef la\n let localitiesWidgetFooter = new woosmap.localities.Autocomplete('footer-find-store', config);\n\n localitiesWidgetFooter.addListener('selected_suggestion', () => {\n let selection = localitiesWidgetFooter.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionFooter', selection);\n });\n };\n\n if (window.woosmap) {\n _initWoosmap();\n } else {\n $('body').on('woosmap:loaded', _initWoosmap);\n }\n}\n\nfunction woosmapInitSPS () {\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n\n // SPS\n let localitiesWidgetSPS = new woosmap.localities.Autocomplete(\n 'input-text-woosmap-sps', {\n 'minLength': 3,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n }\n );\n\n localitiesWidgetSPS.addListener('selected_suggestion', () => {\n let selection = localitiesWidgetSPS.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionSPS', selection);\n });\n\n $('body').on('woosmap:modalClose', function (_e) {\n localitiesWidgetSPS.removeListener('selected_suggestion');\n $(localitiesWidgetSPS.resultsContainer).addClass('hidden');\n });\n}\n\nfunction woosmapInitRUPup () {\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n\n // RU PUP\n let localitiesWidgetRUPup = new woosmap.localities.Autocomplete(\n 'input-text-woosmap-ru-pup', {\n 'minLength': 3,\n 'components': {\n 'country': countryList\n },\n 'language': language\n }\n );\n\n localitiesWidgetRUPup.addListener('selected_suggestion', () => {\n let selection = localitiesWidgetRUPup.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionRuPup', selection);\n });\n\n $('body').on('woosmap:modalClose', function (_e) {\n localitiesWidgetRUPup.removeListener('selected_suggestion');\n $(localitiesWidgetRUPup.resultsContainer).addClass('hidden');\n });\n}\n\nfunction woosmapInitDHL () {\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n\n // DHL\n let localitiesWidgetDHL = new woosmap.localities.Autocomplete(\n 'input-text-woosmap-dhl', {\n 'minLength': 3,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n }\n );\n localitiesWidgetDHL.addListener('selected_suggestion', () => {\n let selection = localitiesWidgetDHL.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionDHL', selection);\n });\n}\n\nfunction woosmapInitDPD () {\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n\n // DPD\n let localitiesWidgetDPD = new woosmap.localities.Autocomplete(\n 'input-text-woosmap-dpd', {\n 'minLength': 3,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n }\n );\n localitiesWidgetDPD.addListener('selected_suggestion', () => {\n let selection = localitiesWidgetDPD.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionDPD', selection);\n });\n}\n\nfunction woosmapInitHermes () {\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n\n // Hermes\n let localitiesWidgetHermes = new woosmap.localities.Autocomplete(\n 'input-text-woosmap-hermes', {\n 'minLength': 3,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n }\n );\n localitiesWidgetHermes.addListener('selected_suggestion', () => {\n let selection = localitiesWidgetHermes.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionHermes', selection);\n });\n}\n\nfunction woosmapListenerForModalClose () {\n $('body').on('click', '.tingle-modal:not(.express-button-modal)', (e) => {\n /**\n * Mandatory classes to skip the trigger below for return flow. \"isReturnFlow\" is TRUE if the target action is:\n * (1) CTA find in store.\n * (2) CTA proceed.\n * (3) CTA edit store\n */\n var isReturnFlow = $(e.target).hasClass('js-returnOpen-searchStores') || $(e.target).hasClass('js-returnOpen-footer_buttonProceed') || $(e.target).closest('.js-returnOpen-shippingMethod_editStore').length > 0;\n\n if (e.target.className === '' || isReturnFlow) {\n return;\n }\n $('body').trigger('woosmap:modalClose');\n });\n $('body').on('click', '.modal-close:not(.modal-close-express)', (e) => {\n $('body').trigger('woosmap:modalClose');\n });\n}\n\nfunction woosmapInitCollissimo () {\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n\n // Collissimo\n let localitiesWidgetCollisimo = new woosmap.localities.Autocomplete(\n 'input-text-woosmap-collissimo', {\n 'minLength': 3,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n }\n );\n\n localitiesWidgetCollisimo.addListener('selected_suggestion', () => {\n let selection = localitiesWidgetCollisimo.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionCLSS', selection);\n });\n\n $('body').on('woosmap:modalClose', function (_e) {\n localitiesWidgetCollisimo.removeListener('selected_suggestion');\n $(localitiesWidgetCollisimo.resultsContainer).addClass('hidden');\n });\n}\n\n// TODO: DELETE AFTER REFACTORING FILE pickupPoint.js ON EME\nfunction woosmapInitPDB () {\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n\n let localitiesWidgetPDB = new woosmap.localities.Autocomplete(\n 'input-text-woosmap-PDB', {\n 'minLength': 3,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n }\n );\n\n localitiesWidgetPDB.addListener('selected_suggestion', () => {\n let selection = localitiesWidgetPDB.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionPDB', selection);\n });\n\n $('body').on('woosmap:modalClose', function (_e) {\n localitiesWidgetPDB.removeListener('selected_suggestion');\n $(localitiesWidgetPDB.resultsContainer).addClass('hidden');\n });\n\n $('body').on('click', '#pickupPointPDB input[name=\"pickup-point-service-type\"]', (e) => {\n e.stopPropagation();\n\n let selection = localitiesWidgetPDB.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:chooseOptionPDB', selection);\n });\n}\n\nfunction woosmapInitPudoBFF (shippingMethodType) {\n var countryAndLang = getCountryAndLang();\n var countryList = countryAndLang[0];\n var language = countryAndLang[1];\n\n let localitiesWidget;\n\n // switch case for customizations on shippingMethodType\n switch (shippingMethodType) {\n case 'DEL' :\n case 'GLS' :\n case 'XBS':\n localitiesWidget = new woosmap.localities.Autocomplete(\n `input-text-woosmap-${shippingMethodType}`, {\n 'minLength': 3,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language,\n 'types': 'postal_code'\n }\n );\n break;\n\n default :\n localitiesWidget = new woosmap.localities.Autocomplete(\n `input-text-woosmap-${shippingMethodType}`, {\n 'minLength': 3,\n 'components': {\n 'country': countryList\n },\n 'data': 'advanced',\n 'language': language\n }\n );\n break;\n }\n\n const pudoModalSelector = `#pickupPoint${shippingMethodType}`;\n const chooseOptionSelector = `chooseOption${shippingMethodType}`;\n\n localitiesWidget.addListener('selected_suggestion', () => {\n let selection = localitiesWidget.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:' + chooseOptionSelector, selection);\n });\n\n $('body').on('woosmap:modalClose', function (_e) {\n localitiesWidget.removeListener('selected_suggestion');\n $(localitiesWidget.resultsContainer).addClass('hidden');\n });\n\n $('body').on('click', pudoModalSelector + ' input[name=\"pickup-point-service-type\"]', (e) => {\n e.stopPropagation();\n\n let selection = localitiesWidget.getSelectedSuggestionDetails();\n $('body').trigger('woosmap:' + chooseOptionSelector, selection);\n });\n}\n\nexport {\n woosmapInitFindInStore,\n woosmapInitUPS,\n woosmapInitInPost,\n woosmapInitBRT,\n woosmapInitPPL,\n woosmapInitDHL,\n woosmapInitDPD,\n woosmapInitFindYourStoreMenu,\n woosmapInitFindYourStore,\n woosmapInitSPS,\n woosmapListenerForModalClose,\n woosmapInitFooter,\n woosmapInitRUPup,\n woosmapInitHermes,\n woosmapInitCollissimo,\n woosmapInitPDB,\n woosmapInitPudoBFF\n};\n","/* build: `node build.js modules=ALL exclude=gestures,accessors requirejs minifier=uglifyjs` */\n/*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */\n\nvar fabric = fabric || { version: '3.6.6' };\nif (typeof exports !== 'undefined') {\n exports.fabric = fabric;\n}\n/* _AMD_START_ */\nelse if (typeof define === 'function' && define.amd) {\n define([], function() { return fabric; });\n}\n/* _AMD_END_ */\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n if (document instanceof (typeof HTMLDocument !== 'undefined' ? HTMLDocument : Document)) {\n fabric.document = document;\n }\n else {\n fabric.document = document.implementation.createHTMLDocument('');\n }\n fabric.window = window;\n}\nelse {\n // assume we're running under node.js when document/window are not present\n var jsdom = require('jsdom');\n var virtualWindow = new jsdom.JSDOM(\n decodeURIComponent('%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E'),\n {\n features: {\n FetchExternalResources: ['img']\n },\n resources: 'usable'\n }).window;\n fabric.document = virtualWindow.document;\n fabric.jsdomImplForWrapper = require('jsdom/lib/jsdom/living/generated/utils').implForWrapper;\n fabric.nodeCanvas = require('jsdom/lib/jsdom/utils').Canvas;\n fabric.window = virtualWindow;\n DOMParser = fabric.window.DOMParser;\n}\n\n/**\n * True when in environment that supports touch events\n * @type boolean\n */\nfabric.isTouchSupported = 'ontouchstart' in fabric.window || 'ontouchstart' in fabric.document ||\n (fabric.window && fabric.window.navigator && fabric.window.navigator.maxTouchPoints > 0);\n\n/**\n * True when in environment that's probably Node.js\n * @type boolean\n */\nfabric.isLikelyNode = typeof Buffer !== 'undefined' &&\n typeof window === 'undefined';\n\n/* _FROM_SVG_START_ */\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nfabric.SHARED_ATTRIBUTES = [\n 'display',\n 'transform',\n 'fill', 'fill-opacity', 'fill-rule',\n 'opacity',\n 'stroke', 'stroke-dasharray', 'stroke-linecap', 'stroke-dashoffset',\n 'stroke-linejoin', 'stroke-miterlimit',\n 'stroke-opacity', 'stroke-width',\n 'id', 'paint-order', 'vector-effect',\n 'instantiated_by_use', 'clip-path'\n];\n/* _FROM_SVG_END_ */\n\n/**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\nfabric.DPI = 96;\nfabric.reNum = '(?:[-+]?(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[eE][-+]?\\\\d+)?)';\nfabric.rePathCommand = /([-+]?((\\d+\\.\\d+)|((\\d+)|(\\.\\d+)))(?:[eE][-+]?\\d+)?)/ig;\nfabric.reNonWord = /[ \\n\\.,;!\\?\\-]/;\nfabric.fontPaths = { };\nfabric.iMatrix = [1, 0, 0, 1, 0, 0];\nfabric.svgNS = 'http://www.w3.org/2000/svg';\n\n/**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.perfLimitSizeTotal = 2097152;\n\n/**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.maxCacheSideLimit = 4096;\n\n/**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.minCacheSideLimit = 256;\n\n/**\n * Cache Object for widths of chars in text rendering.\n */\nfabric.charWidthsCache = { };\n\n/**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n * @since 2.0.0\n * @type Number\n * @default\n */\nfabric.textureSize = 2048;\n\n/**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @default\n */\nfabric.disableStyleCopyPaste = false;\n\n/**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n * @default\n */\nfabric.enableGLFiltering = true;\n\n/**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\nfabric.devicePixelRatio = fabric.window.devicePixelRatio ||\n fabric.window.webkitDevicePixelRatio ||\n fabric.window.mozDevicePixelRatio ||\n 1;\n/**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\nfabric.browserShadowBlurConstant = 1;\n\n/**\n * This object contains the result of arc to beizer conversion for faster retrieving if the same arc needs to be converted again.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.arcToSegmentsCache = { };\n\n/**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.boundsOfCurveCache = { };\n\n/**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * @default true\n */\nfabric.cachesBoundsOfCurve = true;\n\n/**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\nfabric.forceGLPutImageData = false;\n\nfabric.initFilterBackend = function() {\n if (fabric.enableGLFiltering && fabric.isWebglSupported && fabric.isWebglSupported(fabric.textureSize)) {\n console.log('max texture size: ' + fabric.maxTextureSize);\n return (new fabric.WebglFilterBackend({ tileSize: fabric.textureSize }));\n }\n else if (fabric.Canvas2dFilterBackend) {\n return (new fabric.Canvas2dFilterBackend());\n }\n};\n\n\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n // ensure globality even if entire library were function wrapped (as in Meteor.js packaging system)\n window.fabric = fabric;\n}\n\n\n(function() {\n\n /**\n * @private\n * @param {String} eventName\n * @param {Function} handler\n */\n function _removeEventListener(eventName, handler) {\n if (!this.__eventListeners[eventName]) {\n return;\n }\n var eventListener = this.__eventListeners[eventName];\n if (handler) {\n eventListener[eventListener.indexOf(handler)] = false;\n }\n else {\n fabric.util.array.fill(eventListener, false);\n }\n }\n\n /**\n * Observes specified event\n * @deprecated `observe` deprecated since 0.8.34 (use `on` instead)\n * @memberOf fabric.Observable\n * @alias on\n * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Self} thisArg\n * @chainable\n */\n function observe(eventName, handler) {\n if (!this.__eventListeners) {\n this.__eventListeners = { };\n }\n // one object with key/value pairs was passed\n if (arguments.length === 1) {\n for (var prop in eventName) {\n this.on(prop, eventName[prop]);\n }\n }\n else {\n if (!this.__eventListeners[eventName]) {\n this.__eventListeners[eventName] = [];\n }\n this.__eventListeners[eventName].push(handler);\n }\n return this;\n }\n\n /**\n * Stops event observing for a particular event handler. Calling this method\n * without arguments removes all handlers for all events\n * @deprecated `stopObserving` deprecated since 0.8.34 (use `off` instead)\n * @memberOf fabric.Observable\n * @alias off\n * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function to be deleted from EventListeners\n * @return {Self} thisArg\n * @chainable\n */\n function stopObserving(eventName, handler) {\n if (!this.__eventListeners) {\n return this;\n }\n\n // remove all key/value pairs (event name -> event handler)\n if (arguments.length === 0) {\n for (eventName in this.__eventListeners) {\n _removeEventListener.call(this, eventName);\n }\n }\n // one object with key/value pairs was passed\n else if (arguments.length === 1 && typeof arguments[0] === 'object') {\n for (var prop in eventName) {\n _removeEventListener.call(this, prop, eventName[prop]);\n }\n }\n else {\n _removeEventListener.call(this, eventName, handler);\n }\n return this;\n }\n\n /**\n * Fires event with an optional options object\n * @deprecated `fire` deprecated since 1.0.7 (use `trigger` instead)\n * @memberOf fabric.Observable\n * @alias trigger\n * @param {String} eventName Event name to fire\n * @param {Object} [options] Options object\n * @return {Self} thisArg\n * @chainable\n */\n function fire(eventName, options) {\n if (!this.__eventListeners) {\n return this;\n }\n\n var listenersForEvent = this.__eventListeners[eventName];\n if (!listenersForEvent) {\n return this;\n }\n\n for (var i = 0, len = listenersForEvent.length; i < len; i++) {\n listenersForEvent[i] && listenersForEvent[i].call(this, options || { });\n }\n this.__eventListeners[eventName] = listenersForEvent.filter(function(value) {\n return value !== false;\n });\n return this;\n }\n\n /**\n * @namespace fabric.Observable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabricjs.com/events|Events demo}\n */\n fabric.Observable = {\n observe: observe,\n stopObserving: stopObserving,\n fire: fire,\n\n on: observe,\n off: stopObserving,\n trigger: fire\n };\n})();\n\n\n/**\n * @namespace fabric.Collection\n */\nfabric.Collection = {\n\n _objects: [],\n\n /**\n * Adds objects to collection, Canvas or Group, then renders canvas\n * (if `renderOnAddRemove` is not `false`).\n * in case of Group no changes to bounding box are made.\n * Objects should be instances of (or inherit from) fabric.Object\n * Use of this function is highly discouraged for groups.\n * you can add a bunch of objects with the add method but then you NEED\n * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n * @param {...fabric.Object} object Zero or more fabric instances\n * @return {Self} thisArg\n * @chainable\n */\n add: function () {\n this._objects.push.apply(this._objects, arguments);\n if (this._onObjectAdded) {\n for (var i = 0, length = arguments.length; i < length; i++) {\n this._onObjectAdded(arguments[i]);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Inserts an object into collection at specified index, then renders canvas (if `renderOnAddRemove` is not `false`)\n * An object should be an instance of (or inherit from) fabric.Object\n * Use of this function is highly discouraged for groups.\n * you can add a bunch of objects with the insertAt method but then you NEED\n * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n * @param {Object} object Object to insert\n * @param {Number} index Index to insert object at\n * @param {Boolean} nonSplicing When `true`, no splicing (shifting) of objects occurs\n * @return {Self} thisArg\n * @chainable\n */\n insertAt: function (object, index, nonSplicing) {\n var objects = this._objects;\n if (nonSplicing) {\n objects[index] = object;\n }\n else {\n objects.splice(index, 0, object);\n }\n this._onObjectAdded && this._onObjectAdded(object);\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n * @param {...fabric.Object} object Zero or more fabric instances\n * @return {Self} thisArg\n * @chainable\n */\n remove: function() {\n var objects = this._objects,\n index, somethingRemoved = false;\n\n for (var i = 0, length = arguments.length; i < length; i++) {\n index = objects.indexOf(arguments[i]);\n\n // only call onObjectRemoved if an object was actually removed\n if (index !== -1) {\n somethingRemoved = true;\n objects.splice(index, 1);\n this._onObjectRemoved && this._onObjectRemoved(arguments[i]);\n }\n }\n\n this.renderOnAddRemove && somethingRemoved && this.requestRenderAll();\n return this;\n },\n\n /**\n * Executes given function for each object in this group\n * @param {Function} callback\n * Callback invoked with current object as first argument,\n * index - as second and an array of all objects - as third.\n * Callback is invoked in a context of Global Object (e.g. `window`)\n * when no `context` argument is given\n *\n * @param {Object} context Context (aka thisObject)\n * @return {Self} thisArg\n * @chainable\n */\n forEachObject: function(callback, context) {\n var objects = this.getObjects();\n for (var i = 0, len = objects.length; i < len; i++) {\n callback.call(context, objects[i], i, objects);\n }\n return this;\n },\n\n /**\n * Returns an array of children objects of this instance\n * Type parameter introduced in 1.3.10\n * since 2.3.5 this method return always a COPY of the array;\n * @param {String} [type] When specified, only objects of this type are returned\n * @return {Array}\n */\n getObjects: function(type) {\n if (typeof type === 'undefined') {\n return this._objects.concat();\n }\n return this._objects.filter(function(o) {\n return o.type === type;\n });\n },\n\n /**\n * Returns object at specified index\n * @param {Number} index\n * @return {Self} thisArg\n */\n item: function (index) {\n return this._objects[index];\n },\n\n /**\n * Returns true if collection contains no objects\n * @return {Boolean} true if collection is empty\n */\n isEmpty: function () {\n return this._objects.length === 0;\n },\n\n /**\n * Returns a size of a collection (i.e: length of an array containing its objects)\n * @return {Number} Collection size\n */\n size: function() {\n return this._objects.length;\n },\n\n /**\n * Returns true if collection contains an object\n * @param {Object} object Object to check against\n * @return {Boolean} `true` if collection contains an object\n */\n contains: function(object) {\n return this._objects.indexOf(object) > -1;\n },\n\n /**\n * Returns number representation of a collection complexity\n * @return {Number} complexity\n */\n complexity: function () {\n return this._objects.reduce(function (memo, current) {\n memo += current.complexity ? current.complexity() : 0;\n return memo;\n }, 0);\n }\n};\n\n\n/**\n * @namespace fabric.CommonMethods\n */\nfabric.CommonMethods = {\n\n /**\n * Sets object's properties from options\n * @param {Object} [options] Options object\n */\n _setOptions: function(options) {\n for (var prop in options) {\n this.set(prop, options[prop]);\n }\n },\n\n /**\n * @private\n * @param {Object} [filler] Options object\n * @param {String} [property] property to set the Gradient to\n */\n _initGradient: function(filler, property) {\n if (filler && filler.colorStops && !(filler instanceof fabric.Gradient)) {\n this.set(property, new fabric.Gradient(filler));\n }\n },\n\n /**\n * @private\n * @param {Object} [filler] Options object\n * @param {String} [property] property to set the Pattern to\n * @param {Function} [callback] callback to invoke after pattern load\n */\n _initPattern: function(filler, property, callback) {\n if (filler && filler.source && !(filler instanceof fabric.Pattern)) {\n this.set(property, new fabric.Pattern(filler, callback));\n }\n else {\n callback && callback();\n }\n },\n\n /**\n * @private\n * @param {Object} [options] Options object\n */\n _initClipping: function(options) {\n if (!options.clipTo || typeof options.clipTo !== 'string') {\n return;\n }\n\n var functionBody = fabric.util.getFunctionBody(options.clipTo);\n if (typeof functionBody !== 'undefined') {\n this.clipTo = new Function('ctx', functionBody);\n }\n },\n\n /**\n * @private\n */\n _setObject: function(obj) {\n for (var prop in obj) {\n this._set(prop, obj[prop]);\n }\n },\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n set: function(key, value) {\n if (typeof key === 'object') {\n this._setObject(key);\n }\n else {\n if (typeof value === 'function' && key !== 'clipTo') {\n this._set(key, value(this.get(key)));\n }\n else {\n this._set(key, value);\n }\n }\n return this;\n },\n\n _set: function(key, value) {\n this[key] = value;\n },\n\n /**\n * Toggles specified property from `true` to `false` or from `false` to `true`\n * @param {String} property Property to toggle\n * @return {fabric.Object} thisArg\n * @chainable\n */\n toggle: function(property) {\n var value = this.get(property);\n if (typeof value === 'boolean') {\n this.set(property, !value);\n }\n return this;\n },\n\n /**\n * Basic getter\n * @param {String} property Property name\n * @return {*} value of a property\n */\n get: function(property) {\n return this[property];\n }\n};\n\n\n(function(global) {\n\n var sqrt = Math.sqrt,\n atan2 = Math.atan2,\n pow = Math.pow,\n PiBy180 = Math.PI / 180,\n PiBy2 = Math.PI / 2;\n\n /**\n * @namespace fabric.util\n */\n fabric.util = {\n\n /**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * @static\n * @memberOf fabric.util\n * @param {Number} angle the angle in radians or in degree\n * @return {Number}\n */\n cos: function(angle) {\n if (angle === 0) { return 1; }\n if (angle < 0) {\n // cos(a) = cos(-a)\n angle = -angle;\n }\n var angleSlice = angle / PiBy2;\n switch (angleSlice) {\n case 1: case 3: return 0;\n case 2: return -1;\n }\n return Math.cos(angle);\n },\n\n /**\n * Calculate the sin of an angle, avoiding returning floats for known results\n * @static\n * @memberOf fabric.util\n * @param {Number} angle the angle in radians or in degree\n * @return {Number}\n */\n sin: function(angle) {\n if (angle === 0) { return 0; }\n var angleSlice = angle / PiBy2, sign = 1;\n if (angle < 0) {\n // sin(-a) = -sin(a)\n sign = -1;\n }\n switch (angleSlice) {\n case 1: return sign;\n case 2: return 0;\n case 3: return -sign;\n }\n return Math.sin(angle);\n },\n\n /**\n * Removes value from an array.\n * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n * @static\n * @memberOf fabric.util\n * @param {Array} array\n * @param {*} value\n * @return {Array} original array\n */\n removeFromArray: function(array, value) {\n var idx = array.indexOf(value);\n if (idx !== -1) {\n array.splice(idx, 1);\n }\n return array;\n },\n\n /**\n * Returns random number between 2 specified ones.\n * @static\n * @memberOf fabric.util\n * @param {Number} min lower limit\n * @param {Number} max upper limit\n * @return {Number} random value (between min and max)\n */\n getRandomInt: function(min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n },\n\n /**\n * Transforms degrees to radians.\n * @static\n * @memberOf fabric.util\n * @param {Number} degrees value in degrees\n * @return {Number} value in radians\n */\n degreesToRadians: function(degrees) {\n return degrees * PiBy180;\n },\n\n /**\n * Transforms radians to degrees.\n * @static\n * @memberOf fabric.util\n * @param {Number} radians value in radians\n * @return {Number} value in degrees\n */\n radiansToDegrees: function(radians) {\n return radians / PiBy180;\n },\n\n /**\n * Rotates `point` around `origin` with `radians`\n * @static\n * @memberOf fabric.util\n * @param {fabric.Point} point The point to rotate\n * @param {fabric.Point} origin The origin of the rotation\n * @param {Number} radians The radians of the angle for the rotation\n * @return {fabric.Point} The new rotated point\n */\n rotatePoint: function(point, origin, radians) {\n point.subtractEquals(origin);\n var v = fabric.util.rotateVector(point, radians);\n return new fabric.Point(v.x, v.y).addEquals(origin);\n },\n\n /**\n * Rotates `vector` with `radians`\n * @static\n * @memberOf fabric.util\n * @param {Object} vector The vector to rotate (x and y)\n * @param {Number} radians The radians of the angle for the rotation\n * @return {Object} The new rotated point\n */\n rotateVector: function(vector, radians) {\n var sin = fabric.util.sin(radians),\n cos = fabric.util.cos(radians),\n rx = vector.x * cos - vector.y * sin,\n ry = vector.x * sin + vector.y * cos;\n return {\n x: rx,\n y: ry\n };\n },\n\n /**\n * Apply transform t to point p\n * @static\n * @memberOf fabric.util\n * @param {fabric.Point} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {fabric.Point} The transformed point\n */\n transformPoint: function(p, t, ignoreOffset) {\n if (ignoreOffset) {\n return new fabric.Point(\n t[0] * p.x + t[2] * p.y,\n t[1] * p.x + t[3] * p.y\n );\n }\n return new fabric.Point(\n t[0] * p.x + t[2] * p.y + t[4],\n t[1] * p.x + t[3] * p.y + t[5]\n );\n },\n\n /**\n * Returns coordinates of points's bounding rectangle (left, top, width, height)\n * @param {Array} points 4 points array\n * @param {Array} [transform] an array of 6 numbers representing a 2x3 transform matrix\n * @return {Object} Object with left, top, width, height properties\n */\n makeBoundingBoxFromPoints: function(points, transform) {\n if (transform) {\n for (var i = 0; i < points.length; i++) {\n points[i] = fabric.util.transformPoint(points[i], transform);\n }\n }\n var xPoints = [points[0].x, points[1].x, points[2].x, points[3].x],\n minX = fabric.util.array.min(xPoints),\n maxX = fabric.util.array.max(xPoints),\n width = maxX - minX,\n yPoints = [points[0].y, points[1].y, points[2].y, points[3].y],\n minY = fabric.util.array.min(yPoints),\n maxY = fabric.util.array.max(yPoints),\n height = maxY - minY;\n\n return {\n left: minX,\n top: minY,\n width: width,\n height: height\n };\n },\n\n /**\n * Invert transformation t\n * @static\n * @memberOf fabric.util\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\n invertTransform: function(t) {\n var a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0]],\n o = fabric.util.transformPoint({ x: t[4], y: t[5] }, r, true);\n r[4] = -o.x;\n r[5] = -o.y;\n return r;\n },\n\n /**\n * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n * @static\n * @memberOf fabric.util\n * @param {Number|String} number number to operate on\n * @param {Number} fractionDigits number of fraction digits to \"leave\"\n * @return {Number}\n */\n toFixed: function(number, fractionDigits) {\n return parseFloat(Number(number).toFixed(fractionDigits));\n },\n\n /**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {Number|String} value number to operate on\n * @param {Number} fontSize\n * @return {Number|String}\n */\n parseUnit: function(value, fontSize) {\n var unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n if (!fontSize) {\n fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n }\n switch (unit[0]) {\n case 'mm':\n return number * fabric.DPI / 25.4;\n\n case 'cm':\n return number * fabric.DPI / 2.54;\n\n case 'in':\n return number * fabric.DPI;\n\n case 'pt':\n return number * fabric.DPI / 72; // or * 4 / 3\n\n case 'pc':\n return number * fabric.DPI / 72 * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n },\n\n /**\n * Function which always returns `false`.\n * @static\n * @memberOf fabric.util\n * @return {Boolean}\n */\n falseFunction: function() {\n return false;\n },\n\n /**\n * Returns klass \"Class\" object of given namespace\n * @memberOf fabric.util\n * @param {String} type Type of object (eg. 'circle')\n * @param {String} namespace Namespace to get klass \"Class\" object from\n * @return {Object} klass \"Class\"\n */\n getKlass: function(type, namespace) {\n // capitalize first letter only\n type = fabric.util.string.camelize(type.charAt(0).toUpperCase() + type.slice(1));\n return fabric.util.resolveNamespace(namespace)[type];\n },\n\n /**\n * Returns array of attributes for given svg that fabric parses\n * @memberOf fabric.util\n * @param {String} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\n getSvgAttributes: function(type) {\n var attributes = [\n 'instantiated_by_use',\n 'style',\n 'id',\n 'class'\n ];\n switch (type) {\n case 'linearGradient':\n attributes = attributes.concat(['x1', 'y1', 'x2', 'y2', 'gradientUnits', 'gradientTransform']);\n break;\n case 'radialGradient':\n attributes = attributes.concat(['gradientUnits', 'gradientTransform', 'cx', 'cy', 'r', 'fx', 'fy', 'fr']);\n break;\n case 'stop':\n attributes = attributes.concat(['offset', 'stop-color', 'stop-opacity']);\n break;\n }\n return attributes;\n },\n\n /**\n * Returns object of given namespace\n * @memberOf fabric.util\n * @param {String} namespace Namespace string e.g. 'fabric.Image.filter' or 'fabric'\n * @return {Object} Object for given namespace (default fabric)\n */\n resolveNamespace: function(namespace) {\n if (!namespace) {\n return fabric;\n }\n\n var parts = namespace.split('.'),\n len = parts.length, i,\n obj = global || fabric.window;\n\n for (i = 0; i < len; ++i) {\n obj = obj[parts[i]];\n }\n\n return obj;\n },\n\n /**\n * Loads image element from given url and passes it to a callback\n * @memberOf fabric.util\n * @param {String} url URL representing an image\n * @param {Function} callback Callback; invoked with loaded image\n * @param {*} [context] Context to invoke callback in\n * @param {Object} [crossOrigin] crossOrigin value to set image element to\n */\n loadImage: function(url, callback, context, crossOrigin) {\n if (!url) {\n callback && callback.call(context, url);\n return;\n }\n\n var img = fabric.util.createImage();\n\n /** @ignore */\n var onLoadCallback = function () {\n callback && callback.call(context, img);\n img = img.onload = img.onerror = null;\n };\n\n img.onload = onLoadCallback;\n /** @ignore */\n img.onerror = function() {\n fabric.log('Error loading ' + img.src);\n callback && callback.call(context, null, true);\n img = img.onload = img.onerror = null;\n };\n\n // data-urls appear to be buggy with crossOrigin\n // https://github.com/kangax/fabric.js/commit/d0abb90f1cd5c5ef9d2a94d3fb21a22330da3e0a#commitcomment-4513767\n // see https://code.google.com/p/chromium/issues/detail?id=315152\n // https://bugzilla.mozilla.org/show_bug.cgi?id=935069\n if (url.indexOf('data') !== 0 && crossOrigin) {\n img.crossOrigin = crossOrigin;\n }\n\n // IE10 / IE11-Fix: SVG contents from data: URI\n // will only be available if the IMG is present\n // in the DOM (and visible)\n if (url.substring(0,14) === 'data:image/svg') {\n img.onload = null;\n fabric.util.loadImageInDom(img, onLoadCallback);\n }\n\n img.src = url;\n },\n\n /**\n * Attaches SVG image with data: URL to the dom\n * @memberOf fabric.util\n * @param {Object} img Image object with data:image/svg src\n * @param {Function} callback Callback; invoked with loaded image\n * @return {Object} DOM element (div containing the SVG image)\n */\n loadImageInDom: function(img, onLoadCallback) {\n var div = fabric.document.createElement('div');\n div.style.width = div.style.height = '1px';\n div.style.left = div.style.top = '-100%';\n div.style.position = 'absolute';\n div.appendChild(img);\n fabric.document.querySelector('body').appendChild(div);\n /**\n * Wrap in function to:\n * 1. Call existing callback\n * 2. Cleanup DOM\n */\n img.onload = function () {\n onLoadCallback();\n div.parentNode.removeChild(div);\n div = null;\n };\n },\n\n /**\n * Creates corresponding fabric instances from their object representations\n * @static\n * @memberOf fabric.util\n * @param {Array} objects Objects to enliven\n * @param {Function} callback Callback to invoke when all objects are created\n * @param {String} namespace Namespace to get klass \"Class\" object from\n * @param {Function} reviver Method for further parsing of object elements,\n * called after each fabric object created.\n */\n enlivenObjects: function(objects, callback, namespace, reviver) {\n objects = objects || [];\n\n var enlivenedObjects = [],\n numLoadedObjects = 0,\n numTotalObjects = objects.length;\n\n function onLoaded() {\n if (++numLoadedObjects === numTotalObjects) {\n callback && callback(enlivenedObjects.filter(function(obj) {\n // filter out undefined objects (objects that gave error)\n return obj;\n }));\n }\n }\n\n if (!numTotalObjects) {\n callback && callback(enlivenedObjects);\n return;\n }\n\n objects.forEach(function (o, index) {\n // if sparse array\n if (!o || !o.type) {\n onLoaded();\n return;\n }\n var klass = fabric.util.getKlass(o.type, namespace);\n klass.fromObject(o, function (obj, error) {\n error || (enlivenedObjects[index] = obj);\n reviver && reviver(o, obj, error);\n onLoaded();\n });\n });\n },\n\n /**\n * Create and wait for loading of patterns\n * @static\n * @memberOf fabric.util\n * @param {Array} patterns Objects to enliven\n * @param {Function} callback Callback to invoke when all objects are created\n * called after each fabric object created.\n */\n enlivenPatterns: function(patterns, callback) {\n patterns = patterns || [];\n\n function onLoaded() {\n if (++numLoadedPatterns === numPatterns) {\n callback && callback(enlivenedPatterns);\n }\n }\n\n var enlivenedPatterns = [],\n numLoadedPatterns = 0,\n numPatterns = patterns.length;\n\n if (!numPatterns) {\n callback && callback(enlivenedPatterns);\n return;\n }\n\n patterns.forEach(function (p, index) {\n if (p && p.source) {\n new fabric.Pattern(p, function(pattern) {\n enlivenedPatterns[index] = pattern;\n onLoaded();\n });\n }\n else {\n enlivenedPatterns[index] = p;\n onLoaded();\n }\n });\n },\n\n /**\n * Groups SVG elements (usually those retrieved from SVG document)\n * @static\n * @memberOf fabric.util\n * @param {Array} elements SVG elements to group\n * @param {Object} [options] Options object\n * @param {String} path Value to set sourcePath to\n * @return {fabric.Object|fabric.Group}\n */\n groupSVGElements: function(elements, options, path) {\n var object;\n if (elements && elements.length === 1) {\n return elements[0];\n }\n if (options) {\n if (options.width && options.height) {\n options.centerPoint = {\n x: options.width / 2,\n y: options.height / 2\n };\n }\n else {\n delete options.width;\n delete options.height;\n }\n }\n object = new fabric.Group(elements, options);\n if (typeof path !== 'undefined') {\n object.sourcePath = path;\n }\n return object;\n },\n\n /**\n * Populates an object with properties of another object\n * @static\n * @memberOf fabric.util\n * @param {Object} source Source object\n * @param {Object} destination Destination object\n * @return {Array} properties Properties names to include\n */\n populateWithProperties: function(source, destination, properties) {\n if (properties && Object.prototype.toString.call(properties) === '[object Array]') {\n for (var i = 0, len = properties.length; i < len; i++) {\n if (properties[i] in source) {\n destination[properties[i]] = source[properties[i]];\n }\n }\n }\n },\n\n /**\n * Draws a dashed line between two points\n *\n * This method is used to draw dashed line around selection area.\n * See dotted stroke in canvas\n *\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x start x coordinate\n * @param {Number} y start y coordinate\n * @param {Number} x2 end x coordinate\n * @param {Number} y2 end y coordinate\n * @param {Array} da dash array pattern\n */\n drawDashedLine: function(ctx, x, y, x2, y2, da) {\n var dx = x2 - x,\n dy = y2 - y,\n len = sqrt(dx * dx + dy * dy),\n rot = atan2(dy, dx),\n dc = da.length,\n di = 0,\n draw = true;\n\n ctx.save();\n ctx.translate(x, y);\n ctx.moveTo(0, 0);\n ctx.rotate(rot);\n\n x = 0;\n while (len > x) {\n x += da[di++ % dc];\n if (x > len) {\n x = len;\n }\n ctx[draw ? 'lineTo' : 'moveTo'](x, 0);\n draw = !draw;\n }\n\n ctx.restore();\n },\n\n /**\n * Creates canvas element\n * @static\n * @memberOf fabric.util\n * @return {CanvasElement} initialized canvas element\n */\n createCanvasElement: function() {\n return fabric.document.createElement('canvas');\n },\n\n /**\n * Creates a canvas element that is a copy of another and is also painted\n * @param {CanvasElement} canvas to copy size and content of\n * @static\n * @memberOf fabric.util\n * @return {CanvasElement} initialized canvas element\n */\n copyCanvasElement: function(canvas) {\n var newCanvas = fabric.util.createCanvasElement();\n newCanvas.width = canvas.width;\n newCanvas.height = canvas.height;\n newCanvas.getContext('2d').drawImage(canvas, 0, 0);\n return newCanvas;\n },\n\n /**\n * since 2.6.0 moved from canvas instance to utility.\n * @param {CanvasElement} canvasEl to copy size and content of\n * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n * @param {Number} quality <= 1 and > 0\n * @static\n * @memberOf fabric.util\n * @return {String} data url\n */\n toDataURL: function(canvasEl, format, quality) {\n return canvasEl.toDataURL('image/' + format, quality);\n },\n\n /**\n * Creates image element (works on client and node)\n * @static\n * @memberOf fabric.util\n * @return {HTMLImageElement} HTML image element\n */\n createImage: function() {\n return fabric.document.createElement('img');\n },\n\n /**\n * @static\n * @memberOf fabric.util\n * @deprecated since 2.0.0\n * @param {fabric.Object} receiver Object implementing `clipTo` method\n * @param {CanvasRenderingContext2D} ctx Context to clip\n */\n clipContext: function(receiver, ctx) {\n ctx.save();\n ctx.beginPath();\n receiver.clipTo(ctx);\n ctx.clip();\n },\n\n /**\n * Multiply matrix A by matrix B to nest transformations\n * @static\n * @memberOf fabric.util\n * @param {Array} a First transformMatrix\n * @param {Array} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {Array} The product of the two transform matrices\n */\n multiplyTransformMatrices: function(a, b, is2x2) {\n // Matrix multiply a * b\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5]\n ];\n },\n\n /**\n * Decomposes standard 2x3 matrix into transform components\n * @static\n * @memberOf fabric.util\n * @param {Array} a transformMatrix\n * @return {Object} Components of transform\n */\n qrDecompose: function(a) {\n var angle = atan2(a[1], a[0]),\n denom = pow(a[0], 2) + pow(a[1], 2),\n scaleX = sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a [1]) / scaleX,\n skewX = atan2(a[0] * a[2] + a[1] * a [3], denom);\n return {\n angle: angle / PiBy180,\n scaleX: scaleX,\n scaleY: scaleY,\n skewX: skewX / PiBy180,\n skewY: 0,\n translateX: a[4],\n translateY: a[5]\n };\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.angle] angle in degrees\n * @return {Number[]} transform matrix\n */\n calcRotateMatrix: function(options) {\n if (!options.angle) {\n return fabric.iMatrix.concat();\n }\n var theta = fabric.util.degreesToRadians(options.angle),\n cos = fabric.util.cos(theta),\n sin = fabric.util.sin(theta);\n return [cos, sin, -sin, cos, 0, 0];\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewX]\n * @return {Number[]} transform matrix\n */\n calcDimensionsMatrix: function(options) {\n var scaleX = typeof options.scaleX === 'undefined' ? 1 : options.scaleX,\n scaleY = typeof options.scaleY === 'undefined' ? 1 : options.scaleY,\n scaleMatrix = [\n options.flipX ? -scaleX : scaleX,\n 0,\n 0,\n options.flipY ? -scaleY : scaleY,\n 0,\n 0],\n multiply = fabric.util.multiplyTransformMatrices,\n degreesToRadians = fabric.util.degreesToRadians;\n if (options.skewX) {\n scaleMatrix = multiply(\n scaleMatrix,\n [1, 0, Math.tan(degreesToRadians(options.skewX)), 1],\n true);\n }\n if (options.skewY) {\n scaleMatrix = multiply(\n scaleMatrix,\n [1, Math.tan(degreesToRadians(options.skewY)), 0, 1],\n true);\n }\n return scaleMatrix;\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewX]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Number[]} transform matrix\n */\n composeMatrix: function(options) {\n var matrix = [1, 0, 0, 1, options.translateX || 0, options.translateY || 0],\n multiply = fabric.util.multiplyTransformMatrices;\n if (options.angle) {\n matrix = multiply(matrix, fabric.util.calcRotateMatrix(options));\n }\n if (options.scaleX || options.scaleY || options.skewX || options.skewY || options.flipX || options.flipY) {\n matrix = multiply(matrix, fabric.util.calcDimensionsMatrix(options));\n }\n return matrix;\n },\n\n /**\n * Returns a transform matrix that has the same effect of scaleX, scaleY and skewX.\n * Is deprecated for composeMatrix. Please do not use it.\n * @static\n * @deprecated since 3.4.0\n * @memberOf fabric.util\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Number} skewX\n * @return {Number[]} transform matrix\n */\n customTransformMatrix: function(scaleX, scaleY, skewX) {\n return fabric.util.composeMatrix({ scaleX: scaleX, scaleY: scaleY, skewX: skewX });\n },\n\n /**\n * reset an object transform state to neutral. Top and left are not accounted for\n * @static\n * @memberOf fabric.util\n * @param {fabric.Object} target object to transform\n */\n resetObjectTransform: function (target) {\n target.scaleX = 1;\n target.scaleY = 1;\n target.skewX = 0;\n target.skewY = 0;\n target.flipX = false;\n target.flipY = false;\n target.rotate(0);\n },\n\n /**\n * Extract Object transform values\n * @static\n * @memberOf fabric.util\n * @param {fabric.Object} target object to read from\n * @return {Object} Components of transform\n */\n saveObjectTransform: function (target) {\n return {\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n angle: target.angle,\n left: target.left,\n flipX: target.flipX,\n flipY: target.flipY,\n top: target.top\n };\n },\n\n /**\n * Returns string representation of function body\n * @param {Function} fn Function to get body of\n * @return {String} Function body\n */\n getFunctionBody: function(fn) {\n return (String(fn).match(/function[^{]*\\{([\\s\\S]*)\\}/) || {})[1];\n },\n\n /**\n * Returns true if context has transparent pixel\n * at specified location (taking tolerance into account)\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x x coordinate\n * @param {Number} y y coordinate\n * @param {Number} tolerance Tolerance\n */\n isTransparent: function(ctx, x, y, tolerance) {\n\n // If tolerance is > 0 adjust start coords to take into account.\n // If moves off Canvas fix to 0\n if (tolerance > 0) {\n if (x > tolerance) {\n x -= tolerance;\n }\n else {\n x = 0;\n }\n if (y > tolerance) {\n y -= tolerance;\n }\n else {\n y = 0;\n }\n }\n\n var _isTransparent = true, i, temp,\n imageData = ctx.getImageData(x, y, (tolerance * 2) || 1, (tolerance * 2) || 1),\n l = imageData.data.length;\n\n // Split image data - for tolerance > 1, pixelDataSize = 4;\n for (i = 3; i < l; i += 4) {\n temp = imageData.data[i];\n _isTransparent = temp <= 0;\n if (_isTransparent === false) {\n break; // Stop if colour found\n }\n }\n\n imageData = null;\n\n return _isTransparent;\n },\n\n /**\n * Parse preserveAspectRatio attribute from element\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\n parsePreserveAspectRatioAttribute: function(attribute) {\n var meetOrSlice = 'meet', alignX = 'Mid', alignY = 'Mid',\n aspectRatioAttrs = attribute.split(' '), align;\n\n if (aspectRatioAttrs && aspectRatioAttrs.length) {\n meetOrSlice = aspectRatioAttrs.pop();\n if (meetOrSlice !== 'meet' && meetOrSlice !== 'slice') {\n align = meetOrSlice;\n meetOrSlice = 'meet';\n }\n else if (aspectRatioAttrs.length) {\n align = aspectRatioAttrs.pop();\n }\n }\n //divide align in alignX and alignY\n alignX = align !== 'none' ? align.slice(1, 4) : 'none';\n alignY = align !== 'none' ? align.slice(5, 8) : 'none';\n return {\n meetOrSlice: meetOrSlice,\n alignX: alignX,\n alignY: alignY\n };\n },\n\n /**\n * Clear char widths cache for the given font family or all the cache if no\n * fontFamily is specified.\n * Use it if you know you are loading fonts in a lazy way and you are not waiting\n * for custom fonts to load properly when adding text objects to the canvas.\n * If a text object is added when its own font is not loaded yet, you will get wrong\n * measurement and so wrong bounding boxes.\n * After the font cache is cleared, either change the textObject text content or call\n * initDimensions() to trigger a recalculation\n * @memberOf fabric.util\n * @param {String} [fontFamily] font family to clear\n */\n clearFabricFontCache: function(fontFamily) {\n fontFamily = (fontFamily || '').toLowerCase();\n if (!fontFamily) {\n fabric.charWidthsCache = { };\n }\n else if (fabric.charWidthsCache[fontFamily]) {\n delete fabric.charWidthsCache[fontFamily];\n }\n },\n\n /**\n * Given current aspect ratio, determines the max width and height that can\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Number} ar aspect ratio\n * @param {Number} maximumArea Maximum area you want to achieve\n * @return {Object.x} Limited dimensions by X\n * @return {Object.y} Limited dimensions by Y\n */\n limitDimsByArea: function(ar, maximumArea) {\n var roughWidth = Math.sqrt(maximumArea * ar),\n perfLimitSizeY = Math.floor(maximumArea / roughWidth);\n return { x: Math.floor(roughWidth), y: perfLimitSizeY };\n },\n\n capValue: function(min, value, max) {\n return Math.max(min, Math.min(value, max));\n },\n\n /**\n * Finds the scale for the object source to fit inside the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Object | fabric.Object} source\n * @param {Number} source.height natural unscaled height of the object\n * @param {Number} source.width natural unscaled width of the object\n * @param {Object | fabric.Object} destination\n * @param {Number} destination.height natural unscaled height of the object\n * @param {Number} destination.width natural unscaled width of the object\n * @return {Number} scale factor to apply to source to fit into destination\n */\n findScaleToFit: function(source, destination) {\n return Math.min(destination.width / source.width, destination.height / source.height);\n },\n\n /**\n * Finds the scale for the object source to cover entirely the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Object | fabric.Object} source\n * @param {Number} source.height natural unscaled height of the object\n * @param {Number} source.width natural unscaled width of the object\n * @param {Object | fabric.Object} destination\n * @param {Number} destination.height natural unscaled height of the object\n * @param {Number} destination.width natural unscaled width of the object\n * @return {Number} scale factor to apply to source to cover destination\n */\n findScaleToCover: function(source, destination) {\n return Math.max(destination.width / source.width, destination.height / source.height);\n },\n\n /**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @memberOf fabric.util\n * @param {Array} trasnform an array with 6 numbers\n * @return {String} transform matrix for svg\n * @return {Object.y} Limited dimensions by Y\n */\n matrixToSVG: function(transform) {\n return 'matrix(' + transform.map(function(value) {\n return fabric.util.toFixed(value, fabric.Object.NUM_FRACTION_DIGITS);\n }).join(' ') + ')';\n }\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n var _join = Array.prototype.join;\n\n /* Adapted from http://dxr.mozilla.org/mozilla-central/source/content/svg/content/src/nsSVGPathDataParser.cpp\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n */\n function arcToSegments(toX, toY, rx, ry, large, sweep, rotateX) {\n var argsString = _join.call(arguments);\n if (fabric.arcToSegmentsCache[argsString]) {\n return fabric.arcToSegmentsCache[argsString];\n }\n\n var PI = Math.PI, th = rotateX * PI / 180,\n sinTh = fabric.util.sin(th),\n cosTh = fabric.util.cos(th),\n fromX = 0, fromY = 0;\n\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n\n var px = -cosTh * toX * 0.5 - sinTh * toY * 0.5,\n py = -cosTh * toY * 0.5 + sinTh * toX * 0.5,\n rx2 = rx * rx, ry2 = ry * ry, py2 = py * py, px2 = px * px,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2,\n root = 0;\n\n if (pl < 0) {\n var s = Math.sqrt(1 - pl / (rx2 * ry2));\n rx *= s;\n ry *= s;\n }\n else {\n root = (large === sweep ? -1.0 : 1.0) *\n Math.sqrt( pl / (rx2 * py2 + ry2 * px2));\n }\n\n var cx = root * rx * py / ry,\n cy = -root * ry * px / rx,\n cx1 = cosTh * cx - sinTh * cy + toX * 0.5,\n cy1 = sinTh * cx + cosTh * cy + toY * 0.5,\n mTheta = calcVectorAngle(1, 0, (px - cx) / rx, (py - cy) / ry),\n dtheta = calcVectorAngle((px - cx) / rx, (py - cy) / ry, (-px - cx) / rx, (-py - cy) / ry);\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n }\n else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n var segments = Math.ceil(Math.abs(dtheta / PI * 2)),\n result = [], mDelta = dtheta / segments,\n mT = 8 / 3 * Math.sin(mDelta / 4) * Math.sin(mDelta / 4) / Math.sin(mDelta / 2),\n th3 = mTheta + mDelta;\n\n for (var i = 0; i < segments; i++) {\n result[i] = segmentToBezier(mTheta, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY);\n fromX = result[i][4];\n fromY = result[i][5];\n mTheta = th3;\n th3 += mDelta;\n }\n fabric.arcToSegmentsCache[argsString] = result;\n return result;\n }\n\n function segmentToBezier(th2, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY) {\n var costh2 = fabric.util.cos(th2),\n sinth2 = fabric.util.sin(th2),\n costh3 = fabric.util.cos(th3),\n sinth3 = fabric.util.sin(th3),\n toX = cosTh * rx * costh3 - sinTh * ry * sinth3 + cx1,\n toY = sinTh * rx * costh3 + cosTh * ry * sinth3 + cy1,\n cp1X = fromX + mT * ( -cosTh * rx * sinth2 - sinTh * ry * costh2),\n cp1Y = fromY + mT * ( -sinTh * rx * sinth2 + cosTh * ry * costh2),\n cp2X = toX + mT * ( cosTh * rx * sinth3 + sinTh * ry * costh3),\n cp2Y = toY + mT * ( sinTh * rx * sinth3 - cosTh * ry * costh3);\n\n return [\n cp1X, cp1Y,\n cp2X, cp2Y,\n toX, toY\n ];\n }\n\n /*\n * Private\n */\n function calcVectorAngle(ux, uy, vx, vy) {\n var ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n }\n else {\n return 2 * Math.PI - (ta - tb);\n }\n }\n\n /**\n * Draws arc\n * @param {CanvasRenderingContext2D} ctx\n * @param {Number} fx\n * @param {Number} fy\n * @param {Array} coords\n */\n fabric.util.drawArc = function(ctx, fx, fy, coords) {\n var rx = coords[0],\n ry = coords[1],\n rot = coords[2],\n large = coords[3],\n sweep = coords[4],\n tx = coords[5],\n ty = coords[6],\n segs = [[], [], [], []],\n segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (var i = 0, len = segsNorm.length; i < len; i++) {\n segs[i][0] = segsNorm[i][0] + fx;\n segs[i][1] = segsNorm[i][1] + fy;\n segs[i][2] = segsNorm[i][2] + fx;\n segs[i][3] = segsNorm[i][3] + fy;\n segs[i][4] = segsNorm[i][4] + fx;\n segs[i][5] = segsNorm[i][5] + fy;\n ctx.bezierCurveTo.apply(ctx, segs[i]);\n }\n };\n\n /**\n * Calculate bounding box of a elliptic-arc\n * @param {Number} fx start point of arc\n * @param {Number} fy\n * @param {Number} rx horizontal radius\n * @param {Number} ry vertical radius\n * @param {Number} rot angle of horizontal axe\n * @param {Number} large 1 or 0, whatever the arc is the big or the small on the 2 points\n * @param {Number} sweep 1 or 0, 1 clockwise or counterclockwise direction\n * @param {Number} tx end point of arc\n * @param {Number} ty\n */\n fabric.util.getBoundsOfArc = function(fx, fy, rx, ry, rot, large, sweep, tx, ty) {\n\n var fromX = 0, fromY = 0, bound, bounds = [],\n segs = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (var i = 0, len = segs.length; i < len; i++) {\n bound = getBoundsOfCurve(fromX, fromY, segs[i][0], segs[i][1], segs[i][2], segs[i][3], segs[i][4], segs[i][5]);\n bounds.push({ x: bound[0].x + fx, y: bound[0].y + fy });\n bounds.push({ x: bound[1].x + fx, y: bound[1].y + fy });\n fromX = segs[i][4];\n fromY = segs[i][5];\n }\n return bounds;\n };\n\n /**\n * Calculate bounding box of a beziercurve\n * @param {Number} x0 starting point\n * @param {Number} y0\n * @param {Number} x1 first control point\n * @param {Number} y1\n * @param {Number} x2 secondo control point\n * @param {Number} y2\n * @param {Number} x3 end of beizer\n * @param {Number} y3\n */\n // taken from http://jsbin.com/ivomiq/56/edit no credits available for that.\n function getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3) {\n var argsString;\n if (fabric.cachesBoundsOfCurve) {\n argsString = _join.call(arguments);\n if (fabric.boundsOfCurveCache[argsString]) {\n return fabric.boundsOfCurveCache[argsString];\n }\n }\n\n var sqrt = Math.sqrt,\n min = Math.min, max = Math.max,\n abs = Math.abs, tvalues = [],\n bounds = [[], []],\n a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n\n b = 6 * x0 - 12 * x1 + 6 * x2;\n a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n c = 3 * x1 - 3 * x0;\n\n for (var i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * y0 - 12 * y1 + 6 * y2;\n a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n c = 3 * y1 - 3 * y0;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n sqrtb2ac = sqrt(b2ac);\n t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n var x, y, j = tvalues.length, jlen = j, mt;\n while (j--) {\n t = tvalues[j];\n mt = 1 - t;\n x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3);\n bounds[0][j] = x;\n\n y = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3);\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = x0;\n bounds[1][jlen] = y0;\n bounds[0][jlen + 1] = x3;\n bounds[1][jlen + 1] = y3;\n var result = [\n {\n x: min.apply(null, bounds[0]),\n y: min.apply(null, bounds[1])\n },\n {\n x: max.apply(null, bounds[0]),\n y: max.apply(null, bounds[1])\n }\n ];\n if (fabric.cachesBoundsOfCurve) {\n fabric.boundsOfCurveCache[argsString] = result;\n }\n return result;\n }\n\n fabric.util.getBoundsOfCurve = getBoundsOfCurve;\n\n})();\n\n\n(function() {\n\n var slice = Array.prototype.slice;\n\n /**\n * Invokes method on all items in a given array\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} method Name of a method to invoke\n * @return {Array}\n */\n function invoke(array, method) {\n var args = slice.call(arguments, 2), result = [];\n for (var i = 0, len = array.length; i < len; i++) {\n result[i] = args.length ? array[i][method].apply(array[i], args) : array[i][method].call(array[i]);\n }\n return result;\n }\n\n /**\n * Finds maximum value in array (not necessarily \"first\" one)\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} byProperty\n * @return {*}\n */\n function max(array, byProperty) {\n return find(array, byProperty, function(value1, value2) {\n return value1 >= value2;\n });\n }\n\n /**\n * Finds minimum value in array (not necessarily \"first\" one)\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} byProperty\n * @return {*}\n */\n function min(array, byProperty) {\n return find(array, byProperty, function(value1, value2) {\n return value1 < value2;\n });\n }\n\n /**\n * @private\n */\n function fill(array, value) {\n var k = array.length;\n while (k--) {\n array[k] = value;\n }\n return array;\n }\n\n /**\n * @private\n */\n function find(array, byProperty, condition) {\n if (!array || array.length === 0) {\n return;\n }\n\n var i = array.length - 1,\n result = byProperty ? array[i][byProperty] : array[i];\n if (byProperty) {\n while (i--) {\n if (condition(array[i][byProperty], result)) {\n result = array[i][byProperty];\n }\n }\n }\n else {\n while (i--) {\n if (condition(array[i], result)) {\n result = array[i];\n }\n }\n }\n return result;\n }\n\n /**\n * @namespace fabric.util.array\n */\n fabric.util.array = {\n fill: fill,\n invoke: invoke,\n min: min,\n max: max\n };\n\n})();\n\n\n(function() {\n /**\n * Copies all enumerable properties of one js object to another\n * this does not and cannot compete with generic utils.\n * Does not clone or extend fabric.Object subclasses.\n * This is mostly for internal use and has extra handling for fabricJS objects\n * it skips the canvas property in deep cloning.\n * @memberOf fabric.util.object\n * @param {Object} destination Where to copy to\n * @param {Object} source Where to copy from\n * @return {Object}\n */\n\n function extend(destination, source, deep) {\n // JScript DontEnum bug is not taken care of\n // the deep clone is for internal use, is not meant to avoid\n // javascript traps or cloning html element or self referenced objects.\n if (deep) {\n if (!fabric.isLikelyNode && source instanceof Element) {\n // avoid cloning deep images, canvases,\n destination = source;\n }\n else if (source instanceof Array) {\n destination = [];\n for (var i = 0, len = source.length; i < len; i++) {\n destination[i] = extend({ }, source[i], deep);\n }\n }\n else if (source && typeof source === 'object') {\n for (var property in source) {\n if (property === 'canvas') {\n destination[property] = extend({ }, source[property]);\n }\n else if (source.hasOwnProperty(property)) {\n destination[property] = extend({ }, source[property], deep);\n }\n }\n }\n else {\n // this sounds odd for an extend but is ok for recursive use\n destination = source;\n }\n }\n else {\n for (var property in source) {\n destination[property] = source[property];\n }\n }\n return destination;\n }\n\n /**\n * Creates an empty object and copies all enumerable properties of another object to it\n * @memberOf fabric.util.object\n * TODO: this function return an empty object if you try to clone null\n * @param {Object} object Object to clone\n * @return {Object}\n */\n function clone(object, deep) {\n return extend({ }, object, deep);\n }\n\n /** @namespace fabric.util.object */\n fabric.util.object = {\n extend: extend,\n clone: clone\n };\n fabric.util.object.extend(fabric.util, fabric.Observable);\n})();\n\n\n(function() {\n\n /**\n * Camelizes a string\n * @memberOf fabric.util.string\n * @param {String} string String to camelize\n * @return {String} Camelized version of a string\n */\n function camelize(string) {\n return string.replace(/-+(.)?/g, function(match, character) {\n return character ? character.toUpperCase() : '';\n });\n }\n\n /**\n * Capitalizes a string\n * @memberOf fabric.util.string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\n function capitalize(string, firstLetterOnly) {\n return string.charAt(0).toUpperCase() +\n (firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase());\n }\n\n /**\n * Escapes XML in a string\n * @memberOf fabric.util.string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\n function escapeXml(string) {\n return string.replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n }\n\n /**\n * Divide a string in the user perceived single units\n * @memberOf fabric.util.string\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\n function graphemeSplit(textstring) {\n var i = 0, chr, graphemes = [];\n for (i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n }\n\n // taken from mdn in the charAt doc page.\n function getWholeChar(str, i) {\n var code = str.charCodeAt(i);\n\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xD800 || code > 0xDFFF) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xD800 <= code && code <= 0xDBFF) {\n if (str.length <= (i + 1)) {\n throw 'High surrogate without following low surrogate';\n }\n var next = str.charCodeAt(i + 1);\n if (0xDC00 > next || next > 0xDFFF) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n var prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xD800 > prev || prev > 0xDBFF) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n }\n\n\n /**\n * String utilities\n * @namespace fabric.util.string\n */\n fabric.util.string = {\n camelize: camelize,\n capitalize: capitalize,\n escapeXml: escapeXml,\n graphemeSplit: graphemeSplit\n };\n})();\n\n\n(function() {\n\n var slice = Array.prototype.slice, emptyFunction = function() { },\n\n IS_DONTENUM_BUGGY = (function() {\n for (var p in { toString: 1 }) {\n if (p === 'toString') {\n return false;\n }\n }\n return true;\n })(),\n\n /** @ignore */\n addMethods = function(klass, source, parent) {\n for (var property in source) {\n\n if (property in klass.prototype &&\n typeof klass.prototype[property] === 'function' &&\n (source[property] + '').indexOf('callSuper') > -1) {\n\n klass.prototype[property] = (function(property) {\n return function() {\n\n var superclass = this.constructor.superclass;\n this.constructor.superclass = parent;\n var returnValue = source[property].apply(this, arguments);\n this.constructor.superclass = superclass;\n\n if (property !== 'initialize') {\n return returnValue;\n }\n };\n })(property);\n }\n else {\n klass.prototype[property] = source[property];\n }\n\n if (IS_DONTENUM_BUGGY) {\n if (source.toString !== Object.prototype.toString) {\n klass.prototype.toString = source.toString;\n }\n if (source.valueOf !== Object.prototype.valueOf) {\n klass.prototype.valueOf = source.valueOf;\n }\n }\n }\n };\n\n function Subclass() { }\n\n function callSuper(methodName) {\n var parentMethod = null,\n _this = this;\n\n // climb prototype chain to find method not equal to callee's method\n while (_this.constructor.superclass) {\n var superClassMethod = _this.constructor.superclass.prototype[methodName];\n if (_this[methodName] !== superClassMethod) {\n parentMethod = superClassMethod;\n break;\n }\n // eslint-disable-next-line\n _this = _this.constructor.superclass.prototype;\n }\n\n if (!parentMethod) {\n return console.log('tried to callSuper ' + methodName + ', method not found in prototype chain', this);\n }\n\n return (arguments.length > 1)\n ? parentMethod.apply(this, slice.call(arguments, 1))\n : parentMethod.call(this);\n }\n\n /**\n * Helper for creation of \"classes\".\n * @memberOf fabric.util\n * @param {Function} [parent] optional \"Class\" to inherit from\n * @param {Object} [properties] Properties shared by all instances of this class\n * (be careful modifying objects defined here as this would affect all instances)\n */\n function createClass() {\n var parent = null,\n properties = slice.call(arguments, 0);\n\n if (typeof properties[0] === 'function') {\n parent = properties.shift();\n }\n function klass() {\n this.initialize.apply(this, arguments);\n }\n\n klass.superclass = parent;\n klass.subclasses = [];\n\n if (parent) {\n Subclass.prototype = parent.prototype;\n klass.prototype = new Subclass();\n parent.subclasses.push(klass);\n }\n for (var i = 0, length = properties.length; i < length; i++) {\n addMethods(klass, properties[i], parent);\n }\n if (!klass.prototype.initialize) {\n klass.prototype.initialize = emptyFunction;\n }\n klass.prototype.constructor = klass;\n klass.prototype.callSuper = callSuper;\n return klass;\n }\n\n fabric.util.createClass = createClass;\n})();\n\n\n(function () {\n // since ie10 or ie9 can use addEventListener but they do not support options, i need to check\n var couldUseAttachEvent = !!fabric.document.createElement('div').attachEvent;\n /**\n * Adds an event listener to an element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {String} eventName\n * @param {Function} handler\n */\n fabric.util.addListener = function(element, eventName, handler, options) {\n element && element.addEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n };\n\n /**\n * Removes an event listener from an element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {String} eventName\n * @param {Function} handler\n */\n fabric.util.removeListener = function(element, eventName, handler, options) {\n element && element.removeEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n };\n\n function getTouchInfo(event) {\n var touchProp = event.changedTouches;\n if (touchProp && touchProp[0]) {\n return touchProp[0];\n }\n return event;\n }\n\n fabric.util.getPointer = function(event) {\n var element = event.target,\n scroll = fabric.util.getScrollLeftTop(element),\n _evt = getTouchInfo(event);\n return {\n x: _evt.clientX + scroll.left,\n y: _evt.clientY + scroll.top\n };\n };\n})();\n\n\n(function () {\n\n /**\n * Cross-browser wrapper for setting element's style\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {Object} styles\n * @return {HTMLElement} Element that was passed as a first argument\n */\n function setStyle(element, styles) {\n var elementStyle = element.style;\n if (!elementStyle) {\n return element;\n }\n if (typeof styles === 'string') {\n element.style.cssText += ';' + styles;\n return styles.indexOf('opacity') > -1\n ? setOpacity(element, styles.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1])\n : element;\n }\n for (var property in styles) {\n if (property === 'opacity') {\n setOpacity(element, styles[property]);\n }\n else {\n var normalizedProperty = (property === 'float' || property === 'cssFloat')\n ? (typeof elementStyle.styleFloat === 'undefined' ? 'cssFloat' : 'styleFloat')\n : property;\n elementStyle[normalizedProperty] = styles[property];\n }\n }\n return element;\n }\n\n var parseEl = fabric.document.createElement('div'),\n supportsOpacity = typeof parseEl.style.opacity === 'string',\n supportsFilters = typeof parseEl.style.filter === 'string',\n reOpacity = /alpha\\s*\\(\\s*opacity\\s*=\\s*([^\\)]+)\\)/,\n\n /** @ignore */\n setOpacity = function (element) { return element; };\n\n if (supportsOpacity) {\n /** @ignore */\n setOpacity = function(element, value) {\n element.style.opacity = value;\n return element;\n };\n }\n else if (supportsFilters) {\n /** @ignore */\n setOpacity = function(element, value) {\n var es = element.style;\n if (element.currentStyle && !element.currentStyle.hasLayout) {\n es.zoom = 1;\n }\n if (reOpacity.test(es.filter)) {\n value = value >= 0.9999 ? '' : ('alpha(opacity=' + (value * 100) + ')');\n es.filter = es.filter.replace(reOpacity, value);\n }\n else {\n es.filter += ' alpha(opacity=' + (value * 100) + ')';\n }\n return element;\n };\n }\n\n fabric.util.setStyle = setStyle;\n\n})();\n\n\n(function() {\n\n var _slice = Array.prototype.slice;\n\n /**\n * Takes id and returns an element with that id (if one exists in a document)\n * @memberOf fabric.util\n * @param {String|HTMLElement} id\n * @return {HTMLElement|null}\n */\n function getById(id) {\n return typeof id === 'string' ? fabric.document.getElementById(id) : id;\n }\n\n var sliceCanConvertNodelists,\n /**\n * Converts an array-like object (e.g. arguments or NodeList) to an array\n * @memberOf fabric.util\n * @param {Object} arrayLike\n * @return {Array}\n */\n toArray = function(arrayLike) {\n return _slice.call(arrayLike, 0);\n };\n\n try {\n sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array;\n }\n catch (err) { }\n\n if (!sliceCanConvertNodelists) {\n toArray = function(arrayLike) {\n var arr = new Array(arrayLike.length), i = arrayLike.length;\n while (i--) {\n arr[i] = arrayLike[i];\n }\n return arr;\n };\n }\n\n /**\n * Creates specified element with specified attributes\n * @memberOf fabric.util\n * @param {String} tagName Type of an element to create\n * @param {Object} [attributes] Attributes to set on an element\n * @return {HTMLElement} Newly created element\n */\n function makeElement(tagName, attributes) {\n var el = fabric.document.createElement(tagName);\n for (var prop in attributes) {\n if (prop === 'class') {\n el.className = attributes[prop];\n }\n else if (prop === 'for') {\n el.htmlFor = attributes[prop];\n }\n else {\n el.setAttribute(prop, attributes[prop]);\n }\n }\n return el;\n }\n\n /**\n * Adds class to an element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to add class to\n * @param {String} className Class to add to an element\n */\n function addClass(element, className) {\n if (element && (' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) {\n element.className += (element.className ? ' ' : '') + className;\n }\n }\n\n /**\n * Wraps element with another element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to wrap\n * @param {HTMLElement|String} wrapper Element to wrap with\n * @param {Object} [attributes] Attributes to set on a wrapper\n * @return {HTMLElement} wrapper\n */\n function wrapElement(element, wrapper, attributes) {\n if (typeof wrapper === 'string') {\n wrapper = makeElement(wrapper, attributes);\n }\n if (element.parentNode) {\n element.parentNode.replaceChild(wrapper, element);\n }\n wrapper.appendChild(element);\n return wrapper;\n }\n\n /**\n * Returns element scroll offsets\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to operate on\n * @return {Object} Object with left/top values\n */\n function getScrollLeftTop(element) {\n\n var left = 0,\n top = 0,\n docElement = fabric.document.documentElement,\n body = fabric.document.body || {\n scrollLeft: 0, scrollTop: 0\n };\n\n // While loop checks (and then sets element to) .parentNode OR .host\n // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n // but the .parentNode of a root ShadowDOM node will always be null, instead\n // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n while (element && (element.parentNode || element.host)) {\n\n // Set element to element parent, or 'host' in case of ShadowDOM\n element = element.parentNode || element.host;\n\n if (element === fabric.document) {\n left = body.scrollLeft || docElement.scrollLeft || 0;\n top = body.scrollTop || docElement.scrollTop || 0;\n }\n else {\n left += element.scrollLeft || 0;\n top += element.scrollTop || 0;\n }\n\n if (element.nodeType === 1 && element.style.position === 'fixed') {\n break;\n }\n }\n\n return { left: left, top: top };\n }\n\n /**\n * Returns offset for a given element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\n function getElementOffset(element) {\n var docElem,\n doc = element && element.ownerDocument,\n box = { left: 0, top: 0 },\n offset = { left: 0, top: 0 },\n scrollLeftTop,\n offsetAttributes = {\n borderLeftWidth: 'left',\n borderTopWidth: 'top',\n paddingLeft: 'left',\n paddingTop: 'top'\n };\n\n if (!doc) {\n return offset;\n }\n\n for (var attr in offsetAttributes) {\n offset[offsetAttributes[attr]] += parseInt(getElementStyle(element, attr), 10) || 0;\n }\n\n docElem = doc.documentElement;\n if ( typeof element.getBoundingClientRect !== 'undefined' ) {\n box = element.getBoundingClientRect();\n }\n\n scrollLeftTop = getScrollLeftTop(element);\n\n return {\n left: box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top\n };\n }\n\n /**\n * Returns style attribute value of a given element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to get style attribute for\n * @param {String} attr Style attribute to get for element\n * @return {String} Style attribute value of the given element.\n */\n var getElementStyle;\n if (fabric.document.defaultView && fabric.document.defaultView.getComputedStyle) {\n getElementStyle = function(element, attr) {\n var style = fabric.document.defaultView.getComputedStyle(element, null);\n return style ? style[attr] : undefined;\n };\n }\n else {\n getElementStyle = function(element, attr) {\n var value = element.style[attr];\n if (!value && element.currentStyle) {\n value = element.currentStyle[attr];\n }\n return value;\n };\n }\n\n (function () {\n var style = fabric.document.documentElement.style,\n selectProp = 'userSelect' in style\n ? 'userSelect'\n : 'MozUserSelect' in style\n ? 'MozUserSelect'\n : 'WebkitUserSelect' in style\n ? 'WebkitUserSelect'\n : 'KhtmlUserSelect' in style\n ? 'KhtmlUserSelect'\n : '';\n\n /**\n * Makes element unselectable\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\n function makeElementUnselectable(element) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = fabric.util.falseFunction;\n }\n if (selectProp) {\n element.style[selectProp] = 'none';\n }\n else if (typeof element.unselectable === 'string') {\n element.unselectable = 'on';\n }\n return element;\n }\n\n /**\n * Makes element selectable\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to make selectable\n * @return {HTMLElement} Element that was passed in\n */\n function makeElementSelectable(element) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = null;\n }\n if (selectProp) {\n element.style[selectProp] = '';\n }\n else if (typeof element.unselectable === 'string') {\n element.unselectable = '';\n }\n return element;\n }\n\n fabric.util.makeElementUnselectable = makeElementUnselectable;\n fabric.util.makeElementSelectable = makeElementSelectable;\n })();\n\n (function() {\n\n /**\n * Inserts a script element with a given url into a document; invokes callback, when that script is finished loading\n * @memberOf fabric.util\n * @param {String} url URL of a script to load\n * @param {Function} callback Callback to execute when script is finished loading\n */\n function getScript(url, callback) {\n var headEl = fabric.document.getElementsByTagName('head')[0],\n scriptEl = fabric.document.createElement('script'),\n loading = true;\n\n /** @ignore */\n scriptEl.onload = /** @ignore */ scriptEl.onreadystatechange = function(e) {\n if (loading) {\n if (typeof this.readyState === 'string' &&\n this.readyState !== 'loaded' &&\n this.readyState !== 'complete') {\n return;\n }\n loading = false;\n callback(e || fabric.window.event);\n scriptEl = scriptEl.onload = scriptEl.onreadystatechange = null;\n }\n };\n scriptEl.src = url;\n headEl.appendChild(scriptEl);\n // causes issue in Opera\n // headEl.removeChild(scriptEl);\n }\n\n fabric.util.getScript = getScript;\n })();\n\n function getNodeCanvas(element) {\n var impl = fabric.jsdomImplForWrapper(element);\n return impl._canvas || impl._image;\n };\n\n function cleanUpJsdomNode(element) {\n if (!fabric.isLikelyNode) {\n return;\n }\n var impl = fabric.jsdomImplForWrapper(element);\n if (impl) {\n impl._image = null;\n impl._canvas = null;\n // unsure if necessary\n impl._currentSrc = null;\n impl._attributes = null;\n impl._classList = null;\n }\n }\n\n fabric.util.getById = getById;\n fabric.util.toArray = toArray;\n fabric.util.makeElement = makeElement;\n fabric.util.addClass = addClass;\n fabric.util.wrapElement = wrapElement;\n fabric.util.getScrollLeftTop = getScrollLeftTop;\n fabric.util.getElementOffset = getElementOffset;\n fabric.util.getElementStyle = getElementStyle;\n fabric.util.getNodeCanvas = getNodeCanvas;\n fabric.util.cleanUpJsdomNode = cleanUpJsdomNode;\n\n})();\n\n\n(function() {\n\n function addParamToUrl(url, param) {\n return url + (/\\?/.test(url) ? '&' : '?') + param;\n }\n\n function emptyFn() { }\n\n /**\n * Cross-browser abstraction for sending XMLHttpRequest\n * @memberOf fabric.util\n * @param {String} url URL to send XMLHttpRequest to\n * @param {Object} [options] Options object\n * @param {String} [options.method=\"GET\"]\n * @param {String} [options.parameters] parameters to append to url in GET or in body\n * @param {String} [options.body] body to send with POST or PUT request\n * @param {Function} options.onComplete Callback to invoke when request is completed\n * @return {XMLHttpRequest} request\n */\n function request(url, options) {\n options || (options = { });\n\n var method = options.method ? options.method.toUpperCase() : 'GET',\n onComplete = options.onComplete || function() { },\n xhr = new fabric.window.XMLHttpRequest(),\n body = options.body || options.parameters;\n\n /** @ignore */\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n onComplete(xhr);\n xhr.onreadystatechange = emptyFn;\n }\n };\n\n if (method === 'GET') {\n body = null;\n if (typeof options.parameters === 'string') {\n url = addParamToUrl(url, options.parameters);\n }\n }\n\n xhr.open(method, url, true);\n\n if (method === 'POST' || method === 'PUT') {\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n }\n\n xhr.send(body);\n return xhr;\n }\n\n fabric.util.request = request;\n})();\n\n\n/**\n * Wrapper around `console.log` (when available)\n * @param {*} [values] Values to log\n */\nfabric.log = console.log;\n\n/**\n * Wrapper around `console.warn` (when available)\n * @param {*} [values] Values to log as a warning\n */\nfabric.warn = console.warn;\n\n\n(function() {\n\n function noop() {\n return false;\n }\n\n function defaultEasing(t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }\n\n /**\n * Changes value from one to another within certain period of time, invoking callbacks as value is being changed.\n * @memberOf fabric.util\n * @param {Object} [options] Animation options\n * @param {Function} [options.onChange] Callback; invoked on every value change\n * @param {Function} [options.onComplete] Callback; invoked when value change is completed\n * @param {Number} [options.startValue=0] Starting value\n * @param {Number} [options.endValue=100] Ending value\n * @param {Number} [options.byValue=100] Value to modify the property by\n * @param {Function} [options.easing] Easing function\n * @param {Number} [options.duration=500] Duration of change (in ms)\n * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called.\n */\n function animate(options) {\n\n requestAnimFrame(function(timestamp) {\n options || (options = { });\n\n var start = timestamp || +new Date(),\n duration = options.duration || 500,\n finish = start + duration, time,\n onChange = options.onChange || noop,\n abort = options.abort || noop,\n onComplete = options.onComplete || noop,\n easing = options.easing || defaultEasing,\n startValue = 'startValue' in options ? options.startValue : 0,\n endValue = 'endValue' in options ? options.endValue : 100,\n byValue = options.byValue || endValue - startValue;\n\n options.onStart && options.onStart();\n\n (function tick(ticktime) {\n // TODO: move abort call after calculation\n // and pass (current,valuePerc, timePerc) as arguments\n time = ticktime || +new Date();\n var currentTime = time > finish ? duration : (time - start),\n timePerc = currentTime / duration,\n current = easing(currentTime, startValue, byValue, duration),\n valuePerc = Math.abs((current - startValue) / byValue);\n if (abort()) {\n onComplete(endValue, 1, 1);\n return;\n }\n if (time > finish) {\n onChange(endValue, 1, 1);\n onComplete(endValue, 1, 1);\n return;\n }\n else {\n onChange(current, valuePerc, timePerc);\n requestAnimFrame(tick);\n }\n })(start);\n });\n }\n\n var _requestAnimFrame = fabric.window.requestAnimationFrame ||\n fabric.window.webkitRequestAnimationFrame ||\n fabric.window.mozRequestAnimationFrame ||\n fabric.window.oRequestAnimationFrame ||\n fabric.window.msRequestAnimationFrame ||\n function(callback) {\n return fabric.window.setTimeout(callback, 1000 / 60);\n };\n\n var _cancelAnimFrame = fabric.window.cancelAnimationFrame || fabric.window.clearTimeout;\n\n /**\n * requestAnimationFrame polyfill based on http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n * In order to get a precise start time, `requestAnimFrame` should be called as an entry into the method\n * @memberOf fabric.util\n * @param {Function} callback Callback to invoke\n * @param {DOMElement} element optional Element to associate with animation\n */\n function requestAnimFrame() {\n return _requestAnimFrame.apply(fabric.window, arguments);\n }\n\n function cancelAnimFrame() {\n return _cancelAnimFrame.apply(fabric.window, arguments);\n }\n\n fabric.util.animate = animate;\n fabric.util.requestAnimFrame = requestAnimFrame;\n fabric.util.cancelAnimFrame = cancelAnimFrame;\n})();\n\n\n(function() {\n // Calculate an in-between color. Returns a \"rgba()\" string.\n // Credit: Edwin Martin \n // http://www.bitstorm.org/jquery/color-animation/jquery.animate-colors.js\n function calculateColor(begin, end, pos) {\n var color = 'rgba('\n + parseInt((begin[0] + pos * (end[0] - begin[0])), 10) + ','\n + parseInt((begin[1] + pos * (end[1] - begin[1])), 10) + ','\n + parseInt((begin[2] + pos * (end[2] - begin[2])), 10);\n\n color += ',' + (begin && end ? parseFloat(begin[3] + pos * (end[3] - begin[3])) : 1);\n color += ')';\n return color;\n }\n\n /**\n * Changes the color from one to another within certain period of time, invoking callbacks as value is being changed.\n * @memberOf fabric.util\n * @param {String} fromColor The starting color in hex or rgb(a) format.\n * @param {String} toColor The starting color in hex or rgb(a) format.\n * @param {Number} [duration] Duration of change (in ms).\n * @param {Object} [options] Animation options\n * @param {Function} [options.onChange] Callback; invoked on every value change\n * @param {Function} [options.onComplete] Callback; invoked when value change is completed\n * @param {Function} [options.colorEasing] Easing function. Note that this function only take two arguments (currentTime, duration). Thus the regular animation easing functions cannot be used.\n * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called.\n */\n function animateColor(fromColor, toColor, duration, options) {\n var startColor = new fabric.Color(fromColor).getSource(),\n endColor = new fabric.Color(toColor).getSource();\n\n options = options || {};\n\n fabric.util.animate(fabric.util.object.extend(options, {\n duration: duration || 500,\n startValue: startColor,\n endValue: endColor,\n byValue: endColor,\n easing: function (currentTime, startValue, byValue, duration) {\n var posValue = options.colorEasing\n ? options.colorEasing(currentTime, duration)\n : 1 - Math.cos(currentTime / duration * (Math.PI / 2));\n return calculateColor(startValue, byValue, posValue);\n }\n }));\n }\n\n fabric.util.animateColor = animateColor;\n\n})();\n\n\n(function() {\n\n function normalize(a, c, p, s) {\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n }\n else {\n //handle the 0/0 case:\n if (c === 0 && a === 0) {\n s = p / (2 * Math.PI) * Math.asin(1);\n }\n else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n }\n return { a: a, c: c, p: p, s: s };\n }\n\n function elastic(opts, t, d) {\n return opts.a *\n Math.pow(2, 10 * (t -= 1)) *\n Math.sin( (t * d - opts.s) * (2 * Math.PI) / opts.p );\n }\n\n /**\n * Cubic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutCubic(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t + 1) + b;\n }\n\n /**\n * Cubic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutCubic(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t + b;\n }\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n\n /**\n * Quartic easing in\n * @memberOf fabric.util.ease\n */\n function easeInQuart(t, b, c, d) {\n return c * (t /= d) * t * t * t + b;\n }\n\n /**\n * Quartic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutQuart(t, b, c, d) {\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n }\n\n /**\n * Quartic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutQuart(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t * t + b;\n }\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n\n /**\n * Quintic easing in\n * @memberOf fabric.util.ease\n */\n function easeInQuint(t, b, c, d) {\n return c * (t /= d) * t * t * t * t + b;\n }\n\n /**\n * Quintic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutQuint(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n }\n\n /**\n * Quintic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutQuint(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t * t * t + b;\n }\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n\n /**\n * Sinusoidal easing in\n * @memberOf fabric.util.ease\n */\n function easeInSine(t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }\n\n /**\n * Sinusoidal easing out\n * @memberOf fabric.util.ease\n */\n function easeOutSine(t, b, c, d) {\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n }\n\n /**\n * Sinusoidal easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutSine(t, b, c, d) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n }\n\n /**\n * Exponential easing in\n * @memberOf fabric.util.ease\n */\n function easeInExpo(t, b, c, d) {\n return (t === 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;\n }\n\n /**\n * Exponential easing out\n * @memberOf fabric.util.ease\n */\n function easeOutExpo(t, b, c, d) {\n return (t === d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n }\n\n /**\n * Exponential easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutExpo(t, b, c, d) {\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n t /= d / 2;\n if (t < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n }\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n\n /**\n * Circular easing in\n * @memberOf fabric.util.ease\n */\n function easeInCirc(t, b, c, d) {\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n }\n\n /**\n * Circular easing out\n * @memberOf fabric.util.ease\n */\n function easeOutCirc(t, b, c, d) {\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n }\n\n /**\n * Circular easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutCirc(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n }\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n\n /**\n * Elastic easing in\n * @memberOf fabric.util.ease\n */\n function easeInElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n var opts = normalize(a, c, p, s);\n return -elastic(opts, t, d) + b;\n }\n\n /**\n * Elastic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n var opts = normalize(a, c, p, s);\n return opts.a * Math.pow(2, -10 * t) * Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) + opts.c + b;\n }\n\n /**\n * Elastic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d / 2;\n if (t === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n var opts = normalize(a, c, p, s);\n if (t < 1) {\n return -0.5 * elastic(opts, t, d) + b;\n }\n return opts.a * Math.pow(2, -10 * (t -= 1)) *\n Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) * 0.5 + opts.c + b;\n }\n\n /**\n * Backwards easing in\n * @memberOf fabric.util.ease\n */\n function easeInBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n }\n\n /**\n * Backwards easing out\n * @memberOf fabric.util.ease\n */\n function easeOutBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n }\n\n /**\n * Backwards easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n t /= d / 2;\n if (t < 1) {\n return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;\n }\n return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;\n }\n\n /**\n * Bouncing easing in\n * @memberOf fabric.util.ease\n */\n function easeInBounce(t, b, c, d) {\n return c - easeOutBounce (d - t, 0, c, d) + b;\n }\n\n /**\n * Bouncing easing out\n * @memberOf fabric.util.ease\n */\n function easeOutBounce(t, b, c, d) {\n if ((t /= d) < (1 / 2.75)) {\n return c * (7.5625 * t * t) + b;\n }\n else if (t < (2 / 2.75)) {\n return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b;\n }\n else if (t < (2.5 / 2.75)) {\n return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b;\n }\n else {\n return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b;\n }\n }\n\n /**\n * Bouncing easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutBounce(t, b, c, d) {\n if (t < d / 2) {\n return easeInBounce (t * 2, 0, c, d) * 0.5 + b;\n }\n return easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n }\n\n /**\n * Easing functions\n * See Easing Equations by Robert Penner\n * @namespace fabric.util.ease\n */\n fabric.util.ease = {\n\n /**\n * Quadratic easing in\n * @memberOf fabric.util.ease\n */\n easeInQuad: function(t, b, c, d) {\n return c * (t /= d) * t + b;\n },\n\n /**\n * Quadratic easing out\n * @memberOf fabric.util.ease\n */\n easeOutQuad: function(t, b, c, d) {\n return -c * (t /= d) * (t - 2) + b;\n },\n\n /**\n * Quadratic easing in and out\n * @memberOf fabric.util.ease\n */\n easeInOutQuad: function(t, b, c, d) {\n t /= (d / 2);\n if (t < 1) {\n return c / 2 * t * t + b;\n }\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n },\n\n /**\n * Cubic easing in\n * @memberOf fabric.util.ease\n */\n easeInCubic: function(t, b, c, d) {\n return c * (t /= d) * t * t + b;\n },\n\n easeOutCubic: easeOutCubic,\n easeInOutCubic: easeInOutCubic,\n easeInQuart: easeInQuart,\n easeOutQuart: easeOutQuart,\n easeInOutQuart: easeInOutQuart,\n easeInQuint: easeInQuint,\n easeOutQuint: easeOutQuint,\n easeInOutQuint: easeInOutQuint,\n easeInSine: easeInSine,\n easeOutSine: easeOutSine,\n easeInOutSine: easeInOutSine,\n easeInExpo: easeInExpo,\n easeOutExpo: easeOutExpo,\n easeInOutExpo: easeInOutExpo,\n easeInCirc: easeInCirc,\n easeOutCirc: easeOutCirc,\n easeInOutCirc: easeInOutCirc,\n easeInElastic: easeInElastic,\n easeOutElastic: easeOutElastic,\n easeInOutElastic: easeInOutElastic,\n easeInBack: easeInBack,\n easeOutBack: easeOutBack,\n easeInOutBack: easeInOutBack,\n easeInBounce: easeInBounce,\n easeOutBounce: easeOutBounce,\n easeInOutBounce: easeInOutBounce\n };\n\n})();\n\n\n(function(global) {\n\n 'use strict';\n\n /**\n * @name fabric\n * @namespace\n */\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed,\n parseUnit = fabric.util.parseUnit,\n multiplyTransformMatrices = fabric.util.multiplyTransformMatrices,\n\n svgValidTagNames = ['path', 'circle', 'polygon', 'polyline', 'ellipse', 'rect', 'line',\n 'image', 'text'],\n svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n svgInvalidAncestors = ['pattern', 'defs', 'symbol', 'metadata', 'clipPath', 'mask', 'desc'],\n svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n\n attributesMap = {\n cx: 'left',\n x: 'left',\n r: 'radius',\n cy: 'top',\n y: 'top',\n display: 'visible',\n visibility: 'visible',\n transform: 'transformMatrix',\n 'fill-opacity': 'fillOpacity',\n 'fill-rule': 'fillRule',\n 'font-family': 'fontFamily',\n 'font-size': 'fontSize',\n 'font-style': 'fontStyle',\n 'font-weight': 'fontWeight',\n 'letter-spacing': 'charSpacing',\n 'paint-order': 'paintFirst',\n 'stroke-dasharray': 'strokeDashArray',\n 'stroke-dashoffset': 'strokeDashOffset',\n 'stroke-linecap': 'strokeLineCap',\n 'stroke-linejoin': 'strokeLineJoin',\n 'stroke-miterlimit': 'strokeMiterLimit',\n 'stroke-opacity': 'strokeOpacity',\n 'stroke-width': 'strokeWidth',\n 'text-decoration': 'textDecoration',\n 'text-anchor': 'textAnchor',\n opacity: 'opacity',\n 'clip-path': 'clipPath',\n 'clip-rule': 'clipRule',\n 'vector-effect': 'strokeUniform'\n },\n\n colorAttributes = {\n stroke: 'strokeOpacity',\n fill: 'fillOpacity'\n },\n\n fSize = 'font-size', cPath = 'clip-path';\n\n fabric.svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n fabric.svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n fabric.svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n fabric.svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n fabric.cssRules = { };\n fabric.gradientDefs = { };\n fabric.clipPaths = { };\n\n function normalizeAttr(attr) {\n // transform attribute names\n if (attr in attributesMap) {\n return attributesMap[attr];\n }\n return attr;\n }\n\n function normalizeValue(attr, value, parentAttributes, fontSize) {\n var isArray = Object.prototype.toString.call(value) === '[object Array]',\n parsed;\n\n if ((attr === 'fill' || attr === 'stroke') && value === 'none') {\n value = '';\n }\n else if (attr === 'vector-effect') {\n value = value === 'non-scaling-stroke';\n }\n else if (attr === 'strokeDashArray') {\n if (value === 'none') {\n value = null;\n }\n else {\n value = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n }\n }\n else if (attr === 'transformMatrix') {\n if (parentAttributes && parentAttributes.transformMatrix) {\n value = multiplyTransformMatrices(\n parentAttributes.transformMatrix, fabric.parseTransformAttribute(value));\n }\n else {\n value = fabric.parseTransformAttribute(value);\n }\n }\n else if (attr === 'visible') {\n value = value !== 'none' && value !== 'hidden';\n // display=none on parent element always takes precedence over child element\n if (parentAttributes && parentAttributes.visible === false) {\n value = false;\n }\n }\n else if (attr === 'opacity') {\n value = parseFloat(value);\n if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n value *= parentAttributes.opacity;\n }\n }\n else if (attr === 'textAnchor' /* text-anchor */) {\n value = value === 'start' ? 'left' : value === 'end' ? 'right' : 'center';\n }\n else if (attr === 'charSpacing') {\n // parseUnit returns px and we convert it to em\n parsed = parseUnit(value, fontSize) / fontSize * 1000;\n }\n else if (attr === 'paintFirst') {\n var fillIndex = value.indexOf('fill');\n var strokeIndex = value.indexOf('stroke');\n var value = 'fill';\n if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n value = 'stroke';\n }\n else if (fillIndex === -1 && strokeIndex > -1) {\n value = 'stroke';\n }\n }\n else if (attr === 'href' || attr === 'xlink:href') {\n return value;\n }\n else {\n parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize);\n }\n\n return (!isArray && isNaN(parsed) ? value : parsed);\n }\n\n /**\n * @private\n */\n function getSvgRegex(arr) {\n return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n }\n\n /**\n * @private\n * @param {Object} attributes Array of attributes to parse\n */\n function _setStrokeFillOpacity(attributes) {\n for (var attr in colorAttributes) {\n\n if (typeof attributes[colorAttributes[attr]] === 'undefined' || attributes[attr] === '') {\n continue;\n }\n\n if (typeof attributes[attr] === 'undefined') {\n if (!fabric.Object.prototype[attr]) {\n continue;\n }\n attributes[attr] = fabric.Object.prototype[attr];\n }\n\n if (attributes[attr].indexOf('url(') === 0) {\n continue;\n }\n\n var color = new fabric.Color(attributes[attr]);\n attributes[attr] = color.setAlpha(toFixed(color.getAlpha() * attributes[colorAttributes[attr]], 2)).toRgba();\n }\n return attributes;\n }\n\n /**\n * @private\n */\n function _getMultipleNodes(doc, nodeNames) {\n var nodeName, nodeArray = [], nodeList, i, len;\n for (i = 0, len = nodeNames.length; i < len; i++) {\n nodeName = nodeNames[i];\n nodeList = doc.getElementsByTagName(nodeName);\n nodeArray = nodeArray.concat(Array.prototype.slice.call(nodeList));\n }\n return nodeArray;\n }\n\n /**\n * Parses \"transform\" attribute, returning an array of values\n * @static\n * @function\n * @memberOf fabric\n * @param {String} attributeValue String containing attribute value\n * @return {Array} Array of 6 elements representing transformation matrix\n */\n fabric.parseTransformAttribute = (function() {\n function rotateMatrix(matrix, args) {\n var cos = fabric.util.cos(args[0]), sin = fabric.util.sin(args[0]),\n x = 0, y = 0;\n if (args.length === 3) {\n x = args[1];\n y = args[2];\n }\n\n matrix[0] = cos;\n matrix[1] = sin;\n matrix[2] = -sin;\n matrix[3] = cos;\n matrix[4] = x - (cos * x - sin * y);\n matrix[5] = y - (sin * x + cos * y);\n }\n\n function scaleMatrix(matrix, args) {\n var multiplierX = args[0],\n multiplierY = (args.length === 2) ? args[1] : args[0];\n\n matrix[0] = multiplierX;\n matrix[3] = multiplierY;\n }\n\n function skewMatrix(matrix, args, pos) {\n matrix[pos] = Math.tan(fabric.util.degreesToRadians(args[0]));\n }\n\n function translateMatrix(matrix, args) {\n matrix[4] = args[0];\n if (args.length === 2) {\n matrix[5] = args[1];\n }\n }\n\n // identity matrix\n var iMatrix = fabric.iMatrix,\n\n // == begin transform regexp\n number = fabric.reNum,\n\n commaWsp = '(?:\\\\s+,?\\\\s*|,\\\\s*)',\n\n skewX = '(?:(skewX)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n skewY = '(?:(skewY)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n rotate = '(?:(rotate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + ')' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n scale = '(?:(scale)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n translate = '(?:(translate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n matrix = '(?:(matrix)\\\\s*\\\\(\\\\s*' +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' +\n '\\\\s*\\\\))',\n\n transform = '(?:' +\n matrix + '|' +\n translate + '|' +\n scale + '|' +\n rotate + '|' +\n skewX + '|' +\n skewY +\n ')',\n\n transforms = '(?:' + transform + '(?:' + commaWsp + '*' + transform + ')*' + ')',\n\n transformList = '^\\\\s*(?:' + transforms + '?)\\\\s*$',\n\n // http://www.w3.org/TR/SVG/coords.html#TransformAttribute\n reTransformList = new RegExp(transformList),\n // == end transform regexp\n\n reTransform = new RegExp(transform, 'g');\n\n return function(attributeValue) {\n\n // start with identity matrix\n var matrix = iMatrix.concat(),\n matrices = [];\n\n // return if no argument was given or\n // an argument does not match transform attribute regexp\n if (!attributeValue || (attributeValue && !reTransformList.test(attributeValue))) {\n return matrix;\n }\n\n attributeValue.replace(reTransform, function(match) {\n\n var m = new RegExp(transform).exec(match).filter(function (match) {\n // match !== '' && match != null\n return (!!match);\n }),\n operation = m[1],\n args = m.slice(2).map(parseFloat);\n\n switch (operation) {\n case 'translate':\n translateMatrix(matrix, args);\n break;\n case 'rotate':\n args[0] = fabric.util.degreesToRadians(args[0]);\n rotateMatrix(matrix, args);\n break;\n case 'scale':\n scaleMatrix(matrix, args);\n break;\n case 'skewX':\n skewMatrix(matrix, args, 2);\n break;\n case 'skewY':\n skewMatrix(matrix, args, 1);\n break;\n case 'matrix':\n matrix = args;\n break;\n }\n\n // snapshot current matrix into matrices array\n matrices.push(matrix.concat());\n // reset\n matrix = iMatrix.concat();\n });\n\n var combinedMatrix = matrices[0];\n while (matrices.length > 1) {\n matrices.shift();\n combinedMatrix = fabric.util.multiplyTransformMatrices(combinedMatrix, matrices[0]);\n }\n return combinedMatrix;\n };\n })();\n\n /**\n * @private\n */\n function parseStyleString(style, oStyle) {\n var attr, value;\n style.replace(/;\\s*$/, '').split(';').forEach(function (chunk) {\n var pair = chunk.split(':');\n\n attr = pair[0].trim().toLowerCase();\n value = pair[1].trim();\n\n oStyle[attr] = value;\n });\n }\n\n /**\n * @private\n */\n function parseStyleObject(style, oStyle) {\n var attr, value;\n for (var prop in style) {\n if (typeof style[prop] === 'undefined') {\n continue;\n }\n\n attr = prop.toLowerCase();\n value = style[prop];\n\n oStyle[attr] = value;\n }\n }\n\n /**\n * @private\n */\n function getGlobalStylesForElement(element, svgUid) {\n var styles = { };\n for (var rule in fabric.cssRules[svgUid]) {\n if (elementMatchesRule(element, rule.split(' '))) {\n for (var property in fabric.cssRules[svgUid][rule]) {\n styles[property] = fabric.cssRules[svgUid][rule][property];\n }\n }\n }\n return styles;\n }\n\n /**\n * @private\n */\n function elementMatchesRule(element, selectors) {\n var firstMatching, parentMatching = true;\n //start from rightmost selector.\n firstMatching = selectorMatches(element, selectors.pop());\n if (firstMatching && selectors.length) {\n parentMatching = doesSomeParentMatch(element, selectors);\n }\n return firstMatching && parentMatching && (selectors.length === 0);\n }\n\n function doesSomeParentMatch(element, selectors) {\n var selector, parentMatching = true;\n while (element.parentNode && element.parentNode.nodeType === 1 && selectors.length) {\n if (parentMatching) {\n selector = selectors.pop();\n }\n element = element.parentNode;\n parentMatching = selectorMatches(element, selector);\n }\n return selectors.length === 0;\n }\n\n /**\n * @private\n */\n function selectorMatches(element, selector) {\n var nodeName = element.nodeName,\n classNames = element.getAttribute('class'),\n id = element.getAttribute('id'), matcher, i;\n // i check if a selector matches slicing away part from it.\n // if i get empty string i should match\n matcher = new RegExp('^' + nodeName, 'i');\n selector = selector.replace(matcher, '');\n if (id && selector.length) {\n matcher = new RegExp('#' + id + '(?![a-zA-Z\\\\-]+)', 'i');\n selector = selector.replace(matcher, '');\n }\n if (classNames && selector.length) {\n classNames = classNames.split(' ');\n for (i = classNames.length; i--;) {\n matcher = new RegExp('\\\\.' + classNames[i] + '(?![a-zA-Z\\\\-]+)', 'i');\n selector = selector.replace(matcher, '');\n }\n }\n return selector.length === 0;\n }\n\n /**\n * @private\n * to support IE8 missing getElementById on SVGdocument and on node xmlDOM\n */\n function elementById(doc, id) {\n var el;\n doc.getElementById && (el = doc.getElementById(id));\n if (el) {\n return el;\n }\n var node, i, len, nodelist = doc.getElementsByTagName('*');\n for (i = 0, len = nodelist.length; i < len; i++) {\n node = nodelist[i];\n if (id === node.getAttribute('id')) {\n return node;\n }\n }\n }\n\n /**\n * @private\n */\n function parseUseDirectives(doc) {\n var nodelist = _getMultipleNodes(doc, ['use', 'svg:use']), i = 0;\n while (nodelist.length && i < nodelist.length) {\n var el = nodelist[i],\n xlink = (el.getAttribute('xlink:href') || el.getAttribute('href')).substr(1),\n x = el.getAttribute('x') || 0,\n y = el.getAttribute('y') || 0,\n el2 = elementById(doc, xlink).cloneNode(true),\n currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')',\n parentNode, oldLength = nodelist.length, attr, j, attrs, len, namespace = fabric.svgNS;\n\n applyViewboxTransform(el2);\n if (/^svg$/i.test(el2.nodeName)) {\n var el3 = el2.ownerDocument.createElementNS(namespace, 'g');\n for (j = 0, attrs = el2.attributes, len = attrs.length; j < len; j++) {\n attr = attrs.item(j);\n el3.setAttributeNS(namespace, attr.nodeName, attr.nodeValue);\n }\n // el2.firstChild != null\n while (el2.firstChild) {\n el3.appendChild(el2.firstChild);\n }\n el2 = el3;\n }\n\n for (j = 0, attrs = el.attributes, len = attrs.length; j < len; j++) {\n attr = attrs.item(j);\n if (attr.nodeName === 'x' || attr.nodeName === 'y' ||\n attr.nodeName === 'xlink:href' || attr.nodeName === 'href') {\n continue;\n }\n\n if (attr.nodeName === 'transform') {\n currentTrans = attr.nodeValue + ' ' + currentTrans;\n }\n else {\n el2.setAttribute(attr.nodeName, attr.nodeValue);\n }\n }\n\n el2.setAttribute('transform', currentTrans);\n el2.setAttribute('instantiated_by_use', '1');\n el2.removeAttribute('id');\n parentNode = el.parentNode;\n parentNode.replaceChild(el2, el);\n // some browsers do not shorten nodelist after replaceChild (IE8)\n if (nodelist.length === oldLength) {\n i++;\n }\n }\n }\n\n // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n // matches, e.g.: +14.56e-12, etc.\n var reViewBoxAttrValue = new RegExp(\n '^' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*' +\n '$'\n );\n\n /**\n * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\n function applyViewboxTransform(element) {\n\n var viewBoxAttr = element.getAttribute('viewBox'),\n scaleX = 1,\n scaleY = 1,\n minX = 0,\n minY = 0,\n viewBoxWidth, viewBoxHeight, matrix, el,\n widthAttr = element.getAttribute('width'),\n heightAttr = element.getAttribute('height'),\n x = element.getAttribute('x') || 0,\n y = element.getAttribute('y') || 0,\n preserveAspectRatio = element.getAttribute('preserveAspectRatio') || '',\n missingViewBox = (!viewBoxAttr || !fabric.svgViewBoxElementsRegEx.test(element.nodeName)\n || !(viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))),\n missingDimAttr = (!widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%'),\n toBeParsed = missingViewBox && missingDimAttr,\n parsedDim = { }, translateMatrix = '', widthDiff = 0, heightDiff = 0;\n\n parsedDim.width = 0;\n parsedDim.height = 0;\n parsedDim.toBeParsed = toBeParsed;\n\n if (toBeParsed) {\n return parsedDim;\n }\n\n if (missingViewBox) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n return parsedDim;\n }\n minX = -parseFloat(viewBoxAttr[1]);\n minY = -parseFloat(viewBoxAttr[2]);\n viewBoxWidth = parseFloat(viewBoxAttr[3]);\n viewBoxHeight = parseFloat(viewBoxAttr[4]);\n parsedDim.minX = minX;\n parsedDim.minY = minY;\n parsedDim.viewBoxWidth = viewBoxWidth;\n parsedDim.viewBoxHeight = viewBoxHeight;\n if (!missingDimAttr) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n scaleX = parsedDim.width / viewBoxWidth;\n scaleY = parsedDim.height / viewBoxHeight;\n }\n else {\n parsedDim.width = viewBoxWidth;\n parsedDim.height = viewBoxHeight;\n }\n\n // default is to preserve aspect ratio\n preserveAspectRatio = fabric.util.parsePreserveAspectRatioAttribute(preserveAspectRatio);\n if (preserveAspectRatio.alignX !== 'none') {\n //translate all container for the effect of Mid, Min, Max\n if (preserveAspectRatio.meetOrSlice === 'meet') {\n scaleY = scaleX = (scaleX > scaleY ? scaleY : scaleX);\n // calculate additional translation to move the viewbox\n }\n if (preserveAspectRatio.meetOrSlice === 'slice') {\n scaleY = scaleX = (scaleX > scaleY ? scaleX : scaleY);\n // calculate additional translation to move the viewbox\n }\n widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n if (preserveAspectRatio.alignX === 'Mid') {\n widthDiff /= 2;\n }\n if (preserveAspectRatio.alignY === 'Mid') {\n heightDiff /= 2;\n }\n if (preserveAspectRatio.alignX === 'Min') {\n widthDiff = 0;\n }\n if (preserveAspectRatio.alignY === 'Min') {\n heightDiff = 0;\n }\n }\n\n if (scaleX === 1 && scaleY === 1 && minX === 0 && minY === 0 && x === 0 && y === 0) {\n return parsedDim;\n }\n\n if (x || y) {\n translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';\n }\n\n matrix = translateMatrix + ' matrix(' + scaleX +\n ' 0' +\n ' 0 ' +\n scaleY + ' ' +\n (minX * scaleX + widthDiff) + ' ' +\n (minY * scaleY + heightDiff) + ') ';\n parsedDim.viewboxTransform = fabric.parseTransformAttribute(matrix);\n if (element.nodeName === 'svg') {\n el = element.ownerDocument.createElementNS(fabric.svgNS, 'g');\n // element.firstChild != null\n while (element.firstChild) {\n el.appendChild(element.firstChild);\n }\n element.appendChild(el);\n }\n else {\n el = element;\n matrix = el.getAttribute('transform') + matrix;\n }\n el.setAttribute('transform', matrix);\n return parsedDim;\n }\n\n function hasAncestorWithNodeName(element, nodeName) {\n while (element && (element = element.parentNode)) {\n if (element.nodeName && nodeName.test(element.nodeName.replace('svg:', ''))\n && !element.getAttribute('instantiated_by_use')) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @param {Function} callback Callback to call when parsing is finished;\n * It's being passed an array of elements (parsed from a document).\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n * @param {Object} [parsingOptions] options for parsing document\n * @param {String} [parsingOptions.crossOrigin] crossOrigin settings\n */\n fabric.parseSVGDocument = function(doc, callback, reviver, parsingOptions) {\n if (!doc) {\n return;\n }\n\n parseUseDirectives(doc);\n\n var svgUid = fabric.Object.__uid++, i, len,\n options = applyViewboxTransform(doc),\n descendants = fabric.util.toArray(doc.getElementsByTagName('*'));\n options.crossOrigin = parsingOptions && parsingOptions.crossOrigin;\n options.svgUid = svgUid;\n\n if (descendants.length === 0 && fabric.isLikelyNode) {\n // we're likely in node, where \"o3-xml\" library fails to gEBTN(\"*\")\n // https://github.com/ajaxorg/node-o3-xml/issues/21\n descendants = doc.selectNodes('//*[name(.)!=\"svg\"]');\n var arr = [];\n for (i = 0, len = descendants.length; i < len; i++) {\n arr[i] = descendants[i];\n }\n descendants = arr;\n }\n\n var elements = descendants.filter(function(el) {\n applyViewboxTransform(el);\n return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')) &&\n !hasAncestorWithNodeName(el, fabric.svgInvalidAncestorsRegEx); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n\n if (!elements || (elements && !elements.length)) {\n callback && callback([], {});\n return;\n }\n var clipPaths = { };\n descendants.filter(function(el) {\n return el.nodeName.replace('svg:', '') === 'clipPath';\n }).forEach(function(el) {\n var id = el.getAttribute('id');\n clipPaths[id] = fabric.util.toArray(el.getElementsByTagName('*')).filter(function(el) {\n return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', ''));\n });\n });\n fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc);\n fabric.cssRules[svgUid] = fabric.getCSSRules(doc);\n fabric.clipPaths[svgUid] = clipPaths;\n // Precedence of rules: style > class > attribute\n fabric.parseElements(elements, function(instances, elements) {\n if (callback) {\n callback(instances, options, elements, descendants);\n delete fabric.gradientDefs[svgUid];\n delete fabric.cssRules[svgUid];\n delete fabric.clipPaths[svgUid];\n }\n }, clone(options), reviver, parsingOptions);\n };\n\n function recursivelyParseGradientsXlink(doc, gradient) {\n var gradientsAttrs = ['gradientTransform', 'x1', 'x2', 'y1', 'y2', 'gradientUnits', 'cx', 'cy', 'r', 'fx', 'fy'],\n xlinkAttr = 'xlink:href',\n xLink = gradient.getAttribute(xlinkAttr).substr(1),\n referencedGradient = elementById(doc, xLink);\n if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n recursivelyParseGradientsXlink(doc, referencedGradient);\n }\n gradientsAttrs.forEach(function(attr) {\n if (referencedGradient && !gradient.hasAttribute(attr) && referencedGradient.hasAttribute(attr)) {\n gradient.setAttribute(attr, referencedGradient.getAttribute(attr));\n }\n });\n if (!gradient.children.length) {\n var referenceClone = referencedGradient.cloneNode(true);\n while (referenceClone.firstChild) {\n gradient.appendChild(referenceClone.firstChild);\n }\n }\n gradient.removeAttribute(xlinkAttr);\n }\n\n var reFontDeclaration = new RegExp(\n '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n fabric.reNum +\n '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' + fabric.reNum + '))?\\\\s+(.*)');\n\n extend(fabric, {\n /**\n * Parses a short font declaration, building adding its properties to a style object\n * @static\n * @function\n * @memberOf fabric\n * @param {String} value font declaration\n * @param {Object} oStyle definition\n */\n parseFontDeclaration: function(value, oStyle) {\n var match = value.match(reFontDeclaration);\n\n if (!match) {\n return;\n }\n var fontStyle = match[1],\n // font variant is not used\n // fontVariant = match[2],\n fontWeight = match[3],\n fontSize = match[4],\n lineHeight = match[5],\n fontFamily = match[6];\n\n if (fontStyle) {\n oStyle.fontStyle = fontStyle;\n }\n if (fontWeight) {\n oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight);\n }\n if (fontSize) {\n oStyle.fontSize = parseUnit(fontSize);\n }\n if (fontFamily) {\n oStyle.fontFamily = fontFamily;\n }\n if (lineHeight) {\n oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n }\n },\n\n /**\n * Parses an SVG document, returning all of the gradient declarations found in it\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n */\n getGradientDefs: function(doc) {\n var tagArray = [\n 'linearGradient',\n 'radialGradient',\n 'svg:linearGradient',\n 'svg:radialGradient'],\n elList = _getMultipleNodes(doc, tagArray),\n el, j = 0, gradientDefs = { };\n j = elList.length;\n while (j--) {\n el = elList[j];\n if (el.getAttribute('xlink:href')) {\n recursivelyParseGradientsXlink(doc, el);\n }\n gradientDefs[el.getAttribute('id')] = el;\n }\n return gradientDefs;\n },\n\n /**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @static\n * @memberOf fabric\n * @param {DOMElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\n parseAttributes: function(element, attributes, svgUid) {\n\n if (!element) {\n return;\n }\n\n var value,\n parentAttributes = { },\n fontSize, parentFontSize;\n\n if (typeof svgUid === 'undefined') {\n svgUid = element.getAttribute('svgUid');\n }\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (element.parentNode && fabric.svgValidParentsRegEx.test(element.parentNode.nodeName)) {\n parentAttributes = fabric.parseAttributes(element.parentNode, attributes, svgUid);\n }\n\n var ownAttributes = attributes.reduce(function(memo, attr) {\n value = element.getAttribute(attr);\n if (value) { // eslint-disable-line\n memo[attr] = value;\n }\n return memo;\n }, { });\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n var cssAttrs = extend(\n getGlobalStylesForElement(element, svgUid),\n fabric.parseStyleAttribute(element)\n );\n ownAttributes = extend(\n ownAttributes,\n cssAttrs\n );\n if (cssAttrs[cPath]) {\n element.setAttribute(cPath, cssAttrs[cPath]);\n }\n fontSize = parentFontSize = parentAttributes.fontSize || fabric.Text.DEFAULT_SVG_FONT_SIZE;\n if (ownAttributes[fSize]) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n ownAttributes[fSize] = fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n }\n\n var normalizedAttr, normalizedValue, normalizedStyle = {};\n for (var attr in ownAttributes) {\n normalizedAttr = normalizeAttr(attr);\n normalizedValue = normalizeValue(normalizedAttr, ownAttributes[attr], parentAttributes, fontSize);\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n fabric.parseFontDeclaration(normalizedStyle.font, normalizedStyle);\n }\n var mergedAttrs = extend(parentAttributes, normalizedStyle);\n return fabric.svgValidParentsRegEx.test(element.nodeName) ? mergedAttrs : _setStrokeFillOpacity(mergedAttrs);\n },\n\n /**\n * Transforms an array of svg elements to corresponding fabric.* instances\n * @static\n * @memberOf fabric\n * @param {Array} elements Array of elements to parse\n * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements)\n * @param {Object} [options] Options object\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n */\n parseElements: function(elements, callback, options, reviver, parsingOptions) {\n new fabric.ElementsParser(elements, callback, options, reviver, parsingOptions).parse();\n },\n\n /**\n * Parses \"style\" attribute, retuning an object with values\n * @static\n * @memberOf fabric\n * @param {SVGElement} element Element to parse\n * @return {Object} Objects with values parsed from style attribute of an element\n */\n parseStyleAttribute: function(element) {\n var oStyle = { },\n style = element.getAttribute('style');\n\n if (!style) {\n return oStyle;\n }\n\n if (typeof style === 'string') {\n parseStyleString(style, oStyle);\n }\n else {\n parseStyleObject(style, oStyle);\n }\n\n return oStyle;\n },\n\n /**\n * Parses \"points\" attribute, returning an array of values\n * @static\n * @memberOf fabric\n * @param {String} points points attribute string\n * @return {Array} array of points\n */\n parsePointsAttribute: function(points) {\n\n // points attribute is required and must not be empty\n if (!points) {\n return null;\n }\n\n // replace commas with whitespace and remove bookending whitespace\n points = points.replace(/,/g, ' ').trim();\n\n points = points.split(/\\s+/);\n var parsedPoints = [], i, len;\n\n for (i = 0, len = points.length; i < len; i += 2) {\n parsedPoints.push({\n x: parseFloat(points[i]),\n y: parseFloat(points[i + 1])\n });\n }\n\n // odd number of points is an error\n // if (parsedPoints.length % 2 !== 0) {\n // return null;\n // }\n\n return parsedPoints;\n },\n\n /**\n * Returns CSS rules for a given SVG document\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} CSS rules of this document\n */\n getCSSRules: function(doc) {\n var styles = doc.getElementsByTagName('style'), i, len,\n allRules = { }, rules;\n\n // very crude parsing of style contents\n for (i = 0, len = styles.length; i < len; i++) {\n // \\n'\n ].join('');\n }\n\n return markup;\n },\n\n /**\n * @private\n */\n _setSVGObjects: function(markup, reviver) {\n var instance, i, len, objects = this._objects;\n for (i = 0, len = objects.length; i < len; i++) {\n instance = objects[i];\n if (instance.excludeFromExport) {\n continue;\n }\n this._setSVGObject(markup, instance, reviver);\n }\n },\n\n /**\n * @private\n */\n _setSVGObject: function(markup, instance, reviver) {\n markup.push(instance.toSVG(reviver));\n },\n\n /**\n * @private\n */\n _setSVGBgOverlayImage: function(markup, property, reviver) {\n if (this[property] && !this[property].excludeFromExport && this[property].toSVG) {\n markup.push(this[property].toSVG(reviver));\n }\n },\n\n /**\n * @private\n */\n _setSVGBgOverlayColor: function(markup, property) {\n var filler = this[property + 'Color'], vpt = this.viewportTransform, finalWidth = this.width,\n finalHeight = this.height;\n if (!filler) {\n return;\n }\n if (filler.toLive) {\n var repeat = filler.repeat, iVpt = fabric.util.invertTransform(vpt), shouldInvert = this[property + 'Vpt'],\n additionalTransform = shouldInvert ? fabric.util.matrixToSVG(iVpt) : '';\n markup.push(\n '\\n'\n );\n }\n else {\n markup.push(\n '\\n'\n );\n }\n },\n /* _TO_SVG_END_ */\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the bottom of the stack of drawn objects\n * @param {fabric.Object} object Object to send to back\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n sendToBack: function (object) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, objs;\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = objs.length; i--;) {\n obj = objs[i];\n removeFromArray(this._objects, obj);\n this._objects.unshift(obj);\n }\n }\n else {\n removeFromArray(this._objects, object);\n this._objects.unshift(object);\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the top of the stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n bringToFront: function (object) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, objs;\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = 0; i < objs.length; i++) {\n obj = objs[i];\n removeFromArray(this._objects, obj);\n this._objects.push(obj);\n }\n }\n else {\n removeFromArray(this._objects, object);\n this._objects.push(object);\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Moves an object or a selection down in stack of drawn objects\n * An optional paramter, intersecting allowes to move the object in behind\n * the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n sendBackwards: function (object, intersecting) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, idx, newIdx, objs, objsMoved = 0;\n\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = 0; i < objs.length; i++) {\n obj = objs[i];\n idx = this._objects.indexOf(obj);\n if (idx > 0 + objsMoved) {\n newIdx = idx - 1;\n removeFromArray(this._objects, obj);\n this._objects.splice(newIdx, 0, obj);\n }\n objsMoved++;\n }\n }\n else {\n idx = this._objects.indexOf(object);\n if (idx !== 0) {\n // if object is not on the bottom of stack\n newIdx = this._findNewLowerIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * @private\n */\n _findNewLowerIndex: function(object, idx, intersecting) {\n var newIdx, i;\n\n if (intersecting) {\n newIdx = idx;\n\n // traverse down the stack looking for the nearest intersecting object\n for (i = idx - 1; i >= 0; --i) {\n\n var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n object.isContainedWithinObject(this._objects[i]) ||\n this._objects[i].isContainedWithinObject(object);\n\n if (isIntersecting) {\n newIdx = i;\n break;\n }\n }\n }\n else {\n newIdx = idx - 1;\n }\n\n return newIdx;\n },\n\n /**\n * Moves an object or a selection up in stack of drawn objects\n * An optional paramter, intersecting allowes to move the object in front\n * of the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n bringForward: function (object, intersecting) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, idx, newIdx, objs, objsMoved = 0;\n\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = objs.length; i--;) {\n obj = objs[i];\n idx = this._objects.indexOf(obj);\n if (idx < this._objects.length - 1 - objsMoved) {\n newIdx = idx + 1;\n removeFromArray(this._objects, obj);\n this._objects.splice(newIdx, 0, obj);\n }\n objsMoved++;\n }\n }\n else {\n idx = this._objects.indexOf(object);\n if (idx !== this._objects.length - 1) {\n // if object is not on top of stack (last item in an array)\n newIdx = this._findNewUpperIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * @private\n */\n _findNewUpperIndex: function(object, idx, intersecting) {\n var newIdx, i, len;\n\n if (intersecting) {\n newIdx = idx;\n\n // traverse up the stack looking for the nearest intersecting object\n for (i = idx + 1, len = this._objects.length; i < len; ++i) {\n\n var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n object.isContainedWithinObject(this._objects[i]) ||\n this._objects[i].isContainedWithinObject(object);\n\n if (isIntersecting) {\n newIdx = i;\n break;\n }\n }\n }\n else {\n newIdx = idx + 1;\n }\n\n return newIdx;\n },\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @param {Number} index Position to move to\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n moveTo: function (object, index) {\n removeFromArray(this._objects, object);\n this._objects.splice(index, 0, object);\n return this.renderOnAddRemove && this.requestRenderAll();\n },\n\n /**\n * Clears a canvas element and dispose objects\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n dispose: function () {\n // cancel eventually ongoing renders\n if (this.isRendering) {\n fabric.util.cancelAnimFrame(this.isRendering);\n this.isRendering = 0;\n }\n this.forEachObject(function(object) {\n object.dispose && object.dispose();\n });\n this._objects = [];\n if (this.backgroundImage && this.backgroundImage.dispose) {\n this.backgroundImage.dispose();\n }\n this.backgroundImage = null;\n if (this.overlayImage && this.overlayImage.dispose) {\n this.overlayImage.dispose();\n }\n this.overlayImage = null;\n this._iTextInstances = null;\n this.contextContainer = null;\n fabric.util.cleanUpJsdomNode(this.lowerCanvasEl);\n this.lowerCanvasEl = undefined;\n return this;\n },\n\n /**\n * Returns a string representation of an instance\n * @return {String} string representation of an instance\n */\n toString: function () {\n return '#';\n }\n });\n\n extend(fabric.StaticCanvas.prototype, fabric.Observable);\n extend(fabric.StaticCanvas.prototype, fabric.Collection);\n extend(fabric.StaticCanvas.prototype, fabric.DataURLExporter);\n\n extend(fabric.StaticCanvas, /** @lends fabric.StaticCanvas */ {\n\n /**\n * @static\n * @type String\n * @default\n */\n EMPTY_JSON: '{\"objects\": [], \"background\": \"white\"}',\n\n /**\n * Provides a way to check support of some of the canvas methods\n * (either those of HTMLCanvasElement itself, or rendering context)\n *\n * @param {String} methodName Method to check support for;\n * Could be one of \"setLineDash\"\n * @return {Boolean | null} `true` if method is supported (or at least exists),\n * `null` if canvas element or context can not be initialized\n */\n supports: function (methodName) {\n var el = createCanvasElement();\n\n if (!el || !el.getContext) {\n return null;\n }\n\n var ctx = el.getContext('2d');\n if (!ctx) {\n return null;\n }\n\n switch (methodName) {\n\n case 'setLineDash':\n return typeof ctx.setLineDash !== 'undefined';\n\n default:\n return null;\n }\n }\n });\n\n /**\n * Returns JSON representation of canvas\n * @function\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} JSON string\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n * @example JSON without additional properties\n * var json = canvas.toJSON();\n * @example JSON with additional properties included\n * var json = canvas.toJSON(['lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY', 'lockUniScaling']);\n * @example JSON without default values\n * canvas.includeDefaultValues = false;\n * var json = canvas.toJSON();\n */\n fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject;\n\n if (fabric.isLikelyNode) {\n fabric.StaticCanvas.prototype.createPNGStream = function() {\n var impl = getNodeCanvas(this.lowerCanvasEl);\n return impl && impl.createPNGStream();\n };\n fabric.StaticCanvas.prototype.createJPEGStream = function(opts) {\n var impl = getNodeCanvas(this.lowerCanvasEl);\n return impl && impl.createJPEGStream(opts);\n };\n }\n})();\n\n\n/**\n * BaseBrush class\n * @class fabric.BaseBrush\n * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo}\n */\nfabric.BaseBrush = fabric.util.createClass(/** @lends fabric.BaseBrush.prototype */ {\n\n /**\n * Color of a brush\n * @type String\n * @default\n */\n color: 'rgb(0, 0, 0)',\n\n /**\n * Width of a brush, has to be a Number, no string literals\n * @type Number\n * @default\n */\n width: 1,\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n * @type String\n * @default\n */\n strokeLineCap: 'round',\n\n /**\n * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n * @type String\n * @default\n */\n strokeLineJoin: 'round',\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n * @type Number\n * @default\n */\n strokeMiterLimit: 10,\n\n /**\n * Stroke Dash Array.\n * @type Array\n * @default\n */\n strokeDashArray: null,\n\n /**\n * Sets shadow of an object\n * @param {Object|String} [options] Options object or string (e.g. \"2px 2px 10px rgba(0,0,0,0.2)\")\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setShadow: function(options) {\n this.shadow = new fabric.Shadow(options);\n return this;\n },\n\n /**\n * Sets brush styles\n * @private\n */\n _setBrushStyles: function() {\n var ctx = this.canvas.contextTop;\n ctx.strokeStyle = this.color;\n ctx.lineWidth = this.width;\n ctx.lineCap = this.strokeLineCap;\n ctx.miterLimit = this.strokeMiterLimit;\n ctx.lineJoin = this.strokeLineJoin;\n if (fabric.StaticCanvas.supports('setLineDash')) {\n ctx.setLineDash(this.strokeDashArray || []);\n }\n },\n\n /**\n * Sets the transformation on given context\n * @param {RenderingContext2d} ctx context to render on\n * @private\n */\n _saveAndTransform: function(ctx) {\n var v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n },\n\n /**\n * Sets brush shadow styles\n * @private\n */\n _setShadow: function() {\n if (!this.shadow) {\n return;\n }\n\n var canvas = this.canvas,\n shadow = this.shadow,\n ctx = canvas.contextTop,\n zoom = canvas.getZoom();\n if (canvas && canvas._isRetinaScaling()) {\n zoom *= fabric.devicePixelRatio;\n }\n\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * zoom;\n ctx.shadowOffsetX = shadow.offsetX * zoom;\n ctx.shadowOffsetY = shadow.offsetY * zoom;\n },\n\n needsFullRender: function() {\n var color = new fabric.Color(this.color);\n return color.getAlpha() < 1 || !!this.shadow;\n },\n\n /**\n * Removes brush shadow styles\n * @private\n */\n _resetShadow: function() {\n var ctx = this.canvas.contextTop;\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n});\n\n\n(function() {\n /**\n * PencilBrush class\n * @class fabric.PencilBrush\n * @extends fabric.BaseBrush\n */\n fabric.PencilBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.PencilBrush.prototype */ {\n\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate: 0.4,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.PencilBrush} Instance of a pencil brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this._points = [];\n },\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Object} pointer\n */\n _drawSegment: function (ctx, p1, p2) {\n var midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n },\n\n /**\n * Inovoked on mouse down\n * @param {Object} pointer\n */\n onMouseDown: function(pointer, options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return;\n }\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._captureDrawingPath(pointer);\n this._render();\n },\n\n /**\n * Inovoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer, options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return;\n }\n if (this._captureDrawingPath(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n }\n else {\n var points = this._points, length = points.length, ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = this._drawSegment(ctx, points[length - 2], points[length - 1], true);\n ctx.stroke();\n ctx.restore();\n }\n }\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function(options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return true;\n }\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n return false;\n },\n\n /**\n * @private\n * @param {Object} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing: function(pointer) {\n\n var p = new fabric.Point(pointer.x, pointer.y);\n\n this._reset();\n this._addPoint(p);\n this.canvas.contextTop.moveTo(p.x, p.y);\n },\n\n /**\n * @private\n * @param {fabric.Point} point Point to be added to points array\n */\n _addPoint: function(point) {\n if (this._points.length > 1 && point.eq(this._points[this._points.length - 1])) {\n return false;\n }\n this._points.push(point);\n return true;\n },\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset: function() {\n this._points = [];\n this._setBrushStyles();\n this._setShadow();\n },\n\n /**\n * @private\n * @param {Object} pointer Actual mouse position related to the canvas.\n */\n _captureDrawingPath: function(pointer) {\n var pointerPoint = new fabric.Point(pointer.x, pointer.y);\n return this._addPoint(pointerPoint);\n },\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, len,\n p1 = this._points[0],\n p2 = this._points[1];\n\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n var width = this.width / 1000;\n p1 = new fabric.Point(p1.x, p1.y);\n p2 = new fabric.Point(p2.x, p2.y);\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (i = 1, len = this._points.length; i < len; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n this._drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n },\n\n /**\n * Converts points to SVG path\n * @param {Array} points Array of points\n * @return {String} SVG path\n */\n convertPointsToSVGPath: function(points) {\n var path = [], i, width = this.width / 1000,\n p1 = new fabric.Point(points[0].x, points[0].y),\n p2 = new fabric.Point(points[1].x, points[1].y),\n len = points.length, multSignX = 1, multSignY = 0, manyPoints = len > 2;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push('M ', p1.x - multSignX * width, ' ', p1.y - multSignY * width, ' ');\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n var midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push('Q ', p1.x, ' ', p1.y, ' ', midPoint.x, ' ', midPoint.y, ' ');\n }\n p1 = points[i];\n if ((i + 1) < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push('L ', p1.x + multSignX * width, ' ', p1.y + multSignY * width);\n return path;\n },\n\n /**\n * Creates fabric.Path object to add on canvas\n * @param {String} pathData Path data\n * @return {fabric.Path} Path to add on canvas\n */\n createPath: function(pathData) {\n var path = new fabric.Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.setShadow(this.shadow);\n }\n\n return path;\n },\n\n /**\n * Decimate poins array with the decimate value\n */\n decimatePoints: function(points, distance) {\n if (points.length <= 2) {\n return points;\n }\n var zoom = this.canvas.getZoom(), adjustedDistance = Math.pow(distance / zoom, 2),\n i, l = points.length - 1, lastPoint = points[0], newPoints = [lastPoint],\n cDistance;\n for (i = 1; i < l; i++) {\n cDistance = Math.pow(lastPoint.x - points[i].x, 2) + Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n if (newPoints.length === 1) {\n newPoints.push(new fabric.Point(newPoints[0].x, newPoints[0].y));\n }\n return newPoints;\n },\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new fabric path object\n * and add it to the fabric canvas.\n */\n _finalizeAndAddPath: function() {\n var ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n var pathData = this.convertPointsToSVGPath(this._points).join('');\n if (pathData === 'M 0 0 Q 0 0 0 0 L 0 0') {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n var path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.add(path);\n this.canvas.requestRenderAll();\n path.setCoords();\n this._resetShadow();\n\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n });\n})();\n\n\n/**\n * CircleBrush class\n * @class fabric.CircleBrush\n */\nfabric.CircleBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.CircleBrush.prototype */ {\n\n /**\n * Width of a brush\n * @type Number\n * @default\n */\n width: 10,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.CircleBrush} Instance of a circle brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this.points = [];\n },\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Object} pointer\n */\n drawDot: function(pointer) {\n var point = this.addPoint(pointer),\n ctx = this.canvas.contextTop;\n this._saveAndTransform(ctx);\n this.dot(ctx, point);\n ctx.restore();\n },\n\n dot: function(ctx, point) {\n ctx.fillStyle = point.fill;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n ctx.closePath();\n ctx.fill();\n },\n\n /**\n * Invoked on mouse down\n */\n onMouseDown: function(pointer) {\n this.points.length = 0;\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n this.drawDot(pointer);\n },\n\n /**\n * Render the full state of the brush\n * @private\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, len,\n points = this.points;\n this._saveAndTransform(ctx);\n for (i = 0, len = points.length; i < len; i++) {\n this.dot(ctx, points[i]);\n }\n ctx.restore();\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer) {\n if (this.needsFullRender()) {\n this.canvas.clearContext(this.canvas.contextTop);\n this.addPoint(pointer);\n this._render();\n }\n else {\n this.drawDot(pointer);\n }\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function() {\n var originalRenderOnAddRemove = this.canvas.renderOnAddRemove, i, len;\n this.canvas.renderOnAddRemove = false;\n\n var circles = [];\n\n for (i = 0, len = this.points.length; i < len; i++) {\n var point = this.points[i],\n circle = new fabric.Circle({\n radius: point.radius,\n left: point.x,\n top: point.y,\n originX: 'center',\n originY: 'center',\n fill: point.fill\n });\n\n this.shadow && circle.setShadow(this.shadow);\n\n circles.push(circle);\n }\n var group = new fabric.Group(circles);\n group.canvas = this.canvas;\n\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n },\n\n /**\n * @param {Object} pointer\n * @return {fabric.Point} Just added pointer point\n */\n addPoint: function(pointer) {\n var pointerPoint = new fabric.Point(pointer.x, pointer.y),\n\n circleRadius = fabric.util.getRandomInt(\n Math.max(0, this.width - 20), this.width + 20) / 2,\n\n circleColor = new fabric.Color(this.color)\n .setAlpha(fabric.util.getRandomInt(0, 100) / 100)\n .toRgba();\n\n pointerPoint.radius = circleRadius;\n pointerPoint.fill = circleColor;\n\n this.points.push(pointerPoint);\n\n return pointerPoint;\n }\n});\n\n\n/**\n * SprayBrush class\n * @class fabric.SprayBrush\n */\nfabric.SprayBrush = fabric.util.createClass( fabric.BaseBrush, /** @lends fabric.SprayBrush.prototype */ {\n\n /**\n * Width of a spray\n * @type Number\n * @default\n */\n width: 10,\n\n /**\n * Density of a spray (number of dots per chunk)\n * @type Number\n * @default\n */\n density: 20,\n\n /**\n * Width of spray dots\n * @type Number\n * @default\n */\n dotWidth: 1,\n\n /**\n * Width variance of spray dots\n * @type Number\n * @default\n */\n dotWidthVariance: 1,\n\n /**\n * Whether opacity of a dot should be random\n * @type Boolean\n * @default\n */\n randomOpacity: false,\n\n /**\n * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n * @type Boolean\n * @default\n */\n optimizeOverlapping: true,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.SprayBrush} Instance of a spray brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this.sprayChunks = [];\n },\n\n /**\n * Invoked on mouse down\n * @param {Object} pointer\n */\n onMouseDown: function(pointer) {\n this.sprayChunks.length = 0;\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n\n this.addSprayChunk(pointer);\n this.render(this.sprayChunkPoints);\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer) {\n this.addSprayChunk(pointer);\n this.render(this.sprayChunkPoints);\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function() {\n var originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n var rects = [];\n\n for (var i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n var sprayChunk = this.sprayChunks[i];\n\n for (var j = 0, jlen = sprayChunk.length; j < jlen; j++) {\n\n var rect = new fabric.Rect({\n width: sprayChunk[j].width,\n height: sprayChunk[j].width,\n left: sprayChunk[j].x + 1,\n top: sprayChunk[j].y + 1,\n originX: 'center',\n originY: 'center',\n fill: this.color\n });\n rects.push(rect);\n }\n }\n\n if (this.optimizeOverlapping) {\n rects = this._getOptimizedRects(rects);\n }\n\n var group = new fabric.Group(rects);\n this.shadow && group.setShadow(this.shadow);\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n },\n\n /**\n * @private\n * @param {Array} rects\n */\n _getOptimizedRects: function(rects) {\n\n // avoid creating duplicate rects at the same coordinates\n var uniqueRects = { }, key, i, len;\n\n for (i = 0, len = rects.length; i < len; i++) {\n key = rects[i].left + '' + rects[i].top;\n if (!uniqueRects[key]) {\n uniqueRects[key] = rects[i];\n }\n }\n var uniqueRectsArray = [];\n for (key in uniqueRects) {\n uniqueRectsArray.push(uniqueRects[key]);\n }\n\n return uniqueRectsArray;\n },\n\n /**\n * Render new chunk of spray brush\n */\n render: function(sprayChunk) {\n var ctx = this.canvas.contextTop, i, len;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (i = 0, len = sprayChunk.length; i < len; i++) {\n var point = sprayChunk[i];\n if (typeof point.opacity !== 'undefined') {\n ctx.globalAlpha = point.opacity;\n }\n ctx.fillRect(point.x, point.y, point.width, point.width);\n }\n ctx.restore();\n },\n\n /**\n * Render all spray chunks\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, ilen;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n this.render(this.sprayChunks[i]);\n }\n ctx.restore();\n },\n\n /**\n * @param {Object} pointer\n */\n addSprayChunk: function(pointer) {\n this.sprayChunkPoints = [];\n\n var x, y, width, radius = this.width / 2, i;\n\n for (i = 0; i < this.density; i++) {\n\n x = fabric.util.getRandomInt(pointer.x - radius, pointer.x + radius);\n y = fabric.util.getRandomInt(pointer.y - radius, pointer.y + radius);\n\n if (this.dotWidthVariance) {\n width = fabric.util.getRandomInt(\n // bottom clamp width to 1\n Math.max(1, this.dotWidth - this.dotWidthVariance),\n this.dotWidth + this.dotWidthVariance);\n }\n else {\n width = this.dotWidth;\n }\n\n var point = new fabric.Point(x, y);\n point.width = width;\n\n if (this.randomOpacity) {\n point.opacity = fabric.util.getRandomInt(0, 100) / 100;\n }\n\n this.sprayChunkPoints.push(point);\n }\n\n this.sprayChunks.push(this.sprayChunkPoints);\n }\n});\n\n\n/**\n * PatternBrush class\n * @class fabric.PatternBrush\n * @extends fabric.BaseBrush\n */\nfabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fabric.PatternBrush.prototype */ {\n\n getPatternSrc: function() {\n\n var dotWidth = 20,\n dotDistance = 5,\n patternCanvas = fabric.util.createCanvasElement(),\n patternCtx = patternCanvas.getContext('2d');\n\n patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n\n patternCtx.fillStyle = this.color;\n patternCtx.beginPath();\n patternCtx.arc(dotWidth / 2, dotWidth / 2, dotWidth / 2, 0, Math.PI * 2, false);\n patternCtx.closePath();\n patternCtx.fill();\n\n return patternCanvas;\n },\n\n getPatternSrcFunction: function() {\n return String(this.getPatternSrc).replace('this.color', '\"' + this.color + '\"');\n },\n\n /**\n * Creates \"pattern\" instance property\n */\n getPattern: function() {\n return this.canvas.contextTop.createPattern(this.source || this.getPatternSrc(), 'repeat');\n },\n\n /**\n * Sets brush styles\n */\n _setBrushStyles: function() {\n this.callSuper('_setBrushStyles');\n this.canvas.contextTop.strokeStyle = this.getPattern();\n },\n\n /**\n * Creates path\n */\n createPath: function(pathData) {\n var path = this.callSuper('createPath', pathData),\n topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n path.stroke = new fabric.Pattern({\n source: this.source || this.getPatternSrcFunction(),\n offsetX: -topLeft.x,\n offsetY: -topLeft.y\n });\n return path;\n }\n});\n\n\n(function() {\n\n var getPointer = fabric.util.getPointer,\n degreesToRadians = fabric.util.degreesToRadians,\n radiansToDegrees = fabric.util.radiansToDegrees,\n atan2 = Math.atan2,\n abs = Math.abs,\n supportLineDash = fabric.StaticCanvas.supports('setLineDash'),\n\n STROKE_OFFSET = 0.5;\n\n /**\n * Canvas class\n * @class fabric.Canvas\n * @extends fabric.StaticCanvas\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas}\n * @see {@link fabric.Canvas#initialize} for constructor definition\n *\n * @fires object:modified at the end of a transform or any change when statefull is true\n * @fires object:rotated at the end of a rotation transform\n * @fires object:scaled at the end of a scale transform\n * @fires object:moved at the end of translation transform\n * @fires object:skewed at the end of a skew transform\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n * @fires object:selected this event is deprecated. use selection:created\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n */\n fabric.Canvas = fabric.util.createClass(fabric.StaticCanvas, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * Constructor\n * @param {HTMLElement | String} el <canvas> element to initialize instance on\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(el, options) {\n options || (options = { });\n this.renderAndResetBound = this.renderAndReset.bind(this);\n this.requestRenderAllBound = this.requestRenderAll.bind(this);\n this._initStatic(el, options);\n this._initInteractive();\n this._createCacheCanvas();\n },\n\n /**\n * When true, objects can be transformed by one side (unproportionally)\n * @type Boolean\n * @default\n */\n uniScaleTransform: false,\n\n /**\n * Indicates which key enable unproportional scaling\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n uniScaleKey: 'shiftKey',\n\n /**\n * When true, objects use center point as the origin of scale transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredScaling: false,\n\n /**\n * When true, objects use center point as the origin of rotate transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredRotation: false,\n\n /**\n * Indicates which key enable centered Transform\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n centeredKey: 'altKey',\n\n /**\n * Indicates which key enable alternate action on corner\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n altActionKey: 'shiftKey',\n\n /**\n * Indicates that canvas is interactive. This property should not be changed.\n * @type Boolean\n * @default\n */\n interactive: true,\n\n /**\n * Indicates whether group selection should be enabled\n * @type Boolean\n * @default\n */\n selection: true,\n\n /**\n * Indicates which key or keys enable multiple click selection\n * Pass value as a string or array of strings\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or empty or containing any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.2\n * @type String|Array\n * @default\n */\n selectionKey: 'shiftKey',\n\n /**\n * Indicates which key enable alternative selection\n * in case of target overlapping with active object\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * For a series of reason that come from the general expectations on how\n * things should work, this feature works only for preserveObjectStacking true.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.5\n * @type null|String\n * @default\n */\n altSelectionKey: null,\n\n /**\n * Color of selection\n * @type String\n * @default\n */\n selectionColor: 'rgba(100, 100, 255, 0.3)', // blue\n\n /**\n * Default dash array pattern\n * If not empty the selection border is dashed\n * @type Array\n */\n selectionDashArray: [],\n\n /**\n * Color of the border of selection (usually slightly darker than color of selection itself)\n * @type String\n * @default\n */\n selectionBorderColor: 'rgba(255, 255, 255, 0.3)',\n\n /**\n * Width of a line used in object/group selection\n * @type Number\n * @default\n */\n selectionLineWidth: 1,\n\n /**\n * Select only shapes that are fully contained in the dragged selection rectangle.\n * @type Boolean\n * @default\n */\n selectionFullyContained: false,\n\n /**\n * Default cursor value used when hovering over an object on canvas\n * @type String\n * @default\n */\n hoverCursor: 'move',\n\n /**\n * Default cursor value used when moving an object on canvas\n * @type String\n * @default\n */\n moveCursor: 'move',\n\n /**\n * Default cursor value used for the entire canvas\n * @type String\n * @default\n */\n defaultCursor: 'default',\n\n /**\n * Cursor value used during free drawing\n * @type String\n * @default\n */\n freeDrawingCursor: 'crosshair',\n\n /**\n * Cursor value used for rotation point\n * @type String\n * @default\n */\n rotationCursor: 'crosshair',\n\n /**\n * Cursor value used for disabled elements ( corners with disabled action )\n * @type String\n * @since 2.0.0\n * @default\n */\n notAllowedCursor: 'not-allowed',\n\n /**\n * Default element class that's given to wrapper (div) element of canvas\n * @type String\n * @default\n */\n containerClass: 'canvas-container',\n\n /**\n * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n * @type Boolean\n * @default\n */\n perPixelTargetFind: false,\n\n /**\n * Number of pixels around target pixel to tolerate (consider active) during object detection\n * @type Number\n * @default\n */\n targetFindTolerance: 0,\n\n /**\n * When true, target detection is skipped when hovering over canvas. This can be used to improve performance.\n * @type Boolean\n * @default\n */\n skipTargetFind: false,\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n * @default\n */\n isDrawingMode: false,\n\n /**\n * Indicates whether objects should remain in current stack position when selected.\n * When false objects are brought to top and rendered as part of the selection group\n * @type Boolean\n * @default\n */\n preserveObjectStacking: false,\n\n /**\n * Indicates the angle that an object will lock to while rotating.\n * @type Number\n * @since 1.6.7\n * @default\n */\n snapAngle: 0,\n\n /**\n * Indicates the distance from the snapAngle the rotation will lock to the snapAngle.\n * When `null`, the snapThreshold will default to the snapAngle.\n * @type null|Number\n * @since 1.6.7\n * @default\n */\n snapThreshold: null,\n\n /**\n * Indicates if the right click on canvas can output the context menu or not\n * @type Boolean\n * @since 1.6.5\n * @default\n */\n stopContextMenu: false,\n\n /**\n * Indicates if the canvas can fire right click events\n * @type Boolean\n * @since 1.6.5\n * @default\n */\n fireRightClick: false,\n\n /**\n * Indicates if the canvas can fire middle click events\n * @type Boolean\n * @since 1.7.8\n * @default\n */\n fireMiddleClick: false,\n\n /**\n * Keep track of the subTargets for Mouse Events\n * @type fabric.Object[]\n */\n targets: [],\n\n /**\n * Keep track of the hovered target\n * @type fabric.Object\n * @private\n */\n _hoveredTarget: null,\n\n /**\n * hold the list of nested targets hovered\n * @type fabric.Object[]\n * @private\n */\n _hoveredTargets: [],\n\n /**\n * @private\n */\n _initInteractive: function() {\n this._currentTransform = null;\n this._groupSelector = null;\n this._initWrapperElement();\n this._createUpperCanvas();\n this._initEventListeners();\n\n this._initRetinaScaling();\n\n this.freeDrawingBrush = fabric.PencilBrush && new fabric.PencilBrush(this);\n\n this.calcOffset();\n },\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender: function() {\n var activeObjects = this.getActiveObjects(),\n object, objsToRender, activeGroupObjects;\n\n if (activeObjects.length > 0 && !this.preserveObjectStacking) {\n objsToRender = [];\n activeGroupObjects = [];\n for (var i = 0, length = this._objects.length; i < length; i++) {\n object = this._objects[i];\n if (activeObjects.indexOf(object) === -1 ) {\n objsToRender.push(object);\n }\n else {\n activeGroupObjects.push(object);\n }\n }\n if (activeObjects.length > 1) {\n this._activeObject._objects = activeGroupObjects;\n }\n objsToRender.push.apply(objsToRender, activeGroupObjects);\n }\n else {\n objsToRender = this._objects;\n }\n return objsToRender;\n },\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderAll: function () {\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n }\n var canvasToDrawOn = this.contextContainer;\n this.renderCanvas(canvasToDrawOn, this._chooseObjectsToRender());\n return this;\n },\n\n renderTopLayer: function(ctx) {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n },\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n renderTop: function () {\n var ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n this.fire('after:render');\n return this;\n },\n\n /**\n * Resets the current transform to its original values and chooses the type of resizing based on the event\n * @private\n */\n _resetCurrentTransform: function() {\n var t = this._currentTransform;\n\n t.target.set({\n scaleX: t.original.scaleX,\n scaleY: t.original.scaleY,\n skewX: t.original.skewX,\n skewY: t.original.skewY,\n left: t.original.left,\n top: t.original.top\n });\n\n if (this._shouldCenterTransform(t.target)) {\n if (t.originX !== 'center') {\n if (t.originX === 'right') {\n t.mouseXSign = -1;\n }\n else {\n t.mouseXSign = 1;\n }\n }\n if (t.originY !== 'center') {\n if (t.originY === 'bottom') {\n t.mouseYSign = -1;\n }\n else {\n t.mouseYSign = 1;\n }\n }\n\n t.originX = 'center';\n t.originY = 'center';\n }\n else {\n t.originX = t.original.originX;\n t.originY = t.original.originY;\n }\n },\n\n /**\n * Checks if point is contained within an area of given object\n * @param {Event} e Event object\n * @param {fabric.Object} target Object to test against\n * @param {Object} [point] x,y object of point coordinates we want to check.\n * @return {Boolean} true if point is contained within an area of given object\n */\n containsPoint: function (e, target, point) {\n var ignoreZoom = true,\n pointer = point || this.getPointer(e, ignoreZoom),\n xy;\n\n if (target.group && target.group === this._activeObject && target.group.type === 'activeSelection') {\n xy = this._normalizePointer(target.group, pointer);\n }\n else {\n xy = { x: pointer.x, y: pointer.y };\n }\n // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html\n // http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html\n return (target.containsPoint(xy) || target._findTargetCorner(pointer));\n },\n\n /**\n * @private\n */\n _normalizePointer: function (object, pointer) {\n var m = object.calcTransformMatrix(),\n invertedM = fabric.util.invertTransform(m),\n vptPointer = this.restorePointerVpt(pointer);\n return fabric.util.transformPoint(vptPointer, invertedM);\n },\n\n /**\n * Returns true if object is transparent at a certain location\n * @param {fabric.Object} target Object to check\n * @param {Number} x Left coordinate\n * @param {Number} y Top coordinate\n * @return {Boolean}\n */\n isTargetTransparent: function (target, x, y) {\n // in case the target is the activeObject, we cannot execute this optimization\n // because we need to draw controls too.\n if (target.shouldCache() && target._cacheCanvas && target !== this._activeObject) {\n var normalizedPointer = this._normalizePointer(target, {x: x, y: y}),\n targetRelativeX = Math.max(target.cacheTranslationX + (normalizedPointer.x * target.zoomX), 0),\n targetRelativeY = Math.max(target.cacheTranslationY + (normalizedPointer.y * target.zoomY), 0);\n\n var isTransparent = fabric.util.isTransparent(\n target._cacheContext, Math.round(targetRelativeX), Math.round(targetRelativeY), this.targetFindTolerance);\n\n return isTransparent;\n }\n\n var ctx = this.contextCache,\n originalColor = target.selectionBackgroundColor, v = this.viewportTransform;\n\n target.selectionBackgroundColor = '';\n\n this.clearContext(ctx);\n\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n target.render(ctx);\n ctx.restore();\n\n target === this._activeObject && target._renderControls(ctx, {\n hasBorders: false,\n transparentCorners: false\n }, {\n hasBorders: false,\n });\n\n target.selectionBackgroundColor = originalColor;\n\n var isTransparent = fabric.util.isTransparent(\n ctx, x, y, this.targetFindTolerance);\n\n return isTransparent;\n },\n\n /**\n * takes an event and determins if selection key has been pressed\n * @private\n * @param {Event} e Event object\n */\n _isSelectionKeyPressed: function(e) {\n var selectionKeyPressed = false;\n\n if (Object.prototype.toString.call(this.selectionKey) === '[object Array]') {\n selectionKeyPressed = !!this.selectionKey.find(function(key) { return e[key] === true; });\n }\n else {\n selectionKeyPressed = e[this.selectionKey];\n }\n\n return selectionKeyPressed;\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _shouldClearSelection: function (e, target) {\n var activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return (\n !target\n ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e))\n ||\n (target && !target.evented)\n ||\n (target &&\n !target.selectable &&\n activeObject &&\n activeObject !== target)\n );\n },\n\n /**\n * centeredScaling from object can't override centeredScaling from canvas.\n * this should be fixed, since object setting should take precedence over canvas.\n * @private\n * @param {fabric.Object} target\n */\n _shouldCenterTransform: function (target) {\n if (!target) {\n return;\n }\n\n var t = this._currentTransform,\n centerTransform;\n\n if (t.action === 'scale' || t.action === 'scaleX' || t.action === 'scaleY') {\n centerTransform = this.centeredScaling || target.centeredScaling;\n }\n else if (t.action === 'rotate') {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !t.altKey : t.altKey;\n },\n\n /**\n * @private\n */\n _getOriginFromCorner: function(target, corner) {\n var origin = {\n x: target.originX,\n y: target.originY\n };\n\n if (corner === 'ml' || corner === 'tl' || corner === 'bl') {\n origin.x = 'right';\n }\n else if (corner === 'mr' || corner === 'tr' || corner === 'br') {\n origin.x = 'left';\n }\n\n if (corner === 'tl' || corner === 'mt' || corner === 'tr') {\n origin.y = 'bottom';\n }\n else if (corner === 'bl' || corner === 'mb' || corner === 'br') {\n origin.y = 'top';\n }\n\n return origin;\n },\n\n /**\n * @private\n * @param {Boolean} alreadySelected true if target is already selected\n * @param {String} corner a string representing the corner ml, mr, tl ...\n * @param {Event} e Event object\n * @param {fabric.Object} [target] inserted back to help overriding. Unused\n */\n _getActionFromCorner: function(alreadySelected, corner, e /* target */) {\n if (!corner || !alreadySelected) {\n return 'drag';\n }\n\n switch (corner) {\n case 'mtr':\n return 'rotate';\n case 'ml':\n case 'mr':\n return e[this.altActionKey] ? 'skewY' : 'scaleX';\n case 'mt':\n case 'mb':\n return e[this.altActionKey] ? 'skewX' : 'scaleY';\n default:\n return 'scale';\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _setupCurrentTransform: function (e, target, alreadySelected) {\n if (!target) {\n return;\n }\n\n var pointer = this.getPointer(e),\n corner = target._findTargetCorner(this.getPointer(e, true)),\n action = this._getActionFromCorner(alreadySelected, corner, e, target),\n origin = this._getOriginFromCorner(target, corner);\n\n this._currentTransform = {\n target: target,\n action: action,\n corner: corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n // used by transation\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n // unsure they are usefull anymore.\n // left: target.left,\n // top: target.top,\n theta: degreesToRadians(target.angle),\n // end of unsure\n width: target.width * target.scaleX,\n mouseXSign: 1,\n mouseYSign: 1,\n shiftKey: e.shiftKey,\n altKey: e[this.centeredKey],\n original: fabric.util.saveObjectTransform(target),\n };\n\n this._currentTransform.original.originX = origin.x;\n this._currentTransform.original.originY = origin.y;\n\n this._resetCurrentTransform();\n this._beforeTransform(e);\n },\n\n /**\n * Translates object by \"setting\" its left/top\n * @private\n * @param {Number} x pointer's x coordinate\n * @param {Number} y pointer's y coordinate\n * @return {Boolean} true if the translation occurred\n */\n _translateObject: function (x, y) {\n var transform = this._currentTransform,\n target = transform.target,\n newLeft = x - transform.offsetX,\n newTop = y - transform.offsetY,\n moveX = !target.get('lockMovementX') && target.left !== newLeft,\n moveY = !target.get('lockMovementY') && target.top !== newTop;\n\n moveX && target.set('left', newLeft);\n moveY && target.set('top', newTop);\n return moveX || moveY;\n },\n\n /**\n * Check if we are increasing a positive skew or lower it,\n * checking mouse direction and pressed corner.\n * @private\n */\n _changeSkewTransformOrigin: function(mouseMove, t, by) {\n var property = 'originX', origins = { 0: 'center' },\n skew = t.target.skewX, originA = 'left', originB = 'right',\n corner = t.corner === 'mt' || t.corner === 'ml' ? 1 : -1,\n flipSign = 1;\n\n mouseMove = mouseMove > 0 ? 1 : -1;\n if (by === 'y') {\n skew = t.target.skewY;\n originA = 'top';\n originB = 'bottom';\n property = 'originY';\n }\n origins[-1] = originA;\n origins[1] = originB;\n\n t.target.flipX && (flipSign *= -1);\n t.target.flipY && (flipSign *= -1);\n\n if (skew === 0) {\n t.skewSign = -corner * mouseMove * flipSign;\n t[property] = origins[-mouseMove];\n }\n else {\n skew = skew > 0 ? 1 : -1;\n t.skewSign = skew;\n t[property] = origins[skew * corner * flipSign];\n }\n },\n\n /**\n * Skew object by mouse events\n * @private\n * @param {Number} x pointer's x coordinate\n * @param {Number} y pointer's y coordinate\n * @param {String} by Either 'x' or 'y'\n * @return {Boolean} true if the skewing occurred\n */\n _skewObject: function (x, y, by) {\n var t = this._currentTransform,\n target = t.target, skewed = false,\n lockSkewingX = target.get('lockSkewingX'),\n lockSkewingY = target.get('lockSkewingY');\n\n if ((lockSkewingX && by === 'x') || (lockSkewingY && by === 'y')) {\n return false;\n }\n\n // Get the constraint point\n var center = target.getCenterPoint(),\n actualMouseByCenter = target.toLocalPoint(new fabric.Point(x, y), 'center', 'center')[by],\n lastMouseByCenter = target.toLocalPoint(new fabric.Point(t.lastX, t.lastY), 'center', 'center')[by],\n actualMouseByOrigin, constraintPosition, dim = target._getTransformedDimensions();\n\n this._changeSkewTransformOrigin(actualMouseByCenter - lastMouseByCenter, t, by);\n actualMouseByOrigin = target.toLocalPoint(new fabric.Point(x, y), t.originX, t.originY)[by];\n constraintPosition = target.translateToOriginPoint(center, t.originX, t.originY);\n // Actually skew the object\n skewed = this._setObjectSkew(actualMouseByOrigin, t, by, dim);\n t.lastX = x;\n t.lastY = y;\n // Make sure the constraints apply\n target.setPositionByOrigin(constraintPosition, t.originX, t.originY);\n return skewed;\n },\n\n /**\n * Set object skew\n * @private\n * @return {Boolean} true if the skewing occurred\n */\n _setObjectSkew: function(localMouse, transform, by, _dim) {\n var target = transform.target, newValue, skewed = false,\n skewSign = transform.skewSign, newDim, dimNoSkew,\n otherBy, _otherBy, _by, newDimMouse, skewX, skewY;\n\n if (by === 'x') {\n otherBy = 'y';\n _otherBy = 'Y';\n _by = 'X';\n skewX = 0;\n skewY = target.skewY;\n }\n else {\n otherBy = 'x';\n _otherBy = 'X';\n _by = 'Y';\n skewX = target.skewX;\n skewY = 0;\n }\n\n dimNoSkew = target._getTransformedDimensions(skewX, skewY);\n newDimMouse = 2 * Math.abs(localMouse) - dimNoSkew[by];\n if (newDimMouse <= 2) {\n newValue = 0;\n }\n else {\n newValue = skewSign * Math.atan((newDimMouse / target['scale' + _by]) /\n (dimNoSkew[otherBy] / target['scale' + _otherBy]));\n newValue = fabric.util.radiansToDegrees(newValue);\n }\n skewed = target['skew' + _by] !== newValue;\n target.set('skew' + _by, newValue);\n if (target['skew' + _otherBy] !== 0) {\n newDim = target._getTransformedDimensions();\n newValue = (_dim[otherBy] / newDim[otherBy]) * target['scale' + _otherBy];\n target.set('scale' + _otherBy, newValue);\n }\n return skewed;\n },\n\n /**\n * Scales object by invoking its scaleX/scaleY methods\n * @private\n * @param {Number} x pointer's x coordinate\n * @param {Number} y pointer's y coordinate\n * @param {String} by Either 'x' or 'y' - specifies dimension constraint by which to scale an object.\n * When not provided, an object is scaled by both dimensions equally\n * @return {Boolean} true if the scaling occurred\n */\n _scaleObject: function (x, y, by) {\n var t = this._currentTransform,\n target = t.target,\n lockScalingX = target.lockScalingX,\n lockScalingY = target.lockScalingY,\n lockScalingFlip = target.lockScalingFlip;\n\n if (lockScalingX && lockScalingY) {\n return false;\n }\n\n // Get the constraint point\n var constraintPosition = target.translateToOriginPoint(target.getCenterPoint(), t.originX, t.originY),\n localMouse = target.toLocalPoint(new fabric.Point(x, y), t.originX, t.originY),\n dim = target._getTransformedDimensions(), scaled = false;\n\n this._setLocalMouse(localMouse, t);\n\n // Actually scale the object\n scaled = this._setObjectScale(localMouse, t, lockScalingX, lockScalingY, by, lockScalingFlip, dim);\n\n // Make sure the constraints apply\n target.setPositionByOrigin(constraintPosition, t.originX, t.originY);\n return scaled;\n },\n\n /**\n * @private\n * @return {Boolean} true if the scaling occurred\n */\n _setObjectScale: function(localMouse, transform, lockScalingX, lockScalingY, by, lockScalingFlip, _dim) {\n var target = transform.target, forbidScalingX = false, forbidScalingY = false, scaled = false,\n scaleX = localMouse.x * target.scaleX / _dim.x,\n scaleY = localMouse.y * target.scaleY / _dim.y,\n changeX = target.scaleX !== scaleX,\n changeY = target.scaleY !== scaleY;\n\n transform.newScaleX = scaleX;\n transform.newScaleY = scaleY;\n if (fabric.Textbox && by === 'x' && target instanceof fabric.Textbox) {\n var w = target.width * (localMouse.x / _dim.x);\n if (w >= target.getMinWidth()) {\n scaled = w !== target.width;\n target.set('width', w);\n return scaled;\n }\n return false;\n }\n\n if (lockScalingFlip && scaleX <= 0 && scaleX < target.scaleX) {\n forbidScalingX = true;\n localMouse.x = 0;\n }\n\n if (lockScalingFlip && scaleY <= 0 && scaleY < target.scaleY) {\n forbidScalingY = true;\n localMouse.y = 0;\n }\n\n if (by === 'equally' && !lockScalingX && !lockScalingY) {\n scaled = this._scaleObjectEqually(localMouse, target, transform, _dim);\n }\n else if (!by) {\n forbidScalingX || lockScalingX || (target.set('scaleX', scaleX) && (scaled = scaled || changeX));\n forbidScalingY || lockScalingY || (target.set('scaleY', scaleY) && (scaled = scaled || changeY));\n }\n else if (by === 'x' && !target.get('lockUniScaling')) {\n forbidScalingX || lockScalingX || (target.set('scaleX', scaleX) && (scaled = changeX));\n }\n else if (by === 'y' && !target.get('lockUniScaling')) {\n forbidScalingY || lockScalingY || (target.set('scaleY', scaleY) && (scaled = changeY));\n }\n forbidScalingX || forbidScalingY || this._flipObject(transform, by);\n return scaled;\n },\n\n /**\n * @private\n * @return {Boolean} true if the scaling occurred\n */\n _scaleObjectEqually: function(localMouse, target, transform, _dim) {\n\n var dist = localMouse.y + localMouse.x,\n lastDist = _dim.y * transform.original.scaleY / target.scaleY +\n _dim.x * transform.original.scaleX / target.scaleX,\n scaled, signX = localMouse.x < 0 ? -1 : 1,\n signY = localMouse.y < 0 ? -1 : 1, newScaleX, newScaleY;\n\n // We use transform.scaleX/Y instead of target.scaleX/Y\n // because the object may have a min scale and we'll loose the proportions\n newScaleX = signX * Math.abs(transform.original.scaleX * dist / lastDist);\n newScaleY = signY * Math.abs(transform.original.scaleY * dist / lastDist);\n scaled = newScaleX !== target.scaleX || newScaleY !== target.scaleY;\n target.set('scaleX', newScaleX);\n target.set('scaleY', newScaleY);\n return scaled;\n },\n\n /**\n * @private\n */\n _flipObject: function(transform, by) {\n if (transform.newScaleX < 0 && by !== 'y') {\n if (transform.originX === 'left') {\n transform.originX = 'right';\n }\n else if (transform.originX === 'right') {\n transform.originX = 'left';\n }\n }\n\n if (transform.newScaleY < 0 && by !== 'x') {\n if (transform.originY === 'top') {\n transform.originY = 'bottom';\n }\n else if (transform.originY === 'bottom') {\n transform.originY = 'top';\n }\n }\n },\n\n /**\n * @private\n */\n _setLocalMouse: function(localMouse, t) {\n var target = t.target, zoom = this.getZoom(),\n padding = target.padding / zoom;\n\n if (t.originX === 'right') {\n localMouse.x *= -1;\n }\n else if (t.originX === 'center') {\n localMouse.x *= t.mouseXSign * 2;\n if (localMouse.x < 0) {\n t.mouseXSign = -t.mouseXSign;\n }\n }\n\n if (t.originY === 'bottom') {\n localMouse.y *= -1;\n }\n else if (t.originY === 'center') {\n localMouse.y *= t.mouseYSign * 2;\n if (localMouse.y < 0) {\n t.mouseYSign = -t.mouseYSign;\n }\n }\n\n // adjust the mouse coordinates when dealing with padding\n if (abs(localMouse.x) > padding) {\n if (localMouse.x < 0) {\n localMouse.x += padding;\n }\n else {\n localMouse.x -= padding;\n }\n }\n else { // mouse is within the padding, set to 0\n localMouse.x = 0;\n }\n\n if (abs(localMouse.y) > padding) {\n if (localMouse.y < 0) {\n localMouse.y += padding;\n }\n else {\n localMouse.y -= padding;\n }\n }\n else {\n localMouse.y = 0;\n }\n },\n\n /**\n * Rotates object by invoking its rotate method\n * @private\n * @param {Number} x pointer's x coordinate\n * @param {Number} y pointer's y coordinate\n * @return {Boolean} true if the rotation occurred\n */\n _rotateObject: function (x, y) {\n\n var t = this._currentTransform,\n target = t.target, constraintPosition,\n constraintPosition = target.translateToOriginPoint(target.getCenterPoint(), t.originX, t.originY);\n\n if (target.lockRotation) {\n return false;\n }\n\n var lastAngle = atan2(t.ey - constraintPosition.y, t.ex - constraintPosition.x),\n curAngle = atan2(y - constraintPosition.y, x - constraintPosition.x),\n angle = radiansToDegrees(curAngle - lastAngle + t.theta),\n hasRotated = true;\n\n if (target.snapAngle > 0) {\n var snapAngle = target.snapAngle,\n snapThreshold = target.snapThreshold || snapAngle,\n rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n angle = leftAngleLocked;\n }\n else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n angle = rightAngleLocked;\n }\n }\n\n // normalize angle to positive value\n if (angle < 0) {\n angle = 360 + angle;\n }\n angle %= 360;\n\n if (target.angle === angle) {\n hasRotated = false;\n }\n else {\n // rotation only happen here\n target.angle = angle;\n // Make sure the constraints apply\n target.setPositionByOrigin(constraintPosition, t.originX, t.originY);\n }\n\n return hasRotated;\n },\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor: function (value) {\n this.upperCanvasEl.style.cursor = value;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection: function (ctx) {\n var groupSelector = this._groupSelector,\n left = groupSelector.left,\n top = groupSelector.top,\n aleft = abs(left),\n atop = abs(top);\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n\n ctx.fillRect(\n groupSelector.ex - ((left > 0) ? 0 : -left),\n groupSelector.ey - ((top > 0) ? 0 : -top),\n aleft,\n atop\n );\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n // selection border\n if (this.selectionDashArray.length > 1 && !supportLineDash) {\n\n var px = groupSelector.ex + STROKE_OFFSET - ((left > 0) ? 0 : aleft),\n py = groupSelector.ey + STROKE_OFFSET - ((top > 0) ? 0 : atop);\n\n ctx.beginPath();\n\n fabric.util.drawDashedLine(ctx, px, py, px + aleft, py, this.selectionDashArray);\n fabric.util.drawDashedLine(ctx, px, py + atop - 1, px + aleft, py + atop - 1, this.selectionDashArray);\n fabric.util.drawDashedLine(ctx, px, py, px, py + atop, this.selectionDashArray);\n fabric.util.drawDashedLine(ctx, px + aleft - 1, py, px + aleft - 1, py + atop, this.selectionDashArray);\n\n ctx.closePath();\n ctx.stroke();\n }\n else {\n fabric.Object.prototype._setLineDash.call(this, ctx, this.selectionDashArray);\n ctx.strokeRect(\n groupSelector.ex + STROKE_OFFSET - ((left > 0) ? 0 : aleft),\n groupSelector.ey + STROKE_OFFSET - ((top > 0) ? 0 : atop),\n aleft,\n atop\n );\n }\n },\n\n /**\n * Method that determines what object we are clicking on\n * the skipGroup parameter is for internal use, is needed for shift+click action\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through\n * @return {fabric.Object} the target found\n */\n findTarget: function (e, skipGroup) {\n if (this.skipTargetFind) {\n return;\n }\n\n var ignoreZoom = true,\n pointer = this.getPointer(e, ignoreZoom),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n activeTarget, activeTargetSubs;\n\n // first check current group (if one exists)\n // active group does not check sub targets like normal groups.\n // if active group just exits.\n this.targets = [];\n\n if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n return activeObject;\n }\n // if we hit the corner of an activeObject, let's return that.\n if (aObjects.length === 1 && activeObject._findTargetCorner(pointer)) {\n return activeObject;\n }\n if (aObjects.length === 1 &&\n activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n if (!this.preserveObjectStacking) {\n return activeObject;\n }\n else {\n activeTarget = activeObject;\n activeTargetSubs = this.targets;\n this.targets = [];\n }\n }\n var target = this._searchPossibleTargets(this._objects, pointer);\n if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) {\n target = activeTarget;\n this.targets = activeTargetSubs;\n }\n return target;\n },\n\n /**\n * Checks point is inside the object.\n * @param {Object} [pointer] x,y object of point coordinates we want to check.\n * @param {fabric.Object} obj Object to test against\n * @param {Object} [globalPointer] x,y object of point coordinates relative to canvas used to search per pixel target.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget: function(pointer, obj, globalPointer) {\n if (obj &&\n obj.visible &&\n obj.evented &&\n this.containsPoint(null, obj, pointer)){\n if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) {\n var isTransparent = this.isTargetTransparent(obj, globalPointer.x, globalPointer.y);\n if (!isTransparent) {\n return true;\n }\n }\n else {\n return true;\n }\n }\n },\n\n /**\n * Function used to search inside objects an object that contains pointer in bounding box or that contains pointerOnCanvas when painted\n * @param {Array} [objects] objects array to look into\n * @param {Object} [pointer] x,y object of point coordinates we want to check.\n * @return {fabric.Object} object that contains pointer\n * @private\n */\n _searchPossibleTargets: function(objects, pointer) {\n // Cache all targets where their bounding box contains point.\n var target, i = objects.length, subTarget;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n var objToCheck = objects[i];\n var pointerToUse = objToCheck.group && objToCheck.group.type !== 'activeSelection' ?\n this._normalizePointer(objToCheck.group, pointer) : pointer;\n if (this._checkTarget(pointerToUse, objToCheck, pointer)) {\n target = objects[i];\n if (target.subTargetCheck && target instanceof fabric.Group) {\n subTarget = this._searchPossibleTargets(target._objects, pointer);\n subTarget && this.targets.push(subTarget);\n }\n break;\n }\n }\n return target;\n },\n\n /**\n * Returns pointer coordinates without the effect of the viewport\n * @param {Object} pointer with \"x\" and \"y\" number values\n * @return {Object} object with \"x\" and \"y\" number values\n */\n restorePointerVpt: function(pointer) {\n return fabric.util.transformPoint(\n pointer,\n fabric.util.invertTransform(this.viewportTransform)\n );\n },\n\n /**\n * Returns pointer coordinates relative to canvas.\n * Can return coordinates with or without viewportTransform.\n * ignoreZoom false gives back coordinates that represent\n * the point clicked on canvas element.\n * ignoreZoom true gives back coordinates after being processed\n * by the viewportTransform ( sort of coordinates of what is displayed\n * on the canvas where you are clicking.\n * ignoreZoom true = HTMLElement coordinates relative to top,left\n * ignoreZoom false, default = fabric space coordinates, the same used for shape position\n * To interact with your shapes top and left you want to use ignoreZoom true\n * most of the time, while ignoreZoom false will give you coordinates\n * compatible with the object.oCoords system.\n * of the time.\n * @param {Event} e\n * @param {Boolean} ignoreZoom\n * @return {Object} object with \"x\" and \"y\" number values\n */\n getPointer: function (e, ignoreZoom) {\n // return cached values if we are in the event processing chain\n if (this._absolutePointer && !ignoreZoom) {\n return this._absolutePointer;\n }\n if (this._pointer && ignoreZoom) {\n return this._pointer;\n }\n\n var pointer = getPointer(e),\n upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect(),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0,\n cssScale;\n\n if (!boundsWidth || !boundsHeight ) {\n if ('top' in bounds && 'bottom' in bounds) {\n boundsHeight = Math.abs( bounds.top - bounds.bottom );\n }\n if ('right' in bounds && 'left' in bounds) {\n boundsWidth = Math.abs( bounds.right - bounds.left );\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!ignoreZoom) {\n pointer = this.restorePointerVpt(pointer);\n }\n\n var retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n if (boundsWidth === 0 || boundsHeight === 0) {\n // If bounds are not available (i.e. not visible), do not apply scale.\n cssScale = { width: 1, height: 1 };\n }\n else {\n cssScale = {\n width: upperCanvasEl.width / boundsWidth,\n height: upperCanvasEl.height / boundsHeight\n };\n }\n\n return {\n x: pointer.x * cssScale.width,\n y: pointer.y * cssScale.height\n };\n },\n\n /**\n * @private\n * @throws {CANVAS_INIT_ERROR} If canvas can not be initialized\n */\n _createUpperCanvas: function () {\n var lowerCanvasClass = this.lowerCanvasEl.className.replace(/\\s*lower-canvas\\s*/, ''),\n lowerCanvasEl = this.lowerCanvasEl, upperCanvasEl = this.upperCanvasEl;\n\n // there is no need to create a new upperCanvas element if we have already one.\n if (upperCanvasEl) {\n upperCanvasEl.className = '';\n }\n else {\n upperCanvasEl = this._createCanvasElement();\n this.upperCanvasEl = upperCanvasEl;\n }\n fabric.util.addClass(upperCanvasEl, 'upper-canvas ' + lowerCanvasClass);\n\n this.wrapperEl.appendChild(upperCanvasEl);\n\n this._copyCanvasStyle(lowerCanvasEl, upperCanvasEl);\n this._applyCanvasStyle(upperCanvasEl);\n this.contextTop = upperCanvasEl.getContext('2d');\n },\n\n /**\n * @private\n */\n _createCacheCanvas: function () {\n this.cacheCanvasEl = this._createCanvasElement();\n this.cacheCanvasEl.setAttribute('width', this.width);\n this.cacheCanvasEl.setAttribute('height', this.height);\n this.contextCache = this.cacheCanvasEl.getContext('2d');\n },\n\n /**\n * @private\n */\n _initWrapperElement: function () {\n this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', {\n 'class': this.containerClass\n });\n fabric.util.setStyle(this.wrapperEl, {\n width: this.width + 'px',\n height: this.height + 'px',\n position: 'relative'\n });\n fabric.util.makeElementUnselectable(this.wrapperEl);\n },\n\n /**\n * @private\n * @param {HTMLElement} element canvas element to apply styles on\n */\n _applyCanvasStyle: function (element) {\n var width = this.width || element.width,\n height = this.height || element.height;\n\n fabric.util.setStyle(element, {\n position: 'absolute',\n width: width + 'px',\n height: height + 'px',\n left: 0,\n top: 0,\n 'touch-action': this.allowTouchScrolling ? 'manipulation' : 'none',\n '-ms-touch-action': this.allowTouchScrolling ? 'manipulation' : 'none'\n });\n element.width = width;\n element.height = height;\n fabric.util.makeElementUnselectable(element);\n },\n\n /**\n * Copy the entire inline style from one element (fromEl) to another (toEl)\n * @private\n * @param {Element} fromEl Element style is copied from\n * @param {Element} toEl Element copied style is applied to\n */\n _copyCanvasStyle: function (fromEl, toEl) {\n toEl.style.cssText = fromEl.style.cssText;\n },\n\n /**\n * Returns context of canvas where object selection is drawn\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext: function() {\n return this.contextTop;\n },\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement: function () {\n return this.upperCanvasEl;\n },\n\n /**\n * Returns currently active object\n * @return {fabric.Object} active object\n */\n getActiveObject: function () {\n return this._activeObject;\n },\n\n /**\n * Returns an array with the current selected objects\n * @return {fabric.Object} active object\n */\n getActiveObjects: function () {\n var active = this._activeObject;\n if (active) {\n if (active.type === 'activeSelection' && active._objects) {\n return active._objects.slice(0);\n }\n else {\n return [active];\n }\n }\n return [];\n },\n\n /**\n * @private\n * @param {fabric.Object} obj Object that was removed\n */\n _onObjectRemoved: function(obj) {\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { target: obj });\n this._discardActiveObject();\n this.fire('selection:cleared', { target: obj });\n obj.fire('deselected');\n }\n if (obj === this._hoveredTarget){\n this._hoveredTarget = null;\n this._hoveredTargets = [];\n }\n this.callSuper('_onObjectRemoved', obj);\n },\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {fabric.Object} obj old activeObject\n */\n _fireSelectionEvents: function(oldObjects, e) {\n var somethingChanged = false, objects = this.getActiveObjects(),\n added = [], removed = [], opt = { e: e };\n oldObjects.forEach(function(oldObject) {\n if (objects.indexOf(oldObject) === -1) {\n somethingChanged = true;\n oldObject.fire('deselected', opt);\n removed.push(oldObject);\n }\n });\n objects.forEach(function(object) {\n if (oldObjects.indexOf(object) === -1) {\n somethingChanged = true;\n object.fire('selected', opt);\n added.push(object);\n }\n });\n if (oldObjects.length > 0 && objects.length > 0) {\n opt.selected = added;\n opt.deselected = removed;\n // added for backward compatibility\n opt.updated = added[0] || removed[0];\n opt.target = this._activeObject;\n somethingChanged && this.fire('selection:updated', opt);\n }\n else if (objects.length > 0) {\n // deprecated event\n if (objects.length === 1) {\n opt.target = added[0];\n this.fire('object:selected', opt);\n }\n opt.selected = added;\n // added for backward compatibility\n opt.target = this._activeObject;\n this.fire('selection:created', opt);\n }\n else if (oldObjects.length > 0) {\n opt.deselected = removed;\n this.fire('selection:cleared', opt);\n }\n },\n\n /**\n * Sets given object as the only active object on canvas\n * @param {fabric.Object} object Object to set as an active one\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n setActiveObject: function (object, e) {\n var currentActives = this.getActiveObjects();\n this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return this;\n },\n\n /**\n * @private\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the selection happened\n */\n _setActiveObject: function(object, e) {\n if (this._activeObject === object) {\n return false;\n }\n if (!this._discardActiveObject(e, object)) {\n return false;\n }\n if (object.onSelect({ e: e })) {\n return false;\n }\n this._activeObject = object;\n return true;\n },\n\n /**\n * @private\n */\n _discardActiveObject: function(e, object) {\n var obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e: e, object: object })) {\n return false;\n }\n this._activeObject = null;\n }\n return true;\n },\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n discardActiveObject: function (e) {\n var currentActives = this.getActiveObjects(), activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', { target: activeObject, e: e });\n }\n this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return this;\n },\n\n /**\n * Clears a canvas element and removes all event listeners\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n dispose: function () {\n var wrapper = this.wrapperEl;\n this.removeListeners();\n wrapper.removeChild(this.upperCanvasEl);\n wrapper.removeChild(this.lowerCanvasEl);\n this.contextCache = null;\n this.contextTop = null;\n ['upperCanvasEl', 'cacheCanvasEl'].forEach((function(element) {\n fabric.util.cleanUpJsdomNode(this[element]);\n this[element] = undefined;\n }).bind(this));\n if (wrapper.parentNode) {\n wrapper.parentNode.replaceChild(this.lowerCanvasEl, this.wrapperEl);\n }\n delete this.wrapperEl;\n fabric.StaticCanvas.prototype.dispose.call(this);\n return this;\n },\n\n /**\n * Clears all contexts (background, main, top) of an instance\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n clear: function () {\n // this.discardActiveGroup();\n this.discardActiveObject();\n this.clearContext(this.contextTop);\n return this.callSuper('clear');\n },\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls: function(ctx) {\n var activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n },\n\n /**\n * @private\n */\n _toObject: function(instance, methodName, propertiesToInclude) {\n //If the object is part of the current selection group, it should\n //be transformed appropriately\n //i.e. it should be serialised as it would appear if the selection group\n //were to be destroyed.\n var originalProperties = this._realizeGroupTransformOnObject(instance),\n object = this.callSuper('_toObject', instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n this._unwindGroupTransformOnObject(instance, originalProperties);\n return object;\n },\n\n /**\n * Realises an object's group transformation on it\n * @private\n * @param {fabric.Object} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n _realizeGroupTransformOnObject: function(instance) {\n if (instance.group && instance.group.type === 'activeSelection' && this._activeObject === instance.group) {\n var layoutProps = ['angle', 'flipX', 'flipY', 'left', 'scaleX', 'scaleY', 'skewX', 'skewY', 'top'];\n //Copy all the positionally relevant properties across now\n var originalValues = {};\n layoutProps.forEach(function(prop) {\n originalValues[prop] = instance[prop];\n });\n this._activeObject.realizeTransform(instance);\n return originalValues;\n }\n else {\n return null;\n }\n },\n\n /**\n * Restores the changed properties of instance\n * @private\n * @param {fabric.Object} [instance] the object to un-transform (gets mutated)\n * @param {Object} [originalValues] the original values of instance, as returned by _realizeGroupTransformOnObject\n */\n _unwindGroupTransformOnObject: function(instance, originalValues) {\n if (originalValues) {\n instance.set(originalValues);\n }\n },\n\n /**\n * @private\n */\n _setSVGObject: function(markup, instance, reviver) {\n //If the object is in a selection group, simulate what would happen to that\n //object when the group is deselected\n var originalProperties = this._realizeGroupTransformOnObject(instance);\n this.callSuper('_setSVGObject', markup, instance, reviver);\n this._unwindGroupTransformOnObject(instance, originalProperties);\n },\n\n setViewportTransform: function (vpt) {\n if (this.renderOnAddRemove && this._activeObject && this._activeObject.isEditing) {\n this._activeObject.clearContextTop();\n }\n fabric.StaticCanvas.prototype.setViewportTransform.call(this, vpt);\n }\n });\n\n // copying static properties manually to work around Opera's bug,\n // where \"prototype\" property is enumerable and overrides existing prototype\n for (var prop in fabric.StaticCanvas) {\n if (prop !== 'prototype') {\n fabric.Canvas[prop] = fabric.StaticCanvas[prop];\n }\n }\n})();\n\n\n(function() {\n\n var cursorOffset = {\n mt: 0, // n\n tr: 1, // ne\n mr: 2, // e\n br: 3, // se\n mb: 4, // s\n bl: 5, // sw\n ml: 6, // w\n tl: 7 // nw\n },\n addListener = fabric.util.addListener,\n removeListener = fabric.util.removeListener,\n RIGHT_CLICK = 3, MIDDLE_CLICK = 2, LEFT_CLICK = 1,\n addEventOptions = { passive: false };\n\n function checkClick(e, value) {\n return e.button && (e.button === value - 1);\n }\n\n fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * Map of cursor style values for each of the object controls\n * @private\n */\n cursorMap: [\n 'n-resize',\n 'ne-resize',\n 'e-resize',\n 'se-resize',\n 's-resize',\n 'sw-resize',\n 'w-resize',\n 'nw-resize'\n ],\n\n /**\n * Contains the id of the touch event that owns the fabric transform\n * @type Number\n * @private\n */\n mainTouchId: null,\n\n /**\n * Adds mouse listeners to canvas\n * @private\n */\n _initEventListeners: function () {\n // in case we initialized the class twice. This should not happen normally\n // but in some kind of applications where the canvas element may be changed\n // this is a workaround to having double listeners.\n this.removeListeners();\n this._bindEvents();\n this.addOrRemove(addListener, 'add');\n },\n\n /**\n * return an event prefix pointer or mouse.\n * @private\n */\n _getEventPrefix: function () {\n return this.enablePointerEvents ? 'pointer' : 'mouse';\n },\n\n addOrRemove: function(functor, eventjsFunctor) {\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n functor(fabric.window, 'resize', this._onResize);\n functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n functor(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n functor(canvasElement, eventTypePrefix + 'out', this._onMouseOut);\n functor(canvasElement, eventTypePrefix + 'enter', this._onMouseEnter);\n functor(canvasElement, 'wheel', this._onMouseWheel);\n functor(canvasElement, 'contextmenu', this._onContextMenu);\n functor(canvasElement, 'dblclick', this._onDoubleClick);\n functor(canvasElement, 'dragover', this._onDragOver);\n functor(canvasElement, 'dragenter', this._onDragEnter);\n functor(canvasElement, 'dragleave', this._onDragLeave);\n functor(canvasElement, 'drop', this._onDrop);\n if (!this.enablePointerEvents) {\n functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n }\n if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n eventjs[eventjsFunctor](canvasElement, 'orientation', this._onOrientationChange);\n eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n }\n },\n\n /**\n * Removes all event listeners\n */\n removeListeners: function() {\n this.addOrRemove(removeListener, 'remove');\n // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n var eventTypePrefix = this._getEventPrefix();\n removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n },\n\n /**\n * @private\n */\n _bindEvents: function() {\n if (this.eventsBound) {\n // for any reason we pass here twice we do not want to bind events twice.\n return;\n }\n this._onMouseDown = this._onMouseDown.bind(this);\n this._onTouchStart = this._onTouchStart.bind(this);\n this._onMouseMove = this._onMouseMove.bind(this);\n this._onMouseUp = this._onMouseUp.bind(this);\n this._onTouchEnd = this._onTouchEnd.bind(this);\n this._onResize = this._onResize.bind(this);\n this._onGesture = this._onGesture.bind(this);\n this._onDrag = this._onDrag.bind(this);\n this._onShake = this._onShake.bind(this);\n this._onLongPress = this._onLongPress.bind(this);\n this._onOrientationChange = this._onOrientationChange.bind(this);\n this._onMouseWheel = this._onMouseWheel.bind(this);\n this._onMouseOut = this._onMouseOut.bind(this);\n this._onMouseEnter = this._onMouseEnter.bind(this);\n this._onContextMenu = this._onContextMenu.bind(this);\n this._onDoubleClick = this._onDoubleClick.bind(this);\n this._onDragOver = this._onDragOver.bind(this);\n this._onDragEnter = this._simpleEventHandler.bind(this, 'dragenter');\n this._onDragLeave = this._simpleEventHandler.bind(this, 'dragleave');\n this._onDrop = this._simpleEventHandler.bind(this, 'drop');\n this.eventsBound = true;\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js gesture\n * @param {Event} [self] Inner Event object\n */\n _onGesture: function(e, self) {\n this.__onTransformGesture && this.__onTransformGesture(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js drag\n * @param {Event} [self] Inner Event object\n */\n _onDrag: function(e, self) {\n this.__onDrag && this.__onDrag(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on wheel event\n */\n _onMouseWheel: function(e) {\n this.__onMouseWheel(e);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseOut: function(e) {\n var target = this._hoveredTarget;\n this.fire('mouse:out', { target: target, e: e });\n this._hoveredTarget = null;\n target && target.fire('mouseout', { e: e });\n\n var _this = this;\n this._hoveredTargets.forEach(function(_target){\n _this.fire('mouse:out', { target: target, e: e });\n _target && target.fire('mouseout', { e: e });\n });\n this._hoveredTargets = [];\n\n if (this._iTextInstances) {\n this._iTextInstances.forEach(function(obj) {\n if (obj.isEditing) {\n obj.hiddenTextarea.focus();\n }\n });\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseenter\n */\n _onMouseEnter: function(e) {\n // This find target and consequent 'mouse:over' is used to\n // clear old instances on hovered target.\n // calling findTarget has the side effect of killing target.__corner.\n // as a short term fix we are not firing this if we are currently transforming.\n // as a long term fix we need to separate the action of finding a target with the\n // side effects we added to it.\n if (!this.currentTransform && !this.findTarget(e)) {\n this.fire('mouse:over', { target: null, e: e });\n this._hoveredTarget = null;\n this._hoveredTargets = [];\n }\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js orientation change\n * @param {Event} [self] Inner Event object\n */\n _onOrientationChange: function(e, self) {\n this.__onOrientationChange && this.__onOrientationChange(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n * @param {Event} [self] Inner Event object\n */\n _onShake: function(e, self) {\n this.__onShake && this.__onShake(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n * @param {Event} [self] Inner Event object\n */\n _onLongPress: function(e, self) {\n this.__onLongPress && this.__onLongPress(e, self);\n },\n\n /**\n * prevent default to allow drop event to be fired\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n _onDragOver: function(e) {\n e.preventDefault();\n var target = this._simpleEventHandler('dragover', e);\n this._fireEnterLeaveEvents(target, e);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onContextMenu: function (e) {\n if (this.stopContextMenu) {\n e.stopPropagation();\n e.preventDefault();\n }\n return false;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onDoubleClick: function (e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'dblclick');\n this._resetTransformEventData(e);\n },\n\n /**\n * Return a the id of an event.\n * returns either the pointerId or the identifier or 0 for the mouse event\n * @private\n * @param {Event} evt Event object\n */\n getPointerId: function(evt) {\n var changedTouches = evt.changedTouches;\n\n if (changedTouches) {\n return changedTouches[0] && changedTouches[0].identifier;\n }\n\n if (this.enablePointerEvents) {\n return evt.pointerId;\n }\n\n return -1;\n },\n\n /**\n * Determines if an event has the id of the event that is considered main\n * @private\n * @param {evt} event Event object\n */\n _isMainEvent: function(evt) {\n if (evt.isPrimary === true) {\n return true;\n }\n if (evt.isPrimary === false) {\n return false;\n }\n if (evt.type === 'touchend' && evt.touches.length === 0) {\n return true;\n }\n if (evt.changedTouches) {\n return evt.changedTouches[0].identifier === this.mainTouchId;\n }\n return true;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchStart: function(e) {\n e.preventDefault();\n if (this.mainTouchId === null) {\n this.mainTouchId = this.getPointerId(e);\n }\n this.__onMouseDown(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n addListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n addListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n // Unbind mousedown to prevent double triggers from touch devices\n removeListener(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDown: function (e) {\n this.__onMouseDown(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n removeListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n addListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n addListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchEnd: function(e) {\n if (e.touches.length > 0) {\n // if there are still touches stop here\n return;\n }\n this.__onMouseUp(e);\n this._resetTransformEventData();\n this.mainTouchId = null;\n var eventTypePrefix = this._getEventPrefix();\n removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n var _this = this;\n if (this._willAddMouseDown) {\n clearTimeout(this._willAddMouseDown);\n }\n this._willAddMouseDown = setTimeout(function() {\n // Wait 400ms before rebinding mousedown to prevent double triggers\n // from touch devices\n addListener(_this.upperCanvasEl, eventTypePrefix + 'down', _this._onMouseDown);\n _this._willAddMouseDown = 0;\n }, 400);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUp: function (e) {\n this.__onMouseUp(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n if (this._isMainEvent(e)) {\n removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n addListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMove: function (e) {\n !this.allowTouchScrolling && e.preventDefault && e.preventDefault();\n this.__onMouseMove(e);\n },\n\n /**\n * @private\n */\n _onResize: function () {\n this.calcOffset();\n },\n\n /**\n * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n * @private\n * @param {Object} target\n */\n _shouldRender: function(target) {\n var activeObject = this._activeObject;\n\n if (\n !!activeObject !== !!target ||\n (activeObject && target && (activeObject !== target))\n ) {\n // this covers: switch of target, from target to no target, selection of target\n // multiSelection with key and mouse\n return true;\n }\n else if (activeObject && activeObject.isEditing) {\n // if we mouse up/down over a editing textbox a cursor change,\n // there is no need to re render\n return false;\n }\n return false;\n },\n\n /**\n * Method that defines the actions when mouse is released on canvas.\n * The method resets the currentTransform parameters, store the image corner\n * position in the image object and render the canvas on top.\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseUp: function (e) {\n var target, transform = this._currentTransform,\n groupSelector = this._groupSelector, shouldRender = false,\n isClick = (!groupSelector || (groupSelector.left === 0 && groupSelector.top === 0));\n this._cacheTransformEventData(e);\n target = this._target;\n this._handleEvent(e, 'up:before');\n // if right/middle click just fire events and return\n // target undefined will make the _handleEvent search the target\n if (checkClick(e, RIGHT_CLICK)) {\n if (this.fireRightClick) {\n this._handleEvent(e, 'up', RIGHT_CLICK, isClick);\n }\n return;\n }\n\n if (checkClick(e, MIDDLE_CLICK)) {\n if (this.fireMiddleClick) {\n this._handleEvent(e, 'up', MIDDLE_CLICK, isClick);\n }\n this._resetTransformEventData();\n return;\n }\n\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this._onMouseUpInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n if (transform) {\n this._finalizeCurrentTransform(e);\n shouldRender = transform.actionPerformed;\n }\n\n if (!isClick) {\n this._maybeGroupObjects(e);\n shouldRender || (shouldRender = this._shouldRender(target));\n }\n if (target) {\n target.isMoving = false;\n }\n this._setCursorFromEvent(e, target);\n this._handleEvent(e, 'up', LEFT_CLICK, isClick);\n this._groupSelector = null;\n this._currentTransform = null;\n // reset the target information about which corner is selected\n target && (target.__corner = 0);\n if (shouldRender) {\n this.requestRenderAll();\n }\n else if (!isClick) {\n this.renderTop();\n }\n },\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {Event} e event from mouse\n * @param {String} eventType event to fire (up, down or move)\n * @return {Fabric.Object} target return the the target found, for internal reasons.\n */\n _simpleEventHandler: function(eventType, e) {\n var target = this.findTarget(e),\n targets = this.targets,\n options = {\n e: e,\n target: target,\n subTargets: targets,\n };\n this.fire(eventType, options);\n target && target.fire(eventType, options);\n if (!targets) {\n return target;\n }\n for (var i = 0; i < targets.length; i++) {\n targets[i].fire(eventType, options);\n }\n return target;\n },\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {Event} e event from mouse\n * @param {String} eventType event to fire (up, down or move)\n * @param {fabric.Object} targetObj receiving event\n * @param {Number} [button] button used in the event 1 = left, 2 = middle, 3 = right\n * @param {Boolean} isClick for left button only, indicates that the mouse up happened without move.\n */\n _handleEvent: function(e, eventType, button, isClick) {\n var target = this._target,\n targets = this.targets || [],\n options = {\n e: e,\n target: target,\n subTargets: targets,\n button: button || LEFT_CLICK,\n isClick: isClick || false,\n pointer: this._pointer,\n absolutePointer: this._absolutePointer,\n transform: this._currentTransform\n };\n this.fire('mouse:' + eventType, options);\n target && target.fire('mouse' + eventType, options);\n for (var i = 0; i < targets.length; i++) {\n targets[i].fire('mouse' + eventType, options);\n }\n },\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform: function(e) {\n\n var transform = this._currentTransform,\n target = transform.target,\n eventName,\n options = {\n e: e,\n target: target,\n transform: transform,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed || (this.stateful && target.hasStateChanged())) {\n if (transform.actionPerformed) {\n eventName = this._addEventOptions(options, transform);\n this._fire(eventName, options);\n }\n this._fire('modified', options);\n }\n },\n\n /**\n * Mutate option object in order to add by property and give back the event name.\n * @private\n * @param {Object} options to mutate\n * @param {Object} transform to inspect action from\n */\n _addEventOptions: function(options, transform) {\n // we can probably add more details at low cost\n // scale change, rotation changes, translation changes\n var eventName, by;\n switch (transform.action) {\n case 'scaleX':\n eventName = 'scaled';\n by = 'x';\n break;\n case 'scaleY':\n eventName = 'scaled';\n by = 'y';\n break;\n case 'skewX':\n eventName = 'skewed';\n by = 'x';\n break;\n case 'skewY':\n eventName = 'skewed';\n by = 'y';\n break;\n case 'scale':\n eventName = 'scaled';\n by = 'equally';\n break;\n case 'rotate':\n eventName = 'rotated';\n break;\n case 'drag':\n eventName = 'moved';\n break;\n }\n options.by = by;\n return eventName;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDownInDrawingMode: function(e) {\n this._isCurrentlyDrawing = true;\n if (this.getActiveObject()) {\n this.discardActiveObject(e).requestRenderAll();\n }\n if (this.clipTo) {\n fabric.util.clipContext(this, this.contextTop);\n }\n var pointer = this.getPointer(e);\n this.freeDrawingBrush.onMouseDown(pointer, { e: e, pointer: pointer });\n this._handleEvent(e, 'down');\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMoveInDrawingMode: function(e) {\n if (this._isCurrentlyDrawing) {\n var pointer = this.getPointer(e);\n this.freeDrawingBrush.onMouseMove(pointer, { e: e, pointer: pointer });\n }\n this.setCursor(this.freeDrawingCursor);\n this._handleEvent(e, 'move');\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUpInDrawingMode: function(e) {\n if (this.clipTo) {\n this.contextTop.restore();\n }\n var pointer = this.getPointer(e);\n this._isCurrentlyDrawing = this.freeDrawingBrush.onMouseUp({ e: e, pointer: pointer });\n this._handleEvent(e, 'up');\n },\n\n /**\n * Method that defines the actions when mouse is clicked on canvas.\n * The method inits the currentTransform parameters and renders all the\n * canvas so the current image can be placed on the top canvas and the rest\n * in on the container one.\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n __onMouseDown: function (e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'down:before');\n var target = this._target;\n // if right click just fire events\n if (checkClick(e, RIGHT_CLICK)) {\n if (this.fireRightClick) {\n this._handleEvent(e, 'down', RIGHT_CLICK);\n }\n return;\n }\n\n if (checkClick(e, MIDDLE_CLICK)) {\n if (this.fireMiddleClick) {\n this._handleEvent(e, 'down', MIDDLE_CLICK);\n }\n return;\n }\n\n if (this.isDrawingMode) {\n this._onMouseDownInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n // ignore if some object is being transformed at this moment\n if (this._currentTransform) {\n return;\n }\n\n var pointer = this._pointer;\n // save pointer for check in __onMouseUp event\n this._previousPointer = pointer;\n var shouldRender = this._shouldRender(target),\n shouldGroup = this._shouldGroup(e, target);\n if (this._shouldClearSelection(e, target)) {\n this.discardActiveObject(e);\n }\n else if (shouldGroup) {\n this._handleGrouping(e, target);\n target = this._activeObject;\n }\n\n if (this.selection && (!target ||\n (!target.selectable && !target.isEditing && target !== this._activeObject))) {\n this._groupSelector = {\n ex: pointer.x,\n ey: pointer.y,\n top: 0,\n left: 0\n };\n }\n\n if (target) {\n var alreadySelected = target === this._activeObject;\n if (target.selectable) {\n this.setActiveObject(target, e);\n }\n if (target === this._activeObject && (target.__corner || !shouldGroup)) {\n this._setupCurrentTransform(e, target, alreadySelected);\n }\n }\n this._handleEvent(e, 'down');\n // we must renderAll so that we update the visuals\n (shouldRender || shouldGroup) && this.requestRenderAll();\n },\n\n /**\n * reset cache form common information needed during event processing\n * @private\n */\n _resetTransformEventData: function() {\n this._target = null;\n this._pointer = null;\n this._absolutePointer = null;\n },\n\n /**\n * Cache common information needed during event processing\n * @private\n * @param {Event} e Event object fired on event\n */\n _cacheTransformEventData: function(e) {\n // reset in order to avoid stale caching\n this._resetTransformEventData();\n this._pointer = this.getPointer(e, true);\n this._absolutePointer = this.restorePointerVpt(this._pointer);\n this._target = this._currentTransform ? this._currentTransform.target : this.findTarget(e) || null;\n },\n\n /**\n * @private\n */\n _beforeTransform: function(e) {\n var t = this._currentTransform;\n this.stateful && t.target.saveState();\n this.fire('before:transform', {\n e: e,\n transform: t,\n });\n // determine if it's a drag or rotate case\n if (t.corner) {\n this.onBeforeScaleRotate(t.target);\n }\n },\n\n /**\n * Method that defines the actions when mouse is hovering the canvas.\n * The currentTransform parameter will define whether the user is rotating/scaling/translating\n * an image or neither of them (only hovering). A group selection is also possible and would cancel\n * all any other type of action.\n * In case of an image transformation only the top canvas will be rendered.\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n __onMouseMove: function (e) {\n this._handleEvent(e, 'move:before');\n this._cacheTransformEventData(e);\n var target, pointer;\n\n if (this.isDrawingMode) {\n this._onMouseMoveInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n var groupSelector = this._groupSelector;\n\n // We initially clicked in an empty area, so we draw a box for multiple selection\n if (groupSelector) {\n pointer = this._pointer;\n\n groupSelector.left = pointer.x - groupSelector.ex;\n groupSelector.top = pointer.y - groupSelector.ey;\n\n this.renderTop();\n }\n else if (!this._currentTransform) {\n target = this.findTarget(e) || null;\n this._setCursorFromEvent(e, target);\n this._fireOverOutEvents(target, e);\n }\n else {\n this._transformObject(e);\n }\n this._handleEvent(e, 'move');\n this._resetTransformEventData();\n },\n\n /**\n * Manage the mouseout, mouseover events for the fabric object on the canvas\n * @param {Fabric.Object} target the target where the target from the mousemove event\n * @param {Event} e Event object fired on mousemove\n * @private\n */\n _fireOverOutEvents: function(target, e) {\n var _hoveredTarget = this._hoveredTarget,\n _hoveredTargets = this._hoveredTargets, targets = this.targets,\n length = Math.max(_hoveredTargets.length, targets.length);\n\n this.fireSyntheticInOutEvents(target, e, {\n oldTarget: _hoveredTarget,\n evtOut: 'mouseout',\n canvasEvtOut: 'mouse:out',\n evtIn: 'mouseover',\n canvasEvtIn: 'mouse:over',\n });\n for (var i = 0; i < length; i++){\n this.fireSyntheticInOutEvents(targets[i], e, {\n oldTarget: _hoveredTargets[i],\n evtOut: 'mouseout',\n evtIn: 'mouseover',\n });\n }\n this._hoveredTarget = target;\n this._hoveredTargets = this.targets.concat();\n },\n\n /**\n * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the onDrag event\n * @param {Event} e Event object fired on ondrag\n * @private\n */\n _fireEnterLeaveEvents: function(target, e) {\n var _draggedoverTarget = this._draggedoverTarget,\n _hoveredTargets = this._hoveredTargets, targets = this.targets,\n length = Math.max(_hoveredTargets.length, targets.length);\n\n this.fireSyntheticInOutEvents(target, e, {\n oldTarget: _draggedoverTarget,\n evtOut: 'dragleave',\n evtIn: 'dragenter',\n });\n for (var i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents(targets[i], e, {\n oldTarget: _hoveredTargets[i],\n evtOut: 'dragleave',\n evtIn: 'dragenter',\n });\n }\n this._draggedoverTarget = target;\n },\n\n /**\n * Manage the synthetic in/out events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the supported events\n * @param {Event} e Event object fired\n * @param {Object} config configuration for the function to work\n * @param {String} config.targetName property on the canvas where the old target is stored\n * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n * @param {String} config.evtOut name of the event to fire for out\n * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n * @param {String} config.evtIn name of the event to fire for in\n * @private\n */\n fireSyntheticInOutEvents: function(target, e, config) {\n var inOpt, outOpt, oldTarget = config.oldTarget, outFires, inFires,\n targetChanged = oldTarget !== target, canvasEvtIn = config.canvasEvtIn, canvasEvtOut = config.canvasEvtOut;\n if (targetChanged) {\n inOpt = { e: e, target: target, previousTarget: oldTarget };\n outOpt = { e: e, target: oldTarget, nextTarget: target };\n }\n inFires = target && targetChanged;\n outFires = oldTarget && targetChanged;\n if (outFires) {\n canvasEvtOut && this.fire(canvasEvtOut, outOpt);\n oldTarget.fire(config.evtOut, outOpt);\n }\n if (inFires) {\n canvasEvtIn && this.fire(canvasEvtIn, inOpt);\n target.fire(config.evtIn, inOpt);\n }\n },\n\n /**\n * Method that defines actions when an Event Mouse Wheel\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseWheel: function(e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'wheel');\n this._resetTransformEventData();\n },\n\n /**\n * @private\n * @param {Event} e Event fired on mousemove\n */\n _transformObject: function(e) {\n var pointer = this.getPointer(e),\n transform = this._currentTransform;\n\n transform.reset = false;\n transform.target.isMoving = true;\n transform.shiftKey = e.shiftKey;\n transform.altKey = e[this.centeredKey];\n\n this._beforeScaleTransform(e, transform);\n this._performTransformAction(e, transform, pointer);\n\n transform.actionPerformed && this.requestRenderAll();\n },\n\n /**\n * @private\n */\n _performTransformAction: function(e, transform, pointer) {\n var x = pointer.x,\n y = pointer.y,\n action = transform.action,\n actionPerformed = false,\n options = {\n target: transform.target,\n e: e,\n transform: transform,\n pointer: pointer\n };\n\n if (action === 'rotate') {\n (actionPerformed = this._rotateObject(x, y)) && this._fire('rotating', options);\n }\n else if (action === 'scale') {\n (actionPerformed = this._onScale(e, transform, x, y)) && this._fire('scaling', options);\n }\n else if (action === 'scaleX') {\n (actionPerformed = this._scaleObject(x, y, 'x')) && this._fire('scaling', options);\n }\n else if (action === 'scaleY') {\n (actionPerformed = this._scaleObject(x, y, 'y')) && this._fire('scaling', options);\n }\n else if (action === 'skewX') {\n (actionPerformed = this._skewObject(x, y, 'x')) && this._fire('skewing', options);\n }\n else if (action === 'skewY') {\n (actionPerformed = this._skewObject(x, y, 'y')) && this._fire('skewing', options);\n }\n else {\n actionPerformed = this._translateObject(x, y);\n if (actionPerformed) {\n this._fire('moving', options);\n this.setCursor(options.target.moveCursor || this.moveCursor);\n }\n }\n transform.actionPerformed = transform.actionPerformed || actionPerformed;\n },\n\n /**\n * @private\n */\n _fire: function(eventName, options) {\n this.fire('object:' + eventName, options);\n options.target.fire(eventName, options);\n },\n\n /**\n * @private\n */\n _beforeScaleTransform: function(e, transform) {\n if (transform.action === 'scale' || transform.action === 'scaleX' || transform.action === 'scaleY') {\n var centerTransform = this._shouldCenterTransform(transform.target);\n\n // Switch from a normal resize to center-based\n if ((centerTransform && (transform.originX !== 'center' || transform.originY !== 'center')) ||\n // Switch from center-based resize to normal one\n (!centerTransform && transform.originX === 'center' && transform.originY === 'center')\n ) {\n this._resetCurrentTransform();\n transform.reset = true;\n }\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {Object} transform current transform\n * @param {Number} x mouse position x from origin\n * @param {Number} y mouse position y from origin\n * @return {Boolean} true if the scaling occurred\n */\n _onScale: function(e, transform, x, y) {\n if (this._isUniscalePossible(e, transform.target)) {\n transform.currentAction = 'scale';\n return this._scaleObject(x, y);\n }\n else {\n // Switch from a normal resize to proportional\n if (!transform.reset && transform.currentAction === 'scale') {\n this._resetCurrentTransform();\n }\n\n transform.currentAction = 'scaleEqually';\n return this._scaleObject(x, y, 'equally');\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target current target\n * @return {Boolean} true if unproportional scaling is possible\n */\n _isUniscalePossible: function(e, target) {\n return (e[this.uniScaleKey] || this.uniScaleTransform) && !target.get('lockUniScaling');\n },\n\n /**\n * Sets the cursor depending on where the canvas is being hovered.\n * Note: very buggy in Opera\n * @param {Event} e Event object\n * @param {Object} target Object that the mouse is hovering, if so.\n */\n _setCursorFromEvent: function (e, target) {\n if (!target) {\n this.setCursor(this.defaultCursor);\n return false;\n }\n var hoverCursor = target.hoverCursor || this.hoverCursor,\n activeSelection = this._activeObject && this._activeObject.type === 'activeSelection' ?\n this._activeObject : null,\n // only show proper corner when group selection is not active\n corner = (!activeSelection || !activeSelection.contains(target))\n && target._findTargetCorner(this.getPointer(e, true));\n\n if (!corner) {\n if (target.subTargetCheck){\n // hoverCursor should come from top-most subTarget,\n // so we walk the array backwards\n this.targets.concat().reverse().map(function(_target){\n hoverCursor = _target.hoverCursor || hoverCursor;\n });\n }\n this.setCursor(hoverCursor);\n }\n else {\n this.setCursor(this.getCornerCursor(corner, target, e));\n }\n },\n\n /**\n * @private\n */\n getCornerCursor: function(corner, target, e) {\n if (this.actionIsDisabled(corner, target, e)) {\n return this.notAllowedCursor;\n }\n else if (corner in cursorOffset) {\n return this._getRotatedCornerCursor(corner, target, e);\n }\n else if (corner === 'mtr' && target.hasRotatingPoint) {\n return this.rotationCursor;\n }\n else {\n return this.defaultCursor;\n }\n },\n\n actionIsDisabled: function(corner, target, e) {\n if (corner === 'mt' || corner === 'mb') {\n return e[this.altActionKey] ? target.lockSkewingX : target.lockScalingY;\n }\n else if (corner === 'ml' || corner === 'mr') {\n return e[this.altActionKey] ? target.lockSkewingY : target.lockScalingX;\n }\n else if (corner === 'mtr') {\n return target.lockRotation;\n }\n else {\n return this._isUniscalePossible(e, target) ?\n target.lockScalingX && target.lockScalingY : target.lockScalingX || target.lockScalingY;\n }\n },\n\n /**\n * @private\n */\n _getRotatedCornerCursor: function(corner, target, e) {\n var n = Math.round((target.angle % 360) / 45);\n\n if (n < 0) {\n n += 8; // full circle ahead\n }\n n += cursorOffset[corner];\n if (e[this.altActionKey] && cursorOffset[corner] % 2 === 0) {\n //if we are holding shift and we are on a mx corner...\n n += 2;\n }\n // normalize n to be from 0 to 7\n n %= 8;\n\n return this.cursorMap[n];\n }\n });\n})();\n\n\n(function() {\n\n var min = Math.min,\n max = Math.max;\n\n fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n * @return {Boolean}\n */\n _shouldGroup: function(e, target) {\n var activeObject = this._activeObject;\n return activeObject && this._isSelectionKeyPressed(e) && target && target.selectable && this.selection &&\n (activeObject !== target || activeObject.type === 'activeSelection') && !target.onSelect({ e: e });\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _handleGrouping: function (e, target) {\n var activeObject = this._activeObject;\n // avoid multi select when shift click on a corner\n if (activeObject.__corner) {\n return;\n }\n if (target === activeObject) {\n // if it's a group, find target again, using activeGroup objects\n target = this.findTarget(e, true);\n // if even object is not found or we are on activeObjectCorner, bail out\n if (!target || !target.selectable) {\n return;\n }\n }\n if (activeObject && activeObject.type === 'activeSelection') {\n this._updateActiveSelection(target, e);\n }\n else {\n this._createActiveSelection(target, e);\n }\n },\n\n /**\n * @private\n */\n _updateActiveSelection: function(target, e) {\n var activeSelection = this._activeObject,\n currentActiveObjects = activeSelection._objects.slice(0);\n if (activeSelection.contains(target)) {\n activeSelection.removeWithUpdate(target);\n this._hoveredTarget = target;\n this._hoveredTargets = this.targets.concat();\n if (activeSelection.size() === 1) {\n // activate last remaining object\n this._setActiveObject(activeSelection.item(0), e);\n }\n }\n else {\n activeSelection.addWithUpdate(target);\n this._hoveredTarget = activeSelection;\n this._hoveredTargets = this.targets.concat();\n }\n this._fireSelectionEvents(currentActiveObjects, e);\n },\n\n /**\n * @private\n */\n _createActiveSelection: function(target, e) {\n var currentActives = this.getActiveObjects(), group = this._createGroup(target);\n this._hoveredTarget = group;\n // ISSUE 4115: should we consider subTargets here?\n // this._hoveredTargets = [];\n // this._hoveredTargets = this.targets.concat();\n this._setActiveObject(group, e);\n this._fireSelectionEvents(currentActives, e);\n },\n\n /**\n * @private\n * @param {Object} target\n */\n _createGroup: function(target) {\n var objects = this._objects,\n isActiveLower = objects.indexOf(this._activeObject) < objects.indexOf(target),\n groupObjects = isActiveLower\n ? [this._activeObject, target]\n : [target, this._activeObject];\n this._activeObject.isEditing && this._activeObject.exitEditing();\n return new fabric.ActiveSelection(groupObjects, {\n canvas: this\n });\n },\n\n /**\n * @private\n * @param {Event} e mouse event\n */\n _groupSelectedObjects: function (e) {\n\n var group = this._collectObjects(e),\n aGroup;\n\n // do not create group for 1 element only\n if (group.length === 1) {\n this.setActiveObject(group[0], e);\n }\n else if (group.length > 1) {\n aGroup = new fabric.ActiveSelection(group.reverse(), {\n canvas: this\n });\n this.setActiveObject(aGroup, e);\n }\n },\n\n /**\n * @private\n */\n _collectObjects: function(e) {\n var group = [],\n currentObject,\n x1 = this._groupSelector.ex,\n y1 = this._groupSelector.ey,\n x2 = x1 + this._groupSelector.left,\n y2 = y1 + this._groupSelector.top,\n selectionX1Y1 = new fabric.Point(min(x1, x2), min(y1, y2)),\n selectionX2Y2 = new fabric.Point(max(x1, x2), max(y1, y2)),\n allowIntersect = !this.selectionFullyContained,\n isClick = x1 === x2 && y1 === y2;\n // we iterate reverse order to collect top first in case of click.\n for (var i = this._objects.length; i--; ) {\n currentObject = this._objects[i];\n\n if (!currentObject || !currentObject.selectable || !currentObject.visible) {\n continue;\n }\n\n if ((allowIntersect && currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2)) ||\n currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2) ||\n (allowIntersect && currentObject.containsPoint(selectionX1Y1)) ||\n (allowIntersect && currentObject.containsPoint(selectionX2Y2))\n ) {\n group.push(currentObject);\n // only add one object if it's a click\n if (isClick) {\n break;\n }\n }\n }\n\n if (group.length > 1) {\n group = group.filter(function(object) {\n return !object.onSelect({ e: e });\n });\n }\n\n return group;\n },\n\n /**\n * @private\n */\n _maybeGroupObjects: function(e) {\n if (this.selection && this._groupSelector) {\n this._groupSelectedObjects(e);\n }\n this.setCursor(this.defaultCursor);\n // clear selection and current transformation\n this._groupSelector = null;\n }\n });\n\n})();\n\n\n(function () {\n fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n * @param {Object} [options] Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n * @see {@link http://jsfiddle.net/fabricjs/NfZVb/|jsFiddle demo}\n * @example Generate jpeg dataURL with lower quality\n * var dataURL = canvas.toDataURL({\n * format: 'jpeg',\n * quality: 0.8\n * });\n * @example Generate cropped png dataURL (clipping of canvas)\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * left: 100,\n * top: 100,\n * width: 200,\n * height: 200\n * });\n * @example Generate double scaled png dataURL\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * multiplier: 2\n * });\n */\n toDataURL: function (options) {\n options || (options = { });\n\n var format = options.format || 'png',\n quality = options.quality || 1,\n multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? this.getRetinaScaling() : 1),\n canvasEl = this.toCanvasElement(multiplier, options);\n return fabric.util.toDataURL(canvasEl, format, quality);\n },\n\n /**\n * Create a new HTMLCanvas element painted with the current canvas content.\n * No need to resize the actual one or repaint it.\n * Will transfer object ownership to a new canvas, paint it, and set everything back.\n * This is an intermediary step used to get to a dataUrl but also it is useful to\n * create quick image copies of a canvas without passing for the dataUrl string\n * @param {Number} [multiplier] a zoom factor.\n * @param {Object} [cropping] Cropping informations\n * @param {Number} [cropping.left] Cropping left offset.\n * @param {Number} [cropping.top] Cropping top offset.\n * @param {Number} [cropping.width] Cropping width.\n * @param {Number} [cropping.height] Cropping height.\n */\n toCanvasElement: function(multiplier, cropping) {\n multiplier = multiplier || 1;\n cropping = cropping || { };\n var scaledWidth = (cropping.width || this.width) * multiplier,\n scaledHeight = (cropping.height || this.height) * multiplier,\n zoom = this.getZoom(),\n originalWidth = this.width,\n originalHeight = this.height,\n newZoom = zoom * multiplier,\n vp = this.viewportTransform,\n translateX = (vp[4] - (cropping.left || 0)) * multiplier,\n translateY = (vp[5] - (cropping.top || 0)) * multiplier,\n originalInteractive = this.interactive,\n newVp = [newZoom, 0, 0, newZoom, translateX, translateY],\n originalRetina = this.enableRetinaScaling,\n canvasEl = fabric.util.createCanvasElement(),\n originalContextTop = this.contextTop;\n canvasEl.width = scaledWidth;\n canvasEl.height = scaledHeight;\n this.contextTop = null;\n this.enableRetinaScaling = false;\n this.interactive = false;\n this.viewportTransform = newVp;\n this.width = scaledWidth;\n this.height = scaledHeight;\n this.calcViewportBoundaries();\n this.renderCanvas(canvasEl.getContext('2d'), this._objects);\n this.viewportTransform = vp;\n this.width = originalWidth;\n this.height = originalHeight;\n this.calcViewportBoundaries();\n this.interactive = originalInteractive;\n this.enableRetinaScaling = originalRetina;\n this.contextTop = originalContextTop;\n return canvasEl;\n },\n });\n\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Populates canvas with data from the specified dataless JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toDatalessJSON}\n * @deprecated since 1.2.2\n * @param {String|Object} json JSON string or object\n * @param {Function} callback Callback, invoked when json is parsed\n * and corresponding objects (e.g: {@link fabric.Image})\n * are initialized\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @return {fabric.Canvas} instance\n * @chainable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n */\n loadFromDatalessJSON: function (json, callback, reviver) {\n return this.loadFromJSON(json, callback, reviver);\n },\n\n /**\n * Populates canvas with data from the specified JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n * @param {String|Object} json JSON string or object\n * @param {Function} callback Callback, invoked when json is parsed\n * and corresponding objects (e.g: {@link fabric.Image})\n * are initialized\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @return {fabric.Canvas} instance\n * @chainable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n * @example loadFromJSON\n * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas));\n * @example loadFromJSON with reviver\n * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas), function(o, object) {\n * // `o` = json object\n * // `object` = fabric.Object instance\n * // ... do some stuff ...\n * });\n */\n loadFromJSON: function (json, callback, reviver) {\n if (!json) {\n return;\n }\n\n // serialize if it wasn't already\n var serialized = (typeof json === 'string')\n ? JSON.parse(json)\n : fabric.util.object.clone(json);\n\n var _this = this,\n clipPath = serialized.clipPath,\n renderOnAddRemove = this.renderOnAddRemove;\n\n this.renderOnAddRemove = false;\n\n delete serialized.clipPath;\n\n this._enlivenObjects(serialized.objects, function (enlivenedObjects) {\n _this.clear();\n _this._setBgOverlay(serialized, function () {\n if (clipPath) {\n _this._enlivenObjects([clipPath], function (enlivenedCanvasClip) {\n _this.clipPath = enlivenedCanvasClip[0];\n _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n });\n }\n else {\n _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n }\n });\n }, reviver);\n return this;\n },\n\n /**\n * @private\n * @param {Object} serialized Object with background and overlay information\n * @param {Array} restored canvas objects\n * @param {Function} cached renderOnAddRemove callback\n * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n */\n __setupCanvas: function(serialized, enlivenedObjects, renderOnAddRemove, callback) {\n var _this = this;\n enlivenedObjects.forEach(function(obj, index) {\n // we splice the array just in case some custom classes restored from JSON\n // will add more object to canvas at canvas init.\n _this.insertAt(obj, index);\n });\n this.renderOnAddRemove = renderOnAddRemove;\n // remove parts i cannot set as options\n delete serialized.objects;\n delete serialized.backgroundImage;\n delete serialized.overlayImage;\n delete serialized.background;\n delete serialized.overlay;\n // this._initOptions does too many things to just\n // call it. Normally loading an Object from JSON\n // create the Object instance. Here the Canvas is\n // already an instance and we are just loading things over it\n this._setOptions(serialized);\n this.renderAll();\n callback && callback();\n },\n\n /**\n * @private\n * @param {Object} serialized Object with background and overlay information\n * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n */\n _setBgOverlay: function(serialized, callback) {\n var loaded = {\n backgroundColor: false,\n overlayColor: false,\n backgroundImage: false,\n overlayImage: false\n };\n\n if (!serialized.backgroundImage && !serialized.overlayImage && !serialized.background && !serialized.overlay) {\n callback && callback();\n return;\n }\n\n var cbIfLoaded = function () {\n if (loaded.backgroundImage && loaded.overlayImage && loaded.backgroundColor && loaded.overlayColor) {\n callback && callback();\n }\n };\n\n this.__setBgOverlay('backgroundImage', serialized.backgroundImage, loaded, cbIfLoaded);\n this.__setBgOverlay('overlayImage', serialized.overlayImage, loaded, cbIfLoaded);\n this.__setBgOverlay('backgroundColor', serialized.background, loaded, cbIfLoaded);\n this.__setBgOverlay('overlayColor', serialized.overlay, loaded, cbIfLoaded);\n },\n\n /**\n * @private\n * @param {String} property Property to set (backgroundImage, overlayImage, backgroundColor, overlayColor)\n * @param {(Object|String)} value Value to set\n * @param {Object} loaded Set loaded property to true if property is set\n * @param {Object} callback Callback function to invoke after property is set\n */\n __setBgOverlay: function(property, value, loaded, callback) {\n var _this = this;\n\n if (!value) {\n loaded[property] = true;\n callback && callback();\n return;\n }\n\n if (property === 'backgroundImage' || property === 'overlayImage') {\n fabric.util.enlivenObjects([value], function(enlivedObject){\n _this[property] = enlivedObject[0];\n loaded[property] = true;\n callback && callback();\n });\n }\n else {\n this['set' + fabric.util.string.capitalize(property, true)](value, function() {\n loaded[property] = true;\n callback && callback();\n });\n }\n },\n\n /**\n * @private\n * @param {Array} objects\n * @param {Function} callback\n * @param {Function} [reviver]\n */\n _enlivenObjects: function (objects, callback, reviver) {\n if (!objects || objects.length === 0) {\n callback && callback([]);\n return;\n }\n\n fabric.util.enlivenObjects(objects, function(enlivenedObjects) {\n callback && callback(enlivenedObjects);\n }, null, reviver);\n },\n\n /**\n * @private\n * @param {String} format\n * @param {Function} callback\n */\n _toDataURL: function (format, callback) {\n this.clone(function (clone) {\n callback(clone.toDataURL(format));\n });\n },\n\n /**\n * @private\n * @param {String} format\n * @param {Number} multiplier\n * @param {Function} callback\n */\n _toDataURLWithMultiplier: function (format, multiplier, callback) {\n this.clone(function (clone) {\n callback(clone.toDataURLWithMultiplier(format, multiplier));\n });\n },\n\n /**\n * Clones canvas instance\n * @param {Object} [callback] Receives cloned instance as a first argument\n * @param {Array} [properties] Array of properties to include in the cloned canvas and children\n */\n clone: function (callback, properties) {\n var data = JSON.stringify(this.toJSON(properties));\n this.cloneWithoutData(function(clone) {\n clone.loadFromJSON(data, function() {\n callback && callback(clone);\n });\n });\n },\n\n /**\n * Clones canvas instance without cloning existing data.\n * This essentially copies canvas dimensions, clipping properties, etc.\n * but leaves data empty (so that you can populate it with your own)\n * @param {Object} [callback] Receives cloned instance as a first argument\n */\n cloneWithoutData: function(callback) {\n var el = fabric.util.createCanvasElement();\n\n el.width = this.width;\n el.height = this.height;\n\n var clone = new fabric.Canvas(el);\n clone.clipTo = this.clipTo;\n if (this.backgroundImage) {\n clone.setBackgroundImage(this.backgroundImage.src, function() {\n clone.renderAll();\n callback && callback(clone);\n });\n clone.backgroundImageOpacity = this.backgroundImageOpacity;\n clone.backgroundImageStretch = this.backgroundImageStretch;\n }\n else {\n callback && callback(clone);\n }\n }\n});\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed,\n capitalize = fabric.util.string.capitalize,\n degreesToRadians = fabric.util.degreesToRadians,\n supportsLineDash = fabric.StaticCanvas.supports('setLineDash'),\n objectCaching = !fabric.isLikelyNode,\n ALIASING_LIMIT = 2;\n\n if (fabric.Object) {\n return;\n }\n\n /**\n * Root object class from which all 2d shape classes inherit from\n * @class fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects}\n * @see {@link fabric.Object#initialize} for constructor definition\n *\n * @fires added\n * @fires removed\n *\n * @fires selected\n * @fires deselected\n * @fires modified\n * @fires modified\n * @fires moved\n * @fires scaled\n * @fires rotated\n * @fires skewed\n *\n * @fires rotating\n * @fires scaling\n * @fires moving\n * @fires skewing\n *\n * @fires mousedown\n * @fires mouseup\n * @fires mouseover\n * @fires mouseout\n * @fires mousewheel\n * @fires mousedblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n */\n fabric.Object = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.Object.prototype */ {\n\n /**\n * Type of an object (rect, circle, path, etc.).\n * Note that this property is meant to be read-only and not meant to be modified.\n * If you modify, certain parts of Fabric (such as JSON loading) won't work correctly.\n * @type String\n * @default\n */\n type: 'object',\n\n /**\n * Horizontal origin of transformation of an object (one of \"left\", \"right\", \"center\")\n * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n * @type String\n * @default\n */\n originX: 'left',\n\n /**\n * Vertical origin of transformation of an object (one of \"top\", \"bottom\", \"center\")\n * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n * @type String\n * @default\n */\n originY: 'top',\n\n /**\n * Top position of an object. Note that by default it's relative to object top. You can change this by setting originY={top/center/bottom}\n * @type Number\n * @default\n */\n top: 0,\n\n /**\n * Left position of an object. Note that by default it's relative to object left. You can change this by setting originX={left/center/right}\n * @type Number\n * @default\n */\n left: 0,\n\n /**\n * Object width\n * @type Number\n * @default\n */\n width: 0,\n\n /**\n * Object height\n * @type Number\n * @default\n */\n height: 0,\n\n /**\n * Object scale factor (horizontal)\n * @type Number\n * @default\n */\n scaleX: 1,\n\n /**\n * Object scale factor (vertical)\n * @type Number\n * @default\n */\n scaleY: 1,\n\n /**\n * When true, an object is rendered as flipped horizontally\n * @type Boolean\n * @default\n */\n flipX: false,\n\n /**\n * When true, an object is rendered as flipped vertically\n * @type Boolean\n * @default\n */\n flipY: false,\n\n /**\n * Opacity of an object\n * @type Number\n * @default\n */\n opacity: 1,\n\n /**\n * Angle of rotation of an object (in degrees)\n * @type Number\n * @default\n */\n angle: 0,\n\n /**\n * Angle of skew on x axes of an object (in degrees)\n * @type Number\n * @default\n */\n skewX: 0,\n\n /**\n * Angle of skew on y axes of an object (in degrees)\n * @type Number\n * @default\n */\n skewY: 0,\n\n /**\n * Size of object's controlling corners (in pixels)\n * @type Number\n * @default\n */\n cornerSize: 13,\n\n /**\n * When true, object's controlling corners are rendered as transparent inside (i.e. stroke instead of fill)\n * @type Boolean\n * @default\n */\n transparentCorners: true,\n\n /**\n * Default cursor value used when hovering over this object on canvas\n * @type String\n * @default\n */\n hoverCursor: null,\n\n /**\n * Default cursor value used when moving this object on canvas\n * @type String\n * @default\n */\n moveCursor: null,\n\n /**\n * Padding between object and its controlling borders (in pixels)\n * @type Number\n * @default\n */\n padding: 0,\n\n /**\n * Color of controlling borders of an object (when it's active)\n * @type String\n * @default\n */\n borderColor: 'rgba(102,153,255,0.75)',\n\n /**\n * Array specifying dash pattern of an object's borders (hasBorder must be true)\n * @since 1.6.2\n * @type Array\n */\n borderDashArray: null,\n\n /**\n * Color of controlling corners of an object (when it's active)\n * @type String\n * @default\n */\n cornerColor: 'rgba(102,153,255,0.5)',\n\n /**\n * Color of controlling corners of an object (when it's active and transparentCorners false)\n * @since 1.6.2\n * @type String\n * @default\n */\n cornerStrokeColor: null,\n\n /**\n * Specify style of control, 'rect' or 'circle'\n * @since 1.6.2\n * @type String\n */\n cornerStyle: 'rect',\n\n /**\n * Array specifying dash pattern of an object's control (hasBorder must be true)\n * @since 1.6.2\n * @type Array\n */\n cornerDashArray: null,\n\n /**\n * When true, this object will use center point as the origin of transformation\n * when being scaled via the controls.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredScaling: false,\n\n /**\n * When true, this object will use center point as the origin of transformation\n * when being rotated via the controls.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredRotation: true,\n\n /**\n * Color of object's fill\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n fill: 'rgb(0,0,0)',\n\n /**\n * Fill rule used to fill an object\n * accepted values are nonzero, evenodd\n * Backwards incompatibility note: This property was used for setting globalCompositeOperation until v1.4.12 (use `fabric.Object#globalCompositeOperation` instead)\n * @type String\n * @default\n */\n fillRule: 'nonzero',\n\n /**\n * Composite rule used for canvas globalCompositeOperation\n * @type String\n * @default\n */\n globalCompositeOperation: 'source-over',\n\n /**\n * Background color of an object.\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n backgroundColor: '',\n\n /**\n * Selection Background color of an object. colored layer behind the object when it is active.\n * does not mix good with globalCompositeOperation methods.\n * @type String\n * @default\n */\n selectionBackgroundColor: '',\n\n /**\n * When defined, an object is rendered via stroke and this property specifies its color\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n stroke: null,\n\n /**\n * Width of a stroke used to render this object\n * @type Number\n * @default\n */\n strokeWidth: 1,\n\n /**\n * Array specifying dash pattern of an object's stroke (stroke must be defined)\n * @type Array\n */\n strokeDashArray: null,\n\n /**\n * Line offset of an object's stroke\n * @type Number\n * @default\n */\n strokeDashOffset: 0,\n\n /**\n * Line endings style of an object's stroke (one of \"butt\", \"round\", \"square\")\n * @type String\n * @default\n */\n strokeLineCap: 'butt',\n\n /**\n * Corner style of an object's stroke (one of \"bevil\", \"round\", \"miter\")\n * @type String\n * @default\n */\n strokeLineJoin: 'miter',\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of an object's stroke\n * @type Number\n * @default\n */\n strokeMiterLimit: 4,\n\n /**\n * Shadow object representing shadow of this shape\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * Opacity of object's controlling borders when object is active and moving\n * @type Number\n * @default\n */\n borderOpacityWhenMoving: 0.4,\n\n /**\n * Scale factor of object's controlling borders\n * bigger number will make a thicker border\n * border is 1, so this is basically a border tickness\n * since there is no way to change the border itself.\n * @type Number\n * @default\n */\n borderScaleFactor: 1,\n\n /**\n * Transform matrix (similar to SVG's transform matrix)\n * This property has been depreacted. Since caching and and qrDecompose this\n * property can be handled with the standard top,left,scaleX,scaleY,angle and skewX.\n * A documentation example on how to parse and merge a transformMatrix will be provided before\n * completely removing it in fabric 4.0\n * If you are starting a project now, DO NOT use it.\n * @deprecated since 3.2.0\n * @type Array\n */\n transformMatrix: null,\n\n /**\n * Minimum allowed scale value of an object\n * @type Number\n * @default\n */\n minScaleLimit: 0,\n\n /**\n * When set to `false`, an object can not be selected for modification (using either point-click-based or group-based selection).\n * But events still fire on it.\n * @type Boolean\n * @default\n */\n selectable: true,\n\n /**\n * When set to `false`, an object can not be a target of events. All events propagate through it. Introduced in v1.3.4\n * @type Boolean\n * @default\n */\n evented: true,\n\n /**\n * When set to `false`, an object is not rendered on canvas\n * @type Boolean\n * @default\n */\n visible: true,\n\n /**\n * When set to `false`, object's controls are not displayed and can not be used to manipulate object\n * @type Boolean\n * @default\n */\n hasControls: true,\n\n /**\n * When set to `false`, object's controlling borders are not rendered\n * @type Boolean\n * @default\n */\n hasBorders: true,\n\n /**\n * When set to `false`, object's controlling rotating point will not be visible or selectable\n * @type Boolean\n * @default\n */\n hasRotatingPoint: true,\n\n /**\n * Offset for object's controlling rotating point (when enabled via `hasRotatingPoint`)\n * @type Number\n * @default\n */\n rotatingPointOffset: 40,\n\n /**\n * When set to `true`, objects are \"found\" on canvas on per-pixel basis rather than according to bounding box\n * @type Boolean\n * @default\n */\n perPixelTargetFind: false,\n\n /**\n * When `false`, default object's values are not included in its serialization\n * @type Boolean\n * @default\n */\n includeDefaultValues: true,\n\n /**\n * Function that determines clipping of an object (context is passed as a first argument).\n * If you are using code minification, ctx argument can be minified/manglied you should use\n * as a workaround `var ctx = arguments[0];` in the function;\n * Note that context origin is at the object's center point (not left/top corner)\n * @deprecated since 2.0.0\n * @type Function\n */\n clipTo: null,\n\n /**\n * When `true`, object horizontal movement is locked\n * @type Boolean\n * @default\n */\n lockMovementX: false,\n\n /**\n * When `true`, object vertical movement is locked\n * @type Boolean\n * @default\n */\n lockMovementY: false,\n\n /**\n * When `true`, object rotation is locked\n * @type Boolean\n * @default\n */\n lockRotation: false,\n\n /**\n * When `true`, object horizontal scaling is locked\n * @type Boolean\n * @default\n */\n lockScalingX: false,\n\n /**\n * When `true`, object vertical scaling is locked\n * @type Boolean\n * @default\n */\n lockScalingY: false,\n\n /**\n * When `true`, object non-uniform scaling is locked\n * @type Boolean\n * @default\n */\n lockUniScaling: false,\n\n /**\n * When `true`, object horizontal skewing is locked\n * @type Boolean\n * @default\n */\n lockSkewingX: false,\n\n /**\n * When `true`, object vertical skewing is locked\n * @type Boolean\n * @default\n */\n lockSkewingY: false,\n\n /**\n * When `true`, object cannot be flipped by scaling into negative values\n * @type Boolean\n * @default\n */\n lockScalingFlip: false,\n\n /**\n * When `true`, object is not exported in OBJECT/JSON\n * @since 1.6.3\n * @type Boolean\n * @default\n */\n excludeFromExport: false,\n\n /**\n * When `true`, object is cached on an additional canvas.\n * When `false`, object is not cached unless necessary ( clipPath )\n * default to true\n * @since 1.7.0\n * @type Boolean\n * @default true\n */\n objectCaching: objectCaching,\n\n /**\n * When `true`, object properties are checked for cache invalidation. In some particular\n * situation you may want this to be disabled ( spray brush, very big, groups)\n * or if your application does not allow you to modify properties for groups child you want\n * to disable it for groups.\n * default to false\n * since 1.7.0\n * @type Boolean\n * @default false\n */\n statefullCache: false,\n\n /**\n * When `true`, cache does not get updated during scaling. The picture will get blocky if scaled\n * too much and will be redrawn with correct details at the end of scaling.\n * this setting is performance and application dependant.\n * default to true\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n noScaleCache: true,\n\n /**\n * When `false`, the stoke width will scale with the object.\n * When `true`, the stroke will always match the exact pixel size entered for stroke width.\n * default to false\n * @since 2.6.0\n * @type Boolean\n * @default false\n * @type Boolean\n * @default false\n */\n strokeUniform: false,\n\n /**\n * When set to `true`, object's cache will be rerendered next render call.\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n dirty: true,\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * @type number|string|any\n * @default 0\n */\n __corner: 0,\n\n /**\n * Determines if the fill or the stroke is drawn first (one of \"fill\" or \"stroke\")\n * @type String\n * @default\n */\n paintFirst: 'fill',\n\n /**\n * List of properties to consider when checking if state\n * of an object is changed (fabric.Object#hasStateChanged)\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: (\n 'top left width height scaleX scaleY flipX flipY originX originY transformMatrix ' +\n 'stroke strokeWidth strokeDashArray strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit ' +\n 'angle opacity fill globalCompositeOperation shadow clipTo visible backgroundColor ' +\n 'skewX skewY fillRule paintFirst clipPath strokeUniform'\n ).split(' '),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n cacheProperties: (\n 'fill stroke strokeWidth strokeDashArray width height paintFirst strokeUniform' +\n ' strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit backgroundColor clipPath'\n ).split(' '),\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the object has rendered, and the context is placed in the center\n * of the object cacheCanvas.\n * If you want 0,0 of a clipPath to align with an object center, use clipPath.originX/Y to 'center'\n * @type fabric.Object\n */\n clipPath: undefined,\n\n /**\n * Meaningful ONLY when the object is used as clipPath.\n * if true, the clipPath will make the object clip to the outside of the clipPath\n * since 2.4.0\n * @type boolean\n * @default false\n */\n inverted: false,\n\n /**\n * Meaningful ONLY when the object is used as clipPath.\n * if true, the clipPath will have its top and left relative to canvas, and will\n * not be influenced by the object transform. This will make the clipPath relative\n * to the canvas, but clipping just a particular object.\n * WARNING this is beta, this feature may change or be renamed.\n * since 2.4.0\n * @type boolean\n * @default false\n */\n absolutePositioned: false,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n if (options) {\n this.setOptions(options);\n }\n },\n\n /**\n * Create a the canvas used to keep the cached copy of the object\n * @private\n */\n _createCacheCanvas: function() {\n this._cacheProperties = {};\n this._cacheCanvas = fabric.util.createCanvasElement();\n this._cacheContext = this._cacheCanvas.getContext('2d');\n this._updateCacheCanvas();\n // if canvas gets created, is empty, so dirty.\n this.dirty = true;\n },\n\n /**\n * Limit the cache dimensions so that X * Y do not cross fabric.perfLimitSizeTotal\n * and each side do not cross fabric.cacheSideLimit\n * those numbers are configurable so that you can get as much detail as you want\n * making bargain with performances.\n * @param {Object} dims\n * @param {Object} dims.width width of canvas\n * @param {Object} dims.height height of canvas\n * @param {Object} dims.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @param {Object} dims.zoomY zoomY zoom value to unscale the canvas before drawing cache\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _limitCacheSize: function(dims) {\n var perfLimitSizeTotal = fabric.perfLimitSizeTotal,\n width = dims.width, height = dims.height,\n max = fabric.maxCacheSideLimit, min = fabric.minCacheSideLimit;\n if (width <= max && height <= max && width * height <= perfLimitSizeTotal) {\n if (width < min) {\n dims.width = min;\n }\n if (height < min) {\n dims.height = min;\n }\n return dims;\n }\n var ar = width / height, limitedDims = fabric.util.limitDimsByArea(ar, perfLimitSizeTotal),\n capValue = fabric.util.capValue,\n x = capValue(min, limitedDims.x, max),\n y = capValue(min, limitedDims.y, max);\n if (width > x) {\n dims.zoomX /= width / x;\n dims.width = x;\n dims.capped = true;\n }\n if (height > y) {\n dims.zoomY /= height / y;\n dims.height = y;\n dims.capped = true;\n }\n return dims;\n },\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @return {Object}.x width of object to be cached\n * @return {Object}.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions: function() {\n var objectScale = this.getTotalObjectScaling(),\n // caculate dimensions without skewing\n dim = this._getTransformedDimensions(0, 0),\n neededX = dim.x * objectScale.scaleX / this.scaleX,\n neededY = dim.y * objectScale.scaleY / this.scaleY;\n return {\n // for sure this ALIASING_LIMIT is slightly creating problem\n // in situation in which the cache canvas gets an upper limit\n // also objectScale contains already scaleX and scaleY\n width: neededX + ALIASING_LIMIT,\n height: neededY + ALIASING_LIMIT,\n zoomX: objectScale.scaleX,\n zoomY: objectScale.scaleY,\n x: neededX,\n y: neededY\n };\n },\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas: function() {\n var targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n var target = targetCanvas._currentTransform.target,\n action = targetCanvas._currentTransform.action;\n if (this === target && action.slice && action.slice(0, 5) === 'scale') {\n return false;\n }\n }\n var canvas = this._cacheCanvas,\n dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n minCacheSize = fabric.minCacheSideLimit,\n width = dims.width, height = dims.height, drawingWidth, drawingHeight,\n zoomX = dims.zoomX, zoomY = dims.zoomY,\n dimensionsChanged = width !== this.cacheWidth || height !== this.cacheHeight,\n zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY,\n shouldRedraw = dimensionsChanged || zoomChanged,\n additionalWidth = 0, additionalHeight = 0, shouldResizeCanvas = false;\n if (dimensionsChanged) {\n var canvasWidth = this._cacheCanvas.width,\n canvasHeight = this._cacheCanvas.height,\n sizeGrowing = width > canvasWidth || height > canvasHeight,\n sizeShrinking = (width < canvasWidth * 0.9 || height < canvasHeight * 0.9) &&\n canvasWidth > minCacheSize && canvasHeight > minCacheSize;\n shouldResizeCanvas = sizeGrowing || sizeShrinking;\n if (sizeGrowing && !dims.capped && (width > minCacheSize || height > minCacheSize)) {\n additionalWidth = width * 0.1;\n additionalHeight = height * 0.1;\n }\n }\n if (shouldRedraw) {\n if (shouldResizeCanvas) {\n canvas.width = Math.ceil(width + additionalWidth);\n canvas.height = Math.ceil(height + additionalHeight);\n }\n else {\n this._cacheContext.setTransform(1, 0, 0, 1, 0, 0);\n this._cacheContext.clearRect(0, 0, canvas.width, canvas.height);\n }\n drawingWidth = dims.x / 2;\n drawingHeight = dims.y / 2;\n this.cacheTranslationX = Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n this.cacheTranslationY = Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n this.cacheWidth = width;\n this.cacheHeight = height;\n this._cacheContext.translate(this.cacheTranslationX, this.cacheTranslationY);\n this._cacheContext.scale(zoomX, zoomY);\n this.zoomX = zoomX;\n this.zoomY = zoomY;\n return true;\n }\n return false;\n },\n\n /**\n * Sets object's properties from options\n * @param {Object} [options] Options object\n */\n setOptions: function(options) {\n this._setOptions(options);\n this._initGradient(options.fill, 'fill');\n this._initGradient(options.stroke, 'stroke');\n this._initClipping(options);\n this._initPattern(options.fill, 'fill');\n this._initPattern(options.stroke, 'stroke');\n },\n\n /**\n * Transforms context when rendering an object\n * @param {CanvasRenderingContext2D} ctx Context\n */\n transform: function(ctx) {\n var m;\n if (this.group && !this.group._transformDone) {\n m = this.calcTransformMatrix();\n }\n else {\n m = this.calcOwnMatrix();\n }\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n },\n\n /**\n * Returns an object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n\n object = {\n type: this.type,\n version: fabric.version,\n originX: this.originX,\n originY: this.originY,\n left: toFixed(this.left, NUM_FRACTION_DIGITS),\n top: toFixed(this.top, NUM_FRACTION_DIGITS),\n width: toFixed(this.width, NUM_FRACTION_DIGITS),\n height: toFixed(this.height, NUM_FRACTION_DIGITS),\n fill: (this.fill && this.fill.toObject) ? this.fill.toObject() : this.fill,\n stroke: (this.stroke && this.stroke.toObject) ? this.stroke.toObject() : this.stroke,\n strokeWidth: toFixed(this.strokeWidth, NUM_FRACTION_DIGITS),\n strokeDashArray: this.strokeDashArray ? this.strokeDashArray.concat() : this.strokeDashArray,\n strokeLineCap: this.strokeLineCap,\n strokeDashOffset: this.strokeDashOffset,\n strokeLineJoin: this.strokeLineJoin,\n // TODO: add this before release\n // strokeUniform: this.strokeUniform,\n strokeMiterLimit: toFixed(this.strokeMiterLimit, NUM_FRACTION_DIGITS),\n scaleX: toFixed(this.scaleX, NUM_FRACTION_DIGITS),\n scaleY: toFixed(this.scaleY, NUM_FRACTION_DIGITS),\n angle: toFixed(this.angle, NUM_FRACTION_DIGITS),\n flipX: this.flipX,\n flipY: this.flipY,\n opacity: toFixed(this.opacity, NUM_FRACTION_DIGITS),\n shadow: (this.shadow && this.shadow.toObject) ? this.shadow.toObject() : this.shadow,\n visible: this.visible,\n clipTo: this.clipTo && String(this.clipTo),\n backgroundColor: this.backgroundColor,\n fillRule: this.fillRule,\n paintFirst: this.paintFirst,\n globalCompositeOperation: this.globalCompositeOperation,\n transformMatrix: this.transformMatrix ? this.transformMatrix.concat() : null,\n skewX: toFixed(this.skewX, NUM_FRACTION_DIGITS),\n skewY: toFixed(this.skewY, NUM_FRACTION_DIGITS),\n };\n\n if (this.clipPath) {\n object.clipPath = this.clipPath.toObject(propertiesToInclude);\n object.clipPath.inverted = this.clipPath.inverted;\n object.clipPath.absolutePositioned = this.clipPath.absolutePositioned;\n }\n\n fabric.util.populateWithProperties(this, object, propertiesToInclude);\n if (!this.includeDefaultValues) {\n object = this._removeDefaultValues(object);\n }\n\n return object;\n },\n\n /**\n * Returns (dataless) object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n // will be overwritten by subclasses\n return this.toObject(propertiesToInclude);\n },\n\n /**\n * @private\n * @param {Object} object\n */\n _removeDefaultValues: function(object) {\n var prototype = fabric.util.getKlass(object.type).prototype,\n stateProperties = prototype.stateProperties;\n stateProperties.forEach(function(prop) {\n if (prop === 'left' || prop === 'top') {\n return;\n }\n if (object[prop] === prototype[prop]) {\n delete object[prop];\n }\n var isArray = Object.prototype.toString.call(object[prop]) === '[object Array]' &&\n Object.prototype.toString.call(prototype[prop]) === '[object Array]';\n\n // basically a check for [] === []\n if (isArray && object[prop].length === 0 && prototype[prop].length === 0) {\n delete object[prop];\n }\n });\n\n return object;\n },\n\n /**\n * Returns a string representation of an instance\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Return the object scale factor counting also the group scaling\n * @return {Object} object with scaleX and scaleY properties\n */\n getObjectScaling: function() {\n var options = fabric.util.qrDecompose(this.calcTransformMatrix());\n return { scaleX: Math.abs(options.scaleX), scaleY: Math.abs(options.scaleY) };\n },\n\n /**\n * Return the object scale factor counting also the group scaling, zoom and retina\n * @return {Object} object with scaleX and scaleY properties\n */\n getTotalObjectScaling: function() {\n var scale = this.getObjectScaling(), scaleX = scale.scaleX, scaleY = scale.scaleY;\n if (this.canvas) {\n var zoom = this.canvas.getZoom();\n var retina = this.canvas.getRetinaScaling();\n scaleX *= zoom * retina;\n scaleY *= zoom * retina;\n }\n return { scaleX: scaleX, scaleY: scaleY };\n },\n\n /**\n * Return the object opacity counting also the group property\n * @return {Number}\n */\n getObjectOpacity: function() {\n var opacity = this.opacity;\n if (this.group) {\n opacity *= this.group.getObjectOpacity();\n }\n return opacity;\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Object} thisArg\n */\n _set: function(key, value) {\n var shouldConstrainValue = (key === 'scaleX' || key === 'scaleY'),\n isChanged = this[key] !== value, groupNeedsUpdate = false;\n\n if (shouldConstrainValue) {\n value = this._constrainScale(value);\n }\n if (key === 'scaleX' && value < 0) {\n this.flipX = !this.flipX;\n value *= -1;\n }\n else if (key === 'scaleY' && value < 0) {\n this.flipY = !this.flipY;\n value *= -1;\n }\n else if (key === 'shadow' && value && !(value instanceof fabric.Shadow)) {\n value = new fabric.Shadow(value);\n }\n else if (key === 'dirty' && this.group) {\n this.group.set('dirty', value);\n }\n\n this[key] = value;\n\n if (isChanged) {\n groupNeedsUpdate = this.group && this.group.isOnACache();\n if (this.cacheProperties.indexOf(key) > -1) {\n this.dirty = true;\n groupNeedsUpdate && this.group.set('dirty', true);\n }\n else if (groupNeedsUpdate && this.stateProperties.indexOf(key) > -1) {\n this.group.set('dirty', true);\n }\n }\n\n return this;\n },\n\n /**\n * This callback function is called by the parent group of an object every\n * time a non-delegated property changes on the group. It is passed the key\n * and value as parameters. Not adding in this function's signature to avoid\n * Travis build error about unused variables.\n */\n setOnGroup: function() {\n // implemented by sub-classes, as needed.\n },\n\n /**\n * Retrieves viewportTransform from Object's canvas if possible\n * @method getViewportTransform\n * @memberOf fabric.Object.prototype\n * @return {Array}\n */\n getViewportTransform: function() {\n if (this.canvas && this.canvas.viewportTransform) {\n return this.canvas.viewportTransform;\n }\n return fabric.iMatrix.concat();\n },\n\n /*\n * @private\n * return if the object would be visible in rendering\n * @memberOf fabric.Object.prototype\n * @return {Boolean}\n */\n isNotVisible: function() {\n return this.opacity === 0 ||\n (this.width === 0 && this.height === 0 && this.strokeWidth === 0) ||\n !this.visible;\n },\n\n /**\n * Renders an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n // do not render if width/height are zeros or object is not visible\n if (this.isNotVisible()) {\n return;\n }\n if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n return;\n }\n ctx.save();\n this._setupCompositeOperation(ctx);\n this.drawSelectionBackground(ctx);\n this.transform(ctx);\n this._setOpacity(ctx);\n this._setShadow(ctx, this);\n if (this.transformMatrix) {\n ctx.transform.apply(ctx, this.transformMatrix);\n }\n this.clipTo && fabric.util.clipContext(this, ctx);\n if (this.shouldCache()) {\n this.renderCache();\n this.drawCacheOnCanvas(ctx);\n }\n else {\n this._removeCacheCanvas();\n this.dirty = false;\n this.drawObject(ctx);\n if (this.objectCaching && this.statefullCache) {\n this.saveState({ propertySet: 'cacheProperties' });\n }\n }\n this.clipTo && ctx.restore();\n ctx.restore();\n },\n\n renderCache: function(options) {\n options = options || {};\n if (!this._cacheCanvas) {\n this._createCacheCanvas();\n }\n if (this.isCacheDirty()) {\n this.statefullCache && this.saveState({ propertySet: 'cacheProperties' });\n this.drawObject(this._cacheContext, options.forClipping);\n this.dirty = false;\n }\n },\n\n /**\n * Remove cacheCanvas and its dimensions from the objects\n */\n _removeCacheCanvas: function() {\n this._cacheCanvas = null;\n this.cacheWidth = 0;\n this.cacheHeight = 0;\n },\n\n /**\n * return true if the object will draw a stroke\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an aproximation and be fast.\n * wrote to avoid extra caching, it has to return true when stroke happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the stroke is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasStroke: function() {\n return this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0;\n },\n\n /**\n * return true if the object will draw a fill\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an aproximation and be fast.\n * wrote to avoid extra caching, it has to return true when fill happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the fill is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasFill: function() {\n return this.fill && this.fill !== 'transparent';\n },\n\n /**\n * When set to `true`, force the object to have its own cache, even if it is inside a group\n * it may be needed when your object behave in a particular way on the cache and always needs\n * its own isolated canvas to render correctly.\n * Created to be overridden\n * since 1.7.12\n * @returns Boolean\n */\n needsItsOwnCache: function() {\n if (this.paintFirst === 'stroke' &&\n this.hasFill() && this.hasStroke() && typeof this.shadow === 'object') {\n return true;\n }\n if (this.clipPath) {\n return true;\n }\n return false;\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n * @return {Boolean}\n */\n shouldCache: function() {\n this.ownCaching = this.needsItsOwnCache() || (\n this.objectCaching &&\n (!this.group || !this.group.isOnACache())\n );\n return this.ownCaching;\n },\n\n /**\n * Check if this object or a child object will cast a shadow\n * used by Group.shouldCache to know if child has a shadow recursively\n * @return {Boolean}\n */\n willDrawShadow: function() {\n return !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0);\n },\n\n /**\n * Execute the drawing operation for an object clipPath\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCache: function(ctx) {\n var path = this.clipPath;\n ctx.save();\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4\n if (path.inverted) {\n ctx.globalCompositeOperation = 'destination-out';\n }\n else {\n ctx.globalCompositeOperation = 'destination-in';\n }\n //ctx.scale(1 / 2, 1 / 2);\n if (path.absolutePositioned) {\n var m = fabric.util.invertTransform(this.calcTransformMatrix());\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n path.transform(ctx);\n ctx.scale(1 / path.zoomX, 1 / path.zoomY);\n ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY);\n ctx.restore();\n },\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject: function(ctx, forClipping) {\n var originalFill = this.fill, originalStroke = this.stroke;\n if (forClipping) {\n this.fill = 'black';\n this.stroke = '';\n this._setClippingProperties(ctx);\n }\n else {\n this._renderBackground(ctx);\n this._setStrokeStyles(ctx, this);\n this._setFillStyles(ctx, this);\n }\n this._render(ctx);\n this._drawClipPath(ctx);\n this.fill = originalFill;\n this.stroke = originalStroke;\n },\n\n _drawClipPath: function(ctx) {\n var path = this.clipPath;\n if (!path) { return; }\n // needed to setup a couple of variables\n // path canvas gets overridden with this one.\n // TODO find a better solution?\n path.canvas = this.canvas;\n path.shouldCache();\n path._transformDone = true;\n path.renderCache({ forClipping: true });\n this.drawClipPathOnCache(ctx);\n },\n\n /**\n * Paint the cached copy of the object on the target context.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas: function(ctx) {\n ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n ctx.drawImage(this._cacheCanvas, -this.cacheTranslationX, -this.cacheTranslationY);\n },\n\n /**\n * Check if cache is dirty\n * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n * on parent canvas.\n */\n isCacheDirty: function(skipCanvas) {\n if (this.isNotVisible()) {\n return false;\n }\n if (this._cacheCanvas && !skipCanvas && this._updateCacheCanvas()) {\n // in this case the context is already cleared.\n return true;\n }\n else {\n if (this.dirty ||\n (this.clipPath && this.clipPath.absolutePositioned) ||\n (this.statefullCache && this.hasStateChanged('cacheProperties'))\n ) {\n if (this._cacheCanvas && !skipCanvas) {\n var width = this.cacheWidth / this.zoomX;\n var height = this.cacheHeight / this.zoomY;\n this._cacheContext.clearRect(-width / 2, -height / 2, width, height);\n }\n return true;\n }\n }\n return false;\n },\n\n /**\n * Draws a background for the object big as its untransformed dimensions\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground: function(ctx) {\n if (!this.backgroundColor) {\n return;\n }\n var dim = this._getNonTransformedDimensions();\n ctx.fillStyle = this.backgroundColor;\n\n ctx.fillRect(\n -dim.x / 2,\n -dim.y / 2,\n dim.x,\n dim.y\n );\n // if there is background color no other shadows\n // should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setOpacity: function(ctx) {\n if (this.group && !this.group._transformDone) {\n ctx.globalAlpha = this.getObjectOpacity();\n }\n else {\n ctx.globalAlpha *= this.opacity;\n }\n },\n\n _setStrokeStyles: function(ctx, decl) {\n if (decl.stroke) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = decl.strokeLineCap;\n ctx.lineDashOffset = decl.strokeDashOffset;\n ctx.lineJoin = decl.strokeLineJoin;\n ctx.miterLimit = decl.strokeMiterLimit;\n ctx.strokeStyle = decl.stroke.toLive\n ? decl.stroke.toLive(ctx, this)\n : decl.stroke;\n }\n },\n\n _setFillStyles: function(ctx, decl) {\n if (decl.fill) {\n ctx.fillStyle = decl.fill.toLive\n ? decl.fill.toLive(ctx, this)\n : decl.fill;\n }\n },\n\n _setClippingProperties: function(ctx) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = 'transparent';\n ctx.fillStyle = '#000000';\n },\n\n /**\n * @private\n * Sets line dash\n * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n * @param {Array} dashArray array representing dashes\n * @param {Function} alternative function to call if browser does not support lineDash\n */\n _setLineDash: function(ctx, dashArray, alternative) {\n if (!dashArray || dashArray.length === 0) {\n return;\n }\n // Spec requires the concatenation of two copies the dash list when the number of elements is odd\n if (1 & dashArray.length) {\n dashArray.push.apply(dashArray, dashArray);\n }\n if (supportsLineDash) {\n ctx.setLineDash(dashArray);\n }\n else {\n alternative && alternative(ctx);\n }\n },\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n */\n _renderControls: function(ctx, styleOverride) {\n var vpt = this.getViewportTransform(),\n matrix = this.calcTransformMatrix(),\n options, drawBorders, drawControls;\n styleOverride = styleOverride || { };\n drawBorders = typeof styleOverride.hasBorders !== 'undefined' ? styleOverride.hasBorders : this.hasBorders;\n drawControls = typeof styleOverride.hasControls !== 'undefined' ? styleOverride.hasControls : this.hasControls;\n matrix = fabric.util.multiplyTransformMatrices(vpt, matrix);\n options = fabric.util.qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = 1 * this.borderScaleFactor;\n if (!this.group) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (styleOverride.forActiveSelection) {\n ctx.rotate(degreesToRadians(options.angle));\n drawBorders && this.drawBordersInGroup(ctx, options, styleOverride);\n }\n else {\n ctx.rotate(degreesToRadians(this.angle));\n drawBorders && this.drawBorders(ctx, styleOverride);\n }\n drawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setShadow: function(ctx) {\n if (!this.shadow) {\n return;\n }\n\n var shadow = this.shadow, canvas = this.canvas, scaling,\n multX = (canvas && canvas.viewportTransform[0]) || 1,\n multY = (canvas && canvas.viewportTransform[3]) || 1;\n if (shadow.nonScaling) {\n scaling = { scaleX: 1, scaleY: 1 };\n }\n else {\n scaling = this.getObjectScaling();\n }\n if (canvas && canvas._isRetinaScaling()) {\n multX *= fabric.devicePixelRatio;\n multY *= fabric.devicePixelRatio;\n }\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * fabric.browserShadowBlurConstant *\n (multX + multY) * (scaling.scaleX + scaling.scaleY) / 4;\n ctx.shadowOffsetX = shadow.offsetX * multX * scaling.scaleX;\n ctx.shadowOffsetY = shadow.offsetY * multY * scaling.scaleY;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _removeShadow: function(ctx) {\n if (!this.shadow) {\n return;\n }\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} filler fabric.Pattern or fabric.Gradient\n * @return {Object} offset.offsetX offset for text rendering\n * @return {Object} offset.offsetY offset for text rendering\n */\n _applyPatternGradientTransform: function(ctx, filler) {\n if (!filler || !filler.toLive) {\n return { offsetX: 0, offsetY: 0 };\n }\n var t = filler.gradientTransform || filler.patternTransform;\n var offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n if (filler.gradientUnits === 'percentage') {\n ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n }\n else {\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n }\n if (t) {\n ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n }\n return { offsetX: offsetX, offsetY: offsetY };\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderPaintInOrder: function(ctx) {\n if (this.paintFirst === 'stroke') {\n this._renderStroke(ctx);\n this._renderFill(ctx);\n }\n else {\n this._renderFill(ctx);\n this._renderStroke(ctx);\n }\n },\n\n /**\n * @private\n * function that actually render something on the context.\n * empty here to allow Obects to work on tests to benchmark fabric functionalites\n * not related to rendering\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(/* ctx */) {\n\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderFill: function(ctx) {\n if (!this.fill) {\n return;\n }\n\n ctx.save();\n this._applyPatternGradientTransform(ctx, this.fill);\n if (this.fillRule === 'evenodd') {\n ctx.fill('evenodd');\n }\n else {\n ctx.fill();\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderStroke: function(ctx) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n if (this.strokeUniform && this.group) {\n var scaling = this.getObjectScaling();\n ctx.scale(1 / scaling.scaleX, 1 / scaling.scaleY);\n }\n else if (this.strokeUniform) {\n ctx.scale(1 / this.scaleX, 1 / this.scaleY);\n }\n this._setLineDash(ctx, this.strokeDashArray, this._renderDashedStroke);\n if (this.stroke.toLive && this.stroke.gradientUnits === 'percentage') {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n this._applyPatternForTransformedGradient(ctx, this.stroke);\n }\n else {\n this._applyPatternGradientTransform(ctx, this.stroke);\n }\n ctx.stroke();\n ctx.restore();\n },\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drwabacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {fabric.Gradient} filler a fabric gradient instance\n */\n _applyPatternForTransformedGradient: function(ctx, filler) {\n var dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n pCanvas = fabric.util.createCanvasElement(), pCtx, retinaScaling = this.canvas.getRetinaScaling(),\n width = dims.x / this.scaleX / retinaScaling, height = dims.y / this.scaleY / retinaScaling;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx = pCanvas.getContext('2d');\n pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height);\n pCtx.lineTo(0, height); pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.scale(\n dims.zoomX / this.scaleX / retinaScaling,\n dims.zoomY / this.scaleY / retinaScaling\n );\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fillStyle = filler.toLive(ctx);\n pCtx.fill();\n ctx.translate(-this.width / 2 - this.strokeWidth / 2, -this.height / 2 - this.strokeWidth / 2);\n ctx.scale(\n retinaScaling * this.scaleX / dims.zoomX,\n retinaScaling * this.scaleY / dims.zoomY\n );\n ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat');\n },\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Object} center point from element coordinates\n */\n _findCenterFromElement: function() {\n return { x: this.left + this.width / 2, y: this.top + this.height / 2 };\n },\n\n /**\n * This function is an helper for svg import. it decompose the transformMatrix\n * and assign properties to object.\n * untransformed coordinates\n * @private\n * @chainable\n */\n _assignTransformMatrixProps: function() {\n if (this.transformMatrix) {\n var options = fabric.util.qrDecompose(this.transformMatrix);\n this.flipX = false;\n this.flipY = false;\n this.set('scaleX', options.scaleX);\n this.set('scaleY', options.scaleY);\n this.angle = options.angle;\n this.skewX = options.skewX;\n this.skewY = 0;\n }\n },\n\n /**\n * This function is an helper for svg import. it removes the transform matrix\n * and set to object properties that fabricjs can handle\n * @private\n * @param {Object} preserveAspectRatioOptions\n * @return {thisArg}\n */\n _removeTransformMatrix: function(preserveAspectRatioOptions) {\n var center = this._findCenterFromElement();\n if (this.transformMatrix) {\n this._assignTransformMatrixProps();\n center = fabric.util.transformPoint(center, this.transformMatrix);\n }\n this.transformMatrix = null;\n if (preserveAspectRatioOptions) {\n this.scaleX *= preserveAspectRatioOptions.scaleX;\n this.scaleY *= preserveAspectRatioOptions.scaleY;\n this.cropX = preserveAspectRatioOptions.cropX;\n this.cropY = preserveAspectRatioOptions.cropY;\n center.x += preserveAspectRatioOptions.offsetLeft;\n center.y += preserveAspectRatioOptions.offsetTop;\n this.width = preserveAspectRatioOptions.width;\n this.height = preserveAspectRatioOptions.height;\n }\n this.setPositionByOrigin(center, 'center', 'center');\n },\n\n /**\n * Clones an instance, using a callback method will work for every object.\n * @param {Function} callback Callback is invoked with a clone as a first argument\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n */\n clone: function(callback, propertiesToInclude) {\n var objectForm = this.toObject(propertiesToInclude);\n if (this.constructor.fromObject) {\n this.constructor.fromObject(objectForm, callback);\n }\n else {\n fabric.Object._fromObject('Object', objectForm, callback);\n }\n },\n\n /**\n * Creates an instance of fabric.Image out of an object\n * could make use of both toDataUrl or toCanvasElement.\n * @param {Function} callback callback, invoked with an instance as a first argument\n * @param {Object} [options] for clone as image, passed to toDataURL\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {fabric.Object} thisArg\n */\n cloneAsImage: function(callback, options) {\n var canvasEl = this.toCanvasElement(options);\n if (callback) {\n callback(new fabric.Image(canvasEl));\n }\n return this;\n },\n\n /**\n * Converts an object into a HTMLCanvas element\n * @param {Object} options Options object\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {HTMLCanvasElement} Returns DOM element with the fabric.Object\n */\n toCanvasElement: function(options) {\n options || (options = { });\n\n var utils = fabric.util, origParams = utils.saveObjectTransform(this),\n originalGroup = this.group,\n originalShadow = this.shadow, abs = Math.abs,\n multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? fabric.devicePixelRatio : 1);\n delete this.group;\n if (options.withoutTransform) {\n utils.resetObjectTransform(this);\n }\n if (options.withoutShadow) {\n this.shadow = null;\n }\n\n var el = fabric.util.createCanvasElement(),\n // skip canvas zoom and calculate with setCoords now.\n boundingRect = this.getBoundingRect(true, true),\n shadow = this.shadow, scaling,\n shadowOffset = { x: 0, y: 0 }, shadowBlur,\n width, height;\n\n if (shadow) {\n shadowBlur = shadow.blur;\n if (shadow.nonScaling) {\n scaling = { scaleX: 1, scaleY: 1 };\n }\n else {\n scaling = this.getObjectScaling();\n }\n // consider non scaling shadow.\n shadowOffset.x = 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * (abs(scaling.scaleX));\n shadowOffset.y = 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * (abs(scaling.scaleY));\n }\n width = boundingRect.width + shadowOffset.x;\n height = boundingRect.height + shadowOffset.y;\n // if the current width/height is not an integer\n // we need to make it so.\n el.width = Math.ceil(width);\n el.height = Math.ceil(height);\n var canvas = new fabric.StaticCanvas(el, {\n enableRetinaScaling: false,\n renderOnAddRemove: false,\n skipOffscreen: false,\n });\n if (options.format === 'jpeg') {\n canvas.backgroundColor = '#fff';\n }\n this.setPositionByOrigin(new fabric.Point(canvas.width / 2, canvas.height / 2), 'center', 'center');\n\n var originalCanvas = this.canvas;\n canvas.add(this);\n var canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n this.shadow = originalShadow;\n this.set('canvas', originalCanvas);\n if (originalGroup) {\n this.group = originalGroup;\n }\n this.set(origParams).setCoords();\n // canvas.dispose will call image.dispose that will nullify the elements\n // since this canvas is a simple element for the process, we remove references\n // to objects in this way in order to avoid object trashing.\n canvas._objects = [];\n canvas.dispose();\n canvas = null;\n\n return canvasEl;\n },\n\n /**\n * Converts an object into a data-url-like string\n * @param {Object} options Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toDataURL: function(options) {\n options || (options = { });\n return fabric.util.toDataURL(this.toCanvasElement(options), options.format || 'png', options.quality || 1);\n },\n\n /**\n * Returns true if specified type is identical to the type of an instance\n * @param {String} type Type to check against\n * @return {Boolean}\n */\n isType: function(type) {\n return this.type === type;\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance (is 1 unless subclassed)\n */\n complexity: function() {\n return 1;\n },\n\n /**\n * Returns a JSON representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} JSON\n */\n toJSON: function(propertiesToInclude) {\n // delegate, not alias\n return this.toObject(propertiesToInclude);\n },\n\n /**\n * Sets gradient (fill or stroke) of an object\n * percentages for x1,x2,y1,y2,r1,r2 together with gradientUnits 'pixels', are not supported.\n * Backwards incompatibility note: This method was named \"setGradientFill\" until v1.1.0\n * @param {String} property Property name 'stroke' or 'fill'\n * @param {Object} [options] Options object\n * @param {String} [options.type] Type of gradient 'radial' or 'linear'\n * @param {Number} [options.x1=0] x-coordinate of start point\n * @param {Number} [options.y1=0] y-coordinate of start point\n * @param {Number} [options.x2=0] x-coordinate of end point\n * @param {Number} [options.y2=0] y-coordinate of end point\n * @param {Number} [options.r1=0] Radius of start point (only for radial gradients)\n * @param {Number} [options.r2=0] Radius of end point (only for radial gradients)\n * @param {Object} [options.colorStops] Color stops object eg. {0: 'ff0000', 1: '000000'}\n * @param {Object} [options.gradientTransform] transformMatrix for gradient\n * @return {fabric.Object} thisArg\n * @chainable\n * @deprecated since 3.4.0\n * @see {@link http://jsfiddle.net/fabricjs/58y8b/|jsFiddle demo}\n * @example Set linear gradient\n * object.setGradient('fill', {\n * type: 'linear',\n * x1: -object.width / 2,\n * y1: 0,\n * x2: object.width / 2,\n * y2: 0,\n * colorStops: {\n * 0: 'red',\n * 0.5: '#005555',\n * 1: 'rgba(0,0,255,0.5)'\n * }\n * });\n * canvas.renderAll();\n * @example Set radial gradient\n * object.setGradient('fill', {\n * type: 'radial',\n * x1: 0,\n * y1: 0,\n * x2: 0,\n * y2: 0,\n * r1: object.width / 2,\n * r2: 10,\n * colorStops: {\n * 0: 'red',\n * 0.5: '#005555',\n * 1: 'rgba(0,0,255,0.5)'\n * }\n * });\n * canvas.renderAll();\n */\n setGradient: function(property, options) {\n options || (options = { });\n\n var gradient = { colorStops: [] };\n\n gradient.type = options.type || (options.r1 || options.r2 ? 'radial' : 'linear');\n gradient.coords = {\n x1: options.x1,\n y1: options.y1,\n x2: options.x2,\n y2: options.y2\n };\n gradient.gradientUnits = options.gradientUnits || 'pixels';\n if (options.r1 || options.r2) {\n gradient.coords.r1 = options.r1;\n gradient.coords.r2 = options.r2;\n }\n\n gradient.gradientTransform = options.gradientTransform;\n fabric.Gradient.prototype.addColorStop.call(gradient, options.colorStops);\n\n return this.set(property, fabric.Gradient.forObject(this, gradient));\n },\n\n /**\n * Sets pattern fill of an object\n * @param {Object} options Options object\n * @param {(String|HTMLImageElement)} options.source Pattern source\n * @param {String} [options.repeat=repeat] Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat)\n * @param {Number} [options.offsetX=0] Pattern horizontal offset from object's left/top corner\n * @param {Number} [options.offsetY=0] Pattern vertical offset from object's left/top corner\n * @param {Function} [callback] Callback to invoke when image set as a pattern\n * @return {fabric.Object} thisArg\n * @chainable\n * @deprecated since 3.5.0\n * @see {@link http://jsfiddle.net/fabricjs/QT3pa/|jsFiddle demo}\n * @example Set pattern\n * object.setPatternFill({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png',\n * repeat: 'repeat'\n * },canvas.renderAll.bind(canvas));\n */\n setPatternFill: function(options, callback) {\n return this.set('fill', new fabric.Pattern(options, callback));\n },\n\n /**\n * Sets {@link fabric.Object#shadow|shadow} of an object\n * @param {Object|String} [options] Options object or string (e.g. \"2px 2px 10px rgba(0,0,0,0.2)\")\n * @param {String} [options.color=rgb(0,0,0)] Shadow color\n * @param {Number} [options.blur=0] Shadow blur\n * @param {Number} [options.offsetX=0] Shadow horizontal offset\n * @param {Number} [options.offsetY=0] Shadow vertical offset\n * @return {fabric.Object} thisArg\n * @chainable\n * @deprecated since 3.5.0\n * @see {@link http://jsfiddle.net/fabricjs/7gvJG/|jsFiddle demo}\n * @example Set shadow with string notation\n * object.setShadow('2px 2px 10px rgba(0,0,0,0.2)');\n * canvas.renderAll();\n * @example Set shadow with object notation\n * object.setShadow({\n * color: 'red',\n * blur: 10,\n * offsetX: 20,\n * offsetY: 20\n * });\n * canvas.renderAll();\n */\n setShadow: function(options) {\n return this.set('shadow', options ? new fabric.Shadow(options) : null);\n },\n\n /**\n * Sets \"color\" of an instance (alias of `set('fill', …)`)\n * @param {String} color Color value\n * @return {fabric.Object} thisArg\n * @deprecated since 3.5.0\n * @chainable\n */\n setColor: function(color) {\n this.set('fill', color);\n return this;\n },\n\n /**\n * Sets \"angle\" of an instance with centered rotation\n * @param {Number} angle Angle value (in degrees)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n rotate: function(angle) {\n var shouldCenterOrigin = (this.originX !== 'center' || this.originY !== 'center') && this.centeredRotation;\n\n if (shouldCenterOrigin) {\n this._setOriginToCenter();\n }\n\n this.set('angle', angle);\n\n if (shouldCenterOrigin) {\n this._resetOrigin();\n }\n\n return this;\n },\n\n /**\n * Centers object horizontally on canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n centerH: function () {\n this.canvas && this.canvas.centerObjectH(this);\n return this;\n },\n\n /**\n * Centers object horizontally on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenterH: function () {\n this.canvas && this.canvas.viewportCenterObjectH(this);\n return this;\n },\n\n /**\n * Centers object vertically on canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n centerV: function () {\n this.canvas && this.canvas.centerObjectV(this);\n return this;\n },\n\n /**\n * Centers object vertically on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenterV: function () {\n this.canvas && this.canvas.viewportCenterObjectV(this);\n return this;\n },\n\n /**\n * Centers object vertically and horizontally on canvas to which is was added last\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n center: function () {\n this.canvas && this.canvas.centerObject(this);\n return this;\n },\n\n /**\n * Centers object on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenter: function () {\n this.canvas && this.canvas.viewportCenterObject(this);\n return this;\n },\n\n /**\n * Returns coordinates of a pointer relative to an object\n * @param {Event} e Event to operate upon\n * @param {Object} [pointer] Pointer to operate upon (instead of event)\n * @return {Object} Coordinates of a pointer (x, y)\n */\n getLocalPointer: function(e, pointer) {\n pointer = pointer || this.canvas.getPointer(e);\n var pClicked = new fabric.Point(pointer.x, pointer.y),\n objectLeftTop = this._getLeftTopCoords();\n if (this.angle) {\n pClicked = fabric.util.rotatePoint(\n pClicked, objectLeftTop, degreesToRadians(-this.angle));\n }\n return {\n x: pClicked.x - objectLeftTop.x,\n y: pClicked.y - objectLeftTop.y\n };\n },\n\n /**\n * Sets canvas globalCompositeOperation for specific object\n * custom composition operation for the particular object can be specified using globalCompositeOperation property\n * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n */\n _setupCompositeOperation: function (ctx) {\n if (this.globalCompositeOperation) {\n ctx.globalCompositeOperation = this.globalCompositeOperation;\n }\n }\n });\n\n fabric.util.createAccessors && fabric.util.createAccessors(fabric.Object);\n\n extend(fabric.Object.prototype, fabric.Observable);\n\n /**\n * Defines the number of fraction digits to use when serializing object values.\n * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n * @static\n * @memberOf fabric.Object\n * @constant\n * @type Number\n */\n fabric.Object.NUM_FRACTION_DIGITS = 2;\n\n fabric.Object._fromObject = function(className, object, callback, extraParam) {\n var klass = fabric[className];\n object = clone(object, true);\n fabric.util.enlivenPatterns([object.fill, object.stroke], function(patterns) {\n if (typeof patterns[0] !== 'undefined') {\n object.fill = patterns[0];\n }\n if (typeof patterns[1] !== 'undefined') {\n object.stroke = patterns[1];\n }\n fabric.util.enlivenObjects([object.clipPath], function(enlivedProps) {\n object.clipPath = enlivedProps[0];\n var instance = extraParam ? new klass(object[extraParam], object) : new klass(object);\n callback && callback(instance);\n });\n });\n };\n\n /**\n * Unique id used internally when creating SVG elements\n * @static\n * @memberOf fabric.Object\n * @type Number\n */\n fabric.Object.__uid = 0;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n var degreesToRadians = fabric.util.degreesToRadians,\n originXOffset = {\n left: -0.5,\n center: 0,\n right: 0.5\n },\n originYOffset = {\n top: -0.5,\n center: 0,\n bottom: 0.5\n };\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @param {String} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {String} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToGivenOrigin: function(point, fromOriginX, fromOriginY, toOriginX, toOriginY) {\n var x = point.x,\n y = point.y,\n offsetX, offsetY, dim;\n\n if (typeof fromOriginX === 'string') {\n fromOriginX = originXOffset[fromOriginX];\n }\n else {\n fromOriginX -= 0.5;\n }\n\n if (typeof toOriginX === 'string') {\n toOriginX = originXOffset[toOriginX];\n }\n else {\n toOriginX -= 0.5;\n }\n\n offsetX = toOriginX - fromOriginX;\n\n if (typeof fromOriginY === 'string') {\n fromOriginY = originYOffset[fromOriginY];\n }\n else {\n fromOriginY -= 0.5;\n }\n\n if (typeof toOriginY === 'string') {\n toOriginY = originYOffset[toOriginY];\n }\n else {\n toOriginY -= 0.5;\n }\n\n offsetY = toOriginY - fromOriginY;\n\n if (offsetX || offsetY) {\n dim = this._getTransformedDimensions();\n x = point.x + offsetX * dim.x;\n y = point.y + offsetY * dim.y;\n }\n\n return new fabric.Point(x, y);\n },\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToCenterPoint: function(point, originX, originY) {\n var p = this.translateToGivenOrigin(point, originX, originY, 'center', 'center');\n if (this.angle) {\n return fabric.util.rotatePoint(p, point, degreesToRadians(this.angle));\n }\n return p;\n },\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {fabric.Point} center The point which corresponds to center of the object\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToOriginPoint: function(center, originX, originY) {\n var p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n if (this.angle) {\n return fabric.util.rotatePoint(p, center, degreesToRadians(this.angle));\n }\n return p;\n },\n\n /**\n * Returns the real center coordinates of the object\n * @return {fabric.Point}\n */\n getCenterPoint: function() {\n var leftTop = new fabric.Point(this.left, this.top);\n return this.translateToCenterPoint(leftTop, this.originX, this.originY);\n },\n\n /**\n * Returns the coordinates of the object based on center coordinates\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @return {fabric.Point}\n */\n // getOriginPoint: function(center) {\n // return this.translateToOriginPoint(center, this.originX, this.originY);\n // },\n\n /**\n * Returns the coordinates of the object as if it has a different origin\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n getPointByOrigin: function(originX, originY) {\n var center = this.getCenterPoint();\n return this.translateToOriginPoint(center, originX, originY);\n },\n\n /**\n * Returns the point in local coordinates\n * @param {fabric.Point} point The point relative to the global coordinate system\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n toLocalPoint: function(point, originX, originY) {\n var center = this.getCenterPoint(),\n p, p2;\n\n if (typeof originX !== 'undefined' && typeof originY !== 'undefined' ) {\n p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n }\n else {\n p = new fabric.Point(this.left, this.top);\n }\n\n p2 = new fabric.Point(point.x, point.y);\n if (this.angle) {\n p2 = fabric.util.rotatePoint(p2, center, -degreesToRadians(this.angle));\n }\n return p2.subtractEquals(p);\n },\n\n /**\n * Returns the point in global coordinates\n * @param {fabric.Point} The point relative to the local coordinate system\n * @return {fabric.Point}\n */\n // toGlobalPoint: function(point) {\n // return fabric.util.rotatePoint(point, this.getCenterPoint(), degreesToRadians(this.angle)).addEquals(new fabric.Point(this.left, this.top));\n // },\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {fabric.Point} pos The new position of the object\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin: function(pos, originX, originY) {\n var center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(center, this.originX, this.originY);\n this.set('left', position.x);\n this.set('top', position.y);\n },\n\n /**\n * @param {String} to One of 'left', 'center', 'right'\n */\n adjustPosition: function(to) {\n var angle = degreesToRadians(this.angle),\n hypotFull = this.getScaledWidth(),\n xFull = fabric.util.cos(angle) * hypotFull,\n yFull = fabric.util.sin(angle) * hypotFull,\n offsetFrom, offsetTo;\n\n //TODO: this function does not consider mixed situation like top, center.\n if (typeof this.originX === 'string') {\n offsetFrom = originXOffset[this.originX];\n }\n else {\n offsetFrom = this.originX - 0.5;\n }\n if (typeof to === 'string') {\n offsetTo = originXOffset[to];\n }\n else {\n offsetTo = to - 0.5;\n }\n this.left += xFull * (offsetTo - offsetFrom);\n this.top += yFull * (offsetTo - offsetFrom);\n this.setCoords();\n this.originX = to;\n },\n\n /**\n * Sets the origin/position of the object to it's center point\n * @private\n * @return {void}\n */\n _setOriginToCenter: function() {\n this._originalOriginX = this.originX;\n this._originalOriginY = this.originY;\n\n var center = this.getCenterPoint();\n\n this.originX = 'center';\n this.originY = 'center';\n\n this.left = center.x;\n this.top = center.y;\n },\n\n /**\n * Resets the origin/position of the object to it's original origin\n * @private\n * @return {void}\n */\n _resetOrigin: function() {\n var originPoint = this.translateToOriginPoint(\n this.getCenterPoint(),\n this._originalOriginX,\n this._originalOriginY);\n\n this.originX = this._originalOriginX;\n this.originY = this._originalOriginY;\n\n this.left = originPoint.x;\n this.top = originPoint.y;\n\n this._originalOriginX = null;\n this._originalOriginY = null;\n },\n\n /**\n * @private\n */\n _getLeftTopCoords: function() {\n return this.translateToOriginPoint(this.getCenterPoint(), 'left', 'top');\n },\n });\n\n})();\n\n\n(function() {\n\n function getCoords(coords) {\n return [\n new fabric.Point(coords.tl.x, coords.tl.y),\n new fabric.Point(coords.tr.x, coords.tr.y),\n new fabric.Point(coords.br.x, coords.br.y),\n new fabric.Point(coords.bl.x, coords.bl.y)\n ];\n }\n\n var degreesToRadians = fabric.util.degreesToRadians,\n multiplyMatrices = fabric.util.multiplyTransformMatrices,\n transformPoint = fabric.util.transformPoint;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Describe object's corner position in canvas element coordinates.\n * properties are tl,mt,tr,ml,mr,bl,mb,br,mtr for the main controls.\n * each property is an object with x, y and corner.\n * The `corner` property contains in a similar manner the 4 points of the\n * interactive area of the corner.\n * The coordinates depends from this properties: width, height, scaleX, scaleY\n * skewX, skewY, angle, strokeWidth, viewportTransform, top, left, padding.\n * The coordinates get updated with @method setCoords.\n * You can calculate them without updating with @method calcCoords;\n * @memberOf fabric.Object.prototype\n */\n oCoords: null,\n\n /**\n * Describe object's corner position in canvas object absolute coordinates\n * properties are tl,tr,bl,br and describe the four main corner.\n * each property is an object with x, y, instance of Fabric.Point.\n * The coordinates depends from this properties: width, height, scaleX, scaleY\n * skewX, skewY, angle, strokeWidth, top, left.\n * Those coordinates are useful to understand where an object is. They get updated\n * with oCoords but they do not need to be updated when zoom or panning change.\n * The coordinates get updated with @method setCoords.\n * You can calculate them without updating with @method calcCoords(true);\n * @memberOf fabric.Object.prototype\n */\n aCoords: null,\n\n /**\n * storage for object transform matrix\n */\n ownMatrixCache: null,\n\n /**\n * storage for object full transform matrix\n */\n matrixCache: null,\n\n /**\n * return correct set of coordinates for intersection\n */\n getCoords: function(absolute, calculate) {\n if (!this.oCoords) {\n this.setCoords();\n }\n var coords = absolute ? this.aCoords : this.oCoords;\n return getCoords(calculate ? this.calcCoords(absolute) : coords);\n },\n\n /**\n * Checks if object intersects with an area formed by 2 points\n * @param {Object} pointTL top-left point of area\n * @param {Object} pointBR bottom-right point of area\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object intersects with an area formed by 2 points\n */\n intersectsWithRect: function(pointTL, pointBR, absolute, calculate) {\n var coords = this.getCoords(absolute, calculate),\n intersection = fabric.Intersection.intersectPolygonRectangle(\n coords,\n pointTL,\n pointBR\n );\n return intersection.status === 'Intersection';\n },\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject: function(other, absolute, calculate) {\n var intersection = fabric.Intersection.intersectPolygonPolygon(\n this.getCoords(absolute, calculate),\n other.getCoords(absolute, calculate)\n );\n\n return intersection.status === 'Intersection'\n || other.isContainedWithinObject(this, absolute, calculate)\n || this.isContainedWithinObject(other, absolute, calculate);\n },\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject: function(other, absolute, calculate) {\n var points = this.getCoords(absolute, calculate),\n i = 0, lines = other._getImageLines(\n calculate ? other.calcCoords(absolute) : absolute ? other.aCoords : other.oCoords\n );\n for (; i < 4; i++) {\n if (!other.containsPoint(points[i], lines)) {\n return false;\n }\n }\n return true;\n },\n\n /**\n * Checks if object is fully contained within area formed by 2 points\n * @param {Object} pointTL top-left point of area\n * @param {Object} pointBR bottom-right point of area\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is fully contained within area formed by 2 points\n */\n isContainedWithinRect: function(pointTL, pointBR, absolute, calculate) {\n var boundingRect = this.getBoundingRect(absolute, calculate);\n\n return (\n boundingRect.left >= pointTL.x &&\n boundingRect.left + boundingRect.width <= pointBR.x &&\n boundingRect.top >= pointTL.y &&\n boundingRect.top + boundingRect.height <= pointBR.y\n );\n },\n\n /**\n * Checks if point is inside the object\n * @param {fabric.Point} point Point to check against\n * @param {Object} [lines] object returned from @method _getImageLines\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if point is inside the object\n */\n containsPoint: function(point, lines, absolute, calculate) {\n var lines = lines || this._getImageLines(\n calculate ? this.calcCoords(absolute) : absolute ? this.aCoords : this.oCoords\n ),\n xPoints = this._findCrossPoints(point, lines);\n\n // if xPoints is odd then point is inside the object\n return (xPoints !== 0 && xPoints % 2 === 1);\n },\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @param {Boolean} [calculate] use coordinates of current position instead of .aCoords\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen: function(calculate) {\n if (!this.canvas) {\n return false;\n }\n var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n var points = this.getCoords(true, calculate), point;\n for (var i = 0; i < 4; i++) {\n point = points[i];\n if (point.x <= pointBR.x && point.x >= pointTL.x && point.y <= pointBR.y && point.y >= pointTL.y) {\n return true;\n }\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n return true;\n }\n return this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n },\n\n /**\n * Checks if the object contains the midpoint between canvas extremities\n * Does not make sense outside the context of isOnScreen and isPartiallyOnScreen\n * @private\n * @param {Fabric.Point} pointTL Top Left point\n * @param {Fabric.Point} pointBR Top Right point\n * @param {Boolean} calculate use coordinates of current position instead of .oCoords\n * @return {Boolean} true if the object contains the point\n */\n _containsCenterOfCanvas: function(pointTL, pointBR, calculate) {\n // worst case scenario the object is so big that contains the screen\n var centerPoint = { x: (pointTL.x + pointBR.x) / 2, y: (pointTL.y + pointBR.y) / 2 };\n if (this.containsPoint(centerPoint, null, true, calculate)) {\n return true;\n }\n return false;\n },\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen: function(calculate) {\n if (!this.canvas) {\n return false;\n }\n var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n return true;\n }\n return this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n },\n\n /**\n * Method that returns an object with the object edges in it, given the coordinates of the corners\n * @private\n * @param {Object} oCoords Coordinates of the object corners\n */\n _getImageLines: function(oCoords) {\n return {\n topline: {\n o: oCoords.tl,\n d: oCoords.tr\n },\n rightline: {\n o: oCoords.tr,\n d: oCoords.br\n },\n bottomline: {\n o: oCoords.br,\n d: oCoords.bl\n },\n leftline: {\n o: oCoords.bl,\n d: oCoords.tl\n }\n };\n },\n\n /**\n * Helper method to determine how many cross points are between the 4 object edges\n * and the horizontal line determined by a point on canvas\n * @private\n * @param {fabric.Point} point Point to check\n * @param {Object} lines Coordinates of the object being evaluated\n */\n // remove yi, not used but left code here just in case.\n _findCrossPoints: function(point, lines) {\n var b1, b2, a1, a2, xi, // yi,\n xcount = 0,\n iLine;\n\n for (var lineKey in lines) {\n iLine = lines[lineKey];\n // optimisation 1: line below point. no cross\n if ((iLine.o.y < point.y) && (iLine.d.y < point.y)) {\n continue;\n }\n // optimisation 2: line above point. no cross\n if ((iLine.o.y >= point.y) && (iLine.d.y >= point.y)) {\n continue;\n }\n // optimisation 3: vertical line case\n if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= point.x)) {\n xi = iLine.o.x;\n // yi = point.y;\n }\n // calculate the intersection point\n else {\n b1 = 0;\n b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x);\n a1 = point.y - b1 * point.x;\n a2 = iLine.o.y - b2 * iLine.o.x;\n\n xi = -(a1 - a2) / (b1 - b2);\n // yi = a1 + b1 * xi;\n }\n // dont count xi < point.x cases\n if (xi >= point.x) {\n xcount += 1;\n }\n // optimisation 4: specific for square images\n if (xcount === 2) {\n break;\n }\n }\n return xcount;\n },\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords / .aCoords\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect: function(absolute, calculate) {\n var coords = this.getCoords(absolute, calculate);\n return fabric.util.makeBoundingBoxFromPoints(coords);\n },\n\n /**\n * Returns width of an object's bounding box counting transformations\n * before 2.0 it was named getWidth();\n * @return {Number} width value\n */\n getScaledWidth: function() {\n return this._getTransformedDimensions().x;\n },\n\n /**\n * Returns height of an object bounding box counting transformations\n * before 2.0 it was named getHeight();\n * @return {Number} height value\n */\n getScaledHeight: function() {\n return this._getTransformedDimensions().y;\n },\n\n /**\n * Makes sure the scale is valid and modifies it if necessary\n * @private\n * @param {Number} value\n * @return {Number}\n */\n _constrainScale: function(value) {\n if (Math.abs(value) < this.minScaleLimit) {\n if (value < 0) {\n return -this.minScaleLimit;\n }\n else {\n return this.minScaleLimit;\n }\n }\n else if (value === 0) {\n return 0.0001;\n }\n return value;\n },\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scale: function(value) {\n this._set('scaleX', value);\n this._set('scaleY', value);\n return this.setCoords();\n },\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @param {Boolean} absolute ignore viewport\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scaleToWidth: function(value, absolute) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n var boundingRectFactor = this.getBoundingRect(absolute).width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n },\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @param {Boolean} absolute ignore viewport\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scaleToHeight: function(value, absolute) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n var boundingRectFactor = this.getBoundingRect(absolute).height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n },\n\n /**\n * Calculates and returns the .coords of an object.\n * @return {Object} Object with tl, tr, br, bl ....\n * @chainable\n */\n calcCoords: function(absolute) {\n var rotateMatrix = this._calcRotateMatrix(),\n translateMatrix = this._calcTranslateMatrix(),\n startMatrix = multiplyMatrices(translateMatrix, rotateMatrix),\n vpt = this.getViewportTransform(),\n finalMatrix = absolute ? startMatrix : multiplyMatrices(vpt, startMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2, h = dim.y / 2,\n tl = transformPoint({ x: -w, y: -h }, finalMatrix),\n tr = transformPoint({ x: w, y: -h }, finalMatrix),\n bl = transformPoint({ x: -w, y: h }, finalMatrix),\n br = transformPoint({ x: w, y: h }, finalMatrix);\n if (!absolute) {\n var padding = this.padding, angle = degreesToRadians(this.angle),\n cos = fabric.util.cos(angle), sin = fabric.util.sin(angle),\n cosP = cos * padding, sinP = sin * padding, cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP;\n if (padding) {\n tl.x -= cosPMinusSinP;\n tl.y -= cosPSinP;\n tr.x += cosPSinP;\n tr.y -= cosPMinusSinP;\n bl.x -= cosPSinP;\n bl.y += cosPMinusSinP;\n br.x += cosPMinusSinP;\n br.y += cosPSinP;\n }\n var ml = new fabric.Point((tl.x + bl.x) / 2, (tl.y + bl.y) / 2),\n mt = new fabric.Point((tr.x + tl.x) / 2, (tr.y + tl.y) / 2),\n mr = new fabric.Point((br.x + tr.x) / 2, (br.y + tr.y) / 2),\n mb = new fabric.Point((br.x + bl.x) / 2, (br.y + bl.y) / 2),\n mtr = new fabric.Point(mt.x + sin * this.rotatingPointOffset, mt.y - cos * this.rotatingPointOffset);\n }\n\n // if (!absolute) {\n // var canvas = this.canvas;\n // setTimeout(function() {\n // canvas.contextTop.clearRect(0, 0, 700, 700);\n // canvas.contextTop.fillStyle = 'green';\n // canvas.contextTop.fillRect(mb.x, mb.y, 3, 3);\n // canvas.contextTop.fillRect(bl.x, bl.y, 3, 3);\n // canvas.contextTop.fillRect(br.x, br.y, 3, 3);\n // canvas.contextTop.fillRect(tl.x, tl.y, 3, 3);\n // canvas.contextTop.fillRect(tr.x, tr.y, 3, 3);\n // canvas.contextTop.fillRect(ml.x, ml.y, 3, 3);\n // canvas.contextTop.fillRect(mr.x, mr.y, 3, 3);\n // canvas.contextTop.fillRect(mt.x, mt.y, 3, 3);\n // canvas.contextTop.fillRect(mtr.x, mtr.y, 3, 3);\n // }, 50);\n // }\n\n var coords = {\n // corners\n tl: tl, tr: tr, br: br, bl: bl,\n };\n if (!absolute) {\n // middle\n coords.ml = ml;\n coords.mt = mt;\n coords.mr = mr;\n coords.mb = mb;\n // rotating point\n coords.mtr = mtr;\n }\n return coords;\n },\n\n /**\n * Sets corner position coordinates based on current angle, width and height.\n * See {@link https://github.com/kangax/fabric.js/wiki/When-to-call-setCoords|When-to-call-setCoords}\n * @param {Boolean} [ignoreZoom] set oCoords with or without the viewport transform.\n * @param {Boolean} [skipAbsolute] skip calculation of aCoords, useful in setViewportTransform\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setCoords: function(ignoreZoom, skipAbsolute) {\n this.oCoords = this.calcCoords(ignoreZoom);\n if (!skipAbsolute) {\n this.aCoords = this.calcCoords(true);\n }\n\n // set coordinates of the draggable boxes in the corners used to scale/rotate the image\n ignoreZoom || (this._setCornerCoords && this._setCornerCoords());\n\n return this;\n },\n\n /**\n * calculate rotation matrix of an object\n * @return {Array} rotation matrix for the object\n */\n _calcRotateMatrix: function() {\n return fabric.util.calcRotateMatrix(this);\n },\n\n /**\n * calculate the translation matrix for an object transform\n * @return {Array} rotation matrix for the object\n */\n _calcTranslateMatrix: function() {\n var center = this.getCenterPoint();\n return [1, 0, 0, 1, center.x, center.y];\n },\n\n transformMatrixKey: function(skipGroup) {\n var sep = '_', prefix = '';\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup) + sep;\n };\n return prefix + this.top + sep + this.left + sep + this.scaleX + sep + this.scaleY +\n sep + this.skewX + sep + this.skewY + sep + this.angle + sep + this.originX + sep + this.originY +\n sep + this.width + sep + this.height + sep + this.strokeWidth + this.flipX + this.flipY;\n },\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * @return {Array} transform matrix for the object\n */\n calcTransformMatrix: function(skipGroup) {\n if (skipGroup) {\n return this.calcOwnMatrix();\n }\n var key = this.transformMatrixKey(), cache = this.matrixCache || (this.matrixCache = {});\n if (cache.key === key) {\n return cache.value;\n }\n var matrix = this.calcOwnMatrix();\n if (this.group) {\n matrix = multiplyMatrices(this.group.calcTransformMatrix(), matrix);\n }\n cache.key = key;\n cache.value = matrix;\n return matrix;\n },\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {Array} transform matrix for the object\n */\n calcOwnMatrix: function() {\n var key = this.transformMatrixKey(true), cache = this.ownMatrixCache || (this.ownMatrixCache = {});\n if (cache.key === key) {\n return cache.value;\n }\n var tMatrix = this._calcTranslateMatrix();\n this.translateX = tMatrix[4];\n this.translateY = tMatrix[5];\n cache.key = key;\n cache.value = fabric.util.composeMatrix(this);\n return cache.value;\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n * @deprecated since 3.4.0, please use fabric.util._calcDimensionsTransformMatrix\n * not including or including flipX, flipY to emulate the flipping boolean\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _calcDimensionsTransformMatrix: function(skewX, skewY, flipping) {\n return fabric.util.calcDimensionsMatrix({\n skewX: skewX,\n skewY: skewY,\n scaleX: this.scaleX * (flipping && this.flipX ? -1 : 1),\n scaleY: this.scaleY * (flipping && this.flipY ? -1 : 1)\n });\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _getNonTransformedDimensions: function() {\n var strokeWidth = this.strokeWidth,\n w = this.width + strokeWidth,\n h = this.height + strokeWidth;\n return { x: w, y: h };\n },\n\n /*\n * Calculate object bounding box dimensions from its properties scale, skew.\n * The skewX and skewY parameters are used in the skewing logic path and\n * do not provide something useful to common use cases.\n * @param {Number} [skewX], a value to override current skewX\n * @param {Number} [skewY], a value to override current skewY\n * @private\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _getTransformedDimensions: function(skewX, skewY) {\n if (typeof skewX === 'undefined') {\n skewX = this.skewX;\n }\n if (typeof skewY === 'undefined') {\n skewY = this.skewY;\n }\n var dimensions = this._getNonTransformedDimensions(), dimX, dimY,\n noSkew = skewX === 0 && skewY === 0;\n\n if (this.strokeUniform) {\n dimX = this.width;\n dimY = this.height;\n }\n else {\n dimX = dimensions.x;\n dimY = dimensions.y;\n }\n if (noSkew) {\n return this._finalizeDimensions(dimX * this.scaleX, dimY * this.scaleY);\n }\n else {\n dimX /= 2;\n dimY /= 2;\n }\n var points = [\n {\n x: -dimX,\n y: -dimY\n },\n {\n x: dimX,\n y: -dimY\n },\n {\n x: -dimX,\n y: dimY\n },\n {\n x: dimX,\n y: dimY\n }],\n transformMatrix = fabric.util.calcDimensionsMatrix({\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: skewX,\n skewY: skewY,\n }),\n bbox = fabric.util.makeBoundingBoxFromPoints(points, transformMatrix);\n return this._finalizeDimensions(bbox.width, bbox.height);\n },\n\n /*\n * Calculate object bounding box dimensions from its properties scale, skew.\n * @param Number width width of the bbox\n * @param Number height height of the bbox\n * @private\n * @return {Object} .x finalized width dimension\n * @return {Object} .y finalized height dimension\n */\n _finalizeDimensions: function(width, height) {\n return this.strokeUniform ?\n { x: width + this.strokeWidth, y: height + this.strokeWidth }\n :\n { x: width, y: height };\n },\n /*\n * Calculate object dimensions for controls, including padding and canvas zoom.\n * private\n */\n _calculateCurrentDimensions: function() {\n var vpt = this.getViewportTransform(),\n dim = this._getTransformedDimensions(),\n p = fabric.util.transformPoint(dim, vpt, true);\n\n return p.scalarAdd(2 * this.padding);\n },\n });\n})();\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Moves an object to the bottom of the stack of drawn objects\n * @return {fabric.Object} thisArg\n * @chainable\n */\n sendToBack: function() {\n if (this.group) {\n fabric.StaticCanvas.prototype.sendToBack.call(this.group, this);\n }\n else if (this.canvas) {\n this.canvas.sendToBack(this);\n }\n return this;\n },\n\n /**\n * Moves an object to the top of the stack of drawn objects\n * @return {fabric.Object} thisArg\n * @chainable\n */\n bringToFront: function() {\n if (this.group) {\n fabric.StaticCanvas.prototype.bringToFront.call(this.group, this);\n }\n else if (this.canvas) {\n this.canvas.bringToFront(this);\n }\n return this;\n },\n\n /**\n * Moves an object down in stack of drawn objects\n * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n sendBackwards: function(intersecting) {\n if (this.group) {\n fabric.StaticCanvas.prototype.sendBackwards.call(this.group, this, intersecting);\n }\n else if (this.canvas) {\n this.canvas.sendBackwards(this, intersecting);\n }\n return this;\n },\n\n /**\n * Moves an object up in stack of drawn objects\n * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n bringForward: function(intersecting) {\n if (this.group) {\n fabric.StaticCanvas.prototype.bringForward.call(this.group, this, intersecting);\n }\n else if (this.canvas) {\n this.canvas.bringForward(this, intersecting);\n }\n return this;\n },\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {Number} index New position of object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n moveTo: function(index) {\n if (this.group && this.group.type !== 'activeSelection') {\n fabric.StaticCanvas.prototype.moveTo.call(this.group, this, index);\n }\n else if (this.canvas) {\n this.canvas.moveTo(this, index);\n }\n return this;\n }\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n function getSvgColorString(prop, value) {\n if (!value) {\n return prop + ': none; ';\n }\n else if (value.toLive) {\n return prop + ': url(#SVGID_' + value.id + '); ';\n }\n else {\n var color = new fabric.Color(value),\n str = prop + ': ' + color.toRgb() + '; ',\n opacity = color.getAlpha();\n if (opacity !== 1) {\n //change the color in rgb + opacity\n str += prop + '-opacity: ' + opacity.toString() + '; ';\n }\n return str;\n }\n }\n\n var toFixed = fabric.util.toFixed;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles: function(skipShadow) {\n\n var fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray ? this.strokeDashArray.join(' ') : 'none',\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = getSvgColorString('fill', this.fill),\n stroke = getSvgColorString('stroke', this.stroke);\n\n return [\n stroke,\n 'stroke-width: ', strokeWidth, '; ',\n 'stroke-dasharray: ', strokeDashArray, '; ',\n 'stroke-linecap: ', strokeLineCap, '; ',\n 'stroke-dashoffset: ', strokeDashOffset, '; ',\n 'stroke-linejoin: ', strokeLineJoin, '; ',\n 'stroke-miterlimit: ', strokeMiterLimit, '; ',\n fill,\n 'fill-rule: ', fillRule, '; ',\n 'opacity: ', opacity, ';',\n filter,\n visibility\n ].join('');\n },\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles: function(style, useWhiteSpace) {\n var term = '; ';\n var fontFamily = style.fontFamily ?\n 'font-family: ' + (((style.fontFamily.indexOf('\\'') === -1 && style.fontFamily.indexOf('\"') === -1) ?\n '\\'' + style.fontFamily + '\\'' : style.fontFamily)) + term : '';\n var strokeWidth = style.strokeWidth ? 'stroke-width: ' + style.strokeWidth + term : '',\n fontFamily = fontFamily,\n fontSize = style.fontSize ? 'font-size: ' + style.fontSize + 'px' + term : '',\n fontStyle = style.fontStyle ? 'font-style: ' + style.fontStyle + term : '',\n fontWeight = style.fontWeight ? 'font-weight: ' + style.fontWeight + term : '',\n fill = style.fill ? getSvgColorString('fill', style.fill) : '',\n stroke = style.stroke ? getSvgColorString('stroke', style.stroke) : '',\n textDecoration = this.getSvgTextDecoration(style),\n deltaY = style.deltaY ? 'baseline-shift: ' + (-style.deltaY) + '; ' : '';\n if (textDecoration) {\n textDecoration = 'text-decoration: ' + textDecoration + term;\n }\n\n return [\n stroke,\n strokeWidth,\n fontFamily,\n fontSize,\n fontStyle,\n fontWeight,\n textDecoration,\n fill,\n deltaY,\n useWhiteSpace ? 'white-space: pre; ' : ''\n ].join('');\n },\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration: function(style) {\n return ['overline', 'underline', 'line-through'].filter(function(decoration) {\n return style[decoration.replace('-', '')];\n }).join(' ');\n },\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter: function() {\n return this.shadow ? 'filter: url(#SVGID_' + this.shadow.id + ');' : '';\n },\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons: function() {\n return [\n this.id ? 'id=\"' + this.id + '\" ' : '',\n this.clipPath ? 'clip-path=\"url(#' + this.clipPath.clipPathId + ')\" ' : '',\n ].join('');\n },\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform: function(full, additionalTransform) {\n var transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = 'transform=\"' + fabric.util.matrixToSVG(transform);\n return svgTransform +\n (additionalTransform || '') + this.getSvgTransformMatrix() + '\" ';\n },\n\n /**\n * Returns transform-string for svg-export from the transform matrix of single elements\n * @return {String}\n */\n getSvgTransformMatrix: function() {\n return this.transformMatrix ? ' ' + fabric.util.matrixToSVG(this.transformMatrix) : '';\n },\n\n _setSVGBg: function(textBgRects) {\n if (this.backgroundColor) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n textBgRects.push(\n '\\t\\t\\n');\n }\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n return '\\t' + this._createBaseClipPathSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n },\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup: function(objectMarkup, options) {\n options = options || {};\n var reviver = options.reviver,\n additionalTransform = options.additionalTransform || '',\n commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n },\n\n /**\n * @private\n */\n _createBaseSVGMarkup: function(objectMarkup, options) {\n options = options || {};\n var noStyle = options.noStyle,\n reviver = options.reviver,\n styleInfo = noStyle ? '' : 'style=\"' + this.getSvgStyles() + '\" ',\n shadowInfo = options.withShadow ? 'style=\"' + this.getSvgFilter() + '\" ' : '',\n clipPath = this.clipPath,\n vectorEffect = this.strokeUniform ? 'vector-effect=\"non-scaling-stroke\" ' : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke, fill = this.fill, shadow = this.shadow,\n commonPieces, markup = [], clipPathMarkup,\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS'),\n additionalTransform = options.additionalTransform;\n if (clipPath) {\n clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++;\n clipPathMarkup = '\\n' +\n clipPath.toClipPathSVG(reviver) +\n '\\n';\n }\n if (absoluteClipPath) {\n markup.push(\n '\\n'\n );\n }\n markup.push(\n '\\n'\n );\n commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(), ' ',\n additionalTransform ? 'transform=\"' + additionalTransform + '\" ' : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (fill && fill.toLive) {\n markup.push(fill.toSVG(this));\n }\n if (stroke && stroke.toLive) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('\\n');\n absoluteClipPath && markup.push('\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n },\n\n addPaintOrder: function() {\n return this.paintFirst !== 'fill' ? ' paint-order=\"' + this.paintFirst + '\" ' : '';\n }\n });\n})();\n/* _TO_SVG_END_ */\n\n\n(function() {\n\n var extend = fabric.util.object.extend,\n originalSet = 'stateProperties';\n\n /*\n Depends on `stateProperties`\n */\n function saveProps(origin, destination, props) {\n var tmpObj = { }, deep = true;\n props.forEach(function(prop) {\n tmpObj[prop] = origin[prop];\n });\n extend(origin[destination], tmpObj, deep);\n }\n\n function _isEqual(origValue, currentValue, firstPass) {\n if (origValue === currentValue) {\n // if the objects are identical, return\n return true;\n }\n else if (Array.isArray(origValue)) {\n if (!Array.isArray(currentValue) || origValue.length !== currentValue.length) {\n return false;\n }\n for (var i = 0, len = origValue.length; i < len; i++) {\n if (!_isEqual(origValue[i], currentValue[i])) {\n return false;\n }\n }\n return true;\n }\n else if (origValue && typeof origValue === 'object') {\n var keys = Object.keys(origValue), key;\n if (!currentValue ||\n typeof currentValue !== 'object' ||\n (!firstPass && keys.length !== Object.keys(currentValue).length)\n ) {\n return false;\n }\n for (var i = 0, len = keys.length; i < len; i++) {\n key = keys[i];\n // since clipPath is in the statefull cache list and the clipPath objects\n // would be iterated as an object, this would lead to possible infinite recursion\n if (key === 'canvas') {\n continue;\n }\n if (!_isEqual(origValue[key], currentValue[key])) {\n return false;\n }\n }\n return true;\n }\n }\n\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Returns true if object state (one of its state properties) was changed\n * @param {String} [propertySet] optional name for the set of property we want to save\n * @return {Boolean} true if instance' state has changed since `{@link fabric.Object#saveState}` was called\n */\n hasStateChanged: function(propertySet) {\n propertySet = propertySet || originalSet;\n var dashedPropertySet = '_' + propertySet;\n if (Object.keys(this[dashedPropertySet]).length < this[propertySet].length) {\n return true;\n }\n return !_isEqual(this[dashedPropertySet], this, true);\n },\n\n /**\n * Saves state of an object\n * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n * @return {fabric.Object} thisArg\n */\n saveState: function(options) {\n var propertySet = options && options.propertySet || originalSet,\n destination = '_' + propertySet;\n if (!this[destination]) {\n return this.setupState(options);\n }\n saveProps(this, destination, this[propertySet]);\n if (options && options.stateProperties) {\n saveProps(this, destination, options.stateProperties);\n }\n return this;\n },\n\n /**\n * Setups state of an object\n * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n * @return {fabric.Object} thisArg\n */\n setupState: function(options) {\n options = options || { };\n var propertySet = options.propertySet || originalSet;\n options.propertySet = propertySet;\n this['_' + propertySet] = { };\n this.saveState(options);\n return this;\n }\n });\n})();\n\n\n(function() {\n\n var degreesToRadians = fabric.util.degreesToRadians;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * The object interactivity controls.\n * @private\n */\n _controlsVisibility: null,\n\n /**\n * Determines which corner has been clicked\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found\n */\n _findTargetCorner: function(pointer) {\n // objects in group, anykind, are not self modificable,\n // must not return an hovered corner.\n if (!this.hasControls || this.group || (!this.canvas || this.canvas._activeObject !== this)) {\n return false;\n }\n\n var ex = pointer.x,\n ey = pointer.y,\n xPoints,\n lines;\n this.__corner = 0;\n for (var i in this.oCoords) {\n\n if (!this.isControlVisible(i)) {\n continue;\n }\n\n if (i === 'mtr' && !this.hasRotatingPoint) {\n continue;\n }\n\n if (this.get('lockUniScaling') &&\n (i === 'mt' || i === 'mr' || i === 'mb' || i === 'ml')) {\n continue;\n }\n\n lines = this._getImageLines(this.oCoords[i].corner);\n\n // debugging\n\n // canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);\n // canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);\n\n // canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);\n // canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);\n\n // canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);\n // canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);\n\n // canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);\n // canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);\n\n xPoints = this._findCrossPoints({ x: ex, y: ey }, lines);\n if (xPoints !== 0 && xPoints % 2 === 1) {\n this.__corner = i;\n return i;\n }\n }\n return false;\n },\n\n /**\n * Sets the coordinates of the draggable boxes in the corners of\n * the image used to scale/rotate it.\n * @private\n */\n _setCornerCoords: function() {\n var coords = this.oCoords,\n newTheta = degreesToRadians(45 - this.angle),\n /* Math.sqrt(2 * Math.pow(this.cornerSize, 2)) / 2, */\n /* 0.707106 stands for sqrt(2)/2 */\n cornerHypotenuse = this.cornerSize * 0.707106,\n cosHalfOffset = cornerHypotenuse * fabric.util.cos(newTheta),\n sinHalfOffset = cornerHypotenuse * fabric.util.sin(newTheta),\n x, y;\n\n for (var point in coords) {\n x = coords[point].x;\n y = coords[point].y;\n coords[point].corner = {\n tl: {\n x: x - sinHalfOffset,\n y: y - cosHalfOffset\n },\n tr: {\n x: x + cosHalfOffset,\n y: y - sinHalfOffset\n },\n bl: {\n x: x - cosHalfOffset,\n y: y + sinHalfOffset\n },\n br: {\n x: x + sinHalfOffset,\n y: y + cosHalfOffset\n }\n };\n }\n },\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawSelectionBackground: function(ctx) {\n if (!this.selectionBackgroundColor ||\n (this.canvas && !this.canvas.interactive) ||\n (this.canvas && this.canvas._activeObject !== this)\n ) {\n return this;\n }\n ctx.save();\n var center = this.getCenterPoint(), wh = this._calculateCurrentDimensions(),\n vpt = this.canvas.viewportTransform;\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n return this;\n },\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawBorders: function(ctx, styleOverride) {\n styleOverride = styleOverride || {};\n var wh = this._calculateCurrentDimensions(),\n strokeWidth = this.borderScaleFactor,\n width = wh.x + strokeWidth,\n height = wh.y + strokeWidth,\n drawRotatingPoint = typeof styleOverride.hasRotatingPoint !== 'undefined' ?\n styleOverride.hasRotatingPoint : this.hasRotatingPoint,\n hasControls = typeof styleOverride.hasControls !== 'undefined' ?\n styleOverride.hasControls : this.hasControls,\n rotatingPointOffset = typeof styleOverride.rotatingPointOffset !== 'undefined' ?\n styleOverride.rotatingPointOffset : this.rotatingPointOffset;\n\n ctx.save();\n ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray, null);\n\n ctx.strokeRect(\n -width / 2,\n -height / 2,\n width,\n height\n );\n\n if (drawRotatingPoint && this.isControlVisible('mtr') && hasControls) {\n\n var rotateHeight = -height / 2;\n\n ctx.beginPath();\n ctx.moveTo(0, rotateHeight);\n ctx.lineTo(0, rotateHeight - rotatingPointOffset);\n ctx.stroke();\n }\n\n ctx.restore();\n return this;\n },\n\n /**\n * Draws borders of an object's bounding box when it is inside a group.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawBordersInGroup: function(ctx, options, styleOverride) {\n styleOverride = styleOverride || {};\n var p = { x: this.width, y: this.height },\n matrix = fabric.util.composeMatrix({\n scaleX: options.scaleX,\n scaleY: options.scaleY,\n skewX: options.skewX\n }),\n wh = fabric.util.transformPoint(p, matrix),\n strokeWidth = this.strokeWidth,\n borderScaleFactor = this.borderScaleFactor,\n width =\n wh.x + strokeWidth * (this.strokeUniform ? this.canvas.getZoom() : options.scaleX) + borderScaleFactor,\n height =\n wh.y + strokeWidth * (this.strokeUniform ? this.canvas.getZoom() : options.scaleY) + borderScaleFactor;\n ctx.save();\n this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray, null);\n ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n\n ctx.strokeRect(\n -width / 2,\n -height / 2,\n width,\n height\n );\n\n ctx.restore();\n return this;\n },\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawControls: function(ctx, styleOverride) {\n styleOverride = styleOverride || {};\n var wh = this._calculateCurrentDimensions(),\n width = wh.x,\n height = wh.y,\n scaleOffset = styleOverride.cornerSize || this.cornerSize,\n left = -(width + scaleOffset) / 2,\n top = -(height + scaleOffset) / 2,\n transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ?\n styleOverride.transparentCorners : this.transparentCorners,\n hasRotatingPoint = typeof styleOverride.hasRotatingPoint !== 'undefined' ?\n styleOverride.hasRotatingPoint : this.hasRotatingPoint,\n methodName = transparentCorners ? 'stroke' : 'fill';\n\n ctx.save();\n ctx.strokeStyle = ctx.fillStyle = styleOverride.cornerColor || this.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = styleOverride.cornerStrokeColor || this.cornerStrokeColor;\n }\n this._setLineDash(ctx, styleOverride.cornerDashArray || this.cornerDashArray, null);\n\n // top-left\n this._drawControl('tl', ctx, methodName,\n left,\n top, styleOverride);\n\n // top-right\n this._drawControl('tr', ctx, methodName,\n left + width,\n top, styleOverride);\n\n // bottom-left\n this._drawControl('bl', ctx, methodName,\n left,\n top + height, styleOverride);\n\n // bottom-right\n this._drawControl('br', ctx, methodName,\n left + width,\n top + height, styleOverride);\n\n if (!this.get('lockUniScaling')) {\n\n // middle-top\n this._drawControl('mt', ctx, methodName,\n left + width / 2,\n top, styleOverride);\n\n // middle-bottom\n this._drawControl('mb', ctx, methodName,\n left + width / 2,\n top + height, styleOverride);\n\n // middle-right\n this._drawControl('mr', ctx, methodName,\n left + width,\n top + height / 2, styleOverride);\n\n // middle-left\n this._drawControl('ml', ctx, methodName,\n left,\n top + height / 2, styleOverride);\n }\n\n // middle-top-rotate\n if (hasRotatingPoint) {\n this._drawControl('mtr', ctx, methodName,\n left + width / 2,\n top - this.rotatingPointOffset, styleOverride);\n }\n\n ctx.restore();\n\n return this;\n },\n\n /**\n * @private\n */\n _drawControl: function(control, ctx, methodName, left, top, styleOverride) {\n styleOverride = styleOverride || {};\n if (!this.isControlVisible(control)) {\n return;\n }\n var size = this.cornerSize, stroke = !this.transparentCorners && this.cornerStrokeColor;\n switch (styleOverride.cornerStyle || this.cornerStyle) {\n case 'circle':\n ctx.beginPath();\n ctx.arc(left + size / 2, top + size / 2, size / 2, 0, 2 * Math.PI, false);\n ctx[methodName]();\n if (stroke) {\n ctx.stroke();\n }\n break;\n default:\n this.transparentCorners || ctx.clearRect(left, top, size, size);\n ctx[methodName + 'Rect'](left, top, size, size);\n if (stroke) {\n ctx.strokeRect(left, top, size, size);\n }\n }\n },\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {String} controlName The name of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * @returns {Boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible: function(controlName) {\n return this._getControlsVisibility()[controlName];\n },\n\n /**\n * Sets the visibility of the specified control.\n * @param {String} controlName The name of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setControlVisible: function(controlName, visible) {\n this._getControlsVisibility()[controlName] = visible;\n return this;\n },\n\n /**\n * Sets the visibility state of object controls.\n * @param {Object} [options] Options object\n * @param {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n * @param {Boolean} [options.br] true to enable the bottom-right control, false to disable it\n * @param {Boolean} [options.mb] true to enable the middle-bottom control, false to disable it\n * @param {Boolean} [options.ml] true to enable the middle-left control, false to disable it\n * @param {Boolean} [options.mr] true to enable the middle-right control, false to disable it\n * @param {Boolean} [options.mt] true to enable the middle-top control, false to disable it\n * @param {Boolean} [options.tl] true to enable the top-left control, false to disable it\n * @param {Boolean} [options.tr] true to enable the top-right control, false to disable it\n * @param {Boolean} [options.mtr] true to enable the middle-top-rotate control, false to disable it\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setControlsVisibility: function(options) {\n options || (options = { });\n\n for (var p in options) {\n this.setControlVisible(p, options[p]);\n }\n return this;\n },\n\n /**\n * Returns the instance of the control visibility set for this object.\n * @private\n * @returns {Object}\n */\n _getControlsVisibility: function() {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {\n tl: true,\n tr: true,\n br: true,\n bl: true,\n ml: true,\n mt: true,\n mr: true,\n mb: true,\n mtr: true\n };\n }\n return this._controlsVisibility;\n },\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [options] options sent from the upper functions\n * @param {Event} [options.e] event if the process is generated by an event\n */\n onDeselect: function() {\n // implemented by sub-classes, as needed.\n },\n\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [options] options sent from the upper functions\n * @param {Event} [options.e] event if the process is generated by an event\n */\n onSelect: function() {\n // implemented by sub-classes, as needed.\n }\n });\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Animation duration (in ms) for fx* methods\n * @type Number\n * @default\n */\n FX_DURATION: 500,\n\n /**\n * Centers object horizontally with animation.\n * @param {fabric.Object} object Object to center\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n fxCenterObjectH: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n fabric.util.animate({\n startValue: object.left,\n endValue: this.getCenter().left,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('left', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function() {\n object.setCoords();\n onComplete();\n }\n });\n\n return this;\n },\n\n /**\n * Centers object vertically with animation.\n * @param {fabric.Object} object Object to center\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n fxCenterObjectV: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n fabric.util.animate({\n startValue: object.top,\n endValue: this.getCenter().top,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('top', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function() {\n object.setCoords();\n onComplete();\n }\n });\n\n return this;\n },\n\n /**\n * Same as `fabric.Canvas#remove` but animated\n * @param {fabric.Object} object Object to remove\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n fxRemove: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n fabric.util.animate({\n startValue: object.opacity,\n endValue: 0,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('opacity', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function () {\n _this.remove(object);\n onComplete();\n }\n });\n\n return this;\n }\n});\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Animates object's properties\n * @param {String|Object} property Property to animate (if string) or properties to animate (if object)\n * @param {Number|Object} value Value to animate property to (if string was given first) or options object\n * @return {fabric.Object} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation}\n * @chainable\n *\n * As object — multiple properties\n *\n * object.animate({ left: ..., top: ... });\n * object.animate({ left: ..., top: ... }, { duration: ... });\n *\n * As string — one property\n *\n * object.animate('left', ...);\n * object.animate('left', { duration: ... });\n *\n */\n animate: function() {\n if (arguments[0] && typeof arguments[0] === 'object') {\n var propsToAnimate = [], prop, skipCallbacks;\n for (prop in arguments[0]) {\n propsToAnimate.push(prop);\n }\n for (var i = 0, len = propsToAnimate.length; i < len; i++) {\n prop = propsToAnimate[i];\n skipCallbacks = i !== len - 1;\n this._animate(prop, arguments[0][prop], arguments[1], skipCallbacks);\n }\n }\n else {\n this._animate.apply(this, arguments);\n }\n return this;\n },\n\n /**\n * @private\n * @param {String} property Property to animate\n * @param {String} to Value to animate to\n * @param {Object} [options] Options object\n * @param {Boolean} [skipCallbacks] When true, callbacks like onchange and oncomplete are not invoked\n */\n _animate: function(property, to, options, skipCallbacks) {\n var _this = this, propPair;\n\n to = to.toString();\n\n if (!options) {\n options = { };\n }\n else {\n options = fabric.util.object.clone(options);\n }\n\n if (~property.indexOf('.')) {\n propPair = property.split('.');\n }\n\n var currentValue = propPair\n ? this.get(propPair[0])[propPair[1]]\n : this.get(property);\n\n if (!('from' in options)) {\n options.from = currentValue;\n }\n\n if (~to.indexOf('=')) {\n to = currentValue + parseFloat(to.replace('=', ''));\n }\n else {\n to = parseFloat(to);\n }\n\n fabric.util.animate({\n startValue: options.from,\n endValue: to,\n byValue: options.by,\n easing: options.easing,\n duration: options.duration,\n abort: options.abort && function() {\n return options.abort.call(_this);\n },\n onChange: function(value, valueProgress, timeProgress) {\n if (propPair) {\n _this[propPair[0]][propPair[1]] = value;\n }\n else {\n _this.set(property, value);\n }\n if (skipCallbacks) {\n return;\n }\n options.onChange && options.onChange(value, valueProgress, timeProgress);\n },\n onComplete: function(value, valueProgress, timeProgress) {\n if (skipCallbacks) {\n return;\n }\n\n _this.setCoords();\n options.onComplete && options.onComplete(value, valueProgress, timeProgress);\n }\n });\n }\n});\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n coordProps = { x1: 1, x2: 1, y1: 1, y2: 1 },\n supportsLineDash = fabric.StaticCanvas.supports('setLineDash');\n\n if (fabric.Line) {\n fabric.warn('fabric.Line is already defined');\n return;\n }\n\n /**\n * Line class\n * @class fabric.Line\n * @extends fabric.Object\n * @see {@link fabric.Line#initialize} for constructor definition\n */\n fabric.Line = fabric.util.createClass(fabric.Object, /** @lends fabric.Line.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'line',\n\n /**\n * x value or first line edge\n * @type Number\n * @default\n */\n x1: 0,\n\n /**\n * y value or first line edge\n * @type Number\n * @default\n */\n y1: 0,\n\n /**\n * x value or second line edge\n * @type Number\n * @default\n */\n x2: 0,\n\n /**\n * y value or second line edge\n * @type Number\n * @default\n */\n y2: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('x1', 'x2', 'y1', 'y2'),\n\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {fabric.Line} thisArg\n */\n initialize: function(points, options) {\n if (!points) {\n points = [0, 0, 0, 0];\n }\n\n this.callSuper('initialize', options);\n\n this.set('x1', points[0]);\n this.set('y1', points[1]);\n this.set('x2', points[2]);\n this.set('y2', points[3]);\n\n this._setWidthHeight(options);\n },\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight: function(options) {\n options || (options = { });\n\n this.width = Math.abs(this.x2 - this.x1);\n this.height = Math.abs(this.y2 - this.y1);\n\n this.left = 'left' in options\n ? options.left\n : this._getLeftToOriginX();\n\n this.top = 'top' in options\n ? options.top\n : this._getTopToOriginY();\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n if (typeof coordProps[key] !== 'undefined') {\n this._setWidthHeight();\n }\n return this;\n },\n\n /**\n * @private\n * @return {Number} leftToOriginX Distance from left edge of canvas to originX of Line.\n */\n _getLeftToOriginX: makeEdgeToOriginGetter(\n { // property names\n origin: 'originX',\n axis1: 'x1',\n axis2: 'x2',\n dimension: 'width'\n },\n { // possible values of origin\n nearest: 'left',\n center: 'center',\n farthest: 'right'\n }\n ),\n\n /**\n * @private\n * @return {Number} topToOriginY Distance from top edge of canvas to originY of Line.\n */\n _getTopToOriginY: makeEdgeToOriginGetter(\n { // property names\n origin: 'originY',\n axis1: 'y1',\n axis2: 'y2',\n dimension: 'height'\n },\n { // possible values of origin\n nearest: 'top',\n center: 'center',\n farthest: 'bottom'\n }\n ),\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n\n if (!this.strokeDashArray || this.strokeDashArray && supportsLineDash) {\n // move from center (of virtual box) to its left/top corner\n // we can't assume x1, y1 is top left and x2, y2 is bottom right\n var p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n }\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n var origStrokeStyle = ctx.strokeStyle;\n ctx.strokeStyle = this.stroke || ctx.fillStyle;\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var p = this.calcLinePoints();\n\n ctx.beginPath();\n fabric.util.drawDashedLine(ctx, p.x1, p.y1, p.x2, p.y2, this.strokeDashArray);\n ctx.closePath();\n },\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Object} center point from element coordinates\n */\n _findCenterFromElement: function() {\n return {\n x: (this.x1 + this.x2) / 2,\n y: (this.y1 + this.y2) / 2,\n };\n },\n\n /**\n * Returns object representation of an instance\n * @methd toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), this.calcLinePoints());\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions: function() {\n var dim = this.callSuper('_getNonTransformedDimensions');\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n },\n\n /**\n * Recalculates line points given width and height\n * @private\n */\n calcLinePoints: function() {\n var xMult = this.x1 <= this.x2 ? -1 : 1,\n yMult = this.y1 <= this.y2 ? -1 : 1,\n x1 = (xMult * this.width * 0.5),\n y1 = (yMult * this.height * 0.5),\n x2 = (xMult * this.width * -0.5),\n y2 = (yMult * this.height * -0.5);\n\n return {\n x1: x1,\n x2: x2,\n y1: y1,\n y2: y2\n };\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var p = this.calcLinePoints();\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Line.fromElement})\n * @static\n * @memberOf fabric.Line\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n fabric.Line.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x1 y1 x2 y2'.split(' '));\n\n /**\n * Returns fabric.Line instance from an SVG element\n * @static\n * @memberOf fabric.Line\n * @param {SVGElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n fabric.Line.fromElement = function(element, callback, options) {\n options = options || { };\n var parsedAttributes = fabric.parseAttributes(element, fabric.Line.ATTRIBUTE_NAMES),\n points = [\n parsedAttributes.x1 || 0,\n parsedAttributes.y1 || 0,\n parsedAttributes.x2 || 0,\n parsedAttributes.y2 || 0\n ];\n callback(new fabric.Line(points, extend(parsedAttributes, options)));\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Line instance from an object representation\n * @static\n * @memberOf fabric.Line\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n */\n fabric.Line.fromObject = function(object, callback) {\n function _callback(instance) {\n delete instance.points;\n callback && callback(instance);\n };\n var options = clone(object, true);\n options.points = [object.x1, object.y1, object.x2, object.y2];\n fabric.Object._fromObject('Line', options, _callback, 'points');\n };\n\n /**\n * Produces a function that calculates distance from canvas edge to Line origin.\n */\n function makeEdgeToOriginGetter(propertyNames, originValues) {\n var origin = propertyNames.origin,\n axis1 = propertyNames.axis1,\n axis2 = propertyNames.axis2,\n dimension = propertyNames.dimension,\n nearest = originValues.nearest,\n center = originValues.center,\n farthest = originValues.farthest;\n\n return function() {\n switch (this.get(origin)) {\n case nearest:\n return Math.min(this.get(axis1), this.get(axis2));\n case center:\n return Math.min(this.get(axis1), this.get(axis2)) + (0.5 * this.get(dimension));\n case farthest:\n return Math.max(this.get(axis1), this.get(axis2));\n }\n };\n\n }\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n pi = Math.PI;\n\n if (fabric.Circle) {\n fabric.warn('fabric.Circle is already defined.');\n return;\n }\n\n /**\n * Circle class\n * @class fabric.Circle\n * @extends fabric.Object\n * @see {@link fabric.Circle#initialize} for constructor definition\n */\n fabric.Circle = fabric.util.createClass(fabric.Object, /** @lends fabric.Circle.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'circle',\n\n /**\n * Radius of this circle\n * @type Number\n * @default\n */\n radius: 0,\n\n /**\n * Start angle of the circle, moving clockwise\n * deprectated type, this should be in degree, this was an oversight.\n * probably will change to degrees in next major version\n * @type Number\n * @default 0\n */\n startAngle: 0,\n\n /**\n * End angle of the circle\n * deprectated type, this should be in degree, this was an oversight.\n * probably will change to degrees in next major version\n * @type Number\n * @default 2Pi\n */\n endAngle: pi * 2,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('radius', 'startAngle', 'endAngle'),\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Circle} thisArg\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['radius', 'startAngle', 'endAngle'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var svgString, x = 0, y = 0,\n angle = (this.endAngle - this.startAngle) % ( 2 * pi);\n\n if (angle === 0) {\n svgString = [\n '\\n'\n ];\n }\n else {\n var startX = fabric.util.cos(this.startAngle) * this.radius,\n startY = fabric.util.sin(this.startAngle) * this.radius,\n endX = fabric.util.cos(this.endAngle) * this.radius,\n endY = fabric.util.sin(this.endAngle) * this.radius,\n largeFlag = angle > pi ? '1' : '0';\n svgString = [\n '\\n'\n ];\n }\n return svgString;\n },\n /* _TO_SVG_END_ */\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n this.startAngle,\n this.endAngle, false);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX: function() {\n return this.get('radius') * this.get('scaleX');\n },\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY: function() {\n return this.get('radius') * this.get('scaleY');\n },\n\n /**\n * Sets radius of an object (and updates width accordingly)\n * @return {fabric.Circle} thisArg\n */\n setRadius: function(value) {\n this.radius = value;\n return this.set('width', value * 2).set('height', value * 2);\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Circle.fromElement})\n * @static\n * @memberOf fabric.Circle\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n fabric.Circle.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy r'.split(' '));\n\n /**\n * Returns {@link fabric.Circle} instance from an SVG element\n * @static\n * @memberOf fabric.Circle\n * @param {SVGElement} element Element to parse\n * @param {Function} [callback] Options callback invoked after parsing is finished\n * @param {Object} [options] Options object\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n fabric.Circle.fromElement = function(element, callback) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES);\n\n if (!isValidRadius(parsedAttributes)) {\n throw new Error('value of `r` attribute is required and can not be negative');\n }\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.radius;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.radius;\n callback(new fabric.Circle(parsedAttributes));\n };\n\n /**\n * @private\n */\n function isValidRadius(attributes) {\n return (('radius' in attributes) && (attributes.radius >= 0));\n }\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Circle} instance from an object representation\n * @static\n * @memberOf fabric.Circle\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n * @return {Object} Instance of fabric.Circle\n */\n fabric.Circle.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Circle', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Triangle) {\n fabric.warn('fabric.Triangle is already defined');\n return;\n }\n\n /**\n * Triangle class\n * @class fabric.Triangle\n * @extends fabric.Object\n * @return {fabric.Triangle} thisArg\n * @see {@link fabric.Triangle#initialize} for constructor definition\n */\n fabric.Triangle = fabric.util.createClass(fabric.Object, /** @lends fabric.Triangle.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'triangle',\n\n /**\n * Width is set to 100 to compensate the old initialize code that was setting it to 100\n * @type Number\n * @default\n */\n width: 100,\n\n /**\n * Height is set to 100 to compensate the old initialize code that was setting it to 100\n * @type Number\n * @default\n */\n height: 100,\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n fabric.util.drawDashedLine(ctx, -widthBy2, heightBy2, 0, -heightBy2, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, 0, -heightBy2, widthBy2, heightBy2, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, widthBy2, heightBy2, -widthBy2, heightBy2, this.strokeDashArray);\n ctx.closePath();\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = [\n -widthBy2 + ' ' + heightBy2,\n '0 ' + -heightBy2,\n widthBy2 + ' ' + heightBy2\n ].join(',');\n return [\n ''\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /**\n * Returns {@link fabric.Triangle} instance from an object representation\n * @static\n * @memberOf fabric.Triangle\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n */\n fabric.Triangle.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Triangle', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n piBy2 = Math.PI * 2;\n\n if (fabric.Ellipse) {\n fabric.warn('fabric.Ellipse is already defined.');\n return;\n }\n\n /**\n * Ellipse class\n * @class fabric.Ellipse\n * @extends fabric.Object\n * @return {fabric.Ellipse} thisArg\n * @see {@link fabric.Ellipse#initialize} for constructor definition\n */\n fabric.Ellipse = fabric.util.createClass(fabric.Object, /** @lends fabric.Ellipse.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'ellipse',\n\n /**\n * Horizontal radius\n * @type Number\n * @default\n */\n rx: 0,\n\n /**\n * Vertical radius\n * @type Number\n * @default\n */\n ry: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @return {fabric.Ellipse} thisArg\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n this.set('rx', options && options.rx || 0);\n this.set('ry', options && options.ry || 0);\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Ellipse} thisArg\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n switch (key) {\n\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n\n }\n return this;\n },\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx: function() {\n return this.get('rx') * this.get('scaleX');\n },\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy: function() {\n return this.get('ry') * this.get('scaleY');\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(\n 0,\n 0,\n this.rx,\n 0,\n piBy2,\n false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Ellipse.fromElement})\n * @static\n * @memberOf fabric.Ellipse\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n fabric.Ellipse.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy rx ry'.split(' '));\n\n /**\n * Returns {@link fabric.Ellipse} instance from an SVG element\n * @static\n * @memberOf fabric.Ellipse\n * @param {SVGElement} element Element to parse\n * @param {Function} [callback] Options callback invoked after parsing is finished\n * @return {fabric.Ellipse}\n */\n fabric.Ellipse.fromElement = function(element, callback) {\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Ellipse.ATTRIBUTE_NAMES);\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n callback(new fabric.Ellipse(parsedAttributes));\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Ellipse} instance from an object representation\n * @static\n * @memberOf fabric.Ellipse\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n * @return {fabric.Ellipse}\n */\n fabric.Ellipse.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Ellipse', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend;\n\n if (fabric.Rect) {\n fabric.warn('fabric.Rect is already defined');\n return;\n }\n\n /**\n * Rectangle class\n * @class fabric.Rect\n * @extends fabric.Object\n * @return {fabric.Rect} thisArg\n * @see {@link fabric.Rect#initialize} for constructor definition\n */\n fabric.Rect = fabric.util.createClass(fabric.Object, /** @lends fabric.Rect.prototype */ {\n\n /**\n * List of properties to consider when checking if state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('rx', 'ry'),\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'rect',\n\n /**\n * Horizontal border radius\n * @type Number\n * @default\n */\n rx: 0,\n\n /**\n * Vertical border radius\n * @type Number\n * @default\n */\n ry: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n this._initRxRy();\n },\n\n /**\n * Initializes rx/ry attributes\n * @private\n */\n _initRxRy: function() {\n if (this.rx && !this.ry) {\n this.ry = this.rx;\n }\n else if (this.ry && !this.rx) {\n this.rx = this.ry;\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n\n // 1x1 case (used in spray brush) optimization was removed because\n // with caching and higher zoom level this makes more damage than help\n\n var rx = this.rx ? Math.min(this.rx, this.width / 2) : 0,\n ry = this.ry ? Math.min(this.ry, this.height / 2) : 0,\n w = this.width,\n h = this.height,\n x = -this.width / 2,\n y = -this.height / 2,\n isRounded = rx !== 0 || ry !== 0,\n /* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\n k = 1 - 0.5522847498;\n ctx.beginPath();\n\n ctx.moveTo(x + rx, y);\n\n ctx.lineTo(x + w - rx, y);\n isRounded && ctx.bezierCurveTo(x + w - k * rx, y, x + w, y + k * ry, x + w, y + ry);\n\n ctx.lineTo(x + w, y + h - ry);\n isRounded && ctx.bezierCurveTo(x + w, y + h - k * ry, x + w - k * rx, y + h, x + w - rx, y + h);\n\n ctx.lineTo(x + rx, y + h);\n isRounded && ctx.bezierCurveTo(x + k * rx, y + h, x, y + h - k * ry, x, y + h - ry);\n\n ctx.lineTo(x, y + ry);\n isRounded && ctx.bezierCurveTo(x, y + k * ry, x + k * rx, y, x + rx, y);\n\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var x = -this.width / 2,\n y = -this.height / 2,\n w = this.width,\n h = this.height;\n\n ctx.beginPath();\n fabric.util.drawDashedLine(ctx, x, y, x + w, y, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x + w, y, x + w, y + h, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x + w, y + h, x, y + h, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x, y + h, x, y, this.strokeDashArray);\n ctx.closePath();\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var x = -this.width / 2, y = -this.height / 2;\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Rect.fromElement`)\n * @static\n * @memberOf fabric.Rect\n * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n */\n fabric.Rect.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x y rx ry width height'.split(' '));\n\n /**\n * Returns {@link fabric.Rect} instance from an SVG element\n * @static\n * @memberOf fabric.Rect\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Rect.fromElement = function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n options = options || { };\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Rect.ATTRIBUTE_NAMES);\n\n parsedAttributes.left = parsedAttributes.left || 0;\n parsedAttributes.top = parsedAttributes.top || 0;\n parsedAttributes.height = parsedAttributes.height || 0;\n parsedAttributes.width = parsedAttributes.width || 0;\n var rect = new fabric.Rect(extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n rect.visible = rect.visible && rect.width > 0 && rect.height > 0;\n callback(rect);\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Rect} instance from an object representation\n * @static\n * @memberOf fabric.Rect\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Rect instance is created\n */\n fabric.Rect.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Rect', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n min = fabric.util.array.min,\n max = fabric.util.array.max,\n toFixed = fabric.util.toFixed;\n\n if (fabric.Polyline) {\n fabric.warn('fabric.Polyline is already defined');\n return;\n }\n\n /**\n * Polyline class\n * @class fabric.Polyline\n * @extends fabric.Object\n * @see {@link fabric.Polyline#initialize} for constructor definition\n */\n fabric.Polyline = fabric.util.createClass(fabric.Object, /** @lends fabric.Polyline.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'polyline',\n\n /**\n * Points array\n * @type Array\n * @default\n */\n points: null,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('points'),\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {fabric.Polyline} thisArg\n * @example\n * var poly = new fabric.Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n initialize: function(points, options) {\n options = options || {};\n this.points = points || [];\n this.callSuper('initialize', options);\n this._setPositionDimensions(options);\n },\n\n _setPositionDimensions: function(options) {\n var calcDim = this._calcDimensions(options), correctLeftTop;\n this.width = calcDim.width;\n this.height = calcDim.height;\n if (!options.fromSVG) {\n correctLeftTop = this.translateToGivenOrigin(\n { x: calcDim.left - this.strokeWidth / 2, y: calcDim.top - this.strokeWidth / 2 },\n 'left',\n 'top',\n this.originX,\n this.originY\n );\n }\n if (typeof options.left === 'undefined') {\n this.left = options.fromSVG ? calcDim.left : correctLeftTop.x;\n }\n if (typeof options.top === 'undefined') {\n this.top = options.fromSVG ? calcDim.top : correctLeftTop.y;\n }\n this.pathOffset = {\n x: calcDim.left + this.width / 2,\n y: calcDim.top + this.height / 2\n };\n },\n\n /**\n * Calculate the polygon min and max point from points array,\n * returning an object with left, top, widht, height to measure the\n * polygon size\n * @return {Object} object.left X coordinate of the polygon leftmost point\n * @return {Object} object.top Y coordinate of the polygon topmost point\n * @return {Object} object.width distance between X coordinates of the polygon leftmost and rightmost point\n * @return {Object} object.height distance between Y coordinates of the polygon topmost and bottommost point\n * @private\n */\n _calcDimensions: function() {\n\n var points = this.points,\n minX = min(points, 'x') || 0,\n minY = min(points, 'y') || 0,\n maxX = max(points, 'x') || 0,\n maxY = max(points, 'y') || 0,\n width = (maxX - minX),\n height = (maxY - minY);\n\n return {\n left: minX,\n top: minY,\n width: width,\n height: height\n };\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), {\n points: this.points.concat()\n });\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var points = [], diffX = this.pathOffset.x, diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n\n for (var i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' '\n );\n }\n return [\n '<' + this.type + ' ', 'COMMON_PARTS',\n 'points=\"', points.join(''),\n '\" />\\n'\n ];\n },\n /* _TO_SVG_END_ */\n\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n commonRender: function(ctx) {\n var point, len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return false;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (var i = 0; i < len; i++) {\n point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n return true;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (!this.commonRender(ctx)) {\n return;\n }\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var p1, p2;\n\n ctx.beginPath();\n for (var i = 0, len = this.points.length; i < len; i++) {\n p1 = this.points[i];\n p2 = this.points[i + 1] || p1;\n fabric.util.drawDashedLine(ctx, p1.x, p1.y, p2.x, p2.y, this.strokeDashArray);\n }\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity: function() {\n return this.get('points').length;\n }\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Polyline.fromElement})\n * @static\n * @memberOf fabric.Polyline\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n fabric.Polyline.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n /**\n * Returns fabric.Polyline instance from an SVG element\n * @static\n * @memberOf fabric.Polyline\n * @param {SVGElement} element Element to parser\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Polyline.fromElementGenerator = function(_class) {\n return function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n options || (options = { });\n\n var points = fabric.parsePointsAttribute(element.getAttribute('points')),\n parsedAttributes = fabric.parseAttributes(element, fabric[_class].ATTRIBUTE_NAMES);\n parsedAttributes.fromSVG = true;\n callback(new fabric[_class](points, extend(parsedAttributes, options)));\n };\n };\n\n fabric.Polyline.fromElement = fabric.Polyline.fromElementGenerator('Polyline');\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Polyline instance from an object representation\n * @static\n * @memberOf fabric.Polyline\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Polyline.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Polyline', object, callback, 'points');\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Polygon) {\n fabric.warn('fabric.Polygon is already defined');\n return;\n }\n\n /**\n * Polygon class\n * @class fabric.Polygon\n * @extends fabric.Polyline\n * @see {@link fabric.Polygon#initialize} for constructor definition\n */\n fabric.Polygon = fabric.util.createClass(fabric.Polyline, /** @lends fabric.Polygon.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'polygon',\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (!this.commonRender(ctx)) {\n return;\n }\n ctx.closePath();\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n this.callSuper('_renderDashedStroke', ctx);\n ctx.closePath();\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Polygon.fromElement`)\n * @static\n * @memberOf fabric.Polygon\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolygonElement\n */\n fabric.Polygon.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n /**\n * Returns {@link fabric.Polygon} instance from an SVG element\n * @static\n * @memberOf fabric.Polygon\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Polygon.fromElement = fabric.Polyline.fromElementGenerator('Polygon');\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Polygon instance from an object representation\n * @static\n * @memberOf fabric.Polygon\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Polygon.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Polygon', object, callback, 'points');\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n min = fabric.util.array.min,\n max = fabric.util.array.max,\n extend = fabric.util.object.extend,\n _toString = Object.prototype.toString,\n drawArc = fabric.util.drawArc,\n toFixed = fabric.util.toFixed,\n commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7\n },\n repeatedCommands = {\n m: 'l',\n M: 'L'\n };\n\n if (fabric.Path) {\n fabric.warn('fabric.Path is already defined');\n return;\n }\n\n /**\n * Path class\n * @class fabric.Path\n * @extends fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#path_and_pathgroup}\n * @see {@link fabric.Path#initialize} for constructor definition\n */\n fabric.Path = fabric.util.createClass(fabric.Object, /** @lends fabric.Path.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'path',\n\n /**\n * Array of path points\n * @type Array\n * @default\n */\n path: null,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('path', 'fillRule'),\n\n stateProperties: fabric.Object.prototype.stateProperties.concat('path'),\n\n /**\n * Constructor\n * @param {Array|String} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Object} [options] Options object\n * @return {fabric.Path} thisArg\n */\n initialize: function(path, options) {\n options = options || { };\n this.callSuper('initialize', options);\n\n if (!path) {\n path = [];\n }\n\n var fromArray = _toString.call(path) === '[object Array]';\n\n this.path = fromArray\n ? path\n // one of commands (m,M,l,L,q,Q,c,C,etc.) followed by non-command characters (i.e. command values)\n : path.match && path.match(/[mzlhvcsqta][^mzlhvcsqta]*/gi);\n\n if (!this.path) {\n return;\n }\n\n if (!fromArray) {\n this.path = this._parsePath();\n }\n\n fabric.Polyline.prototype._setPositionDimensions.call(this, options);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands: function(ctx) {\n var current, // current instruction\n previous = null,\n subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0, // current y\n controlX = 0, // current control point x\n controlY = 0, // current control point y\n tempX,\n tempY,\n l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (var i = 0, len = this.path.length; i < len; ++i) {\n\n current = this.path[i];\n\n switch (current[0]) { // first letter\n\n case 'l': // lineto, relative\n x += current[1];\n y += current[2];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'L': // lineto, absolute\n x = current[1];\n y = current[2];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'h': // horizontal lineto, relative\n x += current[1];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'H': // horizontal lineto, absolute\n x = current[1];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'v': // vertical lineto, relative\n y += current[1];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'V': // verical lineto, absolute\n y = current[1];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'm': // moveTo, relative\n x += current[1];\n y += current[2];\n subpathStartX = x;\n subpathStartY = y;\n ctx.moveTo(x + l, y + t);\n break;\n\n case 'M': // moveTo, absolute\n x = current[1];\n y = current[2];\n subpathStartX = x;\n subpathStartY = y;\n ctx.moveTo(x + l, y + t);\n break;\n\n case 'c': // bezierCurveTo, relative\n tempX = x + current[5];\n tempY = y + current[6];\n controlX = x + current[3];\n controlY = y + current[4];\n ctx.bezierCurveTo(\n x + current[1] + l, // x1\n y + current[2] + t, // y1\n controlX + l, // x2\n controlY + t, // y2\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'C': // bezierCurveTo, absolute\n x = current[5];\n y = current[6];\n controlX = current[3];\n controlY = current[4];\n ctx.bezierCurveTo(\n current[1] + l,\n current[2] + t,\n controlX + l,\n controlY + t,\n x + l,\n y + t\n );\n break;\n\n case 's': // shorthand cubic bezierCurveTo, relative\n\n // transform to absolute x,y\n tempX = x + current[3];\n tempY = y + current[4];\n\n if (previous[0].match(/[CcSs]/) === null) {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n\n ctx.bezierCurveTo(\n controlX + l,\n controlY + t,\n x + current[1] + l,\n y + current[2] + t,\n tempX + l,\n tempY + t\n );\n // set control point to 2nd one of this command\n // \"... the first control point is assumed to be\n // the reflection of the second control point on\n // the previous command relative to the current point.\"\n controlX = x + current[1];\n controlY = y + current[2];\n\n x = tempX;\n y = tempY;\n break;\n\n case 'S': // shorthand cubic bezierCurveTo, absolute\n tempX = current[3];\n tempY = current[4];\n if (previous[0].match(/[CcSs]/) === null) {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n ctx.bezierCurveTo(\n controlX + l,\n controlY + t,\n current[1] + l,\n current[2] + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n\n // set control point to 2nd one of this command\n // \"... the first control point is assumed to be\n // the reflection of the second control point on\n // the previous command relative to the current point.\"\n controlX = current[1];\n controlY = current[2];\n\n break;\n\n case 'q': // quadraticCurveTo, relative\n // transform to absolute x,y\n tempX = x + current[3];\n tempY = y + current[4];\n\n controlX = x + current[1];\n controlY = y + current[2];\n\n ctx.quadraticCurveTo(\n controlX + l,\n controlY + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n tempX = current[3];\n tempY = current[4];\n\n ctx.quadraticCurveTo(\n current[1] + l,\n current[2] + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n controlX = current[1];\n controlY = current[2];\n break;\n\n case 't': // shorthand quadraticCurveTo, relative\n\n // transform to absolute x,y\n tempX = x + current[1];\n tempY = y + current[2];\n\n if (previous[0].match(/[QqTt]/) === null) {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n\n ctx.quadraticCurveTo(\n controlX + l,\n controlY + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n\n break;\n\n case 'T':\n tempX = current[1];\n tempY = current[2];\n\n if (previous[0].match(/[QqTt]/) === null) {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n ctx.quadraticCurveTo(\n controlX + l,\n controlY + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'a':\n // TODO: optimize this\n drawArc(ctx, x + l, y + t, [\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6] + x + l,\n current[7] + y + t\n ]);\n x += current[6];\n y += current[7];\n break;\n\n case 'A':\n // TODO: optimize this\n drawArc(ctx, x + l, y + t, [\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6] + l,\n current[7] + t\n ]);\n x = current[6];\n y = current[7];\n break;\n\n case 'z':\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n ctx.closePath();\n break;\n }\n previous = current;\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render: function(ctx) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} string representation of an instance\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), {\n path: this.path.map(function(item) { return item.slice(); }),\n });\n },\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n var o = this.toObject(['sourcePath'].concat(propertiesToInclude));\n if (o.sourcePath) {\n delete o.path;\n }\n return o;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var path = this.path.map(function(path) {\n return path.join(' ');\n }).join(' ');\n return [\n '\\n'\n ];\n },\n\n _getOffsetTransform: function() {\n var digits = fabric.Object.NUM_FRACTION_DIGITS;\n return ' translate(' + toFixed(-this.pathOffset.x, digits) + ', ' +\n toFixed(-this.pathOffset.y, digits) + ')';\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n var additionalTransform = this._getOffsetTransform();\n return '\\t' + this._createBaseClipPathSVGMarkup(\n this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform }\n );\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n var additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform });\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns number representation of an instance complexity\n * @return {Number} complexity of this instance\n */\n complexity: function() {\n return this.path.length;\n },\n\n /**\n * @private\n */\n _parsePath: function() {\n var result = [],\n coords = [],\n currentPath,\n parsed,\n re = fabric.rePathCommand,\n match,\n coordsStr;\n\n for (var i = 0, coordsParsed, len = this.path.length; i < len; i++) {\n currentPath = this.path[i];\n\n coordsStr = currentPath.slice(1).trim();\n coords.length = 0;\n\n while ((match = re.exec(coordsStr))) {\n coords.push(match[0]);\n }\n\n coordsParsed = [currentPath.charAt(0)];\n\n for (var j = 0, jlen = coords.length; j < jlen; j++) {\n parsed = parseFloat(coords[j]);\n if (!isNaN(parsed)) {\n coordsParsed.push(parsed);\n }\n }\n\n var command = coordsParsed[0],\n commandLength = commandLengths[command.toLowerCase()],\n repeatedCommand = repeatedCommands[command] || command;\n\n if (coordsParsed.length - 1 > commandLength) {\n for (var k = 1, klen = coordsParsed.length; k < klen; k += commandLength) {\n result.push([command].concat(coordsParsed.slice(k, k + commandLength)));\n command = repeatedCommand;\n }\n }\n else {\n result.push(coordsParsed);\n }\n }\n\n return result;\n },\n\n /**\n * @private\n */\n _calcDimensions: function() {\n\n var aX = [],\n aY = [],\n current, // current instruction\n previous = null,\n subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0, // current y\n controlX = 0, // current control point x\n controlY = 0, // current control point y\n tempX,\n tempY,\n bounds;\n\n for (var i = 0, len = this.path.length; i < len; ++i) {\n\n current = this.path[i];\n\n switch (current[0]) { // first letter\n\n case 'l': // lineto, relative\n x += current[1];\n y += current[2];\n bounds = [];\n break;\n\n case 'L': // lineto, absolute\n x = current[1];\n y = current[2];\n bounds = [];\n break;\n\n case 'h': // horizontal lineto, relative\n x += current[1];\n bounds = [];\n break;\n\n case 'H': // horizontal lineto, absolute\n x = current[1];\n bounds = [];\n break;\n\n case 'v': // vertical lineto, relative\n y += current[1];\n bounds = [];\n break;\n\n case 'V': // verical lineto, absolute\n y = current[1];\n bounds = [];\n break;\n\n case 'm': // moveTo, relative\n x += current[1];\n y += current[2];\n subpathStartX = x;\n subpathStartY = y;\n bounds = [];\n break;\n\n case 'M': // moveTo, absolute\n x = current[1];\n y = current[2];\n subpathStartX = x;\n subpathStartY = y;\n bounds = [];\n break;\n\n case 'c': // bezierCurveTo, relative\n tempX = x + current[5];\n tempY = y + current[6];\n controlX = x + current[3];\n controlY = y + current[4];\n bounds = fabric.util.getBoundsOfCurve(x, y,\n x + current[1], // x1\n y + current[2], // y1\n controlX, // x2\n controlY, // y2\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'C': // bezierCurveTo, absolute\n controlX = current[3];\n controlY = current[4];\n bounds = fabric.util.getBoundsOfCurve(x, y,\n current[1],\n current[2],\n controlX,\n controlY,\n current[5],\n current[6]\n );\n x = current[5];\n y = current[6];\n break;\n\n case 's': // shorthand cubic bezierCurveTo, relative\n\n // transform to absolute x,y\n tempX = x + current[3];\n tempY = y + current[4];\n\n if (previous[0].match(/[CcSs]/) === null) {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n x + current[1],\n y + current[2],\n tempX,\n tempY\n );\n // set control point to 2nd one of this command\n // \"... the first control point is assumed to be\n // the reflection of the second control point on\n // the previous command relative to the current point.\"\n controlX = x + current[1];\n controlY = y + current[2];\n x = tempX;\n y = tempY;\n break;\n\n case 'S': // shorthand cubic bezierCurveTo, absolute\n tempX = current[3];\n tempY = current[4];\n if (previous[0].match(/[CcSs]/) === null) {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n current[1],\n current[2],\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n // set control point to 2nd one of this command\n // \"... the first control point is assumed to be\n // the reflection of the second control point on\n // the previous command relative to the current point.\"\n controlX = current[1];\n controlY = current[2];\n break;\n\n case 'q': // quadraticCurveTo, relative\n // transform to absolute x,y\n tempX = x + current[3];\n tempY = y + current[4];\n controlX = x + current[1];\n controlY = y + current[2];\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n controlX,\n controlY,\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n controlX = current[1];\n controlY = current[2];\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n controlX,\n controlY,\n current[3],\n current[4]\n );\n x = current[3];\n y = current[4];\n break;\n\n case 't': // shorthand quadraticCurveTo, relative\n // transform to absolute x,y\n tempX = x + current[1];\n tempY = y + current[2];\n if (previous[0].match(/[QqTt]/) === null) {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n controlX,\n controlY,\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n\n break;\n\n case 'T':\n tempX = current[1];\n tempY = current[2];\n\n if (previous[0].match(/[QqTt]/) === null) {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n controlX,\n controlY,\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'a':\n // TODO: optimize this\n bounds = fabric.util.getBoundsOfArc(x, y,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6] + x,\n current[7] + y\n );\n x += current[6];\n y += current[7];\n break;\n\n case 'A':\n // TODO: optimize this\n bounds = fabric.util.getBoundsOfArc(x, y,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n current[7]\n );\n x = current[6];\n y = current[7];\n break;\n\n case 'z':\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n previous = current;\n bounds.forEach(function (point) {\n aX.push(point.x);\n aY.push(point.y);\n });\n aX.push(x);\n aY.push(y);\n }\n\n var minX = min(aX) || 0,\n minY = min(aY) || 0,\n maxX = max(aX) || 0,\n maxY = max(aY) || 0,\n deltaX = maxX - minX,\n deltaY = maxY - minY;\n\n return {\n left: minX,\n top: minY,\n width: deltaX,\n height: deltaY\n };\n }\n });\n\n /**\n * Creates an instance of fabric.Path from an object\n * @static\n * @memberOf fabric.Path\n * @param {Object} object\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Path.fromObject = function(object, callback) {\n if (typeof object.sourcePath === 'string') {\n var pathUrl = object.sourcePath;\n fabric.loadSVGFromURL(pathUrl, function (elements) {\n var path = elements[0];\n path.setOptions(object);\n callback && callback(path);\n });\n }\n else {\n fabric.Object._fromObject('Path', object, callback, 'path');\n }\n };\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Path.fromElement`)\n * @static\n * @memberOf fabric.Path\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n fabric.Path.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(['d']);\n\n /**\n * Creates an instance of fabric.Path from an SVG element\n * @static\n * @memberOf fabric.Path\n * @param {SVGElement} element to parse\n * @param {Function} callback Callback to invoke when an fabric.Path instance is created\n * @param {Object} [options] Options object\n * @param {Function} [callback] Options callback invoked after parsing is finished\n */\n fabric.Path.fromElement = function(element, callback, options) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Path.ATTRIBUTE_NAMES);\n parsedAttributes.fromSVG = true;\n callback(new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options)));\n };\n /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n min = fabric.util.array.min,\n max = fabric.util.array.max;\n\n if (fabric.Group) {\n return;\n }\n\n /**\n * Group class\n * @class fabric.Group\n * @extends fabric.Object\n * @mixes fabric.Collection\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n * @see {@link fabric.Group#initialize} for constructor definition\n */\n fabric.Group = fabric.util.createClass(fabric.Object, fabric.Collection, /** @lends fabric.Group.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'group',\n\n /**\n * Width of stroke\n * @type Number\n * @default\n */\n strokeWidth: 0,\n\n /**\n * Indicates if click, mouseover, mouseout events & hoverCursor should also check for subtargets\n * @type Boolean\n * @default\n */\n subTargetCheck: false,\n\n /**\n * Groups are container, do not render anything on theyr own, ence no cache properties\n * @type Array\n * @default\n */\n cacheProperties: [],\n\n /**\n * setOnGroup is a method used for TextBox that is no more used since 2.0.0 The behavior is still\n * available setting this boolean to true.\n * @type Boolean\n * @since 2.0.0\n * @default\n */\n useSetOnGroup: false,\n\n /**\n * Constructor\n * @param {Object} objects Group objects\n * @param {Object} [options] Options object\n * @param {Boolean} [isAlreadyGrouped] if true, objects have been grouped already.\n * @return {Object} thisArg\n */\n initialize: function(objects, options, isAlreadyGrouped) {\n options = options || {};\n this._objects = [];\n // if objects enclosed in a group have been grouped already,\n // we cannot change properties of objects.\n // Thus we need to set options to group without objects,\n isAlreadyGrouped && this.callSuper('initialize', options);\n this._objects = objects || [];\n for (var i = this._objects.length; i--; ) {\n this._objects[i].group = this;\n }\n\n if (!isAlreadyGrouped) {\n var center = options && options.centerPoint;\n // we want to set origins before calculating the bounding box.\n // so that the topleft can be set with that in mind.\n // if specific top and left are passed, are overwritten later\n // with the callSuper('initialize', options)\n if (options.originX !== undefined) {\n this.originX = options.originX;\n }\n if (options.originY !== undefined) {\n this.originY = options.originY;\n }\n // if coming from svg i do not want to calc bounds.\n // i assume width and height are passed along options\n center || this._calcBounds();\n this._updateObjectsCoords(center);\n delete options.centerPoint;\n this.callSuper('initialize', options);\n }\n else {\n this._updateObjectsACoords();\n }\n\n this.setCoords();\n },\n\n /**\n * @private\n * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change\n */\n _updateObjectsACoords: function() {\n var ignoreZoom = true, skipAbsolute = true;\n for (var i = this._objects.length; i--; ){\n this._objects[i].setCoords(ignoreZoom, skipAbsolute);\n }\n },\n\n /**\n * @private\n * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change\n */\n _updateObjectsCoords: function(center) {\n var center = center || this.getCenterPoint();\n for (var i = this._objects.length; i--; ){\n this._updateObjectCoords(this._objects[i], center);\n }\n },\n\n /**\n * @private\n * @param {Object} object\n * @param {fabric.Point} center, current center of group.\n */\n _updateObjectCoords: function(object, center) {\n var objectLeft = object.left,\n objectTop = object.top,\n ignoreZoom = true, skipAbsolute = true;\n\n object.set({\n left: objectLeft - center.x,\n top: objectTop - center.y\n });\n object.group = this;\n object.setCoords(ignoreZoom, skipAbsolute);\n },\n\n /**\n * Returns string represenation of a group\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Adds an object to a group; Then recalculates group's dimension, position.\n * @param {Object} object\n * @return {fabric.Group} thisArg\n * @chainable\n */\n addWithUpdate: function(object) {\n this._restoreObjectsState();\n fabric.util.resetObjectTransform(this);\n if (object) {\n this._objects.push(object);\n object.group = this;\n object._set('canvas', this.canvas);\n }\n this._calcBounds();\n this._updateObjectsCoords();\n this.setCoords();\n this.dirty = true;\n return this;\n },\n\n /**\n * Removes an object from a group; Then recalculates group's dimension, position.\n * @param {Object} object\n * @return {fabric.Group} thisArg\n * @chainable\n */\n removeWithUpdate: function(object) {\n this._restoreObjectsState();\n fabric.util.resetObjectTransform(this);\n\n this.remove(object);\n this._calcBounds();\n this._updateObjectsCoords();\n this.setCoords();\n this.dirty = true;\n return this;\n },\n\n /**\n * @private\n */\n _onObjectAdded: function(object) {\n this.dirty = true;\n object.group = this;\n object._set('canvas', this.canvas);\n },\n\n /**\n * @private\n */\n _onObjectRemoved: function(object) {\n this.dirty = true;\n delete object.group;\n },\n\n /**\n * @private\n */\n _set: function(key, value) {\n var i = this._objects.length;\n if (this.useSetOnGroup) {\n while (i--) {\n this._objects[i].setOnGroup(key, value);\n }\n }\n if (key === 'canvas') {\n while (i--) {\n this._objects[i]._set(key, value);\n }\n }\n fabric.Object.prototype._set.call(this, key, value);\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var _includeDefaultValues = this.includeDefaultValues;\n var objsToObject = this._objects.map(function(obj) {\n var originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n var _obj = obj.toObject(propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n return _obj;\n });\n var obj = fabric.Object.prototype.toObject.call(this, propertiesToInclude);\n obj.objects = objsToObject;\n return obj;\n },\n\n /**\n * Returns object representation of an instance, in dataless mode.\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n var objsToObject, sourcePath = this.sourcePath;\n if (sourcePath) {\n objsToObject = sourcePath;\n }\n else {\n var _includeDefaultValues = this.includeDefaultValues;\n objsToObject = this._objects.map(function(obj) {\n var originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n var _obj = obj.toDatalessObject(propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n return _obj;\n });\n }\n var obj = fabric.Object.prototype.toDatalessObject.call(this, propertiesToInclude);\n obj.objects = objsToObject;\n return obj;\n },\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render: function(ctx) {\n this._transformDone = true;\n this.callSuper('render', ctx);\n this._transformDone = false;\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache: function() {\n var ownCache = fabric.Object.prototype.shouldCache.call(this);\n if (ownCache) {\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n },\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow: function() {\n if (fabric.Object.prototype.willDrawShadow.call(this)) {\n return true;\n }\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n },\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache: function() {\n return this.ownCaching || (this.group && this.group.isOnACache());\n },\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject: function(ctx) {\n for (var i = 0, len = this._objects.length; i < len; i++) {\n this._objects[i].render(ctx);\n }\n this._drawClipPath(ctx);\n },\n\n /**\n * Check if cache is dirty\n */\n isCacheDirty: function(skipCanvas) {\n if (this.callSuper('isCacheDirty', skipCanvas)) {\n return true;\n }\n if (!this.statefullCache) {\n return false;\n }\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].isCacheDirty(true)) {\n if (this._cacheCanvas) {\n // if this group has not a cache canvas there is nothing to clean\n var x = this.cacheWidth / this.zoomX, y = this.cacheHeight / this.zoomY;\n this._cacheContext.clearRect(-x / 2, -y / 2, x, y);\n }\n return true;\n }\n }\n return false;\n },\n\n /**\n * Retores original state of each of group objects (original state is that which was before group was created).\n * @private\n * @return {fabric.Group} thisArg\n * @chainable\n */\n _restoreObjectsState: function() {\n this._objects.forEach(this._restoreObjectState, this);\n return this;\n },\n\n /**\n * Realises the transform from this group onto the supplied object\n * i.e. it tells you what would happen if the supplied object was in\n * the group, and then the group was destroyed. It mutates the supplied\n * object.\n * @param {fabric.Object} object\n * @return {fabric.Object} transformedObject\n */\n realizeTransform: function(object) {\n var matrix = object.calcTransformMatrix(),\n options = fabric.util.qrDecompose(matrix),\n center = new fabric.Point(options.translateX, options.translateY);\n object.flipX = false;\n object.flipY = false;\n object.set('scaleX', options.scaleX);\n object.set('scaleY', options.scaleY);\n object.skewX = options.skewX;\n object.skewY = options.skewY;\n object.angle = options.angle;\n object.setPositionByOrigin(center, 'center', 'center');\n return object;\n },\n\n /**\n * Restores original state of a specified object in group\n * @private\n * @param {fabric.Object} object\n * @return {fabric.Group} thisArg\n */\n _restoreObjectState: function(object) {\n this.realizeTransform(object);\n object.setCoords();\n delete object.group;\n return this;\n },\n\n /**\n * Destroys a group (restoring state of its objects)\n * @return {fabric.Group} thisArg\n * @chainable\n */\n destroy: function() {\n // when group is destroyed objects needs to get a repaint to be eventually\n // displayed on canvas.\n this._objects.forEach(function(object) {\n object.set('dirty', true);\n });\n return this._restoreObjectsState();\n },\n\n /**\n * make a group an active selection, remove the group from canvas\n * the group has to be on canvas for this to work.\n * @return {fabric.ActiveSelection} thisArg\n * @chainable\n */\n toActiveSelection: function() {\n if (!this.canvas) {\n return;\n }\n var objects = this._objects, canvas = this.canvas;\n this._objects = [];\n var options = this.toObject();\n delete options.objects;\n var activeSelection = new fabric.ActiveSelection([]);\n activeSelection.set(options);\n activeSelection.type = 'activeSelection';\n canvas.remove(this);\n objects.forEach(function(object) {\n object.group = activeSelection;\n object.dirty = true;\n canvas.add(object);\n });\n activeSelection.canvas = canvas;\n activeSelection._objects = objects;\n canvas._activeObject = activeSelection;\n activeSelection.setCoords();\n return activeSelection;\n },\n\n /**\n * Destroys a group (restoring state of its objects)\n * @return {fabric.Group} thisArg\n * @chainable\n */\n ungroupOnCanvas: function() {\n return this._restoreObjectsState();\n },\n\n /**\n * Sets coordinates of all objects inside group\n * @return {fabric.Group} thisArg\n * @chainable\n */\n setObjectsCoords: function() {\n var ignoreZoom = true, skipAbsolute = true;\n this.forEachObject(function(object) {\n object.setCoords(ignoreZoom, skipAbsolute);\n });\n return this;\n },\n\n /**\n * @private\n */\n _calcBounds: function(onlyWidthHeight) {\n var aX = [],\n aY = [],\n o, prop,\n props = ['tr', 'br', 'bl', 'tl'],\n i = 0, iLen = this._objects.length,\n j, jLen = props.length,\n ignoreZoom = true;\n\n for ( ; i < iLen; ++i) {\n o = this._objects[i];\n o.setCoords(ignoreZoom);\n for (j = 0; j < jLen; j++) {\n prop = props[j];\n aX.push(o.oCoords[prop].x);\n aY.push(o.oCoords[prop].y);\n }\n }\n\n this._getBounds(aX, aY, onlyWidthHeight);\n },\n\n /**\n * @private\n */\n _getBounds: function(aX, aY, onlyWidthHeight) {\n var minXY = new fabric.Point(min(aX), min(aY)),\n maxXY = new fabric.Point(max(aX), max(aY)),\n top = minXY.y || 0, left = minXY.x || 0,\n width = (maxXY.x - minXY.x) || 0,\n height = (maxXY.y - minXY.y) || 0;\n this.width = width;\n this.height = height;\n if (!onlyWidthHeight) {\n // the bounding box always finds the topleft most corner.\n // whatever is the group origin, we set up here the left/top position.\n this.setPositionByOrigin({ x: left, y: top }, 'left', 'top');\n }\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG: function(reviver) {\n var svgString = ['\\n'];\n\n for (var i = 0, len = this._objects.length; i < len; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('\\n');\n return svgString;\n },\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles: function() {\n var opacity = typeof this.opacity !== 'undefined' && this.opacity !== 1 ?\n 'opacity: ' + this.opacity + ';' : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [\n opacity,\n this.getSvgFilter(),\n visibility\n ].join('');\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n var svgString = [];\n\n for (var i = 0, len = this._objects.length; i < len; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n\n return this._createBaseClipPathSVGMarkup(svgString, { reviver: reviver });\n },\n /* _TO_SVG_END_ */\n });\n\n /**\n * Returns {@link fabric.Group} instance from an object representation\n * @static\n * @memberOf fabric.Group\n * @param {Object} object Object to create a group from\n * @param {Function} [callback] Callback to invoke when an group instance is created\n */\n fabric.Group.fromObject = function(object, callback) {\n var objects = object.objects,\n options = fabric.util.object.clone(object, true);\n delete options.objects;\n if (typeof objects === 'string') {\n // it has to be an url or something went wrong.\n fabric.loadSVGFromURL(objects, function (elements) {\n var group = fabric.util.groupSVGElements(elements, object, objects);\n group.set(options);\n callback && callback(group);\n });\n return;\n }\n fabric.util.enlivenObjects(objects, function(enlivenedObjects) {\n fabric.util.enlivenObjects([object.clipPath], function(enlivedClipPath) {\n var options = fabric.util.object.clone(object, true);\n options.clipPath = enlivedClipPath[0];\n delete options.objects;\n callback && callback(new fabric.Group(enlivenedObjects, options, true));\n });\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.ActiveSelection) {\n return;\n }\n\n /**\n * Group class\n * @class fabric.ActiveSelection\n * @extends fabric.Group\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n * @see {@link fabric.ActiveSelection#initialize} for constructor definition\n */\n fabric.ActiveSelection = fabric.util.createClass(fabric.Group, /** @lends fabric.ActiveSelection.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'activeSelection',\n\n /**\n * Constructor\n * @param {Object} objects ActiveSelection objects\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(objects, options) {\n options = options || {};\n this._objects = objects || [];\n for (var i = this._objects.length; i--; ) {\n this._objects[i].group = this;\n }\n\n if (options.originX) {\n this.originX = options.originX;\n }\n if (options.originY) {\n this.originY = options.originY;\n }\n this._calcBounds();\n this._updateObjectsCoords();\n fabric.Object.prototype.initialize.call(this, options);\n this.setCoords();\n },\n\n /**\n * Change te activeSelection to a normal group,\n * High level function that automatically adds it to canvas as\n * active object. no events fired.\n * @since 2.0.0\n * @return {fabric.Group}\n */\n toGroup: function() {\n var objects = this._objects.concat();\n this._objects = [];\n var options = fabric.Object.prototype.toObject.call(this);\n var newGroup = new fabric.Group([]);\n delete options.type;\n newGroup.set(options);\n objects.forEach(function(object) {\n object.canvas.remove(object);\n object.group = newGroup;\n });\n newGroup._objects = objects;\n if (!this.canvas) {\n return newGroup;\n }\n var canvas = this.canvas;\n canvas.add(newGroup);\n canvas._activeObject = newGroup;\n newGroup.setCoords();\n return newGroup;\n },\n\n /**\n * If returns true, deselection is cancelled.\n * @since 2.0.0\n * @return {Boolean} [cancel]\n */\n onDeselect: function() {\n this.destroy();\n return false;\n },\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * @return {Boolean}\n */\n shouldCache: function() {\n return false;\n },\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache: function() {\n return false;\n },\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls: function(ctx, styleOverride, childrenOverride) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n this.callSuper('_renderControls', ctx, styleOverride);\n childrenOverride = childrenOverride || { };\n if (typeof childrenOverride.hasControls === 'undefined') {\n childrenOverride.hasControls = false;\n }\n if (typeof childrenOverride.hasRotatingPoint === 'undefined') {\n childrenOverride.hasRotatingPoint = false;\n }\n childrenOverride.forActiveSelection = true;\n for (var i = 0, len = this._objects.length; i < len; i++) {\n this._objects[i]._renderControls(ctx, childrenOverride);\n }\n ctx.restore();\n },\n });\n\n /**\n * Returns {@link fabric.ActiveSelection} instance from an object representation\n * @static\n * @memberOf fabric.ActiveSelection\n * @param {Object} object Object to create a group from\n * @param {Function} [callback] Callback to invoke when an ActiveSelection instance is created\n */\n fabric.ActiveSelection.fromObject = function(object, callback) {\n fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) {\n delete object.objects;\n callback && callback(new fabric.ActiveSelection(enlivenedObjects, object, true));\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var extend = fabric.util.object.extend;\n\n if (!global.fabric) {\n global.fabric = { };\n }\n\n if (global.fabric.Image) {\n fabric.warn('fabric.Image is already defined.');\n return;\n }\n\n /**\n * Image class\n * @class fabric.Image\n * @extends fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}\n * @see {@link fabric.Image#initialize} for constructor definition\n */\n fabric.Image = fabric.util.createClass(fabric.Object, /** @lends fabric.Image.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'image',\n\n /**\n * crossOrigin value (one of \"\", \"anonymous\", \"use-credentials\")\n * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes\n * @type String\n * @default\n */\n crossOrigin: '',\n\n /**\n * Width of a stroke.\n * For image quality a stroke multiple of 2 gives better results.\n * @type Number\n * @default\n */\n strokeWidth: 0,\n\n /**\n * When calling {@link fabric.Image.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default\n */\n srcFromAttribute: false,\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n _lastScaleX: 1,\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n _lastScaleY: 1,\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n _filterScalingX: 1,\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n _filterScalingY: 1,\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n minimumScaleTrigger: 0.5,\n\n /**\n * List of properties to consider when checking if\n * state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('cropX', 'cropY'),\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n * @default\n */\n cacheKey: '',\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n * @default\n */\n cropX: 0,\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n * @default\n */\n cropY: 0,\n\n /**\n * Constructor\n * @param {HTMLImageElement | String} element Image element\n * @param {Object} [options] Options object\n * @param {function} [callback] callback function to call after eventual filters applied.\n * @return {fabric.Image} thisArg\n */\n initialize: function(element, options) {\n options || (options = { });\n this.filters = [];\n this.cacheKey = 'texture' + fabric.Object.__uid++;\n this.callSuper('initialize', options);\n this._initElement(element, options);\n },\n\n /**\n * Returns image element which this instance if based on\n * @return {HTMLImageElement} Image element\n */\n getElement: function() {\n return this._element || {};\n },\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Object} [options] Options object\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setElement: function(element, options) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(this.cacheKey + '_filtered');\n this._element = element;\n this._originalElement = element;\n this._initConfig(options);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal fiters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n return this;\n },\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture: function(key) {\n var backend = fabric.filterBackend;\n if (backend && backend.evictCachesForKey) {\n backend.evictCachesForKey(key);\n }\n },\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose: function() {\n this.removeTexture(this.cacheKey);\n this.removeTexture(this.cacheKey + '_filtered');\n this._cacheContext = undefined;\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'].forEach((function(element) {\n fabric.util.cleanUpJsdomNode(this[element]);\n this[element] = undefined;\n }).bind(this));\n },\n\n /**\n * Sets crossOrigin value (on an instance and corresponding image element)\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setCrossOrigin: function(value) {\n this.crossOrigin = value;\n this._element.crossOrigin = value;\n\n return this;\n },\n\n /**\n * Returns original size of an image\n * @return {Object} Object with \"width\" and \"height\" properties\n */\n getOriginalSize: function() {\n var element = this.getElement();\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height\n };\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke: function(ctx) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n var w = this.width / 2, h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var x = -this.width / 2,\n y = -this.height / 2,\n w = this.width,\n h = this.height;\n\n ctx.save();\n this._setStrokeStyles(ctx, this);\n\n ctx.beginPath();\n fabric.util.drawDashedLine(ctx, x, y, x + w, y, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x + w, y, x + w, y + h, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x + w, y + h, x, y + h, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x, y + h, x, y, this.strokeDashArray);\n ctx.closePath();\n ctx.restore();\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var filters = [];\n\n this.filters.forEach(function(filterObj) {\n if (filterObj) {\n filters.push(filterObj.toObject());\n }\n });\n var object = extend(\n this.callSuper(\n 'toObject',\n ['crossOrigin', 'cropX', 'cropY'].concat(propertiesToInclude)\n ), {\n src: this.getSrc(),\n filters: filters,\n });\n if (this.resizeFilter) {\n object.resizeFilter = this.resizeFilter.toObject();\n }\n return object;\n },\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,hight.\n * @return {Boolean}\n */\n hasCrop: function() {\n return this.cropX || this.cropY || this.width < this._element.width || this.height < this._element.height;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var svgString = [], imageMarkup = [], strokeSvg,\n x = -this.width / 2, y = -this.height / 2, clipPath = '';\n if (this.hasCrop()) {\n var clipPathId = fabric.Object.__uid++;\n svgString.push(\n '\\n',\n '\\t\\n',\n '\\n'\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n imageMarkup.push('\\t element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n '\" width=\"', this._element.width || this._element.naturalWidth,\n '\" height=\"', this._element.height || this._element.height,\n '\"', clipPath,\n '>\\n');\n\n if (this.stroke || this.strokeDashArray) {\n var origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n '\\t\\n'\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== 'fill') {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n }\n else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc: function(filtered) {\n var element = filtered ? this._element : this._originalElement;\n if (element) {\n if (element.toDataURL) {\n return element.toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src');\n }\n else {\n return element.src;\n }\n }\n else {\n return this.src || '';\n }\n },\n\n /**\n * Sets source of an image\n * @param {String} src Source string (URL)\n * @param {Function} [callback] Callback is invoked when image has been loaded (and all filters have been applied)\n * @param {Object} [options] Options object\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setSrc: function(src, callback, options) {\n fabric.util.loadImage(src, function(img) {\n this.setElement(img, options);\n this._setWidthHeight();\n callback && callback(this);\n }, this, options && options.crossOrigin);\n return this;\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString: function() {\n return '#';\n },\n\n applyResizeFilters: function() {\n var filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.scaleX,\n scaleY = objectScale.scaleY,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n if (!fabric.filterBackend) {\n fabric.filterBackend = fabric.initFilterBackend();\n }\n var canvasEl = fabric.util.createCanvasElement(),\n cacheKey = this._filteredEl ? (this.cacheKey + '_filtered') : this.cacheKey,\n sourceWidth = elementToFilter.width, sourceHeight = elementToFilter.height;\n canvasEl.width = sourceWidth;\n canvasEl.height = sourceHeight;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n fabric.filterBackend.applyFilters(\n [filter], elementToFilter, sourceWidth, sourceHeight, this._element, cacheKey);\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n },\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @method applyFilters\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n * @return {thisArg} return the fabric.Image object\n * @chainable\n */\n applyFilters: function(filters) {\n\n filters = filters || this.filters || [];\n filters = filters.filter(function(filter) { return filter && !filter.isNeutralState(); });\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(this.cacheKey + '_filtered');\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n this._filteredEl = null;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return this;\n }\n\n var imgElement = this._originalElement,\n sourceWidth = imgElement.naturalWidth || imgElement.width,\n sourceHeight = imgElement.naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the element is the same we need to create a new element\n var canvasEl = fabric.util.createCanvasElement();\n canvasEl.width = sourceWidth;\n canvasEl.height = sourceHeight;\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n }\n else {\n // clear the existing element to get new filter data\n // also dereference the eventual resized _element\n this._element = this._filteredEl;\n this._filteredEl.getContext('2d').clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n if (!fabric.filterBackend) {\n fabric.filterBackend = fabric.initFilterBackend();\n }\n fabric.filterBackend.applyFilters(\n filters, this._originalElement, sourceWidth, sourceHeight, this._element, this.cacheKey);\n if (this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY = this._element.height / this._originalElement.height;\n }\n return this;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache: function() {\n return this.needsItsOwnCache();\n },\n\n _renderFill: function(ctx) {\n var elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n var scaleX = this._filterScalingX, scaleY = this._filterScalingY,\n w = this.width, h = this.height, min = Math.min, max = Math.max,\n // crop values cannot be lesser than 0.\n cropX = max(this.cropX, 0), cropY = max(this.cropY, 0),\n elWidth = elementToDraw.naturalWidth || elementToDraw.width,\n elHeight = elementToDraw.naturalHeight || elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = min(w * scaleX, elWidth - sX),\n sH = min(h * scaleY, elHeight - sY),\n x = -w / 2, y = -h / 2,\n maxDestW = min(w, elWidth / scaleX - cropX),\n maxDestH = min(h, elHeight / scaleX - cropY);\n\n elementToDraw && ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n },\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize: function() {\n var scale = this.getTotalObjectScaling();\n return (scale.scaleX !== this._lastScaleX || scale.scaleY !== this._lastScaleY);\n },\n\n /**\n * @private\n */\n _resetWidthHeight: function() {\n this.set(this.getOriginalSize());\n },\n\n /**\n * The Image class's initialization method. This method is automatically\n * called by the constructor.\n * @private\n * @param {HTMLImageElement|String} element The element representing the image\n * @param {Object} [options] Options object\n */\n _initElement: function(element, options) {\n this.setElement(fabric.util.getById(element), options);\n fabric.util.addClass(this.getElement(), fabric.Image.CSS_CANVAS);\n },\n\n /**\n * @private\n * @param {Object} [options] Options object\n */\n _initConfig: function(options) {\n options || (options = { });\n this.setOptions(options);\n this._setWidthHeight(options);\n if (this._element && this.crossOrigin) {\n this._element.crossOrigin = this.crossOrigin;\n }\n },\n\n /**\n * @private\n * @param {Array} filters to be initialized\n * @param {Function} callback Callback to invoke when all fabric.Image.filters instances are created\n */\n _initFilters: function(filters, callback) {\n if (filters && filters.length) {\n fabric.util.enlivenObjects(filters, function(enlivenedObjects) {\n callback && callback(enlivenedObjects);\n }, 'fabric.Image.filters');\n }\n else {\n callback && callback();\n }\n },\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n * @param {Object} [options] Object with width/height properties\n */\n _setWidthHeight: function(options) {\n options || (options = { });\n var el = this.getElement();\n this.width = options.width || el.naturalWidth || el.width || 0;\n this.height = options.height || el.naturalHeight || el.height || 0;\n },\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n * @return {Object}\n */\n parsePreserveAspectRatioAttribute: function() {\n var pAR = fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio || ''),\n rWidth = this._element.width, rHeight = this._element.height,\n scaleX = 1, scaleY = 1, offsetLeft = 0, offsetTop = 0, cropX = 0, cropY = 0,\n offset, pWidth = this.width, pHeight = this.height, parsedAttributes = { width: pWidth, height: pHeight };\n if (pAR && (pAR.alignX !== 'none' || pAR.alignY !== 'none')) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = fabric.util.findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = fabric.util.findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n }\n else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX: scaleX,\n scaleY: scaleY,\n offsetLeft: offsetLeft,\n offsetTop: offsetTop,\n cropX: cropX,\n cropY: cropY\n };\n }\n });\n\n /**\n * Default CSS class name for canvas\n * @static\n * @type String\n * @default\n */\n fabric.Image.CSS_CANVAS = 'canvas-img';\n\n /**\n * Alias for getSrc\n * @static\n */\n fabric.Image.prototype.getSvgSrc = fabric.Image.prototype.getSrc;\n\n /**\n * Creates an instance of fabric.Image from its object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} callback Callback to invoke when an image instance is created\n */\n fabric.Image.fromObject = function(_object, callback) {\n var object = fabric.util.object.clone(_object);\n fabric.util.loadImage(object.src, function(img, error) {\n if (error) {\n callback && callback(null, error);\n return;\n }\n fabric.Image.prototype._initFilters.call(object, object.filters, function(filters) {\n object.filters = filters || [];\n fabric.Image.prototype._initFilters.call(object, [object.resizeFilter], function(resizeFilters) {\n object.resizeFilter = resizeFilters[0];\n fabric.util.enlivenObjects([object.clipPath], function(enlivedProps) {\n object.clipPath = enlivedProps[0];\n var image = new fabric.Image(img, object);\n callback(image);\n });\n });\n });\n }, null, object.crossOrigin);\n };\n\n /**\n * Creates an instance of fabric.Image from an URL string\n * @static\n * @param {String} url URL to create an image from\n * @param {Function} [callback] Callback to invoke when image is created (newly created image is passed as a first argument)\n * @param {Object} [imgOptions] Options object\n */\n fabric.Image.fromURL = function(url, callback, imgOptions) {\n fabric.util.loadImage(url, function(img) {\n callback && callback(new fabric.Image(img, imgOptions));\n }, null, imgOptions && imgOptions.crossOrigin);\n };\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Image.fromElement})\n * @static\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n fabric.Image.ATTRIBUTE_NAMES =\n fabric.SHARED_ATTRIBUTES.concat('x y width height preserveAspectRatio xlink:href crossOrigin'.split(' '));\n\n /**\n * Returns {@link fabric.Image} instance from an SVG element\n * @static\n * @param {SVGElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} callback Callback to execute when fabric.Image object is created\n * @return {fabric.Image} Instance of fabric.Image\n */\n fabric.Image.fromElement = function(element, callback, options) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES);\n fabric.Image.fromURL(parsedAttributes['xlink:href'], callback,\n extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n };\n /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * @private\n * @return {Number} angle value\n */\n _getAngleValueForStraighten: function() {\n var angle = this.angle % 360;\n if (angle > 0) {\n return Math.round((angle - 1) / 90) * 90;\n }\n return Math.round(angle / 90) * 90;\n },\n\n /**\n * Straightens an object (rotating it from current angle to one of 0, 90, 180, 270, etc. depending on which is closer)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n straighten: function() {\n this.rotate(this._getAngleValueForStraighten());\n return this;\n },\n\n /**\n * Same as {@link fabric.Object.prototype.straighten} but with animation\n * @param {Object} callbacks Object with callback functions\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Object} thisArg\n * @chainable\n */\n fxStraighten: function(callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n fabric.util.animate({\n startValue: this.get('angle'),\n endValue: this._getAngleValueForStraighten(),\n duration: this.FX_DURATION,\n onChange: function(value) {\n _this.rotate(value);\n onChange();\n },\n onComplete: function() {\n _this.setCoords();\n onComplete();\n },\n });\n\n return this;\n }\n});\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Straightens object, then rerenders canvas\n * @param {fabric.Object} object Object to straighten\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n straightenObject: function (object) {\n object.straighten();\n this.requestRenderAll();\n return this;\n },\n\n /**\n * Same as {@link fabric.Canvas.prototype.straightenObject}, but animated\n * @param {fabric.Object} object Object to straighten\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n fxStraightenObject: function (object) {\n object.fxStraighten({\n onChange: this.requestRenderAllBound\n });\n return this;\n }\n});\n\n\n(function() {\n\n 'use strict';\n\n /**\n * Tests if webgl supports certain precision\n * @param {WebGL} Canvas WebGL context to test on\n * @param {String} Precision to test can be any of following: 'lowp', 'mediump', 'highp'\n * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n */\n function testPrecision(gl, precision){\n var fragmentSource = 'precision ' + precision + ' float;\\nvoid main(){}';\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n return false;\n }\n return true;\n }\n\n /**\n * Indicate whether this filtering backend is supported by the user's browser.\n * @param {Number} tileSize check if the tileSize is supported\n * @returns {Boolean} Whether the user's browser supports WebGL.\n */\n fabric.isWebglSupported = function(tileSize) {\n if (fabric.isLikelyNode) {\n return false;\n }\n tileSize = tileSize || fabric.WebglFilterBackend.prototype.tileSize;\n var canvas = document.createElement('canvas');\n var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n var isSupported = false;\n // eslint-disable-next-line\n if (gl) {\n fabric.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n isSupported = fabric.maxTextureSize >= tileSize;\n var precisions = ['highp', 'mediump', 'lowp'];\n for (var i = 0; i < 3; i++){\n if (testPrecision(gl, precisions[i])){\n fabric.webGlPrecision = precisions[i];\n break;\n };\n }\n }\n this.isSupported = isSupported;\n return isSupported;\n };\n\n fabric.WebglFilterBackend = WebglFilterBackend;\n\n /**\n * WebGL filter backend.\n */\n function WebglFilterBackend(options) {\n if (options && options.tileSize) {\n this.tileSize = options.tileSize;\n }\n this.setupGLContext(this.tileSize, this.tileSize);\n this.captureGPUInfo();\n };\n\n WebglFilterBackend.prototype = /** @lends fabric.WebglFilterBackend.prototype */ {\n\n tileSize: 2048,\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you problably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: {\n\n },\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext: function(width, height) {\n this.dispose();\n this.createWebGLCanvas(width, height);\n // eslint-disable-next-line\n this.aPosition = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n this.chooseFastestCopyGLTo2DMethod(width, height);\n },\n\n /**\n * Pick a method to copy data from GL context to 2d canvas. In some browsers using\n * putImageData is faster than drawImage for that specific operation.\n */\n chooseFastestCopyGLTo2DMethod: function(width, height) {\n var canMeasurePerf = typeof window.performance !== 'undefined', canUseImageData;\n try {\n new ImageData(1, 1);\n canUseImageData = true;\n }\n catch (e) {\n canUseImageData = false;\n }\n // eslint-disable-next-line no-undef\n var canUseArrayBuffer = typeof ArrayBuffer !== 'undefined';\n // eslint-disable-next-line no-undef\n var canUseUint8Clamped = typeof Uint8ClampedArray !== 'undefined';\n\n if (!(canMeasurePerf && canUseImageData && canUseArrayBuffer && canUseUint8Clamped)) {\n return;\n }\n\n var targetCanvas = fabric.util.createCanvasElement();\n // eslint-disable-next-line no-undef\n var imageBuffer = new ArrayBuffer(width * height * 4);\n if (fabric.forceGLPutImageData) {\n this.imageBuffer = imageBuffer;\n this.copyGLTo2D = copyGLTo2DPutImageData;\n return;\n }\n var testContext = {\n imageBuffer: imageBuffer,\n destinationWidth: width,\n destinationHeight: height,\n targetCanvas: targetCanvas\n };\n var startTime, drawImageTime, putImageDataTime;\n targetCanvas.width = width;\n targetCanvas.height = height;\n\n startTime = window.performance.now();\n copyGLTo2DDrawImage.call(testContext, this.gl, testContext);\n drawImageTime = window.performance.now() - startTime;\n\n startTime = window.performance.now();\n copyGLTo2DPutImageData.call(testContext, this.gl, testContext);\n putImageDataTime = window.performance.now() - startTime;\n\n if (drawImageTime > putImageDataTime) {\n this.imageBuffer = imageBuffer;\n this.copyGLTo2D = copyGLTo2DPutImageData;\n }\n else {\n this.copyGLTo2D = copyGLTo2DDrawImage;\n }\n },\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas: function(width, height) {\n var canvas = fabric.util.createCanvasElement();\n canvas.width = width;\n canvas.height = height;\n var glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false\n },\n gl = canvas.getContext('webgl', glOptions);\n if (!gl) {\n gl = canvas.getContext('experimental-webgl', glOptions);\n }\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n },\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters: function(filters, source, width, height, targetCanvas, cacheKey) {\n var gl = this.gl;\n var cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n var pipelineState = {\n originalWidth: source.width || source.originalWidth,\n originalHeight: source.height || source.originalHeight,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(gl, width, height, !cachedTexture && source),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture: cachedTexture ||\n this.createTexture(gl, width, height, !cachedTexture && source),\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas\n };\n var tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach(function(filter) { filter && filter.applyTo(pipelineState); });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n targetCanvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n },\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose: function() {\n if (this.canvas) {\n this.canvas = null;\n this.gl = null;\n }\n this.clearWebGLCaches();\n },\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches: function() {\n this.programCache = {};\n this.textureCache = {};\n },\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the textuer to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {Number} width The width to initialize the texture at.\n * @param {Number} height The height to initialize the texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source for the texture data.\n * @returns {WebGLTexture}\n */\n createTexture: function(gl, width, height, textureImageSource) {\n var texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureImageSource);\n }\n else {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n }\n return texture;\n },\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture: function(uniqueId, textureImageSource) {\n if (this.textureCache[uniqueId]) {\n return this.textureCache[uniqueId];\n }\n else {\n var texture = this.createTexture(\n this.gl, textureImageSource.width, textureImageSource.height, textureImageSource);\n this.textureCache[uniqueId] = texture;\n return texture;\n }\n },\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey: function(cacheKey) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n },\n\n copyGLTo2D: copyGLTo2DDrawImage,\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo: function() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n var gl = this.gl, gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n var ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n var vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n },\n };\n})();\n\nfunction resizeCanvasIfNeeded(pipelineState) {\n var targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width, height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DDrawImage(gl, pipelineState) {\n var glCanvas = gl.canvas, targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n var sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(glCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0,\n targetCanvas.width, targetCanvas.height);\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DPutImageData(gl, pipelineState) {\n var targetCanvas = pipelineState.targetCanvas, ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n\n // eslint-disable-next-line no-undef\n var u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n // eslint-disable-next-line no-undef\n var u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n var imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n}\n\n\n(function() {\n\n 'use strict';\n\n var noop = function() {};\n\n fabric.Canvas2dFilterBackend = Canvas2dFilterBackend;\n\n /**\n * Canvas 2D filter backend.\n */\n function Canvas2dFilterBackend() {};\n\n Canvas2dFilterBackend.prototype = /** @lends fabric.Canvas2dFilterBackend.prototype */ {\n evictCachesForKey: noop,\n dispose: noop,\n clearWebGLCaches: noop,\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: {\n\n },\n\n /**\n * Apply a set of filters against a source image and draw the filtered output\n * to the provided destination canvas.\n *\n * @param {EnhancedFilter} filters The filter to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n * @param {Number} sourceWidth The width of the source input.\n * @param {Number} sourceHeight The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n */\n applyFilters: function(filters, sourceElement, sourceWidth, sourceHeight, targetCanvas) {\n var ctx = targetCanvas.getContext('2d');\n ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n var imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n var originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n var pipelineState = {\n sourceWidth: sourceWidth,\n sourceHeight: sourceHeight,\n imageData: imageData,\n originalEl: sourceElement,\n originalImageData: originalImageData,\n canvasEl: targetCanvas,\n ctx: ctx,\n filterBackend: this,\n };\n filters.forEach(function(filter) { filter.applyTo(pipelineState); });\n if (pipelineState.imageData.width !== sourceWidth || pipelineState.imageData.height !== sourceHeight) {\n targetCanvas.width = pipelineState.imageData.width;\n targetCanvas.height = pipelineState.imageData.height;\n }\n ctx.putImageData(pipelineState.imageData, 0, 0);\n return pipelineState;\n },\n\n };\n})();\n\n\n/**\n * @namespace fabric.Image.filters\n * @memberOf fabric.Image\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#image_filters}\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n */\nfabric.Image = fabric.Image || { };\nfabric.Image.filters = fabric.Image.filters || { };\n\n/**\n * Root filter class from which all filter classes inherit from\n * @class fabric.Image.filters.BaseFilter\n * @memberOf fabric.Image.filters\n */\nfabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Image.filters.BaseFilter.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'BaseFilter',\n\n /**\n * Array of attributes to send with buffers. do not modify\n * @private\n */\n\n vertexSource: 'attribute vec2 aPosition;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vTexCoord = aPosition;\\n' +\n 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n '}',\n\n fragmentSource: 'precision highp float;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'void main() {\\n' +\n 'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n '}',\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n if (options) {\n this.setOptions(options);\n }\n },\n\n /**\n * Sets filter's properties from options\n * @param {Object} [options] Options object\n */\n setOptions: function(options) {\n for (var prop in options) {\n this[prop] = options[prop];\n }\n },\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram: function(gl, fragmentSource, vertexSource) {\n fragmentSource = fragmentSource || this.fragmentSource;\n vertexSource = vertexSource || this.vertexSource;\n if (fabric.webGlPrecision !== 'highp'){\n fragmentSource = fragmentSource.replace(\n /precision highp float/g,\n 'precision ' + fabric.webGlPrecision + ' float'\n );\n }\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Vertex shader compile error for ' + this.type + ': ' +\n gl.getShaderInfoLog(vertexShader)\n );\n }\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Fragment shader compile error for ' + this.type + ': ' +\n gl.getShaderInfoLog(fragmentShader)\n );\n }\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Shader link error for \"${this.type}\" ' +\n gl.getProgramInfoLog(program)\n );\n }\n\n var attributeLocations = this.getAttributeLocations(gl, program);\n var uniformLocations = this.getUniformLocations(gl, program) || { };\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n return {\n program: program,\n attributeLocations: attributeLocations,\n uniformLocations: uniformLocations\n };\n },\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations: function(gl, program) {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n },\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations: function (/* gl, program */) {\n // in case i do not need any special uniform i need to return an empty object\n return { };\n },\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData: function(gl, attributeLocations, aPositionData) {\n var attributeLocation = attributeLocations.aPosition;\n var buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n },\n\n _setupFrameBuffer: function(options) {\n var gl = options.context, width, height;\n if (options.passes > 1) {\n width = options.destinationWidth;\n height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(gl, width, height);\n }\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D,\n options.targetTexture, 0);\n }\n else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n },\n\n _swapTextures: function(options) {\n options.passes--;\n options.pass++;\n var temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n },\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own verison ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n isNeutralState: function(/* options */) {\n var main = this.mainParameter,\n _class = fabric.Image.filters[this.type].prototype;\n if (main) {\n if (Array.isArray(_class[main])) {\n for (var i = _class[main].length; i--;) {\n if (this[main][i] !== _class[main][i]) {\n return false;\n }\n }\n return true;\n }\n else {\n return _class[main] === this[main];\n }\n }\n else {\n return false;\n }\n },\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n if (options.webgl) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n if (!options.programCache.hasOwnProperty(this.type)) {\n options.programCache[this.type] = this.createProgram(options.context);\n }\n return options.programCache[this.type];\n },\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL: function(options) {\n var gl = options.context;\n var shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n }\n else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n },\n\n bindAdditionalTexture: function(gl, texture, textureUnit) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n },\n\n unbindAdditionalTexture: function(gl, textureUnit) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n },\n\n getMainParameter: function() {\n return this[this.mainParameter];\n },\n\n setMainParameter: function(value) {\n this[this.mainParameter] = value;\n },\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData: function(/* gl, uniformLocations */) {\n // Intentionally left blank. Override me in subclasses.\n },\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer: function(options) {\n if (!options.helpLayer) {\n var helpLayer = document.createElement('canvas');\n helpLayer.width = options.sourceWidth;\n helpLayer.height = options.sourceHeight;\n options.helpLayer = helpLayer;\n }\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n var object = { type: this.type }, mainP = this.mainParameter;\n if (mainP) {\n object[mainP] = this[mainP];\n }\n return object;\n },\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON: function() {\n // delegate, not alias\n return this.toObject();\n }\n});\n\nfabric.Image.filters.BaseFilter.fromObject = function(object, callback) {\n var filter = new fabric.Image.filters[object.type](object);\n callback && callback(filter);\n return filter;\n};\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Color Matrix filter class\n * @class fabric.Image.filters.ColorMatrix\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.ColorMatrix#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @see {@Link http://www.webwasp.co.uk/tutorials/219/Color_Matrix_Filter.php}\n * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl}\n * @example Kodachrome filter\n * var filter = new fabric.Image.filters.ColorMatrix({\n * matrix: [\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0\n ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.ColorMatrix = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.ColorMatrix.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'ColorMatrix',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'uniform mat4 uColorMatrix;\\n' +\n 'uniform vec4 uConstants;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color *= uColorMatrix;\\n' +\n 'color += uConstants;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Colormatrix for pixels.\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Array} matrix array of 20 numbers.\n * @default\n */\n matrix: [\n 1, 0, 0, 0, 0,\n 0, 1, 0, 0, 0,\n 0, 0, 1, 0, 0,\n 0, 0, 0, 1, 0\n ],\n\n mainParameter: 'matrix',\n\n /**\n * Lock the colormatrix on the color part, skipping alpha, manly for non webgl scenario\n * to save some calculation\n */\n colorsOnly: true,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n // create a new array instead mutating the prototype with push\n this.matrix = this.matrix.slice(0);\n },\n\n /**\n * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n iLen = data.length,\n m = this.matrix,\n r, g, b, a, i, colorsOnly = this.colorsOnly;\n\n for (i = 0; i < iLen; i += 4) {\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n if (colorsOnly) {\n data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n }\n else {\n a = data[i + 3];\n data[i] = r * m[0] + g * m[1] + b * m[2] + a * m[3] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + a * m[8] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + a * m[13] + m[14] * 255;\n data[i + 3] = r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uColorMatrix: gl.getUniformLocation(program, 'uColorMatrix'),\n uConstants: gl.getUniformLocation(program, 'uConstants'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var m = this.matrix,\n matrix = [\n m[0], m[1], m[2], m[3],\n m[5], m[6], m[7], m[8],\n m[10], m[11], m[12], m[13],\n m[15], m[16], m[17], m[18]\n ],\n constants = [m[4], m[9], m[14], m[19]];\n gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n gl.uniform4fv(uniformLocations.uConstants, constants);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] function to invoke after filter creation\n * @return {fabric.Image.filters.ColorMatrix} Instance of fabric.Image.filters.ColorMatrix\n */\n fabric.Image.filters.ColorMatrix.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Brightness filter class\n * @class fabric.Image.filters.Brightness\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Brightness#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Brightness({\n * brightness: 0.05\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Brightness = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Brightness.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Brightness',\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uBrightness;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color.rgb += uBrightness;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Brightness value, from -1 to 1.\n * translated to -255 to 255 for 2d\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Number} brightness\n * @default\n */\n brightness: 0,\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'brightness',\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.brightness === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, i, len = data.length,\n brightness = Math.round(this.brightness * 255);\n for (i = 0; i < len; i += 4) {\n data[i] = data[i] + brightness;\n data[i + 1] = data[i + 1] + brightness;\n data[i + 2] = data[i + 2] + brightness;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uBrightness: gl.getUniformLocation(program, 'uBrightness'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Brightness} Instance of fabric.Image.filters.Brightness\n */\n fabric.Image.filters.Brightness.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Adapted from html5rocks article\n * @class fabric.Image.filters.Convolute\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Convolute#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example Sharpen filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Blur filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter with opaqueness\n * var filter = new fabric.Image.filters.Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Convolute = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Convolute.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Convolute',\n\n /*\n * Opaque value (true/false)\n */\n opaque: false,\n\n /*\n * matrix for the filter, max 9x9\n */\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: {\n Convolute_3_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[9];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_3_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[9];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_5_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[25];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_5_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[25];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_7_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[49];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_7_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[49];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_9_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[81];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_9_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[81];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n },\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Convolute.prototype\n * @param {Object} [options] Options object\n * @param {Boolean} [options.opaque=false] Opaque value (true/false)\n * @param {Array} [options.matrix] Filter matrix\n */\n\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var size = Math.sqrt(this.matrix.length);\n var cacheKey = this.type + '_' + size + '_' + (this.opaque ? 1 : 0);\n var shaderSource = this.fragmentSource[cacheKey];\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0,\n r, g, b, a, dstOff,\n scx, scy, srcOff, wt,\n x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0; g = 0; b = 0; a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n }\n else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uMatrix: gl.getUniformLocation(program, 'uMatrix'),\n uOpaque: gl.getUniformLocation(program, 'uOpaque'),\n uHalfSize: gl.getUniformLocation(program, 'uHalfSize'),\n uSize: gl.getUniformLocation(program, 'uSize'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n opaque: this.opaque,\n matrix: this.matrix\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Convolute} Instance of fabric.Image.filters.Convolute\n */\n fabric.Image.filters.Convolute.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Grayscale image filter class\n * @class fabric.Image.filters.Grayscale\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Grayscale();\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Grayscale = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Grayscale.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Grayscale',\n\n fragmentSource: {\n average: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = (color.r + color.b + color.g) / 3.0;\\n' +\n 'gl_FragColor = vec4(average, average, average, color.a);\\n' +\n '}',\n lightness: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uMode;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\\n' +\n 'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n '}',\n luminosity: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uMode;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\\n' +\n 'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n '}',\n },\n\n\n /**\n * Grayscale mode, between 'average', 'lightness', 'luminosity'\n * @param {String} type\n * @default\n */\n mode: 'average',\n\n mainParameter: 'mode',\n\n /**\n * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n len = data.length, value,\n mode = this.mode;\n for (i = 0; i < len; i += 4) {\n if (mode === 'average') {\n value = (data[i] + data[i + 1] + data[i + 2]) / 3;\n }\n else if (mode === 'lightness') {\n value = (Math.min(data[i], data[i + 1], data[i + 2]) +\n Math.max(data[i], data[i + 1], data[i + 2])) / 2;\n }\n else if (mode === 'luminosity') {\n value = 0.21 * data[i] + 0.72 * data[i + 1] + 0.07 * data[i + 2];\n }\n data[i] = value;\n data[i + 1] = value;\n data[i + 2] = value;\n }\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n var shaderSource = this.fragmentSource[this.mode];\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uMode: gl.getUniformLocation(program, 'uMode'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n // default average mode.\n var mode = 1;\n gl.uniform1i(uniformLocations.uMode, mode);\n },\n\n /**\n * Grayscale filter isNeutralState implementation\n * The filter is never neutral\n * on the image\n **/\n isNeutralState: function() {\n return false;\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Grayscale} Instance of fabric.Image.filters.Grayscale\n */\n fabric.Image.filters.Grayscale.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Invert filter class\n * @class fabric.Image.filters.Invert\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Invert();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\n filters.Invert = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Invert.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Invert',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uInvert;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'if (uInvert == 1) {\\n' +\n 'gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\\n' +\n '} else {\\n' +\n 'gl_FragColor = color;\\n' +\n '}\\n' +\n '}',\n\n /**\n * Filter invert. if false, does nothing\n * @param {Boolean} invert\n * @default\n */\n invert: true,\n\n mainParameter: 'invert',\n\n /**\n * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n len = data.length;\n for (i = 0; i < len; i += 4) {\n data[i] = 255 - data[i];\n data[i + 1] = 255 - data[i + 1];\n data[i + 2] = 255 - data[i + 2];\n }\n },\n\n /**\n * Invert filter isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState: function() {\n return !this.invert;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uInvert: gl.getUniformLocation(program, 'uInvert'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1i(uniformLocations.uInvert, this.invert);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Invert} Instance of fabric.Image.filters.Invert\n */\n fabric.Image.filters.Invert.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Noise filter class\n * @class fabric.Image.filters.Noise\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Noise#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Noise({\n * noise: 700\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Noise = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Noise.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Noise',\n\n /**\n * Fragment source for the noise program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uStepH;\\n' +\n 'uniform float uNoise;\\n' +\n 'uniform float uSeed;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'float rand(vec2 co, float seed, float vScale) {\\n' +\n 'return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\\n' +\n '}\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'noise',\n\n /**\n * Noise value, from\n * @param {Number} noise\n * @default\n */\n noise: 0,\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.noise === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, i, len = data.length,\n noise = this.noise, rand;\n\n for (i = 0, len = data.length; i < len; i += 4) {\n\n rand = (0.5 - Math.random()) * noise;\n\n data[i] += rand;\n data[i + 1] += rand;\n data[i + 2] += rand;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uNoise: gl.getUniformLocation(program, 'uNoise'),\n uSeed: gl.getUniformLocation(program, 'uSeed'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n gl.uniform1f(uniformLocations.uSeed, Math.random());\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n noise: this.noise\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Noise} Instance of fabric.Image.filters.Noise\n */\n fabric.Image.filters.Noise.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Pixelate filter class\n * @class fabric.Image.filters.Pixelate\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Pixelate#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Pixelate({\n * blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Pixelate = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Pixelate.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Pixelate',\n\n blocksize: 4,\n\n mainParameter: 'blocksize',\n\n /**\n * Fragment source for the Pixelate program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uBlocksize;\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'float blockW = uBlocksize * uStepW;\\n' +\n 'float blockH = uBlocksize * uStepW;\\n' +\n 'int posX = int(vTexCoord.x / blockW);\\n' +\n 'int posY = int(vTexCoord.y / blockH);\\n' +\n 'float fposX = float(posX);\\n' +\n 'float fposY = float(posY);\\n' +\n 'vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\\n' +\n 'vec4 color = texture2D(uTexture, squareCoords);\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n iLen = imageData.height,\n jLen = imageData.width,\n index, i, j, r, g, b, a,\n _i, _j, _iLen, _jLen;\n\n for (i = 0; i < iLen; i += this.blocksize) {\n for (j = 0; j < jLen; j += this.blocksize) {\n\n index = (i * 4) * jLen + (j * 4);\n\n r = data[index];\n g = data[index + 1];\n b = data[index + 2];\n a = data[index + 3];\n\n _iLen = Math.min(i + this.blocksize, iLen);\n _jLen = Math.min(j + this.blocksize, jLen);\n for (_i = i; _i < _iLen; _i++) {\n for (_j = j; _j < _jLen; _j++) {\n index = (_i * 4) * jLen + (_j * 4);\n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n }\n }\n },\n\n /**\n * Indicate when the filter is not gonna apply changes to the image\n **/\n isNeutralState: function() {\n return this.blocksize === 1;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uBlocksize: gl.getUniformLocation(program, 'uBlocksize'),\n uStepW: gl.getUniformLocation(program, 'uStepW'),\n uStepH: gl.getUniformLocation(program, 'uStepH'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Pixelate} Instance of fabric.Image.filters.Pixelate\n */\n fabric.Image.filters.Pixelate.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Remove white filter class\n * @class fabric.Image.filters.RemoveColor\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.RemoveColor#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.RemoveColor({\n * threshold: 0.2,\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.RemoveColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.RemoveColor.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'RemoveColor',\n\n /**\n * Color to remove, in any format understood by fabric.Color.\n * @param {String} type\n * @default\n */\n color: '#FFFFFF',\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec4 uLow;\\n' +\n 'uniform vec4 uHigh;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n 'if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\\n' +\n 'gl_FragColor.a = 0.0;\\n' +\n '}\\n' +\n '}',\n\n /**\n * distance to actual color, as value up or down from each r,g,b\n * between 0 and 1\n **/\n distance: 0.02,\n\n /**\n * For color to remove inside distance, use alpha channel for a smoother deletion\n * NOT IMPLEMENTED YET\n **/\n useAlpha: false,\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.RemoveWhite.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.color=#RRGGBB] Threshold value\n * @param {Number} [options.distance=10] Distance value\n */\n\n /**\n * Applies filter to canvas element\n * @param {Object} canvasEl Canvas element to apply filter to\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n distance = this.distance * 255,\n r, g, b,\n source = new fabric.Color(this.color).getSource(),\n lowC = [\n source[0] - distance,\n source[1] - distance,\n source[2] - distance,\n ],\n highC = [\n source[0] + distance,\n source[1] + distance,\n source[2] + distance,\n ];\n\n\n for (i = 0; i < data.length; i += 4) {\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n\n if (r > lowC[0] &&\n g > lowC[1] &&\n b > lowC[2] &&\n r < highC[0] &&\n g < highC[1] &&\n b < highC[2]) {\n data[i + 3] = 0;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uLow: gl.getUniformLocation(program, 'uLow'),\n uHigh: gl.getUniformLocation(program, 'uHigh'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var source = new fabric.Color(this.color).getSource(),\n distance = parseFloat(this.distance),\n lowC = [\n 0 + source[0] / 255 - distance,\n 0 + source[1] / 255 - distance,\n 0 + source[2] / 255 - distance,\n 1\n ],\n highC = [\n source[0] / 255 + distance,\n source[1] / 255 + distance,\n source[2] / 255 + distance,\n 1\n ];\n gl.uniform4fv(uniformLocations.uLow, lowC);\n gl.uniform4fv(uniformLocations.uHigh, highC);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n color: this.color,\n distance: this.distance\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.RemoveColor} Instance of fabric.Image.filters.RemoveWhite\n */\n fabric.Image.filters.RemoveColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n var matrices = {\n Brownie: [\n 0.59970,0.34553,-0.27082,0,0.186,\n -0.03770,0.86095,0.15059,0,-0.1449,\n 0.24113,-0.07441,0.44972,0,-0.02965,\n 0,0,0,1,0\n ],\n Vintage: [\n 0.62793,0.32021,-0.03965,0,0.03784,\n 0.02578,0.64411,0.03259,0,0.02926,\n 0.04660,-0.08512,0.52416,0,0.02023,\n 0,0,0,1,0\n ],\n Kodachrome: [\n 1.12855,-0.39673,-0.03992,0,0.24991,\n -0.16404,1.08352,-0.05498,0,0.09698,\n -0.16786,-0.56034,1.60148,0,0.13972,\n 0,0,0,1,0\n ],\n Technicolor: [\n 1.91252,-0.85453,-0.09155,0,0.04624,\n -0.30878,1.76589,-0.10601,0,-0.27589,\n -0.23110,-0.75018,1.84759,0,0.12137,\n 0,0,0,1,0\n ],\n Polaroid: [\n 1.438,-0.062,-0.062,0,0,\n -0.122,1.378,-0.122,0,0,\n -0.016,-0.016,1.483,0,0,\n 0,0,0,1,0\n ],\n Sepia: [\n 0.393, 0.769, 0.189, 0, 0,\n 0.349, 0.686, 0.168, 0, 0,\n 0.272, 0.534, 0.131, 0, 0,\n 0, 0, 0, 1, 0\n ],\n BlackWhite: [\n 1.5, 1.5, 1.5, 0, -1,\n 1.5, 1.5, 1.5, 0, -1,\n 1.5, 1.5, 1.5, 0, -1,\n 0, 0, 0, 1, 0,\n ]\n };\n\n for (var key in matrices) {\n filters[key] = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.Sepia.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: key,\n\n /**\n * Colormatrix for the effect\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * @param {Array} matrix array of 20 numbers.\n * @default\n */\n matrix: matrices[key],\n\n /**\n * Lock the matrix export for this kind of static, parameter less filters.\n */\n mainParameter: false,\n /**\n * Lock the colormatrix on the color part, skipping alpha\n */\n colorsOnly: true,\n\n });\n fabric.Image.filters[key].fromObject = fabric.Image.filters.BaseFilter.fromObject;\n }\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n 'use strict';\n\n var fabric = global.fabric,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Color Blend filter class\n * @class fabric.Image.filter.BlendColor\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @example\n * var filter = new fabric.Image.filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * var filter = new fabric.Image.filters.BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply',\n * alpha: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n\n filters.BlendColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blend.prototype */ {\n type: 'BlendColor',\n\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n **/\n color: '#F95C63',\n\n /**\n * Blend mode for the filter: one of multiply, add, diff, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n **/\n mode: 'multiply',\n\n /**\n * alpha value. represent the strength of the blend color operation.\n **/\n alpha: 1,\n\n /**\n * Fragment source for the Multiply program\n */\n fragmentSource: {\n multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n screen: 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n diff: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n exclusion: 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n overlay: 'if (uColor.r < 0.5) {\\n' +\n 'gl_FragColor.r *= 2.0 * uColor.r;\\n' +\n '} else {\\n' +\n 'gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\\n' +\n '}\\n' +\n 'if (uColor.g < 0.5) {\\n' +\n 'gl_FragColor.g *= 2.0 * uColor.g;\\n' +\n '} else {\\n' +\n 'gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\\n' +\n '}\\n' +\n 'if (uColor.b < 0.5) {\\n' +\n 'gl_FragColor.b *= 2.0 * uColor.b;\\n' +\n '} else {\\n' +\n 'gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\\n' +\n '}\\n',\n tint: 'gl_FragColor.rgb *= (1.0 - uColor.a);\\n' +\n 'gl_FragColor.rgb += uColor.rgb;\\n',\n },\n\n /**\n * build the fragment source for the filters, joining the common part with\n * the specific one.\n * @param {String} mode the mode of the filter, a key of this.fragmentSource\n * @return {String} the source to be compiled\n * @private\n */\n buildSource: function(mode) {\n return 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'gl_FragColor = color;\\n' +\n 'if (color.a > 0.0) {\\n' +\n this.fragmentSource[mode] +\n '}\\n' +\n '}';\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode, shaderSource;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n shaderSource = this.buildSource(this.mode);\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, iLen = data.length,\n tr, tg, tb,\n r, g, b,\n source, alpha1 = 1 - this.alpha;\n\n source = new fabric.Color(this.color).getSource();\n tr = source[0] * this.alpha;\n tg = source[1] * this.alpha;\n tb = source[2] * this.alpha;\n\n for (var i = 0; i < iLen; i += 4) {\n\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = r * tr / 255;\n data[i + 1] = g * tg / 255;\n data[i + 2] = b * tb / 255;\n break;\n case 'screen':\n data[i] = 255 - (255 - r) * (255 - tr) / 255;\n data[i + 1] = 255 - (255 - g) * (255 - tg) / 255;\n data[i + 2] = 255 - (255 - b) * (255 - tb) / 255;\n break;\n case 'add':\n data[i] = r + tr;\n data[i + 1] = g + tg;\n data[i + 2] = b + tb;\n break;\n case 'diff':\n case 'difference':\n data[i] = Math.abs(r - tr);\n data[i + 1] = Math.abs(g - tg);\n data[i + 2] = Math.abs(b - tb);\n break;\n case 'subtract':\n data[i] = r - tr;\n data[i + 1] = g - tg;\n data[i + 2] = b - tb;\n break;\n case 'darken':\n data[i] = Math.min(r, tr);\n data[i + 1] = Math.min(g, tg);\n data[i + 2] = Math.min(b, tb);\n break;\n case 'lighten':\n data[i] = Math.max(r, tr);\n data[i + 1] = Math.max(g, tg);\n data[i + 2] = Math.max(b, tb);\n break;\n case 'overlay':\n data[i] = tr < 128 ? (2 * r * tr / 255) : (255 - 2 * (255 - r) * (255 - tr) / 255);\n data[i + 1] = tg < 128 ? (2 * g * tg / 255) : (255 - 2 * (255 - g) * (255 - tg) / 255);\n data[i + 2] = tb < 128 ? (2 * b * tb / 255) : (255 - 2 * (255 - b) * (255 - tb) / 255);\n break;\n case 'exclusion':\n data[i] = tr + r - ((2 * tr * r) / 255);\n data[i + 1] = tg + g - ((2 * tg * g) / 255);\n data[i + 2] = tb + b - ((2 * tb * b) / 255);\n break;\n case 'tint':\n data[i] = tr + r * alpha1;\n data[i + 1] = tg + g * alpha1;\n data[i + 2] = tb + b * alpha1;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uColor: gl.getUniformLocation(program, 'uColor'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var source = new fabric.Color(this.color).getSource();\n source[0] = this.alpha * source[0] / 255;\n source[1] = this.alpha * source[1] / 255;\n source[2] = this.alpha * source[2] / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n color: this.color,\n mode: this.mode,\n alpha: this.alpha\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.BlendColor} Instance of fabric.Image.filters.BlendColor\n */\n fabric.Image.filters.BlendColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n 'use strict';\n\n var fabric = global.fabric,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Image Blend filter class\n * @class fabric.Image.filter.BlendImage\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @example\n * var filter = new fabric.Image.filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * var filter = new fabric.Image.filters.BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply',\n * alpha: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n\n filters.BlendImage = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.BlendImage.prototype */ {\n type: 'BlendImage',\n\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n **/\n image: null,\n\n /**\n * Blend mode for the filter: one of multiply, add, diff, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n **/\n mode: 'multiply',\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n alpha: 1,\n\n vertexSource: 'attribute vec2 aPosition;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'uniform mat3 uTransformMatrix;\\n' +\n 'void main() {\\n' +\n 'vTexCoord = aPosition;\\n' +\n 'vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\\n' +\n 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n '}',\n\n /**\n * Fragment source for the Multiply program\n */\n fragmentSource: {\n multiply: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform sampler2D uImage;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n 'color.rgba *= color2.rgba;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n mask: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform sampler2D uImage;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n 'color.a = color2.a;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode;\n var shaderSource = this.fragmentSource[this.mode];\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n applyToWebGL: function(options) {\n // load texture to blend.\n var gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture, gl.TEXTURE1);\n this.callSuper('applyToWebGL', options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n },\n\n createTexture: function(backend, image) {\n return backend.getCachedTexture(image.cacheKey, image._element);\n },\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix: function() {\n var image = this.image,\n width = image._element.width,\n height = image._element.height;\n return [\n 1 / image.scaleX, 0, 0,\n 0, 1 / image.scaleY, 0,\n -image.left / width, -image.top / height, 1\n ];\n },\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n resources = options.filterBackend.resources,\n data = imageData.data, iLen = data.length,\n width = imageData.width,\n height = imageData.height,\n tr, tg, tb, ta,\n r, g, b, a,\n canvas1, context, image = this.image, blendData;\n\n if (!resources.blendImage) {\n resources.blendImage = fabric.util.createCanvasElement();\n }\n canvas1 = resources.blendImage;\n context = canvas1.getContext('2d');\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n }\n else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(image.scaleX, 0, 0, image.scaleY, image.left, image.top);\n context.drawImage(image._element, 0, 0, width, height);\n blendData = context.getImageData(0, 0, width, height).data;\n for (var i = 0; i < iLen; i += 4) {\n\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n a = data[i + 3];\n\n tr = blendData[i];\n tg = blendData[i + 1];\n tb = blendData[i + 2];\n ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = r * tr / 255;\n data[i + 1] = g * tg / 255;\n data[i + 2] = b * tb / 255;\n data[i + 3] = a * ta / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'),\n uImage: gl.getUniformLocation(program, 'uImage'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n image: this.image && this.image.toObject(),\n mode: this.mode,\n alpha: this.alpha\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} callback to be invoked after filter creation\n * @return {fabric.Image.filters.BlendImage} Instance of fabric.Image.filters.BlendImage\n */\n fabric.Image.filters.BlendImage.fromObject = function(object, callback) {\n fabric.Image.fromObject(object.image, function(image) {\n var options = fabric.util.object.clone(object);\n options.image = image;\n callback(new fabric.Image.filters.BlendImage(options));\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }), pow = Math.pow, floor = Math.floor,\n sqrt = Math.sqrt, abs = Math.abs, round = Math.round, sin = Math.sin,\n ceil = Math.ceil,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Resize image filter class\n * @class fabric.Image.filters.Resize\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Resize();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\n filters.Resize = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Resize.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Resize',\n\n /**\n * Resize type\n * for webgl resizeType is just lanczos, for canvas2d can be:\n * bilinear, hermite, sliceHack, lanczos.\n * @param {String} resizeType\n * @default\n */\n resizeType: 'hermite',\n\n /**\n * Scale factor for resizing, x axis\n * @param {Number} scaleX\n * @default\n */\n scaleX: 1,\n\n /**\n * Scale factor for resizing, y axis\n * @param {Number} scaleY\n * @default\n */\n scaleY: 1,\n\n /**\n * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n * @param {Number} lanczosLobes\n * @default\n */\n lanczosLobes: 3,\n\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uDelta: gl.getUniformLocation(program, 'uDelta'),\n uTaps: gl.getUniformLocation(program, 'uTaps'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform2fv(uniformLocations.uDelta, this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height]);\n gl.uniform1fv(uniformLocations.uTaps, this.taps);\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var filterWindow = this.getFilterWindow(), cacheKey = this.type + '_' + filterWindow;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n var fragmentShader = this.generateShader(filterWindow);\n options.programCache[cacheKey] = this.createProgram(options.context, fragmentShader);\n }\n return options.programCache[cacheKey];\n },\n\n getFilterWindow: function() {\n var scale = this.tempScale;\n return Math.ceil(this.lanczosLobes / scale);\n },\n\n getTaps: function() {\n var lobeFunction = this.lanczosCreate(this.lanczosLobes), scale = this.tempScale,\n filterWindow = this.getFilterWindow(), taps = new Array(filterWindow);\n for (var i = 1; i <= filterWindow; i++) {\n taps[i - 1] = lobeFunction(i * scale);\n }\n return taps;\n },\n\n /**\n * Generate vertex and shader sources from the necessary steps numbers\n * @param {Number} filterWindow\n */\n generateShader: function(filterWindow) {\n var offsets = new Array(filterWindow),\n fragmentShader = this.fragmentSourceTOP, filterWindow;\n\n for (var i = 1; i <= filterWindow; i++) {\n offsets[i - 1] = i + '.0 * uDelta';\n }\n\n fragmentShader += 'uniform float uTaps[' + filterWindow + '];\\n';\n fragmentShader += 'void main() {\\n';\n fragmentShader += ' vec4 color = texture2D(uTexture, vTexCoord);\\n';\n fragmentShader += ' float sum = 1.0;\\n';\n\n offsets.forEach(function(offset, i) {\n fragmentShader += ' color += texture2D(uTexture, vTexCoord + ' + offset + ') * uTaps[' + i + '];\\n';\n fragmentShader += ' color += texture2D(uTexture, vTexCoord - ' + offset + ') * uTaps[' + i + '];\\n';\n fragmentShader += ' sum += 2.0 * uTaps[' + i + '];\\n';\n });\n fragmentShader += ' gl_FragColor = color / sum;\\n';\n fragmentShader += '}';\n return fragmentShader;\n },\n\n fragmentSourceTOP: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec2 uDelta;\\n' +\n 'varying vec2 vTexCoord;\\n',\n\n /**\n * Apply the resize filter to the image\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n if (options.webgl) {\n options.passes++;\n this.width = options.sourceWidth;\n this.horizontal = true;\n this.dW = Math.round(this.width * this.scaleX);\n this.dH = options.sourceHeight;\n this.tempScale = this.dW / this.width;\n this.taps = this.getTaps();\n options.destinationWidth = this.dW;\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n options.sourceWidth = options.destinationWidth;\n\n this.height = options.sourceHeight;\n this.horizontal = false;\n this.dH = Math.round(this.height * this.scaleY);\n this.tempScale = this.dH / this.height;\n this.taps = this.getTaps();\n options.destinationHeight = this.dH;\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n options.sourceHeight = options.destinationHeight;\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n isNeutralState: function() {\n return this.scaleX === 1 && this.scaleY === 1;\n },\n\n lanczosCreate: function(lobes) {\n return function(x) {\n if (x >= lobes || x <= -lobes) {\n return 0.0;\n }\n if (x < 1.19209290E-07 && x > -1.19209290E-07) {\n return 1.0;\n }\n x *= Math.PI;\n var xx = x / lobes;\n return (sin(x) / x) * sin(xx) / xx;\n };\n },\n\n /**\n * Applies filter to canvas element\n * @memberOf fabric.Image.filters.Resize.prototype\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} scaleX\n * @param {Number} scaleY\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n scaleX = this.scaleX,\n scaleY = this.scaleY;\n\n this.rcpScaleX = 1 / scaleX;\n this.rcpScaleY = 1 / scaleY;\n\n var oW = imageData.width, oH = imageData.height,\n dW = round(oW * scaleX), dH = round(oH * scaleY),\n newData;\n\n if (this.resizeType === 'sliceHack') {\n newData = this.sliceByTwo(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'hermite') {\n newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'bilinear') {\n newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'lanczos') {\n newData = this.lanczosResize(options, oW, oH, dW, dH);\n }\n options.imageData = newData;\n },\n\n /**\n * Filter sliceByTwo\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n sliceByTwo: function(options, oW, oH, dW, dH) {\n var imageData = options.imageData,\n mult = 0.5, doneW = false, doneH = false, stepW = oW * mult,\n stepH = oH * mult, resources = fabric.filterBackend.resources,\n tmpCanvas, ctx, sX = 0, sY = 0, dX = oW, dY = 0;\n if (!resources.sliceByTwo) {\n resources.sliceByTwo = document.createElement('canvas');\n }\n tmpCanvas = resources.sliceByTwo;\n if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n tmpCanvas.width = oW * 1.5;\n tmpCanvas.height = oH;\n }\n ctx = tmpCanvas.getContext('2d');\n ctx.clearRect(0, 0, oW * 1.5, oH);\n ctx.putImageData(imageData, 0, 0);\n\n dW = floor(dW);\n dH = floor(dH);\n\n while (!doneW || !doneH) {\n oW = stepW;\n oH = stepH;\n if (dW < floor(stepW * mult)) {\n stepW = floor(stepW * mult);\n }\n else {\n stepW = dW;\n doneW = true;\n }\n if (dH < floor(stepH * mult)) {\n stepH = floor(stepH * mult);\n }\n else {\n stepH = dH;\n doneH = true;\n }\n ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n sX = dX;\n sY = dY;\n dY += stepH;\n }\n return ctx.getImageData(sX, sY, dW, dH);\n },\n\n /**\n * Filter lanczosResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n lanczosResize: function(options, oW, oH, dW, dH) {\n\n function process(u) {\n var v, i, weight, idx, a, red, green,\n blue, alpha, fX, fY;\n center.x = (u + 0.5) * ratioX;\n icenter.x = floor(center.x);\n for (v = 0; v < dH; v++) {\n center.y = (v + 0.5) * ratioY;\n icenter.y = floor(center.y);\n a = 0; red = 0; green = 0; blue = 0; alpha = 0;\n for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n if (i < 0 || i >= oW) {\n continue;\n }\n fX = floor(1000 * abs(i - center.x));\n if (!cacheLanc[fX]) {\n cacheLanc[fX] = { };\n }\n for (var j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n if (j < 0 || j >= oH) {\n continue;\n }\n fY = floor(1000 * abs(j - center.y));\n if (!cacheLanc[fX][fY]) {\n cacheLanc[fX][fY] = lanczos(sqrt(pow(fX * rcpRatioX, 2) + pow(fY * rcpRatioY, 2)) / 1000);\n }\n weight = cacheLanc[fX][fY];\n if (weight > 0) {\n idx = (j * oW + i) * 4;\n a += weight;\n red += weight * srcData[idx];\n green += weight * srcData[idx + 1];\n blue += weight * srcData[idx + 2];\n alpha += weight * srcData[idx + 3];\n }\n }\n }\n idx = (v * dW + u) * 4;\n destData[idx] = red / a;\n destData[idx + 1] = green / a;\n destData[idx + 2] = blue / a;\n destData[idx + 3] = alpha / a;\n }\n\n if (++u < dW) {\n return process(u);\n }\n else {\n return destImg;\n }\n }\n\n var srcData = options.imageData.data,\n destImg = options.ctx.createImageData(dW, dH),\n destData = destImg.data,\n lanczos = this.lanczosCreate(this.lanczosLobes),\n ratioX = this.rcpScaleX, ratioY = this.rcpScaleY,\n rcpRatioX = 2 / this.rcpScaleX, rcpRatioY = 2 / this.rcpScaleY,\n range2X = ceil(ratioX * this.lanczosLobes / 2),\n range2Y = ceil(ratioY * this.lanczosLobes / 2),\n cacheLanc = { }, center = { }, icenter = { };\n\n return process(0);\n },\n\n /**\n * bilinearFiltering\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n bilinearFiltering: function(options, oW, oH, dW, dH) {\n var a, b, c, d, x, y, i, j, xDiff, yDiff, chnl,\n color, offset = 0, origPix, ratioX = this.rcpScaleX,\n ratioY = this.rcpScaleY,\n w4 = 4 * (oW - 1), img = options.imageData,\n pixels = img.data, destImage = options.ctx.createImageData(dW, dH),\n destPixels = destImage.data;\n for (i = 0; i < dH; i++) {\n for (j = 0; j < dW; j++) {\n x = floor(ratioX * j);\n y = floor(ratioY * i);\n xDiff = ratioX * j - x;\n yDiff = ratioY * i - y;\n origPix = 4 * (y * oW + x);\n\n for (chnl = 0; chnl < 4; chnl++) {\n a = pixels[origPix + chnl];\n b = pixels[origPix + 4 + chnl];\n c = pixels[origPix + w4 + chnl];\n d = pixels[origPix + w4 + 4 + chnl];\n color = a * (1 - xDiff) * (1 - yDiff) + b * xDiff * (1 - yDiff) +\n c * yDiff * (1 - xDiff) + d * xDiff * yDiff;\n destPixels[offset++] = color;\n }\n }\n }\n return destImage;\n },\n\n /**\n * hermiteFastResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n hermiteFastResize: function(options, oW, oH, dW, dH) {\n var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY,\n ratioWHalf = ceil(ratioW / 2),\n ratioHHalf = ceil(ratioH / 2),\n img = options.imageData, data = img.data,\n img2 = options.ctx.createImageData(dW, dH), data2 = img2.data;\n for (var j = 0; j < dH; j++) {\n for (var i = 0; i < dW; i++) {\n var x2 = (i + j * dW) * 4, weight = 0, weights = 0, weightsAlpha = 0,\n gxR = 0, gxG = 0, gxB = 0, gxA = 0, centerY = (j + 0.5) * ratioH;\n for (var yy = floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n var dy = abs(centerY - (yy + 0.5)) / ratioHHalf,\n centerX = (i + 0.5) * ratioW, w0 = dy * dy;\n for (var xx = floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n var dx = abs(centerX - (xx + 0.5)) / ratioWHalf,\n w = sqrt(w0 + dx * dx);\n /* eslint-disable max-depth */\n if (w > 1 && w < -1) {\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n if (weight > 0) {\n dx = 4 * (xx + yy * oW);\n //alpha\n gxA += weight * data[dx + 3];\n weightsAlpha += weight;\n //colors\n if (data[dx + 3] < 255) {\n weight = weight * data[dx + 3] / 250;\n }\n gxR += weight * data[dx];\n gxG += weight * data[dx + 1];\n gxB += weight * data[dx + 2];\n weights += weight;\n }\n /* eslint-enable max-depth */\n }\n }\n data2[x2] = gxR / weights;\n data2[x2 + 1] = gxG / weights;\n data2[x2 + 2] = gxB / weights;\n data2[x2 + 3] = gxA / weightsAlpha;\n }\n }\n return img2;\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n resizeType: this.resizeType,\n lanczosLobes: this.lanczosLobes\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Resize} Instance of fabric.Image.filters.Resize\n */\n fabric.Image.filters.Resize.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Contrast filter class\n * @class fabric.Image.filters.Contrast\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Contrast#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Contrast({\n * contrast: 0.25\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Contrast = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Contrast.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Contrast',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uContrast;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\\n' +\n 'color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * contrast value, range from -1 to 1.\n * @param {Number} contrast\n * @default 0\n */\n contrast: 0,\n\n mainParameter: 'contrast',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Contrast.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.contrast=0] Value to contrast the image up (-1...1)\n */\n\n /**\n * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n if (this.contrast === 0) {\n return;\n }\n var imageData = options.imageData, i, len,\n data = imageData.data, len = data.length,\n contrast = Math.floor(this.contrast * 255),\n contrastF = 259 * (contrast + 255) / (255 * (259 - contrast));\n\n for (i = 0; i < len; i += 4) {\n data[i] = contrastF * (data[i] - 128) + 128;\n data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uContrast: gl.getUniformLocation(program, 'uContrast'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uContrast, this.contrast);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Contrast} Instance of fabric.Image.filters.Contrast\n */\n fabric.Image.filters.Contrast.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Saturate filter class\n * @class fabric.Image.filters.Saturation\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Saturation#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Saturation({\n * saturation: 100\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Saturation = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Saturation.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Saturation',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uSaturation;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float rgMax = max(color.r, color.g);\\n' +\n 'float rgbMax = max(rgMax, color.b);\\n' +\n 'color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\\n' +\n 'color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\\n' +\n 'color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n saturation: 0,\n\n mainParameter: 'saturation',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Saturate.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.saturate=0] Value to saturate the image (-1...1)\n */\n\n /**\n * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.saturation === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, len = data.length,\n adjust = -this.saturation, i, max;\n\n for (i = 0; i < len; i += 4) {\n max = Math.max(data[i], data[i + 1], data[i + 2]);\n data[i] += max !== data[i] ? (max - data[i]) * adjust : 0;\n data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * adjust : 0;\n data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * adjust : 0;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uSaturation: gl.getUniformLocation(program, 'uSaturation'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Saturation} Instance of fabric.Image.filters.Saturate\n */\n fabric.Image.filters.Saturation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Blur filter class\n * @class fabric.Image.filters.Blur\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Blur#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Blur({\n * blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Blur = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blur.prototype */ {\n\n type: 'Blur',\n\n /*\n'gl_FragColor = vec4(0.0);',\n'gl_FragColor += texture2D(texture, vTexCoord + -7 * uDelta)*0.0044299121055113265;',\n'gl_FragColor += texture2D(texture, vTexCoord + -6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + -5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + -4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + -3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + -2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + -1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord )*0.159576912161;',\n'gl_FragColor += texture2D(texture, vTexCoord + 1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord + 2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + 3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + 4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + 5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + 6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + 7 * uDelta)*0.0044299121055113265;',\n*/\n\n /* eslint-disable max-len */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec2 uDelta;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'const float nSamples = 15.0;\\n' +\n 'vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\\n' +\n 'float random(vec3 scale) {\\n' +\n /* use the fragment position for a different seed per-pixel */\n 'return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\\n' +\n '}\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0.0);\\n' +\n 'float total = 0.0;\\n' +\n 'float offset = random(v3offset);\\n' +\n 'for (float t = -nSamples; t <= nSamples; t++) {\\n' +\n 'float percent = (t + offset - 0.5) / nSamples;\\n' +\n 'float weight = 1.0 - abs(percent);\\n' +\n 'color += texture2D(uTexture, vTexCoord + uDelta * percent) * weight;\\n' +\n 'total += weight;\\n' +\n '}\\n' +\n 'gl_FragColor = color / total;\\n' +\n '}',\n /* eslint-enable max-len */\n\n /**\n * blur value, in percentage of image dimensions.\n * specific to keep the image blur constant at different resolutions\n * range bewteen 0 and 1.\n */\n blur: 0,\n\n mainParameter: 'blur',\n\n applyTo: function(options) {\n if (options.webgl) {\n // this aspectRatio is used to give the same blur to vertical and horizontal\n this.aspectRatio = options.sourceWidth / options.sourceHeight;\n options.passes++;\n this._setupFrameBuffer(options);\n this.horizontal = true;\n this.applyToWebGL(options);\n this._swapTextures(options);\n this._setupFrameBuffer(options);\n this.horizontal = false;\n this.applyToWebGL(options);\n this._swapTextures(options);\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n applyTo2d: function(options) {\n // paint canvasEl with current image data.\n //options.ctx.putImageData(options.imageData, 0, 0);\n options.imageData = this.simpleBlur(options);\n },\n\n simpleBlur: function(options) {\n var resources = options.filterBackend.resources, canvas1, canvas2,\n width = options.imageData.width,\n height = options.imageData.height;\n\n if (!resources.blurLayer1) {\n resources.blurLayer1 = fabric.util.createCanvasElement();\n resources.blurLayer2 = fabric.util.createCanvasElement();\n }\n canvas1 = resources.blurLayer1;\n canvas2 = resources.blurLayer2;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas2.width = canvas1.width = width;\n canvas2.height = canvas1.height = height;\n }\n var ctx1 = canvas1.getContext('2d'),\n ctx2 = canvas2.getContext('2d'),\n nSamples = 15,\n random, percent, j, i,\n blur = this.blur * 0.06 * 0.5;\n\n // load first canvas\n ctx1.putImageData(options.imageData, 0, 0);\n ctx2.clearRect(0, 0, width, height);\n\n for (i = -nSamples; i <= nSamples; i++) {\n random = (Math.random() - 0.5) / 4;\n percent = i / nSamples;\n j = blur * percent * width + random;\n ctx2.globalAlpha = 1 - Math.abs(percent);\n ctx2.drawImage(canvas1, j, random);\n ctx1.drawImage(canvas2, 0, 0);\n ctx2.globalAlpha = 1;\n ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n }\n for (i = -nSamples; i <= nSamples; i++) {\n random = (Math.random() - 0.5) / 4;\n percent = i / nSamples;\n j = blur * percent * height + random;\n ctx2.globalAlpha = 1 - Math.abs(percent);\n ctx2.drawImage(canvas1, random, j);\n ctx1.drawImage(canvas2, 0, 0);\n ctx2.globalAlpha = 1;\n ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n }\n options.ctx.drawImage(canvas1, 0, 0);\n var newImageData = options.ctx.getImageData(0, 0, canvas1.width, canvas1.height);\n ctx1.globalAlpha = 1;\n ctx1.clearRect(0, 0, canvas1.width, canvas1.height);\n return newImageData;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n delta: gl.getUniformLocation(program, 'uDelta'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var delta = this.chooseRightDelta();\n gl.uniform2fv(uniformLocations.delta, delta);\n },\n\n /**\n * choose right value of image percentage to blur with\n * @returns {Array} a numeric array with delta values\n */\n chooseRightDelta: function() {\n var blurScale = 1, delta = [0, 0], blur;\n if (this.horizontal) {\n if (this.aspectRatio > 1) {\n // image is wide, i want to shrink radius horizontal\n blurScale = 1 / this.aspectRatio;\n }\n }\n else {\n if (this.aspectRatio < 1) {\n // image is tall, i want to shrink radius vertical\n blurScale = this.aspectRatio;\n }\n }\n blur = blurScale * this.blur * 0.12;\n if (this.horizontal) {\n delta[0] = blur;\n }\n else {\n delta[1] = blur;\n }\n return delta;\n },\n });\n\n /**\n * Deserialize a JSON definition of a BlurFilter into a concrete instance.\n */\n filters.Blur.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Gamma filter class\n * @class fabric.Image.filters.Gamma\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Gamma#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Gamma({\n * brightness: 200\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Gamma = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Gamma.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Gamma',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec3 uGamma;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec3 correction = (1.0 / uGamma);\\n' +\n 'color.r = pow(color.r, correction.r);\\n' +\n 'color.g = pow(color.g, correction.g);\\n' +\n 'color.b = pow(color.b, correction.b);\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.rgb *= color.a;\\n' +\n '}',\n\n /**\n * Gamma array value, from 0.01 to 2.2.\n * @param {Array} gamma\n * @default\n */\n gamma: [1, 1, 1],\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'gamma',\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.gamma = [1, 1, 1];\n filters.BaseFilter.prototype.initialize.call(this, options);\n },\n\n /**\n * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData, data = imageData.data,\n gamma = this.gamma, len = data.length,\n rInv = 1 / gamma[0], gInv = 1 / gamma[1],\n bInv = 1 / gamma[2], i;\n\n if (!this.rVals) {\n // eslint-disable-next-line\n this.rVals = new Uint8Array(256);\n // eslint-disable-next-line\n this.gVals = new Uint8Array(256);\n // eslint-disable-next-line\n this.bVals = new Uint8Array(256);\n }\n\n // This is an optimization - pre-compute a look-up table for each color channel\n // instead of performing these pow calls for each pixel in the image.\n for (i = 0, len = 256; i < len; i++) {\n this.rVals[i] = Math.pow(i / 255, rInv) * 255;\n this.gVals[i] = Math.pow(i / 255, gInv) * 255;\n this.bVals[i] = Math.pow(i / 255, bInv) * 255;\n }\n for (i = 0, len = data.length; i < len; i += 4) {\n data[i] = this.rVals[data[i]];\n data[i + 1] = this.gVals[data[i + 1]];\n data[i + 2] = this.bVals[data[i + 2]];\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uGamma: gl.getUniformLocation(program, 'uGamma'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Gamma} Instance of fabric.Image.filters.Gamma\n */\n fabric.Image.filters.Gamma.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * A container class that knows how to apply a sequence of filters to an input image.\n */\n filters.Composed = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Composed.prototype */ {\n\n type: 'Composed',\n\n /**\n * A non sparse array of filters to apply\n */\n subFilters: [],\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n // create a new array instead mutating the prototype with push\n this.subFilters = this.subFilters.slice(0);\n },\n\n /**\n * Apply this container's filters to the input image provided.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be applied.\n */\n applyTo: function(options) {\n options.passes += this.subFilters.length - 1;\n this.subFilters.forEach(function(filter) {\n filter.applyTo(options);\n });\n },\n\n /**\n * Serialize this filter into JSON.\n *\n * @returns {Object} A JSON representation of this filter.\n */\n toObject: function() {\n return fabric.util.object.extend(this.callSuper('toObject'), {\n subFilters: this.subFilters.map(function(filter) { return filter.toObject(); }),\n });\n },\n\n isNeutralState: function() {\n return !this.subFilters.some(function(filter) { return !filter.isNeutralState(); });\n }\n });\n\n /**\n * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n */\n fabric.Image.filters.Composed.fromObject = function(object, callback) {\n var filters = object.subFilters || [],\n subFilters = filters.map(function(filter) {\n return new fabric.Image.filters[filter.type](filter);\n }),\n instance = new fabric.Image.filters.Composed({ subFilters: subFilters });\n callback && callback(instance);\n return instance;\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * HueRotation filter class\n * @class fabric.Image.filters.HueRotation\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.HueRotation#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.HueRotation({\n * rotation: -0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.HueRotation = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.HueRotation.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'HueRotation',\n\n /**\n * HueRotation value, from -1 to 1.\n * the unit is radians\n * @param {Number} myParameter\n * @default\n */\n rotation: 0,\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'rotation',\n\n calculateMatrix: function() {\n var rad = this.rotation * Math.PI, cos = fabric.util.cos(rad), sin = fabric.util.sin(rad),\n aThird = 1 / 3, aThirdSqtSin = Math.sqrt(aThird) * sin, OneMinusCos = 1 - cos;\n this.matrix = [\n 1, 0, 0, 0, 0,\n 0, 1, 0, 0, 0,\n 0, 0, 1, 0, 0,\n 0, 0, 0, 1, 0\n ];\n this.matrix[0] = cos + OneMinusCos / 3;\n this.matrix[1] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[2] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[5] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[6] = cos + aThird * OneMinusCos;\n this.matrix[7] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[10] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[11] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[12] = cos + aThird * OneMinusCos;\n },\n\n /**\n * HueRotation isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState: function(options) {\n this.calculateMatrix();\n return filters.BaseFilter.prototype.isNeutralState.call(this, options);\n },\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n this.calculateMatrix();\n filters.BaseFilter.prototype.applyTo.call(this, options);\n },\n\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.HueRotation} Instance of fabric.Image.filters.HueRotation\n */\n fabric.Image.filters.HueRotation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n clone = fabric.util.object.clone;\n\n if (fabric.Text) {\n fabric.warn('fabric.Text is already defined');\n return;\n }\n\n /**\n * Text class\n * @class fabric.Text\n * @extends fabric.Object\n * @return {fabric.Text} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text}\n * @see {@link fabric.Text#initialize} for constructor definition\n */\n fabric.Text = fabric.util.createClass(fabric.Object, /** @lends fabric.Text.prototype */ {\n\n /**\n * Properties which when set cause object to change dimensions\n * @type Array\n * @private\n */\n _dimensionAffectingProps: [\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n 'lineHeight',\n 'text',\n 'charSpacing',\n 'textAlign',\n 'styles',\n ],\n\n /**\n * @private\n */\n _reNewline: /\\r?\\n/,\n\n /**\n * Use this regular expression to filter for whitespaces that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reSpacesAndTabs: /[ \\t\\r]/g,\n\n /**\n * Use this regular expression to filter for whitespace that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reSpaceAndTab: /[ \\t\\r]/,\n\n /**\n * Use this regular expression to filter consecutive groups of non spaces.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reWords: /\\S+/g,\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'text',\n\n /**\n * Font size (in pixels)\n * @type Number\n * @default\n */\n fontSize: 40,\n\n /**\n * Font weight (e.g. bold, normal, 400, 600, 800)\n * @type {(Number|String)}\n * @default\n */\n fontWeight: 'normal',\n\n /**\n * Font family\n * @type String\n * @default\n */\n fontFamily: 'Times New Roman',\n\n /**\n * Text decoration underline.\n * @type Boolean\n * @default\n */\n underline: false,\n\n /**\n * Text decoration overline.\n * @type Boolean\n * @default\n */\n overline: false,\n\n /**\n * Text decoration linethrough.\n * @type Boolean\n * @default\n */\n linethrough: false,\n\n /**\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n * \"justify-left\", \"justify-center\" or \"justify-right\".\n * @type String\n * @default\n */\n textAlign: 'left',\n\n /**\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n * @type String\n * @default\n */\n fontStyle: 'normal',\n\n /**\n * Line height\n * @type Number\n * @default\n */\n lineHeight: 1.16,\n\n /**\n * Superscript schema object (minimum overlap)\n * @type {Object}\n * @default\n */\n superscript: {\n size: 0.60, // fontSize factor\n baseline: -0.35 // baseline-shift factor (upwards)\n },\n\n /**\n * Subscript schema object (minimum overlap)\n * @type {Object}\n * @default\n */\n subscript: {\n size: 0.60, // fontSize factor\n baseline: 0.11 // baseline-shift factor (downwards)\n },\n\n /**\n * Background color of text lines\n * @type String\n * @default\n */\n textBackgroundColor: '',\n\n /**\n * List of properties to consider when checking if\n * state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('fontFamily',\n 'fontWeight',\n 'fontSize',\n 'text',\n 'underline',\n 'overline',\n 'linethrough',\n 'textAlign',\n 'fontStyle',\n 'lineHeight',\n 'textBackgroundColor',\n 'charSpacing',\n 'styles'),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * @type Array\n */\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('fontFamily',\n 'fontWeight',\n 'fontSize',\n 'text',\n 'underline',\n 'overline',\n 'linethrough',\n 'textAlign',\n 'fontStyle',\n 'lineHeight',\n 'textBackgroundColor',\n 'charSpacing',\n 'styles'),\n\n /**\n * When defined, an object is rendered via stroke and this property specifies its color.\n * Backwards incompatibility note: This property was named \"strokeStyle\" until v1.1.6\n * @type String\n * @default\n */\n stroke: null,\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property was named \"textShadow\" (String) until v1.2.11\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * @private\n */\n _fontSizeFraction: 0.222,\n\n /**\n * @private\n */\n offsets: {\n underline: 0.10,\n linethrough: -0.315,\n overline: -0.88\n },\n\n /**\n * Text Line proportion to font Size (in pixels)\n * @type Number\n * @default\n */\n _fontSizeMult: 1.13,\n\n /**\n * additional space between characters\n * expressed in thousands of em unit\n * @type Number\n * @default\n */\n charSpacing: 0,\n\n /**\n * Object containing character styles - top-level properties -> line numbers,\n * 2nd-level properties - charater numbers\n * @type Object\n * @default\n */\n styles: null,\n\n /**\n * Reference to a context to measure text char or couple of chars\n * the cacheContext of the canvas will be used or a freshly created one if the object is not on canvas\n * once created it will be referenced on fabric._measuringContext to avoide creating a canvas for every\n * text object created.\n * @type {CanvasRenderingContext2D}\n * @default\n */\n _measuringContext: null,\n\n /**\n * Baseline shift, stlyes only, keep at 0 for the main text object\n * @type {Number}\n * @default\n */\n deltaY: 0,\n\n /**\n * Array of properties that define a style unit (of 'styles').\n * @type {Array}\n * @default\n */\n _styleProperties: [\n 'stroke',\n 'strokeWidth',\n 'fill',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'fontStyle',\n 'underline',\n 'overline',\n 'linethrough',\n 'deltaY',\n 'textBackgroundColor',\n ],\n\n /**\n * contains characters bounding boxes\n */\n __charBounds: [],\n\n /**\n * use this size when measuring text. To avoid IE11 rounding errors\n * @type {Number}\n * @default\n * @readonly\n * @private\n */\n CACHE_FONT_SIZE: 400,\n\n /**\n * contains the min text width to avoid getting 0\n * @type {Number}\n * @default\n */\n MIN_TEXT_WIDTH: 2,\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.Text} thisArg\n */\n initialize: function(text, options) {\n this.styles = options ? (options.styles || { }) : { };\n this.text = text;\n this.__skipDimension = true;\n this.callSuper('initialize', options);\n this.__skipDimension = false;\n this.initDimensions();\n this.setCoords();\n this.setupState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Return a contex for measurement of text string.\n * if created it gets stored for reuse\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.Text} thisArg\n */\n getMeasuringContext: function() {\n // if we did not return we have to measure something.\n if (!fabric._measuringContext) {\n fabric._measuringContext = this.canvas && this.canvas.contextCache ||\n fabric.util.createCanvasElement().getContext('2d');\n }\n return fabric._measuringContext;\n },\n\n /**\n * @private\n * Divides text into lines of text and lines of graphemes.\n */\n _splitText: function() {\n var newLines = this._splitTextIntoLines(this.text);\n this.textLines = newLines.lines;\n this._textLines = newLines.graphemeLines;\n this._unwrappedTextLines = newLines._unwrappedLines;\n this._text = newLines.graphemeText;\n return newLines;\n },\n\n /**\n * Initialize or update text dimensions.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n */\n initDimensions: function() {\n if (this.__skipDimension) {\n return;\n }\n this._splitText();\n this._clearCache();\n this.width = this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n if (this.textAlign.indexOf('justify') !== -1) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n this.height = this.calcTextHeight();\n this.saveState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Enlarge space boxes and shift the others\n */\n enlargeSpaces: function() {\n var diffSpace, currentLineWidth, numberOfSpaces, accumulatedSpace, line, charBound, spaces;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n if (this.textAlign !== 'justify' && (i === len - 1 || this.isEndOfWrapping(i))) {\n continue;\n }\n accumulatedSpace = 0;\n line = this._textLines[i];\n currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth < this.width && (spaces = this.textLines[i].match(this._reSpacesAndTabs))) {\n numberOfSpaces = spaces.length;\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n for (var j = 0, jlen = line.length; j <= jlen; j++) {\n charBound = this.__charBounds[i][j];\n if (this._reSpaceAndTab.test(line[j])) {\n charBound.width += diffSpace;\n charBound.kernedWidth += diffSpace;\n charBound.left += accumulatedSpace;\n accumulatedSpace += diffSpace;\n }\n else {\n charBound.left += accumulatedSpace;\n }\n }\n }\n }\n },\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @return {Boolean}\n */\n isEndOfWrapping: function(lineIndex) {\n return lineIndex === this._textLines.length - 1;\n },\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * It return always for text and Itext.\n * @return Number\n */\n missingNewlineOffset: function() {\n return 1;\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of text object\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @param {Object} dim.x width of object to be cached\n * @param {Object} dim.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions: function() {\n var dims = this.callSuper('_getCacheCanvasDimensions');\n var fontSize = this.fontSize;\n dims.width += fontSize * dims.zoomX;\n dims.height += fontSize * dims.zoomY;\n return dims;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n this._setTextStyles(ctx);\n this._renderTextLinesBackground(ctx);\n this._renderTextDecoration(ctx, 'underline');\n this._renderText(ctx);\n this._renderTextDecoration(ctx, 'overline');\n this._renderTextDecoration(ctx, 'linethrough');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderText: function(ctx) {\n if (this.paintFirst === 'stroke') {\n this._renderTextStroke(ctx);\n this._renderTextFill(ctx);\n }\n else {\n this._renderTextFill(ctx);\n this._renderTextStroke(ctx);\n }\n },\n\n /**\n * Set the font parameter of the context with the object properties or with charStyle\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [charStyle] object with font style properties\n * @param {String} [charStyle.fontFamily] Font Family\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n * @param {String} [charStyle.fontWeight] Font weight\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n */\n _setTextStyles: function(ctx, charStyle, forMeasuring) {\n ctx.textBaseline = 'alphabetic';\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n },\n\n /**\n * calculate and return the text Width measuring each line.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {Number} Maximum width of fabric.Text object\n */\n calcTextWidth: function() {\n var maxWidth = this.getLineWidth(0);\n\n for (var i = 1, len = this._textLines.length; i < len; i++) {\n var currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth > maxWidth) {\n maxWidth = currentLineWidth;\n }\n }\n return maxWidth;\n },\n\n /**\n * @private\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Text to render\n * @param {Number} left Left position of text\n * @param {Number} top Top position of text\n * @param {Number} lineIndex Index of a line in a text\n */\n _renderTextLine: function(method, ctx, line, left, top, lineIndex) {\n this._renderChars(method, ctx, line, left, top, lineIndex);\n },\n\n /**\n * Renders the text background for lines, taking care of style\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextLinesBackground: function(ctx) {\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n return;\n }\n var lineTopOffset = 0, heightOfLine,\n lineLeftOffset, originalFill = ctx.fillStyle,\n line, lastColor,\n leftOffset = this._getLeftOffset(),\n topOffset = this._getTopOffset(),\n boxStart = 0, boxWidth = 0, charBox, currentColor;\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n heightOfLine = this.getHeightOfLine(i);\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor', i)) {\n lineTopOffset += heightOfLine;\n continue;\n }\n line = this._textLines[i];\n lineLeftOffset = this._getLineLeftOffset(i);\n boxWidth = 0;\n boxStart = 0;\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n ctx.fillStyle = lastColor;\n lastColor && ctx.fillRect(\n leftOffset + lineLeftOffset + boxStart,\n topOffset + lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n if (currentColor) {\n ctx.fillStyle = currentColor;\n ctx.fillRect(\n leftOffset + lineLeftOffset + boxStart,\n topOffset + lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight\n );\n }\n lineTopOffset += heightOfLine;\n }\n ctx.fillStyle = originalFill;\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * @private\n * @param {Object} decl style declaration for cache\n * @param {String} decl.fontFamily fontFamily\n * @param {String} decl.fontStyle fontStyle\n * @param {String} decl.fontWeight fontWeight\n * @return {Object} reference to cache\n */\n getFontCache: function(decl) {\n var fontFamily = decl.fontFamily.toLowerCase();\n if (!fabric.charWidthsCache[fontFamily]) {\n fabric.charWidthsCache[fontFamily] = { };\n }\n var cache = fabric.charWidthsCache[fontFamily],\n cacheProp = decl.fontStyle.toLowerCase() + '_' + (decl.fontWeight + '').toLowerCase();\n if (!cache[cacheProp]) {\n cache[cacheProp] = { };\n }\n return cache[cacheProp];\n },\n\n /**\n * apply all the character style to canvas for rendering\n * @private\n * @param {String} _char\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} [decl]\n */\n _applyCharStyles: function(method, ctx, lineIndex, charIndex, styleDeclaration) {\n\n this._setFillStyles(ctx, styleDeclaration);\n this._setStrokeStyles(ctx, styleDeclaration);\n\n ctx.font = this._getFontDeclaration(styleDeclaration);\n },\n\n /**\n * measure and return the width of a single character.\n * possibly overridden to accommodate different measure logic or\n * to hook some external lib for character measurement\n * @private\n * @param {String} _char, char to be measured\n * @param {Object} charStyle style of char to be measured\n * @param {String} [previousChar] previous char\n * @param {Object} [prevCharStyle] style of previous char\n */\n _measureChar: function(_char, charStyle, previousChar, prevCharStyle) {\n // first i try to return from cache\n var fontCache = this.getFontCache(charStyle), fontDeclaration = this._getFontDeclaration(charStyle),\n previousFontDeclaration = this._getFontDeclaration(prevCharStyle), couple = previousChar + _char,\n stylesAreEqual = fontDeclaration === previousFontDeclaration, width, coupleWidth, previousWidth,\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE, kernedWidth;\n\n if (previousChar && fontCache[previousChar] !== undefined) {\n previousWidth = fontCache[previousChar];\n }\n if (fontCache[_char] !== undefined) {\n kernedWidth = width = fontCache[_char];\n }\n if (stylesAreEqual && fontCache[couple] !== undefined) {\n coupleWidth = fontCache[couple];\n kernedWidth = coupleWidth - previousWidth;\n }\n if (width === undefined || previousWidth === undefined || coupleWidth === undefined) {\n var ctx = this.getMeasuringContext();\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n this._setTextStyles(ctx, charStyle, true);\n }\n if (width === undefined) {\n kernedWidth = width = ctx.measureText(_char).width;\n fontCache[_char] = width;\n }\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\n previousWidth = ctx.measureText(previousChar).width;\n fontCache[previousChar] = previousWidth;\n }\n if (stylesAreEqual && coupleWidth === undefined) {\n // we can measure the kerning couple and subtract the width of the previous character\n coupleWidth = ctx.measureText(couple).width;\n fontCache[couple] = coupleWidth;\n kernedWidth = coupleWidth - previousWidth;\n }\n return { width: width * fontMultiplier, kernedWidth: kernedWidth * fontMultiplier };\n },\n\n /**\n * Computes height of character at given position\n * @param {Number} line the line index number\n * @param {Number} _char the character index number\n * @return {Number} fontSize of the character\n */\n getHeightOfChar: function(line, _char) {\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\n },\n\n /**\n * measure a text line measuring all characters.\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n measureLine: function(lineIndex) {\n var lineInfo = this._measureLine(lineIndex);\n if (this.charSpacing !== 0) {\n lineInfo.width -= this._getWidthOfCharSpacing();\n }\n if (lineInfo.width < 0) {\n lineInfo.width = 0;\n }\n return lineInfo;\n },\n\n /**\n * measure every grapheme of a line, populating __charBounds\n * @param {Number} lineIndex\n * @return {Object} object.width total width of characters\n * @return {Object} object.widthOfSpaces length of chars that match this._reSpacesAndTabs\n */\n _measureLine: function(lineIndex) {\n var width = 0, i, grapheme, line = this._textLines[lineIndex], prevGrapheme,\n graphemeInfo, numOfSpaces = 0, lineBounds = new Array(line.length);\n\n this.__charBounds[lineIndex] = lineBounds;\n for (i = 0; i < line.length; i++) {\n grapheme = line[i];\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n lineBounds[i] = graphemeInfo;\n width += graphemeInfo.kernedWidth;\n prevGrapheme = grapheme;\n }\n // this latest bound box represent the last character of the line\n // to simplify cursor handling in interactive mode.\n lineBounds[i] = {\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n width: 0,\n kernedWidth: 0,\n height: this.fontSize\n };\n return { width: width, numOfSpaces: numOfSpaces };\n },\n\n /**\n * Measure and return the info of a single grapheme.\n * needs the the info of previous graphemes already filled\n * @private\n * @param {String} grapheme to be measured\n * @param {Number} lineIndex index of the line where the char is\n * @param {Number} charIndex position in the line\n * @param {String} [prevGrapheme] character preceding the one to be measured\n */\n _getGraphemeBox: function(grapheme, lineIndex, charIndex, prevGrapheme, skipLeft) {\n var style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n prevStyle = prevGrapheme ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1) : { },\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle),\n kernedWidth = info.kernedWidth,\n width = info.width, charSpacing;\n\n if (this.charSpacing !== 0) {\n charSpacing = this._getWidthOfCharSpacing();\n width += charSpacing;\n kernedWidth += charSpacing;\n }\n\n var box = {\n width: width,\n left: 0,\n height: style.fontSize,\n kernedWidth: kernedWidth,\n deltaY: style.deltaY,\n };\n if (charIndex > 0 && !skipLeft) {\n var previousBox = this.__charBounds[lineIndex][charIndex - 1];\n box.left = previousBox.left + previousBox.width + info.kernedWidth - info.width;\n }\n return box;\n },\n\n /**\n * Calculate height of line at 'lineIndex'\n * @param {Number} lineIndex index of line to calculate\n * @return {Number}\n */\n getHeightOfLine: function(lineIndex) {\n if (this.__lineHeights[lineIndex]) {\n return this.__lineHeights[lineIndex];\n }\n\n var line = this._textLines[lineIndex],\n // char 0 is measured before the line cycle because it nneds to char\n // emptylines\n maxHeight = this.getHeightOfChar(lineIndex, 0);\n for (var i = 1, len = line.length; i < len; i++) {\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n }\n\n return this.__lineHeights[lineIndex] = maxHeight * this.lineHeight * this._fontSizeMult;\n },\n\n /**\n * Calculate text box height\n */\n calcTextHeight: function() {\n var lineHeight, height = 0;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n lineHeight = this.getHeightOfLine(i);\n height += (i === len - 1 ? lineHeight / this.lineHeight : lineHeight);\n }\n return height;\n },\n\n /**\n * @private\n * @return {Number} Left offset\n */\n _getLeftOffset: function() {\n return -this.width / 2;\n },\n\n /**\n * @private\n * @return {Number} Top offset\n */\n _getTopOffset: function() {\n return -this.height / 2;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} filler fabric.Pattern or fabric.Gradient\n * @return {Object} offset.offsetX offset for text rendering\n * @return {Object} offset.offsetY offset for text rendering\n */\n _applyPatternGradientTransform: function(ctx, filler) {\n if (!filler || !filler.toLive) {\n return { offsetX: 0, offsetY: 0 };\n }\n var offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n return { offsetX: offsetX, offsetY: offsetY };\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n */\n _renderTextCommon: function(ctx, method) {\n ctx.save();\n var lineHeights = 0, left = this._getLeftOffset(), top = this._getTopOffset(),\n offsets = this._applyPatternGradientTransform(ctx, method === 'fillText' ? this.fill : this.stroke);\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n var heightOfLine = this.getHeightOfLine(i),\n maxHeight = heightOfLine / this.lineHeight,\n leftOffset = this._getLineLeftOffset(i);\n this._renderTextLine(\n method,\n ctx,\n this._textLines[i],\n left + leftOffset - offsets.offsetX,\n top + lineHeights + maxHeight - offsets.offsetY,\n i\n );\n lineHeights += heightOfLine;\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextFill: function(ctx) {\n if (!this.fill && !this.styleHas('fill')) {\n return;\n }\n\n this._renderTextCommon(ctx, 'fillText');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextStroke: function(ctx) {\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n this._setLineDash(ctx, this.strokeDashArray);\n ctx.beginPath();\n this._renderTextCommon(ctx, 'strokeText');\n ctx.closePath();\n ctx.restore();\n },\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Content of the line\n * @param {Number} left\n * @param {Number} top\n * @param {Number} lineIndex\n * @param {Number} charOffset\n */\n _renderChars: function(method, ctx, line, left, top, lineIndex) {\n // set proper line offset\n var lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.indexOf('justify') !== -1,\n actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n boxWidth = 0,\n timeToRender,\n shortCut = !isJustify && this.charSpacing === 0 && this.isEmptyStyles(lineIndex);\n\n ctx.save();\n top -= lineHeight * this._fontSizeFraction / this.lineHeight;\n if (shortCut) {\n // render all the line in one pass without checking\n this._renderChar(method, ctx, lineIndex, 0, this.textLines[lineIndex], left, top, lineHeight);\n ctx.restore();\n return;\n }\n for (var i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n left += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = this._hasStyleChanged(actualStyle, nextStyle);\n }\n if (timeToRender) {\n this._renderChar(method, ctx, lineIndex, i, charsToRender, left, top, lineHeight);\n charsToRender = '';\n actualStyle = nextStyle;\n left += boxWidth;\n boxWidth = 0;\n }\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {String} _char\n * @param {Number} left Left coordinate\n * @param {Number} top Top coordinate\n * @param {Number} lineHeight Height of the line\n */\n _renderChar: function(method, ctx, lineIndex, charIndex, _char, left, top) {\n var decl = this._getStyleDeclaration(lineIndex, charIndex),\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n shouldFill = method === 'fillText' && fullDecl.fill,\n shouldStroke = method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth;\n\n if (!shouldStroke && !shouldFill) {\n return;\n }\n decl && ctx.save();\n\n this._applyCharStyles(method, ctx, lineIndex, charIndex, fullDecl);\n\n if (decl && decl.textBackgroundColor) {\n this._removeShadow(ctx);\n }\n if (decl && decl.deltaY) {\n top += decl.deltaY;\n }\n\n shouldFill && ctx.fillText(_char, left, top);\n shouldStroke && ctx.strokeText(_char, left, top);\n decl && ctx.restore();\n },\n\n /**\n * Turns the character into a 'superior figure' (i.e. 'superscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n setSuperscript: function(start, end) {\n return this._setScript(start, end, this.superscript);\n },\n\n /**\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n setSubscript: function(start, end) {\n return this._setScript(start, end, this.subscript);\n },\n\n /**\n * Applies 'schema' at given position\n * @private\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @param {Number} schema\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n _setScript: function(start, end, schema) {\n var loc = this.get2DCursorLocation(start, true),\n fontSize = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'fontSize'),\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n style = { fontSize: fontSize * schema.size, deltaY: dy + fontSize * schema.baseline };\n this.setSelectionStyles(style, start, end);\n return this;\n },\n\n /**\n * @private\n * @param {Object} prevStyle\n * @param {Object} thisStyle\n */\n _hasStyleChanged: function(prevStyle, thisStyle) {\n return prevStyle.fill !== thisStyle.fill ||\n prevStyle.stroke !== thisStyle.stroke ||\n prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n prevStyle.fontSize !== thisStyle.fontSize ||\n prevStyle.fontFamily !== thisStyle.fontFamily ||\n prevStyle.fontWeight !== thisStyle.fontWeight ||\n prevStyle.fontStyle !== thisStyle.fontStyle ||\n prevStyle.deltaY !== thisStyle.deltaY;\n },\n\n /**\n * @private\n * @param {Object} prevStyle\n * @param {Object} thisStyle\n */\n _hasStyleChangedForSvg: function(prevStyle, thisStyle) {\n return this._hasStyleChanged(prevStyle, thisStyle) ||\n prevStyle.overline !== thisStyle.overline ||\n prevStyle.underline !== thisStyle.underline ||\n prevStyle.linethrough !== thisStyle.linethrough;\n },\n\n /**\n * @private\n * @param {Number} lineIndex index text line\n * @return {Number} Line left offset\n */\n _getLineLeftOffset: function(lineIndex) {\n var lineWidth = this.getLineWidth(lineIndex);\n if (this.textAlign === 'center') {\n return (this.width - lineWidth) / 2;\n }\n if (this.textAlign === 'right') {\n return this.width - lineWidth;\n }\n if (this.textAlign === 'justify-center' && this.isEndOfWrapping(lineIndex)) {\n return (this.width - lineWidth) / 2;\n }\n if (this.textAlign === 'justify-right' && this.isEndOfWrapping(lineIndex)) {\n return this.width - lineWidth;\n }\n return 0;\n },\n\n /**\n * @private\n */\n _clearCache: function() {\n this.__lineWidths = [];\n this.__lineHeights = [];\n this.__charBounds = [];\n },\n\n /**\n * @private\n */\n _shouldClearDimensionCache: function() {\n var shouldClear = this._forceClearCache;\n shouldClear || (shouldClear = this.hasStateChanged('_dimensionAffectingProps'));\n if (shouldClear) {\n this.dirty = true;\n this._forceClearCache = false;\n }\n return shouldClear;\n },\n\n /**\n * Measure a single line given its index. Used to calculate the initial\n * text bounding box. The values are calculated and stored in __lineWidths cache.\n * @private\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n getLineWidth: function(lineIndex) {\n if (this.__lineWidths[lineIndex]) {\n return this.__lineWidths[lineIndex];\n }\n\n var width, line = this._textLines[lineIndex], lineInfo;\n\n if (line === '') {\n width = 0;\n }\n else {\n lineInfo = this.measureLine(lineIndex);\n width = lineInfo.width;\n }\n this.__lineWidths[lineIndex] = width;\n return width;\n },\n\n _getWidthOfCharSpacing: function() {\n if (this.charSpacing !== 0) {\n return this.fontSize * this.charSpacing / 1000;\n }\n return 0;\n },\n\n /**\n * Retrieves the value of property at given character position\n * @param {Number} lineIndex the line number\n * @param {Number} charIndex the charater number\n * @param {String} property the property name\n * @returns the value of 'property'\n */\n getValueOfPropertyAt: function(lineIndex, charIndex, property) {\n var charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n if (charStyle && typeof charStyle[property] !== 'undefined') {\n return charStyle[property];\n }\n return this[property];\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextDecoration: function(ctx, type) {\n if (!this[type] && !this.styleHas(type)) {\n return;\n }\n var heightOfLine, size, _size,\n lineLeftOffset, dy, _dy,\n line, lastDecoration,\n leftOffset = this._getLeftOffset(),\n topOffset = this._getTopOffset(), top,\n boxStart, boxWidth, charBox, currentDecoration,\n maxHeight, currentFill, lastFill,\n charSpacing = this._getWidthOfCharSpacing();\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n heightOfLine = this.getHeightOfLine(i);\n if (!this[type] && !this.styleHas(type, i)) {\n topOffset += heightOfLine;\n continue;\n }\n line = this._textLines[i];\n maxHeight = heightOfLine / this.lineHeight;\n lineLeftOffset = this._getLineLeftOffset(i);\n boxStart = 0;\n boxWidth = 0;\n lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n lastFill = this.getValueOfPropertyAt(i, 0, 'fill');\n top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n size = this.getHeightOfChar(i, 0);\n dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\n currentFill = this.getValueOfPropertyAt(i, j, 'fill');\n _size = this.getHeightOfChar(i, j);\n _dy = this.getValueOfPropertyAt(i, j, 'deltaY');\n if ((currentDecoration !== lastDecoration || currentFill !== lastFill || _size !== size || _dy !== dy) &&\n boxWidth > 0) {\n ctx.fillStyle = lastFill;\n lastDecoration && lastFill && ctx.fillRect(\n leftOffset + lineLeftOffset + boxStart,\n top + this.offsets[type] * size + dy,\n boxWidth,\n this.fontSize / 15\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastDecoration = currentDecoration;\n lastFill = currentFill;\n size = _size;\n dy = _dy;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n ctx.fillStyle = currentFill;\n currentDecoration && currentFill && ctx.fillRect(\n leftOffset + lineLeftOffset + boxStart,\n top + this.offsets[type] * size + dy,\n boxWidth - charSpacing,\n this.fontSize / 15\n );\n topOffset += heightOfLine;\n }\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * return font declaration string for canvas context\n * @param {Object} [styleObject] object\n * @returns {String} font declaration formatted for canvas context.\n */\n _getFontDeclaration: function(styleObject, forMeasuring) {\n var style = styleObject || this, family = this.fontFamily,\n fontIsGeneric = fabric.Text.genericFonts.indexOf(family.toLowerCase()) > -1;\n var fontFamily = family === undefined ||\n family.indexOf('\\'') > -1 || family.indexOf(',') > -1 ||\n family.indexOf('\"') > -1 || fontIsGeneric\n ? style.fontFamily : '\"' + style.fontFamily + '\"';\n return [\n // node-canvas needs \"weight style\", while browsers need \"style weight\"\n // verify if this can be fixed in JSDOM\n (fabric.isLikelyNode ? style.fontWeight : style.fontStyle),\n (fabric.isLikelyNode ? style.fontStyle : style.fontWeight),\n forMeasuring ? this.CACHE_FONT_SIZE + 'px' : style.fontSize + 'px',\n fontFamily\n ].join(' ');\n },\n\n /**\n * Renders text instance on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n // do not render if object is not visible\n if (!this.visible) {\n return;\n }\n if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n return;\n }\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n }\n this.callSuper('render', ctx);\n },\n\n /**\n * Returns the text as an array of lines.\n * @param {String} text text to split\n * @returns {Array} Lines in the text\n */\n _splitTextIntoLines: function(text) {\n var lines = text.split(this._reNewline),\n newLines = new Array(lines.length),\n newLine = ['\\n'],\n newText = [];\n for (var i = 0; i < lines.length; i++) {\n newLines[i] = fabric.util.string.graphemeSplit(lines[i]);\n newText = newText.concat(newLines[i], newLine);\n }\n newText.pop();\n return { _unwrappedLines: newLines, lines: lines, graphemeText: newText, graphemeLines: newLines };\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var additionalProperties = [\n 'text',\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n 'lineHeight',\n 'underline',\n 'overline',\n 'linethrough',\n 'textAlign',\n 'textBackgroundColor',\n 'charSpacing',\n ].concat(propertiesToInclude);\n var obj = this.callSuper('toObject', additionalProperties);\n obj.styles = clone(this.styles, true);\n return obj;\n },\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n set: function(key, value) {\n this.callSuper('set', key, value);\n var needsDims = false;\n if (typeof key === 'object') {\n for (var _key in key) {\n needsDims = needsDims || this._dimensionAffectingProps.indexOf(_key) !== -1;\n }\n }\n else {\n needsDims = this._dimensionAffectingProps.indexOf(key) !== -1;\n }\n if (needsDims) {\n this.initDimensions();\n this.setCoords();\n }\n return this;\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity\n */\n complexity: function() {\n return 1;\n }\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Text.fromElement})\n * @static\n * @memberOf fabric.Text\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n */\n fabric.Text.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(\n 'x y dx dy font-family font-style font-weight font-size letter-spacing text-decoration text-anchor'.split(' '));\n\n /**\n * Default SVG font size\n * @static\n * @memberOf fabric.Text\n */\n fabric.Text.DEFAULT_SVG_FONT_SIZE = 16;\n\n /**\n * Returns fabric.Text instance from an SVG element (not yet implemented)\n * @static\n * @memberOf fabric.Text\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Text.fromElement = function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES),\n parsedAnchor = parsedAttributes.textAnchor || 'left';\n options = fabric.util.object.extend((options ? clone(options) : { }), parsedAttributes);\n\n options.top = options.top || 0;\n options.left = options.left || 0;\n if (parsedAttributes.textDecoration) {\n var textDecoration = parsedAttributes.textDecoration;\n if (textDecoration.indexOf('underline') !== -1) {\n options.underline = true;\n }\n if (textDecoration.indexOf('overline') !== -1) {\n options.overline = true;\n }\n if (textDecoration.indexOf('line-through') !== -1) {\n options.linethrough = true;\n }\n delete options.textDecoration;\n }\n if ('dx' in parsedAttributes) {\n options.left += parsedAttributes.dx;\n }\n if ('dy' in parsedAttributes) {\n options.top += parsedAttributes.dy;\n }\n if (!('fontSize' in options)) {\n options.fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n }\n\n var textContent = '';\n\n // The XML is not properly parsed in IE9 so a workaround to get\n // textContent is through firstChild.data. Another workaround would be\n // to convert XML loaded from a file to be converted using DOMParser (same way loadSVGFromString() does)\n if (!('textContent' in element)) {\n if ('firstChild' in element && element.firstChild !== null) {\n if ('data' in element.firstChild && element.firstChild.data !== null) {\n textContent = element.firstChild.data;\n }\n }\n }\n else {\n textContent = element.textContent;\n }\n\n textContent = textContent.replace(/^\\s+|\\s+$|\\n+/g, '').replace(/\\s+/g, ' ');\n var originalStrokeWidth = options.strokeWidth;\n options.strokeWidth = 0;\n\n var text = new fabric.Text(textContent, options),\n textHeightScaleFactor = text.getScaledHeight() / text.height,\n lineHeightDiff = (text.height + text.strokeWidth) * text.lineHeight - text.height,\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\n textHeight = text.getScaledHeight() + scaledDiff,\n offX = 0;\n /*\n Adjust positioning:\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n fabric output by default at top, left.\n */\n if (parsedAnchor === 'center') {\n offX = text.getScaledWidth() / 2;\n }\n if (parsedAnchor === 'right') {\n offX = text.getScaledWidth();\n }\n text.set({\n left: text.left - offX,\n top: text.top - (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) / text.lineHeight,\n strokeWidth: typeof originalStrokeWidth !== 'undefined' ? originalStrokeWidth : 1,\n });\n callback(text);\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Text instance from an object representation\n * @static\n * @memberOf fabric.Text\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Text instance is created\n */\n fabric.Text.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Text', object, callback, 'text');\n };\n\n fabric.Text.genericFonts = ['sans-serif', 'serif', 'cursive', 'fantasy', 'monospace'];\n\n fabric.util.createAccessors && fabric.util.createAccessors(fabric.Text);\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles: function(lineIndex) {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n var obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n for (var p1 in obj) {\n for (var p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (var p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n },\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas: function(property, lineIndex) {\n if (!this.styles || !property || property === '') {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n var obj = typeof lineIndex === 'undefined' ? this.styles : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (var p1 in obj) {\n // eslint-disable-next-line\n for (var p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n },\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n *\n * @param {string} property The property to compare between characters and text.\n */\n cleanStyle: function(property) {\n if (!this.styles || !property || property === '') {\n return false;\n }\n var obj = this.styles, stylesCount = 0, letterCount, stylePropertyValue,\n allStyleObjectPropertiesMatch = true, graphemeCount = 0, styleObject;\n // eslint-disable-next-line\n for (var p1 in obj) {\n letterCount = 0;\n // eslint-disable-next-line\n for (var p2 in obj[p1]) {\n var styleObject = obj[p1][p2],\n stylePropertyHasBeenSet = styleObject.hasOwnProperty(property);\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n }\n else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property]) {\n delete styleObject[property];\n }\n }\n else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n }\n else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (var i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property] = stylePropertyValue;\n this.removeStyle(property);\n }\n },\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle: function(property) {\n if (!this.styles || !property || property === '') {\n return;\n }\n var obj = this.styles, line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n },\n\n /**\n * @private\n */\n _extendStyles: function(index, styles) {\n var loc = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(loc.lineIndex)) {\n this._setLineStyle(loc.lineIndex);\n }\n\n if (!this._getStyleDeclaration(loc.lineIndex, loc.charIndex)) {\n this._setStyleDeclaration(loc.lineIndex, loc.charIndex, {});\n }\n\n fabric.util.object.extend(this._getStyleDeclaration(loc.lineIndex, loc.charIndex), styles);\n },\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. usefull to manage styles.\n */\n get2DCursorLocation: function(selectionStart, skipWrapping) {\n if (typeof selectionStart === 'undefined') {\n selectionStart = this.selectionStart;\n }\n var lines = skipWrapping ? this._unwrappedTextLines : this._textLines,\n len = lines.length;\n for (var i = 0; i < len; i++) {\n if (selectionStart <= lines[i].length) {\n return {\n lineIndex: i,\n charIndex: selectionStart\n };\n }\n selectionStart -= lines[i].length + this.missingNewlineOffset(i);\n }\n return {\n lineIndex: i - 1,\n charIndex: lines[i - 1].length < selectionStart ? lines[i - 1].length : selectionStart\n };\n },\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, slectionStart or selectionEnd will be used.\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles: function(startIndex, endIndex, complete) {\n if (typeof startIndex === 'undefined') {\n startIndex = this.selectionStart || 0;\n }\n if (typeof endIndex === 'undefined') {\n endIndex = this.selectionEnd || startIndex;\n }\n var styles = [];\n for (var i = startIndex; i < endIndex; i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n },\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition: function(position, complete) {\n var loc = this.get2DCursorLocation(position),\n style = complete ? this.getCompleteStyleDeclaration(loc.lineIndex, loc.charIndex) :\n this._getStyleDeclaration(loc.lineIndex, loc.charIndex);\n return style || {};\n },\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @return {fabric.IText} thisArg\n * @chainable\n */\n setSelectionStyles: function(styles, startIndex, endIndex) {\n if (typeof startIndex === 'undefined') {\n startIndex = this.selectionStart || 0;\n }\n if (typeof endIndex === 'undefined') {\n endIndex = this.selectionEnd || startIndex;\n }\n for (var i = startIndex; i < endIndex; i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n return this;\n },\n\n /**\n * get the reference, not a clone, of the style object for a given character\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Object} style object\n */\n _getStyleDeclaration: function(lineIndex, charIndex) {\n var lineStyle = this.styles && this.styles[lineIndex];\n if (!lineStyle) {\n return null;\n }\n return lineStyle[charIndex];\n },\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration: function(lineIndex, charIndex) {\n var style = this._getStyleDeclaration(lineIndex, charIndex) || { },\n styleObject = { }, prop;\n for (var i = 0; i < this._styleProperties.length; i++) {\n prop = this._styleProperties[i];\n styleObject[prop] = typeof style[prop] === 'undefined' ? this[prop] : style[prop];\n }\n return styleObject;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n _setStyleDeclaration: function(lineIndex, charIndex, style) {\n this.styles[lineIndex][charIndex] = style;\n },\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _deleteStyleDeclaration: function(lineIndex, charIndex) {\n delete this.styles[lineIndex][charIndex];\n },\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n _getLineStyle: function(lineIndex) {\n return !!this.styles[lineIndex];\n },\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n _setLineStyle: function(lineIndex) {\n this.styles[lineIndex] = {};\n },\n\n /**\n * @param {Number} lineIndex\n * @private\n */\n _deleteLineStyle: function(lineIndex) {\n delete this.styles[lineIndex];\n }\n });\n})();\n\n\n(function() {\n\n function parseDecoration(object) {\n if (object.textDecoration) {\n object.textDecoration.indexOf('underline') > -1 && (object.underline = true);\n object.textDecoration.indexOf('line-through') > -1 && (object.linethrough = true);\n object.textDecoration.indexOf('overline') > -1 && (object.overline = true);\n delete object.textDecoration;\n }\n }\n\n /**\n * IText class (introduced in v1.4) Events are also fired with \"text:\"\n * prefix when observing canvas.\n * @class fabric.IText\n * @extends fabric.Text\n * @mixes fabric.Observable\n *\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n *\n * @return {fabric.IText} thisArg\n * @see {@link fabric.IText#initialize} for constructor definition\n *\n *

Supported key combinations:

\n *
\n   *   Move cursor:                    left, right, up, down\n   *   Select character:               shift + left, shift + right\n   *   Select text vertically:         shift + up, shift + down\n   *   Move cursor by word:            alt + left, alt + right\n   *   Select words:                   shift + alt + left, shift + alt + right\n   *   Move cursor to line start/end:  cmd + left, cmd + right or home, end\n   *   Select till start/end of line:  cmd + shift + left, cmd + shift + right or shift + home, shift + end\n   *   Jump to start/end of text:      cmd + up, cmd + down\n   *   Select till start/end of text:  cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n   *   Delete character:               backspace\n   *   Delete word:                    alt + backspace\n   *   Delete line:                    cmd + backspace\n   *   Forward delete:                 delete\n   *   Copy text:                      ctrl/cmd + c\n   *   Paste text:                     ctrl/cmd + v\n   *   Cut text:                       ctrl/cmd + x\n   *   Select entire text:             ctrl/cmd + a\n   *   Quit editing                    tab or esc\n   * 
\n *\n *

Supported mouse/touch combination

\n *
\n   *   Position cursor:                click/touch\n   *   Create selection:               click/touch & drag\n   *   Create selection:               click & shift + click\n   *   Select word:                    double click\n   *   Select line:                    triple click\n   * 
\n */\n fabric.IText = fabric.util.createClass(fabric.Text, fabric.Observable, /** @lends fabric.IText.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'i-text',\n\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n * @default\n */\n selectionStart: 0,\n\n /**\n * Index where text selection ends\n * @type Number\n * @default\n */\n selectionEnd: 0,\n\n /**\n * Color of text selection\n * @type String\n * @default\n */\n selectionColor: 'rgba(17,119,255,0.3)',\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n * @default\n */\n isEditing: false,\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n * @default\n */\n editable: true,\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n * @default\n */\n editingBorderColor: 'rgba(102,153,255,0.25)',\n\n /**\n * Width of cursor (in px)\n * @type Number\n * @default\n */\n cursorWidth: 2,\n\n /**\n * Color of default cursor (when not overwritten by character style)\n * @type String\n * @default\n */\n cursorColor: '#333',\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n * @default\n */\n cursorDelay: 1000,\n\n /**\n * Duration of cursor fadein (in ms)\n * @type Number\n * @default\n */\n cursorDuration: 600,\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n * @default\n */\n caching: true,\n\n /**\n * @private\n */\n _reSpace: /\\s|\\n/,\n\n /**\n * @private\n */\n _currentCursorOpacity: 0,\n\n /**\n * @private\n */\n _selectionDirection: null,\n\n /**\n * @private\n */\n _abortCursorAnimation: false,\n\n /**\n * @private\n */\n __widthOfSpace: [],\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n inCompositionMode: false,\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.IText} thisArg\n */\n initialize: function(text, options) {\n this.callSuper('initialize', text, options);\n this.initBehavior();\n },\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart: function(index) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n },\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd: function(index) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n },\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n _updateAndFire: function(property, index) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n },\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged: function() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n },\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions: function() {\n this.isEditing && this.initDelayedCursor();\n this.clearContextTop();\n this.callSuper('initDimensions');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n this.clearContextTop();\n this.callSuper('render', ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = { };\n this.renderCursorOrSelection();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n this.callSuper('_render', ctx);\n },\n\n /**\n * Prepare and clean the contextTop\n */\n clearContextTop: function(skipRestore) {\n if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n return;\n }\n var ctx = this.canvas.contextTop, v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n this.transformMatrix && ctx.transform.apply(ctx, this.transformMatrix);\n this._clearTextArea(ctx);\n skipRestore || ctx.restore();\n },\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection: function() {\n if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n return;\n }\n var boundaries = this._getCursorBoundaries(),\n ctx = this.canvas.contextTop;\n this.clearContextTop(true);\n if (this.selectionStart === this.selectionEnd) {\n this.renderCursor(boundaries, ctx);\n }\n else {\n this.renderSelection(boundaries, ctx);\n }\n ctx.restore();\n },\n\n _clearTextArea: function(ctx) {\n // we add 4 pixel, to be sure to do not leave any pixel out\n var width = this.width + 4, height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n },\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * @private\n * @param {Array} chars Array of characters\n * @param {String} typeOfBoundaries\n */\n _getCursorBoundaries: function(position) {\n\n // left/top are left/top of entire text box\n // leftOffset/topOffset are offset from that left/top point of a text box\n\n if (typeof position === 'undefined') {\n position = this.selectionStart;\n }\n\n var left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(position);\n\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top\n };\n },\n\n /**\n * @private\n */\n _getCursorBoundariesOffsets: function(position) {\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache;\n }\n var lineLeftOffset,\n lineIndex,\n charIndex,\n topOffset = 0,\n leftOffset = 0,\n boundaries,\n cursorPosition = this.get2DCursorLocation(position);\n charIndex = cursorPosition.charIndex;\n lineIndex = cursorPosition.lineIndex;\n for (var i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n var bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (this.charSpacing !== 0 && charIndex === this._textLines[lineIndex].length) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n this.cursorOffsetCache = boundaries;\n return this.cursorOffsetCache;\n },\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor: function(boundaries, ctx) {\n var cursorLocation = this.get2DCursorLocation(),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.scaleX * this.canvas.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n topOffset = boundaries.topOffset,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY');\n\n topOffset += (1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex) / this.lineHeight\n - charHeight * (1 - this._fontSizeFraction);\n\n if (this.inCompositionMode) {\n this.renderSelection(boundaries, ctx);\n }\n\n ctx.fillStyle = this.getValueOfPropertyAt(lineIndex, charIndex, 'fill');\n ctx.globalAlpha = this.__isMousedown ? 1 : this._currentCursorOpacity;\n ctx.fillRect(\n boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n topOffset + boundaries.top + dy,\n cursorWidth,\n charHeight);\n },\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection: function(boundaries, ctx) {\n\n var selectionStart = this.inCompositionMode ? this.hiddenTextarea.selectionStart : this.selectionStart,\n selectionEnd = this.inCompositionMode ? this.hiddenTextarea.selectionEnd : this.selectionEnd,\n isJustify = this.textAlign.indexOf('justify') !== -1,\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (var i = startLine; i <= endLine; i++) {\n var lineOffset = this._getLineLeftOffset(i) || 0,\n lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0, boxStart = 0, boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd = isJustify && !this.isEndOfWrapping(i) ? this.width : this.getLineWidth(i) || 5; // WTF is this 5?\n }\n else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n }\n else {\n var charSpacing = this._getWidthOfCharSpacing();\n boxEnd = this.__charBounds[endLine][endChar - 1].left\n + this.__charBounds[endLine][endChar - 1].width - charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n ctx.fillRect(\n boundaries.left + lineOffset + boxStart,\n boundaries.top + boundaries.topOffset + lineHeight,\n boxEnd - boxStart,\n 1);\n }\n else {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(\n boundaries.left + lineOffset + boxStart,\n boundaries.top + boundaries.topOffset,\n boxEnd - boxStart,\n lineHeight);\n }\n\n\n boundaries.topOffset += realLineHeight;\n }\n },\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize: function() {\n var cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n },\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * Unused from the library, is for the end user\n * @return {String} Character color (fill)\n */\n getCurrentCharColor: function() {\n var cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fill');\n },\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex: function() {\n var cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex = cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n });\n\n /**\n * Returns fabric.IText instance from an object representation\n * @static\n * @memberOf fabric.IText\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as argument\n */\n fabric.IText.fromObject = function(object, callback) {\n parseDecoration(object);\n if (object.styles) {\n for (var i in object.styles) {\n for (var j in object.styles[i]) {\n parseDecoration(object.styles[i][j]);\n }\n }\n }\n fabric.Object._fromObject('IText', object, callback, 'text');\n };\n})();\n\n\n(function() {\n\n var clone = fabric.util.object.clone;\n\n fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior: function() {\n this.initAddedHandler();\n this.initRemovedHandler();\n this.initCursorSelectionHandlers();\n this.initDoubleClickSimulation();\n this.mouseMoveHandler = this.mouseMoveHandler.bind(this);\n },\n\n onDeselect: function() {\n this.isEditing && this.exitEditing();\n this.selected = false;\n },\n\n /**\n * Initializes \"added\" event handler\n */\n initAddedHandler: function() {\n var _this = this;\n this.on('added', function() {\n var canvas = _this.canvas;\n if (canvas) {\n if (!canvas._hasITextHandlers) {\n canvas._hasITextHandlers = true;\n _this._initCanvasHandlers(canvas);\n }\n canvas._iTextInstances = canvas._iTextInstances || [];\n canvas._iTextInstances.push(_this);\n }\n });\n },\n\n initRemovedHandler: function() {\n var _this = this;\n this.on('removed', function() {\n var canvas = _this.canvas;\n if (canvas) {\n canvas._iTextInstances = canvas._iTextInstances || [];\n fabric.util.removeFromArray(canvas._iTextInstances, _this);\n if (canvas._iTextInstances.length === 0) {\n canvas._hasITextHandlers = false;\n _this._removeCanvasHandlers(canvas);\n }\n }\n });\n },\n\n /**\n * register canvas event to manage exiting on other instances\n * @private\n */\n _initCanvasHandlers: function(canvas) {\n canvas._mouseUpITextHandler = function() {\n if (canvas._iTextInstances) {\n canvas._iTextInstances.forEach(function(obj) {\n obj.__isMousedown = false;\n });\n }\n };\n canvas.on('mouse:up', canvas._mouseUpITextHandler);\n },\n\n /**\n * remove canvas event to manage exiting on other instances\n * @private\n */\n _removeCanvasHandlers: function(canvas) {\n canvas.off('mouse:up', canvas._mouseUpITextHandler);\n },\n\n /**\n * @private\n */\n _tick: function() {\n this._currentTickState = this._animateCursor(this, 1, this.cursorDuration, '_onTickComplete');\n },\n\n /**\n * @private\n */\n _animateCursor: function(obj, targetOpacity, duration, completeMethod) {\n\n var tickState;\n\n tickState = {\n isAborted: false,\n abort: function() {\n this.isAborted = true;\n },\n };\n\n obj.animate('_currentCursorOpacity', targetOpacity, {\n duration: duration,\n onComplete: function() {\n if (!tickState.isAborted) {\n obj[completeMethod]();\n }\n },\n onChange: function() {\n // we do not want to animate a selection, only cursor\n if (obj.canvas && obj.selectionStart === obj.selectionEnd) {\n obj.renderCursorOrSelection();\n }\n },\n abort: function() {\n return tickState.isAborted;\n }\n });\n return tickState;\n },\n\n /**\n * @private\n */\n _onTickComplete: function() {\n\n var _this = this;\n\n if (this._cursorTimeout1) {\n clearTimeout(this._cursorTimeout1);\n }\n this._cursorTimeout1 = setTimeout(function() {\n _this._currentTickCompleteState = _this._animateCursor(_this, 0, this.cursorDuration / 2, '_tick');\n }, 100);\n },\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor: function(restart) {\n var _this = this,\n delay = restart ? 0 : this.cursorDelay;\n\n this.abortCursorAnimation();\n this._currentCursorOpacity = 1;\n this._cursorTimeout2 = setTimeout(function() {\n _this._tick();\n }, delay);\n },\n\n /**\n * Aborts cursor animation and clears all timeouts\n */\n abortCursorAnimation: function() {\n var shouldClear = this._currentTickState || this._currentTickCompleteState,\n canvas = this.canvas;\n this._currentTickState && this._currentTickState.abort();\n this._currentTickCompleteState && this._currentTickCompleteState.abort();\n\n clearTimeout(this._cursorTimeout1);\n clearTimeout(this._cursorTimeout2);\n\n this._currentCursorOpacity = 0;\n // to clear just itext area we need to transform the context\n // it may not be worth it\n if (shouldClear && canvas) {\n canvas.clearContext(canvas.contextTop || canvas.contextContainer);\n }\n\n },\n\n /**\n * Selects entire text\n * @return {fabric.IText} thisArg\n * @chainable\n */\n selectAll: function() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n },\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText: function() {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n },\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft: function(startFrom) {\n var offset = 0, index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n },\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight: function(startFrom) {\n var offset = 0, index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n },\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft: function(startFrom) {\n var offset = 0, index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n },\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight: function(startFrom) {\n var offset = 0, index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n },\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary: function(selectionStart, direction) {\n var text = this._text,\n index = this._reSpace.test(text[selectionStart]) ? selectionStart - 1 : selectionStart,\n _char = text[index],\n // wrong\n reNonWord = fabric.reNonWord;\n\n while (!reNonWord.test(_char) && index > 0 && index < text.length) {\n index += direction;\n _char = text[index];\n }\n if (reNonWord.test(_char)) {\n index += direction === 1 ? 0 : 1;\n }\n return index;\n },\n\n /**\n * Selects a word based on the index\n * @param {Number} selectionStart Index of a character\n */\n selectWord: function(selectionStart) {\n selectionStart = selectionStart || this.selectionStart;\n var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */\n newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n },\n\n /**\n * Selects a line based on the index\n * @param {Number} selectionStart Index of a character\n * @return {fabric.IText} thisArg\n * @chainable\n */\n selectLine: function(selectionStart) {\n selectionStart = selectionStart || this.selectionStart;\n var newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n },\n\n /**\n * Enters editing state\n * @return {fabric.IText} thisArg\n * @chainable\n */\n enterEditing: function(e) {\n if (this.isEditing || !this.editable) {\n return;\n }\n\n if (this.canvas) {\n this.canvas.calcOffset();\n this.exitEditingOnOthers(this.canvas);\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea(e);\n this.hiddenTextarea.focus();\n this.hiddenTextarea.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n this.fire('editing:entered');\n this._fireSelectionChanged();\n if (!this.canvas) {\n return this;\n }\n this.canvas.fire('text:editing:entered', { target: this });\n this.initMouseMoveHandler();\n this.canvas.requestRenderAll();\n return this;\n },\n\n exitEditingOnOthers: function(canvas) {\n if (canvas._iTextInstances) {\n canvas._iTextInstances.forEach(function(obj) {\n obj.selected = false;\n if (obj.isEditing) {\n obj.exitEditing();\n }\n });\n }\n },\n\n /**\n * Initializes \"mousemove\" event handler\n */\n initMouseMoveHandler: function() {\n this.canvas.on('mouse:move', this.mouseMoveHandler);\n },\n\n /**\n * @private\n */\n mouseMoveHandler: function(options) {\n if (!this.__isMousedown || !this.isEditing) {\n return;\n }\n\n var newSelectionStart = this.getSelectionStartFromPointer(options.e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd)\n &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n }\n else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) {\n this.restartCursorIfNeeded();\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n },\n\n /**\n * @private\n */\n _setEditingProps: function() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n },\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection: function(start, end, text) {\n var smallerTextStart = text.slice(0, start),\n graphemeStart = fabric.util.string.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n var smallerTextEnd = text.slice(start, end),\n graphemeEnd = fabric.util.string.graphemeSplit(smallerTextEnd).length;\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n },\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection: function(start, end, _text) {\n var smallerTextStart = _text.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n var smallerTextEnd = _text.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n },\n\n /**\n * @private\n */\n _updateTextarea: function() {\n this.cursorOffsetCache = { };\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n var newSelection = this.fromGraphemeToStringSelection(this.selectionStart, this.selectionEnd, this._text);\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n },\n\n /**\n * @private\n */\n updateFromTextArea: function() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = { };\n this.text = this.hiddenTextarea.value;\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n var newSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart, this.hiddenTextarea.selectionEnd, this.hiddenTextarea.value);\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n },\n\n /**\n * @private\n */\n updateTextareaPosition: function() {\n if (this.selectionStart === this.selectionEnd) {\n var style = this._calcTextareaPosition();\n this.hiddenTextarea.style.left = style.left;\n this.hiddenTextarea.style.top = style.top;\n }\n },\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition: function() {\n if (!this.canvas) {\n return { x: 1, y: 1 };\n }\n var desiredPosition = this.inCompositionMode ? this.compositionStart : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') * this.lineHeight,\n leftOffset = boundaries.leftOffset,\n m = this.calcTransformMatrix(),\n p = {\n x: boundaries.left + leftOffset,\n y: boundaries.top + boundaries.topOffset + charHeight\n },\n retinaScaling = this.canvas.getRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight,\n scaleX = upperCanvas.clientWidth / upperCanvasWidth,\n scaleY = upperCanvas.clientHeight / upperCanvasHeight;\n\n p = fabric.util.transformPoint(p, m);\n p = fabric.util.transformPoint(p, this.canvas.viewportTransform);\n p.x *= scaleX;\n p.y *= scaleY;\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return { left: p.x + 'px', top: p.y + 'px', fontSize: charHeight + 'px', charHeight: charHeight };\n },\n\n /**\n * @private\n */\n _saveEditingProps: function() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor\n };\n },\n\n /**\n * @private\n */\n _restoreEditingProps: function() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor = this._savedProps.defaultCursor;\n this.canvas.moveCursor = this._savedProps.moveCursor;\n }\n },\n\n /**\n * Exits from editing state\n * @return {fabric.IText} thisArg\n * @chainable\n */\n exitEditing: function() {\n var isTextChanged = (this._textBeforeEdit !== this.text);\n var hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n this.selectionEnd = this.selectionStart;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this._restoreEditingProps();\n this._currentCursorOpacity = 0;\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this.fire('editing:exited');\n isTextChanged && this.fire('modified');\n if (this.canvas) {\n this.canvas.off('mouse:move', this.mouseMoveHandler);\n this.canvas.fire('text:editing:exited', { target: this });\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n },\n\n /**\n * @private\n */\n _removeExtraneousStyles: function() {\n for (var prop in this.styles) {\n if (!this._textLines[prop]) {\n delete this.styles[prop];\n }\n }\n },\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo: function(start, end) {\n var cursorStart = this.get2DCursorLocation(start, true),\n cursorEnd = this.get2DCursorLocation(end, true),\n lineStart = cursorStart.lineIndex,\n charStart = cursorStart.charIndex,\n lineEnd = cursorEnd.lineIndex,\n charEnd = cursorEnd.charIndex,\n i, styleObj;\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (i = charStart; i < this._unwrappedTextLines[lineStart].length; i++) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (i = charEnd; i < this._unwrappedTextLines[lineEnd].length; i++) {\n styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = { });\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n }\n else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n styleObj = this.styles[lineStart];\n var diff = charEnd - charStart, numericChar, _char;\n for (i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (_char in this.styles[lineStart]) {\n numericChar = parseInt(_char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[_char];\n delete styleObj[_char];\n }\n }\n }\n }\n },\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles: function(lineIndex, offset) {\n // shift all line styles by offset upward or downward\n // do not clone deep. we need new array, not new style objects\n var clonedStyles = clone(this.styles);\n for (var line in this.styles) {\n var numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n },\n\n restartCursorIfNeeded: function() {\n if (!this._currentTickState || this._currentTickState.isAborted\n || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted\n ) {\n this.initDelayedCursor();\n }\n },\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject: function(lineIndex, charIndex, qty, copiedStyle) {\n var currentCharStyle,\n newLineStyles = {},\n somethingAdded = false,\n isEndOfLine = this._unwrappedTextLines[lineIndex].length === charIndex;\n\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n if (this.styles[lineIndex]) {\n currentCharStyle = this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1];\n }\n // we clone styles of all chars\n // after cursor onto the current line\n for (var index in this.styles[lineIndex]) {\n var numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n somethingAdded = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n var styleCarriedOver = false;\n if (somethingAdded && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver) {\n // skip the last line of since we already prepared it.\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = { 0: clone(copiedStyle[qty - 1]) };\n }\n else if (currentCharStyle) {\n this.styles[lineIndex + qty] = { 0: clone(currentCharStyle) };\n }\n else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n },\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject: function(lineIndex, charIndex, quantity, copiedStyle) {\n if (!this.styles) {\n this.styles = {};\n }\n var currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles ? clone(currentLineStyles) : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (var index in currentLineStylesCloned) {\n var numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] = currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = clone(copiedStyle[quantity]);\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n var newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = clone(newStyle);\n }\n },\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock: function(insertedText, start, copiedStyle) {\n var cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0], linesLength = 0;\n // get an array of how many char per lines are being added.\n for (var i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n }\n else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex, cursorLoc.charIndex, addedLines[0], copiedStyle);\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength && this.insertNewlineStyleObject(\n cursorLoc.lineIndex, cursorLoc.charIndex + addedLines[0], linesLength);\n for (var i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n }\n else if (copiedStyle) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n // we use i outside the loop to get it like linesLength\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n }\n },\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift: function(start, end, newSelection) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = 'left';\n }\n else if (this._selectionDirection === 'right') {\n this._selectionDirection = 'left';\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n }\n else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === 'right') {\n this.selectionEnd = newSelection;\n }\n else {\n this.selectionStart = newSelection;\n }\n }\n else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = 'right';\n }\n else if (this._selectionDirection === 'left') {\n this._selectionDirection = 'right';\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n },\n\n setSelectionInBoundaries: function() {\n var length = this.text.length;\n if (this.selectionStart > length) {\n this.selectionStart = length;\n }\n else if (this.selectionStart < 0) {\n this.selectionStart = 0;\n }\n if (this.selectionEnd > length) {\n this.selectionEnd = length;\n }\n else if (this.selectionEnd < 0) {\n this.selectionEnd = 0;\n }\n }\n });\n})();\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n /**\n * Initializes \"dbclick\" event handler\n */\n initDoubleClickSimulation: function() {\n\n // for double click\n this.__lastClickTime = +new Date();\n\n // for triple click\n this.__lastLastClickTime = +new Date();\n\n this.__lastPointer = { };\n\n this.on('mousedown', this.onMouseDown);\n },\n\n /**\n * Default event handler to simulate triple click\n * @private\n */\n onMouseDown: function(options) {\n if (!this.canvas) {\n return;\n }\n this.__newClickTime = +new Date();\n var newPointer = options.pointer;\n if (this.isTripleClick(newPointer)) {\n this.fire('tripleclick', options);\n this._stopEvent(options.e);\n }\n this.__lastLastClickTime = this.__lastClickTime;\n this.__lastClickTime = this.__newClickTime;\n this.__lastPointer = newPointer;\n this.__lastIsEditing = this.isEditing;\n this.__lastSelected = this.selected;\n },\n\n isTripleClick: function(newPointer) {\n return this.__newClickTime - this.__lastClickTime < 500 &&\n this.__lastClickTime - this.__lastLastClickTime < 500 &&\n this.__lastPointer.x === newPointer.x &&\n this.__lastPointer.y === newPointer.y;\n },\n\n /**\n * @private\n */\n _stopEvent: function(e) {\n e.preventDefault && e.preventDefault();\n e.stopPropagation && e.stopPropagation();\n },\n\n /**\n * Initializes event handlers related to cursor or selection\n */\n initCursorSelectionHandlers: function() {\n this.initMousedownHandler();\n this.initMouseupHandler();\n this.initClicks();\n },\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler: function(options) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n },\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler: function(options) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n },\n\n /**\n * Initializes double and triple click event handlers\n */\n initClicks: function() {\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('tripleclick', this.tripleClickHandler);\n },\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n */\n _mouseDownHandler: function(options) {\n if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n return;\n }\n\n this.__isMousedown = true;\n\n if (this.selected) {\n this.setCursorByClick(options.e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n },\n\n /**\n * Default event handler for the basic functionalities needed on mousedown:before\n * can be overridden to do something different.\n * Scope of this implementation is: verify the object is already selected when mousing down\n */\n _mouseDownHandlerBefore: function(options) {\n if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n return;\n }\n // we want to avoid that an object that was selected and then becomes unselectable,\n // may trigger editing mode in some way.\n this.selected = this === this.canvas._activeObject;\n },\n\n /**\n * Initializes \"mousedown\" event handler\n */\n initMousedownHandler: function() {\n this.on('mousedown', this._mouseDownHandler);\n this.on('mousedown:before', this._mouseDownHandlerBefore);\n },\n\n /**\n * Initializes \"mouseup\" event handler\n */\n initMouseupHandler: function() {\n this.on('mouseup', this.mouseUpHandler);\n },\n\n /**\n * standard hander for mouse up, overridable\n * @private\n */\n mouseUpHandler: function(options) {\n this.__isMousedown = false;\n if (!this.editable || this.group ||\n (options.transform && options.transform.actionPerformed) ||\n (options.e.button && options.e.button !== 1)) {\n return;\n }\n\n if (this.canvas) {\n var currentActive = this.canvas._activeObject;\n if (currentActive && currentActive !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (this.__lastSelected && !this.__corner) {\n this.selected = false;\n this.__lastSelected = false;\n this.enterEditing(options.e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n }\n else {\n this.renderCursorOrSelection();\n }\n }\n else {\n this.selected = true;\n }\n },\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {Event} e Event object\n */\n setCursorByClick: function(e) {\n var newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart, end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n }\n else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {Event} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer: function(e) {\n var mouseOffset = this.getLocalPointer(e),\n prevWidth = 0,\n width = 0,\n height = 0,\n charIndex = 0,\n lineIndex = 0,\n lineLeftOffset,\n line;\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i) * this.scaleY;\n lineIndex = i;\n if (i > 0) {\n charIndex += this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n }\n else {\n break;\n }\n }\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n width = lineLeftOffset * this.scaleX;\n line = this._textLines[lineIndex];\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n prevWidth = width;\n // i removed something about flipX here, check.\n width += this.__charBounds[lineIndex][j].kernedWidth * this.scaleX;\n if (width <= mouseOffset.x) {\n charIndex++;\n }\n else {\n break;\n }\n }\n return this._getNewSelectionStartFromOffset(mouseOffset, prevWidth, width, charIndex, jlen);\n },\n\n /**\n * @private\n */\n _getNewSelectionStartFromOffset: function(mouseOffset, prevWidth, width, index, jlen) {\n // we need Math.abs because when width is after the last char, the offset is given as 1, while is 0\n var distanceBtwLastCharAndCursor = mouseOffset.x - prevWidth,\n distanceBtwNextCharAndCursor = width - mouseOffset.x,\n offset = distanceBtwNextCharAndCursor > distanceBtwLastCharAndCursor ||\n distanceBtwNextCharAndCursor < 0 ? 0 : 1,\n newSelectionStart = index + offset;\n // if object is horizontally flipped, mirror cursor location from the end\n if (this.flipX) {\n newSelectionStart = jlen - newSelectionStart;\n }\n\n if (newSelectionStart > this._text.length) {\n newSelectionStart = this._text.length;\n }\n\n return newSelectionStart;\n }\n});\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea: function() {\n this.hiddenTextarea = fabric.document.createElement('textarea');\n this.hiddenTextarea.setAttribute('autocapitalize', 'off');\n this.hiddenTextarea.setAttribute('autocorrect', 'off');\n this.hiddenTextarea.setAttribute('autocomplete', 'off');\n this.hiddenTextarea.setAttribute('spellcheck', 'false');\n this.hiddenTextarea.setAttribute('data-fabric-hiddentextarea', '');\n this.hiddenTextarea.setAttribute('wrap', 'off');\n var style = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + style.top +\n '; left: ' + style.left + '; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;' +\n ' paddingーtop: ' + style.fontSize + ';';\n fabric.document.body.appendChild(this.hiddenTextarea);\n\n fabric.util.addListener(this.hiddenTextarea, 'keydown', this.onKeyDown.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'keyup', this.onKeyUp.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'input', this.onInput.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'copy', this.copy.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'cut', this.copy.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'paste', this.paste.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionstart', this.onCompositionStart.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionupdate', this.onCompositionUpdate.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionend', this.onCompositionEnd.bind(this));\n\n if (!this._clickHandlerInitialized && this.canvas) {\n fabric.util.addListener(this.canvas.upperCanvasEl, 'click', this.onClick.bind(this));\n this._clickHandlerInitialized = true;\n }\n },\n\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behaviour for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the fabric.Itext or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = fabric.util.object.clone(this.keysMap);\n * The function must be in fabric.Itext.prototype.myFunction And will receive event as args[0]\n */\n keysMap: {\n 9: 'exitEditing',\n 27: 'exitEditing',\n 33: 'moveCursorUp',\n 34: 'moveCursorDown',\n 35: 'moveCursorRight',\n 36: 'moveCursorLeft',\n 37: 'moveCursorLeft',\n 38: 'moveCursorUp',\n 39: 'moveCursorRight',\n 40: 'moveCursorDown',\n },\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n ctrlKeysMapUp: {\n 67: 'copy',\n 88: 'cut'\n },\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n ctrlKeysMapDown: {\n 65: 'selectAll'\n },\n\n onClick: function() {\n // No need to trigger click event here, focus is enough to have the keyboard appear on Android\n this.hiddenTextarea && this.hiddenTextarea.focus();\n },\n\n /**\n * Handles keyup event\n * @param {Event} e Event object\n */\n onKeyDown: function(e) {\n if (!this.isEditing || this.inCompositionMode) {\n return;\n }\n if (e.keyCode in this.keysMap) {\n this[this.keysMap[e.keyCode]](e);\n }\n else if ((e.keyCode in this.ctrlKeysMapDown) && (e.ctrlKey || e.metaKey)) {\n this[this.ctrlKeysMapDown[e.keyCode]](e);\n }\n else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.clearContextTop();\n this.renderCursorOrSelection();\n }\n else {\n this.canvas && this.canvas.requestRenderAll();\n }\n },\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {Event} e Event object\n */\n onKeyUp: function(e) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if ((e.keyCode in this.ctrlKeysMapUp) && (e.ctrlKey || e.metaKey)) {\n this[this.ctrlKeysMapUp[e.keyCode]](e);\n }\n else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n },\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput: function(e) {\n var fromPaste = this.fromPaste;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n // decisions about style changes.\n var nextText = this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n removedText, insertedText,\n charDiff = nextCharCount - charCount,\n selectionStart = this.selectionStart, selectionEnd = this.selectionEnd,\n selection = selectionStart !== selectionEnd,\n copiedStyle, removeFrom, removeTo;\n if (this.hiddenTextarea.value === '') {\n this.styles = { };\n this.updateFromTextArea();\n this.fire('changed');\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this });\n this.canvas.requestRenderAll();\n }\n return;\n }\n\n var textareaSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart,\n this.hiddenTextarea.selectionEnd,\n this.hiddenTextarea.value\n );\n var backDelete = selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(selectionStart, selectionEnd);\n charDiff += selectionEnd - selectionStart;\n }\n else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(selectionEnd + charDiff, selectionEnd);\n }\n else {\n removedText = this._text.slice(selectionStart, selectionStart - charDiff);\n }\n }\n var copiedStyle;\n insertedText = nextText.slice(textareaSelection.selectionEnd - charDiff, textareaSelection.selectionEnd);\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(selectionStart, selectionStart + 1, true);\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(function() {\n // this return an array of references, but that is fine since we are\n // copying the style later.\n return copiedStyle[0];\n });\n }\n if (selection) {\n removeFrom = selectionStart;\n removeTo = selectionEnd;\n }\n else if (backDelete) {\n // detect differencies between forwardDelete and backDelete\n removeFrom = selectionEnd - removedText.length;\n removeTo = selectionEnd;\n }\n else {\n removeFrom = selectionEnd;\n removeTo = selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n if (fromPaste && insertedText.join('') === fabric.copiedText && !fabric.disableStyleCopyPaste) {\n copiedStyle = fabric.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle);\n }\n this.updateFromTextArea();\n this.fire('changed');\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this });\n this.canvas.requestRenderAll();\n }\n },\n /**\n * Composition start\n */\n onCompositionStart: function() {\n this.inCompositionMode = true;\n },\n\n /**\n * Composition end\n */\n onCompositionEnd: function() {\n this.inCompositionMode = false;\n },\n\n // /**\n // * Composition update\n // */\n onCompositionUpdate: function(e) {\n this.compositionStart = e.target.selectionStart;\n this.compositionEnd = e.target.selectionEnd;\n this.updateTextareaPosition();\n },\n\n /**\n * Copies selected text\n * @param {Event} e Event object\n */\n copy: function() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n\n fabric.copiedText = this.getSelectedText();\n if (!fabric.disableStyleCopyPaste) {\n fabric.copiedTextStyle = this.getSelectionStyles(this.selectionStart, this.selectionEnd, true);\n }\n else {\n fabric.copiedTextStyle = null;\n }\n this._copyDone = true;\n },\n\n /**\n * Pastes text\n * @param {Event} e Event object\n */\n paste: function() {\n this.fromPaste = true;\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @return {Object} Clipboard data object\n */\n _getClipboardData: function(e) {\n return (e && e.clipboardData) || fabric.window.clipboardData;\n },\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor: function(lineIndex, charIndex) {\n var widthBeforeCursor = this._getLineLeftOffset(lineIndex), bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n },\n\n /**\n * Gets start offset of a selection\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset: function(e, isRight) {\n var selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (lineIndex === this._textLines.length - 1 || e.metaKey || e.keyCode === 34) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n var charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return textAfterCursor.length + indexOnOtherLine + 1 + this.missingNewlineOffset(lineIndex);\n },\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset: function(e, isRight) {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n }\n else {\n return this.selectionStart;\n }\n },\n\n /**\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset: function(e, isRight) {\n var selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n var charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return -this._textLines[lineIndex - 1].length\n + indexOnOtherLine - textBeforeCursor.length + (1 - missingNewlineOffset);\n },\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine: function(lineIndex, width) {\n\n var line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex),\n widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0, charWidth, foundMatch;\n\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n var leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : (j - 1);\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n },\n\n\n /**\n * Moves cursor down\n * @param {Event} e Event object\n */\n moveCursorDown: function(e) {\n if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n },\n\n /**\n * Moves cursor up\n * @param {Event} e Event object\n */\n moveCursorUp: function(e) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n },\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {Event} e Event object\n */\n _moveCursorUpOrDown: function(direction, e) {\n // getUpCursorOffset\n // getDownCursorOffset\n var action = 'get' + direction + 'CursorOffset',\n offset = this[action](e, this._selectionDirection === 'right');\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n }\n else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n this.setSelectionInBoundaries();\n this.abortCursorAnimation();\n this._currentCursorOpacity = 1;\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift: function(offset) {\n var newSelection = this._selectionDirection === 'left'\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(this.selectionStart, this.selectionEnd, newSelection);\n return offset !== 0;\n },\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift: function(offset) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n }\n else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n },\n\n /**\n * Moves cursor left\n * @param {Event} e Event object\n */\n moveCursorLeft: function(e) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n },\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n */\n _move: function(e, prop, direction) {\n var newValue;\n if (e.altKey) {\n newValue = this['findWordBoundary' + direction](this[prop]);\n }\n else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36 ) {\n newValue = this['findLineBoundary' + direction](this[prop]);\n }\n else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== undefined && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n },\n\n /**\n * @private\n */\n _moveLeft: function(e, prop) {\n return this._move(e, prop, 'Left');\n },\n\n /**\n * @private\n */\n _moveRight: function(e, prop) {\n return this._move(e, prop, 'Right');\n },\n\n /**\n * Moves cursor left without keeping selection\n * @param {Event} e\n */\n moveCursorLeftWithoutShift: function(e) {\n var change = true;\n this._selectionDirection = 'left';\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) {\n change = this._moveLeft(e, 'selectionStart');\n\n }\n this.selectionEnd = this.selectionStart;\n return change;\n },\n\n /**\n * Moves cursor left while keeping selection\n * @param {Event} e\n */\n moveCursorLeftWithShift: function(e) {\n if (this._selectionDirection === 'right' && this.selectionStart !== this.selectionEnd) {\n return this._moveLeft(e, 'selectionEnd');\n }\n else if (this.selectionStart !== 0){\n this._selectionDirection = 'left';\n return this._moveLeft(e, 'selectionStart');\n }\n },\n\n /**\n * Moves cursor right\n * @param {Event} e Event object\n */\n moveCursorRight: function(e) {\n if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n },\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {Event} e Event object\n */\n _moveCursorLeftOrRight: function(direction, e) {\n var actionName = 'moveCursor' + direction + 'With';\n this._currentCursorOpacity = 1;\n\n if (e.shiftKey) {\n actionName += 'Shift';\n }\n else {\n actionName += 'outShift';\n }\n if (this[actionName](e)) {\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Moves cursor right while keeping selection\n * @param {Event} e\n */\n moveCursorRightWithShift: function(e) {\n if (this._selectionDirection === 'left' && this.selectionStart !== this.selectionEnd) {\n return this._moveRight(e, 'selectionStart');\n }\n else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = 'right';\n return this._moveRight(e, 'selectionEnd');\n }\n },\n\n /**\n * Moves cursor right without keeping selection\n * @param {Event} e Event object\n */\n moveCursorRightWithoutShift: function(e) {\n var changed = true;\n this._selectionDirection = 'right';\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n }\n else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n },\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars: function(start, end) {\n if (typeof end === 'undefined') {\n end = start + 1;\n }\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this._removeExtraneousStyles();\n },\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars: function(text, style, start, end) {\n if (typeof end === 'undefined') {\n end = start;\n }\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n var graphemes = fabric.util.string.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [].concat(this._text.slice(0, start), graphemes, this._text.slice(end));\n this.text = this._text.join('');\n this.set('dirty', true);\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this._removeExtraneousStyles();\n },\n\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n var toFixed = fabric.util.toFixed,\n multipleSpacesRegex = / +/g;\n\n fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n\n /**\n * Returns SVG representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG: function() {\n var offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n return this._createBaseSVGMarkup(\n this._toSVG(),\n { reviver: reviver, noStyle: true, withShadow: true }\n );\n },\n\n /**\n * @private\n */\n _getSVGLeftTopOffsets: function() {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0)\n };\n },\n\n /**\n * @private\n */\n _wrapSVGTextAndBg: function(textAndBg) {\n var noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textAndBg.textBgRects.join(''),\n '\\t\\t',\n textAndBg.textSpans.join(''),\n '\\n'\n ];\n },\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n _getSVGTextAndBg: function(textTopOffset, textLeftOffset) {\n var textSpans = [],\n textBgRects = [],\n height = textTopOffset, lineOffset;\n // bounding-box background\n this._setSVGBg(textBgRects);\n\n // text and text-background\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(textBgRects, i, textLeftOffset + lineOffset, height);\n }\n this._setSVGTextLineText(textSpans, i, textLeftOffset + lineOffset, height);\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans: textSpans,\n textBgRects: textBgRects\n };\n },\n\n /**\n * @private\n */\n _createTextCharSpan: function(_char, styleDecl, left, top) {\n var shouldUseWhitespace = _char !== _char.trim() || _char.match(multipleSpacesRegex),\n styleProps = this.getSvgSpanStyles(styleDecl, shouldUseWhitespace),\n fillStyles = styleProps ? 'style=\"' + styleProps + '\"' : '',\n dy = styleDecl.deltaY, dySpan = '',\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n if (dy) {\n dySpan = ' dy=\"' + toFixed(dy, NUM_FRACTION_DIGITS) + '\" ';\n }\n return [\n '',\n fabric.util.string.escapeXml(_char),\n ''\n ].join('');\n },\n\n _setSVGTextLineText: function(textSpans, lineIndex, textLeftOffset, textTopOffset) {\n // set proper line offset\n var lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.indexOf('justify') !== -1,\n actualStyle,\n nextStyle,\n charsToRender = '',\n charBox, style,\n boxWidth = 0,\n line = this._textLines[lineIndex],\n timeToRender;\n\n textTopOffset += lineHeight * (1 - this._fontSizeFraction) / this.lineHeight;\n for (var i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = this._hasStyleChangedForSvg(actualStyle, nextStyle);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i) || { };\n textSpans.push(this._createTextCharSpan(charsToRender, style, textLeftOffset, textTopOffset));\n charsToRender = '';\n actualStyle = nextStyle;\n textLeftOffset += boxWidth;\n boxWidth = 0;\n }\n }\n },\n\n _pushTextBgRect: function(textBgRects, color, left, top, width, height) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n textBgRects.push(\n '\\t\\t\\n');\n },\n\n _setSVGTextLineBg: function(textBgRects, i, leftOffset, textTopOffset) {\n var line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight,\n boxWidth = 0,\n boxStart = 0,\n charBox, currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor && this._pushTextBgRect(textBgRects, lastColor, leftOffset + boxStart,\n textTopOffset, boxWidth, heightOfLine);\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n currentColor && this._pushTextBgRect(textBgRects, currentColor, leftOffset + boxStart,\n textTopOffset, boxWidth, heightOfLine);\n },\n\n /**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n *\n * @private\n * @param {*} value\n * @return {String}\n */\n _getFillAttributes: function(value) {\n var fillColor = (value && typeof value === 'string') ? new fabric.Color(value) : '';\n if (!fillColor || !fillColor.getSource() || fillColor.getAlpha() === 1) {\n return 'fill=\"' + value + '\"';\n }\n return 'opacity=\"' + fillColor.getAlpha() + '\" fill=\"' + fillColor.setAlpha(1).toRgb() + '\"';\n },\n\n /**\n * @private\n */\n _getSVGLineTopOffset: function(lineIndex) {\n var lineTopOffset = 0, lastHeight = 0;\n for (var j = 0; j < lineIndex; j++) {\n lineTopOffset += this.getHeightOfLine(j);\n }\n lastHeight = this.getHeightOfLine(j);\n return {\n lineTop: lineTopOffset,\n offset: (this._fontSizeMult - this._fontSizeFraction) * lastHeight / (this.lineHeight * this._fontSizeMult)\n };\n },\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles: function(skipShadow) {\n var svgStyle = fabric.Object.prototype.getSvgStyles.call(this, skipShadow);\n return svgStyle + ' white-space: pre;';\n },\n });\n})();\n/* _TO_SVG_END_ */\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = {});\n\n /**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n * @class fabric.Textbox\n * @extends fabric.IText\n * @mixes fabric.Observable\n * @return {fabric.Textbox} thisArg\n * @see {@link fabric.Textbox#initialize} for constructor definition\n */\n fabric.Textbox = fabric.util.createClass(fabric.IText, fabric.Observable, {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'textbox',\n\n /**\n * Minimum width of textbox, in pixels.\n * @type Number\n * @default\n */\n minWidth: 20,\n\n /**\n * Minimum calculated width of a textbox, in pixels.\n * fixed to 2 so that an empty textbox cannot go to 0\n * and is still selectable without text.\n * @type Number\n * @default\n */\n dynamicMinWidth: 2,\n\n /**\n * Cached array of text wrapping.\n * @type Array\n */\n __cachedLines: null,\n\n /**\n * Override standard Object class values\n */\n lockScalingFlip: true,\n\n /**\n * Override standard Object class values\n * Textbox needs this on false\n */\n noScaleCache: false,\n\n /**\n * Properties which when set cause object to change dimensions\n * @type Object\n * @private\n */\n _dimensionAffectingProps: fabric.Text.prototype._dimensionAffectingProps.concat('width'),\n\n /**\n * Use this regular expression to split strings in breakable lines\n * @private\n */\n _wordJoiners: /[ \\t\\r]/,\n\n /**\n * Use this boolean property in order to split strings that have no white space concept.\n * this is a cheap way to help with chinese/japaense\n * @type Boolean\n * @since 2.6.0\n */\n splitByGrapheme: false,\n\n /**\n * Unlike superclass's version of this function, Textbox does not update\n * its width.\n * @private\n * @override\n */\n initDimensions: function() {\n if (this.__skipDimension) {\n return;\n }\n this.isEditing && this.initDelayedCursor();\n this.clearContextTop();\n this._clearCache();\n // clear dynamicMinWidth as it will be different after we re-wrap line\n this.dynamicMinWidth = 0;\n // wrap lines\n this._styleMap = this._generateStyleMap(this._splitText());\n // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n if (this.dynamicMinWidth > this.width) {\n this._set('width', this.dynamicMinWidth);\n }\n if (this.textAlign.indexOf('justify') !== -1) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n // clear cache and re-calculate height\n this.height = this.calcTextHeight();\n this.saveState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Generate an object that translates the style object so that it is\n * broken up by visual lines (new lines and automatic wrapping).\n * The original text styles object is broken up by actual lines (new lines only),\n * which is only sufficient for Text / IText\n * @private\n */\n _generateStyleMap: function(textInfo) {\n var realLineCount = 0,\n realLineCharCount = 0,\n charCount = 0,\n map = {};\n\n for (var i = 0; i < textInfo.graphemeLines.length; i++) {\n if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n realLineCharCount = 0;\n charCount++;\n realLineCount++;\n }\n else if (!this.splitByGrapheme && this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) && i > 0) {\n // this case deals with space's that are removed from end of lines when wrapping\n realLineCharCount++;\n charCount++;\n }\n\n map[i] = { line: realLineCount, offset: realLineCharCount };\n\n charCount += textInfo.graphemeLines[i].length;\n realLineCharCount += textInfo.graphemeLines[i].length;\n }\n\n return map;\n },\n\n /**\n * Returns true if object has a style property or has it on a specified line\n * @param {Number} lineIndex\n * @return {Boolean}\n */\n styleHas: function(property, lineIndex) {\n if (this._styleMap && !this.isWrapping) {\n var map = this._styleMap[lineIndex];\n if (map) {\n lineIndex = map.line;\n }\n }\n return fabric.Text.prototype.styleHas.call(this, property, lineIndex);\n },\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles: function(lineIndex) {\n if (!this.styles) {\n return true;\n }\n var offset = 0, nextLineIndex = lineIndex + 1, nextOffset, obj, shouldLimit = false,\n map = this._styleMap[lineIndex], mapNextLine = this._styleMap[lineIndex + 1];\n if (map) {\n lineIndex = map.line;\n offset = map.offset;\n }\n if (mapNextLine) {\n nextLineIndex = mapNextLine.line;\n shouldLimit = nextLineIndex === lineIndex;\n nextOffset = mapNextLine.offset;\n }\n obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n for (var p1 in obj) {\n for (var p2 in obj[p1]) {\n if (p2 >= offset && (!shouldLimit || p2 < nextOffset)) {\n // eslint-disable-next-line no-unused-vars\n for (var p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n }\n return true;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _getStyleDeclaration: function(lineIndex, charIndex) {\n if (this._styleMap && !this.isWrapping) {\n var map = this._styleMap[lineIndex];\n if (!map) {\n return null;\n }\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n }\n return this.callSuper('_getStyleDeclaration', lineIndex, charIndex);\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n _setStyleDeclaration: function(lineIndex, charIndex, style) {\n var map = this._styleMap[lineIndex];\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n\n this.styles[lineIndex][charIndex] = style;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _deleteStyleDeclaration: function(lineIndex, charIndex) {\n var map = this._styleMap[lineIndex];\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n delete this.styles[lineIndex][charIndex];\n },\n\n /**\n * probably broken need a fix\n * Returns the real style line that correspond to the wrapped lineIndex line\n * Used just to verify if the line does exist or not.\n * @param {Number} lineIndex\n * @returns {Boolean} if the line exists or not\n * @private\n */\n _getLineStyle: function(lineIndex) {\n var map = this._styleMap[lineIndex];\n return !!this.styles[map.line];\n },\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @param {Object} style\n * @private\n */\n _setLineStyle: function(lineIndex) {\n var map = this._styleMap[lineIndex];\n this.styles[map.line] = {};\n },\n\n /**\n * Wraps text using the 'width' property of Textbox. First this function\n * splits text on newlines, so we preserve newlines entered by the user.\n * Then it wraps each line using the width of the Textbox by calling\n * _wrapLine().\n * @param {Array} lines The string array of text that is split into lines\n * @param {Number} desiredWidth width you want to wrap to\n * @returns {Array} Array of lines\n */\n _wrapText: function(lines, desiredWidth) {\n var wrapped = [], i;\n this.isWrapping = true;\n for (i = 0; i < lines.length; i++) {\n wrapped = wrapped.concat(this._wrapLine(lines[i], i, desiredWidth));\n }\n this.isWrapping = false;\n return wrapped;\n },\n\n /**\n * Helper function to measure a string of text, given its lineIndex and charIndex offset\n * it gets called when charBounds are not available yet.\n * @param {CanvasRenderingContext2D} ctx\n * @param {String} text\n * @param {number} lineIndex\n * @param {number} charOffset\n * @returns {number}\n * @private\n */\n _measureWord: function(word, lineIndex, charOffset) {\n var width = 0, prevGrapheme, skipLeft = true;\n charOffset = charOffset || 0;\n for (var i = 0, len = word.length; i < len; i++) {\n var box = this._getGraphemeBox(word[i], lineIndex, i + charOffset, prevGrapheme, skipLeft);\n width += box.kernedWidth;\n prevGrapheme = word[i];\n }\n return width;\n },\n\n /**\n * Wraps a line of text using the width of the Textbox and a context.\n * @param {Array} line The grapheme array that represent the line\n * @param {Number} lineIndex\n * @param {Number} desiredWidth width you want to wrap the line to\n * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n * @returns {Array} Array of line(s) into which the given text is wrapped\n * to.\n */\n _wrapLine: function(_line, lineIndex, desiredWidth, reservedSpace) {\n var lineWidth = 0,\n splitByGrapheme = this.splitByGrapheme,\n graphemeLines = [],\n line = [],\n // spaces in different languges?\n words = splitByGrapheme ? fabric.util.string.graphemeSplit(_line) : _line.split(this._wordJoiners),\n word = '',\n offset = 0,\n infix = splitByGrapheme ? '' : ' ',\n wordWidth = 0,\n infixWidth = 0,\n largestWordWidth = 0,\n lineJustStarted = true,\n additionalSpace = splitByGrapheme ? 0 : this._getWidthOfCharSpacing(),\n reservedSpace = reservedSpace || 0;\n // fix a difference between split and graphemeSplit\n if (words.length === 0) {\n words.push([]);\n }\n desiredWidth -= reservedSpace;\n for (var i = 0; i < words.length; i++) {\n // if using splitByGrapheme words are already in graphemes.\n word = splitByGrapheme ? words[i] : fabric.util.string.graphemeSplit(words[i]);\n wordWidth = this._measureWord(word, lineIndex, offset);\n offset += word.length;\n\n lineWidth += infixWidth + wordWidth - additionalSpace;\n\n if (lineWidth >= desiredWidth && !lineJustStarted) {\n graphemeLines.push(line);\n line = [];\n lineWidth = wordWidth;\n lineJustStarted = true;\n }\n else {\n lineWidth += additionalSpace;\n }\n\n if (!lineJustStarted && !splitByGrapheme) {\n line.push(infix);\n }\n line = line.concat(word);\n\n infixWidth = this._measureWord([infix], lineIndex, offset);\n offset++;\n lineJustStarted = false;\n // keep track of largest word\n if (wordWidth > largestWordWidth) {\n largestWordWidth = wordWidth;\n }\n }\n\n i && graphemeLines.push(line);\n\n if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n }\n\n return graphemeLines;\n },\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @param {Number} lineIndex text to split\n * @return {Boolean}\n */\n isEndOfWrapping: function(lineIndex) {\n if (!this._styleMap[lineIndex + 1]) {\n // is last line, return true;\n return true;\n }\n if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n // this is last line before a line break, return true;\n return true;\n }\n return false;\n },\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * @return Number\n */\n missingNewlineOffset: function(lineIndex) {\n if (this.splitByGrapheme) {\n return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n }\n return 1;\n },\n\n /**\n * Gets lines of text to render in the Textbox. This function calculates\n * text wrapping on the fly every time it is called.\n * @param {String} text text to split\n * @returns {Array} Array of lines in the Textbox.\n * @override\n */\n _splitTextIntoLines: function(text) {\n var newText = fabric.Text.prototype._splitTextIntoLines.call(this, text),\n graphemeLines = this._wrapText(newText.lines, this.width),\n lines = new Array(graphemeLines.length);\n for (var i = 0; i < graphemeLines.length; i++) {\n lines[i] = graphemeLines[i].join('');\n }\n newText.lines = lines;\n newText.graphemeLines = graphemeLines;\n return newText;\n },\n\n getMinWidth: function() {\n return Math.max(this.minWidth, this.dynamicMinWidth);\n },\n\n _removeExtraneousStyles: function() {\n var linesToKeep = {};\n for (var prop in this._styleMap) {\n if (this._textLines[prop]) {\n linesToKeep[this._styleMap[prop].line] = 1;\n }\n }\n for (var prop in this.styles) {\n if (!linesToKeep[prop]) {\n delete this.styles[prop];\n }\n }\n },\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['minWidth', 'splitByGrapheme'].concat(propertiesToInclude));\n }\n });\n\n /**\n * Returns fabric.Textbox instance from an object representation\n * @static\n * @memberOf fabric.Textbox\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Textbox instance is created\n */\n fabric.Textbox.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Textbox', object, callback, 'text');\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n","import FormHelpers from '../util/form';\nimport {\n newModalFromString\n} from '../components/modal';\nimport RegistrationHelper from './registrationHelper';\n\nconst toggleLoyaltyPopover = function (state) {\n $('.policy-promotion-loyalty').find('.slider').toggleClass('loyalty-highlight', state);\n\n if (state) {\n $('.popover-loyalty-member-int').fadeIn('fast', function () {\n $(this).removeClass('hidden');\n });\n } else {\n $('.popover-loyalty-member-int').fadeOut('fast', function () {\n $(this).addClass('hidden');\n });\n }\n};\n\n/**\n * Show alert if loyalty flag is off.\n */\nconst checkLoyaltyFlag = function () {\n var button = $('.button-register-final');\n\n if ((RegistrationHelper.isRegistrationModalFlow() && $('.registrationModal-box').attr('data-registration-modal-stage') === 'phone') || (RegistrationHelper.isRegistrationLoyaltyModalFlow() && $('.registrationModal-box').attr('data-registration-modal-stage') === 'registration')) {\n return true;\n }\n\n if (!button.length || $('.policy-promotion-loyalty').hasClass('hidden') || $('.policy-promotion-loyalty').length === 0) {\n return true;\n }\n\n var loyaltyFlagState = button.data('loyalty-check');\n if (!loyaltyFlagState) {\n button.data('loyalty-check', true);\n }\n toggleLoyaltyPopover(!loyaltyFlagState);\n\n return loyaltyFlagState;\n};\n\nconst toggleRememberPopover = function (fromLayer, state) {\n const location = fromLayer ? '.layer-login-modal ' : '.login-form-container ';\n if (state) {\n $(location + '.popover-remember-me').fadeIn('fast', function () {\n $(this).removeClass('hidden');\n });\n } else {\n $(location + '.popover-remember-me').fadeOut('fast', function () {\n $(this).addClass('hidden');\n });\n }\n};\n\n/**\n * Show alert if Remember flag is off.\n */\nconst checkRememberFlag = function (fromLayer) {\n var button = $('#rememberMe');\n if (fromLayer) {\n button = $('.layer-login-modal #rememberMeTwo');\n }\n\n if (!button.length || button.is(':checked')) {\n return true;\n }\n\n var rememberMeFlagState = button.data('rememberMe-check');\n if (!rememberMeFlagState) {\n button.data('rememberMe-check', true);\n }\n\n toggleRememberPopover(fromLayer, !rememberMeFlagState);\n\n return rememberMeFlagState;\n};\n\nconst initNewsletterAnalyticsBrands = function () {\n if (!window.newsletterPreferenceBrands) {\n window.newsletterPreferenceBrands = [];\n }\n};\n\nexport function formatDate (date, formatPattern) {\n if (formatPattern === 'dd-mm-yyyy') {\n return ('0' + date.getDate()).slice(-2) + '-' + ('0' + (date.getMonth() + 1)).slice(-2) + '-' +\n date.getFullYear();\n } else if (formatPattern === 'mm-dd-yyyy') {\n return ('0' + (date.getMonth() + 1)).slice(-2) + '-' + ('0' + date.getDate()).slice(-2) + '-' +\n date.getFullYear();\n } else if (formatPattern === 'yyyy年mm月dd日') {\n var dateParsed = (date.getFullYear() + '年' + ('0' + (date.getMonth() + 1)).slice(-2) + '月' + ('0' + date.getDate()).slice(-2) + '日');\n return dateParsed;\n }\n}\n\nclass Customer {\n constructor () {\n this.accountLogin = 'form.login';\n this.accountRegister = 'form.registration';\n this.accountLoyalty = 'form.loyalty';\n this.resetPassword = '.reset-password-form';\n this.checkoutLogin = 'form.login';\n this.checkoutRegister = 'form.checkout-registration';\n this.editProfile = 'form.edit-profile-form';\n this.editPassword = 'form.change-password-form';\n }\n\n toggleVisiblePassword () {\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n $('body').on('touchstart', '.toggle-password', function (e) {\n const password = $(this).closest('.form-fields-item__label').find('.pwd-input');\n const type = password.attr('type') === 'password' ? 'text' : 'password';\n password.attr('type', type);\n $(this).toggleClass('toggle-password--visible');\n e.stopImmediatePropagation();\n });\n } else {\n $('body').on('click', '.toggle-password', function (e) {\n const password = $(this).closest('.form-fields-item__label').find('.pwd-input');\n const type = password.attr('type') === 'password' ? 'text' : 'password';\n password.attr('type', type);\n $(this).toggleClass('toggle-password--visible');\n e.stopImmediatePropagation();\n });\n }\n }\n\n turnLoginImg () {\n if ($('.js-link-access').hasClass('current')) {\n $('.js-img-login-turn').show();\n } else {\n $('.js-img-login-turn').hide();\n }\n\n if ($('.js-link-register').hasClass('current')) {\n $('.js-img-registration-turn').show();\n } else {\n $('.js-img-registration-turn').hide();\n }\n }\n\n fireGenericAnalyticsErrorEvent (type, step, errorMsg) {\n $('body').trigger('customer:account_error', {\n 'type': type,\n 'step': step,\n 'errorMsg': errorMsg\n });\n }\n\n fireSpecificAnalyticsErrorEvent (mainType, subType, error, rememberMe, sessionExpired) {\n $('body').trigger('customer:' + mainType, {\n 'type': subType,\n 'data': {\n 'error': [error],\n 'rememberMe': rememberMe,\n 'sessionExpired': sessionExpired\n }\n });\n }\n\n fireSpecificEventModeAnalyticsErrorEvent (mainType, subType, error, eventMode) {\n $('body').trigger('customer:' + mainType, {\n 'type': subType,\n 'eventMode': eventMode,\n 'data': {\n 'error': [error]\n }\n });\n }\n\n deleteAccount () {\n $(document).on('click', '.js-account-delete-button', function (e) {\n e.preventDefault();\n\n // Show popup\n const htmlContent = $('#accountDeleteConfirmModal').clone().html();\n // create and open confirmation modal\n const modal = newModalFromString(htmlContent, false, ['account-delete-tingle']);\n modal.open();\n $(modal.modalBox).on('click', '#accountDeleteConfirmModalNo, #accountDeleteCloseErrorModal', (e) => {\n e.preventDefault();\n modal.close();\n modal.destroy();\n });\n $(modal.modalBox).on('click', '.close, .btn-close, #accountDeleteCloseSuccessModal', (e) => {\n e.preventDefault();\n if (window.redirectToHomepageInsteadClosing) {\n let redirectUrl = $('#accountDeleteHiddenHomeLink').attr('href');\n window.location.replace(redirectUrl);\n window.redirectToHomepageInsteadClosing = undefined;\n } else {\n modal.close();\n modal.destroy();\n }\n });\n $(modal.modalBox).on('click', '#accountDeleteConfirmModalYes', (e) => {\n e.preventDefault();\n // Ajax call to the account delete service\n var url = $('#accountDeleteConfirmModal').data('account-delete-url');\n $.spinner().start();\n $.ajax({\n url: url,\n method: 'GET',\n success: data => {\n if (data.error) {\n onErrorHandler();\n } else {\n $('body').trigger('analytics:accountRemoveConfirmation');\n $('.js-account-delete-ok').show();\n $('.js-account-delete-error').hide();\n window.redirectToHomepageInsteadClosing = true;\n $('#accountCancellationModalStep1').addClass('account-temporary-hide');\n $('#accountCancellationModalSuccess').removeClass('account-temporary-hide');\n $.spinner().stop();\n }\n },\n error: data => {\n onErrorHandler();\n }\n });\n function onErrorHandler () {\n $('.js-account-delete-error').show();\n $('#accountCancellationModalStep1').addClass('account-temporary-hide');\n $('#accountCancellationModalError').removeClass('account-temporary-hide');\n $.spinner().stop();\n }\n });\n });\n }\n\n accountLoginForm (fromLayer = false, rurlDynamic) {\n const _self = this;\n $('form.login').ready(function () {\n if (window.location.href.indexOf('force%2elogin') >= 0 || window.location.href.indexOf('force.login') >= 0 && $('#login-form-email').val() != null) {\n $('#login-form-error').html($('#login-error-label').text())\n .addClass('is-invalid')\n .addClass('success-block')\n .siblings('.invalid-feedback')\n // .html()\n .show();\n }\n if (window.location.href.indexOf('tab.reg') >= 0 || window.location.href.indexOf('tab%2ereg') >= 0) {\n $('#tab-login-cell, .js-link-access').removeClass('current');\n $('#tab-registration-cell, .js-link-register').addClass('current');\n this.turnLoginImg();\n }\n });\n\n $('form.login').submit(function (e) {\n var form = $(this);\n e.preventDefault();\n if (!checkRememberFlag(fromLayer)) {\n return;\n } else {\n toggleRememberPopover(fromLayer, false);\n }\n var url = form.attr('action');\n if (rurlDynamic && rurlDynamic.data('url')) {\n url = rurlDynamic.data('url');\n }\n if ($('.js-persistent-layer').length) {\n url += '&isPersistent=true';\n }\n $.spinner().start();\n\n $('form.login').trigger('login:submit', e);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n if (data.socialCustomer) {\n socialLoginOpenForgotPasswordModal(data.email);\n } else {\n FormHelpers.init(form, data);\n $('form.login').trigger('login:error', data);\n $('#login-form-password').val('');\n _self.fireGenericAnalyticsErrorEvent('login', 'step1_login', 'wrong_email_or_wrong_password');\n _self.fireSpecificAnalyticsErrorEvent('login', 'login', 'wrong_email_or_wrong_password', data.rememberMe);\n }\n } else {\n $('form.login').trigger('login:success', data);\n $('body').trigger('customer:login', {\n 'type': 'login',\n 'data': data\n });\n if (RegistrationHelper.isNewRegistrationActive() && !RegistrationHelper.isUserLoyaltyForThisBrand(data.response.customerFidelitySubscriptions) && RegistrationHelper.isLoyaltyAvailable()) {\n $('.js-modal-loyalty-registration-fake').val('user-is-logged');\n $('.js-modal-loyalty-registration-fake').trigger('click');\n return;\n }\n if (fromLayer) {\n location.reload();\n } else {\n location.href = data.redirectUrl;\n }\n }\n },\n error: function (data) {\n _self.fireGenericAnalyticsErrorEvent('login', 'step1_login', 'unknown_error');\n $('body').trigger('customer:login', {\n 'type': 'login',\n 'data': ['unknown_error']\n });\n\n if (data.responseJSON.redirectUrl) {\n window.location.href = data.responseJSON.redirectUrl;\n } else {\n $('form.login').trigger('login:error', data);\n form.spinner().stop();\n }\n }\n });\n return false;\n });\n\n $('.layer-login-modal .info-icon, #tab-login-cell .login-form-container .info-icon').find('span').on('click', function () {\n $('body').trigger('customer:persistentTooltip');\n });\n\n function enableLoginAnalyticsObserver () {\n let targetLoginNode = $('form.login:visible')[0];\n let config = { attributes: true, childList: true, subtree: true };\n let callback = function (mutationsList, observer) {\n let inputSet = new Set();\n let genericEventAlreadyFired = false;\n for (let index = 0; index < mutationsList.length; index++) {\n let mutation = mutationsList[index];\n if (mutation.type === 'attributes' &&\n mutation.target.nodeName === 'INPUT' &&\n mutation.attributeName === 'class' &&\n mutation.target.classList.contains('is-invalid-input')) {\n if (!inputSet.has(mutation.target.id)) {\n let errorMsg = 'unknown_error';\n if (mutation.target.id.includes('email')) {\n errorMsg = mutation.target.value ? 'email_already_registered_in_existing_account' : 'empty_field_or_invalid_email';\n } else if (mutation.target.id.includes('password-confirm')) {\n errorMsg = mutation.target.value ? 'mismatch_password' : 'empty_password';\n } else if (mutation.target.id.includes('password')) {\n errorMsg = mutation.target.value ? 'wrong_email_or_wrong_password' : 'empty_password';\n } else {\n errorMsg = 'unknown_error';\n }\n let rememberMe = false;\n let sessionExpired = false;\n if ($('#rememberMe, .layer-login-modal #rememberMeTwo').length && $('#rememberMe,.layer-login-modal #rememberMeTwo').is(':checked')) {\n rememberMe = true;\n }\n if ($('.js-persistent-layer').length) {\n sessionExpired = true;\n }\n _self.fireGenericAnalyticsErrorEvent('login', 'step1_login', errorMsg);\n if (!genericEventAlreadyFired) {\n _self.fireSpecificAnalyticsErrorEvent('login', 'login', errorMsg, rememberMe, sessionExpired);\n genericEventAlreadyFired = true;\n }\n inputSet.add(mutation.target.id);\n }\n }\n }\n observer.disconnect();\n };\n let observer = new MutationObserver(callback);\n observer.observe(targetLoginNode, config);\n }\n\n if ($('form.login').length > 0) {\n var submitButtonAnalytics = $('form.login').find('button[type=submit]:visible');\n if(submitButtonAnalytics.length === 0){\n submitButtonAnalytics = $('form.login:first').find('button[type=submit]');\n }\n submitButtonAnalytics.on('click', function (e) {\n enableLoginAnalyticsObserver();\n });\n }\n\n function socialLoginOpenForgotPasswordModal (email) {\n $('body').trigger('socialLoginError:standardCustomer');\n const htmlContent = $('#requestPasswordResetModal').clone().html();\n // create and open confirmation modal\n const modal = newModalFromString(htmlContent, false, ['layer-password-modal']);\n modal.open();\n _self.resetPasswordForm();\n $(modal.modalBox).find('.request-password-title').addClass('hidden');\n $(modal.modalBox).find('.social-request-password-title').removeClass('hidden');\n const socialTitle = $(modal.modalBox).find('.social-request-password-title').data('title');\n $(modal.modalBox).find('.social-request-password-title').text(socialTitle);\n $(modal.modalBox).find('.ico-center-send-mail').addClass('hidden');\n $(modal.modalBox).find('.request-password-body-description').addClass('hidden');\n $(modal.modalBox).find('.social-request-password-body-description').removeClass('hidden');\n $(modal.modalBox).find('#reset-password-email').val(email);\n $(modal.modalBox).on('click', '.close, .btn-close', (e) => {\n e.preventDefault();\n modal.close();\n modal.destroy();\n });\n }\n }\n\n loginAndAssociateOrderWithLoyaltyCustomer () {\n const _self = this;\n $('form.loginAndAssociateOrder').submit(function (e) {\n var form = $(this);\n e.preventDefault();\n var url = form.attr('action');\n $.spinner().start();\n\n $('form.loginAndAssociateOrder').trigger('login:submit', e);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n FormHelpers.init(form, data);\n $('loginAndAssociateOrder.login').trigger('login:error', data);\n $('#login-form-password').val('');\n _self.fireGenericAnalyticsErrorEvent('login', 'step1_login', 'wrong_email_or_wrong_password');\n _self.fireSpecificAnalyticsErrorEvent('login', 'login', 'wrong_email_or_wrong_password');\n } else {\n // order association request\n var associationForm = $('form.orderAssociation');\n var url = associationForm.attr('action');\n $('body').trigger('customer:login', {\n 'type': 'login',\n 'data': data\n });\n $.ajax({\n url: url,\n type: \"post\",\n dataType: \"json\",\n data: associationForm.serialize(),\n success: function (data) {\n if (data.success) {\n location.href = data.redirectUrl;\n } else {\n // order can't be associated\n $('#login').prop('disabled',true);\n $('.login-form-error').addClass('hidden');\n $('#orderAssociationError').removeClass('hidden');\n }\n },\n error: function (data) {\n $('#login').prop('disabled',true);\n $('.login-form-error').addClass('hidden');\n $('#orderAssociationError').removeClass('hidden');\n $('loginAndAssociateOrder.login').trigger('login:error', data);\n }\n });\n }\n },\n error: function (data) {\n $('body').trigger('customer:login', {\n 'type': 'login',\n 'data': ['unknown_error']\n });\n if (data.responseJSON.redirectUrl) {\n window.location.href = data.responseJSON.redirectUrl;\n } else {\n $('loginAndAssociateOrder.login').trigger('login:error', data);\n form.spinner().stop();\n }\n }\n });\n return false;\n });\n\n function enableLoginAndAssociateAnalyticsObserver () {\n let targetLoginNode = $('form.loginAndAssociateOrder').get(0);\n let config = { attributes: true, childList: true, subtree: true };\n let callback = function (mutationsList, observer) {\n let inputSet = new Set();\n let genericEventAlreadyFired = false;\n for (let index = 0; index < mutationsList.length; index++) {\n let mutation = mutationsList[index];\n if (mutation.type === 'attributes' &&\n mutation.target.nodeName === 'INPUT' &&\n mutation.attributeName === 'class' &&\n mutation.target.classList.contains('is-invalid-input')) {\n if (!inputSet.has(mutation.target.id)) {\n let errorMsg = 'unknown_error';\n if (mutation.target.id.includes('email')) {\n errorMsg = mutation.target.value ? 'email_already_registered_in_existing_account' : 'empty_field_or_invalid_email';\n } else if (mutation.target.id.includes('password-confirm')) {\n errorMsg = mutation.target.value ? 'mismatch_password' : 'empty_password';\n } else if (mutation.target.id.includes('password')) {\n errorMsg = mutation.target.value ? 'wrong_email_or_wrong_password' : 'empty_password';\n } else {\n errorMsg = 'unknown_error';\n }\n _self.fireGenericAnalyticsErrorEvent('login', 'step1_login', errorMsg);\n if (!genericEventAlreadyFired) {\n _self.fireSpecificAnalyticsErrorEvent('login', 'login', errorMsg);\n genericEventAlreadyFired = true;\n }\n inputSet.add(mutation.target.id);\n }\n }\n }\n observer.disconnect();\n };\n let observer = new MutationObserver(callback);\n observer.observe(targetLoginNode, config);\n }\n\n if (document.querySelectorAll('form.loginAndAssociateOrder').length > 0) {\n let registrationStartFrom = document.querySelectorAll('form.loginAndAssociateOrder')[0];\n let submitButtonAnalytics = registrationStartFrom.querySelectorAll('button[type=submit]')[0];\n submitButtonAnalytics.addEventListener('click', function (e) {\n enableLoginAndAssociateAnalyticsObserver();\n });\n }\n }\n\n loginAndAssociateOrderWithCustomer () {\n const _self = this;\n $('form.loginAndAssociateOrderWithCustomer').submit(function (e) {\n var form = $(this);\n e.preventDefault();\n var url = form.attr('action');\n $.spinner().start();\n\n $('form.loginAndAssociateOrderWithCustomer').trigger('login:submit', e);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n FormHelpers.init(form, data);\n $('loginAndAssociateOrderWithCustomer.login').trigger('login:error', data);\n $('#login-form-password').val('');\n _self.fireGenericAnalyticsErrorEvent('login', 'step1_login', 'wrong_email_or_wrong_password');\n _self.fireSpecificAnalyticsErrorEvent('login', 'login', 'wrong_email_or_wrong_password');\n } else {\n // order association request\n var associationForm = $('form.orderAssociation');\n var url = associationForm.attr('action');\n $('body').trigger('customer:login', {\n 'type': 'login',\n 'data': data\n });\n $.ajax({\n url: url,\n type: \"post\",\n dataType: \"json\",\n data: associationForm.serialize(),\n success: function (data) {\n if (data.success) {\n $('.loginContainer').remove();\n $('.loyaltyContainer').removeClass('hidden');\n $('.analytics.helperData').data('user-id', data.hkCustomerId);\n } else {\n // order can't be associated\n $('#login').prop('disabled',true);\n $('.login-form-error').addClass('hidden');\n $('#orderAssociationError').removeClass('hidden');\n }\n },\n error: function (data) {\n $('#login').prop('disabled',true);\n $('.login-form-error').addClass('hidden');\n $('#orderAssociationError').removeClass('hidden');\n $('loginAndAssociateOrderWithCustomer.login').trigger('login:error', data);\n }\n });\n }\n },\n error: function (data) {\n $('body').trigger('customer:login', {\n 'type': 'login',\n 'data': ['unknown_error']\n });\n if (data.responseJSON.redirectUrl) {\n window.location.href = data.responseJSON.redirectUrl;\n } else {\n $('loginAndAssociateOrderWithCustomer.login').trigger('login:error', data);\n form.spinner().stop();\n }\n }\n });\n return false;\n });\n\n function enableCustomerLoginAndAssociateAnalyticsObserver () {\n let targetLoginNode = $('form.loginAndAssociateOrderWithCustomer').get(0);\n let config = { attributes: true, childList: true, subtree: true };\n let callback = function (mutationsList, observer) {\n let inputSet = new Set();\n let genericEventAlreadyFired = false;\n for (let index = 0; index < mutationsList.length; index++) {\n let mutation = mutationsList[index];\n if (mutation.type === 'attributes' &&\n mutation.target.nodeName === 'INPUT' &&\n mutation.attributeName === 'class' &&\n mutation.target.classList.contains('is-invalid-input')) {\n if (!inputSet.has(mutation.target.id)) {\n let errorMsg = 'unknown_error';\n if (mutation.target.id.includes('email')) {\n errorMsg = mutation.target.value ? 'email_already_registered_in_existing_account' : 'empty_field_or_invalid_email';\n } else if (mutation.target.id.includes('password-confirm')) {\n errorMsg = mutation.target.value ? 'mismatch_password' : 'empty_password';\n } else if (mutation.target.id.includes('password')) {\n errorMsg = mutation.target.value ? 'wrong_email_or_wrong_password' : 'empty_password';\n } else {\n errorMsg = 'unknown_error';\n }\n _self.fireGenericAnalyticsErrorEvent('login', 'step1_login', errorMsg);\n if (!genericEventAlreadyFired) {\n _self.fireSpecificAnalyticsErrorEvent('login', 'login', errorMsg);\n genericEventAlreadyFired = true;\n }\n inputSet.add(mutation.target.id);\n }\n }\n }\n observer.disconnect();\n };\n let observer = new MutationObserver(callback);\n observer.observe(targetLoginNode, config);\n }\n\n if (document.querySelectorAll('form.loginAndAssociateOrderWithCustomer').length > 0) {\n let registrationStartFrom = document.querySelectorAll('form.loginAndAssociateOrderWithCustomer')[0];\n let submitButtonAnalytics = registrationStartFrom.querySelectorAll('button[type=submit]')[0];\n submitButtonAnalytics.addEventListener('click', function (e) {\n enableCustomerLoginAndAssociateAnalyticsObserver();\n });\n }\n }\n\n registerAndAssociateOrderForm () {\n const _self = this;\n $('form.registrationAndOrderAssociation').submit(function (e) {\n $('#registration-error-message').addClass('hidden');\n var form = $(this);\n e.preventDefault();\n var url = form.attr('action');\n $.spinner().start();\n\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n $('#registration-error-message').removeClass('hidden');\n _self.fireSpecificAnalyticsErrorEvent('registerFirst', 'registration', 'email_or_number_already_registered');\n } else {\n $('body').trigger('customer:registerFirst', {\n 'type': 'registration',\n 'data': data\n });\n location.href = data.redirectUrl;\n }\n },\n error: function (data) {\n form.spinner().stop();\n $('#registration-error-message').removeClass('hidden');\n }\n });\n return false;\n });\n }\n\n prepareLoyaltySubscriptionForm () {\n $('button.prepareLoyaltySubscription').click(function (e) {\n $('#registration-error-message').addClass('hidden');\n var form = $('form.prepareLoyaltySubscription');\n e.preventDefault();\n var url = form.attr('action');\n $.spinner().start();\n\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n $('#registration-error-message').removeClass('hidden');\n $('button.prepareLoyaltySubscription').remove();\n } else {\n $('body').trigger('analytics:prepareLoyaltySubscription');\n location.href = data.redirectUrl;\n }\n },\n error: function (data) {\n form.spinner().stop();\n $('#registration-error-message').removeClass('hidden');\n $('button.prepareLoyaltySubscription').remove();\n }\n });\n return false;\n });\n }\n\n accountLoyaltyForm () {\n const _self = this;\n $('form.loyalty').submit(function (e) {\n var form = $(this);\n e.preventDefault();\n var url = form.attr('action');\n FormHelpers.clearPreviousErrors(form);\n $.spinner().start();\n $('form.registration').trigger('login:register', e);\n let stateObj = {\n foo: $('#backLinkObj').text()\n };\n history.pushState(stateObj, '', $('#backLink').text());\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n FormHelpers.init(form, data);\n if (data.fields) {\n FormHelpers.loadFormErrors(form, data.fields);\n }\n if (data.alreadyRegistered) {\n $('.already-registered-2').removeClass('login-form-error-block');\n $('.already-registered-2').removeClass('color-alert');\n $('.already-registered-2').addClass('is-invalid');\n $('.already-registered-2').addClass('success-block');\n }\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', 'step1_card', 'empty_or_invalid_card_code_or_card_pin');\n _self.fireSpecificAnalyticsErrorEvent('registrationLoyaltyCardStep', 'loyalty_card', 'empty_or_invalid_card_code_or_card_pin');\n } else {\n if (data.error) delete data.error;\n $('body').trigger('customer:registrationLoyaltyCardStep', {\n 'type': 'registration',\n 'data': data,\n 'flow': 'loyalty_registration'\n });\n if (RegistrationHelper.isRegistrationModalFlow()) {\n var customerInfo = data.customerInfo;\n var nextStep = data.modalRegistrationStep;\n /* if (nextStep === 'email') {\n $('#register-loyalty').addClass('hidden');\n if (customerInfo) {\n RegistrationHelper.handleCustomerInfo(customerInfo);\n if (customerInfo.mobileNumber !== '') {\n $('.registrationModal-box').attr('data-registration-modal-skip-phone', 'true');\n $('.registrationModal-box').attr('data-skipped-phone', customerInfo.mobileNumber);\n }\n $('.policy-promotion-loyalty').addClass('hidden');\n } else {\n $('.loyalty-flag').trigger('click');\n }\n } */\n if (nextStep === 'email_only') {\n RegistrationHelper.moveToNextStep(nextStep);\n $('.loyalty-flag').trigger('click');\n $('.policy-promotion-loyalty').addClass('hidden');\n } else {\n RegistrationHelper.moveToNextStep(nextStep);\n RegistrationHelper.handleCustomerInfo(customerInfo);\n }\n if (nextStep === 'personal-info') {\n $('.js-back-step-arrow').addClass('hidden');\n $('.policy-promotion-loyalty').addClass('hidden');\n } else if (nextStep === 'phone') {\n $('.policy-promotion-loyalty').addClass('hidden');\n }\n $('.rightModalAttribute').scrollTop(0);\n } else {\n location.href = data.redirectUrl;\n }\n // FormHelpers.init(form, data);\n // if (data.fields) {\n // FormHelpers.loadFormErrors(form, data.fields);\n // }\n }\n },\n error: function (data) {\n _self.fireGenericAnalyticsErrorEvent('registration', 'step1_loyalty_card', 'generic_error');\n // if (data.responseJSON.redirectUrl) {\n // window.location.href = data.responseJSON.redirectUrl;\n // }\n form.spinner().stop();\n }\n });\n return false;\n });\n\n const config = { attributes: true, childList: true, subtree: true };\n function enableLoyaltyAnalyticsObserver () {\n let targetLoyaltyNode = $('form.loyalty').get(0);\n let loyaltyCallback = function (mutationsList, observer) {\n let inputSet = new Set();\n let genericEventAlreadyFired = false;\n for (let index = 0; index < mutationsList.length; index++) {\n let mutation = mutationsList[index];\n if (mutation.type === 'attributes' &&\n mutation.target.nodeName === 'INPUT' &&\n mutation.attributeName === 'class' &&\n mutation.target.classList.contains('is-invalid-input')) {\n if (!inputSet.has(mutation.target.id)) {\n let errorMsg = 'unknown_error';\n let step = 'step1_card';\n if (mutation.target.id.includes('cardCode')) {\n errorMsg = mutation.target.value ? 'wrong_card_code' : 'empty_card_code';\n } else if (mutation.target.id.includes('cardPin')) {\n errorMsg = mutation.target.value ? 'wrong_card_pin' : 'empty_card_pin';\n } else {\n errorMsg = 'unknown_error';\n }\n\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', step, errorMsg);\n if (!genericEventAlreadyFired) {\n _self.fireSpecificAnalyticsErrorEvent('registrationLoyaltyCardStep', 'loyalty_card', errorMsg);\n genericEventAlreadyFired = true;\n }\n\n inputSet.add(mutation.target.id);\n }\n }\n }\n loyaltyObserver.disconnect();\n };\n let loyaltyObserver = new MutationObserver(loyaltyCallback);\n loyaltyObserver.observe(targetLoyaltyNode, config);\n }\n\n if (document.querySelectorAll('form.loyalty').length > 0) {\n let registrationStartFrom = document.querySelectorAll('form.loyalty')[0];\n let submitButtonAnalytics = registrationStartFrom.querySelectorAll('button[type=submit]')[0];\n submitButtonAnalytics.addEventListener('click', function (e) {\n enableLoyaltyAnalyticsObserver();\n });\n }\n };\n\n accountRegisterForm () {\n const _self = this;\n $('form.registration').ready(function () {\n if ($('#login-warn-label').text().length > 2) {\n $('#reg-phone-error').html($('#login-warn-label').text())\n .addClass('is-invalid')\n .siblings('.invalid-feedback')\n // .html()\n .show();\n $('#reg-phone-error').addClass('success-block');\n $('#reg-phone-error').removeClass('color-alert');\n }\n });\n\n $('form.registrationStart').ready(function () {\n if ($('#login-warn-label').text().length > 2) {\n $('#reg-mail-error').html($('#login-warn-label').text())\n .addClass('is-invalid')\n .siblings('.invalid-feedback')\n // .html()\n .show();\n $('#reg-mail-error').addClass('success-block');\n $('#reg-mail-error').removeClass('color-alert');\n }\n });\n\n $('body').on('change', '.loyalty-flag', function (e) {\n var isChecked = $(e.currentTarget).prop('checked');\n if (isChecked) {\n $('.dob').removeClass('hidden');\n $('.opposition').removeClass('hidden');\n $('.warning-card-override').removeClass('hidden');\n $('.warning-card-override').addClass('success-block');\n $('.dob').prop('required', true);\n $('.button-register-final').data('loyalty-check', true);\n\n if (!$('.popover-loyalty-member-clz').hasClass('hidden')) {\n toggleLoyaltyPopover(false);\n }\n } else {\n $('.dob').addClass('hidden');\n $('.opposition').addClass('hidden');\n $('.warning-card-override').addClass('hidden');\n $('.warning-card-override').removeClass('success-block');\n $('.dob').removeAttr('required');\n $('.button-register-final').data('loyalty-check', false);\n }\n });\n\n $('.add-to-email').on('change', (e) => {\n $('.js-personalized-news-container').removeClass('transparent');\n if (e.target.id === 'add-to-email-list-yes' && e.target.checked) {\n $('.add-to-personalized-list').prop('disabled', false);\n if (e.target.value != null && e.target.value) {\n $('.add-to-personalized-list').prop('required', true);\n } else {\n $('.add-to-personalized-list').removeAttr('required');\n }\n } else {\n $('.add-to-personalized-list').prop('checked', false);\n $('.add-to-personalized-list').prop('disabled', true);\n $('.add-to-personalized-list').removeAttr('required');\n $('.js-personalized-news-container').addClass('transparent');\n }\n });\n\n var enableCTA = (e) => {\n // My Account page new flow\n var isMyAccountPage = $('.registration-loyalty').data('myaccount-page') || false;\n if (isMyAccountPage) {\n _self.handleMyAccountFlow();\n return;\n }\n\n var loyalty = $('.loyalty-flag-m:checked').val() !== undefined && $('.loyalty-flag-m:checked').val() == 'true';\n var loyaltyPhysicalCard = $('.associate-loyalty-flag-m:checked').val() !== undefined && $('.associate-loyalty-flag-m:checked').val() == 'true';\n var cardValues = $('#loyalty-form-cardCode').val() != '' && $('#loyalty-form-cardPin').val() != '';\n cardValues = cardValues && $('#loyalty-form-cardCode').val().length >= $('#loyalty-form-cardCode').attr('minlength');\n cardValues = cardValues && $('#loyalty-form-cardPin').val().length >= $('#loyalty-form-cardPin').attr('minlength');\n\n $('.disabledForm').prop('disabled', true);\n $('.block-associate-card').hide();\n\n if (loyaltyPhysicalCard) {\n $('.block-associate-card').show();\n }\n\n if (loyalty) {\n if (loyaltyPhysicalCard && cardValues && $('.associate-loyalty-flag-m:checked').val() !== undefined) {\n $('.disabledForm').prop('disabled', false);\n }\n else if (!loyaltyPhysicalCard && $('.associate-loyalty-flag-m:checked').val() !== undefined){\n $('.disabledForm').prop('disabled', false);\n }\n }\n };\n\n var clearInput = (e) => {\n $(e.target).removeClass('is-input-invalid');\n };\n\n $('.loyalty-flag-m, .associate-loyalty-flag-m').on('change', enableCTA);\n $('#loyalty-form-cardCode, #loyalty-form-cardPin, .myaccount-date-picker-input').on('keyup', enableCTA);\n $('.myaccount-date-picker').on('changeDate', enableCTA);\n $('#loyalty-form-cardCode, #loyalty-form-cardPin').on('keydown', clearInput);\n\n $(document).on('click', '.sendNewOtp', function (e) {\n e.preventDefault();\n $('#registration-form-phone-confirm').val('');\n $('#registration-form-phone-confirm').attr('required', false);\n $('form.registration').submit();\n });\n\n $('form.registration').submit(function (e) {\n e.preventDefault();\n\n if (!checkLoyaltyFlag()) {\n return;\n }\n\n var form = $(this);\n var url = form.attr('action');\n FormHelpers.clearPreviousErrors(form);\n $.spinner().start();\n $('form.registration').trigger('login:register', e);\n var dataForm = form.serialize();\n if (RegistrationHelper.isRegistrationModalFlow()) {\n dataForm += '&isModalFlow=true';\n }\n if (RegistrationHelper.isRegistrationModalFlow() && $('.registrationModal-box').attr('data-registration-modal-skip-phone') === 'true') {\n var phoneNumber = $('.registrationModal-box').attr('data-skipped-phone');\n var prefix = $('#registration-form-prefix').val();\n phoneNumber = phoneNumber.substring(prefix.length);\n var phoneNumberText = '&associatedPhoneNumber=' + phoneNumber + '&associatedPrefix=' + prefix;\n dataForm += phoneNumberText;\n }\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: dataForm,\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n if (data.cardError) {\n $('.card-error').html(data.error);\n $('.card-error').removeClass('hide');\n $('.login-form-error-block').html('');\n $('#loyalty-form-cardCode, #loyalty-form-cardPin').addClass('is-invalid-input');\n $('.disabledForm').prop('disabled', true);\n } else if (data.phone2Opt) {\n $('.registerPhoneButton').prop('disabled', true);\n $('.registration-phone-confirm-block').addClass('2OptFlow');\n $('.registration-phone-confirm-block').removeClass('hide');\n $('#registration-form-phone-confirm').attr('required', true);\n $('.login-form-error').html('').removeClass('login-form-error-block');\n $('#reg-phone-error').addClass('hide');\n if (data.error && data.error.length) {\n $('#reg-phone-otp-error').html(data.error)\n .addClass('is-invalid')\n .siblings('.invalid-feedback')\n .show();\n $('#reg-phone-otp-error').addClass('color-alert');\n $('#reg-phone-otp-error').addClass('login-form-error-block');\n $('#reg-phone-otp-error').removeClass('success-block');\n }\n } else {\n $('.card-error').addClass('hide');\n FormHelpers.init(form, data);\n let errorMsg = 'email_or_number_already_registered';\n if (data.fields) {\n FormHelpers.loadFormErrors(form, data.fields);\n if ($('.birthdate-error')) {\n $('.birthdate-error').html(data.birthDateError);\n errorMsg = 'wrong_date_of_birth';\n }\n }\n if ($('.page').data('action') === 'Account-RegistrationPhoneShow') {\n errorMsg = 'inserted_number_different_from_stored_number';\n }\n if ($('.page').data('action') === 'Account-RegistrationFormShow') {\n if ($('#loyaltyRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', 'step4_personal_data', errorMsg);\n _self.fireSpecificEventModeAnalyticsErrorEvent(\n 'registrationLoyaltyStep4', 'loyalty_card', errorMsg, 'phone');\n } else if ($('#socialRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('social_registration', 'step3_personal_data', errorMsg);\n _self.fireSpecificAnalyticsErrorEvent('registerSocialThird', 'social_registration', errorMsg);\n } else {\n _self.fireGenericAnalyticsErrorEvent('registration', 'step3_personal_data', errorMsg);\n _self.fireSpecificAnalyticsErrorEvent('registerThird', 'registration', errorMsg);\n }\n } else {\n if ($('#loyaltyRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', 'step3_phone', errorMsg);\n _self.fireSpecificEventModeAnalyticsErrorEvent(\n 'registrationLoyaltyStep3', 'loyalty_card', errorMsg, 'phone');\n } else if ($('#socialRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('social_registration', 'step2_phone', errorMsg);\n _self.fireSpecificAnalyticsErrorEvent('registerSocialSecond', 'social_registration', errorMsg);\n } else {\n _self.fireGenericAnalyticsErrorEvent('registration', 'step2_phone', errorMsg);\n _self.fireSpecificAnalyticsErrorEvent('registerSecond', 'registration', errorMsg);\n }\n }\n }\n\n if ($('#login-error-label').text() && !data.phone2Opt) {\n $('#reg-phone-error').html(data.error.text())\n .addClass('is-invalid')\n .siblings('.invalid-feedback')\n // .html()\n .show();\n $('#reg-phone-error').addClass('color-alert');\n $('#reg-phone-error').addClass('login-form-error-block');\n $('#reg-phone-error').removeClass('success-block');\n }\n } else {\n if ($(e.currentTarget).hasClass('registration-step-final')) {\n let rememberMe = $('.remember-me-container input#rememberMeTwo').is(':checked');\n let analyticsMode = 'only_registration';\n if (data.error) delete data.error;\n if ($('#loyaltyRegistration').length > 0) {\n analyticsMode = 'profile_loyalty';\n data.type_reg = analyticsMode;\n $('body').trigger('customer:registrationLoyaltyStep4', {\n 'type': 'loyalty_card',\n 'data': data,\n rememberMe\n });\n } else if ($('#socialRegistration').length > 0) {\n $('body').trigger('customer:registerSocialThird', { rememberMe });\n } else {\n analyticsMode = 'only_registration';\n data.type_reg = analyticsMode;\n $('body').trigger('customer:registerThird', {\n 'analyticsMode': analyticsMode,\n rememberMe\n });\n }\n } else if ($(e.currentTarget).hasClass('registration-loyalty')) {\n let analyticsMode = 'fast_flow_with_physical_loyalty card';\n if ($('.page').data('action') === 'Account-Loyalty' || RegistrationHelper.isRegistrationLoyaltyModalFlow()) {\n analyticsMode = 'only_loyalty';\n }\n $('body').trigger('customer:registerLoyalty', analyticsMode);\n } else {\n if ($('#loyaltyRegistration').length > 0) {\n $('body').trigger('customer:registrationLoyaltyStep3', {\n 'type': 'loyalty_card',\n 'eventMode': 'phone'\n });\n } else if ($('#socialRegistration').length > 0) {\n $('body').trigger('customer:registerSocialSecond');\n } else {\n $('body').trigger('customer:registerSecond', {'type': 'registration'});\n }\n }\n if (RegistrationHelper.isRegistrationModalFlow()) {\n var nextStep = $(e.currentTarget).hasClass('registration-step-final') ? 'waiting-room' : 'personal-info';\n var phone = $('#registration-form-phone').val();\n RegistrationHelper.fillPhoneText(phone);\n RegistrationHelper.moveToNextStep(nextStep);\n\n if (nextStep === 'personal-info') {\n $.ajax({\n url: data.redirectUrl,\n type: 'get',\n dataType: 'json',\n data: dataForm,\n success: function (data) {\n RegistrationHelper.fieldsFormPrefill(data);\n },\n error: function (err) {\n if (err.responseJSON) {\n $('#login-error-label').text(err.responseJSON.message).removeClass('hidden');\n } else {\n $('#login-error-label').text(err.statusText).removeClass('hidden');\n }\n }\n });\n }\n } else if (RegistrationHelper.isRegistrationLoyaltyModalFlow()) {\n $('#registrationModal-box').attr('data-registration-modal-stage', 'loyalty-thankyou-page');\n } else {\n location.href = data.redirectUrl;\n }\n // FormHelpers.init(form, data);\n // if (data.fields) {\n // FormHelpers.loadFormErrors(form, data.fields);\n // }\n }\n },\n error: function (data) {\n if ($('#login-error-label').text()) {\n _self.fireGenericAnalyticsErrorEvent('registration', 'step2_phone', 'generic_error');\n _self.fireSpecificAnalyticsErrorEvent('registerSecond', 'registration', 'generic_error');\n } else if ($(e.currentTarget).hasClass('registration-loyalty')) {\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', 'step3_personal_data', 'generic_error');\n _self.fireSpecificAnalyticsErrorEvent('registerSecond', 'loyalty_card', 'generic_error');\n } else {\n _self.fireGenericAnalyticsErrorEvent('registration', 'step3_personal_data', 'generic_error');\n $('body').trigger('customer:registerThird', {\n 'analyticsMode': 'only_registration',\n 'data': {\n 'error': ['generic_error']\n }\n });\n }\n if (data.responseJSON.redirectUrl) {\n window.location.href = data.responseJSON.redirectUrl;\n }\n form.spinner().stop();\n }\n });\n return false;\n });\n\n $('form.registrationStart').submit(function (e) {\n var form = $(this);\n e.preventDefault();\n var url = form.attr('action');\n FormHelpers.clearPreviousErrors(form);\n $.spinner().start();\n $('form.registration').trigger('login:register', e);\n let stateObj = {\n foo: $('#backLinkObj').text()\n };\n history.pushState(stateObj, '', $('#backLink').text());\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n FormHelpers.init(form, data);\n if (data.fields) {\n FormHelpers.loadFormErrors(form, data.fields);\n }\n if (data.bluColor) {\n RegistrationHelper.closeRegistrationOpenLoginInit();\n $('.already-registered-1').removeClass('login-form-error-block');\n $('.already-registered-1').removeClass('color-alert');\n $('.already-registered-1').addClass('is-invalid');\n $('.already-registered-1').addClass('success-block');\n if ($('#loyaltyRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', 'step2_email', 'email_or_number_already_registered');\n _self.fireSpecificEventModeAnalyticsErrorEvent(\n 'registrationLoyaltyStep2', 'loyalty_card', 'email_or_number_already_registered', 'email');\n } else if ($('#socialRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('social_registration', 'step1_email', 'email_or_number_already_registered');\n _self.fireSpecificAnalyticsErrorEvent('registerSocialFirst', 'social_registration', 'email_or_number_already_registered');\n } else {\n _self.fireGenericAnalyticsErrorEvent('registration', 'step1_email', 'email_or_number_already_registered');\n _self.fireSpecificAnalyticsErrorEvent('registerFirst', 'registration', 'email_or_number_already_registered');\n }\n } else {\n if ($('#loyaltyRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', 'step2_email', 'email_or_number_already_registered');\n _self.fireSpecificEventModeAnalyticsErrorEvent(\n 'registrationLoyaltyStep2', 'loyalty_card', 'email_or_number_already_registered', 'email');\n } else if ($('#socialRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('social_registration', 'step1_email', 'email_or_number_already_registered');\n _self.fireSpecificAnalyticsErrorEvent('registerSocialFirst', 'social_registration', 'email_or_number_already_registered');\n } else {\n _self.fireGenericAnalyticsErrorEvent('registration', 'step1_email', 'email_or_number_already_registered');\n _self.fireSpecificAnalyticsErrorEvent('registerFirst', 'registration', 'email_or_number_already_registered');\n }\n }\n if (data.socialRegistrationError) {\n $('#reg-mail-error').addClass('color-alert');\n $('#reg-mail-error').addClass('login-form-error-block');\n $('#reg-mail-error').removeClass('success-block');\n }\n // else {\n // $('.already-registered-1').addClass('login-form-error-block');\n // $('.already-registered-1').addClass('color-alert');\n // $('.already-registered-1').removeClass('is-invalid');\n // $('.already-registered-1').removeClass('success-block');\n // }\n } else {\n if (data.error) delete data.error;\n if ($('#loyaltyRegistration').length > 0) {\n $('body').trigger('customer:registrationLoyaltyStep2', {\n 'type': 'login',\n 'eventMode': 'email',\n 'data': data\n });\n } else if ($('#socialRegistration').length > 0) {\n $('body').trigger('customer:registerSocialFirst', {\n 'type': 'social_registration',\n 'data': data\n });\n } else {\n $('body').trigger('customer:registerFirst', {\n 'type': 'registration',\n 'data': data\n });\n }\n if (RegistrationHelper.isRegistrationModalFlow()) {\n var email = data.registrationFormObj.emailFromForm;\n RegistrationHelper.fillEmailText(email);\n RegistrationHelper.moveToNextStep('phone');\n if (data.hiddenPhonePlaceholder) {\n RegistrationHelper.handleExistingAccount(data);\n }\n } else {\n location.href = data.redirectUrl;\n }\n // FormHelpers.init(form, data);\n // if (data.fields) {\n // FormHelpers.loadFormErrors(form, data.fields);\n // }\n }\n },\n error: function (data) {\n if ($('.loyalty-step1').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', 'step1', 'generic_error');\n } else {\n _self.fireGenericAnalyticsErrorEvent('registration', 'step1', 'generic_error');\n _self.fireSpecificAnalyticsErrorEvent('registerFirst', 'registration', 'generic_error');\n }\n\n if (data.responseJSON.redirectUrl) {\n window.location.href = data.responseJSON.redirectUrl;\n }\n form.spinner().stop();\n }\n });\n return false;\n });\n\n const config = { attributes: true, childList: true, subtree: true };\n function enableRegistrationStartAnalyticsObserver () {\n let targetRegistrationStep1Node = $('form.registrationStart').get(0);\n let registrationStep1Callback = function (mutationsList, observer) {\n let inputSet = new Set();\n let genericEventAlreadyFired = false;\n for (let index = 0; index < mutationsList.length; index++) {\n let mutation = mutationsList[index];\n if (mutation.type === 'attributes' &&\n mutation.target.nodeName === 'INPUT' &&\n mutation.attributeName === 'class' &&\n mutation.target.classList.contains('is-invalid-input')) {\n if (!inputSet.has(mutation.target.id)) {\n let errorMsg = 'unknown_error';\n if (mutation.target.id.includes('email')) {\n errorMsg = 'empty_or_invalid_email';\n } else {\n errorMsg = 'unknown_error';\n }\n if ($('#loyaltyRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', 'step2_email', errorMsg);\n if (!genericEventAlreadyFired) {\n _self.fireSpecificEventModeAnalyticsErrorEvent('registrationLoyaltyStep2', 'loyalty_card', errorMsg, 'email');\n genericEventAlreadyFired = true;\n }\n } else if ($('#socialRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('social_registration', 'step1_email', errorMsg);\n if (!genericEventAlreadyFired) {\n _self.fireSpecificAnalyticsErrorEvent('registerSocialFirst', 'social_registration', errorMsg);\n genericEventAlreadyFired = true;\n }\n } else {\n _self.fireGenericAnalyticsErrorEvent('registration', 'step1_email', errorMsg);\n if (!genericEventAlreadyFired) {\n _self.fireSpecificAnalyticsErrorEvent('registerFirst', 'registration', errorMsg);\n genericEventAlreadyFired = true;\n }\n }\n\n inputSet.add(mutation.target.id);\n }\n }\n }\n registrationStep1Observer.disconnect();\n };\n let registrationStep1Observer = new MutationObserver(registrationStep1Callback);\n registrationStep1Observer.observe(targetRegistrationStep1Node, config);\n }\n\n function enablePhoneRegistrationAnalyticsObserver () {\n var generalTrackingEventAlreadyTriggered = false;\n let targetRegistrationNode = $('form.registration').get(0);\n let registrationCallback = function (mutationsList, observer) {\n let inputSet = new Set();\n for (let index = 0; index < mutationsList.length; index++) {\n if (index === 0) generalTrackingEventAlreadyTriggered = false;\n let mutation = mutationsList[index];\n if (mutation.type === 'attributes' &&\n mutation.target.nodeName === 'INPUT' &&\n mutation.attributeName === 'class' &&\n mutation.target.classList.contains('is-invalid-input')) {\n if (!inputSet.has(mutation.target.id)) {\n let errorMsg = 'unknown_error';\n if (mutation.target.id.includes('phone')) {\n errorMsg = 'empty_or_invalid_phone_number';\n } else if (mutation.target.id.includes('prefix')) {\n errorMsg = 'empty_or_invalid_prefix_number';\n }\n if ($('#loyaltyRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', 'step3_phone', errorMsg);\n if (!generalTrackingEventAlreadyTriggered) {\n _self.fireSpecificEventModeAnalyticsErrorEvent('registrationLoyaltyStep3', 'loyalty_card', errorMsg, 'phone');\n generalTrackingEventAlreadyTriggered = true;\n }\n } else if ($('#socialRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('social_registration', 'step2_phone', errorMsg);\n if (!generalTrackingEventAlreadyTriggered) {\n _self.fireSpecificAnalyticsErrorEvent('registerSocialSecond', 'social_registration', errorMsg);\n generalTrackingEventAlreadyTriggered = true;\n }\n } else {\n _self.fireGenericAnalyticsErrorEvent('registration', 'step2_phone', errorMsg);\n if (!generalTrackingEventAlreadyTriggered) {\n _self.fireSpecificAnalyticsErrorEvent('registerSecond', 'registration', errorMsg);\n generalTrackingEventAlreadyTriggered = true;\n }\n }\n inputSet.add(mutation.target.id);\n }\n }\n }\n registrationObserver.disconnect();\n };\n let registrationObserver = new MutationObserver(registrationCallback);\n registrationObserver.observe(targetRegistrationNode, config);\n }\n\n function enableFinalRegistrationAnalyticsObservers () {\n var generalTrackingEventAlreadyTriggered = false;\n let targetRegistrationNode = $('form.registration').get(0);\n let registrationCallback = function (mutationsList, observer) {\n let inputSet = new Set();\n for (let index = 0; index < mutationsList.length; index++) {\n if (index === 0) generalTrackingEventAlreadyTriggered = false;\n let mutation = mutationsList[index];\n if (mutation.type === 'attributes' &&\n mutation.target.nodeName === 'INPUT' &&\n mutation.attributeName === 'class' &&\n mutation.target.classList.contains('is-invalid-input')) {\n if (!inputSet.has(mutation.target.id)) {\n let errorMsg = 'unknown_error';\n if (mutation.target.id.includes('fname')) {\n errorMsg = mutation.target.value ? 'wrong_firstname' : 'empty_firstname';\n } else if (mutation.target.id.includes('lname')) {\n errorMsg = mutation.target.value ? 'wrong_lastname' : 'empty_lastname';\n } else if (mutation.target.id.includes('password-confirm')) {\n errorMsg = mutation.target.value ? 'mismatch_password' : 'empty_password';\n } else if (mutation.target.id.includes('password')) {\n errorMsg = mutation.target.value ? 'wrong_password' : 'empty_password';\n } else if (mutation.target.id.includes('dpReg')) {\n errorMsg = mutation.target.value ? 'wrong_date_of_birth' : 'empty_date_of_birth';\n }\n\n if ($('#loyaltyRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', 'step4_personal_data', errorMsg);\n if (!generalTrackingEventAlreadyTriggered) {\n _self.fireSpecificAnalyticsErrorEvent('registrationLoyaltyStep4', 'loyalty_card', errorMsg);\n generalTrackingEventAlreadyTriggered = true;\n }\n } else if ($('#socialRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('social_registration', 'step3_personal_data', errorMsg);\n if (!generalTrackingEventAlreadyTriggered) {\n _self.fireSpecificAnalyticsErrorEvent('registerSocialThird', 'social_registration', errorMsg);\n generalTrackingEventAlreadyTriggered = true;\n }\n } else {\n _self.fireGenericAnalyticsErrorEvent('registration', 'step3_personal_data', errorMsg);\n if (!generalTrackingEventAlreadyTriggered) {\n $('body').trigger('customer:registerThird', {\n 'analyticsMode': 'only_registration',\n 'data': {\n 'error': [errorMsg]\n }\n });\n generalTrackingEventAlreadyTriggered = true;\n }\n }\n inputSet.add(mutation.target.id);\n }\n }\n }\n registrationObserver.disconnect();\n };\n let registrationObserver = new MutationObserver(registrationCallback);\n registrationObserver.observe(targetRegistrationNode, config);\n\n let alreadyTriggeredOnceForPrivacy = false;\n\n let targetEmailPrivacyFlagsNode = $('#add-to-email-list-yes').parent().parent().get(0);\n let privacyFlagsCallback = function (mutationsList, observer) {\n let alreadyTriggeredOnce = false;\n for (let index = 0; index < mutationsList.length; index++) {\n let mutation = mutationsList[index];\n if (mutation.type === 'attributes' &&\n mutation.target.nodeName === 'LABEL' &&\n mutation.attributeName === 'class' &&\n mutation.target.classList.contains('is-invalid-input')) {\n if (!alreadyTriggeredOnce && !alreadyTriggeredOnceForPrivacy) {\n if ($('#loyaltyRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', 'step4_personal_data', 'empty_flag_privacy');\n if (!generalTrackingEventAlreadyTriggered) {\n _self.fireSpecificAnalyticsErrorEvent('registrationLoyaltyStep4', 'loyalty_card', 'empty_flag_privacy');\n generalTrackingEventAlreadyTriggered = true;\n }\n } else if ($('#socialRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('social_registration', 'step3_personal_data', 'empty_flag_privacy');\n if (!generalTrackingEventAlreadyTriggered) {\n _self.fireSpecificAnalyticsErrorEvent('registerSocialThird', 'social_registration', 'empty_flag_privacy');\n generalTrackingEventAlreadyTriggered = true;\n }\n } else {\n if (!generalTrackingEventAlreadyTriggered) {\n $('body').trigger('customer:registerThird', {'status': 'error'});\n _self.fireSpecificAnalyticsErrorEvent('registerThirdError', 'registration', 'empty_flag_privacy');\n generalTrackingEventAlreadyTriggered = true;\n }\n _self.fireGenericAnalyticsErrorEvent('registration', 'step3_personal_data', 'empty_flag_privacy');\n }\n alreadyTriggeredOnce = true;\n alreadyTriggeredOnceForPrivacy = true;\n }\n }\n }\n privacyFlagsObserver.disconnect();\n };\n let privacyFlagsObserver = new MutationObserver(privacyFlagsCallback);\n privacyFlagsObserver.observe(targetEmailPrivacyFlagsNode, config);\n\n let targetNewsPrivacyFlagsNode = $('#add-to-personalized-news-list-yes').parent().parent().get(0);\n let privacyNewsFlagsCallback = function (mutationsList, observer) {\n let alreadyTriggeredOnce = false;\n for (let index = 0; index < mutationsList.length; index++) {\n let mutation = mutationsList[index];\n if (mutation.type === 'attributes' &&\n mutation.target.nodeName === 'LABEL' &&\n mutation.attributeName === 'class' &&\n mutation.target.classList.contains('is-invalid-input')) {\n if (!alreadyTriggeredOnce && !alreadyTriggeredOnceForPrivacy) {\n if ($('#loyaltyRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', 'step4_personal_data', 'empty_flag_privacy');\n if (!generalTrackingEventAlreadyTriggered) {\n $('body').trigger('customer:registerThird', {'status': 'error'});\n _self.fireSpecificAnalyticsErrorEvent('registrationLoyaltyStep4', 'loyalty_card', 'empty_flag_privacy');\n generalTrackingEventAlreadyTriggered = true;\n }\n } else if ($('#socialRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('social_registration', 'step3_personal_data', 'empty_flag_privacy');\n if (!generalTrackingEventAlreadyTriggered) {\n $('body').trigger('customer:registerSocialThird', {'status': 'error'});\n _self.fireSpecificAnalyticsErrorEvent('registerSocialThird', 'social_registration', 'empty_flag_privacy');\n generalTrackingEventAlreadyTriggered = true;\n }\n } else {\n if (!generalTrackingEventAlreadyTriggered) {\n _self.fireSpecificAnalyticsErrorEvent('registerThirdError', 'registration', 'empty_flag_privacy');\n generalTrackingEventAlreadyTriggered = true;\n }\n }\n\n alreadyTriggeredOnce = true;\n alreadyTriggeredOnceForPrivacy = true;\n }\n }\n }\n privacyNewsFlagsObserver.disconnect();\n };\n let privacyNewsFlagsObserver = new MutationObserver(privacyNewsFlagsCallback);\n privacyNewsFlagsObserver.observe(targetNewsPrivacyFlagsNode, config);\n\n let targetGenderFlagsNode = $('#gender-1').parent().parent().get(0);\n let genderFlagsCallback = function (mutationsList, observer) {\n let alreadyTriggeredOnce = false;\n for (let index = 0; index < mutationsList.length; index++) {\n let mutation = mutationsList[index];\n if (mutation.type === 'attributes' &&\n mutation.target.nodeName === 'LABEL' &&\n mutation.attributeName === 'class' &&\n mutation.target.classList.contains('is-invalid-input')) {\n if (!alreadyTriggeredOnce) {\n if ($('#loyaltyRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', 'step4_personal_data', 'empty_flag_gender');\n if (!generalTrackingEventAlreadyTriggered) {\n _self.fireSpecificAnalyticsErrorEvent('registrationLoyaltyStep4', 'loyalty_card', 'empty_flag_gender');\n generalTrackingEventAlreadyTriggered = true;\n }\n } else if ($('#socialRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('social_registration', 'step3_personal_data', 'empty_flag_gender');\n if (!generalTrackingEventAlreadyTriggered) {\n _self.fireSpecificAnalyticsErrorEvent('registerSocialThird', 'social_registration', 'empty_flag_gender');\n generalTrackingEventAlreadyTriggered = true;\n }\n } else {\n if (!generalTrackingEventAlreadyTriggered) {\n $('body').trigger('customer:registerThird', {'status': 'error'});\n generalTrackingEventAlreadyTriggered = true;\n }\n _self.fireGenericAnalyticsErrorEvent('registration', 'step3_personal_data', 'empty_flag_gender');\n }\n\n alreadyTriggeredOnce = true;\n }\n }\n }\n genderFlagsObserver.disconnect();\n };\n let genderFlagsObserver = new MutationObserver(genderFlagsCallback);\n genderFlagsObserver.observe(targetGenderFlagsNode, config);\n\n let targetLoyaltyFlagsNode = $('.loyalty-flag').parent().parent().get(0);\n let loyaltyFlagsCallback = function (mutationsList, observer) {\n let alreadyTriggeredOnce = false;\n for (let index = 0; index < mutationsList.length; index++) {\n let mutation = mutationsList[index];\n if (mutation.type === 'attributes' &&\n mutation.target.nodeName === 'LABEL' &&\n mutation.attributeName === 'class' &&\n mutation.target.classList.contains('is-invalid-input')) {\n if (!alreadyTriggeredOnce) {\n if ($('#loyaltyRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('loyalty_card', 'step4_personal_data', 'empty_loyalty_flag');\n if (!generalTrackingEventAlreadyTriggered) {\n _self.fireSpecificAnalyticsErrorEvent('registrationLoyaltyStep4', 'loyalty_card', 'empty_loyalty_flag');\n generalTrackingEventAlreadyTriggered = true;\n }\n } else if ($('#socialRegistration').length > 0) {\n _self.fireGenericAnalyticsErrorEvent('social_registration', 'step3_personal_data', 'empty_loyalty_flag');\n if (!generalTrackingEventAlreadyTriggered) {\n _self.fireSpecificAnalyticsErrorEvent('registerSocialThird', 'social_registration', 'empty_loyalty_flag');\n generalTrackingEventAlreadyTriggered = true;\n }\n } else {\n if (!generalTrackingEventAlreadyTriggered) {\n $('body').trigger('customer:registerThird', {\n 'analyticsMode': 'only_registration',\n 'data': {\n 'error': ['empty_loyalty_flag']\n }\n });\n generalTrackingEventAlreadyTriggered = true;\n }\n _self.fireGenericAnalyticsErrorEvent('registration', 'step3_personal_data', 'empty_loyalty_flag');\n }\n alreadyTriggeredOnce = true;\n }\n }\n }\n loyaltyFlagsObserver.disconnect();\n };\n let loyaltyFlagsObserver = new MutationObserver(loyaltyFlagsCallback);\n if (targetLoyaltyFlagsNode) {\n loyaltyFlagsObserver.observe(targetLoyaltyFlagsNode, config);\n }\n }\n\n if (document.querySelectorAll('form.registrationStart').length > 0) {\n let registrationStartFrom = document.querySelectorAll('form.registrationStart')[0];\n let submitButtonAnalytics = registrationStartFrom.querySelectorAll('button[type=submit]')[0];\n submitButtonAnalytics.addEventListener('click', function (e) {\n enableRegistrationStartAnalyticsObserver();\n });\n }\n\n if ((window.location.pathname.includes('phone') && window.location.pathname.includes('register')) ||\n document.getElementById('registration-form-phone')) {\n let allForms = document.getElementsByTagName('FORM');\n for (let localIndex = 0; localIndex < allForms.length; localIndex++) {\n if (allForms[localIndex].classList.contains('registration')) {\n try {\n let registrationFormAnalytics = allForms[localIndex];\n let submitButtonAnalytics = registrationFormAnalytics.querySelectorAll('button[type=submit]')[0];\n submitButtonAnalytics.addEventListener('click', function (e) {\n enablePhoneRegistrationAnalyticsObserver();\n });\n } catch (e) {}\n }\n }\n }\n\n if (document.getElementsByClassName('button-register-final')[0]) {\n document.getElementsByClassName('button-register-final')[0].addEventListener('click', function (e) {\n enableFinalRegistrationAnalyticsObservers();\n });\n }\n\n $('#registration-form-phone, #registration-form-prefix').on('change', (e) => {\n if ($('.registration-phone-confirm-block').hasClass('2OptFlow')\n && !$('.registration-phone-confirm-block').hasClass('hide')) {\n $('.registerPhoneButton').prop('disabled', false);\n $('#registration-form-phone-confirm').attr('required', false);\n $('.registration-phone-confirm-block').addClass('hide');\n $('#registration-form-phone-confirm').val('');\n $('.login-form-error').html('').removeClass('login-form-error-block');\n $('#reg-phone-error').removeClass('hide');\n }\n });\n }\n\n forgotPassword (modalToClose = false) {\n const self = this;\n $('#password-reset, .password-reset').on('click', function (e) {\n e.preventDefault();\n if (modalToClose) {\n modalToClose.close();\n modalToClose.destroy();\n }\n const htmlContent = $($(this).data('target')).clone().html();\n // create and open confirmation modal\n const modal = newModalFromString(htmlContent, false, ['layer-password-modal']);\n modal.open();\n self.resetPasswordForm();\n $(modal.modalBox).find('.request-password-title').removeClass('hidden');\n $(modal.modalBox).find('.social-request-password-title').addClass('hidden');\n $(modal.modalBox).find('.ico-center-send-mail').addClass('hidden');\n $(modal.modalBox).find('.request-password-body-description').removeClass('hidden');\n $(modal.modalBox).find('.social-request-password-body-description').addClass('hidden');\n $(modal.modalBox).on('click', '.close, .btn-close', (e) => {\n e.preventDefault();\n modal.close();\n modal.destroy();\n });\n });\n };\n\n resetPasswordForm () {\n $('.reset-password-form').submit(function (e) {\n var form = $(this);\n e.preventDefault();\n FormHelpers.clearPreviousErrors(form);\n var url = form.attr('action');\n $.spinner().start();\n $('.reset-password-form').trigger('login:register', e);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n var emailField = $('#reset-password-email');\n var errorContainer = $('#reset-password-email-error');\n if (!data.success) {\n if (data.fields) {\n FormHelpers.loadFormErrors(form, data.fields);\n\n emailField.removeAttr('aria-invalid');\n errorContainer.addClass('invisible');\n\n if (data.fields.loginEmail) {\n errorContainer.removeClass('invisible');\n emailField.attr('aria-invalid', 'true');\n }\n }\n } else {\n $('.invalid-feedback').attr('aria-invalid', 'false');\n $('.request-password-title', form).text(data.receivedMsgHeading);\n $('.social-request-password-title').text(data.receivedMsgHeading);\n $('.request-password-body', form).empty()\n .append('

' + data.receivedMsgBody + '

');\n $('.ico-center-send-mail').removeClass('hidden');\n $('.social-request-password-body-description').addClass('hidden');\n $('.layer-password-modal').addClass('step-2');\n if (!data.mobile) {\n $('#submitEmailButton', form)\n .text(data.buttonText)\n .attr('data-dismiss', 'modal')\n .addClass('btn-close button-secondary');\n } else {\n $('.send-email-btn', form).empty()\n .html('' +\n data.buttonText + ''\n );\n }\n }\n },\n error: function () {\n form.spinner().stop();\n }\n });\n return false;\n });\n };\n\n checkoutLogin () {\n $('form.login').submit(function (e) {\n var form = $(this);\n e.preventDefault();\n var url = form.attr('action');\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n FormHelpers.init(form, data);\n } else {\n location.href = data.redirectUrl;\n }\n },\n error: function (err) {\n form.spinner().stop();\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n }\n }\n });\n return false;\n });\n };\n\n checkoutRegisterForm () {\n $('form.checkout-registration').submit(e => {\n e.preventDefault();\n var form = $(e.currentTarget);\n var url = form.attr('action');\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: data => {\n form.spinner().stop();\n if (!data.success) {\n FormHelpers.init(form, data);\n } else {\n location.href = data.redirectUrl;\n }\n },\n error: err => {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n }\n form.spinner().stop();\n }\n });\n return false;\n });\n };\n\n policyPrivacyFlag () {\n // if ($('#add-to-email-list-no').checked == '') {\n // $('.add-to-personalized-list').prop('disabled', true);\n // $('.add-to-personalized-list').removeAttr('required');\n // }\n\n var form = document.querySelector('form.registration');\n if (!form) {\n return;\n }\n form.addEventListener('change', function () {\n $('.activable-after-change').prop('disabled', false);\n });\n $('.add-to-email').on('change', (e) => {\n initNewsletterAnalyticsBrands();\n let $accordion = $(e.target).closest('.accordion-settings');\n let brandName = $(e.currentTarget).attr('name').split('-')[1];\n if (window.newsletterPreferenceBrands.indexOf(brandName) === -1) {\n window.newsletterPreferenceBrands.push(brandName);\n }\n\n if (e.target.id.indexOf('add-to-email-list-yes') > -1 && e.target.checked) {\n $accordion.find('.add-to-personalized-list').prop('disabled', false);\n if (e.target.value != null && e.target.value) {\n $accordion.find('.add-to-personalized-list').prop('required', true);\n } else {\n $accordion.find('.add-to-personalized-list').removeAttr('required');\n }\n } else {\n $accordion.find('.add-to-personalized-list').prop('checked', false);\n $accordion.find('.add-to-personalized-list').prop('disabled', true);\n $accordion.find('.add-to-personalized-list').removeAttr('required');\n }\n });\n\n function newsletterPrefAnalyticsRegister (e) {\n initNewsletterAnalyticsBrands();\n let brandName = $(e.currentTarget).attr('name').split('-')[1];\n if (window.newsletterPreferenceBrands.indexOf(brandName) === -1) {\n window.newsletterPreferenceBrands.push(brandName);\n }\n }\n\n $('.add-to-email').on('change', newsletterPrefAnalyticsRegister);\n $('.add-to-personalized-list').on('change', newsletterPrefAnalyticsRegister);\n\n $('body').on('click', '.save-button-newsletter-pref', function (e) {\n let newsletterFormData = $('form.newsletter-preference-form').serialize();\n let direktMarketingAgreement = newsletterFormData.indexOf('directMarketingAgreement-INTIMISSIMI=true') > -1;\n let profilingAgreement = newsletterFormData.indexOf('profilingAgreement-INTIMISSIMI=true') > -1;\n $('body').trigger('customer:newsletterPreferencesSave', {\n 'direktMarketingAgreement': direktMarketingAgreement,\n 'profilingAgreement': profilingAgreement,\n 'brands': window.newsletterPreferenceBrands,\n });\n });\n };\n\n editProfileForm () {\n var form2 = document.querySelector('form.edit-profile-form');\n if (form2) {\n form2.addEventListener('change', function () {\n $('.activable-after-change-1').prop('disabled', false);\n });\n }\n let formatPattern = $('.datepickerTriggerElement').data('date-format-pattern');\n\n $('.datepickerTriggerElement').fdatepicker({\n format: formatPattern,\n disableDblClickSelection: true,\n leftArrow: '<<',\n rightArrow: '>>',\n closeIcon: 'X',\n closeButton: false\n }).on('changeDate', function (ev) {\n // Reset error message on date selection\n $('.myaccount-date-picker .login-form-error').text('');\n\n let date = new Date(ev.date.valueOf() + ev.date.getTimezoneOffset() * 60000);\n var datestring = formatDate(date, formatPattern);\n $('#dpReg').val(datestring);\n $('.datepickerTriggerElement').data('date', datestring);\n if ($('.activable-after-change-1')) {\n $('.activable-after-change-1').prop('disabled', false);\n }\n });\n\n if ($('#dpReg').val() !== '') {\n let formattedDate = $('#dpReg').val();\n $('.datepickerTriggerElement').data('date', formattedDate);\n }\n\n const checkPreferencesEnabled = () => {\n if ($('#promotions-1')[0]) {\n if ($('#promotions-1')[0].checked) {\n $('[name=\"profiling\"]').prop('disabled', false);\n } else {\n $('[name=\"profiling\"]').prop('checked', false);\n $('#profiling-2').prop('checked', true);\n $('[name=\"profiling\"]').prop('disabled', true);\n }\n }\n };\n\n checkPreferencesEnabled();\n $('[name=\"promotions\"]').on('change', checkPreferencesEnabled);\n\n $('form.edit-profile-form').submit(function (e) {\n var $form = $(this);\n e.preventDefault();\n var url = $form.attr('action');\n $.spinner().start();\n $('form.edit-profile-form').trigger('profile:edit', e);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: $form.serialize(),\n success: function (e) {\n $form.spinner().stop();\n if (!e.success) {\n FormHelpers.init($form, e);\n // if ($('.phone-error')) {\n // $('.phone-error').html(e.phoneError);\n // }\n // $('#login-form-error-edit').addClass('login-form-error-block');\n } else {\n // $('#login-form-error-edit').removeClass('login-form-error-block');\n location.href = e.redirectUrl;\n }\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n }\n $form.spinner().stop();\n }\n });\n return false;\n });\n };\n\n editPasswordForm () {\n var newPasswordInput = document.getElementById('newPassword');\n var newPasswordConfirmInput = document.getElementById('newPasswordConfirm');\n\n // if both password input fields are present and aren't empty, enable the save button\n if (newPasswordInput && newPasswordConfirmInput) {\n newPasswordInput.addEventListener('input', function () {\n var isPasswordFilled = newPasswordInput.value.length > 0;\n var isPasswordConfirmedFilled = newPasswordConfirmInput.value.length > 0;\n \n $('.activable-after-change-2').prop('disabled', !(isPasswordFilled && isPasswordConfirmedFilled));\n });\n \n newPasswordConfirmInput.addEventListener('input', function () {\n var isPasswordFilled = newPasswordInput.value.length > 0;\n var isPasswordConfirmedFilled = newPasswordConfirmInput.value.length > 0;\n \n $('.activable-after-change-2').prop('disabled', !(isPasswordFilled && isPasswordConfirmedFilled));\n });\n }\n $('form.change-password-form').submit(function (e) {\n e.preventDefault();\n var form = $(this);\n FormHelpers.clearPreviousErrors(form);\n var url = form.attr('action');\n $.spinner().start();\n $('form.change-password-form').trigger('password:edit', e);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n if (data.fields) {\n FormHelpers.loadFormErrors(form, data.fields);\n }\n } else {\n location.href = data.redirectUrl;\n }\n },\n error: function (data) {\n // if (data.responseJSON.redirectUrl) {\n // window.location.href = data.responseJSON.redirectUrl;\n // }\n form.spinner().stop();\n }\n });\n return false;\n });\n };\n\n editEmailForm () {\n var changeEmailForm = document.querySelector('form.change-email-form');\n if (changeEmailForm) {\n changeEmailForm.addEventListener('input', function () {\n if ($('#registration-form-email').val() === $('form.change-email-form').data('initial-value')) {\n $('.activable-after-change-email').prop('disabled', true);\n } else {\n $('.activable-after-change-email').prop('disabled', false);\n }\n });\n }\n var $form3 = $('form.change-email-form');\n $('.activable-after-change-email').on('click', function (e) {\n e.preventDefault();\n $.spinner().start();\n $('.js-change-email-error-msg').addClass('hidden');\n if (!$form3.parsley().validate()) {\n $.spinner().stop();\n return;\n }\n\n // PreSaveNewEmail\n var url = $form3.data('pre-action-url');\n if (!url) {\n $.spinner().stop();\n return;\n }\n\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: $form3.serialize(),\n success: function (data) {\n $.spinner().stop();\n if (!data.success) {\n var errorChangeEmail = '';\n if (data.herokuError) {\n errorChangeEmail = data.errorMessage;\n } else if (data.sfccError) {\n errorChangeEmail = data.errorMessage;\n // Russia\n } else if (data.validDomainError) {\n errorChangeEmail = data.errorMessage;\n }\n $('.js-change-email-error-msg').text(errorChangeEmail);\n $('.js-change-email-error-msg').removeClass('hidden');\n $('#registration-form-email').removeClass('is-valid-input');\n $('#registration-form-email').addClass('is-invalid-input');\n } else {\n // Systems to update\n $('.js-system-to-update').html(data.modalContent);\n\n const htmlContent = $('#editEmailAddressModal').html();\n\n const onChangeEmailPopupClose = () => {\n // Redirect to the account page with info banner\n if (!$('.js-confirmation-message-two').hasClass('hidden')) {\n if ($('.js-confirmation-message-two').data('url-redirect')) {\n window.location.href = $('.js-confirmation-message-two').data('url-redirect');\n }\n }\n };\n\n // create and open confirmation modal\n const modal = newModalFromString(htmlContent, false, [], null, onChangeEmailPopupClose);\n modal.open();\n $(modal.modalBox)\n .find('.close')\n .on('click', function (e) {\n e.preventDefault();\n modal.close();\n });\n\n $('[data-dismiss=\"modal\"]').on('click', function (e) {\n e.preventDefault();\n modal.close();\n });\n\n $('.edit-email-confirmation-btn').click(function (f) {\n $.spinner().start();\n if (!$form3.parsley().validate()) {\n $.spinner().stop();\n return;\n }\n $.ajax({\n url: $form3.attr('action'),\n type: 'post',\n dataType: 'json',\n data: $form3.serialize(),\n success: function (data) {\n if (data.success) {\n $('.js-confirmation-message-one').addClass('hidden');\n $('.js-confirmation-message-two').removeClass('hidden');\n $('.js-confirmation-message-two').data('url-redirect', data.redirectUrl);\n }\n // TODO: Redirect with error message to the Account-Profile\n $.spinner().stop();\n },\n error: function (err) {\n // modal.close();\n if (err.responseJSON && err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n }\n $.spinner().stop();\n }\n });\n });\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n $('form.change-email-form').submit(function (e) {\n e.preventDefault();\n var form = $(this);\n FormHelpers.clearPreviousErrors(form);\n var url = form.attr('action');\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n if (data.fields) {\n FormHelpers.loadFormErrors(form, data.fields);\n }\n } else {\n location.href = data.redirectUrl;\n }\n },\n error: function (data) {\n form.spinner().stop();\n }\n });\n return false;\n });\n\n $('form.confirm-change-email-form').submit(function (e) {\n e.preventDefault();\n $('.change-mail-form-error').empty().addClass('hidden');\n var form = $(this);\n FormHelpers.clearPreviousErrors(form);\n var url = form.attr('action');\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n if (data.errorMessage) {\n $('.change-mail-form-error').html(data.errorMessage).removeClass('hidden');\n }\n } else {\n location.href = data.redirectUrl;\n }\n },\n error: function (data) {\n form.spinner().stop();\n }\n });\n return false;\n });\n\n $('body').on('keydown', '.change-email-input-text', function (e) {\n if (e.keyCode == 13) {\n e.preventDefault();\n if ($('.activable-after-change-email').attr('disabled') || $('.activable-after-change-email').prop('disabled')) {\n return false;\n } else {\n $('.activable-after-change-email').click();\n }\n }\n });\n };\n\n /**\n * Handle loyalty registration flow on MyAccount\n */\n handleMyAccountFlow () {\n // Input values\n var loyalty = $('.loyalty-flag-m').is(':checked');\n var loyaltyPhysicalCard = $('.associate-loyalty-flag-m:checked').val() !== undefined && $('.associate-loyalty-flag-m:checked').val() === 'true';\n var cardValues = $('#loyalty-form-cardCode').val() !== '' && $('#loyalty-form-cardPin').val() !== '';\n var birthDate = $('#dpReg').val() !== '';\n var physicalCardLoyaltyForCurrentCountry = $('.registration-loyalty').data('physical-card');\n\n // Check on input values length\n cardValues = cardValues && $('#loyalty-form-cardCode').val().length >= $('#loyalty-form-cardCode').attr('minlength');\n cardValues = cardValues && $('#loyalty-form-cardPin').val().length >= $('#loyalty-form-cardPin').attr('minlength');\n birthDate = birthDate && $('#dpReg').val().length >= $('.login-datepicker').data('date-format-pattern').length;\n\n // Set default values to containers\n $('.disabledForm').prop('disabled', true);\n $('.block-associate-card').hide();\n $('.my-int-no-loyalty-card-section, .my-int-no-loyalty-bithdate-section').addClass('hidden');\n $('.my-int-no-loyalty-card-section, .js-registrationModal__loyalty__oppositionFinal').addClass('hidden');\n\n // Step 1. Toggles slider\n if (loyalty) {\n\n if(physicalCardLoyaltyForCurrentCountry){\n $('.my-int-no-loyalty-card-section').removeClass('hidden');\n } else{\n $(\"#associate-loyalty-no\").prop(\"checked\", true);\n }\n\n // Step 2a. User has physical card. Show info\n if (loyaltyPhysicalCard) {\n $('.block-associate-card').show();\n }\n\n // Step 2b / Step 3. User has selected either options of loyalty card\n if ($('.associate-loyalty-flag-m').is(':checked')) {\n $('.my-int-no-loyalty-bithdate-section').removeClass('hidden');\n $('.my-int-no-loyalty-card-section, .js-registrationModal__loyalty__oppositionFinal').removeClass('hidden');\n }\n\n // Step 4. If birth date has been filled. Enables opposition's checkbox and CTA submit\n if (birthDate) {\n if (loyaltyPhysicalCard && cardValues && $('.associate-loyalty-flag-m:checked').val() !== undefined) {\n $('.disabledForm').prop('disabled', false);\n } else if (!loyaltyPhysicalCard && $('.associate-loyalty-flag-m:checked').val() !== undefined) {\n $('.disabledForm').prop('disabled', false);\n }\n }\n }\n };\n\n resendActivationEmail () {\n $('body').on('click', '.resend-activation-email', function (e) {\n e.preventDefault();\n var url = $(e.currentTarget).attr('href');\n var email = $(e.currentTarget).data('email');\n const payload = {\n email: email\n };\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: payload,\n success: function (data) {\n $.spinner().stop();\n if (data.success) {\n location.href = data.redirectUrl;\n }\n },\n error: function (data) {\n $.spinner().stop();\n }\n });\n });\n };\n\n socialLoginHandler (fromLayer = false) {\n const _self = this;\n\n $('body').on('socialLogin:handler', function (e, data) {\n var url = $('.socialLoginContainer').data('url');\n if ($('#loginGigya').length) {\n url = $('#loginGigya.socialLoginContainer').data('url');\n }\n $.spinner().start();\n //$('form.registration').trigger('login:register', e);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: data.loginResult.user,\n success: function (data) {\n $.spinner().stop();\n if (!data.success) {\n if (data.sfccRegisteredUser) {\n // switch tab to \"accedi\"\n if ($('.js-link-access').length) {\n $('.js-link-access').click();\n }\n $('.social-login-form-error').empty().html(data.error);\n $('.social-login-form-error').removeClass('hidden');\n\n $('body').trigger('customer:socialRegistration', data);\n _self.fireGenericAnalyticsErrorEvent('social_registration', 'step1_email', 'email_or_number_already_registered');\n $('body').trigger('customer:social_email_already_used', {\n 'type': 'email',\n 'socialName': data.socialName,\n 'errorMsg': 'email_already_registered'\n });\n } else if (data.errorMessage) {\n if ($('.js-link-access').length) {\n $('.js-link-access').click();\n }\n $('.social-login-form-error').empty().html(data.error);\n $('.social-login-form-error').removeClass('hidden');\n if (data.socialLogin) {\n $('body').trigger('customer:socialLogin', data);\n _self.fireGenericAnalyticsErrorEvent('social_login', 'step1_login', 'generic_error');\n }\n }\n } else {\n $('body').trigger('customer:socialRegistration', data);\n localStorage.setItem('socialFirstStepMail', '');\n if (data.socialLogin) {\n $('body').trigger('customer:socialLogin', data);\n }\n if (fromLayer && data.socialLogin && data.rurl !== '6') {\n location.reload();\n } else {\n location.href = data.redirectUrl;\n }\n }\n },\n error: function (data) {\n $.spinner().stop();\n }\n });\n })\n }\n\n ratingAndReviewsTabsHandler () {\n $('body').on('click', '.product-review-container .product-review-category-item', function (e) {\n $('body').trigger('customer:ratingAndReviewsTabsAction', $(e.currentTarget).data('analytics-name'));\n });\n }\n}\n\nconst customer = new Customer();\nexport default customer;\n","import {initProdTileCarousel} from './productTileCarousel';\nimport {forceLockScroll, forceUnlockScroll, preventDefault, genericAjaxCall} from '../util/common';\nexport {initProductTile, initSlotCarousel, closeAllQuickAdd};\n\n// SELECTOR ELEMENT CLASS USED LIST\nconst PREVENT_DEFAULT = '.js-prevent-link';\nconst PRODUCT_GRID_PLP = '.js-plp-productGrid';\nconst PRODUCT_TILE = '.js-prodTile';\nconst QUICKADD_BUTTON = '.js-prodTile-quickAdd-button';\nconst QUICKADD_CLOSE = '.js-prodTile-quickAdd-modal-closeQuickAdd';\nconst QUICKADD_MODAL = '.js-prodTile-quickAdd-modal';\nconst QUICKADD_MODAL_OVERFLOW = '.js-prodTile-quickAdd-modal-overflow';\nconst QUICKADD_MODAL_SLIDER = '.js-quickAdd-modal-container';\nconst QUICKADD_PROCEEDBUTTON = '.js-prodTile-quickAdd-modal-confirmButton';\nconst QUICKADD_SIZEBUTTON = '.js-prodTile-quickAdd-modal-sizes-button';\nconst QUICKADD_SIZEBUTTON_SELECTED = '.js-prodTile-quickAdd-modal-size_selected';\nconst QUICKADD_SIZESELECTED_LABEL = '.js-prodTile-quickAdd-modal-sizeSelected';\n\nlet isOpened = false;\n\n// LIST OF STYLE CLASS USED\nconst STYLE_QUICKADD_SIZEBUTTON_SELECTED =\n 'cc-prodTile-quickAdd-modal-sizes-button_selected js-prodTile-quickAdd-modal-size_selected';\nconst QUICKADD_MODAL_OPEN = 'js-prodTile-quickAdd-modal_open';\n\nfunction initProductTile() {\n if ($('.page').data('action') === 'Search-Show') {\n initOnlyPLP();\n } else {\n initProdTileCarousel();\n $(QUICKADD_BUTTON).off('click').on('click', openQuickAdd);\n $(PRODUCT_TILE).off('click').on('click', PREVENT_DEFAULT, preventDefault);\n }\n\n if ($('.js-suggestedProducts-container').length) {\n initSlotCarousel('.js-suggestedProducts-container');\n }\n\n if ($('.js-completeLook').length) {\n initSlotCarousel('.js-completeLook');\n }\n\n if ($('.js-completePromo').length) {\n initSlotCarousel('.js-completePromo');\n }\n\n $(window).on('resize', onResizeFunction);\n}\n\nfunction initSlotCarousel(containerClassName) {\n $(containerClassName)\n .off('click')\n .on('click', QUICKADD_BUTTON, openQuickAdd)\n .on('click', PREVENT_DEFAULT, preventDefault);\n\n if ($('.js-site-search').hasClass('cc-site-search_open') && !Foundation.MediaQuery.atLeast('large')) {\n $('.js-prodTile-quickAdd-modal').addClass('js-quickAdd-modal-container');\n }\n}\n\nfunction initOnlyPLP() {\n if ($(PRODUCT_GRID_PLP).length > 0) {\n initProdTileCarousel(PRODUCT_GRID_PLP);\n initSlotCarousel(PRODUCT_GRID_PLP);\n removeGridFullBanner();\n }\n}\n\nfunction removeGridFullBanner () {\n $('.cc-gridFullBanner-wrp').each(function (i, element) {\n if ($(element).children().length <= 0) {\n $(element).remove();\n }\n });\n}\n\nfunction openQuickAdd(e) {\n if (e.currentTarget.classList.contains('analytics-sizeBox') &&\n e.currentTarget.classList.contains('js-prodTile-quickAdd-button')) {\n $('body').trigger('product:selectSize', e.currentTarget);\n }\n e.preventDefault();\n e.stopPropagation();\n\n let $this = $(this);\n let url = $(this).data('url');\n let $modal = $(this).siblings(QUICKADD_MODAL);\n let $modalForSlider = $(QUICKADD_MODAL_SLIDER);\n let isCompletePromo = false;\n\n // Needed because we have two modals in position fixed one inside the other\n if ($('.js-site-search').hasClass('cc-site-search_open') && !Foundation.MediaQuery.atLeast('large')) {\n $('.js-site-search').after($modalForSlider);\n }\n\n if ($(this).closest('.js-hpShoppable').length > 0) {\n if (Foundation.MediaQuery.atLeast('large')) {\n openQuickAddShoppable($this, url, $modal);\n return;\n } else {\n $modal = $modalForSlider.first();\n }\n } else if (\n $(this).closest('.cc-emCarouselEditProd').length > 0 &&\n !Foundation.MediaQuery.atLeast('large')\n ) {\n $modal = $modalForSlider.first();\n } else {\n if (\n $(this).closest('.slick-track').length &&\n $modalForSlider.length &&\n !Foundation.MediaQuery.atLeast('large')\n ) {\n $modal = $modalForSlider.first();\n } else if (\n $(this).closest('.cc-completeYourPromo-productCards, .cc-productCarousel-coreMedia').length > 0 &&\n !Foundation.MediaQuery.atLeast('large')\n ) {\n let $quickAddOutsideModal = $('.js-quickAdd-modal-container').eq(0).clone();\n if ($('body > .js-quickAdd-modal-container').length === 0) {\n $('body').prepend($quickAddOutsideModal);\n }\n\n if ($(this).closest('.cc-completeYourPromo-productCards').length > 0) {\n isCompletePromo = true;\n }\n\n $modal = $('body > .js-quickAdd-modal-container');\n }\n }\n\n const analytics = $this.closest('.js-prodTile').find('.analytics.productListingItem').data();\n $modal.data('item_list_id', analytics.item_list_id);\n $modal.data('item_list_name', analytics.item_list_name);\n $modal.data('index', analytics.index);\n\n genericAjaxCall(url, null, null, false).then(function (data) {\n var newDOMModal = $(data).clone();\n $modal.empty().html(newDOMModal);\n\n $modal.slideDown({\n start: function () {\n $modal.css({display: 'flex'}).addClass(QUICKADD_MODAL_OPEN);\n $('body').addClass('veiled-for-small-only');\n if (isCompletePromo) {\n $('body').addClass('veiled-for-small-only_higher');\n }\n },\n complete: function () {\n $modal.on('click', QUICKADD_CLOSE, {modal: $modal}, closeQuickAdd);\n $modal.on('click', QUICKADD_SIZEBUTTON, {modal: $modal}, prepareAddToCart);\n searchSelectedSize($modal);\n if (!Foundation.MediaQuery.atLeast('large')) {\n forceLockScroll();\n // closeDrawerWithGesture($modal); comment for the moment\n }\n },\n });\n });\n}\n\nfunction openQuickAddShoppable($this, url, $modal) {\n if (!isOpened || !$modal.hasClass('quickAdd-opened')) {\n isOpened = true;\n // Handle the button rotation when opens in shoppable image banner\n $this.addClass('cm-rotateQuickAddButton');\n genericAjaxCall(url, null, null, true).then(function (data) {\n var newDOMModal = $(data).clone();\n $modal.empty().html(newDOMModal);\n $modal\n .closest('.cc-emShoppable__productCard')\n .addClass('cc-emShoppable__productCard--opened quickAdd-opened');\n $modal.addClass('cc-customModalOpened');\n $('.cc-emShoppableVideo__productCard:not(.cc-active)').removeClass('cc-emShoppable__productCard--opened quickAdd-opened');\n $('.cc-emShoppableVideo__productCard:not(.cc-active)').find('.js-prodTile-quickAdd-modal').removeClass('cc-customModalOpened');\n $this.on('click', {modal: $modal}, closeQuickAddShoppable);\n $modal.on('click', QUICKADD_SIZEBUTTON, {modal: $modal}, prepareAddToCart);\n searchSelectedSize($modal);\n });\n }\n}\n\nfunction closeQuickAdd(e, $modal) {\n try {\n e.preventDefault();\n } catch (exc) {}\n\n if (!Foundation.MediaQuery.atLeast('large')) {\n forceUnlockScroll();\n }\n\n var modal = $modal ? $modal : e.data.modal;\n\n modal.slideUp({\n complete: function () {\n modal.removeClass(QUICKADD_MODAL_OPEN);\n $('body').removeClass('veiled-for-small-only veiled-for-small-only_higher');\n },\n });\n modal.off('click', QUICKADD_CLOSE).off('click', QUICKADD_SIZEBUTTON);\n modal.find(QUICKADD_PROCEEDBUTTON).off('click');\n}\n\nfunction closeQuickAddShoppable(e) {\n try {\n e.preventDefault();\n e.stopPropagation();\n } catch (exc) {}\n\n let $modal = e.data.modal;\n isOpened = false;\n // Handle the button rotation when closes in shoppable image banner\n const closeQuickButton = $(e.currentTarget);\n if (closeQuickButton.hasClass('cm-rotateQuickAddButton')) {\n closeQuickButton.removeClass('cm-rotateQuickAddButton');\n }\n\n $modal\n .closest('.cc-emShoppable__productCard')\n .removeClass('cc-emShoppable__productCard--opened quickAdd-opened');\n $modal.removeClass('cc-customModalOpened');\n $(QUICKADD_BUTTON).off('click');\n $modal.off('click', QUICKADD_CLOSE).off('click', QUICKADD_SIZEBUTTON);\n $modal.find(QUICKADD_PROCEEDBUTTON).off('click');\n}\n\nfunction closeDrawerWithGesture(modal) {\n var modalContainer = modal;\n\n const scrollElement = modalContainer.find(QUICKADD_MODAL_OVERFLOW)[0];\n\n var hammertime = new Hammer(modalContainer[0]);\n hammertime.get('swipe').set({direction: Hammer.DIRECTION_VERTICAL});\n hammertime.get('pan').set({direction: Hammer.DIRECTION_VERTICAL});\n\n const isScrollable = scrollElement.scrollHeight > scrollElement.clientHeight;\n\n var startY,\n scrollTop = 0;\n\n if (isScrollable) {\n let actionStart = false;\n hammertime.on('panstart', function (e) {\n actionStart = true;\n startY = e.deltaY - scrollElement.offsetTop;\n scrollTop = scrollElement.scrollTop;\n });\n hammertime.on('panend', function (e) {\n actionStart = false;\n });\n hammertime.on('panmove', function (e) {\n if (!actionStart) {\n return;\n }\n const y = e.deltaY - scrollElement.offsetTop;\n const scroll = y - startY;\n scrollElement.scrollTop = scrollTop - scroll;\n });\n }\n\n hammertime.on('swipedown', function (e) {\n if (isScrollable && (scrollElement.scrollTop !== 0 || scrollTop > 30)) {\n return;\n }\n\n closeQuickAdd(e, modal);\n hammertime.off('swipedown panmove panend panstart').destroy();\n });\n}\n\n/**\n * function for close all the quickadd open with screen device is in large breakpoint\n */\nfunction closeAllQuickAdd() {\n let allQAopen = $('.' + QUICKADD_MODAL_OPEN);\n if (allQAopen.length > 0) {\n allQAopen.each(function () {\n closeQuickAdd(null, $(this));\n });\n }\n}\n\nfunction searchSelectedSize($modal) {\n var selectSize = $modal.find(QUICKADD_SIZEBUTTON_SELECTED);\n if (selectSize.length) {\n $modal.find(QUICKADD_SIZESELECTED_LABEL).empty().html(selectSize.data('name'));\n }\n}\n\nfunction prepareAddToCart(e) {\n var sizeButton = $(this);\n if (sizeButton.hasClass('notifyMe')) {\n return;\n }\n e.data.modal.find(QUICKADD_SIZEBUTTON).removeClass(STYLE_QUICKADD_SIZEBUTTON_SELECTED);\n sizeButton.addClass(STYLE_QUICKADD_SIZEBUTTON_SELECTED);\n\n const prepareData = {\n form: {\n pid: sizeButton.data('pid'),\n quantity: 1,\n GTMItemListName: e.data.modal.data('item_list_name'),\n GTMItemListId: e.data.modal.data('item_list_id'),\n GTMIndex: e.data.modal.data('index')\n },\n addToCartUrl: sizeButton.data('url'),\n modal: e.data.modal,\n $productContainer: sizeButton.closest('.js-prodTile')\n };\n\n searchSelectedSize(e.data.modal);\n\n if (Foundation.MediaQuery.atLeast('large')) {\n // desktop version\n makeAddToCart({data: prepareData});\n } else {\n // mobile version\n e.data.modal\n .find(QUICKADD_PROCEEDBUTTON)\n .attr('disabled', false)\n .on('click', prepareData, makeAddToCart);\n }\n}\n\nfunction makeAddToCart(e) {\n let $modal = e.data.modal;\n var dataValue = e.data;\n genericAjaxCall(dataValue.addToCartUrl, 'POST', dataValue.form).then(function (data) {\n if (data.error === false) {\n $('body').trigger('product:didChangeSizeQuickAddToCart', {\n ...data,\n form: dataValue.form,\n $productContainer: dataValue.$productContainer\n });\n\n $('body').trigger('product:afterAddToCart', {\n ...data,\n form: dataValue.form,\n $productContainer: dataValue.$productContainer,\n });\n handlePostCartAdd(data);\n\n if ($modal.closest('.js-hpShoppable').length > 0) {\n if (Foundation.MediaQuery.atLeast('large')) {\n closeQuickAddShoppable(e);\n return;\n }\n }\n\n closeAllQuickAdd();\n }\n });\n}\n\nfunction handlePostCartAdd(response) {\n $('body').trigger('count:update', response);\n // show add to cart toast\n if (response.error) {\n return;\n }\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
');\n }\n if ($('.page[data-action=\"Cart-Show\"]').length > 0) {\n if (history.scrollRestoration) {\n history.scrollRestoration = 'manual';\n }\n $('html').animate({scrollTop: 0}, 500);\n }\n}\n\nfunction onResizeFunction() {\n closeAllQuickAdd();\n forceUnlockScroll();\n}\n","export default function () {\n // QuickView\n $('.js-carousel-select-color-quickview').slick({\n slidesToShow: 6,\n slidesToScroll: 2,\n infinite: false,\n variableWidth: true,\n responsive: [\n {\n breakpoint: 769,\n settings: {\n slidesToShow: 10,\n slidesToScroll: 2\n }\n },\n {\n breakpoint: 640,\n settings: {\n slidesToShow: 6,\n slidesToScroll: 2\n }\n }\n ]\n\n });\n}\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","import FormHelpers from '../util/form';\nimport {newModalFromString} from '../components/modal';\nimport Customer from './customer';\nimport Plugins from 'util/plugins';\n\nclass RegistrationHelper {\n constructor () {\n this.currentStage = 'email';\n }\n\n modalRegistrationInit () {\n var _self = this;\n $('.js-modal-registration').on('click', function (e) {\n e.preventDefault();\n const socialLogin = $(this).closest('.tingle-modal-box__content').find('.js-gigya-login-wrp').clone();\n _self.closeLoginModal();\n let url = $('#registrationModalURL').data('url');\n if (!url) {\n console.error('Missing URL for AJAX call');\n return;\n }\n $.ajax(url).then(data => {\n var modal = newModalFromString(\n data, false, ['layer-login-modal', 'cc-layer-login', 'cc-registrationModal', 'wrapperModalLogin'], null\n );\n modal.open();\n $('.tingle-modal-box').addClass('rightModalAttribute');\n $('.registration-modal').addClass('open');\n $(modal.modalBox)\n .find('.close-button-info')\n .on('click', function () {\n modal.close();\n });\n $('#gender_chosen').remove();\n Plugins.init();\n FormHelpers.init();\n Customer.accountRegisterForm();\n Customer.accountLoyaltyForm();\n _self.buttonSubmissionInit();\n _self.buttonBackInit();\n _self.datePickerInit();\n _self.updateButtonStatusInit();\n _self.singleNumberOTPinput();\n _self.shiftFieldWhileTypingInit();\n if ($('.js-gigya-registration-wrp .gigyaLoginCell').length < 1) {\n $('.js-gigya-registration-wrp').append(socialLogin);\n }\n _self.moveToNextStep('email');\n });\n });\n };\n\n modalLoyaltyRegistrationInit () {\n var _self = this;\n $('.js-modal-loyalty-registration, .js-modal-loyalty-registration-fake').on('click', function (e) {\n e.preventDefault();\n _self.closeLoginModal();\n let url = $('#registrationLoyaltyModalURL').data('url');\n if (!url) {\n console.error('Missing URL for AJAX call');\n return;\n }\n $.ajax(url).then(data => {\n var modal;\n const onClose = () => {\n location.reload();\n };\n modal = newModalFromString(data, false, ['layer-login-modal', 'cc-layer-login', 'cc-registrationModal', 'cc-registrationModal--loyalty', 'wrapperModalLogin'], null, onClose);\n modal.open();\n $('.tingle-modal-box').addClass('rightModalAttribute');\n $('.registration-loyalty-modal').addClass('open');\n $('.js-returnOpen-loyaltyPopup .js-returnOpen-loyaltyPopupCloseIcon').trigger('click');\n $(modal.modalBox)\n .find('.close-button-info')\n .on('click', function () {\n modal.close();\n });\n _self.datePickerInit();\n Customer.accountRegisterForm();\n Customer.accountLoyaltyForm();\n _self.proceedToRegistrationLoyaltyInit();\n _self.buttonBackInit();\n _self.moveToNextStep('content');\n });\n });\n }\n\n isNewRegistrationActive () {\n return $('#isNewRegistrationActive').val() === 'true';\n }\n\n isRegistrationModalFlow () {\n return $('.registration-modal').hasClass('open');\n }\n\n isRegistrationLoyaltyModalFlow () {\n return $('.registration-loyalty-modal').hasClass('open');\n }\n\n isLoyaltyAvailable () {\n return $('#isLoyaltyAvailable').val() === 'true';\n }\n\n moveToNextStep (step) {\n if (step === 'phone' && $('.registrationModal-box').attr('data-registration-modal-skip-phone') === 'true') {\n step = 'personal-info';\n }\n $('.registrationModal-box').attr('data-registration-modal-stage', step);\n $('#login-warn-label').addClass('hidden');\n $('#registration-form-phone').attr('placeholder', '');\n }\n\n handleExistingAccount (data) {\n $('#login-warn-label').text(data.warn);\n $('#login-warn-label').removeClass('hidden');\n $('#registration-form-phone').attr('placeholder', data.hiddenPhonePlaceholder);\n }\n\n handleCustomerInfo (customerInfo) {\n var prefix = $('#registration-form-prefix').val();\n var gender = customerInfo.gender;\n var mobileNumber = customerInfo.mobileNumber;\n var genderMap = { 'M': '1', 'F': '2', 'X': '3', 'Y': '4' };\n gender = genderMap[gender.toUpperCase()] || '1';\n mobileNumber = mobileNumber.substring(prefix.length);\n $('#registration-form-email').val(customerInfo.email);\n $('#registration-form-phone').val(mobileNumber);\n $('#registration-form-fname').val(customerInfo.firstName);\n $('#registration-form-lname').val(customerInfo.lastName);\n $('#registration-form-email').parent('.label-inside').addClass('focused');\n $('#registration-form-phone').parent('.label-inside').addClass('focused');\n $('#registration-form-fname').parent('.label-inside').addClass('focused');\n $('#registration-form-lname').parent('.label-inside').addClass('focused');\n $('#gender-' + gender).trigger('click');\n\n this.fillEmailText(customerInfo.email);\n this.fillPhoneText(customerInfo.mobileNumber);\n }\n\n fillEmailText (email) {\n $('.email-label').text(email);\n }\n\n fillPhoneText (phone) {\n $('.phone-label').text(phone);\n }\n\n fieldsFormPrefill (data) { // MEC-30353\n\n if (data.fieldsForm.loyalty.hide === true) { // At the moment, only registration where a potential customer already has loyalty.\n if (data.fieldsForm.firstName.value) {\n $('#registration-form-fname').val(data.fieldsForm.firstName.value); // First name \n if (data.prefillCustomerData) {\n $('#registration-form-fname').attr('readonly', 'readonly');\n }\n }\n\n if (data.fieldsForm.lastName.value) {\n $('#registration-form-lname').val(data.fieldsForm.lastName.value); // Last name\n if (data.prefillCustomerData) {\n $('#registration-form-lname').attr('readonly', 'readonly');\n }\n }\n\n // Gender \n if (data.fieldsForm.gender.value === 'M') {\n $('#gender option[value=\"1\"]').prop('selected', true); // MALE\n $('#gender').trigger('chosen:updated');\n } else if (data.fieldsForm.gender.value === 'F') {\n $('#gender option[value=\"2\"]').prop('selected', true); // FEMALE\n $('#gender').trigger('chosen:updated');\n } else if (data.fieldsForm.gender.value === 'X') {\n $('#gender option[value=\"3\"]').prop('selected', true); // OTHER\n $('#gender').trigger('chosen:updated');\n } else if (data.fieldsForm.gender.value === 'U') {\n $('#gender option[value=\"4\"]').prop('selected', true); // PREFER NOT TO SAY\n $('#gender').trigger('chosen:updated');\n }\n\n if (data.fieldsForm.loyalty.hide) {\n $('.cc-registrationModal__loyalty').addClass('hidden'); // Loyalty box\n }\n\n if (data.prefillPrivacyFlag) {\n $('.prefill-privacy-flag').removeClass('hidden'); // Message about already given privacy consents\n \n if (data.fieldsForm.directMarketingAgreement.value) {\n $('#add-to-email-list-yes').prop('checked', true); // YES - Newsletter\n \n $('.js-personalized-news-container').removeClass('transparent'); // Newsletter personalized - box opacity\n $('#add-to-personalized-news-list-no').removeAttr('disabled');\n $('#add-to-personalized-news-list-yes').removeAttr('disabled');\n \n if (data.fieldsForm.profilingAgreement.value) {\n $('#add-to-personalized-news-list-yes').prop('checked', true); // YES - Newsletter personalized\n } else {\n $('#add-to-personalized-news-list-no').prop('checked', true); // NO - Newsletter personalized\n }\n\n } else {\n $('#add-to-email-list-no').prop('checked', true); // NO - Newsletter\n $('#add-to-personalized-news-list-no').prop('checked', true); // NO - Newsletter personalized\n }\n }\n\n $('.registrationModal-box').attr('data-registration-modal-stage-for-a-loyalty-user', 'true');\n }\n }\n\n fieldsFormClear () {\n \n $('#registration-form-fname').val(''); // First name\n $('#registration-form-lname').val(''); // Last name\n\n $('#gender option[value=\"\"]').prop('selected', true); // Gender \n $('#gender').trigger('chosen:updated');\n\n $('.cc-registrationModal__loyalty').removeClass('hidden'); // Loyalty box\n\n $('.prefill-privacy-flag').addClass('hidden'); // Message about already given privacy consents\n\n $('#add-to-email-list-yes').prop('checked', false); // YES - Newsletter\n $('#add-to-email-list-no').prop('checked', false); // NO - Newsletter\n\n $('.js-personalized-news-container').addClass('transparent'); // Newsletter personalized - box opacity\n \n $('#add-to-personalized-news-list-yes').prop('checked', false); // YES - Newsletter personalized \n $('#add-to-personalized-news-list-yes').attr('disabled','disabled');\n $('#add-to-personalized-news-list-no').prop('checked', false); // NO - Newsletter personalized\n $('#add-to-personalized-news-list-no').attr('disabled', 'disabled');\n \n $('.registrationModal-box').removeAttr('data-registration-modal-stage-for-a-loyalty-user'); // to remove all occurences, if all types of users get their data prefilled\n }\n\n buttonSubmissionInit () {\n var _self = this;\n $('.js-register-otp').on('click', function (e) {\n e.preventDefault();\n $.spinner().start();\n var email = $('#registration-form-email').val();\n var otpCodeInput = $('#otp-code-input-1').val() + $('#otp-code-input-2').val() + $('#otp-code-input-3').val() + $('#otp-code-input-4').val() + $('#otp-code-input-5').val();\n let url = $(e.currentTarget).data('registration-otp-url');\n let formData = {\n email: email,\n otpCodeInput: otpCodeInput\n };\n $.ajax({\n url: url,\n type: 'GET',\n data: formData,\n success: function (data) {\n if (data.unmatchOtp) {\n $('.wrong-opt-inserted').removeClass('hidden');\n $('.expired-opt-inserted').addClass('hidden');\n $('body').trigger('analytics:registerConfirmOptin', { 'error': true });\n $.spinner().stop();\n return;\n } else if (data.expiredOtp) {\n $('.expired-opt-inserted').removeClass('hidden');\n $('.wrong-opt-inserted').addClass('hidden');\n $('body').trigger('analytics:registerConfirmOptin', { 'error': true });\n $.spinner().stop();\n return;\n } else if (data.alreadyRegistered) {\n $('.expired-opt-inserted').addClass('hidden');\n $('.wrong-opt-inserted').addClass('hidden');\n _self.closeRegistrationOpenLoginRegistered();\n $.spinner().stop();\n return;\n }\n $('.expired-opt-inserted').addClass('hidden');\n $('.wrong-opt-inserted').addClass('hidden');\n $('body').trigger('analytics:registerConfirmOptin', { 'error': false });\n _self.loginAfterRegistration();\n if ($('.page').data('action') === 'Cart-Show') {\n location.reload();\n }\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n }\n\n buttonBackInit () {\n var _self = this;\n $('.js-back-step-arrow').on('click', function (e) {\n var $registrationModal = $('.registrationModal-box');\n var currentStep = $registrationModal.attr('data-registration-modal-stage');\n switch (currentStep) {\n case 'email':\n case 'email_only' :\n _self.closeRegistrationOpenLogin();\n break;\n case 'phone' :\n $registrationModal.attr('data-registration-modal-stage', 'email');\n break;\n case 'personal-info' :\n if ($('.registrationModal-box').attr('data-registration-modal-skip-phone') === 'true') {\n $registrationModal.attr('data-registration-modal-stage', 'email');\n } else {\n $registrationModal.attr('data-registration-modal-stage', 'phone');\n }\n\n if ($('.registrationModal-box').attr('data-registration-modal-stage-for-a-loyalty-user')) {\n _self.fieldsFormClear();\n }\n\n break;\n case 'waiting-room' :\n $registrationModal.attr('data-registration-modal-stage', 'personal-info');\n break;\n case 'registration' :\n $registrationModal.attr('data-registration-modal-stage', 'content');\n break;\n }\n });\n }\n\n closeRegistrationOpenLoginInit () {\n var _self = this;\n if (_self.isRegistrationModalFlow()) {\n $('.js-close-registration-open-login').on('click', function (e) {\n e.preventDefault();\n _self.closeRegistrationOpenLogin();\n });\n $('.js-close-registration-open-forgot').on('click', function (e) {\n e.preventDefault();\n _self.forgotPassword(e);\n });\n }\n }\n\n datePickerInit () {\n var _self = this;\n let formatPattern = $('.datepickerTriggerElement').data('date-format-pattern');\n\n $('.datepickerTriggerElement').fdatepicker({\n format: formatPattern,\n disableDblClickSelection: true,\n leftArrow: '<<',\n rightArrow: '>>',\n closeIcon: 'X',\n closeButton: false\n }).on('changeDate', function (ev) {\n let date = new Date(ev.date.valueOf() + ev.date.getTimezoneOffset() * 60000);\n var datestring = _self.formatDate(date, formatPattern);\n $('#dpReg').val(datestring);\n $('.datepickerTriggerElement').data('date', datestring);\n $('.disabledForm').prop('disabled', false);\n });\n }\n\n proceedToRegistrationLoyaltyInit () {\n $('.js-proceed-to-loyalty-modal').on('click', function () {\n $('body').trigger('analytics:proceedToLoyaltyModal');\n $('.modal-loyalty-registration-flow-custom .registrationModal-box').attr('data-registration-modal-stage', 'registration');\n });\n }\n\n loginAfterRegistration () {\n var url = $('form.login').attr('action');\n var email = $('#registration-form-email').val();\n var password = $('#registration-form-password').val();\n var csrfToken = $('input[name=\"csrf_token\"]').val();\n var rememberMeChecked = $('#rememberMe').prop('checked') ? 'on' : null;\n var formData = {\n loginEmail: email,\n loginPassword: password,\n csrf_token: csrfToken,\n loginRememberMe: rememberMeChecked\n };\n $.spinner().start();\n\n // $('form.login').trigger('login:submit', e);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: formData,\n success: function (data) {\n $.spinner().stop();\n if (!data.success) {\n } else {\n $('form.login').trigger('login:success', data);\n location.reload();\n }\n },\n error: function (data) {\n if (data.responseJSON.redirectUrl) {\n window.location.href = data.responseJSON.redirectUrl;\n } else {\n $('form.login').trigger('login:error', data);\n $.spinner().stop();\n }\n }\n });\n return false;\n }\n\n formatDate (date, formatPattern) {\n if (formatPattern === 'dd-mm-yyyy') {\n return ('0' + date.getDate()).slice(-2) + '-' + ('0' + (date.getMonth() + 1)).slice(-2) + '-' +\n date.getFullYear();\n } else if (formatPattern === 'mm-dd-yyyy') {\n return ('0' + (date.getMonth() + 1)).slice(-2) + '-' + ('0' + date.getDate()).slice(-2) + '-' +\n date.getFullYear();\n } else if (formatPattern === 'yyyy年mm月dd日') {\n var dateParsed = (date.getFullYear() + '年' + ('0' + (date.getMonth() + 1)).slice(-2) + '月' + ('0' + date.getDate()).slice(-2) + '日');\n return dateParsed;\n }\n }\n\n closeRegistrationOpenLogin () {\n $('.close-button-info').trigger('click');\n $('.js-layer-login').first().trigger('click');\n }\n\n closeRegistrationOpenLoginRegistered () {\n $('.close-button-info').trigger('click');\n $('.js-layer-login').first().trigger('click');\n $('.gigyaLoginCell, .social-login-account-accept, .or-divider, .js-loginPopupFooter, .login-popup-spacer, .js-original-title').addClass('hidden');\n $('.button-login-form').css({'marginBottom': '0'});\n $('.js-layerLoginConfirmRegister').removeClass('hidden');\n }\n\n singleNumberOTPinput () {\n $('.otp-code-input-field').on('input', function () {\n var sanitizedInput = $(this).val().replace(/[^0-9]/g, '');\n sanitizedInput = sanitizedInput.substring(0, 1);\n $(this).val(sanitizedInput);\n });\n }\n\n shiftFieldWhileTypingInit () {\n $('.otp-code-input-field').on('input', function () {\n var maxLength = parseInt($(this).attr('maxlength'));\n var currentInputIndex = $('.otp-code-input-field').index(this);\n\n if ($(this).val().length === maxLength) {\n // Move to the next input field if available\n var nextInputIndex = currentInputIndex + 1;\n var nextInput = $('.otp-code-input-field').eq(nextInputIndex);\n\n if (nextInput.length) {\n nextInput.focus();\n }\n }\n });\n\n $('.otp-code-input-field').on('keyup', function (e) {\n var currentInputIndex = $('.otp-code-input-field').index(this);\n\n if (e.keyCode === 8 && $(this).val().length === 0) {\n // Move to the previous input field if available\n var prevInputIndex = currentInputIndex - 1;\n var prevInput = $('.otp-code-input-field').eq(prevInputIndex);\n if (prevInput.length) {\n prevInput.focus();\n }\n }\n });\n }\n\n updateButtonStatus () {\n var fname = $('#registration-form-fname').val();\n var lname = $('#registration-form-lname').val();\n var password = $('#registration-form-password').val();\n var confirmPassword = $('#registration-form-password-confirm').val();\n\n var allFieldsFilled = fname !== '' && lname !== '' && password !== '' && confirmPassword !== '';\n\n if (allFieldsFilled) {\n $('.register-form-button').prop('disabled', false);\n } else {\n $('.register-form-button').prop('disabled', true);\n }\n }\n\n updateButtonStatusInit () {\n var _self = this;\n $('#registration-form-fname, #registration-form-lname, #registration-form-password, #registration-form-password-confirm').on('input change', function () {\n _self.updateButtonStatus();\n });\n $('#registration-form-email').on('input change', function () {\n var isEmailFilled = $('#registration-form-email').val() !== '';\n $('.register-cta').prop('disabled', !isEmailFilled);\n });\n $('#registration-form-phone').on('input change', function () {\n var isPhoneFilled = $('#registration-form-phone').val() !== '';\n $('.registerPhoneButton').prop('disabled', !isPhoneFilled);\n });\n }\n\n closeLoginModal () {\n $('.layer-login-modal .js-close-login-popup').trigger('click');\n }\n\n isUserLoggedWaitingForLoyalty () {\n return $('.js-modal-loyalty-registration-fake').val() === 'user-is-logged';\n }\n\n isUserLoyaltyForThisBrand (customerFidelitySubscriptions) {\n if (customerFidelitySubscriptions.length === 0) {\n return false;\n }\n var url = window.location.href;\n for (var i = 0; i < customerFidelitySubscriptions.length; i++) {\n var subscriptionNodeBrandCode = (customerFidelitySubscriptions[i].subscriptionNodeBrandCode).toLowerCase();\n var isLoyaltyForThisBrand = url.indexOf(subscriptionNodeBrandCode) > -1;\n if (isLoyaltyForThisBrand) {\n return true;\n }\n }\n return false;\n }\n\n forgotPassword (e) {\n $('.close-button-info').trigger('click');\n e.preventDefault();\n const htmlContent = $('#requestPasswordResetModal').clone().html();\n // create and open confirmation modal\n const modal = newModalFromString(htmlContent, false, ['layer-password-modal']);\n modal.open();\n Customer.resetPasswordForm();\n $(modal.modalBox).find('.request-password-title').removeClass('hidden');\n $(modal.modalBox).find('.social-request-password-title').addClass('hidden');\n $(modal.modalBox).find('.ico-center-send-mail').addClass('hidden');\n $(modal.modalBox).find('.request-password-body-description').removeClass('hidden');\n $(modal.modalBox).find('.social-request-password-body-description').addClass('hidden');\n $(modal.modalBox).on('click', '.close, .btn-close', (e) => {\n e.preventDefault();\n modal.close();\n modal.destroy();\n });\n };\n}\n\nconst registrationHelper = new RegistrationHelper();\nexport default registrationHelper;\n","export class Plugins {\n constructor () {\n this.select = 'select:not(default)';\n this.forms = 'form[data-validate]';\n }\n\n init () {\n // svg4everybody(); // eslint-disable-line\n this.foundation();\n this.validator();\n }\n\n foundation () {\n $(document).foundation();\n }\n\n validator () {\n if (!$(this.forms).length) return;\n\n window.Parsley.addValidator('requiredOptionTrue', {\n validateString: function (value) {\n return value === 'true';\n },\n excluded: '[disabled]',\n messages: {\n en: window.Resources && window.Resources.payments ? window.Resources.payments.mandatoryField : ''\n }\n });\n\n $(this.forms).each((i, form) => {\n $(form).parsley({\n errorClass: 'is-invalid-input',\n successClass: 'is-valid-input',\n errorsWrapper: '
',\n errorTemplate: '',\n focus: 'none'\n }).on('field:error', e => {\n $('.login-form-error').empty();\n $('.login-form-error').removeClass('login-form-error-block');\n\n if (e.$element.closest('.form-group').hasClass('error-inside')) {\n const error = e.$element.closest('.form-group').find('.errors-list');\n error.insertAfter(e.$element.closest('.form-group').find('label').last());\n }\n if (e.$element.parents('label').hasClass('label-inside')) {\n const error = e.$element.parents('label').find('.errors-list');\n error.insertAfter(e.$element.parents('label'));\n }\n if (e.$element.hasClass('gender')) {\n $('html, body').animate({\n scrollTop: 0\n });\n }\n const label = e.$element.parents('.form-group').find('label');\n if(!label.hasClass('dont-apply-error')) {\n label.removeClass('is-valid-label').addClass('is-invalid-label').addClass('is-invalid-input');\n }\n $(form).find('.login-form-error').html($('#login-error-fields').html());\n $(form).find('.login-form-error').addClass('login-form-error-block');\n $(form).find('#login-form-password').val('');\n\n if ($(form).find('#reg-phone-error')) {\n $(form).find('#reg-phone-error').html($('#login-error-fields').text());\n }\n }).on('field:success', e => {\n e.$element.parents('label').removeClass('is-invalid-label').addClass('is-valid-label');\n if (e.$element[0].type == 'email' && e.$element[0].className == 'is-invalid-input') {\n $('.login-form-error').empty();\n $('.login-form-error').removeClass('login-form-error-block');\n e.$element.parsley().reset();\n }\n });\n\n $(form).find('input').on('focus', (e) => {\n const $element = $(e.currentTarget);\n if ($element.closest('.form-group').hasClass('error-inside')) {\n $element.closest('.form-group').find('.errors-list').empty();\n }\n\n $element.parents('label').find('.errors-list').empty();\n $element.parents('label').addClass('is-valid-label').removeClass('is-invalid-label');\n $element.removeClass('is-invalid-input').addClass('is-valid-input');\n\n if ($('.page').data('action') === 'Account-RegistrationFormShow') {\n $element.siblings('label').addClass('is-valid-label').removeClass('is-invalid-label');\n }\n });\n });\n }\n}\n\nconst plugins = new Plugins();\nexport default plugins;\n","export {initProdTileCarousel, unslickProdTileCarousel};\n\nconst IMAGE_CONTAINER_CAROUSEL_CLASS = '.js-prodTile-imageContainer-carousel';\n\nfunction initProdTileCarousel (containerClass) {\n const $tileCarousel = containerClass\n ? $(containerClass + ' ' + IMAGE_CONTAINER_CAROUSEL_CLASS)\n : $(IMAGE_CONTAINER_CAROUSEL_CLASS);\n\n if ($tileCarousel) {\n loadLazyVideo();\n $tileCarousel.on('init', function () {\n $(this).find('.slick-arrow').addClass('js-prevent-link');\n $(this).find('.slick-dots').addClass('js-prevent-link');\n\n var previousLabel = $('.js-fetch-slick-previous-label').data('label');\n $(this).find('.slick-arrow.slick-prev').attr('aria-label', previousLabel);\n var nextLabel = $('.js-fetch-slick-next-label').data('label');\n $(this).find('.slick-arrow.slick-next').attr('aria-label', nextLabel);\n });\n $tileCarousel.slick({\n lazyLoad: 'ondemand',\n draggable: true,\n dots: true,\n accessibility: false,\n arrows: true,\n responsive: [\n {\n breakpoint: 1023,\n settings: {\n arrows: false,\n },\n },\n ],\n });\n }\n}\n\nfunction unslickProdTileCarousel (containerClass) {\n const $tileCarousel = containerClass\n ? $(containerClass + ' ' + IMAGE_CONTAINER_CAROUSEL_CLASS + '.slick-initialized')\n : $(IMAGE_CONTAINER_CAROUSEL_CLASS + '.slick-initialized');\n\n if ($tileCarousel) {\n $tileCarousel.slick('unslick');\n }\n}\n\nfunction loadLazyVideo () {\n const lazyloadclass = 'js-customLazyload';\n let lazyVideos = [].slice.call(document.querySelectorAll('.' + lazyloadclass));\n\n let lazyVideoObserver = new IntersectionObserver(function (entries) {\n entries.forEach(function (video) {\n if (video.isIntersecting) {\n for (let source in video.target.children) {\n let videoSource = video.target.children[source];\n if (\n typeof videoSource.tagName === 'string' &&\n videoSource.tagName === 'SOURCE'\n ) {\n videoSource.src = videoSource.dataset.src;\n }\n }\n\n video.target.load();\n video.target.classList.remove(lazyloadclass);\n lazyVideoObserver.unobserve(video.target);\n }\n });\n });\n\n lazyVideos.forEach(function (lazyVideo) {\n lazyVideoObserver.observe(lazyVideo);\n });\n}\n","// import tingle from 'tingle.js';\n// import ProductHelpers from './base';\nimport { newModal } from '../components/modal';\nimport productSlider from '../components/productSlider';\n// let wishlist = require('./wishlistHeart');\n\n/**\n * replaces the content in the modal window on for the selected product variation.\n * @param {string} productUrl - url to be used for going to the product details page\n * @param {string} selectedValueUrl - url to be used to retrieve a new product model\n */\nconst fillModalElement = (productUrl, selectedValueUrl, modal) => {\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n dataType: 'json',\n success: html => {\n modal.setContent(html.renderedTemplate);\n $('.product-quickview .carousel-inner').slick({\n arrows: true,\n dots: false\n });\n productSlider();\n // wishlist.highlightIconsForAllItemsInWishlist();\n modal.open();\n\n localStorage.setItem('prevlisttype', localStorage.getItem('listtype'));\n localStorage.setItem('listtype', 'landing');\n localStorage.setItem('prevlisttypeforcart', localStorage.getItem('listtypeforcart'));\n localStorage.setItem('listtypeforcart', 'landing');\n $('body').trigger('product:productLanding');\n\n if (document.getElementById('TU')) {\n document.getElementById('TU').click();\n }\n $(modal.modalBox)\n .find('.close-custom')\n .on('click', function (e) {\n modal.close();\n modal.destroy();\n });\n\n const destroyModal = () => {\n try {\n modal.close();\n modal.destroy();\n } catch (e) {};\n // remove the event listener to manage cases where the modal\n // is opened two or more times, (removes console error)\n $(document).off('product:afterAddToCart', destroyModal);\n };\n\n $(document).on('product:afterAddToCart', destroyModal);\n },\n error: err => {\n console.log('Error:', err);\n }\n });\n};\n\nconst addToCartFromListing = (pid, promoId, $productContainer) => {\n $.spinner().start();\n var form = {\n pid: pid,\n quantity: 1,\n options: [],\n promoId: promoId\n };\n var url = $('#tileAddToCartUrl').data('url');\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form,\n success: function (response) {\n if (response) {\n $('.js-mainHeader-minicart').trigger('count:update', response);\n localStorage.setItem('lastClickedPosition', '');\n localStorage.setItem('listtype', 'listing');\n // $(\"body, html\").animate({ scrollTop: 0 }, 500, 'swing');\n $('body').trigger('product:afterAddToCart', {\n ...response,\n form,\n $productContainer\n });\n $('body').trigger('product:afterQuickBuyListing', response);\n } else {\n console.error('Ajax: Empty Response');\n }\n $.spinner().stop();\n },\n error: function (err) {\n console.error('ErrorCase: ' + err.message);\n $.spinner().stop();\n }\n });\n};\n\nclass QuickView {\n run () {\n this.showQuickview();\n this.observeQuickBuy();\n }\n\n showQuickview () {\n $('body').on('click', '.quickview', function (e) {\n e.stopPropagation();\n e.preventDefault();\n const selectedValueUrl = $(this).attr('href');\n const productUrl = selectedValueUrl.replace('Product-ShowQuickView', 'Product-Show');\n const modal = newModal(false, ['quickview-modal']);\n fillModalElement(productUrl, selectedValueUrl, modal);\n\n // trigger for analytics product detail event\n const target = $(this).closest('.product');\n if (target.length > 0) {\n $('body').trigger('product:analyticsProductDetails', target);\n }\n });\n }\n\n observeQuickBuy () {\n $('body').on('click', '.js-quick-buy-sizes-item-select', function (e) {\n e.preventDefault();\n if ($(this).hasClass('disable') || !$(this).data('variant')) {\n return false;\n }\n var url = $(this).data('variant');\n\n var pid = $(e.currentTarget).data('pid');\n $(`.js-quick-buy-sizes-item[data-pid=\"${pid}\"]`).attr('variant', url);\n });\n $('body').on('click', '.js-quick-buy-sizes-item', function (e) {\n e.preventDefault();\n\n var url = $(this).attr('variant');\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'GET',\n dataType: 'json',\n success: function (response) {\n $.spinner().stop();\n const $productContainer = $(e.target);\n if (response.product.available && !response.product.comingSoon) {\n addToCartFromListing(response.product.id, false, $productContainer);\n } else {\n $('body').trigger('product:afterAddToCartFailed', {\n ...response,\n $productContainer\n });\n }\n },\n error: function (err) {\n console.error('ErrorCase: ' + err.message);\n $.spinner().stop();\n }\n });\n });\n }\n}\n// const quickView = new QuickView();\nexport default QuickView;\nexport { addToCartFromListing };\n","import tingle from 'tingle.js';\n\n/**\n * This function retrieves another page of content to display in the content search grid\n * @param {String} selectorID - ID of the modal DOM element to clone\n * @return {Tingle} - https://robinparisi.github.io/tingle/\n */\nconst newModalFromSelector = (selectorID, footer, cssClass = [], onClose = null) => {\n // set optionts\n const modalOptions = {\n closeMethods: ['overlay', 'escape'],\n cssClass,\n onClose: () => {\n modal.destroy();\n if (typeof onClose === 'function') {\n onClose();\n }\n },\n onOpen: () => { $('html').addClass('html-tingle-enabled'); },\n beforeClose: () => {\n if ($('.tingle-modal.tingle-modal--visible').length < 2) {\n $('html').removeClass('html-tingle-enabled');\n }\n return true;\n }\n };\n if (footer) { modalOptions.footer = true; };\n\n // create modal\n const modal = new tingle.modal(modalOptions);\n\n // clone content\n if (selectorID) {\n const contentModal = document.getElementById(selectorID);\n if (contentModal) {\n modal.setContent(contentModal.innerHTML);\n }\n }\n\n return modal;\n};\n\n/**\n * This function retrieves another page of content to display in the content search grid\n * @param {String} html - HTML string\n * @return {Tingle} - https://robinparisi.github.io/tingle/\n */\nconst newModalFromString = (html, footer, cssClass = [], onOpen, onClose) => {\n // set optionts\n const modalOptions = {\n closeMethods: ['overlay', 'button', 'escape'],\n cssClass,\n onClose: () => {\n modal.destroy();\n if (typeof onClose === 'function') {\n onClose();\n }\n },\n onOpen: () => {\n $('html').addClass('html-tingle-enabled');\n if (typeof onOpen === 'function') {\n onOpen();\n }\n },\n beforeClose: () => {\n if ($('.tingle-modal.tingle-modal--visible').length < 2) {\n $('html').removeClass('html-tingle-enabled');\n }\n return true;\n }\n };\n if (footer) { modalOptions.footer = true; };\n\n // create modal\n const modal = new tingle.modal(modalOptions);\n\n // add content\n if (html) {\n modal.setContent(html);\n }\n\n return modal;\n};\n\n/**\n * This function creates a modal starting from supplied options\n * @return {Tingle} - https://robinparisi.github.io/tingle/\n */\nconst newModalWithOptions = (modalOptions) => {\n return new tingle.modal(modalOptions);\n};\n\n/**\n * This class creates a modal without copying or moving any HTML,\n * but simply showing and hiding an existing Node.\n * This is to avoid problems with manipulated elements such as Google Maps\n */\nclass ModalShowHide {\n constructor (selector = '', newModalType, toPropagateClick, classToPreventHide) {\n this.$el = $(selector);\n this.selector = selector;\n this._scrollposition = 0;\n this.toPropagateClick = toPropagateClick;\n this.classToPreventHide = classToPreventHide;\n if (newModalType) {\n this.isOpenTypeCustom = false;\n } else {\n this.isOpen = false;\n }\n\n this.events();\n }\n\n show (newModalType) {\n if (newModalType) {\n if (this.isOpenTypeCustom) {\n return;\n }\n this.isOpenTypeCustom = true;\n } else {\n if (this.isOpen) {\n return;\n }\n this.isOpen = true;\n }\n\n // mimic tingle scroll lock\n this._scrollPosition = window.pageYOffset;\n if (this.$el.hasClass('tingle-override')) {\n // do nothing\n } else {\n $('body').addClass('tingle-enabled');\n $('html').addClass('html-tingle-enabled');\n $('body').css('top', -this._scrollPosition + 'px');\n this.$el.parent('.tingle-modal').addClass('tingle-modal--visible');\n }\n }\n\n hide (newModalType) {\n if (newModalType) {\n if (!this.isOpenTypeCustom) {\n return;\n }\n this.isOpenTypeCustom = false;\n } else {\n if (!this.isOpen) {\n return;\n }\n this.isOpen = false;\n }\n\n // mimic tingle scroll lock\n if ($('.tingle-modal.tingle-modal--visible').length < 2) {\n $('body').removeClass('tingle-enabled');\n $('html').removeClass('html-tingle-enabled');\n window.scrollTo(0, this._scrollPosition);\n $('body').css('top', null);\n }\n this.$el.parent('.tingle-modal').removeClass('tingle-modal--visible');\n }\n\n events () {\n $('body').on('click', '.tingle-modal', (e) => {\n if (e.target.className === '') {\n return;\n }\n if ($(e.target).hasClass('tingle-modal') || !$(e.target).closest(this.classToPreventHide)) {\n var newModalType = $(e.target).data('modalType') || null;\n this.hide(newModalType);\n e.stopPropagation();\n }\n });\n $('body').on('click', '.modal-close', (e) => {\n var newModalType = $(e.target).data('modalType') || null;\n this.hide(newModalType);\n e.stopPropagation();\n });\n\n if (!this.toPropagateClick) {\n $('body').on('click', this.selector, (e) => {\n e.stopPropagation();\n });\n }\n }\n};\nexport {\n newModalFromSelector,\n newModalFromString,\n newModalWithOptions,\n ModalShowHide\n};\n","'use strict';\n\nimport { newModalFromString } from '../components/modal';\nimport FormHelpers, { addInputClearIcon } from '../util/form';\n\n/**\n * Checks if the email value entered is correct format\n * @param {string} email - email string to check if valid\n * @returns {boolean} Whether email is valid\n */\nfunction validateEmail (email) {\n var regex = /^[\\w.%+-]+@[\\w.-]+\\.[\\w]{2,6}$/;\n return regex.test(email);\n}\n\nclass NotifyHelper {\n notifyMeModal () {\n $('body').on('click', '.js-intProductDetail-size-item', (e) => {\n if (!$(e.currentTarget).find('.notifyMe').length) {\n return;\n }\n e.preventDefault();\n let actualDiv = $(e.currentTarget).find('.notifyMe');\n this.notifyMeAction(actualDiv);\n });\n\n $('body').on('click', '.notifyMe', (e) => {\n e.preventDefault();\n this.notifyMeAction(e.currentTarget);\n });\n }\n\n notifyMeAction (notifyMeDiv) {\n var paramUrl = $(notifyMeDiv).siblings().attr('data-variation-url');\n if (!paramUrl) {\n paramUrl = $(notifyMeDiv).siblings().attr('data-url');\n }\n if ($('.js-notifyMeModal').length > 0 || $(notifyMeDiv).hasClass('js-size-personalizable')) {\n return;\n }\n if ($(notifyMeDiv).hasClass('notifyPopup')) {\n $('.js-prod-select-size-modal').remove();\n paramUrl = $(notifyMeDiv).attr('data-url');\n }\n $('.js-notifyMeModal-titleNotComingSoon').removeClass('hidden');\n $('.js-notifyMeModal-subTitleNotComingSoon').removeClass('hidden');\n $('.js-notifyMeModal-titleComingSoon').addClass('hidden');\n $('.js-notifyMeModal-subTitleComingSoon').addClass('hidden');\n let isComingSoon = $(notifyMeDiv).siblings().attr('data-iscomingsoon') == 'true';\n if (isComingSoon) {\n $('.js-notifyMeModal-titleNotComingSoon').addClass('hidden');\n $('.js-notifyMeModal-subTitleNotComingSoon').addClass('hidden');\n $('.js-notifyMeModal-titleComingSoon').removeClass('hidden');\n $('.js-notifyMeModal-subTitleComingSoon').removeClass('hidden');\n }\n $('.js-notifyMeModal-toHide').removeClass('hidden');\n $('.js-notifyMeModal-toShow').addClass('hidden');\n $('.js-notifyMeModal-notifyBtn').parent().removeClass('hidden');\n $('.continueShopping').addClass('hidden');\n $('.js-notifyMeModal-emailError').addClass('hidden');\n $('.js-notifyMeModal-duplicateError').addClass('hidden');\n const htmlContent = $($(this).data('target')).html();\n // create and open confirmation modal\n const modal = newModalFromString(htmlContent, false, [\n 'cc-notifyMeModal',\n 'js-notifyMeModal',\n ]);\n if ($('.page').data('action') !== 'Product-Show') {\n $(modal.modalBox).addClass(\n 'cc-hide-findInStoreButton'\n );\n }\n $(modal.modalBox).addClass(\n 'rightModalAttribute cc-notifyMeModal-modalBox rightModalAttribute_sizeMedium'\n );\n let size = $(notifyMeDiv).innerText;\n $('.sizeNotify').html(size);\n\n let quickAddFlow = $(notifyMeDiv).hasClass('notifyMeQuickAdd');\n // Retrieve images from correct SKU (e.g: big cup models)\n var url = $('#notifyMeModalImageUrl').val();\n var pid;\n var selectedColor;\n var selectedSize;\n\n if (quickAddFlow) {\n pid = $(notifyMeDiv).data('pid');\n selectedColor = $(notifyMeDiv).data('color').split(' - ')[1]\n ? $(notifyMeDiv).data('color').split(' - ')[1].trim()\n : '';\n selectedSize = $(notifyMeDiv).data('value');\n } else {\n pid = decodeURIComponent($('.product-detail').attr('data-variant-pid'));\n selectedColor = $('[data-attr=\"color\"] .swatch-value.selected').data('attr-value');\n selectedSize =\n $(notifyMeDiv).closest('label').find('input').data('size-id') + '';\n selectedSize = selectedSize.replaceAll('/', '\\\\/');\n $('[data-attr=\"size\"] #' + selectedSize).prop('checked', true);\n }\n\n $.ajax({\n url: url,\n type: 'GET',\n data: {\n pid: pid,\n color: selectedColor,\n size: selectedSize,\n },\n }).then(function (rsp) {\n modal.setContent(rsp.renderedTemplate);\n\n if ($('.quickview-modal').hasClass('tingle-modal--visible') && !$('.quickview-modal').hasClass('js-notifyMe-modal')) {\n $('.quickview-modal').remove();\n }\n\n modal.open();\n if ($('.js-complete-your-promo-quick-view').length > 0) {\n $(modal.modalBox).find('#findInStore-modal').addClass('hide');\n }\n // Enable addInputClearIcon inside class FormHelpers\n FormHelpers.init($('.js-notifyMeModal'));\n // Call addInputClearIcon for the current or every future input in this modal.\n $('input[type=text],input[type=email]').each(function (index, inputItem) {\n addInputClearIcon(inputItem);\n });\n });\n\n $(modal.modalBox).on('click', '.js-notifyMeModal-close', (e) => {\n modal.close();\n modal.destroy();\n });\n\n $(modal.modalBox).on('click', '.continue-shopping-link', (e) => {\n e.preventDefault();\n let sku = $('div.notifyMeModal').data('master-pid') || '';\n let productName = $('.analytics.product').data('name') || '';\n productName = productName.replace(/\\s\\s+/g, ' ').split(' ').join('_');\n $('body').trigger('soldout:popupActions', {\n cta: $(e.currentTarget).data('analytics-action'),\n productName: productName,\n size: $('.sizeNotify').text().trim(),\n sku,\n });\n modal.close();\n modal.destroy();\n });\n\n $(modal.modalBox).on('click', '.analytics-notify-popup-actions', (e) => {\n e.preventDefault();\n let sku = $('div.notifyMeModal').data('master-pid') || '';\n let productName = $('.analytics.product').data('name') || '';\n productName = productName.replace(/\\s\\s+/g, ' ').split(' ').join('_');\n $('body').trigger('soldout:popupActions', {\n cta: $(e.currentTarget).data('analytics-action'),\n productName: productName,\n size: $('.sizeNotify').text().trim(),\n sku,\n });\n });\n\n $(modal.modalBox).on('click', '.js-notifyMeModal-notifyBtn', (e) => {\n let email = $('#emailNotify').val();\n let isValid = validateEmail(email);\n let type = !isComingSoon ? 'back-in-stock' : 'coming-soon';\n let queryString = paramUrl.split('Product-Variation')[1];\n let productName = $('.analytics.product.hidden').attr('data-item_name') || '';\n let analyticsSku = $('div.notifyMeModal').data('master-pid') || '';\n productName = productName.replace(/\\s\\s+/g, ' ').split(' ').join('_');\n\n if (isValid) {\n let dataForm = {\n sku: $('#skuNotify').val(),\n owner: email,\n type: type,\n };\n let url = $('.notify-url').val();\n $.spinner().start();\n $.ajax({\n url: url + queryString,\n method: 'POST',\n dataType: 'json',\n data: dataForm,\n success: (data) => {\n $.spinner().stop();\n if (data.success) {\n $('.js-notifyMeModal-toHide').addClass('hidden');\n if (isComingSoon) {\n $('#messageGreen').addClass('hidden');\n $('#comingSoonGreen').removeClass('hidden');\n }\n $('#comingSoonGreen').text(data.messageComingSoon);\n $('#messageGreen').text(data.message);\n $('.js-notifyMeModal-toShow').removeClass('hidden');\n $('.js-notifyMeModal-notifyBtn').addClass('hidden');\n $(\n '.js-notifyMeModal-titleNotComingSoon,.js-notifyMeModal-titleComingSoon'\n ).addClass('hidden');\n $(\n '.js-notifyMeModal-subTitleNotComingSoon, .js-notifyMeModal-subTitleComingSoon'\n ).addClass('hidden');\n $('.continueShopping').removeClass('hidden');\n $('.js-notifyMeModal-emailError').addClass('hidden');\n $('.js-notifyMeModal-duplicateError').addClass('hidden');\n if (!Foundation.MediaQuery.atLeast('medium')) {\n $('.subtitleHide').addClass('hidden');\n }\n $('body').trigger('soldout:notify', {\n size: $('.sizeNotify').text().trim(),\n productName: productName,\n sku: analyticsSku,\n availability: 'product_notify_me',\n });\n } else {\n if (data.duplicate) {\n $('.js-notifyMeModal-duplicateError').removeClass('hidden');\n }\n }\n },\n error: () => {\n $.spinner().stop();\n },\n });\n } else {\n $('.js-notifyMeModal-emailError').removeClass('hidden');\n }\n });\n }\n}\n\nconst notifyHelper = new NotifyHelper();\nexport default notifyHelper;\n","export const startCarouselTileImageFunction = (element) => {\n var carousel = element ? $(element) : $('.js-tileImageCarousel');\n carousel.on('init', function (event, slick) {\n $(this).find('.tile-image').removeClass('hide');\n $(this).find('.slick-arrow').addClass('js-prevent-link');\n });\n carousel.slick({\n responsive: [\n {\n settings: {\n draggable: false,\n swipe: false,\n swipeToSlide: false,\n touchMove: false,\n accessibility: false,\n arrows: false\n }\n }\n ]\n });\n};\n\nclass ProductBox {\n run () {\n this.gotoPDP();\n this.startCarouselTileImage();\n this.afterAttributesSelectionEvent();\n }\n\n gotoPDP () {\n $(document).on('click', '.product-tile', function (evt) {\n if (evt.target.classList.contains('js-prevent-link')) {\n evt.preventDefault();\n }\n });\n }\n\n startCarouselTileImage () {\n startCarouselTileImageFunction();\n\n $('body').on('click', '.product .js-tileImageCarousel .slick-arrow', function (e) {\n e.preventDefault();\n e.stopPropagation();\n });\n }\n\n afterAttributesSelectionEvent () {\n $(document).on('product:afterAttributeSelect', (evt, additionalData) => {\n const $container = additionalData.container;\n var newPriceData = additionalData.data.product.price.html;\n if (additionalData.data.product.doubleCurrency && additionalData.data.product.doubleCurrency.html) {\n newPriceData += additionalData.data.product.doubleCurrency.html;\n }\n $container.find('.price-container').html(newPriceData);\n });\n }\n}\n\n// const productBox = new ProductBox();\nexport default ProductBox;\n","'use strict';\n\nconst checkCarouselLength = (carouselContainer) => {\n if ($(carouselContainer).length > 0) {\n $(carouselContainer).each(function () {\n const carousel = $(this);\n let carouselWidth = parseInt($(carousel).outerWidth());\n let carouselItemsNumber = $(carousel).children().length;\n let carouselItemsWidth = parseInt($(carousel).children().outerWidth());\n let carouselItemsWidthSum = carouselItemsWidth * carouselItemsNumber;\n if ((carouselItemsWidthSum + 16) <= carouselWidth) {\n $(this).closest('.cc-em').find('.cc-em__carouselCustom__arrows').hide();\n $(this).addClass('cc-em__carouselCustom_center');\n } else {\n $(this).closest('.cc-em').find('.cc-em__carouselCustom__arrows').show();\n $(this).removeClass('cc-em__carouselCustom_center');\n }\n\n $(this).scroll(function () {\n carouselWidth = parseInt($(carousel).outerWidth());\n carouselItemsNumber = $(carousel).children().length;\n carouselItemsWidth = parseInt($(carousel).children().outerWidth());\n carouselItemsWidthSum = carouselItemsWidth * carouselItemsNumber;\n let carouselScrolled = $(carousel).scrollLeft();\n\n if (carouselScrolled < 1) {\n $(carousel).closest('.cc-em').find('.js-carouselCustom__arrowLeft').addClass('cc-disabled');\n } else if (carouselScrolled >= (carouselItemsWidthSum - carouselWidth + 16)) {\n $(carousel).closest('.cc-em').find('.js-carouselCustom__arrowRight').addClass('cc-disabled');\n } else {\n $(carousel).closest('.cc-em').find('.js-carouselCustom__arrowLeft').removeClass('cc-disabled');\n $(carousel).closest('.cc-em').find('.js-carouselCustom__arrowRight').removeClass('cc-disabled');\n }\n });\n });\n }\n};\n$(document).ready(function () {\n // Custom Carousel\n function carouselScroll (el, dir) {\n const carousel = $(el).closest('.cc-em').find('.cc-em__carouselCustom');\n const carouselItemsWidth = parseInt($(carousel).children().outerWidth());\n let carouselScrolled = $(carousel).scrollLeft();\n\n if (dir === 'right') {\n $(carousel).scrollLeft(carouselScrolled + carouselItemsWidth);\n } else {\n $(carousel).scrollLeft(carouselScrolled - carouselItemsWidth);\n }\n }\n\n $(document).on('click', '.js-carouselCustom__arrowLeft', function () {\n carouselScroll(this, 'left');\n });\n\n $(document).on('click', '.js-carouselCustom__arrowRight', function () {\n carouselScroll(this, 'right');\n });\n $('body').on('common:checkCarouselLength', function (e, data) {\n checkCarouselLength(data.name);\n });\n});\n\nexport {\n checkCarouselLength,\n};\n","import { fabric } from 'fabric';\nimport { generateSvgForOTP } from './personalization/generateSvgForOTP';\nimport {\n newModalFromString\n} from './components/modal';\nimport sizePanel from './product/sizePanel';\nimport SELECTORS from './personalization/selectors';\nimport CLASSES from './personalization/classes';\n\nlet customizePosition, customizeSide, customizeText, customizeFont, customizePattern, customizeColor, allowedCharactersRegex, canvas, canvasText, canvasRect, canvasGroup, canvasImage, top, left, topBack, leftBack, badWords, loadingTime, isStepTwo, rectColor, switchDisable;\n\nfunction initText () {\n const { textInput, fontsButtons, colorsButtons } = SELECTORS;\n $(textInput).val('');\n $(fontsButtons).removeClass('active');\n $(fontsButtons).first().addClass('active');\n $(colorsButtons).removeClass('active');\n $(colorsButtons).first().addClass('active');\n\n customizePosition = '0';\n customizeText = '';\n customizeFont = '\"Didot\",Times,serif';\n customizePattern = '1';\n customizeColor = '#000000';\n allowedCharactersRegex = $(textInput).data('regex-pattern');\n}\n\nfunction initVariables () {\n customizeSide = '0';\n top = parseInt($(SELECTORS.pixelText).attr('top-desktop'));\n left = parseInt($(SELECTORS.pixelText).attr('left-desktop'));\n topBack = parseInt($(SELECTORS.pixelText).attr('top-desktop-back'));\n leftBack = parseInt($(SELECTORS.pixelText).attr('left-desktop-back'));\n switchDisable = $(SELECTORS.pixelText).attr('switch-disable') === 'true';\n badWords = [];\n loadingTime = 300;\n isStepTwo = false;\n rectColor = '#3C3738';\n\n initText();\n}\n\n/**\n * @function initCanvas - Init the canvas\n * @returns {void}\n */\nfunction initCanvas (imageToLoad = SELECTORS.imgFront) {\n canvas = new fabric.StaticCanvas('personalization-canvas', {\n width: 2000,\n height: 3000,\n enableRetinaScaling: false\n });\n\n let transformX = left / canvas.width * 100;\n let transformY = top / canvas.height * 100;\n let translateY = transformY < 25 ? 0 : transformY > 75 ? -50 : 25 - transformY;\n\n $(SELECTORS.personalizationCanvas).css({\n transformOrigin: transformX + '% ' + transformY + '%',\n transform: 'scale(1)',\n top: isStepTwo ? translateY + '%' : '0'\n });\n\n $(SELECTORS.zoomButton).removeClass('active');\n\n const canvasRatio = 7.125; // canvas ratio calculated based on the design dimensions of the image (2000/355)\n canvasText = new fabric.Textbox(customizeText, {\n top: top,\n left: left,\n originX: 'center',\n originY: 'center',\n width: canvasRatio * 48,\n fontSize: canvasRatio * 10,\n lineHeight: canvasRatio * 15,\n fontFamily: customizeFont,\n textAlign: 'center',\n fill: customizeColor,\n });\n\n if (isStepTwo) {\n canvasRect = new fabric.Rect({\n strokeDashArray: [canvasRatio * 5, canvasRatio * 5],\n top: top,\n left: left,\n originX: 'center',\n originY: 'center',\n width: canvasRatio * 48,\n height: canvasRatio * 26,\n fill: '',\n stroke: rectColor,\n strokeWidth: canvasRatio * 1\n });\n }\n\n let imageUrl = $(imageToLoad).attr('src');\n fabric.Image.fromURL(imageUrl, function (img) {\n canvasImage = img.set({\n top: 0,\n selectable: false,\n hasRotatingPoint: true,\n width: canvas.width,\n height: canvas.height\n });\n canvasImage.scaleToWidth(canvas.width);\n\n if (isStepTwo) {\n canvasGroup = new fabric.Group([canvasImage, canvasText, canvasRect], {});\n } else {\n canvasGroup = new fabric.Group([canvasImage, canvasText], {});\n }\n canvas.add(canvasGroup);\n\n setTimeout(() => {\n canvas.renderAll();\n }, loadingTime);\n });\n}\n\n/**\n * @function initForm - Saves customization values inside the submit form inputs\n */\nfunction initForm () {\n $('.form-position').val(customizePosition);\n $('.form-text').val(customizeText);\n $('.form-font').val(customizeFont);\n $('.form-pattern').val(customizePattern);\n $('.form-color').val(customizeColor);\n $('.form-color-selected-circle-src').val($('#imageColor').attr('src'));\n}\n\n/**\n * @function updateCanvasElem - Update the canvas element based on a property and value\n * @param {Object} elem - Canvas element\n * @param {String} property - Property to update\n * @param {*} value - Value to set\n */\nfunction updateCanvasElem (elem, property, value) {\n if (elem) {\n elem.set(property, value);\n\n setTimeout(() => {\n canvas.renderAll();\n }, loadingTime);\n }\n};\n\n/**\n * @function waitToLoadAllImages - Wait for all images to load\n * @returns {Promise} - Promise that resolves when all images are loaded\n */\nfunction waitToLoadAllImages () {\n let defer = jQuery.Deferred();\n let imagesNumber = $('.js-personalization-image').length;\n let loadComplete = 0;\n $('.js-personalization-image').one('load', function () {\n loadComplete++;\n if (loadComplete === imagesNumber) {\n defer.resolve(true);\n }\n }).on('error', function () {\n loadComplete++;\n if (loadComplete === imagesNumber) {\n defer.resolve(true);\n }\n }).each(function () {\n if (this.complete) {\n $(this).trigger('load');\n } else if (this.error) {\n $(this).error();\n }\n });\n return defer.promise();\n};\n\n/**\n * @function runPersonalizationListener - Init the canvas, add event listeners on the modal elements and init the form\n */\nfunction runPersonalizationListener () {\n initVariables();\n sizePanel.init('#size-panel-mobile-pers');\n $('#size').attr('size-attribute', $('[data-attr=\"size\"] input:checked').attr('id'));\n\n waitToLoadAllImages().then(function () {\n initCanvas();\n positionChoice();\n });\n\n initForm();\n\n $('#input-type1').on('input', function () {\n editTextOnCanvas();\n });\n\n /**\n * Change the color of the text on the canvas\n */\n $(document).on('click', '.js-choice-editor .cc-choice-pattern_item', function (e) {\n customizePattern = $(this).find('img').attr('src');\n customizeColor = $(this).find('img').attr('alt');\n let colorName = $(this).find('img').data('name');\n $('.js-color-value').text(colorName);\n $('.js-customizePage').find('.js-choice-editor .cc-choice-pattern_item.active').removeClass('active');\n $(this).addClass('active');\n\n updateCanvasElem(canvasText, 'fill', customizeColor);\n\n e.stopPropagation();\n });\n\n /**\n * Select one of the 2 available hotspost\n */\n $(document).off('click', '.js-customizePage .js-positionChoice-1, .js-customizePage .js-positionChoice-2');\n $(document).on('click', '.js-customizePage .js-positionChoice-1, .js-customizePage .js-positionChoice-2', function (e) {\n isStepTwo = true;\n if ($(this).hasClass('js-positionChoice-1')) {\n selectPosition(1);\n } else if ($(this).hasClass('js-positionChoice-2')) {\n selectPosition(2);\n }\n choicePosition();\n $('.js-customizePage .js-positionChoice-1, .js-customizePage .js-positionChoice-2').hide();\n e.stopPropagation();\n });\n\n onZoomButtonClick();\n}\n\n/**\n * @function onZoomButtonClick - Add event listener on the zoom button, to zoom in/out the canvas\n */\nfunction onZoomButtonClick () {\n $(SELECTORS.zoomButton).on('click', function (e) {\n const $this = $(this);\n const scaleValue = $this.hasClass('active') ? 1 : 1.9;\n\n $(SELECTORS.personalizationCanvas).css({\n transform: 'scale(' + scaleValue + ')'\n });\n\n $this.toggleClass('active');\n e.stopPropagation();\n });\n}\n\n/**\n * @function editTextOnCanvas - Update the text on the canvas\n */\nfunction editTextOnCanvas () {\n customizeText = $('#input-type1').val();\n let badWordsFlag = false;\n\n if (badWords.includes(customizeText.toLowerCase())) {\n badWordsFlag = true;\n customizeText = '';\n $('.js-personalizeButtonModal').attr('disabled', true);\n $('.content-input-err').removeClass('hidden');\n } else {\n $('.js-personalizeButtonModal').attr('disabled', false);\n $('.content-input-err').addClass('hidden');\n }\n if (customizeText === undefined || customizeText === '') {\n $('.js-personalizeButtonModal').attr('disabled', true);\n $('.content-input-err-cyrillic').addClass('hidden');\n } else {\n $('.js-personalizeButtonModal').attr('disabled', false);\n\n if (!badWordsFlag) {\n const isRegexValid = customizeText.toLowerCase().match(allowedCharactersRegex);\n if (!isRegexValid) {\n $('.js-personalizeButtonModal').attr('disabled', true);\n $('.content-input-err-cyrillic').removeClass('hidden');\n } else {\n $('.js-personalizeButtonModal').attr('disabled', false);\n $('.content-input-err-cyrillic').addClass('hidden');\n }\n }\n }\n\n updateCanvasElem(canvasText, 'text', customizeText);\n\n if (customizeText !== '') {\n updateCanvasElem(canvasRect, 'stroke', '');\n } else {\n updateCanvasElem(canvasRect, 'stroke', rectColor);\n }\n}\n\n/**\n * @function updateCanvas - Re-load the canvas with a new image\n * @param {String} imageToLoad - Selector of the image tag to use for the canvas\n */\nfunction updateCanvas (imageToLoad) {\n canvas.clear();\n initCanvas(imageToLoad);\n}\n\n/**\n * @function choicePosition - Go to step 2, function is called after clicking on the hotspot\n */\nlet choicePosition = function () {\n const { page, mainChoice, showOtherSide, stepOne, stepTwo, termsBottomDesktop, footer, zoomButton } = SELECTORS;\n\n if (customizePosition !== '0') {\n $(mainChoice).addClass('visible');\n $(stepOne + ', ' + termsBottomDesktop).removeClass('cc-visible');\n $(stepTwo + ', ' + footer).addClass('cc-visible');\n $(showOtherSide).removeClass('back').addClass('hide');\n $(zoomButton).removeClass('hide');\n $(page).removeClass(CLASSES.pageStepOne).addClass(CLASSES.pageStepTwo);\n }\n};\n\n/**\n * @function backChoicePosition - Go back to step 1, function is called after clicking on the back button\n */\nlet backChoicePosition = function () {\n const { page, mainChoice, hotspotOne, hotspotTwo, stepOne, stepTwo, termsBottomDesktop, footer, showOtherSide, zoomButton } = SELECTORS;\n isStepTwo = false;\n if (customizeSide !== '0') {\n $(showOtherSide).removeClass('hide');\n\n if (customizeSide === '1') {\n $(showOtherSide).addClass('back').removeClass('front');\n } else {\n $(showOtherSide).addClass('front').removeClass('back');\n }\n } else {\n $(hotspotOne).removeClass('hide');\n $(hotspotTwo).removeClass('hide');\n }\n const imageToLoad = customizeSide === '1' || customizeSide === '0' ? $(SELECTORS.imgFront) : $(SELECTORS.imgBack);\n\n canvas.clear();\n initText();\n initCanvas(imageToLoad);\n\n $(mainChoice).removeClass('visible');\n $(stepOne + ', ' + termsBottomDesktop).addClass('cc-visible');\n $(stepTwo + ', ' + footer).removeClass('cc-visible');\n $(page).addClass(CLASSES.pageStepOne).removeClass(CLASSES.pageStepTwo);\n $(hotspotOne + ', ' + hotspotTwo).show();\n $(zoomButton).removeClass('active').addClass('hide');\n};\n\n/**\n * @function selectPosition - Select if we are using the image front or back\n * @param {Number} pos - 1: front, 2: back\n */\nfunction selectPosition (pos) {\n const { imgFront, imgBack, pixelText, hotspotOne, hotspotTwo, showOtherSide } = SELECTORS;\n let imageToLoad = $(imgFront);\n if (pos === 1 || pos === 0) {\n top = parseInt($(pixelText).attr('top-desktop'));\n left = parseInt($(pixelText).attr('left-desktop'));\n customizePosition = pos;\n $(showOtherSide).addClass('back').removeClass('front');\n $(hotspotOne).removeClass('hide');\n if (pos !== 0) {\n $(hotspotTwo).addClass('hide');\n }\n } else {\n top = parseInt($(pixelText).attr('top-desktop-back'));\n left = parseInt($(pixelText).attr('left-desktop-back'));\n imageToLoad = $(imgBack);\n customizePosition = '2';\n $(showOtherSide).addClass('front').removeClass('back');\n $(hotspotOne).addClass('hide');\n $(hotspotTwo).removeClass('hide');\n }\n\n updateCanvas(imageToLoad);\n}\n\n/**\n * @function positionChoice - Add event listeners on the position buttons\n */\nfunction positionChoice () {\n const imageFront = $('#img-url-front').attr('data-url').replace(/&/g, '&');\n const imageBack = $('#img-url-back').attr('data-url').replace(/&/g, '&');\n const topPercentage = (top / canvas.height) * 100;\n const leftPercentage = (left / canvas.width) * 100;\n const topBackPercentage = (topBack / canvas.height) * 100;\n const leftBackPercentage = (leftBack / canvas.width) * 100;\n\n if (imageBack !== '') {\n let $position1 = $('').html($('.cordinates-spot-icon i').html()).addClass('js-pers-hotspotBtn js-positionChoice-1 cc-pers-hotspotBtn');\n let $position2 = $('').html($('.cordinates-spot-icon i').html()).addClass('js-pers-hotspotBtn js-positionChoice-2 cc-pers-hotspotBtn');\n $position1.css({'position': 'absolute', 'top': topPercentage + '%', 'left': leftPercentage + '%', 'display': 'flex'}).appendTo('.js-section-module_result_image');\n $position2.css({'position': 'absolute', 'top': topBackPercentage + '%', 'left': leftBackPercentage + '%', 'display': 'flex'}).appendTo('.js-section-module_result_image');\n $position1.data('position', '1');\n $position2.data('position', '2');\n\n if (imageFront !== imageBack && !switchDisable) {\n $('.js-show-other-side').removeClass('hide').addClass('back');\n selectPosition(1);\n customizeSide = '1';\n } else {\n $('.js-show-other-side').addClass('hide');\n selectPosition(0);\n customizeSide = '0';\n }\n } else {\n let $position1 = $('').html($('.cordinates-spot-icon i').html()).addClass('js-pers-hotspotBtn js-positionChoice-1 cc-pers-hotspotBtn');\n $position1.css({'position': 'absolute', 'top': topPercentage + '%', 'left': leftPercentage + '%', 'display': 'flex'}).appendTo('.js-section-module_result_image');\n selectPosition(0);\n customizeSide = '0';\n $position1.data('position', '1');\n }\n\n /**\n * Add event listener on go back button (return to step 1);\n */\n $(document).off('click', '.cc-customizePage-topbar .js-page-back');\n $(document).on('click', '.cc-customizePage-topbar .js-page-back', function (e) {\n backChoicePosition();\n e.stopPropagation();\n $('body').trigger('customize:actions', {\n action: 'back',\n pid: $('.js-customizePage').data('pid')\n });\n });\n\n // Cambio Fronte/Retro\n $(document).off('click', '.js-show-other-side .js-other-side-btn');\n $(document).on('click', '.js-show-other-side .js-other-side-btn', function (e) {\n if ($(this).closest('.js-show-other-side').hasClass('front')) {\n $(this).closest('.js-show-other-side').removeClass('front').addClass('back');\n selectPosition(1);\n customizeSide = '1';\n } else {\n $(this).closest('.js-show-other-side').removeClass('back').addClass('front');\n selectPosition(2);\n customizeSide = '2';\n }\n });\n\n $(document).on('click', '.js-choice-editor .cc-choice-item', function (e) {\n customizeFont = $(this).data('font');\n $('.form-font').val(customizeFont);\n\n $('.js-choice-editor .cc-choice-item.active').removeClass('active');\n $(this).addClass('active');\n $('#input-type1').css('font-family', customizeFont);\n\n updateCanvasElem(canvasText, 'fontFamily', customizeFont);\n e.stopPropagation();\n });\n\n /**\n * Creates new canvas for the export and populates data for add to cart\n */\n $(document).on('click', SELECTORS.personalizeAddToCart, function (e) {\n initForm();\n\n $.spinner().start();\n\n let canvasOptions = {\n top: top,\n left: left,\n customizeText: customizeText,\n customizeFont: customizeFont,\n customizeColor: customizeColor,\n imageToLoad: customizeSide === '1' || customizeSide === '0' ? $(SELECTORS.imgFront) : $(SELECTORS.imgBack)\n };\n let svgAllFormat = generateSvgForOTP(canvasOptions);\n let base64FullSVG = svgAllFormat.personalizationFullSVG;\n $('#base64').attr('data-fullSVG', base64FullSVG);\n let base64TextFullSVG = svgAllFormat.personalizationTextSVG;\n $('#base64').attr('data-fullTextSVG', base64TextFullSVG);\n let base64TextSmallSVG = svgAllFormat.personalizationSmallSVG;\n $('#base64').attr('data-smallSVG', base64TextSmallSVG);\n $.spinner().stop();\n\n let size = $('#size').attr('size-attribute').replace('/', '~');\n if (size !== '') {\n $('#' + size).attr('checked', true);\n }\n\n // Update modal add-to-cart\n $('body').on('product:updateAddToCart', (e, response) => {\n if (!response.product.readyToOrder || !response.product.available || response.product.comingSoon) {\n if (this.sizeModal && this.sizeModal.modal) {\n $(this.sizeModal.modalBox).find('button.js-add-to-cart').attr('disabled', true);\n }\n } else if (this.sizeModal && this.sizeModal.modal) {\n $(this.sizeModal.modalBox).find('button.js-add-to-cart').attr('disabled', false);\n }\n });\n\n // Close the modal when a product is added to the cart\n $('body').on('product:afterAddToCart', (e) => {\n if (this.sizeModal && this.sizeModal.modal) {\n this.sizeModal.close();\n this.sizeModal.destroy();\n }\n });\n\n $('.js-personalizeButtonCheckout.js-add-to-cart').trigger('click');\n });\n\n // Modal Customize Terms\n $(SELECTORS.termsAndConditionsModal).on('click', function (e) {\n e.preventDefault();\n const htmlContent = $($(this).data('target')).html();\n // create and open confirmation modal\n const modal = newModalFromString(htmlContent, false);\n $('.tingle-modal:not(.jsPersonalizationToolModal)').addClass('cc-modalCustomizeTerms');\n $('.cc-modalCustomizeTerms .tingle-modal-box').addClass('cc-modalCustomizeTerms-container rightModalAttribute');\n $('.cc-modalCustomizeTerms .tingle-modal-box__content').addClass('cc-modalCustomizeTerms-container-modal');\n modal.open();\n modal.setContent(document.querySelector('.js-ModalCustomizeTerms').innerHTML);\n $(modal.modalBox)\n .find('.close')\n .on('click', function (e) {\n modal.close();\n });\n\n $('.js-inside-close-modal, [data-dismiss=\"modalBigContent\"]').on('click', function (e) {\n e.preventDefault();\n modal.close();\n });\n });\n\n $(SELECTORS.analyticsCustomizeAction).on('click', function (e) {\n let pid = $('.js-customizePage').data('pid');\n let action = $(e.currentTarget).data('action');\n $('body').trigger('customize:actions', {action: action, pid: pid});\n });\n\n $(SELECTORS.pageClose).on('click', function (e) {\n $('body').trigger('customize:actions', {\n action: 'close', \n pid: $('.js-customizePage').data('pid')\n });\n $('.jsPersonalizationToolModal .tingle-modal__close').trigger('click');\n initVariables();\n sizePanel.init();\n });\n\n // Hot spot selection - define \"position\" attribute\n $('body').on('click', '.js-pers-hotspotBtn', e => {\n customizePosition = $(e.currentTarget).data('position');\n $('.form-position').val(customizePosition);\n });\n};\n\nmodule.exports = {\n runPersonalizationListener: runPersonalizationListener,\n};\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n } catch (e) {\n return false\n }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return ''\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(\n uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n ))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n","import { fabric } from 'fabric';\n\n/**\n * @function createSvgFromCanvas - create svg from canvas\n * @param {Object} canvasToConvert - fabric canvas object\n * @returns {String} encodeSVG\n */\nfunction createSvgFromCanvas (canvasToConvert) {\n let svg = canvasToConvert.toSVG().toString().replace(/&(?!amp;)/g, '&').replace(/https:\\/\\//g, 'http://');\n let encodeSVG = encodeURIComponent(svg);\n return encodeSVG;\n}\n\n/**\n * @function generateSvgForOTP - generate svg for otp and return svgAllFormat\n * @param {Object} canvasOptions - canvas options to create canvas elements\n * @returns {Object} svgAllFormat\n */\nexport function generateSvgForOTP (canvasOptions) {\n let svgAllFormat = {};\n let top = canvasOptions.top;\n let left = canvasOptions.left;\n let customizeText = canvasOptions.customizeText;\n let customizeFont = canvasOptions.customizeFont;\n let customizeColor = canvasOptions.customizeColor;\n let imageToLoad = canvasOptions.imageToLoad;\n\n let newCanvas = new fabric.StaticCanvas('rebuildCanvas', {\n width: 2000,\n height: 3000,\n });\n\n const canvasRatio = 7.125; // canvas ratio calculated based on the design dimensions of the image (2000/355)\n let canvasText = new fabric.Textbox(customizeText, {\n top: top,\n left: left,\n originX: 'center',\n originY: 'center',\n width: canvasRatio * 48,\n fontSize: canvasRatio * 10,\n lineHeight: canvasRatio * 15,\n fontFamily: customizeFont,\n textAlign: 'center',\n fill: customizeColor,\n });\n\n let img = $(imageToLoad)[0];\n let canvasImage = new fabric.Image(img, {\n top: 0,\n selectable: false,\n hasRotatingPoint: true,\n width: 2000,\n height: 3000\n });\n canvasImage.scaleToWidth(2000);\n\n let canvasGroup = new fabric.Group([canvasImage, canvasText], {});\n newCanvas.add(canvasGroup);\n\n // FULL TEXT SVG\n svgAllFormat.personalizationFullSVG = createSvgFromCanvas(newCanvas);\n\n // HALF SIZE SVG\n let scaleRatio = Math.min(0.5);\n newCanvas.setDimensions({ width: newCanvas.getWidth() * scaleRatio, height: newCanvas.getHeight() * scaleRatio });\n newCanvas.setZoom(scaleRatio);\n svgAllFormat.personalizationSmallSVG = createSvgFromCanvas(newCanvas);\n\n // ONLY TEXT SVG\n canvasGroup.remove(canvasImage);\n newCanvas.clear();\n newCanvas.add(canvasGroup);\n let personalizationTextSVG = createSvgFromCanvas(newCanvas);\n svgAllFormat.personalizationTextSVG = personalizationTextSVG;\n\n return svgAllFormat;\n}\n","const SELECTORS = {\n page: '.js-customizePage',\n personalizationCanvas: '#personalization-canvas',\n mainChoice: '.js-sectionMainChoice',\n imgFront: '#img-object-front',\n imgBack: '#img-object-back',\n pixelText: '#pixel-text',\n canvasNode: '.js-customize-canvas',\n textInput: '.js-input-type1',\n fontsButtons: '.js-choice-editor .cc-choice-item',\n colorsButtons: '.js-choice-editor .cc-choice-pattern_item',\n showOtherSide: '.js-show-other-side',\n hotspotOne: '.js-customizePage .js-positionChoice-1',\n hotspotTwo: '.js-customizePage .js-positionChoice-2',\n stepOne: '.js-customize-step1',\n stepTwo: '.js-customize-step2',\n termsBottomDesktop: 'js-termsCondition--bottom-desktop',\n footer: '.js-customize-footer',\n zoomButton: '.js-zoom-button',\n termsAndConditionsModal: '.js-linkModalCustomizeTerms',\n analyticsCustomizeAction: '.js-analyticsCustomizeAction',\n pageClose: '.js-customizePage-icon_pageClose',\n personalizeAddToCart: '.js-personalizeButtonModal',\n};\n\nexport default SELECTORS;\n","const CLASSES = {\n active: 'active',\n pageStepOne: 'cc-customizePage--step-one',\n pageStepTwo: 'cc-customizePage--step-two',\n};\n\nexport default CLASSES;\n","import ProductHelpers, {activatePromoAnimationMessage} from './base';\nimport {newModal, newModalFromString} from '../components/modal';\nimport {initSlotCarousel, initProductTile} from '../productTileComponent/productTile';\nimport {checkCarouselLength} from '../customCarousel';\n\nfunction isPortionOfElementInContainer(el, container) {\n const rect = el.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n // DOMRect { x: 8, y: 8, width: 100, height: 100, top: 8, right: 108, bottom: 108, left: 8 }\n const windowHeight =\n (window.innerHeight || document.documentElement.clientHeight) - containerRect.top;\n // http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap\n const vertInView = rect.top <= windowHeight && rect.top + 0.66 * rect.height >= 0;\n return vertInView;\n}\n\nfunction computeCurrentlyVisibleImage() {}\n\nconst handleDetailsTabs = (clickedTab) => {\n $('.js-detailsPopup-tabContent, .js-detailsPopup-tabLink').removeClass('cc-currentTab');\n $(\n '.js-detailsPopup-tabContent#' +\n clickedTab +\n ', .js-detailsPopup-tabLink[data-tab=' +\n clickedTab +\n ']'\n ).addClass('cc-currentTab');\n};\n\nconst openQuickView = (url, modalClass) => {\n const modal = newModal(false, ['quickview-modal']);\n $.ajax({\n url: url,\n method: 'GET',\n dataType: 'json',\n success: (html) => {\n modal.setContent(html.renderedTemplate);\n if (Foundation.MediaQuery.atLeast('large')) {\n $('.product-quickview .carousel-inner').slick({\n arrows: true,\n dots: false,\n slidesToShow: 1,\n });\n }\n\n // QuickView\n $('.product-quickview .js-carousel-select-color-quickview')\n .slick({\n slidesToShow: 6,\n slidesToScroll: 2,\n infinite: false,\n responsive: [\n {\n breakpoint: 769,\n settings: {\n slidesToShow: 10,\n slidesToScroll: 2,\n },\n },\n {\n breakpoint: 640,\n settings: {\n slidesToShow: 6,\n slidesToScroll: 2,\n },\n },\n ],\n })\n .slick('setPosition');\n\n $('body').trigger('product:crossSellLoaded', true);\n\n $('.product-quickview .js-carousel-select-size')\n .slick({\n slidesToShow: 1.2,\n slidesToScroll: 1,\n infinite: false,\n })\n .slick('setPosition');\n\n if (modalClass) {\n $(modal.modalBox).find('.product-quickview').addClass(modalClass);\n }\n\n modal.open();\n $(modal.modalBox)\n .find('.close-custom')\n .on('click', function (e) {\n modal.close();\n modal.destroy();\n });\n $('body').on('product:afterAddToCart', function (data) {\n modal.close();\n modal.destroy();\n });\n },\n error: (err) => {\n console.log('Error:', err);\n },\n });\n};\n\nconst setMinHeightPromoPanel = (container) => {\n var _array = [];\n $(container)\n .find('div.promo-message.js-promo-container')\n .each(function () {\n _array.push($(this).innerHeight());\n });\n var maxHeight = Math.max.apply(Math, _array);\n $(container)\n .find('div.promo-message.js-promo-container')\n .each(function () {\n $(this).css('min-height', maxHeight);\n });\n\n var _array2 = [];\n $(container)\n .find('.product-tile__name')\n .each(function () {\n _array2.push($(this).innerHeight());\n });\n var maxHeightTitle = Math.max.apply(Math, _array2);\n $(container)\n .find('.product-tile__name')\n .each(function () {\n $(this).css('min-height', maxHeightTitle);\n });\n};\n\nconst getProductVariationGroup = (product, type) => {\n if (typeof product === 'string') {\n return product.trim();\n }\n\n if (type === 'size') {\n return product.id;\n }\n\n // size and color have already been selected. In this case, the variation\n // group is built with the style of the product, 'color' and the selected\n // color variation\n let pid = '';\n if (product.productType === 'variant') {\n pid = product.id.split(' ')[0].trim();\n } else if (product.productType === 'variationGroup') {\n // in this case the user only chose the color, and not the size\n pid = product.id.split('_')[0].trim();\n }\n let selectedVariation;\n\n for (let k in product.variationAttributes) {\n const variationAttribute = product.variationAttributes[k];\n if (variationAttribute.attributeId === 'color') {\n for (let j in variationAttribute.values) {\n if (variationAttribute.values[j].selected === true) {\n selectedVariation = variationAttribute.values[j].value;\n break;\n }\n }\n }\n // If a size is selected and selectable, retrieve its recommendation instead of variant color's one\n if (variationAttribute.attributeId === 'size') {\n for (let j in variationAttribute.values) {\n if (\n variationAttribute.values[j].selected === true &&\n variationAttribute.values[j].selectable === true\n ) {\n return product.id;\n }\n }\n }\n }\n\n return pid + '_color_' + selectedVariation;\n};\n\nconst crossSellItems = (product, type) => {\n if (!document.getElementById('crossSellItemsBaseUrl')) {\n return;\n }\n const pid = getProductVariationGroup(product, type);\n let requestUrl = document.getElementById('crossSellItemsBaseUrl').value;\n let isSizeChange = type === 'size';\n const promotionId = $('.marketing-messages.pdp .marketing-budge').data('promotion-id');\n $.ajax({\n url: requestUrl,\n method: 'GET',\n data: {\n pid: pid,\n promotionId: promotionId,\n },\n success: (data) => {\n const $result = $(data);\n\n const $completePromoData = $result.find('#completePromoProducts');\n const $completePromoSection = $('.js-completePromo');\n const $completePromoProducts = $completePromoSection.find('.crossSellContainer');\n $completePromoProducts.empty();\n if ($completePromoData.length) {\n $completePromoProducts.empty().append($completePromoData.html());\n $completePromoSection\n .find('.promo-budge-container')\n .empty()\n .append($('.marketing-messages.pdp .marketing-budge:first').text().trim());\n const $completePromoContainer = $result.find('#completePromoContainer');\n if ($completePromoContainer.length) {\n $completePromoSection\n .find('.js-completePromo-grid-info-description')\n .removeClass('hidden')\n .html($completePromoContainer.find('.js-promoDetails-description').html());\n $completePromoSection\n .find('.js-completePromo-grid-info-budge')\n .removeClass('hidden')\n .html($completePromoContainer.find('.js-promoDetails-calloutMsg').html());\n } else {\n $completePromoSection.find('.promo-more-info').addClass('hidden');\n }\n $completePromoSection.removeClass('hidden');\n checkCarouselLength('.js-promoCarousel');\n } else {\n $completePromoSection.addClass('hidden');\n }\n\n const $completeLookData = $result.find('#completeLookProducts');\n const $completeLookSection = $('.js-completeLook');\n const $completeLookProducts = $completeLookSection.find('.crossSellContainer');\n $completeLookProducts.empty();\n if ($completeLookData.length) {\n $completeLookProducts.empty().append($completeLookData.html());\n $completeLookSection.removeClass('hidden');\n checkCarouselLength('.js-lookCarousel');\n } else {\n $completeLookSection.addClass('hidden');\n }\n\n if ($completePromoData.length && $completeLookData.length) {\n $('.recommended-products-pdp').addClass('hidden');\n } else {\n $('.recommended-products-pdp').removeClass('hidden');\n }\n\n $('body').on(\n 'click',\n '.js-completePromo .crossSellContainer .js-pdp-link, .js-completeLook .crossSellContainer .js-pdp-link',\n (evt) => {\n // Open QuickView only not mobile\n\n evt.preventDefault();\n const url = evt.currentTarget.dataset.quickview;\n // Completa il tuo look\n let modalClass;\n if ($(evt.currentTarget).closest('.js-completeLook').length) {\n modalClass = 'complete-look-quick-view';\n }\n openQuickView(url, modalClass);\n\n /*\n else {\n if ($(evt.currentTarget).closest('.product').find('.add-to-cart-quick-add').attr('data-size-available') !== 'true') {\n evt.preventDefault();\n evt.stopPropagation();\n $(evt.currentTarget).closest('.product').find('.product-detail-quick-add').find('.js-panel-opener-size-quick-add').trigger('click', { mustAdd: true });\n }\n }\n */\n }\n );\n\n $('.js-completeLook .product-detail-quick-add .add-to-cart-quick-add').on(\n 'click',\n (e) => {\n if (\n $(e.currentTarget).attr('data-size-available') !== 'true' &&\n Foundation.MediaQuery.is('large')\n ) {\n e.preventDefault();\n e.stopPropagation();\n $(e.currentTarget)\n .closest('.product-detail-quick-add')\n .find('.js-panel-opener-size-quick-add')\n .trigger('click', {mustAdd: true});\n } else if (!Foundation.MediaQuery.is('large')) {\n e.preventDefault();\n e.stopPropagation();\n openQuickView(\n $(e.currentTarget)\n .closest('.product')\n .find('.js-pdp-link')\n .data('quickview'),\n 'complete-look-quick-view'\n );\n }\n }\n );\n\n setTimeout(function () {\n setMinHeightPromoPanel('.js-completePromo');\n setMinHeightPromoPanel('.js-completeLook');\n }, 300);\n $('body').trigger('product:crossSellLoaded', isSizeChange);\n },\n error: () => {\n $.spinner().stop();\n $('body').trigger('product:crossSellError');\n },\n });\n};\n\nconst openCurtain = () => {\n $('.overlay-pdp-mobile').show();\n $('#esw-fab').addClass('ui-eswback');\n};\n\nconst closeCurtain = () => {\n $('.overlay-pdp-mobile').hide();\n $('#esw-fab').removeClass('ui-eswback');\n};\n\nfunction closeAllOpenMenus() {\n if (Foundation.MediaQuery.atLeast('medium')) {\n return;\n }\n // Close open menus\n $('.js-select-size-for-mobile').addClass('hidden').removeClass('open');\n $('.js-select-color-for-mobile').addClass('hidden').removeClass('open');\n $('.js-panel-opener-color').removeClass('on');\n $('.js-panel-opener-size').removeClass('on');\n closeCurtain();\n}\n\nfunction removeNulls(el) {\n var price = el.find('.analytics').data('price');\n if (\n !price ||\n price == null ||\n price === 'null' ||\n price === '' ||\n price === 0 ||\n price == '0.00'\n ) {\n el.css('display', 'none');\n return true;\n }\n return false;\n}\n\nconst updatePrimaryImagesSlide = () => {\n let height = $('.primary-images .slick-active').outerHeight();\n $('.primary-images .slick-list').outerHeight(height);\n $('#miniatureVerticalImg .slide').removeClass('active');\n let index = $('.primary-images .slick-active').data('index');\n $(`#miniatureVerticalImg .slide[data-index=\"${index}\"]`).addClass('active');\n};\n\nconst enableImageSlideHeightObservers = () => {\n let imgNode = $('.primary-images .slick-list .carousel-item:first-child img');\n if (imgNode.length) {\n let config = {attributes: true, childList: true, subtree: true};\n let callback = function (mutationsList, observer) {\n for (let index = 0; index < mutationsList.length; index++) {\n let mutation = mutationsList[index];\n if (\n mutation.type === 'attributes' &&\n mutation.attributeName === 'class' &&\n mutation.target.classList.contains('lazyloaded')\n ) {\n updatePrimaryImagesSlide();\n }\n }\n };\n let observer = new MutationObserver(callback);\n observer.observe(imgNode[0], config);\n }\n let slickNode = $('.primary-images .slick-track');\n if (slickNode.length) {\n let config = {attributes: true, childList: true, subtree: true};\n let callback = function (mutationsList, observer) {\n for (let index = 0; index < mutationsList.length; index++) {\n let mutation = mutationsList[index];\n if (mutation.type === 'attributes' && mutation.attributeName === 'style') {\n updatePrimaryImagesSlide();\n }\n }\n };\n let observer = new MutationObserver(callback);\n observer.observe(slickNode[0], config);\n }\n};\n\nconst destroyPrimaryImagesSlider = () => {\n if (\n Foundation.MediaQuery.is('medium') &&\n $('.product-detail-keeper').length &&\n !$('.product-quickview.product-detail').length &&\n $('.primary-images').hasClass('slick-initialized')\n ) {\n $('.primary-images')\n .off('afterChange', updatePrimaryImagesSlide)\n .off('init', enableImageSlideHeightObservers)\n .slick('unslick');\n }\n};\n\nconst initializePrimaryImagesSlider = () => {\n if (\n $('.product-detail-keeper').length &&\n !$('.product-quickview.product-detail').length &&\n !$('.primary-images').hasClass('slick-initialized')\n ) {\n $('.primary-images').slick({\n arrows: false,\n dots: true,\n infinite: false,\n draggable: true,\n slidesToShow: 1,\n slidesToScroll: 1,\n responsive: [\n {\n breakpoint: 1023,\n settings: {\n slidesToShow: 1.4,\n slidesToScroll: 1,\n },\n },\n {\n breakpoint: 765,\n settings: {\n slidesToShow: 1.07,\n slidesToScroll: 1,\n },\n },\n ],\n });\n }\n\n const disableAutoScroll = () => {\n $('.primary-images').slick('slickPause');\n $('body').off('touchstart', this);\n };\n $('body').on('touchstart', disableAutoScroll);\n};\n\nconst updatePrimaryImagesSlider = (primaryImages) => {\n if (\n Foundation.MediaQuery.is('medium') &&\n $('.product-detail-keeper').length &&\n !$('.product-quickview.product-detail').length\n ) {\n initializePrimaryImagesSlider();\n let carouselItems = $('.primary-images .carousel-item');\n if (carouselItems.length) {\n for (let i = primaryImages.length; i < carouselItems.length; i++) {\n $('.primary-images').slick('slickRemove', primaryImages.length);\n }\n }\n }\n};\n\nclass Product {\n run() {\n ProductHelpers.run();\n // this.updateAttributesAndDetails();\n this.showSpinner();\n this.updateAttribute();\n this.updateAddToCart();\n this.updateAvailability();\n // this.sizeChart();\n this.getCrossSellItems();\n this.afterUpdateImages();\n this.recentlyViewedItems();\n this.buyNowQuichview();\n this.suggedtedProductsPDP();\n this.observeCurtainTap();\n this.removeNullCrossSell();\n this.pdpCrossSell();\n this.handleAccordionsInPDP();\n this.changeAddToBagButton();\n initializePrimaryImagesSlider();\n }\n\n changeAddToBagButton() {\n $('body').on('click', '.js-add-to-cart', function (e) {\n var button = $(this);\n\n $('body').on('product:afterAddToCart', function () {\n button.addClass('clicked');\n setTimeout(() => {\n button.removeClass('clicked');\n }, 3000);\n });\n });\n }\n\n removeNullCrossSell() {\n $('body').on('product:crossSellLoaded', function (e) {\n let $container = $('.js-completePromo .crossSellContainer');\n let index = 0;\n let items = $container.find('.js-cross-product').length;\n $container.find('.js-cross-product').each(function () {\n if (removeNulls($(this))) {\n index++;\n }\n });\n if (index == items) {\n $('.js-completePromo').addClass('hidden');\n }\n\n $container = $('.js-completeLook .crossSellContainer');\n index = 0;\n items = $container.find('.js-cross-product').length;\n $container.find('.js-cross-product').each(function () {\n if (removeNulls($(this))) {\n index++;\n }\n });\n if (index == items) {\n $('.js-completeLook').addClass('hidden');\n }\n });\n $('body').on(\n 'listing:einsteinloadedSuggestedProducts listing:einsteinloaded',\n function (e) {\n let $container = $('.js-em__carouselCustom');\n let index = 0;\n $container.find('.cc-emCarouselEditProd__item').each(function () {\n if (removeNulls($(this))) {\n index++;\n }\n });\n if (index > 0) {\n localStorage.setItem('suggestedProductsWithNullPrice', index);\n }\n setMinHeightPromoPanel('.recommended-products-pdp');\n }\n );\n $('body').on('listing:einsteinloadedSuggestedProducts', function (e) {\n let $container = $('.js-em__carouselCustom');\n let index = 0;\n $container.find('.cc-emCarouselEditProd__item').each(function () {\n if (removeNulls($(this))) {\n index++;\n }\n });\n if (index > 0) {\n localStorage.setItem('suggestedProductsWithNullPrice', index);\n }\n setMinHeightPromoPanel('.recommended-products-pdp');\n });\n if ($('.suggested-products-slider.slick-initialized').length) {\n $('body').trigger('listing:einsteinloadedSuggestedProducts', {\n container: '.suggested-products-slider',\n type: 'suggested-products',\n });\n }\n }\n\n observeCurtainTap() {\n $('.overlay-pdp-mobile').on('click', function (e) {\n if ($(this).css('display') !== 'none' && !Foundation.MediaQuery.atLeast('medium')) {\n closeAllOpenMenus();\n }\n });\n }\n\n recentlyViewedItems() {\n $('body').on('click', '.recentlyviewed .js-pdp-link', (evt) => {\n if (Foundation.MediaQuery.is('medium')) {\n evt.preventDefault();\n const url = evt.currentTarget.dataset.quickview;\n openQuickView(url);\n\n // trigger for analytics product detail event\n const target = $(evt.currentTarget).closest('.product');\n if (target.length > 0) {\n $('body').trigger('product:analyticsProductDetails', target);\n }\n }\n });\n }\n\n buyNowQuichview() {\n $('body').on('click', 'button.add-to-cart-quick-view', (e) => {\n e.preventDefault();\n openQuickView($(e.currentTarget).data('url'));\n });\n }\n\n suggedtedProductsPDP() {\n $('body').on('click', '.pdp-recommendations .js-pdp-link', (e) => {\n const $buyNowCta = $(e.currentTarget)\n .closest('.product')\n .find('.add-to-cart-quick-view');\n if ($buyNowCta.length) {\n e.preventDefault();\n e.stopPropagation();\n $buyNowCta.trigger('click');\n }\n });\n }\n\n getCrossSellItems() {\n $('body').on('product:afterAttributeSelect', (e, data) => {\n if (data.container.hasClass('product-quickview')) {\n return;\n }\n if (data.type === 'color' || data.type === 'size') {\n crossSellItems(data.data.product, data.type);\n }\n });\n }\n\n afterUpdateImages() {\n $('body').on('product:afterAttributeSelect', (e) => {\n computeCurrentlyVisibleImage(e);\n });\n }\n\n showSpinner() {\n $('body').on('product:beforeAddToCart product:beforeAttributeSelect', () => {\n $.spinner().start();\n });\n }\n\n updateAttribute() {\n $('body').on('product:afterAttributeSelect', (e, response) => {\n if ($('.product-detail>.bundle-items').length) {\n response.container.data('pid', response.data.product.id);\n response.container.find('.product-id').text(response.data.product.id);\n } else if ($('.product-set-detail').eq(0)) {\n response.container.data('pid', response.data.product.id);\n response.container.find('.product-id').text(response.data.product.id);\n } else {\n $('.product-id').text(response.data.product.id);\n $('.product-detail:not(\".bundle-item\")').data('pid', response.data.product.id);\n }\n });\n }\n\n updateAddToCart() {\n $('body').on('product:updateAddToCart', function (e, response) {\n if (\n $('.page').data('action') === 'Product-Show' &&\n !response.product.comingSoon &&\n !response.product.availability.orderable &&\n !response.product.availability.available\n ) {\n $('button.js-add-to-cart', '#fis-select-size').prop('disabled', true);\n $('button.js-add-to-cart', '#fis-select-size').data('disabled', true);\n return;\n }\n $('button.js-add-to-cart, button.add-to-cart-global').prop(\n 'disabled',\n !response.product.available || response.product.comingSoon\n );\n $('button.js-add-to-cart, button.add-to-cart-global').data(\n 'disabled',\n !response.product.readyToOrder\n );\n });\n }\n\n pdpCrossSell() {\n $('.js-shopTheLook-button').on('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n let htmlContent = $('.pdp-buy-look-container').html();\n const modal = newModalFromString(htmlContent, false, [\n 'cc-pdpCrossSell',\n 'js-pdpCrossSell',\n ]);\n $(modal.modalBox).addClass(\n 'rightModalAttribute cc-pdpCrossSell-modalBox rightModalAttribute_sizeLarge'\n );\n modal.open();\n initProductTile();\n\n $(modal.modalBox).on('click', '.js-pdpCrossSell-close', (e) => {\n e.preventDefault();\n modal.close();\n modal.destroy();\n });\n $(modal.modalBox).on('click', '.color-variation', (e) => {\n e.preventDefault();\n modal.close();\n modal.destroy();\n });\n\n $('body').trigger('product:buyLookBtnAnalytics', true);\n });\n\n $('.pdp-buy-look-container').on('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n $('.js-shopTheLook-button').removeClass('hidden');\n $('.embedded-service').removeClass('hide-for-STL');\n $('.img-wrapper .cell.hide-for-large > .icon-container').css('opacity', '1');\n $('.pdp-buy-look-container').addClass('hidden');\n });\n\n $('.pdp-buy-look-container').on('click', '.cross-sell-item', (e) => {\n e.preventDefault();\n e.stopPropagation();\n openQuickView($(e.currentTarget).data('url'));\n });\n\n $('body').on('product:afterAttributeSelect', (e, d) => {\n if (d.type !== 'color' || d.container.hasClass('product-quickview')) {\n return;\n }\n $('.js-shopTheLook-button').addClass('hidden');\n $('.pdp-buy-look-container').addClass('hidden');\n var pdpCrossSell = d.data.product.pdpCrossSell;\n if (!pdpCrossSell) {\n return;\n }\n\n $('.cross-sell-item').addClass('hidden');\n pdpCrossSell.forEach((cs, i) => {\n const $csItem = $(`.cross-sell-item[data-index=\"${i}\"]`);\n $csItem.data('url', cs.url);\n $csItem.find('.image').attr('src', cs.image);\n $csItem.find('.name').text(cs.name);\n $csItem.removeClass('hidden');\n });\n $('.js-shopTheLook-button').removeClass('hidden');\n });\n }\n\n updateAvailability() {}\n\n handleAccordionsInPDP() {\n if ($('.js-intProductDetail-details').length > 0) {\n if (!Foundation.MediaQuery.atLeast('large')) {\n /* Shipping accordion */\n if ($('.js-details-accordion_shipping').length > 0) {\n var $detailsAccordionShipping = $('.js-details-accordion_shipping');\n $('.js-details-shipping-content', $detailsAccordionShipping)\n .removeClass('accordion-content-visible')\n .addClass('accordion-content');\n $('.js-details-title', $detailsAccordionShipping).addClass('accordion-title');\n }\n /* Description accordion */\n if ($('.js-details-accordion_description').length > 0) {\n var $detailsAccordionDescription = $('.js-details-accordion_description');\n $('.js-details-description-content', $detailsAccordionDescription)\n .removeClass('accordion-content-visible')\n .addClass('accordion-content');\n $('.js-details-title', $detailsAccordionDescription).addClass(\n 'accordion-title'\n );\n }\n } else {\n $('.js-accordionDetails')\n .removeClass('accordion-title')\n .on('click', function (e) {\n const htmlContent = $('.js-detailsPopup').html();\n const modal = newModalFromString(htmlContent, false, ['cc-detailsPopup']);\n $(modal.modalBox).addClass(\n 'rightModalAttribute cc-detailsPopup-modalBox rightModalAttribute_sizeMedium'\n );\n\n handleDetailsTabs($(e.currentTarget).data('tab'));\n\n modal.open();\n\n if ($('.pdp-size-box').hasClass('size-selected')) {\n $('#main-and-care-label').addClass('hidden');\n }\n\n $('.js-detailsPopup-tabLink').on('click', function (e) {\n handleDetailsTabs($(e.currentTarget).data('tab'));\n });\n\n $(modal.modalBox)\n .find('.js-detailsPopup-close')\n .on('click', function () {\n $(modal.modalBox)\n .addClass('cc-modalClosing')\n .on(\n 'transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd',\n function () {\n modal.close();\n }\n );\n });\n });\n }\n }\n }\n}\n\nconst product = new Product();\nexport default product;\nexport {\n crossSellItems,\n computeCurrentlyVisibleImage,\n activatePromoAnimationMessage,\n closeAllOpenMenus,\n initializePrimaryImagesSlider,\n updatePrimaryImagesSlider,\n destroyPrimaryImagesSlider,\n};\n","'use strict';\nimport {\n newModalFromString,\n newModalFromSelector\n} from '../components/modal';\nimport ProductHelpers from './base';\nimport sizePanel from './sizePanel';\n\nclass SmartGiftHelper {\n constructor () {\n this.basketBeforeRemovedProduct = [];\n this.basketObserverEnabled = false;\n this.basketAlreadyFetched = false;\n }\n\n run () {\n $('body').on('click', '.js-smart-gift', (e) => {\n let pid = ProductHelpers.methods.getPidValue($(e.currentTarget));\n if (!ProductHelpers.isSizeSelected()) {\n sizePanel.openSizePanel(sizePanel.Types.SMARTGIFT);\n } else {\n this.addSmartGift(pid);\n this.enableAnalyticsBasketObserver();\n }\n });\n\n let analyticsDataButton = {\n action: '',\n skus: '',\n quantity: ''\n };\n let basketButtonsSelector = '.sidebar-widget .sidebar-continue-shopping-button,';\n basketButtonsSelector += '.sidebar-widget .widget-summary-button';\n $('body').on('click', basketButtonsSelector, (event) => {\n if (SGBasket) {\n if ($(event.currentTarget).hasClass('sidebar-continue-shopping-button')) {\n analyticsDataButton.action = 'continue_shopping';\n } else if ($(event.currentTarget).hasClass('widget-summary-button')) {\n analyticsDataButton.action = 'prepare_my_gift';\n }\n analyticsDataButton.skus = this.getSkus();\n analyticsDataButton.quantity = this.getSkusQuantity();\n $('body').trigger('analytics:smartGiftBasketButtons', analyticsDataButton);\n }\n });\n\n $('body').on('click', '.sidebar-widget .SGBasketButton', () => {\n if (SGBasket) {\n $('body').trigger('analytics:smartGiftBasketIcon');\n }\n });\n\n $('body').on('click', '.smart-gift-rules-label, .js-smart-gift-rules', () => {\n $('body').trigger('analytics:smartGiftMoreInfo');\n });\n };\n\n addRecommendedItems(data){\n var eachSuggestion = $('.box-complete-yourlook .product');\n let dataSuggestion = [];\n var suggestionLength = eachSuggestion.length > 3 ? 3 : eachSuggestion.length;\n for (var i = 0; i < suggestionLength; i++){\n let suggestionItem = {};\n let infoSuggestion = eachSuggestion[i].querySelector('.productListingItem');\n let imgSuggestion = eachSuggestion[i].querySelector('.tile-image');\n let hrefSuggestion = eachSuggestion[i].querySelector('.product-tile');\n suggestionItem.skuCode = eachSuggestion[i].dataset.pid.replace('~', '/');\n suggestionItem.name = imgSuggestion.title;\n suggestionItem.price = infoSuggestion.dataset.price;\n suggestionItem.skuUrl = hrefSuggestion.href;\n suggestionItem.image = imgSuggestion.src || imgSuggestion.dataset.src;\n dataSuggestion.push(suggestionItem);\n }\n data.recommendedItems = dataSuggestion;\n };\n\n addSmartGift(pid){\n let data = {};\n data.skuCode = pid.replace('~', '/');\n data.name = $('h1[itemprop=\"name\"]').text();\n data.price = $('.product.analytics').data('price');\n data.skuUrl = window.location.href;\n data.image = $('.still-life-img').data('still-life');\n let nameEng = $('.product.analytics').data('name');\n data.nameEng = nameEng;\n\n this.addRecommendedItems(data);\n\n SGBasket.addItem(data);\n console.log(data);\n $('body').trigger('analytics:addSmartGift', { sku: data.skuCode, name: nameEng });\n };\n\n getSkus () {\n let skus = [];\n SGBasket.state.basket.forEach((element) => {\n skus.push(element.skuCode);\n });\n return skus;\n };\n\n getSkusQuantity () {\n return SGBasket.state.basket.length;\n };\n\n getBasket () {\n let basket = [];\n if (SGBasket) {\n SGBasket.state.basket.forEach((element) => {\n basket.push(element);\n });\n return basket;\n }\n };\n\n setAnalyticsProductIndex () {\n $('.product-list .sc-bxivhb .product-item-text-rmv').each(function (index) {\n $(this).attr('data-analytics-product-index', index);\n });\n };\n\n triggerRemoveProduct (removedProduct) {\n let productUrl = $('.product-detail.product-wrapper').data('variationInfo').replace('PID_PLACEHOLDER', removedProduct.skuCode);\n let nameEng = '';\n $.get({\n url: productUrl,\n success: data => {\n if (data.product && data.product.nameEng) {\n nameEng = data.product.nameEng;\n }\n $('body').trigger('analytics:smartGiftBasketRemoveProduct', {productName: nameEng, sku: removedProduct.skuCode});\n },\n error: function () {\n $.spinner().stop();\n }\n });\n };\n\n enableAnalyticsBasketObserver() {\n if (SGBasket && !this.basketObserverEnabled) {\n this.basketObserverEnabled = true;\n let targetWidgetNode = $('.SGBasket-widget')[0];\n if (targetWidgetNode) {\n let config = { attributes: true, childList: true, subtree: true };\n let _self = this;\n let callback = function (mutationsList, observer) {\n for (let index = 0; index < mutationsList.length; index++) {\n let mutation = mutationsList[index];\n if (mutation.type === 'attributes' &&\n mutation.target.nodeName === 'DIV' &&\n $(mutation.target).hasClass('showOverview') &&\n $(mutation.target).hasClass('show') &&\n !_self.basketAlreadyFetched) {\n _self.basketAlreadyFetched = true;\n _self.setAnalyticsProductIndex();\n _self.basketBeforeRemovedProduct = _self.getBasket();\n const clickedProduct = function (event) {\n event.stopImmediatePropagation();\n let productIndex = $(this).data('analyticsProductIndex');\n let removedProduct = _self.basketBeforeRemovedProduct.splice(productIndex, 1)[0];\n _self.triggerRemoveProduct(removedProduct);\n };\n $('.product-list .product-item-text-rmv').on('click', clickedProduct);\n } else if (mutation.type === 'attributes' &&\n mutation.target.nodeName === 'DIV' &&\n $(mutation.target).hasClass('showOverview') &&\n $(mutation.target).hasClass('hide')) {\n _self.basketAlreadyFetched = false;\n }\n }\n };\n let observer = new MutationObserver(callback);\n observer.observe(targetWidgetNode, config);\n }\n }\n };\n}\n\nconst smartGiftHelper = new SmartGiftHelper();\nexport default smartGiftHelper;\n","'use strict';\n\n/**\n * Replace the URL query string color during color selection update in PDP.\n * @param {string} needle parameter to detect the key, e.g. \"_COL_\", \"_COLORI_\", etc.\n * @param {string} color new color to be submitted\n */\nconst updateProductDetailUrl = (needle, color) => {\n // Build url object\n var urlObject = new URL(window.location.href);\n var queryString = urlObject.searchParams;\n\n // Retrieve exact key name to be replaced\n var qsKeyToUpdate;\n for (var qsKey of queryString.keys()) {\n var qsValue = queryString.get(qsKey);\n if (qsKey.toLowerCase().indexOf(needle) !== -1 && qsValue) {\n qsKeyToUpdate = qsKey;\n break;\n }\n }\n\n // Cancel action if key is not found\n if (!qsKeyToUpdate) {\n return;\n }\n\n // Push new value to querystring key obtained above\n urlObject.searchParams.set(qsKeyToUpdate, color);\n // Replace current URL with new\n window.history.replaceState(null, document.title, urlObject.href);\n};\n\nexport {\n updateProductDetailUrl\n};\n","'use strict';\n\nclass Analytics {\n constructor () {\n this.helper = require('./helpers/helper');\n this.quickImpressionSender = require('./helpers/quickImpressions');\n this.logName = 'Analytics';\n\n this.testMode = this.helper.isTestEnabled();\n }\n init (globalContainer, helperContainer) {\n this.globalContainer = globalContainer;\n this.helperContainer = helperContainer;\n this.helperData = this.helperContainer.data();\n\n if (this.testMode) {\n console.info(this.logName + ' Initialized!');\n }\n }\n\n log (data, inline = false) {\n if (!this.testMode) {\n return;\n }\n if (inline) {\n console.info(this.logName + ': ' + data);\n } else {\n console.info(this.logName + ': ');\n console.info(data);\n }\n }\n\n push (pushObject) {\n this.log(pushObject);\n this.helper.push(pushObject, false);\n }\n\n generateAnalyticsSku (fullPageLoad = false) {\n let sku = $('.analytics.product').length ? $('.analytics.product').data('id') : '';\n let color = '';\n let size = '';\n let isPdp = this.helper.checkPage('/product/');\n if (fullPageLoad && isPdp) {\n color = $('.analytics.product').data('variant');\n size = $('.analytics.product').data('size');\n } else {\n color = $('.swatch-circle.selected').data('attr-value');\n size = $('[data-attr=\"size\"] input:checked').attr('id');\n }\n if (color && size) {\n sku = sku + '_' + color + '_' + size;\n } else if (color) {\n sku = sku + '_' + color;\n }\n sku = sku.trim();\n return sku.toUpperCase();\n }\n};\n\nmodule.exports = Analytics;\n","'use strict';\n\nimport { newModalFromString } from '../components/modal';\n\nexport const bonusProductModalListener = (e) => {\n $('body').on('click', '#checkout-button-secure-checkout', function (e) {\n e.preventDefault();\n if ($('.wrapper-bonus-product-button').length > 0) {\n openBonusModal(e);\n } else {\n window.location.href = $(e.currentTarget).data('url');\n }\n });\n};\n\nexport const openBonusModal = e => {\n if ($('.modal-was-closed').val() === 'true') {\n window.location.href = $(e.currentTarget).data('url');\n return;\n }\n if ($('.tingle-modal.layer-bonus-modal').length > 0) {\n return;\n }\n const htmlContent = $('#pendingBonusModal').clone().html();\n const onClose = () => {\n $('.modal-was-closed').val('true');\n };\n var modal = newModalFromString(htmlContent, false, ['layer-bonus-modal'], null, onClose);\n modal.open();\n $(modal.modalBox).addClass('rightModalAttribute');\n if ($('.layer-minicart-modal').hasClass('tingle-modal--visible')) {\n $(modal.modalBox).addClass('minicart-style');\n }\n $(modal.modalBox)\n .find('.close-button-info')\n .on('click', function () {\n modal.close();\n });\n $(modal.modalBox)\n .find('.js-proceed-to-checkout')\n .on('click', function (e) {\n $('.modal-was-closed').val('true');\n modal.close();\n if ($('.modal-was-closed').hasClass('klarna')) {\n $('.js-ModalExpressButton-klarna').trigger('click');\n } else if ($('.modal-was-closed').hasClass('apple')) {\n $('.js-ModalExpressButton-applePay').trigger('click');\n } else if ($('.modal-was-closed').hasClass('amazon')) {\n $('.js-ModalExpressButton-amazonPay').trigger('click');\n } else if ($('.modal-was-closed').hasClass('paypal')) {\n $('.js-ModalExpressButton-paypal').trigger('click');\n } else {\n window.location.href = $(e.currentTarget).data('url');\n }\n });\n $(modal.modalBox)\n .find('.js-choose-gift-details')\n .on('click', function (e) {\n var uuid = $(e.currentTarget).data('uuid');\n modal.close();\n $('.bonus-product-button[data-duuid=\"' + uuid + '\"]').trigger('click');\n });\n};\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","'use strict';\n\nclass Accordion {\n setup (element = false) {\n this.accordionElement = element || $('.accordion');\n this.init();\n var _closeAllAcordion = this.closeAllAcordionItems;\n var _closeActiveAccordion = this.closeActiveAccordion;\n this.accordionElement.on('click', '.accordion-title:not(.disabled)', function (e) {\n e.preventDefault();\n if (!$(e.currentTarget).hasClass('js-find-in-store-btn')) {\n e.stopPropagation();\n } \n const $accordion = $(this).closest('.accordion');\n const $item = $(this).closest('.accordion-item');\n const $content = $(this).next('.accordion-content');\n const breakpoint = $accordion.data('accordion-size');\n\n const closeAllOpenPanels = !$accordion.hasClass('multiple-panels') && !$(this).parent().hasClass('active');\n const closeActivePanel = $(this).parent().hasClass('active');\n\n if (breakpoint === 'small' && !Foundation.MediaQuery.atLeast('medium')) {\n if (closeAllOpenPanels) {\n _closeAllAcordion($accordion);\n\n $content.slideDown({\n progress: function () {\n if ($item.offset().top < ($(window).scrollTop() + $('header').height())) {\n window.scrollTo(0, ($item.offset().top - $('header').height()));\n }\n }\n });\n }\n\n $item.addClass('active');\n\n if (closeActivePanel) {\n _closeActiveAccordion($item);\n }\n } else if (breakpoint === 'medium' && !Foundation.MediaQuery.atLeast('large')) {\n if (closeAllOpenPanels) {\n _closeAllAcordion($accordion);\n }\n\n $item.addClass('active');\n $content.slideDown({\n progress: function () {\n if ($item.offset().top < ($(window).scrollTop() + $('header').height())) {\n window.scrollTo(0, ($item.offset().top - $('header').height()));\n }\n }\n });\n } else if (breakpoint === 'tablet' && !Foundation.MediaQuery.atLeast('large')) {\n if (closeAllOpenPanels) {\n _closeAllAcordion($accordion);\n }\n\n $item.addClass('active');\n $content.slideDown({\n progress: function () {\n if ($item.offset().top < ($(window).scrollTop() + $('header').height())) {\n window.scrollTo(0, ($item.offset().top - $('header').height()));\n }\n }\n });\n } else if (breakpoint === 'all') {\n if (closeAllOpenPanels) {\n _closeAllAcordion($accordion);\n $('body').trigger('accordion:breakpoint-all-expanded', $item);\n }\n\n $item.addClass('active');\n $content.slideDown({\n progress: function () {\n if ($item.offset().top < ($(window).scrollTop() + $('header').height())) {\n window.scrollTo(0, ($item.offset().top - $('header').height()));\n }\n }\n });\n }\n });\n this.accordionElement.on('keydown', '.accordion-title:not(.disabled)', function (e) {\n if (e.type === 'keydown' && e.originalEvent.code === 'Enter') {\n $(e.currentTarget).trigger('click');\n }\n });\n // close at click\n this.accordionElement.on('click', '.accordion-item.active .accordion-title', function (e) {\n e.preventDefault();\n $(e.currentTarget).siblings('.accordion-content').slideUp('fast');\n $(e.currentTarget).closest('.accordion-item').removeClass('active');\n });\n\n $(window).on('changed.zf.mediaquery', () => {\n this.init();\n });\n\n this.accordionElement.find('.accordion-item[data-open-on-init=\"true\"]').find('.accordion-title').trigger('click');\n }\n\n init () {\n this.accordionElement.each(function () {\n const $accordion = $(this).closest('.accordion');\n const breakpoint = $accordion.data('accordion-size');\n\n if (breakpoint === 'small' && !Foundation.MediaQuery.atLeast('medium')) {\n $accordion.addClass('initialized');\n $accordion.find('.accordion-content').hide();\n } else if (breakpoint === 'medium' && !Foundation.MediaQuery.atLeast('large')) {\n $accordion.addClass('initialized');\n $accordion.find('.accordion-content').hide();\n } else if (breakpoint === 'tablet' && !Foundation.MediaQuery.atLeast('large')) {\n $accordion.addClass('initialized');\n $accordion.find('.accordion-content').hide();\n } else if (breakpoint !== 'all') {\n $accordion.removeClass('initialized');\n $accordion.find('.accordion-content').show();\n } else if (breakpoint === 'all') {\n $accordion.addClass('initialized');\n $accordion.find('.accordion-content').hide();\n }\n });\n }\n\n closeAllAcordionItems ($accordionContainer) {\n $accordionContainer.find('.accordion-content').slideUp('fast');\n $accordionContainer.find('.accordion-item').removeClass('active');\n }\n\n closeActiveAccordion ($accordionItem) {\n $accordionItem.removeClass('active');\n $accordionItem.find('.accordion-content').slideUp('fast');\n }\n}\n\nconst accordion = new Accordion();\nexport default accordion;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","import {newModalFromString} from './components/modal';\n\nclass ProfileEnrich {\n init () {\n // this.initOutsideClickHandler();\n this.initNextButton();\n this.initPrevButton();\n this.enableNextButton();\n this.initCheckboxes();\n }\n\n initOutsideClickHandler () {\n if ($('.page').data('action') !== 'Account-EnrichForm') {\n return;\n }\n var elementsSelector = '.cc-accountNavigation, header, .js-myInformation-chips, .js-menu-tab, .cc-accountBreadcrumbs__link, .cc-mainHeader-item, .js-mainHeader-search';\n var _self = this;\n\n $(elementsSelector).on('click', function (e) {\n var clickedElement = $(e.target);\n var $isOutsideClicked = $('#isOutsideClicked');\n if ($isOutsideClicked.val() === 'false') {\n e.preventDefault();\n $isOutsideClicked.val('true');\n _self.openExitModal(clickedElement);\n }\n });\n }\n\n initNextButton () {\n var _self = this;\n $('input').on('change', function (e) {\n _self.enableNextButton();\n });\n $('.js-proceed-next-step').on('click', function (e) {\n var currentStep = $(e.currentTarget).attr('data-step');\n var formData = {};\n var checkboxesChecked;\n if ($('.step-container.' + currentStep + ' .js-step-section:not(.inactive)').length > 0) {\n checkboxesChecked = $('.step-container.' + currentStep + ' .js-step-section:not(.inactive) input[type=\"checkbox\"]:checked');\n } else {\n checkboxesChecked = $('.step-container.' + currentStep + ' input[type=\"checkbox\"]:checked');\n }\n var preferences = [];\n var analyticsData = [];\n var categories = [];\n var subcategories = [];\n\n checkboxesChecked.each(function () {\n preferences.push($(this).val());\n if ($(this).attr('data-analytics')) {\n analyticsData.push($(this).attr('data-analytics').toLowerCase());\n };\n if ($(this).attr('data-analytics-category')) {\n categories.push($(this).attr('data-analytics-category').toLowerCase());\n };\n if ($(this).attr('data-analytics-subcategory')) {\n subcategories.push($(this).attr('data-analytics-subcategory').toLowerCase());\n };\n });\n formData.preferences = preferences.join(',');\n formData.isLastStep = _self.isLastStep() || _self.isFinalEditStep();\n _self.callSavePreference(formData);\n _self.applyDependences(preferences);\n\n $('body').trigger('analytics:profileEnrich', {\n step: currentStep,\n preferences: analyticsData,\n categories: categories,\n subcategories: subcategories});\n window.scrollTo(0, 0);\n });\n }\n\n enableNextButton () {\n var allSectionsValid = true;\n var $mappingContainer = $('.mapping-container');\n var currentStep = $mappingContainer.attr('data-step');\n var sections = $('.step-container.' + currentStep + ' .js-step-section:not(.inactive)');\n\n if (sections.length > 0) {\n if (currentStep === 'step_4') {\n sections.each(function () {\n var sectionChecked = $(this).find('input:not(.js-child-accordion):checked').length;\n if (sectionChecked === 0) {\n allSectionsValid = false;\n return false; // Exit the loop if any section is invalid\n }\n });\n }\n\n var parentSections = $('.step-container.' + currentStep + ' .js-step-section:not(.inactive) .js-has-subitem .js-select-accordion:checked');\n parentSections.each(function () {\n if ($(this).closest('.js-has-subitem').find('.js-child-accordion:checked').length === 0) {\n allSectionsValid = false;\n return false;\n }\n });\n\n if (allSectionsValid !== false) {\n if ($('.step-container.' + currentStep + ' .js-step-section:not(.inactive)').find('input:not(.js-child-accordion):checked').length > 0) {\n allSectionsValid = true;\n } else {\n sections.each(function () {\n var sectionChecked = $(this).find('input:not(.js-child-accordion):checked').length;\n if (sectionChecked === 0) {\n allSectionsValid = false;\n return false; // Exit the loop if any section is invalid\n }\n });\n }\n }\n } else {\n var checked = $('.step-container.' + currentStep + ' input:checked').length;\n if (checked === 0) {\n allSectionsValid = false;\n }\n }\n\n if (allSectionsValid) {\n $('.js-proceed-next-step').prop('disabled', false);\n $('.js-proceed-last-step').prop('disabled', false);\n } else {\n $('.js-proceed-next-step').prop('disabled', true);\n $('.js-proceed-last-step').prop('disabled', true);\n }\n }\n\n initPrevButton () {\n var _self = this;\n $('.js-proceed-prev-step').on('click', function (e) {\n _self.moveToPrevStep();\n window.scrollTo(0, 0);\n });\n }\n\n callSavePreference (formData) {\n var _self = this;\n var url = $('#savePreferenceUrl').val();\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: formData,\n success: function (data) {\n $.spinner().stop();\n if (data.success) {\n _self.moveToNextStep();\n } else {\n\n }\n },\n error: function (data) {\n $.spinner().stop();\n }\n });\n }\n\n moveToNextStep () {\n var lastStep = $('#lastStep').val();\n var mainPageUrl = $('#mainPageUrl').val();\n var $mappingContainer = $('.mapping-container');\n var currentStep = $mappingContainer.attr('data-step');\n var currentStepIndex = parseInt(currentStep.split('_')[1]);\n var nextStepIndex = currentStepIndex + 1;\n var nextStep = 'step_' + nextStepIndex;\n var isFinalEditStep = this.isFinalEditStep();\n if (currentStep === lastStep || isFinalEditStep) {\n window.location.href = mainPageUrl;\n } else {\n $mappingContainer.attr('data-step', nextStep);\n }\n this.enableNextButton();\n }\n\n isFinalEditStep () {\n var isProfileEnriched = $('#isProfileEnriched').val() === 'true';\n if (!isProfileEnriched) return false;\n var currentStep = this.getCurrentStep();\n return currentStep !== 'step_1';\n }\n\n getCurrentStep () {\n return $('.mapping-container').attr('data-step');\n }\n\n getCurrentStepDependencies () {\n var currentStep = this.getCurrentStep();\n return $('.step-container.' + currentStep).attr('data-dependencies');\n }\n\n applyDependences (preferences) {\n var dependencies = this.getCurrentStepDependencies();\n var currentStep = this.getCurrentStep();\n var currentStepIndex = parseInt(currentStep.split('_')[1]);\n var nextStepIndex = currentStepIndex + 1;\n var nextStep = 'step_' + nextStepIndex;\n if (dependencies === undefined || dependencies === '') {\n return;\n }\n var $dependentElements = $('.step-container.' + nextStep + ' .js-step-section');\n $dependentElements.toArray().forEach(element => {\n var dependenciesCodes = $(element).attr('data-dependencies-code');\n if (preferences.indexOf(dependenciesCodes) === -1) {\n $(element).addClass('inactive');\n } else {\n $(element).removeClass('inactive');\n }\n });\n }\n\n moveToPrevStep () {\n var $mappingContainer = $('.mapping-container');\n var currentStep = this.getCurrentStep();\n var currentStepIndex = parseInt(currentStep.split('_')[1]);\n var nextStepIndex = currentStepIndex - 1;\n var nextStep = 'step_' + nextStepIndex;\n $mappingContainer.attr('data-step', nextStep);\n this.enableNextButton();\n }\n\n initCheckboxes () {\n var checkboxes = $('.js-select-accordion');\n checkboxes.toArray().forEach(checkbox => {\n checkbox.addEventListener('change', () => {\n if (checkbox.checked) {\n $(checkbox).parents('.cc-final-sub-main-category-wrp').addClass('cc-active');\n } else {\n $(checkbox).parents('.cc-final-sub-main-category-wrp').removeClass('cc-active');\n }\n });\n });\n }\n\n openExitModal (clickedElement) {\n const htmlContent = $('#confirmExitModal').clone().html();\n var modal;\n var $isOutsideClicked = $('#isOutsideClicked');\n const onClose = () => {\n $isOutsideClicked.val('false');\n };\n modal = newModalFromString(htmlContent, false, [], null, onClose);\n modal.open();\n $(modal.modalBox)\n .find('.close-button-info')\n .on('click', function () {\n modal.close();\n });\n $(modal.modalBox).on('click', '.js-proceed-exit', function (e) {\n e.preventDefault();\n $isOutsideClicked.val('true');\n // clickedElement.trigger('click');\n var loyaltyPageUrl = $('#loyaltyPageUrl').val();\n window.location.href = loyaltyPageUrl;\n });\n\n $(modal.modalBox).on('click', '.js-exit', function (e) {\n e.preventDefault();\n modal.close();\n modal.destroy();\n });\n }\n\n isLastStep () {\n var lastStep = $('#lastStep').val();\n var $mappingContainer = $('.mapping-container');\n var currentStep = $mappingContainer.attr('data-step');\n return currentStep === lastStep;\n }\n}\n\nconst profileEnrich = new ProfileEnrich();\nexport default profileEnrich;\n","import Plugins from 'util/plugins';\nimport FormHelpers from './util/form';\nimport Accordion from './components/accordion';\nimport AccordionPdp from './components/accordionPdp';\nimport search from './components/search';\nimport Footer from './components/footer';\nimport Menu from './components/mainMenu';\nimport Header from './components/header';\nimport Scroller from './components/scroller';\nimport Minicart from './components/miniCart';\n// import Bubble from './components/bubbleChat';\nimport { processInclude, enqueueTask, cookieExists, getCookie } from './util/common';\nimport AnalyticsHelper from './analyticsHelper';\nimport Geoblock from './components/geoblock';\nimport HomepageComponents from './components/homepage';\nimport PrimaryImagesScroller from './components/primaryImagesScroller';\nimport PrivacyPopUpFlag from './components/privacyPolicyPopUp';\nimport PromoStrip from './components/promoStrip';\nimport Prehome from './components/prehome';\nimport ProfileEnrich from './profileEnrich';\n\n// Global variable\nwindow.raf = window.requestAnimationFrame\n || window.webkitRequestAnimationFrame\n || window.mozRequestAnimationFrame\n || window.msRequestAnimationFrame\n || function (cb) { return setTimeout(cb, 16); };\n\n// Init Intimissimi App\ndocument.addEventListener('DOMContentLoaded', () => {\n console.log('Intimissimi app started.');\n processInclude(require('./components/messageHeroBanner'));\n ProfileEnrich.initOutsideClickHandler();\n // processInclude(require('./components/tabsComponents'));\n Plugins.init();\n Header.init();\n\n try {\n Geoblock.init();\n } catch (e) {\n }\n\n FormHelpers.init();\n Footer.init();\n Menu.init();\n Minicart.run();\n PromoStrip.init();\n Prehome.init();\n search();\n enqueueTask(function () {\n Accordion.setup();\n AccordionPdp.setup();\n Scroller.init();\n PrimaryImagesScroller.init();\n });\n enqueueTask(function () {\n processInclude(require('./components/carouselComponents'));\n });\n enqueueTask(function () {\n HomepageComponents.init();\n });\n\n AnalyticsHelper.init();\n\n if ($('.js-analytics-data-async').length > 0) {\n $.ajax($('.js-analytics-data-async').data('url')).then(function (rsp) {\n $('body').prepend(rsp);\n });\n }\n\n PrivacyPopUpFlag.init();\n});\n","'use strict';\n\nclass AccordionPdp {\n setup () {\n this.init();\n var _closeAllAcordion = this.closeAllAcordionItems;\n\n $('.accordion-pdp').on('click', '.accordion-item:not(.active, .not-expandible) .accordion-title', function (e) {\n e.preventDefault();\n const $accordion = $(this).closest('.accordion-pdp');\n const $item = $(this).closest('.accordion-item');\n const $content = $(this).next('.accordion-content');\n\n const closeAllOpenPanels = !$accordion.hasClass('multiple-panels');\n const closeButshipping = !$item.hasClass('accordion-shipping');\n\n if (closeAllOpenPanels && closeButshipping) {\n _closeAllAcordion($accordion);\n }\n\n $item.addClass('active');\n $content.slideDown({\n progress: function () {\n if ($item.offset().top < ($(window).scrollTop() + $('header').height())) {\n window.scrollTo(0, ($item.offset().top - $('header').height()));\n }\n }\n });\n });\n // close at click\n $('.accordion-pdp').on('click', '.accordion-item.active .accordion-title', function (e) {\n e.preventDefault();\n $(this).next('.accordion-content').slideUp('fast');\n $(this).closest('.accordion-item').removeClass('active');\n });\n\n $(window).on('changed.zf.mediaquery', () => {\n this.init();\n });\n\n $('.accordion-item[data-open-on-init=\"true\"]').find('.accordion-title').trigger('click');\n }\n\n init () {\n $('.accordion-pdp').each(function () {\n const $accordion = $(this).closest('.accordion-pdp');\n const breakpoint = $accordion.data('accordion-size');\n\n if (breakpoint === 'small' && !Foundation.MediaQuery.atLeast('medium')) {\n $accordion.addClass('initialized');\n $accordion.find('.accordion-content').hide();\n } else if (breakpoint === 'medium' && !Foundation.MediaQuery.atLeast('large')) {\n $accordion.addClass('initialized');\n $accordion.find('.accordion-content').hide();\n } else if (breakpoint === 'tablet' && !Foundation.MediaQuery.atLeast('large')) {\n $accordion.addClass('initialized');\n $accordion.find('.accordion-content').hide();\n } else if (breakpoint !== 'all') {\n $accordion.removeClass('initialized');\n $accordion.find('.accordion-content').show();\n } else if (breakpoint === 'all') {\n $accordion.addClass('initialized');\n $accordion.find('.accordion-content').hide();\n }\n });\n\n let limitAccordion = 70;\n\n if (($('.accordion-pdp .accordion-description .accordion-content .pdp-html-description').innerHeight() + $('.accordion-pdp .accordion-description .accordion-content p').innerHeight()) < limitAccordion) {\n $('.accordion-pdp .accordion-description .accordion-title').addClass('little');\n $('.accordion-pdp').on('click', '.accordion-description.accordion-item:not(.active, .not-expandible) .accordion-title', function (e) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n });\n } else {\n $('.accordion-pdp .accordion-description .accordion-content p').css('-webkit-line-clamp', '3');\n }\n }\n\n closeAllAcordionItems ($accordionContainer) {\n $accordionContainer.find('.accordion-content:not(.accordion-shipping)').slideUp('fast');\n $accordionContainer.find('.accordion-item:not(.accordion-shipping)').removeClass('active');\n }\n}\n\nconst accordionPdp = new AccordionPdp();\nexport default accordionPdp;\n","'use strict';\nimport {initSlotCarousel} from '../productTileComponent/productTile';\nimport {lockScroll, unlockScroll, getCookie} from '../util/common';\n\nlet debounce = require('lodash/debounce');\nlet minChars = 3;\n\nexport default initSearchComponent;\n\n/**\n * javascript class for jQuery selector\n */\nconst JS_ELEM = {\n closeModal: '.js-site-search-closeModal',\n inputResetButton: '.js-site-search-clearButton',\n inputSearch: '.js-site-search-inputSearch',\n productBlock: '.js-site-search-suggestions-products',\n searchButtonHeader: '.js-mainHeader-search',\n searchModal: '.js-site-search',\n suggestionPlaceholder: '.js-site-search-suggestions',\n tileProductContainer: '.js-site-search-suggestions-products-itemContainer',\n updateCatSelectionCookieTrigger: '.js-site-search-suggestions a',\n};\n\n/**\n * style class using in add or remove\n */\nconst CC_ELEM = {\n searchModal_isOpen: 'cc-site-search_open',\n};\n\nconst emailPattern = /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,7}\\b/;\n\n// Function to check if the string contains an email pattern\nfunction containsEmail (searchString) {\n return emailPattern.test(searchString);\n}\n\nfunction validateInput (event) {\n if (event.key === 'Enter') {\n let isEmail = containsEmail($(JS_ELEM.inputSearch).val());\n if (isEmail) {\n event.preventDefault();\n }\n }\n}\n\nfunction initSearchComponent() {\n $(JS_ELEM.searchButtonHeader).on('click', openSearchModal);\n}\n\nfunction openSearchModal() {\n $('body').addClass('search-is-open');\n lockScroll();\n addEventSearchModal();\n getSuggestions($(JS_ELEM.inputSearch).val());\n $(JS_ELEM.searchModal).fadeIn(1).addClass(CC_ELEM.searchModal_isOpen);\n $(JS_ELEM.inputSearch).trigger('focus');\n}\n\nfunction addEventSearchModal() {\n $(JS_ELEM.searchModal).on('click', JS_ELEM.closeModal, closeSearchModal);\n $(JS_ELEM.searchModal).on('click', JS_ELEM.updateCatSelectionCookieTrigger, selectMainCategory);\n $(JS_ELEM.searchModal).on('click', JS_ELEM.inputResetButton, clearAllInput);\n $(JS_ELEM.searchModal).on('keydown', JS_ELEM.inputSearch, validateInput);\n\n var debounceSuggestions = debounce(prepareGetSuggestion, 500);\n $(JS_ELEM.searchModal).on('keyup', JS_ELEM.inputSearch, function (e) {\n $(JS_ELEM.inputResetButton).attr('disabled', $(this).val() < 1);\n\n if (e.key !== 'Escape') {\n debounceSuggestions(this, e);\n }\n });\n}\n\nfunction removeEventSearchModal() {\n $(JS_ELEM.searchModal).off();\n}\n\nfunction closeSearchModal() {\n unlockScroll();\n $('body').removeClass('search-is-open');\n $(JS_ELEM.searchModal)\n .removeClass(CC_ELEM.searchModal_isOpen)\n .on('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', function () {\n $(JS_ELEM.searchModal).hide();\n removeEventSearchModal();\n });\n}\n\nfunction selectMainCategory() {\n const alternativeCategory = $(JS_ELEM.suggestionPlaceholder).data('alternative-category');\n const catSelectionCookie = getCookie('catSelection');\n if (\n alternativeCategory &&\n alternativeCategory.length > 0 &&\n catSelectionCookie !== alternativeCategory\n ) {\n var currentDate = new Date();\n currentDate.setDate(currentDate.getDate() + 500);\n var expiryDate = currentDate.toUTCString();\n\n document.cookie = 'catSelection=' + alternativeCategory + ';path=/;expires=' + expiryDate;\n }\n}\n\nfunction getSuggestions (q = '') {\n if (containsEmail(q)) {\n return;\n }\n // Recent suggestions should be retrieved if there are no search terms and if the user is registered. Since recent suggestions should not be cached, it is necessary to invoke a different controller\n const suggestionsUrl =\n q === '' && $(JS_ELEM.searchModal).data('isLogged') === true\n ? $(JS_ELEM.searchModal).data('recentSuggestionsUrl')\n : $(JS_ELEM.searchModal).data('suggestionsUrl') + q;\n\n genericAjaxCall(suggestionsUrl).then(function (newDom) {\n if (newDom) {\n $(JS_ELEM.suggestionPlaceholder).replaceWith(newDom);\n initSlotCarousel(JS_ELEM.productBlock);\n\n if (!Foundation.MediaQuery.atLeast('large')) {\n $(JS_ELEM.tileProductContainer).slick({\n arrows: false,\n autoplay: false,\n dots: false,\n infinite: true,\n slide: '.js-prodTile',\n slidesToScroll: 1,\n swipeToSlide: true,\n variableWidth: true,\n });\n }\n // Analytics event trigger\n $('body').trigger('analytics:productsSuggestions', {\n associatedClass: JS_ELEM.tileProductContainer,\n listType: 'search',\n });\n }\n });\n}\n\nfunction prepareGetSuggestion(input) {\n let inputValue = $(input).val();\n if (inputValue.length === 0 || inputValue.length >= minChars) {\n getSuggestions(inputValue);\n }\n}\n\nfunction clearAllInput() {\n selectMainCategory();\n getSuggestions();\n // event for analytics\n $('body').trigger('search:clearInput');\n}\n\nfunction genericAjaxCall(url, method = 'GET') {\n if (!url) {\n console.error('Missing Url in ajax call');\n return;\n }\n $.spinner().start();\n return new Promise((resolve, reject) => {\n $.ajax({\n url: url,\n method: method,\n success: function (response) {\n $.spinner().stop();\n resolve($(response).clone());\n },\n error: function (error) {\n $.spinner().stop();\n console.error(error);\n reject(error);\n },\n });\n });\n}\n","'use strict';\nimport NewsletterPopup from './../homepage/newsletterPopup';\nimport ExternalScript from '../components/externalscripts';\n// Import the multilanguage js\nimport Multilanguage from './../homepage/multilanguage';\nimport FormHelpers from '../util/form';\n\nimport {\n newModalFromString\n} from '../components/modal';\nimport {\n createCookie, cookieExists, appendToUrl\n} from './../util/common';\nimport WebFormRequest from './webFormRequest';\nimport { woosmapInitFooter } from 'woosmap';\n\nconst toggleCountrySelector = () => {\n $('.js-countryChooser').toggle();\n $('.js-languageChooser').hide();\n $('.js-languageChooserMobile').hide();\n $('.js-overlay-footer-language').show();\n $('.js-countryIconToggle').toggleClass('cc-countryIconToggle-translate');\n $('.js-languageIconToggle').removeClass('cc-countryIconToggle-translate');\n $('body').addClass('cc-footer-backgroundOverlay');\n}\n\nconst toggleLanguageSelector = () => {\n $('.js-languageChooser').toggle();\n $('.js-languageChooserMobile').toggle();\n $('.js-overlay-footer-language').show();\n $('.js-countryChooser').hide();\n $('.js-languageIconToggle').toggleClass('cc-countryIconToggle-translate');\n $('.js-countryIconToggle').removeClass('cc-countryIconToggle-translate');\n $('body').addClass('cc-footer-backgroundOverlay');\n}\nclass Footer {\n init () {\n this.registerEvents();\n this.multilanguageSubmit();\n this.newsletterForm();\n this.webFormRequest();\n this.orderStatusForm();\n this.cookieBannerHandler();\n this.cookieBannerCloseHandler();\n ExternalScript.init();\n WebFormRequest.init();\n $('#linkToBeRendered').html($('#formattedLink').text());\n this.storeLocator();\n }\n\n registerEvents () {\n // Inizialize the multilanguage popup\n if (cookieExists('cookie_closed') || (cookieExists('OptanonAlertBoxClosed') && cookieExists('OptanonConsent'))) {\n var condition = false;\n Multilanguage.init(condition);\n NewsletterPopup.init();\n }\n\n $('.submitNewsletter').on('click', function (e) {\n const newsletterEmail = $('#newsletter-Email');\n if (newsletterEmail.val() === '' || newsletterEmail.parsley().isValid()) {\n e.preventDefault();\n e.stopImmediatePropagation();\n $('#newsletterFooterForm').data('which-form', 'newsletter');\n NewsletterPopup.showPopup();\n }\n });\n\n $('body').on('click', function (e) {\n if (\n (!$(e.target).hasClass('js-language') &&\n $('.js-languageChooser').css('display') == 'block') ||\n (!$(e.target).attr('id') &&\n $('.js-languageChooserMobile').css('display') == 'block') ||\n (!$(e.target).attr('id') &&\n $('.js-languageChooser').css('display') == 'block') ||\n (!$(e.target).attr('id') === 'country-icon-toggle-down' &&\n $('.js-languageChooser').css('display') == 'block') ||\n (!$(e.target).attr('id') === 'country-icon-toggle-down' &&\n $('.js-languageChooserMobile').css('display') == 'block')\n ) {\n toggleLanguageSelector();\n }\n });\n\n $(document)\n .on('click', '.js-country', function (e) {\n let url = $(e.currentTarget).data('url');\n if ($('.js-countryChooser').children().length === 0) {\n $.spinner().start();\n\n $.ajax({url: url\n }).then(function (rsp) {\n if (rsp) {\n $('.js-countryChooser').html(rsp);\n toggleCountrySelector();\n $('.submitNewsletterContacts').on('click', function (e) {\n const newsletterEmailContacts = $('#newsletter-Email-contacts');\n if (newsletterEmailContacts.val() === '' || newsletterEmailContacts.parsley().isValid()) {\n e.preventDefault();\n $('#newsletterFooterForm').data('which-form', 'newsletter-contacts');\n NewsletterPopup.showPopup();\n }\n });\n $.spinner().stop();\n }\n });\n } else {\n toggleCountrySelector();\n }\n })\n .on('click', '.js-overlay-footer-close', function () {\n $('.js-overlay-footer-language').hide();\n })\n .on('click', '.js-overlay-footer-language', function () {\n $('.js-countryChooser').hide();\n $('.js-overlay-footer-language').hide();\n $('.js-countryIconToggle').removeClass('cc-countryIconToggle-translate');\n $('body').removeClass('cc-footer-backgroundOverlay');\n window.scrollTo(0, document.body.scrollHeight);\n })\n .on('click', '.countryFooterClose', function () {\n $('.js-countryIconToggle').removeClass('cc-countryIconToggle-translate');\n $('.js-overlay-footer-language').hide();\n $('body').removeClass('cc-footer-backgroundOverlay');\n window.scrollTo(0, document.body.scrollHeight);\n })\n .on('click', '.js-language', function (e) {\n let url = $(e.currentTarget).data('url');\n if ($('.js-languageChooser').children().length === 0) {\n $.spinner().start();\n\n $.ajax({url: url\n }).then(function (rsp) {\n if (rsp) {\n $('.js-languageChooser').html($(rsp).find('.language-selector-desktop'));\n $('.js-languageChooserMobile').html($(rsp).find('.language-selector-mobile'));\n toggleLanguageSelector();\n $.spinner().stop();\n }\n });\n } else {\n toggleLanguageSelector();\n }\n })\n .on('click', '.js-country-line', function (evt) {\n const $target = $(evt.currentTarget);\n if ($target.hasClass('action-change')) {\n return;\n }\n var $clickedCheckbox = $target.find('input[type=\"checkbox\"]');\n $('.js-country-line input[type=\"checkbox\"]').not($clickedCheckbox).prop('checked', false);\n const url = $target.data('href');\n const locale = $target.data('locale');\n const currency = $target.data('currency');\n\n $.ajax({\n url: url,\n data: {\n code: locale,\n currency: currency,\n queryString: $('.page').data('querystring'),\n action: $('.page').data('action')\n }\n }).then(function (rsp) {\n if (rsp.redirectUrl) {\n document.location.href = rsp.redirectUrl;\n }\n });\n })\n .on('change', '.js-setLocaleCountry', function () {\n $('#setInputLocaleCountry').attr('data-locale', this.value);\n })\n .on('click', '.js-leave-feedback', function () {\n var FormId = '13864';\n KAMPYLE_ONSITE_SDK.showForm(FormId);\n })\n }\n\n newsletterForm () {\n lock();\n\n $('body').on('change', '[id=\"newspromotions\"]', () => {\n if ($('#newspromotions').is(':checked')) {\n unlock();\n // $('#newspromotions').attr('disabled', true);\n $('#newspromotions1').attr('disabled', false);\n $('#newspromotions1').prop('checked', false);\n // $('#checkbox-label-yes').css('color', '#3C3738');\n // $('#checkbox-label-no').css('color', '#3C3738');\n $('#grayOnDisableDescription').css('color', '#3C3738');\n $('#newsPromoSpanNotTargeted').val('true');\n $('.privacy-policy-short-profiling').removeClass('disactivate');\n }\n });\n\n $('body').on('change', '[id=\"newspromotions1\"]', () => {\n $('#newspromotions').prop('checked', false);\n $('#newspromotions').attr('disabled', false);\n // $('#newspromotions1').attr('disabled', true);\n lock();\n // $('#checkbox-label-yes').css('color', '#3C373880');\n // $('#checkbox-label-no').css('color', '#3C373880');\n $('#grayOnDisableDescription').css('color', '#3C373880');\n $('#newsPromoSpanNotTargeted').val('false');\n $('.privacy-policy-short-profiling').addClass('disactivate');\n });\n\n $('body').on('change', '[id=\"newspromotions_targeted\"]', () => {\n if ($('#newspromotions_targeted').is(':checked')) {\n fixRequired();\n // $('#newspromotions_targeted').attr('disabled', true);\n $('#newspromotions_targeted1').attr('disabled', false);\n $('#newspromotions_targeted1').prop('checked', false);\n $('#newsPromoSpan').val('true');\n }\n });\n\n $('body').on('change', '[id=\"newspromotions_targeted1\"]', () => {\n fixRequired();\n $('#newspromotions_targeted').prop('checked', false);\n $('#newspromotions_targeted').attr('disabled', false);\n // $('#newspromotions_targeted1').attr('disabled', true);\n $('#newsPromoSpan').val('false');\n });\n\n function lock () {\n if (!$('.lockable').hasClass('content-lock')) {\n $('.lockable').addClass('content-lock');\n }\n $('.lockable label input').attr('disabled', true);\n\n $('#newspromotions_targeted, #newspromotions_targeted1').prop('checked', false);\n fixRequired();\n }\n\n function fixRequired () {\n if ($('#newspromotions').is(':checked')) {\n if ($('#newspromotions_targeted').is(':checked') || $('#newspromotions_targeted1').is(':checked')) {\n $('#newspromotions_targeted, #newspromotions_targeted1').prop('required', false);\n $('.form-error').attr('style', 'display: none !important');\n } else {\n $('#newspromotions_targeted1').prop('required', true);\n }\n } else {\n $('#newspromotions_targeted, #newspromotions_targeted1').prop('required', false);\n $('.form-error').attr('style', 'display: none !important');\n }\n }\n\n function unlock () {\n $('.content-lock').removeClass('content-lock');\n $('.lockable label input').attr('disabled', false);\n fixRequired();\n }\n\n $('body').on('submit', 'form.newsletter, form.registerNewsletter', function (e) {\n var $form = $(this);\n e.preventDefault();\n var url = $form.attr('action');\n $.spinner().start();\n $('form.newsletter').trigger('newsletter:submit', e);\n $('body').trigger('analyticsNewsletter:submit');\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: $form.serialize(),\n success: function (data) {\n $form.spinner().stop();\n if (!data.success) {\n FormHelpers.init($form, data);\n $('form.newsletter').trigger('newsletter:error', data);\n } else {\n createCookie('dw_subscribepopup', '1', parseInt(window.SitePreferences.NewsletterPopupExpiryDays));\n $('form.newsletter').trigger('newsletter:success', data);\n location.href = data.redirectUrl;\n }\n },\n error: function (data) {\n if (data.responseJSON.redirectUrl) {\n window.location.href = data.responseJSON.redirectUrl;\n } else {\n $('form.newsletter').trigger('newsletter:error', data);\n $form.spinner().stop();\n }\n }\n });\n return false;\n });\n }\n\n multilanguageSubmit () {\n $('body').on('submit', '.multilanguage', function (e) {\n var $form = $(this);\n e.preventDefault();\n var url = $form.attr('action');\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: $form.serialize(),\n success: function (data) {\n $form.spinner().stop();\n if (!data.success) {\n FormHelpers.init($form, data);\n } else {\n window.location.href = data.redirectUrl;\n }\n },\n error: function (data) {\n if (data.responseJSON.redirectUrl) {\n window.location.href = data.responseJSON.redirectUrl;\n } else {\n $form.spinner().stop();\n }\n }\n });\n return false;\n });\n }\n\n webFormRequest () {\n $('body').on('click', '.js-web-form-request', function (e) {\n e.preventDefault();\n // Avoid redundancy\n if ($('.page').data('action') === 'Newsletter-Contact') {\n return;\n }\n\n const _initWebformRequest = () => {\n var htmlContent = $('#webFormRequestModal').html();\n const modal = newModalFromString(htmlContent, false, ['web-form-request-modal']);\n \n // Make sure previous instantiations of chosen have been cleaned-up if the modal is re-opened.\n $(modal.modal).chosen('destroy');\n $(modal.modal).find($(modal.modalBox).find('.js-webFormRequest-selectFirstDropdown select')).chosen({\n disable_search: true,\n });\n $(modal.modal).find($(modal.modalBox).find('.js-webFormRequest-selectSecondDropdown select')).chosen({\n disable_search: true,\n });\n\n // Prefill user contact based on profile\n if ($('.customerFirstName') && $('.customerFirstName').length) {\n $('.web-form-request-modal #nameformemail').val($('.customerFirstName').val());\n }\n if ($('.customerLastName') && $('.customerLastName').length) {\n $('.web-form-request-modal #secondnameformemail').val($('.customerLastName').val());\n }\n if ($('.customerEmail') && $('.customerEmail').length) {\n $('.web-form-request-modal #emailformemail').val($('.customerEmail').val());\n }\n // Initialize first step if the user reopen the modal without refreshing the page\n $(modal.modalBox).find('.js-webFormRequest-contactFormStepOne').removeClass('hidden');\n $('.hide-form').show();\n\n modal.open();\n setTimeout(() => {\n var recaptchaSiteKey = $('#recaptchaSiteKey').val();\n try {\n // eslint-disable-next-line no-undef\n grecaptcha.render('recaptcha', {\n 'sitekey': recaptchaSiteKey\n });\n } catch (e) {\n $('.no-robot').removeClass('hidden');\n }\n }, 1000);\n WebFormRequest.init(true);\n\n $(modal.modalBox).on('click', '.close-button', function () {\n modal.close();\n });\n };\n\n if ($('#webFormRequestModal').length === 0) {\n $.ajax({\n url: $('#webform-placeholder').data('url'),\n type: 'GET',\n success: function (data) {\n $('#webform-placeholder').html(data);\n _initWebformRequest();\n }\n });\n } else {\n _initWebformRequest();\n }\n });\n }\n\n orderStatusForm () {\n var url = new URL(window.location.href);\n var showOrderStatus = url.searchParams.get('showOrderStatus');\n\n if (showOrderStatus) {\n const htmlContent = $('.js-modal-web-order-status-form-request').html();\n var tabContent = $('.js-content-web-order-status-form-request').html();\n\n // create and open confirmation modal\n const modal = newModalFromString(htmlContent, false);\n modal.open();\n modal.setContent(tabContent);\n $('.tingle-modal').addClass('wrapperModal');\n $('.tingle-modal').addClass('tingle-modal-form-request');\n $('.tingle-modal-box__content').addClass('modal-tabs-style');\n $(modal.modalBox)\n .find('.close-button')\n .on('click', function (e) {\n modal.close();\n });\n\n $('.js-inside-close-modal').on('click', function (e) {\n e.preventDefault();\n modal.close();\n });\n\n $('[data-dismiss=\"modal\"]').on('click', function (e) {\n e.preventDefault();\n modal.close();\n });\n }\n\n $('.js-order-status-form').on('click', function (e) {\n e.preventDefault();\n const htmlContent = $('.js-modal-web-order-status-form-request').html();\n var tabContent = $('.js-content-web-order-status-form-request').html();\n\n // create and open confirmation modal\n const modal = newModalFromString(htmlContent, false);\n modal.open();\n modal.setContent(tabContent);\n $('.tingle-modal').addClass('wrapperModal');\n $('.tingle-modal').addClass('tingle-modal-form-request');\n $('.tingle-modal-box__content').addClass('modal-tabs-style');\n $(modal.modalBox)\n .find('.close-button')\n .on('click', function (e) {\n modal.close();\n });\n\n $('.js-inside-close-modal').on('click', function (e) {\n e.preventDefault();\n modal.close();\n });\n\n $('[data-dismiss=\"modal\"]').on('click', function (e) {\n e.preventDefault();\n modal.close();\n });\n });\n\n $('body').on('click', '#form-order-status button', function (e) {\n let errors = [];\n $('#form-order-status :input:not(:button)').each(function (index, value) {\n let validator = $(this).parsley({\n errorClass: 'is-invalid-input'\n });\n validator.validate();\n if (!validator.isValid()) {\n errors.push(validator);\n $('.tingle-modal-box').animate({ scrollTop: errors[0].$element[0].offsetTop }, 'slow');\n }\n });\n if (errors.length > 0) {\n e.preventDefault();\n }\n });\n }\n\n storeLocator () {\n var isWorldWebsite = $('.storeLocatorWorldFooter').length > 0;\n woosmapInitFooter(!isWorldWebsite);\n\n $('body').on('woosmap:chooseOptionFooter', function (_e, selection) {\n if (selection.geometry && selection.geometry.location.lat && selection.geometry.location.lng) {\n const $form = $('#findStoreFooterForm');\n var coords = {\n lat: selection.geometry.location.lat,\n long: selection.geometry.location.lng\n };\n var updatedAction = appendToUrl($form.attr('action'), coords);\n\n $form.attr('action', updatedAction);\n $('.woosmap-search').val(true);\n $('form.storeLocatorFooter')[0].submit();\n }\n });\n }\n cookieBannerHandler () {\n $('body').on('click', '#onetrust-accept-btn-handler, .onetrust-close-btn-handler, #accept-recommended-btn-handler', function (e) {\n if (!cookieExists('cookie_closed')) {\n createCookie('cookie_closed', 'true', 500);\n createCookie('cookie_profiling_consent', 'true', 500);\n var condition = false;\n Multilanguage.init(condition);\n NewsletterPopup.init();\n $('.embedded-service').show();\n }\n });\n\n $('body').on('click', '#onetrust-accept-btn-handler', function (e) {\n createCookie('cookies-accepted', 'true', 500);\n NewsletterPopup.firstVisitNewsletterPopUp();\n });\n }\n\n cookieBannerCloseHandler () {\n $('body').on('click', '#onetrust-close-btn-container', function (e) {\n createCookie('cookie_profiling_consent', 'false', 500);\n });\n }\n}\n\nconst footer = new Footer();\nexport default footer;\n","import { cookieExists, createCookie, deleteCookie, lockScroll, unlockScroll } from '../util/common';\nimport { newModalFromString } from '../components/modal';\nimport { popupPrivacyPolicyListener } from '../privacyPolicyPopup';\n\nclass NewsletterPopup {\n init () {\n var url = new URL(window.location.href);\n var showPopup = url.searchParams.get('showNewsletter');\n if ((!cookieExists('dw_subscribepopup') && window.SitePreferences.NewsletterPopupEnabled) || (showPopup)) {\n setTimeout(function () {\n showNewsletterPopup();\n }, showPopup ? 0 : window.SitePreferences.NewsletterPopupDelay);\n }\n this.firstVisitNewsletterPopUp();\n popupPrivacyPolicyListener();\n }\n\n setCookie () {\n createCookie('dw_subscribepopup', '1', parseInt(window.SitePreferences.NewsletterPopupExpiryDays));\n }\n\n showPopup () {\n showNewsletterPopup();\n }\n\n firstVisitNewsletterPopUp () {\n if (cookieExists('cookies-accepted') && $('.js-page-home-gender').length > 0) {\n setTimeout(function () {\n showNewsletterPopup();\n deleteCookie('cookies-accepted');\n }, window.SitePreferences.NewsletterPopupDelay);\n }\n }\n}\n\nfunction showNewsletterPopup () {\n const url = window.Urls.getNewsletterPopup;\n const onPopupClose = () => {\n unlockScroll();\n createCookie('dw_subscribepopup', '1', parseInt(window.SitePreferences.NewsletterPopupExpiryDays));\n };\n\n if (url) {\n $.ajax({\n url: url,\n type: 'get',\n success: function (data) {\n const modal = newModalFromString(data, false, ['newsletter-popup'], null, onPopupClose);\n $('#newspromotions_targeted').attr('disabled', true);\n $('#newspromotions_targeted1').attr('disabled', true);\n // $('#checkbox-label-yes').css('color', '#E8E8E8');\n // $('#checkbox-label-no').css('color', '#E8E8E8');\n $('#grayOnDisableDescription').css('color', '#E8E8E8');\n\n\n modal.open();\n\n $('#linkToBeRendered').html($('#formattedLink').text());\n\n if (!Foundation.MediaQuery.atLeast('large')) {\n lockScroll();\n }\n\n $(modal.modalBox)\n .find('.close')\n .on('click', function (e) {\n modal.close();\n });\n\n $(modal.modalBox)\n .find('.js-noThanks')\n .on('click', function (e) {\n modal.close();\n });\n\n $(modal.modalBox)\n .find('.js-subscribe-close')\n .on('click', function (e) {\n modal.close();\n });\n\n newsletterPopupControl();\n\n // Since the form is loaded asynchronously, launch Parsley validation on success\n $('body').trigger('newsletter:showPopup', { form: $(modal.modalBox).find('form') });\n $(modal.modalBox).find('form')\n .parsley({\n errorClass: 'is-invalid-input',\n successClass: 'is-valid-input',\n errorsWrapper: '
',\n errorTemplate: ''\n }).on('field:error', e => {\n if (e.$element.closest('.input-error-group').hasClass('error-outside')) {\n const elementName = e.$element.attr('name');\n const error = e.$element.parents('label').next('.errors-list');\n const $errorLocation = e.$element.closest('form').find(`[data-parsley-error-binding=\"${elementName}\"]`);\n error.appendTo($errorLocation);\n }\n });\n\n },\n error: function (err) {\n console.log(err);\n }\n });\n }\n}\n\nfunction newsletterPopupControl () {\n const newsletterEmail = $('#email');\n const imagePopUp = $('.js-imgPopup');\n const newsletterTitle = $('.js-newsletterFormTitle');\n const proceedStepZeroMobile = $('.js-proceedStepZeroMobile');\n const proceedStepZeroDesktop = $('.js-proceedStepZeroDesktop');\n const stepZero = $('.js-stepZero');\n const newsletterGender = $('#newsletterGender');\n const stepOnePointOne = $('.js-stepOnePointOne');\n const proceedStepOnePointOne = $('.js-proceedStepOnePointOne');\n const stepOnePointTwo = $('.js-stepOnePointTwo');\n const proceedStepOnePointTwo = $('.js-proceedStepOnePointTwo');\n const newsletterEmailVal = $('#newsletter-Email').val();\n const newsletterEmailValContacts = $('#newsletter-Email-contacts').val();\n const newsletterStep = $('.registerNewsletter');\n const confirmSubscription = $('.js-subscriptionSuccess');\n const checkPromotionOne = $('#newspromotions_targeted');\n const checkPromotionTwo = $('#newspromotions_targeted1');\n const backStepOnePointOne = $('.js-backStepOnePointOne');\n\n if (($('#newsletterFooterForm').data('which-form') === 'newsletter' && newsletterEmailVal !== '') || ($('#newsletterFooterForm').data('which-form') === 'newsletter-contacts' && newsletterEmailValContacts !== '')) {\n if (newsletterEmailVal !== '') {\n newsletterEmail.val(newsletterEmailVal);\n } else {\n newsletterEmail.val(newsletterEmailValContacts);\n }\n\n imagePopUp.addClass('hidden');\n newsletterTitle.addClass('hidden');\n stepZero.addClass('hidden');\n stepOnePointOne.removeClass('hidden');\n // We need to separate the step-one-point-one from direct/indirect email input in footer\n $('.js-newslettersNavigationButtons').removeClass('cc-popupNavigationButtons');\n $('.js-newslettersNavigationButtons').addClass('cc-directEmailButtons');\n $('.js-proceedStepOnePointOne').addClass('js-directEmailProceed cc-directEmailProceed');\n $('.js-directEmailProceed').on('click', function (e) {\n $('.js-stepOnePointTwo').addClass('js-directFromStepOnePointOne');\n });\n newsletterStep.data('stage', 'js-stepOnePointOne');\n\n backStepOnePointOne.addClass('hidden');\n $('.js-noThanksDirectOpen').removeClass('hidden');\n $('.js-notDirectOpen').addClass('hidden');\n $('.js-directOpenDesktop').removeClass('hidden');\n $('.js-directOpenMobile').removeClass('hidden');\n\n if (Foundation.MediaQuery.atLeast('medium')) {\n stepOnePointTwo.removeClass('hidden');\n }\n }\n\n newsletterEmail.on('input', function (e) {\n if (newsletterEmail.parsley().isValid()) {\n $('#email[name=newsletterEmail]').attr('aria-invalid', 'false');\n $('#email-errors').addClass('hide-error');\n $('#email').removeClass('error-border');\n } else {\n $('#email[name=newsletterEmail]').attr('aria-invalid', 'true');\n $('#email-errors').removeClass('hide-error');\n $('#email').addClass('error-border');\n }\n });\n\n $(window).on('resize', function (e) {\n if (confirmSubscription.hasClass('hidden') && stepZero.hasClass('hidden')) {\n if (Foundation.MediaQuery.atLeast('medium')) {\n stepOnePointOne.removeClass('hidden');\n stepOnePointTwo.removeClass('hidden');\n } else {\n if (newsletterStep.data('stage') === 'js-stepOnePointOne') {\n stepOnePointOne.removeClass('hidden');\n stepOnePointTwo.addClass('hidden');\n } else if (newsletterStep.data('stage') === 'js-stepOnePointTwo') {\n stepOnePointOne.addClass('hidden');\n stepOnePointTwo.removeClass('hidden');\n }\n }\n }\n });\n\n proceedStepZeroMobile.on('click', function (e) {\n proceedStepZeroMobile.trigger('blur');\n if (!newsletterEmail.parsley().isValid()) {\n $('#email-errors').removeClass('hide-error');\n $('#email').addClass('error-border');\n return;\n }\n $('#email-errors').addClass('hide-error');\n $('#email').removeClass('error-border');\n imagePopUp.addClass('hidden');\n newsletterTitle.addClass('hidden');\n stepZero.addClass('hidden');\n stepOnePointOne.removeClass('hidden');\n // Add new class to create different dimensions for the modal\n newsletterStep.closest('.tingle-modal-box').addClass('cc-stepOnePointOne');\n newsletterStep.data('stage', 'js-stepOnePointOne');\n });\n\n proceedStepZeroDesktop.on('click', function (e) {\n proceedStepZeroDesktop.trigger('blur');\n if (!proceedStepZeroDesktop.hasClass('disabled')) {\n if (!newsletterEmail.parsley().isValid()) {\n $('#email-errors').removeClass('hide-error');\n $('#email').addClass('error-border');\n return;\n }\n $('#email-errors').addClass('hide-error');\n $('#email').removeClass('error-border');\n imagePopUp.addClass('hidden');\n newsletterTitle.addClass('hidden');\n stepZero.addClass('hidden');\n stepOnePointOne.removeClass('hidden');\n stepOnePointTwo.removeClass('hidden');\n newsletterStep.data('stage', 'js-stepOnePointOne');\n }\n });\n\n $('#newsletterCountry').on('input', function (e) {\n newsletterStep.data('stage', 'js-stepOnePointOne');\n });\n\n newsletterGender.on('input', function (e) {\n newsletterStep.data('stage', 'js-stepOnePointOne');\n if (newsletterGender.val()) {\n proceedStepOnePointOne.removeClass('disabled');\n if (checkPromotionOne[0].checked || checkPromotionTwo[0].checked) {\n proceedStepOnePointTwo.removeClass('disabled');\n }\n }\n });\n\n backStepOnePointOne.on('click', function (e) {\n stepOnePointOne.addClass('hidden');\n imagePopUp.removeClass('hidden');\n newsletterTitle.removeClass('hidden');\n stepZero.removeClass('hidden');\n // Remove the class to show the direct step-one-point-one dimensions if user go back\n newsletterStep.closest('.tingle-modal-box').removeClass('cc-stepOnePointOne');\n });\n\n proceedStepOnePointOne.on('click', function (e) {\n proceedStepOnePointOne.trigger('blur');\n if (!proceedStepOnePointOne.hasClass('disabled')) {\n stepOnePointOne.addClass('hidden');\n stepOnePointTwo.removeClass('hidden');\n // Remove the class to appear the regular dimensions for the rest of the flow\n newsletterStep.closest('.tingle-modal-box').removeClass('cc-stepOnePointOne');\n newsletterStep.data('stage', 'js-stepOnePointTwo');\n }\n });\n\n $('#newspromotions').on('click', function (e) {\n newsletterStep.data('stage', 'js-stepOnePointTwo');\n });\n\n $('#newspromotions1').on('click', function (e) {\n proceedStepOnePointTwo.addClass('disabled');\n newsletterStep.data('stage', 'js-stepOnePointTwo');\n });\n\n checkPromotionOne.on('click', function (e) {\n if (newsletterGender.val()) {\n proceedStepOnePointTwo.removeClass('disabled');\n newsletterStep.data('stage', 'js-stepOnePointTwo');\n }\n });\n\n checkPromotionTwo.on('click', function (e) {\n if (newsletterGender.val()) {\n proceedStepOnePointTwo.removeClass('disabled');\n newsletterStep.data('stage', 'js-stepOnePointTwo');\n }\n });\n\n $('.js-backStepOnePointTwo').on('click', function (e) {\n stepOnePointTwo.addClass('hidden');\n stepOnePointOne.removeClass('hidden');\n // Check if the step-one-point-two hasn't this class so it will appear the indirect email modal dimensions on back button\n if (!$('.js-stepOnePointTwo').hasClass('js-directFromStepOnePointOne')) {\n newsletterStep.closest('.tingle-modal-box').addClass('cc-stepOnePointOne');\n }\n newsletterStep.data('stage', 'js-stepOnePointOne');\n });\n\n proceedStepOnePointTwo.on('click', function (e) {\n $('body').trigger('newsletter:stepOnePointTwo', { title: newsletterGender.find('option:selected').val() });\n proceedStepOnePointTwo.trigger('blur');\n if (!proceedStepOnePointTwo.hasClass('disabled')) {\n $.spinner().start();\n $.ajax({\n url: newsletterStep.attr('action'),\n type: 'post',\n dataType: 'json',\n data: newsletterStep.serialize(),\n success: function (data) {\n $.spinner().stop();\n if (data.alreadySubscribed) {\n $('#linksToBeRendered').html($('#formattedLinks').text());\n $('.registrationFormStepOne').addClass('hidden');\n $('.registrationFormStepTwo').removeClass('hidden');\n $('.written-email').text(data.registeredEmail);\n }\n else {\n stepOnePointOne.addClass('hidden');\n stepOnePointTwo.addClass('hidden');\n confirmSubscription.removeClass('hidden');\n newsletterStep.closest('.tingle-modal-box').addClass('cc-confirmSubscriptionModal');\n } \n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n });\n}\n\nconst newsletterPopup = new NewsletterPopup();\nexport default newsletterPopup;\n","import { unlockScroll } from './util/common';\nimport { newModalFromString } from './components/modal';\n\nconst popupPrivacyPolicyListener = () => {\n $('body').on('click', '.privacy-policy-short-marketing', function (e) {\n if ($('.privacy-policy-marketing-popup').length === 0) {\n e.preventDefault();\n $('.newsletter-popup').addClass('hidden');\n const htmlContent = $('.js-modal-privacy-policy-marketing').html();\n var tabContent = $('.js-content-privacy-policy-marketing').html();\n\n const onPopupClose = () => {\n unlockScroll();\n };\n if ($('.privacy-policy-marketing-popup').length > 0) {\n return;\n }\n\n // create and open confirmation modal\n const modal = newModalFromString(htmlContent, false, ['privacy-policy-marketing-popup'], null, onPopupClose);\n modal.open();\n modal.setContent(tabContent);\n $(modal.modalBox)\n .find('.close-button-privacy')\n .on('click', function (e) {\n modal.close();\n $('.newsletter-popup').removeClass('hidden');\n });\n\n if (('.modal-newsletter').length >= 0) {\n $('.go-back-newsletter-modal').removeClass('hidden');\n $('.js-backstepOnePointTwo-closeNewsletterModal').addClass('show-for-medium');\n }\n }\n });\n\n $('body').on('click', '.privacy-policy-short-profiling', function (e) {\n if ($('.privacy-policy-profiling-popup').length === 0) {\n e.preventDefault();\n $('.newsletter-popup').addClass('hidden');\n const htmlContent = $('.js-modal-privacy-policy-profiling').html();\n var tabContent = $('.js-content-privacy-policy-profiling').html();\n\n const onPopupClose = () => {\n unlockScroll();\n };\n if ($('.privacy-policy-profiling-popup').length > 0) {\n return;\n }\n // create and open confirmation modal\n const modal = newModalFromString(htmlContent, false, ['privacy-policy-profiling-popup'], null, onPopupClose);\n\n modal.open();\n modal.setContent(tabContent);\n $(modal.modalBox)\n .find('.close-button-privacy')\n .on('click', function (e) {\n modal.close();\n $('.newsletter-popup').removeClass('hidden');\n });\n\n if (('.modal-newsletter').length >= 0) {\n $('.go-back-newsletter-modal').removeClass('hidden');\n $('.js-backstepOnePointTwo-closeNewsletterModal').addClass('show-for-medium');\n }\n }\n });\n $('body').on('click', '.privacy-policy-short-marketing-modal', function (e) {\n e.preventDefault();\n let url = $(e.currentTarget).data('url');\n if (!url) {\n console.error('Missing URL for AJAX call');\n return;\n }\n $.ajax(url).then(data => {\n const onPopupClose = () => {\n unlockScroll();\n };\n // create and open confirmation modal\n const modal = newModalFromString(data, false, ['privacy-policy-marketing-popup'], null, onPopupClose);\n modal.open();\n $(modal.modalBox)\n .find('.close-button-privacy')\n .on('click', function (e) {\n modal.close();\n });\n });\n });\n\n $('body').on('click', '.privacy-policy-short-profiling-modal', function (e) {\n e.preventDefault();\n let url = $(e.currentTarget).data('url');\n if (!url) {\n console.error('Missing URL for AJAX call');\n return;\n }\n $.ajax(url).then(data => {\n const onPopupClose = () => {\n unlockScroll();\n };\n // create and open confirmation modal\n const modal = newModalFromString(data, false, ['privacy-policy-profiling-popup'], null, onPopupClose);\n modal.open();\n $(modal.modalBox)\n .find('.close-button-privacy')\n .on('click', function (e) {\n modal.close();\n });\n });\n });\n\n $('body').on('click', '.eco-info', function (e) {\n e.preventDefault();\n const htmlContent = $('.js-modal-privacy-policy-profiling').html();\n var tabContent = $('.js-content-eco-info').html();\n\n const onPopupClose = () => {\n unlockScroll();\n };\n\n // create and open confirmation modal\n const modal = newModalFromString(htmlContent, false, ['eco-popup'], null, onPopupClose);\n\n modal.open();\n modal.setContent(tabContent);\n $(modal.modalBox)\n .find('.close-button-eco')\n .on('click', function (e) {\n modal.close();\n });\n });\n};\n\nexport {\n popupPrivacyPolicyListener\n};\n","import { enqueueTask, cookieExists } from '../util/common';\n/* eslint-disable no-undef */\nclass ExternalScripts {\n init () {\n this.liveChatConfig = {};\n try {\n // .dataset automatically converts data to CamelCase\n var config = document.getElementById('livechat-config').dataset;\n this.liveChatConfig = config;\n\n if (config.legacyScript === true || config.legacyScript === 'true') {\n this.liveagentInitLegacy();\n setTimeout(function () {\n var chatId = $('#scriptId').attr('scriptId');\n var onlineBtn = document.getElementById(`liveagent_button_online_` + chatId);\n\n if (onlineBtn && onlineBtn.style.display !== 'none') {\n $('.not-available-chat').addClass('hidden');\n $('.available-chat').removeClass('hidden');\n } else {\n $('.not-available-chat').removeClass('hidden');\n $('.available-chat').addClass('hidden');\n }\n $('.availabilityContainer').css('display', 'none');\n }, 5000);\n } else {\n enqueueTask(this.liveagentInit.bind(this));\n }\n this.proactiveChatInit();\n } catch (e) {\n // Livechat might not be included in the page\n }\n }\n\n setAvailability () {\n var chatId = $('#scriptId').attr('scriptId');\n var onlineBtn = document.getElementById(`liveagent_button_online_` + chatId);\n\n if (onlineBtn && onlineBtn.style.display !== 'none') {\n $('.not-available-chat').addClass('hidden');\n $('.available-chat').removeClass('hidden');\n } else {\n $('.not-available-chat').removeClass('hidden');\n $('.available-chat').addClass('hidden');\n }\n $('.availabilityContainer').css('display', 'none');\n }\n\n openLiveChat () {\n var chatId = this.getChatId();\n var onlineBtn = document.getElementById(`liveagent_button_online_` + chatId);\n if (onlineBtn && onlineBtn.style.display !== 'none') {\n $('.js-chat-show').removeClass('show');\n $('.overlay-bubble-chat').hide();\n onlineBtn.click();\n }\n }\n\n getChatId () {\n return this.liveChatConfig['staticChatId'];\n }\n\n proactiveChatInit () {\n let liveChatContainer = 'livechat-desktop';\n if (!Foundation.MediaQuery.is('medium')) {\n liveChatContainer = 'livechat-mobile';\n }\n\n var scriptContainer = document.getElementById(liveChatContainer);\n if (scriptContainer) {\n $('body').append(scriptContainer.innerHTML);\n }\n }\n\n liveagentInitLegacy () {\n const livechatConfigElement = document.getElementById('livechat-config');\n if (!livechatConfigElement) {\n return false;\n }\n\n // Show legacy bubble\n $('.legacy-bubble-chat').removeClass('hide');\n\n this.liveChatConfig = livechatConfigElement.dataset;\n\n /* global liveagent */\n liveagent.addCustomDetail('siteLanguage', this.liveChatConfig.language);\n if (this.liveChatConfig.customerName && this.liveChatConfig.customerEmail) {\n liveagent.addCustomDetail('customerName', this.liveChatConfig.customerName);\n liveagent.addCustomDetail('customerEmail', this.liveChatConfig.customerEmail);\n }\n\n if (document.getElementById('liveChatCurrentCountry')) {\n const liveChatCurrentCountry = document.getElementById('liveChatCurrentCountry').getAttribute('currentCountry');\n liveagent.addCustomDetail('siteCountry', liveChatCurrentCountry);\n }\n\n liveagent.init(this.liveChatConfig.initParam1, this.liveChatConfig.initParam2, this.liveChatConfig.initParam3);\n if (!window._laq) { window._laq = []; }\n window._laq.push(() => {\n if ($('#checkout-main').length === 0) {\n liveagent.showWhenOnline(this.liveChatConfig.staticChatId,\n document.getElementById('liveagent_button_online_' + this.liveChatConfig.staticChatId));\n liveagent.showWhenOffline(this.liveChatConfig.staticChatId,\n document.getElementById('liveagent_button_offline_' + this.liveChatConfig.staticChatId));\n }\n });\n\n $(document).on('click', '.js-live-chat', (e) =>\n this.openLiveChat()\n );\n\n var chatId = $('#scriptId').attr('scriptId');\n\n var observer = new MutationObserver(function (mutations) {\n var chatId = $('#scriptId').attr('scriptId');\n var onlineBtn = document.getElementById(`liveagent_button_online_` + chatId);\n\n if (onlineBtn && onlineBtn.style.display !== 'none') {\n $('.not-available-chat').addClass('hidden');\n $('.available-chat').removeClass('hidden');\n } else {\n $('.not-available-chat').removeClass('hidden');\n $('.available-chat').addClass('hidden');\n }\n $('.availabilityContainer').css('display', 'none');\n });\n var target = document.querySelector('#liveagent_button_online_' + chatId);\n observer.observe(target, {\n attributes: true\n });\n }\n\n liveagentInit () {\n var _self = this;\n\n if (!window.embedded_svc || !window.embedded_svc.menu) {\n var s = document.createElement('script');\n s.setAttribute('src', this.liveChatConfig.script);\n s.onload = function () {\n _self.initESW(null);\n };\n document.body.appendChild(s);\n } else {\n this.initESW(this.liveChatConfig.initUrl);\n }\n }\n\n initESW (url) {\n embedded_svc.menu.settings.language = `${this.liveChatConfig.language}`;\n embedded_svc.menu.chat.settings.paramName = `${this.liveChatConfig.customerName}`;\n embedded_svc.menu.chat.settings.paramMail = `${this.liveChatConfig.customerEmail}`;\n embedded_svc.menu.chat.settings.paramBrand = `${this.liveChatConfig.brand}`;\n embedded_svc.menu.chat.settings.paramCountry = `${this.liveChatConfig.country}`;\n\n embedded_svc.menu.init(\n `${this.liveChatConfig.initParam1}`,\n `${this.liveChatConfig.initParam2}`,\n url,\n `${this.liveChatConfig.initParam3}`,\n `${this.liveChatConfig.initParam4}`,\n {\n pageName: `${this.liveChatConfig.pageName}`\n }\n );\n\n this.appendEmbeddedStyling();\n }\n\n appendEmbeddedStyling () {\n var paramMobPosition = parseInt(this.liveChatConfig.position);\n\n var styleEmb = document.createElement('style');\n styleEmb.type = 'text/css';\n styleEmb.innerHTML = '.embedded-service .channelmenu_ctas li a { font-size: small;font-weight: normal;}';\n var isProductionEnvironment = this.liveChatConfig.isProductionEnvironment === true || this.liveChatConfig.isProductionEnvironment === 'true';\n if (isProductionEnvironment && !(cookieExists('cookie_closed') || (cookieExists('OptanonAlertBoxClosed') && cookieExists('OptanonConsent')))) {\n styleEmb.innerHTML += ' .embedded-service { display:none;}';\n }\n styleEmb.innerHTML += ' .embedded-service .fab:hover:before, .embedded-service .fab:focus:before { background-color: #F4F1EB !important;}';\n styleEmb.innerHTML += ' .embedded-service .fab:focus { background-color: #F4F1EB !important; box-shadow: 2px 2px 5px 0 rgba(45,45,45,0.5) !important;}';\n if (Foundation.MediaQuery.atLeast('medium')) {\n // Style innerHTML button menu\n styleEmb.innerHTML += ' .embedded-service .fab {bottom: 48px !important;right: 42px !important;z-index:1000 !important;}';\n // menu items\n styleEmb.innerHTML += ' .embedded-service .channelmenu {bottom: 123px !important;right: 42px !important;z-index:1000 !important;}';\n // menu minimize button\n styleEmb.innerHTML += ' .embeddedServiceSidebarMinimizedFabDefaultUI .content {right: 42px !important;}';\n styleEmb.innerHTML += ' .embeddedServiceSidebarMinimizedFabDefaultUI {bottom: 48px !important;right:42px !important;}';\n // chat container\n styleEmb.innerHTML += ' .embeddedServiceSidebar.layout-float .dockableContainer {bottom: 123px !important;right: 42px !important;}';\n } else {\n if (paramMobPosition == 1) {\n // Style innerHTML button menu TOP (Checkout)\n styleEmb.innerHTML += ' .embedded-service .fab {bottom:unset !important;top:1px !important;right: 15px !important;z-index:1000 !important;}';\n styleEmb.innerHTML += ' .embedded-service .channelmenu {bottom:unset !important;top:76px;z-index:1000 !important;display: initial !important;}';\n // menu minimized\n styleEmb.innerHTML += ' .embeddedServiceSidebarMinimizedFabDefaultUI .content {bottom:unset !important;top:76px !important;}';\n styleEmb.innerHTML += ' .embeddedServiceSidebarMinimizedFabDefaultUI {bottom:unset !important;top:1px !important;right: 15px !important;}';\n } else if (paramMobPosition == 2) {\n // Style innerHTML button menu Middle (Listing)\n styleEmb.innerHTML += ' .embedded-service .fab {bottom:24px !important;right: 8px !important;z-index:998 !important;}';\n // menu items\n styleEmb.innerHTML += ' .embedded-service .channelmenu {bottom:99px !important;z-index:997 !important;display: initial !important;}';\n // menu minimize button\n styleEmb.innerHTML += ' .embeddedServiceSidebarMinimizedFabDefaultUI .content {right: 8px !important;}';\n styleEmb.innerHTML += ' .embeddedServiceSidebarMinimizedFabDefaultUI {bottom:24px !important;right: 8px !important;}';\n } else if (paramMobPosition == 3) {\n // Style innerHTML button menu Middle (only for Cart page)\n styleEmb.innerHTML += ' .embedded-service .fab {bottom:125px !important;right: 8px !important;z-index:998 !important;}';\n // menu items\n styleEmb.innerHTML += ' .embedded-service .channelmenu {bottom:99px !important;z-index:997 !important;display: initial !important;}';\n // menu minimize button\n styleEmb.innerHTML += ' .embeddedServiceSidebarMinimizedFabDefaultUI .content {right: 8px !important;}';\n styleEmb.innerHTML += ' .embeddedServiceSidebarMinimizedFabDefaultUI {bottom:125px !important;right: 8px !important;}';\n } else {\n // Style innerHTML button menu (Homepage + Pdp)\n styleEmb.innerHTML += ' .embedded-service .fab {bottom:168px !important;right:8px !important;z-index:998 !important;}';\n // menu items\n styleEmb.innerHTML += ' .embedded-service .channelmenu {bottom:128px !important;z-index:997 !important;display: initial !important;}';\n // menu minimize button\n styleEmb.innerHTML += ' .embeddedServiceSidebarMinimizedFabDefaultUI .content {right:8px !important;}';\n styleEmb.innerHTML += ' .embeddedServiceSidebarMinimizedFabDefaultUI {bottom:168px !important;right:8px !important;}';\n }\n }\n document.getElementsByTagName('head')[0].appendChild(styleEmb);\n }\n}\n\nconst external = new ExternalScripts();\nwindow.openLiveChat = external.openLiveChat;\nexport default external;","import { cookieExists, createCookie, lockScroll, unlockScroll } from '../util/common';\nimport { newModalWithSelector } from '../components/modal';\n\nclass Multilanguage {\n init (condition) {\n var url = new URL(window.location.href);\n var showPopup = url.searchParams.get('showMultilanguage');\n if (condition === true) {\n showMultilanguagePopup(condition);\n }\n if ((!cookieExists('dw_subscribepopup')) || (showPopup)) {\n setTimeout(function () {\n showMultilanguagePopup(condition);\n });\n }\n }\n\n setCookie () {\n createCookie('dw_subscribepopup', '1', parseInt(window.Multilanguage.MultilanguagePopupExpiryDays));\n }\n\n showPopup () {\n showMultilanguagePopup();\n }\n};\n\nfunction showMultilanguagePopup (condition) {\n const url = window.Multilanguage.getMultilanguagePopup;\n unlockScroll();\n createCookie('dw_subscribepopup', '1', parseInt(window.SitePreferences.NewsletterPopupExpiryDays));\n if (url) {\n $.ajax({\n url: url,\n type: 'get',\n success: function (data) {\n if (!data.trim()) {\n return;\n }\n // Create a modal\n if (condition === false) {\n var modal = newModalWithSelector(data, false, ['multilanguage-popup'], null, data);\n // Hide the pre-home and geoBlock\n $('.content-asset').hide();\n $('.cc-geoblock').hide();\n modal.open();\n $('.action-change.js-country-line').on('click', function (evt) {\n const $target = $(evt.currentTarget);\n const url = $target.data('href');\n const locale = $target.data('locale');\n const currency = $target.data('currency');\n\n $.ajax({\n url: url,\n data: {\n code: locale,\n currency: currency,\n queryString: $('.page').data('querystring'),\n action: $('.page').data('action')\n }\n }).then(function (rsp) {\n if (rsp.redirectUrl) {\n document.location.href = rsp.redirectUrl;\n }\n });\n modal.close();\n $('.content-asset').show();\n $('.cc-geoblock').show();\n unlockScroll();\n });\n if (!Foundation.MediaQuery.atLeast('large')) {\n lockScroll();\n }\n }\n }\n });\n }\n}\n\nconst multilanguagePopup = new Multilanguage();\nexport default multilanguagePopup;\n","'use strict';\n\nimport { WebFormRequest } from 'components/webFormRequest';\nimport { isTouchDevice } from '../util/common';\nimport Accordion from './accordion';\nimport { addInputClearIcon } from '../util/form';\n\nclass WebFormRequestIntimissimi extends WebFormRequest {\n observeSelection () {\n var _self = this;\n\n if (!isTouchDevice()) {\n this.form.find('.contactType').chosen({\n disable_search: true\n });\n }\n\n // Case Type selection\n this.form.on('change', '.contactType', function (_e) {\n $(this).css('color', 'black');\n var value = $(this).val();\n\n if (value === '') {\n $('.js-webFormRequest-contactSubTypeCell', _self.form).addClass('visibility-hidden');\n return;\n }\n\n $('.js-webFormRequest-contactFormNextStep', _self.form).prop('disabled', true);\n\n // Load SubTypes\n var question = $('option:selected', this).data('value');\n var url = $(this).data('url') + '?question=' + encodeURIComponent(question);\n var defaultLabel = $(this).data('default-label');\n $.spinner().start();\n $('.pre-contact-section', _self.form).html('');\n $.ajax({\n url: url,\n type: 'GET',\n success: function (data) {\n $.spinner().stop();\n\n // Empty select and fill with default label\n const $select = $('.contactSubType', _self.form);\n $select.empty().append($('