{"version":3,"sources":["inoMsComparator.js","inoMsComparator.tmpl.js"],"names":["inovestor","ms","comparator","config","apiRelativeUrl","apiDailyPricesRelativeUrl","apiMonthlyReturnsRelativeUrl","stateCacheKey","stateCache","get","stateCacheFromStorage","sessionStorage","getItem","JSON","parse","e","console","error","set","state","setItem","stringify","$","ko","viewModels","comparatorViewModel","plugin","self","this","comparisonChartTypes","maxSymbols","options","pdfReportUrl","pdfHandler","etfs","observableArray","resources","observable","rows","symbols","tickers","hasError","isBusy","showCategoryAlert","isInvalidIdentifier","invalidSymbols","displaySymbols","showInvalidSymbolsAlert","isDummyData","isFirstLoad","hasChartError","asOfPerfomanceDate","hasValidData","computed","canAddMoreSymbol","pureComputed","filter","x","symbol","defaultValueString","length","numberOfSymbolsToCompare","hiddenOverview","hiddenOverviewCharacteristics","hiddenOverviewRisk","hiddenOverviewFixedIncome","hiddenPerformance","hiddenPerformancePeriodicReturns","hiddenPerformanceCalendarReturns","hiddenAllocations","hiddenAllocationsAssets","hiddenAllocationsGeographic","hiddenAllocationsSectors","hiddenAllocationsConstituents","displayComparisonChart","selectedComparisonChartPeriod","selectedComparisonChartPeriodLength","setComparisonChartExtremes","period","periodLength","_setChartExtremes","hyphenate","selectedComparisonChartType","setSelectedComparisonChartType","type","_renderComparisonChart","updateResources","currentResource","core","currentLanguage","isNullOrUndefined","haveDifferentCategories","assetClassNameRow","find","rowName","columns","map","valueEn","i","array","indexOf","overviewRows","currentRows","currentOverview","j","currentRow","push","riskRows","currentField","fixedIncomeRows","removeFromRowsByIndex","index","displayType","value","valueFR","addSymbol","symbolObj","symbolToChange","ticker","some","findIndex","replace","isValidTicker","substring","doSearch","removeSymbol","numberOfWantedSymbols","splice","dummyData","_createRows","_formatRows","_viewModel","_renderPieCharts","_setUrlValues","arr","search","join","urlValues","selfUrl","exportToCsv","csvArray","csvService","transformComparatorDataToCsvArray","csvString","transformCsvArrayToCsvString","escapeHeader","blob","Blob","saveAs","modal","generatePdfUrl","stringFormat","getSymbolAtIndex","validEtfs","dataType","validEtf","canLink","data","isEmptyString","family","redirectUrl","sponsoredFamilies","localeCompare","sensitivity","generateLink","category","createHyphenator","hyphenationPatternsEnUs","text","coalesce","defaultValue","libRef","jQuery","pluginName","Plugin","element","_name","_defaults","fn","inoMsComparator","defaults","extend","comparisonChartData","comparisonChartInstance","comparisonChartReturnsCache","Map","comparisonChartPricesCache","init","prototype","fileName","fileCacheKey","instances","register","update","templatePaths","filePath","templateRootUrl","match","getTemplate","then","template","html","buildCache","render","bindEvents","bindModel","shareable","Shareable","_setInitialSymbols","_setTickers","ui","autocomplete","inoCdnBaseUrl","jUIScriptUrl","concatUrl","jUIStyleUrl","append","autocompleteScriptUrl","autocompleteStyleUrl","_setUpAutocomplete","always","$element","trigger","getNavigationValues","nonEmptyUrlSymbols","_removeEmptySymbols","_removeDuplicateSymbols","stateCacheValues","nonEmptyStateCacheSymbols","split","destroy","unbindEvents","removeData","$etfChartInstance","on","onReady","call","input","val","location","href","setTimeout","select","document","execCommand","oldSymbols","_getValidSymbolString","toLowerCase","newSymbolsArr","extraSymbols","forEach","item","reason","_areSymbolsTheSame","oldIndex","id","newIndex","_swapValuesByIndices","setNavigation","toUpperCase","currentVal","sameSymbols","currentSymbol","off","apiErrorHandler","apiError","onError","result","generateError","errors","invalidIdentifierHandler","invalidIdentifier","_resetDataBeforeSearch","_setDefaultTable","etfUrl","ajaxApi","contentType","validData","_removeInvalidSymbols","_addFundsAndSymbolsToVM","_sortResults","_fillTableData","_setUpSortable","assetUnderManagement","badIndices","requestStatus","reverse","duplicateSymbols","symbolArr","lastIndexOf","uniqueSymbols","newSymbolStr","unformattedRows","Deferred","done","currentUrlValues","validSymbols","adjustedOldIndexForRows","Math","min","moved","adjustedNewIndexForRows","currentColumns","touchHandler","event","touch","changedTouches","simulatedEvent","createEvent","initMouseEvent","touchstart","touchmove","touchend","window","screenX","screenY","clientX","clientY","target","dispatchEvent","sortable","handle","scroll","placeholder","helper","clone","css","height","width","start","change","stop","addEventListener","sortedEtfs","sortedSymbols","maxNumberOfEtfs","dummyCtr","rowNames","rowDefinition","rowObj","key","resourceKey","columnValue","etf","valueFr","linkTextResourceKey","decimalPlaces","valueAsPercent","showAsLargeNumber","rowIndex","compareCol","comparer","count","mostRecentDate","apiFirstDate","apiLastDate","minDate","maxDate","chartData","firstDate","historicalDatas","Date","date","lastDate","UTC","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","minDateCompute","setFullYear","getFullYear","xAxis","setExtremes","etfsData","chartIsReturnsChart","chartIsInCompareMode","defaultChartOptions","chartSymbols","y","hasReturns","chart","zoomType","events","selection","plotOptions","line","marker","enabled","series","compare","compareStart","dataGrouping","dateTimeLabelFormats","week","rangeSelector","navigator","scrollbar","legend","_fetchNewComparisonChartData","chartDatas","chartSeries","chartOptions","symbolParts","compoundedValue","currentSeries","name","Array","isArray","reduce","agg","getTime","chartElement","yAxis","opposite","labels","formatter","Highcharts","numberFormat","tooltip","pointFormat","changeDecimals","valueDecimals","hour","highcharts","symbolsNotInCache","dataCache","size","cachedData","symbolsInCache","from","keys","values","orderedSymbols","resolve","chartDataUrl","aipChartDatas","aipChartData","_renderAssetPieCharts","_renderSectorPieCharts","_renderGeographicPieCharts","notDummyEtfs","assetAllocations","currentEtf","currentAlloc","percent","formattedY","nameFr","nameEn","chartConfig","pieChartConfig","colorByPoint","sectorAllocations","descriptionFr","descriptionEn","geographicAllocations","countryNameFr","countryNameEn","counter","globalCoreConfig","$input","apiSearchBaseUrl","apiBaseUrl","getComponentConfigurations","inoMsAutocomplete","language","shouldRenderMoreResults","shouldSelectOnNonMatch","shouldAutoSelect","onSelect","filters","exchange","stopPropagation","outerWidth","click","valueHasMutated","chartErrorHandler","applyBindings","each","colors","pie","allowPointSelect","cursor","dataLabels","showInLegend","fundKey","bindingHandlers","accessibleClick","keyCode","preventDefault","pluginTitle","assetClassName","currency","distributionFrequencyCode","asOf","inceptionDate","managementExpenseRatio","managementFee","previousClose","riskRating","marketPrice","distributionYieldTtm","equityFundStyle","fundgrade","numberOfHoldings","objective","averageMaturity","yieldToMaturity","averageCreditQuality","standardDeviationY3","standardDeviationY5","sharpeRatioY3","sharpeRatioY5","rowTooltips","sectionLabels","overview","description","performance","assetAllocation","geographicAllocation","sectorAllocation","periodicReturns","calendarReturns","allocations","constituentsAllocation","characteristics","risk","fixedIncome","objectives","asOfPerfomance","periodicReturnsLabels","oneMonth","threeMonth","sixMonth","oneYear","threeYear","fiveYear","tenYear","sinceInception","yearToDate","periodicReturnsCsvLabels","calendarReturnsLabels","calendarReturnsCsvLabels","calendarReturnsQuartileCsvLabels","allocationCsvLabels","assetClass","constituent","sector","geographic","columnData","boolean","true","false","none","monthly","quarterly","semiannual","daily","specific","annually","weekly","low","lowtomedium","medium","mediumtohigh","high","large value","large blend","mid blend","mid growth","mid value","small blend","small growth","small value","close","enterETF","symbolError","duplicateSymbol","invalidSymbol","tooManySymbols","addFunds","yes","dataNotAvailable","no","searchPlaceholder","differentCategoryWarning","sameETFWarning","validETF","fund","returnIsAnnualizedWarning","dataNotAvailableForETFWithLessThanAFullYear","viewObjective","view","comparisonTool","downloadComparison","shareComparison","url","urlCopied","comparisonChart","periodTitle","periods","ytd","all","commonInception","chartTypes","returns","prices","constituentsWarning","hideShowSection","asOfToolTipText","large growth","csvArrayBuilder","addColumn","header","getter","addColumnsFactory","build","interpretedColumns","column","createdColumns","makeOverviewRowToCsvColumn","field","localizedField","localizedValue","localizeText","english","french","includes","year","calendarReturn","return","quartileRank","highestNumberOfAssetAllocation","max","highestNumberOfGeographicAllocation","highestNumberOfSectorAllocation","highestNumberOfConstituentsAllocation","holdings","weight"],"mappings":"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CAT,SAAA,KACAC,WAAA,KACAC,SAAA,KACAC,QAAA,KACAC,UAAA,KACAC,SAAA,KACAC,QAAA,MACAC,eAAA,YACAC,WAAA,KACA,EACAE,sBAAA,2BACAC,yBAAA,gBACAC,iCAAA,kBACAC,oBAAA,CACAC,WAAA,cACAC,YAAA,cACAC,OAAA,SACAC,WAAA,YACA,EACAC,WAAA,CACAC,QAAA,CACAC,KAAA,MACAC,MAAA,IACA,EACA3D,0BAAA,CACA4D,KAAA,OACAC,QAAA,UACAC,UAAA,YACAC,WAAA,cACAC,MAAA,QACAC,SAAA,WACAC,SAAA,WACAC,OAAA,QACA,EACA7D,WAAA,CACAsD,KAAA,OACAQ,IAAA,MACAC,YAAA,gBACAC,OAAA,SACAC,aAAA,iBACAC,KAAA,MACA,EACAzD,qBAAA,CACAqD,IAAA,MACAE,OAAA,SACAE,KAAA,MACA,EACA/D,gBAAA,CACAgE,cAAA,cACAC,cAAA,cACAC,YAAA,YACAC,aAAA,aACAC,YAAA,YACAC,cAAA,cACAC,eAAA,eACAC,cAAA,aACA,CACA,EACAC,MAAA,QACAC,SAAA,cACApT,OAAA,CACAqT,YAAA,uCACAC,gBAAA,uBACAC,cAAA,8BACAC,eAAA,6CACA,EACA7L,QAAA,UACA8L,SAAA,YACAC,IAAA,MACAC,iBAAA,wBACAC,GAAA,KACAC,kBAAA,gCACAC,yBAAA,yFACAC,eAAA,yCACAC,SAAA,4BACAC,KAAA,OACAC,0BAAA,mDACAC,4CAAA,uDACAC,cAAA,iBACAC,KAAA,OACAC,eAAA,kBACAC,mBAAA,WACAC,gBAAA,QACAC,IAAA,OACAC,UAAA,aACAC,gBAAA,CACAC,YAAA,UACAC,QAAA,CACAC,IAAA,MACAnE,QAAA,KACAC,UAAA,KACAC,SAAA,KACAC,QAAA,MACAiE,IAAA,MACAC,gBAAA,kBACA,EACAC,WAAA,CACAC,QAAA,eACAC,OAAA,cACA,CACA,EACAC,oBAAA,oMACApe,aAAA,gBACAV,UAAA,aACA+e,gBAAA,2BACAC,gBAAA,iDACA,CACA,GAAAvb,OAAA5K,UAAA,EACA,SAAAA,GACAA,EAAAC,GAAAC,WAAAkC,UAAApC,EAAAC,GAAAC,WAAAkC,WAAA,GACApC,EAAAC,GAAAC,WAAAkC,UAAA,GAAA,CACAwc,YAAA,iBACA3J,SAAA,CACAuE,KAAA,MACA9V,OAAA,UACAiO,qBAAA,sBACAkN,eAAA,kBACAC,SAAA,iBACAC,0BAAA,4BACAC,KAAA,aACAC,cAAA,WACAC,uBAAA,MACAC,cAAA,mBACAC,cAAA,gBACAC,WAAA,yBACAC,YAAA,kBACAC,qBAAA,0CACAC,gBAAA,4BACAC,UAAA,YACAC,iBAAA,mBACAC,UAAA,WACAC,gBAAA,+BACAC,gBAAA,yBACAC,qBAAA,oBACAC,oBAAA,gBACAC,oBAAA,gBACAC,cAAA,qBACAC,cAAA,oBACA,EACAC,YAAA,CACAZ,qBAAA,8IACA,EACAa,cAAA,CACAC,SAAA,iBACAC,YAAA,cACAC,YAAA,YACAC,gBAAA,uBACAC,qBAAA,2BACAC,iBAAA,0BACAC,gBAAA,yBACAC,gBAAA,8BACAC,YAAA,cACAC,uBAAA,cACAC,gBAAA,mBACAC,KAAA,SACAC,YAAA,cACAC,WAAA,YACAC,eAAA,YACA,EACAC,sBAAA,CACAC,SAAA,KACAC,WAAA,KACAC,SAAA,KACAC,QAAA,KACAC,UAAA,MACAC,SAAA,MACAC,QAAA,OACAC,eAAA,YACAC,WAAA,MACA,EACAC,yBAAA,CACAT,SAAA,KACAC,WAAA,KACAC,SAAA,KACAC,QAAA,KACAC,UAAA,KACAC,SAAA,KACAC,QAAA,MACAC,eAAA,WACAC,WAAA,MACA,EACAE,sBAAA,8BACAC,yBAAA,mBACAC,iCAAA,kBACAC,oBAAA,CACAC,WAAA,iBACAC,YAAA,cACAC,OAAA,UACAC,WAAA,cACA,EACAC,WAAA,CACAC,QAAA,CACAC,KAAA,MACAC,MAAA,KACA,EACA3D,0BAAA,CACA4D,KAAA,SACAC,QAAA,YACAC,UAAA,gBACAC,WAAA,gBACAC,MAAA,eACAC,SAAA,aACAC,SAAA,eACAC,OAAA,cACA,EACA7D,WAAA,CACAsD,KAAA,QACAQ,IAAA,MACAC,YAAA,cACAC,OAAA,QACAC,aAAA,gBACAC,KAAA,OACA,EACAzD,qBAAA,CACAqD,IAAA,MACAE,OAAA,QACAE,KAAA,OACA,EACA/D,gBAAA,CACA4G,eAAA,yBACA5C,cAAA,qBACAC,cAAA,uBACAC,YAAA,wBACAC,aAAA,0BACAC,YAAA,sBACAC,cAAA,uBACAC,eAAA,yBACAC,cAAA,oBACA,CACA,EACAC,MAAA,SACAC,SAAA,iBACApT,OAAA,CACAqT,YAAA,6CACAC,gBAAA,6BACAC,cAAA,wCACAC,eAAA,wDACA,EACA7L,QAAA,WACA8L,SAAA,oBACAC,IAAA,MACAC,iBAAA,sCACAC,GAAA,MACAC,kBAAA,mCACAC,yBAAA,oGACAC,eAAA,0DACAC,SAAA,sCACAC,KAAA,OACAC,0BAAA,0EACAC,4CAAA,8EACAC,cAAA,WACAC,KAAA,OACAC,eAAA,uBACAC,mBAAA,cACAC,gBAAA,WACAC,IAAA,SACAC,UAAA,aACAC,gBAAA,CACAC,YAAA,WACAC,QAAA,CACAC,IAAA,QACAnE,QAAA,KACAC,UAAA,KACAC,SAAA,KACAC,QAAA,MACAiE,IAAA,MACAC,gBAAA,gBACA,EACAC,WAAA,CACAC,QAAA,kBACAC,OAAA,uBACA,CACA,EACAC,oBAAA,uOACApe,aAAA,uBACAV,UAAA,qBACA+e,gBAAA,gCACAC,gBAAA,oDACA,CACA,GAAAvb,OAAA5K,UAAA,EACA,SAAAA,GACAA,EAAAC,GAAAC,WAAAF,EAAAC,GAAAC,YAAA,GAEAF,EAAAC,GAAAC,WAAAmmB,gBAAA,WACA,IAAAtgB,EAAA,GAEAnE,KAAA0kB,UAAA,SAAAC,EAAAC,GAEA,OADAzgB,EAAAW,KAAA,CAAA6f,OAAAA,EAAAC,OAAAA,CAAA,CAAA,EACA5kB,IACA,EAEAA,KAAA6kB,kBAAA,SAAAvb,GAEA,OADAnF,EAAAW,KAAAwE,CAAA,EACAtJ,IACA,EAEAA,KAAA8kB,MAAA,SAAA7c,GACA,IAAA8c,EAAA5gB,EAAA4T,OAAA,SAAAC,EAAAgN,GACA,IACAC,EASA,MAVA,YAAA,OAAAD,EAEA,OADAC,EAAAD,EAAA/c,CAAA,IAEAgd,EAAAnX,QAAA,SAAAjM,GACAmW,EAAAlT,KAAAjD,CAAA,CACA,CAAA,EAGAmW,EAAAlT,KAAAkgB,CAAA,EAEAhN,CACA,EAAA,EAAA,EAEAtX,EAAA,GAYA,OAVAA,EAAAoE,KAAAigB,EAAA3gB,IAAA,SAAA4gB,GACA,OAAAA,EAAAL,MACA,CAAA,CAAA,EAEA1c,EAAA6F,QAAA,SAAAjM,GACAnB,EAAAoE,KAAAigB,EAAA3gB,IAAA,SAAA4gB,GACA,OAAAA,EAAAJ,OAAA/iB,CAAA,CACA,CAAA,CAAA,CACA,CAAA,EAEAnB,CACA,CACA,CACA,GAAAtC,UAAAC,GAAA0K,OAAAC,OAAA5K,UAAA,EACA,SAAAA,GAmNA,SAAA8mB,EAAAC,EAAA3kB,GACA,IAMAmkB,EAEAC,EARA1gB,EAAA9F,EAAAC,GAAAC,WAAA+U,SAAApP,KAAA,SAAApC,GAAA,OAAAA,EAAA2R,MAAA2R,CAAA,CAAA,EAEA,OAAA,MAAAjhB,EACA,CAAAygB,OAAAQ,EAAAP,OAAA,WAAA,OAAA,IAAA,CAAA,GAGAD,EAAA,MAAAzgB,EAAAuP,aAAA,MAAAjT,EAAA6S,UAAA,MAAA7S,EAAA6S,SAAAnP,EAAAuP,aAAA0R,EAAA3kB,EAAA6S,SAAAnP,EAAAuP,aAEAmR,EAAA,SAAA/iB,GACA,OAAA,MAAAA,EAAAsjB,GAAA,KAAAtjB,EAAAsjB,EACA,EAEA,kBAAAjhB,EAAAkB,aAAA,uBAAAlB,EAAAkB,YACAwf,EAAA,SAAA/iB,GACA,IAAAujB,EAAA,OAAAhnB,EAAAC,GAAAuF,KAAAC,gBAAAshB,EAAA,KAAAA,EAAA,KACA,OAAA,MAAAtjB,EAAAujB,GAAA,KAAAvjB,EAAAujB,EACA,EACA,iBAAAlhB,EAAAkB,cACAwf,EAAA,SAAA/iB,GACA,IAEAwjB,EAFAhgB,EAAAxD,EAAAsjB,GACA,OAAA,MAAA9f,EAAA,KAEA,OADAggB,EAAA7kB,EAAAmgB,WAAAzc,EAAAuP,aAAApO,EAAAsI,YAAA,IACAtI,EAAAggB,CACA,GAGA,CAAAV,OAAAA,EAAAC,OAAAA,CAAA,EACA,CAEA,SAAAU,EAAAC,EAAAC,GACA,MAAA,OAAApnB,EAAAC,GAAAuF,KAAAC,gBAAA2hB,EAAAD,CACA,CAlPAnnB,EAAAC,GAAAC,WAAAF,EAAAC,GAAAC,YAAA,GAEAF,EAAAC,GAAAC,WAAA2I,WAAA,CACAG,6BAAA,SAAAJ,EAAA7G,GAYA,OAXA6G,EAAA5C,IAAA,SAAAvC,EAAAyC,GAEA,OAAA,MAAAnE,GAAA,CAAA,IAAAA,EAAAkH,cAAA,IAAA/C,EAAAzC,EAEAA,EAAAuC,IAAA,SAAA6R,GACA,OAAA,MAAAA,EAAA,GACA,UAAA,OAAAA,GAAA,KAAAA,EAAA,IAAAA,EAAApQ,QAAA,KAAA,IAAA,EAAA,IACAoQ,CACA,CAAA,GANArP,KAAA,GAAA,CAOA,CAAA,EAAAA,KAAA,MAAA,CAGA,EAEAM,kCAAA,SAAAe,EAAAzH,GACA,OAAA,IAAApC,EAAAC,GAAAC,WAAAmmB,iBAEAC,UAAAlkB,EAAA6S,SAAAuE,KAAA,SAAA/V,GAAA,OAAAyjB,EAAAzjB,EAAAyY,OAAAzY,EAAAwY,MAAA,CAAA,CAAA,EACAqK,UAAAlkB,EAAA6S,SAAAvR,OAAA,SAAAD,GAAA,OAAAA,EAAAC,MAAA,CAAA,EAEA+iB,kBAAA,WACA,OAAAzmB,EAAAC,GAAAC,WAAAmG,aAAAL,IAAA,SAAAvC,GAAA,OAAAqjB,EAAArjB,EAAArB,CAAA,CAAA,CAAA,CACA,CAAA,EAEAqkB,kBAAA,WACA,OAAAzmB,EAAAC,GAAAC,WAAAyG,SAAAX,IAAA,SAAAvC,GAAA,OAAAqjB,EAAArjB,EAAArB,CAAA,CAAA,CAAA,CACA,CAAA,EAEAqkB,kBAAA,WACA,OAAAzmB,EAAAC,GAAAC,WAAA2G,gBAAAb,IAAA,SAAAvC,GAAA,OAAAqjB,EAAArjB,EAAArB,CAAA,CAAA,CAAA,CACA,CAAA,EAEAkkB,UAAAlkB,EAAA0f,yBAAAD,WAAA,SAAApe,GAAA,OAAA,MAAAA,EAAAkd,gBAAA,KAAAld,EAAAkd,gBAAAkB,UAAA,CAAA,EACAyE,UAAAlkB,EAAA0f,yBAAAT,SAAA,SAAA5d,GAAA,OAAA,MAAAA,EAAAkd,gBAAA,KAAAld,EAAAkd,gBAAAU,QAAA,CAAA,EACAiF,UAAAlkB,EAAA0f,yBAAAR,WAAA,SAAA7d,GAAA,OAAA,MAAAA,EAAAkd,gBAAA,KAAAld,EAAAkd,gBAAAW,UAAA,CAAA,EACAgF,UAAAlkB,EAAA0f,yBAAAP,SAAA,SAAA9d,GAAA,OAAA,MAAAA,EAAAkd,gBAAA,KAAAld,EAAAkd,gBAAAY,QAAA,CAAA,EACA+E,UAAAlkB,EAAA0f,yBAAAN,QAAA,SAAA/d,GAAA,OAAA,MAAAA,EAAAkd,gBAAA,KAAAld,EAAAkd,gBAAAa,OAAA,CAAA,EACA8E,UAAAlkB,EAAA0f,yBAAAL,UAAA,SAAAhe,GAAA,OAAA,MAAAA,EAAAkd,gBAAA,KAAAld,EAAAkd,gBAAAc,SAAA,CAAA,EACA6E,UAAAlkB,EAAA0f,yBAAAJ,SAAA,SAAAje,GAAA,OAAA,MAAAA,EAAAkd,gBAAA,KAAAld,EAAAkd,gBAAAe,QAAA,CAAA,EACA4E,UAAAlkB,EAAA0f,yBAAAH,QAAA,SAAAle,GAAA,OAAA,MAAAA,EAAAkd,gBAAA,KAAAld,EAAAkd,gBAAAgB,OAAA,CAAA,EACA2E,UAAAlkB,EAAA0f,yBAAAF,eAAA,SAAAne,GAAA,OAAA,MAAAA,EAAAkd,gBAAA,KAAAld,EAAAkd,gBAAAiB,cAAA,CAAA,EAEA6E,kBAAA,WAYA,OAXA5c,EAAA8P,OAAA,SAAAC,EAAAnW,GAQA,OAPA,MAAAA,EAAAmd,iBACAnd,EAAAmd,gBAAAlR,QAAA,SAAAmI,GACA+B,EAAAyN,SAAAxP,EAAAyP,IAAA,GACA1N,EAAAlT,KAAAmR,EAAAyP,IAAA,CAEA,CAAA,EAEA1N,CACA,EAAA,EAAA,EAEAD,OAAA,SAAAC,EAAA0N,GAaA,OAZA1N,EAAAlT,KAAA,CAAA6f,OAAAvmB,EAAAC,GAAAuF,KAAA+D,aAAAnH,EAAA4f,yBAAA,CAAAsF,KAAAA,CAAA,CAAA,EAAAd,OAAA,SAAA/iB,GACA,OAAA,MAAAA,EAAAmd,iBAEA,OADA2G,EAAA9jB,EAAAmd,gBAAA/a,KAAA,SAAAgS,GAAA,OAAAA,EAAAyP,OAAAA,CAAA,CAAA,GACA,KAAAC,EAAAC,MACA,CAAA,CAAA,EAEA5N,EAAAlT,KAAA,CAAA6f,OAAAvmB,EAAAC,GAAAuF,KAAA+D,aAAAnH,EAAA6f,iCAAA,CAAAqF,KAAAA,CAAA,CAAA,EAAAd,OAAA,SAAA/iB,GACA,OAAA,MAAAA,EAAAmd,iBAEA,OADA2G,EAAA9jB,EAAAmd,gBAAA/a,KAAA,SAAAgS,GAAA,OAAAA,EAAAyP,OAAAA,CAAA,CAAA,GACA,KAAAC,EAAAE,YACA,CAAA,CAAA,EAEA7N,CACA,EAAA,EAAA,CACA,CAAA,EAEA6M,kBAAA,WACA,IAAAiB,EAAA7d,EAAA8P,OAAA,SAAAC,EAAAnW,GACA,OAAA,MAAAA,EAAAmY,iBAAAhC,EACAlH,KAAAiV,IAAA/N,EAAAnW,EAAAmY,iBAAAhY,MAAA,CACA,EAAA,CAAA,EAEA,GAAA,IAAA8jB,EAAA,MAAA,GAIA,IAFA,IAAA3hB,EAAA,GAEAG,EAAA,EAAAA,EAAAwhB,EAAAxhB,CAAA,GACAH,EAAAW,KAAA,CACA6f,OAAAnkB,EAAA8f,oBAAAC,WAAA,KAAAjc,EAAA,GACAsgB,OAAA,SAAAzf,GACA,OAAA,SAAAtD,GACA,OAAA,MAAAA,EAAAmY,kBAAA,MAAAnY,EAAAmY,iBAAA7U,GAAA,KAAAmgB,EAAAzjB,EAAAmY,iBAAA7U,GAAAmV,OAAAzY,EAAAmY,iBAAA7U,GAAAkV,MAAA,CACA,CACA,EAAA/V,CAAA,CACA,CAAA,EAEAH,EAAAW,KAAA,CACA6f,OAAAnkB,EAAA8f,oBAAAC,WAAA,KAAAjc,EAAA,GAAA,OACAsgB,OAAA,SAAAzf,GACA,OAAA,SAAAtD,GACA,OAAA,MAAAA,EAAAmY,kBAAA,MAAAnY,EAAAmY,iBAAA7U,GAAA,KAAAtD,EAAAmY,iBAAA7U,GAAAgV,OACA,CACA,EAAA7V,CAAA,CACA,CAAA,EAGA,OAAAH,CACA,CAAA,EAEA0gB,kBAAA,WACA,IAAAmB,EAAA/d,EAAA8P,OAAA,SAAAC,EAAAnW,GACA,OAAA,MAAAA,EAAAgZ,sBAAA7C,EACAlH,KAAAiV,IAAA/N,EAAAnW,EAAAgZ,sBAAA7Y,MAAA,CACA,EAAA,CAAA,EAEA,GAAA,IAAAgkB,EAAA,MAAA,GAIA,IAFA,IAAA7hB,EAAA,GAEAG,EAAA,EAAAA,EAAA0hB,EAAA1hB,CAAA,GACAH,EAAAW,KAAA,CACA6f,OAAAnkB,EAAA8f,oBAAAI,WAAA,KAAApc,EAAA,GACAsgB,OAAA,SAAAzf,GACA,OAAA,SAAAtD,GACA,OAAA,MAAAA,EAAAgZ,uBAAA,MAAAhZ,EAAAgZ,sBAAA1V,GAAA,KAAAmgB,EAAAzjB,EAAAgZ,sBAAA1V,GAAA4V,cAAAlZ,EAAAgZ,sBAAA1V,GAAA2V,aAAA,CACA,CACA,EAAAxW,CAAA,CACA,CAAA,EAEAH,EAAAW,KAAA,CACA6f,OAAAnkB,EAAA8f,oBAAAI,WAAA,KAAApc,EAAA,GAAA,OACAsgB,OAAA,SAAAzf,GACA,OAAA,SAAAtD,GACA,OAAA,MAAAA,EAAAgZ,uBAAA,MAAAhZ,EAAAgZ,sBAAA1V,GAAA,KAAAtD,EAAAgZ,sBAAA1V,GAAAgV,OACA,CACA,EAAA7V,CAAA,CACA,CAAA,EAGA,OAAAH,CACA,CAAA,EAEA0gB,kBAAA,WACA,IAAAoB,EAAAhe,EAAA8P,OAAA,SAAAC,EAAAnW,GACA,OAAA,MAAAA,EAAA6Y,kBAAA1C,EACAlH,KAAAiV,IAAA/N,EAAAnW,EAAA6Y,kBAAA1Y,MAAA,CACA,EAAA,CAAA,EAEA,GAAA,IAAAikB,EAAA,MAAA,GAIA,IAFA,IAAA9hB,EAAA,GAEAG,EAAA,EAAAA,EAAA2hB,EAAA3hB,CAAA,GACAH,EAAAW,KAAA,CACA6f,OAAAnkB,EAAA8f,oBAAAG,OAAA,KAAAnc,EAAA,GACAsgB,OAAA,SAAAzf,GACA,OAAA,SAAAtD,GACA,OAAA,MAAAA,EAAA6Y,mBAAA,MAAA7Y,EAAA6Y,kBAAAvV,GAAA,KAAAmgB,EAAAzjB,EAAA6Y,kBAAAvV,GAAAyV,cAAA/Y,EAAA6Y,kBAAAvV,GAAAwV,aAAA,CACA,CACA,EAAArW,CAAA,CACA,CAAA,EAEAH,EAAAW,KAAA,CACA6f,OAAAnkB,EAAA8f,oBAAAG,OAAA,KAAAnc,EAAA,GAAA,OACAsgB,OAAA,SAAAzf,GACA,OAAA,SAAAtD,GACA,OAAA,MAAAA,EAAA6Y,mBAAA,MAAA7Y,EAAA6Y,kBAAAvV,GAAA,KAAAtD,EAAA6Y,kBAAAvV,GAAAgV,OACA,CACA,EAAA7V,CAAA,CACA,CAAA,EAGA,OAAAH,CACA,CAAA,EAEA0gB,kBAAA,WACA,IAAAqB,EAAAje,EAAA8P,OAAA,SAAAC,EAAAnW,GACA,OAAA,MAAAA,EAAAskB,SAAAnO,EACAlH,KAAAiV,IAAA/N,EAAAnW,EAAAskB,SAAAnkB,MAAA,CACA,EAAA,CAAA,EAEA,GAAA,IAAAkkB,EAAA,MAAA,GAIA,IAFA,IAAA/hB,EAAA,GAEAG,EAAA,EAAAA,EAAA4hB,EAAA5hB,CAAA,GACAH,EAAAW,KAAA,CACA6f,OAAAnkB,EAAA8f,oBAAAE,YAAA,KAAAlc,EAAA,GACAsgB,OAAA,SAAAzf,GACA,OAAA,SAAAtD,GACA,OAAA,MAAAA,EAAAskB,UAAA,MAAAtkB,EAAAskB,SAAAhhB,GAAA,KAAAmgB,EAAAzjB,EAAAskB,SAAAhhB,GAAAmV,OAAAzY,EAAAskB,SAAAhhB,GAAAkV,MAAA,CACA,CACA,EAAA/V,CAAA,CACA,CAAA,EAEAH,EAAAW,KAAA,CACA6f,OAAAnkB,EAAA8f,oBAAAE,YAAA,KAAAlc,EAAA,GAAA,OACAsgB,OAAA,SAAAzf,GACA,OAAA,SAAAtD,GACA,OAAA,MAAAA,EAAAskB,UAAA,MAAAtkB,EAAAskB,SAAAhhB,GAAA,KAAAtD,EAAAskB,SAAAhhB,GAAAihB,MACA,CACA,EAAA9hB,CAAA,CACA,CAAA,EAGA,OAAAH,CACA,CAAA,EACA2gB,MAAA7c,CAAA,CACA,CACA,CAoCA,GAAA7J,UAAAC,GAAA0K,OAAAC,OAAA5K,UAAA,EC33EAyT,OAAA,oBAAAA,OAAA,qBAAA,GACAA,OAAA,oBAAA,mCAAA","file":"../inoMsComparator.min.js","sourcesContent":["; (function (inovestor, undefined) {\n // Setup dependencies for this plugin\n // Normally we would add jQuery and knockout but ms-core, which we depend on, already register them so it's useless\n\n // Create plugin namespace with any desired config variable\n inovestor.ms.comparator = inovestor.ms.comparator || {};\n})(inovestor);\n; (function (comparator, undefined) {\n // Create plugin namespace with any desired config variable\n comparator.config = {\n apiRelativeUrl: 'etfs/etfcomparatorV2?symbols={symbols}',\n apiDailyPricesRelativeUrl: 'etfs/etfComparatorV2/dailyPrices?symbols={symbols}',\n apiMonthlyReturnsRelativeUrl: 'etfs/etfComparatorV2/monthlyReturns?symbols={symbols}'\n };\n})(inovestor.ms.comparator);\n\n\n; (function (comparator, undefined) {\n var stateCacheKey = 'inoMsComparator';\n\n // Create plugin namespace with any desired config variable\n comparator.stateCache = {\n get: function () {\n try {\n var stateCacheFromStorage = sessionStorage.getItem(stateCacheKey);\n if (stateCacheFromStorage != null) {\n var stateCache = JSON.parse(stateCacheFromStorage);\n if (stateCache != null) {\n return stateCache\n }\n }\n } catch (e) {\n console.error(e);\n }\n return null\n },\n\n set: function (state) {\n try {\n sessionStorage.setItem(stateCacheKey, JSON.stringify(state));\n } catch (e) {\n console.error(e);\n }\n }\n };\n})(inovestor.ms.comparator);\n\n\n(function ($, ko, inovestor, undefined) {\n inovestor.ms.comparator.viewModels = {};\n\n /**\n * ViewModel for the ETF Comparison page\n * \n * @constructor\n * @param {object} plugin - A handle to the ETF Comparison plugin\n */\n inovestor.ms.comparator.viewModels.comparatorViewModel = function (plugin) {\n\n var self = this;\n self.maxSymbols = plugin.options.maxSymbols;\n self.pdfReportUrl = plugin.options.pdfReportUrl;\n self.pdfHandler = plugin.options.pdfHandler;\n self.etfs = ko.observableArray([]); // Gives you a handle to all the ETFs that are returned by the server\n self.resources = ko.observable(); // The resouces object for the current language\n self.rows = ko.observableArray(); // All of the formatted rows for the ETFs. Used to make the tables\n self.symbols = ko.observableArray(); // Collection of just the symbols. Passed to the plugin's search()\n self.tickers = ko.observableArray() // Holds the tickers\n self.hasError = ko.observable(false); // Boolean if there is an error with the data\n self.isBusy = ko.observable(false); // Boolean if there is currently an AJAX call happening\n self.showCategoryAlert = ko.observable(false); // Boolean whether we show the Caregory alert\n self.isInvalidIdentifier = ko.observable(false);\n self.invalidSymbols = ko.observable({\n symbols: ko.observableArray([]),\n displaySymbols: ko.observableArray([])\n });\n self.showInvalidSymbolsAlert = ko.observable(false);\n self.isDummyData = ko.observable(false);\n self.isFirstLoad = ko.observable(true);\n self.hasChartError = ko.observable(false);\n self.asOfPerfomanceDate = ko.observable();\n self.plugin = plugin;\n self.hasValidData = ko.computed(function () {\n return !self.hasError() && !self.isInvalidIdentifier() && self.etfs() !== null;\n }, this);\n\n self.canAddMoreSymbol = ko.pureComputed(function () {\n return self.symbols().filter(function (x) { return x.symbol !== plugin.options.defaultValueString }).length < self.maxSymbols;\n });\n\n self.numberOfSymbolsToCompare = ko.pureComputed(function () {\n return self.symbols().filter(function (x) { return x.symbol !== plugin.options.defaultValueString }).length;\n });\n\n // Observable to handle hidden/showing the collapsible sections\n self.hiddenOverview = ko.observable(false);\n self.hiddenOverviewCharacteristics = ko.observable(false);\n self.hiddenOverviewRisk = ko.observable(false);\n self.hiddenOverviewFixedIncome = ko.observable(false);\n self.hiddenPerformance = ko.observable(false);\n self.hiddenPerformancePeriodicReturns = ko.observable(false);\n self.hiddenPerformanceCalendarReturns = ko.observable(false);\n self.hiddenAllocations = ko.observable(false);\n self.hiddenAllocationsAssets = ko.observable(false);\n self.hiddenAllocationsGeographic = ko.observable(false);\n self.hiddenAllocationsSectors = ko.observable(false);\n self.hiddenAllocationsConstituents = ko.observable(false);\n\n // Observables related to the comparison chart\n self.displayComparisonChart = ko.observable(false);\n self.selectedComparisonChartPeriod = ko.observable('commonInception');\n self.selectedComparisonChartPeriodLength = ko.observable(null);\n self.setComparisonChartExtremes = function (period, periodLength) {\n self.selectedComparisonChartPeriod(period);\n self.selectedComparisonChartPeriodLength(periodLength);\n self.plugin._setChartExtremes(period, periodLength);\n }\n var comparisonChartTypes = ['returns', 'prices'];\n self.comparisonChartTypes = ko.observableArray(comparisonChartTypes);\n self.selectedComparisonChartType = ko.observable(comparisonChartTypes[0]);\n self.setSelectedComparisonChartType = function (type) {\n self.selectedComparisonChartType(type);\n self.plugin._renderComparisonChart(self.symbols());\n }\n\n /**\n * Sets the resources Observable to the corresponding one for the \n * current language of the page\n */\n self.updateResources = function () {\n // Update main resources\n var currentResource = inovestor.ms.comparator.resources[inovestor.ms.core.currentLanguage];\n if (inovestor.ms.core.isNullOrUndefined(currentResource))\n currentResource = null;\n self.resources(currentResource);\n };\n\n self.haveDifferentCategories = ko.pureComputed(function () {\n var assetClassNameRow = self.rows().find(function (x) { return x.rowName === 'assetClassName' });\n if (assetClassNameRow == null) return false;\n var distinctCategories = assetClassNameRow.columns.map(function (x) { return x.valueEn }).filter(function (x) { return x !== self.plugin.options.defaultValueString }).filter(function (x, i, array) { return array.indexOf(x) === i });\n return distinctCategories.length > 1;\n });\n\n /**\n * Computed observable to return an observable array for the rows\n * in the 'Overview' section of the plugin\n * \n * @returns {ObservableArray} - Collection of the Overview rows\n */\n self.overviewRows = ko.computed(function () {\n var rows = [],\n overviewRows = inovestor.ms.comparator.overviewRows,\n currentRows = self.rows();\n\n for (var i = 0; i < overviewRows.length; i++) {\n var currentOverview = overviewRows[i];\n\n for (var j = 0; j < currentRows.length; j++) {\n var currentRow = currentRows[j];\n\n if (currentRow.rowName === currentOverview) {\n rows.push(currentRow);\n break;\n }\n }\n }\n\n return rows;\n });\n\n /**\n * Computed observable to return an observable array for the rows\n * in the 'Overview Risk' section of the plugin\n * \n * @returns {ObservableArray} - Collection of the Overview Risk rows\n */\n self.riskRows = ko.computed(function () {\n var rows = [],\n riskRows = inovestor.ms.comparator.riskRows,\n currentRows = self.rows();\n\n for (var i = 0; i < riskRows.length; i++) {\n var currentField = riskRows[i];\n\n for (var j = 0; j < currentRows.length; j++) {\n var currentRow = currentRows[j];\n\n if (currentRow.rowName === currentField) {\n rows.push(currentRow);\n break;\n }\n }\n }\n\n return rows;\n });\n\n /**\n * Computed observable to return an observable array for the rows\n * in the 'Overview Fixed Income' section of the plugin\n * \n * @returns {ObservableArray} - Collection of the Overview Fixed Income rows\n */\n self.fixedIncomeRows = ko.computed(function () {\n var rows = [],\n fixedIncomeRows = inovestor.ms.comparator.fixedIncomeRows,\n currentRows = self.rows();\n\n for (var i = 0; i < fixedIncomeRows.length; i++) {\n var currentField = fixedIncomeRows[i];\n\n for (var j = 0; j < currentRows.length; j++) {\n var currentRow = currentRows[j];\n\n if (currentRow.rowName === currentField) {\n rows.push(currentRow);\n break;\n }\n }\n }\n\n return rows;\n });\n\n /**\n * Removes all the values from the rows observable array for the\n * fund at the index.\n * \n * @param {number} index - The index to remove\n */\n self.removeFromRowsByIndex = function (index) {\n if (!inovestor.ms.core.isNullOrUndefined(index)) {\n var rows = self.rows();\n\n for (var i = 0; i < rows.length; i++) {\n var currentRow = rows[i];\n\n if (currentRow.displayType !== 'localizedText') {\n currentRow.columns[index] = { value: self.plugin.options.defaultValueString };\n } else {\n currentRow.columns[index] = { valueEn: self.plugin.options.defaultValueString, valueFR: self.plugin.options.defaultValueString };\n }\n }\n\n self.rows([]);\n self.rows(rows);\n }\n };\n\n \n\n /**\n * Replaces a symbol (MIC:TICKER) in the symbol ObservableArray\n * \n * @param {object} symbolObj - Holds the properties for the selected symbol\n * @param {number} symbolToChange - The index of the symbol to be changed\n */\n self.addSymbol = function (symbolObj) {\n if (!inovestor.ms.core.isNullOrUndefined(symbolObj)\n && !inovestor.ms.core.isNullOrUndefined(symbolObj.symbol)) {\n\n // Check if the symbol that we are trying to add is already in the list\n if (self.symbols().some(function (x) { return symbolObj.symbol === x.symbol; })) return; // don't add the same symbol more than one time\n\n // Find the first index that is empty and that we are able to add the symbol into\n const symbolToChange = self.symbols().findIndex(function (x) { return x.symbol === self.plugin.options.defaultValueString; });\n if (symbolToChange === -1) return; // there is no empty slot\n\n // Depending on which input was used set the right symbol\n self.symbols.replace(self.symbols()[symbolToChange],\n { symbol: symbolObj.symbol, isValidTicker: false });\n\n var ticker = symbolObj.symbol.substring(symbolObj.symbol.indexOf(':') + 1);\n self.tickers()[symbolToChange] = ticker;\n // Force a refresh\n self.tickers(self.tickers());\n\n self.doSearch();\n }\n },\n\n /**\n * Remove a symbol from the symbols collection and replaces it with\n * an empty symbol before calling the plugin's search()\n * \n * @param {number} index - The index to remove\n */\n self.removeSymbol = function (index) {\n if (!inovestor.ms.core.isNullOrUndefined(index) &&\n index <= self.symbols().length - 1 &&\n !self.isBusy()) {\n\n var symbols = self.symbols();\n var tickers = self.tickers();\n var etfs = self.etfs();\n\n var numberOfWantedSymbols = symbols.length\n\n symbols.splice(index, 1);\n tickers.splice(index, 1);\n etfs.splice(index, 1);\n\n symbols = symbols.filter(function (x) { return x.isValidTicker })\n tickers = tickers.filter(function (x) { return x !== self.plugin.options.defaultValueString })\n etfs = etfs.filter(function (x) { return x.dummyData !== true })\n\n for (var i = symbols.length; i < numberOfWantedSymbols; i++) {\n symbols.push({ symbol: self.plugin.options.defaultValueString, isValidTicker: false });\n tickers.push(self.plugin.options.defaultValueString);\n etfs.push({ symbol: self.plugin.options.defaultValueString, dummyData: true });\n }\n\n // Force refresh\n self.symbols(symbols);\n self.tickers(tickers);\n self.etfs(etfs);\n self.removeFromRowsByIndex(index);\n\n var rows = self.plugin._createRows(self.etfs());\n self.rows(self.plugin._formatRows(rows));\n\n self.plugin._renderComparisonChart(plugin._viewModel.symbols());\n self.plugin._renderPieCharts();\n self.plugin._setUrlValues();\n }\n },\n\n /**\n * Calls the plugin's search() function passing into it a comma\n * separated list of all the symbols\n */\n self.doSearch = function () {\n var arr = [];\n\n for (var i = 0; i < self.symbols().length; i++) {\n if (self.symbols()[i].symbol !== self.plugin.options.defaultValueString)\n arr.push(self.symbols()[i].symbol);\n }\n self.plugin.search(arr.join(','));\n }\n\n self.urlValues = ko.observableArray();\n self.selfUrl = ko.observable();\n\n self.exportToCsv = function () {\n try {\n var csvArray = inovestor.ms.comparator.csvService.transformComparatorDataToCsvArray(self.etfs().filter(function (x) { return x.dummyData !== true }), self.resources());\n var csvString = inovestor.ms.comparator.csvService.transformCsvArrayToCsvString(csvArray, { escapeHeader: true });\n var blob = new Blob([csvString], { type: \"text/csv;charset=utf-8\" });\n saveAs(blob, inovestor.ms.core.currentLanguage === 'fr' ? 'Comparaison des fonds.csv' : 'Fund Comparison.csv');\n } catch (error) {\n console.error(error);\n $('#ino-ms-etf-comparator-csv-export-error-modal').modal('show');\n }\n };\n\n self.generatePdfUrl = function () {\n var symbols = self.etfs().filter(function (x) { return x.dummyData !== true }).map(function (x) { return x.symbol });\n var url = inovestor.ms.core.stringFormat(self.pdfReportUrl, { symbols: symbols.join(',') });\n return url;\n };\n\n self.getSymbolAtIndex = function (index) {\n var validEtfs = self.etfs().filter(function (x) { return x.dataType !== null });\n if (index < validEtfs.length) {\n var validEtf = validEtfs[index];\n return validEtf.dataType === 'fund' ? validEtf.symbol : validEtf.ticker ;\n }\n return null;\n }\n\n self.canLink = function (data) {\n if (data == null || inovestor.ms.core.isEmptyString(data.family) || inovestor.ms.core.isEmptyString(plugin.options.redirectUrl)) return false\n\n if (plugin.options.sponsoredFamilies == null || plugin.options.sponsoredFamilies.length === 0) return true\n\n return plugin.options.sponsoredFamilies.some(function (x) {\n return x.localeCompare(data.family, 'en', { sensitivity: 'base' }) === 0\n })\n }\n\n self.generateLink = function (data) {\n if (data == null || inovestor.ms.core.isEmptyString(plugin.options.redirectUrl)) return ''\n return inovestor.ms.core.stringFormat(plugin.options.redirectUrl, { symbol: data.symbol, category: data.dataType })\n }\n\n // we only want to use the library for english language\n // the default browser hyphenation is good enough for french\n var hyphenate = inovestor.ms.core.currentLanguage === 'en' ? createHyphenator(hyphenationPatternsEnUs) : function (text) { return text }\n self.hyphenate = function (text) {\n if (text == null) return text\n return hyphenate(text)\n }\n\n self.coalesce = function (value, defaultValue) {\n if (value == null) return defaultValue\n return value\n }\n }\n})(inovestor.ms.libRef.jQuery, inovestor.ms.libRef.ko, inovestor);\n\n; (function ($, ko, inovestor, undefined) {\n\n var pluginName = 'inoMsComparator';\n \n /**\n * Plugin constructor for the ETF Comparison page\n * \n * @constructor\n * @param {object} element - The DOM element the plugin is attached to\n * @param {object} options - The options for the plugin\n */\n function Plugin(element, options) {\n\n this.element = element;\n this._name = pluginName;\n this._defaults = $.fn.inoMsComparator.defaults;\n\n // Merge options with defaults\n this.options = $.extend(true, {}, this._defaults, options);\n\n this._viewModel = new inovestor.ms.comparator.viewModels.comparatorViewModel(this);\n\n // Make sure required variables are set\n if (inovestor.ms.core.isNullOrUndefined(this.options.symbols))\n throw \"at least 1 symbol required\";\n\n this.comparisonChartData = null;\n this.comparisonChartInstance = null;\n this.comparisonChartReturnsCache = new Map();\n this.comparisonChartPricesCache = new Map();\n\n // Call init\n this.init();\n }\n\n /**\n * Avoid Plugin.prototype conflicts\n */\n $.extend(Plugin.prototype, {\n\n /**\n * Initialization logic for the plugin\n */\n init: function () {\n var plugin = this;\n\n // Setup what plugin needs to do on language change\n inovestor.ms.core.instances.register(this, function () {\n plugin.update();\n });\n\n // Plugin overrides for template = cacheKey and path are the same\n var fileCacheKey = plugin.options.templatePaths.comparator;\n var filePath = plugin.options.templatePaths.comparator;\n // Default behavior (if no template path is set by plugin)\n if (inovestor.ms.core.isEmptyString(fileCacheKey)) {\n var fileName = 'comparator.html';\n fileCacheKey = pluginName + '.' + fileName;\n filePath = (inovestor.ms.core.isEmptyString(inovestor.ms.core.config.templateRootUrl) ? '' : inovestor.ms.core.config.templateRootUrl) +\n (inovestor.ms.core.isEmptyString(inovestor.ms.core.config.templateRootUrl) || inovestor.ms.core.config.templateRootUrl.match(/\\/$/) != null ? '' : '/') + // check if templateRootUrl ends in slash\n (this._name + '/' + fileName);\n }\n\n // Get main template file\n inovestor.ms.core.getTemplate(fileCacheKey, filePath).then(function (template) {\n $(plugin.element).html(template);\n plugin.buildCache();\n plugin.render();\n plugin.bindEvents();\n plugin.bindModel();\n }).then(function () {\n // Set up Shareable\n plugin.shareable = new inovestor.ms.core.Shareable();\n plugin._setInitialSymbols();\n\n // Set the symbols for the view model\n plugin._setTickers(plugin.options.maxSymbols);\n\n // Get the autocomplete widget if none loaded\n if (!$.ui) {\n if (inovestor.ms.core.isNullOrUndefined(plugin.options.inoCdnBaseUrl))\n throw \"inoCdnBaseUrl is required\";\n\n var jUIScriptUrl = inovestor.ms.core.concatUrl(plugin.options.inoCdnBaseUrl, 'dist/libs/jquery-ui/jquery-ui.min.js');\n var jUIStyleUrl = inovestor.ms.core.concatUrl(plugin.options.inoCdnBaseUrl, 'dist/libs/jquery-ui/jquery-ui.min.css');\n\n $('body').append('')\n $('body').append('')\n }\n else if (inovestor.ms.core.isNullOrUndefined($.ui.autocomplete))\n throw 'jQuery IU autocomplete module is required';\n\n var autocomplete = inovestor.ms.autocomplete;\n if (!autocomplete) {\n if (inovestor.ms.core.isNullOrUndefined(plugin.options.inoCdnBaseUrl))\n throw \"inoCdnBaseUrl is required\";\n\n var autocompleteScriptUrl = inovestor.ms.core.concatUrl(plugin.options.inoCdnBaseUrl, 'widgets/inoMsAutocomplete/inoMsAutocomplete-1.0.0.min.js');\n var autocompleteStyleUrl = inovestor.ms.core.concatUrl(plugin.options.inoCdnBaseUrl, 'widgets/inoMsAutocomplete/inoMsAutocomplete-1.0.0.min.css');\n $('body').append('');\n $('body').append('');\n }\n\n plugin._setUpAutocomplete(); // Allow to use AutoComplete even there is no symbols \n\n // Call Search\n plugin.search(plugin.options.symbols).always(function () {\n plugin._setUpAutocomplete();\n // When search is completed, trigger onReady event\n plugin.$element.trigger('ready' + '.' + plugin._name);\n });\n });\n },\n\n _setInitialSymbols: function () {\n var plugin = this;\n\n // first try to set the symbols from the URL\n var urlValues = plugin.shareable.getNavigationValues();\n if (!inovestor.ms.core.isNullOrUndefined(urlValues.symbols)) {\n var nonEmptyUrlSymbols = plugin._removeEmptySymbols(urlValues.symbols);\n if (nonEmptyUrlSymbols.length > 0) {\n plugin.options.symbols = nonEmptyUrlSymbols;\n plugin._removeDuplicateSymbols(plugin.options.symbols);\n return\n }\n }\n\n // if symbols are not in the URL, try to set them from the state cache\n var stateCacheValues = inovestor.ms.comparator.stateCache.get()\n if (stateCacheValues != null && stateCacheValues.symbols != null) {\n var nonEmptyStateCacheSymbols = plugin._removeEmptySymbols(stateCacheValues.symbols);\n plugin.options.symbols = nonEmptyStateCacheSymbols;\n plugin._removeDuplicateSymbols(plugin.options.symbols);\n return\n }\n },\n\n /**\n * Sets the ticker values in the view model for the inputs\n * \n * @param {number} maxSymbols - The maximum number of symbols to compare\n */\n _setTickers: function (maxSymbols) {\n var plugin = this;\n\n if (inovestor.ms.core.isNullOrUndefined(maxSymbols))\n maxSymbols = 5;\n if (!inovestor.ms.core.isNullOrUndefined(plugin.options.symbols)) {\n var tickers = plugin.options.symbols.split(',').map(function (symbol) {\n return symbol.substring(symbol.indexOf(':') + 1);\n })\n\n // Make sure we always have the right number of tickers\n while (tickers.length !== maxSymbols) {\n tickers.push(plugin.options.defaultValueString);\n }\n\n plugin._viewModel.tickers(tickers);\n }\n },\n\n /**\n * Removes the plugin instance completely\n */\n destroy: function () {\n this.unbindEvents();\n this.$element.removeData();\n },\n\n /**\n * Caches the DOM nodes for performance\n */\n buildCache: function () {\n this.$element = $(this.element);\n this.$etfChartInstance = null;\n },\n\n /**\n * Bind events for the plugin\n */\n bindEvents: function () {\n var plugin = this;\n plugin.$element.on('ready' + '.' + plugin._name, function () {\n var onReady = plugin.options.onReady;\n if (typeof onReady === 'function')\n onReady.call(plugin.$element);\n });\n\n plugin.$element.find('.ino-etf-compare__share-btn-group').on('show.bs.dropdown', function () {\n var input = plugin.$element.find('.ino-etf-compare__share-dropdown-menu input')\n input.val(location.href)\n setTimeout(function () {\n input.select()\n try {\n document.execCommand('copy')\n } catch (e) {\n console.error(e)\n }\n })\n })\n\n $(document).on('browser-navigation-hashchange', function () {\n \n // Reset invalid symbols\n plugin._viewModel.invalidSymbols().symbols([]);\n plugin._viewModel.showInvalidSymbolsAlert(false);\n\n\n // Get old symbols and new symbols\n var oldSymbols = plugin._getValidSymbolString();\n plugin._setInitialSymbols();\n\n if (oldSymbols.join(',').toLowerCase() === plugin.options.symbols)\n return;\n\n if (plugin.options.symbols) {\n var newSymbolsArr = plugin.options.symbols.split(',');\n while (newSymbolsArr.length < plugin.options.maxSymbols)\n newSymbolsArr.push(plugin.options.defaultValueString);\n\n // Don't let user put too many symbols in URL\n var extraSymbols = newSymbolsArr.splice(plugin.options.maxSymbols);\n\n extraSymbols.forEach(function (item) {\n plugin._viewModel.invalidSymbols().symbols().push({\n symbol: item,\n reason: 'tooManySymbols'\n });\n });\n\n if (extraSymbols.length > 0)\n plugin.options.symbols = newSymbolsArr.join(',');\n\n var areSameSymbols = plugin._areSymbolsTheSame(newSymbolsArr, oldSymbols);\n if (areSameSymbols) {\n\n var id = 0;\n // Find which symbol moved\n while ((oldSymbols[id] === newSymbolsArr[id] || oldSymbols[id] === newSymbolsArr[id + 1]) && id < oldSymbols.length) {\n id++;\n }\n\n if (id < oldSymbols.length) {\n var newIndex = id;\n var oldIndex = oldSymbols.indexOf(newSymbolsArr[newIndex]);\n plugin._swapValuesByIndices(oldIndex, newIndex);\n } else {\n plugin.shareable.setNavigation({ symbols: plugin.options.symbols.toUpperCase() });\n }\n\n if (plugin._viewModel.invalidSymbols().symbols().length > 0) {\n plugin._viewModel.invalidSymbols().displaySymbols(plugin._viewModel.invalidSymbols().symbols());\n plugin._viewModel.showInvalidSymbolsAlert(true);\n }\n } else {\n plugin._setTickers(plugin.options.maxSymbols);\n plugin.search(plugin.options.symbols);\n }\n }\n });\n },\n\n _getValidSymbolString: function () {\n var plugin = this;\n\n var oldSymbols = [];\n for (var i = 0; i < plugin._viewModel.symbols().length; i++) {\n var currentVal = plugin._viewModel.symbols()[i].symbol;\n\n if (currentVal !== plugin.options.defaultValueString)\n oldSymbols.push(currentVal.toLowerCase());\n }\n\n return oldSymbols;\n },\n\n _areSymbolsTheSame: function (newSymbolsArr, oldSymbols) {\n var sameSymbols = true;\n for (var i = 0; i < newSymbolsArr.length; i++) {\n var currentSymbol = newSymbolsArr[i];\n\n if (oldSymbols.indexOf(currentSymbol) === -1) {\n var sameSymbols = false;\n break;\n }\n }\n\n return sameSymbols;\n },\n\n /**\n * Unbind events for the plugin\n */\n unbindEvents: function () {\n this.$element.off('.' + this._name);\n },\n\n // API error handler\n apiErrorHandler: function (apiError) {\n var plugin = this;\n var onError = plugin.options.onError;\n if (typeof onError === 'function') {\n var result = onError.call(inovestor.ms.core.generateError(inovestor.ms.core.errors.apiError, apiError, plugin));\n // If callback returns false, do not execute default behavior\n if (!inovestor.ms.core.isNullOrUndefined(result) && result === false)\n return;\n }\n\n plugin._viewModel.hasError(true);\n },\n\n /**\n * Handles the invalid identifier response from the server\n */\n invalidIdentifierHandler: function () {\n var plugin = this;\n var onError = plugin.options.onError;\n if (typeof onError === 'function') {\n var result = onError.call(inovestor.ms.core.generateError(inovestor.ms.core.errors.invalidIdentifier, null, plugin));\n // If callback returns false, do not execute default behavior\n if (!inovestor.ms.core.isNullOrUndefined(result) && result === false)\n return;\n }\n\n plugin._viewModel.isInvalidIdentifier(true);\n },\n\n /**\n * Calls the API and searches for the provided symbols\n * \n * @param {string} symbols - A comma seperated list of symbols (MIC:TICKER)\n * @returns {Deferred} - The call to the server for the symbols\n */\n search: function (symbols) {\n var plugin = this;\n\n plugin._resetDataBeforeSearch();\n\n plugin.options.symbols = symbols;\n\n // Fill the table anyway when there's no symbols\n if (inovestor.ms.core.isEmptyString(plugin.options.symbols)) {\n plugin._viewModel.isFirstLoad(false); // Show Comparison Tool panel even if there is no symbol\n plugin._viewModel.etfs([]);\n plugin._viewModel.symbols([]);\n return plugin._setDefaultTable();\n }\n\n // Setup API url with term\n var etfUrl = inovestor.ms.core.stringFormat(inovestor.ms.comparator.config.apiRelativeUrl, { symbols: plugin.options.symbols });\n\n // Call API and bind model\n var options = { type: 'GET', contentType: 'application/json', error: function (error) { plugin.apiErrorHandler(error); } };\n return inovestor.ms.core.ajaxApi(etfUrl, options).then(function (data) {\n if (!inovestor.ms.core.isNullOrUndefined(data)) {\n\n var validData = plugin._removeInvalidSymbols(data);\n\n if (plugin._viewModel.invalidSymbols().symbols().length > 0) {\n plugin._viewModel.showInvalidSymbolsAlert(true);\n plugin._viewModel.invalidSymbols().displaySymbols(\n plugin._viewModel.invalidSymbols().symbols());\n }\n\n plugin._addFundsAndSymbolsToVM(validData);\n plugin._sortResults();\n plugin._fillTableData(plugin._viewModel.etfs(), plugin.options.maxSymbols);\n plugin._setUrlValues();\n var rows = plugin._createRows(plugin._viewModel.etfs());\n plugin._viewModel.rows(plugin._formatRows(rows));\n plugin._renderComparisonChart(plugin._viewModel.symbols());\n plugin._renderPieCharts();\n plugin._viewModel.isFirstLoad(false);\n }\n else {\n plugin._viewModel.etfs([]);\n }\n\n plugin._viewModel.invalidSymbols().symbols([]);\n plugin._setUpSortable();\n plugin._viewModel.isBusy(false);\n });\n },\n\n _addFundsAndSymbolsToVM: function (validData) {\n var plugin = this;\n\n plugin._viewModel.etfs([]);\n plugin._viewModel.symbols([]);\n for (var i = 0; i < validData.length; i++) {\n if (validData[i].dataType === 'fund' && validData[i].assetUnderManagement) {\n validData[i].assetUnderManagement = validData[i].assetUnderManagement * 1000000;\n }\n\n plugin._viewModel.etfs.push(validData[i]);\n plugin._viewModel.symbols.push({ symbol: validData[i].symbol, isValidTicker: true });\n }\n },\n\n _removeInvalidSymbols: function (data) {\n var plugin = this;\n\n var badIndices = [];\n data.forEach(function (item, index, array) {\n if (item.requestStatus === 'invalidIdentifier' || item.requestStatus === 'invalid') {\n plugin._viewModel.invalidSymbols().symbols.push({\n symbol: item.symbol,\n reason: 'invalidSymbol'\n });\n\n badIndices.push(index);\n }\n });\n\n badIndices.reverse().forEach(function (value) {\n data.splice(value, 1);\n });\n\n return data;\n },\n\n _resetDataBeforeSearch: function () {\n var plugin = this;\n plugin._viewModel.hasError(false);\n plugin._viewModel.isInvalidIdentifier(false);\n plugin._viewModel.isBusy(true);\n plugin._viewModel.showCategoryAlert(false);\n plugin._viewModel.isDummyData(false);\n plugin._viewModel.displayComparisonChart(false);\n plugin._viewModel.showInvalidSymbolsAlert(false);\n },\n\n _removeDuplicateSymbols: function (symbols) {\n var plugin = this;\n var duplicateSymbols = [];\n\n if (!inovestor.ms.core.isEmptyString(symbols)) {\n var symbolArr = symbols.toLowerCase().split(',');\n duplicateSymbols = symbolArr.filter(function (item, index, self) {\n return index !== self.lastIndexOf(item);\n });\n\n var uniqueSymbols = symbolArr.filter(function (item, index, self) {\n return self.indexOf(item) === index;\n });\n\n plugin.options.symbols = uniqueSymbols.join();\n }\n\n duplicateSymbols.forEach(function (item) {\n plugin._viewModel.invalidSymbols().symbols.push({\n symbol: item,\n reason: 'duplicateSymbol'\n });\n });\n },\n\n _removeEmptySymbols: function (symbols) {\n var plugin = this;\n var newSymbolStr = '';\n\n if (!inovestor.ms.core.isEmptyString(symbols)) {\n var symbolsArr = symbols.split(',').filter(function (item) {\n return !inovestor.ms.core.isEmptyString(item) && item !== plugin.options.defaultValueString;\n });\n\n newSymbolStr = symbolsArr.join();\n }\n\n return newSymbolStr;\n },\n\n /**\n * Sets up the default table when there's an error with the symbols or the data returned from\n * the server\n * \n * @returns {Deferred} - A done state on an empty deferred\n */\n _setDefaultTable: function () {\n var plugin = this;\n plugin._fillTableData(plugin._viewModel.etfs(), plugin.options.maxSymbols);\n var unformattedRows = plugin._createRows(plugin._viewModel.etfs());\n plugin._viewModel.rows(plugin._formatRows(unformattedRows));\n plugin.update();\n plugin._viewModel.isBusy(false);\n return $.Deferred().done();\n },\n\n _setUrlValues: function () {\n var plugin = this;\n var etfs = plugin._viewModel.etfs();\n var validSymbols = [];\n var symbolObj = {};\n\n for (var i = 0; i < etfs.length; i++) {\n etfs[i].symbol !== plugin.options.defaultValueString ? validSymbols.push(etfs[i].symbol) : null;\n }\n\n if (validSymbols.length > 0) {\n symbolObj.symbols = validSymbols.join();\n var currentUrlValues = plugin.shareable.getNavigationValues().symbols;\n\n if (!inovestor.ms.core.isNullOrUndefined(currentUrlValues)) {\n\n if (currentUrlValues.toLowerCase() !== symbolObj.symbols.toLowerCase())\n plugin.shareable.setNavigation(symbolObj);\n\n } else {\n plugin.shareable.setNavigation(symbolObj);\n }\n\n inovestor.ms.comparator.stateCache.set({ symbols: validSymbols.join(',') })\n } else {\n plugin.shareable.setNavigation({});\n inovestor.ms.comparator.stateCache.set({ symbols: '' });\n }\n },\n\n _swapValuesByIndices: function (oldIndex, newIndex) {\n var plugin = this;\n var tickers = plugin._viewModel.tickers();\n var symbols = plugin._viewModel.symbols();\n var etfs = plugin._viewModel.etfs();\n var rows = plugin._viewModel.rows();\n\n // Ticker, Symbols and ETFs all include dummy data for empty slots (always five items for 5 symbols configured comparison)\n // Rows columns don't include those dummy data (four columns if there is an empty slot for a symbol for a 5 symbols configured comparison)\n var adjustedOldIndexForRows = Math.min(oldIndex - tickers.filter(function (x, i) { return x === plugin.options.defaultValueString && i < oldIndex; }).length, rows[0].columns.length - 1);\n\n var moved = tickers[oldIndex];\n tickers.splice(oldIndex, 1);\n tickers.splice(newIndex, 0, moved);\n\n moved = symbols[oldIndex];\n symbols.splice(oldIndex, 1);\n symbols.splice(newIndex, 0, moved);\n\n moved = etfs[oldIndex];\n etfs.splice(oldIndex, 1);\n etfs.splice(newIndex, 0, moved);\n\n plugin._viewModel.tickers([]);\n plugin._viewModel.tickers(tickers);\n\n plugin._viewModel.symbols([]);\n plugin._viewModel.symbols(symbols);\n\n plugin._viewModel.etfs([]);\n plugin._viewModel.etfs(etfs);\n\n var adjustedNewIndexForRows = Math.min(newIndex - tickers.filter(function (x, i) { return x === plugin.options.defaultValueString && i < newIndex; }).length, rows[0].columns.length - 1);\n\n for (var i = 0; i < rows.length; i++) {\n var currentColumns = rows[i].columns;\n\n moved = currentColumns[adjustedOldIndexForRows];\n currentColumns.splice(adjustedOldIndexForRows, 1);\n currentColumns.splice(adjustedNewIndexForRows, 0, moved);\n\n rows[i].columns = currentColumns;\n }\n plugin._viewModel.rows([]);\n plugin._viewModel.rows(rows);\n\n plugin._renderComparisonChart(symbols);\n plugin._renderPieCharts();\n plugin._setUrlValues();\n },\n\n _setUpSortable: function () {\n var plugin = this;\n\n $(\"#ino-etf-ticker-container\").sortable({\n handle: \".sortable-handle\",\n scroll: true,\n placeholder: \"ino-etf-ticker\",\n helper: function (event, ui) {\n var clone = ui.clone();\n clone.css({\n height: ui.height(),\n width: ui.width(),\n });\n return clone;\n },\n update: function (event, ui) {\n var oldIndex = ui.item.data('oldIndex');\n var newIndex = ui.item.index();\n\n if (oldIndex === newIndex) return;\n\n \n plugin._swapValuesByIndices(oldIndex, newIndex);\n plugin._viewModel.showInvalidSymbolsAlert(false);\n },\n start: function (event, ui) {\n //ui.placeholder -> Représente l'element qui reste en arriere lors du drag and drop\n //ui.helper -> Represente l'element que la souris garde lors du drag and drop \n //ui.item -> Represente original qui doit bouger \n\n ui.item.data('oldIndex', ui.item.index()); // Manage the index while changing\n ui.placeholder.html(ui.item.html()) // Faire que le placeholder ne sois pas different de l'element d'origine \n },\n change: function (event, ui) {\n ui.placeholder.html(ui.item.html()); // Mise à jour de la placeholder pour qu'elle soit identique à l'élément\n },\n stop: function (event, ui) {\n ui.item.css('visibility', 'visible'); // Rendre l'élément visible à nouveau\n },\n })\n\n //This method converts mouse events into touch help when using mobile \n // Because jquery-ui does not works good with in mobile \n function touchHandler(event) {\n var touch = event.changedTouches[0];\n\n var simulatedEvent = document.createEvent(\"MouseEvent\");\n simulatedEvent.initMouseEvent({\n touchstart: \"mousedown\",\n touchmove: \"mousemove\",\n touchend: \"mouseup\"\n }[event.type], true, true, window, 1,\n touch.screenX, touch.screenY,\n touch.clientX, touch.clientY, false,\n false, false, false, 0, null);\n\n touch.target.dispatchEvent(simulatedEvent);\n }\n\n document.addEventListener(\"touchstart\", touchHandler, true)\n document.addEventListener(\"touchmove\", touchHandler, true);\n document.addEventListener(\"touchend\", touchHandler, true);\n document.addEventListener(\"touchcancel\", touchHandler, true);\n },\n\n /**\n * Sorts the results returned by the server to make sure that the ordering\n * of the ETFs returned by the server matches the input boxes.\n */\n _sortResults: function () {\n var plugin = this;\n var etfs = plugin._viewModel.etfs();\n var symbols = plugin._viewModel.symbols();\n var tickers = plugin._viewModel.tickers();\n\n if (!inovestor.ms.core.isNullOrUndefined(tickers) && !inovestor.ms.core.isNullOrUndefined(etfs)\n && !inovestor.ms.core.isNullOrUndefined(symbols)) {\n\n var sortedEtfs = [];\n var sortedSymbols = [];\n\n // Sort symbols and etfs based on the order of the tickers\n for (var i = 0; i < tickers.length; i++) {\n var ticker = tickers[i];\n\n if (ticker === plugin.options.defaultValueString) {\n sortedEtfs.push({ symbol: plugin.options.defaultValueString, dummyData: true });\n sortedSymbols.push({ symbol: plugin.options.defaultValueString, isValidTicker: false });\n } else {\n for (var j = 0; j < etfs.length; j++) {\n // Also compare on symbol for funds\n if ((etfs[j].ticker && etfs[j].ticker.toLowerCase() === ticker.toLowerCase()) ||\n (etfs[j].symbol && etfs[j].symbol.toLowerCase() === ticker.toLowerCase())) {\n \n sortedEtfs.push(etfs[j]);\n sortedSymbols.push(symbols[j]);\n break;\n }\n }\n }\n }\n\n plugin._viewModel.etfs(sortedEtfs);\n plugin._viewModel.symbols(sortedSymbols);\n }\n },\n\n /**\n * Fills all the empty ETF slots until the maximum number of ETFs\n * \n * @param {array} etfs - Collection of all the etfs\n * @param {number} maxNumberOfEtfs - The maximum number of ETFs we want to compare\n */\n _fillTableData: function (etfs, maxNumberOfEtfs) {\n var plugin = this;\n var dummyCtr = 0;\n\n // Make sure we have the right number of ETFs (Should always have 2)\n while (etfs.length < maxNumberOfEtfs) {\n plugin._viewModel.etfs.push({ symbol: plugin.options.defaultValueString, dummyData: true });\n // Also make sure we have enough symbols\n plugin._viewModel.symbols.push({ symbol: plugin.options.defaultValueString, isValidTicker: false });\n dummyCtr++;\n }\n\n if (dummyCtr === maxNumberOfEtfs) {\n plugin._viewModel.isDummyData(true);\n }\n },\n\n /**\n * Creates the rows that are to be iterated over to display the comparison table\n * \n * @param {array} etfs - Collection of all the etfs\n * @returns {array} rows - Collection of the rows\n */\n _createRows: function (etfs) {\n var plugin = this;\n var rowNames = inovestor.ms.comparator.rowNames;\n var rows = [];\n\n for (var i = 0; i < rowNames.length; i++) {\n var rowDefinition = rowNames[i];\n\n // Create the row object based on the definition\n var rowObj = {\n rowName: rowDefinition.key,\n displayType: rowDefinition.displayType,\n resourceKey: rowDefinition.resourceKey,\n columns: []\n };\n\n // Add the value for the feature for all the ETFs\n for (var j = 0; j < etfs.length; j++) {\n var etf = etfs[j];\n\n if (etf.symbol !== plugin.options.defaultValueString) {\n var key = rowDefinition.key;\n\n if (key === 'previousClose' && etf.dataType === 'fund')\n key = 'previousNavps';\n\n var columnValue = etf[key];\n if (!inovestor.ms.core.isNullOrUndefined(columnValue)) {\n rowObj.columns.push({ value: columnValue, decimalPlaces: rowDefinition.decimalPlaces, valueAsPercent: rowDefinition.valueAsPercent, showAsLargeNumber: rowDefinition.showAsLargeNumber });\n // Check for English and French named values\n } else if (rowDefinition.displayType === 'localizedText') {\n\n rowObj.columns.push({\n valueEn: etf[key + 'En'] || plugin.options.defaultValueString,\n valueFr: etf[key + 'Fr'] || plugin.options.defaultValueString,\n });\n } else if (rowDefinition.displayType === 'localizedModalText') {\n rowObj.columns.push({\n value: inovestor.ms.core.currentLanguage === 'fr' ? etf[key + 'Fr'] || plugin.options.defaultValueString : etf[key + 'En'] || plugin.options.defaultValueString,\n linkTextResourceKey: rowDefinition.linkTextResourceKey\n });\n } else {\n rowObj.columns.push({ value: plugin.options.defaultValueString });\n }\n }\n }\n\n rows.push(rowObj);\n }\n\n return rows;\n },\n\n /**\n * Adds the CSS classes for the rows and formats the text to something we can display\n * on the page. \n * \n * @param {array} rows - Collection of all the rows for the page\n * @returns {array} - The formatted rows\n */\n _formatRows: function (rows) {\n var plugin = this;\n\n // Loop through to change the text\n if (rows.length > 0 && rows[0].columns.length > 0) {\n for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n var currentRow = rows[rowIndex];\n\n // Check for different categories and display the alert\n if (currentRow.rowName === 'assetClassName') {\n var compareCol = currentRow.columns[0].valueEn;\n for (var i = 1; i < currentRow.columns.length; i++) {\n var comparer = currentRow.columns[i].valueEn;\n if (comparer !== plugin.options.defaultValueString)\n if (comparer !== compareCol)\n plugin._viewModel.showCategoryAlert(true);\n }\n }\n }\n }\n\n return rows;\n },\n\n // Renders html template and binds model (should be called once)\n render: function () {\n var plugin = this;\n plugin._viewModel.updateResources();\n },\n\n _setChartExtremes: function (type, count) {\n if (inovestor.ms.core.isNullOrUndefined(type))\n return;\n\n var plugin = this,\n apiFirstDate = null,\n apiLastDate = null,\n minDate = null,\n maxDate = null;\n\n if (!inovestor.ms.core.isNullOrUndefined(plugin.comparisonChartData) && plugin.comparisonChartData.length > 0) {\n // In all historicalDatas, find the max and min date and set them to apiFirstDate and apiLastDate\n plugin.comparisonChartData.forEach(function (chartData) {\n if (!inovestor.ms.core.isNullOrUndefined(chartData.historicalDatas) && chartData.historicalDatas.length > 0) {\n var firstDate = new Date(chartData.historicalDatas[0].date);\n var lastDate = new Date(chartData.historicalDatas[chartData.historicalDatas.length - 1].date);\n\n if (inovestor.ms.core.isNullOrUndefined(apiFirstDate) || firstDate < apiFirstDate)\n apiFirstDate = firstDate;\n\n if (inovestor.ms.core.isNullOrUndefined(apiLastDate) || lastDate > apiLastDate)\n apiLastDate = lastDate;\n\n plugin._viewModel.asOfPerfomanceDate(apiLastDate)\n }\n });\n }\n\n // Make sure a date was found before setting the extremes\n if (inovestor.ms.core.isNullOrUndefined(apiFirstDate) || inovestor.ms.core.isNullOrUndefined(apiLastDate))\n return;\n\n switch (type) {\n case 'ytd':\n maxDate = Date.UTC(apiLastDate.getUTCFullYear(), apiLastDate.getUTCMonth(), apiLastDate.getUTCDate(), apiLastDate.getUTCHours(), apiLastDate.getUTCMinutes(), apiLastDate.getUTCSeconds());\n minDate = Date.UTC(apiLastDate.getUTCFullYear(), 0, 1, 0, 0, 0);\n break;\n case 'all':\n minDate = Date.UTC(apiFirstDate.getUTCFullYear(), apiFirstDate.getUTCMonth(), apiFirstDate.getUTCDate(), apiFirstDate.getUTCHours(), apiFirstDate.getUTCMinutes(), apiFirstDate.getUTCSeconds());\n maxDate = Date.UTC(apiLastDate.getUTCFullYear(), apiLastDate.getUTCMonth(), apiLastDate.getUTCDate(), apiLastDate.getUTCHours(), apiLastDate.getUTCMinutes(), apiLastDate.getUTCSeconds());\n break;\n case 'year':\n maxDate = Date.UTC(apiLastDate.getUTCFullYear(), apiLastDate.getUTCMonth(), apiLastDate.getUTCDate(), apiLastDate.getUTCHours(), apiLastDate.getUTCMinutes(), apiLastDate.getUTCSeconds());\n\n var minDateCompute = new Date(maxDate);\n minDateCompute.setFullYear(minDateCompute.getFullYear() - count);\n\n if (minDateCompute < apiFirstDate) {\n minDateCompute = apiFirstDate;\n }\n\n minDate = Date.UTC(minDateCompute.getUTCFullYear(), minDateCompute.getUTCMonth(), minDateCompute.getUTCDate(), minDateCompute.getUTCHours(), minDateCompute.getUTCMinutes(), minDateCompute.getUTCSeconds());\n break;\n case 'commonInception':\n // In all historicalDatas, find the min start date and set is as the mostRecentDate\n var mostRecentDate;\n\n plugin.comparisonChartData.forEach(function (chartData) {\n if (!inovestor.ms.core.isNullOrUndefined(chartData.historicalDatas) && chartData.historicalDatas.length > 0) {\n var firstDate = new Date(chartData.historicalDatas[0].date);\n\n if (inovestor.ms.core.isNullOrUndefined(mostRecentDate) || firstDate > mostRecentDate)\n mostRecentDate = firstDate;\n }\n });\n\n minDate = Date.UTC(mostRecentDate.getUTCFullYear(), mostRecentDate.getUTCMonth(), mostRecentDate.getUTCDate(), mostRecentDate.getUTCHours(), mostRecentDate.getUTCMinutes(), mostRecentDate.getUTCSeconds());\n maxDate = Date.UTC(apiLastDate.getUTCFullYear(), apiLastDate.getUTCMonth(), apiLastDate.getUTCDate(), apiLastDate.getUTCHours(), apiLastDate.getUTCMinutes(), apiLastDate.getUTCSeconds());\n\n break;\n default:\n throw 'Provided type is not supported. Type: ' + type;\n }\n\n plugin.comparisonChartInstance.xAxis[0].setExtremes(\n minDate,\n maxDate,\n true,//renderChart,\n false\n );\n },\n\n /**\n * Renders the comparison chart for the symbols\n */\n _renderComparisonChart: function (symbols) {\n if (symbols == null || symbols.length == 0)\n return;\n\n var plugin = this;\n var etfsData = plugin._viewModel.etfs();\n plugin._viewModel.displayComparisonChart(true);\n\n var chartIsReturnsChart = plugin._viewModel.selectedComparisonChartType() === 'returns';\n var chartSymbols = symbols.filter(function (x) { return !inovestor.ms.core.isNullOrUndefined(x.symbol) && x.isValidTicker; });\n\n // If the chart is in returns mode, we only display symbols that have returns (which means more than a year of data)\n if (chartIsReturnsChart) {\n chartSymbols = chartSymbols.filter(function (x) {\n // Map the symbol on the etfsData to the symbol in the symbols array and get the hasReturns property to determine if we should display it\n var data = etfsData.filter(function (y) { return y.symbol === x.symbol; })[0];\n if (!inovestor.ms.core.isNullOrUndefined(data))\n return data.hasReturns;\n else\n return false;\n });\n }\n\n var chartIsInCompareMode = chartIsReturnsChart || chartSymbols.length > 1;\n\n var defaultChartOptions = {\n chart: {\n type: 'line',\n zoomType: 'x',\n events: {\n selection: function (event) {\n if (!event.xAxis) {\n setTimeout(function () {\n plugin._setChartExtremes(plugin._viewModel.selectedComparisonChartPeriod(), plugin._viewModel.selectedComparisonChartPeriodLength());\n }, 1);\n }\n }\n }\n },\n plotOptions: {\n line: {\n marker: {\n enabled: false\n }\n },\n series: {\n marker: {\n enabled: false\n }\n }\n },\n xAxis: {\n type: 'datetime'\n },\n plotOptions: {\n series: {\n compare: chartIsInCompareMode ? 'percent' : null,\n compareStart: true,\n dataGrouping: {\n dateTimeLabelFormats: {\n week: inovestor.ms.core.currentLanguage === 'fr' ? ['Semaine du %A %e %b %Y', '%A, %e %b', '-%A, %e %b %Y'] : ['Week from %A, %e %b %Y', '%A, %e %b', '-%A, %e %b %Y']\n }\n }\n }\n },\n rangeSelector: {\n enabled: false\n },\n navigator: {\n enabled: false\n },\n scrollbar: {\n enabled: false\n },\n legend: {\n enabled: true\n }\n };\n\n return plugin._fetchNewComparisonChartData(chartSymbols, chartIsReturnsChart).then(function (chartDatas) {\n plugin.comparisonChartData = chartDatas;\n if (!inovestor.ms.core.isNullOrUndefined(chartDatas)) {\n plugin._viewModel.hasChartError(false);\n //plugin._viewModel.displayComparisonChart(true);\n\n var chartSeries = [];\n chartDatas.forEach(function (chartData) {\n var symbolParts = chartData.symbol.split(':');\n var ticker = symbolParts.length > 0\n ? symbolParts[symbolParts.length - 1]\n : chartData.symbol;\n\n var compoundedValue = 10000;\n var currentSeries = {\n name: ticker,\n data: (chartData.historicalDatas && Array.isArray(chartData.historicalDatas))\n ? chartData.historicalDatas.reduce(function (agg, x) {\n var value = chartIsReturnsChart\n ? compoundedValue * (1 + x.value)\n : x.value;\n agg.push([new Date(x.date).getTime(), value]);\n compoundedValue = value;\n return agg;\n }, []) : [],\n };\n\n chartSeries.push(currentSeries);\n });\n\n var chartElement = plugin.$element.find('.comparison-chart');\n var chartOptions = $.extend({}, defaultChartOptions, {\n series: chartSeries,\n yAxis: {\n opposite: true,\n labels: {\n formatter: function () {\n if (chartIsInCompareMode) {\n return (this.value > 0 ? ' + ' : '') + this.value + '%';\n } else {\n return Highcharts.numberFormat(this.value, 2);\n }\n }\n }\n },\n tooltip: {\n pointFormat: chartIsInCompareMode ? '
{series.name}: {point.y} ({point.change}%)
' : '
{series.name}: {point.y}
',\n changeDecimals: 2,\n valueDecimals: 2,\n dateTimeLabelFormats: {\n hour: '%A, %e %b %Y',\n week: inovestor.ms.core.currentLanguage === 'fr' ? 'Semaine du %A %e %b %Y' : 'Week from %A, %e %b %Y'\n }\n }\n });\n chartElement.highcharts('StockChart', chartOptions);\n plugin.comparisonChartInstance = chartElement.highcharts();\n\n // Reset the extremes in case a zoom level was set\n plugin._setChartExtremes(plugin._viewModel.selectedComparisonChartPeriod(), plugin._viewModel.selectedComparisonChartPeriodLength());\n }\n else {\n }\n });\n },\n\n _fetchNewComparisonChartData: function (symbols, chartIsReturnsChart) {\n var plugin = this;\n\n var validSymbols = symbols\n .filter(function (x) { return !inovestor.ms.core.isNullOrUndefined(x.symbol) && x.isValidTicker; })\n .map(function (x) { return !inovestor.ms.core.isNullOrUndefined(x.symbol) ? x.symbol.toUpperCase() : ''; })\n var symbolsNotInCache = validSymbols;\n\n var dataCache = chartIsReturnsChart\n ? plugin.comparisonChartReturnsCache\n : plugin.comparisonChartPricesCache;\n\n // Check if we already have a series for the requested symbols.\n // If we do, we won't call the API again for nothing.\n if (dataCache.size > 0) {\n var symbolsInCache = Array.from(dataCache.keys());\n symbolsNotInCache = validSymbols.filter(function (x) { return symbolsInCache.indexOf(x) === -1; });\n\n if (symbolsNotInCache.length === 0) {\n // Nothing to call, just return the same comparisonChartData but make sure to order it the same way as the symbols\n var cachedData = Array.from(dataCache.values());\n var orderedSymbols = validSymbols.map(function (symbol) {\n return cachedData.filter(function (x) { return x.symbol.toUpperCase() === symbol; })[0];\n });\n\n return $.Deferred().resolve(orderedSymbols);\n }\n }\n\n // Now, call the API for the symbols that are not in cache\n var chartDataUrl = chartIsReturnsChart\n ? inovestor.ms.core.stringFormat(inovestor.ms.comparator.config.apiMonthlyReturnsRelativeUrl, { symbols: symbolsNotInCache.join(',') })\n : inovestor.ms.core.stringFormat(inovestor.ms.comparator.config.apiDailyPricesRelativeUrl, { symbols: symbolsNotInCache.join(',') });\n var options = { type: 'GET', contentType: 'application/json', error: function (error) { plugin.apiErrorHandler(error); } };\n\n var chartDatas = [];\n\n return inovestor.ms.core.ajaxApi(chartDataUrl, options)\n .then(function (aipChartDatas) {\n for (var i = 0; i < validSymbols.length; i++) {\n var symbol = validSymbols[i];\n var chartData = dataCache.get(symbol);\n\n if (inovestor.ms.core.isNullOrUndefined(chartData)) {\n var aipChartData = aipChartDatas.filter(function (x) { return x.symbol.toUpperCase() === symbol; })[0];\n chartDatas.push(aipChartData);\n dataCache.set(symbol, aipChartData);\n } else {\n chartDatas.push(chartData);\n }\n }\n\n return chartDatas;\n });\n },\n\n /**\n * Calls the functions to render all the pie chart sections\n */\n _renderPieCharts: function () {\n var plugin = this;\n plugin._renderAssetPieCharts();\n plugin._renderSectorPieCharts();\n plugin._renderGeographicPieCharts();\n },\n\n /**\n * Renders the pie charts in the Asset Allocation section\n */\n _renderAssetPieCharts: function () {\n var plugin = this;\n\n var notDummyEtfs = plugin._viewModel.etfs().filter(function (x) { return x.assetAllocations != null; });\n\n for (var i = 0; i < notDummyEtfs.length; i++) {\n var currentEtf = notDummyEtfs[i];\n var chartData = [];\n\n for (var j = 0; j < currentEtf.assetAllocations.length; j++) {\n var currentAlloc = currentEtf.assetAllocations[j];\n chartData.push({\n y: currentAlloc.percent >= 0 ? currentAlloc.percent : currentAlloc.percent * -1, // handling of negative data sets\n formattedY: Highcharts.numberFormat(currentAlloc.percent, 2) + ' %',\n name: inovestor.ms.core.currentLanguage == 'fr' ? currentAlloc.nameFr : currentAlloc.nameEn\n });\n }\n\n var chartConfig = plugin.options.pieChartConfig;\n chartConfig.series = [{\n colorByPoint: true,\n data: chartData\n }];\n $('.asset-chart-' + i).highcharts(chartConfig);\n }\n },\n\n /**\n * Renders the pie charts in the Sector Allocation section\n */\n _renderSectorPieCharts: function () {\n var plugin = this;\n\n var notDummyEtfs = plugin._viewModel.etfs().filter(function (x) { return x.sectorAllocations != null; });\n\n for (var i = 0; i < notDummyEtfs.length; i++) {\n var currentEtf = notDummyEtfs[i];\n var chartData = [];\n\n for (var j = 0; j < currentEtf.sectorAllocations.length; j++) {\n var currentAlloc = currentEtf.sectorAllocations[j];\n chartData.push({\n y: currentAlloc.percent >= 0 ? currentAlloc.percent : currentAlloc.percent * -1, // handling of negative data sets\n formattedY: Highcharts.numberFormat(currentAlloc.percent, 2) + ' %',\n name: inovestor.ms.core.currentLanguage == 'fr' ? currentAlloc.descriptionFr : currentAlloc.descriptionEn\n });\n }\n\n var chartConfig = plugin.options.pieChartConfig;\n chartConfig.series = [{\n colorByPoint: true,\n data: chartData\n }];\n $('.sector-chart-' + i).highcharts(chartConfig);\n }\n },\n\n /**\n * Renders the pie charts in the Geographic Allocation section\n */\n _renderGeographicPieCharts: function () {\n var plugin = this;\n\n var notDummyEtfs = plugin._viewModel.etfs().filter(function (x) { return x.geographicAllocations != null; });\n\n for (var i = 0; i < notDummyEtfs.length; i++) {\n var currentEtf = notDummyEtfs[i];\n var chartData = [];\n\n for (var j = 0; j < currentEtf.geographicAllocations.length; j++) {\n var currentAlloc = currentEtf.geographicAllocations[j];\n chartData.push({\n y: currentAlloc.percent >= 0 ? currentAlloc.percent : currentAlloc.percent * -1, // handling of negative data sets\n formattedY: Highcharts.numberFormat(currentAlloc.percent, 2) + ' %',\n name: inovestor.ms.core.currentLanguage == 'fr' ? currentAlloc.countryNameFr : currentAlloc.countryNameEn\n });\n }\n\n var chartConfig = plugin.options.pieChartConfig;\n chartConfig.series = [{\n colorByPoint: true,\n data: chartData\n }];\n $('.geographic-chart-' + i).highcharts(chartConfig);\n }\n },\n\n /**\n * Set up the jQuery Autocomplete for the ticker input boxes\n */\n _setUpAutocomplete: function (counter) {\n var plugin = this;\n if (inovestor.ms.core.isNullOrUndefined(counter)) {\n counter = 0;\n }\n \n if (counter < 10) {\n // Let widget js have time to download and load before using it\n setTimeout(function () {\n // Configure the search base url\n if (inovestor.ms.core.isNullOrUndefined(inovestor.ms.autocomplete)) {\n plugin._setUpAutocomplete(++counter);\n } else {\n var config = inovestor.ms.autocomplete.config;\n if (inovestor.ms.core.isNullOrUndefined(config.apiSearchBaseUrl))\n config.apiSearchBaseUrl = inovestor.ms.core.concatUrl(inovestor.ms.core.config.apiBaseUrl, \"/search/suggest\");\n\n var globalCoreConfig = inovestor.ms.core.getComponentConfigurations ? inovestor.ms.core.getComponentConfigurations('inoMsAutocomplete', 'inoMsComparator') : {};\n\n var $input = $('#etf-comparison-autocomplete');\n\n // Autocomplete config\n $input.inoMsAutocomplete(\n $.extend({\n language: inovestor.ms.core.currentLanguage,\n shouldRenderMoreResults: false,\n shouldSelectOnNonMatch: false,\n shouldAutoSelect: true,\n onSelect: function (item) {\n plugin._viewModel.addSymbol(this);\n $input.val('');\n },\n filters: {\n category: 'etf,fund',\n exchange: 'tsx,cboeca,fund'\n }\n }, globalCoreConfig)\n ).on('click', function (e) {\n e.stopPropagation();\n });\n\n $input.on(\"autocompleteopen\", function (event, ui) {\n $('.ino-ms-autocomplete-menu').css(\"width\", $input.outerWidth() + \"px\");\n });\n\n // Select all the text in an input when it gets focused\n $('.ino-etf-tickerbox-input').click(function () {\n $(this).select();\n });\n }\n }, 200);\n }\n },\n\n // Update resources\n update: function () {\n var plugin = this;\n // Update view model resources\n plugin._viewModel.updateResources();\n plugin._viewModel.etfs.valueHasMutated();\n\n // Force Knockout to refresh our observable arrays\n var rows = plugin._viewModel.rows();\n plugin._viewModel.rows([]);\n plugin._viewModel.rows(rows);\n },\n\n // Chart error handler\n chartErrorHandler: function (error) {\n var plugin = this;\n var onError = plugin.options.onError;\n if (typeof onError === 'function') {\n // If callback returns false, do not execute default behavior\n if (!inovestor.ms.core.isNullOrUndefined(result) && result === false)\n return;\n }\n\n plugin._viewModel.hasChartError(true);\n },\n\n // Applies knockout bindings to element. (Should be done only once)\n bindModel: function () {\n var plugin = this;\n ko.applyBindings(plugin._viewModel, plugin.element);\n },\n });\n\n // JQuery Plugin wrapper\n $.fn.inoMsComparator = function (options) {\n this.each(function () {\n if (!$.data(this, pluginName)) {\n // Store instance of plugin in \"$.data\"\n $.data(this, pluginName, new Plugin(this, options));\n }\n });\n\n // return plugin to support JQuery chaining\n return this;\n };\n $.fn.inoMsComparator.defaults = {\n symbols: null,\n onError: null,\n onReady: null,\n templatePaths: {\n comparator: null\n },\n defaultValueString: '-',\n maxSymbols: 5,\n redirectUrl: null,\n sponsoredFamilies: [],\n pdfReportUrl: null,\n pdfHandler: null,\n pieChartConfig: {\n chart: {\n type: 'pie'\n },\n colors: [\"#5089a8\", \"#10b292\", \"#ef8348\", \"#f0b922\", \"#de5b49\", \"#000\"],\n plotOptions: {\n pie: {\n allowPointSelect: true,\n cursor: 'pointer',\n dataLabels: {\n enabled: false\n },\n showInLegend: true\n }\n },\n legend: {\n enabled: false\n }\n }\n };\n\n})(inovestor.ms.libRef.jQuery, inovestor.ms.libRef.ko, inovestor);\n; (function ($, inovestor, undefined) {\n inovestor.ms.comparator = inovestor.ms.comparator || {};\n\n inovestor.ms.comparator.rowNames = [\n { key: 'asOf', resourceKey: 'asOf', displayType: 'date' }, \n { key: 'currency', resourceKey: 'currency', displayType: 'text' }, \n { key: 'previousClose', fundKey: 'previousNavps', resourceKey: 'previousClose', displayType: 'currency' }, \n { key: 'assetUnderManagement', resourceKey: 'assetUnderManagement', displayType: 'currency' }, \n { key: 'assetClassName', resourceKey: 'assetClassName', displayType: 'localizedText' }, \n { key: 'managementFee', resourceKey: 'managementFee', displayType: 'percentage', valueAsPercent: true },\n { key: 'managementExpenseRatio', resourceKey: 'managementExpenseRatio', displayType: 'percentage', valueAsPercent: true }, \n { key: 'distributionFrequencyCode', resourceKey: 'distributionFrequencyCode', displayType: 'resourceText' }, \n { key: 'riskRating', resourceKey: 'riskRating', displayType: 'resourceText' }, \n { key: 'inceptionDate', resourceKey: 'inceptionDate', displayType: 'date' }, \n { key: 'marketPrice', resourceKey: 'marketPrice', displayType: 'currency' },\n { key: 'distributionYieldTtm', resourceKey: 'distributionYieldTtm', displayType: 'percentage', valueAsPercent: true },\n { key: 'equityFundStyle', resourceKey: 'equityFundStyle', displayType: 'resourceText' },\n { key: 'fundgrade', resourceKey: 'fundgrade', displayType: 'text' },\n { key: 'numberOfHoldings', resourceKey: 'numberOfHoldings', displayType: 'number', decimalPlaces: 0, showAsLargeNumber: false },\n { key: 'objective', resourceKey: 'objective', displayType: 'localizedModalText', linkTextResourceKey: 'viewObjective' },\n { key: 'averageMaturity', resourceKey: 'averageMaturity', displayType: 'number', decimalPlaces: 2 },\n { key: 'yieldToMaturity', resourceKey: 'yieldToMaturity', displayType: 'percentage', valueAsPercent: true },\n { key: 'averageCreditQuality', resourceKey: 'averageCreditQuality', displayType: 'resourceText' },\n { key: 'standardDeviationY3', resourceKey: 'standardDeviationY3', displayType: 'percentage' },\n { key: 'standardDeviationY5', resourceKey: 'standardDeviationY5', displayType: 'percentage' },\n { key: 'sharpeRatioY3', resourceKey: 'sharpeRatioY3', displayType: 'number', decimalPlaces: 2 },\n { key: 'sharpeRatioY5', resourceKey: 'sharpeRatioY5', displayType: 'number', decimalPlaces: 2 }\n ]\n\n inovestor.ms.comparator.overviewRows = [\n 'asOf',\n 'marketPrice',\n 'previousClose',\n 'currency',\n 'assetUnderManagement',\n 'distributionYieldTtm',\n 'distributionFrequencyCode',\n 'managementFee',\n 'managementExpenseRatio',\n 'riskRating',\n 'equityFundStyle',\n 'fundgrade',\n 'numberOfHoldings',\n 'inceptionDate',\n 'assetClassName',\n 'objective'\n ]\n\n inovestor.ms.comparator.riskRows = [\n 'standardDeviationY3',\n 'standardDeviationY5',\n 'sharpeRatioY3',\n 'sharpeRatioY5'\n ]\n\n inovestor.ms.comparator.fixedIncomeRows = [\n 'averageCreditQuality',\n 'yieldToMaturity',\n 'averageMaturity'\n ]\n})(inovestor.ms.libRef.jQuery, inovestor);\nko.bindingHandlers.accessibleClick = {\n update: function (element) {\n element.addEventListener('keydown', function (event) {\n if (event.keyCode === 13 || event.keyCode === 32) {\n event.preventDefault()\n element.click()\n }\n })\n }\n}\n; (function ($, inovestor, undefined) {\n inovestor.ms.comparator.resources = inovestor.ms.comparator.resources || {};\n inovestor.ms.comparator.resources[\"en\"] = {\n pluginTitle: 'ETF Comparison',\n rowNames: {\n name: 'Name',\n symbol: 'Symbol',\n assetUnderManagement: 'AUM',\n assetClassName: 'Asset Class',\n currency: 'Base Currency',\n distributionFrequencyCode: 'Distribution Frequency',\n asOf: 'As Of',\n inceptionDate: 'Inception',\n managementExpenseRatio: 'MER',\n managementFee: 'Management Fee',\n previousClose: 'Previous Close / NAV', \n riskRating: 'Risk Rating',\n marketPrice: 'Market Price',\n distributionYieldTtm: 'TTM Distribution Yield',\n equityFundStyle: 'Equity Fund Style',\n fundgrade: 'Fund Grade',\n numberOfHoldings: 'Number of Holdings',\n objective: 'Objective',\n averageMaturity: 'Average Maturity (In Years)',\n yieldToMaturity: 'YTM',\n averageCreditQuality: 'Credit Quality',\n standardDeviationY3: 'Standard Deviation 3Y',\n standardDeviationY5: 'Standard Deviation 5Y',\n sharpeRatioY3: 'Sharpe Ratio 3Y',\n sharpeRatioY5: 'Sharpe Ratio 5Y'\n },\n rowTooltips: {\n distributionYieldTtm: \"TTM Distribution Yield refers to trailing twelve months distribution divided by the previous day close.\"\n },\n sectionLabels: {\n overview: 'Overview',\n description: 'Description',\n performance: 'Performance',\n assetAllocation: \"Asset Allocation\",\n geographicAllocation: \"Geographic Allocation\",\n sectorAllocation: \"Sector Allocation\",\n periodicReturns: \"Periodic Returns\",\n calendarReturns: \"Calendar Returns\",\n allocations: \"Allocations\",\n constituentsAllocation: \"Constituents\",\n characteristics: \"Characteristics\",\n risk: \"Risk\",\n fixedIncome: \"Fixed Income\",\n objectives: \"Objectives\",\n asOfPerfomance: \"As of\"\n },\n periodicReturnsLabels: {\n oneMonth: '1M',\n threeMonth: '3M',\n sixMonth: '6M',\n oneYear: '1Y',\n threeYear: '3Y*',\n fiveYear: '5Y*',\n tenYear: '10Y*',\n sinceInception: 'Inception*',\n yearToDate: 'YTD'\n },\n periodicReturnsCsvLabels: {\n oneMonth: '1M',\n threeMonth: '3M',\n sixMonth: '6M',\n oneYear: '1Y',\n threeYear: '3Y',\n fiveYear: '5Y',\n tenYear: '10Y',\n sinceInception: 'Inception',\n yearToDate: 'YTD'\n },\n calendarReturnsLabels: '{year} Return (Quartile)',\n calendarReturnsCsvLabels: '{year} Return',\n calendarReturnsQuartileCsvLabels: '{year} Quartile',\n allocationCsvLabels: {\n assetClass: 'Asset Class',\n constituent: 'Constituent',\n sector: 'Sector',\n geographic: 'Geographic'\n },\n columnData: {\n boolean: {\n 'true': 'Yes',\n 'false': 'No'\n },\n distributionFrequencyCode: {\n none: 'None',\n monthly: 'Monthly',\n quarterly: 'Quarterly',\n semiannual: 'Semi Annual',\n daily: 'Daily',\n specific: 'Specific',\n annually: 'Annually',\n weekly: 'Weekly'\n },\n riskRating: {\n none: 'None',\n low: 'Low',\n lowtomedium: 'Low to Medium',\n medium: 'Medium',\n mediumtohigh: 'Medium to High',\n high: 'High'\n }, \n averageCreditQuality: { \n low: 'Low',\n medium: 'Medium',\n high: 'High'\n },\n equityFundStyle: { \n 'large value': 'Large Value', \n 'large blend': 'Large Blend', \n 'mid blend': 'Mid Blend', \n 'mid growth': 'Mid Growth', \n 'mid value': 'Mid Value',\n 'small blend': 'Small Blend',\n 'small growth': 'Small Growth',\n 'small value': 'Small Value'\n }\n },\n close: 'Close',\n enterETF: 'Enter ETFs:',\n errors: {\n symbolError: 'The following symbols are not valid:',\n duplicateSymbol: 'Value must be unique',\n invalidSymbol: 'Value is not a valid symbol',\n tooManySymbols: 'Number of values cannot exceed {maxSymbols}'\n },\n compare: 'Compare',\n addFunds: 'Add Funds',\n yes: 'Yes',\n dataNotAvailable: 'Data is not available',\n no: 'No',\n searchPlaceholder: 'Search: ETFs, mutual funds...',\n differentCategoryWarning: 'Comparing funds from different categories may not provide complete or accurate results',\n sameETFWarning: 'Please select unique values to compare',\n validETF: 'Please select a valid ETF',\n fund: 'Fund',\n returnIsAnnualizedWarning: '*Return is annualized, chart data is cumulative.',\n dataNotAvailableForETFWithLessThanAFullYear: 'No data is shown for ETF with less than a full year.',\n viewObjective: 'View Objective',\n view: 'View',\n comparisonTool: 'Comparison Tool',\n downloadComparison: 'Download',\n shareComparison: 'Share',\n url: 'URL:',\n urlCopied: 'URL Copied',\n comparisonChart: {\n periodTitle: 'Periods',\n periods: {\n ytd: 'YTD',\n oneYear: '1Y',\n threeYear: '3Y',\n fiveYear: '5Y',\n tenYear: '10Y',\n all: 'All',\n commonInception: 'Common Inception'\n },\n chartTypes: {\n returns: 'Total Return',\n prices: 'Price Return'\n }\n },\n constituentsWarning: \"The portfolio holdings are subject to change without notice and may only represent a small percentage of portfolio holdings. They are not recommendations to buy or sell any particular security.\",\n removeSymbol: 'Remove symbol',\n addSymbol: 'Add symbol',\n hideShowSection: 'Hide or show the section',\n asOfToolTipText: 'Indicates the last update for the market price.'\n };\n})(jQuery, inovestor);\n; (function ($, inovestor, undefined) {\n inovestor.ms.comparator.resources = inovestor.ms.comparator.resources || {};\n inovestor.ms.comparator.resources[\"fr\"] = {\n pluginTitle: 'ETF Comparison',\n rowNames: {\n name: 'Nom',\n symbol: 'Symbole',\n assetUnderManagement: 'Actifs sous gestion',\n assetClassName: 'Classe d\\'actifs',\n currency: 'Devise de base',\n distributionFrequencyCode: 'Fréquence de distribution',\n asOf: 'En date du',\n inceptionDate: 'Création',\n managementExpenseRatio: 'RFG',\n managementFee: 'Frais de gestion',\n previousClose: 'Clôture / NAV',\n riskRating: 'Évaluation des risques',\n marketPrice: 'Prix de clôture',\n distributionYieldTtm: 'Rendement des distributions sur 12 mois',\n equityFundStyle: \"Style de gestion d'action\",\n fundgrade: 'FundGrade',\n numberOfHoldings: 'Nombre de titres',\n objective: 'Objectif',\n averageMaturity: 'Maturité moyenne (en années)',\n yieldToMaturity: \"Rendement à l'échéance\", \n averageCreditQuality: 'Qualité de crédit',\n standardDeviationY3: 'Écart-type 3A',\n standardDeviationY5: 'Écart-type 5A',\n sharpeRatioY3: 'Ratio de Sharpe 3A',\n sharpeRatioY5: 'Ratio de Sharpe 5A' \n },\n rowTooltips: {\n distributionYieldTtm: \"Rendement des distributions sur 12 mois (TTM) fait référence à la distribution des douze derniers mois, divisée par la clôture de la veille.\"\n },\n sectionLabels: {\n overview: 'Vue d\\'ensemble',\n description: 'Description',\n performance: 'Rendement',\n assetAllocation: \"Répartition d'actifs\",\n geographicAllocation: \"Répartition géographique\",\n sectorAllocation: \"Répartition sectorielle\",\n periodicReturns: \"Rendements périodiques\",\n calendarReturns: \"Rendements par année civile\",\n allocations: \"Répartition\", \n constituentsAllocation: \"Composantes\",\n characteristics: \"Caractéristiques\",\n risk: \"Risque\",\n fixedIncome: \"Revenu fixe\",\n objectives: \"Objectifs\",\n asOfPerfomance: 'En date du'\n },\n periodicReturnsLabels: {\n oneMonth: '1M',\n threeMonth: '3M',\n sixMonth: '6M',\n oneYear: '1A',\n threeYear: '3A*',\n fiveYear: '5A*',\n tenYear: '10A*',\n sinceInception: 'Création*',\n yearToDate: 'AACJ'\n },\n periodicReturnsCsvLabels: {\n oneMonth: '1M',\n threeMonth: '3M',\n sixMonth: '6M',\n oneYear: '1A',\n threeYear: '3A',\n fiveYear: '5A',\n tenYear: '10A',\n sinceInception: 'Création',\n yearToDate: 'AACJ'\n },\n calendarReturnsLabels: '{year} Rendement (Quartile)', \n calendarReturnsCsvLabels: '{year} Rendement',\n calendarReturnsQuartileCsvLabels: '{year} Quartile',\n allocationCsvLabels: {\n assetClass: \"Classe d'actif\",\n constituent: 'Componsante',\n sector: 'Secteur',\n geographic: 'Géographique'\n },\n columnData: {\n boolean: {\n 'true': 'Oui',\n 'false': 'Non'\n },\n distributionFrequencyCode: {\n none: 'Aucune',\n monthly: 'Mensuelle',\n quarterly: 'Trimestrielle',\n semiannual: 'Semi-annuelle',\n daily: 'Du quotidien',\n specific: 'Spécifique',\n annually: 'Annuellement',\n weekly: 'Hebdomadaire'\n },\n riskRating: {\n none: 'Aucun',\n low: 'Bas',\n lowtomedium: 'Bas à moyen',\n medium: 'Moyen',\n mediumtohigh: 'Moyen à élevé',\n high: 'Haute'\n },\n averageCreditQuality: { \n low: 'Bas',\n medium: 'Moyen',\n high: 'Haute'\n },\n equityFundStyle: { \n 'large growth': 'Grande Cap. Croissance', \n 'large value': 'Grande Cap. Valeur', \n 'large blend': 'Grande Cap. Combinée', \n 'mid blend': 'Moyenne Cap. Combinée', \n 'mid growth': 'Moyenne Cap. Croissance', \n 'mid value': 'Moyenne Cap. Valeur',\n 'small blend': 'Petite Cap. Combinée',\n 'small growth': 'Petite Cap. Croissance',\n 'small value': 'Petite Cap. Valeur'\n }\n },\n close: 'Fermer',\n enterETF: 'Entrez un FNB:',\n errors: {\n symbolError: 'Les symboles suivants ne sont pas valides:',\n duplicateSymbol: 'La valeur doit être unique',\n invalidSymbol: 'La valeur n\\'est pas un symbole valide',\n tooManySymbols: 'Le nombre de valeurs ne peut pas dépasser {maxSymbols}'\n },\n compare: 'Comparer',\n addFunds: 'Ajouter des fonds',\n yes: 'Oui',\n dataNotAvailable: 'Les données ne sont pas disponibles',\n no: 'Non',\n searchPlaceholder: 'Recherche: FNB, fonds communs...',\n differentCategoryWarning: 'Comparer les fonds de différentes catégories peut ne pas fournir des résultats complets ou précis',\n sameETFWarning: 'Veuillez sélectionner des valeurs uniques pour comparer',\n validETF: 'Veuillez sélectionner un FNB valide',\n fund: 'Fond',\n returnIsAnnualizedWarning: '*Le rendement est annualisé, les données du graphique sont cumulatives.', \n dataNotAvailableForETFWithLessThanAFullYear: \"Aucune donnée n'est affichée pour les FNB ayant moins d'une année complète.\",\n viewObjective: 'Objectif',\n view: 'Voir',\n comparisonTool: 'Outil de comparaison',\n downloadComparison: 'Télécharger',\n shareComparison: 'Partager',\n url: 'URL : ',\n urlCopied: 'URL copiée',\n comparisonChart: {\n periodTitle: 'Périodes',\n periods: {\n ytd: 'Année',\n oneYear: '1A',\n threeYear: '3A',\n fiveYear: '5A',\n tenYear: '10A',\n all: 'Max',\n commonInception: 'Incep. commune'\n },\n chartTypes: {\n returns: 'Rendement total',\n prices: 'Rendement sur le prix'\n }\n },\n constituentsWarning: \"Les titres du portefeuille peuvent changer sans préavis et ne représentent qu'un faible pourcentage des titres en portefeuille. Ces renseignements ne constituent pas une recommandation d'achat ou de vente d'un titre particulier.\",\n removeSymbol: 'Supprimer le symbole',\n addSymbol: 'Ajouter un symbole',\n hideShowSection: 'Afficher ou cacher la section',\n asOfToolTipText: 'Indique la dernière mise à jour du prix du marché.'\n };\n})(jQuery, inovestor);\n; (function ($, inovestor, undefined) {\n inovestor.ms.comparator = inovestor.ms.comparator || {};\n\n inovestor.ms.comparator.csvArrayBuilder = function () {\n var columns = []\n\n this.addColumn = function (header, getter) {\n columns.push({ header: header, getter: getter })\n return this\n }\n\n this.addColumnsFactory = function (fn) {\n columns.push(fn)\n return this\n }\n\n this.build = function (data) {\n var interpretedColumns = columns.reduce(function (agg, column) {\n if (typeof column === 'function') {\n var createdColumns = column(data)\n if (createdColumns != null) {\n createdColumns.forEach(function (x) {\n agg.push(x)\n })\n }\n } else {\n agg.push(column)\n }\n return agg\n }, [])\n\n var rows = []\n\n rows.push(interpretedColumns.map(function (column) {\n return column.header\n }))\n\n data.forEach(function (x) {\n rows.push(interpretedColumns.map(function (column) {\n return column.getter(x)\n }))\n })\n\n return rows\n }\n }\n})(inovestor.ms.libRef.jQuery, inovestor);\n; (function ($, inovestor, undefined) {\n inovestor.ms.comparator = inovestor.ms.comparator || {};\n\n inovestor.ms.comparator.csvService = {\n transformCsvArrayToCsvString: function (csvArray, options) {\n var csvString = csvArray.map(function (x, i) {\n // don't escape header row\n if (options != null && options.escapeHeader === false && i === 0) return x.join(',')\n\n return x.map(function (y) {\n if (y == null) return ''\n if (typeof y === 'string' && y !== '') return '\"' + y.replace(/\"/g, '\"\"') + '\"'\n return y\n }).join(',')\n }).join('\\r\\n')\n\n return csvString\n },\n\n transformComparatorDataToCsvArray: function (data, resources) {\n return new inovestor.ms.comparator.csvArrayBuilder()\n // hardcoded identifier columns\n .addColumn(resources.rowNames.name, function (x) { return localizeText(x.nameEn, x.nameFr) })\n .addColumn(resources.rowNames.symbol, function (x) { return x.symbol })\n // overview characteristics columns\n .addColumnsFactory(function () {\n return inovestor.ms.comparator.overviewRows.map(function (x) { return makeOverviewRowToCsvColumn(x, resources) })\n })\n // overview risk columns\n .addColumnsFactory(function () {\n return inovestor.ms.comparator.riskRows.map(function (x) { return makeOverviewRowToCsvColumn(x, resources) })\n })\n // overview fixed income columns\n .addColumnsFactory(function () {\n return inovestor.ms.comparator.fixedIncomeRows.map(function (x) { return makeOverviewRowToCsvColumn(x, resources) })\n })\n // periodic returns columns\n .addColumn(resources.periodicReturnsCsvLabels.yearToDate, function (x) { return x.periodicReturns == null ? null : x.periodicReturns.yearToDate })\n .addColumn(resources.periodicReturnsCsvLabels.oneMonth, function (x) { return x.periodicReturns == null ? null : x.periodicReturns.oneMonth })\n .addColumn(resources.periodicReturnsCsvLabels.threeMonth, function (x) { return x.periodicReturns == null ? null : x.periodicReturns.threeMonth })\n .addColumn(resources.periodicReturnsCsvLabels.sixMonth, function (x) { return x.periodicReturns == null ? null : x.periodicReturns.sixMonth })\n .addColumn(resources.periodicReturnsCsvLabels.oneYear, function (x) { return x.periodicReturns == null ? null : x.periodicReturns.oneYear })\n .addColumn(resources.periodicReturnsCsvLabels.threeYear, function (x) { return x.periodicReturns == null ? null : x.periodicReturns.threeYear })\n .addColumn(resources.periodicReturnsCsvLabels.fiveYear, function (x) { return x.periodicReturns == null ? null : x.periodicReturns.fiveYear })\n .addColumn(resources.periodicReturnsCsvLabels.tenYear, function (x) { return x.periodicReturns == null ? null : x.periodicReturns.tenYear })\n .addColumn(resources.periodicReturnsCsvLabels.sinceInception, function (x) { return x.periodicReturns == null ? null : x.periodicReturns.sinceInception })\n // calendar returns columns\n .addColumnsFactory(function () {\n var distinctYears = data.reduce(function (agg, x) {\n if (x.calendarReturns != null) {\n x.calendarReturns.forEach(function (y) {\n if (!agg.includes(y.year)) {\n agg.push(y.year)\n }\n })\n }\n return agg\n }, [])\n\n return distinctYears.reduce(function (agg, year) {\n agg.push({ header: inovestor.ms.core.stringFormat(resources.calendarReturnsCsvLabels, { year: year }), getter: function (x) { \n if (x.calendarReturns == null) return null\n var calendarReturn = x.calendarReturns.find(function (y) { return y.year === year })\n return calendarReturn == null ? null : calendarReturn.return\n }})\n\n agg.push({ header: inovestor.ms.core.stringFormat(resources.calendarReturnsQuartileCsvLabels, { year: year }), getter: function (x) {\n if (x.calendarReturns == null) return null\n var calendarReturn = x.calendarReturns.find(function (y) { return y.year === year })\n return calendarReturn == null ? null : calendarReturn.quartileRank\n }})\n\n return agg\n }, [])\n })\n // asset allocation columns\n .addColumnsFactory(function () {\n var highestNumberOfAssetAllocation = data.reduce(function (agg, x) {\n if (x.assetAllocations == null) return agg\n return Math.max(agg, x.assetAllocations.length)\n }, 0)\n\n if (highestNumberOfAssetAllocation === 0) return []\n\n var columns = []\n\n for (var i = 0; i < highestNumberOfAssetAllocation; i++) {\n columns.push({ \n header: resources.allocationCsvLabels.assetClass + ' ' + (i + 1), \n getter: (function (index) {\n return function (x) {\n return x.assetAllocations == null || x.assetAllocations[index] == null ? null : localizeText(x.assetAllocations[index].nameEn, x.assetAllocations[index].nameFr) \n }\n })(i)\n })\n\n columns.push({\n header: resources.allocationCsvLabels.assetClass + ' ' + (i + 1) + ' (%)', \n getter: (function (index) {\n return function (x) {\n return x.assetAllocations == null || x.assetAllocations[index] == null ? null : x.assetAllocations[index].percent\n }\n })(i)\n })\n }\n\n return columns\n })\n // geographic allocation columns\n .addColumnsFactory(function () {\n var highestNumberOfGeographicAllocation = data.reduce(function (agg, x) {\n if (x.geographicAllocations == null) return agg\n return Math.max(agg, x.geographicAllocations.length)\n }, 0)\n\n if (highestNumberOfGeographicAllocation === 0) return []\n\n var columns = []\n\n for (var i = 0; i < highestNumberOfGeographicAllocation; i++) {\n columns.push({\n header: resources.allocationCsvLabels.geographic + ' ' + (i + 1), \n getter: (function (index) {\n return function (x) {\n return x.geographicAllocations == null || x.geographicAllocations[index] == null ? null : localizeText(x.geographicAllocations[index].countryNameEn, x.geographicAllocations[index].countryNameFr)\n }\n })(i)\n })\n\n columns.push({\n header: resources.allocationCsvLabels.geographic + ' ' + (i + 1) + ' (%)', \n getter: (function (index) {\n return function (x) {\n return x.geographicAllocations == null || x.geographicAllocations[index] == null ? null : x.geographicAllocations[index].percent\n }\n })(i)\n })\n }\n\n return columns\n })\n // sector allocation columns\n .addColumnsFactory(function () {\n var highestNumberOfSectorAllocation = data.reduce(function (agg, x) {\n if (x.sectorAllocations == null) return agg\n return Math.max(agg, x.sectorAllocations.length)\n }, 0)\n\n if (highestNumberOfSectorAllocation === 0) return []\n\n var columns = []\n\n for (var i = 0; i < highestNumberOfSectorAllocation; i++) {\n columns.push({\n header: resources.allocationCsvLabels.sector + ' ' + (i + 1), \n getter: (function (index) {\n return function (x) {\n return x.sectorAllocations == null || x.sectorAllocations[index] == null ? null : localizeText(x.sectorAllocations[index].descriptionEn, x.sectorAllocations[index].descriptionFr)\n }\n })(i)\n })\n\n columns.push({\n header: resources.allocationCsvLabels.sector + ' ' + (i + 1) + ' (%)', \n getter: (function (index) {\n return function (x) {\n return x.sectorAllocations == null || x.sectorAllocations[index] == null ? null : x.sectorAllocations[index].percent\n }\n })(i)\n })\n }\n\n return columns\n })\n // constituents columns\n .addColumnsFactory(function () {\n var highestNumberOfConstituentsAllocation = data.reduce(function (agg, x) {\n if (x.holdings == null) return agg\n return Math.max(agg, x.holdings.length)\n }, 0)\n\n if (highestNumberOfConstituentsAllocation === 0) return []\n\n var columns = []\n\n for (var i = 0; i < highestNumberOfConstituentsAllocation; i++) {\n columns.push({\n header: resources.allocationCsvLabels.constituent + ' ' + (i + 1), \n getter: (function (index) {\n return function (x) {\n return x.holdings == null || x.holdings[index] == null ? null : localizeText(x.holdings[index].nameEn, x.holdings[index].nameFr)\n }\n })(i)\n })\n\n columns.push({\n header: resources.allocationCsvLabels.constituent + ' ' + (i + 1) + ' (%)', \n getter: (function (index) {\n return function (x) {\n return x.holdings == null || x.holdings[index] == null ? null : x.holdings[index].weight\n }\n })(i)\n })\n }\n\n return columns\n })\n .build(data)\n }\n }\n\n function makeOverviewRowToCsvColumn (field, resources) {\n var rowName = inovestor.ms.comparator.rowNames.find(function (x) { return x.key === field })\n\n if (rowName == null) {\n return { header: field, getter: function () { return null } }\n }\n\n var header = rowName.resourceKey == null || resources.rowNames == null || resources.rowNames[rowName.resourceKey] == null ? field : resources.rowNames[rowName.resourceKey]\n\n var getter = function (x) {\n return x[field] == null ? null : x[field]\n }\n\n if (rowName.displayType === 'localizedText' || rowName.displayType === 'localizedModalText') {\n getter = function (x) {\n var localizedField = inovestor.ms.core.currentLanguage === 'fr' ? field + 'Fr' : field + 'En'\n return x[localizedField] == null ? null : x[localizedField]\n }\n } else if (rowName.displayType === 'resourceText') {\n getter = function (x) {\n var value = x[field]\n if (value == null) return null\n var localizedValue = resources.columnData[rowName.resourceKey][value.toLowerCase()]\n return localizedValue == null ? value : localizedValue\n }\n }\n\n return { header: header, getter: getter }\n }\n\n function localizeText (english, french) {\n return inovestor.ms.core.currentLanguage === 'fr' ? french : english\n }\n\n})(inovestor.ms.libRef.jQuery, inovestor);","window[\"inoMsTemplatesCache\"] = window[\"inoMsTemplatesCache\"] || {};\nwindow[\"inoMsTemplatesCache\"][\"inoMsComparator.comparator.html\"] = \"

0, visible: !isFirstLoad()\\\">

0 && !isFirstLoad(), accessibleClick, click: function () { hiddenPerformance(!hiddenPerformance()) }\\\">

0, visible: !isFirstLoad() && !hiddenPerformance()\\\">

0, \\n\" +\n \" 'ms-etf-comparator-return-box--negative': $parent.periodicReturns[$data] != null && $parent.periodicReturns[$data] < 0 \\n\" +\n \" }\\\">
0, visible: !isFirstLoad() && !hiddenPerformance()\\\">

0\\\">
0, \\n\" +\n \" 'ms-etf-comparator-return-box--negative': $data.return != null && $data.return < 0 \\n\" +\n \" }\\\">
()

0 && !isFirstLoad(), accessibleClick, click: function () { hiddenAllocations(!hiddenAllocations()) }\\\">

0 && !isFirstLoad() && !hiddenAllocations()\\\">

0\\\">
0 && !isFirstLoad() && !hiddenAllocations()\\\">

0\\\">
0 && !isFirstLoad() && !hiddenAllocations()\\\">

0\\\">
x.percent > 0)\\\">
0 && !isFirstLoad() && !hiddenAllocations()\\\">

0\\\">
\"; "]}