{"version":3,"sources":["ej.chart.js"],"names":["window","ej","Syncfusion","$","undefined","version","consts","NamespaceJoin","TextAlign","Center","Justify","Left","Right","Orientation","Horizontal","Vertical","serverTimezoneOffset","parseDateInUTC","persistStateVersion","locales","Object","prototype","hasOwnProperty","obj","prop","Date","toISOString","pad","number","r","String","length","this","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","toFixed","slice","format","source","arguments","i","replace","RegExp","jQuery","uaMatch","ua","toLowerCase","match","exec","indexOf","browser","defineClass","className","constructor","proto","parts","split","isNullOrUndefined","util","getNameSpace","splits","join","getObject","nameSpace","from","JSON","stringify","value","createObject","initIn","start","t","exportAll","action","controlIds","inputAttr","widget","locale","index","controlEle","controlInstance","controlObject","modelClone","attr","method","data-ajax","form","buildTag","data","push","id","_id","model","_getExportModel","name","type","input","append","submit","setTimeout","ctrlInstance","ctrlObject","j","remove","print","element","printWin","$div","elementClone","clone","open","document","write","links","find","add","browserInfo","a","each","tagName","href","outerHTML","innerHTML","writeln","close","focus","ieClearRemover","searchBoxHeight","height","style","paddingTop","parseFloat","paddingBottom","lineHeight","sendAjaxRequest","ajaxOptions","ajax","cache","url","dataType","contentType","async","success","successHandler","error","errorHandler","beforeSend","beforeSendHandler","complete","completeHandler","tag","innerHtml","styles","attrs","createElement","addClass","css","html","_preventDefaultException","el","exceptions","test","getMaxZindex","maxZ","Math","max","apply","map","e","n","parseInt","blockDefaultActions","cancelBubble","returnValue","preventDefault","stopPropagation","getDimension","$hidden","parents","andSelf","filter","visibility","display","tmp","temp","transitionEndEvent","transitionEnd","","webkit","Moz","O","ms","userAgent","animationEndEvent","animationEnd","startEvent","isTouchDevice","support","hasPointer","endEvent","moveEvent","isMobile","cancelEvent","tapEvent","tapHoldEvent","isDevice","getBooleanVal","_device","isPortrait","elem","documentElement","clientWidth","clientHeight","isLowerResolution","innerWidth","isWindows","isIOSWebView","navigator","isAndroidWebView","isWindowsWebView","location","isTablet","msPointerEnabled","getClearString","string","trim","ele","val","option","_getSkewClass","item","pageX","pageY","itemwidth","width","itemheight","leftOffset","offset","left","rightOffset","topOffset","top","bottomOffset","widthoffset","heightoffset","_removeSkewClass","removeClass","_getObjectKeys","keys","toString","call","_touchStartPoints","evt","object","point","touches","_distX","_distY","_moved","_pointX","_pointY","_isTouchMoved","deltaX","deltaY","timestamp","now","newX","newY","absDistX","absDistY","abs","listenEvents","selectors","eventTypes","handlers","pluginObj","disableMouse","listenTouchEvent","selector","eventType","handler","event","jqueryEvent","elements","_bindEvent","mouseEvent","pointerEvent","ie11pointerEvent","pointerEnabled","_browser","appVersion","agents","l","substr","addPrefix","charAt","toUpperCase","destroyWidgets","dataEl","$element","plugin","getAttrVal","getOffset","pos","offsetObj","extend","bodyPos","getZindexPartial","popupEle","bodyEle","children","splice","isValidAttr","attribute","_isValid","key","widgetBase","droppables","default","resizables","_renderEjTemplate","ngTemplateType","startsWith","template","render","destroy","_trigger","enablePersistence","persistState","off","_persistHandler","_destroy","arr","pluginName","removeData","_events","pop","args","isPlainObject","fn","sfType","_on","proxy","on","_off","eventName","handlerObject","arg","inArray","eventProp","clientProp","isFunction","scopeFn","cancel","isPropDefined","Boolean","originalEventType","Event","trigger","isOnWebForms","serverEvents","raiseWebFormsServerEvents","setModel","options","forceSet","changes","iterateAndRemoveProps","isEmptyObject","dataTypes","_isValidModelValue","notifyOnEachPropertyChanges","oldValue","newValue","_setFirst","ds","dataSource","Array","_setModel","_setState","extensions","modelGUID","types","innerProp","_returnFn","propName","_removeCircularRef","seen","detect","parent","k","removeCircular","observables","deleteState","_removeProp","_ignoreOnPersist","copyObject","ignoreOnPersist","_addToPersist","addToPersist","_persistState","customPersists","localStorage","getItem","setItem","cookie","get","set","removeItem","restoreState","silent","parse","_restoreState","properties","collection","formatting","formatstring","str","preferredCulture","s","frontHtmlidx","FrontHtml","RearHtml","lastidxval","isNumeric","Number","toformat","formatVal","fVal","strSplt","formats","f","concat","Value","dataIndex","dataValue","WidgetBase","target","_rootCSS","instance","pInstance","property","register","jquery","defaults","keyConfigs","_init","requiresEvt","keyProps","_keyPressed","keySettings","getElement","keyFn","getActionFromCode","which","ctrlKey","shiftKey","altKey","code","ctrl","alt","shift","opt","$this","isAlreadyExists","hasClass","_requiresID","getUid","setCulture","throwError","registerInstance","loadLocale","len","_widgets","_registeredInstances","registerWidget","registeredWidgets","registeredInstances","destroyAll","eq","wds","expiryDate","escape","toUTCString","keyCode","isCtrl","isShift","isAlt","getKeyObject","res","tempRes","$key","$res","rslt","getResult","getScrollableParents","parentsUntil","clientInfo","browserClients","opera","edge","safari","msie","mozilla","client","culture","language","userLanguage","oldCulture","languages","isMSPointerEnabled","mouseDown","mouseMove","mouseUp","mouseLeave","click","context","hasStyle","prefixs","searchElement","isDeepCopy","current","objects","_uid","prefix","self","DataManager","nodeType","isWindow","ownLast","isOwnLast","getValueFn","valueFunction","getObservable","getVal","b","p","er","Error","message","stack","getRandomValue","min","rand","crypto","Uint16Array","getRandomValues","random","addEleAttrs","json","specified","removeEleAttrs","regex","names","attributes","removeAttr","attrNotStartsWith","removeEleEmptyAttrs","has3d","hasTouch","hasTransform","pushstate","history","hasTransition","expr","nodeName","oldSelf","addBack","doc","query","adaptor","offline","table","_getJsonFromElement","headerOption","insertUrl","removeUrl","updateUrl","crudUrl","batchUrl","headers","accept","timeTillExpiration","cachingPageSize","enableCaching","requestType","crossDomain","antiForgery","jsonp","enableAJAXCache","remoteSaveAdaptor","requiresFormat","isHtmlElement","cors","isNull","antiForgeryToken","defaultQuery","isDataAvailable","ODataAdaptor","ready","executeQuery","Query","done","result","JsonAdaptor","CacheAdaptor","setDefaultQuery","fail","always","deffered","Deferred","then","processQuery","_makeRequest","nextTick","_getDeferedArgs","resolveWith","_localQueryProcess","promise","executeLocal","_requiresCount","count","getTableModel","_fromTable","getKnockoutModel","_subQuery","lookup","_lookup","buildHierarchy","_fKey","_key","processResponse","using","isSelector","_subQuerySelector","fnFail","$proxy","rejectWith","process","xhr","request","actual","aggregates","virtualSelectRecords","fnQueryChild","subDeffer","childArgs","_isChild","subUrl","childReq","subData","fnSuccess","status","getResponseHeader","dateParse","parseJSON","req","_beforeSend","processData","when","pData","cData","requests","pResult","cResult","settings","props","setRequestHeader","saveChanges","tableName","batchRequest","deff","insert","replacer","deffer","record","parseJson","dataManager","tokens","getGuid","appendTo","keyField","update","parseTable","fKey","pKey","grp","GROUPGUID","fKeyData","oData","multipartAccept","batch","changeSet","batchPre","contentId","batchContent","changeSetContent","batchChangeSetContentType","jsonText","jsonReviver","iterateAndReviveArray","iterateAndReviveJson","array","field","isValidDate","isNaN","offsetMiliseconds","getTimezoneOffset","ticks","isJson","jsonData","isGuid","serverOffset","jsonReplacer","arrayReplacer","date","isJSON","isGUID","queries","_expands","_sortedColumns","_groupedColumns","_params","dataManagar","execute","cl","addParams","expand","tables","where","fieldName","operator","ignoreCase","FilterOperators","equal","predicate","Predicate","search","searchKey","fieldNames","contains","operatorSymbols","comparer","fnOperators","processSymbols","sortBy","isFromGroup","order","sortOrder","Ascending","sorts","endsWith","Descending","pvt","fnSort","filterQueries","direction","sortByDesc","group","page","pageIndex","pageSize","range","end","take","nos","skip","select","hierarchy","selectorFn","foreignKey","requiresCount","aggregate","Adaptor","init","overrides","base","dm","d","convertToQueryString","param","UrlAdaptor","hierarchyFilters","sorted","grouped","filters","searchs","singles","filterQueryLists","params","op","searches","getValue","callAdaptorFunc","getFiltersFrom","toJSON","fields","reqParams","ejPvtData","groupDs","added","agg","groups","level","getColFormat","onGroup","onAggregates","changed","deleted","keyColumn","predicats","isValues","or","WebMethodAdaptor","webkey","webvalue","timeStamp","cacheAdaptor","guidId","results","guid","setInterval","forDel","generateKey","pageQuery","forEach","currentFilter","isComplex","newQuery","predicates","condition","cachedItems","_crudAction","_insertAction","q","filtered","fnName","param1","onEachWhere","requiresCast","onComplexPredicate","onPredicate","_typeStringQuery","pred","_p","odBiOperator","anyCondition","odUniOperator","returnValue1","onWhere","onEachSearch","onSearch","onEachSort","onSortBy","reverse","onSelect","onCount","overrideMimeType","dataCopy","__metadata","cIdx","jsonObj","substring","exVal","changeGuid","aggregateResult","__count","initialGuid","cid","cSet","generateInsertRequest","generateUpdateRequest","generateDeleteRequest","ODataV4Adaptor","isDate","digitsWithSlashesExp","poppedExpand","unshift","cntFlg","ret","validate","getFieldList","fnCompare","sort","stableSort","aggQuery","onPage","size","onRange","onTake","onSkip","ForeignKeyAdaptor","foreignObj","foreignData","adaptorType","fValue","dataObj","foreignKeyField","foreignKeyValue","initial","col","setValue","keyValue","grep","WebApiAdaptor","host","Count","Items","inst","TableModel","jsonArray","modelComputed","rows","dirtyFn","setDirty","Model","state","computes","NotifierArray","_deleted","_isDirty","setDataManager","isDirty","getChanges","toArray","markCommit","triggerHandler","rejectChanges","revert","row","removeAt","markDelete","position","dirty","bindTo","marker","tDiv","cur","tTR","insertBefore","detach","empty","insertAfter","$id","_props","_computeEls","_fields","_attrEls","_updates","computed","prev","changeState","_updateValues","previous","suspendEvent","save","pr","read","ctl","unbindData","_processAttrib","_processField","_processComputed","unbind","isCustom","deps","handle","idx","ty","_changeHandler","formElements","safeVal","safeStr","Function","_generateDeps","_updateDeps","_updateElement","_computeHandle","merge","_updateProps","_attrHandle","c","_ensureItems","offsetParent","safeReg","checkAny","_comparer","processOperator","and","pvtPredicate","_combinePredicates","fromJSON","_fromJSON","_combine","preds","isAnd","dataUtil","swap","x","y","mergeSort","getItemFromComparer","fnDescending","fnAscending","distinct","requiresCompleteRecord","sum","castRequired","avg","newData","extractFields","indx","items","childLevels","groupedArray","records","tempObj","headerRowIndex","tr","headerRow","headerTds","tHead","hTd","cells","td","average","minimum","maximum","truecount","falsecount","middle","right","keyVal","quickSelect","pivotNewIndex","partition","pivotDist","newObj","complexPropertyMerge","pivotIndex","pivot","fnGetComparer","localeCompare","lessThan","greaterThan","lessThanOrEqual","greaterThanOrEqual","notEqual","<",">","<=",">=","==","!=","*=","$=","^=","lessthan","lessthanorequal","greaterthan","greaterthanorequal","notequal","in","notin","endswith","startswith","notcontains","expected","notnull","isnull","all","any","_raise","addAt","scope","TypeError","thisp","XDomainRequest","httpRegEx","getOrPostRegEx","sameSchemeRegEx","protocol","xmlRegEx","ajaxTransport","userOptions","jqXHR","xdr","userType","send","timeout","ontimeout","onload","allResponseHeaders","responseText","responses","text","ActiveXObject","loadXML","getElementsByTagName","xml","parseMessage","onerror","onprogress","abort","setImmediate","enableLocalizedSort","fastSort","grpQuery","isDesc","old","HTMLElement","tName","computedObservables","ko","koModels","ob","observable","owner","observableArray","uidIndex","hexs","Uint8Array","bind","first","second","globalize","cultures","englishName","nativeName","isRTL","numberFormat","pattern","decimals",",",".","groupSizes","+","-","percent","symbol","currency","calendars","standard","/",":","firstDay","week","nameAbbr","nameShort","days","namesAbbr","namesShort","months","AM","PM","twoDigitYearMax","patterns","D","T","F","M","Y","S","calendar","regexTrim","regexInfinity","regexHex","regexParseFloat","charMap","9","0","A","N","#","&","C","?","formatMapper","mask","rules","isDecimal","diff","stIdx","preFormat","escFormat","separator","newChar","expValue","exponentIdx","valueColl","formatColl","hashIdx","lastIndexOf","maskFirst","toExponential","oprMask","cnt","postFormat","hashCount","separatorColl","mapper","maskChars","mapperIdx","chr","rule","isEscChar","isExp","escIdx","customFormat","formatLength","formatObj","orgFormat","formatModel","altFormat","changeCulture","validateValue","preferredlocale","groupSep","currecySymbol","decimalSep","unmask","tempValue","oldvalue","replacestring","tempModel","maskIndex","prompt","strBefore","strAfter","charValue","isBracket","tvalue","v","charCode","charCodeAt","validateChars","getRoundValue","strippedValue","keyChar","caretPos","charmap","maskChar","actualkey","fromCharCode","valIdx","isCeil","patternStartsWith","patternEndsWith","truncate","NaN","padWithZero","parseNumberWithNegativePattern","nf","negativePattern","neg","getFullNumber","precision","formatInfo","curSize","curGroupIndex","factor","pow","rounded","round","isFinite","numberString","exponent","dot","stringIndex","sep","formatNumberToCulture","toLocaleString","matchNumberToPattern","patternParts","lastIndex","ar","parseValue","radix","findCulture","npattern","signInfo","sign","num","intAndFraction","exponentPos","integer","fraction","decSep","decimalPos","altGroupSep","expSignInfo","dateFormat","DAY_OF_WEEK_THREE_LETTER","DAY_OF_WEEK_FULL_NAME","DAY_OF_MONTH_SINGLE_DIGIT","DAY_OF_MONTH_DOUBLE_DIGIT","MONTH_THREE_LETTER","MONTH_FULL_NAME","MONTH_SINGLE_DIGIT","MONTH_DOUBLE_DIGIT","YEAR_SINGLE_DIGIT","YEAR_DOUBLE_DIGIT","YEAR_FULL","HOURS_SINGLE_DIGIT_12_HOUR_CLOCK","HOURS_DOUBLE_DIGIT_12_HOUR_CLOCK","HOURS_SINGLE_DIGIT_24_HOUR_CLOCK","HOURS_DOUBLE_DIGIT_24_HOUR_CLOCK","MINUTES_SINGLE_DIGIT","MINUTES_DOUBLE_DIGIT","SECONDS_SINGLE_DIGIT","SECONDS_DOUBLE_DIGIT","MERIDIAN_INDICATOR_SINGLE","MERIDIAN_INDICATOR_FULL","DECISECONDS","CENTISECONDS","MILLISECONDS","TIME_ZONE_OFFSET_SINGLE_DIGIT","TIME_ZONE_OFFSET_DOUBLE_DIGIT","TIME_ZONE_OFFSET_FULL","DATE_SEPARATOR","valueOutOfRange","low","high","expandYear","cal","year","getFullYear","curr","arrayIndexOf","toUpper","toUpperArray","getIndexOfDay","abbr","upperDays","_upperDays","getIndexOfMonth","monthsGen","monthsGenitive","upperMonths","_upperMonths","upperMonthsGen","_upperMonthsGen","appendMatchStringCount","preMatch","strings","quoteCount","escaped","il","parseDayByInt","valueX","day","countDays","getNumber","rg","getName","lower","nameLength","subValue","lowerArray","lowerInfo","localInfo","newLocalInfo","ch","_lowerDays","getFullDateFormat","_getDateParseRegExp","re","_parseRegExp","reFormat","expFormat","regexp","tokenRegExp","m","regexpStr","parseRegExp","regExp","getParsedDate","parseInfo","month","weekDay","hour","hourOffset","sec","msec","tzMinOffset","pmHour","jl","matchGroup","clength","matchInt","offsets","minOffset","defaultYear","convert","fromGregorian","toGregorian","setFullYear","getDate","getDay","setHours","adjustedMin","getMinutes","getHours","formatDateToCulture","sortable","zeros","foundDay","checkedDay","dayPartRegExp","converted","padWithZeros","hasDay","part","getMonth","getSeconds","getMilliseconds","floor","addCulture","cultureObject","globalCultureObject","cultureShortName","cultureArray","shortName","getISODate","parseDate","getControlObject","stringArray","getLocalizedConstants","controlName","returnObject","controlNameArray","Locale","EjVmlRender","vmlNamespace","vmStyle","namespaces","isdocmode8","documentMode","getElementById","cssText","vmlStyleSheet","createStyleSheet","owningElement","_rootId","svgObj","setAttribute","changeOptions","fill","stroke","stroke-width","font-size","font-family","font-style","font-weight","points","drawPath","darray","w","h","drawArc","changePathValue","applyVMLStyle","shape","$shapeEle","createLegendSvg","legendsvgObj","drawPolyline","setFillAttribute","opacity","fillcolor","colorName","color","color2","colors","angle","fill_opacity","setStrokeAttribute","pathArray","matches","startAngle","endAngle","PI","radius","cosStart","cos","sinStart","sin","cosEnd","sinEnd","innerRadius","innerR","circleCorrection","innerCorrection","path","changeVMLStyle","chart","strokeColor","drawLine","to","line","$lineEle","drawCircle","cx","cy","circle","$circleEle","drawEllipse","rx","ry","ellipse","$ellipseEle","drawRect","rect","$rectEle","drawCylinder","seriesOption","cx2","cx1","cy1","X1","Y1","LX1","LY1","LX2","LY2","cy2","sa","ea","sa2","ea2","X","LX","LY","gradientColor","EjSvgRender","checkColorFormat","datavisualization","Chart","colorNameToHex","svgRenderer","colorz","Ej3DRender","polygon3D","applyZLight","colorx","applyXLight","angleConvertor","isColumn","sa1","ea1","gradientAngle","stacking","isLastSeries","$shape","_getAttrVal","value1","_setAttr","transform","attrTrans","trans","$ele","createGradientElement","appendString","setSpanAttr","label","fontSize","font","fontStyle","fontFamily","bounds","utils","_measureText","drawText","groupEle","textDoc","$Ele","_textAttrReplace","behavior","textpath","appendChild","span","$spanEle","textspan","brtag","gTransToolEle","drawImage","imgElement","$imgElement","createDefs","createGroup","cursor","createText","textContent","drawAxesBoundsClipPath","gSeriesGroupEle","invertedAxis","clipOptions","_getTransform","xAxis","yAxis","drawClipPath","div","up","ceil","hexFromRGB","R","g","G","B","returncolor","hex","nr","hexToRGB","rgbRegex","createDelegate","bottom","cssClip","drawCircularClipPath","childEle","parentEle","svgLink","createElementNS","polyline","drawPolygon","polygon","fillColor","AEx","AEy","X2","Y2","GX","GY","gradientId","optiong","x1","y1","x2","y2","gradientele","colorStop","drawGradient","cName","gradientEle","defs","linerGradient","stop","stop-color","stop-opacity","$text","dy","enable3D","isTrackball","img","setAttributeNS","clippath","preserveAspectRatio","createClipPath","clipPath","createForeignObject","createPattern","createPath","createCircle","createLine","commonChartEventArgs","_decimalPlaces","_getLabelContent","axis","_categoryValueType","labelFormat","labels","_getSeriesTemplateSize","pointIndex","series","isLeft","sender","areaType","AreaType","chartContainer","seriesIndex","_visibleSeries","templateContainer","cloneNode","dataLabel","$cloneNode","parseTemplate","enableAnimation","LeftLabelMaxHeight","LeftLabelMaxWidth","RightLabelMaxHeight","RightLabelMaxWidth","getMinPointsDelta","chartObj","m_minPointsDelta","MAX_VALUE","_xAxisName","xValues","currentSeries","_yAxisName","minValue","visibleRange","delta","xValue","deltaValue","_getSeriesMaxLabel","maxTxtDim","svgObject","dim","visibleLabels","LabelMaxHeight","LabelMaxWidth","rightsidePoints","leftsidePoints","_getHighestLabel","intersectAction","largestLabel","maxWidth","labelCollection","currentLabel","Text","labelText","_getMaxLabelWidth","maxHeight","rotateLabel","currentRow","vmlrendering","labelIntersectAction","labelPlacement","opposedPosition","orientation","isHorizontal","requireInvertedAxes","roundingPlaces","labelRotation","prevLabels","visibleLabelsLength","visible","textCollection","enableTrim","derivedGap","maximumLabelWidth","intersectRotation","rotationValue","labeltextWidth","textWidth","maxSize","rotatedLabel","rowsCount","pointX","tempInterval","LabelPlacement","BetweenTicks","interval","rowCount","elementSpacing","highestWidth","highestLabel","valueType","gap","svgWidth","labelsCollection","labeltxtcoll","labeltxt","textcoll","EjAxisRenderer","rowscalculation","m_AreaBounds","row1","spaceValue","_getLegendSpace","chartBorderWidth","border","verticalaxis","_axes","realWidth","margin","axisTitleHeight","title","vAxesWidth","majorTickLines","axisLine","yLabels","_getYValues","largest","vaxis","rightSpacing","rightLegendWidth","boundsWidth","addedMaxHeight","count1","multipleRowsColl","count2","currentLabelColl","collectionLength","isMultiRows","textHeight","currentPoint","previousLabels","flag1","labelCount","prevLabel","preLabel","prePoint","preTextWidth","addedMaxWidth","prevPoint","prevTextHeight","maxheight","is3D","rotatedOptions","rotateAngle","text-anchor","_measureBounds","_calculateroundedCorner","cornerRadius","isArrow","tipPosition","tracker","padding","canvasPadding","enableCanvasRendering","topLeft","bottomLeft","topRight","bottomRight","maxwidth","textObj","body","family","weight","textArray","fontarray","fontWeight","backgroundColor","whiteSpace","offsetWidth","offsetHeight","_trimText","legendtext","textLength","box","getBoundingClientRect","_drawAxesBoundsClipPath","hPlotOffset","plotOffset","vPlotOffset","centerX","centerY","Radius","_getStringBuilder","counter","_addRegion","regionItem","SeriesIndex","Region","PointIndex","Bounds","chartRegions","AddRegion","isStripLine","_getSvgXY","svgX","svgY","_getPoint","xvalue","yvalue","YValues","xLength","_isTransposed","yLength","_hiloTypes","_valueType","_logBase","logBase","_getPointXY","isInversed","Range","_dateTimeLabelFormat","intervalType","_labelFormat","_getFontString","fontObj","FontFamily","FontStyle","Size","_valueToVector","_coefficientToVector","_valueToPolarCoefficient","TransformToVisible","currentseries","log","_valueToCoefficient","Transform3DToVisible","xIsLogarithmic","math","xlogarithmicBase","pointY","Point","coefficient","_getBoundingClientRect","invertedAxes","xSeries","ySeries","_minMax","_inside","_correctRect","Width","Height","_getValuebyPoint","xSize","ySize","yValue","PointX","PointY","chartTransform3D","ToRadial","transform3D","vector","vector3D","matrixobj","matrix3D","bsptreeobj","BSPTreeBuilder","mViewport","Rotation","Tilt","Depth","PerspectiveAngle","needUpdate","centeredMatrix","getIdentity","Perspective","resultMatrix","viewMatrix","setCenter","setViewMatrix","getMatrixMultiplication","turn","tilt","updatePerspective","tan","degreeToRadianConverter","degree","toScreen","getMatrixVectorMutiple","setCenteredMatrix","getInvertal","center","z","toPlane","plane","vec1","vec2","vector3DPlus","vector3DMultiply","getPoint","vector3DMinus","chartSymbol","_drawSeriesType","symbolStyle","seriesType","trendlinetype","legendItem","drawType","Type","Line","_drawLine","gLegendItemEle","_drawStraightLine","StepLine","_drawStepLine","StackingArea","StackingArea100","Area","RangeArea","_drawArea","StepArea","_drawStepArea","Bar","StackingBar100","StackingBar","_drawBar","Pie","_drawPie","Doughnut","_drawDoughnut","Hilo","_drawHilo","HiloOpenClose","_drawHiloOpenClose","Candle","_drawCandle","Pyramid","_drawPyramid","Funnel","_drawFunnel","Spline","_drawSpline","SplineArea","StackingSplineArea","StackingSplineArea100","_drawSplineArea","RangeColumn","_drawRangeColumn","Bubble","Scatter","_drawCircle","Column","StackingColumn","StackingColumn100","Waterfall","_drawColumn","_drawRectangle","svgRender","ShapeSize","sqrt","symbolstyleStyle","Style","ID","startX","startY","Color","BorderWidth","BorderColor","Opacity","Visibility","lgndCtx","_drawLeftArrow","_drawRightArrow","_drawUpArrow","_drawDownArrow","_drawCross","_drawHorizLine","_drawVertLine","_drawTriangle","_drawInvertedTriangle","_drawHexagon","_drawWedge","stroke-linecap","stroke-miterlimit","_drawPentagon","sb","deg","rad","_drawStar","_drawTrapezoid","_drawDiamond","_drawEllipse","_drawImage","Imageurl","elementspace","ElementSpace","circlepath","circleoptions","cartesian","polarToCartesian","cartesianlarge","cartesiansmall","angleInDegrees","angleInRadians","seriesPalette","defaultMetro","defaultHighContrast","defaultOffice","defaultMaterial","defaultGradient","borderColors","seriesColors","blueMetro","blueGradient","greenMetro","greenGradient","sandleMetro","sandleGradient","themes","flatlight","highlightColor","background","legend","subTitle","primaryXAxis","majorGridLines","minorGridLines","minorTickLines","labelBorder","multiLevelLabelsColor","multiLevelLabelsFontColor","crosshairLabel","secondaryX","primaryYAxis","borderWidth","secondaryY","commonSeriesOptions","errorBar","cap","connectorLine","crosshair","seriesBorderDefaultColors","flatdark","gradientlight","gradientdark","highcontrast01","material","office365","azure","azuredark","gradient-azure","gradient-azuredark","lime","limedark","gradient-lime","gradient-limedark","saffron","saffrondark","gradient-saffron","gradient-saffrondark","axisTypes","_sideBySeriesPadding","visibleSeries","isPadding","startPadding","endPadding","visibleSeriesLength","axisOrientation","EjStripline","chartobj","_seriesMinMax","seriesCollection","seriesLength","_hasSeriesPoints","indicators","_points","maxX","minY","minX","maxY","maxMinXValue","maxMinYValue","xMax","xMin","yMax","yMin","seriesVisibility","pointsLength","visibleLength","_visiblePoints","showIntermediateSum","showTotalSum","isEmpty","actualIndex","maxPointLength","isSpline","controlPoint","naturalSpline","getBezierControlPoints","splineVisiblePoints","controlPointsCount","visiblePoints","seriesKey","_name","ejSplineSeries","_isVisiblePoints","controlPoints","currentPt","minval","maxval","yindex","controlPoint1","controlPoint2","startFromZero","indicatorRange","_getDoubleAutoRange","_getLogAutoRange","stackedValue","isStacked","maxLimit","calculateNumericNiceInterval","setRange","Delta","commonAxisEventArgs","_calculateTrendLineRange","trendlines","trendline","serLength","trendLength","trendlineType","trendlineTypes","calculateTrendLineSegment","AlignRangeStart","sDate","intervalSize","sResult","milliseconds","seconds","minutes","_increaseDateTimeInterval","setDate","setMilliseconds","setSeconds","setMinutes","setMonth","setYear","_calculatePadding","getTime","_intervalType","rangePadding","zoomed","startYear","endYear","endMonth","endDay","endHour","minute","endMinute","getHour","endSecond","milliSecond","endMilliSecond","actualRange","_interval","_calculateVisibleRange","isScroll","zoomFactor","zoomPosition","disableZoom","baseRange","startDate","endDate","intervalX","enableAutoIntervalOnZooming","calculateDateTimeNiceInterval","_calculateAxisLabels","minRange","commonAxesEventArgs","_LableMaxWidth","oneDay","totalDays","totalHours","totalMinutes","totalSeconds","totalMilliseconds","desiredIntervalsCount","GetActualDesiredIntervalsCount","niceInterval","desiredIntervals","minInterval","intervalDivs","currentInterval","maximumLabels","_calculateRange","defaultDate","pointLength","setAxisInterval","_setInterval","_chartResize","actual_Range","_calculateRanges","_saveRange","_range","_drawTrendline","resetZooming","_initialRange","ejExtendClass","members","ejDateTimeValue","datetime","ejDoubleValue","intervalstr","remaining","currentAxis","tempPlace","labelValue","labelPrecision","labelPrecisionHighest","labelPrecisionDefault","isStacked100","labelLength","double","ejLogValue","_getRoundValue","calculateLogNiceInterval","logStart","logEnd","mulS","mulE","_calculateLogRange","_calculateLogPadding","tempIntervaltext","logarithmic","ejCategoryValue","_calculateCategoryRange","legendCollapsed","excludeDataUpdate","maxXValue","isIndex","isIndexed","_xAxisValueType","_pointCollection","_calculateActualInterval","categoryInterval","_applyRangePadding","_scrollBarEnabled","scrollsvgObj","category","ejDateTimeCategory","_calculateDateTimeCategoryRange","xRange","MaxX","xLabels","xPoint","index1","prevDateVal","xVerfiedPoints","dateDouble","dateLabels","xDateVal","xVal","pt","ser","_xPoints","_yPoints","ySortPos","ind","_diffDate","previousPoint","mul","currentLabels","prevLabelVal","expectLabel","isCurrentLabel","isNextLabel","datetimecategory","_drawGridLines","axisIndex","_drawXAxisGridLine","_drawYAxisGridLine","_drawPolarGridLine","_drawPolarLabels","_drawPolarCircle","_drawAxes","_drawXAxisLabels","_drawXTitle","_drawYAxisLabels","_drawYTitle","_getSharpPath","_drawAxisLine","gEle","sbYMajorTick","stroke-dasharray","dashArray","gPolarAxisEle","yMajorTickDir","regionX","labelsLength","_radius","region","aroundRadius","firstLabelX","lastLabelX","coef","textAnchor","gXaxisEle","sbYMajorGrid","isPolar","vector2","connectPoint","endPoint","yMajorGridDir","gYaxisEle","chartModel","legendTitleHeight","legendPosition","legXSpace","legYSpace","sbXMajorGrid","sbXMajorTick","borderSize","yOffset","actualWidth","actualHeight","isRadar","xMajorGridDir","xMajorTickDir","chartBorder","titleEnable","textOverflow","subTitleEnable","LegendActualBounds","_titleLocation","_subTitleLocation","svgHeight","finalSize","_drawXAxisTickLine","xMajorTicksDir","xMinorTicksDir","sbXMinorTicks","sbXMajorTicks","minorPointX","_opposed","xPointValue","_isScroll","scrollbarSettings","isCrossesAt","axes","_validCross","labelPosition","tickLinesPosition","showNextToAxisLine","_y","gTickEle","ticksbwtLabel","ValueType","Category","ticksVal","linesVal","yTickPosition","minorTicks","logmax","logmin","logtickstart","logtickend","logtickInterval","minorTicksPerInterval","logtickPos","xTickPosition","mtVal","mlVal","lineStart","yPosition","scrollerSize","xLabelGrid","scrollSize","endY","endX","boundsX","zooming","enableScrollbar","labelGridOptions","optionsMinorTicks","optionsMajorTicks","xMinorGridDir","sbXMinorGrid","gAgb","optionsLine","_lineOption","tickPosition","mX1","chartArea","alternateGridBand","odd","even","optionsAlternateeven","clip-path","optionsAlternateodd","optionsMinorGrid","_drawYAxisTickLine","isValidCross","yMajorTicksDir","yMinorTicksDir","yPointValue","_x","sbYMinorTicks","sbYMajorTicks","minorPointY","tickVal","lineVal","ytickPosition","xPosition","yLabelGrid","optionsMinotTick","optionsMajorTick","yMinorGridDir","yPoint","axisName","sbYMinorGrid","axisBottomLine","optionsBottomLine","mY1","mX2","zoomHeight","yoptionsAlternateodd","yoptionsAlternateeven","textOverflowMultiLevelLabels","actualText","labelSize","textOptions","gMultiLevelEle","yVal","_wrap","unTrimmedText","axisMultiLevelLabelRegions","trimText","_triggerMultiLevelLabelsRendering","commonEventArgs","_drawXAxisMultiLevelLabels","grpLabel","clipX","clipY","clipWidth","clipHeight","anchor","borderOptions","alignment","svgId","areaBounds","_multiLevelLabelHeight","clipRectOptions","multiLevelLabels","_level","textAlignment","maximumTextWidth","multiLevelLabelHeight","prevHeight","ctx","beginPath","clip","multiLevelLabel","multiLevelLabelRegions","braceGap","labelHeight","value2","restore","_drawYAxisMultiLevelLabels","space","textX","newHeight","multiLevelLabelWidth","multiLevelLabelsDefault","labelWidth","isCanvas","pixel","xAxisAignment","flag","insideTicks","labelMaxWidth","labelMaxHeight","labelMaxRow","lineWidth","textSize","trimLabelText","chartAreaWidth","chartAreaX","maxLineWidth","textanchor","newGapVal1","newGapVal2","nextPointX","nextLabel","nextLabelValue","nextPoint","nextTextWidth","textcollection","trimGap","areaBoundWidth","majorTickSize","axisWidth","inversed","textheight","majorTickWidth","lastLabel","displayText","insideLabels","nextLabelCollection","lblCollection","highestText","edgeLabel","_gap","firstLabel","secondLabel","q1","otherLabel","trimLabel","trimmedLabel","newTextWidth","lblColLength","edgeLabelPlacement","labelTextColl","calculateRegion","xAxisLabelRegions","gXaxisTickEle","arrColl","colLength","xAxisLabelLength","nextXLabel","nextValue","largestText","labelTxt","measureText","currentTextCollextion","labelCollectionLength","word","currentWidth","nextWidth","rotate","textElement","diffHeight","yLocation","yAxisLabelRegions","axisHeight","yAxisAlignment","maxLength","ellipsis","xtitleLocation","axisTitleSize","titlesize","titleText","isEnableTrim","axisTitleWidth","maximumTitleWidth","axisTitlePosition","axisTitleAlignment","axistitleoffset","locX","maxTitleWidth","matched","isIE11","xAxisTitleRegion","borderY","class","isTransposed","majorTickLinesize","titleSize","dominant-baseline","yAxisTitleRegion","_drawStripline","stripLine","stripLineIndex","pointYstart","yHeight","widthValue","textY","_stripeline","striplineid","zIndex","gStriplineOver","gStriplineBehind","isVisible","pointstart","startFromAxis","pointend","widthMax","pointYend","widthYValue","imageUrl","imgOptions","borderColor","isStripline","getContext","clipBounds","closePath","EjLegendRender","sumofArray","legendRectSpace","svgBounds","divBounds","drawLegendTitle","legendBounds","LegendBounds","legendTitle","legendBoundsWidth","titleWidth","titleHeight","gLegendEle","drawLegendItem","textMaxWidth","legendBorder","chartSvgRender","legendFont","Font","symbolShape","shapeSize","itemStyle","legendStyle","LegendStyle","itemInfo","startLocation","symbolName","textinfo","legendTextRegion","Shape","capitalizeFirstString","vmlRendering","CommonEventArgs","legendbound","itembound","_Width","LegendBound","ItemBound","legendRegion","LegendItem","Location","SymbolShape","drawLegend","legendViewerBounds","LegendViewerBounds","actualBounds","svgObjectWidth","svgObjectHeight","titleFontHeight","subTitleFontHeight","legendCollection","itemPadding","hPadding","vPadding","modelsubTitleHeight","titleLocation","legendTitleBounds","legendTitleWidth","rowDefinitions","_rowDefinitions","currentX","currentY","columnDefinitions","_columnDefinitions","vSizeFar","farSizes","vSizeNear","nearSizes","hSizeFar","hSizeNear","isScrolling","legendContainer","leftScroll","bottomScroll","legendSvgContainer","textBorderConstant","titleBorderSpacing","subTitleBorderSpacing","titleTextHeight","subTitleTextHeight","titleWrapTextCollection","_height","subTitleWrapTextCollection","_crossAxisOverlap","axisBounds","_bounds","hor","legendHeight","legendWidth","vScrollSize","columnCount","legendVal","offsetLeft","chartOffsetVal","offsetVal","legnTx","show","border-width","border-color","border-style","_ejScroller","ejScroller","scrollTop","scrolltop","scrollLeft","scrollleft","overflow","overflowY","overflowX","hScrollSize","hide","seriesTypes","EjSeriesRender","indicatorTypes","EjIndicatorRender","EjTrendLineRenderer","draw","trendIndex","calculateLineDirection","calculateSplineDirection","spDirection","splinesb","startingPoint","yIndex","ySpline","firstPoint","secondPoint","firstIndex","canvasX","canvasY","pt1","pt2","bpt1","bpt2","_drawLinePath","lDirection","translate","gTrendGroupEle","gTrendlinesGroupEle","chartmodel","backwardForecast","forwardForecast","updateTrendSource","calculateLinearTrendline","updateExponentialTrendSource","calculateExponentialTrendline","updateLogarithmicTrendSource","calculateLogarithmicTrendline","updatePowerTrendSource","calculatePowerTrendline","polynomialOrder","calculatePolynomialTrendline","updateMovingAverageTrendSource","calculateMovingAverageTrendline","calculateTrendLineRange","xPoints","yValues","calculateSumXAndYValue","slope","_intercept","Slope","Intercept","SX","SY","SXX","SXY","SYY","SumProduct","intercept","exp","ejLinear","linear","Exponential","x3","X3","midPoint","y3","exponential","Logarithmic","Power","p1","power","Polynomial","polynomialSlopes","num2","yval","index2","numArray","matrixOfA","num1","gaussJordanEliminiation","createPolynomialSegments","getPolynomialYValue","slopes","numArray1","numArray2","numArray3","index3","index4","index5","num3","num4","polynomial","MovingAverage","period","nullCount","movingaverage","indicator","transX","transY","indicatorIndex","indicatorOptions","gIndicatorGroupEle","segment","isIndicator","calculateDirection","drawColumn","lineCap","stroke-linejoin","lineJoin","gIndicatorEle","origin","sidebysideinfo","Start","End","cSer","calculateSides","getRectangle","xr","yr","plot","histogram","svgXy","calculateSegment","yRange","upperSeries","upperLine","_getXValues","lowerSeries","lowerLine","trendSeries","c1","pmf","nmf","trendPoints","calculateIndicatorRange","xAxisName","yAxisName","ejRSI","rsi","ejMACD","longPeriod","shortPeriod","shortEMA","longEMA","macdPoints","signalEMA","histogramPoints","calculateEMA","macdSeries","macdLine","histogramSeries","macdType","min1","max1","sma","initialEMA","getPoints","getEma","emaPercent","emaAvg","macd","ejSMA","closevalues","smavalues","close_length","ejEMA","getCloseValues","ema","ejSTOCHASTIC","KPeriod","kPeriod","DPeriod","dPeriod","Period","periodSeries","periodLine","HighValues","LowValues","CloseValues","check","AddPoints","SMA","Period1","Period2","SMACal","period1","period2","values","ComputeStochastics","len1","len2","mins","maxs","MIN_VALUE","stochastic","ejbollingerBand","deviationSum","limit","multiplier","standardDeviations","movingavg","smaPoints","deviations","bbiPoints","lb","ub","mb","lowvalues","trendvalues","bollingerband","ejATR","atrPoints","high_Low","high_ClosePrevious","low_ClosePrevious","trueRange","sumTruRange","firstFlag","atr","ejaccumulationDistribution","adlPoints","volume","accumulationdistribution","ejTMA","close_values","tmavalues","sum1","sma_count","tma","ejMomentum","momentum","getOrigin","crossAxis","_getCrossAxis","crossesInAxis","_crossValue","setLineSeriesStyle","serColor","seriesInterior","getSeriesName","gSeriesEle","seriesBorder","seriesBorderColors","SeriesInterior","SeriesBorder","serName","drawAreaPath","canvasTranslate","serOptions","fill-opacity","dragPoint","canvasElement","gPreviewSeriesGroupEle","setAreaSeriesStyle","dx","ySplineDuplicate","cardinalSplineTension","splineType","slopeLength","interPoint","d1","d2","d3","dy1","dy2","getDaysInMonth","point1","point2","ySpline1","ySpline2","yDuplicate1","yDuplicate2","haxesCount","hAxes","yearValue","dateObj","CountDays","one3","deltaX2","dx1","dx2","improveChartPerformance","chartSeries","tempPoints","seriesPoints","pointCollection","AreaBounds","emptyPoints","emptyPointsCount","xTolerance","yTolerance","prevXValue","prevYValue","xDiff","yDiff","currentPointsLenght","markerCount","dataLabelCount","minPoint","pointFill","_sorted","_pointMarker","_dataLabels","_calculateEmptyPoints","checkNull","emptyPointSettings","calculateWaterfallSeriesPoints","currentPoints","mode","displayMode","emptyPointsVisible","_isPieOfPie","_sethlocPoint","_calculatePolarAxesSegment","sideInfo","_getSeriesPosition","itemCurrentXPos","sumofYValues","drawSymbol","isClosed","chartStartAngle","isStacking","startValue","StartValues","endValue","EndValues","dStartX","dStartY","dEndX","dEndY","StartAngle","EndAngle","CenterX","CenterY","DRadius","line1","line2","line3","Line1","Line2","Line3","hasStackingInnerRadius","symbolLocation","point3","line4","Line4","point4","regionAdded","_calculateVisiblePoints","legendPoints","emptyPointsLength","pieCollections","collectionIndex","_visibility","gapMode","getMinMaxValue","pointValue","pieDoughnutCenter","centerCount","regions","oldCenterX","circleCenterX","oldCenterY","circleCenterY","circularRadius","startRadian","endRadian","centerPoint","startPoint","longX","longY","maxRadian","maxPoint","minRadian","_drawEmptyPieOfPie","theme","pathOptions","calculatingSliceAngle","legendActualBounds","visiblePointslength","totalDegree","arcData","gapWidthValue","gapWidth","constantWidth","widthDifference","pieGapWidth","pieFactor","circleMidAngle","midAngle","chartStartingAngle","radian","explodeIndex","explodeAll","explodeOffset","_drawHiloPath","interior","pointbounds","valWidth","valHeight","isIntersec","other","currBounds","Bottom","Top","IntersectWith","intersect","smartIndex","rightsidebounds","leftsidebounds","smartLabelPosition","overlap","_calculateArcData","pieSeriesIndex","longArc","currentMidAngle","clockWise","dClockWise","centerx","centery","Direction","getXCordinate","getYCordinate","getDoubleRange","mstart","mend","mdelta","mmedian","misEmpty","Median","IsEmpty","isDependentSeries","getPointXYOrgin","calculateMean","q1Arr","q3Arr","q1Arrodd","q1Arreven","q2Arr","q3Arrodd","q3Arreven","q1half","q3half","midhalf","lowerquartile","upperquartile","wholenumlower","remainderlower","intpartlower","decimalpartlower","wholenumupper","remainderupper","intpartupper","decimalpartupper","intpartlowerposition","intpartupperposition","averageValue","boxAverageValue","boxWhiskerValues","boxWhiskerCount","boxes","boxArrCount","boxPlotMode","iqr","upperrange","lowerrange","outliers","maxNumCount","boxPlotValues","Minimum","LowerQuartile","midvalue","UpperQuartile","Maximum","boxAverage","quartileValues","calculateBoxAndWhiskerPath","options1","list2","boxPlotLocation","dataLabelLocation","boxCount","outlierShape","outlierSettings","whiskerpath","boxAvg","boxAvgValue","fenceValue","outlierpoint","outlier","plotlowerwhisker","plotupperwhisker","meanPath","upperWhisker","lowerWhisker","mean","stacked","stackingposition","getSideBySidePositions","stackingGroup","vAxeseries","spacingCalculated","vAxes","hAxis","seriesCollectionLength","columnIndex","rowIndex","columnWidth","needSpace","_sideBySideSeriesPlacement","_getColumnSpacing","getSideBySideInfo","spacing","columnSpacing","loc","axesSeries","stackingSeries","xInversed","yInversed","_getLogPoint","_getTransposedPoint","_getTransposedLogPoint","previousStyle","styleOptions","isLog","_animationType","sorting","_setLinePathStyle","nextpoint","moveTo","lineTo","setStyle","enableSmartLabels","doCircularAnimation","duration","seriesRender","piePath","childNodes","animate","pieRadius","queue","step","fx","circularAnimationComplete","gSeriesTextEle","gSymbolGroupEle","gDataLabelEle","gConnectorEle","gConnectorLinesGroup","AnimationComplete","_doLineSymbol","beginTime","scaleVal","delay","scales","animateSymbol","delayInterval","scale","animateCylinder","clipRect","animVal","animateRect","animationType","scale1","scale2","isBar","animateStackingRect","boxX","boxY","_doLineAnimation","clipRectHeight","clipRectWidth","_applySaturation","pointColor","rgbValue","contrast","rgbColorValue","drawDataLabel","chartRegionIndex","pointText","boxPlotLabels","waterfallSum","textAlign","fontBackgroundColor","textBaseline","dataLabelFont","textPosition","regiontype","isRegion","labelfont","textOffset","contrastColor","enableContrastColor","chartAreaBackground","chartBackground","dataLabelOffset","xval","xXalue","baseline","showEdgeLabels","xPos","yPos","isLastLabelOut","_enableSmartLabels","xPosLow","yPosLow","widthLow","heightLow","textOptionsLow","drawTextLow","textOptionsBox","boxLabelCount","textOptionsBoxValues","drawLabelTemplate","collide","ejChart","isCollide","updateSmartLabelPosition","renderingPoints","connectorDirection","bezierPoints","connectorX","connector","connectorY","midX","midY","dMidX","doughnutMidPoint","dMidY","textGap","outerX","positionX","positionY","isIntersectedLabel","smartAngle","connectorType","previousLeft","isIntersected","initialAngle","Angle","connectorMidX","connectorMidY","drawBezierSegment","labelX","labelY","connectorHeight","labelEdge","connectorLineEdge","legendRight","distanceFromOrigin","clockwise","isInterSected","bezierPath","updateLabelPosition","updateSmartLabel","datalabelTemplateVisiblity","pyrX","pyrY","_labelPlacement","calculateInsideConnectorLines","compareDataLabels","outsideDataRegionPoints","drawTextacc","drawConnectorLines","textOptionsacc","bezierdir","regionPoint","positionPoint","isPointInPolygon","Polygon","connectorLength","datalabelWidth","startx","starty","endy","prevlabel","currentlabel","trimmedText","trimfunction","datalabelText","remainingWidth","datalabelLength","elipsis","calculatePosition","rightEndX","rightEndY","leftEndX","leftEndY","textOption","textsize","visiblePoint","labelTrim","chartEndAngle","regionData","pointStartAngle","pointEndAngle","distanceFromCenter","textinRegion","trimPosition","firstStartAngle","arcAngle","atan2","startangle","stAngle","enAngle","drawDataLabelAcc","pointMarker","_labelPosition","chartTitle","seriesMarker","enableWrap","wrapConnectorpoints","srIndex","symbolPos","accDataLabelRegion","measureTitle","mesureSubTitle","subtitleHeight","xLocation","isOverlapped","pointColors","pointindex","_overlapLegend","datalabelShape","dataLabelEle","conEle","dataLabelSymbol","datalabelSize","untrimmedSize","explode","labelTextSize","updateWrappedText","connectorSegments","exceed","txt","tempY","tempX","connectorOptions","dataLabelEndPos","dataLabelTopPos","legendPosY","previousBoundary","wrapTrim","arrayText","textPosX","textPosY","segmentHeight","segmentWidth","areaSpace","connectorPoints","txtLength","tempXY","midAngleRadian","startANG","endANG","radiusTextPosPercentage","startPointX","startPointY","endPointX","endPointY","midPointX","midPointY","innerCenterX","innerCenterY","segmentBounds","getSegementMinMax","areabounds","areaStartX","areaEndX","insidenooverap","changedHeight","wrapText","_rowsCalculation","changedText","currentBoundary","checkOverlapping","firstSegment","textOverlap","xOverlap","yOverlap","getOverlapArea","minDiff","labelexceeding","checkSegmentExceeding","firstTextSegment","lastTextSegment","overlapArea","xArray","yArray","textBounds","limits","inside","pointRadius","controlpoints","polyLine","GetBezierPoint","p0","areaBoundsX","areaBoundsY","areaBoundsWidth","areaBoundsHeight","dataLabeltemplate","areaBound","_hiloFill","dataLabelLow","outerHeight","outerWidth","topHeight","leftWidth","rightWidth","bottomHeight","excessHeight","excessWidth","animateLabelTemplate","secondsPerPoint","fadeIn","horizontalTextAlignment","verticalTextAlignment","visiblePointLength","seriesPointIndex","isYInversed","xOrigin","_getXCrossValue","originChanged","pointHeight","pointWidth","yOrigin","isNegativePoint","precount","pretype","changeCrossHairSymbol","track","ptIndex","serIndex","trackMarker","_gradientStop","_trackMarker","_getPieOfPiePoint","symbolEle","gradientName","drawSymbolStyle","trackSymbol","positiveFill","symbolColorName","Image","image","arc","highlightSettings","enable","highlight","chart3D","not","replaceWith","trackcount","_saturationColor","gTrackerEle","imgMarkerEle","chartAreaType","hiloTypes","ejLineSeries","ejStepLineSeries","startPath","ejStepAreaSeries","aDirection","xOffset","startLoc","stepPoint","steparea","stepline","ejColumnSeries","columnFacet","dragSettings","sidebysideInfo","cylinderSeriesOption","roundrect","column","ejStackingColumnSeries","isstacking100","stackedSeries","stackingcolumn","stackingcolumn100","rangecolumn","ejRangeColumnSeries","ejBoxandwhiskerSeries","trackCount","list1","newPoint","boxplotmidpoint","newPoint1","svgXyOutlier","boundsOutlier","boxStrokeColor","showMedian","boxandwhisker","ejWaterfallSeries","seriesRegions","serOptions1","connectorLineGroup","t1","t2","lineOptions","w1","w2","h1","h2","_animatedSeries","waterfall","ejStackingBarSeries","stackingbar","stackingbar100","ejBarSeries","seriesStyle","bar","ejStackingAreaSeries","areasb","endLength","stackingarea","stackingarea100","ejAreaSeries","endLoc","area","ejRangeAreaSeries","internalRegion","rangearea","spline","ejSplineAreaSeries","_seriesIndex","previousSeriesPoints","stackingsplinepath","_previousSeries","_prevpointIndex","minvalue","drawbackCurve","_getReversePath","reversePath","splinearea","stackingsplinearea","stackingsplinearea100","ejScatterSeries","visiblePointsLength","scatter","ejBubbleSeries","createBubbleGroup","sizeValueIndex","bubbleOptions","radiusMode","minRadius","maxRadius","maximumSize","segmentRadius","percentChange","maxValue","calculateroundedCorner","valwidth","valheight","bubble","ejhiloSeries","pathInterior","setHiloStyle","lowvalue","highvalue","hilo","ejhiloopencloseSeries","paletteColor","palette","drawOpenWing","drawMode","drawCloseWing","openvalue","closevalue","isFill","bearFillColor","bullFillColor","startOpenValue","pto1","endOpenValue","pto2","openbounds","startCloseValue","ptc1","endCloseValue","ptc2","hiloopenclose","ejCandleSeries","defaultrectHeight","startRect","orginRect","rectSize","sizeRect","candleOptions","candle","ejPieOfPieSeries","pieofpie","ejPieSeries","pieCoefficient","pieOfPieCoefficient","_pieCoefficient","zOrder","splitMode","txtOptions","symbolOptions","dataLabelOptions","sliceXY","counterClockWise","data-pointIndex","canvasOptions","Index","StartX","StartY","PieSeriesIndex","emptyCircleOptions","seriesData","Series","SeriesData","pie","ejDoughnutSeries","_doughnutSize","doughnutSize","_doughnutCoefficient","doughnutCoefficient","numberToFixed","explodeX","explodeY","doughnut","ejPyramidSeries","titleVisibility","subTitleVisibility","measureSubTitle","measureTitleHeight","measureSubTitleHeight","resWidth","pyramidMode","calculateLinearSegments","calculateSurfaceSegments","_getPyramidData","PositionX","PositionY","Connector","chartInteractiveBehavior","pyramidData","CurrY","topRadius","bottomRadius","currY","gapRatio","gapHeight","preSum","getSurfaceHeight","currHeight","surface","solveQuadraticEquation","root1","root2","sd","pyramid","ejFunnelSeries","funnelData","_getFunnelData","Line5","Line6","seriesMarer","funnelWidth","funnelHeight","endTop","endMin","endBottom","bottomY","line5","line6","minimumHeight","minimumWidth","funnel","ejPolarSeries","polar","ejRadarSeries","doAnimation","Path","radar","hasDontEnumBug","propertyIsEnumerable","dontEnums","dontEnumsLength","isArray","rv","datachildIndex","datachildValue","eval","Gradient","_renderSfChart","svgSupport","isChartElemId","_createChartId","renderer","EjCanvasRender","createLegendCanvas","_appendChartElements","_createChart","scrollerContainer","axisScroll","setSvgSize","containerHeight","containerWidth","legendcontainerHeight","chartWidth","chartHeight","compareExtend","src","def","defProp","currPro","setModelProperties","chartCross","mArea","serAnimation","nullValue","trendLineType","datasource","trendlineDefaults","indicatorDefaults","commonlaodEventArgs","setTheme","_isdesigntime","randomPoints","is","bindEvents","themeName","_themeChanged","_drawBackInterior","backInterior","_drawBackImage","backGroundImageUrl","_getDataType","addedXYValues","setXValueType","isDatetime","setSize","regExpTest","parsed","_previousType","_setInternalValues","intermediateStartValue","totalSum","previousSum","_zOrder","interiorColor","pointsColl","seriesFill","pointBorder","pointInterior","colour","colours","aliceblue","antiquewhite","aqua","aquamarine","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","honeydew","hotpink","indianred ","indigo ","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","_getLocalizedLabels","_setCulture","removeMultiRect","regionCount","minhightwidth","_locale","_localizedLabels","sideBySideSeriesPlacement","_isEjScroller","commonpreRenderEventArgs","gTitleEle","gSubTitleEle","_createAxisLabelAndRange","_initializeSeriesColors","_calculateLegendBounds","legendRender","commonLegendEventArgs","_processJsonData","seriesName","isStriplineOver","isStriplineBehind","_arrangeAxis","crosshairLabelVisibility","slCount","stripLineDefault","_calculateStackingCumulativeValues","_calculateStackingValues","isLazyZooming","axisRange","trend","commonAxesInitEventArgs","_updateScroll","prevWidth","currentHeight","newWidth","_calculateAreaBounds","graphics","Graphics3D","Polygons","_calculateAxisSize","_validateCrossing","_axisCrossing","commonAreaEventArgs","_drawChartAreaRect","_drawTitle","Ej3DAxisRenderer","chartaxis","Ej3DChart","update3DWall","_setZoomProperties","_renderStripline","initSeriesRender","indicatorRender","annotationsLength","annotations","currentAnnotation","annotationRender","gYaxisTickEle","isCartesian","lineOption","_chartAreaZoom","panning","_enableZoomingButtons","originalHeight","originalWidth","selectionFound","selectionSettings","selectionEnable","_removeSelection","selectedData","remove_duplicates","selectedDataPointIndexes","_isStateChaged","segmentSelection","legendData","chartUpdating","commonLoadedEventArgs","arr1","arr2","_zf","_zp","_xZoomFactor","_xZoomPosition","_yZoomFactor","_yZoomPosition","marginLeft","marginTop","currentDocument","annotationIndex","annotationsDefault","annotationContainer","content","z-index","coordinateUnit","annotationX","annotationY","horizontalAlignment","verticalAlignment","TransformToVisibleAnnotation","axesLength","maxRange","_getAnnotationPoint","-ms-transform","-webkit-transform","-moz-transform","-o-transform","-transform","eleId","clientRect","indOptions","animationDuration","gSeriesGroupId","markerElements","markerLength","dataLabels","dataLabelLength","connectorLines","connectorLineLength","errorBarElements","gErrorBarGroupEle","errorBarEleLength","errorBarInterval","boxWhiskerInterval","lineEle","pathEle","markerInterval","dataLabelInterval","elementsLength","time","ubound","lbound","randomValue","defaultDuration","doLineSymbolDuration","animateSymbolDuration","animateRectDuration","_animationElements","seriesOptions","isSplitted","drawAccDisplayText","_appendConnectorElements","_appendDataLabelElement","_accSeriesDraw","_splitSeries","splitValue","totalValue","splitArray","inputArray","_calculateGapWidth","circle1end","circle2start","circleradius","drawPieofPieConnectors","allPoints","markerRegion","svg","seriesOptionsVisibility","currentSeriesType","currentPointXPos","currentPointYPos","currentPointLabel","currentPointVisibility","trendLineLength","seriesEle","svgObjectId","waterfallLineEle","detachEle","showLabels","xVisibleRange","yVisibleRange","renderSeries","_renderTrendline","cartesianColumnSmartLabels","cartesianSmartLabels","connectorFlag","newConnectorFlag","childElementCount","_animatedTrendline","prepareView","perspectiveAngle","depth","rotation","view","_renderScrollbar","_calculateZoomValue","scrollObj","zoomPos","zoomFact","scrollRange","_previousStart","_previousEnd","scrollerWidth","scrollerHeight","scrollerX","scrollerY","posY","isRedraw","zoomFac","opposed","axesCollections","zoomingScroll","scrollEleLength","scrObj","isZoomAble","scrollDraw","enableResize","canResize","isVirtual","startDateTime","endDateTime","scrollbarContainer","EjSvgScrollbarRender","_initializeScrollbarVariables","isZooming","trendlinesOptions","trendOptions","backwardPoints","forwardPoints","isTrendLine","trendlineIndex","equation","forwardForecastPoints","backwardForecastPoints","chartstripline","stripline","sl","slAxis","drawtype","errorbar","renderErrorBar","areatype","tooltip","cloneSeriesEle","cloneobj","svgclone","drawDisplayText","errorOptions","capFill","capWidth","capLength","verticalErrorValue","horizontalErrorValue","verticalPositive","verticalNegative","horizontalPositive","horizontalNegative","errorBarElement","errorBarGroup","errorBarPoint","standY","standX","verHighvalue","verLowvalue","horHighvalue","horLowvalue","verMean","horMean","verStandSquareRoot","horStandSquareRoot","centervalueX","centervalueY","verStandardDeviationValue","horStandardDeviationValue","verCentervalue","horCentervalue","verStandardErrorValue","horStandardErrorValue","values1","verHighCapX1","verHighCapX2","verLowCapX1","verLowCapX2","horHighCapY1","horHighCapY2","horLowCapY1","horLowCapY2","eDirectionV","cDirectionV","eDirectionH","cDirectionH","eDirection","cDirection","fixvalue","pervalue","perY","perX","standDeviValue","standError","custom","capValues","errorBarPointGroup","verticalPositiveErrorValue","verticalNegativeErrorValue","horizontalPositiveErrorValue","horizontalNegativeErrorValue","meanCalculation","renderCap","errorBarOptions","errorBarCapOptions","temp1","total","verTotal","horTotal","ded","eachDev","squareEachDev","squareTotal","verEachDev","horEachDev","verSquareEachDev","verSquareTotal","horSquareTotal","verStandardMean","horStandardMean","horSquareEachDiv","capLen","processCount","posObj","rightTop","leftTop","rightBottom","leftBottom","markerWidth","markerHeight","leftValue","topValue","regionType","storeDataLabelPositions","outsideLabels","compareColumnDataLabels","isOutside","contrastColorRegion","firstPoints","currentCollideLabel","checkOutsideLabels","_positionOutsideLabels","checkCollide","breakLoop","resetValues","isTemplate","pieConnectorLines","drawConnectorLine","connectorLineValues","markerState","aVal","aBounds","rectLeft","rectRight","rectTop","rectBottom","firstSeries","secondSeries","aXPos","aYPos","bXPos","bYPos","rightsidePointsLength","leftsidePointsLength","_processOData","queryPromise","clearRect","redrawChart","dec","cond","_findDatatype","xName","yNames","yName","colorMap","pointColorMappingName","textMap","textMappingName","jsonLength","isBubble","checkString","hiddenIndex","_hiddenPointIndex","_processStringData","_processBoxandWhiskerData","_processBubbleSize","_processHiLoValues","isDateString","tryParseFloat","finish","createElementsId","_pointsLength","mappingYNames","exsistId","calculateHeight","$svgObj","calculateWidth","selectedStyle","selected","selection","chartResize","resizeTO","clearTimeout","disableAnimation","_windows","bindResizeEvents","_resizeEventRegistered","_isOrientationSupported","removeResizeEvents","_calculatePinchZoomPosition","originalEvent","panTouch","previousPanTouch","pinchPan","enableDeferredZoom","oPreviousCoords","chartMouseMove","_ensureValueInMinMax","redraw","_calculateTouchDistance","scaleX","scaleY","valueToCheck","_calculatePinchZoomFactor","zoomedOut","currentScale","cumulativeScale","axisScale","prevScale","scaleLimit","previousScale","_removeZoomkit","_addTouchPointer","overwrite","pointerId","_removeTouchPointer","_copyTouches","_initEventParams","movements","_pointerPinchStart","targetId","eventObj","elementOffset","eventParams","changedTouches","pointerType","enablePinching","resetZoom","startPan","startZoom","startZoomInOut","chartMouseDown","_removeInteractions","_removeTrackBall","_removeHighlight","_pinchGestureMove","doPan","_pointerPinchMove","startTouches","previousPointerMove","pagex","_pointerPinchEnd","continuePinching","removeChild","firstChild","chartMouseUp","chartMouseLeave","_appendStyle","head","createTextNode","isPointer","isIE11Pointer","touchStartEvent","touchStopEvent","touchMoveEvent","touchCancelEvent","maxTouchPoints","PointerEvent","PointerEventsPolyfill","TouchEvent","msMaxTouchPoints","_isSafari","chartMouseClick","chartRightClick","chartMouseDoubleClick","isResponsive","touchAction","ms-touch-action","touch-action","content-zooming","-webkit-touch-callout","-webkit-user-select","-moz-user-select","-ms-user-select","user-select","chartMouseWheel","calZoomFactors","currentZoomFactor","currentZoomPos","calcZoomFactorVal","calcZoomPosition","zoomMFactor","zoomMPosition","doMouseWheelZoom","calZoomVal","enableTrackBall","disableTrackBall","toolbar","toolbarItems","currentItem","resetZoomButton","panButton","zoomButton","enableMouseWheel","chartZoomed","canUpdate","wheelDelta","mouseWheelCoords","getAxisMultiLevelLabelsData","mouseMoveCords","calMousePosition","grpLabelsLength","mousemoveX","mousemoveY","getAxisLabelData","targetid","axisVisible","getLegendData","isEjScroll","chartId","get3DSeriesPoint","regionValue","pointData","GetSeriesPoint","mouseX","mouseY","currentSer","fromCenterX","fromCenterY","clickAngle","pointRegion","polygon1","areaValue","regionLength","regionIndex","isExploded","fromCenterX1","fromCenterY1","mousePosition","mouseposition","calTouchPosition","touch","leftPadding","grabPadding","currentEle","drag","zoomValue","previousZoomFactor","previousZoomPosition","_getZoomedData","iconColor","background-color","_cursorToDefault","_cursorToPointer","currentItemId","chartOffset","zoomId","panId","resetZoomId","events","MSPointerEvent","doZoom","zoomRect","zoomRectWidth","zoomRectHeight","zoomArea","getClientRects","zoomX","zoomY","zoomedData","axisValueType","XValue","High","Low","Open","Close","YValue","parentgEle","selectedDataCollection","multiSelectDataCalculation","selectedRectIndex","rectX","oldRectX","rectY","oldRectY","rectWidth","oldRectWidth","rectHeight","oldRectHeight","selectFactor","selectPosition","multiAxis","multiSelectType","previousSelectFactor","previousSelectPosition","xOriginalVisibleRange","yOriginalVisibleRange","stackYValue","some","rangeType","currentIndex","removeRect","rectPan","resize","commonloadEventArgs","multiSelectMouseUp","_isMultiSelect","multiSelectMode","selectRectWidth","selectRectHeight","selectRectX","selectRectY","containerSvg","selectRectId","multiSelectDraw","rightRectOptions","bottomRectOptions","leftRectOptions","topRectOptions","bottomRightCornerCircleOptions","topRightCornerCircleOptions","closingPathOptions","closingPathOppositeOptions","gripOptions","gripCollection","oldReRightRectX","oldReTopRectY","oldReBottomRectY","oldMultiSelectType","isTouch","touchCross","chartMouseUpTouch","currentPageX","mouseDownCords","currentPageY","mousedownPointX","mousedownPointY","dragIndex","commonDragEventArgs","valAxis","draggedPoints","_getDraggedPoint","_changeDraggingPoints","multiSelectAreaType","$zoomRect","parentId","parentNode","oDelta","panEndEventArgs","panStartEventArgs","rotateActivate","multiSelectMouseDown","chartX","chartY","matchStr","selectMode","mouseDownX","mouseDownY","last","mouseMoveX","mouseMoveY","_grab","_enableDragging","closestXyPoint","serY","serX","getClosesPointXY","parentNodeId","selectionIndex","isZoom","isZoomButtonHovered","button","previousRange","trackerElement","tapNum","doubleTap","timer","zoom","pointer","getEvent","currX","cachedX","cachedY","crosshairMoved","enableRotation","multiSelectMouseDownId","PreviousCoords","isZoomToolkit","mousePanCords","mousePanX","mousePanY","_doClick","clusterPoints","isMultiSelection","getIndex","commonPointEventArgs","currentexplodeindex","elementsLenth","styleLength","pathId","gElement","legenddata","toggleSeriesVisibility","legendSelection","TrendLineIndex","_notifyArrayChange","trendlineVisible","ActualIndex","chartRect","axisData","labelData","contentData","isSelectionSetting","getTargetId","getSelectionId","isAreaType","findCanvasSelection","isSelectionFound","isSelectionSettings","isElement","sIndex","pIndex","dataLength","seriesFlag","pointFlag","accPointFlag","clusterFlag","accSeriesClusterFlag","isSelected","removeSelection","canvasSelection","legendClass","drawTrackerSymbol","offsetX","offsetY","chartSeriesObj","trackerRemoved","trackId","transSymbolOptions","gTrackballOptions","gTrackball","closestPoint","outlierPosition","chartPoint","pointVisible","closestX","closestY","getClosestPointX","mousePoint","closest","getClosest","cPoint","_beforeMin","_afterMax","_closest","createTooltip","seriesPoint","tooltipMargin","dataPoints","getTooltipFormat","currentText","tooltipdiv","tooltipFirst","seriesColor","getSeriesColor","ToolTip","tooltipWidth","tooltipHeight","leftPos","topPos","tooltipOptions","transition-property","-moz-transition-property","-webkit-transition-property","-o-transition-property","transition-duration","-moz-transition-duration","-webkit-transition-duration","-o-transition-duration","templateRect","translateX","translateY","highlightFill","canvasHighlight","patternName","legendVisible","containerStyle","Areatype","clusterseriesIndex","clusterpointIndex","createCanvasElement","canvasPattern","createRect","isUnSelected","canvasSeriesRect","canvasHighlightCircle","canvasHighlightPyramid","canvasBubbleHighlight","canvasScatterHighlight","sbRegion","rlen","canvasHighlightLegend","canvasHighlightMarker","regionsLength","cRlength","piePoints","pieColIndex","pieSrIndex","chartRegion","rlength","selectedPoint","sr","srlen","strokeStyle","highlightSegment","markerOptions","legendCtx","svgData","chartCavasOffset","highLightCanvas","main","fillStyle","globalAlpha","hoverStyle","patternStyle","patternContext","loadPattern","customPattern","foundClasses","pointClasses","pointClass","clusterPointslength","seriesLenth","found_class","pathName","highlightSeries","highlightCluster","highlightPoint","colorStyle","api","strokeWidth","createStyle","otherElements","matchString","clustername","indexVal","datas","findClass","seriesSelectionIndex","finName","strokeOpacity","styleSheet","textnode","header","style3D","dStyle","classname","targetID","myLocation","elementFromPoint","clientX","clientY","selectClass","seriesHighlightIndex","svgid","patternGroup","patternUnits","fillRect","doubleTapTimer","singleTap","doubleTapped","targetTouches","swipeThreshold","fadeOut","groupElement","axisTooltip","showTitleTooltip","_textTooltip","datalabelTooltip","prevLocation","tooltipShowing","currentIndicator","trendLines","removeTooltip","pointLocation","transOptions","displayShowTooltip","pieExplosion","pointlocation","prevSeriesPoint","prevlocation","transToolOptions","transToolTipOptions","explodeValue","targetElement","chartTrackball","mouseLocation","store","closePointLength","dir","showTrackLine","insideBounds","seriesArray","chartPos","chartAreaStartPos","chartAreaEndPos","pointPos","crossHairTrans","tToolOptions","initialPoint","rectxt","tooltipfont","textarea","tgap","currentLength","tX","tY","chartLocation","visiblepts","tooltipRanges","DisplayTooltipOptions","enableCanvas","totalVisible","heightwidth","textOptionsCollection","groupingTextId","trackballDisplayMode","trackballTooltipSettings","groupTooltipId","boxSeriesCount","trackOutlier","drawCrosshairLine","seriesLenIndicator","closestPointValues","trackPoints","boxvalue","financial","createCrosshairCanvas","parentElement","tooltipTemplate","tooltipFormat","boxgroupingtext","boxtext","textColor","highlightStart","displayTooltip","newLines","tooltipPadding","ClosestPoint","ClosestPointIndex","Tgap","StEnd","TextArea","ReqInvertAxis","SmartTooltipPosition","displayLength","displayGroupingTemplate","displayTemplateTooltip","gTrackAxisOptions","gTrackAxisEle","areaX","displayAxisTooltip","ypointLocation","floatElements","chartCrossHair","gCrosshair","dhor","optionsHor","offsetTop","gAxisCrossOptions","labelplacement","xPointLocation","chartTouchMove","showTooltipOnDrag","changeX","changeY","highlightSvg","highlightCanvas","resizeCursor","chartAreaY","chartAreaHeight","multiSelectMouseMove","gripMouseMoveX","gripMouseMoveY","selectionSettingsType","xPlotOffset","yPlotOffset","modifiedX","modifiedY","selctRectId","rectOptions","gCurrentEle","gripIndex","oldId","oldGripIndex","dragType","_dragDelta","newXval","newYval","oldXval","oldYval","_pointDragandDrop","chartType","dragEventArgs","ptindex","srindex","_dragPointMarker","gMarkerGroupEle","_dragPointGripper","transposed","canvasGripper","canvas","circleLength","boundValue","cxy","classList","difY","difX","keyup","zoomingType","-khtml-user-select","drawZoomRect","deferredZoom","createBtnTooltip","reset","pan","zoomIn","zoomOut","commonLegendMoveEventArgs","showAxisTooltip","labelIndex","originalText","_hideTooltip","subTitleLocation","titleEnableTrim","titleTextOverflow","subTitleEnableTrim","subTitleTextOverflow","subTitleText","trimTooltip","subTitleTooltip","scrollLength","scroll","_scrollbarUpdate","_setScrollPosition","highlightedElement","querySelector","removeAttribute","containerId","tooltipLength","white-space","padding-left","padding-right","explodePoint","currentExplodePoint","pieActualIndex","chartLoc","seriescolor","childNode","templateLocX","templateLocY","xLoc","yLoc","isTrans","templateHeight","templateWidth","pointXAxis","pointYAxis","axisY","axisX","mouseLoc","maxTickSize","maxLocation","commonTrackTextArgs","chartAxis","currentTrackText","trackAxisText","textAxisOptions","toolAxisRectOptions","maxWdithArrayCollection","arrayCollection","maxTextWidth","txtlength","totalHeight","grouping","tooltipCollections","trackball","trackballBorder","groupSize","groupHeight","container","m_width","yAxisY","xAxisX","groupLocation","trackToolTip","tx","border-radius","pointer-events","tlength","Axis","trackTooltipText","toolRectOptions","tip_pos","toolTipOptions","getTooltipOptions","rectBorderColor","rectBColor","rectFillColor","rectFColor","rectTextColor","poly","tipOpen","tooltipStartPosition","tooltipEndPosition","boundryStart","boundryEnd","text_pos","marker_width","swp","hsize","tooltipfill","fontText","isCandle","arrowPath","gTooltip","SmartTooltipOptions","InitialRanges","length_SmartTooltips","visibleLocation","totalSapce","ContinousOverlappingPoints","verticalArrangeMents","startEndRanges","pointsRanges","axisNames","startPos","secTemp","secWidth","axisLength","TooltipRanges","StartPoint","halfHeight","midPos","tRange","kRange","rX","rY","getFormat","boxLocation","outlierVisible","xAxisValueType","nullorundefined","xAxisLabelFormat","yAxisLabelFormat","dateTimeFormat","decimalPlaces","xGlobalize","yGlobalize","xFormat","yFormat","xPrecision","yPrecision","precisionDefault","precisionHighest","calculate","globalizeformat","subStr1","convertExponential","boxPlotPoints","parentZindex","bubbleSpacing","tooltipdivRect","chartTooltipHover","padding-top","padding-bottom","align-self","text1","text2","RemoveTableAttr","areaPos","diffY","splitText","modelColor","pointBorderColors","elementCollection","tlines","lgth","longest","_initializeTrendlinesColors","dataPoint","indicatorSeries","primaryX","primaryY","OnTicks","axisScrollSetings","modelTitleHeight","legendSpace","leftSpace","rightSpace","titleFontSize","maximumWidth","titleMaxWidth","titleWidthEnable","titleTrim","_drawSubTitle","_getLegendSize","symbolSize","measuresubTitle","subTitleFontSize","maxSubTitleWidth","titleTextAlignment","subTitleTextAlignment","titleWidthVisibility","subTitleYposition","subTitleXLocation","subTitleMaxWidth","subSize","stackAxes","stackAxesLength","lastPosValue","lastNegValue","lastValue","currentValue","isNul","firstPositive","firstNegative","crossing","visiblePointIndex","correction","posValues","negValues","frequencies","stackingName","seriesGroupCount","yValuesLength","getYValue","percentage","posValue","negValue","_legendItemBounds","itemCount","legendItemWidth","legendItemHeight","legVal","legnedHeightIncr","LegendWidth","LegendHeight","textmaxwidth","legendTextCollection","legendTextLength","wordMax","_legendMaxWidth","_legendMaxHeight","_triggerLegendEvent","legendSizeHeight","legendSizeWidth","currentLegend","legendviewerHeight","legendviewerWidth","legendHeightTemp","legendWidthTemp","tempSeries","legendSeries","trendLine","legendColor","legendName","legendStyleColor","legendSeriesLength","legendsize","colorGradName","visibleOnLegend","legendInfo","shapeWidth","trendLineIndex","Rows","Columns","GetPointXYOrgin","orginX","orginY","PrimaryXaxis","PrimaryYaxis","GetPointXY","getMultiLevelLabelSize","grpLabelArr","grpLabelLength","axisValue","borderStyle","greaterIndex","braceFlag","AxisMaxWidth","lum","rgb","axesIndexCount","vRowcount","axesCount","indexValue","definitionsLength","_calRowSize","yaxisOrign","totalRealLength","rowMax","rowDef","rowHeight","realLength","unit","_axisRowDefinitionSize","_calColumnSize","xaxisOrign","areaWidth","columnDef","_axisColumnDefinitionSize","maxStart","isInitAxes","isOppInitAxes","columnDefinition","nearIndexVal","farIndexVal","isColFirstAxes","isColOppFirstAxes","oppY","norY","maxCol","currentColAxis","realY","axisColumnSpace","columnSpan","axisSize","rowDefinition","rowLength","nearIndex","farIndex","isFirstAxes","isOppFirstAxes","norX","oppX","maxRow","axisSpace","realX","rowSpan","axisRowSize","_opposedPosition","crossesAt","_getCrossValue","locateAxis","crossValue","_locateAxis","_avoidOverlapping","axisbounds","_recalculateSpace","isHor","isCrossing","colIndex","validCross","_getAxisByName","customRow","lineColor","rowCollection","spanningRow","_axisFilter","_SpanningAxes","columnCollection","spanningColumn","_axisSize","definition","spanningCollection","isRow","spanIndex","spanMax","axisResult","axisCollection","hSpace","leftLegendWidth","hWidth","vSpace","topLegendHeight","bottomLegendHeight","vWidth","customColumn","columnLength","_axisMeasure","multiLevelLabelSize","axisLineWidth","_arraySum","_calSpace","definitions","measureValue","currentaxis","opposedPosiiton","ltheight","titleVisible","titleCollection","subTitleCollection","subTitleLabelCollection","subTitleVisible","textOverflowVisibility","subTitleTextOverflowVisibility","subTitleHeight","_arraySome","isZoomScroll","scrollbar","zomming","_yScroll","_xScroll","sizes","vAxesOppWidth","columnSizes","hAxesWidth","hAxesOppWidth","bottomSpacing","boundsHeight","m_Spacing","canvasWidth","canvasHeight","validTags","additionalPadding","butt","square","bevel","miter","legendAlignment","near","far","pointStyle","textStyle","None","LeftArrow","RightArrow","Circle","Cross","HorizLine","VertLine","Diamond","Rectangle","Triangle","InvertedTriangle","Hexagon","Pentagon","Star","Ellipse","Wedge","Trapezoid","UpArrow","DownArrow","SeriesType","wallSize","exportSettings","fileName","multipleExport","xZoomFactor","yZoomFactor","xZoomPosition","yZoomPosition","load","axesLabelRendering","axesRangeCalculate","axesTitleRendering","dragStart","dragging","dragEnd","chartAreaBoundsCalculate","legendItemRendering","legendBoundsCalculate","preRender","seriesRendering","trendlineRendering","symbolRendering","titleRendering","subtitleRendering","axesLabelsInitialize","pointRegionClick","seriesRegionClick","annotationClick","axisLabelClick","chartClick","scrollStart","scrollEnd","scrollChanged","chartDoubleClick","pointRegionMouseMove","legendItemClick","axisLabelMouseMove","legendItemMouseMove","displayTextRendering","toolTipInitialize","trackAxisToolTip","animationComplete","create","beforeResize","afterResize","rangeSelected","multiLevelLabelClick","multiLevelLabelRendering","dateStart","_tags","singular","_series","_series_points","_primaryXAxis_stripLine","_primaryYAxis_stripLine","_axes_stripLine","_ignoreOnExport","getCanvasElement","printId","exportPrintCanvas","expCtx","canvasContainer","canvasArea","getSVGElement","chartWidthSVG","chartHeightSVG","svgChart","containerSVG","legendChart","containerLegendSVG","chartSVG","legendChartSVG","contentSVG","Id","svgID","printCtxAnnot","selectionChart","selectionLegendChart","selectionChartSVG","annotationChartCanvas","canvasChart","writeCode","containerselectionChartSVG","containerSelectionLegendSVG","legendPos","annotationChartSVG","containerAnnotationChartSVG","TDStyle","oImg","chartDistance","zoomBtnObj","zoomToolbarID","btnCount","toDataURL","prepend","selectedPoints","printSvgElement","_getSelectionContentInSVG","canvasObj","win","pinchPanning","scrollbarUpdate","export","exporting","svgExport","imageExport","raiseWebServerEvents","chartObjectArray","chartObject","exportChart","exprtCtx","dataURL","exportCanvas","input1","input2","exportChartSVG","selectionContent","encodeURIComponent","_width","clientArgs","Data","Format","FileName","log_Range","CrosshairType","Crosshair","TrackBall","TrackballDisplayMode","Float","Grouping","VisibleOnLegend","Visible","Hidden","ExportingType","PNG","JPG","PDF","SVG","DOCX","XLSX","ExportingMode","Client","Server","ExportingOrientation","Portrait","Landscape","Double","DateTime","DateTimeCategory","TextOverflow","Wrap","Trim","WrapAndTrim","PieOfPie","Polar","Radar","BoxAndWhishker","SplitMode","Position","Percentage","Indexes","SplineType","Natural","Monotonic","Cardinal","Clamped","DragType","XY","TrendlinesType","Linear","ErrorBarType","FixedValue","StandardDeviation","StandardError","Custom","ErrorBarMode","Both","ErrorBarDirection","Plus","Minus","LabelIntersectAction","Rotate90","Rotate45","WrapByword","Hide","MultipleRows","EdgeLabelPlacement","Shift","roundedCorner","Theme","Azure","FlatLight","Azuredark","Lime","LimeDark","Saffron","SaffronDark","GradientLight","GradientDark","HighContrast01","HighContrast02","Material","Office365","Bootstrap","Normal","Italic","FontWeight","Regular","Bold","Lighter","IntervalType","Auto","Days","Hours","Seconds","Milliseconds","Minutes","Months","Years","RangePadding","Additional","Round","TextAlignment","MiddleTop","MiddleCenter","MiddleBottom","LabelPosition","Inside","Outside","ZIndex","Over","Behind","Unit","PyramidMode","Surface","DrawType","AnimationType","Smooth","Cylinder","EmptyPointMode","Gap","Zero","Average","Pattern","Chessboard","Crosshatch","Dots","Pacman","DiagonalBackward","DiagonalForward","Grid","Turquoise","Tile","HorizontalDash","VerticalDash","Box","VerticalStripe","HorizontalStripe","Mode","Cluster","SelectionType","Single","Multiple","DrawMode","LineCap","Butt","Square","LineJoin","Bevel","Miter","Middle","Alignment","Near","Far","TickLinesPosition","CoordinateUnit","Pixels","Points","HorizontalAlignment","VerticalAlignment","ConnectorLineType","Bezier","HorizontalTextAlignment","VerticalTextAlignment","multiLevelLabelsBorderType","WithoutTopAndBottom","Brace","CurlyBrace","MACDType","Histogram","IndicatorsType","RSI","Momentum","Bollingerband","Accumulationdistribution","EMA","Stochastic","ATR","MACD","TMA","BoxPlotMode","Exclusive","Inclusive","BubbleRadiusMode","MinMax","dataSplit","canvasCtx","setLineDash","bezierCurveTo","quadraticCurveTo","drawCornerRadius","grad","pi","twoPi","xl","yl","ini","gx1","gy2","gx2","gy1","rxt","ryt","grd","createLinearGradient","addColorStop","arcTo","my_gradient","fillText","fontvalue","txtlngth","prevX","prevY","box-sizing","svgShape","attrOptions","points1","path1","points2","path2","points3","path3","points4","path4","drawCrosshairlabel","text-align","chartCanvas","secCanvas","drawTrackToolTip","border-box","chartAreaRect","circleOptions","parentDiv","shapeAttr","drawSvgShape","-moz-border-radius","-webkit-border-radius","circumference","imageObj","Ej3DSeriesRender","series3DTypes","_drawGridLines3D","_renderTicks3D","_drawAxisLabel","_drawMultiLevelLabel","_drawAxisTitle","gAxisTitleEle","multiLevelLabelsVisible","Label","TextAnchor","child","addVisual","createTextElement","newOptions","multiLevelLabelsLength","bottomValue","rightValue","lineTop","actual3DPosition1","actual3DPosition2","vectorColl","newId","_textTrim","trimmedSize","_textWrap","_textWrapByLength","tempLabel","maxWordLength","_multipleRows","angleValue","extraHeight","labelsCount","previousVisblelabel","rotatedSize","_calculatePosition3D","ticksPosition","tickSize","isOpposed","screenPositionTop","screenPositionLeft","parallelLine","line3D","depthD","sideLine","_getSegmentDepth","actualDepth","createSegment","insideRadius","StartValue","EndValue","YData","inSideRadius","ActualEndValue","ActualStartValue","calculateSize","createPoints","segments","visiblepoints","InsideRadius","pieHeight","arcStartAngle","arcEndAngle","segindex","_addPieDataLabel","_isChartRotated","startDepth","StartDepth","actualTiltView","actualRotateView","rotattion","createSector","seg","DtoR","inc","oPts","iPts","ox","oy","ix","iy","oPlgs","vts","iPlgs","tVtxs","bVtxs","rvts","lvts","createPolygons","returnPoly","poligons","segmentsLength","plgs","ai","draw3DDataLabel","dradius","_coefficient","depthInfo","drawPoints","drawLineSegment","updateConnectorLine","labelRadiusFromOrigin","getBezierApproximation","outputSegmentCount","drawpoints","vectorPoints","createPolyline","ejCircularSeries","MARGINS_RATIO","_size","VectorPoints","ej3DStackingColumn","createSegments","plans","ej3DColumnSeries","median","cons","sbsInfo","_setData","xBase","xStart","xEnd","tlpoint","rbpoint","tlfVector","brbVector","EndDepth","createCylinder","createBox","XRange","YRange","XData","updateBackWall","updateLeftWall","updateRightWall","updateBottomWall","updateTopWall","topSideWallPlans","rightRect","rightSideWallPlans","leftRect","leftSideWallPlans","bottomSideWallPlans","Epsilon","isValid","vz","vx","vy","v1","v2","_z","vector3dAND","vector3DStarMultiply","getLength","sqt","normalize","getNormal","v3","v4","v5","MATRIX_SIZE","mData","createArray","isAffine","initialSize","matrix","getMinor","getMatrixMultiple","getDeterminant","m1","getMatrixVectorAnd","getMatrixAdd","m2","getMatrixEqual","getMatrixNotEqual","dd","getMMtr","shear","xy","xz","yx","yz","zx","zy","polygonobj","getVisualCount","Remove","clearVisual","getVisual","build","tree","panel","MaxValue","eye","drawBspNode3D","draw3DElement","Plane","drawPolyLine","drawTemplate","Front","Back","EPSILON","clear","getNext","getNodeCount","vector3DIndexClassification","isCuttingBackPoint","cuttingBackPairIndex","alreadyCuttedBack","isCuttingFrontPoint","cuttingFrontPairIndex","alreadyCuttedFront","classifyPoint","pln","sv","normal","classifyPolygon","plg","onBack","onFront","onPlane","splitPolygon","backP","frontP","polyPoints","backPartPoints","frontPartPoints","outpts","inpts","ptB","ptC","sideB","sideC","vwiwcB","sect","ptP","vwiwc","ptA","sideA","vwiwc1","vwiwc2","CuttingBackPoint","CuttingBackPairIndex","CuttingFrontPoint","CuttingFrontPairIndex","cutOutBackPolygon","cutOutFrontPolygon","polygon2","BackP","FrontP","curVW","curVWPair","curVWPrev","curVWNext","curPrev","curNext","arlist","bspNode","arleft","arright","Name","epsilon","strokeThickness","calcNormal","IsSplitted","Tag","Parent","StrokeThickness","Fill","Element","polyLine3D","text3D","inverse","oz","pathCount","theta","CenterZ","radiusb","radiusc","Z","graphics3D","p2","p3","p4","p5","p6","plan","ray","norm","xLen","yLen","desiredWidth","desiredHeight","pathDirection","lineSegment","actual3DPosition","elementShape","figure","Segments","lightCoefZ","lightCoefY","lightCoefX","Stroke","previousID","RGB","updatedVectors","offsetLeftX","offsetRightX","oldWidth","scrollbarLoaded","arrowsize","minimumRect","panningRect","isMinWidth","_diff","arrowSize","scrollHeight","minimumScrollSize","xPadding","yPadding","makeShape","spc","horizLineTo","vertLineTo","ori","opp","dStr","rectBorder","rightRectBorder","leftRectBorder","leftArrow","rightArrow","centerLine","leftHeaderHideRectOptions","leftHeaderOptions","rightHeaderHideRectOptions","rightHeaderOptions","vmlPadding","_bindScrollEvents","rootId","bindDesktopEvents","_leftScrollbarDown","_rightScrollbarDown","_leftArrowDown","_leftArrowUp","_rightArrowDown","_rightArrowUp","_scrollSelectRectDown","_scrollBackRectDown","_scrollBackRectUp","_scrollbarMove","_scrollbarUp","bindTouchEvents","isSafari","isInIframe","device","_scrollMouseWheel","_calculateScrollLeftMove","moveLength","_startX","_offsetRightX","_offsetLeftX","_calculateScrollRightMove","_ofsetRightX","startArgs","endArgs","_scrollChanged","oldRange","newRange","_calculateScrollPosition","startRange","minScrollWidth","leftScrollbarClicked","rightScrollbarClicked","scrollRectClicked","mouseDownPos","moveClientX","downClientX","_doScrollIndex","_scrollStartArgs","_scrollChangeArgs","enableDeferredUpdate","oldStart","oldEnd","newStart","newEnd","_args","scrollUpdate","_appendScrollRange","deferred","is_chrome","vendor","leftArrowClicked","rightArrowClicked","rectOldWidth","_scrollStarted","release","clicked","_scrollEnd","scrollbarBackRectClicked","endRange","currentRange","_scrollEndArgs","_calculateMouseWheelRange","leftIncrement","leftArrowRecursive","clearInterval","rightIncrement","rightArrowRecursive","scrollBackRectRecursive","renderNavigator"],"mappings":"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","file":"ej.chart.minify.js","sourcesContent":["\r\n\r\nwindow.ej = window.Syncfusion = window.Syncfusion || {};\r\n\r\n\r\n(function ($, ej, undefined) {\r\n 'use strict';\r\n\r\n ej.version = \"16.1.0.32\";\r\n\r\n ej.consts = {\r\n NamespaceJoin: '-'\r\n };\r\n ej.TextAlign = {\r\n Center: 'center',\r\n Justify: 'justify',\r\n Left: 'left',\r\n Right: 'right'\r\n };\r\n ej.Orientation = { Horizontal: \"horizontal\", Vertical: \"vertical\" };\r\n\r\n ej.serverTimezoneOffset = 0;\r\n\r\n ej.parseDateInUTC = false;\r\n\r\n ej.persistStateVersion = null;\r\n\r\n ej.locales = ej.locales || [];\r\n\r\n if (!Object.prototype.hasOwnProperty) {\r\n Object.prototype.hasOwnProperty = function (obj, prop) {\r\n return obj[prop] !== undefined;\r\n };\r\n }\r\n\r\n //to support toISOString() in IE8\r\n if (!Date.prototype.toISOString) {\r\n (function () {\r\n function pad(number) {\r\n var r = String(number);\r\n if (r.length === 1) {\r\n r = '0' + r;\r\n }\r\n return r;\r\n }\r\n Date.prototype.toISOString = function () {\r\n return this.getUTCFullYear()\r\n + '-' + pad(this.getUTCMonth() + 1)\r\n + '-' + pad(this.getUTCDate())\r\n + 'T' + pad(this.getUTCHours())\r\n + ':' + pad(this.getUTCMinutes())\r\n + ':' + pad(this.getUTCSeconds())\r\n + '.' + String((this.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5)\r\n + 'Z';\r\n };\r\n }());\r\n }\r\n\r\n String.format = function () {\r\n var source = arguments[0];\r\n for (var i = 0; i < arguments.length - 1; i++)\r\n source = source.replace(new RegExp(\"\\\\{\" + i + \"\\\\}\", \"gm\"), arguments[i + 1]);\r\n\r\n source = source.replace(/\\{[0-9]\\}/g, \"\");\r\n return source;\r\n };\r\n\r\n jQuery.uaMatch = function (ua) {\r\n ua = ua.toLowerCase();\r\n\r\n var match = /(chrome)[ \\/]([\\w.]+)/.exec(ua) ||\r\n /(webkit)[ \\/]([\\w.]+)/.exec(ua) ||\r\n /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(ua) ||\r\n /(msie) ([\\w.]+)/.exec(ua) ||\r\n ua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec(ua) ||\r\n [];\r\n\r\n return {\r\n browser: match[1] || \"\",\r\n version: match[2] || \"0\"\r\n };\r\n };\r\n // Function to create new class\r\n ej.defineClass = function (className, constructor, proto, replace) {\r\n /// Creates the javascript class with given namespace & class name & constructor etc\r\n /// class name prefixed with namespace\r\n /// constructor function\r\n /// prototype for the class\r\n /// [Optional]Replace existing class if exists\r\n /// returns the class function\r\n if (!className || !proto) return undefined;\r\n\r\n var parts = className.split(\".\");\r\n\r\n // Object creation\r\n var obj = window, i = 0;\r\n for (; i < parts.length - 1; i++) {\r\n\r\n if (ej.isNullOrUndefined(obj[parts[i]]))\r\n obj[parts[i]] = {};\r\n\r\n obj = obj[parts[i]];\r\n }\r\n\r\n if (replace || ej.isNullOrUndefined(obj[parts[i]])) {\r\n\r\n //constructor\r\n constructor = typeof constructor === \"function\" ? constructor : function () {\r\n };\r\n\r\n obj[parts[i]] = constructor;\r\n\r\n // prototype\r\n obj[parts[i]].prototype = proto;\r\n }\r\n\r\n return obj[parts[i]];\r\n };\r\n\r\n ej.util = {\r\n getNameSpace: function (className) {\r\n /// Internal function, this will create namespace for plugins using class name\r\n /// \r\n /// \r\n var splits = className.toLowerCase().split(\".\");\r\n splits[0] === \"ej\" && (splits[0] = \"e\");\r\n\r\n return splits.join(ej.consts.NamespaceJoin);\r\n },\r\n\r\n getObject: function (nameSpace, from) {\r\n if (!from || !nameSpace) return undefined;\r\n\t\t\t(typeof(nameSpace) != \"string\") && (nameSpace = JSON.stringify(nameSpace));\r\n var value = from, splits = nameSpace.split('.');\r\n\r\n for (var i = 0; i < splits.length; i++) {\r\n\r\n if (ej.util.isNullOrUndefined(value)) break;\r\n\r\n value = value[splits[i]];\r\n }\r\n\r\n return value;\r\n },\r\n\r\n createObject: function (nameSpace, value, initIn) {\r\n var splits = nameSpace.split('.'), start = initIn || window, from = start, i, t, length = splits.length;\r\n\r\n for (i = 0; i < length; i++) {\r\n t = splits[i];\r\n if (i + 1 == length)\r\n from[t] = value;\r\n else if (ej.isNullOrUndefined(from[t]))\r\n from[t] = {};\r\n\r\n from = from[t];\r\n }\r\n\r\n return start;\r\n },\r\n\r\n isNullOrUndefined: function (value) {\r\n /// Util to check null or undefined\r\n /// \r\n /// \r\n return value === undefined || value === null;\r\n },\r\n exportAll: function (action, controlIds) {\r\n var inputAttr = [], widget, locale = [], index, controlEle, controlInstance, controlObject, modelClone;\r\n var attr = { action: action, method: 'post', \"data-ajax\": \"false\" };\r\n var form = ej.buildTag('form', \"\", null, attr);\r\n if (controlIds.length != 0) {\r\n for (var i = 0; i < controlIds.length; i++) {\r\n index = i;\r\n controlEle = $(\"#\" + controlIds[i]);\r\n controlInstance = $(\"#\" + controlIds[i]).data();\r\n widget = controlInstance[\"ejWidgets\"];\r\n controlObject = $(controlEle).data(widget[0]);\r\n locale.push({ id: controlObject._id, locale: controlObject.model.locale });\r\n if (!ej.isNullOrUndefined(controlObject)) {\r\n modelClone = controlObject._getExportModel(controlObject.model);\r\n inputAttr.push({ name: widget[0], type: 'hidden', value: controlObject.stringify(modelClone) });\r\n var input = ej.buildTag('input', \"\", null, inputAttr[index]);\r\n form.append(input);\r\n }\r\n }\r\n $('body').append(form);\r\n form.submit();\r\n setTimeout(function () {\r\n var ctrlInstance, ctrlObject;\r\n if (locale.length) {\r\n for (var j = 0; j < locale.length; j++) {\r\n if (!ej.isNullOrUndefined(locale[j].locale)) {\r\n ctrlInstance = $(\"#\" + locale[j].id).data();\r\n widget = ctrlInstance[\"ejWidgets\"];\r\n ctrlObject = $(\"#\" + locale[j].id).data(widget[0]);\r\n ctrlObject.model.locale = locale[j].locale;\r\n }\r\n }\r\n }\r\n }, 0);\r\n form.remove();\r\n }\r\n return true;\r\n },\r\n print: function (element, printWin) {\r\n var $div = ej.buildTag('div')\r\n var elementClone = element.clone();\r\n $div.append(elementClone);\r\n if (!printWin)\r\n var printWin = window.open('', 'print', \"height=452,width=1024,tabbar=no\");\r\n printWin.document.write('');\r\n var links = $('head').find('link').add(\"style\");\r\n if (ej.browserInfo().name === \"msie\") {\r\n var a = \"\"\r\n links.each(function (index, obj) {\r\n if (obj.tagName == \"LINK\")\r\n $(obj).attr('href', obj.href);\r\n a += obj.outerHTML;\r\n });\r\n printWin.document.write('' + a + $div[0].innerHTML + '');\r\n }\r\n else {\r\n var a = \"\"\r\n printWin.document.write('')\r\n links.each(function (index, obj) {\r\n if (obj.tagName == \"LINK\")\r\n $(obj).attr('href', obj.href);\r\n a += obj.outerHTML;\r\n });\r\n printWin.document.writeln(a + '')\r\n printWin.document.writeln($div[0].innerHTML + '')\r\n }\r\n printWin.document.close();\r\n printWin.focus();\r\n setTimeout(function () {\r\n if (!ej.isNullOrUndefined(printWin.window)) {\r\n printWin.print();\r\n setTimeout(function () { printWin.close() }, 1000);\r\n }\r\n }, 1000);\r\n },\r\n ieClearRemover: function (element) {\r\n var searchBoxHeight = $(element).height();\r\n element.style.paddingTop = parseFloat(searchBoxHeight / 2) + \"px\";\r\n element.style.paddingBottom = parseFloat(searchBoxHeight / 2) + \"px\";\r\n element.style.height = \"1px\";\r\n element.style.lineHeight = \"1px\";\r\n },\r\n //To send ajax request\r\n sendAjaxRequest: function (ajaxOptions) {\r\n $.ajax({\r\n type: ajaxOptions.type,\r\n cache: ajaxOptions.cache,\r\n url: ajaxOptions.url,\r\n dataType: ajaxOptions.dataType,\r\n data: ajaxOptions.data,\r\n contentType: ajaxOptions.contentType,\r\n async: ajaxOptions.async,\r\n success: ajaxOptions.successHandler,\r\n error: ajaxOptions.errorHandler,\r\n beforeSend: ajaxOptions.beforeSendHandler,\r\n complete: ajaxOptions.completeHandler\r\n });\r\n },\r\n\r\n buildTag: function (tag, innerHtml, styles, attrs) {\r\n /// Helper to build jQuery element\r\n /// tagName#id.cssClass\r\n /// \r\n /// A set of key/value pairs that configure styles\r\n /// A set of key/value pairs that configure attributes\r\n /// \r\n var tagName = /^[a-z]*[0-9a-z]+/ig.exec(tag)[0];\r\n\r\n var id = /#([_a-z0-9-&@\\/\\\\,+()$~%:*?<>{}\\[\\]]+\\S)/ig.exec(tag);\r\n id = id ? id[id.length - 1].replace(/[&@\\/\\\\,+()$~%.:*?<>{}\\[\\]]/g, ''): undefined;\r\n\r\n var className = /\\.([a-z]+[-_0-9a-z ]+)/ig.exec(tag);\r\n className = className ? className[className.length - 1] : undefined;\r\n\r\n return $(document.createElement(tagName))\r\n .attr(id ? { \"id\": id } : {})\r\n .addClass(className || \"\")\r\n .css(styles || {})\r\n .attr(attrs || {})\r\n .html(innerHtml || \"\");\r\n },\r\n _preventDefaultException: function (el, exceptions) {\r\n if (el) {\r\n for (var i in exceptions) {\r\n if (exceptions[i].test(el[i])) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n\r\n //Gets the maximum z-index in the document\r\n getMaxZindex: function () {\r\n var maxZ = 1;\r\n maxZ = Math.max.apply(null, $.map($('body *'), function (e, n) {\r\n if ($(e).css('position') == 'absolute' || $(e).css('position') == 'fixed')\r\n return parseInt($(e).css('z-index')) || 1;\r\n })\r\n );\r\n if (maxZ == undefined || maxZ == null)\r\n maxZ = 1;\r\n return maxZ;\r\n },\r\n\r\n //To prevent default actions for the element\r\n blockDefaultActions: function (e) {\r\n e.cancelBubble = true;\r\n e.returnValue = false;\r\n if (e.preventDefault) e.preventDefault();\r\n if (e.stopPropagation) e.stopPropagation();\r\n },\r\n\r\n //To get dimensions of the element when its hidden\r\n getDimension: function (element, method) {\r\n var value;\r\n var $hidden = $(element).parents().andSelf().filter(':hidden');\r\n if ($hidden) {\r\n var prop = { visibility: 'hidden', display: 'block' };\r\n var tmp = [];\r\n $hidden.each(function () {\r\n var temp = {}, name;\r\n for (name in prop) {\r\n temp[name] = this.style[name];\r\n this.style[name] = prop[name];\r\n }\r\n tmp.push(temp);\r\n });\r\n value = /(outer)/g.test(method) ?\r\n $(element)[method](true) :\r\n $(element)[method]();\r\n\r\n $hidden.each(function (i) {\r\n var temp = tmp[i], name;\r\n for (name in prop) {\r\n this.style[name] = temp[name];\r\n }\r\n });\r\n }\r\n return value;\r\n },\r\n //Get triggers when transition End\r\n transitionEndEvent: function () {\r\n var transitionEnd = {\r\n '': 'transitionend',\r\n 'webkit': 'webkitTransitionEnd',\r\n 'Moz': 'transitionend',\r\n 'O': 'otransitionend',\r\n 'ms': 'MSTransitionEnd'\r\n };\r\n\r\n return transitionEnd[ej.userAgent()];\r\n },\r\n //Get triggers when transition End\r\n animationEndEvent: function () {\r\n var animationEnd = {\r\n '': 'animationend',\r\n 'webkit': 'webkitAnimationEnd',\r\n 'Moz': 'animationend',\r\n 'O': 'webkitAnimationEnd',\r\n 'ms': 'animationend'\r\n };\r\n\r\n return animationEnd[ej.userAgent()];\r\n },\r\n //To return the start event to bind for element\r\n startEvent: function () {\r\n return (ej.isTouchDevice() || $.support.hasPointer) ? \"touchstart\" : \"mousedown\";\r\n },\r\n //To return end event to bind for element\r\n endEvent: function () {\r\n return (ej.isTouchDevice() || $.support.hasPointer) ? \"touchend\" : \"mouseup\"\r\n },\r\n //To return move event to bind for element\r\n moveEvent: function () {\r\n return (ej.isTouchDevice() || $.support.hasPointer) ? ($.support.hasPointer && !ej.isMobile()) ? \"ejtouchmove\" : \"touchmove\" : \"mousemove\";\r\n },\r\n //To return cancel event to bind for element\r\n cancelEvent: function () {\r\n return (ej.isTouchDevice() || $.support.hasPointer) ? \"touchcancel\" : \"mousecancel\";\r\n },\r\n //To return tap event to bind for element\r\n tapEvent: function () {\r\n return (ej.isTouchDevice() || $.support.hasPointer) ? \"tap\" : \"click\";\r\n },\r\n //To return tap hold event to bind for element\r\n tapHoldEvent: function () {\r\n return (ej.isTouchDevice() || $.support.hasPointer) ? \"taphold\" : \"click\";\r\n },\r\n //To check whether its Device\r\n isDevice: function () {\r\n if (ej.getBooleanVal($('head'), 'data-ej-forceset', false))\r\n return ej.getBooleanVal($('head'), 'data-ej-device', this._device());\r\n else\r\n return this._device();\r\n },\r\n //To check whether its portrait or landscape mode\r\n isPortrait: function () {\r\n var elem = document.documentElement;\r\n return (elem) && ((elem.clientWidth / elem.clientHeight) < 1.1);\r\n },\r\n //To check whether its in lower resolution\r\n isLowerResolution: function () {\r\n return ((window.innerWidth <= 640 && ej.isPortrait() && ej.isDevice()) || (window.innerWidth <= 800 && !ej.isDevice()) || (window.innerWidth <= 800 && !ej.isPortrait() && ej.isWindows() && ej.isDevice()) || ej.isMobile());\r\n },\r\n //To check whether its iOS web view\r\n isIOSWebView: function () {\r\n return (/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(navigator.userAgent));\r\n },\r\n //To check whether its Android web view\r\n isAndroidWebView: function () {\r\n return (!(typeof (Android) === \"undefined\"));\r\n },\r\n //To check whether its windows web view\r\n isWindowsWebView: function () {\r\n return location.href.indexOf(\"x-wmapp\") != -1;\r\n },\r\n _device: function () {\r\n return (/Android|BlackBerry|iPhone|iPad|iPod|IEMobile|kindle|windows\\sce|palm|smartphone|iemobile|mobile|pad|xoom|sch-i800|playbook/i.test(navigator.userAgent.toLowerCase()));\r\n },\r\n //To check whether its Mobile\r\n isMobile: function () {\r\n return ((/iphone|ipod|android|blackberry|opera|mini|windows\\sce|palm|smartphone|iemobile/i.test(navigator.userAgent.toLowerCase()) && /mobile/i.test(navigator.userAgent.toLowerCase()))) || (ej.getBooleanVal($('head'), 'data-ej-mobile', false) === true);\r\n },\r\n //To check whether its Tablet\r\n isTablet: function () {\r\n return (/ipad|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase())) || (ej.getBooleanVal($('head'), 'data-ej-tablet', false) === true) || (!ej.isMobile() && ej.isDevice());\r\n },\r\n //To check whether its Touch Device\r\n isTouchDevice: function () {\r\n return (('ontouchstart' in window || (window.navigator.msPointerEnabled && ej.isMobile())) && this.isDevice());\r\n },\r\n //To get the outerHTML string for object\r\n getClearString: function (string) {\r\n return $.trim(string.replace(/\\s+/g, \" \").replace(/(\\r\\n|\\n|\\r)/gm, \"\").replace(new RegExp(\"\\>[\\n\\t ]+\\<\", \"g\"), \"><\"));\r\n },\r\n //Get the attribute value with boolean type of element\r\n getBooleanVal: function (ele, val, option) {\r\n /// Util to get the property from data attributes\r\n /// \r\n /// \r\n /// \r\n /// \r\n var value = $(ele).attr(val);\r\n if (value != null)\r\n return value.toLowerCase() == \"true\";\r\n else\r\n return option;\r\n },\r\n //Gets the Skew class based on the element current position\r\n _getSkewClass: function (item, pageX, pageY) {\r\n var itemwidth = item.width();\r\n var itemheight = item.height();\r\n var leftOffset = item.offset().left;\r\n var rightOffset = item.offset().left + itemwidth;\r\n var topOffset = item.offset().top;\r\n var bottomOffset = item.offset().top + itemheight;\r\n var widthoffset = itemwidth * 0.3;\r\n var heightoffset = itemheight * 0.3;\r\n if (pageX < leftOffset + widthoffset && pageY < topOffset + heightoffset)\r\n return \"e-m-skew-topleft\";\r\n if (pageX > rightOffset - widthoffset && pageY < topOffset + heightoffset)\r\n return \"e-m-skew-topright\";\r\n if (pageX > rightOffset - widthoffset && pageY > bottomOffset - heightoffset)\r\n return \"e-m-skew-bottomright\";\r\n if (pageX < leftOffset + widthoffset && pageY > bottomOffset - heightoffset)\r\n return \"e-m-skew-bottomleft\";\r\n if (pageX > leftOffset + widthoffset && pageY < topOffset + heightoffset && pageX < rightOffset - widthoffset)\r\n return \"e-m-skew-top\";\r\n if (pageX < leftOffset + widthoffset)\r\n return \"e-m-skew-left\";\r\n if (pageX > rightOffset - widthoffset)\r\n return \"e-m-skew-right\";\r\n if (pageY > bottomOffset - heightoffset)\r\n return \"e-m-skew-bottom\";\r\n return \"e-m-skew-center\";\r\n },\r\n //Removes the added Skew class on the element\r\n _removeSkewClass: function (element) {\r\n $(element).removeClass(\"e-m-skew-top e-m-skew-bottom e-m-skew-left e-m-skew-right e-m-skew-topleft e-m-skew-topright e-m-skew-bottomleft e-m-skew-bottomright e-m-skew-center e-skew-top e-skew-bottom e-skew-left e-skew-right e-skew-topleft e-skew-topright e-skew-bottomleft e-skew-bottomright e-skew-center\");\r\n },\r\n //Object.keys method to support all the browser including IE8.\r\n _getObjectKeys: function (obj) {\r\n var i, keys = [];\r\n obj = Object.prototype.toString.call(obj) === Object.prototype.toString() ? obj : {};\r\n if (!Object.keys) {\r\n for (i in obj) {\r\n if (obj.hasOwnProperty(i))\r\n keys.push(i);\r\n }\r\n return keys;\r\n }\r\n if (Object.keys)\r\n return Object.keys(obj);\r\n },\r\n _touchStartPoints: function (evt, object) {\r\n if (evt) {\r\n var point = evt.touches ? evt.touches[0] : evt;\r\n object._distX = 0;\r\n object._distY = 0;\r\n object._moved = false;\r\n object._pointX = point.pageX;\r\n object._pointY = point.pageY;\r\n }\r\n },\r\n _isTouchMoved: function (evt, object) {\r\n if (evt) {\r\n var point = evt.touches ? evt.touches[0] : evt,\r\n deltaX = point.pageX - object._pointX,\r\n deltaY = point.pageY - object._pointY,\r\n timestamp = Date.now(),\r\n newX, newY,\r\n absDistX, absDistY;\r\n object._pointX = point.pageX;\r\n object._pointY = point.pageY;\r\n object._distX += deltaX;\r\n object._distY += deltaY;\r\n absDistX = Math.abs(object._distX);\r\n absDistY = Math.abs(object._distY);\r\n return !(absDistX < 5 && absDistY < 5);\r\n }\r\n },\r\n //To bind events for element\r\n listenEvents: function (selectors, eventTypes, handlers, remove, pluginObj, disableMouse) {\r\n for (var i = 0; i < selectors.length; i++) {\r\n ej.listenTouchEvent(selectors[i], eventTypes[i], handlers[i], remove, pluginObj, disableMouse);\r\n }\r\n },\r\n //To bind touch events for element\r\n listenTouchEvent: function (selector, eventType, handler, remove, pluginObj, disableMouse) {\r\n var event = remove ? \"removeEventListener\" : \"addEventListener\";\r\n var jqueryEvent = remove ? \"off\" : \"on\";\r\n var elements = $(selector);\r\n for (var i = 0; i < elements.length; i++) {\r\n var element = elements[i];\r\n switch (eventType) {\r\n case \"touchstart\":\r\n ej._bindEvent(element, event, eventType, handler, \"mousedown\", \"MSPointerDown\", \"pointerdown\", disableMouse);\r\n break;\r\n case \"touchmove\":\r\n ej._bindEvent(element, event, eventType, handler, \"mousemove\", \"MSPointerMove\", \"pointermove\", disableMouse);\r\n break;\r\n case \"touchend\":\r\n ej._bindEvent(element, event, eventType, handler, \"mouseup\", \"MSPointerUp\", \"pointerup\", disableMouse);\r\n break;\r\n case \"touchcancel\":\r\n ej._bindEvent(element, event, eventType, handler, \"mousecancel\", \"MSPointerCancel\", \"pointercancel\", disableMouse);\r\n break;\r\n case \"tap\": case \"taphold\": case \"ejtouchmove\": case \"click\":\r\n $(element)[jqueryEvent](eventType, handler);\r\n break;\r\n default:\r\n if (ej.browserInfo().name == \"msie\" && ej.browserInfo().version < 9)\r\n pluginObj[\"_on\"]($(element), eventType, handler);\r\n else\r\n element[event](eventType, handler, true);\r\n break;\r\n }\r\n }\r\n },\r\n //To bind events for element\r\n _bindEvent: function (element, event, eventType, handler, mouseEvent, pointerEvent, ie11pointerEvent, disableMouse) {\r\n if ($.support.hasPointer)\r\n element[event](window.navigator.pointerEnabled ? ie11pointerEvent : pointerEvent, handler, true);\r\n else\r\n element[event](eventType, handler, true);\r\n },\r\n _browser: function () {\r\n return (/webkit/i).test(navigator.appVersion) ? 'webkit' : (/firefox/i).test(navigator.userAgent) ? 'Moz' : (/trident/i).test(navigator.userAgent) ? 'ms' : 'opera' in window ? 'O' : '';\r\n },\r\n styles: document.createElement('div').style,\r\n /**\r\n * To get the userAgent Name \r\n * @example \r\n * <script>\r\n * ej.userAgent();//return user agent name\r\n * </script> \r\n * @memberof AppView\r\n * @instance\r\n */\r\n userAgent: function () {\r\n var agents = 'webkitT,t,MozT,msT,OT'.split(','),\r\n t,\r\n i = 0,\r\n l = agents.length;\r\n\r\n for (; i < l; i++) {\r\n t = agents[i] + 'ransform';\r\n if (t in ej.styles) {\r\n return agents[i].substr(0, agents[i].length - 1);\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n addPrefix: function (style) {\r\n if (ej.userAgent() === '') return style;\r\n\r\n style = style.charAt(0).toUpperCase() + style.substr(1);\r\n return ej.userAgent() + style;\r\n },\r\n //To Prevent Default Exception\r\n\r\n //To destroy the mobile widgets\r\n destroyWidgets: function (element) {\r\n var dataEl = $(element).find(\"[data-role *= ejm]\");\r\n dataEl.each(function (index, element) {\r\n var $element = $(element);\r\n var plugin = $element.data(\"ejWidgets\");\r\n if (plugin)\r\n $element[plugin](\"destroy\");\r\n });\r\n },\r\n //Get the attribute value of element\r\n getAttrVal: function (ele, val, option) {\r\n /// Util to get the property from data attributes\r\n /// \r\n /// \r\n /// \r\n /// \r\n var value = $(ele).attr(val);\r\n if (value != null)\r\n return value;\r\n else\r\n return option;\r\n },\r\n\r\n // Get the offset value of element\r\n getOffset: function (ele) {\r\n var pos = {};\r\n var offsetObj = ele.offset() || { left: 0, top: 0 };\r\n $.extend(true, pos, offsetObj);\r\n if ($(\"body\").css(\"position\") != \"static\") {\r\n var bodyPos = $(\"body\").offset();\r\n pos.left -= bodyPos.left;\r\n pos.top -= bodyPos.top;\r\n }\r\n return pos;\r\n },\r\n\r\n // Z-index calculation for the element\r\n getZindexPartial: function (element, popupEle) {\r\n if (!ej.isNullOrUndefined(element) && element.length > 0) {\r\n var parents = element.parents(), bodyEle;\r\n bodyEle = $('body').children();\r\n if (!ej.isNullOrUndefined(element) && element.length > 0)\r\n bodyEle.splice(bodyEle.index(popupEle), 1);\r\n $(bodyEle).each(function (i, ele) { parents.push(ele); });\r\n\r\n var maxZ = Math.max.apply(maxZ, $.map(parents, function (e, n) {\r\n if ($(e).css('position') != 'static') return parseInt($(e).css('z-index')) || 1;\r\n }));\r\n if (!maxZ || maxZ < 10000) maxZ = 10000;\r\n else maxZ += 1;\r\n return maxZ;\r\n }\r\n },\r\n\r\n isValidAttr: function (element, attribute) {\r\n var element = $(element)[0];\r\n if (typeof element[attribute] != \"undefined\")\r\n return true;\r\n else {\r\n var _isValid = false;\r\n $.each(element, function (key) {\r\n if (key.toLowerCase() == attribute.toLowerCase()) {\r\n _isValid = true;\r\n return false;\r\n }\r\n });\r\n }\r\n return _isValid;\r\n }\r\n\r\n };\r\n\r\n $.extend(ej, ej.util);\r\n\r\n // base class for all ej widgets. It will automatically inhertied\r\n ej.widgetBase = {\r\n droppables: { 'default': [] },\r\n resizables: { 'default': [] },\r\n\r\n _renderEjTemplate: function (selector, data, index, prop, ngTemplateType) {\r\n var type = null;\r\n if (typeof selector === \"object\" || selector.startsWith(\"#\") || selector.startsWith(\".\"))\r\n type = $(selector).attr(\"type\");\r\n if (type) {\r\n type = type.toLowerCase();\r\n if (ej.template[type])\r\n return ej.template[type](this, selector, data, index, prop);\r\n }\r\n // For ejGrid Angular2 Template Support\r\n else if (!ej.isNullOrUndefined(ngTemplateType))\r\n return ej.template['text/x-'+ ngTemplateType](this, selector, data, index, prop);\r\n return ej.template.render(this, selector, data, index, prop);\r\n },\r\n\r\n destroy: function () {\r\n\r\n if (this._trigger(\"destroy\"))\r\n return;\r\n\r\n if (this.model.enablePersistence) {\r\n this.persistState();\r\n $(window).off(\"unload\", this._persistHandler);\r\n }\r\n\r\n try {\r\n this._destroy();\r\n } catch (e) { }\r\n\r\n var arr = this.element.data(\"ejWidgets\") || [];\r\n for (var i = 0; i < arr.length; i++) {\r\n if (arr[i] == this.pluginName) {\r\n arr.splice(i, 1);\r\n }\r\n }\r\n if (!arr.length)\r\n this.element.removeData(\"ejWidgets\");\r\n\r\n while (this._events) {\r\n var item = this._events.pop(), args = [];\r\n\r\n if (!item)\r\n break;\r\n\r\n for (var i = 0; i < item[1].length; i++)\r\n if (!$.isPlainObject(item[1][i]))\r\n args.push(item[1][i]);\r\n\r\n $.fn.off.apply(item[0], args);\r\n }\r\n\r\n this._events = null;\r\n\r\n this.element\r\n .removeClass(ej.util.getNameSpace(this.sfType))\r\n .removeClass(\"e-js\")\r\n .removeData(this.pluginName);\r\n\r\n this.element = null;\r\n this.model = null;\r\n },\r\n\r\n _on: function (element) {\r\n if (!this._events)\r\n this._events = [];\r\n var args = [].splice.call(arguments, 1, arguments.length - 1);\r\n\r\n var handler = {}, i = args.length;\r\n while (handler && typeof handler !== \"function\") {\r\n handler = args[--i];\r\n }\r\n\r\n args[i] = ej.proxy(args[i], this);\r\n\r\n this._events.push([element, args, handler, args[i]]);\r\n\r\n $.fn.on.apply(element, args);\r\n\r\n return this;\r\n },\r\n\r\n _off: function (element, eventName, selector, handlerObject) {\r\n var e = this._events, temp;\r\n if (!e || !e.length)\r\n return this;\r\n if (typeof selector == \"function\") {\r\n temp = handlerObject;\r\n handlerObject = selector;\r\n selector = temp;\r\n }\r\n var t = (eventName.match(/\\S+/g) || [\"\"]);\r\n for (var i = 0; i < e.length; i++) {\r\n var arg = e[i],\r\n r = arg[0].length && (!handlerObject || arg[2] === handlerObject) && (arg[1][0] === eventName || t[0]) && (!selector || arg[1][1] === selector) && $.inArray(element[0], arg[0]) > -1;\r\n if (r) {\r\n $.fn.off.apply(element, handlerObject ? [eventName, selector, arg[3]] : [eventName, selector]);\r\n e.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n return this;\r\n },\r\n\r\n // Client side events wire-up / trigger helper.\r\n _trigger: function (eventName, eventProp) {\r\n var fn = null, returnValue, args, clientProp = {};\r\n $.extend(clientProp, eventProp)\r\n\r\n if (eventName in this.model)\r\n fn = this.model[eventName];\r\n\r\n if (fn) {\r\n if (typeof fn === \"string\") {\r\n fn = ej.util.getObject(fn, window);\r\n }\r\n\r\n if ($.isFunction(fn)) {\r\n\r\n args = ej.event(eventName, this.model, eventProp);\r\n\r\n var scopeFn = this.model[\"_applyScope\"];\r\n\r\n returnValue = fn.call(this, args);\r\n\r\n scopeFn && scopeFn.call();\r\n\r\n // sending changes back - deep copy option should not be enabled for this $.extend \r\n if (eventProp) $.extend(eventProp, args);\r\n\r\n if (args.cancel || !ej.isNullOrUndefined(returnValue))\r\n return returnValue === false || args.cancel;\r\n }\r\n }\r\n\r\n var isPropDefined = Boolean(eventProp);\r\n eventProp = eventProp || {};\r\n eventProp.originalEventType = eventName;\r\n eventProp.type = this.pluginName + eventName;\r\n\r\n args = $.Event(eventProp.type, ej.event(eventProp.type, this.model, eventProp));\r\n\r\n this.element && this.element.trigger(args);\r\n\r\n // sending changes back - deep copy option should not be enabled for this $.extend \r\n if (isPropDefined) $.extend(eventProp, args);\r\n\r\n if (ej.isOnWebForms && args.cancel == false && this.model.serverEvents && this.model.serverEvents.length)\r\n ej.raiseWebFormsServerEvents(eventName, eventProp, clientProp);\r\n\r\n return args.cancel;\r\n },\r\n\r\n setModel: function (options, forceSet) {\r\n // check for whether to apply values are not. if _setModel function is defined in child,\r\n // this will call that function and validate it using return value\r\n\r\n if (this._trigger(\"modelChange\", { \"changes\": options }))\r\n return;\r\n\r\n for (var prop in options) {\r\n if (!forceSet) {\r\n if (this.model[prop] === options[prop]) {\r\n delete options[prop];\r\n continue;\r\n }\r\n if ($.isPlainObject(options[prop])) {\r\n iterateAndRemoveProps(this.model[prop], options[prop]);\r\n if ($.isEmptyObject(options[prop])) {\r\n delete options[prop];\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n if (this.dataTypes) {\r\n var returnValue = this._isValidModelValue(prop, this.dataTypes, options);\r\n if (returnValue !== true)\r\n throw \"setModel - Invalid input for property :\" + prop + \" - \" + returnValue;\r\n }\r\n if (this.model.notifyOnEachPropertyChanges && this.model[prop] !== options[prop]) {\r\n var arg = {\r\n oldValue: this.model[prop],\r\n newValue: options[prop]\r\n };\r\n\r\n options[prop] = this._trigger(prop + \"Change\", arg) ? this.model[prop] : arg.newValue;\r\n }\r\n }\r\n if ($.isEmptyObject(options))\r\n return;\r\n\r\n if (this._setFirst) {\r\n var ds = options.dataSource;\r\n if (ds) delete options.dataSource;\r\n\r\n $.extend(true, this.model, options);\r\n if (ds) {\r\n this.model.dataSource = (ds instanceof Array) ? ds.slice() : ds;\r\n options[\"dataSource\"] = this.model.dataSource;\r\n }\r\n !this._setModel || this._setModel(options);\r\n\r\n } else if (!this._setModel || this._setModel(options) !== false) {\r\n $.extend(true, this.model, options);\r\n }\r\n if (\"enablePersistence\" in options) {\r\n this._setState(options.enablePersistence);\r\n }\r\n },\r\n option: function (prop, value, forceSet) {\r\n if (!prop)\r\n return this.model;\r\n\r\n if ($.isPlainObject(prop))\r\n return this.setModel(prop, forceSet);\r\n\r\n if (typeof prop === \"string\") {\r\n prop = prop.replace(/^model\\./, \"\");\r\n var oldValue = ej.getObject(prop, this.model);\r\n\r\n if (value === undefined && !forceSet)\r\n return oldValue;\r\n\r\n if (prop === \"enablePersistence\")\r\n return this._setState(value);\r\n\r\n if (forceSet && value === ej.extensions.modelGUID) {\r\n return this._setModel(ej.createObject(prop, ej.getObject(prop, this.model), {}));\r\n }\r\n\r\n if (forceSet || ej.getObject(prop, this.model) !== value)\r\n return this.setModel(ej.createObject(prop, value, {}), forceSet);\r\n }\r\n return undefined;\r\n },\r\n\r\n _isValidModelValue: function (prop, types, options) {\r\n var value = types[prop], option = options[prop], returnValue;\r\n\r\n if (!value)\r\n return true;\r\n\r\n if (typeof value === \"string\") {\r\n if (value == \"enum\") {\r\n options[prop] = option ? option.toString().toLowerCase() : option;\r\n value = \"string\";\r\n }\r\n\r\n if (value === \"array\") {\r\n if (Object.prototype.toString.call(option) === '[object Array]')\r\n return true;\r\n }\r\n else if (value === \"data\") {\r\n return true;\r\n }\r\n else if (value === \"parent\") {\r\n return true;\r\n }\r\n else if (typeof option === value)\r\n return true;\r\n\r\n return \"Expected type - \" + value;\r\n }\r\n\r\n if (option instanceof Array) {\r\n for (var i = 0; i < option.length; i++) {\r\n returnValue = this._isValidModelValue(prop, types, option[i]);\r\n if (returnValue !== true) {\r\n return \" [\" + i + \"] - \" + returnValue;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n for (var innerProp in option) {\r\n returnValue = this._isValidModelValue(innerProp, value, option);\r\n if (returnValue !== true)\r\n return innerProp + \" : \" + returnValue;\r\n }\r\n\r\n return true;\r\n },\r\n\r\n _returnFn: function (obj, propName) {\r\n if (propName.indexOf('.') != -1) {\r\n this._returnFn(obj[propName.split('.')[0]], propName.split('.').slice(1).join('.'));\r\n }\r\n else\r\n obj[propName] = obj[propName].call(obj.propName);\r\n },\r\n\r\n _removeCircularRef: function (obj) {\r\n var seen = [];\r\n function detect(obj, key, parent) {\r\n if (typeof obj != 'object') { return; }\r\n if (!Array.prototype.indexOf) {\r\n Array.prototype.indexOf = function (val) {\r\n return jQuery.inArray(val, this);\r\n };\r\n }\r\n if (seen.indexOf(obj) >= 0) {\r\n delete parent[key];\r\n return;\r\n }\r\n seen.push(obj);\r\n for (var k in obj) { //dive on the object's children\r\n if (obj.hasOwnProperty(k)) { detect(obj[k], k, obj); }\r\n }\r\n seen.pop();\r\n return;\r\n }\r\n detect(obj, 'obj', null);\r\n return obj;\r\n },\r\n\r\n stringify: function (model, removeCircular) {\r\n var observables = this.observables;\r\n for (var k = 0; k < observables.length; k++) {\r\n var val = ej.getObject(observables[k], model);\r\n if (!ej.isNullOrUndefined(val) && typeof (val) === \"function\")\r\n this._returnFn(model, observables[k]);\r\n }\r\n if (removeCircular) model = this._removeCircularRef(model);\r\n return JSON.stringify(model);\r\n },\r\n\r\n _setState: function (val) {\r\n if (val === true) {\r\n this._persistHandler = ej.proxy(this.persistState, this);\r\n $(window).on(\"unload\", this._persistHandler);\r\n } else {\r\n this.deleteState();\r\n $(window).off(\"unload\", this._persistHandler);\r\n }\r\n },\r\n\r\n _removeProp: function (obj, propName) {\r\n if (!ej.isNullOrUndefined(obj)) {\r\n if (propName.indexOf('.') != -1) {\r\n this._removeProp(obj[propName.split('.')[0]], propName.split('.').slice(1).join('.'));\r\n }\r\n else\r\n delete obj[propName];\r\n }\r\n },\r\n\r\n persistState: function () {\r\n var model;\r\n\r\n if (this._ignoreOnPersist) {\r\n model = copyObject({}, this.model);\r\n for (var i = 0; i < this._ignoreOnPersist.length; i++) {\r\n this._removeProp(model, this._ignoreOnPersist[i]);\r\n }\r\n model.ignoreOnPersist = this._ignoreOnPersist;\r\n } else if (this._addToPersist) {\r\n model = {};\r\n for (var i = 0; i < this._addToPersist.length; i++) {\r\n ej.createObject(this._addToPersist[i], ej.getObject(this._addToPersist[i], this.model), model);\r\n }\r\n model.addToPersist = this._addToPersist;\r\n } else {\r\n model = copyObject({}, this.model);\r\n }\r\n\r\n if (this._persistState) {\r\n model.customPersists = {};\r\n this._persistState(model.customPersists);\r\n }\r\n\r\n if (window.localStorage) {\r\n if (!ej.isNullOrUndefined(ej.persistStateVersion) && window.localStorage.getItem(\"persistKey\") == null)\r\n window.localStorage.setItem(\"persistKey\", ej.persistStateVersion);\r\n window.localStorage.setItem(\"$ej$\" + this.pluginName + this._id, JSON.stringify(model));\r\n }\r\n else if (document.cookie) {\r\n if (!ej.isNullOrUndefined(ej.persistStateVersion) && ej.cookie.get(\"persistKey\") == null)\r\n ej.cookie.set(\"persistKey\", ej.persistStateVersion);\r\n ej.cookie.set(\"$ej$\" + this.pluginName + this._id, model);\r\n }\r\n },\r\n\r\n deleteState: function () {\r\n if (window.localStorage)\r\n window.localStorage.removeItem(\"$ej$\" + this.pluginName + this._id);\r\n else if (document.cookie)\r\n ej.cookie.set(\"$ej$\" + this.pluginName + this._id, model, new Date());\r\n },\r\n\r\n restoreState: function (silent) {\r\n var value = null;\r\n if (window.localStorage)\r\n value = window.localStorage.getItem(\"$ej$\" + this.pluginName + this._id);\r\n else if (document.cookie)\r\n value = ej.cookie.get(\"$ej$\" + this.pluginName + this._id);\r\n\r\n if (value) {\r\n var model = JSON.parse(value);\r\n\r\n if (this._restoreState) {\r\n this._restoreState(model.customPersists);\r\n delete model.customPersists;\r\n }\r\n\r\n if (ej.isNullOrUndefined(model) === false)\r\n if (!ej.isNullOrUndefined(model.ignoreOnPersist)) {\r\n this._ignoreOnPersist = model.ignoreOnPersist;\r\n delete model.ignoreOnPersist;\r\n } else if (!ej.isNullOrUndefined(model.addToPersist)) {\r\n this._addToPersist = model.addToPersist;\r\n delete model.addToPersist;\r\n }\r\n }\r\n if (!ej.isNullOrUndefined(model) && !ej.isNullOrUndefined(this._ignoreOnPersist)) {\r\n for (var i in this._ignoreOnPersist) {\r\n if (this._ignoreOnPersist[i].indexOf('.') !== -1)\r\n ej.createObject(this._ignoreOnPersist[i], ej.getObject(this._ignoreOnPersist[i], this.model), model);\r\n else\r\n model[this._ignoreOnPersist[i]] = this.model[this._ignoreOnPersist[i]];\r\n }\r\n this.model = model;\r\n }\r\n else\r\n this.model = $.extend(true, this.model, model);\r\n\r\n if (!silent && value && this._setModel)\r\n this._setModel(this.model);\r\n },\r\n\r\n //to prevent persistence\r\n ignoreOnPersist: function (properties) {\r\n var collection = [];\r\n if (typeof (properties) == \"object\")\r\n collection = properties;\r\n else if (typeof (properties) == 'string')\r\n collection.push(properties);\r\n if (this._addToPersist === undefined) {\r\n this._ignoreOnPersist = this._ignoreOnPersist || [];\r\n for (var i = 0; i < collection.length; i++) {\r\n this._ignoreOnPersist.push(collection[i]);\r\n }\r\n } else {\r\n for (var i = 0; i < collection.length; i++) {\r\n var index = this._addToPersist.indexOf(collection[i]);\r\n this._addToPersist.splice(index, 1);\r\n }\r\n }\r\n },\r\n\r\n //to maintain persistence\r\n addToPersist: function (properties) {\r\n var collection = [];\r\n if (typeof (properties) == \"object\")\r\n collection = properties;\r\n else if (typeof (properties) == 'string')\r\n collection.push(properties);\r\n if (this._addToPersist === undefined) {\r\n this._ignoreOnPersist = this._ignoreOnPersist || [];\r\n for (var i = 0; i < collection.length; i++) {\r\n var index = this._ignoreOnPersist.indexOf(collection[i]);\r\n this._ignoreOnPersist.splice(index, 1);\r\n }\r\n } else {\r\n for (var i = 0; i < collection.length; i++) {\r\n if ($.inArray(collection[i], this._addToPersist) === -1)\r\n this._addToPersist.push(collection[i]);\r\n }\r\n }\r\n },\r\n\r\n // Get formatted text \r\n formatting: function (formatstring, str, locale) {\r\n formatstring = formatstring.replace(/%280/g, \"\\\"\").replace(/</g, \"<\").replace(/>/g, \">\");\r\n locale = ej.preferredCulture(locale) ? locale : \"en-US\";\r\n var s = formatstring;\r\n var frontHtmlidx, FrontHtml, RearHtml, lastidxval;\r\n frontHtmlidx = formatstring.split(\"{0:\");\r\n lastidxval = formatstring.split(\"}\");\r\n FrontHtml = frontHtmlidx[0];\r\n RearHtml = lastidxval[1];\r\n if (typeof (str) == \"string\" && $.isNumeric(str))\r\n str = Number(str);\r\n if (formatstring.indexOf(\"{0:\") != -1) {\r\n var toformat = new RegExp(\"\\\\{0(:([^\\\\}]+))?\\\\}\", \"gm\");\r\n var formatVal = toformat.exec(formatstring);\r\n if (formatVal != null && str != null) {\r\n if (FrontHtml != null && RearHtml != null)\r\n str = FrontHtml + ej.format(str, formatVal[2], locale) + RearHtml;\r\n else\r\n str = ej.format(str, formatVal[2], locale);\r\n } else if (str != null)\r\n str = str;\r\n else\r\n str = \"\";\r\n return str;\r\n } else if (s.startsWith(\"{\") && !s.startsWith(\"{0:\")) {\r\n var fVal = s.split(\"\"), str = (str || \"\") + \"\", strSplt = str.split(\"\"), formats = /[0aA\\*CN<>\\?]/gm;\r\n for (var f = 0, f, val = 0; f < fVal.length; f++)\r\n fVal[f] = formats.test(fVal[f]) ? \"{\" + val++ + \"}\" : fVal[f];\r\n return String.format.apply(String, [fVal.join(\"\")].concat(strSplt)).replace('{', '').replace('}', '');\r\n } else if (this.data != null && this.data.Value == null) {\r\n $.each(this.data, function (dataIndex, dataValue) {\r\n s = s.replace(new RegExp('\\\\{' + dataIndex + '\\\\}', 'gm'), dataValue);\r\n });\r\n return s;\r\n } else {\r\n return this.data.Value;\r\n }\r\n },\r\n };\r\n\r\n ej.WidgetBase = function () {\r\n }\r\n\r\n var iterateAndRemoveProps = function (source, target) {\r\n for (var prop in source) {\r\n if (source[prop] === target[prop])\r\n delete target[prop];\r\n if ($.isPlainObject(target[prop]) && $.isPlainObject(source[prop]))\r\n iterateAndRemoveProps(source[prop], target[prop]);\r\n }\r\n }\r\n\r\n ej.widget = function (pluginName, className, proto) {\r\n /// Widget helper for developers, this set have predefined function to jQuery plug-ins\r\n /// the plugin name that will be added in jquery.fn\r\n /// the class name for your plugin, this will help create default cssClas\r\n /// prototype for of the plug-in\r\n\r\n if (typeof pluginName === \"object\") {\r\n proto = className;\r\n for (var prop in pluginName) {\r\n var name = pluginName[prop];\r\n\r\n if (name instanceof Array) {\r\n proto._rootCSS = name[1];\r\n name = name[0];\r\n }\r\n\r\n ej.widget(prop, name, proto);\r\n\r\n if (pluginName[prop] instanceof Array)\r\n proto._rootCSS = \"\";\r\n }\r\n\r\n return;\r\n }\r\n\r\n var nameSpace = proto._rootCSS || ej.getNameSpace(className);\r\n\r\n proto = ej.defineClass(className, function (element, options) {\r\n\r\n this.sfType = className;\r\n this.pluginName = pluginName;\r\n this.instance = pInstance;\r\n\r\n if (ej.isNullOrUndefined(this._setFirst))\r\n this._setFirst = true;\r\n\r\n this[\"ob.values\"] = {};\r\n\r\n $.extend(this, ej.widgetBase);\r\n\r\n if (this.dataTypes) {\r\n for (var property in options) {\r\n var returnValue = this._isValidModelValue(property, this.dataTypes, options);\r\n if (returnValue !== true)\r\n throw \"setModel - Invalid input for property :\" + property + \" - \" + returnValue;\r\n }\r\n }\r\n\r\n var arr = (element.data(\"ejWidgets\") || []);\r\n arr.push(pluginName);\r\n element.data(\"ejWidgets\", arr);\r\n\r\n for (var i = 0; ej.widget.observables && this.observables && i < this.observables.length; i++) {\r\n var t = ej.getObject(this.observables[i], options);\r\n if (t) ej.createObject(this.observables[i], ej.widget.observables.register(t, this.observables[i], this, element), options);\r\n }\r\n\r\n this.element = element.jquery ? element : $(element);\r\n this.model = copyObject(true, {}, proto.prototype.defaults, options);\r\n this.model.keyConfigs = copyObject(this.keyConfigs);\r\n\r\n this.element.addClass(nameSpace + \" e-js\").data(pluginName, this);\r\n\r\n this._id = element[0].id;\r\n\r\n if (this.model.enablePersistence) {\r\n if (window.localStorage && !ej.isNullOrUndefined(ej.persistStateVersion) && window.localStorage.getItem(\"persistKey\") != ej.persistStateVersion) {\r\n for (var i in window.localStorage) {\r\n if (i.indexOf(\"$ej$\") != -1) {\r\n window.localStorage.removeItem(i); //removing the previously stored plugin item from local storage\r\n\t\t\t\t\t\t\twindow.localStorage.setItem(\"persistKey\", ej.persistStateVersion);\r\n\t\t\t\t\t\t}\t\t\t\t\r\n }\r\n }\r\n else if (document.cookie && !ej.isNullOrUndefined(ej.persistStateVersion) && ej.cookie.get(\"persistKey\") != ej.persistStateVersion) {\r\n var splits = document.cookie.split(/; */);\r\n for (var k in splits) {\r\n if (k.indexOf(\"$ej$\") != -1) {\r\n ej.cookie.set(k.split(\"=\")[0], model, new Date()); //removing the previously stored plugin item from local storage\r\n\t\t\t\t\t\t\tej.cookie.set(\"persistKey\", ej.persistStateVersion);\r\n\t\t\t\t\t\t}\t\t\r\n }\r\n }\r\n this._persistHandler = ej.proxy(this.persistState, this);\r\n $(window).on(\"unload\", this._persistHandler);\r\n this.restoreState(true);\r\n }\r\n\r\n this._init(options);\r\n\r\n if (typeof this.model.keyConfigs === \"object\" && !(this.model.keyConfigs instanceof Array)) {\r\n var requiresEvt = false;\r\n if (this.model.keyConfigs.focus)\r\n this.element.attr(\"accesskey\", this.model.keyConfigs.focus);\r\n\r\n for (var keyProps in this.model.keyConfigs) {\r\n if (keyProps !== \"focus\") {\r\n requiresEvt = true;\r\n break;\r\n }\r\n }\r\n\r\n if (requiresEvt && this._keyPressed) {\r\n var el = element, evt = \"keydown\";\r\n\r\n if (this.keySettings) {\r\n el = this.keySettings.getElement ? this.keySettings.getElement() || el : el;\r\n evt = this.keySettings.event || evt;\r\n }\r\n\r\n this._on(el, evt, function (e) {\r\n if (!this.model.keyConfigs) return;\r\n\r\n var action = keyFn.getActionFromCode(this.model.keyConfigs, e.which, e.ctrlKey, e.shiftKey, e.altKey);\r\n var arg = {\r\n code: e.which,\r\n ctrl: e.ctrlKey,\r\n alt: e.altKey,\r\n shift: e.shiftKey\r\n };\r\n if (!action) return;\r\n\r\n if (this._keyPressed(action, e.target, arg, e) === false)\r\n e.preventDefault();\r\n });\r\n }\r\n }\r\n this._trigger(\"create\");\r\n }, proto);\r\n\r\n $.fn[pluginName] = function (options) {\r\n var opt = options, args;\r\n for (var i = 0; i < this.length; i++) {\r\n\r\n var $this = $(this[i]),\r\n pluginObj = $this.data(pluginName),\r\n isAlreadyExists = pluginObj && $this.hasClass(nameSpace),\r\n obj = null;\r\n\r\n if (this.length > 0 && $.isPlainObject(opt))\r\n options = ej.copyObject({}, opt);\r\n\r\n // ----- plug-in creation/init\r\n if (!isAlreadyExists) {\r\n if (proto.prototype._requiresID === true && !$(this[i]).attr(\"id\")) {\r\n $this.attr(\"id\", getUid(\"ejControl_\"));\r\n }\r\n if (!options || typeof options === \"object\") {\r\n if (proto.prototype.defaults && !ej.isNullOrUndefined(ej.setCulture) && \"locale\" in proto.prototype.defaults && pluginName != \"ejChart\") {\r\n if (options && !(\"locale\" in options)) options.locale = ej.setCulture().name;\r\n else if (ej.isNullOrUndefined(options)) {\r\n options = {}; options.locale = ej.setCulture().name;\r\n }\r\n }\r\n new proto($this, options);\r\n }\r\n else {\r\n throwError(pluginName + \": methods/properties can be accessed only after plugin creation\");\r\n }\r\n continue;\r\n }\r\n\r\n if (!options) continue;\r\n\r\n args = [].slice.call(arguments, 1);\r\n\r\n if (this.length > 0 && args[0] && opt === \"option\" && $.isPlainObject(args[0])) {\r\n args[0] = ej.copyObject({}, args[0]);\r\n }\r\n\r\n // --- Function/property set/access\r\n if ($.isPlainObject(options)) {\r\n // setModel using JSON object\r\n pluginObj.setModel(options);\r\n }\r\n\r\n // function/property name starts with \"_\" is private so ignore it.\r\n else if (options.indexOf('_') !== 0\r\n && !ej.isNullOrUndefined(obj = ej.getObject(options, pluginObj))\r\n || options.indexOf(\"model.\") === 0) {\r\n\r\n if (!obj || !$.isFunction(obj)) {\r\n\r\n // if property is accessed, then break the jquery chain\r\n if (arguments.length == 1)\r\n return obj;\r\n\r\n //setModel using string input\r\n pluginObj.option(options, arguments[1]);\r\n\r\n continue;\r\n }\r\n\r\n var value = obj.apply(pluginObj, args);\r\n\r\n // If function call returns any value, then break the jquery chain\r\n if (value !== undefined)\r\n return value;\r\n\r\n } else {\r\n throwError(className + \": function/property - \" + options + \" does not exist\");\r\n }\r\n }\r\n if (pluginName.indexOf(\"ejm\") != -1)\r\n ej.widget.registerInstance($this, pluginName, className, proto.prototype);\r\n // maintaining jquery chain\r\n return this;\r\n };\r\n\r\n ej.widget.register(pluginName, className, proto.prototype);\r\n ej.loadLocale(pluginName);\r\n };\r\n\r\n ej.loadLocale = function (pluginName) {\r\n var i, len, locales = ej.locales;\r\n for (i = 0, len = locales.length; i < len; i++)\r\n $.fn[\"Locale_\" + locales[i]](pluginName);\r\n };\r\n\r\n\r\n $.extend(ej.widget, (function () {\r\n var _widgets = {}, _registeredInstances = [],\r\n\r\n register = function (pluginName, className, prototype) {\r\n if (!ej.isNullOrUndefined(_widgets[pluginName]))\r\n throwError(\"ej.widget : The widget named \" + pluginName + \" is trying to register twice.\");\r\n\r\n _widgets[pluginName] = { name: pluginName, className: className, proto: prototype };\r\n\r\n ej.widget.extensions && ej.widget.extensions.registerWidget(pluginName);\r\n },\r\n registerInstance = function (element, pluginName, className, prototype) {\r\n _registeredInstances.push({ element: element, pluginName: pluginName, className: className, proto: prototype });\r\n }\r\n\r\n return {\r\n register: register,\r\n registerInstance: registerInstance,\r\n registeredWidgets: _widgets,\r\n registeredInstances: _registeredInstances\r\n };\r\n\r\n })());\r\n\r\n ej.widget.destroyAll = function (elements) {\r\n if (!elements || !elements.length) return;\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n var data = elements.eq(i).data(), wds = data[\"ejWidgets\"];\r\n if (wds && wds.length) {\r\n for (var j = 0; j < wds.length; j++) {\r\n if (data[wds[j]] && data[wds[j]].destroy)\r\n data[wds[j]].destroy();\r\n }\r\n }\r\n }\r\n };\r\n\r\n ej.cookie = {\r\n get: function (name) {\r\n var value = RegExp(name + \"=([^;]+)\").exec(document.cookie);\r\n\r\n if (value && value.length > 1)\r\n return value[1];\r\n\r\n return undefined;\r\n },\r\n set: function (name, value, expiryDate) {\r\n if (typeof value === \"object\")\r\n value = JSON.stringify(value);\r\n\r\n value = escape(value) + ((expiryDate == null) ? \"\" : \"; expires=\" + expiryDate.toUTCString());\r\n document.cookie = name + \"=\" + value;\r\n }\r\n };\r\n\r\n var keyFn = {\r\n getActionFromCode: function (keyConfigs, keyCode, isCtrl, isShift, isAlt) {\r\n isCtrl = isCtrl || false;\r\n isShift = isShift || false;\r\n isAlt = isAlt || false;\r\n\r\n for (var keys in keyConfigs) {\r\n if (keys === \"focus\") continue;\r\n\r\n var key = keyFn.getKeyObject(keyConfigs[keys]);\r\n for (var i = 0; i < key.length; i++) {\r\n if (keyCode === key[i].code && isCtrl == key[i].isCtrl && isShift == key[i].isShift && isAlt == key[i].isAlt)\r\n return keys;\r\n }\r\n }\r\n return null;\r\n },\r\n getKeyObject: function (key) {\r\n var res = {\r\n isCtrl: false,\r\n isShift: false,\r\n isAlt: false\r\n };\r\n var tempRes = $.extend(true, {}, res);\r\n var $key = key.split(\",\"), $res = [];\r\n for (var i = 0; i < $key.length; i++) {\r\n var rslt = null;\r\n if ($key[i].indexOf(\"+\") != -1) {\r\n var k = $key[i].split(\"+\");\r\n for (var j = 0; j < k.length; j++) {\r\n rslt = keyFn.getResult($.trim(k[j]), res);\r\n }\r\n }\r\n else {\r\n rslt = keyFn.getResult($.trim($key[i]), $.extend(true, {}, tempRes));\r\n }\r\n $res.push(rslt);\r\n }\r\n return $res;\r\n },\r\n getResult: function (key, res) {\r\n if (key === \"ctrl\")\r\n res.isCtrl = true;\r\n else if (key === \"shift\")\r\n res.isShift = true;\r\n else if (key === \"alt\")\r\n res.isAlt = true;\r\n else res.code = parseInt(key, 10);\r\n return res;\r\n }\r\n };\r\n\r\n ej.getScrollableParents = function (element) {\r\n return $(element).parentsUntil(\"html\").filter(function () {\r\n return $(this).css(\"overflow\") != \"visible\";\r\n }).add($(window));\r\n }\r\n ej.browserInfo = function () {\r\n var browser = {}, clientInfo = [],\r\n browserClients = {\r\n opera: /(opera|opr)(?:.*version|)[ \\/]([\\w.]+)/i, edge: /(edge)(?:.*version|)[ \\/]([\\w.]+)/i, webkit: /(chrome)[ \\/]([\\w.]+)/i, safari: /(webkit)[ \\/]([\\w.]+)/i, msie: /(msie|trident) ([\\w.]+)/i, mozilla: /(mozilla)(?:.*? rv:([\\w.]+)|)/i\r\n };\r\n for (var client in browserClients) {\r\n if (browserClients.hasOwnProperty(client)) {\r\n clientInfo = navigator.userAgent.match(browserClients[client]);\r\n if (clientInfo) {\r\n browser.name = clientInfo[1].toLowerCase() == \"opr\" ? \"opera\" : clientInfo[1].toLowerCase();\r\n browser.version = clientInfo[2];\r\n browser.culture = {};\r\n browser.culture.name = browser.culture.language = navigator.language || navigator.userLanguage;\r\n if (typeof (ej.globalize) != 'undefined') {\r\n var oldCulture = ej.preferredCulture().name;\r\n var culture = (navigator.language || navigator.userLanguage) ? ej.preferredCulture(navigator.language || navigator.userLanguage) : ej.preferredCulture(\"en-US\");\r\n for (var i = 0; (navigator.languages) && i < navigator.languages.length; i++) {\r\n culture = ej.preferredCulture(navigator.languages[i]);\r\n if (culture.language == navigator.languages[i])\r\n break;\r\n }\r\n ej.preferredCulture(oldCulture);\r\n $.extend(true, browser.culture, culture);\r\n }\r\n if (!!navigator.userAgent.match(/Trident\\/7\\./)) {\r\n browser.name = \"msie\";\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n browser.isMSPointerEnabled = (browser.name == 'msie') && browser.version > 9 && window.navigator.msPointerEnabled;\r\n browser.pointerEnabled = window.navigator.pointerEnabled;\r\n return browser;\r\n };\r\n ej.eventType = {\r\n mouseDown: \"mousedown touchstart\",\r\n mouseMove: \"mousemove touchmove\",\r\n mouseUp: \"mouseup touchend\",\r\n mouseLeave: \"mouseleave touchcancel\",\r\n click: \"click touchend\"\r\n };\r\n\r\n ej.event = function (type, data, eventProp) {\r\n\r\n var e = $.extend(eventProp || {},\r\n {\r\n \"type\": type,\r\n \"model\": data,\r\n \"cancel\": false\r\n });\r\n\r\n return e;\r\n };\r\n\r\n ej.proxy = function (fn, context, arg) {\r\n if (!fn || typeof fn !== \"function\")\r\n return null;\r\n\r\n if ('on' in fn && context)\r\n return arg ? fn.on(context, arg) : fn.on(context);\r\n\r\n return function () {\r\n var args = arg ? [arg] : []; args.push.apply(args, arguments);\r\n return fn.apply(context || this, args);\r\n };\r\n };\r\n\r\n ej.hasStyle = function (prop) {\r\n var style = document.documentElement.style;\r\n\r\n if (prop in style) return true;\r\n\r\n var prefixs = ['ms', 'Moz', 'Webkit', 'O', 'Khtml'];\r\n\r\n prop = prop[0].toUpperCase() + prop.slice(1);\r\n\r\n for (var i = 0; i < prefixs.length; i++) {\r\n if (prefixs[i] + prop in style)\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n Array.prototype.indexOf = Array.prototype.indexOf || function (searchElement) {\r\n var len = this.length;\r\n\r\n if (len === 0) return -1;\r\n\r\n for (var i = 0; i < len; i++) {\r\n if (i in this && this[i] === searchElement)\r\n return i;\r\n }\r\n return -1;\r\n };\r\n\r\n String.prototype.startsWith = String.prototype.startsWith || function (key) {\r\n return this.slice(0, key.length) === key;\r\n };\r\n var copyObject = ej.copyObject = function (isDeepCopy, target) {\r\n var start = 2, current, source;\r\n if (typeof isDeepCopy !== \"boolean\") {\r\n start = 1;\r\n }\r\n var objects = [].slice.call(arguments, start);\r\n if (start === 1) {\r\n target = isDeepCopy;\r\n isDeepCopy = undefined;\r\n }\r\n\r\n for (var i = 0; i < objects.length; i++) {\r\n for (var prop in objects[i]) {\r\n current = target[prop], source = objects[i][prop];\r\n\r\n if (source === undefined || current === source || objects[i] === source || target === source)\r\n continue;\r\n if (source instanceof Array) {\r\n if (i === 0 && isDeepCopy) {\r\n\t\t\t\t\t\tif(prop === \"dataSource\")\r\n\t\t\t\t\t\t target[prop] = source.slice();\r\n\t\t\t\t\t else {\r\n target[prop] = new Array();\r\n for (var j = 0; j < source.length; j++) {\r\n copyObject(true, target[prop], source);\r\n }\r\n\t\t\t\t\t }\r\n }\r\n else\r\n target[prop] = source.slice();\r\n }\r\n else if (ej.isPlainObject(source)) {\r\n target[prop] = current || {};\r\n if (isDeepCopy)\r\n copyObject(isDeepCopy, target[prop], source);\r\n else\r\n copyObject(target[prop], source);\r\n } else\r\n target[prop] = source;\r\n }\r\n }\r\n return target;\r\n };\r\n var pInstance = function () {\r\n return this;\r\n }\r\n\r\n var _uid = 0;\r\n var getUid = function (prefix) {\r\n return prefix + _uid++;\r\n }\r\n\r\n ej.template = {};\r\n\r\n ej.template.render = ej.template[\"text/x-jsrender\"] = function (self, selector, data, index, prop) {\r\n if (selector.slice(0, 1) !== \"#\")\r\n selector = [\"
\", selector, \"
\"].join(\"\");\r\n var property = { prop: prop, index: index };\r\n return $(selector).render(data, property);\r\n }\r\n\r\n ej.isPlainObject = function (obj) {\r\n if (!obj) return false;\r\n if (ej.DataManager !== undefined && obj instanceof ej.DataManager) return false;\r\n if (typeof obj !== \"object\" || obj.nodeType || jQuery.isWindow(obj)) return false;\r\n try {\r\n if (obj.constructor &&\r\n !obj.constructor.prototype.hasOwnProperty(\"isPrototypeOf\")) {\r\n return false;\r\n }\r\n } catch (e) {\r\n return false;\r\n }\r\n\r\n var key, ownLast = ej.support.isOwnLast;\r\n for (key in obj) {\r\n if (ownLast) break;\r\n }\r\n\r\n return key === undefined || obj.hasOwnProperty(key);\r\n };\r\n var getValueFn = false;\r\n ej.util.valueFunction = function (prop) {\r\n return function (value, getObservable) {\r\n var val = ej.getObject(prop, this.model);\r\n\r\n if (getValueFn === false)\r\n getValueFn = ej.getObject(\"observables.getValue\", ej.widget);\r\n\r\n if (value === undefined) {\r\n if (!ej.isNullOrUndefined(getValueFn)) {\r\n return getValueFn(val, getObservable);\r\n }\r\n return typeof val === \"function\" ? val.call(this) : val;\r\n }\r\n\r\n if (typeof val === \"function\") {\r\n this[\"ob.values\"][prop] = value;\r\n val.call(this, value);\r\n }\r\n else\r\n ej.createObject(prop, value, this.model);\r\n }\r\n };\r\n ej.util.getVal = function (val) {\r\n if (typeof val === \"function\")\r\n return val();\r\n return val;\r\n };\r\n ej.support = {\r\n isOwnLast: function () {\r\n var fn = function () { this.a = 1; };\r\n fn.prototype.b = 1;\r\n\r\n for (var p in new fn()) {\r\n return p === \"b\";\r\n }\r\n }(),\r\n outerHTML: function () {\r\n return document.createElement(\"div\").outerHTML !== undefined;\r\n }()\r\n };\r\n\r\n var throwError = ej.throwError = function (er) {\r\n try {\r\n throw new Error(er);\r\n } catch (e) {\r\n throw e.message + \"\\n\" + e.stack;\r\n }\r\n };\r\n\r\n ej.getRandomValue = function (min, max) {\r\n if (min === undefined || max === undefined)\r\n return ej.throwError(\"Min and Max values are required for generating a random number\");\r\n\r\n var rand;\r\n if (\"crypto\" in window && \"getRandomValues\" in crypto) {\r\n var arr = new Uint16Array(1);\r\n window.crypto.getRandomValues(arr);\r\n rand = arr[0] % (max - min) + min;\r\n }\r\n else rand = Math.random() * (max - min) + min;\r\n return rand | 0;\r\n }\r\n\r\n ej.extensions = {};\r\n ej.extensions.modelGUID = \"{0B1051BA-1CCB-42C2-A3B5-635389B92A50}\";\r\n})(window.jQuery, window.Syncfusion);\r\n(function () {\r\n $.fn.addEleAttrs = function (json) {\r\n var $this = $(this);\r\n $.each(json, function (i, attr) {\r\n if (attr && attr.specified) {\r\n $this.attr(attr.name, attr.value);\r\n }\r\n });\r\n\r\n };\r\n $.fn.removeEleAttrs = function (regex) {\r\n return this.each(function () {\r\n var $this = $(this),\r\n names = [],\r\n attrs = $(this.attributes).clone();\r\n $.each(attrs, function (i, attr) {\r\n if (attr && attr.specified && regex.test(attr.name)) {\r\n $this.removeAttr(attr.name);\r\n }\r\n });\r\n });\r\n };\r\n $.fn.attrNotStartsWith = function (regex) {\r\n var proxy = this;\r\n var attributes = [], attrs;\r\n this.each(function () {\r\n attrs = $(this.attributes).clone();\r\n });\r\n for (i = 0; i < attrs.length; i++) {\r\n if (attrs[i] && attrs[i].specified && regex.test(attrs[i].name)) {\r\n continue\r\n }\r\n else\r\n attributes.push(attrs[i])\r\n }\r\n return attributes;\r\n\r\n }\r\n $.fn.removeEleEmptyAttrs = function () {\r\n return this.each(function () {\r\n var $this = $(this),\r\n names = [],\r\n attrs = $(this.attributes).clone();\r\n $.each(attrs, function (i, attr) {\r\n if (attr && attr.specified && attr.value === \"\") {\r\n $this.removeAttr(attr.name);\r\n }\r\n });\r\n });\r\n };\r\n $.extend($.support, {\r\n has3d: ej.addPrefix('perspective') in ej.styles,\r\n hasTouch: 'ontouchstart' in window,\r\n hasPointer: navigator.msPointerEnabled,\r\n hasTransform: ej.userAgent() !== false,\r\n pushstate: \"pushState\" in history &&\r\n \"replaceState\" in history,\r\n hasTransition: ej.addPrefix('transition') in ej.styles\r\n });\r\n //Ensuring elements having attribute starts with 'ejm-' \r\n $.extend($.expr[':'], {\r\n attrNotStartsWith: function (element, index, match) {\r\n var i, attrs = element.attributes;\r\n for (i = 0; i < attrs.length; i++) {\r\n if (attrs[i].nodeName.indexOf(match[3]) === 0) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n });\r\n //addBack() is supported from Jquery >1.8 and andSelf() supports later version< 1.8. support for both the method is provided by extending the JQuery function.\r\n var oldSelf = $.fn.andSelf || $.fn.addBack;\r\n $.fn.andSelf = $.fn.addBack = function () {\r\n return oldSelf.apply(this, arguments);\r\n };\r\n})();;\r\n;\r\nwindow.ej = window.Syncfusion = window.Syncfusion || {};\r\n\r\n(function ($, ej, doc, undefined) {\r\n 'use strict';\r\n\t\r\n ej.DataManager = function (dataSource, query, adaptor) {\r\n if (!(this instanceof ej.DataManager))\r\n return new ej.DataManager(dataSource, query, adaptor);\r\n\r\n if (!dataSource)\r\n dataSource = [];\r\n adaptor = adaptor || dataSource.adaptor;\r\n\r\n if (typeof (adaptor) === \"string\") \r\n adaptor = new ej[adaptor]();\r\n var data = [], self = this;\r\n\r\n if (dataSource instanceof Array) {\r\n // JSON array\r\n data = {\r\n json: dataSource,\r\n offline: true\r\n };\r\n\r\n } else if (typeof dataSource === \"object\") {\r\n if ($.isPlainObject(dataSource)) {\r\n if (!dataSource.json)\r\n dataSource.json = [];\r\n if (dataSource.table)\r\n dataSource.json = this._getJsonFromElement(dataSource.table, dataSource.headerOption);\r\n data = {\r\n url: dataSource.url,\r\n insertUrl: dataSource.insertUrl,\r\n removeUrl: dataSource.removeUrl,\r\n updateUrl: dataSource.updateUrl,\r\n crudUrl: dataSource.crudUrl,\r\n batchUrl: dataSource.batchUrl,\r\n json: dataSource.json,\r\n headers: dataSource.headers,\r\n accept: dataSource.accept,\r\n data: dataSource.data,\r\n\t\t\t\t\tasync : dataSource.async,\r\n timeTillExpiration: dataSource.timeTillExpiration,\r\n cachingPageSize: dataSource.cachingPageSize,\r\n enableCaching: dataSource.enableCaching,\r\n requestType: dataSource.requestType,\r\n key: dataSource.key,\r\n crossDomain: dataSource.crossDomain,\r\n antiForgery: dataSource.antiForgery,\r\n jsonp: dataSource.jsonp,\r\n dataType: dataSource.dataType,\r\n enableAJAXCache: dataSource.enableAJAXCache,\r\n offline: dataSource.offline !== undefined ? dataSource.offline : dataSource.adaptor == \"remoteSaveAdaptor\" || dataSource.adaptor instanceof ej.remoteSaveAdaptor ? false : dataSource.url ? false : true,\r\n requiresFormat: dataSource.requiresFormat\r\n };\r\n } else if (dataSource.jquery || isHtmlElement(dataSource)) {\r\n data = {\r\n json: this._getJsonFromElement(dataSource),\r\n offline: true,\r\n table: dataSource\r\n };\r\n }\r\n } else if (typeof dataSource === \"string\") {\r\n data = {\r\n url: dataSource,\r\n offline: false,\r\n dataType: \"json\",\r\n json: []\r\n };\r\n }\r\n\r\n if (data.requiresFormat === undefined && !ej.support.cors)\r\n data.requiresFormat = isNull(data.crossDomain) ? true : data.crossDomain;\r\n if(data.antiForgery){\r\n this.antiForgeryToken();\r\n }\r\n if (data.dataType === undefined)\r\n data.dataType = \"json\";\r\n this.dataSource = data;\r\n this.defaultQuery = query;\r\n\r\n if (data.url && data.offline && !data.json.length) {\r\n this.isDataAvailable = false;\r\n this.adaptor = adaptor || new ej.ODataAdaptor();\r\n this.dataSource.offline = false;\r\n this.ready = this.executeQuery(query || ej.Query()).done(function (e) {\r\n self.dataSource.offline = true;\r\n self.isDataAvailable = true;\r\n data.json = e.result;\r\n self.adaptor = new ej.JsonAdaptor();\r\n });\r\n }\r\n else\r\n this.adaptor = data.offline ? new ej.JsonAdaptor() : new ej.ODataAdaptor();\r\n if (!data.jsonp && this.adaptor instanceof ej.ODataAdaptor)\r\n data.jsonp = \"callback\";\r\n this.adaptor = adaptor || this.adaptor;\r\n if (data.enableCaching)\r\n this.adaptor = new ej.CacheAdaptor(this.adaptor, data.timeTillExpiration, data.cachingPageSize);\r\n return this;\r\n };\r\n\r\n ej.DataManager.prototype = {\r\n setDefaultQuery: function (query) {\r\n this.defaultQuery = query;\r\n },\r\n\t\r\n executeQuery: function (query, done, fail, always) {\r\n if (typeof query === \"function\") {\r\n always = fail;\r\n fail = done;\r\n done = query;\r\n query = null;\r\n }\r\n\r\n if (!query)\r\n query = this.defaultQuery;\r\n\r\n if (!(query instanceof ej.Query))\r\n throwError(\"DataManager - executeQuery() : A query is required to execute\");\r\n\r\n var deffered = $.Deferred();\r\n\r\n deffered.then(done, fail, always);\r\n var args = { query: query };\r\n\r\n if (!this.dataSource.offline && this.dataSource.url != undefined) {\r\n\t\t\t\t var result = this.adaptor.processQuery(this, query);\r\n if (!ej.isNullOrUndefined(result.url))\r\n this._makeRequest(result, deffered, args, query);\r\n else {\r\n nextTick(function () {\r\n args = this._getDeferedArgs(query, result, args);\r\n deffered.resolveWith(this, [args]);;\r\n }, this);\r\n }\r\n } else {\r\n\t\t\t\tif(!ej.isNullOrUndefined(this.dataSource.async) && this.dataSource.async == false)\r\n\t\t\t\t\tthis._localQueryProcess(query, args, deffered);\r\n\t\t\t\telse{\r\n\t\t\t\t\tnextTick(function () {\r\n\t\t\t\t\t\tthis._localQueryProcess(query, args, deffered);\r\n\t\t\t\t\t}, this);\r\n\t\t\t\t}\r\n }\r\n return deffered.promise();\r\n },\r\n\t\t_localQueryProcess: function(query, args, deffered){\r\n\t\t\tvar res = this.executeLocal(query);\r\n\t\t\targs = this._getDeferedArgs(query, res, args);\r\n\t\t\tdeffered.resolveWith(this, [args]);\r\n\t\t},\r\n _getDeferedArgs: function (query, result, args) {\r\n if (query._requiresCount) {\r\n args.result = result.result;\r\n args.count = result.count;\r\n } else\r\n args.result = result;\r\n args.getTableModel = getTableModel(query._fromTable, args.result, this);\r\n args.getKnockoutModel = getKnockoutModel(args.result);\r\n return args;\r\n },\r\n\t\r\n executeLocal: function (query) {\r\n if (!this.defaultQuery && !(query instanceof ej.Query))\r\n throwError(\"DataManager - executeLocal() : A query is required to execute\");\r\n\r\n if (!this.dataSource.json)\r\n throwError(\"DataManager - executeLocal() : Json data is required to execute\");\r\n\r\n query = query || this.defaultQuery;\r\n\r\n var result = this.adaptor.processQuery(this, query);\r\n\r\n if (query._subQuery) {\r\n var from = query._subQuery._fromTable, lookup = query._subQuery._lookup,\r\n res = query._requiresCount ? result.result : result;\r\n\r\n if (lookup && lookup instanceof Array) {\r\n buildHierarchy(query._subQuery._fKey, from, res, lookup, query._subQuery._key);\r\n }\r\n\r\n for (var j = 0; j < res.length; j++) {\r\n if (res[j][from] instanceof Array) {\r\n res[j] = $.extend({}, res[j]);\r\n res[j][from] = this.adaptor.processResponse(query._subQuery.using(ej.DataManager(res[j][from].slice(0))).executeLocal(), this, query);\r\n }\r\n }\r\n }\r\n\r\n return this.adaptor.processResponse(result, this, query);\r\n },\r\n\r\n _makeRequest: function (url, deffered, args, query) {\r\n var isSelector = !!query._subQuerySelector;\r\n\r\n var fnFail = $proxy(function (e) {\r\n args.error = e;\r\n deffered.rejectWith(this, [args]);\r\n }, this);\r\n\r\n var process = $proxy(function (data, count, xhr, request, actual, aggregates, virtualSelectRecords) {\r\n if (isSelector) return;\r\n\r\n args.xhr = xhr;\r\n args.count = parseInt(count, 10);\r\n args.result = data;\r\n args.request = request;\r\n args.aggregates = aggregates;\r\n args.getTableModel = getTableModel(query._fromTable, data, this);\r\n args.getKnockoutModel = getKnockoutModel(data);\r\n args.actual = actual;\r\n args.virtualSelectRecords = virtualSelectRecords;\r\n deffered.resolveWith(this, [args]);\r\n\r\n }, this);\r\n\r\n var fnQueryChild = $proxy(function (data, selector) {\r\n var subDeffer = $.Deferred(),\r\n childArgs = { parent: args };\r\n\r\n query._subQuery._isChild = true;\r\n\r\n var subUrl = this.adaptor.processQuery(this, query._subQuery, data ? this.adaptor.processResponse(data) : selector);\r\n\r\n var childReq = this._makeRequest(subUrl, subDeffer, childArgs, query._subQuery);\r\n\r\n if(!isSelector)\r\n subDeffer.then(function (subData) {\r\n if (data) {\r\n buildHierarchy(query._subQuery._fKey, query._subQuery._fromTable, data, subData, query._subQuery._key);\r\n process(data);\r\n }\r\n }, fnFail);\r\n\r\n return childReq;\r\n }, this);\r\n\r\n var fnSuccess = proxy(function (data, status, xhr, request) {\r\n if (xhr.getResponseHeader(\"Content-Type\").indexOf(\"xml\") == -1 && ej.dateParse)\r\n data = ej.parseJSON(data);\r\n var result = this.adaptor.processResponse(data, this, query, xhr, request), count = 0, aggregates = null;\r\n var virtualSelectRecords = data.virtualSelectRecords;\r\n if (query._requiresCount) {\r\n count = result.count;\r\n aggregates = result.aggregates;\r\n result = result.result;\r\n }\r\n\r\n if (!query._subQuery) {\r\n process(result, count, xhr, request, data, aggregates, virtualSelectRecords);\r\n return;\r\n }\r\n\r\n if (!isSelector)\r\n fnQueryChild(result);\r\n\r\n }, this);\r\n\r\n var req = $.extend({\r\n type: \"GET\",\r\n dataType: this.dataSource.dataType,\r\n crossDomain: this.dataSource.crossDomain,\r\n jsonp: this.dataSource.jsonp,\r\n cache: ej.isNullOrUndefined(this.dataSource.enableAJAXCache) ? true: this.dataSource.enableAJAXCache,\r\n beforeSend: $proxy(this._beforeSend, this),\r\n processData: false,\r\n success: fnSuccess,\r\n error: fnFail\r\n }, url);\r\n\r\n if (\"async\" in this.dataSource)\r\n req.async = this.dataSource.async;\r\n\r\n req = $.ajax(req);\r\n\r\n if (isSelector) {\r\n var res = query._subQuerySelector.call(this, { query: query._subQuery, parent: query });\r\n\r\n if (res && res.length) {\r\n req = $.when(req, fnQueryChild(null, res));\r\n\r\n req.then(proxy(function (pData, cData, requests) {\r\n var pResult = this.adaptor.processResponse(pData[0], this, query, pData[2], requests[0]), count = 0;\r\n if (query._requiresCount) {\r\n count = pResult.count;\r\n pResult = pResult.result;\r\n }\r\n var cResult = this.adaptor.processResponse(cData[0], this, query._subQuery, cData[2], requests[1]), count = 0;\r\n if (query._subQuery._requiresCount) {\r\n count = cResult.count;\r\n cResult = cResult.result;\r\n }\r\n\r\n buildHierarchy(query._subQuery._fKey, query._subQuery._fromTable, pResult, cResult, query._subQuery._key);\r\n isSelector = false;\r\n process(pResult, count, pData[2]);\r\n\r\n }, this), fnFail);\r\n } else {\r\n isSelector = false;\r\n }\r\n }\r\n\r\n return req;\r\n },\r\n\r\n _beforeSend: function (request, settings) {\r\n this.adaptor.beforeSend(this, request, settings);\r\n\r\n var headers = this.dataSource.headers, props;\r\n for (var i = 0; headers && i < headers.length; i++) {\r\n props = [];\r\n for (var prop in headers[i]) {\r\n props.push(prop);\r\n request.setRequestHeader(prop, headers[i][prop]);\r\n }\r\n }\r\n },\r\n\t\r\n saveChanges: function (changes, key, tableName, query) {\r\n\r\n if (tableName instanceof ej.Query) {\r\n query = tableName;\r\n tableName = null;\r\n }\r\n\r\n var args = {\r\n url: tableName,\r\n key: key || this.dataSource.key\r\n };\r\n\r\n var req = this.adaptor.batchRequest(this, changes, args, query);\r\n\r\n if (this.dataSource.offline) {\r\n return req;\r\n }\r\n\r\n var deff = $.Deferred();\r\n $.ajax($.extend({\r\n beforeSend: $proxy(this._beforeSend, this),\r\n success: proxy(function (data, status, xhr, request) {\r\n deff.resolveWith(this, [this.adaptor.processResponse(data, this, null, xhr, request, changes, key)]);\r\n }, this),\r\n error: function (e) {\r\n deff.rejectWith(this, [{ error: e }]);\r\n }\r\n }, req));\r\n\r\n return deff.promise();\r\n },\r\n\t\r\n insert: function (data, tableName, query) { \r\n // Additional paramater is included based on the task (JS-56499) to prevent addition of serverOffset multiple times\r\n data = p.replacer(data, true);\r\n\r\n if (tableName instanceof ej.Query) {\r\n query = tableName;\r\n tableName = null;\r\n }\r\n\r\n var res = this.adaptor.insert(this, data, tableName, query);\r\n\r\n if (this.dataSource.offline) {\r\n return res;\r\n } \r\n\r\n var deffer = $.Deferred();\r\n\r\n $.ajax($.extend({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n processData: false,\r\n beforeSend: $proxy(this._beforeSend, this),\r\n success: proxy(function (record, status, xhr, request) {\r\n try {\r\n if (ej.isNullOrUndefined(record))\r\n record = [];\r\n else\r\n p.parseJson(record);\r\n }\r\n catch (e) {\r\n record = [];\r\n }\r\n record = this.adaptor.processResponse(p.parseJson(record), this, null, xhr, request);\r\n deffer.resolveWith(this, [{ record: record, dataManager: this }]);\r\n }, this),\r\n error: function (e) {\r\n deffer.rejectWith(this, [{ error: e, dataManager: this }]);\r\n }\r\n }, res));\r\n\r\n return deffer.promise();\r\n },\r\n antiForgeryToken: function () {\r\n var tokens = {};\r\n if(ej.isNullOrUndefined($(\"input[name='_ejRequestVerifyToken']\").val()))\r\n var input = ej.buildTag(\"input\", \"\", \"\", { type: \"hidden\", name: \"_ejRequestVerifyToken\" , value: ej.getGuid()}).appendTo(\"body\"); \r\n else\r\n $(\"input[name='_ejRequestVerifyToken']\").val(ej.getGuid());\r\n ej.cookie.set(\"_ejRequestVerifyToken\", $(\"input[name='_ejRequestVerifyToken']\").val());\r\n tokens ={name: \"_ejRequestVerifyToken\", value: $(\"input[name='_ejRequestVerifyToken']\").val()}\r\n return tokens;\r\n },\r\n remove: function (keyField, value, tableName, query) {\r\n if (typeof value === \"object\")\r\n value = value[keyField];\r\n\r\n if (tableName instanceof ej.Query) {\r\n query = tableName;\r\n tableName = null;\r\n }\r\n\r\n var res = this.adaptor.remove(this, keyField, value, tableName, query);\r\n\r\n if (this.dataSource.offline)\r\n return res; \r\n\r\n var deffer = $.Deferred();\r\n $.ajax($.extend({\r\n type: \"POST\",\r\n contentType: \"application/json; charset=utf-8\",\r\n beforeSend: $proxy(this._beforeSend, this),\r\n success: proxy(function (record, status, xhr, request) {\r\n try {\r\n if (ej.isNullOrUndefined(record))\r\n record = [];\r\n else\r\n p.parseJson(record);\r\n }\r\n catch (e) {\r\n record = [];\r\n }\r\n record = this.adaptor.processResponse(p.parseJson(record), this, null, xhr, request);\r\n deffer.resolveWith(this, [{ record: record, dataManager: this }]);\r\n }, this),\r\n error: function (e) {\r\n deffer.rejectWith(this, [{ error: e, dataManager: this }]);\r\n }\r\n }, res));\r\n return deffer.promise();\r\n },\r\n\t\r\n update: function (keyField, value, tableName, query) {\r\n // Additional paramater is included based on this task (JS-56499) to prevent addition of serverOffset multiple times\r\n value = p.replacer(value, true);\r\n\r\n if (tableName instanceof ej.Query) {\r\n query = tableName;\r\n tableName = null;\r\n }\r\n\r\n var res = this.adaptor.update(this, keyField, value, tableName, query);\r\n\r\n if (this.dataSource.offline) {\r\n return res;\r\n } \r\n\r\n var deffer = $.Deferred();\r\n\r\n $.ajax($.extend({\r\n contentType: \"application/json; charset=utf-8\",\r\n beforeSend: $proxy(this._beforeSend, this),\r\n success: proxy(function (record, status, xhr, request) {\r\n try {\r\n if (ej.isNullOrUndefined(record))\r\n record = [];\r\n else\r\n p.parseJson(record);\r\n }\r\n catch (e) {\r\n record = [];\r\n }\r\n record = this.adaptor.processResponse(p.parseJson(record), this, null, xhr, request);\r\n deffer.resolveWith(this, [{ record: record, dataManager: this }]);\r\n }, this),\r\n error: function (e) {\r\n deffer.rejectWith(this, [{ error: e, dataManager: this }]);\r\n }\r\n }, res));\r\n\r\n return deffer.promise();\r\n },\r\n\r\n _getJsonFromElement: function (ds) {\r\n if (typeof (ds) == \"string\")\r\n ds = $($(ds).html());\r\n\r\n ds = ds.jquery ? ds[0] : ds;\r\n\r\n var tagName = ds.tagName.toLowerCase();\r\n\r\n if (tagName !== \"table\")\r\n throwError(\"ej.DataManager : Unsupported htmlElement : \" + tagName);\r\n\r\n return ej.parseTable(ds);\r\n }\r\n };\r\n\r\n var buildHierarchy = function (fKey, from, source, lookup, pKey) {\r\n var i, grp = {}, t;\r\n if (lookup.result) lookup = lookup.result;\r\n\r\n if (lookup.GROUPGUID)\r\n throwError(\"ej.DataManager: Do not have support Grouping in hierarchy\");\r\n\r\n for (i = 0; i < lookup.length; i++) {\r\n var fKeyData = ej.getObject(fKey, lookup[i]);\r\n t = grp[fKeyData] || (grp[fKeyData] = []);\r\n\r\n t.push(lookup[i]);\r\n }\r\n\r\n for (i = 0; i < source.length; i++) {\r\n source[i][from] = grp[ej.getObject(pKey || fKey, source[i])];\r\n }\r\n };\r\n\r\n var oData = {\r\n accept: \"application/json;odata=light;q=1,application/json;odata=verbose;q=0.5\",\r\n multipartAccept: \"multipart/mixed\",\r\n batch: \"$batch\",\r\n changeSet: \"--changeset_\",\r\n batchPre: \"batch_\",\r\n contentId: \"Content-Id: \",\r\n batchContent: \"Content-Type: multipart/mixed; boundary=\",\r\n changeSetContent: \"Content-Type: application/http\\nContent-Transfer-Encoding: binary \",\r\n batchChangeSetContentType: \"Content-Type: application/json; charset=utf-8 \"\r\n };\r\n var p = {\r\n parseJson: function (jsonText) {\r\n var type = typeof jsonText;\r\n if (type === \"string\") {\r\n jsonText = JSON.parse(jsonText, p.jsonReviver);\r\n } else if (jsonText instanceof Array) {\r\n p.iterateAndReviveArray(jsonText);\r\n } else if (type === \"object\")\r\n p.iterateAndReviveJson(jsonText);\r\n return jsonText;\r\n },\r\n iterateAndReviveArray: function (array) {\r\n for (var i = 0; i < array.length; i++) {\r\n if (typeof array[i] === \"object\")\r\n p.iterateAndReviveJson(array[i]);\r\n else if (typeof array[i] === \"string\" && !/^[\\s]*\\[|^[\\s]*\\{|\\\"/g.test(array[i]))\r\n array[i] = p.jsonReviver(\"\",array[i]);\r\n else\r\n array[i] = p.parseJson(array[i]);\r\n }\r\n },\r\n iterateAndReviveJson: function (json) {\r\n var value;\r\n for (var prop in json) {\r\n if (prop.startsWith(\"__\"))\r\n continue;\r\n\r\n value = json[prop];\r\n if (typeof value === \"object\") {\r\n if (value instanceof Array)\r\n p.iterateAndReviveArray(value);\r\n else\r\n p.iterateAndReviveJson(value);\r\n } else\r\n json[prop] = p.jsonReviver(prop, value);\r\n }\r\n },\r\n jsonReviver: function (field, value) {\r\n var s = value;\r\n if (typeof value === \"string\") {\r\n var ms = /^\\/Date\\(([+-]?[0-9]+)([+-][0-9]{4})?\\)\\/$/.exec(value);\r\n if (ms)\r\n return ej.parseDateInUTC ? p.isValidDate(ms[0]) : p.replacer(new Date(parseInt(ms[1])));\r\n else if (/^(\\d{4}\\-\\d\\d\\-\\d\\d([tT][\\d:\\.]*){1})([zZ]|([+\\-])(\\d\\d):?(\\d\\d))?$/.test(value)) {\r\n value = ej.parseDateInUTC ? p.isValidDate(value) : p.replacer(new Date(value));\r\n if (isNaN(value)) {\r\n var a = s.split(/[^0-9]/);\r\n value = p.replacer(new Date(a[0], a[1] - 1, a[2], a[3], a[4], a[5]));\r\n }\r\n }\r\n }\r\n return value;\r\n },\r\n isValidDate: function (value) {\r\n var prop = value;\r\n if (typeof (prop) === \"string\" && prop.indexOf(\"/Date(\") == 0) {\r\n value = prop.replace(/\\d+/, function (n) {\r\n var offsetMiliseconds = new Date(parseInt(n)).getTimezoneOffset() * 60000;\r\n var ticks = parseInt(n) + offsetMiliseconds;\r\n return p.replacer(new Date(parseInt(ticks)));\r\n });\r\n }\r\n if (typeof value === \"string\") {\r\n value = value.replace(\"/Date(\", function () { return \"\"; });\r\n value = value.replace(\")/\", function () { return \"\"; })\r\n var ms = new Date(value) instanceof Date;\r\n if (ms)\r\n return new Date(value);\r\n else return value;\r\n }\r\n return value;\r\n },\r\n isJson: function (jsonData) {\r\n if(typeof jsonData[0]== \"string\")\r\n return jsonData;\r\n return ej.parseJSON(jsonData);\r\n },\r\n isGuid: function (value) {\r\n var regex = /[A-Fa-f0-9]{8}(?:-[A-Fa-f0-9]{4}){3}-[A-Fa-f0-9]{12}/i;\r\n var match = regex.exec(value);\r\n return match != null;\r\n },\r\n // Additional paramater is included based on this task (JS-56499) to prevent addition of serverOffset multiple times\r\n replacer: function (value, serverOffset) {\r\n\r\n if (ej.isPlainObject(value))\r\n return p.jsonReplacer(value, serverOffset);\r\n\r\n if (value instanceof Array)\r\n return p.arrayReplacer(value);\r\n\r\n if (value instanceof Date)\r\n return p.jsonReplacer({ val: value }, serverOffset).val;\r\n\r\n return value;\r\n },\r\n jsonReplacer: function (val, serverOffset) {\r\n var value;\r\n for (var prop in val) {\r\n value = val[prop];\r\n\r\n if (!(value instanceof Date))\r\n continue;\r\n // checking for update and insert operation and then including the proper offset, based on this task (JS-56499) \r\n var offset = ej.serverTimezoneOffset * 60 * 60 * 1000 * (ej.isNullOrUndefined(serverOffset) || (serverOffset === false) ? (1) : -(1));\r\n val[prop] = new Date(+value + offset);\r\n }\r\n\r\n return val;\r\n },\r\n arrayReplacer: function (val) {\r\n\r\n for (var i = 0; i < val.length; i++) { \r\n if (ej.isPlainObject(val[i]))\r\n val[i] = p.jsonReplacer(val[i]);\r\n else if (val[i] instanceof Date)\r\n val[i] = p.jsonReplacer({ date: val[i] }).date;\r\n }\r\n\r\n return val;\r\n }\r\n };\r\n\r\n ej.isJSON = p.isJson;\r\n ej.parseJSON = p.parseJson;\r\n ej.dateParse = true;\r\n ej.isGUID = p.isGuid;\r\n ej.Query = function (from) {\r\n if (!(this instanceof ej.Query))\r\n return new ej.Query(from);\r\n\r\n this.queries = [];\r\n this._key = \"\";\r\n this._fKey = \"\";\r\n\r\n if (typeof from === \"string\")\r\n this._fromTable = from || \"\";\r\n else if (from && from instanceof Array)\r\n this._lookup = from;\r\n\r\n this._expands = [];\r\n this._sortedColumns = [];\r\n this._groupedColumns = [];\r\n this._subQuery = null;\r\n this._isChild = false;\r\n this._params = [];\r\n return this;\r\n };\r\n\r\n ej.Query.prototype = {\r\n key: function (field) {\r\n if (typeof field === \"string\")\r\n this._key = field;\r\n\r\n return this;\r\n },\r\n\t\r\n using: function (dataManager) {\r\n if (dataManager instanceof ej.DataManager) {\r\n this.dataManagar = dataManager;\r\n return this;\r\n }\r\n\r\n return throwError(\"Query - using() : 'using' function should be called with parameter of instance ej.DataManager\");\r\n },\r\n\t\r\n execute: function (dataManager, done, fail, always) {\r\n dataManager = dataManager || this.dataManagar;\r\n\r\n if (dataManager && dataManager instanceof ej.DataManager)\r\n return dataManager.executeQuery(this, done, fail, always);\r\n\r\n return throwError(\"Query - execute() : dataManager needs to be is set using 'using' function or should be passed as argument\");\r\n },\r\n\t\r\n executeLocal: function (dataManager) {\r\n // this does not support for URL binding\r\n \r\n\r\n dataManager = dataManager || this.dataManagar;\r\n\r\n if (dataManager && dataManager instanceof ej.DataManager)\r\n return dataManager.executeLocal(this);\r\n\r\n return throwError(\"Query - executeLocal() : dataManager needs to be is set using 'using' function or should be passed as argument\");\r\n },\r\n\t\r\n clone: function () {\r\n var cl = new ej.Query();\r\n cl.queries = this.queries.slice(0);\r\n cl._key = this._key;\r\n cl._isChild = this._isChild;\r\n cl.dataManagar = this.dataManager;\r\n cl._fromTable = this._fromTable;\r\n cl._params = this._params.slice(0);\r\n cl._expands = this._expands.slice(0);\r\n cl._sortedColumns = this._sortedColumns.slice(0);\r\n cl._groupedColumns = this._groupedColumns.slice(0);\r\n cl._subQuerySelector = this._subQuerySelector;\r\n cl._subQuery = this._subQuery;\r\n cl._fKey = this._fKey;\r\n cl._requiresCount = this._requiresCount;\r\n return cl;\r\n },\r\n\t\r\n from: function (tableName) {\r\n if (typeof tableName === \"string\")\r\n this._fromTable = tableName;\r\n\r\n return this;\r\n },\r\n\t\r\n addParams: function (key, value) {\r\n if (typeof value !== \"function\" && !ej.isPlainObject(value))\r\n this._params.push({ key: key, value: value });\r\n else if (typeof value === \"function\")\r\n this._params.push({ key: key, fn: value });\r\n\r\n return this;\r\n },\r\n\t\r\n expand: function (tables) {\r\n if (typeof tables === \"string\")\r\n this._expands = [].slice.call(arguments, 0);\r\n else\r\n this._expands = tables.slice(0);\r\n\r\n return this;\r\n },\r\n\t\r\n where: function (fieldName, operator, value, ignoreCase) {\r\n operator = (operator || ej.FilterOperators.equal).toLowerCase();\r\n var predicate = null;\r\n\r\n if (typeof fieldName === \"string\")\r\n predicate = new ej.Predicate(fieldName, operator, value, ignoreCase);\r\n else if (fieldName instanceof ej.Predicate)\r\n predicate = fieldName;\r\n else\r\n throwError(\"Query - where : Invalid arguments\");\r\n\r\n this.queries.push({\r\n fn: \"onWhere\",\r\n e: predicate\r\n });\r\n return this;\r\n },\r\n\t\r\n search: function (searchKey, fieldNames, operator, ignoreCase) {\r\n if (!fieldNames || typeof fieldNames === \"boolean\") {\r\n fieldNames = [];\r\n ignoreCase = fieldNames;\r\n } else if (typeof fieldNames === \"string\")\r\n fieldNames = [fieldNames];\r\n\r\n if (typeof operator === \"boolean\") {\r\n ignoreCase = operator;\r\n operator = null;\r\n }\r\n operator = operator || ej.FilterOperators.contains;\r\n if (operator.length < 3)\r\n operator = ej.data.operatorSymbols[operator];\r\n\r\n var comparer = ej.data.fnOperators[operator] || ej.data.fnOperators.processSymbols(operator);\r\n\r\n this.queries.push({\r\n fn: \"onSearch\",\r\n e: {\r\n fieldNames: fieldNames,\r\n operator: operator,\r\n searchKey: searchKey,\r\n ignoreCase: ignoreCase,\r\n comparer: comparer\r\n }\r\n });\r\n return this;\r\n },\r\n\t\t\r\n sortBy: function (fieldName, comparer, isFromGroup) {\r\n var order = ej.sortOrder.Ascending, sorts, t;\r\n\r\n if (typeof fieldName === \"string\" && fieldName.toLowerCase().endsWith(\" desc\")) {\r\n fieldName = fieldName.replace(/ desc$/i, '');\r\n comparer = ej.sortOrder.Descending;\r\n }\r\n if (fieldName instanceof Array) {\r\n for(var i=0;i timeStamp)\r\n forDel.push(i);\r\n }\r\n var d = forDel;\r\n for (var i = 0; i < forDel.length; i++) {\r\n data.results.splice(forDel[i], 1);\r\n data.keys.splice(forDel[i], 1);\r\n }\r\n window.localStorage.removeItem(guid);\r\n window.localStorage.setItem(guid, JSON.stringify(data));\r\n }, timeStamp);\r\n }\r\n },\r\n generateKey: function (url, query) {\r\n var sorted = filterQueries(query.queries, \"onSortBy\"),\r\n grouped = filterQueries(query.queries, \"onGroup\"),\r\n filters = filterQueries(query.queries, \"onWhere\"),\r\n searchs = filterQueries(query.queries, \"onSearch\"),\r\n\t\t\t\tpageQuery = filterQueries(query.queries, \"onPage\"),\r\n singles = filterQueryLists(query.queries, [\"onSelect\", \"onPage\", \"onSkip\", \"onTake\", \"onRange\"]),\r\n params = query._params;\r\n var key = url;\r\n if (singles[\"onPage\"])\r\n key += singles[\"onPage\"].pageIndex;\r\n sorted.forEach(function (obj) {\r\n key += obj.e.direction + obj.e.fieldName;\r\n });\r\n grouped.forEach(function (obj) {\r\n key += obj.e.fieldName;\r\n });\r\n searchs.forEach(function (obj) {\r\n key += obj.e.searchKey;\r\n });\r\n \r\n for (var filter = 0; filter < filters.length; filter++) {\r\n var currentFilter = filters[filter];\r\n if (currentFilter.e.isComplex) {\r\n var newQuery = query.clone();\r\n newQuery.queries = [];\r\n for (var i = 0; i < currentFilter.e.predicates.length; i++) {\r\n newQuery.queries.push({ fn: \"onWhere\", e: currentFilter.e.predicates[i], filter: query.queries.filter });\r\n }\r\n key += currentFilter.e.condition + this.generateKey(url, newQuery);\r\n }\r\n else\r\n key += currentFilter.e.field + currentFilter.e.operator + currentFilter.e.value\r\n }\r\n return key;\r\n },\r\n processQuery: function (dm, query, hierarchyFilters) {\r\n var key = this.generateKey(dm.dataSource.url, query);\r\n var cachedItems;\r\n if (window.localStorage)\r\n cachedItems = ej.parseJSON(window.localStorage.getItem(this.guidId));\r\n var data = cachedItems ? cachedItems.results[cachedItems.keys.indexOf(key)] : null;\r\n if (data != null && !this._crudAction && !this._insertAction) {\r\n return data;\r\n }\r\n this._crudAction = null; this._insertAction = null;\r\n return this.cacheAdaptor.processQuery.apply(this.cacheAdaptor, [].slice.call(arguments, 0))\r\n },\r\n processResponse: function (data, ds, query, xhr, request, changes) {\r\n if (this._insertAction || (request && this.cacheAdaptor.options.batch && request.url.endsWith(this.cacheAdaptor.options.batch) && request.type.toLowerCase() === \"post\")) {\r\n return this.cacheAdaptor.processResponse(data, ds, query, xhr, request, changes);\r\n }\r\n var data = this.cacheAdaptor.processResponse.apply(this, [].slice.call(arguments, 0));\r\n var key = this.generateKey(ds.dataSource.url, query)\r\n var obj = {};\r\n if (window.localStorage)\r\n obj = ej.parseJSON(window.localStorage.getItem(this.guidId));\r\n var index = $.inArray(key, obj.keys);\r\n if (index != -1) {\r\n obj.results.splice(index, 1);\r\n obj.keys.splice(index, 1);\r\n }\r\n obj.results[obj.keys.push(key) - 1] = { keys: key, result: data.result, timeStamp: new Date(), count: data.count }\r\n while (obj.results.length > this.pageSize) {\r\n obj.results.splice(0, 1);\r\n obj.keys.splice(0, 1);\r\n }\r\n window.localStorage.setItem(this.guidId, JSON.stringify(obj));\r\n return data;\r\n },\r\n update: function (dm, keyField, value, tableName) {\r\n this._crudAction = true;\r\n return this.cacheAdaptor.update(dm, keyField, value, tableName);\r\n },\r\n insert: function (dm, data, tableName) {\r\n this._insertAction = true;\r\n return this.cacheAdaptor.insert(dm, data, tableName);\r\n },\r\n remove: function (dm, keyField, value, tableName) {\r\n this._crudAction = true;\r\n return this.cacheAdaptor.remove(dm, keyField, value, tableName);\r\n },\r\n batchRequest: function (dm, changes, e) {\r\n return this.cacheAdaptor.batchRequest(dm, changes, e);\r\n }\r\n });\r\n var filterQueries = function (queries, name) {\r\n return queries.filter(function (q) {\r\n return q.fn === name;\r\n }) || [];\r\n };\r\n var filterQueryLists = function (queries, singles) {\r\n var filtered = queries.filter(function (q) {\r\n return singles.indexOf(q.fn) !== -1;\r\n }), res = {};\r\n for (var i = 0; i < filtered.length; i++) {\r\n if (!res[filtered[i].fn])\r\n res[filtered[i].fn] = filtered[i].e;\r\n }\r\n return res;\r\n };\r\n var callAdaptorFunc = function (obj, fnName, param, param1) {\r\n if (obj[fnName]) {\r\n var res = obj[fnName](param, param1);\r\n if (!isNull(res)) param = res;\r\n }\r\n return param;\r\n };\r\n\r\n ej.ODataAdaptor = new ej.UrlAdaptor().extend({\r\n options: {\r\n requestType: \"get\",\r\n accept: \"application/json;odata=light;q=1,application/json;odata=verbose;q=0.5\",\r\n multipartAccept: \"multipart/mixed\",\r\n sortBy: \"$orderby\",\r\n select: \"$select\",\r\n skip: \"$skip\",\r\n take: \"$top\",\r\n count: \"$inlinecount\",\r\n where: \"$filter\",\r\n expand: \"$expand\",\r\n batch: \"$batch\",\r\n changeSet: \"--changeset_\",\r\n batchPre: \"batch_\",\r\n contentId: \"Content-Id: \",\r\n batchContent: \"Content-Type: multipart/mixed; boundary=\",\r\n changeSetContent: \"Content-Type: application/http\\nContent-Transfer-Encoding: binary \",\r\n batchChangeSetContentType: \"Content-Type: application/json; charset=utf-8 \"\r\n },\r\n onEachWhere: function (filter, requiresCast) {\r\n return filter.isComplex ? this.onComplexPredicate(filter, requiresCast) : this.onPredicate(filter, requiresCast);\r\n },\r\n\t\t_typeStringQuery: function (pred, requiresCast,val,field,guid) {\r\n\t\t\tif(val.indexOf(\"'\") != -1)\r\n val = val.replace(new RegExp(/'/g),\"''\");\r\n val = \"'\" + val + \"'\";\r\n\r\n if (requiresCast) {\r\n field = \"cast(\" + field + \", 'Edm.String')\";\r\n }\r\n if (ej.isGUID(val))\r\n guid = 'guid';\r\n if (pred.ignoreCase) {\r\n !guid ? field = \"tolower(\" + field + \")\" : field;\r\n val = val.toLowerCase();\r\n }\r\n\t\t\t\treturn {\"val\":val,\"guid\":guid ,\"field\":field};\r\n\t\t},\r\n onPredicate: function (pred, query, requiresCast) {\r\n var returnValue = \"\",\r\n operator,guid,\r\n val = pred.value,\r\n type = typeof val,\r\n field = this._p(pred.field);\r\n\r\n if (val instanceof Date)\r\n val = \"datetime'\" + p.replacer(val).toJSON() + \"'\";\r\n\r\n if (type === \"string\") {\r\n\t\t\t\tvar args = this._typeStringQuery(pred,requiresCast,val,field , guid);\r\n\t\t\t\tval = args[\"val\"]; field = args[\"field\"]; guid = args[\"guid\"];\r\n }\r\n\r\n operator = ej.data.odBiOperator[pred.operator];\r\n\t\t\tif(pred.anyCondition != \"\" && operator) {\r\n\t\t\t\treturnValue += val[\"table\"];\r\n\t\t\t\treturnValue += (\"/\"+pred.anyCondition);\r\n\t\t\t\treturnValue += \"(d:d/\";\r\n\t\t\t\treturnValue += field;\r\n\t\t\t\treturnValue += operator;\r\n\t\t\t\treturnValue += val[\"value\"];\r\n\t\t\t\treturnValue += \")\";\r\n\t\t\t\treturn returnValue;\r\n\t\t\t}\r\n\t\t\tif( pred.operator == \"in\" || pred.operator == \"notin\" ) {\r\n\t\t\t\tfor(var index = 0; index < val.length; index++ ) {\r\n\t\t\t\t\tif (val[index] instanceof Date)\r\n\t\t\t\t\t\tval[index] = \"datetime'\" + p.replacer(val[index]).toJSON() + \"'\";\r\n\t\t\t\t\tif (typeof val[index] === \"string\") {\r\n\t\t\t\t\t\tvar args = this._typeStringQuery(pred,requiresCast,val[index],field , guid);\r\n\t\t\t\t\t\tval[index] = args[\"val\"]; field = args[\"field\"]; guid = args[\"guid\"];\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturnValue += field;\r\n\t\t\t\t\treturnValue += operator;\r\n\t\t\t\t\treturnValue += val[index];\r\n\t\t\t\t\tif( index != val.length -1 ) returnValue += ( pred.operator == \"in\") ? \" or \" : \" and \";\r\n\t\t\t\t}\r\n\t\t\t\treturn returnValue;\r\n\t\t\t}\r\n if (operator) {\r\n returnValue += field;\r\n returnValue += operator;\r\n if (guid)\r\n returnValue += guid;\r\n return returnValue + val;\r\n }\r\n\r\n operator = ej.data.odUniOperator[pred.operator];\r\n if (!operator || type !== \"string\") return \"\";\r\n\r\n if (operator === \"substringof\") {\r\n var t = val;\r\n val = field;\r\n field = t;\r\n }\r\n\r\n returnValue += operator + \"(\";\r\n returnValue += field + \",\";\r\n if (guid) returnValue += guid;\r\n returnValue += val + \")\";\r\n\t\t\t\r\n\t\t\tif( pred.operator == \"notcontains\" ) {\r\n\t\t\t\treturnValue += \" eq false\"\r\n\t\t\t}\r\n\t\t\tif(pred.anyCondition != \"\" && operator) {\r\n\t\t\t\tvar returnValue1;\r\n\t\t\t\treturnValue1 += val[\"table\"];\r\n\t\t\t\treturnValue1 += (\"/\"+pred.anyCondition);\r\n\t\t\t\treturnValue1 += \"(d:d/\";\r\n\t\t\t\treturnValue += returnValue;\r\n\t\t\t\treturnValue1 += \")\";\r\n\t\t\t\treturn returnValue1;\r\n\t\t\t}\r\n return returnValue;\r\n },\r\n onComplexPredicate: function (pred, requiresCast) {\r\n var res = [];\r\n for (var i = 0; i < pred.predicates.length; i++) {\r\n res.push(\"(\" + this.onEachWhere(pred.predicates[i], requiresCast) + \")\");\r\n }\r\n return res.join(\" \" + pred.condition + \" \");\r\n },\r\n onWhere: function (filters) {\r\n if (this.pvt.searches)\r\n filters.push(this.onEachWhere(this.pvt.searches, null, true));\r\n\r\n return filters.join(\" and \");\r\n },\r\n onEachSearch: function (e) {\r\n if (e.fields.length === 0)\r\n throwError(\"Query() - Search : oData search requires list of field names to search\");\r\n\r\n var filter = this.pvt.searches || [];\r\n for (var i = 0; i < e.fields.length; i++) {\r\n filter.push(new ej.Predicate(e.fields[i], e.operator, e.key, e.ignoreCase));\r\n }\r\n this.pvt.searches = filter;\r\n },\r\n onSearch: function (e) {\r\n this.pvt.searches = ej.Predicate.or(this.pvt.searches);\r\n return \"\";\r\n },\r\n onEachSort: function (e) {\r\n var res = [];\r\n if (e.name instanceof Array) {\r\n for (var i = 0; i < e.name.length; i++)\r\n res.push(this._p(e.name[i]));\r\n } else {\r\n res.push(this._p(e.name) + (e.direction === \"descending\" ? \" desc\" : \"\"));\r\n }\r\n return res.join(\",\");\r\n },\r\n onSortBy: function (e) {\r\n return e.reverse().join(\",\");\r\n },\r\n onGroup: function (e) {\r\n this.pvt.groups = e;\r\n return \"\";\r\n },\r\n onSelect: function (e) {\r\n for (var i = 0; i < e.length; i++)\r\n e[i] = this._p(e[i]);\r\n\r\n return e.join(',');\r\n },\r\n onAggregates: function(e){\r\n this.pvt.aggregates = e;\r\n return \"\";\r\n },\r\n onCount: function (e) {\r\n return e === true ? \"allpages\" : \"\";\r\n },\r\n beforeSend: function (dm, request, settings) {\r\n if (settings.url.endsWith(this.options.batch) && settings.type.toLowerCase() === \"post\") {\r\n request.setRequestHeader(\"Accept\", oData.multipartAccept);\r\n request.setRequestHeader(\"DataServiceVersion\", \"2.0\");\r\n request.overrideMimeType(\"text/plain; charset=x-user-defined\");\r\n }\r\n\r\n if (!dm.dataSource.crossDomain) {\r\n request.setRequestHeader(\"DataServiceVersion\", \"2.0\");\r\n request.setRequestHeader(\"MaxDataServiceVersion\", \"2.0\");\r\n }\r\n },\r\n processResponse: function (data, ds, query, xhr, request, changes) {\r\n if (!ej.isNullOrUndefined(data.d)) {\r\n var dataCopy = (query && query._requiresCount) ? data.d.results : data.d;\r\n if (!ej.isNullOrUndefined(dataCopy))\r\n for (var i = 0; i < dataCopy.length; i++) {\r\n !ej.isNullOrUndefined(dataCopy[i].__metadata) && delete dataCopy[i].__metadata;\r\n }\r\n }\r\n var pvt = request && request.ejPvtData;\r\n if (xhr && xhr.getResponseHeader(\"Content-Type\") && xhr.getResponseHeader(\"Content-Type\").indexOf(\"xml\") != -1 && data.nodeType == 9)\r\n return query._requiresCount ? { result: [], count: 0 } : [];\r\n if (request && this.options.batch && request.url.endsWith(this.options.batch) && request.type.toLowerCase() === \"post\") {\r\n var guid = xhr.getResponseHeader(\"Content-Type\"), cIdx, jsonObj;\r\n guid = guid.substring(guid.indexOf(\"=batchresponse\") + 1);\r\n data = data.split(guid);\r\n if (data.length < 2) return;\r\n\r\n data = data[1];\r\n var exVal = /(?:\\bContent-Type.+boundary=)(changesetresponse.+)/i.exec(data);\r\n data.replace(exVal[0], \"\");\r\n\r\n var changeGuid = exVal[1];\r\n data = data.split(changeGuid);\r\n\r\n for (var i = data.length; i > -1; i--) {\r\n if (!/\\bContent-ID:/i.test(data[i]) || !/\\bHTTP.+201/.test(data[i]))\r\n continue;\r\n\r\n cIdx = parseInt(/\\bContent-ID: (\\d+)/i.exec(data[i])[1]);\r\n\r\n if (changes.added[cIdx]) {\r\n jsonObj = p.parseJson(/^\\{.+\\}/m.exec(data[i])[0]);\r\n $.extend(changes.added[cIdx], this.processResponse(jsonObj));\r\n }\r\n }\r\n return changes;\r\n }\r\n var version = xhr && xhr.getResponseHeader(\"DataServiceVersion\"), count = null, aggregateResult = {};\r\n version = (version && parseInt(version, 10)) || 2;\r\n\r\n if (query && query._requiresCount) {\r\n if (data.__count || data['odata.count']) count = data.__count || data['odata.count'];\r\n if (data.d) data = data.d;\r\n if (data.__count || data['odata.count']) count = data.__count || data['odata.count'];\r\n }\r\n\r\n if (version === 3 && data.value) data = data.value;\r\n if (data.d) data = data.d;\r\n if (version < 3 && data.results) data = data.results;\r\n\r\n if (pvt && pvt.aggregates && pvt.aggregates.length) {\r\n var agg = pvt.aggregates, args = {}, fn, res = {};\r\n for (var i = 0; i < agg.length; i++) {\r\n fn = ej.aggregates[agg[i].type];\r\n if (fn)\r\n res[agg[i].field + \" - \" + agg[i].type] = fn(data, agg[i].field);\r\n }\r\n aggregateResult = res;\r\n }\r\n if (pvt && pvt.groups && pvt.groups.length) {\r\n var groups = pvt.groups;\r\n for (var i = 0; i < groups.length; i++) {\r\n var format = getColFormat(groups[i], query.queries)\r\n data = ej.group(data, groups[i], pvt.aggregates, format);\r\n }\r\n }\r\n return isNull(count) ? data : { result: data, count: count, aggregates: aggregateResult };\r\n },\r\n convertToQueryString: function (req, query, dm) {\r\n var res = [], tableName = req.table || \"\";\r\n delete req.table;\r\n\r\n if (dm.dataSource.requiresFormat)\r\n req[\"$format\"] = \"json\";\r\n\r\n for (var prop in req)\r\n res.push(prop + \"=\" + req[prop]);\r\n\r\n res = res.join(\"&\");\r\n\r\n if (dm.dataSource.url && dm.dataSource.url.indexOf(\"?\") !== -1 && !tableName)\r\n return res;\r\n\r\n return res.length ? tableName + \"?\" + res : tableName || \"\";\r\n },\r\n insert: function (dm, data, tableName) {\r\n return {\r\n url: dm.dataSource.url.replace(/\\/*$/, tableName ? '/' + tableName : ''),\r\n data: JSON.stringify(data)\r\n }\r\n },\r\n remove: function (dm, keyField, value, tableName) {\r\n if(typeof(value) == \"string\"){\r\n return {\r\n type: \"DELETE\",\r\n url: dm.dataSource.url.replace(/\\/*$/, tableName ? '/' + tableName : '') + \"('\" + value + \"')\"\r\n };\r\n }\r\n return {\r\n type: \"DELETE\",\r\n url: dm.dataSource.url.replace(/\\/*$/, tableName ? '/' + tableName : '') + '(' + value + ')'\r\n };\r\n },\r\n update: function (dm, keyField, value, tableName) {\r\n return {\r\n type: \"PUT\",\r\n url: dm.dataSource.url.replace(/\\/*$/, tableName ? '/' + tableName : '') + '(' + value[keyField] + ')',\r\n data: JSON.stringify(value),\r\n accept: this.options.accept\r\n };\r\n },\r\n batchRequest: function (dm, changes, e) {\r\n var initialGuid = e.guid = ej.getGuid(oData.batchPre);\r\n var url = dm.dataSource.url.replace(/\\/*$/, '/' + this.options.batch);\r\n var args = {\r\n url: e.url,\r\n key: e.key,\r\n cid: 1,\r\n cSet: ej.getGuid(oData.changeSet)\r\n };\r\n var req = \"--\" + initialGuid + \"\\n\";\r\n\r\n req += \"Content-Type: multipart/mixed; boundary=\" + args.cSet.replace(\"--\", \"\") + \"\\n\";\r\n\r\n this.pvt.changeSet = 0;\r\n\r\n req += this.generateInsertRequest(changes.added, args);\r\n req += this.generateUpdateRequest(changes.changed, args);\r\n req += this.generateDeleteRequest(changes.deleted, args);\r\n\r\n req += args.cSet + \"--\\n\";\r\n req += \"--\" + initialGuid + \"--\";\r\n\r\n return {\r\n type: \"POST\",\r\n url: url,\r\n contentType: \"multipart/mixed; charset=UTF-8;boundary=\" + initialGuid,\r\n data: req\r\n };\r\n },\r\n generateDeleteRequest: function (arr, e) {\r\n if (!arr) return \"\";\r\n var req = \"\";\r\n\r\n for (var i = 0; i < arr.length; i++) {\r\n req += \"\\n\" + e.cSet + \"\\n\";\r\n req += oData.changeSetContent + \"\\n\\n\";\r\n req += \"DELETE \";\r\n req += e.url + \"(\" + arr[i][e.key] + \") HTTP/1.1\\n\";\r\n req += \"If-Match : * \\n\"\r\n req += \"Accept: \" + oData.accept + \"\\n\";\r\n req += \"Content-Id: \" + this.pvt.changeSet++ + \"\\n\";\r\n req += oData.batchChangeSetContentType + \"\\n\";\r\n }\r\n\r\n return req + \"\\n\";\r\n },\r\n generateInsertRequest: function (arr, e) {\r\n if (!arr) return \"\";\r\n var req = \"\";\r\n\r\n for (var i = 0; i < arr.length; i++) {\r\n req += \"\\n\" + e.cSet + \"\\n\";\r\n req += oData.changeSetContent + \"\\n\\n\";\r\n req += \"POST \";\r\n req += e.url + \" HTTP/1.1\\n\";\r\n req += \"Accept: \" + oData.accept + \"\\n\";\r\n req += \"Content-Id: \" + this.pvt.changeSet++ + \"\\n\";\r\n req += oData.batchChangeSetContentType + \"\\n\\n\";\r\n\r\n req += JSON.stringify(arr[i]) + \"\\n\";\r\n }\r\n\r\n return req;\r\n },\r\n generateUpdateRequest: function (arr, e) {\r\n if (!arr) return \"\";\r\n var req = \"\";\r\n\r\n for (var i = 0; i < arr.length; i++) {\r\n req += \"\\n\" + e.cSet + \"\\n\";\r\n req += oData.changeSetContent + \"\\n\\n\";\r\n req += \"PUT \";\r\n req += e.url + \"(\" + arr[i][e.key] + \")\" + \" HTTP/1.1\\n\";\r\n req += \"If-Match : * \\n\"\r\n req += \"Accept: \" + oData.accept + \"\\n\";\r\n req += \"Content-Id: \" + this.pvt.changeSet++ + \"\\n\";\r\n req += oData.batchChangeSetContentType + \"\\n\\n\";\r\n\r\n req += JSON.stringify(arr[i]) + \"\\n\\n\";\r\n }\r\n\r\n return req;\r\n },\r\n _p: function (prop) {\r\n return prop.replace(/\\./g, \"/\");\r\n }\r\n });\r\n ej.ODataV4Adaptor = new ej.ODataAdaptor().extend({\r\n options: {\r\n requestType: \"get\",\r\n accept: \"application/json;odata=light;q=1,application/json;odata=verbose;q=0.5\",\r\n multipartAccept: \"multipart/mixed\",\r\n sortBy: \"$orderby\",\r\n select: \"$select\",\r\n skip: \"$skip\",\r\n take: \"$top\",\r\n count: \"$count\",\r\n search: \"$search\",\r\n where: \"$filter\",\r\n expand: \"$expand\",\r\n batch: \"$batch\",\r\n changeSet: \"--changeset_\",\r\n batchPre: \"batch_\",\r\n contentId: \"Content-Id: \",\r\n batchContent: \"Content-Type: multipart/mixed; boundary=\",\r\n changeSetContent: \"Content-Type: application/http\\nContent-Transfer-Encoding: binary \",\r\n batchChangeSetContentType: \"Content-Type: application/json; charset=utf-8 \"\r\n },\r\n onCount: function (e) {\r\n return e === true ? \"true\" : \"\";\r\n },\r\n onPredicate: function (pred, query, requiresCast) {\r\n var returnValue = \"\",\r\n val = pred.value,\r\n isDate = val instanceof Date; \r\n ej.data.odUniOperator[\"contains\"] = \"contains\";\r\n returnValue = ej.ODataAdaptor.prototype.onPredicate.call(this, pred, query, requiresCast);\r\n ej.data.odUniOperator[\"contains\"] = \"substringof\";\r\n if (isDate)\r\n returnValue = returnValue.replace(/datetime'(.*)'$/, \"$1\");\r\n\r\n return returnValue;\r\n },\r\n onEachSearch: function (e) {\r\n\t\t\t var search = this.pvt.search || [];\r\n\t\t\t search.push(e.key);\r\n\t\t\t this.pvt.search = search;\r\n\t\t},\r\n\t\tonSearch: function (e) {\r\n\t\t\t return this.pvt.search.join(\" OR \");\r\n\t\t},\r\n beforeSend: function (dm, request, settings) {\r\n \r\n },\r\n processQuery: function (ds, query) {\r\n var digitsWithSlashesExp = /\\/[\\d*\\/]*/g;\r\n var poppedExpand = \"\";\r\n for (var i = query._expands.length - 1; i > 0; i--) {\r\n if (poppedExpand.indexOf(query._expands[i]) >= 0) { // If current expand is child of previous\r\n query._expands.pop(); // Just remove it because its in the expand already\r\n }\r\n else {\r\n if (digitsWithSlashesExp.test(query._expands[i])) { //If expanded to subentities\r\n poppedExpand = query._expands.pop();\r\n var r = poppedExpand.replace(digitsWithSlashesExp, \"($expand=\"); //Rewrite into odata v4 expand\r\n for (var j = 0; j < poppedExpand.split(digitsWithSlashesExp).length - 1; j++) {\r\n r = r + \")\"; // Add closing brackets\r\n }\r\n query._expands.unshift(r); // Add to the front of the array\r\n i++;\r\n }\r\n }\r\n }\r\n return ej.ODataAdaptor.prototype.processQuery.apply(this, [ds, query]);\r\n },\r\n processResponse: function (data, ds, query, xhr, request, changes) {\r\n var pvt = request && request.ejPvtData;\r\n if (xhr && xhr.getResponseHeader(\"Content-Type\") && xhr.getResponseHeader(\"Content-Type\").indexOf(\"xml\") != -1 && data.nodeType == 9)\r\n return query._requiresCount ? { result: [], count: 0 } : [];\r\n if (request && this.options.batch && request.url.endsWith(this.options.batch) && request.type.toLowerCase() === \"post\") {\r\n var guid = xhr.getResponseHeader(\"Content-Type\"), cIdx, jsonObj;\r\n guid = guid.substring(guid.indexOf(\"=batchresponse\") + 1);\r\n data = data.split(guid);\r\n if (data.length < 2) return;\r\n\r\n data = data[1];\r\n var exVal = /(?:\\bContent-Type.+boundary=)(changesetresponse.+)/i.exec(data);\r\n data.replace(exVal[0], \"\");\r\n\r\n var changeGuid = exVal[1];\r\n data = data.split(changeGuid);\r\n\r\n for (var i = data.length; i > -1; i--) {\r\n if (!/\\bContent-ID:/i.test(data[i]) || !/\\bHTTP.+201/.test(data[i]))\r\n continue;\r\n\r\n cIdx = parseInt(/\\bContent-ID: (\\d+)/i.exec(data[i])[1]);\r\n\r\n if (changes.added[cIdx]) {\r\n jsonObj = p.parseJson(/^\\{.+\\}/m.exec(data[i])[0]);\r\n $.extend(changes.added[cIdx], this.processResponse(jsonObj));\r\n }\r\n }\r\n return changes;\r\n }\r\n var count = null, aggregateResult = {};\r\n if (query && query._requiresCount)\r\n if ('@odata.count' in data) count = data['@odata.count'];\r\n\r\n data = ej.isNullOrUndefined(data.value) ? data : data.value;\r\n if (pvt && pvt.aggregates && pvt.aggregates.length) {\r\n var agg = pvt.aggregates, args = {}, fn, res = {};\r\n for (var i = 0; i < agg.length; i++) {\r\n fn = ej.aggregates[agg[i].type];\r\n if (fn)\r\n res[agg[i].field + \" - \" + agg[i].type] = fn(data, agg[i].field);\r\n }\r\n aggregateResult = res;\r\n }\r\n if (pvt && pvt.groups && pvt.groups.length) {\r\n var groups = pvt.groups;\r\n for (var i = 0; i < groups.length; i++) {\r\n var format = getColFormat(groups[i], query.queries);\r\n data = ej.group(data, groups[i], pvt.aggregates, format);\r\n }\r\n }\r\n return isNull(count) ? data : { result: data, count: count, aggregates: aggregateResult };\r\n },\r\n });\r\n ej.JsonAdaptor = new ej.Adaptor().extend({\r\n processQuery: function (ds, query) {\r\n var result = ds.dataSource.json.slice(0), count = result.length, cntFlg = true, ret, key, agg = {};\r\n\r\n for (var i = 0; i < query.queries.length; i++) {\r\n key = query.queries[i];\r\n ret = this[key.fn].call(this, result, key.e, query);\r\n if (key.fn == \"onAggregates\")\r\n agg[key.e.field + \" - \" + key.e.type] = ret;\r\n else\r\n result = ret !== undefined ? ret : result;\r\n\r\n if (key.fn === \"onPage\" || key.fn === \"onSkip\" || key.fn === \"onTake\" || key.fn === \"onRange\") cntFlg = false;\r\n\r\n if (cntFlg) count = result.length;\r\n }\r\n\r\n if (query._requiresCount) {\r\n result = {\r\n result: result,\r\n count: count,\r\n aggregates: agg\r\n };\r\n }\r\n\r\n return result;\r\n },\r\n batchRequest: function (dm, changes, e) {\r\n var i;\r\n for (i = 0; i < changes.added.length; i++)\r\n this.insert(dm, changes.added[i]);\r\n for (i = 0; i < changes.changed.length; i++)\r\n this.update(dm, e.key, changes.changed[i]);\r\n for (i = 0; i < changes.deleted.length; i++)\r\n this.remove(dm, e.key, changes.deleted[i]);\r\n return changes;\r\n },\r\n onWhere: function (ds, e) {\r\n if (!ds) return ds;\r\n\r\n return ds.filter(function (obj) {\r\n return e.validate(obj);\r\n });\r\n },\r\n onAggregates: function(ds, e){\r\n var fn = ej.aggregates[e.type];\r\n if (!ds || !fn || ds.length == 0) return null;\r\n return fn(ds, e.field);\r\n },\r\n onSearch: function (ds, e) {\r\n if (!ds || !ds.length) return ds;\r\n\r\n if (e.fieldNames.length === 0) {\r\n ej.pvt.getFieldList(ds[0], e.fieldNames);\r\n }\r\n\r\n return ds.filter(function (obj) {\r\n for (var j = 0; j < e.fieldNames.length; j++) {\r\n if (e.comparer.call(obj, ej.pvt.getObject(e.fieldNames[j], obj), e.searchKey, e.ignoreCase))\r\n return true;\r\n }\r\n return false;\r\n });\r\n },\r\n onSortBy: function (ds, e, query) {\r\n if (!ds) return ds;\r\n var fnCompare, field = getValue(e.fieldName, query);\r\n if (!field)\r\n return ds.sort(e.comparer);\r\n\r\n if (field instanceof Array) {\r\n field = field.slice(0);\r\n\r\n for (var i = field.length - 1; i >= 0; i--) {\r\n if (!field[i]) continue;\r\n\r\n fnCompare = e.comparer;\r\n\r\n if (field[i].endsWith(\" desc\")) {\r\n fnCompare = ej.pvt.fnSort(ej.sortOrder.Descending);\r\n field[i] = field[i].replace(\" desc\", \"\");\r\n }\r\n\r\n ds = stableSort(ds, field[i], fnCompare, []);\r\n }\r\n return ds;\r\n }\r\n return stableSort(ds, field, e.comparer, query ? query.queries : []);\r\n },\r\n onGroup: function (ds, e, query) {\r\n if (!ds) return ds;\r\n var aggQuery = filterQueries(query.queries, \"onAggregates\"), agg = [];\r\n if (aggQuery.length) {\r\n var tmp;\r\n for (var i = 0; i < aggQuery.length; i++) {\r\n tmp = aggQuery[i].e;\r\n agg.push({ type: tmp.type, field: getValue(tmp.field, query) });\r\n }\r\n }\r\n var format = getColFormat(e.fieldName, query.queries);\r\n return ej.group(ds, getValue(e.fieldName, query), agg, format);\r\n },\r\n onPage: function (ds, e, query) {\r\n var size = getValue(e.pageSize, query),\r\n start = (getValue(e.pageIndex, query) - 1) * size, end = start + size;\r\n\r\n if (!ds) return ds;\r\n\r\n return ds.slice(start, end);\r\n },\r\n onRange: function (ds, e) {\r\n if (!ds) return ds;\r\n return ds.slice(getValue(e.start), getValue(e.end));\r\n },\r\n onTake: function (ds, e) {\r\n if (!ds) return ds;\r\n\r\n return ds.slice(0, getValue(e.nos));\r\n },\r\n onSkip: function (ds, e) {\r\n if (!ds) return ds;\r\n return ds.slice(getValue(e.nos));\r\n },\r\n onSelect: function (ds, e) {\r\n if (!ds) return ds;\r\n return ej.select(ds, getValue(e.fieldNames));\r\n },\r\n insert: function (dm, data) {\r\n return dm.dataSource.json.push(data);\r\n },\r\n remove: function (dm, keyField, value, tableName) {\r\n var ds = dm.dataSource.json, i;\r\n if (typeof value === \"object\")\r\n value = ej.getObject(keyField, value);\r\n for (i = 0; i < ds.length; i++) {\r\n if (ej.getObject(keyField, ds[i]) === value) break;\r\n }\r\n\r\n return i !== ds.length ? ds.splice(i, 1) : null;\r\n },\r\n update: function (dm, keyField, value, tableName) {\r\n var ds = dm.dataSource.json, i, key = ej.getObject(keyField, value);\r\n\r\n for (i = 0; i < ds.length; i++) {\r\n if (ej.getObject(keyField, ds[i]) === key) break;\r\n }\r\n\r\n return i < ds.length ? $.extend(ds[i], value) : null;\r\n }\r\n });\r\n ej.ForeignKeyAdaptor = function (data, type) {\r\n var foreignObj = new ej[type || \"JsonAdaptor\"]().extend({\r\n init: function () {\r\n this.foreignData = [];\r\n this.key = [];\r\n this.adaptorType = type;\r\n this.value = [];\r\n this.fValue = [];\r\n this.keyField = [];\r\n var dataObj = data;\r\n for (var i = 0; i < dataObj.length; i++) {\r\n this.foreignData[i] = dataObj[i].dataSource;\r\n this.key[i] = dataObj[i].foreignKeyField;\r\n this.fValue[i] = ej.isNullOrUndefined(dataObj[i].field)? dataObj[i].foreignKeyValue : dataObj[i].field + \"_\" + dataObj[i].foreignKeyValue;\r\n this.value[i] = dataObj[i].foreignKeyValue;\r\n this.keyField[i] = dataObj[i].field || dataObj[i].foreignKeyField;\r\n this.initial = true;\r\n }\r\n },\r\n processQuery: function (ds, query) {\r\n var data = ds.dataSource.json;\r\n if (this.initial) {\r\n for (var i = 0; i < data.length; i++) {\r\n var proxy = this;\r\n for (var j = 0; j < this.foreignData.length; j++) {\r\n this.foreignData[j].filter(function (col) { //filtering the foreignKey dataSource\r\n if (ej.getObject(proxy.key[j], col) == ej.getObject(proxy.keyField[j], data[i]))\r\n data[i][proxy.fValue[j]] = ej.getObject(proxy.value[j], col);\r\n });\r\n }\r\n }\r\n this.initial = false;\r\n }\r\n return this.base.processQuery.apply(this, [ds, query]);\r\n },\r\n setValue: function (value) {\r\n for (var i = 0; i < this.foreignData.length; i++) {\r\n var proxy = this;\r\n var keyValue = value[this.fValue[i]];\r\n if (typeof keyValue == \"string\" && !isNaN(keyValue))\r\n keyValue = ej.parseFloat(keyValue);\r\n var data = $.grep(proxy.foreignData[i], function (e) {\r\n return e[proxy.value[i]] == keyValue;\r\n })[0];\r\n if (ej.isNullOrUndefined(data)) {\r\n data = $.grep(proxy.foreignData[i], function (e) {\r\n return e[proxy.key[i]] == keyValue;\r\n })[0];\r\n if (ej.getObject(this.value[i], data) != undefined)\r\n ej.createObject(proxy.value[i], ej.getObject(this.value[i], data), value);\r\n }\r\n if (ej.getObject(this.value[i], data) != undefined)\r\n ej.createObject(this.keyField[i], ej.getObject(this.key[i], data), value);\r\n }\r\n },\r\n insert: function (dm, data, tableName) {\r\n this.setValue(data);\r\n return {\r\n url: dm.dataSource.insertUrl || dm.dataSource.crudUrl || dm.dataSource.url,\r\n data: JSON.stringify({\r\n value: data,\r\n table: tableName,\r\n action: \"insert\",\r\n antiForgery: (dm.dataSource.antiForgery) ? dm.antiForgeryToken().value : \"\"\r\n })\r\n };\r\n },\r\n update: function (dm, keyField, value, tableName) {\r\n this.setValue(value);\r\n ej.JsonAdaptor.prototype.update(dm, keyField, value, tableName);\r\n return {\r\n type: \"POST\",\r\n url: dm.dataSource.updateUrl || dm.dataSource.crudUrl || dm.dataSource.url,\r\n data: JSON.stringify({\r\n value: value,\r\n action: \"update\",\r\n keyColumn: keyField,\r\n key: value[keyField],\r\n table: tableName,\r\n antiForgery: (dm.dataSource.antiForgery) ? dm.antiForgeryToken().value : \"\"\r\n })\r\n };\r\n }\r\n });\r\n $.extend(this, new foreignObj());\r\n return this;\r\n }\r\n ej.remoteSaveAdaptor = new ej.JsonAdaptor().extend({\r\n beforeSend: ej.UrlAdaptor.prototype.beforeSend,\r\n insert: ej.UrlAdaptor.prototype.insert,\r\n update: ej.UrlAdaptor.prototype.update,\r\n remove: ej.UrlAdaptor.prototype.remove,\r\n addParams: ej.UrlAdaptor.prototype.addParams,\r\n batchRequest: function (dm, changes, e, query) { \r\n\t\t\tvar res = {\r\n changed: changes.changed,\r\n added: changes.added,\r\n deleted: changes.deleted,\r\n action: \"batch\",\r\n table: e.url,\r\n key: e.key,\r\n antiForgery: (dm.dataSource.antiForgery) ? dm.antiForgeryToken().value : \"\"\r\n };\r\n if (query)\r\n this.addParams({ dm: dm, query: query, params: query._params, reqParams: res });\r\n return {\r\n type: \"POST\",\r\n url: dm.dataSource.batchUrl || dm.dataSource.crudUrl || dm.dataSource.url,\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n data: JSON.stringify(res)\r\n };\r\n },\r\n processResponse: function (data, ds, query, xhr, request, changes, key) {\r\n if(!ej.isNullOrUndefined(changes)){\r\n if (data.d)\r\n data = data.d;\r\n if(data.added)changes.added = data.added;\r\n if(data.changed)changes.changed = data.changed;\r\n if(data.deleted)changes.deleted = data.deleted;\r\n var i;\r\n for (i = 0; i < changes.added.length; i++)\r\n ej.JsonAdaptor.prototype.insert(ds, changes.added[i]);\r\n for (i = 0; i < changes.changed.length; i++)\r\n ej.JsonAdaptor.prototype.update(ds, key, changes.changed[i]);\r\n for (i = 0; i < changes.deleted.length; i++)\r\n ej.JsonAdaptor.prototype.remove(ds, key, changes.deleted[i]);\r\n return data;\r\n }\r\n else{\r\n if (data.d)\r\n return data.d;\r\n return data;\r\n }\r\n }\r\n });\r\n ej.WebApiAdaptor = new ej.ODataAdaptor().extend({\r\n insert: function (dm, data, tableName) {\r\n return {\r\n type: \"POST\",\r\n url: dm.dataSource.url,\r\n data: JSON.stringify(data)\r\n };\r\n },\r\n remove: function (dm, keyField, value, tableName) {\r\n return {\r\n type: \"DELETE\",\r\n url: dm.dataSource.url + \"/\" + value,\r\n data: JSON.stringify(value)\r\n };\r\n },\r\n update: function (dm, keyField, value, tableName) {\r\n return {\r\n type: \"PUT\",\r\n url: dm.dataSource.url,\r\n data: JSON.stringify(value)\r\n };\r\n },\r\n\t\tbatchRequest: function (dm, changes, e) {\r\n var initialGuid = e.guid = ej.getGuid(oData.batchPre);\r\n var req = [];\r\n\r\n\t\t //insertion \r\n\t\t\r\n\t\t\t$.each(changes.added, function (i, d) {\r\n\t\t\t req.push('--' + initialGuid);\r\n\t\t\t req.push('Content-Type: application/http; msgtype=request', '');\r\n\t\t\t req.push('POST' + ' ' + dm.dataSource.insertUrl + ' HTTP/1.1');\r\n\t\t\t req.push('Content-Type: ' + 'application/json; charset=utf-8');\r\n\t\t\t req.push('Host: ' + location.host);\r\n\t\t\t req.push('', d ? JSON.stringify(d) : '');\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\t//updation\r\n\t\t\t$.each(changes.changed, function (i, d) {\r\n\t\t\t req.push('--' + initialGuid);\r\n\t\t\t req.push('Content-Type: application/http; msgtype=request', '');\r\n\t\t\t req.push('PUT' + ' ' + dm.dataSource.updateUrl + ' HTTP/1.1');\r\n\t\t\t req.push('Content-Type: ' + 'application/json; charset=utf-8');\r\n\t\t\t req.push('Host: ' + location.host);\r\n\t\t\t req.push('', d ? JSON.stringify(d) : '');\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\t//deletion\r\n\t\t\t$.each(changes.deleted, function (i, d) {\r\n\t\t\t req.push('--' + initialGuid);\r\n req.push('Content-Type: application/http; msgtype=request', '');\r\n req.push('DELETE' + ' ' + dm.dataSource.removeUrl +\"/\"+ d[e.key] + ' HTTP/1.1');\r\n req.push('Content-Type: ' + 'application/json; charset=utf-8');\r\n req.push('Host: ' + location.host);\r\n req.push('', d ? JSON.stringify(d) : '');\t\t\r\n\t\t\t});\r\n\t\t\treq.push('--' + initialGuid + '--', '');\r\n return {\r\n\t\t\t\ttype: 'POST',\r\n\t\t\t\turl: dm.dataSource.batchUrl || dm.dataSource.crudUrl || dm.dataSource.url,\r\n data: req.join('\\r\\n'),\r\n contentType: 'multipart/mixed; boundary=\"' + initialGuid + '\"',\r\n };\r\n },\r\n processResponse: function (data, ds, query, xhr, request, changes) {\r\n\r\n var pvt = request && request.ejPvtData;\r\n if (request && request.type.toLowerCase() != \"post\") {\r\n var version = xhr && xhr.getResponseHeader(\"DataServiceVersion\"), count = null, aggregateResult = {};\r\n version = (version && parseInt(version, 10)) || 2;\r\n\r\n if (query && query._requiresCount) {\r\n if (!isNull(data.Count)) count = data.Count;\r\n }\r\n\r\n if (version < 3 && data.Items) data = data.Items;\r\n\r\n if (pvt && pvt.aggregates && pvt.aggregates.length) {\r\n var agg = pvt.aggregates, args = {}, fn, res = {};\r\n for (var i = 0; i < agg.length; i++) {\r\n fn = ej.aggregates[agg[i].type];\r\n if (fn)\r\n res[agg[i].field + \" - \" + agg[i].type] = fn(data, agg[i].field);\r\n }\r\n aggregateResult = res;\r\n }\r\n if (pvt && pvt.groups && pvt.groups.length) {\r\n var groups = pvt.groups;\r\n for (var i = 0; i < groups.length; i++) {\r\n var format = getColFormat(groups[i], query.queries);\r\n data = ej.group(data, groups[i], pvt.aggregates, format);\r\n }\r\n }\r\n return isNull(count) ? data : { result: data, count: count, aggregates: aggregateResult };\r\n }\r\n }\r\n });\r\n var getValue = function (value, inst) {\r\n if (typeof value === \"function\")\r\n return value.call(inst || {});\r\n return value;\r\n }\r\n\r\n ej.TableModel = function (name, jsonArray, dataManager, modelComputed) {\r\n if (!instance(this, ej.TableModel))\r\n return new ej.TableModel(jsonArray);\r\n\r\n if (!instance(jsonArray, Array))\r\n throwError(\"ej.TableModel - Json Array is required\");\r\n\r\n var rows = [], model, dirtyFn = $proxy(setDirty, this);\r\n\r\n for (var i = 0; i < jsonArray.length; i++) {\r\n model = new ej.Model(jsonArray[i], this);\r\n model.state = \"unchanged\";\r\n model.on(\"stateChange\", dirtyFn);\r\n if (modelComputed)\r\n model.computes(modelComputed);\r\n rows.push(model);\r\n }\r\n\r\n this.name = name || \"table1\";\r\n\r\n this.rows = ej.NotifierArray(rows);\r\n this._deleted = [];\r\n\r\n this._events = $({});\r\n\r\n this.dataManager = dataManager;\r\n\r\n this._isDirty = false;\r\n\r\n return this;\r\n };\r\n\r\n ej.TableModel.prototype = {\r\n on: function (eventName, handler) {\r\n this._events.on(eventName, handler);\r\n },\r\n\r\n off: function (eventName, handler) {\r\n this._events.off(eventName, handler);\r\n },\r\n\r\n setDataManager: function (dataManager) {\r\n this.dataManagar = dataManager;\r\n },\r\n\r\n saveChanges: function () {\r\n if (!this.dataManager || !instance(this.dataManager, ej.DataManager))\r\n throwError(\"ej.TableModel - saveChanges : Set the dataManager using setDataManager function\");\r\n\r\n if (!this.isDirty())\r\n return;\r\n\r\n var promise = this.dataManager.saveChanges(this.getChanges(), this.key, this.name);\r\n\r\n promise.done($proxy(function (changes) {\r\n var rows = this.toArray();\r\n for (var i = 0; i < rows.length; i++) {\r\n if (rows.state === \"added\") {\r\n rows.set(this.key, changes.added.filter(function (e) {\r\n return e[this.key] === rows.get(this.key);\r\n })[0][this.key]);\r\n }\r\n rows[i].markCommit();\r\n }\r\n\r\n this._events.triggerHandler({ type: \"save\", table: this });\r\n\r\n }, this));\r\n\r\n promise.fail($proxy(function (e) {\r\n this.rejectChanges();\r\n this._events.triggerHandler({ type: \"reject\", table: this, error: e });\r\n }, this));\r\n\r\n this._isDirty = false;\r\n },\r\n\r\n rejectChanges: function () {\r\n var rows = this.toArray();\r\n for (var i = 0; i < rows.length; i++)\r\n rows[i].revert(true);\r\n\r\n this._isDirty = false;\r\n this._events.triggerHandler({ type: \"reject\", table: this });\r\n },\r\n\r\n insert: function (json) {\r\n var model = new ej.Model(json);\r\n model._isDirty = this._isDirty = true;\r\n\r\n this.rows.push(model);\r\n\r\n this._events.triggerHandler({ type: \"insert\", model: model, table: this });\r\n },\r\n\r\n update: function (value) {\r\n if (!this.key)\r\n throwError(\"TableModel - update : Primary key should be assigned to TableModel.key\");\r\n\r\n var row = value, model, key = this.key, keyValue = row[key];\r\n\r\n model = this.rows.array.filter(function (obj) {\r\n return obj.get(key) === keyValue;\r\n });\r\n\r\n model = model[0];\r\n\r\n for (var col in row) {\r\n model.set(col, row[col]);\r\n }\r\n\r\n this._isDirty = true;\r\n\r\n this._events.triggerHandler({ type: \"update\", model: model, table: this });\r\n },\r\n\r\n remove: function (key) {\r\n if (!this.key)\r\n throwError(\"TableModel - update : Primary key should be assigned to TableModel.key\");\r\n\r\n var field = this.key;\r\n\r\n var index = -1, model;\r\n\r\n if (key && typeof key === \"object\") {\r\n key = key[field] !== undefined ? key[field] : key.get(field);\r\n }\r\n\r\n for (var i = 0; i < this.rows.length() ; i++) {\r\n if (this.rows.array[i].get(field) === key) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n\r\n if (index > -1) {\r\n model = this.rows.removeAt(index);\r\n model.markDelete();\r\n\r\n this._deleted.push({ model: model, position: index });\r\n\r\n this._isDirty = true;\r\n this._events.triggerHandler({ type: \"remove\", model: model, table: this });\r\n }\r\n },\r\n\r\n isDirty: function () {\r\n return this._isDirty;\r\n },\r\n\r\n getChanges: function () {\r\n\r\n var changes = {\r\n added: [],\r\n changed: []\r\n };\r\n var rows = this.toArray();\r\n for (var i = 0; i < rows.length; i++) {\r\n if (changes[rows[i].state])\r\n changes[rows[i].state].push(rows[i].json);\r\n }\r\n\r\n changes.deleted = ej.select(this._deleted, [\"model\"]);\r\n\r\n return changes;\r\n },\r\n\r\n toArray: function () {\r\n return this.rows.toArray();\r\n },\r\n\r\n setDirty: function (dirty, model) {\r\n if (this._isDirty === !!dirty) return;\r\n\r\n this._isDirty = !!dirty;\r\n\r\n this._events.triggerHandler({ type: \"dirty\", table: this, model: model });\r\n },\r\n get: function (index) {\r\n return this.rows.array[index];\r\n },\r\n length: function () {\r\n return this.rows.array.length;\r\n },\r\n\r\n bindTo: function (element) {\r\n var marker = tDiv, template = $(element.html()), rows = this.toArray(), cur;\r\n if ($.inArray(element.prop(\"tagName\").toLowerCase(), [\"table\", \"tbody\"]))\r\n marker = tTR;\r\n\r\n marker.insertBefore(element);\r\n element.detach().empty();\r\n\r\n for (var i = 0; i < rows.length; i++) {\r\n cur = template.clone();\r\n rows[i].bindTo(cur);\r\n element.append(cur);\r\n }\r\n\r\n element.insertAfter(marker);\r\n marker.remove();\r\n }\r\n };\r\n\r\n var tDiv = doc ? $(document.createElement(\"div\")) : {},\r\n tTR = doc ? $(document.createElement(\"tr\")) : {};\r\n\r\n ej.Model = function (json, table, name) {\r\n if (typeof table === \"string\") {\r\n name = table;\r\n table = null;\r\n }\r\n this.$id = getUid(\"m\");\r\n\r\n this.json = json;\r\n this.table = table instanceof ej.TableModel ? table : null;\r\n this.name = name || (this.table && this.table.name);\r\n this.dataManager = (table instanceof ej.DataManager) ? table : table.dataManagar;\r\n this.actual = {};\r\n this._events = $({});\r\n this.isDirty = false;\r\n this.state = \"added\";\r\n this._props = [];\r\n this._computeEls = {};\r\n this._fields = {};\r\n this._attrEls = {};\r\n this._updates = {};\r\n this.computed = {};\r\n };\r\n\r\n ej.Model.prototype = {\r\n computes: function (value) {\r\n $.extend(this.computed, value);\r\n },\r\n on: function (eventName, handler) {\r\n this._events.on(eventName, handler);\r\n },\r\n off: function (eventName, handler) {\r\n this._events.off(eventName, handler);\r\n },\r\n set: function (field, value) {\r\n var obj = this.json, actual = field, prev;\r\n field = field.split('.');\r\n\r\n for (var i = 0; i < field.length - 1; i++) {\r\n field = field[0];\r\n obj = obj[field[0]];\r\n }\r\n\r\n this.isDirty = true;\r\n this.changeState(\"changed\", { from: \"set\" });\r\n\r\n prev = obj[field];\r\n\r\n if (this.actual[field] === undefined && !(field in this.actual))\r\n this.actual[field] = value; // Complex property ?\r\n\r\n obj[field] = value;\r\n\r\n this._updateValues(field, value);\r\n this._events.triggerHandler({ type: actual, current: value, previous: prev, model: this });\r\n },\r\n get: function (field) {\r\n return ej.pvt.getObject(field, this.json);\r\n },\r\n revert: function (suspendEvent) {\r\n for (var prop in this.actual) {\r\n this.json[prop] = this.actual[prop];\r\n }\r\n\r\n this.isDirty = false;\r\n\r\n if (suspendEvent)\r\n this.state = \"unchanged\";\r\n else\r\n this.changeState(\"unchanged\", { from: \"revert\" });\r\n },\r\n save: function (dm, key) {\r\n dm = dm || this.dataManagar;\r\n key = key || dm.dataSource.key;\r\n if (!dm) throwError(\"ej.Model - DataManager is required to commit the changes\");\r\n if (this.state === \"added\") {\r\n return dm.insert(this.json, this.name).done(ej.proxy(function (e) {\r\n $.extend(this.json, e.record);\r\n }, this));\r\n }\r\n else if (this.state === \"changed\") {\r\n return dm.update(key, this.json, this.name);\r\n }\r\n else if (this.state === \"deleted\") {\r\n return dm.remove(key, this.json, this.name);\r\n }\r\n },\r\n markCommit: function () {\r\n this.isDirty = false;\r\n this.changeState(\"unchanged\", { from: \"commit\" });\r\n },\r\n markDelete: function () {\r\n this.changeState(\"deleted\", { from: \"delete\" });\r\n },\r\n changeState: function (state, args) {\r\n if (this.state === state) return;\r\n\r\n if (this.state === \"added\") {\r\n if (state === \"deleted\")\r\n state = \"unchanged\";\r\n else return;\r\n }\r\n\r\n var prev = state;\r\n args = args || {};\r\n\r\n this.state = state;\r\n this._events.triggerHandler($.extend({ type: \"stateChange\", current: state, previous: prev, model: this }, args));\r\n },\r\n properties: function () {\r\n if (this._props.length)\r\n return this._props;\r\n\r\n for (var pr in this.json) {\r\n this._props.push(pr);\r\n this._updates[pr] = { read: [], input: [] };\r\n }\r\n\r\n return this._props;\r\n },\r\n bindTo: function (element) {\r\n var el = $(element), ctl, field,\r\n elements = el.find(\"[ej-observe], [ej-computed], [ej-prop]\"), len = elements.length;\r\n\r\n el.data(\"ejModel\", this);\r\n var unbindData = { fields: [], props: [], computes: [] };\r\n for (var i = 0; i < len; i++) {\r\n ctl = elements.eq(i);\r\n\r\n field = ctl.attr(\"ej-prop\");\r\n if (field) {\r\n this._processAttrib(field, ctl, unbindData);\r\n }\r\n field = ctl.attr(\"ej-observe\");\r\n if (field && this._props.indexOf(field) !== -1) {\r\n this._processField(ctl, field, unbindData);\r\n continue;\r\n }\r\n\r\n field = ctl.attr(\"ej-computed\");\r\n if (field) {\r\n this._processComputed(field, ctl, unbindData);\r\n continue;\r\n }\r\n }\r\n el.data(\"ejModelBinding\" + this.$id, unbindData);\r\n },\r\n unbind: function (element) {\r\n var tmp, data = {\r\n props: this._attrEls,\r\n computes: this._computeEls\r\n }, isCustom = false;\r\n\r\n if (element) {\r\n data = $(element).removeData(\"ejModel\").data(\"ejModelBinding\" + this.$id) || data;\r\n isCustom = true;\r\n }\r\n\r\n for (var p in this.computed) {\r\n tmp = data.computes[p], p = this.computed[p];\r\n if (tmp && p.deps) {\r\n this.off(p.deps.join(' '), tmp.handle);\r\n if (isCustom)\r\n delete this._computeEls[p];\r\n }\r\n }\r\n if (!isCustom)\r\n this._computeEls = {};\r\n\r\n for (var p in data.props) {\r\n tmp = data.props[p];\r\n if (tmp) {\r\n this.off(tmp.deps.join(' '), tmp.handle);\r\n delete data.props[p];\r\n if (isCustom)\r\n delete this._attrEls[p];\r\n }\r\n }\r\n if (!isCustom)\r\n this._attrEls = {};\r\n\r\n if (data.fields && data.fields.length) {\r\n var len = data.fields.length, ctl, idx, ty;\r\n for (var i = 0; i < len; i++) {\r\n ctl = data.fields[i];\r\n $(ctl).off(\"change\", null, this._changeHandler);\r\n\r\n ty = this.formElements.indexOf(ctl.tagName.toLowerCase()) !== -1 ? \"input\" : \"read\";\r\n idx = this._updates[ty].indexOf(ctl);\r\n if (idx !== -1)\r\n this._updates[ty].splice(idx, 1);\r\n }\r\n }\r\n },\r\n _processComputed: function (value, element, data) {\r\n if (!value) return;\r\n\r\n var val, deps, safeVal = safeStr(value),\r\n type = this.formElements.indexOf(element[0].tagName.toLowerCase()) !== -1 ? \"val\" : \"html\";\r\n\r\n if (!this.computed[value] || !this.computed[safeVal]) {\r\n this.computed[safeVal] = {\r\n value: new Function(\"var e = this; return \" + value),\r\n deps: this._generateDeps(value)\r\n }\r\n value = safeVal;\r\n }\r\n\r\n val = this.computed[value];\r\n if (!val.get) {\r\n val.get = function () {\r\n val.value.call(this.json);\r\n }\r\n }\r\n\r\n deps = val.deps;\r\n val = val.value;\r\n\r\n this._updateDeps(deps);\r\n this._updateElement(element, type, val);\r\n\r\n val = { el: element, handle: $proxy(this._computeHandle, this, { value: value, type: type }) };\r\n this._computeEls[value] = val;\r\n data.computes[value] = val;\r\n\r\n this.on(deps.join(' '), val.handle);\r\n },\r\n _computeHandle: function (e) {\r\n var el = this._computeEls[e.value];\r\n if (el && this.computed[e.value])\r\n this._updateElement(el.el, e.type, this.computed[e.value].value);\r\n },\r\n _updateElement: function (el, type, val) {\r\n el[type](val.call($.extend({}, this.json, this.computed)));\r\n },\r\n _updateDeps: function (deps) {\r\n for (var i = 0; i < deps.length; i++) {\r\n if (!(deps[i] in this.json) && deps[i] in this.computed)\r\n ej.merge(deps, this.computed[deps[i]].deps);\r\n }\r\n },\r\n _generateDeps: function (value) {\r\n var splits = value.replace(/(^e\\.)|( e\\.)/g, '#%^*##ej.#').split(\"#%^*#\"),\r\n field, deps = [];\r\n\r\n for (var i = 0; i < splits.length; i++) {\r\n if (splits[i].startsWith(\"#ej.#\")) {\r\n field = splits[i].replace(\"#ej.#\", \"\").split(' ')[0];\r\n if (field && this._props.indexOf(field) !== -1)\r\n deps.push(field);\r\n }\r\n }\r\n\r\n return deps;\r\n },\r\n _processAttrib: function (value, el, data) {\r\n var prop, val, res = {};\r\n value = value.replace(/^ +| +$/g, \"\").split(\";\");\r\n for (var i = 0; i < value.length; i++) {\r\n value[i] = value[i].split(\":\");\r\n if (value[i].length < 2) continue;\r\n\r\n prop = value[i][0].replace(/^ +| +$/g, \"\").replace(/^'|^\"|'$|\"$/g, \"\");\r\n res[prop] = value[i][1].replace(/^ +| +$/g, \"\").replace(/^'|^\"|'$|\"$/g, \"\");\r\n }\r\n value = res;\r\n var deps = [];\r\n for (prop in value)\r\n deps.push(value[prop]);\r\n\r\n this._updateDeps(deps);\r\n this._updateProps(el, value);\r\n\r\n res = getUid(\"emak\");\r\n val = { el: el, handle: $proxy(this._attrHandle, this, res), value: value, deps: deps };\r\n el.prop(\"ejmodelattrkey\", res);\r\n\r\n data.props[res] = val;\r\n this._attrEls[res] = val;\r\n\r\n this.on(deps.join(' '), val.handle);\r\n },\r\n _attrHandle: function (res) {\r\n var el = this._attrEls[res];\r\n if (el)\r\n this._updateProps(el.el, el.value);\r\n },\r\n _updateProps: function (element, value) {\r\n var json = this.json, t, c = this.computed;\r\n for (var prop in value) {\r\n t = value[prop];\r\n if (t in json)\r\n t = json[t];\r\n else if (t in c) {\r\n t = c[t];\r\n if (t) {\r\n t = t.value.call($.extend({}, this.json, c));\r\n }\r\n }\r\n\r\n if (!isNull(t)) {\r\n element.prop(prop, t);\r\n }\r\n }\r\n },\r\n _updateValues: function (prop, value) {\r\n var arr = this._updates[prop];\r\n\r\n if (!arr || (!arr.read && !arr.input)) return;\r\n\r\n this._ensureItems(arr.read, \"html\", value);\r\n this._ensureItems(arr.input, \"val\", value);\r\n },\r\n _ensureItems: function (a, type, value) {\r\n if (!a) return;\r\n\r\n for (var i = a.length - 1; i > -1; i--) {\r\n if (!a[i].offsetParent) {\r\n a.splice(i, 1);\r\n continue;\r\n }\r\n $(a[i])[type](value);\r\n }\r\n },\r\n _changeHandler: function (e) {\r\n e.data.self.set(e.data.prop, $(this).val());\r\n },\r\n _processField: function (ctl, field, data) {\r\n var e = { self: this, prop: field }, val = this.get(field);\r\n\r\n data.fields.push(ctl[0]);\r\n\r\n if (this.formElements.indexOf(ctl[0].tagName.toLowerCase()) === -1) {\r\n ctl.html(val);\r\n return this._updates[field].read.push(ctl[0]);\r\n }\r\n\r\n ctl.val(val)\r\n .off(\"change\", null, this._changeHandler)\r\n .on(\"change\", null, e, this._changeHandler);\r\n\r\n return this._updates[field].input.push(ctl[0]);\r\n },\r\n formElements: [\"input\", \"select\", \"textarea\"]\r\n };\r\n\r\n var safeReg = /[^\\w]+/g;\r\n var safeStr = function (value) {\r\n return value.replace(safeReg, \"_\");\r\n };\r\n var setDirty = function (e) {\r\n this.setDirty(true, e.model);\r\n };\r\n\r\n ej.Predicate = function (field, operator, value, ignoreCase) {\r\n if (!(this instanceof ej.Predicate))\r\n return new ej.Predicate(field, operator, value, ignoreCase);\r\n\r\n if (typeof field === \"string\") {\r\n\t\t\tvar checkAny = \"\";\r\n\t\t\tif(operator.toLowerCase().indexOf(\" any\") != -1) {\r\n\t\t\t\toperator = operator.replace(\" any\",\"\");\r\n\t\t\t\tcheckAny = \"any\";\r\n\t\t\t} \r\n\t\t\telse if(operator.toLowerCase().indexOf(\" all\") != -1) {\r\n\t\t\t\toperator = operator.replace(\" all\",\"\");\r\n\t\t\t\tcheckAny = \"all\";\r\n\t\t\t} \r\n this.field = field;\r\n this.operator = operator;\r\n this.value = value;\r\n this.ignoreCase = ignoreCase;\r\n this.isComplex = false;\r\n\t\t\tthis.anyCondition = checkAny;\r\n\r\n this._comparer = ej.data.fnOperators.processOperator(checkAny != \"\" ? checkAny:this.operator);\r\n\r\n } else if (field instanceof ej.Predicate && value instanceof ej.Predicate || value instanceof Array) {\r\n this.isComplex = true;\r\n this.condition = operator.toLowerCase();\r\n this.predicates = [field];\r\n if (value instanceof Array)\r\n [].push.apply(this.predicates, value);\r\n else\r\n this.predicates.push(value);\r\n }\r\n return this;\r\n };\r\n\r\n ej.Predicate.and = function () {\r\n return pvtPredicate._combinePredicates([].slice.call(arguments, 0), \"and\");\r\n };\r\n\r\n ej.Predicate.or = function () {\r\n return pvtPredicate._combinePredicates([].slice.call(arguments, 0), \"or\");\r\n };\r\n\r\n ej.Predicate.fromJSON = function (json) {\r\n if (instance(json, Array)) {\r\n var res = [];\r\n for (var i = 0, len = json.length; i < len; i++)\r\n res.push(pvtPredicate._fromJSON(json[i]));\r\n return res;\r\n }\r\n\r\n return pvtPredicate._fromJSON(json);\r\n };\r\n\r\n // Private fn\r\n var pvtPredicate = {\r\n _combinePredicates: function (predicates, operator) {\r\n if (!predicates.length) return undefined;\r\n if (predicates.length === 1) {\r\n if (!instance(predicates[0], Array))\r\n return predicates[0];\r\n predicates = predicates[0];\r\n }\r\n return new ej.Predicate(predicates[0], operator, predicates.slice(1));\r\n },\r\n\r\n _combine: function (pred, field, operator, value, condition, ignoreCase) {\r\n if (field instanceof ej.Predicate)\r\n return ej.Predicate[condition](pred, field);\r\n\r\n if (typeof field === \"string\")\r\n return ej.Predicate[condition](pred, new ej.Predicate(field, operator, value, ignoreCase));\r\n\r\n return throwError(\"Predicate - \" + condition + \" : invalid arguments\");\r\n },\r\n\r\n _fromJSON: function (json) {\r\n\r\n if (!json || instance(json, ej.Predicate))\r\n return json;\r\n\r\n var preds = json.predicates || [], len = preds.length, predicates = [], result;\r\n\r\n for (var i = 0; i < len; i++)\r\n predicates.push(pvtPredicate._fromJSON(preds[i])); \r\n\r\n if(!json.isComplex)\r\n result = new ej.Predicate(json.field, json.operator, ej.parseJSON({ val: json.value }).val, json.ignoreCase);\r\n else\r\n result = new ej.Predicate(predicates[0], json.condition, predicates.slice(1));\r\n\r\n return result;\r\n }\r\n };\r\n\r\n ej.Predicate.prototype = {\r\n and: function (field, operator, value, ignoreCase) {\r\n return pvtPredicate._combine(this, field, operator, value, \"and\", ignoreCase);\r\n },\r\n or: function (field, operator, value, ignoreCase) {\r\n return pvtPredicate._combine(this, field, operator, value, \"or\", ignoreCase);\r\n },\r\n validate: function (record) {\r\n var p = this.predicates, isAnd, ret;\r\n\r\n if (!this.isComplex) {\r\n return this._comparer.call(this, ej.pvt.getObject(this.field, record), this.value, this.ignoreCase);\r\n }\r\n\r\n isAnd = this.condition === \"and\";\r\n\r\n for (var i = 0; i < p.length; i++) {\r\n ret = p[i].validate(record);\r\n if (isAnd) {\r\n if (!ret) return false;\r\n } else {\r\n if (ret) return true;\r\n }\r\n }\r\n\r\n return isAnd;\r\n },\r\n toJSON: function () {\r\n var predicates, p;\r\n if (this.isComplex) {\r\n predicates = [], p = this.predicates;\r\n for (var i = 0; i < p.length; i++)\r\n predicates.push(p[i].toJSON());\r\n }\r\n return {\r\n isComplex: this.isComplex,\r\n field: this.field,\r\n operator: this.operator,\r\n value: this.value,\r\n ignoreCase: this.ignoreCase,\r\n condition: this.condition,\r\n predicates: predicates,\r\n\t\t\t\tanyCondition: this.anyCondition\r\n }\r\n }\r\n };\r\n\r\n ej.dataUtil = {\r\n swap: function (array, x, y) {\r\n if (x == y) return;\r\n\r\n var tmp = array[x];\r\n array[x] = array[y];\r\n array[y] = tmp;\r\n },\r\n\r\n mergeSort: function (jsonArray, fieldName, comparer) {\r\n if (!comparer || typeof comparer === \"string\")\r\n comparer = ej.pvt.fnSort(comparer, true);\r\n\r\n if (typeof fieldName === \"function\") {\r\n comparer = fieldName;\r\n fieldName = null;\r\n }\r\n\r\n return ej.pvt.mergeSort(jsonArray, fieldName, comparer);\r\n },\r\n\r\n max: function (jsonArray, fieldName, comparer) {\r\n if (typeof fieldName === \"function\") {\r\n comparer = fieldName;\r\n fieldName = null;\r\n }\r\n\r\n return ej.pvt.getItemFromComparer(jsonArray, fieldName, comparer || ej.pvt.fnDescending);\r\n },\r\n\r\n min: function (jsonArray, fieldName, comparer) {\r\n if (typeof fieldName === \"function\") {\r\n comparer = fieldName;\r\n fieldName = null;\r\n }\r\n\r\n return ej.pvt.getItemFromComparer(jsonArray, fieldName, comparer || ej.pvt.fnAscending);\r\n },\r\n\r\n distinct: function (json, fieldName, requiresCompleteRecord) {\r\n var result = [], val, tmp = {};\r\n for (var i = 0; i < json.length; i++) {\r\n val = getVal(json, fieldName, i);\r\n if (!(val in tmp)) {\r\n result.push(!requiresCompleteRecord ? val : json[i]);\r\n tmp[val] = 1;\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n sum: function (json, fieldName) {\r\n var result = 0, val, castRequired = typeof getVal(json, fieldName, 0) !== \"number\";\r\n\r\n for (var i = 0; i < json.length; i++) {\r\n val = getVal(json, fieldName, i);\r\n if (!isNaN(val) && val !== null) {\r\n if (castRequired)\r\n val = +val;\r\n result += val;\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n avg: function (json, fieldName) {\r\n return ej.sum(json, fieldName) / json.length;\r\n },\r\n\r\n select: function (jsonArray, fields) {\r\n var newData = [];\r\n\r\n for (var i = 0; i < jsonArray.length; i++) {\r\n newData.push(ej.pvt.extractFields(jsonArray[i], fields));\r\n }\r\n\r\n return newData;\r\n },\r\n\r\n group: function (jsonArray, field, agg, format,/* internal */ level,groupDs) {\r\n level = level || 1;\r\n\r\n if (jsonArray.GROUPGUID == ej.pvt.consts.GROUPGUID) {\r\n for (var j = 0; j < jsonArray.length; j++) {\r\n if(!ej.isNullOrUndefined(groupDs)){\r\n var indx = -1;\r\n var temp = $.grep(groupDs,function(e){return e.key==jsonArray[j].key});\r\n indx = groupDs.indexOf(temp[0]);\r\n jsonArray[j].items = ej.group(jsonArray[j].items, field, agg, format, jsonArray.level + 1, groupDs[indx].items);\r\n jsonArray[j].count = groupDs[indx].count;\r\n }\r\n else{\r\n jsonArray[j].items = ej.group(jsonArray[j].items, field, agg, format, jsonArray.level + 1);\r\n jsonArray[j].count = jsonArray[j].items.length;\r\n } \r\n }\r\n\r\n jsonArray.childLevels += 1;\r\n return jsonArray;\r\n }\r\n\r\n var grouped = {}, groupedArray = [];\r\n\r\n groupedArray.GROUPGUID = ej.pvt.consts.GROUPGUID;\r\n groupedArray.level = level;\r\n groupedArray.childLevels = 0;\r\n groupedArray.records = jsonArray;\r\n\r\n for (var i = 0; i < jsonArray.length; i++) {\r\n var val = getVal(jsonArray, field, i);\r\n if (!ej.isNullOrUndefined(format)) val = format(val, field);\r\n\r\n if (!grouped[val]) {\r\n grouped[val] = {\r\n key: val,\r\n count: 0,\r\n items: [],\r\n aggregates: {},\r\n field: field\r\n };\r\n groupedArray.push(grouped[val]);\r\n\t\t\t\t\tif(!ej.isNullOrUndefined(groupDs)) {\r\n var tempObj = $.grep(groupDs,function(e){return e.key==grouped[val].key});\r\n grouped[val].count = tempObj[0].count\r\n }\r\n }\r\n\r\n grouped[val].count = !ej.isNullOrUndefined(groupDs) ? grouped[val].count : grouped[val].count += 1;\r\n grouped[val].items.push(jsonArray[i]);\r\n }\r\n if (agg && agg.length) {\r\n\r\n for (var i = 0; i < groupedArray.length; i++) {\r\n var res = {}, fn;\r\n for (var j = 0; j < agg.length; j++) {\r\n\r\n fn = ej.aggregates[agg[j].type];\r\n if(!ej.isNullOrUndefined(groupDs)) {\r\n var temp = $.grep(groupDs,function(e){return e.key==groupedArray[i].key});\r\n if(fn)\r\n res[agg[j].field + \" - \" + agg[j].type] = fn(temp[0].items, agg[j].field);\r\n }\r\n else{\r\n if (fn)\r\n res[agg[j].field + \" - \" + agg[j].type] = fn(groupedArray[i].items, agg[j].field);\r\n }\r\n\r\n }\r\n groupedArray[i][\"aggregates\"] = res;\r\n }\r\n }\r\n return groupedArray;\r\n },\r\n\r\n parseTable: function (table, headerOption, headerRowIndex) {\r\n var tr = table.rows, headerRow, headerTds = [], data = [], i;\r\n\r\n if (!tr.length) return [];\r\n\r\n headerRowIndex = headerRowIndex || 0;\r\n\r\n switch ((headerOption || \"\").toLowerCase()) {\r\n case ej.headerOption.tHead:\r\n headerRow = table.tHead.rows[headerRowIndex];\r\n break;\r\n case ej.headerOption.row:\r\n default:\r\n headerRow = table.rows[headerRowIndex];\r\n break;\r\n }\r\n\r\n var hTd = headerRow.cells;\r\n\r\n for (i = 0; i < hTd.length; i++)\r\n headerTds.push($.trim(hTd[i].innerHTML));\r\n\r\n for (i = headerRowIndex + 1; i < tr.length; i++) {\r\n var json = {}, td = tr[i].cells;\r\n for (var j = 0; j < td.length; j++) {\r\n var temp = td[j].innerHTML;\r\n if (typeof temp == \"string\" && $.isNumeric(temp))\r\n json[headerTds[j]] = Number(temp);\r\n\t\t\t\t else\r\n json[headerTds[j]] = temp;\r\n }\r\n data.push(json);\r\n }\r\n return data;\r\n }\r\n };\r\n\r\n ej.headerOption = {\r\n tHead: \"thead\",\r\n row: \"row\"\r\n };\r\n\r\n ej.aggregates = {\r\n sum: function (ds, field) {\r\n return ej.sum(ds, field);\r\n },\r\n average: function (ds, field) {\r\n return ej.avg(ds, field);\r\n },\r\n minimum: function (ds, field) {\r\n return ej.getObject(field, ej.min(ds, field));\r\n },\r\n maximum: function (ds, field) {\r\n return ej.getObject(field, ej.max(ds, field));\r\n },\r\n truecount: function (ds, field){\r\n var predicate = ej.Predicate(field, \"equal\", true);\r\n return ej.DataManager(ds).executeLocal(ej.Query().where(predicate)).length;\r\n },\r\n falsecount: function (ds, field) {\r\n var predicate = ej.Predicate(field, \"equal\", false);\r\n return ej.DataManager(ds).executeLocal(ej.Query().where(predicate)).length;\r\n },\r\n count: function (ds, field) {\r\n return ds.length;\r\n }\r\n\r\n };\r\n ej.pvt = {\r\n filterQueries: filterQueries,\r\n mergeSort: function (jsonArray, fieldName, comparer) {\r\n if (jsonArray.length <= 1)\r\n return jsonArray;\r\n\r\n // else list size is > 1, so split the list into two sublists\r\n var middle = parseInt(jsonArray.length / 2, 10);\r\n\r\n var left = jsonArray.slice(0, middle),\r\n right = jsonArray.slice(middle);\r\n\r\n left = ej.pvt.mergeSort(left, fieldName, comparer);\r\n right = ej.pvt.mergeSort(right, fieldName, comparer);\r\n\r\n return ej.pvt.merge(left, right, fieldName, comparer);\r\n },\r\n\r\n getItemFromComparer: function (array, field, comparer) {\r\n var keyVal, current, key, i = 0,castRequired = typeof getVal(array, field, 0) == \"string\";\r\n if (array.length)\r\n while (ej.isNullOrUndefined(keyVal) && i < array.length) {\r\n keyVal = getVal(array, field, i);\r\n key = array[i++];\r\n }\r\n for (; i < array.length; i++) {\r\n current = getVal(array, field, i);\r\n if (ej.isNullOrUndefined(current))\r\n continue;\r\n if (castRequired) {\r\n keyVal = +keyVal;\r\n current = +current;\r\n }\r\n if (comparer(keyVal, current) > 0) {\r\n keyVal = current;\r\n key = array[i];\r\n }\r\n }\r\n return key;\r\n },\r\n\r\n quickSelect: function (array, fieldName, left, right, k, comparer) {\r\n if (left == right)\r\n return array[left];\r\n\r\n var pivotNewIndex = ej.pvt.partition(array, fieldName, left, right, comparer);\r\n\r\n var pivotDist = pivotNewIndex - left + 1;\r\n\r\n if (pivotDist == k)\r\n return array[pivotNewIndex];\r\n\r\n else if (k < pivotDist)\r\n return ej.pvt.quickSelect(array, fieldName, left, pivotNewIndex - 1, k, comparer);\r\n else\r\n return ej.pvt.quickSelect(array, fieldName, pivotNewIndex + 1, right, k - pivotDist, comparer);\r\n },\r\n\r\n extractFields: function (obj, fields) {\r\n var newObj = {};\r\n\r\n if (fields.length == 1)\r\n return ej.pvt.getObject(fields[0], obj);\r\n\r\n for (var i = 0; i < fields.length; i++) {\r\n newObj[fields[i].replace('.', ej.pvt.consts.complexPropertyMerge)] = ej.pvt.getObject(fields[i], obj);\r\n }\r\n\r\n return newObj;\r\n },\r\n\r\n partition: function (array, field, left, right, comparer) {\r\n\r\n var pivotIndex = parseInt((left + right) / 2, 10),\r\n pivot = getVal(array, field, pivotIndex);\r\n\r\n ej.swap(array, pivotIndex, right);\r\n\r\n pivotIndex = left;\r\n\r\n for (var i = left; i < right; i++) {\r\n if (comparer(getVal(array, field, i), pivot)) {\r\n ej.swap(array, i, pivotIndex);\r\n pivotIndex++;\r\n }\r\n }\r\n\r\n ej.swap(array, pivotIndex, right);\r\n\r\n return pivotIndex;\r\n },\r\n\r\n fnSort: function (order) {\r\n order = order ? order.toLowerCase() : ej.sortOrder.Ascending;\r\n\r\n if (order == ej.sortOrder.Ascending)\r\n return ej.pvt.fnAscending;\r\n\r\n return ej.pvt.fnDescending;\r\n },\r\n\r\n fnGetComparer: function (field, fn) {\r\n return function (x, y) {\r\n return fn(ej.pvt.getObject(field, x), ej.pvt.getObject(field, y));\r\n }\r\n },\r\n\r\n fnAscending: function (x, y) {\r\n if (y === null || y === undefined)\r\n return -1;\r\n\r\n if (typeof x === \"string\")\r\n return x.localeCompare(y);\r\n\r\n if (x === null || x === undefined)\r\n return 1;\r\n\r\n return x - y;\r\n },\r\n\r\n fnDescending: function (x, y) {\r\n if (y === null || y === undefined)\r\n return 1;\r\n\r\n if (typeof x === \"string\")\r\n return x.localeCompare(y) * -1;\r\n\r\n if (x === null || x === undefined)\r\n return -1;\r\n\r\n return y - x;\r\n },\r\n\r\n merge: function (left, right, fieldName, comparer) {\r\n var result = [], current;\r\n\r\n while (left.length > 0 || right.length > 0) {\r\n if (left.length > 0 && right.length > 0) {\r\n if (comparer)\r\n current = comparer(getVal(left, fieldName, 0), getVal(right, fieldName, 0)) <= 0 ? left : right;\r\n else\r\n current = left[0][fieldName] < left[0][fieldName] ? left : right;\r\n } else {\r\n current = left.length > 0 ? left : right;\r\n }\r\n\r\n result.push(current.shift());\r\n }\r\n\r\n return result;\r\n },\r\n\r\n getObject: function (nameSpace, from) {\r\n if (!from) return undefined;\r\n if (!nameSpace) return from;\r\n\r\n if (nameSpace.indexOf('.') === -1) return from[nameSpace];\r\n\r\n var value = from, splits = nameSpace.split('.');\r\n\r\n for (var i = 0; i < splits.length; i++) {\r\n\r\n if (value == null) break;\r\n\r\n value = value[splits[i]];\r\n }\r\n\r\n return value;\r\n },\r\n\r\n createObject: function (nameSpace, value, initIn) {\r\n var splits = nameSpace.split('.'), start = initIn || window, from = start, i;\r\n\r\n for (i = 0; i < splits.length; i++) {\r\n\r\n if (i + 1 == splits.length)\r\n from[splits[i]] = value === undefined ? {} : value;\r\n else if (from[splits[i]] == null)\r\n from[splits[i]] = {};\r\n\r\n from = from[splits[i]];\r\n }\r\n\r\n return start;\r\n },\r\n\r\n getFieldList: function (obj, fields, prefix) {\r\n if (prefix === undefined)\r\n prefix = \"\";\r\n\r\n if (fields === undefined || fields === null)\r\n return ej.pvt.getFieldList(obj, [], prefix);\r\n\r\n for (var prop in obj) {\r\n if (typeof obj[prop] === \"object\" && !(obj[prop] instanceof Array))\r\n ej.pvt.getFieldList(obj[prop], fields, prefix + prop + \".\");\r\n else\r\n fields.push(prefix + prop);\r\n }\r\n\r\n return fields;\r\n }\r\n };\r\n\r\n ej.FilterOperators = {\r\n lessThan: \"lessthan\",\r\n greaterThan: \"greaterthan\",\r\n lessThanOrEqual: \"lessthanorequal\",\r\n greaterThanOrEqual: \"greaterthanorequal\",\r\n equal: \"equal\",\r\n contains: \"contains\",\r\n startsWith: \"startswith\",\r\n endsWith: \"endswith\",\r\n notEqual: \"notequal\"\r\n };\r\n\r\n ej.data = {};\r\n\r\n ej.data.operatorSymbols = {\r\n \"<\": \"lessthan\",\r\n \">\": \"greaterthan\",\r\n \"<=\": \"lessthanorequal\",\r\n \">=\": \"greaterthanorequal\",\r\n \"==\": \"equal\",\r\n \"!=\": \"notequal\",\r\n \"*=\": \"contains\",\r\n \"$=\": \"endswith\",\r\n \"^=\": \"startswith\"\r\n };\r\n\r\n ej.data.odBiOperator = {\r\n \"<\": \" lt \",\r\n \">\": \" gt \",\r\n \"<=\": \" le \",\r\n \">=\": \" ge \",\r\n \"==\": \" eq \",\r\n \"!=\": \" ne \",\r\n \"lessthan\": \" lt \",\r\n \"lessthanorequal\": \" le \",\r\n \"greaterthan\": \" gt \",\r\n \"greaterthanorequal\": \" ge \",\r\n \"equal\": \" eq \",\r\n \"notequal\": \" ne \",\r\n\t\t\"in\":\" eq \",\r\n\t\t\"notin\": \" ne \"\r\n };\r\n\r\n ej.data.odUniOperator = {\r\n \"$=\": \"endswith\",\r\n \"^=\": \"startswith\",\r\n \"*=\": \"substringof\",\r\n \"endswith\": \"endswith\",\r\n \"startswith\": \"startswith\",\r\n \"contains\": \"substringof\",\r\n\t\t\"notcontains\":\"substringof\"\r\n };\r\n\r\n ej.data.fnOperators = {\r\n equal: function (actual, expected, ignoreCase) {\r\n if (ignoreCase)\r\n return toLowerCase(actual) == toLowerCase(expected);\r\n\r\n return actual == expected;\r\n },\r\n notequal: function (actual, expected, ignoreCase) {\r\n return !ej.data.fnOperators.equal(actual, expected, ignoreCase);\r\n },\r\n\t\tnotin: function (actual, expected, ignoreCase) {\r\n\t\t\tfor(var i = 0; i < expected.length; i++) \r\n\t\t\t\tif(ej.data.fnOperators.notequal(actual, expected[i], ignoreCase) == false) return false;\r\n return true;\r\n },\r\n lessthan: function (actual, expected, ignoreCase) {\r\n if (ignoreCase)\r\n return toLowerCase(actual) < toLowerCase(expected);\r\n\r\n return actual < expected;\r\n },\r\n greaterthan: function (actual, expected, ignoreCase) {\r\n if (ignoreCase)\r\n return toLowerCase(actual) > toLowerCase(expected);\r\n\r\n return actual > expected;\r\n },\r\n lessthanorequal: function (actual, expected, ignoreCase) {\r\n if (ignoreCase)\r\n return toLowerCase(actual) <= toLowerCase(expected);\r\n\r\n return actual <= expected;\r\n },\r\n greaterthanorequal: function (actual, expected, ignoreCase) {\r\n if (ignoreCase)\r\n return toLowerCase(actual) >= toLowerCase(expected);\r\n\r\n return actual >= expected;\r\n },\r\n contains: function (actual, expected, ignoreCase) {\r\n if (ignoreCase)\r\n return !isNull(actual) && !isNull(expected) && toLowerCase(actual).indexOf(toLowerCase(expected)) != -1;\r\n\r\n return !isNull(actual) && !isNull(expected) && actual.toString().indexOf(expected) != -1;\r\n },\r\n\t\tnotcontains: function (actual, expected, ignoreCase) {\r\n\t\t\t return !ej.data.fnOperators.contains(actual, expected, ignoreCase);\r\n\t\t},\r\n notnull: function (actual) {\r\n return actual !== null;\r\n },\r\n isnull: function (actual) {\r\n return actual === null;\r\n },\r\n startswith: function (actual, expected, ignoreCase) {\r\n if (ignoreCase)\r\n return actual && expected && toLowerCase(actual).startsWith(toLowerCase(expected));\r\n\r\n return actual && expected && actual.startsWith(expected);\r\n },\r\n endswith: function (actual, expected, ignoreCase) {\r\n if (ignoreCase)\r\n return actual && expected && toLowerCase(actual).endsWith(toLowerCase(expected));\r\n\r\n return actual && expected && actual.endsWith(expected);\r\n },\r\n\t\tall: function (actual, expected, ignoreCase ) {\r\n\t\t\tfor(var i = 0; i < expected.length; i++)\r\n\t\t\t\tif (ej.data.fnOperators[this.operator](actual, expected[i], ignoreCase) == false) return false;\r\n return true;\r\n\t\t},\r\n\t\tany: function (actual, expected, ignoreCase ) {\r\n\t\t\tfor(var i = 0; i < expected.length; i++)\r\n\t\t\t\tif (ej.data.fnOperators[this.operator](actual, expected[i], ignoreCase) == true) return true;\r\n return false;\r\n\t\t},\r\n processSymbols: function (operator) {\r\n var fnName = ej.data.operatorSymbols[operator];\r\n if (fnName) {\r\n var fn = ej.data.fnOperators[fnName];\r\n if (fn) return fn;\r\n }\r\n\r\n return throwError(\"Query - Process Operator : Invalid operator\");\r\n },\r\n\r\n processOperator: function (operator) {\r\n var fn = ej.data.fnOperators[operator];\r\n if (fn) return fn;\r\n return ej.data.fnOperators.processSymbols(operator);\r\n }\r\n };\r\n\r\n ej.data.fnOperators[\"in\"] = function (actual, expected, ignoreCase) {\r\n for(var i = 0; i < expected.length; i++)\r\n if (ej.data.fnOperators.equal(actual, expected[i], ignoreCase) == true) return true;\r\n return false;\r\n };\r\n\r\n ej.NotifierArray = function (array) {\r\n if (!instance(this, ej.NotifierArray))\r\n return new ej.NotifierArray(array);\r\n\r\n this.array = array;\r\n\r\n this._events = $({});\r\n this._isDirty = false;\r\n\r\n return this;\r\n };\r\n\r\n ej.NotifierArray.prototype = {\r\n on: function (eventName, handler) {\r\n this._events.on(eventName, handler);\r\n },\r\n off: function (eventName, handler) {\r\n this._events.off(eventName, handler);\r\n },\r\n push: function (item) {\r\n var ret;\r\n\r\n if (instance(item, Array))\r\n ret = [].push.apply(this.array, item);\r\n else\r\n ret = this.array.push(item);\r\n\r\n this._raise(\"add\", { item: item, index: this.length() - 1 });\r\n\r\n return ret;\r\n },\r\n pop: function () {\r\n var ret = this.array.pop();\r\n\r\n this._raise(\"remove\", { item: ret, index: this.length() - 1 });\r\n\r\n return ret;\r\n },\r\n addAt: function (index, item) {\r\n this.array.splice(index, 0, item);\r\n\r\n this._raise(\"add\", { item: item, index: index });\r\n\r\n return item;\r\n },\r\n removeAt: function (index) {\r\n var ret = this.array.splice(index, 1)[0];\r\n\r\n this._raise(\"remove\", { item: ret, index: index });\r\n\r\n return ret;\r\n },\r\n remove: function (item) {\r\n var index = this.array.indexOf(item);\r\n\r\n if (index > -1) {\r\n this.array.splice(index, 1);\r\n this._raise(\"remove\", { item: item, index: index });\r\n }\r\n\r\n return index;\r\n },\r\n length: function () {\r\n return this.array.length;\r\n },\r\n _raise: function (e, args) {\r\n this._events.triggerHandler($.extend({ type: e }, args));\r\n this._events.triggerHandler({ type: \"all\", name: e, args: args });\r\n },\r\n toArray: function () {\r\n return this.array;\r\n }\r\n };\r\n\r\n $.extend(ej, ej.dataUtil);\r\n\r\n // For IE8\r\n Array.prototype.forEach = Array.prototype.forEach || function (fn, scope) {\r\n for (var i = 0, len = this.length; i < len; ++i) {\r\n fn.call(scope, this[i], i, this);\r\n }\r\n };\r\n\r\n Array.prototype.indexOf = Array.prototype.indexOf || function (searchElement) {\r\n var len = this.length;\r\n\r\n if (len === 0) return -1;\r\n\r\n for (var i = 0; i < len; i++) {\r\n if (i in this && this[i] === searchElement)\r\n return i;\r\n }\r\n return -1;\r\n };\r\n\r\n Array.prototype.filter = Array.prototype.filter || function (fn) {\r\n if (typeof fn != \"function\")\r\n throw new TypeError();\r\n\r\n var res = [];\r\n var thisp = arguments[1] || this;\r\n for (var i = 0; i < this.length; i++) {\r\n var val = this[i]; // in case fun mutates this\r\n if (fn.call(thisp, val, i, this))\r\n res.push(val);\r\n }\r\n\r\n return res;\r\n };\r\n\r\n String.prototype.endsWith = String.prototype.endsWith || function (key) {\r\n return this.slice(-key.length) === key;\r\n };\r\n\r\n String.prototype.startsWith = String.prototype.startsWith || function (key) {\r\n return this.slice(0, key.length) === key;\r\n };\r\n\r\n if (!ej.support) ej.support = {};\r\n ej.support.stableSort = function () {\r\n var res = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16].sort(function () { return 0; });\r\n\t\tfor(var i = 0; i < 17; i++){\r\n\t\t if(i !== res[i]) return false;\r\n\t\t}\r\n return true;\r\n }();\r\n ej.support.cors = $.support.cors;\r\n\r\n if (!$.support.cors && window.XDomainRequest) {\r\n var httpRegEx = /^https?:\\/\\//i;\r\n var getOrPostRegEx = /^get|post$/i;\r\n var sameSchemeRegEx = new RegExp('^' + location.protocol, 'i');\r\n var xmlRegEx = /\\/xml/i;\r\n\r\n // ajaxTransport exists in jQuery 1.5+\r\n $.ajaxTransport('text html xml json', function (options, userOptions, jqXHR) {\r\n // XDomainRequests must be: asynchronous, GET or POST methods, HTTP or HTTPS protocol, and same scheme as calling page\r\n if (options.crossDomain && options.async && getOrPostRegEx.test(options.type) && httpRegEx.test(userOptions.url) && sameSchemeRegEx.test(userOptions.url)) {\r\n var xdr = null;\r\n var userType = (userOptions.dataType || '').toLowerCase();\r\n return {\r\n send: function (headers, complete) {\r\n xdr = new XDomainRequest();\r\n if (/^\\d+$/.test(userOptions.timeout)) {\r\n xdr.timeout = userOptions.timeout;\r\n }\r\n xdr.ontimeout = function () {\r\n complete(500, 'timeout');\r\n };\r\n xdr.onload = function () {\r\n var allResponseHeaders = 'Content-Length: ' + xdr.responseText.length + '\\r\\nContent-Type: ' + xdr.contentType;\r\n var status = {\r\n code: 200,\r\n message: 'success'\r\n };\r\n var responses = {\r\n text: xdr.responseText\r\n };\r\n\r\n try {\r\n if (userType === 'json') {\r\n try {\r\n responses.json = JSON.parse(xdr.responseText);\r\n } catch (e) {\r\n status.code = 500;\r\n status.message = 'parseerror';\r\n //throw 'Invalid JSON: ' + xdr.responseText;\r\n }\r\n } else if ((userType === 'xml') || ((userType !== 'text') && xmlRegEx.test(xdr.contentType))) {\r\n var doc = new ActiveXObject('Microsoft.XMLDOM');\r\n doc.async = false;\r\n try {\r\n doc.loadXML(xdr.responseText);\r\n } catch (e) {\r\n doc = undefined;\r\n }\r\n if (!doc || !doc.documentElement || doc.getElementsByTagName('parsererror').length) {\r\n status.code = 500;\r\n status.message = 'parseerror';\r\n throw 'Invalid XML: ' + xdr.responseText;\r\n }\r\n responses.xml = doc;\r\n }\r\n } catch (parseMessage) {\r\n throw parseMessage;\r\n } finally {\r\n complete(status.code, status.message, responses, allResponseHeaders);\r\n }\r\n };\r\n xdr.onerror = function () {\r\n complete(500, 'error', {\r\n text: xdr.responseText\r\n });\r\n };\r\n\t\t\t\t\t\tif(navigator.userAgent.indexOf(\"MSIE 9.0\") != -1)\r\n\t\t\t\t\t\t\txdr.onprogress = function() {};\r\n xdr.open(options.type, options.url);\r\n xdr.send(userOptions.data);\r\n //xdr.send();\r\n },\r\n abort: function () {\r\n if (xdr) {\r\n xdr.abort();\r\n }\r\n }\r\n };\r\n }\r\n });\r\n }\r\n\r\n $.support.cors = true;\r\n\r\n ej.sortOrder = {\r\n Ascending: \"ascending\",\r\n Descending: \"descending\"\r\n };\r\n\r\n // privates\r\n ej.pvt.consts = {\r\n GROUPGUID: \"{271bbba0-1ee7}\",\r\n complexPropertyMerge: \"_\"\r\n };\r\n\r\n // private utils\r\n var nextTick = function (fn, context) {\r\n if (context) fn = $proxy(fn, context);\r\n (window.setImmediate || window.setTimeout)(fn, 0);\r\n };\r\n\r\n ej.support.enableLocalizedSort = false;\r\n\r\n var stableSort = function (ds, field, comparer, queries) {\r\n if (ej.support.stableSort) {\r\n if(!ej.support.enableLocalizedSort && typeof ej.pvt.getObject(field, ds[0] || {}) == \"string\" \r\n && (comparer === ej.pvt.fnAscending || comparer === ej.pvt.fnDescending)\r\n && queries.filter(function(e){return e.fn === \"onSortBy\";}).length === 1)\r\n return fastSort(ds, field, comparer === ej.pvt.fnDescending);\r\n return ds.sort(ej.pvt.fnGetComparer(field, comparer));\r\n }\r\n return ej.mergeSort(ds, field, comparer);\r\n };\r\n var getColFormat = function (field, query) {\r\n var grpQuery = $.grep(query, function (args) { return args.fn == \"onGroup\" });\r\n for (var grp = 0; grp < grpQuery.length; grp++) {\r\n if (ej.getObject(\"fieldName\", grpQuery[grp].e) == field) {\r\n return ej.getObject(\"fn\", grpQuery[grp].e);\r\n }\r\n }\r\n };\r\n var fastSort = function(ds, field, isDesc){\r\n var old = Object.prototype.toString;\r\n Object.prototype.toString = (field.indexOf('.') === -1) ? function(){\r\n return this[field];\r\n }:function(){\r\n return ej.pvt.getObject(field, this);\r\n };\r\n ds = ds.sort();\r\n Object.prototype.toString = old;\r\n if(isDesc)\r\n ds.reverse();\r\n }\r\n\r\n var toLowerCase = function (val) {\r\n return val ? val.toLowerCase ? val.toLowerCase() : val.toString().toLowerCase() : (val === 0 || val === false) ? val.toString() : \"\";\r\n };\r\n\r\n var getVal = function (array, field, index) {\r\n return field ? ej.pvt.getObject(field, array[index]) : array[index];\r\n };\r\n\r\n var isHtmlElement = function (e) {\r\n return typeof HTMLElement === \"object\" ? e instanceof HTMLElement :\r\n e && e.nodeType === 1 && typeof e === \"object\" && typeof e.nodeName === \"string\";\r\n };\r\n\r\n var instance = function (obj, element) {\r\n return obj instanceof element;\r\n };\r\n\r\n var getTableModel = function (name, result, dm, computed) {\r\n return function (tName) {\r\n if (typeof tName === \"object\") {\r\n computed = tName;\r\n tName = null;\r\n }\r\n return new ej.TableModel(tName || name, result, dm, computed);\r\n };\r\n };\r\n\r\n var getKnockoutModel = function (result) {\r\n return function (computedObservables, ko) {\r\n ko = ko || window.ko;\r\n\r\n if (!ko) throwError(\"Knockout is undefined\");\r\n\r\n var model, koModels = [], prop, ob;\r\n for (var i = 0; i < result.length; i++) {\r\n model = {};\r\n for (prop in result[i]) {\r\n if (!prop.startsWith(\"_\"))\r\n model[prop] = ko.observable(result[i][prop]);\r\n }\r\n for (prop in computedObservables) {\r\n ob = computedObservables[prop];\r\n\r\n if ($.isPlainObject(ob)) {\r\n if (!ob.owner) ob.owner = model;\r\n ob = ko.computed(ob);\r\n } else\r\n ob = ko.computed(ob, model);\r\n\r\n model[prop] = ob;\r\n }\r\n koModels.push(model);\r\n }\r\n\r\n return ko.observableArray(koModels);\r\n };\r\n };\r\n\r\n var uidIndex = 0;\r\n var getUid = function (prefix) {\r\n uidIndex += 1;\r\n return prefix + uidIndex;\r\n };\r\n\r\n ej.getGuid = function (prefix) {\r\n var hexs = '0123456789abcdef', rand;\r\n return (prefix || \"\") + '00000000-0000-4000-0000-000000000000'.replace(/0/g, function (val, i) {\r\n if (\"crypto\" in window && \"getRandomValues\" in crypto) {\r\n var arr = new Uint8Array(1)\r\n window.crypto.getRandomValues(arr);\r\n rand = arr[0] % 16|0\r\n }\r\n else rand = Math.random() * 16 | 0;\r\n return hexs[i === 19 ? rand & 0x3 | 0x8 : rand];\r\n });\r\n };\r\n\r\n var proxy = function (fn, context) {\r\n return function () {\r\n var args = [].slice.call(arguments, 0);\r\n args.push(this);\r\n\r\n return fn.apply(context || this, args);\r\n };\r\n };\r\n\r\n var $proxy = function (fn, context, arg) {\r\n if ('bind' in fn)\r\n return arg ? fn.bind(context, arg) : fn.bind(context);\r\n\r\n return function () {\r\n var args = arg ? [arg] : []; args.push.apply(args, arguments);\r\n return fn.apply(context || this, args);\r\n };\r\n };\r\n\r\n ej.merge = function (first, second) {\r\n if (!first || !second) return;\r\n\r\n Array.prototype.push.apply(first, second);\r\n };\r\n\r\n var isNull = function (val) {\r\n return val === undefined || val === null;\r\n };\r\n\r\n var throwError = function (er) {\r\n try {\r\n throw new Error(er);\r\n } catch (e) {\r\n throw e.message + \"\\n\" + e.stack;\r\n }\r\n };\r\n\r\n})(window.jQuery, window.Syncfusion, window.document);;\r\n(function($, undefined){\r\n \r\nej.globalize = {};\r\nej.cultures = {};\r\n\r\nej.cultures['default'] = ej.cultures['en-US'] = $.extend(true, {\r\n name: 'en-US',\r\n englishName: \"English\",\r\n nativeName: \"English\",\r\n language: 'en',\r\n isRTL: false,\r\n numberFormat: {\r\n pattern: [\"-n\"],\r\n decimals: 2,\r\n ',': \",\",\r\n '.': \".\",\r\n groupSizes: [3],\r\n '+': \"+\",\r\n '-': \"-\",\r\n percent: {\r\n pattern: [\"-n %\", \"n %\"],\r\n decimals: 2,\r\n groupSizes: [3],\r\n ',': \",\",\r\n '.': \".\",\r\n symbol: '%'\r\n },\r\n currency: {\r\n pattern: [\"($n)\", \"$n\"],\r\n decimals: 2,\r\n groupSizes: [3],\r\n ',': \",\",\r\n '.': \".\",\r\n symbol: '$'\r\n }\r\n },\r\n calendars: {\r\n \tstandard: {\r\n\t '/': '/',\r\n\t ':': ':',\r\n\t firstDay: 0,\r\n\t\t\tweek:{\r\n\t\t\tname:\"Week\",\r\n\t\t\tnameAbbr:\"Wek\",\r\n\t\t\tnameShort:\"Wk\"\r\n\t\t\t},\r\n\t days: {\r\n\t names: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\r\n\t namesAbbr: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\r\n\t namesShort: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"]\r\n\t },\r\n\t months: {\r\n\t names: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\", \"\"],\r\n\t namesAbbr: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\", \"\"]\r\n\t },\r\n\t AM: ['AM', 'am', 'AM'],\r\n\t PM: ['PM', 'pm', 'PM'],\r\n twoDigitYearMax: 2029,\r\n\t patterns: {\r\n d: \"M/d/yyyy\",\r\n D: \"dddd, MMMM dd, yyyy\",\r\n t: \"h:mm tt\",\r\n T: \"h:mm:ss tt\",\r\n f: \"dddd, MMMM dd, yyyy h:mm tt\",\r\n F: \"dddd, MMMM dd, yyyy h:mm:ss tt\",\r\n M: \"MMMM dd\",\r\n Y: \"yyyy MMMM\",\r\n S: \"yyyy\\u0027-\\u0027MM\\u0027-\\u0027dd\\u0027T\\u0027HH\\u0027:\\u0027mm\\u0027:\\u0027ss\"\r\n\r\n\t }\r\n \t}\r\n }\r\n}, ej.cultures['en-US']);\r\n\r\nej.cultures['en-US'].calendar = ej.cultures['en-US'].calendar || ej.cultures['en-US'].calendars.standard; \r\n\r\n\r\n\r\n// *************************************** Numbers ***************************************\r\nvar regexTrim = /^\\s+|\\s+$/g,\r\n regexInfinity = /^[+-]?infinity$/i,\r\n regexHex = /^0x[a-f0-9]+$/i,\r\n regexParseFloat = /^[+-]?\\d*\\.?\\d*(e[+-]?\\d+)?$/;\r\nvar charMap = {\r\n '9': \"[0-9 ]\",\r\n\t\t\t\t'0': \"[0-9 ]\",\r\n 'a': \"[A-Za-z0-9 ]\",\r\n 'A': \"[A-Za-z0-9]\",\r\n 'N': \"[0-9]\",\r\n '#': \"[0-9]\",\r\n '&': '[^\\x7f]+',\r\n '<': \"\",\r\n '>': \"\",\r\n 'C': \"[A-Za-z ]\",\r\n '?': \"[A-Za-z]\",\r\n };\r\n\r\nfunction formatMapper (format, value) {\r\n var mask = format || \"\", rules = charMap, value = value.toString(), isDecimal = value.indexOf(\".\") > -1 || format.indexOf(\".\") > -1, diff = 0, stIdx = 0, preFormat = \"\", escFormat = \"\",\r\n\t\tseparator = format.split(\",\"), newChar = \"0\", expValue, exponentIdx = format.toLowerCase().indexOf(\"e\"), valueColl, formatColl, hashIdx = mask.indexOf(\"#\");\r\n\tif(format.indexOf(\"\\\\\") > -1) {\r\n\t\tescFormat = format.substr(0, format.lastIndexOf(\"\\\\\") + 1);\r\n\t\tformat = format.substr(format.lastIndexOf(\"\\\\\") + 1, format.length);\r\n\t\thashIdx = format.indexOf(\"#\");\r\n\t}\r\n\tif(exponentIdx > -1) {\r\n\t\tvar maskFirst = \"\", mask = \"\";\r\n\t\tformatColl = format.toLowerCase().split(\"e\");\r\n\t\texpValue = format.indexOf(\"+\") > -1 ? format.split(\"+\")[1] : format.split(\"-\")[1];\r\n\t\tvalue = parseInt(value).toExponential();\r\n\t\tvalueColl = value.split(\"e\");\r\n\t\tdiff = formatColl[1].length - valueColl[1].length;\r\n\t\tfor(var k = formatColl[1].length - 1; k > 0; k--) {\r\n\t\t\tif(formatColl[1][k] != \"0\")\r\n\t\t\t\tmask += formatColl[1][k];\r\n\t\t\telse if(diff > 1) {\r\n\t\t\t\tmask += \"#\";\r\n\t\t\t\tdiff--;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\tmask += \"0\";\r\n\t\t}\r\n\t\toprMask = (format.indexOf(\"+\") > -1) ? \"+\" : \"\";\r\n\t\tmask = oprMask + mask.split(\"\").reverse().join(\"\");\r\n\t\tfor(var k = 0; k < valueColl[0].length; k++)\r\n\t\t\tmaskFirst = (valueColl[0][k] != \".\") ? maskFirst.concat(\"#\") : maskFirst.concat(\".\");\r\n\t\tif(maskFirst.length > formatColl[0].length)\r\n\t\t\tmaskFirst = formatColl[0];\r\n\t\tmask = escFormat + maskFirst + \"e\" + mask;\r\n\t}\r\n\telse if(isDecimal) {\r\n\t\tformatColl = format.split(\".\");\r\n\t\tvalueColl = value.split(\".\");\r\n\t\tformatColl[1] = formatColl[1].replace(/[,.]/g, \"\");\r\n\t\tdiff = formatColl[0].replace(/[,.]/g, \"\").length - valueColl[0].replace(/[,.]/g, \"\").length;\r\n\t\tif(diff < 0 && ej.isNullOrUndefined(format.match(/[\\[\\(\\)\\]]/g))) {\r\n\t\t\tseparator = formatColl[0].split(\",\");\r\n\t\t\tpreFormat = formatColl[0].split(\",\")\r\n\t\t\tfor(var j = separator.length - 1;j >= 0; j--) {\r\n\t\t\t\tif(separator[j]) {\r\n\t\t\t\t\tvar cnt = separator[j].length;\r\n\t\t\t\t\tfor(var k = 0, len = Math.abs(diff); k < len; k++) {\r\n\t\t\t\t\t\tif(cnt === 3) {\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcnt = 0;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tpreFormat[j] = \"0\" + preFormat[j];\r\n\t\t\t\t\t\tcnt++;\r\n\t\t\t\t\t\tdiff++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tpreFormat = preFormat.join();\r\n\t\t\tif(diff < 0) {\r\n\t\t\t\t(!ej.isNullOrUndefined(cnt) && cnt != 3) && (preFormat = \",\" + preFormat);\r\n\t\t\t\tfor(var k = 0, len = Math.abs(diff); k < len; k++) {\r\n\t\t\t\t\tif(cnt === 3) {\r\n\t\t\t\t\t\tpreFormat = \",\" + preFormat;\r\n\t\t\t\t\t\tcnt = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpreFormat = \"0\" + preFormat;\r\n\t\t\t\t\tcnt++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdiff = 0;\r\n\t\t\tmask = escFormat + preFormat + \".\" + formatColl[1];\r\n\t\t}\r\n\t\telse if(ej.isNullOrUndefined(format.match(/[\\[\\(\\)\\]]/g))){\r\n\t\t\tpreFormat = formatColl[0].replace(/[,.]/g, \"\");\r\n\t\t\tpostFormat = \"\";\r\n\t\t\tvar cnt = 0;\r\n\t\t\tfor(var i = preFormat.length - 1; i >= 0; i--) {\r\n\t\t\t\tif(cnt === 3) {\r\n\t\t\t\t\tpostFormat = \",\" + postFormat;\r\n\t\t\t\t\tcnt = 0;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t\tcnt++;\r\n\t\t\t\tpostFormat = preFormat[i] + postFormat;\r\n\t\t\t}\r\n\t\t\tmask = escFormat + postFormat + \".\" + formatColl[1];\r\n\t\t}\r\n\t}\r\n\telse {\r\n\t\tvar hashCount = 0, separatorColl = separator.splice(1, separator.length);\r\n\t\tdiff = format.replace(/[,.\\[\\(\\]\\)]/g, \"\").length - value.replace(/[,.]/g, \"\").length;\r\n\t\tif(hashIdx > -1) {\r\n\t\t\tfor(var f = 0, len = format.length; f < len; f++)\r\n\t\t\t\t(format[f] === \"#\") && hashCount++;\r\n\t\t\tif(hashCount === 1 || (separator[1] && hashCount === 2))\r\n\t\t\t\tnewChar = \"#\";\r\n\t\t\t(hashCount === 1) && (separatorColl = separator[0]);\r\n\t\t}\r\n\t\tif(diff < 0) {\r\n\t\t\tformatColl = mask.split(\",\");\r\n\t\t\tpreFormat = formatColl.splice(1, formatColl.length);\t\r\n\t\t\tfor(var j = separator.length - 1;j >= 0; j--) {\r\n\t\t\t\tif(separatorColl[j]) {\r\n\t\t\t\t\tvar cnt = separatorColl[j].length;\r\n\t\t\t\t\t!preFormat[j] && (preFormat[j] = \"\");\r\n\t\t\t\t\tfor(var k = 0, len = Math.abs(diff) + 1; k < len; k++) {\r\n\t\t\t\t\t\tif(hashCount != 1 && cnt === 3) {\r\n\t\t\t\t\t\t\tcnt = 0;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tpreFormat[j] = preFormat[j].concat(newChar);\r\n\t\t\t\t\t\tcnt++;\r\n\t\t\t\t\t\tdiff++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tpreFormat = preFormat.join();\r\n\t\t\tif(diff < 0) {\r\n\t\t\t\t(!ej.isNullOrUndefined(cnt) && cnt != 3) && (preFormat = \",\" + preFormat);\r\n\t\t\t\tfor(var k = 0, len = Math.abs(diff) + 1; k < len; k++) {\r\n\t\t\t\t\tif(hashCount != 1 && cnt === 3) {\r\n\t\t\t\t\t\tpreFormat = \",\" + preFormat;\r\n\t\t\t\t\t\tcnt = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpreFormat = newChar + preFormat;\r\n\t\t\t\t\tcnt++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdiff = 0;\r\n\t\t\tmask = escFormat + preFormat;\r\n\t\t}\r\n\t\tstIdx = 0;\r\n\t}\r\n\tvar mapper = [], maskChars = mask.split(\"\"), mapperIdx = 0, i = 0, idx = 0, chr, rule, isEscChar = false, isExp = false, escIdx = format.indexOf(\"\\\\\");\r\n for (; i < mask.length; i++) {\r\n chr = maskChars[i];\r\n\t\tif(chr === \"e\")\r\n\t\t\tisExp = true;\r\n if((chr === \"0\" && hashIdx < 0)) {\r\n\t\t\tif((diff > 0 && stIdx <= i)) {\r\n\t\t\t\tdiff--;\r\n\t\t\t\tstIdx++;\r\n\t\t\t}\r\n\t\t\telse if(diff > 0)\r\n\t\t\t\tdiff--;\r\n\t\t\telse\r\n\t\t\t\trule = rules[chr];\r\n\t\t}\r\n\t\telse if(chr != \"0\" || (!isExp && chr == \"0\")) \r\n\t\t\trule = rules[chr];\r\n\t\tif(chr === \"0\" && escIdx > -1) \r\n\t\t\trule = rules[chr];\r\n\t\tif(i === mask.lastIndexOf(\"\\\\\"))\r\n\t\t\tisEscChar = false;\r\n if (rule && !isEscChar) {\r\n mapper[mapperIdx] = { rule: rule };\r\n mapperIdx += 1;\r\n } else {\r\n if (chr === \"\\\\\") {\r\n chr = \"\";\r\n\t\t\t\t!(i === mask.lastIndexOf(\"\\\\\")) && (isEscChar = true);\r\n }\r\n chr = chr.split(\"\");\r\n for (var j = 0; j < chr.length; j++) {\r\n mapper[mapperIdx] = chr[j];\r\n mapperIdx += 1;\r\n }\r\n }\r\n }\r\n rules = mapper;\r\n\treturn {\"rules\": rules, \"format\": mask};\r\n}\r\n\r\nfunction customFormat(value, format, locale) {\r\n\tif(!value || typeof value === \"string\" || !format)\r\n\t\tthrow \"Bad Number Format Exception\";\r\n\tvar formatLength, formatObj, rules, orgFormat = format;\r\n\tformatObj = formatMapper(format, value);\r\n\trules = formatObj.rules;\r\n\tformat = formatObj.format;\r\n if (!(format.indexOf(\"\\\\\") >= 0))\r\n formatModel = format.replace(/[9?CANa#&]/g, '_');\r\n else {\r\n\t\tvar escIdx = format.lastIndexOf(\"\\\\\"), first = format.slice(0, escIdx), second = format.slice(escIdx + 1, format.length), altFormat;\r\n\t\tsecond = second.replace(/[9?CANa#&]/g, '_');\r\n\t\taltFormat = first + second;\r\n formatModel = altFormat.replace(/[\\\\]/g, \"\");\r\n\t\tformat = format.replace(/[\\\\]/g, \"\");\r\n\t}\r\n formatModel = changeCulture(formatModel, locale);\r\n return validateValue(value, format, formatModel, rules, locale, orgFormat);\r\n}\r\n\r\nfunction changeCulture(formatModel, locale) {\r\n\tif (formatModel.length != 0) {\r\n var preferredlocale = ej.preferredCulture(locale), groupSep, currecySymbol, decimalSep,unmask = \"\";\r\n groupSep = preferredlocale.numberFormat[','];\r\n currecySymbol = preferredlocale.numberFormat.currency.symbol;\r\n decimalSep = preferredlocale.numberFormat['.'];\r\n for (var i = 0; i < formatModel.length; i++) {\r\n if (formatModel[i] == \",\")\r\n unmask += groupSep;\r\n else if (formatModel[i] == \".\")\r\n unmask += decimalSep;\r\n else if (formatModel[i] == \"$\")\r\n unmask += currecySymbol;\r\n else\r\n unmask += formatModel[i];\r\n }\r\n formatModel = unmask;\r\n }\r\n\treturn formatModel;\r\n}\r\n\r\nfunction validateValue(value, format, formatModel, rules, locale, orgFormat) {\r\n\tif(ej.isNullOrUndefined(value))\r\n\t\treturn;\r\n\tif(format.toLowerCase().indexOf(\"e\") > -1) {\r\n\t\tvar expValue = orgFormat.indexOf(\"+\") > -1 ? orgFormat.split(\"+\")[1] : orgFormat.split(\"-\")[1];\r\n\t\tvalue = value.toExponential();\r\n\t\t(orgFormat.indexOf(\"-\") > -1) && (value = value.replace(\"+\", \"\")); \r\n\t}\r\n\tvar tempValue = oldvalue = replacestring = value.toString(), tempModel = formatModel, maskIndex = i = 0, chr, prompt = \"_\", rule,\r\n\t\tstrBefore, strAfter, charValue, isBracket = format.match(/[\\(\\[\\]\\)]/g);\r\n if (!format.indexOf(\"\\\\\") >= 0)\r\n tempValue = value = replacestring.replace(/[\\(\\)-]/g, \"\");\r\n else\r\n tempValue = tvalue;\r\n\tj = rules.length - 1;\r\n\tv = oldvalue.length - 1;\r\n\tif(!ej.isNullOrUndefined(isBracket)) {\r\n\t\twhile (j >= 0) {\r\n\t\t\tchr = oldvalue[v];\r\n\t\t\trule = rules[j];\r\n\t\t\tif (chr == undefined) break;\r\n\t\t\tif (chr === rule || chr === prompt || (chr === \"e\" && (chr === rule.toLowerCase()))) {\r\n\t\t\t\tchr === prompt ? prompt : \"\";\r\n\t\t\t\tstrBefore = tempModel.substring(0, j+1);\r\n\t\t\t\tstrAfter = tempModel.substring(j+1);\r\n\t\t\t\tchr = changeCulture(chr, locale);\r\n\t\t\t\ttempModel = strBefore.substr(0, strBefore.length - 1) + chr + strAfter;\r\n\t\t\t\tj--;\r\n\t\t\t\tv--;\r\n\t\t\t}\r\n\t\t\telse if (rules[j].rule != undefined ) {\r\n\t\t\t\tvar charCode = oldvalue.charCodeAt(v);\r\n\t\t\t\tif (validateChars(format, charCode, j)) {\r\n\t\t\t\t\tstrBefore = tempModel.substring(0, j +1);\r\n\t\t\t\t\tstrAfter = tempModel.substring(j+1);\r\n\t\t\t\t\tcharValue = getRoundValue(oldvalue, v, j, format, formatModel);\r\n\t\t\t\t\ttempModel = strBefore.substr(0, strBefore.length - 1) + charValue + strAfter;\r\n\t\t\t\t\tj--;\r\n\t\t\t\t\tv--;\r\n\t\t\t\t} else \r\n\t\t\t\t\tj--;\r\n\t\t\t} \r\n\t\t\telse\r\n\t\t\t\tj--;\r\n\t\t\tif (i > tempValue.length || j<0) break;\r\n\t\t}\r\n\t}\r\n\telse {\r\n\t\twhile (maskIndex < rules.length) {\r\n\t\t\tchr = oldvalue[i];\r\n\t\t\trule = rules[maskIndex];\r\n\t\t\tif (chr == undefined) break;\r\n\t\t\tif (chr === rule || chr === prompt || (chr === \"e\" && (chr === rule.toLowerCase()))) {\r\n\t\t\t\tchr === prompt ? prompt : \"\";\r\n\t\t\t\tstrBefore = tempModel.substring(0, maskIndex);\r\n\t\t\t\tstrAfter = tempModel.substring(maskIndex);\r\n\t\t\t\tchr = changeCulture(chr, locale);\r\n\t\t\t\ttempModel = strBefore + chr + strAfter.substr(1, strAfter.length);\r\n\t\t\t\ti += 1;\r\n\t\t\t\tmaskIndex += 1;\r\n\t\t\t}\r\n\t\t\telse if (rules[maskIndex].rule != undefined ) {\r\n\t\t\t\tvar charCode = oldvalue.charCodeAt(i);\r\n\t\t\t\tif (validateChars(format, charCode, maskIndex)) {\r\n\t\t\t\t\tstrBefore = tempModel.substring(0, maskIndex);\r\n\t\t\t\t\tstrAfter = tempModel.substring(maskIndex);\r\n\t\t\t\t\tcharValue = getRoundValue(oldvalue, i, maskIndex, format, formatModel);\r\n\t\t\t\t\ttempModel = strBefore + charValue + strAfter.substr(1, strAfter.length);\r\n\t\t\t\t\tmaskIndex++;\r\n\t\t\t\t\ti++;\r\n\t\t\t\t} else\r\n\t\t\t\t\tmaskIndex++;\r\n\t\t\t} \r\n\t\t\telse {\r\n\t\t\t\tif(rule === \"e\")\r\n\t\t\t\t\ti = oldvalue.indexOf(\"e\") + 1;\r\n\t\t\t\tmaskIndex++;\r\n\t\t\t}\r\n\t\t\tif (i > tempValue.length || j<0) break;\r\n\t\t}\r\n\t}\r\n if (value) {\r\n\t\tif((tempModel.indexOf(\"_\") - tempModel.indexOf(\",\") === 1) || (tempModel.indexOf(\"_\") - tempModel.indexOf(\".\") === 1))\r\n\t\t\ttempModel = tempModel.slice(0, tempModel.indexOf(\"_\")-1);\r\n strippedValue = $.trim(tempModel.replace(/[_]/g, \"\")) == \"\" ? null : tempModel.replace(/[_]/g, \"\");\r\n\t\treturn strippedValue;\r\n\t}\r\n}\r\n\r\nfunction validateChars (format, keyChar, caretPos){\r\n\tvar charmap = charMap, match = false, maskChar = format.substr(caretPos, 1), actualkey = String.fromCharCode(keyChar);\r\n $.each(charmap, function (key, value) {\r\n if (maskChar == key) {\r\n if (actualkey.match(new RegExp(value))) match = true;\r\n else match = false;\r\n }\r\n });\r\n return match;\r\n}\r\n\r\nfunction getRoundValue(value, valIdx, maskIndex, format, formatModel) {\r\n\tvar isCeil = false;\r\n\tif(format.indexOf(\".\") > -1 && (maskIndex === formatModel.length - 1))\r\n\t\t(value[valIdx + 1] > 5) && (isCeil = true);\r\n\treturn (isCeil ? (parseInt(value[valIdx]) + 1).toString() : value[valIdx]);\r\n}\r\n\r\nfunction patternStartsWith(value, pattern) {\r\n return value.indexOf( pattern ) === 0;\r\n}\r\n\r\nfunction patternEndsWith(value, pattern) {\r\n return value.substr( value.length - pattern.length ) === pattern;\r\n}\r\n\r\nfunction trim(value) {\r\n return (value+\"\").replace( regexTrim, \"\" );\r\n}\r\n\r\nfunction truncate(value){\r\n if(isNaN(value))\r\n return NaN;\r\n \r\n return Math[value < 0 ? \"ceil\" : \"floor\"](value);\r\n}\r\n\r\nfunction padWithZero(str, count, left) {\r\n for (var l = str.length; l < count; l++) {\r\n str = (left ? ('0' + str) : (str + '0'));\r\n }\r\n return str;\r\n}\r\n\r\nfunction parseNumberWithNegativePattern(value, nf, negativePattern) {\r\n var neg = nf[\"-\"],\r\n pos = nf[\"+\"],\r\n ret;\r\n switch (negativePattern) {\r\n case \"n -\":\r\n neg = ' ' + neg;\r\n pos = ' ' + pos;\r\n // fall through\r\n case \"n-\":\r\n if ( patternEndsWith( value, neg ) ) {\r\n ret = [ '-', value.substr( 0, value.length - neg.length ) ];\r\n }\r\n else if ( patternEndsWith( value, pos ) ) {\r\n ret = [ '+', value.substr( 0, value.length - pos.length ) ];\r\n }\r\n break;\r\n case \"- n\":\r\n neg += ' ';\r\n pos += ' ';\r\n // fall through\r\n case \"-n\":\r\n if ( patternStartsWith( value, neg ) ) {\r\n ret = [ '-', value.substr( neg.length ) ];\r\n }\r\n else if ( patternStartsWith(value, pos) ) {\r\n ret = [ '+', value.substr( pos.length ) ];\r\n }\r\n break;\r\n case \"(n)\":\r\n if ( patternStartsWith( value, '(' ) && patternEndsWith( value, ')' ) ) {\r\n ret = [ '-', value.substr( 1, value.length - 2 ) ];\r\n }\r\n break;\r\n }\r\n return ret || [ '', value ];\r\n}\r\n\r\nfunction getFullNumber(number, precision, formatInfo) {\r\n var groupSizes = formatInfo.groupSizes || [3],\r\n curSize = groupSizes[0],\r\n curGroupIndex = 1,\r\n factor = Math.pow(10, precision),\r\n rounded = Math.round(number * factor) / factor;\r\n if (!isFinite(rounded)) {\r\n rounded = number;\r\n }\r\n number = rounded;\r\n\r\n var numberString = number + \"\",\r\n right = \"\",\r\n split = numberString.split(/e/i),\r\n exponent = split.length > 1 ? parseInt(split[1], 10) : 0;\r\n numberString = split[0];\r\n split = numberString.split(\".\");\r\n numberString = split[0];\r\n right = split.length > 1 ? split[1] : \"\";\r\n\r\n var l;\r\n if (exponent > 0) {\r\n right = padWithZero(right, exponent, false);\r\n numberString += right.slice(0, exponent);\r\n right = right.substr(exponent);\r\n } else if (exponent < 0) {\r\n exponent = -exponent;\r\n numberString = padWithZero(numberString, exponent + 1, true);\r\n right = numberString.slice(-exponent, numberString.length) + right;\r\n numberString = numberString.slice(0, -exponent);\r\n }\r\n\r\n var dot = formatInfo['.'] || '.';\r\n if (precision > 0) {\r\n right = dot +\r\n ((right.length > precision) ? right.slice(0, precision) : padWithZero(right, precision));\r\n } else {\r\n right = \"\";\r\n }\r\n\r\n var stringIndex = numberString.length - 1,\r\n sep = formatInfo[\",\"] || ',',\r\n ret = \"\";\r\n\r\n while (stringIndex >= 0) {\r\n if (curSize === 0 || curSize > stringIndex) {\r\n return numberString.slice(0, stringIndex + 1) + (ret.length ? (sep + ret + right) : right);\r\n }\r\n ret = numberString.slice(stringIndex - curSize + 1, stringIndex + 1) + (ret.length ? (sep + ret) : \"\");\r\n\r\n stringIndex -= curSize;\r\n\r\n if (curGroupIndex < groupSizes.length) {\r\n curSize = groupSizes[curGroupIndex];\r\n curGroupIndex++;\r\n }\r\n }\r\n return numberString.slice(0, stringIndex + 1) + sep + ret + right;\r\n}\r\n\r\nfunction formatNumberToCulture(value, format, culture) {\r\n if (!format || format === 'i') {\r\n return culture.name.length ? value.toLocaleString() : value.toString();\r\n }\r\n format = format || \"D\";\r\n\r\n var nf = culture.numberFormat,\r\n number = Math.abs(value),\r\n precision = -1,\r\n pattern;\r\n\r\n if (format.length > 1) precision = parseInt(format.slice(1), 10);\r\n\r\n var current = format.charAt(0).toUpperCase(),\r\n formatInfo;\r\n\r\n switch (current) {\r\n case 'D':\r\n pattern = 'n';\r\n number = truncate(number);\r\n if (precision !== -1) {\r\n number = padWithZero(\"\" + number, precision, true);\r\n }\r\n if (value < 0) number = -number;\r\n break;\r\n case 'N':\r\n formatInfo = nf;\r\n formatInfo.pattern = formatInfo.pattern || ['-n'];\r\n // fall through\r\n case 'C':\r\n formatInfo = formatInfo || nf.currency;\r\n formatInfo.pattern = formatInfo.pattern || ['-$n', '$n'];\r\n // fall through\r\n case 'P':\r\n formatInfo = formatInfo || nf.percent;\r\n formatInfo.pattern = formatInfo.pattern || ['-n %', 'n %'];\r\n pattern = value < 0 ? (formatInfo.pattern[0] || \"-n\") : (formatInfo.pattern[1] || \"n\");\r\n if (precision === -1) precision = formatInfo.decimals;\r\n number = getFullNumber(number * (current === \"P\" ? 100 : 1), precision, formatInfo);\r\n break;\r\n default:\r\n\t\t\treturn customFormat(value, format, culture);\r\n }\r\n\r\n return matchNumberToPattern(number, pattern, nf);\r\n}\r\n\r\n\r\n\r\nfunction matchNumberToPattern(number, pattern, nf){\r\n var patternParts = /n|\\$|-|%/g,\r\n ret = \"\";\r\n for (;;) {\r\n var index = patternParts.lastIndex,\r\n ar = patternParts.exec(pattern);\r\n\r\n ret += pattern.slice(index, ar ? ar.index : pattern.length);\r\n\r\n if (!ar) {\r\n break;\r\n }\r\n\r\n switch (ar[0]) {\r\n case \"n\":\r\n ret += number;\r\n break;\r\n case \"$\":\r\n ret += nf.currency.symbol || \"$\";\r\n break;\r\n case \"-\":\r\n // don't make 0 negative\r\n if (/[1-9]/.test(number)) {\r\n ret += nf[\"-\"] || \"-\";\r\n }\r\n break;\r\n case \"%\":\r\n ret += nf.percent.symbol || \"%\";\r\n break;\r\n }\r\n }\r\n\r\n return ret;\r\n}\r\n\r\nfunction parseValue(value, culture, radix ) {\r\n\t\t// make radix optional\r\n if (typeof radix === \"string\") {\r\n culture = radix;\r\n radix = 10;\r\n }\r\n culture = ej.globalize.findCulture(culture);\r\n var ret = NaN, nf = culture.numberFormat, npattern = culture.numberFormat.pattern[0];\r\n value = value.replace(/ /g, '');\r\n if (value.indexOf(culture.numberFormat.currency.symbol) > -1) {\r\n // remove currency symbol\r\n value = value.replace(culture.numberFormat.currency.symbol || \"$\", \"\");\r\n // replace decimal seperator\r\n value = value.replace(culture.numberFormat.currency[\".\"] || \".\", culture.numberFormat[\".\"] || \".\");\r\n // pattern of the currency\r\n npattern = trim(culture.numberFormat.currency.pattern[0].replace(\"$\", \"\"));\r\n } else if (value.indexOf(culture.numberFormat.percent.symbol) > -1) {\r\n // remove percentage symbol\r\n value = value.replace(culture.numberFormat.percent.symbol || \"%\", \"\");\r\n // replace decimal seperator\r\n value = value.replace(culture.numberFormat.percent[\".\"] || \".\", culture.numberFormat[\".\"] || \".\");\r\n // pattern of the percent\r\n npattern = trim(culture.numberFormat.percent.pattern[0].replace(\"%\", \"\"));\r\n }\r\n\r\n // trim leading and trailing whitespace\r\n value = trim( value );\r\n\r\n // allow infinity or hexidecimal\r\n if (regexInfinity.test(value)) {\r\n ret = parseFloat(value, \"\" ,radix);\r\n }\r\n else if (regexHex.test(value)) {\r\n ret = parseInt(value, 16);\r\n }\r\n else {\r\n var signInfo = parseNumberWithNegativePattern( value, nf, npattern ),\r\n sign = signInfo[0],\r\n num = signInfo[1];\r\n // determine sign and number\r\n if ( sign === \"\" && nf.pattern[0] !== \"-n\" ) {\r\n signInfo = parseNumberWithNegativePattern( value, nf, \"-n\" );\r\n sign = signInfo[0];\r\n num = signInfo[1];\r\n }\r\n sign = sign || \"+\";\r\n // determine exponent and number\r\n var exponent,\r\n intAndFraction,\r\n exponentPos = num.indexOf( 'e' );\r\n if ( exponentPos < 0 ) exponentPos = num.indexOf( 'E' );\r\n if ( exponentPos < 0 ) {\r\n intAndFraction = num;\r\n exponent = null;\r\n }\r\n else {\r\n intAndFraction = num.substr( 0, exponentPos );\r\n exponent = num.substr( exponentPos + 1 );\r\n }\r\n // determine decimal position\r\n var integer,\r\n fraction,\r\n decSep = nf['.'] || '.',\r\n decimalPos = intAndFraction.indexOf( decSep );\r\n if ( decimalPos < 0 ) {\r\n integer = intAndFraction;\r\n fraction = null;\r\n }\r\n else {\r\n integer = intAndFraction.substr( 0, decimalPos );\r\n fraction = intAndFraction.substr( decimalPos + decSep.length );\r\n }\r\n // handle groups (e.g. 1,000,000)\r\n var groupSep = nf[\",\"] || \",\";\r\n integer = integer.split(groupSep).join('');\r\n var altGroupSep = groupSep.replace(/\\u00A0/g, \" \");\r\n if ( groupSep !== altGroupSep ) {\r\n integer = integer.split(altGroupSep).join('');\r\n }\r\n // build a natively parsable number string\r\n var p = sign + integer;\r\n if ( fraction !== null ) {\r\n p += '.' + fraction;\r\n }\r\n if ( exponent !== null ) {\r\n // exponent itself may have a number patternd\r\n var expSignInfo = parseNumberWithNegativePattern( exponent, nf, npattern );\r\n p += 'e' + (expSignInfo[0] || \"+\") + expSignInfo[1];\r\n }\r\n if ( !radix && regexParseFloat.test( p ) ) {\r\n ret = parseFloat( p );\r\n }\r\n\t\telse if(radix)\r\n\t\t\tret = parseInt(p, radix);\r\n }\r\n return ret;\r\n}\r\n\r\n// *************************************** Dates ***************************************\r\n\r\nvar dateFormat = {\r\n DAY_OF_WEEK_THREE_LETTER : \"ddd\",\r\n DAY_OF_WEEK_FULL_NAME : \"dddd\",\r\n DAY_OF_MONTH_SINGLE_DIGIT : \"d\",\r\n DAY_OF_MONTH_DOUBLE_DIGIT : \"dd\",\r\n MONTH_THREE_LETTER : \"MMM\",\r\n MONTH_FULL_NAME : \"MMMM\",\r\n MONTH_SINGLE_DIGIT : \"M\",\r\n MONTH_DOUBLE_DIGIT : \"MM\",\r\n YEAR_SINGLE_DIGIT : \"y\",\r\n YEAR_DOUBLE_DIGIT : \"yy\",\r\n YEAR_FULL : \"yyyy\",\r\n HOURS_SINGLE_DIGIT_12_HOUR_CLOCK : \"h\",\r\n HOURS_DOUBLE_DIGIT_12_HOUR_CLOCK : \"hh\",\r\n HOURS_SINGLE_DIGIT_24_HOUR_CLOCK : \"H\",\r\n HOURS_DOUBLE_DIGIT_24_HOUR_CLOCK : \"HH\",\r\n MINUTES_SINGLE_DIGIT : \"m\",\r\n MINUTES_DOUBLE_DIGIT : \"mm\",\r\n SECONDS_SINGLE_DIGIT : \"s\",\r\n SECONDS_DOUBLE_DIGIT : \"ss\",\r\n MERIDIAN_INDICATOR_SINGLE : \"t\",\r\n MERIDIAN_INDICATOR_FULL : \"tt\",\r\n DECISECONDS : \"f\",\r\n CENTISECONDS: \"ff\",\r\n MILLISECONDS : \"fff\",\r\n TIME_ZONE_OFFSET_SINGLE_DIGIT : \"z\",\r\n TIME_ZONE_OFFSET_DOUBLE_DIGIT : \"zz\",\r\n TIME_ZONE_OFFSET_FULL : \"zzz\",\r\n DATE_SEPARATOR : \"/\"\r\n};\r\n\r\nfunction valueOutOfRange(value, low, high) {\r\n return value < low || value > high;\r\n}\r\n\r\nfunction expandYear(cal, year) {\r\n // expands 2-digit year into 4 digits.\r\n var now = new Date();\r\n if ( year < 100 ) {\r\n var twoDigitYearMax = cal.twoDigitYearMax;\r\n twoDigitYearMax = typeof twoDigitYearMax === 'string' ? new Date().getFullYear() % 100 + parseInt( twoDigitYearMax, 10 ) : twoDigitYearMax;\r\n var curr = now.getFullYear();\r\n year += curr - ( curr % 100 );\r\n if ( year > twoDigitYearMax ) {\r\n year -= 100;\r\n }\r\n }\r\n return year;\r\n}\r\n\r\nfunction arrayIndexOf( array, item ) {\r\n if ( array.indexOf ) {\r\n return array.indexOf( item );\r\n }\r\n for ( var i = 0, length = array.length; i < length; i++ ) {\r\n if ( array[ i ] === item ) return i;\r\n }\r\n return -1;\r\n}\r\n\r\nfunction toUpper(value) {\r\n // 'he-IL' has non-breaking space in weekday names.\r\n return value.split( \"\\u00A0\" ).join(' ').toUpperCase();\r\n}\r\n\r\nfunction toUpperArray(arr) {\r\n var results = [];\r\n for ( var i = 0, l = arr.length; i < l; i++ ) {\r\n results[i] = toUpper(arr[i]);\r\n }\r\n return results;\r\n}\r\n\r\nfunction getIndexOfDay(cal, value, abbr) {\r\n var ret,\r\n days = cal.days,\r\n upperDays = cal._upperDays;\r\n if ( !upperDays ) {\r\n cal._upperDays = upperDays = [\r\n toUpperArray( days.names ),\r\n toUpperArray( days.namesAbbr ),\r\n toUpperArray( days.namesShort )\r\n ];\r\n }\r\n value = toUpper( value );\r\n if ( abbr ) {\r\n ret = arrayIndexOf( upperDays[ 1 ], value );\r\n if ( ret === -1 ) {\r\n ret = arrayIndexOf( upperDays[ 2 ], value );\r\n }\r\n }\r\n else {\r\n ret = arrayIndexOf( upperDays[ 0 ], value );\r\n }\r\n return ret;\r\n}\r\n\r\nfunction getIndexOfMonth(cal, value, abbr) {\r\n var months = cal.months,\r\n monthsGen = cal.monthsGenitive || cal.months,\r\n upperMonths = cal._upperMonths,\r\n upperMonthsGen = cal._upperMonthsGen;\r\n if ( !upperMonths ) {\r\n cal._upperMonths = upperMonths = [\r\n toUpperArray( months.names ),\r\n toUpperArray( months.namesAbbr )\r\n ];\r\n cal._upperMonthsGen = upperMonthsGen = [\r\n toUpperArray( monthsGen.names ),\r\n toUpperArray( monthsGen.namesAbbr )\r\n ];\r\n }\r\n value = toUpper( value );\r\n var i = arrayIndexOf( abbr ? upperMonths[ 1 ] : upperMonths[ 0 ], value );\r\n if ( i < 0 ) {\r\n i = arrayIndexOf( abbr ? upperMonthsGen[ 1 ] : upperMonthsGen[ 0 ], value );\r\n }\r\n return i;\r\n}\r\n\r\nfunction appendMatchStringCount(preMatch, strings) {\r\n var quoteCount = 0,\r\n escaped = false;\r\n for ( var i = 0, il = preMatch.length; i < il; i++ ) {\r\n var c = preMatch.charAt( i );\r\n if(c == '\\''){\r\n escaped ? strings.push( \"'\" ) : quoteCount++;\r\n escaped = false;\r\n } else if( c == '\\\\'){\r\n if (escaped) strings.push( \"\\\\\" );\r\n escaped = !escaped;\r\n } else {\r\n strings.push( c );\r\n escaped = false;\r\n }\r\n }\r\n return quoteCount;\r\n}\r\n\r\n\r\nfunction parseDayByInt(value, format, culture, cal) {\r\n if (!value) {\r\n return null;\r\n }\r\n var index = 0, valueX = 0, day = null;\r\n format = format.split(\"\");\r\n length = format.length;\r\n var countDays = function (match) {\r\n var i = 0;\r\n while (format[index] === match) {\r\n i++;\r\n index++;\r\n }\r\n if (i > 0) {\r\n index -= 1;\r\n }\r\n return i;\r\n },\r\n getNumber = function (size) {\r\n var rg = new RegExp('^\\\\d{1,' + size + '}'),\r\n match = value.substr(valueX, size).match(rg);\r\n\r\n if (match) {\r\n match = match[0];\r\n valueX += match.length;\r\n return parseInt(match, 10);\r\n }\r\n return null;\r\n },\r\n getName = function (names, lower) {\r\n var i = 0,\r\n length = names.length,\r\n name, nameLength,\r\n subValue;\r\n\r\n for (; i < length; i++) {\r\n name = names[i];\r\n nameLength = name.length;\r\n subValue = value.substr(valueX, nameLength);\r\n\r\n if (lower) {\r\n subValue = subValue.toLowerCase();\r\n }\r\n\r\n if (subValue == name) {\r\n valueX += nameLength;\r\n return i + 1;\r\n }\r\n }\r\n return null;\r\n },\r\n lowerArray = function (data) {\r\n var index = 0,\r\n length = data.length,\r\n array = [];\r\n\r\n for (; index < length; index++) {\r\n array[index] = (data[index] + \"\").toLowerCase();\r\n }\r\n\r\n return array;\r\n },\r\n lowerInfo = function (localInfo) {\r\n var newLocalInfo = {}, property;\r\n\r\n for (property in localInfo) {\r\n newLocalInfo[property] = lowerArray(localInfo[property]);\r\n }\r\n\r\n return newLocalInfo;\r\n };\r\n for (; index < length; index++) {\r\n ch = format[index];\r\n if (ch === \"d\") {\r\n count = countDays(\"d\");\r\n if (!cal._lowerDays) {\r\n cal._lowerDays = lowerInfo(cal.days);\r\n }\r\n day = count < 3 ? getNumber(2) : getName(cal._lowerDays[count == 3 ? \"namesAbbr\" : \"names\"], true)\r\n }\r\n }\r\n return day;\r\n}\r\n\r\n\r\nfunction getFullDateFormat(cal, format) {\r\n // expands unspecified or single character date formats into the full pattern.\r\n format = format || \"F\";\r\n var pattern,\r\n patterns = cal.patterns,\r\n len = format.length;\r\n if ( len === 1 ) {\r\n pattern = patterns[ format ];\r\n if ( !pattern ) {\r\n throw \"Invalid date format string '\" + format + \"'.\";\r\n }\r\n format = pattern;\r\n }\r\n else if ( len === 2 && format.charAt(0) === \"%\" ) {\r\n // %X escape format -- intended as a custom format string that is only one character, not a built-in format.\r\n format = format.charAt( 1 );\r\n }\r\n return format;\r\n}\r\n\r\nej.globalize._getDateParseRegExp = function (cal, format) {\r\n // converts a format string into a regular expression with groups that\r\n // can be used to extract date fields from a date string.\r\n // check for a cached parse regex.\r\n var re = cal._parseRegExp;\r\n if ( !re ) {\r\n cal._parseRegExp = re = {};\r\n }\r\n else {\r\n var reFormat = re[ format ];\r\n if ( reFormat ) {\r\n return reFormat;\r\n }\r\n }\r\n\r\n // expand single digit formats, then escape regular expression characters.\r\n var expFormat = getFullDateFormat( cal, format ).replace( /([\\^\\$\\.\\*\\+\\?\\|\\[\\]\\(\\)\\{\\}])/g, \"\\\\\\\\$1\" ),\r\n regexp = [\"^\"],\r\n groups = [],\r\n index = 0,\r\n quoteCount = 0,\r\n tokenRegExp = /\\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g,\r\n match;\r\n\r\n // iterate through each date token found.\r\n while ( (match = tokenRegExp.exec( expFormat )) !== null ) {\r\n var preMatch = expFormat.slice( index, match.index );\r\n index = tokenRegExp.lastIndex;\r\n\r\n // don't replace any matches that occur inside a string literal.\r\n quoteCount += appendMatchStringCount( preMatch, regexp );\r\n if ( quoteCount % 2 ) {\r\n regexp.push( match[ 0 ] );\r\n continue;\r\n }\r\n\r\n // add a regex group for the token.\r\n var m = match[ 0 ],\r\n len = m.length,\r\n add;\r\n \r\n switch ( m ) {\r\n case dateFormat.DAY_OF_WEEK_THREE_LETTER: case dateFormat.DAY_OF_WEEK_FULL_NAME:\r\n case dateFormat.MONTH_FULL_NAME: case dateFormat.MONTH_THREE_LETTER:\r\n add = \"(\\\\D+)\";\r\n break;\r\n case dateFormat.MERIDIAN_INDICATOR_FULL: case dateFormat.MERIDIAN_INDICATOR_SINGLE:\r\n add = \"(\\\\D*)\";\r\n break;\r\n case dateFormat.YEAR_FULL:\r\n case dateFormat.MILLISECONDS:\r\n case dateFormat.CENTISECONDS:\r\n case dateFormat.DECISECONDS:\r\n add = \"(\\\\d{\" + len + \"})\";\r\n break;\r\n case dateFormat.DAY_OF_MONTH_DOUBLE_DIGIT: case dateFormat.DAY_OF_MONTH_SINGLE_DIGIT:\r\n case dateFormat.MONTH_DOUBLE_DIGIT: case dateFormat.MONTH_SINGLE_DIGIT:\r\n case dateFormat.YEAR_DOUBLE_DIGIT: case dateFormat.YEAR_SINGLE_DIGIT:\r\n case dateFormat.HOURS_DOUBLE_DIGIT_24_HOUR_CLOCK: case dateFormat.HOURS_SINGLE_DIGIT_24_HOUR_CLOCK:\r\n case dateFormat.HOURS_DOUBLE_DIGIT_12_HOUR_CLOCK: case dateFormat.HOURS_SINGLE_DIGIT_12_HOUR_CLOCK:\r\n case dateFormat.MINUTES_DOUBLE_DIGIT: case dateFormat.MINUTES_SINGLE_DIGIT:\r\n case dateFormat.SECONDS_DOUBLE_DIGIT: case dateFormat.SECONDS_SINGLE_DIGIT:\r\n add = \"(\\\\d\\\\d?)\";\r\n break;\r\n case dateFormat.TIME_ZONE_OFFSET_FULL:\r\n add = \"([+-]?\\\\d\\\\d?:\\\\d{2})\";\r\n break;\r\n case dateFormat.TIME_ZONE_OFFSET_DOUBLE_DIGIT: case dateFormat.TIME_ZONE_OFFSET_SINGLE_DIGIT:\r\n add = \"([+-]?\\\\d\\\\d?)\";\r\n break;\r\n case dateFormat.DATE_SEPARATOR:\r\n add = \"(\\\\\" + cal[\"/\"] + \")\";\r\n break;\r\n default:\r\n throw \"Invalid date format pattern '\" + m + \"'.\";\r\n break;\r\n }\r\n if ( add ) {\r\n regexp.push( add );\r\n }\r\n groups.push( match[ 0 ] );\r\n }\r\n appendMatchStringCount( expFormat.slice( index ), regexp );\r\n regexp.push( \"$\" );\r\n\r\n // allow whitespace to differ when matching formats.\r\n var regexpStr = regexp.join( '' ).replace( /\\s+/g, \"\\\\s+\" ),\r\n parseRegExp = {'regExp': regexpStr, 'groups': groups};\r\n\r\n // cache the regex for this format.\r\n return re[ format ] = parseRegExp;\r\n}\r\n\r\nfunction getParsedDate(value, format, culture) {\r\n // try to parse the date string by matching against the format string\r\n // while using the specified culture for date field names.\r\n value = trim( value );\r\n format = trim(format);\r\n var cal = culture.calendar,\r\n // convert date formats into regular expressions with groupings.\r\n parseInfo = ej.globalize._getDateParseRegExp(cal, format),\r\n match = new RegExp(parseInfo.regExp).exec(value);\r\n if (match === null) {\r\n return null;\r\n }\r\n // found a date format that matches the input.\r\n var groups = parseInfo.groups,\r\n year = null, month = null, date = null, weekDay = null,\r\n hour = 0, hourOffset, min = 0, sec = 0, msec = 0, tzMinOffset = null,\r\n pmHour = false;\r\n // iterate the format groups to extract and set the date fields.\r\n for ( var j = 0, jl = groups.length; j < jl; j++ ) {\r\n var matchGroup = match[ j + 1 ];\r\n if ( matchGroup ) {\r\n var current = groups[ j ],\r\n clength = current.length,\r\n matchInt = parseInt( matchGroup, 10 );\r\n \r\n switch ( current ) {\r\n case dateFormat.DAY_OF_MONTH_DOUBLE_DIGIT: case dateFormat.DAY_OF_MONTH_SINGLE_DIGIT:\r\n date = matchInt;\r\n if ( valueOutOfRange( date, 1, 31 ) ) return null;\r\n break;\r\n case dateFormat.MONTH_THREE_LETTER:\r\n case dateFormat.MONTH_FULL_NAME:\r\n month = getIndexOfMonth( cal, matchGroup, clength === 3 );\r\n if ( valueOutOfRange( month, 0, 11 ) ) return null;\r\n break;\r\n case dateFormat.MONTH_SINGLE_DIGIT: case dateFormat.MONTH_DOUBLE_DIGIT:\r\n month = matchInt - 1;\r\n if ( valueOutOfRange( month, 0, 11 ) ) return null;\r\n break;\r\n case dateFormat.YEAR_SINGLE_DIGIT: case dateFormat.YEAR_DOUBLE_DIGIT:\r\n case dateFormat.YEAR_FULL:\r\n year = clength < 4 ? expandYear( cal, matchInt ) : matchInt;\r\n if ( valueOutOfRange( year, 0, 9999 ) ) return null;\r\n break;\r\n case dateFormat.HOURS_SINGLE_DIGIT_12_HOUR_CLOCK: case dateFormat.HOURS_DOUBLE_DIGIT_12_HOUR_CLOCK:\r\n hour = matchInt;\r\n if ( hour === 12 ) hour = 0;\r\n if ( valueOutOfRange( hour, 0, 11 ) ) return null;\r\n break;\r\n case dateFormat.HOURS_SINGLE_DIGIT_24_HOUR_CLOCK: case dateFormat.HOURS_DOUBLE_DIGIT_24_HOUR_CLOCK:\r\n hour = matchInt;\r\n if ( valueOutOfRange( hour, 0, 23 ) ) return null;\r\n break;\r\n case dateFormat.MINUTES_SINGLE_DIGIT: case dateFormat.MINUTES_DOUBLE_DIGIT:\r\n min = matchInt;\r\n if ( valueOutOfRange( min, 0, 59 ) ) return null;\r\n break;\r\n case dateFormat.SECONDS_SINGLE_DIGIT: case dateFormat.SECONDS_DOUBLE_DIGIT:\r\n sec = matchInt;\r\n if ( valueOutOfRange( sec, 0, 59 ) ) return null;\r\n break;\r\n case dateFormat.MERIDIAN_INDICATOR_FULL: case dateFormat.MERIDIAN_INDICATOR_SINGLE:\r\n pmHour = cal.PM && ( matchGroup === cal.PM[0] || matchGroup === cal.PM[1] || matchGroup === cal.PM[2] );\r\n if ( !pmHour && ( !cal.AM || (matchGroup !== cal.AM[0] && matchGroup !== cal.AM[1] && matchGroup !== cal.AM[2]) ) ) return null;\r\n break;\r\n case dateFormat.DECISECONDS:\r\n case dateFormat.CENTISECONDS:\r\n case dateFormat.MILLISECONDS:\r\n msec = matchInt * Math.pow( 10, 3-clength );\r\n if ( valueOutOfRange( msec, 0, 999 ) ) return null;\r\n break;\r\n case dateFormat.DAY_OF_WEEK_THREE_LETTER:\r\n date = parseDayByInt(value, format, culture, cal);\r\n break;\r\n case dateFormat.DAY_OF_WEEK_FULL_NAME:\r\n getIndexOfDay( cal, matchGroup, clength === 3 );\r\n if ( valueOutOfRange( weekDay, 0, 6 ) ) return null;\r\n break;\r\n case dateFormat.TIME_ZONE_OFFSET_FULL:\r\n var offsets = matchGroup.split( /:/ );\r\n if ( offsets.length !== 2 ) return null;\r\n\r\n hourOffset = parseInt( offsets[ 0 ], 10 );\r\n if ( valueOutOfRange( hourOffset, -12, 13 ) ) return null;\r\n \r\n var minOffset = parseInt( offsets[ 1 ], 10 );\r\n if ( valueOutOfRange( minOffset, 0, 59 ) ) return null;\r\n \r\n tzMinOffset = (hourOffset * 60) + (patternStartsWith( matchGroup, '-' ) ? -minOffset : minOffset);\r\n break;\r\n case dateFormat.TIME_ZONE_OFFSET_SINGLE_DIGIT: case dateFormat.TIME_ZONE_OFFSET_DOUBLE_DIGIT:\r\n // Time zone offset in +/- hours.\r\n hourOffset = matchInt;\r\n if ( valueOutOfRange( hourOffset, -12, 13 ) ) return null;\r\n tzMinOffset = hourOffset * 60;\r\n break;\r\n }\r\n }\r\n }\r\n var result = new Date(), defaultYear, convert = cal.convert;\r\n defaultYear = convert ? convert.fromGregorian( result )[ 0 ] : result.getFullYear();\r\n if ( year === null ) {\r\n year = defaultYear;\r\n }\r\n \r\n // set default day and month to 1 and January, so if unspecified, these are the defaults\r\n // instead of the current day/month.\r\n if ( month === null ) {\r\n month = 0;\r\n }\r\n if ( date === null ) {\r\n date = 1;\r\n }\r\n // now have year, month, and date, but in the culture's calendar.\r\n if ( convert ) {\r\n result = convert.toGregorian( year, month, date );\r\n if ( result === null ) return null;\r\n }\r\n else {\r\n // have to set year, month and date together to avoid overflow based on current date.\r\n result.setFullYear( year, month, date );\r\n // check to see if date overflowed for specified month (only checked 1-31 above).\r\n if ( result.getDate() !== date ) return null;\r\n // invalid day of week.\r\n if ( weekDay !== null && result.getDay() !== weekDay ) {\r\n return null;\r\n }\r\n }\r\n // if pm designator token was found make sure the hours fit the 24-hour clock.\r\n if ( pmHour && hour < 12 ) {\r\n hour += 12;\r\n }\r\n result.setHours( hour, min, sec, msec );\r\n if ( tzMinOffset !== null ) {\r\n var adjustedMin = result.getMinutes() - ( tzMinOffset + result.getTimezoneOffset() );\r\n result.setHours( result.getHours() + parseInt( adjustedMin / 60, 10 ), adjustedMin % 60 );\r\n }\r\n return result;\r\n}\r\n\r\n\r\nfunction formatDateToCulture(value, format, culture) {\r\n var cal = culture.calendar,\r\n convert = cal.convert;\r\n if ( !format || !format.length || format === 'i' ) {\r\n var ret;\r\n if ( culture && culture.name.length ) {\r\n if ( convert ) {\r\n // non-gregorian calendar, so we cannot use built-in toLocaleString()\r\n ret = formatDateToCulture( value, cal.patterns.F, culture );\r\n }\r\n else {\r\n ret = value.toLocaleString();\r\n }\r\n }\r\n else {\r\n ret = value.toString();\r\n }\r\n return ret;\r\n }\r\n\r\n var sortable = format === \"s\";\r\n format = getFullDateFormat(cal, format);\r\n\r\n\r\n // Start with an empty string\r\n ret = [];\r\n var hour,\r\n zeros = ['0','00','000'],\r\n foundDay,\r\n checkedDay,\r\n dayPartRegExp = /([^d]|^)(d|dd)([^d]|$)/g,\r\n quoteCount = 0,\r\n tokenRegExp = /\\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g,\r\n converted;\r\n\r\n function padWithZeros(num, c) {\r\n var r, s = num+'';\r\n if ( c > 1 && s.length < c ) {\r\n r = ( zeros[ c - 2 ] + s);\r\n return r.substr( r.length - c, c );\r\n }\r\n else {\r\n r = s;\r\n }\r\n return r;\r\n }\r\n\r\n function hasDay() {\r\n if ( foundDay || checkedDay ) {\r\n return foundDay;\r\n }\r\n foundDay = dayPartRegExp.test( format );\r\n checkedDay = true;\r\n return foundDay;\r\n }\r\n\r\n if ( !sortable && convert ) {\r\n converted = convert.fromGregorian( value );\r\n }\r\n\r\n for (;;) {\r\n // Save the current index\r\n var index = tokenRegExp.lastIndex,\r\n // Look for the next pattern\r\n ar = tokenRegExp.exec( format );\r\n\r\n // Append the text before the pattern (or the end of the string if not found)\r\n var preMatch = format.slice( index, ar ? ar.index : format.length );\r\n quoteCount += appendMatchStringCount( preMatch, ret );\r\n\r\n if ( !ar ) {\r\n break;\r\n }\r\n\r\n // do not replace any matches that occur inside a string literal.\r\n if ( quoteCount % 2 ) {\r\n ret.push( ar[ 0 ] );\r\n continue;\r\n }\r\n\r\n var current = ar[ 0 ],\r\n clength = current.length;\r\n\r\n\r\n switch ( current ) {\r\n case dateFormat.DAY_OF_WEEK_THREE_LETTER:\r\n case dateFormat.DAY_OF_WEEK_FULL_NAME:\r\n var names = (clength === 3) ? cal.days.namesAbbr : cal.days.names;\r\n ret.push( names[ value.getDay() ] );\r\n break;\r\n case dateFormat.DAY_OF_MONTH_SINGLE_DIGIT:\r\n case dateFormat.DAY_OF_MONTH_DOUBLE_DIGIT:\r\n foundDay = true;\r\n ret.push( padWithZeros( (converted ? converted[2] : value.getDate()), clength ) );\r\n break;\r\n case dateFormat.MONTH_THREE_LETTER:\r\n case dateFormat.MONTH_FULL_NAME:\r\n var part = converted ? converted[1] : value.getMonth();\r\n ret.push( (cal.monthsGenitive && hasDay())\r\n ? cal.monthsGenitive[ clength === 3 ? \"namesAbbr\" : \"names\" ][ part ]\r\n : cal.months[ clength === 3 ? \"namesAbbr\" : \"names\" ][ part ] );\r\n break;\r\n case dateFormat.MONTH_SINGLE_DIGIT:\r\n case dateFormat.MONTH_DOUBLE_DIGIT:\r\n ret.push( padWithZeros((converted ? converted[1] : value.getMonth()) + 1, clength ) );\r\n break;\r\n case dateFormat.YEAR_SINGLE_DIGIT:\r\n case dateFormat.YEAR_DOUBLE_DIGIT:\r\n case dateFormat.YEAR_FULL:\r\n part = converted ? converted[ 0 ] : value.getFullYear();\r\n if ( clength < 4 ) {\r\n part = part % 100;\r\n }\r\n ret.push( padWithZeros( part, clength ) );\r\n break;\r\n case dateFormat.HOURS_SINGLE_DIGIT_12_HOUR_CLOCK:\r\n case dateFormat.HOURS_DOUBLE_DIGIT_12_HOUR_CLOCK:\r\n hour = value.getHours() % 12;\r\n if ( hour === 0 ) hour = 12;\r\n ret.push( padWithZeros( hour, clength ) );\r\n break;\r\n case dateFormat.HOURS_SINGLE_DIGIT_24_HOUR_CLOCK:\r\n case dateFormat.HOURS_DOUBLE_DIGIT_24_HOUR_CLOCK:\r\n ret.push( padWithZeros( value.getHours(), clength ) );\r\n break;\r\n case dateFormat.MINUTES_SINGLE_DIGIT:\r\n case dateFormat.MINUTES_DOUBLE_DIGIT:\r\n ret.push( padWithZeros( value.getMinutes(), clength ) );\r\n break;\r\n case dateFormat.SECONDS_SINGLE_DIGIT:\r\n case dateFormat.SECONDS_DOUBLE_DIGIT:\r\n ret.push( padWithZeros(value .getSeconds(), clength ) );\r\n break;\r\n case dateFormat.MERIDIAN_INDICATOR_SINGLE:\r\n case dateFormat.MERIDIAN_INDICATOR_FULL:\r\n part = value.getHours() < 12 ? (cal.AM ? cal.AM[0] : \" \") : (cal.PM ? cal.PM[0] : \" \");\r\n ret.push( clength === 1 ? part.charAt( 0 ) : part );\r\n break;\r\n case dateFormat.DECISECONDS:\r\n case dateFormat.CENTISECONDS:\r\n case dateFormat.MILLISECONDS:\r\n ret.push( padWithZeros( value.getMilliseconds(), 3 ).substr( 0, clength ) );\r\n break;\r\n case dateFormat.TIME_ZONE_OFFSET_SINGLE_DIGIT:\r\n case dateFormat.TIME_ZONE_OFFSET_DOUBLE_DIGIT:\r\n hour = value.getTimezoneOffset() / 60;\r\n ret.push( (hour <= 0 ? '+' : '-') + padWithZeros( Math.floor( Math.abs( hour ) ), clength ) );\r\n break;\r\n case dateFormat.TIME_ZONE_OFFSET_FULL:\r\n hour = value.getTimezoneOffset() / 60;\r\n ret.push( (hour <= 0 ? '+' : '-') + padWithZeros( Math.floor( Math.abs( hour ) ), 2 ) +\r\n \":\" + padWithZeros( Math.abs( value.getTimezoneOffset() % 60 ), 2 ) );\r\n break;\r\n case dateFormat.DATE_SEPARATOR:\r\n ret.push( cal[\"/\"] || \"/\" );\r\n break;\r\n default:\r\n throw \"Invalid date format pattern '\" + current + \"'.\";\r\n break;\r\n }\r\n }\r\n return ret.join( '' );\r\n}\r\n\r\n//add new culture into ej \r\nej.globalize.addCulture = function (name, culture) {\r\n ej.cultures[name] = $.extend(true, $.extend(true, {}, ej.cultures['default'], culture), ej.cultures[name]);\r\n\tej.cultures[name].calendar = ej.cultures[name].calendars.standard;\r\n}\r\n\r\n//return the specified culture or default if not found\r\nej.globalize.preferredCulture = function (culture) {\r\n culture = (typeof culture != \"undefined\" && typeof culture === typeof this.cultureObject) ? culture.name : culture;\r\n this.cultureObject = ej.globalize.findCulture(culture);\r\n return this.cultureObject;\r\n}\r\nej.globalize.setCulture = function (culture) {\r\n\tif (ej.isNullOrUndefined(this.globalCultureObject)) this.globalCultureObject = ej.globalize.findCulture(culture);\r\n\tculture = (typeof culture != \"undefined\" && typeof culture === typeof this.globalCultureObject) ? culture.name : culture;\r\n if (culture) this.globalCultureObject = ej.globalize.findCulture(culture);\r\n ej.cultures.current = this.globalCultureObject;\r\n return this.globalCultureObject;\r\n}\r\nej.globalize.culture=function(name){\r\n ej.cultures.current = ej.globalize.findCulture(name);\r\n}\r\n\r\n//return the specified culture or current else default if not found\r\nej.globalize.findCulture = function (culture) {\r\n var cultureObject;\r\n if (culture) {\r\n\r\n if ($.isPlainObject(culture) && culture.numberFormat) {\r\n cultureObject = culture;\r\n }\r\n if (typeof culture === \"string\") {\r\n var cultures = ej.cultures;\r\n if (cultures[culture]) {\r\n return cultures[culture];\r\n }\r\n else {\r\n if (culture.indexOf(\"-\") > -1) {\r\n var cultureShortName = culture.split(\"-\")[0];\r\n if (cultures[cultureShortName]) {\r\n return cultures[cultureShortName];\r\n }\r\n }\r\n else {\r\n var cultureArray = $.map(cultures, function (el) { return el });\r\n for (var i = 0; i < cultureArray.length; i++) {\r\n var shortName = cultureArray[i].name.split(\"-\")[0];\r\n if (shortName === culture) {\r\n return cultureArray[i];\r\n }\r\n };\r\n }\r\n }\r\n return ej.cultures[\"default\"];\r\n }\r\n }\r\n else {\r\n cultureObject = ej.cultures.current || ej.cultures[\"default\"];\r\n }\r\n\r\n return cultureObject;\r\n}\r\n//formatting date and number based on given format\r\nej.globalize.format = function (value, format, culture) {\r\n var cultureObject = ej.globalize.findCulture(culture);\r\n if (typeof(value) === 'number') {\r\n value = formatNumberToCulture(value, format, cultureObject);\r\n } else if(value instanceof Date){\r\n \tvalue = formatDateToCulture(value, format, cultureObject);\r\n }\r\n\r\n return value;\r\n}\r\n\r\n//parsing integer takes string as input and return as number\r\nej.globalize.parseInt = function(value, radix, culture) {\r\n\tif(!radix)\r\n\t\tradix = 10;\r\n return Math.floor( parseValue( value, culture, radix ) );\r\n}\r\n\r\n//returns the ISO date string from date object\r\nej.globalize.getISODate = function(value) {\r\n if(value instanceof Date) return value.toISOString();\r\n}\r\n\r\n//parsing floationg poing number takes string as input and return as number\r\nej.globalize.parseFloat = function(value, radix, culture) {\r\n\tif (typeof radix === \"string\") {\r\n culture = radix;\r\n radix = 10;\r\n }\r\n return parseValue( value, culture);\r\n}\r\n\r\n//parsing date takes string as input and return as date object\r\nej.globalize.parseDate = function(value, formats, culture) {\r\n culture = ej.globalize.findCulture(culture);\r\n\r\n var date, prop, patterns;\r\n if ( formats ) {\r\n if ( typeof formats === \"string\" ) {\r\n formats = [ formats ];\r\n }\r\n if ( formats.length ) {\r\n for ( var i = 0, l = formats.length; i < l; i++ ) {\r\n var format = formats[ i ];\r\n if ( format ) {\r\n date = getParsedDate( value, format, culture );\r\n if ( date ) break;\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n patterns = culture.calendar.patterns;\r\n for ( prop in patterns ) {\r\n date = getParsedDate( value, patterns[prop], culture );\r\n if ( date ) break;\r\n }\r\n }\r\n return date || null;\r\n}\r\n\r\nfunction getControlObject(obj, stringArray){\r\n return stringArray.length ? getControlObject(obj[stringArray[0]], stringArray.slice(1)) : obj;\r\n}\r\n\r\n//return localized constants as object for the given widget control and culture\r\nej.globalize.getLocalizedConstants = function(controlName, culture){\r\n var returnObject,\r\n controlNameArray = controlName.replace(\"ej.\", \"\").split(\".\");\r\n \r\n returnObject = getControlObject(ej, controlNameArray);\r\n\r\n return ( $.extend(true, {}, returnObject.Locale['default'], returnObject.Locale[culture ? culture : this.cultureObject.name]) ) ;\r\n}\r\n\r\n$.extend(ej, ej.globalize);\r\n\r\n}(jQuery));;\r\nej.EjVmlRender = function (element) {\r\n var doc = document;\r\n this.vmlNamespace = \"urn:schemas-microsoft-com:vml\";\r\n this.vmStyle = \"#default#VML\";\r\n doc.namespaces.add('v', 'urn:schemas-microsoft-com:vml');\r\n this.isdocmode8 = doc.documentMode === 8;\r\n if (!doc.getElementById(\"vml_chart\")) {\r\n var cssText\r\n if (this.isdocmode8) {\r\n cssText =\r\n 'v\\\\:fill, v\\\\:path, v\\\\:polyline, v\\\\:line, v\\\\:rect,v\\\\:shape,v\\\\:oval, v\\\\:stroke' +\r\n '{ behavior:url(#default#VML); display: inline-block; } ';\r\n }\r\n else {\r\n cssText =\r\n 'v\\\\:*' +\r\n '{ behavior:url(#default#VML); display: inline-block; } ';\r\n }\r\n var vmlStyleSheet = doc.createStyleSheet();\r\n vmlStyleSheet.owningElement.id = 'vml_chart';\r\n vmlStyleSheet.cssText = cssText;\r\n }\r\n this._rootId = jQuery(element).attr(\"id\");\r\n this.svgObj = doc.createElement(\"div\");\r\n this.svgObj.style.position = 'relative';\r\n this.svgObj.setAttribute('id', this._rootId + '_vml');\r\n this.changeOptions = {\r\n 'id': 'id',\r\n 'fill': 'fillcolor', 'stroke': 'strokecolor', 'stroke-width': 'strokeweight', 'd': 'path', 'font-size': 'font-size', 'font-family': 'font-family', 'font-style': 'font-style',\r\n 'font-weight': 'font-weight', 'points': 'points'\r\n\r\n };\r\n};\r\n(function ($) {\r\n ej.EjVmlRender.prototype = {\r\n\r\n drawPath: function (options, element) {\r\n var darray = options.d.split(\" \");\r\n if ($.inArray('A', darray) != -1) {\r\n var w = parseFloat(darray[4]);\r\n var h = parseFloat(darray[5]);\r\n options.d = this.drawArc(w, h, options);\r\n }\r\n if ($(\"#\" + options.id).length > 0) {\r\n options.d = this.changePathValue(options.d);\r\n this.applyVMLStyle($(\"#\" + options.id), options);\r\n }\r\n else {\r\n options.d = this.changePathValue(options.d);\r\n var shape = document.createElement(\"v:shape\");\r\n var $shapeEle = $(shape);\r\n this.applyVMLStyle($shapeEle, options);\r\n $shapeEle.appendTo(element);\r\n }\r\n },\r\n createLegendSvg: function (element) {\r\n var doc = document;\r\n this._rootId = jQuery(element).attr(\"id\");\r\n this.legendsvgObj = doc.createElement(\"div\");\r\n this.legendsvgObj.style.position = 'relative';\r\n this.legendsvgObj.setAttribute('id', \"legend_\" + this._rootId + '_vml');\r\n return this.legendsvgObj;\r\n },\r\n\r\n drawPolyline: function (options, element) {\r\n var darray = options.points.split(\" \");\r\n\r\n if ($(\"#\" + options.id).length > 0) {\r\n options.points = this.changePathValue(options.points);\r\n this.applyVMLStyle($(\"#\" + options.id), options);\r\n }\r\n else {\r\n options.points = this.changePathValue(options.points);\r\n var shape = document.createElement(\"v:polyline\");\r\n var $shapeEle = $(shape);\r\n this.applyVMLStyle($shapeEle, options);\r\n $shapeEle.appendTo(element);\r\n }\r\n },\r\n setFillAttribute: function (element, options) {\r\n var fill = document.createElement(\"v:fill\");\r\n var opacity = options[\"fill-opacity\"] ? options[\"fill-opacity\"] : options[\"opacity\"];\r\n opacity = (!ej.util.isNullOrUndefined(opacity)) ? opacity : (options[\"opacity\"]) ? options[\"opacity\"] : 1;\r\n var fillcolor = options[\"fill\"];\r\n if (fillcolor != \"none\" && !ej.util.isNullOrUndefined(fillcolor)) {\r\n\r\n if (!(fillcolor).match('gradient'))\r\n $(element).attr(\"fillcolor\", fillcolor);\r\n else {\r\n var colorName = ((fillcolor).replace('gradient', \"\"));\r\n fill.setAttribute('type', \"gradient\");\r\n fill.setAttribute(\"colors\", colorName);\r\n }\r\n }\r\n else if (fillcolor == 'none') {\r\n fill.setAttribute('type', \"gradient\");\r\n fill.setAttribute('color', options.color);\r\n fill.setAttribute('color2', options.color2);\r\n fill.setAttribute('colors', options.colors);\r\n fill.setAttribute('angle', options.angle);\r\n opacity = options.fill_opacity;\r\n }\r\n else\r\n opacity = 0.1;\r\n\r\n\r\n fill.setAttribute('opacity', opacity);\r\n $(fill).appendTo(element);\r\n },\r\n setStrokeAttribute: function (element, options) {\r\n var stroke = options['stroke'];\r\n if (stroke == \"transparent\")\r\n options['opacity'] = 0.1;\r\n if (options.name) {\r\n $(element).attr('name', options.name);\r\n }\r\n\r\n\r\n var opacity = options[\"opacity\"];\r\n if (opacity) {\r\n var fill = document.createElement(\"v:stroke\");\r\n\r\n\r\n\r\n fill.setAttribute('opacity', opacity);\r\n $(fill).appendTo(element);\r\n }\r\n },\r\n changePathValue: function (options) {\r\n if (!options[\"d\"]) {\r\n var pathArray = options.split(\" \");\r\n for (var i = 0; i < pathArray.length; i++) {\r\n var matches = pathArray[i].match(/\\d+/g);\r\n if (matches != null) {\r\n pathArray[i] = Math.round(parseFloat(pathArray[i]));\r\n }\r\n }\r\n options = pathArray.join(' ');\r\n return options;\r\n }\r\n },\r\n\r\n\r\n drawArc: function (w, h, options) {\r\n var x = 0, y = 0;\r\n var startAngle = options.start,\r\n endAngle = options.end,\r\n endAngle = (Number(Math.PI.toFixed(2)) == Number((endAngle + startAngle).toFixed(2))) ? endAngle - 0.01 : endAngle,\r\n radius = options.r || w || h,\r\n cosStart = Math.cos(startAngle),\r\n sinStart = Math.sin(startAngle),\r\n cosEnd = Math.cos(endAngle),\r\n sinEnd = Math.sin(endAngle),\r\n innerRadius = options.innerR,\r\n circleCorrection = 0.08 / radius,\r\n innerCorrection = (innerRadius && 0.1 / innerRadius) || 0,\r\n path;\r\n\r\n if (endAngle - startAngle === 0) {\r\n return '';\r\n\r\n } else if (2 * Math.PI - endAngle + startAngle < circleCorrection) {\r\n cosEnd = -circleCorrection;\r\n } else if (endAngle - startAngle < innerCorrection) {\r\n cosEnd = Math.cos(startAngle + innerCorrection);\r\n }\r\n\r\n path = [\r\n 'wa', // To draw clockwise arc\r\n x - radius,\r\n y - radius,\r\n x + radius,\r\n y + radius,\r\n x + radius * cosStart,\r\n y + radius * sinStart,\r\n x + radius * cosEnd,\r\n y + radius * sinEnd\r\n ];\r\n\r\n if (options.open && !innerRadius) {\r\n path.push(\r\n 'e',\r\n M,\r\n x,\r\n y\r\n );\r\n }\r\n\r\n path.push(\r\n // To draw anti clockwise arc\r\n 'at',\r\n x - innerRadius,\r\n y - innerRadius,\r\n x + innerRadius,\r\n y + innerRadius,\r\n x + innerRadius * cosEnd,\r\n y + innerRadius * sinEnd,\r\n x + innerRadius * cosStart,\r\n y + innerRadius * sinStart,\r\n 'x',\r\n 'e'\r\n );\r\n path = path.join(\" \");\r\n return path;\r\n\r\n },\r\n changeVMLStyle: function ($element, options) {\r\n var chart = this;\r\n var strokeColor = options.stroke;\r\n $element.css(\"width\", options.width).css(\"visibility\", options.visibility).css(\"height\", options.height).css(\"position\", \"absolute\").css('left', options.x).css('top', options.y);\r\n $.each(options, function (index, val) {\r\n if (chart.changeOptions[index] != null || chart.changeOptions[index] != undefined) {\r\n if (index == 'd' || index == 'points') {\r\n val = chart.changePathValue(options[index]).toLowerCase();\r\n }\r\n if (val == 'transparent' && !options.fill_opacity) {\r\n options[index] = val = 'white';\r\n if (index == \"fill\" && (!options.hasOwnProperty('opacity') || !options['opacity']))\r\n options['opacity'] = 0.1;\r\n }\r\n if (options.fill_opacity) {\r\n options['opacity'] = options.fill_opacity;\r\n }\r\n if ($element[0].tagName === \"SPAN\") {\r\n if (index == \"fill\") $element.css('color', val);\r\n else {\r\n if (index == \"id\") $element.attr(chart.changeOptions[index], val);\r\n else\r\n $element.css(chart.changeOptions[index], val);\r\n }\r\n } else {\r\n\r\n if (chart.isdocmode8) { // IE8 setAttribute bug\r\n $element.get(0)[chart.changeOptions[index]] = val;\r\n } else {\r\n $element.get(0).setAttribute(chart.changeOptions[index], val);\r\n }\r\n }\r\n }\r\n });\r\n if (options.hasOwnProperty('fill-opacity') || options.hasOwnProperty('opacity') || options.hasOwnProperty('fill'))\r\n if (!($element[0].tagName === \"SPAN\")) {\r\n chart.setFillAttribute($element, options);\r\n if (options.hasOwnProperty('stroke')) {\r\n options.stroke = strokeColor;\r\n if (options.fill_opacity) {\r\n options['opacity'] = options.fill_opacity;\r\n }\r\n chart.setStrokeAttribute($element, options);\r\n }\r\n }\r\n },\r\n applyVMLStyle: function ($element, options) {\r\n\r\n if ($element[0].tagName !== \"SPAN\") {\r\n if (ej.util.isNullOrUndefined(options.width)) options.width = \"1000px\";\r\n if (ej.util.isNullOrUndefined(options.height)) options.height = \"1000px\";\r\n }\r\n if (ej.util.isNullOrUndefined(options.x)) options.x = \"0px\";\r\n if (ej.util.isNullOrUndefined(options.y)) options.y = \"0px\";\r\n\r\n this.changeVMLStyle($element, options);\r\n },\r\n drawLine: function (options, element) {\r\n if ($(\"#\" + options.id).length > 0) {\r\n var from = (options.x1) + ',' + (options.y1);\r\n var to = (options.x2) + ',' + (options.y2);\r\n $(options).attr(\"from\", from).attr(\"to\", to);\r\n this.applyVMLStyle($(\"#\" + options.id), options);\r\n }\r\n else {\r\n var line = document.createElement(\"v:line\");\r\n var $lineEle = $(line);\r\n var from = (options.x1) + ',' + (options.y1);\r\n var to = (options.x2) + ',' + (options.y2);\r\n $lineEle.attr(\"from\", from).attr(\"to\", to);\r\n this.applyVMLStyle($lineEle, options);\r\n $lineEle.appendTo(element);\r\n }\r\n },\r\n //drawPolygon: function (options, element) {\r\n\r\n //},\r\n drawCircle: function (options, element) {\r\n if ($(\"#\" + options.id).length > 0) {\r\n options.x = options.cx - options.r;\r\n options.y = options.cy - options.r;\r\n options.width = options.height = (2 * options.r);\r\n this.applyVMLStyle($(\"#\" + options.id), options);\r\n }\r\n else {\r\n var circle = document.createElement(\"v:oval\");\r\n var $circleEle = $(circle);\r\n options.x = options.cx - options.r;\r\n options.y = options.cy - options.r;\r\n options.width = options.height = (2 * options.r);\r\n this.applyVMLStyle($circleEle, options);\r\n if ($(\"#\" + options.id).length == 0)\r\n $circleEle.appendTo(element);\r\n }\r\n },\r\n\r\n drawEllipse: function (options, element) {\r\n if ($(\"#\" + options.id).length > 0) {\r\n options.x = options.cx - options.rx;\r\n options.y = options.cy - options.ry;\r\n options.width = (2 * options.rx);\r\n options.height = (2 * options.ry);\r\n this.applyVMLStyle($(\"#\" + options.id), options);\r\n }\r\n else {\r\n var ellipse = document.createElement(\"v:oval\");\r\n var $ellipseEle = $(ellipse);\r\n options.x = options.cx - options.rx;\r\n options.y = options.cy - options.ry;\r\n options.width = (2 * options.rx);\r\n options.height = (2 * options.ry);\r\n this.applyVMLStyle($ellipseEle, options);\r\n $ellipseEle.appendTo(element);\r\n }\r\n },\r\n drawRect: function (options, element) {\r\n if ($(\"#\" + options.id).length > 0) {\r\n this.applyVMLStyle($(\"#\" + options.id), options);\r\n } else {\r\n var rect = document.createElement(\"v:rect\");\r\n var $rectEle = $(rect);\r\n this.applyVMLStyle($rectEle, options);\r\n $rectEle.appendTo(element);\r\n }\r\n },\r\n drawCylinder: function (options, element, seriesOption) {\r\n var x = options.x, y = options.y, w = options.width, h = options.height, id = options.id, angle, path, rx, ry, cx2, cx1, cy1, X1, Y1, LX1, LY1, LX2, LY2, cy2, sa, ea, sa2, ea2, X, Y, cx, cy, LX, LY;\r\n var gradientColor = options.fill;\r\n var format = ej.EjSvgRender.prototype.checkColorFormat(gradientColor);\r\n if (!format)\r\n var gradientColor = ej.datavisualization.Chart.prototype.colorNameToHex(options.fill);\r\n var opacity = options.opacity, obj = { svgRenderer: ej.EjSvgRender.prototype }, colorz = ej.Ej3DRender.prototype.polygon3D.prototype.applyZLight(gradientColor, obj), colorx = ej.Ej3DRender.prototype.polygon3D.prototype.applyXLight(gradientColor, obj);\r\n var angleConvertor = 65535; // VML measures angles in degrees/65535\r\n if (seriesOption.isColumn == true) {\r\n options.rx = rx = w / 2;\r\n options.ry = ry = rx / 4;\r\n cx2 = cx1 = x + rx;\r\n Y1 = cy1 = (y - ry);\r\n LY2 = Y = cy2 = y + h - ry;\r\n LX1 = cx2 + rx;\r\n X1 = LX2 = X = cx2 - rx;\r\n sa1 = -Math.round(angleConvertor * 180);\r\n ea1 = Math.round(angleConvertor * 180);\r\n sa2 = Math.round(angleConvertor * 360);\r\n ea2 = -Math.round(angleConvertor * 180);\r\n gradientAngle = \"90\";\r\n if (seriesOption.stacking == true) {\r\n if (!seriesOption.isLastSeries) {\r\n cy1 = y + ry;\r\n }\r\n }\r\n LY1 = cy1;\r\n }\r\n else {\r\n options.ry = ry = h / 2;\r\n options.rx = rx = ry / 4;\r\n LX1 = X1 = cx1 = x + rx;\r\n X = cx2 = x + w + rx;\r\n sa1 = Math.round(angleConvertor * 90); ea1 = Math.round(angleConvertor * 180);\r\n sa2 = Math.round(angleConvertor * 270);\r\n ea2 = -Math.round(angleConvertor * 180);\r\n cy2 = cy1 = y + ry;\r\n Y = LY1 = cy1 + ry;\r\n Y1 = LY2 = cy2 - ry;\r\n gradientAngle = \"0\";\r\n if (seriesOption.stacking == true) {\r\n if (!seriesOption.isLastSeries) {\r\n cx2 = x + w - rx;\r\n }\r\n }\r\n LX2 = cx2;\r\n }\r\n delete options.x;\r\n delete options.y;\r\n options.width = 1000;\r\n options.x = 0;\r\n options.y = 0;\r\n delete options.stacking;\r\n options.height = 1000;\r\n delete options.isColumn;\r\n options.fill = colorz;\r\n options.fill_opacity = opacity;\r\n options.stroke = colorz;\r\n options['stroke-width'] = 0;\r\n for (i = 1; i <= 4; i++) {\r\n\r\n if (i % 2 == 0) {\r\n cx = cx1;\r\n cy = cy1; LX = LX2; LY = LY2; sa = sa2; ea = ea2;\r\n\r\n }\r\n else {\r\n cx = cx2; cy = cy2; LX = LX1; LY = LY1; sa = sa1; ea = ea1;\r\n }\r\n if (i < 3) {\r\n sa = angleConvertor;\r\n ea = 23592600;\r\n }\r\n if (i < 4) {\r\n path = [\r\n 'M',\r\n Math.round(X),\r\n Math.round(Y)\r\n ];\r\n }\r\n path.push(\r\n\r\n 'ae',\r\n Math.round(cx),\r\n Math.round(cy),\r\n Math.round(rx),\r\n Math.round(ry),\r\n sa,\r\n ea\r\n );\r\n if (i > 2) {\r\n path.push(\r\n\r\n 'l',\r\n Math.round(LX),\r\n Math.round(LY)\r\n );\r\n options.fill = \"none\";\r\n options.color = gradientColor;\r\n options.color2 = gradientColor;\r\n options.colors = (\"30% \" + colorx + \",\" + \"70% \" + colorx);\r\n options.angle = gradientAngle;\r\n }\r\n if (i != 3) {\r\n path.push(\r\n 'e'\r\n );\r\n path = path.join(\" \");\r\n options.d = path;\r\n options.id = id + \"_\" + \"Region_\" + (i - 1).toString();\r\n if (i == 4)\r\n options.id = id + \"_\" + \"Region_\" + (i - 2).toString();\r\n var shape = document.createElement(\"v:shape\");\r\n var $shape = $(shape);\r\n this.applyVMLStyle($shape, options);\r\n $shape.appendTo(element);\r\n }\r\n X = X1; Y = Y1;\r\n }\r\n },\r\n _getAttrVal: function (ele, val, option) {\r\n val = (val == \"x\") ? \"left\" : val;\r\n val = (val == \"y\") ? \"top\" : val;\r\n var value1 = $(ele).attr(val);\r\n var value = value1 ? value1 : ($(ele).css(val));\r\n\r\n if (value != null)\r\n return value;\r\n else\r\n return option;\r\n },\r\n _setAttr: function (element, attribute) {\r\n if (attribute.transform) {\r\n var attrTrans = attribute.transform;\r\n var trans = attrTrans.slice(attrTrans.indexOf('(') + 1, attrTrans.indexOf(')')).split(',');\r\n attribute.x = trans[0];\r\n attribute.y = trans[1];\r\n }\r\n var $ele = $(element);\r\n if ($ele.length > 0)\r\n this.changeVMLStyle($ele, attribute);\r\n },\r\n createGradientElement: function (name, colors) {\r\n var colorName;\r\n\r\n if (Object.prototype.toString.call(colors) == '[object Array]') {\r\n colorName = \"gradient\" + \" \";\r\n var appendString = \"\";\r\n for (var j = 0, i = colors.length - 1; i >= 0, j < colors.length; j++ , i--) {\r\n colorName += appendString + colors[j][\"colorStop\"] + \" \" + colors[i][\"color\"];\r\n appendString = \",\";\r\n }\r\n }\r\n else {\r\n colorName = colors;\r\n }\r\n return colorName;\r\n },\r\n\r\n setSpanAttr: function (options, label, element) {\r\n var fontSize = (options[\"font-size\"] > 0) ? (options[\"font-size\"] + \"px\") : options[\"font-size\"];\r\n var font = { size: fontSize, fontStyle: options[\"font-style\"], fontFamily: options[\"font-family\"] };\r\n var bounds = ej.EjSvgRender.utils._measureText(label, null, font);\r\n\r\n $(element).css(\"white-space\", \"nowrap\");\r\n\r\n if (options[\"text-anchor\"] === \"middle\")\r\n options.x = Math.round(options.x - bounds.width / 2);\r\n else if (options[\"text-anchor\"] === \"end\")\r\n options.x = Math.round(options.x - bounds.width);\r\n options.y = Math.round(options.y - (font.size.replace(\"px\", \"\")));\r\n this.applyVMLStyle(element, options);\r\n\r\n\r\n },\r\n drawText: function (options, label, groupEle, font) {\r\n var textDoc = document;\r\n var $Ele = $(\"#\" + options.id);\r\n if ($Ele.length > 0) {\r\n this._textAttrReplace(options, label, font, $Ele);\r\n }\r\n else if (options.id.indexOf(\"YAxisTitle\") > 0 && !this.isdocmode8) {\r\n options.on = true;\r\n var line = document.createElement(\"v:line\");\r\n line.style.behavior = \"url(#default#VML)\";\r\n line.style.display = \"inline-block\";\r\n var bounds = ej.EjSvgRender.utils._measureText(label, null, null);\r\n\r\n line.setAttribute(\"to\", (options.x - 1).toString() + \",\" + (options.y - bounds.width / 2).toString());\r\n line.setAttribute(\"from\", (options.x).toString() + \",\" + options.y.toString());\r\n\r\n var path = document.createElement(\"v:path\");\r\n path.setAttribute(\"textpathok\", true);\r\n var textpath = document.createElement(\"v:textpath\");\r\n textpath.setAttribute(\"on\", true);\r\n textpath.setAttribute(\"string\", label);\r\n\r\n textpath.style[\"font-style\"] = options[\"font-style\"];\r\n textpath.style[\"font-size\"] = options[\"font-size\"];\r\n textpath.style[\"font-family\"] = options[\"font-family\"];\r\n line.appendChild(path);\r\n line.appendChild(textpath);\r\n $(line).appendTo(groupEle);\r\n }\r\n else {\r\n var span = textDoc.createElement(\"span\");\r\n var $spanEle = $(span);\r\n if (jQuery.type(label) == \"array\") {\r\n this.setSpanAttr(options, label, $spanEle);\r\n for (var i = 0; i < label.length; i++) {\r\n var textspan = textDoc.createElement(\"span\");\r\n $(textspan).html(label[i]);\r\n $(textspan).appendTo(span);\r\n var brtag = textDoc.createElement(\"br\");\r\n $(brtag).appendTo(span);\r\n\r\n }\r\n } else {\r\n this.setSpanAttr(options, label, $spanEle);\r\n $spanEle.html(label);\r\n }\r\n $spanEle.appendTo(groupEle);\r\n }\r\n },\r\n //text element attributes values are replaced \r\n _textAttrReplace: function (options, label, font, $Ele) {\r\n if (jQuery.type(label) == \"array\") {\r\n var elements = $(\"#\" + options.id).children(\"span\");\r\n this.setSpanAttr(options, label, $Ele);\r\n if (elements.length > 0 && elements.length == label.length) {\r\n for (var i = 0; i < elements.length; i++) {\r\n var element = elements[i];\r\n $(element).text(label[i]);\r\n }\r\n }\r\n else {\r\n $(\"#\" + options.id).remove();\r\n this.drawText(options, label, this.gTransToolEle, font);\r\n\r\n }\r\n } else {\r\n this.setSpanAttr(options, label, $Ele);\r\n $Ele.text(label);\r\n }\r\n\r\n },\r\n\r\n drawImage: function (options, element) {\r\n var imgElement = document.createElement(\"img\");\r\n var $imgElement = $(imgElement);\r\n $imgElement.css({ 'position': 'absolute' });\r\n $.each(options, function (index, val) {\r\n if (index == \"href\") index = \"src\";\r\n $imgElement.attr(index, val);\r\n });\r\n $imgElement.appendTo(element);\r\n\r\n },\r\n\r\n createDefs: function () {\r\n\r\n },\r\n\r\n //createClipPath: function (options) {\r\n\r\n //},\r\n //createForeignObject: function (options) {\r\n\r\n //},\r\n createGroup: function (options) {\r\n var group = document.createElement(\"div\");\r\n if (!ej.util.isNullOrUndefined(options.transform)) {\r\n var trans = options.transform.slice(options.transform.indexOf('(') + 1, options.transform.indexOf(')')).split(',');\r\n $(group).css({ 'position': 'absolute', 'left': trans[0] + 'px', 'top': trans[1] + 'px' });\r\n }\r\n if (options.cursor)\r\n $(group).css({ 'cursor': options.cursor });\r\n\r\n $.each(options, function (index, val) {\r\n if (index !== 'transform' && index != \"clip-path\")\r\n $(group).attr(index, val);\r\n });\r\n\r\n return group;\r\n },\r\n\r\n createText: function (options, label) {\r\n var text = document.createElement(\"span\");\r\n $(text).attr(options);\r\n if (!ej.util.isNullOrUndefined(label))\r\n text.textContent = label;\r\n return text;\r\n\r\n\r\n },\r\n\r\n //Draw clip path for each series to avoid series overlap in multiple axes zooming\r\n drawAxesBoundsClipPath: function (gSeriesGroupEle, options, invertedAxis) {\r\n var clipOptions;\r\n var element = $(gSeriesGroupEle);\r\n element.removeAttr(\"clip-path\");\r\n var trans = this._getTransform(options.xAxis, options.yAxis, invertedAxis);\r\n clipOptions = {\r\n 'id': gSeriesGroupEle.id + '_ClipRect',\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': (trans.width),\r\n 'height': (trans.height),\r\n 'fill': 'white',\r\n 'stroke-width': 1,\r\n 'stroke': 'transparent'\r\n };\r\n this.drawClipPath(clipOptions, gSeriesGroupEle);\r\n element.attr('clip-path', 'url(#' + clipOptions.id + ')');\r\n\r\n },\r\n\r\n getAttrVal: function (ele, val, option) {\r\n var value = $(ele).attr(val);\r\n if (value != null)\r\n return value;\r\n else\r\n return option;\r\n },\r\n\r\n round: function (value, div, up) {\r\n\r\n return div * (up ? Math.ceil(value / div) : Math.floor(value / div));\r\n },\r\n\r\n\r\n\r\n\r\n hexFromRGB: function (color) {\r\n var r = color.R;\r\n var g = color.G;\r\n var b = color.B;\r\n if (color.A) {\r\n var returncolor = \"rgba(\" + r.toString() + \",\" + g.toString() + \",\" + b.toString() + \",\" + color.A + \")\";\r\n return returncolor;\r\n }\r\n else {\r\n var r = color.R;\r\n var g = color.G;\r\n var b = color.B;\r\n var hex = [r.toString(16), g.toString(16), b.toString(16)];\r\n $.each(hex, function (nr, val) { if (val.length === 1) { hex[nr] = \"0\" + val; } });\r\n return \"#\" + hex.join(\"\").toUpperCase();\r\n }\r\n },\r\n hexToRGB: function (hex) {\r\n var rgbRegex = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)$/.test(hex);\r\n var result;\r\n if (rgbRegex == true) {\r\n result = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)$/.exec(hex);\r\n return result ? {\r\n R: parseInt(result[1]),\r\n G: parseInt(result[2]),\r\n B: parseInt(result[3]),\r\n A: result[4],\r\n } : null;\r\n }\r\n else {\r\n var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n return result ? {\r\n R: parseInt(result[1], 16),\r\n G: parseInt(result[2], 16),\r\n B: parseInt(result[3], 16)\r\n } : null;\r\n }\r\n },\r\n checkColorFormat: function (color) {\r\n return /(rgba?\\((?:\\d{1,3}[,\\)]){3}(?:\\d+\\.\\d+\\))?)|(^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$)/gmi.test(color);\r\n },\r\n createDelegate: function (context, handler) {\r\n return function (e) {\r\n handler.apply(context, [e, this]);\r\n };\r\n },\r\n\r\n drawClipPath: function (options, element) {\r\n if (options.id.indexOf(\"ChartAreaClipRect\") == -1) {\r\n var left = Math.round(options.x) + 'px';\r\n var top = Math.round(options.y) + 'px';\r\n var right = Math.round(options.width) + Math.round(options.x) + 'px';\r\n var bottom = Math.round(options.y) + Math.round(options.height) + 'px';\r\n var cssClip = 'rect(' + top + ' ' + right + ' ' + bottom + ' ' + left + ')';\r\n $(element).css(\"position\", \"absolute\").css('clip', cssClip);\r\n }\r\n },\r\n\r\n drawCircularClipPath: function (options, element) {\r\n var radius = Math.round(options.r);\r\n var x = Math.round(options.cx);\r\n var y = Math.round(options.cy);\r\n if (options.id.indexOf(\"_ClipRect\") == -1) {\r\n var left = (x - radius) + 'px';\r\n var top = (y - radius) + 'px';\r\n var right = (x + radius) + 'px';\r\n var bottom = (y + radius) + 'px';\r\n var cssClip = 'rect(' + top + ' ' + right + ' ' + bottom + ' ' + left + ')';\r\n $(element).css(\"position\", \"absolute\").css('clip', cssClip);\r\n }\r\n },\r\n\r\n append: function (childEle, parentEle) {\r\n $(childEle).appendTo(parentEle);\r\n }\r\n };\r\n})(jQuery);;\r\nej.EjSvgRender = function (element) {\r\n\r\n this.svgLink = \"http://www.w3.org/2000/svg\";\r\n this.svgObj = document.createElementNS(this.svgLink, \"svg\");\r\n this._rootId = jQuery(element).attr(\"id\");\r\n var id = this._rootId + '_svg';\r\n if ($(document).find(\"#\" + id).length > 0) {\r\n var count = 0\r\n do {\r\n count++;\r\n } while ($(document).find(\"#\" + this._rootId + '_svg' + count).length > 0);\r\n id = this._rootId + '_svg' + count;\r\n }\r\n this.svgObj.setAttribute('id', id);\r\n\r\n};\r\n(function ($) {\r\n ej.EjSvgRender.prototype = {\r\n drawPath: function (options, element) {\r\n if ($(\"#\" + options.id).length > 0) {\r\n $(\"#\" + options.id).attr(options);\r\n }\r\n else {\r\n var path = document.createElementNS(this.svgLink, \"path\");\r\n $(path).attr(options).appendTo(element);\r\n }\r\n\r\n },\r\n createLegendSvg: function (element) {\r\n this.svgLink = \"http://www.w3.org/2000/svg\";\r\n this.legendsvgObj = document.createElementNS(this.svgLink, \"svg\");\r\n this._rootId = jQuery(element).attr(\"id\");\r\n this.legendsvgObj.setAttribute('id', \"legend_\" + this._rootId + '_svg');\r\n return this.legendsvgObj;\r\n },\r\n drawPolyline: function (options, element) {\r\n if ($(\"#\" + options.id).length > 0) {\r\n $(\"#\" + options.id).attr(options);\r\n }\r\n else {\r\n var polyline = document.createElementNS(this.svgLink, \"polyline\");\r\n $(polyline).attr(options).appendTo(element);\r\n }\r\n\r\n },\r\n\r\n drawLine: function (options, element) {\r\n if ($(\"#\" + options.id).length > 0) {\r\n $(\"#\" + options.id).attr(options);\r\n }\r\n else {\r\n var path = document.createElementNS(this.svgLink, \"line\");\r\n $(path).attr(options);\r\n $(path).appendTo(element);\r\n }\r\n },\r\n drawPolygon: function (options, element) {\r\n if ($(\"#\" + options.id).length > 0) {\r\n $(\"#\" + options.id).attr(options);\r\n }\r\n else {\r\n var polygon = document.createElementNS(this.svgLink, \"polygon\");\r\n $(polygon).attr(options);\r\n $(polygon).appendTo(element);\r\n }\r\n },\r\n drawCircle: function (options, element) {\r\n if ($(\"#\" + options.id).length > 0) {\r\n $(\"#\" + options.id).attr(options);\r\n }\r\n else {\r\n var circle = document.createElementNS(this.svgLink, \"circle\");\r\n $(circle).attr(options).appendTo(element);\r\n }\r\n },\r\n drawEllipse: function (options, element) {\r\n if ($(\"#\" + options.id).length > 0) {\r\n $(\"#\" + options.id).attr(options);\r\n }\r\n else {\r\n var ellipse = document.createElementNS(this.svgLink, \"ellipse\");\r\n $(ellipse).attr(options).appendTo(element);\r\n }\r\n },\r\n\r\n drawRect: function (options, element) {\r\n if ($(\"#\" + options.id).length > 0) {\r\n $(\"#\" + options.id).attr(options);\r\n }\r\n else {\r\n var rect = document.createElementNS(this.svgLink, \"rect\");\r\n $(rect).attr(options).appendTo(element);\r\n }\r\n },\r\n drawCylinder: function (options, element, seriesOption) {\r\n if ($(\"#\" + options.id).length > 0) {\r\n $(\"#\" + options.id).attr(options);\r\n }\r\n else {\r\n var x = options.x, y = options.y, id = options.id;\r\n var gradientColor = options.fill;\r\n var fillColor = gradientColor;\r\n var format = this.checkColorFormat(gradientColor);\r\n if (!format)\r\n gradientColor = ej.datavisualization.Chart.prototype.colorNameToHex(gradientColor);\r\n var AEx, AEy, LX, LY, X, Y, X2, Y2, i = 2, X1, Y1, GX = 0, GY = 0, direction;\r\n var obj = { svgRenderer: this };\r\n if (seriesOption.isColumn == true) {\r\n var rx = options.width / 2;\r\n var length = options.height;\r\n var ry = rx / 4;\r\n X = X1 = x;\r\n Y = ry < y ? y - ry : seriesOption.stacking ? y + ry : (y - ry);\r\n Y1 = Y;\r\n AEx = 2 * rx;\r\n AEy = 0;\r\n LX = 0;\r\n LY = ry < y ? length : (length < 2 * ry ? length : seriesOption.stacking ? length - (2 * ry) : length);\r\n X2 = X;\r\n Y2 = ry < y ? Y + length : (length < Y ? length + Y : seriesOption.stacking ? length + (y - ry) : length + Y);\r\n GX = 100;\r\n if (seriesOption.stacking = true) {\r\n if (!seriesOption.isLastSeries) {\r\n Y = Y1 = y + ry;\r\n LY = length < rx / 2 ? length : length - rx / 2;\r\n }\r\n }\r\n }\r\n else {\r\n var ry = options.height / 2;\r\n var length = options.width;\r\n var rx = ry / 4;\r\n Y = Y1 = y;\r\n X = X1 = (x + rx);\r\n AEx = 0;\r\n AEy = 2 * ry;\r\n LX = length;\r\n LY = 0;\r\n X2 = X + length;\r\n Y2 = Y;\r\n GY = 100;\r\n if (seriesOption.stacking = true) {\r\n if (!seriesOption.isLastSeries) {\r\n X2 = (X + length - rx * 2);\r\n LX = length - rx * 2;\r\n }\r\n }\r\n }\r\n delete options.x;\r\n delete options.y;\r\n delete options.width;\r\n delete options.height;\r\n delete options.isColumn;\r\n //options.stroke = \"black\";\r\n while (i--) {\r\n direction = \"M\" + X.toString() + \",\" + Y.toString();\r\n direction += \"a\" + rx.toString() + \",\" + ry.toString() + \" 0 1,0 \" + AEx.toString() + \",\" + AEy.toString();\r\n direction += \"a\" + rx.toString() + \",\" + ry.toString() + \" 0 1,0 \" + (-1 * AEx).toString() + \",\" + (-1 * AEy).toString();\r\n options.d = direction;\r\n options.id = id + \"_\" + \"Region_\" + i;\r\n options.fill = ej.Ej3DRender.prototype.polygon3D.prototype.applyZLight(gradientColor, obj);\r\n this.drawPath(options, element);\r\n X = X2;\r\n Y = Y2;\r\n }\r\n direction = \"M\" + X1.toString() + \",\" + Y1.toString();\r\n direction += \"a\" + rx.toString() + \",\" + ry.toString() + \" 0 1,0 \" + AEx.toString() + \",\" + AEy.toString();\r\n direction += \"l\" + LX.toString() + \" \" + LY.toString();\r\n direction += \"a\" + rx.toString() + \",\" + ry.toString() + \" 0 1,1 \" + (-1 * AEx).toString() + \",\" + (-1 * AEy).toString() + \" z\";\r\n\r\n options.d = direction;\r\n options.id = id + \"_\" + \"Region_2\";\r\n if (fillColor.indexOf(\"url\") == -1) {\r\n var gradientId = id;\r\n if ($(\"#\" + gradientId).length == 0) {\r\n\r\n var optiong = { 'id': gradientId, x1: \"0%\", y1: \"0%\", x2: GX.toString() + \"%\", y2: GY.toString() + \"%\" };\r\n var gradientele = [];\r\n gradientele[0] = { colorStop: \"0%\", color: gradientColor };\r\n gradientele[1] = { colorStop: \"30%\", color: ej.Ej3DRender.prototype.polygon3D.prototype.applyXLight(gradientColor, obj) };\r\n gradientele[2] = { colorStop: \"70%\", color: ej.Ej3DRender.prototype.polygon3D.prototype.applyXLight(gradientColor, obj) };\r\n gradientele[3] = { colorStop: \"100%\", color: gradientColor };\r\n this.drawGradient(optiong, gradientele, element);\r\n }\r\n options.fill = \"url(#\" + gradientId + \")\";\r\n }\r\n this.drawPath(options, element);\r\n\r\n }\r\n },\r\n\r\n createGradientElement: function (name, colors, x1, y1, x2, y2, element) {\r\n var colorName;\r\n if (Object.prototype.toString.call(colors) == '[object Array]') {\r\n var options = {\r\n 'id': this.svgObj.id + '_' + name + 'Gradient',\r\n 'x1': x1 + '%',\r\n 'y1': y1 + '%',\r\n 'x2': x2 + '%',\r\n 'y2': y2 + '%'\r\n };\r\n var cName = '#' + this.svgObj.id + '_' + name + 'Gradient';\r\n this.drawGradient(options, colors, element);\r\n colorName = 'url(#' + this.svgObj.id + '_' + name + 'Gradient)';\r\n }\r\n else {\r\n colorName = colors;\r\n }\r\n return colorName;\r\n },\r\n\r\n drawGradient: function (options, gradientEle, element) {\r\n\r\n var defs = this.createDefs();\r\n var linerGradient = document.createElementNS(this.svgLink, \"linearGradient\");\r\n\r\n $(linerGradient).attr(options);\r\n for (var i = 0; i < gradientEle.length; i++) {\r\n var stop = document.createElementNS(this.svgLink, \"stop\");\r\n $(stop).attr({\r\n 'offset': gradientEle[i].colorStop,\r\n 'stop-color': gradientEle[i].color,\r\n 'stop-opacity': 1\r\n });\r\n $(stop).appendTo(linerGradient);\r\n }\r\n\r\n $(linerGradient).appendTo(defs);\r\n $(defs).appendTo(element);\r\n },\r\n\r\n drawText: function (options, label, groupEle, font) {\r\n\r\n if ($(\"#\" + options.id).length > 0)\r\n this._textAttrReplace(options, label, font);\r\n else {\r\n var text = document.createElementNS(this.svgLink, \"text\");\r\n var $text = $(text);\r\n\r\n\r\n if (jQuery.type(label) == \"array\") {\r\n var j = 0;\r\n $text.attr(options);\r\n for (var i = 0; i < label.length; i++) {\r\n var textspan = document.createElementNS(this.svgLink, \"tspan\");\r\n textspan.textContent = label[i];\r\n $(textspan).attr({ \"x\": options.x, \"dy\": j });\r\n $(textspan).appendTo(text);\r\n font = this.enable3D ? font.font : font;\r\n var bounds = ej.EjSvgRender.utils._measureText(label[i], null, font);\r\n j = options.isTrackball ? bounds.height + 2 : bounds.height;\r\n }\r\n } else {\r\n text.textContent = label;\r\n $text.attr(options);\r\n }\r\n $text.appendTo(groupEle);\r\n\r\n\r\n }\r\n },\r\n //text element attributes values are replaced \r\n _textAttrReplace: function (options, label, font) {\r\n $(\"#\" + options.id).attr(options);\r\n\r\n if (jQuery.type(label) == \"array\") {\r\n var elements = $(\"#\" + options.id).children(\"tspan\");\r\n var j = 0;\r\n if (elements.length > 0 && elements.length == label.length) {\r\n for (var i = 0; i < elements.length; i++) {\r\n var element = elements[i];\r\n $(element).attr({ \"x\": options.x, \"dy\": j });\r\n element.textContent = label[i];\r\n var bounds = ej.EjSvgRender.utils._measureText(label[i], null, font);\r\n j = bounds.height + 2;\r\n }\r\n }\r\n else {\r\n $(\"#\" + options.id).remove();\r\n this.drawText(options, label, this.gTransToolEle, font);\r\n\r\n }\r\n } else {\r\n $(\"#\" + options.id).text(label);\r\n }\r\n\r\n },\r\n\r\n drawImage: function (options, element) {\r\n\r\n var img = document.createElementNS(this.svgLink, 'image');\r\n img.setAttributeNS(null, 'height', options.height);\r\n img.setAttributeNS(null, 'width', options.width);\r\n img.setAttributeNS('http://www.w3.org/1999/xlink', 'href', options.href);\r\n img.setAttributeNS(null, 'x', options.x);\r\n img.setAttributeNS(null, 'y', options.y);\r\n img.setAttributeNS(null, 'id', options.id);\r\n img.setAttributeNS(null, 'visibility', options.visibility);\r\n if (!ej.util.isNullOrUndefined(options.clippath) || !ej.util.isNullOrUndefined(options.preserveAspectRatio)) {\r\n img.setAttributeNS(null, 'clip-path', options.clippath);\r\n img.setAttributeNS(null, \"preserveAspectRatio\", options.preserveAspectRatio);\r\n }\r\n $(img).appendTo(element);\r\n\r\n },\r\n\r\n createDefs: function () {\r\n var defs = document.createElementNS(this.svgLink, \"defs\");\r\n return defs;\r\n },\r\n\r\n createClipPath: function (options) {\r\n var clipPath = document.createElementNS(this.svgLink, \"clipPath\");\r\n $(clipPath).attr(options);\r\n return clipPath;\r\n },\r\n createForeignObject: function (options) {\r\n var object = document.createElementNS(this.svgLink, \"foreignObject\");\r\n $(object).attr(options);\r\n return object;\r\n },\r\n createGroup: function (options) {\r\n var group = document.createElementNS(this.svgLink, \"g\");\r\n $(group).attr(options);\r\n return group;\r\n },\r\n createPattern: function (options, element) {\r\n var pattern = document.createElementNS(this.svgLink, element);\r\n for (var name in options) {\r\n if (options.hasOwnProperty(name)) {\r\n pattern.setAttribute(name, options[name]);\r\n }\r\n }\r\n return pattern;\r\n },\r\n createText: function (options, label) {\r\n var text = document.createElementNS(this.svgLink, \"text\");\r\n $(text).attr(options);\r\n if (!ej.util.isNullOrUndefined(label))\r\n text.textContent = label;\r\n return text;\r\n },\r\n\r\n createPath: function (options) {\r\n var path = document.createElementNS(this.svgLink, \"path\");\r\n $(path).attr(options);\r\n return path;\r\n },\r\n\r\n createCircle: function (options) {\r\n var circle = document.createElementNS(this.svgLink, \"circle\");\r\n $(circle).attr(options);\r\n return circle;\r\n },\r\n\r\n createLine: function (options) {\r\n var line = document.createElementNS(this.svgLink, \"line\");\r\n $(line).attr(options);\r\n return line;\r\n },\r\n\r\n\r\n _getAttrVal: function (ele, val, option) {\r\n var value = $(ele).attr(val);\r\n if (value != null)\r\n return value;\r\n else\r\n return option;\r\n },\r\n\r\n\r\n hexFromRGB: function (color) {\r\n var r = color.R;\r\n var g = color.G;\r\n var b = color.B;\r\n if (color.A) {\r\n var returncolor = \"rgba(\" + r.toString() + \",\" + g.toString() + \",\" + b.toString() + \",\" + color.A + \")\";\r\n return returncolor;\r\n }\r\n else {\r\n var hex = [r.toString(16), g.toString(16), b.toString(16)];\r\n $.each(hex, function (nr, val) { if (val.length === 1) { hex[nr] = \"0\" + val; } });\r\n return \"#\" + (hex.join(\"\").toUpperCase());\r\n }\r\n },\r\n\r\n checkColorFormat: function (color) {\r\n return /(rgba?\\((?:\\d{1,3}[,\\)]){3}(?:\\d+\\.\\d+\\))?)|(^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$)/gmi.test(color);\r\n },\r\n\r\n hexToRGB: function (hex) {\r\n var rgbRegex = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)$/.test(hex);\r\n var result;\r\n if (rgbRegex == true) {\r\n result = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)$/.exec(hex);\r\n return result ? {\r\n R: parseInt(result[1]),\r\n G: parseInt(result[2]),\r\n B: parseInt(result[3]),\r\n A: result[4],\r\n } : null;\r\n }\r\n else {\r\n result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n return result ? {\r\n R: parseInt(result[1], 16),\r\n G: parseInt(result[2], 16),\r\n B: parseInt(result[3], 16)\r\n } : null;\r\n }\r\n },\r\n\r\n\r\n createDelegate: function (context, handler) {\r\n return function (e) {\r\n handler.apply(context, [e, this]);\r\n };\r\n },\r\n\r\n drawClipPath: function (options, element) {\r\n //To avoid creating and appending the same element more than once\r\n if ($(element).find('#' + options.id).length > 0) {\r\n $(element).find('#' + options.id).attr(options);\r\n }\r\n else {\r\n var defs = this.createDefs();\r\n var clipPath = this.createClipPath({ 'id': options.id });\r\n this.drawRect(options, clipPath);\r\n this.append(clipPath, defs);\r\n this.append(defs, element);\r\n }\r\n },\r\n\r\n drawCircularClipPath: function (options, element) {\r\n var defs = this.createDefs();\r\n var clipPath = this.createClipPath({ 'id': options.id });\r\n this.drawCircle(options, clipPath);\r\n this.append(clipPath, defs);\r\n this.append(defs, element);\r\n },\r\n\r\n append: function (childEle, parentEle) {\r\n $(childEle).appendTo(parentEle);\r\n },\r\n _setAttr: function (element, attribute) {\r\n $(element).attr(attribute);\r\n }\r\n };\r\n\r\n ej.EjSvgRender.commonChartEventArgs = {\r\n cancel: false,\r\n data: null\r\n };\r\n ej.EjSvgRender.utils = {\r\n\r\n\r\n\r\n _decimalPlaces: function (num) {\r\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\r\n if (!match) { return 0; }\r\n return Math.max(\r\n 0,\r\n // Number of digits right of decimal point.\r\n (match[1] ? match[1].length : 0)\r\n // Adjust for scientific notation.\r\n - (match[2] ? +match[2] : 0));\r\n },\r\n _getLabelContent: function (pos, axis, locale) {\r\n switch (axis._categoryValueType) {\r\n case 'number':\r\n var customFormat = (ej.util.isNullOrUndefined(axis.labelFormat)) ? null : axis.labelFormat.match('{value}');\r\n return (ej.util.isNullOrUndefined(axis.labelFormat)) ? axis.labels[Math.floor(pos)] : (customFormat != null) ? axis.labelFormat.replace('{value}', axis.labels[Math.floor(pos)]) : (ej.format(axis.labels[Math.floor(pos)], axis.labelFormat, locale));\r\n case 'date':\r\n return (ej.format(new Date(axis.labels[Math.floor(pos)]), ((ej.util.isNullOrUndefined(axis.labelFormat)) ? \"dd/MM/yyyy\" : axis.labelFormat), locale));\r\n case 'string':\r\n return axis.labels[Math.floor(pos)];\r\n default:\r\n return \"\";\r\n }\r\n },\r\n\r\n //Calculation for label size in template\r\n _getSeriesTemplateSize: function (point, pointIndex, series, isLeft, sender) {\r\n var point;\r\n var pointIndex;\r\n var areaType = sender.model.AreaType;\r\n\r\n var chartContainer = sender._id;\r\n var seriesIndex = $.inArray(series, sender.model._visibleSeries);\r\n\r\n if ($('#template_group_' + chartContainer).length != 0)\r\n var templateContainer = $('#template_group_' + chartContainer);\r\n else\r\n templateContainer = $(\"
\").attr('id', \"template_group_\" + chartContainer);\r\n\r\n templateContainer.css('position', 'relative').css('z-index', 1000);\r\n var cloneNode = $(\"#\" + series.marker.dataLabel.template).clone();\r\n $(cloneNode).attr(\"id\", series.marker.dataLabel.template + '_' + seriesIndex + '_' + pointIndex + '_' + chartContainer);\r\n var $cloneNode = $(cloneNode);\r\n $cloneNode.css(\"position\", \"absolute\");\r\n\r\n point.count = 1;\r\n var data = { series: series, point: point };\r\n $cloneNode.html($cloneNode.html().parseTemplate(data));\r\n\r\n var display = (areaType == \"cartesianaxes\" || !series.enableAnimation || (series.type.toLowerCase() == \"pyramid\" || series.type.toLowerCase() == \"funnel\")) ? \"block\" : \"none\";\r\n $cloneNode.css(\"display\", display).appendTo($(templateContainer));\r\n $(templateContainer).appendTo('#' + chartContainer);\r\n point.size = { height: $cloneNode.height(), width: $cloneNode.width() };\r\n\r\n if (isLeft) {\r\n if (ej.util.isNullOrUndefined(series.LeftLabelMaxHeight) || series.LeftLabelMaxHeight < point.size.height) {\r\n series.LeftLabelMaxHeight = point.size.height;\r\n }\r\n if (ej.util.isNullOrUndefined(series.LeftLabelMaxWidth) || series.LeftLabelMaxWidth < point.size.width) {\r\n series.LeftLabelMaxWidth = point.size.width;\r\n }\r\n }\r\n else {\r\n if (ej.util.isNullOrUndefined(series.RightLabelMaxHeight) || series.RightLabelMaxHeight < point.size.height) {\r\n series.RightLabelMaxHeight = point.size.height;\r\n }\r\n if (ej.util.isNullOrUndefined(series.RightLabelMaxWidth) || series.RightLabelMaxWidth < point.size.width) {\r\n series.RightLabelMaxWidth = point.size.width;\r\n }\r\n }\r\n\r\n },\r\n getMinPointsDelta: function (axis, chartObj, start) {\r\n var chart = chartObj;\r\n var m_minPointsDelta = Number.MAX_VALUE;\r\n $.each(chart.model._visibleSeries, function (index, series) {\r\n if (series.visibility.toLowerCase() == 'visible' && axis.name == series._xAxisName) {\r\n var xValues = ej.DataManager(series.points, ej.Query().sortBy(\"xValue\")).executeLocal();\r\n if ((xValues.length == 1) && (!chart.currentSeries || chart.currentSeries._yAxisName.toLowerCase() == series._yAxisName.toLowerCase())) {\r\n var minValue = ej.util.isNullOrUndefined(start) ? series.xAxis.visibleRange.min : start;\r\n var delta = xValues[0].xValue - minValue;\r\n if (delta != 0)\r\n m_minPointsDelta = Math.min(m_minPointsDelta, delta);\r\n }\r\n else {\r\n $.each(xValues, function (pointIndex, point) {\r\n if (pointIndex > 0 && point.xValue) {\r\n var deltaValue = point.xValue - xValues[pointIndex - 1].xValue;\r\n if (deltaValue != 0) {\r\n m_minPointsDelta = Math.min(m_minPointsDelta, deltaValue);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n if (m_minPointsDelta == Number.MAX_VALUE) {\r\n m_minPointsDelta = 1;\r\n }\r\n return m_minPointsDelta;\r\n },\r\n //Calculation for label size\r\n _getSeriesMaxLabel: function (series) {\r\n var maxTxtDim = { width: 0, height: 0 };\r\n var width = $(this.svgObject).width();\r\n var labels = [];\r\n if (series.labels.length > 0) {\r\n for (var j = 0; j < series.labels.length; j++) {\r\n var dim = this._measureText(series.visibleLabels[j], width, series.marker.dataLabel.font);\r\n if (maxTxtDim.width < dim.width) {\r\n maxTxtDim.width = dim.width;\r\n }\r\n if (maxTxtDim.height < dim.height) {\r\n maxTxtDim.height = dim.height;\r\n }\r\n }\r\n series.LabelMaxHeight = maxTxtDim.height;\r\n series.LabelMaxWidth = maxTxtDim.width;\r\n }\r\n else {\r\n labels.push(series.rightsidePoints);\r\n labels.push(series.leftsidePoints);\r\n\r\n for (var k = 0; k < labels.length; k++) {\r\n for (var j = 0; j < labels[k].length; j++) {\r\n var text = (labels[k][j].text) ? labels[k][j].text : labels[k][j].y;\r\n var dim = this._measureText(text, width, series.marker.dataLabel.font);\r\n if (maxTxtDim.width < dim.width) {\r\n maxTxtDim.width = dim.width;\r\n }\r\n if (maxTxtDim.height < dim.height) {\r\n maxTxtDim.height = dim.height;\r\n }\r\n }\r\n if (k == 0) {\r\n series.RightLabelMaxHeight = maxTxtDim.height;\r\n series.RightLabelMaxWidth = maxTxtDim.width;\r\n }\r\n else {\r\n series.LeftLabelMaxHeight = maxTxtDim.height;\r\n series.LeftLabelMaxWidth = maxTxtDim.width;\r\n }\r\n }\r\n }\r\n\r\n\r\n },\r\n // to get highest label from label collection or label with
tag\r\n _getHighestLabel: function (axis, sender, text, intersectAction) {\r\n var largestLabel, maxWidth = 0, labelCollection = [], label, width, w = 0;\r\n if (ej.isNullOrUndefined(text)) {\r\n\r\n var labels = axis.labels.length == 0 ? axis.visibleLabels : axis.labels;\r\n for (var l = 0; l < labels.length; l++) {\r\n var currentLabel = axis.labels.length == 0 ? labels[l].Text : labels[l], w = 0;\r\n if (currentLabel.indexOf('
') != -1)\r\n labelCollection = currentLabel.split('
');\r\n else\r\n labelCollection.push(currentLabel);\r\n for (var r = 0; r < labelCollection.length; r++) {\r\n label = labelCollection[r];\r\n width = this._measureText(label, $(sender.svgObject).width(), axis.font).width;\r\n if (w < width) {\r\n w = width;\r\n largestLabel = label;\r\n }\r\n }\r\n if (maxWidth < w) {\r\n maxWidth = w;\r\n labelText = largestLabel;\r\n }\r\n }\r\n }\r\n else if (text && ((typeof text == \"string\" && text.indexOf('
') != -1) || typeof text == \"object\")) {\r\n var w = 0;\r\n labelCollection = typeof text == \"object\" ? text : text.split('
');\r\n for (var r = 0; r < labelCollection.length; r++) {\r\n label = typeof labelCollection[r] == \"object\" ? labelCollection[r].Text : labelCollection[r];\r\n width = this._measureText(label, sender, axis.font).width;\r\n if (w < width) {\r\n w = width;\r\n largestLabel = label;\r\n }\r\n labelText = largestLabel;\r\n }\r\n }\r\n return labelText;\r\n },\r\n _getMaxLabelWidth: function (axis, sender) {\r\n this.chartObj = sender;\r\n var maxTxtDim = { width: 0, height: 0, maxHeight: 0, maxWidth: 0 };\r\n var rotateLabel = '';\r\n var currentRow = 1;\r\n var vmlrendering = sender.svgRenderer.vmlNamespace;\r\n var range = axis.visibleRange;\r\n var intersectAction = (axis.labelIntersectAction) ? axis.labelIntersectAction.toLowerCase() : \"\";\r\n var labelPlacement = axis.labelPlacement;\r\n var opposedPosition = axis.opposedPosition;\r\n var orientation = axis.orientation.toLowerCase();\r\n var isHorizontal = sender.model.requireInvertedAxes ? (orientation == 'vertical') : orientation == 'horizontal';\r\n var roundingPlaces = axis.roundingPlaces;\r\n var labelRotation = axis.labelRotation;\r\n var orientation = axis.orientation;\r\n var maxHeight = 0;\r\n var prevLabels = [];\r\n var visibleLabels = axis.visibleLabels;\r\n var visibleLabelsLength = visibleLabels.length;\r\n if (axis.visible) {\r\n for (var j = 0; j < visibleLabelsLength; j++) {\r\n axis.visibleLabels[j].y = 0;\r\n if (typeof axis.visibleLabels[j].Text == \"string\" && axis.visibleLabels[j].Text.indexOf('
') != -1 && axis.orientation == \"vertical\") {\r\n textCollection = axis.visibleLabels[j].Text.split('
');\r\n label = this._getHighestLabel(axis, $(this.svgObject).width(), textCollection);\r\n var dim = this._measureText(label, $(this.svgObject).width(), axis.font, axis.labelRotation);\r\n }\r\n else\r\n var dim = this._measureText(axis.visibleLabels[j].Text, $(this.svgObject).width(), axis.font, axis.labelRotation);\r\n if (maxTxtDim.width < dim.width) {\r\n maxTxtDim.width = dim.width;\r\n rotateLabel = axis.visibleLabels[j].Text;\r\n }\r\n if (maxTxtDim.height < dim.height)\r\n maxTxtDim.height = dim.height;\r\n }\r\n\r\n if (axis.enableTrim || (intersectAction == \"trim\" && axis.orientation != \"vertical\")) { // for enable trim\r\n var derivedGap = axis.maximumLabelWidth;\r\n maxTxtDim.width = maxTxtDim.width > derivedGap ? derivedGap : maxTxtDim.width;\r\n }\r\n\r\n // initialize rows to 1\r\n maxTxtDim.rows = 1;\r\n maxTxtDim.maxWidth = maxTxtDim.width;\r\n maxTxtDim.maxHeight = maxTxtDim.height;\r\n\r\n if (!vmlrendering && (labelRotation || intersectAction)) {\r\n var intersectRotation = 0;\r\n if (intersectAction == 'rotate45')\r\n intersectRotation = 45;\r\n else if (intersectAction == 'rotate90')\r\n intersectRotation = 90;\r\n labelRotation = labelRotation != null || orientation == \"vertical\" ? labelRotation : intersectRotation;\r\n axis.rotationValue = labelRotation;\r\n if (labelRotation) {\r\n rotateLabel = (!ej.isNullOrUndefined(rotateLabel)) ? rotateLabel : '';\r\n var labeltextWidth = this._measureText(rotateLabel, $(this.svgObject).width(), axis.font, axis.labelRotation);\r\n if ((axis.enableTrim || intersectAction == \"trim\") && labeltextWidth.width > derivedGap && rotateLabel != \"\") { // to find trimmed text\r\n var t, textWidth, text = rotateLabel;\r\n for (t = 1; t < text.toString().length; t++) {\r\n text = text.toString().substring(0, t) + '... ';\r\n textWidth = this._measureText(text, $(sender.svgObject).width(), axis.font);\r\n if (textWidth.width >= derivedGap) {\r\n text = text.toString().substring(0, t - 1) + '... ';\r\n rotateLabel = text;\r\n break;\r\n }\r\n }\r\n }\r\n rotateLabel = (intersectAction || axis.enableTrim) && labelRotation ? typeof rotateLabel == \"string\" && rotateLabel.indexOf('
') != -1 ? this._getHighestLabel(axis, sender, null) : rotateLabel : this._getHighestLabel(axis, sender, null);\r\n var maxSize = this.rotatedLabel(axis, sender, labelRotation, rotateLabel);\r\n if (axis.labelIntersectAction && axis.labelIntersectAction.toLowerCase() == 'multiplerows')\r\n maxHeight = maxTxtDim.height + maxSize.height;\r\n\r\n maxTxtDim.height = axis.rowsCount && axis.rowsCount > 1 && labelRotation != 90 && axis.enableTrim ? (axis.rowsCount) * maxTxtDim.height : maxSize.height;\r\n maxTxtDim.width = maxSize.width;\r\n }\r\n }\r\n\r\n if (axis.labelIntersectAction) {\r\n if (axis.rowsCount && (intersectAction == \"none\" || intersectAction == \"trim\" || intersectAction == \"hide\" || labelRotation == 0) &&\r\n (intersectAction != \"wrap\" || axis.enableTrim) && (intersectAction != \"wrapbyword\" || axis.enableTrim) && (intersectAction != \"multiplerows\" || axis.enableTrim)) {\r\n if (labelRotation == 0) {\r\n maxTxtDim.rows = axis.rowsCount;\r\n maxTxtDim.height = ((axis.rowsCount) * maxTxtDim.height);\r\n }\r\n }\r\n else if (intersectAction == 'wrap' || intersectAction == 'wrapbyword') {\r\n // pointX calculation to find the gap between the ticks\r\n var pointX, tempInterval;\r\n labelPlacement = (!(labelPlacement)) ? ej.datavisualization.Chart.LabelPlacement.BetweenTicks : labelPlacement;\r\n if (labelPlacement.toLowerCase() == \"betweenticks\") {\r\n tempInterval = 1 + (axis.labels.length > 1 ? -0.5 : 0);\r\n tempInterval = (!(roundingPlaces)) ? parseFloat(tempInterval.toFixed((ej.EjSvgRender.utils._decimalPlaces(range.interval) == 0 ?\r\n 1 : ej.EjSvgRender.utils._decimalPlaces(range.interval)))) : parseFloat(tempInterval.toFixed(roundingPlaces));\r\n pointX = Math.ceil(((tempInterval - range.min) / (range.max - range.min)) * (axis.length));\r\n }\r\n else {\r\n pointX = Math.ceil(axis.length / visibleLabels.length);\r\n }\r\n if (axis.orientation == \"horizontal\") {\r\n var rowCount = 0, elementSpacing = 20, highestWidth = 0, highestLabel;\r\n var labels = axis.labels.length > 0 && axis.valueType != \"datetimecategory\" ? axis.labels : axis.visibleLabels;\r\n var gap = axis.width ? axis.width / labels.length : ((axis.length - (sender.svgWidth - axis.length)) - elementSpacing) / labels.length;\r\n axis.labelsCollection = [];\r\n for (var l = 0; l < labels.length; l++) {\r\n var count = 0, labelsCollection = [], labeltxtcoll = [];\r\n var labeltxt = typeof labels[l] === 'object' ? labels[l].Text : labels[l];\r\n if (typeof labeltxt == \"string\" && labeltxt.indexOf('
') != -1)\r\n labeltxtcoll = labeltxt.split('
');\r\n else\r\n labeltxtcoll.push(labeltxt);\r\n for (var c = 0; c < labeltxtcoll.length; c++) {\r\n var textcoll = ej.EjAxisRenderer.prototype.rowscalculation(labeltxtcoll[c], sender.model.m_AreaBounds, axis, gap, null);\r\n count = textcoll.length + count;\r\n for (var t = 0; t < textcoll.length; t++)\r\n labelsCollection.push(textcoll[t]);\r\n }\r\n if (labelRotation) {\r\n rotateLabel = this._getHighestLabel(axis, sender, labelsCollection);\r\n var width = this._measureText(rotateLabel, $(sender.svgObject).width(), axis.font).width;\r\n if (highestWidth < width) {\r\n highestWidth = width;\r\n highestLabel = rotateLabel;\r\n }\r\n }\r\n rowCount = Math.max(count, rowCount);\r\n axis.labelsCollection[l] = labelsCollection;\r\n }\r\n var maxSize = this.rotatedLabel(axis, sender, labelRotation, highestLabel);\r\n }\r\n pointX = pointX < 0 ? Math.ceil(axis.length / visibleLabels.length) : pointX;\r\n var row = Math.round(maxTxtDim.width / pointX);\r\n maxTxtDim.rows = labelRotation ? row - currentRow : row + currentRow;\r\n if (maxTxtDim.rows < 0)\r\n maxTxtDim.rows = 0;\r\n var row1 = rowCount && !labelRotation ? rowCount : maxTxtDim.rows;\r\n if (rowCount > row && !labelRotation)\r\n row1 = row1 - 1;\r\n maxTxtDim.height = labelRotation ? (maxSize.height + (row1) * maxSize.height) : (maxTxtDim.height + (row1) * maxTxtDim.height);\r\n }\r\n else if (intersectAction == 'multiplerows') {\r\n var spaceValue = sender._getLegendSpace();\r\n var chartBorderWidth = sender.model.border.width;\r\n\r\n var verticalaxis = sender.model._axes[1];\r\n var realWidth = $(sender.svgObject).width() - sender.model.margin.left - sender.model.margin.right;\r\n var axisTitleHeight = (axis.title.text == \"\" || !(axis.visible)) ? 0 : (this._measureText(axis.title.text, realWidth, axis.title.font).height + (2 * sender.model.elementSpacing));\r\n var vAxesWidth = sender.model.elementSpacing + axisTitleHeight + axis.majorTickLines.size + axis.axisLine.width;\r\n var yLabels = sender._getYValues(sender.model._visibleSeries[0].points);\r\n var largest = Math.max.apply(Math, yLabels);\r\n var vaxis = sender.model._axes[1];\r\n var dim = this._measureText(largest, $(this.svgObject).width(), vaxis.font, vaxis.labelRotation);\r\n\r\n var rightSpacing = spaceValue.rightLegendWidth + vAxesWidth + dim.width + sender.model.margin.right + sender.model.margin.left + (2 * chartBorderWidth);\r\n var boundsWidth = $(sender.svgObject).width() - (rightSpacing);\r\n if (isHorizontal) {\r\n var addedMaxHeight = 0; var count1 = 0; var multipleRowsColl = []; var count2 = 0;\r\n var row = 0; var highestLabel, highestWidth = 0;\r\n //loop to get current label\r\n\r\n for (j = 0; j < visibleLabels.length; j++) {\r\n //declaration\r\n var currentLabel = visibleLabels[j]; var currentLabelColl = [];\r\n if (typeof currentLabel.Text == \"string\" && currentLabel.Text.indexOf('
') != -1)\r\n currentLabelColl = currentLabel.Text.split('
');\r\n else\r\n currentLabelColl.push(currentLabel);\r\n var collectionLength = currentLabelColl.length;\r\n var isMultiRows = false;\r\n maxHeight = Math.max(maxHeight, addedMaxHeight);\r\n addedMaxHeight = currentLabel.y = maxTxtDim.height;\r\n var text = this._measureText(currentLabel.Text, $(this.svgObject).width(), axis.font);\r\n var textHeight = text.height;\r\n var currentPoint = Math.abs(Math.floor(((currentLabel.Value - range.min) / (range.delta)) * (boundsWidth)));\r\n if (multipleRowsColl.length > 0) {\r\n var previousLabels = multipleRowsColl;\r\n var flag1 = true;\r\n for (var k = 0; k < previousLabels.length && flag1; k++) {\r\n var count = 0; var labelCount = 0;\r\n var prevLabel = previousLabels[k];\r\n for (var l = 0; prevLabel && l < prevLabel.length; l++) {\r\n for (var c = 0; c < collectionLength; c++) {\r\n var temp = 0;\r\n var textWidth = ej.EjSvgRender.utils._measureText(collectionLength == 1 ? currentLabelColl[c].Text : currentLabelColl[c], $(this.svgObject).width(), axis.font).width;\r\n var textHeight = ej.EjSvgRender.utils._measureText(currentLabelColl[c], $(this.svgObject).width(), axis.font).height;\r\n var preLabel = l == prevLabel.length ? prevLabel[l - 1] : prevLabel[l];\r\n var prePoint = Math.abs(Math.floor(((preLabel.Value - range.min) / (range.delta)) * (boundsWidth)));\r\n var preTextWidth = ej.EjSvgRender.utils._measureText(preLabel.Text, $(this.svgObject).width(), axis.font).width;\r\n textWidth = textWidth / 2;\r\n var value = prePoint + ((axis.isInversed) ? -preTextWidth / 2 : preTextWidth / 2);\r\n if (value >= currentPoint - textWidth) {\r\n addedMaxHeight = currentLabel.y + textHeight;\r\n currentLabel.y += textHeight;\r\n count++;\r\n if (k + 1 == previousLabels.length)\r\n flag1 = false;\r\n\r\n }\r\n else {\r\n if (l + 1 == prevLabel.length) {\r\n if (c == collectionLength - 1) flag1 = false;\r\n else {\r\n flag1 = true;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n }\r\n }\r\n }\r\n }\r\n currentLabel.y = addedMaxHeight;\r\n row = (addedMaxHeight / textHeight) - 1;\r\n if (multipleRowsColl[row] == undefined)\r\n multipleRowsColl[row] = [];\r\n if (collectionLength == 1) multipleRowsColl[row].push(currentLabel);\r\n else {\r\n for (var c = 0; c < collectionLength; c++) {\r\n if (multipleRowsColl[row] == undefined)\r\n multipleRowsColl[row] = [];\r\n multipleRowsColl[row].push({\r\n Text: currentLabelColl[c],\r\n Value: currentLabel.Value\r\n });\r\n if (c != collectionLength - 1) {\r\n row = row + 1;\r\n addedMaxHeight = currentLabel.y + textHeight;\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n maxHeight = (multipleRowsColl.length * textHeight);\r\n maxTxtDim.height = maxTxtDim.height > maxHeight ? maxTxtDim.height : maxHeight;\r\n //calculating rows\r\n if (opposedPosition)\r\n maxTxtDim.rows = Math.round((maxHeight + textHeight) / textHeight);\r\n else\r\n maxTxtDim.rows = Math.round(maxHeight / textHeight);\r\n maxTxtDim.rows = labelRotation ? maxTxtDim.rows - 1 : maxTxtDim.rows;\r\n if (maxTxtDim.rows < 1) maxTxtDim.rows = 1;\r\n }\r\n if (!isHorizontal) {\r\n var addedMaxWidth = 0;\r\n //loop to get current label\r\n for (j = 0; j < axis.visibleLabels.length; j++) {\r\n currentLabel = axis.visibleLabels[j];\r\n text = this._measureText(currentLabel.Text, $(this.svgObject).width(), axis.font);\r\n textWidth = text.width;\r\n textHeight = text.height;\r\n currentPoint = Math.abs(Math.floor(((currentLabel.Value - axis.visibleRange.min) / (axis.visibleRange.delta)) * (axis.length)));\r\n for (var i = 0; i < j; i++) {\r\n // loop to get previous labels\r\n prevLabel = axis.visibleLabels[i];\r\n prevPoint = Math.abs(Math.floor(((prevLabel.Value - axis.visibleRange.min) / (axis.visibleRange.delta)) * (axis.length)));\r\n var prevTextHeight = this._measureText(prevLabel.Text, $(this.svgObject).width(), axis.font).height;\r\n value = prevPoint + prevTextHeight / 2;\r\n if (value > currentPoint - textHeight / 2 && axis.visibleLabels[i].y == currentLabel.y) {\r\n addedMaxWidth = currentLabel.y + textWidth;\r\n currentLabel.y = addedMaxWidth;\r\n isMultiRows = true;\r\n }\r\n }\r\n var maxheight = addedMaxWidth;\r\n }\r\n // label width + multiple rows width + gap between the rows added only on text render in multiple rows\r\n maxTxtDim.width = maxTxtDim.width + maxheight + (isMultiRows ? 5 : 0);\r\n }\r\n }\r\n }\r\n }\r\n return maxTxtDim;\r\n },\r\n\r\n rotatedLabel: function (axis, sender, value, rotatedLabel, is3D) {\r\n // to get height of rotated labels\r\n var rotatedOptions = {\r\n 'font-size': axis.font.size,\r\n 'transform': 'rotate(' + value + ',0,0)',\r\n 'font-family': axis.font.fontFamily,\r\n 'font-style': axis.font.fontStyle,\r\n 'rotateAngle': 'rotate(' + value + 'deg)',\r\n 'text-anchor': 'middle'\r\n };\r\n sender = is3D ? this.chartObj : sender;\r\n var text = sender.svgRenderer.createText(rotatedOptions, rotatedLabel);\r\n var height = Math.ceil((this._measureBounds(text, sender).height));\r\n var width = Math.ceil((this._measureBounds(text, sender).width));\r\n return { height: height, width: width };\r\n },\r\n\r\n _getTransform: function (xAxis, yAxis, invertedAxis) {\r\n var x, y, width, height;\r\n if (invertedAxis) {\r\n x = yAxis.x;\r\n y = xAxis.y;\r\n width = yAxis.width;\r\n height = xAxis.height;\r\n } else {\r\n {\r\n x = xAxis.x;\r\n y = yAxis.y;\r\n width = xAxis.width;\r\n height = yAxis.height;\r\n }\r\n }\r\n return { x: x, y: y, width: width, height: height };\r\n },\r\n //calculate path for roundedCorner of the series column,bar,stacking column,stacking bar,range column\r\n _calculateroundedCorner: function (cornerRadius, options, isArrow, orientation, tipPosition, tracker) {\r\n var x1 = options.x, y1 = options.y, padding = 5, canvasPadding = (this.chartObj.model.enableCanvasRendering && !tracker) ? padding / 4 : 0,\r\n width = options.width, height = options.height, topLeft,\r\n bottomLeft, topRight, bottomRight, d;\r\n\r\n if (typeof (cornerRadius) != \"object\" || ej.util.isNullOrUndefined(cornerRadius))\r\n topLeft = bottomLeft = topRight = bottomRight = cornerRadius;\r\n else {\r\n topLeft = cornerRadius.topLeft;\r\n bottomLeft = cornerRadius.bottomLeft;\r\n topRight = cornerRadius.topRight;\r\n bottomRight = cornerRadius.bottomRight;\r\n }\r\n topLeft = ej.util.isNullOrUndefined(options.rx) ? topLeft : options.rx;\r\n bottomLeft = ej.util.isNullOrUndefined(options.rx) ? bottomLeft : options.rx;\r\n topRight = ej.util.isNullOrUndefined(options.ry) ? topRight : options.ry;\r\n bottomRight = ej.util.isNullOrUndefined(options.ry) ? bottomRight : options.ry;\r\n\r\n d = \"M\" + \" \" + x1 + \" \" + (topLeft + y1) + \" Q \" + x1 + \" \" + y1 + \" \" + (x1 + topLeft) + \" \" + y1 + \" \";\r\n if (isArrow && orientation == \"top\")\r\n d += \"L \" + (x1 + width / 2 - padding / 2 + canvasPadding) + \" \" + (y1) + \" L \" + (x1 + width / 2 + canvasPadding - tipPosition) + \" \" + (y1 - padding) + \" L \" + (x1 + width / 2 + padding / 2 + canvasPadding) + \" \" + (y1) + \" \";\r\n d += \"L\" + \" \" + (x1 + width - topRight) + \" \" + y1 + \" Q \" + (x1 + width) + \" \" + y1 + \" \" + (x1 + width) + \" \" + (y1 + topRight) + \" \";\r\n if (isArrow && orientation == \"right\")\r\n d += \"L \" + (x1 + width) + \" \" + (y1 + height / 2 - padding / 2 + canvasPadding) + \" L \" + (x1 + width + padding) + \" \" + (y1 + height / 2 + canvasPadding - tipPosition) + \" L \" + (x1 + width) + \" \" + (y1 + height / 2 + padding / 2 + canvasPadding) + \" \";\r\n d += \"L \" + (x1 + width) + \" \" + (y1 + height - bottomRight) + \" Q \" + (x1 + width) + \" \" + (y1 + height) + \" \" + (x1 + width - bottomRight) + \" \" + (y1 + height) + \" \";\r\n if (isArrow && orientation == \"bottom\")\r\n d += \"L \" + (x1 + width / 2 - padding / 2 + canvasPadding) + \" \" + (y1 + height) + \" L \" + (x1 + width / 2 + canvasPadding - tipPosition) + \" \" + (y1 + height + padding) + \" L \" + (x1 + width / 2 + padding / 2 + canvasPadding) + \" \" + (y1 + height) + \" \";\r\n d += \"L \" + (x1 + bottomLeft) + \" \" + (y1 + height) + \" Q \" + x1 + \" \" + (y1 + height) + \" \" + x1 + \" \" + (y1 + height - bottomLeft) + \" \";\r\n if (isArrow && orientation == \"left\")\r\n d += \"L \" + (x1) + \" \" + (y1 + height / 2 - padding / 2 + canvasPadding) + \" L \" + (x1 - padding) + \" \" + (y1 + height / 2 + canvasPadding - tipPosition) + \" L \" + (x1) + \" \" + (y1 + height / 2 + padding / 2 + canvasPadding) + \" \";\r\n d += \"L\" + \" \" + x1 + \" \" + (topLeft + y1) + \" \" + \"z\";\r\n return d;\r\n\r\n },\r\n browserInfo: function () {\r\n var browser = {}, clientInfo = [],\r\n browserClients = {\r\n webkit: /(chrome)[ \\/]([\\w.]+)/i, safari: /(webkit)[ \\/]([\\w.]+)/i, msie: /(msie) ([\\w.]+)/i,\r\n opera: /(opera)(?:.*version|)[ \\/]([\\w.]+)/i, mozilla: /(mozilla)(?:.*? rv:([\\w.]+)|)/i\r\n };\r\n for (var client in browserClients) {\r\n if (browserClients.hasOwnProperty(client)) {\r\n clientInfo = navigator.userAgent.match(browserClients[client]);\r\n if (clientInfo) {\r\n browser.name = clientInfo[1].toLowerCase();\r\n browser.version = clientInfo[2];\r\n if (!!navigator.userAgent.match(/Trident\\/7\\./)) {\r\n browser.name = \"msie\";\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n browser.isMSPointerEnabled = (browser.name == 'msie') && browser.version > 9 && window.navigator.msPointerEnabled;\r\n browser.pointerEnabled = window.navigator.pointerEnabled;\r\n return browser;\r\n },\r\n _measureText: function (text, maxwidth, font) {\r\n var element = $(document).find(\"#measureTex\");\r\n $(\"#measureTex\").css('display', 'block'); // fixed for scroll issue in sample browser\r\n if (element.length == 0) {\r\n var textObj = document.createElement('text');\r\n $(textObj).attr({ 'id': 'measureTex' });\r\n document.body.appendChild(textObj);\r\n }\r\n else {\r\n var textObj = element[0];\r\n }\r\n\r\n var style = null, size = null, family = null, weight = null;\r\n if (typeof (text) == \"string\" && (text.indexOf(\"<\") > -1 || text.indexOf(\">\") > -1)) {\r\n var textArray = text.split(\" \");\r\n for (var i = 0; i < textArray.length; i++) {\r\n if (textArray[i].indexOf(\"
\") == -1)\r\n textArray[i] = textArray[i].replace(/[<>]/g, '&');\r\n }\r\n text = textArray.join(' ');\r\n }\r\n textObj.innerHTML = text;\r\n if (font != undefined && font.size == undefined) {\r\n var fontarray = font;\r\n fontarray = fontarray.split(\" \");\r\n style = fontarray[0];\r\n size = fontarray[1];\r\n family = fontarray[2];\r\n weight = fontarray[3];\r\n }\r\n\r\n if (font != null) {\r\n textObj.style.fontSize = (font.size > 0) ? (font.size + \"px\") : font.size ? font.size : size;\r\n if (textObj.style.fontStyle)\r\n textObj.style.fontStyle = (font.fontStyle) ? font.fontStyle : style;\r\n textObj.style.fontFamily = font.fontFamily ? font.fontFamily : family;\r\n if (window.navigator.userAgent.indexOf('MSIE 8.0') == -1)\r\n textObj.style.fontWeight = font.fontWeight ? font.fontWeight : weight;\r\n }\r\n textObj.style.backgroundColor = 'white';\r\n textObj.style.position = 'absolute';\r\n textObj.style.top = -100;\r\n textObj.style.left = 0;\r\n textObj.style.visibility = 'hidden';\r\n textObj.style.whiteSpace = 'nowrap';\r\n if (maxwidth)\r\n textObj.style.maxwidth = maxwidth + \"px\";\r\n\r\n\r\n var bounds = { width: textObj.offsetWidth, height: textObj.offsetHeight };\r\n $(\"#measureTex\").css('display', 'none'); // fixed for scroll issue in sample browser\r\n return bounds;\r\n },\r\n //to trim legend text\r\n _trimText: function (legendtext, maxwidth, font) {\r\n var textWidth, text, textLength;\r\n text = legendtext.toString();\r\n textLength = text.length;\r\n for (var t = 1; t < textLength; t++) {\r\n text = legendtext.substring(0, t) + '...';\r\n textWidth = ej.EjSvgRender.utils._measureText(text, null, font).width;\r\n if (textWidth >= maxwidth) {\r\n text = text.substring(0, t - 1) + '... ';\r\n return text;\r\n }\r\n }\r\n return legendtext;\r\n },\r\n _measureBounds: function (element, sender) {\r\n if (sender.model.enableCanvasRendering)\r\n $(document.body).append(element);\r\n else {\r\n sender.svgRenderer.append(element, sender.svgObject);\r\n sender.svgRenderer.append(sender.svgObject, sender.element);\r\n }\r\n var box = element.getBoundingClientRect();\r\n var bounds = { left: box.left, right: box.right, top: box.top, bottom: box.bottom, width: (box.right - box.left), height: (box.bottom - box.top) };\r\n $(element).remove();\r\n return bounds;\r\n },\r\n //Draw clip path for each series to avoid series overlap in multiple axes zooming\r\n _drawAxesBoundsClipPath: function (gSeriesGroupEle, options, sender) {\r\n var clipOptions;\r\n var element = $(gSeriesGroupEle);\r\n var trans = this._getTransform(options.xAxis, options.yAxis, sender.model.requireInvertedAxes);\r\n var width = (sender.model.AreaType == \"polaraxes\") ? $(sender.svgObject).width() : trans.width;\r\n var height = (sender.model.AreaType == \"polaraxes\") ? $(sender.svgObject).height() : trans.height;\r\n\r\n var hPlotOffset = sender.model.requireInvertedAxes ? options.yAxis.plotOffset : options.xAxis.plotOffset;\r\n var vPlotOffset = sender.model.requireInvertedAxes ? options.xAxis.plotOffset : options.yAxis.plotOffset;\r\n if (sender.model.AreaType == 'polaraxes') {\r\n clipOptions = {\r\n 'id': gSeriesGroupEle ? gSeriesGroupEle.id + '_ClipRect' : '',\r\n 'cx': sender.model.centerX,\r\n 'cy': sender.model.centerY,\r\n 'r': sender.model.Radius,\r\n 'fill': 'white',\r\n 'stroke-width': 1,\r\n 'stroke': 'transparent'\r\n };\r\n sender.svgRenderer.drawCircularClipPath(clipOptions, gSeriesGroupEle);\r\n }\r\n else {\r\n clipOptions = {\r\n 'id': gSeriesGroupEle ? gSeriesGroupEle.id + '_ClipRect' : '',\r\n 'x': (0 - hPlotOffset),\r\n 'y': (0 - vPlotOffset),\r\n 'width': (width + 2 * hPlotOffset),\r\n 'height': (height + 2 * vPlotOffset),\r\n 'fill': 'white',\r\n 'stroke-width': 1,\r\n 'stroke': 'transparent'\r\n };\r\n sender.svgRenderer.drawClipPath(clipOptions, gSeriesGroupEle);\r\n }\r\n\r\n element.attr('clip-path', 'url(#' + clipOptions.id + ')');\r\n\r\n },\r\n _getStringBuilder: function () {\r\n\r\n var data = [];\r\n var counter = 0;\r\n\r\n return {\r\n // adds string s to the stringbuilder\r\n\r\n append: function (s) {\r\n data[counter++] = s;\r\n return this;\r\n },\r\n\r\n // removes j elements starting at i, or 1 if j is omitted\r\n\r\n remove: function (i, j) {\r\n data.splice(i, j || 1);\r\n return this;\r\n },\r\n\r\n // inserts string s at i\r\n\r\n insert: function (i, s) {\r\n data.splice(i, 0, s);\r\n return this;\r\n },\r\n\r\n // builds the string\r\n\r\n toString: function (s) { return data.join(s || \"\"); }\r\n };\r\n\r\n\r\n },\r\n _addRegion: function (chart, bounds, series, point, pointIndex) {\r\n var type = series.type;\r\n var seriesIndex = $.inArray(series, chart.model._visibleSeries);\r\n if (seriesIndex >= 0) {\r\n var regionItem = { SeriesIndex: seriesIndex, Region: { PointIndex: pointIndex, Bounds: bounds }, type: type };\r\n chart.model.chartRegions.push(regionItem);\r\n }\r\n },\r\n\r\n AddRegion: function (chart, bounds, isStripLine) {\r\n\r\n if (isStripLine) {\r\n var regionItem = { isStripLine: isStripLine, Region: { Bounds: bounds } };\r\n chart.model.chartRegions.push(regionItem);\r\n }\r\n },\r\n\r\n\r\n _getSvgXY: function (x, y, series, sender) {\r\n var svgX, svgY;\r\n if (!(sender.model.requireInvertedAxes)) {\r\n svgX = x + series.xAxis.x;\r\n svgY = y + series.yAxis.y;\r\n } else {\r\n svgX = x + series.yAxis.x;\r\n svgY = y + series.xAxis.y;\r\n }\r\n return { X: svgX, Y: svgY };\r\n },\r\n _getPoint: function (point, series) {\r\n var x = point.xValue, low, xvalue, yvalue,\r\n y = series.type == \"boxandwhisker\" ? point.YValues : point.YValues[0],\r\n xLength = series._isTransposed ? series.xAxis.height : series.xAxis.width,\r\n yLength = series._isTransposed ? series.yAxis.width : series.yAxis.height;\r\n\r\n point.location = {};\r\n\r\n if (series._hiloTypes) {\r\n low = point.YValues[1];\r\n low = (series.yAxis._valueType == \"logarithmic\") ? ej.EjSvgRender.utils._logBase((low == 0 ? 1 : low), series.xAxis.logBase) : low;\r\n low = this._getPointXY(low, series.yAxis.visibleRange, series.yAxis.isInversed);\r\n point.location.low = (series._isTransposed ? low : (1 - low)) * (yLength);\r\n }\r\n\r\n xvalue = (series.xAxis._valueType == \"logarithmic\") ? ej.EjSvgRender.utils._logBase((x == 0 ? 1 : x), series.xAxis.logBase) : x;\r\n yvalue = (series.yAxis._valueType == \"logarithmic\") ? ej.EjSvgRender.utils._logBase((y == 0 ? 1 : y), series.xAxis.logBase) : y;\r\n\r\n xvalue = (this._getPointXY(xvalue, series.xAxis.visibleRange, series.xAxis.isInversed));\r\n yvalue = this._getPointXY(yvalue, series.yAxis.visibleRange, series.yAxis.isInversed);\r\n point.location.X = series._isTransposed ? yvalue * (yLength) : xvalue * (xLength);\r\n point.location.Y = series._isTransposed ? (1 - xvalue) * (xLength) : (1 - yvalue) * (yLength);\r\n\r\n return point.location;\r\n },\r\n _getPointXY: function (value, Range, isInversed) {\r\n\r\n var result = 0;\r\n result = (value - Range.min) / (Range.delta);\r\n result = isNaN(result) ? 0 : result;\r\n return (isInversed) ? (1 - result) : result;\r\n\r\n },\r\n\r\n _dateTimeLabelFormat: function (intervalType, axis) {\r\n switch (intervalType.toLowerCase()) {\r\n case \"years\":\r\n return axis._labelFormat = \"MMM, yyyy\";\r\n case \"months\":\r\n return axis._labelFormat = \"dd, MMM\";\r\n case \"days\":\r\n return axis._labelFormat = \"dd/MM/yyyy\";\r\n case \"hours\":\r\n return axis._labelFormat = \"dd, hh:mm\";\r\n case \"minutes\":\r\n return axis._labelFormat = \"hh:mm\";\r\n case \"seconds\":\r\n return axis._labelFormat = \"mm:ss\";\r\n case \"milliseconds\":\r\n return axis._labelFormat = \"ss:fff\";\r\n default:\r\n return axis._labelFormat = \"dd/MM/yyyy\";\r\n }\r\n },\r\n _getFontString: function (fontObj) {\r\n if (fontObj == null)\r\n fontObj = {};\r\n if (!fontObj.FontFamily)\r\n fontObj.FontFamily = \"Arial\";\r\n if (!fontObj.FontStyle)\r\n fontObj.FontStyle = \"Normal\";\r\n if (!fontObj.Size)\r\n fontObj.Size = \"12px\";\r\n\r\n return fontObj.FontStyle + \" \" + fontObj.Size + \" \" + fontObj.FontFamily;\r\n },\r\n\r\n _valueToVector: function (axis, value) {\r\n return this._coefficientToVector(this._valueToPolarCoefficient(axis, value));\r\n },\r\n\r\n TransformToVisible: function (currentseries, x, y, sender) {\r\n x = (currentseries.xAxis._valueType == \"logarithmic\") && x > 0 ? Math.log(x, currentseries.xAxis.logBase) : x;\r\n y = (currentseries.xAxis._valueType == \"logarithmic\") && y > 0 ? Math.log(y, currentseries.yAxis.logBase) : y;\r\n var radius = sender.model.Radius * this._valueToCoefficient(currentseries.yAxis, y);\r\n //var radius = this.chartObj.model.Radius * ej.EjSvgRender.utils._valueToPolarCoefficient(currentseries.yAxis, y);\r\n var point = this._valueToVector(currentseries.xAxis, x);\r\n return { X: sender.model.centerX + radius * point.X, Y: sender.model.centerY + radius * point.Y };\r\n },\r\n\r\n Transform3DToVisible: function (currentseries, x, y, sender) {\r\n if (currentseries.xAxis != null && currentseries.yAxis != null) {\r\n var valueType = currentseries.xAxis._valueType.toLowerCase();\r\n var xIsLogarithmic = (valueType == \"logarithmic\") ? true : false;\r\n x = x = xIsLogarithmic && x > 0 ? math.log(x, xlogarithmicBase) : x;\r\n y = y;\r\n\r\n if (sender.model.requireInvertedAxes) {\r\n var left = sender.model.m_AreaBounds.X;\r\n var top = sender.model.m_AreaBounds.Y;\r\n var pointX = left + currentseries.yAxis.width * ej.EjSvgRender.utils._valueToCoefficient(currentseries.yAxis, y, sender);\r\n var pointY = top + currentseries.xAxis.height * (1 - ej.EjSvgRender.utils._valueToCoefficient(currentseries.xAxis, x, sender))\r\n return { X: pointX, Y: pointY }\r\n }\r\n else {\r\n var left = currentseries.xAxis.x;\r\n var top = currentseries.yAxis.y;\r\n var x = left + Math.round(currentseries.xAxis.width * ej.EjSvgRender.utils._valueToCoefficient(currentseries.xAxis, x, sender));\r\n var y = top + Math.round(currentseries.yAxis.height * (1 - ej.EjSvgRender.utils._valueToCoefficient(currentseries.yAxis, y, sender)));\r\n return { X: x, Y: y }\r\n }\r\n }\r\n\r\n return new Point(0, 0);\r\n },\r\n\r\n _valueToPolarCoefficient: function (axis, value) {\r\n var start = axis.visibleRange.min;\r\n var delta;\r\n var length, result;\r\n if (axis._valueType != \"category\") {\r\n delta = (axis.visibleRange.max - axis.visibleRange.interval) - axis.visibleRange.min;\r\n length = axis.visibleLabels.length - 1;\r\n }\r\n else {\r\n delta = axis.visibleRange.delta;\r\n length = axis.visibleLabels.length;\r\n }\r\n\r\n result = (value - start) / delta;\r\n result *= 1 - 1 / (length);\r\n result = isNaN(result) ? 0 : result;\r\n\r\n return axis.isInversed ? result : 1 - result;\r\n },\r\n\r\n _coefficientToVector: function (coefficient) {\r\n var angle = Math.PI * (1.5 - 2 * coefficient);\r\n\r\n return { X: Math.cos(angle), Y: Math.sin(angle) };\r\n },\r\n\r\n\r\n _valueToCoefficient: function (axis, value, sender) {\r\n if (sender && sender.model.AreaType == 'polaraxes') {\r\n var yvalue = value;\r\n }\r\n else\r\n var yvalue = (axis._valueType && axis._valueType.toLowerCase() == \"logarithmic\") ?\r\n ej.EjSvgRender.utils._logBase((value == 0 ? 1 : value), axis.logBase) : value;\r\n\r\n yvalue = (yvalue - axis.visibleRange.min) / (axis.visibleRange.delta);\r\n\r\n return (axis.isInversed) ? 1 - yvalue : yvalue;\r\n },\r\n _getBoundingClientRect: function (element, sender, series, invertedAxes) {\r\n var box = element.getBoundingClientRect();\r\n var position = $(\"#\" + (sender.svgObject.id))[0].getBoundingClientRect();\r\n var xSeries, ySeries;\r\n if (invertedAxes) {\r\n xSeries = this._getTransform(series.xAxis, series.yAxis, true).x;\r\n ySeries = this._getTransform(series.xAxis, series.yAxis, true).y;\r\n } else {\r\n xSeries = this._getTransform(series.xAxis, series.yAxis, false).x;\r\n ySeries = this._getTransform(series.xAxis, series.yAxis, false).y;\r\n }\r\n var x = box.left - (xSeries + position.left);\r\n var y = box.top - (ySeries + position.top);\r\n return { x: x, y: y, width: (box.right - box.left), height: (box.bottom - box.top) };\r\n },\r\n _minMax: function (value, min, max) {\r\n return value > max ? max : (value < min ? min : value);\r\n },\r\n _inside: function (value, range) {\r\n if (value === \"\")\r\n return false;\r\n return (value <= range.max) && (value >= range.min);\r\n },\r\n _logBase: function (val, base) {\r\n return Math.log(val) / Math.log(base);\r\n },\r\n _correctRect: function (x1, y1, x2, y2) {\r\n return { X: Math.min(x1, x2), Y: Math.min(y1, y2), Width: Math.abs(x2 - x1), Height: Math.abs(y2 - y1) };\r\n },\r\n _getValuebyPoint: function (x, y, series, requireInvertedAxes) {\r\n\r\n var xSize = (requireInvertedAxes) ? series.xAxis.height : series.xAxis.width;\r\n var ySize = (requireInvertedAxes) ? series.yAxis.width : series.yAxis.height;\r\n\r\n var xValue = (series.xAxis.isInversed) ? (1 - (x / xSize)) : (x / xSize);\r\n var yValue = (series.yAxis.isInversed) ? (1 - (y / ySize)) : (y / ySize);\r\n\r\n xValue = xValue * (series.xAxis.visibleRange.delta) + series.xAxis.visibleRange.min;\r\n\r\n yValue = yValue * (series.yAxis.visibleRange.delta) + series.yAxis.visibleRange.min;\r\n\r\n xValue = (series.xAxis._valueType == \"logarithmic\") ? Math.pow(series.xAxis.logBase, xValue) : xValue;\r\n\r\n yValue = (series.yAxis._valueType == \"logarithmic\") ? Math.pow(series.yAxis.logBase, yValue) : yValue;\r\n\r\n return { PointX: xValue, PointY: yValue };\r\n\r\n }\r\n\r\n };\r\n ej.EjSvgRender.chartTransform3D = {\r\n ToRadial: Math.PI / 180,\r\n\r\n transform3D: function (size) {\r\n if (!this.vector) {\r\n this.vector = new (new ej.Ej3DRender()).vector3D();\r\n this.matrixobj = new (new ej.Ej3DRender()).matrix3D();\r\n this.bsptreeobj = new (new ej.Ej3DRender()).BSPTreeBuilder();\r\n this.polygon = new (new ej.Ej3DRender()).polygon3D();\r\n }\r\n return {\r\n mViewport: size,\r\n Rotation: 0,\r\n Tilt: 0,\r\n Depth: 0,\r\n PerspectiveAngle: 0,\r\n needUpdate: true,\r\n centeredMatrix: this.matrixobj.getIdentity(),\r\n Perspective: this.matrixobj.getIdentity(),\r\n resultMatrix: this.matrixobj.getIdentity(),\r\n viewMatrix: this.matrixobj.getIdentity(),\r\n Depth: 0\r\n };\r\n },\r\n\r\n transform: function (trans) {\r\n this.setCenter(this.vector.vector3D(trans.mViewport.Width / 2, trans.mViewport.Height / 2, trans.Depth / 2), trans);\r\n this.setViewMatrix(this.matrixobj.transform(0, 0, trans.Depth), trans)\r\n this.setViewMatrix(this.matrixobj.getMatrixMultiplication(trans.viewMatrix, this.matrixobj.turn(-this.ToRadial * trans.Rotation)), trans);\r\n this.setViewMatrix(this.matrixobj.getMatrixMultiplication(trans.viewMatrix, this.matrixobj.tilt(-this.ToRadial * trans.Tilt)), trans);\r\n this.updatePerspective(trans.PerspectiveAngle, trans);\r\n trans.needUpdate = true;\r\n\r\n },\r\n\r\n updatePerspective: function (angle, trans) {\r\n var width = (((trans.mViewport.Width + trans.mViewport.Height) * Math.tan(this.degreeToRadianConverter((180 - Math.abs(angle % 181)) / 2.0))) + (trans.Depth * 2) / 2);\r\n trans.Perspective[0][0] = width;\r\n trans.Perspective[1][1] = width;\r\n trans.Perspective[2][3] = 1;\r\n trans.Perspective[3][3] = width;\r\n\r\n },\r\n\r\n degreeToRadianConverter: function (degree) {\r\n return degree * Math.PI / 180;\r\n },\r\n toScreen: function (vector3D, trans, result, chartObj) {\r\n var result = result ? result : this.result;\r\n if (!chartObj) {\r\n trans.chartObj = this.matrixobj;\r\n vector3D = this.matrixobj.getMatrixVectorMutiple(result(trans), vector3D);\r\n }\r\n else {\r\n this.matrixobj = chartObj;\r\n vector3D = chartObj.getMatrixVectorMutiple(result(trans, chartObj), vector3D);\r\n }\r\n return { x: vector3D.x, y: vector3D.y };\r\n },\r\n\r\n setViewMatrix: function (value, trans) {\r\n if (trans.viewMatrix == value) return;\r\n trans.viewMatrix = value;\r\n trans.needUpdate = true;\r\n\r\n },\r\n\r\n setCenteredMatrix: function (value, trans) {\r\n if (trans.viewMatrix == value) return;\r\n trans.centeredMatrix = value;\r\n trans.needUpdate = true;\r\n\r\n },\r\n\r\n result: function (trans, matrixobj) {\r\n var chartObj = trans.chartObj ? trans.chartObj : this.matrixobj;\r\n if (!chartObj) chartObj = matrixobj;\r\n if (!trans.needUpdate) return trans.resultMatrix;\r\n trans.resultMatrix = chartObj.getMatrixMultiplication(this.matrixobj.getInvertal(trans.centeredMatrix),\r\n trans.Perspective);\r\n trans.resultMatrix = chartObj.getMatrixMultiplication(trans.resultMatrix, trans.viewMatrix);\r\n trans.resultMatrix = chartObj.getMatrixMultiplication(trans.resultMatrix, trans.centeredMatrix);\r\n trans.needUpdate = false;\r\n\r\n return trans.resultMatrix;\r\n },\r\n\r\n\r\n setCenter: function (center, trans) {\r\n trans.centeredMatrix = this.matrixobj.transform(-center.x, -center.y, -center.z);\r\n trans.needUpdate = true;\r\n },\r\n toPlane: function (point, plane, trans) {\r\n var vec1 = this.vector.vector3D(point.x, point.y, 0);\r\n var vec2 = this.vector.vector3DPlus(vec1, vector.vector3D(0, 0, 1));\r\n\r\n vec1 = this.vector.vector3DMultiply(trans.centeredMatrix, vec1);\r\n vec2 = this.vector.vector3DMultiply(trans.centeredMatrix, vec2);\r\n\r\n vec1 = this.vector.vector3DMultiply(this.matrixobj.getInvertal(trans.Perspective), vec1);\r\n vec2 = this.vector.vector3DMultiply(this.matrixobj.getInvertal(trans.Perspective), vec2);\r\n\r\n vec1 = this.polygon.getPoint(vec1, this.vector.vector3DMinus(vec2 - vec1));\r\n\r\n vec1 = this.vector.vector3DMultiply(this.matrixobj.getInvertal(trans.viewMatrix), vec1);\r\n vec1 = this.vector.vector3DMultiply(this.matrixobj.getInvertal(trans.centeredMatrix), vec1);\r\n\r\n return vec1;\r\n }\r\n\r\n };\r\n ej.EjSvgRender.chartSymbol =\r\n {\r\n _drawSeriesType: function (location, symbolStyle, sender) {\r\n var seriesType = sender.model.series[symbolStyle.SeriesIndex].type.toLowerCase();\r\n var trendlinetype = sender.legendItem.drawType;\r\n seriesType = ej.util.isNullOrUndefined(trendlinetype) ? seriesType : trendlinetype;\r\n switch (seriesType) {\r\n case ej.datavisualization.Chart.Type.Line: {\r\n var line;\r\n if (ej.util.isNullOrUndefined(trendlinetype))\r\n line = this._drawLine(location, symbolStyle, sender, sender.gLegendItemEle);\r\n else\r\n line = this._drawStraightLine(location, symbolStyle, sender, sender.gLegendItemEle);\r\n return line;\r\n }\r\n\r\n case ej.datavisualization.Chart.Type.StepLine:\r\n return this._drawStepLine(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.StackingArea:\r\n case ej.datavisualization.Chart.Type.StackingArea100:\r\n case ej.datavisualization.Chart.Type.Area:\r\n case ej.datavisualization.Chart.Type.RangeArea:\r\n return this._drawArea(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.StepArea:\r\n return this._drawStepArea(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.Bar:\r\n case ej.datavisualization.Chart.Type.StackingBar100:\r\n case ej.datavisualization.Chart.Type.StackingBar:\r\n return this._drawBar(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.Pie:\r\n return this._drawPie(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.Doughnut:\r\n return this._drawDoughnut(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.Hilo:\r\n return this._drawHilo(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.HiloOpenClose:\r\n return this._drawHiloOpenClose(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.Candle:\r\n return this._drawCandle(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.Pyramid:\r\n return this._drawPyramid(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.Funnel:\r\n return this._drawFunnel(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.Spline:\r\n return this._drawSpline(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.SplineArea:\r\n case ej.datavisualization.Chart.Type.StackingSplineArea:\r\n case ej.datavisualization.Chart.Type.StackingSplineArea100:\r\n return this._drawSplineArea(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.RangeColumn:\r\n return this._drawRangeColumn(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.Bubble:\r\n case ej.datavisualization.Chart.Type.Scatter:\r\n return this._drawCircle(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n case ej.datavisualization.Chart.Type.Column:\r\n case ej.datavisualization.Chart.Type.StackingColumn:\r\n case ej.datavisualization.Chart.Type.StackingColumn100:\r\n case ej.datavisualization.Chart.Type.Waterfall:\r\n return this._drawColumn(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n default:\r\n return this._drawRectangle(location, symbolStyle, sender, sender.gLegendItemEle);\r\n\r\n }\r\n\r\n },\r\n\r\n _drawCircle: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer, svgObj = sender.svgObject, style = symbolStyle.ShapeSize,\r\n radius = Math.sqrt(style.height * style.height + style.width * style.width) / 2,\r\n symbolstyleStyle = symbolStyle.Style;\r\n\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'cx': location.startX,\r\n 'cy': location.startY,\r\n 'r': radius,\r\n 'fill': symbolstyleStyle.Color,\r\n 'stroke-width': symbolstyleStyle.BorderWidth,\r\n 'stroke': symbolstyleStyle.BorderColor,\r\n 'opacity': symbolstyleStyle.Opacity,\r\n 'visibility': symbolstyleStyle.Visibility,\r\n 'lgndCtx': symbolStyle.context\r\n };\r\n\r\n svgRender.drawCircle(options, element);\r\n\r\n return (location.startX - radius);\r\n },\r\n\r\n _drawLeftArrow: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var path;\r\n path = \"M\" + \" \" + ((location.startX - (style.width / 2)) + style.width) + \" \" + (location.startY + (style.height / 4)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2)) + style.width) + \" \" + (location.startY + (-style.height / 4)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (location.startY + (-style.height / 4)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (location.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2))) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (location.startY + (style.height / 4)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2)) + style.width) + \" \" + (location.startY + (style.height / 4)) + \" z\";\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n },\r\n\r\n\r\n _drawRightArrow: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var path;\r\n path = \"M\" + \" \" + ((location.startX - (style.width / 2))) + \" \" + (location.startY + (style.height / 4)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2))) + \" \" + (location.startY + (-style.height / 4)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (location.startY + (-style.height / 4)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (location.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2)) + style.width) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (location.startY + (style.height / 4)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2))) + \" \" + (location.startY + (style.height / 4)) + \" z\";\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n\r\n },\r\n\r\n\r\n _drawUpArrow: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var path;\r\n path = \"M\" + \" \" + ((location.startX - (style.width / 2) + (style.width / 4))) + \" \" + (location.startY - (style.height / 2) + (style.height)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2) + (style.width / 4))) + \" \" + (location.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2))) + \" \" + (location.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX)) + \" \" + (location.startY - (style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX + (style.width / 2))) + \" \" + (location.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX + (style.width / 2) - (style.width / 4))) + \" \" + (location.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX + (style.width / 2) - (style.width / 4))) + \" \" + (location.startY - (style.height / 2) + (style.height)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2) + (style.width / 4))) + \" \" + (location.startY - (style.height / 2) + (style.height)) + \" z\";\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n\r\n },\r\n\r\n _drawDownArrow: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var path;\r\n path = \"M\" + \" \" + ((location.startX - (style.width / 2) + (style.width / 4))) + \" \" + (location.startY - (style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX + (style.width / 2) - (style.width / 4))) + \" \" + (location.startY - (style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX + (style.width / 2) - (style.width / 4))) + \" \" + (location.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX + (style.width / 2))) + \" \" + (location.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX)) + \" \" + (location.startY - (style.height / 2) + (style.height)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2))) + \" \" + (location.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2) + (style.width / 4))) + \" \" + (location.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((location.startX - (style.width / 2) + (style.width / 4))) + \" \" + (location.startY - (style.height / 2)) + \" z\";\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n },\r\n\r\n _drawCross: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n\r\n var path;\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY) + \" \" +\r\n \"M\" + \" \" + (location.startX) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX) + \" \" + (location.startY + (-style.height / 2));\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.Color,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n },\r\n\r\n _drawHorizLine: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n\r\n var path;\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY);\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.Color,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n\r\n },\r\n _drawVertLine: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var path;\r\n path = \"M\" + \" \" + (location.startX) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX) + \" \" + (location.startY + (-style.height / 2));\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.Color,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n },\r\n\r\n _drawTriangle: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var path;\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX) + \" \" + (location.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY + (style.height / 2)) + \" z\";\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n },\r\n\r\n _drawInvertedTriangle: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n\r\n var path;\r\n path = \"M\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY - (style.height / 2)) + \" \"\r\n + \"L\" + \" \" + (location.startX) + \" \" + (location.startY + (style.height / 2)) + \" \"\r\n + \"L\" + \" \" + (location.startX - (style.width / 2)) + \" \" + (location.startY - (style.height / 2)) + \" \"\r\n + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY - (style.height / 2)) + \" z\";\r\n var x = location.startX;\r\n var y = location.startY;\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n\r\n },\r\n\r\n _drawHexagon: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n\r\n var path;\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 4)) + \" \" + (location.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 4)) + \" \" + (location.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 4)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 4)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY) + \" z\";\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n },\r\n\r\n _drawWedge: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n\r\n var path;\r\n path = \"M\" + \" \" + (location.startX - style.width) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + (location.startX + style.width) + \" \" + (location.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (3 * (style.width / 4))) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + (location.startX + (style.width)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX - style.width) + \" \" + (location.startY) + \" z\";\r\n var options = {\r\n 'stroke-linecap': 'miter',\r\n 'stroke-miterlimit': style.width / 4,\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n },\r\n\r\n _drawPentagon: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n\r\n var eq = 72;\r\n var radius = Math.sqrt(style.height * style.height + style.width * style.width) / 2;\r\n var sb = ej.EjSvgRender.utils._getStringBuilder();\r\n for (var i = 0; i <= 5; i++) {\r\n var deg = i * eq;\r\n var rad = (Math.PI / 180) * deg;\r\n var x1 = radius * Math.cos(rad);\r\n var y1 = radius * Math.sin(rad);\r\n if (i == 0)\r\n sb.append(\"M\" + \" \" + (location.startX + x1) + \" \" + (location.startY + y1) + \" \");\r\n\r\n else\r\n sb.append(\"L\" + \" \" + (location.startX + x1) + \" \" + (location.startY + y1) + \" \");\r\n\r\n\r\n }\r\n sb.append(\"z\");\r\n var path = sb.toString();\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n\r\n },\r\n\r\n _drawStar: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var style = symbolStyle.ShapeSize;\r\n var svgObj = sender.svgObject;\r\n\r\n var path;\r\n path = \"M\" + \" \" + (location.startX + (style.width / 3)) + \" \" + (location.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY + (style.height / 6)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY + (style.height / 6)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 3)) + \" \" + (location.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 3)) + \" \" + (location.startY + (-style.height / 2)) + \" z\";\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n\r\n },\r\n\r\n _drawRectangle: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n\r\n var path;\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY + (-style.height / 2)) + \" z\";\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n },\r\n\r\n _drawTrapezoid: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n\r\n var path;\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY + (-style.height / 4)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2) + (style.width)) + \" \" + (location.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2) + (style.width)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY + (style.height / 4)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY) + \" z\";\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n },\r\n\r\n _drawDiamond: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n\r\n var path;\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + (location.startX) + \" \" + (location.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + (location.startX) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY) + \" z\";\r\n\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'd': path\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n\r\n },\r\n _drawEllipse: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n\r\n var x = location.startX;\r\n var y = location.startY;\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'lgndCtx': symbolStyle.context,\r\n 'cx': x,\r\n 'cy': y,\r\n 'rx': style.width,\r\n 'ry': style.height / 2\r\n };\r\n\r\n\r\n svgRender.drawEllipse(options, element);\r\n\r\n\r\n },\r\n _drawImage: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var x = location.startX + (-style.width / 2);\r\n var y = location.startY + (-style.width / 2);\r\n var width = style.width;\r\n var height = style.height;\r\n var options = {\r\n 'id': svgObj.id + '_image' + symbolStyle.PointIndex, 'height': height, 'width': width, 'href': symbolStyle.Imageurl,\r\n 'x': x, 'y': y, 'visibility': 'visible', 'lgndCtx': symbolStyle.context\r\n };\r\n\r\n svgRender.drawImage(options, element);\r\n\r\n\r\n },\r\n\r\n _drawStraightLine: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var elementspace = symbolStyle.ElementSpace;\r\n var path;\r\n\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2) + (-elementspace / 4)) + \" \" + (location.startY + (style.height / 10)) + \" \" +\r\n \"L\" + \" \" + (location.startX + (style.width / 2) + (elementspace / 4)) + \" \" + (location.startY + (style.height / 10));\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth * 2,\r\n 'stroke': symbolStyle.Style.Color,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n svgRender.drawPath(options, element);\r\n return (location.startX + (-style.width / 2) + (-elementspace / 4));\r\n },\r\n\r\n _drawLine: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var elementspace = symbolStyle.ElementSpace;\r\n var path;\r\n\r\n if (sender.model.enableCanvasRendering === true) {\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2) + (-elementspace / 4)) + \" \" + (location.startY + (style.height / 10)) + \" \" + \"L\" + \" \" + (location.startX - Math.floor(style.width / 3)) + \" \" + (location.startY + (style.height / 10)) + \" \" + \"M\" + \" \" + (location.startX + Math.floor(style.width / 3)) + \" \" + (location.startY + (style.height / 10)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2) + (elementspace / 4)) + \" \" + (location.startY + (style.height / 10));\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth * 2,\r\n 'stroke': symbolStyle.Style.Color,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n var circlepath = \"M\" + \" \" + (location.startX - Math.floor(style.width / 3)) + \" \" + (location.startY + (style.height / 10)) + \" \" + \"a \" + (Math.floor(style.width / 3)) + \" \" + (Math.floor(style.width / 3)) + \" \" + 0 + \" \" + 1 + \" \" + 0 + \" \" + 2 * (Math.floor(style.width / 3)) + \" \" + 0 + \" \" + \"a\" + (Math.floor(style.width / 3)) + \" \" + (Math.floor(style.width / 3)) + \" \" + 0 + \" \" + 1 + \" \" + 0 + \" \" + (-2 * (Math.floor(style.width / 3))) + \" \" + 0;\r\n var circleoptions = {\r\n 'id': symbolStyle.ID,\r\n 'fill': \"transparent\",\r\n 'stroke-width': symbolStyle.Style.BorderWidth * 2,\r\n 'stroke': symbolStyle.Style.Color,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': circlepath,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n svgRender.drawPath(circleoptions, element);\r\n }\r\n else {\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2) + (-elementspace / 4)) + \" \" + (location.startY + (style.height / 10)) + \" \" + \"L\" + \" \" + (location.startX - Math.floor(style.width / 3)) + \" \" + (location.startY + (style.height / 10)) + \" \" + \"M\" + \" \" + (location.startX + Math.floor(style.width / 3)) + \" \" + (location.startY + (style.height / 10)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2) + (elementspace / 4)) + \" \" + (location.startY + (style.height / 10)) + \" \" + \"M\" + \" \" + (location.startX - Math.floor(style.width / 3)) + \" \" + (location.startY + (style.height / 10)) + \" \" + \"a \" + (Math.floor(style.width / 3)) + \" \" + (Math.floor(style.width / 3)) + \" \" + 0 + \" \" + 1 + \" \" + 0 + \" \" + 2 * (Math.floor(style.width / 3)) + \" \" + 0 + \" \" + \"a\" + (Math.floor(style.width / 3)) + \" \" + (Math.floor(style.width / 3)) + \" \" + 0 + \" \" + 1 + \" \" + 0 + \" \" + (-2 * (Math.floor(style.width / 3))) + \" \" + 0;\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': \"transparent\",\r\n 'stroke-width': symbolStyle.Style.BorderWidth * 2,\r\n 'stroke': symbolStyle.Style.Color,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n svgRender.drawPath(options, element);\r\n }\r\n return (location.startX + (-style.width / 2) + (-elementspace / 4));\r\n\r\n },\r\n _drawColumn: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var elementspace = symbolStyle.ElementSpace;\r\n var path;\r\n path = \"M\" + \" \" + (location.startX - 3 * (style.width / 5)) + \" \" + (location.startY - (style.height / 5)) + \" \" + \"L\" + \" \" + (location.startX + 3 * (-style.width / 10)) + \" \" + (location.startY - (style.height / 5)) + \" \" + \"L\" + \" \" + (location.startX + 3 * (-style.width / 10)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX - 3 * (style.height / 5)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"Z\" + \" \" + \"M\" + \" \" + (location.startX + (-style.width / 10) - (style.width / 20)) + \" \" + (location.startY - (style.height / 4) - (elementspace / 2)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 10) + (style.width / 20)) + \" \" + (location.startY - (style.height / 4) - (elementspace / 2)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 10) + (style.width / 20)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 10) - (style.width / 20)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"Z\" + \" \" + \"M\" + \" \" + (location.startX + 3 * (style.width / 10)) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + (location.startX + 3 * (style.width / 5)) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + (location.startX + 3 * (style.width / 5)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + 3 * (style.width / 10)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"Z\";\r\n\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n return (location.startX - 3 * (style.width / 5));\r\n\r\n },\r\n _drawRangeColumn: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var elementspace = symbolStyle.ElementSpace;\r\n var path;\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 5)) + \" \" + (location.startY + (style.height / 2) + (elementspace / 4)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 5)) + \" \" + (location.startY - (style.height / 2) - (elementspace / 4)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY + (-style.height / 2) + (-elementspace / 4)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY + (style.height / 2) + (elementspace / 4)) + \" \" + \"Z\";\r\n\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n return (location.startX + (-style.width / 5));\r\n\r\n },\r\n\r\n _drawBar: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var elementspace = symbolStyle.ElementSpace;\r\n var path;\r\n\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2) + (-elementspace / 4)) + \" \" + (location.startY - 3 * (style.height / 5)) + \" \" + \"L\" + \" \" + (location.startX + 3 * (style.width / 10)) + \" \" + (location.startY - 3 * (style.height / 5)) + \" \" + \"L\" + \" \" + (location.startX + 3 * (style.width / 10)) + \" \" + (location.startY - 3 * (style.height / 10)) + \" \" + \"L\" + \" \" + (location.startX - (style.width / 2) + (-elementspace / 4)) + \" \" + (location.startY - 3 * (style.height / 10)) + \" \" + \"Z\" + \" \" + \"M\" + \" \" + (location.startX + (-style.width / 2) + (-elementspace / 4)) + \" \" + (location.startY - (style.height / 5) + (elementspace / 20)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2) + (elementspace / 4)) + \" \" + (location.startY - (style.height / 5) + (elementspace / 20)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2) + (elementspace / 4)) + \" \" + (location.startY + (style.height / 10) + (elementspace / 20)) + \" \" + \"L\" + \" \" + (location.startX - (style.width / 2) + (-elementspace / 4)) + \" \" + (location.startY + (style.height / 10) + (elementspace / 20)) + \" \" + \"Z\" + \" \" + \"M\" + \" \" + (location.startX - (style.width / 2) + (-elementspace / 4)) + \" \" + (location.startY + (style.height / 5) + (elementspace / 10)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 4)) + \" \" + (location.startY + (style.height / 5) + (elementspace / 10)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 4)) + \" \" + (location.startY + (style.height / 2) + (elementspace / 10)) + \" \" + \"L\" + \" \" + (location.startX - (style.width / 2) + (-elementspace / 4)) + \" \" + (location.startY + (style.height / 2) + (elementspace / 10)) + \" \" + \"Z\";\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n return (location.startX + (-style.width / 2) + (-elementspace / 4));\r\n\r\n },\r\n\r\n _drawStepLine: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var elementspace = symbolStyle.ElementSpace;\r\n var path;\r\n\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2) - (elementspace / 4)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2) + (style.width / 10)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2) + (style.width / 10)) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 10)) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 10)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 5)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 5)) + \" \" + (location.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY + (-style.height / 2)) + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \"\" + (location.startX + (style.width / 2) + (elementspace / 4)) + \" \" + (location.startY + (style.height / 2));\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': \"transparent\",\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.Color,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n return (location.startX + (-style.width / 2) - (elementspace / 4));\r\n\r\n },\r\n _drawSpline: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var path;\r\n path = \"M\" + \" \" + (location.startX - (style.width / 2)) + \" \" + (location.startY + (style.height / 5)) + \" \" + \"Q\" + \" \" + location.startX + \" \" + (location.startY - style.height) + \" \" + location.startX + \" \" + (location.startY + (style.height / 5)) + \" \" + \"M\" + \" \" + location.startX + \" \" + (location.startY + (style.height / 5)) + \" \" + \"Q\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY + (style.height / 2)) + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY - (style.height / 2));\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': \"transparent\",\r\n 'stroke-width': symbolStyle.Style.BorderWidth * 2,\r\n 'stroke': symbolStyle.Style.Color,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n return (location.startX - (style.width / 2));\r\n\r\n },\r\n _drawSplineArea: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var path;\r\n path = \"M\" + \" \" + (location.startX - (style.width / 2)) + \" \" + (location.startY + (style.height / 5)) + \" \" + \"Q\" + \" \" + location.startX + \" \" + (location.startY - style.height) + \" \" + location.startX + \" \" + (location.startY + (style.height / 5)) + \" \" + \"Z\" + \" \" + \"M\" + \" \" + location.startX + \" \" + (location.startY + (style.height / 5)) + \" \" + \"Q\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY + (style.height / 2)) + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY - (style.height / 2)) + \" \" + \" Z\";\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.Color,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n return (location.startX - (style.width / 2));\r\n\r\n },\r\n _drawArea: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var elementspace = symbolStyle.ElementSpace;\r\n var path;\r\n path = \"M\" + \" \" + (location.startX - (style.width / 2) - (elementspace / 4)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 4) + (-elementspace / 8)) + \" \" + (location.startY - (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX) + \" \" + (location.startY + (style.height / 4)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 4) + (elementspace / 8)) + \" \" + (location.startY + (-style.height / 2) + (style.height / 4)) + \" \" + \"L\" + \" \" + (location.startX + (style.height / 2) + (elementspace / 4)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"Z\";\r\n\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n return (location.startX - (style.width / 2) - (elementspace / 4));\r\n\r\n },\r\n _drawStepArea: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var elementspace = symbolStyle.ElementSpace;\r\n var path;\r\n\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2) + (-elementspace / 4)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2) + (-elementspace / 4)) + \" \" + (location.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX - (style.width / 4)) + \" \" + (location.startY - (style.height / 2)) + \" \" + \"L\" + \" \" + (location.startX - (style.width / 4)) + \" \" + (location.startY - (style.height / 4)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 4)) + \" \" + (location.startY - (style.height / 4)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 4)) + \" \" + (location.startX) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2) + (elementspace / 4)) + \" \" + (location.startY) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2) + (elementspace / 4)) + \" \" + (location.startY + (style.height / 2)) + \" \" + \"Z\";\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n return (location.startX + (-style.width / 2) + (-elementspace / 4));\r\n\r\n },\r\n _drawPyramid: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var elementspace = symbolStyle.ElementSpace;\r\n var path;\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2) + (-elementspace / 4)) + \" \" + (location.startY + (style.height / 2) + (elementspace / 8)) + \" \" + \"L\" + \" \" + (location.startX) + \" \" + (location.startY + (-style.height / 2) + (-elementspace / 8)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2) + (elementspace / 4)) + \" \" + (location.startY + (style.height / 2) + (elementspace / 8)) + \" \" + \"Z\";\r\n\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n return (location.startX + (-style.width / 2) + (-elementspace / 4));\r\n\r\n\r\n },\r\n _drawFunnel: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var elementspace = symbolStyle.ElementSpace;\r\n var path;\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2) + (-elementspace / 5)) + \" \" + (location.startY + (-style.height / 2) + (-elementspace / 4)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 5)) + \" \" + (location.startY + (style.height / 4)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 5)) + \" \" + (location.startY + (style.height / 2) + (elementspace / 4)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 5)) + \" \" + (location.startY + (style.height / 2) + (elementspace / 4)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 5)) + \" \" + (location.startY + (style.height / 4)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2) + (elementspace / 5)) + \" \" + (location.startY + (-style.height / 2) + (-elementspace / 4)) + \" \" + \"Z\";\r\n\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n return (location.startX + (-style.width / 2) + (-elementspace / 5));\r\n\r\n },\r\n _drawCandle: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var elementspace = symbolStyle.ElementSpace;\r\n var path;\r\n\r\n path = \"M\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY + (style.height / 4) + (elementspace / 8)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY + (style.height / 4) + (elementspace / 8)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY + (-style.height / 2) + (elementspace / 8)) + \" \" + \"L\" + \" \" + (location.startX + (-style.width / 2)) + \" \" + (location.startY + (-style.height / 2) + (elementspace / 8)) + \" \" + \"Z\" + \" \" + \"M\" + \" \" + (location.startX) + \" \" + (location.startY + (-style.height / 2) + (elementspace / 8)) + \" \" + \"L\" + \" \" + (location.startX) + \" \" + (location.startY + (-style.height / 2) + (-elementspace / 4)) + \" \" + \"M\" + \" \" + (location.startX) + \" \" + (location.startY + (style.height / 4) + (elementspace / 8)) + \" \" + \"L\" + \" \" + (location.startX) + \" \" + (location.startY + (style.height / 4) + (elementspace / 2));\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.Color,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n return (location.startX + (-style.width / 2));\r\n\r\n },\r\n _drawHilo: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var elementspace = symbolStyle.ElementSpace;\r\n var path;\r\n path = \"M\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY + (style.height / 2) + (elementspace / 4)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2)) + \" \" + (location.startY + (-style.height / 2) + (-elementspace / 4));\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.Color,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n return (location.startX + (style.width / 2));\r\n\r\n },\r\n _drawHiloOpenClose: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var cartesian = polarToCartesian(18, 12, 4.0710678118654755, 270);\r\n var elementspace = symbolStyle.ElementSpace;\r\n var path;\r\n\r\n path = \"M\" + \" \" + (location.startX) + \" \" + (location.startY - 3 * (style.height / 10)) + \" \" + \"L\" + \" \" + (location.startX - (style.width / 2) - (elementspace / 4)) + \" \" + (location.startY - 3 * (style.height / 10)) + \" \" + \"M\" + \" \" + (location.startX) + \" \" + (location.startY - (style.height / 2) - (elementspace / 4)) + \" \" + \"L\" + \" \" + (location.startX) + \" \" + (location.startY + (style.height / 2) + (elementspace / 4)) + \" \" + \"M\" + \" \" + (location.startX) + \" \" + (location.startY + 3 * (style.height / 10)) + \" \" + \"L\" + \" \" + (location.startX + (style.width / 2) + (elementspace / 4)) + \" \" + (location.startY + 3 * (style.height / 10));\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': \"transparent\",\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.Color,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n\r\n return ((location.startX) - (style.width / 2));\r\n\r\n },\r\n\r\n _drawDoughnut: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var elementspace = symbolStyle.ElementSpace;\r\n var radius = Math.sqrt(style.height * style.width) / 2;\r\n radius = radius + (elementspace / 5);\r\n var cartesianlarge = polarToCartesian(location.startX, location.startY, radius, 270);\r\n var cartesiansmall = polarToCartesian(location.startX + (style.width / 10), location.startY, radius, 270);\r\n var elementspace = symbolStyle.ElementSpace;\r\n path = \"M\" + \" \" + location.startX + \" \" + location.startY + \" \" + \"L\" + \" \" + (location.startX + radius) + \" \" + (location.startY) + \" \" + \"A\" + \" \" + (radius) + \" \" + (radius) + \" \" + 0 + \" \" + 1 + \" \" + 1 + \" \" + cartesianlarge[0] + \" \" + cartesianlarge[1] + \" \" + \"Z\" + \" \" + \"M\" + \" \" + (location.startX + (style.width / 10)) + \" \" + (location.startY - (style.height / 10)) + \" \" + \"L\" + (location.startX + (radius)) + \" \" + (location.startY - style.height / 10) + \" \" + \"A\" + \" \" + (radius) + \" \" + (radius) + \" \" + 0 + \" \" + 0 + \" \" + 0 + \" \" + cartesiansmall[0] + \" \" + cartesiansmall[1] + \" \" + \"Z\";\r\n\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n var circle = {\r\n 'id': symbolStyle.ID, 'cx': location.startX, 'cy': location.startY, 'r': (radius / 2), 'lgndCtx': true,\r\n 'fill': \"white\", 'stroke-width': symbolStyle.Style.BorderWidth, 'stroke': symbolStyle.Style.BorderColor, 'opacity': symbolStyle.Style.Opacity, 'visibility': symbolStyle.Style.Visibility\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n svgRender.drawCircle(circle, element);\r\n\r\n return (location.startX - radius);\r\n },\r\n\r\n _drawPie: function (location, symbolStyle, sender, element) {\r\n var svgRender = sender.svgRenderer;\r\n var svgObj = sender.svgObject;\r\n var style = symbolStyle.ShapeSize;\r\n var elementspace = symbolStyle.ElementSpace;\r\n var radius = Math.sqrt(style.height * style.width) / 2;\r\n radius = radius + (elementspace / 5);\r\n var cartesianlarge = polarToCartesian(location.startX, location.startY, radius, 270);\r\n var cartesiansmall = polarToCartesian(location.startX + (style.width / 10), location.startY, radius, 270);\r\n var elementspace = symbolStyle.ElementSpace;\r\n path = \"M\" + \" \" + location.startX + \" \" + location.startY + \" \" + \"L\" + \" \" + (location.startX + radius) + \" \" + (location.startY) + \" \" + \"A\" + \" \" + (radius) + \" \" + (radius) + \" \" + 0 + \" \" + 1 + \" \" + 1 + \" \" + cartesianlarge[0] + \" \" + cartesianlarge[1] + \" \" + \"Z\" + \" \" + \"M\" + \" \" + (location.startX + (style.width / 10)) + \" \" + (location.startY - (style.height / 10)) + \" \" + \"L\" + (location.startX + (radius)) + \" \" + (location.startY - style.height / 10) + \" \" + \"A\" + \" \" + (radius) + \" \" + (radius) + \" \" + 0 + \" \" + 0 + \" \" + 0 + \" \" + cartesiansmall[0] + \" \" + cartesiansmall[1] + \" \" + \"Z\";\r\n\r\n var options = {\r\n 'id': symbolStyle.ID,\r\n 'fill': symbolStyle.Style.Color,\r\n 'stroke-width': symbolStyle.Style.BorderWidth,\r\n 'stroke': symbolStyle.Style.BorderColor,\r\n 'opacity': symbolStyle.Style.Opacity,\r\n 'visibility': symbolStyle.Style.Visibility,\r\n 'd': path,\r\n 'lgndCtx': true\r\n };\r\n\r\n svgRender.drawPath(options, element);\r\n return (location.startX - radius);\r\n }\r\n\r\n };\r\n function polarToCartesian(startX, startY, radius, angleInDegrees) {\r\n var angleInRadians = angleInDegrees * Math.PI / 180.0;\r\n var x = startX + radius * Math.cos(angleInRadians);\r\n var y = startY + radius * Math.sin(angleInRadians);\r\n return [x, y];\r\n }\r\n ej.EjSvgRender.seriesPalette = {\r\n defaultMetro: [\"#E94649\", \"#F6B53F\", \"#6FAAB0\", \"#C4C24A\", \"#FB954F\", \"#005277\", \"#8BC652\", \"#69D2E7\", \"#E27F2D\", \"#6A4B82\"],\r\n defaultHighContrast: [\"#F93A00\", \"#44E2D6\", \"#DDD10D\", \"#0AA368\", \"#0556CB\", \"#AB40B2\", \"#5F930A\", \"#D12E41\", \"#E0670E\", \"#008FFF\"],\r\n defaultOffice: [\"#005277\", \"#8BC652\", \"#6A4B82\", \"#E94649\", \"#6FAAB0\", \"#F7B74F\", \"#C4C24A\", \"#EF863F\", \"#69D2E7\", \"#FFD13E\"],\r\n defaultMaterial: [\"#663AB6\", \"#EB3F79\", \"#F8AB1D\", \"#B82E3D\", \"#049CB1\", \"#F2424F\", \"#C2C924\", \"#3DA046\", \"#074D67\", \"#02A8F4\"],\r\n defaultGradient:\r\n {\r\n borderColors: [\"#F34649\", \"#F6D321\", \"#6EB9B0\", \"#CBC26A\", \"#FBAF4F\", \"#E2CDB1\", \"#FFC0B7\", \"#68E1E6\", \"#E1A62D\", \"#9C6EBF\"],\r\n seriesColors: [[{ color: \"#F34649\", colorStop: \"0%\" }, { color: \"#B74143\", colorStop: \"100%\" }],\r\n [{ color: \"#F6D321\", colorStop: \"0%\" }, { color: \"#F6AE26\", colorStop: \"100%\" }],\r\n [{ color: \"#6EB9B0\", colorStop: \"0%\" }, { color: \"#3F77BD\", colorStop: \"100%\" }],\r\n [{ color: \"#CBC26A\", colorStop: \"0%\" }, { color: \"#9AAD21\", colorStop: \"100%\" }],\r\n [{ color: \"#FBAF4F\", colorStop: \"0%\" }, { color: \"#F07542\", colorStop: \"100%\" }],\r\n [{ color: \"#E2CDB1\", colorStop: \"0%\" }, { color: \"#AAA089\", colorStop: \"100%\" }],\r\n [{ color: \"#8BC652\", colorStop: \"0%\" }, { color: \"#6F9E41\", colorStop: \"100%\" }],\r\n [{ color: \"#68E1E6\", colorStop: \"0%\" }, { color: \"#3D9CBE\", colorStop: \"100%\" }],\r\n [{ color: \"#E1A62D\", colorStop: \"0%\" }, { color: \"#B66824\", colorStop: \"100%\" }],\r\n [{ color: \"#9C6EBF\", colorStop: \"0%\" }], [{ color: \"#593F6D\", colorStop: \"100%\" }]]\r\n },\r\n blueMetro: [\"#005378\", \"#006691\", \"#007EB5\", \"#0D97D4\", \"#00AEFF\", \"#14B9FF\", \"#54CCFF\", \"#87DBFF\", \"#ADE5FF\", \"#C5EDFF\"],\r\n blueGradient:\r\n {\r\n seriesColors: [[{ color: \"#005277\", colorStop: \"0%\" }, { color: \"#00304F\", colorStop: \"100%\" }],\r\n [{ color: \"#006590\", colorStop: \"0%\" }, { color: \"#004068\", colorStop: \"100%\" }],\r\n [{ color: \"#007DB4\", colorStop: \"0%\" }, { color: \"#00558B\", colorStop: \"100%\" }],\r\n [{ color: \"#0D97D4\", colorStop: \"0%\" }, { color: \"#057FC7\", colorStop: \"100%\" }],\r\n [{ color: \"#00ADFE\", colorStop: \"0%\" }, { color: \"#008BE9\", colorStop: \"100%\" }],\r\n [{ color: \"#14B8FE\", colorStop: \"0%\" }, { color: \"#0798EB\", colorStop: \"100%\" }],\r\n [{ color: \"#53CBFF\", colorStop: \"0%\" }, { color: \"#35AFEB\", colorStop: \"100%\" }],\r\n [{ color: \"#86DAFF\", colorStop: \"0%\" }, { color: \"#64C0EC\", colorStop: \"100%\" }],\r\n [{ color: \"#ACE5FF\", colorStop: \"0%\" }, { color: \"#8DCEED\", colorStop: \"100%\" }],\r\n [{ color: \"#C4ECFF\", colorStop: \"0%\" }], [{ color: \"#A3D1E6\", colorStop: \"100%\" }]],\r\n borderColors: [\"#005277\", \"#006590\", \"#007DB4\", \"#0D97D4\", \"#00ADFE\", \"#14B8FE\", \"#53CBFF\", \"#86DAFF\", \"#ACE5FF\", \"#C4ECFF\"]\r\n },\r\n greenMetro: [\"#496612\", \"#597B15\", \"#709A1B\", \"#87B62A\", \"#9AD926\", \"#A6DC37\", \"#BCE654\", \"#C8E780\", \"#D5EFA5\", \"#E2F3BE\"],\r\n greenGradient:\r\n {\r\n\r\n seriesColors: [[{ color: \"#5C7F16\", colorStop: \"0%\" }, { color: \"#384C08\", colorStop: \"100%\" }],\r\n [{ color: \"#6A9319\", colorStop: \"0%\" }, { color: \"#486009\", colorStop: \"100%\" }],\r\n [{ color: \"#739D1C\", colorStop: \"0%\" }, { color: \"#57760B\", colorStop: \"100%\" }],\r\n [{ color: \"#90B546\", colorStop: \"0%\" }, { color: \"#6E9215\", colorStop: \"100%\" }],\r\n [{ color: \"#9AD826\", colorStop: \"0%\" }, { color: \"#75A010\", colorStop: \"100%\" }],\r\n [{ color: \"#A5DB36\", colorStop: \"0%\" }, { color: \"#8EB91D\", colorStop: \"100%\" }],\r\n [{ color: \"#BBE554\", colorStop: \"0%\" }, { color: \"#A4C849\", colorStop: \"100%\" }],\r\n [{ color: \"#C8E780\", colorStop: \"0%\" }, { color: \"#B4D072\", colorStop: \"100%\" }],\r\n [{ color: \"#D4EEA5\", colorStop: \"0%\" }, { color: \"#BFD593\", colorStop: \"100%\" }],\r\n [{ color: \"#E1F2BD\", colorStop: \"0%\" }], [{ color: \"#C8D7A8\", colorStop: \"100%\" }]],\r\n borderColors: [\"#5C7F16\", \"#6A9319\", \"#739D1C\", \"#90B546\", \"#9AD826\", \"#A5DB36\", \"#BBE554\", \"#C8E780\", \"#D4EEA5\", \"#E1F2BD\"]\r\n },\r\n\r\n sandleMetro: [\"#6C450C\", \"#82520D\", \"#A36812\", \"#C07F1F\", \"#E69719\", \"#E89A2B\", \"#EEB564\", \"#F3CB93\", \"#F7DEB4\", \"#F9E6CA\"],\r\n sandleGradient:\r\n {\r\n\r\n\r\n seriesColors: [[{ color: \"#7F602F\", colorStop: \"0%\" }, { color: \"#512D04\", colorStop: \"100%\" }],\r\n [{ color: \"#986827\", colorStop: \"0%\" }, { color: \"#673803\", colorStop: \"100%\" }],\r\n [{ color: \"#A16C1F\", colorStop: \"0%\" }, { color: \"#8A4B05\", colorStop: \"100%\" }],\r\n [{ color: \"#BF812A\", colorStop: \"0%\" }, { color: \"#AD630D\", colorStop: \"100%\" }],\r\n [{ color: \"#E49519\", colorStop: \"0%\" }, { color: \"#B86607\", colorStop: \"100%\" }],\r\n [{ color: \"#E7992A\", colorStop: \"0%\" }, { color: \"#D7780D\", colorStop: \"100%\" }],\r\n [{ color: \"#EDB463\", colorStop: \"0%\" }, { color: \"#D98F31\", colorStop: \"100%\" }],\r\n [{ color: \"#F2CA92\", colorStop: \"0%\" }, { color: \"#DAAC6F\", colorStop: \"100%\" }],\r\n [{ color: \"#F6DDB3\", colorStop: \"0%\" }, { color: \"#DABE8F\", colorStop: \"100%\" }],\r\n [{ color: \"#F8E5C9\", colorStop: \"0%\" }], [{ color: \"#DDBE92\", colorStop: \"100%\" }]],\r\n borderColors: [\"#7F602F\", \"#986827\", \"#A16C1F\", \"#BF812A\", \"#E49519\", \"#E7992A\", \"#EDB463\", \"#F2CA92\", \"#F6DDB3\", \"#F8E5C9\"]\r\n\r\n }\r\n };\r\n\r\n ej.EjSvgRender.themes = {\r\n flatlight:\r\n {\r\n highlightColor: 'black',\r\n\r\n background: 'transparent',\r\n legend:\r\n {\r\n font: { color: \"#282828\" },\r\n title:\r\n {\r\n font: { color: \"#282828\" }\r\n }\r\n },\r\n title:\r\n {\r\n font: { color: '#565656' },\r\n subTitle:\r\n {\r\n font: { color: '#565656' }\r\n }\r\n },\r\n primaryXAxis:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n labelBorder:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n multiLevelLabelsColor: \"#8E8E8E\",\r\n multiLevelLabelsFontColor: \"#282828\",\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#282828' },\r\n title:\r\n {\r\n font: { color: '#282828' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, border: { color: '#3D3D3D', width: 1 }, fill: '#3D3D3D', font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n secondaryX:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n labelBorder:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n multiLevelLabelsColor: \"#8E8E8E\",\r\n multiLevelLabelsFontColor: \"#282828\",\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#282828' },\r\n title:\r\n {\r\n font: { color: '#282828' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, border: { color: '#3D3D3D', width: 1 }, fill: '#3D3D3D', font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n\r\n primaryYAxis:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n labelBorder: {\r\n color: \"#8E8E8E\"\r\n },\r\n multiLevelLabelsColor: \"#8E8E8E\",\r\n multiLevelLabelsFontColor: \"#282828\",\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#282828' },\r\n title:\r\n {\r\n font: { color: '#282828' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, border: { color: '#3D3D3D', borderWidth: 1 }, fill: '#3D3D3D', font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n secondaryY:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n labelBorder: {\r\n color: \"#8E8E8E\"\r\n },\r\n multiLevelLabelsColor: \"#8E8E8E\",\r\n multiLevelLabelsFontColor: \"#282828\",\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#282828' },\r\n title:\r\n {\r\n font: { color: '#282828' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, border: { color: '#3D3D3D', width: 1 }, fill: '#3D3D3D', font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n commonSeriesOptions:\r\n {\r\n marker: {\r\n dataLabel: { font: { color: '#565656' } }\r\n },\r\n errorBar: {\r\n fill: \"#000000\",\r\n cap:\r\n {\r\n fill: \"#000000\"\r\n }\r\n },\r\n connectorLine: { color: '#565656' }\r\n },\r\n crosshair:\r\n {\r\n line:\r\n {\r\n width: 1,\r\n color: 'Black'\r\n }\r\n },\r\n\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.defaultMetro,\r\n colors: ej.EjSvgRender.seriesPalette.defaultMetro\r\n\r\n },\r\n\r\n flatdark:\r\n {\r\n highlightColor: 'white',\r\n\r\n background: '#111111',\r\n\r\n legend:\r\n {\r\n font: { color: \"#C9C9C9\" },\r\n title:\r\n {\r\n font: { color: \"#C9C9C9\" }\r\n }\r\n },\r\n title:\r\n {\r\n font: { color: '#C9C9C9' },\r\n subTitle:\r\n {\r\n font: { color: '#C9C9C9' }\r\n }\r\n },\r\n primaryXAxis:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n labelBorder: {\r\n color: \"#AAAAAA\"\r\n },\r\n multiLevelLabelsColor: \"#AAAAAA\",\r\n multiLevelLabelsFontColor: \"#C9C9C9\",\r\n axisLine: { color: '#AAAAAA' },\r\n font: { color: '#C9C9C9' },\r\n title:\r\n {\r\n\r\n font: { color: '#C9C9C9' }\r\n },\r\n crosshairLabel: { rx: 0, ry: 0, fill: '#B5B5B5', border: { color: '#B5B5B5', width: 1 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#444444' } }\r\n },\r\n secondaryX:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n labelBorder: {\r\n color: \"#AAAAAA\"\r\n },\r\n multiLevelLabelsColor: \"#AAAAAA\",\r\n multiLevelLabelsFontColor: \"#C9C9C9\",\r\n axisLine: { color: '#AAAAAA' },\r\n font: { color: '#C9C9C9' },\r\n title:\r\n {\r\n\r\n font: { color: '#C9C9C9' }\r\n },\r\n crosshairLabel: { rx: 0, ry: 0, fill: '#B5B5B5', border: { color: '#B5B5B5', width: 1 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#444444' } }\r\n },\r\n primaryYAxis:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n labelBorder: {\r\n color: \"#AAAAAA\"\r\n },\r\n multiLevelLabelsColor: \"#AAAAAA\",\r\n multiLevelLabelsFontColor: \"#C9C9C9\",\r\n axisLine: { color: '#AAAAAA' },\r\n font: { color: '#C9C9C9' },\r\n title:\r\n {\r\n\r\n font: { color: '#C9C9C9' }\r\n },\r\n crosshairLabel: { rx: 0, ry: 0, fill: '#B5B5B5', border: { color: '#B5B5B5', width: 1 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#444444' } }\r\n },\r\n secondaryY:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n labelBorder: {\r\n color: \"#AAAAAA\"\r\n },\r\n multiLevelLabelsColor: \"#AAAAAA\",\r\n multiLevelLabelsFontColor: \"#C9C9C9\",\r\n axisLine: { color: '#AAAAAA' },\r\n font: { color: '#C9C9C9' },\r\n title:\r\n {\r\n\r\n font: { color: '#C9C9C9' }\r\n },\r\n crosshairLabel: { rx: 0, ry: 0, fill: '#B5B5B5', border: { color: '#B5B5B5', width: 1 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#444444' } }\r\n },\r\n commonSeriesOptions:\r\n {\r\n marker: {\r\n dataLabel: { font: { color: '#C9C9C9' } }\r\n },\r\n errorBar: {\r\n fill: \"#ffffff\",\r\n cap:\r\n {\r\n fill: \"#ffffff\"\r\n }\r\n },\r\n connectorLine: { color: '#C9C9C9' }\r\n },\r\n crosshair:\r\n {\r\n line:\r\n {\r\n width: 1,\r\n color: 'White'\r\n }\r\n },\r\n\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.defaultMetro,\r\n colors: ej.EjSvgRender.seriesPalette.defaultMetro\r\n\r\n },\r\n\r\n\r\n gradientlight:\r\n {\r\n highlightColor: 'black',\r\n\r\n background: 'transparent',\r\n legend:\r\n {\r\n font: { color: \"#282828\" },\r\n title:\r\n {\r\n font: { color: \"#282828\" }\r\n }\r\n },\r\n title:\r\n {\r\n font: { color: '#565656' },\r\n subTitle:\r\n {\r\n font: { color: '#565656' }\r\n }\r\n },\r\n primaryXAxis:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n labelBorder: {\r\n color: \"#8E8E8E\"\r\n },\r\n multiLevelLabelsColor: \"#8E8E8E\",\r\n multiLevelLabelsFontColor: \"#282828\",\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#282828' },\r\n title:\r\n {\r\n\r\n font: { color: '#282828' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, fill: '#3D3D3D', border: { color: '#3D3D3D', width: 2 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n secondaryX:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n labelBorder: {\r\n color: \"#8E8E8E\"\r\n },\r\n multiLevelLabelsColor: \"#8E8E8E\",\r\n multiLevelLabelsFontColor: \"#282828\",\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#282828' },\r\n title:\r\n {\r\n\r\n font: { color: '#282828' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, fill: '#3D3D3D', border: { color: '#3D3D3D', width: 2 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n primaryYAxis:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n labelBorder: {\r\n color: \"#8E8E8E\"\r\n },\r\n multiLevelLabelsColor: \"#8E8E8E\",\r\n multiLevelLabelsFontColor: \"#282828\",\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#282828' },\r\n title:\r\n {\r\n\r\n font: { color: '#282828' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, fill: '#3D3D3D', border: { color: '#3D3D3D', width: 2 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n secondaryY:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n labelBorder: {\r\n color: \"#8E8E8E\"\r\n },\r\n multiLevelLabelsColor: \"#8E8E8E\",\r\n multiLevelLabelsFontColor: \"#282828\",\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#282828' },\r\n title:\r\n {\r\n\r\n font: { color: '#282828' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, fill: '#3D3D3D', border: { color: '#3D3D3D', width: 2 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n commonSeriesOptions:\r\n {\r\n marker: {\r\n dataLabel: { font: { color: '#565656' } }\r\n },\r\n errorBar: {\r\n fill: \"#000000\",\r\n cap:\r\n {\r\n fill: \"#000000\"\r\n }\r\n },\r\n connectorLine: { color: '#565656' }\r\n },\r\n crosshair:\r\n {\r\n line:\r\n {\r\n width: 1,\r\n color: 'Black'\r\n }\r\n },\r\n\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.defaultGradient.borderColors,\r\n colors: ej.EjSvgRender.seriesPalette.defaultGradient.seriesColors\r\n\r\n },\r\n\r\n gradientdark:\r\n {\r\n highlightColor: 'white',\r\n\r\n background: '#111111',\r\n legend:\r\n {\r\n font: { color: \"#C9C9C9\" },\r\n title:\r\n {\r\n font: { color: \"#C9C9C9\" }\r\n }\r\n },\r\n title:\r\n {\r\n font: { color: '#C9C9C9' },\r\n subTitle:\r\n {\r\n font: { color: '#C9C9C9' }\r\n }\r\n },\r\n primaryXAxis:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n labelBorder: {\r\n color: \"#AAAAAA\"\r\n },\r\n multiLevelLabelsColor: \"#AAAAAA\",\r\n multiLevelLabelsFontColor: \"#C9C9C9\",\r\n axisLine: { color: '#AAAAAA' },\r\n font: { color: '#C9C9C9' },\r\n title:\r\n {\r\n\r\n font: { color: '#C9C9C9' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, fill: '#B5B5B5', border: { color: '#B5B5B5', width: 2 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#444444' } }\r\n },\r\n secondaryX:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n labelBorder: {\r\n color: \"#AAAAAA\"\r\n },\r\n multiLevelLabelsColor: \"#AAAAAA\",\r\n multiLevelLabelsFontColor: \"#C9C9C9\",\r\n axisLine: { color: '#AAAAAA' },\r\n font: { color: '#C9C9C9' },\r\n title:\r\n {\r\n\r\n font: { color: '#C9C9C9' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, fill: '#B5B5B5', border: { color: '#B5B5B5', width: 2 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#444444' } }\r\n },\r\n primaryYAxis:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n labelBorder: {\r\n color: \"#AAAAAA\"\r\n },\r\n multiLevelLabelsColor: \"#AAAAAA\",\r\n multiLevelLabelsFontColor: \"#C9C9C9\",\r\n axisLine: { color: '#AAAAAA' },\r\n font: { color: '#C9C9C9' },\r\n title:\r\n {\r\n\r\n font: { color: '#C9C9C9' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, fill: '#B5B5B5', border: { color: '#B5B5B5', width: 2 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#444444' } }\r\n },\r\n secondaryY:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n labelBorder: {\r\n color: \"#AAAAAA\"\r\n },\r\n multiLevelLabelsColor: \"#AAAAAA\",\r\n multiLevelLabelsFontColor: \"#C9C9C9\",\r\n axisLine: { color: '#AAAAAA' },\r\n font: { color: '#C9C9C9' },\r\n title:\r\n {\r\n\r\n font: { color: '#C9C9C9' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, fill: '#B5B5B5', border: { color: '#B5B5B5', width: 2 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#444444' } }\r\n },\r\n commonSeriesOptions:\r\n {\r\n marker: {\r\n dataLabel: { font: { color: '#C9C9C9' } }\r\n },\r\n errorBar: {\r\n fill: \"#ffffff\",\r\n cap:\r\n {\r\n fill: \"#ffffff\"\r\n }\r\n },\r\n connectorLine: { color: \"#C9C9C9\" }\r\n },\r\n\r\n crosshair:\r\n {\r\n line:\r\n {\r\n width: 1,\r\n color: 'White'\r\n }\r\n },\r\n\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.defaultGradient.borderColors,\r\n colors: ej.EjSvgRender.seriesPalette.defaultGradient.seriesColors\r\n\r\n },\r\n\r\n highcontrast01:\r\n {\r\n highlightColor: 'white',\r\n\r\n background: '#111111',\r\n legend:\r\n {\r\n font: { color: '#ffffff' },\r\n title:\r\n {\r\n font: { color: '#ffffff' }\r\n }\r\n },\r\n title:\r\n {\r\n font: { color: '#ffffff' },\r\n subTitle:\r\n {\r\n font: { color: '#ffffff' }\r\n }\r\n },\r\n primaryXAxis:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n labelBorder: {\r\n color: \"#AAAAAA\"\r\n },\r\n multiLevelLabelsColor: \"#AAAAAA\",\r\n multiLevelLabelsFontColor: \"#ffffff\",\r\n axisLine: { color: '#AAAAAA' },\r\n font: { color: '#ffffff' },\r\n title:\r\n {\r\n\r\n font: { color: '#ffffff' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, fill: '#B5B5B5', border: { color: '#B5B5B5', width: 2 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#444444' } }\r\n },\r\n secondaryX:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n axisLine: { color: '#AAAAAA' },\r\n font: { color: '#ffffff' },\r\n title:\r\n {\r\n\r\n font: { color: '#ffffff' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, fill: '#B5B5B5', border: { color: '#B5B5B5', width: 2 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#444444' } }\r\n },\r\n primaryYAxis:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n labelBorder: {\r\n color: \"#AAAAAA\"\r\n },\r\n multiLevelLabelsColor: \"#AAAAAA\",\r\n multiLevelLabelsFontColor: \"#ffffff\",\r\n axisLine: { color: '#AAAAAA' },\r\n font: { color: '#ffffff' },\r\n title:\r\n {\r\n\r\n font: { color: '#ffffff' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, fill: '#B5B5B5', border: { color: '#B5B5B5', width: 2 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#444444' } }\r\n },\r\n secondaryY:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#333333\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#AAAAAA\"\r\n },\r\n axisLine: { color: '#AAAAAA' },\r\n font: { color: '#ffffff' },\r\n title:\r\n {\r\n\r\n font: { color: '#ffffff' }\r\n },\r\n crosshairLabel: { rx: 3, ry: 3, fill: '#B5B5B5', border: { color: '#B5B5B5', width: 2 }, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#444444' } }\r\n },\r\n commonSeriesOptions:\r\n {\r\n marker: {\r\n dataLabel: { font: { color: '#ffffff' } }\r\n },\r\n errorBar: {\r\n fill: \"#ffffff\",\r\n cap:\r\n {\r\n fill: \"#ffffff\"\r\n }\r\n },\r\n connectorLine: { color: \"#C9C9C9\" }\r\n },\r\n\r\n crosshair:\r\n {\r\n line:\r\n {\r\n width: 1,\r\n color: 'White'\r\n }\r\n },\r\n\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.defaultHighContrast,\r\n colors: ej.EjSvgRender.seriesPalette.defaultHighContrast\r\n\r\n },\r\n material:\r\n {\r\n highlightColor: 'black',\r\n\r\n background: 'transparent',\r\n legend:\r\n {\r\n font: { color: \"#333333\" },\r\n title:\r\n {\r\n font: { color: \"#333333\" }\r\n }\r\n },\r\n title:\r\n {\r\n font: { color: '#333333' },\r\n subTitle:\r\n {\r\n font: { color: '#333333' }\r\n }\r\n },\r\n primaryXAxis:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n labelBorder:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n multiLevelLabelsColor: \"#8E8E8E\",\r\n multiLevelLabelsFontColor: \"#333333\",\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#333333' },\r\n title:\r\n {\r\n font: { color: '#333333' }\r\n },\r\n crosshairLabel: { rx: 0, ry: 0, border: { color: '#3D3D3D', width: 1 }, fill: '#3D3D3D', font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n secondaryX:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#333333' },\r\n title:\r\n {\r\n font: { color: '#333333' }\r\n },\r\n crosshairLabel: { rx: 0, ry: 0, border: { color: '#3D3D3D', width: 1 }, fill: '#3D3D3D', font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n\r\n primaryYAxis:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n labelBorder:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n multiLevelLabelsColor: \"#8E8E8E\",\r\n multiLevelLabelsFontColor: \"#333333\",\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#333333' },\r\n title:\r\n {\r\n font: { color: '#333333' }\r\n },\r\n crosshairLabel: { rx: 0, ry: 0, border: { color: '#3D3D3D', borderWidth: 1 }, fill: '#3D3D3D', font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n secondaryY:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#333333' },\r\n title:\r\n {\r\n font: { color: '#333333' }\r\n },\r\n crosshairLabel: { rx: 0, ry: 0, border: { color: '#3D3D3D', width: 1 }, fill: '#3D3D3D', font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n commonSeriesOptions:\r\n {\r\n marker: {\r\n dataLabel: { font: { color: '#333333' } }\r\n },\r\n errorBar: {\r\n fill: \"#000000\",\r\n cap:\r\n {\r\n fill: \"#000000\"\r\n }\r\n },\r\n connectorLine: { color: '#565656' }\r\n },\r\n crosshair:\r\n {\r\n line:\r\n {\r\n width: 1,\r\n color: 'Black'\r\n }\r\n },\r\n\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.defaultMaterial,\r\n colors: ej.EjSvgRender.seriesPalette.defaultMaterial\r\n\r\n },\r\n office365:\r\n {\r\n highlightColor: 'black',\r\n\r\n background: 'transparent',\r\n legend:\r\n {\r\n font: { color: \"#333333\" },\r\n title:\r\n {\r\n font: { color: \"#333333\" }\r\n }\r\n },\r\n title:\r\n {\r\n font: { color: '#333333' },\r\n subTitle:\r\n {\r\n font: { color: '#333333' }\r\n }\r\n },\r\n primaryXAxis:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n labelBorder:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n multiLevelLabelsColor: \"#8E8E8E\",\r\n multiLevelLabelsFontColor: \"#333333\",\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#333333' },\r\n title:\r\n {\r\n font: { color: '#333333' }\r\n },\r\n crosshairLabel: { rx: 0, ry: 0, border: { color: '#3D3D3D', width: 1 }, fill: '#3D3D3D', font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n secondaryX:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#333333' },\r\n title:\r\n {\r\n font: { color: '#333333' }\r\n },\r\n crosshairLabel: { rx: 0, ry: 0, border: { color: '#3D3D3D', width: 1 }, fill: '#3D3D3D', font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n\r\n primaryYAxis:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n labelBorder:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n multiLevelLabelsColor: \"#8E8E8E\",\r\n multiLevelLabelsFontColor: \"#333333\",\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#333333' },\r\n title:\r\n {\r\n font: { color: '#333333' }\r\n },\r\n crosshairLabel: { rx: 0, ry: 0, border: { color: '#3D3D3D', borderWidth: 1 }, fill: '#3D3D3D', font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n secondaryY:\r\n {\r\n majorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n majorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n minorGridLines:\r\n {\r\n color: \"#DFDFDF\"\r\n },\r\n minorTickLines:\r\n {\r\n color: \"#8E8E8E\"\r\n },\r\n axisLine: { color: '#8E8E8E' },\r\n font: { color: '#333333' },\r\n title:\r\n {\r\n font: { color: '#333333' }\r\n },\r\n crosshairLabel: { rx: 0, ry: 0, border: { color: '#3D3D3D', width: 1 }, fill: '#3D3D3D', font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: '#DBDBDB' } }\r\n },\r\n commonSeriesOptions:\r\n {\r\n marker: {\r\n dataLabel: { font: { color: '#333333' } }\r\n },\r\n errorBar: {\r\n fill: \"#000000\",\r\n cap:\r\n {\r\n fill: \"#000000\"\r\n }\r\n },\r\n connectorLine: { color: '#565656' }\r\n },\r\n crosshair:\r\n {\r\n line:\r\n {\r\n width: 1,\r\n color: 'Black'\r\n }\r\n },\r\n\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.defaultOffice,\r\n colors: ej.EjSvgRender.seriesPalette.defaultOffice\r\n\r\n }\r\n };\r\n $.extend(ej.EjSvgRender.themes, {\r\n\r\n \"azure\":\r\n {\r\n\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.blueMetro,\r\n colors: ej.EjSvgRender.seriesPalette.blueMetro\r\n },\r\n\r\n \"azuredark\":\r\n {\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.blueMetro,\r\n colors: ej.EjSvgRender.seriesPalette.blueMetro\r\n },\r\n \"gradient-azure\":\r\n {\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.blueGradient.borderColors,\r\n colors: ej.EjSvgRender.seriesPalette.blueGradient.seriesColors\r\n },\r\n\r\n \"gradient-azuredark\":\r\n {\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.blueGradient.borderColors,\r\n colors: ej.EjSvgRender.seriesPalette.blueGradient.seriesColors\r\n },\r\n\r\n \"lime\":\r\n {\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.greenMetro,\r\n colors: ej.EjSvgRender.seriesPalette.greenMetro\r\n },\r\n\r\n \"limedark\":\r\n {\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.greenMetro,\r\n colors: ej.EjSvgRender.seriesPalette.greenMetro\r\n },\r\n \"gradient-lime\":\r\n {\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.greenGradient.borderColors,\r\n colors: ej.EjSvgRender.seriesPalette.greenGradient.seriesColors\r\n },\r\n\r\n \"gradient-limedark\":\r\n {\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.greenGradient.borderColors,\r\n colors: ej.EjSvgRender.seriesPalette.greenGradient.seriesColors\r\n },\r\n \"saffron\":\r\n {\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.sandleMetro,\r\n colors: ej.EjSvgRender.seriesPalette.sandleMetro\r\n },\r\n\r\n \"saffrondark\":\r\n {\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.sandleMetro,\r\n colors: ej.EjSvgRender.seriesPalette.sandleMetro\r\n },\r\n \"gradient-saffron\":\r\n {\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.sandleGradient.borderColors,\r\n colors: ej.EjSvgRender.seriesPalette.sandleGradient.seriesColors\r\n },\r\n\r\n \"gradient-saffrondark\":\r\n {\r\n seriesBorderDefaultColors: ej.EjSvgRender.seriesPalette.sandleGradient.borderColors,\r\n colors: ej.EjSvgRender.seriesPalette.sandleGradient.seriesColors\r\n }\r\n });\r\n})(jQuery);;\r\nej.axisTypes = {};\r\n\r\nej.EjAxisRenderer = function () {\r\n};\r\nvar _sideBySeriesPadding = function (chartObj, start, end, axis) {\r\n var visibleSeries = ej.DataManager(chartObj.model._visibleSeries, ej.Query().sortBy(\"_zOrder\")).executeLocal();\r\n var isPadding = false;\r\n var data, startPadding, endPadding;\r\n var visibleSeriesLength = visibleSeries.length;\r\n var axisOrientation = axis.orientation.toLowerCase();\r\n for (var i = 0; i < visibleSeriesLength; i++) {\r\n var type = visibleSeries[i].type.toLowerCase();\r\n if (((type.indexOf(\"column\") != -1 || type.indexOf(\"bar\") != -1 || type.indexOf(\"waterfall\") != -1 || type == \"candle\" || type.indexOf(\"hilo\") != -1 || type.indexOf(\"box\") != -1))) {\r\n isPadding = true;\r\n break;\r\n }\r\n\r\n }\r\n if (chartObj.model.AreaType != \"polaraxes\" && isPadding) {\r\n axis.m_minPointsDelta = undefined;\r\n var padding = ej.EjSvgRender.utils.getMinPointsDelta(axis, chartObj, start) * 0.5;\r\n start = start - padding;\r\n end = (end + padding > Number.MAX_VALUE) ? Number.MAX_VALUE : end + padding;\r\n axis.padding = padding;\r\n }\r\n else\r\n axis.padding = 0;\r\n return data = { startPadding: start, endPadding: end };\r\n};\r\nej.EjStripline = function (chartobj) {\r\n this.chart = chartobj;\r\n};\r\n(function ($) {\r\n ej.EjAxisRenderer.prototype = {\r\n\r\n //Calculate min/max value for series\r\n _seriesMinMax: function (chartObj, axis, seriesCollection, type, params) {\r\n var orientation = axis.orientation.toLowerCase(), seriesLength = seriesCollection.length;\r\n params.seriesCollection = ej.util.isNullOrUndefined(params.seriesCollection) ? {} : params.seriesCollection;\r\n var count;\r\n if ((seriesLength > 0 && chartObj.model._hasSeriesPoints && seriesCollection[0].points.length > 0) || this.chartObj.model.indicators[0]._points.length > 0) {\r\n\r\n var maxX, minY, minX, maxY, min, max, delta;\r\n var maxMinXValue = { maxX: null, minX: null };\r\n var maxMinYValue = { maxY: null, minY: null };\r\n var xMax = maxMinXValue.maxX;\r\n var xMin = maxMinXValue.minX;\r\n var yMax = maxMinYValue.maxY;\r\n var yMin = maxMinYValue.minY;\r\n var seriesVisibility, pointsLength, visibleLength, seriesType;\r\n\r\n for (var i = 0; i < seriesLength; i++) {\r\n seriesVisibility = seriesCollection[i].visibility.toLowerCase();\r\n pointsLength = seriesCollection[i].points.length;\r\n count = 0;\r\n if (seriesVisibility === 'visible') {\r\n seriesCollection[i]._visiblePoints = [];\r\n for (var j = 0; j < pointsLength; j++) {\r\n var point = seriesCollection[i].points[j];\r\n if ((point.x != null && point.x != undefined) && ((typeof point.y == \"object\" || !isNaN(point.y)) && point.y != null && point.y != undefined)\r\n || point.showIntermediateSum || point.showTotalSum || point.isEmpty == false) {\r\n seriesCollection[i]._visiblePoints[count] = point;\r\n seriesCollection[i]._visiblePoints[count].actualIndex = j;\r\n count++;\r\n }\r\n }\r\n }\r\n axis.maxPointLength = pointsLength;\r\n }\r\n\r\n for (var i = 0; i < seriesLength; i++) {\r\n visibleLength = seriesCollection[i]._visiblePoints.length;\r\n var series = seriesCollection[i];\r\n if (visibleLength > 0) {\r\n seriesVisibility = seriesCollection[i].visibility.toLowerCase();\r\n pointsLength = seriesCollection[i].points.length;\r\n if (seriesVisibility === 'visible' && pointsLength > 0) {\r\n if ((orientation == \"horizontal\" && !(chartObj.model.requireInvertedAxes)) || (orientation == \"vertical\" && chartObj.model.requireInvertedAxes)) {\r\n minX = maxX = seriesCollection[i]._visiblePoints[0].xValue;\r\n for (var j = 0; j < visibleLength; j++) {\r\n var currentPoint = seriesCollection[i]._visiblePoints[j].xValue;\r\n if (minX > currentPoint)\r\n minX = currentPoint;\r\n if (maxX < currentPoint)\r\n maxX = currentPoint;\r\n }\r\n seriesCollection[i].minX = minX;\r\n seriesCollection[i].maxX = maxX;\r\n\r\n if ((xMin === null || xMin === undefined) && visibleLength > 0) {\r\n xMax = seriesCollection[i].maxX;\r\n xMin = seriesCollection[i].minX;\r\n }\r\n if (xMin > seriesCollection[i].minX) {\r\n xMin = seriesCollection[i].minX;\r\n }\r\n if (xMax < seriesCollection[i].maxX) {\r\n xMax = seriesCollection[i].maxX;\r\n }\r\n }\r\n else {\r\n var isSpline = (series.type.toLowerCase().indexOf('spline') != -1), controlPoint, naturalSpline, getBezierControlPoints, splineVisiblePoints,\r\n controlPointsCount = 0, visiblePoints = seriesCollection[i]._visiblePoints;\r\n if (isSpline) {\r\n var seriesKey = series._name = series.name || 'series' + i;\r\n params.seriesCollection[seriesKey] = {};\r\n visiblePoints = ej.ejSplineSeries.prototype._isVisiblePoints(series),\r\n naturalSpline = params.seriesCollection[seriesKey].naturalSpline = ej.ejSplineSeries.prototype.naturalSpline(visiblePoints, series);\r\n params.seriesCollection[seriesKey].controlPoints = [];\r\n getBezierControlPoints = ej.ejSplineSeries.prototype.getBezierControlPoints;\r\n splineVisiblePoints = visiblePoints.filter(function (currentPt,  index,  array) {\r\n return  !ej.isNullOrUndefined(currentPt.YValues[0])  &&  !isNaN(currentPt.YValues[0]);\r\n });\r\n }\r\n maxY = minY = !isSpline ? visiblePoints[0].YValues[0] : splineVisiblePoints[0].YValues[0];\r\n var minval, maxval;\r\n for (var j = 0; j < visiblePoints.length; j++) {\r\n var currentPoint = visiblePoints[j];\r\n if (seriesCollection[i]._hiloTypes) {\r\n for (var y = 0; y < 2; y++) {\r\n if (minY > currentPoint.YValues[y])\r\n minY = currentPoint.YValues[y];\r\n if (maxY < currentPoint.YValues[y])\r\n maxY = currentPoint.YValues[y];\r\n }\r\n }\r\n else if (series.type.toLowerCase() == \"boxandwhisker\") {\r\n minval = visiblePoints[j].YValues[0][0];\r\n maxval = visiblePoints[j].YValues[0][0];\r\n for (var yindex = 0; yindex < currentPoint.YValues[0].length; yindex++) {\r\n if (minval > currentPoint.YValues[0][yindex])\r\n minval = currentPoint.YValues[0][yindex];\r\n if (maxval < currentPoint.YValues[0][yindex])\r\n maxval = currentPoint.YValues[0][yindex];\r\n }\r\n minY = minval > minY ? minY : minval;\r\n maxY = maxval < maxY ? maxY : maxval;\r\n }\r\n else if (isSpline) {\r\n if (j != 0 && currentPoint.visible && visiblePoints[j - 1].visible) {\r\n params.seriesCollection[seriesKey].controlPoints.push(getBezierControlPoints(visiblePoints[j - 1], currentPoint, naturalSpline[j - 1], naturalSpline[j], 0, series, this));\r\n controlPoint = params.seriesCollection[seriesKey].controlPoints[controlPointsCount++];\r\n minY = Math.min(minY, currentPoint.YValues[0], controlPoint.controlPoint1.YValues[0], controlPoint.controlPoint2.YValues[0]);\r\n maxY = Math.max(maxY, currentPoint.YValues[0], controlPoint.controlPoint1.YValues[0], controlPoint.controlPoint2.YValues[0]);\r\n }\r\n else {\r\n if (j != 0 && series.type.toLowerCase().indexOf(\"stacking\") != -1) {\r\n params.seriesCollection[seriesKey].controlPoints.push(getBezierControlPoints(visiblePoints[j - 1], currentPoint, naturalSpline[j - 1], naturalSpline[j], 0, series, this));\r\n controlPoint = params.seriesCollection[seriesKey].controlPoints[controlPointsCount++];\r\n }\r\n minY = Math.min(minY, isNaN(currentPoint.YValues[0]) ? minY : (currentPoint.YValues[0] || null));\r\n maxY = Math.max(maxY, currentPoint.YValues[0] || null);\r\n }\r\n }\r\n else {\r\n if (minY > currentPoint.YValues[0])\r\n minY = currentPoint.YValues[0];\r\n if (maxY < currentPoint.YValues[0])\r\n maxY = currentPoint.YValues[0];\r\n }\r\n }\r\n seriesCollection[i].minY = minY;\r\n seriesCollection[i].maxY = maxY;\r\n\r\n if ((yMin === null || yMin === undefined) && visibleLength > 0) {\r\n yMax = seriesCollection[i].maxY;\r\n yMin = seriesCollection[i].minY;\r\n }\r\n if (yMin > seriesCollection[i].minY) {\r\n yMin = seriesCollection[i].minY;\r\n }\r\n if (yMax < seriesCollection[i].maxY) {\r\n yMax = seriesCollection[i].maxY;\r\n }\r\n\r\n // Finding Min and Max for Column and Bar series\r\n seriesType = seriesCollection[i].type\r\n if ((seriesType == 'column' || seriesType == 'bar') && axis.startFromZero)\r\n yMin = (yMin < 0) ? yMin : 0;\r\n }\r\n }\r\n }\r\n }\r\n if ((orientation == \"horizontal\" && !(chartObj.model.requireInvertedAxes)) || (orientation == \"vertical\" && chartObj.model.requireInvertedAxes)) {\r\n\r\n // Find min/max for indicator series\r\n if (this.chartObj.model.indicatorRange && this.chartObj.model.indicatorRange[axis.name]) {\r\n var value = this.chartObj.model.indicatorRange[axis.name];\r\n if (yMin > value.min || yMin == null)\r\n yMin = value.min;\r\n if (yMax < value.max || yMax == null)\r\n yMax = value.max;\r\n }\r\n\r\n if (xMax == xMin)\r\n xMax += 1;\r\n\r\n if (type == \"double\") {\r\n var data = _sideBySeriesPadding(chartObj, xMin, xMax, axis);\r\n xMin = data.startPadding;\r\n xMax = data.endPadding;\r\n var deltaX = xMax - xMin;\r\n axis.range = this._getDoubleAutoRange(axis, xMin, xMax, deltaX);\r\n }\r\n else\r\n axis.range = this._getLogAutoRange(axis, xMin, xMax, xMax - xMin);\r\n\r\n }\r\n else {\r\n\r\n // Find min/max for stacked series\r\n if (this.chartObj.model.stackedValue[axis.name]) {\r\n var value = this.chartObj.model.stackedValue[axis.name],\r\n isStacked = true;\r\n if (yMin > value.min)\r\n yMin = value.min;\r\n if (yMax < value.max)\r\n yMax = value.max;\r\n }\r\n\r\n // Find min/max for indicator series\r\n if (this.chartObj.model.indicatorRange && this.chartObj.model.indicatorRange[axis.name]) {\r\n var value = this.chartObj.model.indicatorRange[axis.name];\r\n if (yMin > value.min || yMin == null)\r\n yMin = value.min;\r\n if (yMax < value.max || yMax == null)\r\n yMax = value.max;\r\n }\r\n\r\n if (yMax == yMin) { // max == min\r\n if (yMax < 0) // value less than 0\r\n yMax = 0;\r\n else if (yMax <= 1 && yMax > 0) // value between 0 and 1\r\n yMin = 0;\r\n else { // value greater than 1\r\n yMin = 0;\r\n yMax += 1;\r\n }\r\n }\r\n\r\n if ((seriesType == 'column' || seriesType == 'bar') && !axis.startFromZero) {\r\n var maxLimit = (axis.range && axis.range.max) || yMax;\r\n var interval = (axis.range && axis.range.interval) || this.calculateNumericNiceInterval(maxLimit - yMin, axis, null, maxLimit);\r\n yMax += interval;\r\n if ((yMin - interval < 0 && yMin > 0) || isStacked) {\r\n yMin = 0;\r\n }\r\n else\r\n yMin -= interval;\r\n }\r\n\r\n var deltaY = yMax - yMin;\r\n isStacked = false;\r\n\r\n if (type == \"double\")\r\n axis.range = this._getDoubleAutoRange(axis, yMin, yMax, deltaY)\r\n else\r\n axis.range = this._getLogAutoRange(axis, yMin, yMax, deltaY)\r\n\r\n }\r\n }\r\n else {\r\n if (!axis.setRange) {\r\n axis.range = { min: 0, max: 5, interval: 1, Delta: 4 };\r\n }\r\n else {\r\n min = (axis.range.min == null || axis.range.min == undefined) ? 0 : axis.range.min;\r\n max = (axis.range.max == null || axis.range.max == undefined) ? 5 : axis.range.max;\r\n delta = max - min;\r\n axis.range = (type == \"double\") ? this._getDoubleAutoRange(axis, min, max, delta) : this._getLogAutoRange(axis, min, max, delta);\r\n }\r\n }\r\n var commonAxisEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonAxisEventArgs.data = { range: axis.range, axis: axis };\r\n this.chartObj._trigger(\"axesRangeCalculate\", commonAxisEventArgs);\r\n var range = commonAxisEventArgs.data.range;\r\n axis.range = { min: range.min, max: range.max, interval: range.interval, delta: (range.max - range.min) };\r\n\r\n },\r\n\r\n //Calculate ranges for Trendline series\r\n _calculateTrendLineRange: function (chart, axis, seriesCollection) {\r\n var series, trendlines, trendline, count, serLength, trendLength, trendlineType, options;\r\n var serLength = seriesCollection.length;\r\n for (var m = 0; m < serLength; m++) {\r\n series = seriesCollection[m];\r\n trendlines = series.trendlines;\r\n if (chart.model.AreaType == \"cartesianaxes\" && (axis.name == series._xAxisName || axis.name == series._yAxisName)) {\r\n trendLength = trendlines.length;\r\n for (var i = 0; i < trendLength; i++) {\r\n trendline = trendlines[i];\r\n if (trendline.visibility.toLowerCase() === 'visible') {\r\n\r\n if (axis.name == series._xAxisName) {\r\n trendlineType = trendline.type.toLowerCase();\r\n options = new ej.trendlineTypes[trendlineType]();\r\n options.calculateTrendLineSegment(series, trendline, axis, chart);\r\n } else\r\n if (axis.name == series._yAxisName && !axis.setRange && trendline.points && trendline.points.length > 1) {\r\n count = trendline.points.length - 1;\r\n axis.range.min = axis.range.min > trendline.minY ? trendline.minY : axis.range.min;\r\n axis.range.max = axis.range.max < trendline.maxY ? trendline.maxY : axis.range.max;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n },\r\n\r\n AlignRangeStart: function (sDate, intervalSize, intervalType) {\r\n var sResult = new Date(sDate);\r\n if (intervalType.toLowerCase() == \"days\") {\r\n var day = Math.floor(Math.floor((sDate.getDate()) / intervalSize) * intervalSize);\r\n sResult = new Date(sDate.getFullYear(), sDate.getMonth(), day, 0, 0, 0);\r\n } else if (intervalType.toLowerCase() == \"hours\") {\r\n var hour = Math.floor(Math.floor((sDate.getHours()) / intervalSize) * intervalSize);\r\n sResult = new Date(sDate.getFullYear(), sDate.getMonth(), sDate.getDate(), hour, 0, 0);\r\n } else if (intervalType.toLowerCase() == \"milliseconds\") {\r\n var milliseconds = Math.floor(Math.floor((sDate.getMilliseconds()) / intervalSize) * intervalSize);\r\n sResult = new Date(sDate.getFullYear(), sDate.getMonth(), sDate.getDate(), sDate.getHours(), sDate.getMinutes(), sDate.getSeconds(), milliseconds);\r\n } else if (intervalType.toLowerCase() == \"seconds\") {\r\n var seconds = Math.floor(Math.floor((sDate.getSeconds()) / intervalSize) * intervalSize);\r\n sResult = new Date(sDate.getFullYear(), sDate.getMonth(), sDate.getDate(), sDate.getHours(), sDate.getMinutes(), seconds, 0);\r\n } else if (intervalType.toLowerCase() == \"minutes\") {\r\n var minutes = Math.floor(Math.floor((sDate.getMinutes()) / intervalSize) * intervalSize);\r\n sResult = new Date(sDate.getFullYear(), sDate.getMonth(), sDate.getDate(), sDate.getHours(), minutes, 0, 0);\r\n } else if (intervalType.toLowerCase() == \"months\") {\r\n var month = Math.floor(Math.floor((sDate.getMonth()) / intervalSize) * intervalSize);\r\n sResult = new Date(sDate.getFullYear(), month, sDate.getDate(), 0, 0, 0);\r\n } else if (intervalType.toLowerCase() == \"years\") {\r\n var year = Math.floor(Math.floor(sDate.getFullYear() / intervalSize) * intervalSize);\r\n sResult = new Date(year, sDate.getMonth(), sDate.getDate(), 0, 0, 0);\r\n }\r\n return sResult;\r\n },\r\n _increaseDateTimeInterval: function (date, interval, intervalType) {\r\n var result = new Date(date);\r\n if (intervalType.toLowerCase() == \"days\") {\r\n result.setDate(date.getDate() + interval);\r\n } else if (intervalType.toLowerCase() == \"hours\") {\r\n result.setHours(date.getHours() + interval);\r\n } else if (intervalType.toLowerCase() == \"milliseconds\") {\r\n result.setMilliseconds(date.getMilliseconds() + interval);\r\n } else if (intervalType.toLowerCase() == \"seconds\") {\r\n result.setSeconds(date.getSeconds() + interval);\r\n } else if (intervalType.toLowerCase() == \"minutes\") {\r\n result.setMinutes(date.getMinutes() + interval);\r\n } else if (intervalType.toLowerCase() == \"months\") {\r\n result.setMonth(date.getMonth() + interval);\r\n } else if (intervalType.toLowerCase() == \"years\") {\r\n result.setYear(date.getFullYear() + interval);\r\n }\r\n\r\n return result;\r\n },\r\n\r\n _calculatePadding: function (axis) {\r\n\r\n var start = (typeof axis.range.min == \"string\" && !isNaN(Date.parse(axis.range.min))) ? Date.parse(axis.range.min) : (axis.range.min).getTime();\r\n var end = (typeof axis.range.max == \"string\" && !isNaN(Date.parse(axis.range.max))) ? Date.parse(axis.range.max) : (axis.range.max).getTime();\r\n var interval = ((this._increaseDateTimeInterval(new Date(start), axis.range.interval, axis._intervalType)).getTime()) - start;\r\n var rangePadding = axis.rangePadding.toLowerCase();\r\n if (!this.chartObj.zoomed && !axis.setRange) {\r\n start = new Date(start);\r\n end = new Date(end);\r\n var intervalType = axis._intervalType.toLowerCase();\r\n if (axis.rangePadding.toLowerCase() == 'none') {\r\n start = start.getTime();\r\n end = end.getTime();\r\n } else if (rangePadding == 'additional' || rangePadding == 'round') {\r\n switch (intervalType) {\r\n case 'years':\r\n var startYear = start.getFullYear();\r\n var endYear = end.getFullYear();\r\n if (axis.rangePadding.toLowerCase() == 'additional') {\r\n start = (new Date(startYear - axis.range.interval, 1, 1, 0, 0, 0)).getTime();\r\n end = (new Date(endYear + axis.range.interval, 1, 1, 0, 0, 0)).getTime();\r\n } else {\r\n start = new Date(startYear, 0, 0, 0, 0, 0).getTime();\r\n end = new Date(endYear, 11, 30, 23, 59, 59).getTime();\r\n }\r\n break;\r\n case 'months':\r\n var month = start.getMonth();\r\n var endMonth = end.getMonth();\r\n if (rangePadding == 'round') {\r\n start = (new Date(start.getFullYear(), month, 0, 0, 0, 0)).getTime();\r\n end = (new Date(end.getFullYear(), endMonth, new Date(end.getFullYear(), end.getMonth(), 0).getDate(), 23, 59, 59)).getTime();\r\n } else {\r\n start = (new Date(start.getFullYear(), month + (-axis.range.interval), 1, 0, 0, 0)).getTime();\r\n end = (new Date(end.getFullYear(), endMonth + (axis.range.interval), endMonth == 2 ? 28 : 30, 0, 0, 0)).getTime();\r\n }\r\n break;\r\n case 'days':\r\n var day = start.getDate();\r\n var endDay = end.getDate();\r\n if (rangePadding == 'round') {\r\n start = (new Date(start.getFullYear(), start.getMonth(), day, 0, 0, 0)).getTime();\r\n end = (new Date(end.getFullYear(), end.getMonth(), endDay, 23, 59, 59)).getTime();\r\n } else {\r\n start = (new Date(start.getFullYear(), start.getMonth(), day + (-axis.range.interval), 0, 0, 0)).getTime();\r\n end = (new Date(end.getFullYear(), end.getMonth(), endDay + (axis.range.interval), 0, 0, 0)).getTime();\r\n }\r\n break;\r\n case 'hours':\r\n var hour = (start.getHours() / axis.range.interval) * axis.range.interval;\r\n var endHour = end.getHours() + (start.getHours() - hour);\r\n if (rangePadding == 'round') {\r\n start = (new Date(start.getFullYear(), start.getMonth(), start.getDay(), hour, 0, 0)).getTime();\r\n end = (new Date(end.getFullYear(), end.getMonth(), end.getDay(), endHour, 59, 59)).getTime();\r\n } else {\r\n start = (new Date(start.getFullYear(), start.getMonth(), start.getDay(), hour + (-axis.range.interval), 0, 0)).getTime();\r\n end = (new Date(end.getFullYear(), end.getMonth(), end.getDay(), endHour + (axis.range.interval), 0, 0)).getTime();\r\n }\r\n break;\r\n case 'minutes':\r\n var minute = (start.getMinutes() / axis.range.interval) * axis.range.interval;\r\n var endMinute = end.getMinutes() + (start.getMinutes() - minute);\r\n if (rangePadding == 'round') {\r\n start = (new Date(start.getFullYear(), start.getMonth(), start.getDay(), start.getHour(), minute, 0)).getTime();\r\n end = (new Date(end.getFullYear(), end.getMonth(), end.getDay(), end.getHour(), endMinute, 59)).getTime();\r\n } else {\r\n start = (new Date(start.getFullYear(), start.getMonth(), start.getDay(), start.getHours(), minute + (-axis.range.interval), 0)).getTime();\r\n end = (new Date(end.getFullYear(), end.getMonth(), end.getDay(), end.getHours(), minute + (axis.range.interval), 0)).getTime();\r\n }\r\n break;\r\n case 'seconds':\r\n var second = (start.getSeconds() / axis.range.interval) * axis.range.interval;\r\n var endSecond = end.getSeconds() + (start.getSeconds() - second);\r\n if (rangePadding == 'round') {\r\n start = (new Date(start.getFullYear(), start.getMonth(), start.getDay(), start.getHours(), start.getMinutes(), second, 0)).getTime();\r\n end = (new Date(end.getFullYear(), end.getMonth(), end.getDay(), end.getHour(), end.getMinutes(), endSecond, 0)).getTime();\r\n } else {\r\n start = (new Date(start.getFullYear(), start.getMonth(), start.getDay(), start.getHours(), start.getMinutes(), second + (-axis.range.interval), 0)).getTime();\r\n end = (new Date(end.getFullYear(), end.getMonth(), end.getDay(), end.getHours(), end.getMinutes(), endSecond + (axis.range.interval), 0)).getTime();\r\n }\r\n break;\r\n case 'milliseconds':\r\n var milliSecond = (start.getMilliseconds() / axis.range.interval) * axis.range.interval;\r\n var endMilliSecond = end.getMilliseconds() + (start.getMilliseconds() - milliSecond);\r\n if (rangePadding == 'round') {\r\n start = (new Date(start.getFullYear(), start.getMonth(), start.getDay(), start.getHours(), start.getMinutes(), start.getSeconds(), milliSecond)).getTime();\r\n end = (new Date(end.getFullYear(), end.getMonth(), end.getDay(), end.getHours(), end.getMinutes(), end.getSeconds(), endMilliSecond)).getTime();\r\n } else {\r\n start = (new Date(start.getFullYear(), start.getMonth(), start.getDay(), start.getHours(), start.getMinutes(), start.getSeconds(), milliSecond + (-axis.range.interval))).getTime();\r\n end = (new Date(end.getFullYear(), end.getMonth(), end.getDay(), end.getHours(), end.getMinutes(), end.getSeconds(), endMilliSecond + (axis.range.interval))).getTime();\r\n }\r\n break;\r\n }\r\n\r\n }\r\n\r\n }\r\n axis.actualRange.interval = interval;\r\n axis.actualRange.min = start;\r\n axis.actualRange.max = end;\r\n axis._interval = axis.range.interval;\r\n axis.actualRange.delta = (axis.actualRange.max - axis.actualRange.min);\r\n axis.range.min = new Date(start);\r\n axis.range.max = new Date(end);\r\n this._calculateVisibleRange(axis);\r\n\r\n },\r\n _calculateVisibleRange: function (axis, sender, isScroll) {\r\n this.chartObj = sender ? sender : this.chartObj;\r\n axis.visibleRange = (!isScroll) ? $.extend(true, {}, axis.actualRange) : axis.visibleRange;\r\n if ((axis.zoomFactor < 1 || axis.zoomPosition > 0) && this.chartObj.model.AreaType != \"polaraxes\" && !this.chartObj.model.disableZoom) {\r\n\r\n axis.zoomFactor = axis.zoomFactor > 1 ? 1 : (axis.zoomFactor < 0 ? 0 : axis.zoomFactor);\r\n axis.zoomPosition = axis.zoomPosition < 0 ? 0 : (axis.zoomPosition > 1 ? 1 : axis.zoomPosition);\r\n var baseRange = axis.actualRange;\r\n if (axis.isInversed) {\r\n var start = axis.actualRange.max - axis.zoomPosition * axis.actualRange.delta;\r\n var end = start - axis.zoomFactor * axis.actualRange.delta;\r\n }\r\n else {\r\n var start = axis.actualRange.min + axis.zoomPosition * axis.actualRange.delta;\r\n var end = start + axis.zoomFactor * axis.actualRange.delta;\r\n }\r\n\r\n if (start < baseRange.min) {\r\n end = end + (baseRange.min - start);\r\n start = baseRange.min;\r\n }\r\n\r\n if (end > baseRange.max) {\r\n start = start - (end - baseRange.max);\r\n end = baseRange.max;\r\n }\r\n\r\n var startDate = new Date(start);\r\n var endDate = new Date(end);\r\n if (start == end) {\r\n startDate = new Date(Date.parse(startDate) - 2592000000);\r\n endDate = new Date(Date.parse(endDate) + 2592000000);\r\n }\r\n //Use below code to find min,max and interval for visible range\r\n var min = Math.min(startDate.getTime(), endDate.getTime());\r\n var max = Math.max(startDate.getTime(), endDate.getTime());\r\n var intervalX = axis.enableAutoIntervalOnZooming ? this.calculateDateTimeNiceInterval(axis, startDate, endDate) : { 'interval': axis._interval, 'intervalType': axis._intervalType };\r\n var interval = ((this._increaseDateTimeInterval(startDate, intervalX.interval, intervalX.intervalType)).getTime()) - min;\r\n\r\n if (isScroll) {\r\n return { min: min, max: max, interval: interval };\r\n }\r\n else {\r\n axis._intervalType = intervalX.intervalType;\r\n axis.visibleRange.min = min;\r\n axis.visibleRange.max = max;\r\n axis.visibleRange.interval = interval;\r\n axis.visibleRange.delta = Math.abs(axis.visibleRange.max - axis.visibleRange.min);\r\n axis._interval = intervalX.interval;\r\n }\r\n }\r\n\r\n },\r\n _calculateAxisLabels: function (axis) {\r\n var position, text;\r\n var minRange = axis.enableAutoIntervalOnZooming ? axis.visibleRange.min : axis.actualRange.min;\r\n if (this.chartObj.zoomed || axis.zoomed || !axis.setRange)\r\n position = (this.AlignRangeStart(new Date(minRange), axis._interval, axis._intervalType)).getTime();\r\n\r\n else\r\n position = axis.visibleRange.min;\r\n while (position <= axis.visibleRange.max) {\r\n if (position >= axis.visibleRange.min && position <= axis.visibleRange.max) {\r\n text = (ej.format(new Date(position), ((!(axis.labelFormat)) ? ej.EjSvgRender.utils._dateTimeLabelFormat(axis._intervalType, axis) : axis.labelFormat), this.chartObj.model.locale));\r\n var commonAxesEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonAxesEventArgs.data = { label: { Text: text, Value: position }, axis: axis };\r\n this.chartObj._trigger(\"axesLabelRendering\", commonAxesEventArgs);\r\n axis.visibleLabels.push({ Value: position, Text: commonAxesEventArgs.data.label.Text });\r\n }\r\n position = (this._increaseDateTimeInterval(new Date(position), axis._interval, axis._intervalType)).getTime();\r\n\r\n axis.visibleLabels[axis.visibleLabels.length - 1] = axis.visibleLabels[axis.visibleLabels.length - 1];\r\n }\r\n axis._LableMaxWidth = ej.EjSvgRender.utils._getMaxLabelWidth(axis, this.chartObj);\r\n },\r\n calculateDateTimeNiceInterval: function (axis, startDate, endDate) {\r\n var oneDay = 24 * 60 * 60 * 1000;\r\n //var axisInterval ;\r\n var totalDays = (Math.abs((startDate.getTime() - endDate.getTime()) / (oneDay)));\r\n var interval = this.calculateNumericNiceInterval(totalDays / 365, axis, \"years\");\r\n\r\n if (interval >= 1) {\r\n return { interval: interval, intervalType: \"Years\" };\r\n }\r\n\r\n interval = this.calculateNumericNiceInterval(totalDays / 30, axis, \"months\");\r\n\r\n if (interval >= 1) {\r\n return { interval: interval, intervalType: \"Months\" };\r\n }\r\n\r\n interval = this.calculateNumericNiceInterval(totalDays, axis, \"days\");\r\n\r\n if (interval >= 1) {\r\n\r\n\r\n return { interval: interval, intervalType: \"Days\" };\r\n }\r\n\r\n var totalHours = totalDays * 24;\r\n\r\n interval = this.calculateNumericNiceInterval(totalHours, axis, \"hours\");\r\n\r\n if (interval >= 1) {\r\n\r\n return { interval: interval, intervalType: \"Hours\" };\r\n }\r\n\r\n var totalMinutes = totalDays * 24 * 60;\r\n\r\n interval = this.calculateNumericNiceInterval(totalMinutes, axis, \"minutes\");\r\n\r\n if (interval >= 1) {\r\n\r\n return { interval: interval, intervalType: \"Minutes\" };\r\n }\r\n\r\n var totalSeconds = totalDays * 24 * 60 * 60;\r\n\r\n interval = this.calculateNumericNiceInterval(totalSeconds, axis, \"seconds\");\r\n\r\n if (interval >= 1) {\r\n\r\n return { interval: interval, intervalType: \"Seconds\" };\r\n }\r\n\r\n var totalMilliseconds = totalDays * 24 * 60 * 60 * 1000;\r\n\r\n interval = this.calculateNumericNiceInterval(totalMilliseconds, axis, \"milliseconds\");\r\n\r\n if (interval >= 1) {\r\n\r\n return { interval: interval, intervalType: \"Milliseconds\" };\r\n }\r\n\r\n },\r\n calculateNumericNiceInterval: function (delta, axis, setInterval, max) {\r\n var desiredIntervalsCount = this.GetActualDesiredIntervalsCount(axis, axis.length);\r\n var niceInterval = delta / desiredIntervalsCount;\r\n if (axis._valueType == 'double') {\r\n if (axis.desiredIntervals != null)\r\n return niceInterval;\r\n }\r\n var minInterval = Math.pow(10, Math.floor(ej.EjSvgRender.utils._logBase(niceInterval, 10))),\r\n intervalDivs = [10, 5, 2, 1],\r\n maxLimit = max || (axis.range && axis.range.max);\r\n\r\n\r\n for (var i = 0; i < intervalDivs.length; i++) {\r\n var currentInterval = minInterval * intervalDivs[i];\r\n if (desiredIntervalsCount < (delta / currentInterval)) {\r\n if (axis._valueType == \"datetime\") {\r\n return niceInterval = (!ej.util.isNullOrUndefined(axis.intervalType) && axis.intervalType.toLowerCase() == setInterval) ? Math.ceil(niceInterval) : niceInterval;\r\n }\r\n if (!ej.util.isNullOrUndefined(axis.range) && !ej.util.isNullOrUndefined(axis.range.max))\r\n return (niceInterval > maxLimit ? currentInterval : niceInterval);\r\n else\r\n return niceInterval;\r\n }\r\n\r\n niceInterval = currentInterval;\r\n }\r\n\r\n return niceInterval;\r\n },\r\n GetActualDesiredIntervalsCount: function (axis, size) {\r\n if (ej.util.isNullOrUndefined(axis.desiredIntervals)) {\r\n var desiredIntervalsCount = (axis.orientation.toLowerCase() == \"horizontal\" ? 0.533 : 1) * axis.maximumLabels;\r\n desiredIntervalsCount = Math.max((size * (desiredIntervalsCount / 100)), 1);\r\n\r\n return desiredIntervalsCount;\r\n } else {\r\n return axis.desiredIntervals;\r\n }\r\n },\r\n _calculateRange: function (axis, seriesCollection) {\r\n if (!this.chartObj.zoomed) {\r\n var defaultDate = new Date();\r\n if (seriesCollection.length > 0 && this.chartObj.model._hasSeriesPoints && seriesCollection[0].points.length > 0 || this.chartObj.model.indicators[0]._points.length > 0) {\r\n var maxX, minY;\r\n var maxY, minX;\r\n var maxMinXValue = { maxX: null, minX: null };\r\n var maxMinYValue = { maxY: null, minY: null };\r\n var pointLength;\r\n for (var i = 0; i < seriesCollection.length; i++) {\r\n pointLength = seriesCollection[i].points.length;\r\n if (pointLength > 0) {\r\n if (seriesCollection[i].visibility.toLowerCase() === 'visible' && seriesCollection[i].points.length > 0) {\r\n minX = maxX = new Date(seriesCollection[i].points[0].xValue);\r\n maxY = minY = seriesCollection[i].points[0].YValues[0];\r\n for (var j = 0; j < pointLength; j++) {\r\n if (minX != null && minX != undefined) {\r\n if (minX > seriesCollection[i].points[j].xValue)\r\n minX = seriesCollection[i].points[j].xValue;\r\n if (maxX < seriesCollection[i].points[j].xValue)\r\n maxX = seriesCollection[i].points[j].xValue;\r\n }\r\n else {\r\n minX = maxX = new Date(seriesCollection[i].points[j + 1].xValue);\r\n }\r\n if (minY > seriesCollection[i].points[j].YValues[0])\r\n minY = seriesCollection[i].points[j].YValues[0];\r\n if (maxY < seriesCollection[i].points[j].YValues[0])\r\n maxY = seriesCollection[i].points[j].YValues[0];\r\n }\r\n seriesCollection[i].minX = minX;\r\n seriesCollection[i].maxX = maxX;\r\n seriesCollection[i].minY = minY;\r\n seriesCollection[i].maxY = maxY;\r\n if (!axis.maxPointLength || axis.maxPointLength < pointLength)\r\n axis.maxPointLength = pointLength;\r\n }\r\n }\r\n\r\n if ((maxMinXValue.minX = (maxMinXValue.minX == null && typeof seriesCollection[i].minX != \"number\") ? seriesCollection[i].minX : maxMinXValue.minX) > seriesCollection[i].minX) {\r\n maxMinXValue.minX = (typeof seriesCollection[i].minX != \"number\") ? seriesCollection[i].minX : maxMinXValue.minX;\r\n }\r\n if ((maxMinXValue.maxX = (maxMinXValue.maxX == null && typeof seriesCollection[i].maxX != \"number\") ? seriesCollection[i].maxX : maxMinXValue.maxX) < seriesCollection[i].maxX) {\r\n maxMinXValue.maxX = (typeof seriesCollection[i].maxX != \"number\") ? seriesCollection[i].maxX : maxMinXValue.maxX;\r\n }\r\n if (maxMinYValue.minY > seriesCollection[i].minY) {\r\n maxMinYValue.minY = seriesCollection[i].minY;\r\n }\r\n if (maxMinYValue.maxY < seriesCollection[i].maxY) {\r\n maxMinYValue.maxY = seriesCollection[i].maxY;\r\n }\r\n\r\n }\r\n // Find min/max for indicator series\r\n\r\n if (this.chartObj.model.indicatorRange && this.chartObj.model.indicatorRange[axis.name]) {\r\n var value = this.chartObj.model.indicatorRange[axis.name];\r\n if (maxMinXValue.minX > new Date(value.min) || maxMinXValue.minX == null)\r\n maxMinXValue.minX = new Date(value.min);\r\n if (maxMinXValue.maxX < new Date(value.max) || maxMinXValue.maxX == null)\r\n maxMinXValue.maxX = new Date(value.max);\r\n }\r\n maxMinXValue.minX = (maxMinXValue.minX == null) ? defaultDate : maxMinXValue.minX;\r\n maxMinXValue.maxX = (maxMinXValue.maxX == null) ? new Date(new Date().setMonth(defaultDate.getMonth() + 5)) : maxMinXValue.maxX;\r\n if (maxMinXValue.minX == maxMinXValue.maxX) {\r\n maxMinXValue.minX = new Date(Date.parse(maxMinXValue.minX) - 2592000000);\r\n maxMinXValue.maxX = new Date(Date.parse(maxMinXValue.maxX) + 2592000000);\r\n }\r\n\r\n var data = _sideBySeriesPadding(this.chartObj, maxMinXValue.minX.getTime(), maxMinXValue.maxX.getTime(), axis);\r\n maxMinXValue.minX = new Date(data.startPadding);\r\n maxMinXValue.maxX = new Date(data.endPadding);\r\n\r\n\r\n\r\n var intervalX = this.calculateDateTimeNiceInterval(axis, maxMinXValue.minX, maxMinXValue.maxX);\r\n axis._intervalType = (axis.intervalType) ? axis.intervalType : intervalX.intervalType;\r\n if (axis.intervalType == \"auto\")\r\n axis._intervalType = axis.intervalType = intervalX.intervalType;\r\n if (axis.setAxisInterval == null || axis.setAxisInterval == undefined) {\r\n axis.setAxisInterval = (axis.range && axis.range.interval) ? true : false;\r\n }\r\n\r\n //condition chechked when changing interval dynamically\r\n if (axis._setInterval && !this.chartObj._chartResize && axis.range && axis._setInterval != axis.range.interval)\r\n axis._setInterval = null;\r\n\r\n if (!axis.setRange) {\r\n axis.range = { min: maxMinXValue.minX, max: maxMinXValue.maxX, interval: intervalX.interval };\r\n } else {\r\n if (!axis.range.max)\r\n axis.range.max = maxMinXValue.maxX;\r\n if (!axis.range.min)\r\n axis.range.min = maxMinXValue.minX;\r\n if (typeof axis.range.min == \"string\" && axis.range.min.indexOf(\"/Date(\") != -1)\r\n axis.range.min = new Date(parseInt(axis.range.min.substr(6)));\r\n if (typeof axis.range.max == \"string\" && axis.range.max.indexOf(\"/Date(\") != -1)\r\n axis.range.max = new Date(parseInt(axis.range.max.substr(6)));\r\n if (new Date(axis.range.min).getTime() == new Date(axis.range.max).getTime()) {\r\n axis.range.max = new Date(Date.parse(axis.range.max) + 86400000);\r\n }\r\n intervalX = this.calculateDateTimeNiceInterval(axis, new Date(axis.range.min), new Date(axis.range.max));\r\n axis._intervalType = (axis.intervalType) ? axis.intervalType : intervalX.intervalType;\r\n if (!axis.setAxisInterval) {\r\n axis.range.interval = intervalX.interval; // set auto interval value\r\n axis._setInterval = intervalX.interval;\r\n }\r\n axis.actual_Range = $.extend(true, {}, axis.range);\r\n axis.setRange = true;\r\n var interval = axis._setInterval ? intervalX.interval : (axis.range.interval || axis.actual_Range.interval);\r\n axis.range = { min: axis.actual_Range.min, max: axis.actual_Range.max, interval: interval };\r\n }\r\n } else {\r\n if (!axis.setRange) {\r\n axis.range = { min: defaultDate, max: new Date(new Date().setMonth(defaultDate.getMonth() + 5)), interval: 1 };\r\n axis._intervalType = ej.util.isNullOrUndefined(axis.intervalType) ? \"Months\" : axis.intervalType;\r\n }\r\n else {\r\n axis.range.min = (axis.range.min === null || axis.range.min === undefined) ? defaultDate : axis.range.min;\r\n axis.range.max = (axis.range.max === null || axis.range.max === undefined) ? new Date(new Date().setMonth(defaultDate.getMonth() + 5)) : axis.range.max;\r\n axis.range.interval = (axis.range.interval === null || axis.range.interval === undefined) ? 1 : axis.range.interval;\r\n axis._intervalType = 'Months';\r\n }\r\n\r\n }\r\n var commonAxisEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonAxisEventArgs.data = { range: axis.range, axis: axis };\r\n this.chartObj._trigger(\"axesRangeCalculate\", commonAxisEventArgs);\r\n var range = commonAxisEventArgs.data.range;\r\n axis.range = { min: range.min, max: range.max, interval: range.interval, delta: (range.max - range.min) };\r\n }\r\n },\r\n _calculateRanges: function (chartObj, axis, seriesCollection) {\r\n\r\n this.chartObj = chartObj;\r\n this._saveRange(chartObj, axis);\r\n this._calculateRange(axis, seriesCollection);\r\n axis._range = axis.range;\r\n if (chartObj.model._drawTrendline)\r\n this._calculateTrendLineRange(chartObj, axis, seriesCollection);\r\n\r\n this._calculatePadding(axis);\r\n\r\n this._calculateAxisLabels(axis);\r\n },\r\n _saveRange: function (chartObj, axis) {\r\n if (chartObj.zoomed || chartObj.resetZooming)\r\n axis.range = axis._range;\r\n //To check range is set in while redrawing the chart\r\n if (axis._initialRange) {\r\n if (axis._initialRange != axis.range && axis.range != null)\r\n axis.setRange = true;\r\n else if (axis.range == null)\r\n axis.setRange = false;\r\n }\r\n if (!chartObj.zoomed && !chartObj.resetZooming)\r\n axis._initialRange = axis.range == null ? { min: null, max: null, interval: null } : { min: axis.range.min, max: axis.range.max, interval: axis.range.interval };\r\n }\r\n };\r\n\r\n function ejExtendClass(parent, members) {\r\n var object = function () {\r\n };\r\n object.prototype = new parent();\r\n $.extend(object.prototype, members);\r\n return object;\r\n }\r\n\r\n //DateTime calculation\r\n var ejDateTimeValue = ejExtendClass(ej.EjAxisRenderer);\r\n ej.axisTypes.datetime = ejDateTimeValue;\r\n\r\n var ejDoubleValue = ejExtendClass(ej.EjAxisRenderer, {\r\n\r\n\r\n _calculateRange: function (chartObj, axis, seriesCollection, params) {\r\n if (!chartObj.zoomed) {\r\n this._seriesMinMax(chartObj, axis, seriesCollection, \"double\", params);\r\n }\r\n },\r\n\r\n _getDoubleAutoRange: function (axis, min, max) {\r\n var delta;\r\n var interval;\r\n var intervalstr;\r\n if (!axis.setRange) {\r\n axis.range = { min: min, max: max };\r\n\r\n } else {\r\n\r\n if (ej.util.isNullOrUndefined(axis.range.max))\r\n axis.range.max = max;\r\n if (ej.util.isNullOrUndefined(axis.range.min))\r\n axis.range.min = min;\r\n\r\n axis.actual_Range = $.extend(true, {}, axis.range);\r\n axis.setRange = true;\r\n }\r\n delta = axis.range.max - axis.range.min;\r\n interval = this.calculateNumericNiceInterval(delta, axis);\r\n if (ej.EjSvgRender.utils._decimalPlaces(interval) > 20) {\r\n intervalstr = interval.toString();\r\n interval = parseFloat((intervalstr.substring(0, intervalstr.indexOf(\".\")) + intervalstr.substring(intervalstr.indexOf(\".\"), 22)));\r\n }\r\n if ((ej.util.isNullOrUndefined(axis.range.interval)) || (axis.range.interval < 0))\r\n axis.range.interval = interval;\r\n axis.range.delta = delta;\r\n\r\n return axis.range;\r\n },\r\n _calculatePadding: function (chartObj, axis, baseRange) {\r\n var start = baseRange.min;\r\n var end = baseRange.max;\r\n var rangePadding = axis.rangePadding.toLowerCase();\r\n var interval = baseRange.interval;\r\n if ((!axis.setRange) && (!chartObj.zoomed)) {\r\n\r\n if (rangePadding == 'normal') {\r\n var minimum = 0, remaining;\r\n if (start < 0) {\r\n start = 0;\r\n minimum = baseRange.min + (baseRange.min / 20);\r\n\r\n remaining = interval + (minimum % interval);\r\n\r\n if ((0.365 * interval) >= remaining) {\r\n minimum -= interval;\r\n }\r\n\r\n if (minimum % interval < 0) {\r\n minimum = (minimum - interval) - (minimum % interval);\r\n }\r\n } else {\r\n minimum = start < ((5.0 / 6.0) * end)\r\n ? 0\r\n : (start - (end - start) / 2);\r\n if (minimum % interval > 0) {\r\n minimum -= (minimum % interval);\r\n }\r\n }\r\n if (end > 0)\r\n var maximum = ((end + (end - start) / 20) > Number.MAX_VALUE) ? Number.MAX_VALUE : (end + (end - start) / 20);\r\n else\r\n var maximum = (end - (end - start) / 20);\r\n\r\n remaining = interval - (maximum % interval);\r\n\r\n if ((0.365 * interval) >= remaining) {\r\n maximum = (maximum + interval > Number.MAX_VALUE) ? Number.MAX_VALUE : maximum + interval;\r\n }\r\n\r\n if (maximum % interval > 0) {\r\n maximum = ((maximum + interval) - (maximum % interval) > Number.MAX_VALUE) ? Number.MAX_VALUE : (maximum + interval) - (maximum % interval);\r\n }\r\n if (minimum <= 0) {\r\n interval = this.calculateNumericNiceInterval(maximum - minimum, axis);\r\n maximum = (Math.ceil(maximum / interval) * interval > Number.MAX_VALUE) ? Number.MAX_VALUE : Math.ceil(maximum / interval) * interval;\r\n }\r\n start = (!(axis.roundingPlaces)) ? parseFloat(minimum.toFixed((ej.EjSvgRender.utils._decimalPlaces(interval) == 0 ? 1 : ej.EjSvgRender.utils._decimalPlaces(interval)))) : parseFloat(minimum.toFixed(axis.roundingPlaces));\r\n end = (!(axis.roundingPlaces)) ? parseFloat(maximum.toFixed((ej.EjSvgRender.utils._decimalPlaces(interval) == 0 ? 1 : ej.EjSvgRender.utils._decimalPlaces(interval)))) : parseFloat(maximum.toFixed(axis.roundingPlaces));\r\n\r\n } else if (rangePadding == 'additional' || rangePadding == 'round') {\r\n start = Math.floor(start / interval) * interval;\r\n end = (Math.ceil(end / interval) * interval > Number.MAX_VALUE) ? Number.MAX_VALUE : Math.ceil(end / interval) * interval;\r\n if (rangePadding == 'additional') {\r\n start -= interval;\r\n end = end + interval >= Number.MAX_VALUE ? Number.MAX_VALUE : end + interval;\r\n }\r\n }\r\n\r\n\r\n }\r\n axis.actualRange.min = start;\r\n axis.actualRange.max = end;\r\n axis.actualRange.interval = interval;\r\n axis.range.min = start;\r\n axis.range.max = end;\r\n axis.range.interval = interval;\r\n axis.actualRange.delta = end - start >= Number.MAX_VALUE ? end : end - start;\r\n this._calculateVisibleRange(axis);\r\n },\r\n _calculateVisibleRange: function (axis, sender, isScroll) {\r\n this.chartObj = sender ? sender : this.chartObj;\r\n axis.visibleRange = (!isScroll) ? $.extend(true, {}, axis.actualRange) : axis.visibleRange;\r\n if ((axis.zoomFactor < 1 || axis.zoomPosition > 0) && this.chartObj.model.AreaType != \"polaraxes\" && !this.chartObj.model.disableZoom) {\r\n var baseRange = axis.actualRange;\r\n\r\n axis.zoomFactor = axis.zoomFactor > 1 ? 1 : (axis.zoomFactor < 0 ? 0 : axis.zoomFactor);\r\n axis.zoomPosition = axis.zoomPosition < 0 ? 0 : (axis.zoomPosition > 1 ? 1 : axis.zoomPosition);\r\n if (axis.isInversed) {\r\n var start = axis.actualRange.max - axis.zoomPosition * axis.actualRange.delta;\r\n var end = start - axis.zoomFactor * axis.actualRange.delta;\r\n }\r\n else {\r\n var start = axis.actualRange.min + axis.zoomPosition * axis.actualRange.delta;\r\n var end = start + axis.zoomFactor * axis.actualRange.delta;\r\n }\r\n\r\n if (start < baseRange.min) {\r\n end = end + (baseRange.min - start);\r\n start = baseRange.min;\r\n }\r\n\r\n if (end > baseRange.max) {\r\n start = start - (end - baseRange.max);\r\n end = baseRange.max;\r\n }\r\n\r\n var delta = Math.abs(end - start);\r\n var interval = axis.enableAutoIntervalOnZooming ? this.calculateNumericNiceInterval(delta, axis) : axis.actualRange.interval;\r\n if (isScroll) {\r\n return { min: Math.min(start, end), max: Math.max(start, end), delta: delta, interval: interval };\r\n }\r\n else {\r\n axis.visibleRange.min = Math.min(start, end);\r\n axis.visibleRange.max = Math.max(start, end);\r\n axis.visibleRange.delta = delta;\r\n axis.visibleRange.interval = interval;\r\n axis.zoomed = (this.chartObj.zoomed === null || this.chartObj.zoomed === undefined) ? true : this.chartObj.zoomed;\r\n }\r\n }\r\n\r\n },\r\n _calculateAxisLabels: function (chartObj, currentAxis) {\r\n\r\n var tempInterval,\r\n customFormat,\r\n round = currentAxis.roundingPlaces,\r\n tempPlace, labelValue,\r\n commonAxesEventArgs,\r\n labelText, locale = this.chartObj.model.locale,\r\n labelFormat = currentAxis.labelFormat, labelPrecision, labelPrecisionHighest = 20, labelPrecisionDefault = 6;\r\n if (chartObj.zoomed || currentAxis.zoomed || currentAxis.padding)\r\n tempInterval = currentAxis.visibleRange.min - (currentAxis.visibleRange.min % currentAxis.visibleRange.interval);\r\n else\r\n tempInterval = currentAxis.visibleRange.min;\r\n for (; tempInterval <= currentAxis.visibleRange.max; tempInterval += currentAxis.visibleRange.interval) {\r\n\r\n if (ej.EjSvgRender.utils._inside(tempInterval, currentAxis.visibleRange)) {\r\n tempPlace = (tempInterval.toString().split(0).length - 1 > 10) ? 10 : 20;\r\n tempInterval = parseFloat(tempInterval.toFixed((!round && round > tempPlace) ? round : tempPlace));\r\n //By default axis labels are rounded based on interval. These rounded values are not used to draw labels, so labels are misplaced from ticks\r\n labelValue = (!round) ? parseFloat(tempInterval.toFixed((ej.EjSvgRender.utils._decimalPlaces(currentAxis.visibleRange.interval) == 0 ? 1 : ej.EjSvgRender.utils._decimalPlaces(currentAxis.visibleRange.interval)))) : tempInterval;\r\n labelText = (!(round)) ? parseFloat(tempInterval.toFixed((ej.EjSvgRender.utils._decimalPlaces(currentAxis.visibleRange.interval) == 0 ? 1 : ej.EjSvgRender.utils._decimalPlaces(currentAxis.visibleRange.interval)))) : parseFloat(tempInterval.toFixed(round));\r\n\r\n customFormat = currentAxis.labelFormat;\r\n if (!(customFormat))\r\n labelText = !currentAxis.isStacked100 ? (!locale ? labelText : labelText.toLocaleString(locale)) : labelText + \"%\";\r\n else if (customFormat.match('{value}') != null)\r\n labelText = customFormat.replace('{value}', labelText);\r\n else if ((customFormat.indexOf('e') == 0 || customFormat.indexOf('E') == 0) && (customFormat.indexOf(\"ej.format\") == -1)) {\r\n labelPrecision = customFormat.match(/(\\d+)/g);\r\n labelPrecision = labelPrecision == null ? labelPrecisionDefault : labelPrecision > labelPrecisionHighest ? labelPrecisionHighest : labelPrecision;\r\n labelText = labelText.toExponential(labelPrecision);\r\n }\r\n else {\r\n if (customFormat.indexOf(\"ej.format\") != -1)\r\n customFormat = customFormat.substring(customFormat.indexOf(\"(\") + 1, customFormat.indexOf(\")\"));\r\n labelText = ej.format(labelText, customFormat, locale);\r\n }\r\n\r\n // customize label by event\r\n commonAxesEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonAxesEventArgs.data = { label: { Text: labelText, Value: tempInterval }, axis: currentAxis };\r\n chartObj._trigger(\"axesLabelRendering\", commonAxesEventArgs);\r\n currentAxis.visibleLabels.push({ Value: labelValue, Text: commonAxesEventArgs.data.label.Text });\r\n\r\n }\r\n }\r\n var rowCount = 0, labels = currentAxis.visibleLabels;\r\n for (var r = 0; r < labels.length; r++) {\r\n if (typeof labels[r].Text === 'string') {\r\n var labelLength = (labels[r].Text.split('
')).length;\r\n rowCount = Math.max(labelLength, rowCount);\r\n }\r\n }\r\n currentAxis.rowsCount = rowCount;\r\n currentAxis._LableMaxWidth = ej.EjSvgRender.utils._getMaxLabelWidth(currentAxis, this.chartObj);\r\n\r\n },\r\n\r\n _calculateRanges: function (chartObj, axis, seriesCollection, params) {\r\n this.chartObj = chartObj;\r\n this._saveRange(chartObj, axis);\r\n this._calculateRange(chartObj, axis, seriesCollection, params);\r\n axis._range = axis.range;\r\n if (chartObj.model._drawTrendline)\r\n this._calculateTrendLineRange(chartObj, axis, seriesCollection);\r\n\r\n this._calculatePadding(chartObj, axis, axis.range);\r\n\r\n if (axis.maximumLabels > 0) // to calculate only if labels have to be displayed\r\n this._calculateAxisLabels(chartObj, axis);\r\n\r\n }\r\n });\r\n ej.axisTypes.double = ejDoubleValue;\r\n //log axis\r\n var ejLogValue = ejExtendClass(ej.EjAxisRenderer, {\r\n\r\n // Get value for log min and max\r\n _getRoundValue: function (x, div, up) {\r\n return (up ? Math.ceil(x / div) : Math.floor(x / div)) * div;\r\n },\r\n\r\n // Caculate log nice interval\r\n calculateLogNiceInterval: function (delta, axis) {\r\n var desiredIntervalsCount = this.GetActualDesiredIntervalsCount(axis, axis.length);\r\n var niceInterval = delta;\r\n var minInterval = Math.pow(10, Math.floor(ej.EjSvgRender.utils._logBase(niceInterval, 10)));\r\n var intervalDivs = [10, 5, 2, 1];\r\n\r\n for (var i = 0; i < intervalDivs.length; i++) {\r\n var currentInterval = minInterval * intervalDivs[i];\r\n if (desiredIntervalsCount < (delta / currentInterval)) {\r\n return niceInterval;\r\n }\r\n\r\n niceInterval = currentInterval;\r\n }\r\n\r\n return niceInterval;\r\n },\r\n\r\n // Get log value for auto range\r\n _getLogAutoRange: function (axis, min, max, delta) {\r\n\r\n var logStart = ej.EjSvgRender.utils._logBase(min, axis.logBase);\r\n logStart = $.isNumeric(logStart) ? logStart : min;\r\n var logEnd = ej.EjSvgRender.utils._logBase(max, axis.logBase);\r\n logEnd = $.isNumeric(logEnd) ? logEnd : max;\r\n\r\n var mulS = this._getRoundValue(logStart, 1, false);\r\n var mulE = this._getRoundValue(logEnd, 1, true);\r\n if (mulS == 0 && mulE == 0) {\r\n mulS = ej.EjSvgRender.utils._logBase((max - max / 2), axis.logBase);\r\n mulE = ej.EjSvgRender.utils._logBase((max + max / 2), axis.logBase);\r\n }\r\n delta = mulE - mulS;\r\n var interval = this.calculateLogNiceInterval(delta, axis);\r\n\r\n axis.actual_Range = { min: mulS, max: mulE, interval: interval, Delta: delta };\r\n\r\n mulS = Math.pow(axis.logBase, Math.floor(logStart));\r\n mulE = Math.pow(axis.logBase, Math.ceil(logEnd));\r\n\r\n delta = mulE - mulS;\r\n\r\n if (!axis.setRange) {\r\n\r\n return axis.range = { min: mulS, max: mulE, interval: interval, Delta: delta };\r\n\r\n } else {\r\n if (ej.util.isNullOrUndefined(axis.range.interval))\r\n axis.range.interval = interval;\r\n if (ej.util.isNullOrUndefined(axis.range.max))\r\n axis.range.max = mulE;\r\n if (ej.util.isNullOrUndefined(axis.range.min))\r\n axis.range.min = mulS;\r\n\r\n axis.actual_Range = $.extend(true, {}, axis.range);\r\n\r\n if (!ej.util.isNullOrUndefined(axis.actual_Range.max)) {\r\n axis.actual_Range.max = ej.EjSvgRender.utils._logBase(axis.actual_Range.max, axis.logBase);\r\n axis.actual_Range.max = this._getRoundValue(axis.actual_Range.max, 1, true);\r\n }\r\n if (!ej.util.isNullOrUndefined(axis.range.min)) {\r\n axis.actual_Range.min = ej.EjSvgRender.utils._logBase(axis.actual_Range.min, axis.logBase);\r\n axis.actual_Range.min = this._getRoundValue(axis.actual_Range.min, 1, false);\r\n }\r\n\r\n axis.setRange = true;\r\n\r\n return axis.range;\r\n }\r\n },\r\n\r\n //Calcualte auto log range from series\r\n _calculateLogRange: function (chartObj, axis, seriesCollection, params) {\r\n if (!chartObj.zoomed) {\r\n this._seriesMinMax(chartObj, axis, seriesCollection, \"logarithmic\", params);\r\n }\r\n },\r\n\r\n //Assign base range values to actual range\r\n _calculateLogPadding: function (chartObj, axis, baseRange) {\r\n // No padding support for log axis\r\n var start = baseRange.min;\r\n var end = baseRange.max;\r\n var interval = baseRange.interval;\r\n axis.actualRange.min = start;\r\n axis.actualRange.max = end;\r\n axis.actualRange.interval = interval;\r\n axis.actualRange.delta = end - start;\r\n this._calculateVisibleRange(axis);\r\n },\r\n\r\n // Calculate visible range for zooming\r\n _calculateVisibleRange: function (axis, sender, isScroll) {\r\n this.chartObj = sender ? sender : this.chartObj;\r\n axis.visibleRange = (!isScroll) ? $.extend(true, {}, axis.actualRange) : axis.visibleRange;\r\n if ((axis.zoomFactor < 1 || axis.zoomPosition > 0) && this.chartObj.model.AreaType != \"polaraxes\" && !this.chartObj.model.disableZoom) {\r\n axis.zoomFactor = axis.zoomFactor > 1 ? 1 : (axis.zoomFactor < 0 ? 0 : axis.zoomFactor);\r\n axis.zoomPosition = axis.zoomPosition < 0 ? 0 : (axis.zoomPosition > 1 ? 1 : axis.zoomPosition);\r\n var baseRange = axis.actualRange;\r\n if (axis.isInversed) {\r\n var start = axis.actualRange.max - axis.zoomPosition * axis.actualRange.delta;\r\n var end = start - axis.zoomFactor * axis.actualRange.delta;\r\n }\r\n else {\r\n var start = axis.actualRange.min + axis.zoomPosition * axis.actualRange.delta;\r\n var end = start + axis.zoomFactor * axis.actualRange.delta;\r\n }\r\n\r\n if (start < baseRange.min) {\r\n end = end + (baseRange.min - start);\r\n start = baseRange.min;\r\n }\r\n\r\n if (end > baseRange.max) {\r\n start = start - (end - baseRange.max);\r\n end = baseRange.max;\r\n }\r\n var delta = Math.abs(end - start);\r\n var interval = axis.enableAutoIntervalOnZooming ? (this.calculateLogNiceInterval(delta, axis)) : axis.visibleRange.interval;\r\n var factor = (ej.util.isNullOrUndefined(axis.roundingPlaces)) ?\r\n (ej.EjSvgRender.utils._decimalPlaces(axis.visibleRange.interval) == 0 ? 1\r\n : ej.EjSvgRender.utils._decimalPlaces(axis.visibleRange.interval)) : axis.roundingPlaces;\r\n interval = parseFloat(axis.visibleRange.interval.toFixed(factor));\r\n if (isScroll)\r\n return { min: Math.min(start, end), max: Math.max(start, end), interval: interval };\r\n else {\r\n axis.visibleRange.interval = interval;\r\n axis.visibleRange.min = Math.min(start, end);\r\n axis.visibleRange.max = Math.max(start, end);\r\n axis.visibleRange.delta = delta;\r\n axis.zoomed = (this.chartObj.zoomed === null || this.chartObj.zoomed === undefined) ? true : this.chartObj.zoomed;\r\n }\r\n }\r\n\r\n },\r\n\r\n //Method implementation for Generate Labels in ChartAxis\r\n _calculateAxisLabels: function (chartObj, currentAxis) {\r\n\r\n var tempInterval, round = currentAxis.roundingPlaces;\r\n if (chartObj.zoomed || currentAxis.zoomed)\r\n tempInterval = currentAxis.visibleRange.min - (currentAxis.visibleRange.min % currentAxis.visibleRange.interval);\r\n else\r\n tempInterval = currentAxis.visibleRange.min;\r\n for (; tempInterval <= currentAxis.visibleRange.max; tempInterval += currentAxis.visibleRange.interval) {\r\n\r\n\r\n if (ej.EjSvgRender.utils._inside(tempInterval, currentAxis.visibleRange)) {\r\n var customFormat = (!(currentAxis.labelFormat)) ? null : currentAxis.labelFormat.match('{value}');\r\n var tempIntervaltext = Math.pow(currentAxis.logBase, tempInterval),\r\n tempPlace = (tempIntervaltext.toString().split(0).length - 1 > 10) ? 10 : 20;\r\n tempIntervaltext = parseFloat(tempIntervaltext.toFixed((!round && round > tempPlace) ? round : tempPlace));\r\n\r\n var labelText = (!(currentAxis.labelFormat)) ? tempIntervaltext : (customFormat != null) ?\r\n currentAxis.labelFormat.replace('{value}', tempIntervaltext) :\r\n (ej.format(tempIntervaltext, currentAxis.labelFormat, chartObj.model.locale));\r\n // customize label by event\r\n var commonAxesEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonAxesEventArgs.data = { label: { Text: labelText, Value: tempInterval }, axis: currentAxis };\r\n chartObj._trigger(\"axesLabelRendering\", commonAxesEventArgs);\r\n currentAxis.visibleLabels.push({ Value: tempInterval, Text: commonAxesEventArgs.data.label.Text });\r\n }\r\n }\r\n\r\n currentAxis._LableMaxWidth = ej.EjSvgRender.utils._getMaxLabelWidth(currentAxis, this.chartObj);\r\n\r\n },\r\n\r\n\r\n //Category axis calculation\r\n _calculateRanges: function (chartObj, axis, seriesCollection, params) {\r\n this.chartObj = chartObj;\r\n this._calculateLogRange(chartObj, axis, seriesCollection, params);\r\n if (chartObj.model._drawTrendline)\r\n this._calculateTrendLineRange(chartObj, axis, seriesCollection);\r\n this._calculateLogPadding(chartObj, axis, axis.actual_Range);\r\n this._calculateAxisLabels(chartObj, axis);\r\n }\r\n\r\n\r\n });\r\n ej.axisTypes.logarithmic = ejLogValue;\r\n\r\n //Category Axes calculation\r\n var ejCategoryValue = ejExtendClass(ej.EjAxisRenderer, {\r\n //axis range calculation and assign indexed value to x value of points\r\n _calculateCategoryRange: function (axis, seriesCollection) {\r\n var legendCollapsed = (this.chartObj.model.legendCollapsed == undefined) ? !this.chartObj.zoomed : this.chartObj.model.legendCollapsed;\r\n if (!this.chartObj.model.excludeDataUpdate || legendCollapsed) {\r\n var maxXValue = { maxX: null, minX: 0 },\r\n labels = [],\r\n pointX,\r\n intervalX,\r\n deltaX,\r\n index,\r\n pointsLength,\r\n isIndex = axis.isIndexed,\r\n locale = this.chartObj.model.locale;\r\n if (seriesCollection.length > 0 && this.chartObj.model._hasSeriesPoints && seriesCollection[0].points.length > 0 || this.chartObj.model.indicators[0]._points.length > 0) {\r\n for (var m = 0; m < seriesCollection.length; m++) {\r\n pointsLength = seriesCollection[m].points.length;\r\n for (var n = 0; n < pointsLength; n++) {\r\n if (seriesCollection[m]._xAxisValueType == \"date\")\r\n pointX = ej.format(new Date(seriesCollection[m].points[n].x), (ej.util.isNullOrUndefined(axis.labelFormat) ? \"dd/MM/yyyy\" : axis.labelFormat), locale);\r\n else\r\n pointX = seriesCollection[m].points[n].x;\r\n if (!isIndex) {\r\n index = $.inArray(pointX, labels);\r\n if (index < 0)\r\n labels.push(pointX);\r\n }\r\n else {\r\n if (m == 0)\r\n labels[n] = pointX;\r\n else\r\n labels[n] = labels[n] + \", \" + pointX;\r\n }\r\n\r\n }\r\n if (!axis.maxPointLength || axis.maxPointLength < pointsLength)\r\n axis.maxPointLength = pointsLength;\r\n }\r\n for (var l = 0; l < seriesCollection.length; l++) {\r\n seriesCollection[l]._pointCollection = [];\r\n for (var k = 0; k < seriesCollection[l].points.length; k++) {\r\n seriesCollection[l]._pointCollection.push(seriesCollection[l].points[k].x);\r\n if (seriesCollection[l]._xAxisValueType == \"date\")\r\n pointX = ej.format(new Date(seriesCollection[l].points[k].x), (ej.util.isNullOrUndefined(axis.labelFormat) ? \"dd/MM/yyyy\" : axis.labelFormat), locale);\r\n else\r\n pointX = seriesCollection[l].points[k].x;\r\n if (!isIndex)\r\n seriesCollection[l].points[k].xValue = $.inArray(pointX, labels);\r\n else\r\n seriesCollection[l].points[k].xValue = k;\r\n\r\n }\r\n seriesCollection[l].minX = 0;\r\n seriesCollection[l].maxX = (seriesCollection[l]._xAxisValueType == \"date\") ? seriesCollection[l]._pointCollection.length - 1 : labels.length - 1;\r\n // To find maximum x value of axis from series collection\r\n if (l == 0) {\r\n maxXValue.maxX = seriesCollection[l].maxX;\r\n axis.labels = (seriesCollection[l]._xAxisValueType == \"date\") ? seriesCollection[l]._pointCollection : labels;\r\n axis._categoryValueType = seriesCollection[l]._xAxisValueType;\r\n }\r\n if (maxXValue.maxX < (seriesCollection[l].maxX)) {\r\n maxXValue.maxX = seriesCollection[l].maxX;\r\n axis.labels = [];\r\n axis.labels = labels;\r\n }\r\n }\r\n if (this.chartObj.model.indicatorRange && this.chartObj.model.indicatorRange[axis.name]) {\r\n var value = this.chartObj.model.indicatorRange[axis.name];\r\n if (maxXValue.minX > value.min || maxXValue.minX == null)\r\n maxXValue.minX = value.min;\r\n if (maxXValue.maxX < value.max || maxXValue.maxX == null)\r\n maxXValue.maxX = value.max;\r\n }\r\n\r\n deltaX = maxXValue.maxX - maxXValue.minX;\r\n\r\n if (axis.setRange && axis.range.interval) {\r\n intervalX = Math.ceil(axis.range.interval);\r\n }\r\n else {\r\n intervalX = this._calculateActualInterval(deltaX, axis);\r\n }\r\n\r\n axis.range = { min: maxXValue.minX, max: maxXValue.maxX, interval: intervalX, Delta: deltaX };\r\n }\r\n else {\r\n var labelLength = axis.labels.length;\r\n if (labelLength > 0) {\r\n deltaX = labelLength - 1;\r\n intervalX = this._calculateActualInterval(deltaX, axis);\r\n axis.range = { min: 0, max: labelLength - 1, interval: intervalX, Delta: deltaX };\r\n }\r\n else if (!axis.range) // set default range when no series points added to category axes\r\n axis.range = { min: 0, max: 6, interval: 1, Delta: 6 };\r\n }\r\n }\r\n var rowCount = 0, r, intersectAction = axis.labelIntersectAction, labelRotation = axis.labelRotation;\r\n if ((intersectAction != \"rotate45\" || intersectAction != \"rotate90\") && (labelRotation == 0 || labelRotation == null)) {\r\n for (r = 0; r < axis.labels.length; r++) {\r\n if (typeof axis.labels[r] == \"string\") {\r\n var labelLength = (axis.labels[r].split('
')).length;\r\n rowCount = Math.max(labelLength, rowCount);\r\n }\r\n }\r\n }\r\n axis.rowsCount = rowCount;\r\n },\r\n\r\n //Calculates actual interval\r\n _calculateActualInterval: function (delta, axis) {\r\n if (axis.categoryInterval == null)\r\n return Math.max(1, Math.floor(delta / this.GetActualDesiredIntervalsCount(axis, axis.length)));\r\n else\r\n return axis.categoryInterval;\r\n },\r\n\r\n //Apply padding based on labelPlacement\r\n _applyRangePadding: function (axis) {\r\n if (!this.chartObj.zoomed && !this.chartObj._scrollBarEnabled && !axis.zoomed) {\r\n // ticks based on labelplacement and polaraxes\r\n var ticks = 0;\r\n if (this.chartObj.model.AreaType !== 'polaraxes')\r\n ticks = ((axis.labelPlacement === null || axis.labelPlacement === undefined || axis.labelPlacement === \"\")) ? -0.5 : (axis.labelPlacement.toLowerCase() == \"betweenticks\") ? (-0.5) : 0;\r\n if (!this.chartObj.scrollsvgObj) {\r\n if (ticks < 0) {\r\n axis.range.min = axis.range.min + ticks;\r\n axis.range.max = axis.range.max - ticks;\r\n axis.range.delta = axis.range.max - axis.range.min;\r\n axis.actualRange = axis.range;\r\n } else {\r\n var data = _sideBySeriesPadding(this.chartObj, axis.range.min, axis.range.max, axis);\r\n axis.range.min = data.startPadding;\r\n axis.range.max = data.endPadding;\r\n axis.range.delta = axis.range.max - axis.range.min;\r\n axis.actualRange = axis.range;\r\n }\r\n }\r\n }\r\n this._calculateVisibleRange(axis);\r\n },\r\n\r\n //Calculates the visible range \r\n _calculateVisibleRange: function (axis, sender, isScroll) {\r\n this.chartObj = sender ? sender : this.chartObj;\r\n axis.visibleRange = (!isScroll) ? $.extend(true, {}, axis.actualRange) : axis.visibleRange;\r\n if ((axis.zoomFactor < 1 || axis.zoomPosition > 0) && this.chartObj.model.AreaType != \"polaraxes\" && !this.chartObj.model.disableZoom) {\r\n axis.zoomFactor = axis.zoomFactor > 1 ? 1 : (axis.zoomFactor < 0 ? 0 : axis.zoomFactor);\r\n axis.zoomPosition = axis.zoomPosition < 0 ? 0 : (axis.zoomPosition > 1 ? 1 : axis.zoomPosition);\r\n var baseRange = axis.actualRange;\r\n if (axis.isInversed) {\r\n var start = axis.actualRange.max - axis.zoomPosition * axis.actualRange.delta;\r\n var end = start - axis.zoomFactor * axis.actualRange.delta;\r\n }\r\n else {\r\n var start = axis.actualRange.min + (axis.zoomPosition * axis.actualRange.delta);\r\n var end = start + axis.zoomFactor * axis.actualRange.delta;\r\n }\r\n\r\n if (start < baseRange.min) {\r\n end = end + (baseRange.min - start);\r\n start = baseRange.min;\r\n }\r\n\r\n if (end > baseRange.max) {\r\n start = start - (end - baseRange.max);\r\n end = baseRange.max;\r\n }\r\n var delta = Math.abs(end - start);\r\n var interval = this._calculateActualInterval(delta, axis);\r\n var min = Math.min(start, end);\r\n var max = Math.max(start, end);\r\n if (isScroll) {\r\n return { min: min, max: max, interval: interval };\r\n }\r\n else {\r\n var delta = Math.abs(end - start);\r\n axis.visibleRange.interval = interval;\r\n axis.visibleRange.min = min;\r\n axis.visibleRange.max = max;\r\n axis.visibleRange.delta = delta;\r\n axis.zoomed = (this.chartObj.zoomed === null || this.chartObj.zoomed === undefined) ? true : this.chartObj.zoomed;\r\n }\r\n }\r\n\r\n },\r\n\r\n //Generate category label for axis\r\n _calculateAxisLabels: function (axis) {\r\n var interval = axis.visibleRange.interval;\r\n var position = axis.visibleRange.min - (axis.visibleRange.min % axis.range.interval);\r\n for (; position <= axis.visibleRange.max; position += interval) {\r\n if (ej.EjSvgRender.utils._inside(position, axis.visibleRange)) {\r\n var pos = Math.round(position);\r\n axis.visibleLabels.push({ Value: pos, Text: ej.EjSvgRender.utils._getLabelContent(pos, axis, this.chartObj.model.locale) });\r\n\r\n // customize label by event\r\n var commonAxesEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonAxesEventArgs.data = { label: axis.visibleLabels[axis.visibleLabels.length - 1], axis: axis };\r\n this.chartObj._trigger(\"axesLabelRendering\", commonAxesEventArgs);\r\n axis.visibleLabels[axis.visibleLabels.length - 1] = commonAxesEventArgs.data.label;\r\n }\r\n }\r\n axis._LableMaxWidth = ej.EjSvgRender.utils._getMaxLabelWidth(axis, this.chartObj);\r\n },\r\n\r\n //Category axis calculation\r\n _calculateRanges: function (chartObj, axis, seriesCollection) {\r\n this.chartObj = chartObj;\r\n this._saveRange(chartObj, axis);\r\n this._calculateCategoryRange(axis, seriesCollection);\r\n axis._range = axis.range;\r\n if (chartObj.model._drawTrendline)\r\n this._calculateTrendLineRange(chartObj, axis, seriesCollection);\r\n this._applyRangePadding(axis);\r\n\r\n this._calculateAxisLabels(axis);\r\n }\r\n });\r\n ej.axisTypes.category = ejCategoryValue;\r\n\r\n // for Datetime category axis calculation\r\n\r\n var ejDateTimeCategory = ejExtendClass(ej.EjAxisRenderer, {\r\n _calculateDateTimeCategoryRange: function (axis, seriesCollection) {\r\n ///Variables declaration part here ///\r\n var xRange = { minX: 0, MaxX: null }, xLabels = [], xValue = [], xPoint, index, index1, deltaX, intervalX,\r\n prevDateVal, points, xVerfiedPoints = [], dateDouble, xValues = [], dateLabels = [],\r\n xDateVal, xVal, previous, current, pointsLength, point, m, pt, ser;\r\n for (ser = 0; ser < seriesCollection.length; ser++) {\r\n seriesCollection[ser]._pointCollection = [], points = [], seriesCollection[ser]._points = [], seriesCollection[ser]._xPoints = [], seriesCollection[ser]._yPoints = [],\r\n pointsLength = seriesCollection[ser].points.length;\r\n for (pt = 0; pt < pointsLength; pt++) {\r\n dateDouble = !isNaN(new Date(seriesCollection[ser].points[pt].x).getTime()) ? new Date(seriesCollection[ser].points[pt].x).getTime() : null;\r\n if (points.indexOf(dateDouble) != -1) {\r\n seriesCollection[ser].points[pt].xValue = points.indexOf(dateDouble);\r\n }\r\n points.push(dateDouble);\r\n seriesCollection[ser]._xPoints.push(dateDouble);\r\n seriesCollection[ser]._yPoints.push(seriesCollection[ser].points[pt].y);\r\n if (dateDouble != null)\r\n xValues.push(dateDouble);\r\n }\r\n if (ej.isNullOrUndefined(axis.intervalType)) {\r\n intervalX = this.calculateDateTimeNiceInterval(axis, new Date(Math.min.apply(null, xValues)), new Date(Math.max.apply(null, xValues)));\r\n axis.intervalType = intervalX.intervalType.toLowerCase();\r\n }\r\n for (point = 0; point < points.length; point++) {\r\n xPoint = new Date(points[point]);\r\n if (seriesCollection[ser]._points.indexOf(xPoint.getTime()) == -1)\r\n seriesCollection[ser]._points.push(xPoint.getTime());\r\n var ySortPos = $.inArray(points[point], seriesCollection[ser]._xPoints);\r\n seriesCollection[ser]._pointCollection.push(new Date(seriesCollection[ser].points[point].x));\r\n if (ser == 0) {\r\n if (seriesCollection[ser].points[point].x == seriesCollection[ser].points[point].xValue)\r\n seriesCollection[ser].points[point].xValue = point;\r\n }\r\n else {\r\n for (var i = 0; i < ser; i++) {\r\n index1 = $.inArray(new Date(seriesCollection[ser].points[point].x).getTime(), seriesCollection[i]._points);\r\n if (index1 >= 0) {\r\n if (i == 0)\r\n seriesCollection[ser].points[point].xValue = index1;\r\n else {\r\n seriesCollection[ser].points[point].xValue = seriesCollection[i].points[index1].xValue;\r\n }\r\n break;\r\n }\r\n else if (i == ser - 1) {\r\n if (seriesCollection[ser].points[point].x == seriesCollection[ser].points[point].xValue) {\r\n seriesCollection[ser].points[point].xValue = axis.maxPointLength++;\r\n }\r\n else {\r\n var ind = seriesCollection[ser].points[point].xValue;\r\n seriesCollection[ser].points[point].xValue = seriesCollection[ser].points[ind].xValue;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n index = (ser == 0) ? -1 : $.inArray(xPoint.getTime(), xVerfiedPoints);\r\n switch (axis.intervalType) {\r\n case \"auto\": // for auto calculate\r\n if (xLabels.indexOf(xPoint.getTime()) == -1)\r\n xLabels.push(xPoint.getTime());\r\n break;\r\n case \"years\": // for years calculate\r\n xVal = xPoint.getFullYear();\r\n break;\r\n case \"months\": // for months calculate\r\n current = xPoint.getFullYear();\r\n xDateVal = xPoint.getMonth();\r\n if (point <= 0) xVal = point + 1;\r\n else {\r\n previous = new Date(points[point - 1]).getFullYear();\r\n xVal += (current != previous) ? ((12 - prevDateVal) + (xDateVal)) : (xDateVal - prevDateVal);\r\n }\r\n prevDateVal = xDateVal;\r\n break;\r\n case \"days\": // for days calculate\r\n current = xPoint.getMonth();\r\n xDateVal = xPoint.getDate();\r\n if (point <= 0) xVal = point + 1;\r\n else {\r\n previous = new Date(points[point - 1]).getMonth();\r\n xVal += (current != previous) ? (((new Date(xPoint.getFullYear(), previous, 1).getDate() - prevDateVal) + (xDateVal))) : (xDateVal - prevDateVal);\r\n if (current == previous) {\r\n var diff = this._diffDate(xPoint, new Date(points[point - 1]), 1);\r\n var days = (new Date(xPoint.getFullYear(), previous, 0).getDate());\r\n xVal = (diff > days) ? (xValue[xValue.length - 1]) + 1 : xVal;\r\n }\r\n }\r\n prevDateVal = xDateVal;\r\n break;\r\n case \"hours\": // for hours calculate\r\n current = xPoint.getDate();\r\n xDateVal = xPoint.getHours();\r\n if (point <= 0) xVal = point + 1;\r\n else {\r\n previous = new Date(points[point - 1]).getDate();\r\n xVal += (current != previous) ? ((24 - prevDateVal) + (xDateVal)) : (xDateVal - prevDateVal);\r\n if (current == previous) {\r\n var diff = this._diffDate(xPoint, new Date(points[point - 1]), 24);\r\n xVal = (diff > 24) ? (xValue[xValue.length - 1]) + 1 : xVal;\r\n }\r\n }\r\n prevDateVal = xDateVal;\r\n break;\r\n case \"minutes\": // for minutes calculate\r\n current = xPoint.getHours();\r\n xDateVal = xPoint.getMinutes();\r\n if (point <= 0) xVal = point + 1;\r\n else {\r\n previous = new Date(points[point - 1]).getHours();\r\n xVal += (current != previous) ? ((60 - prevDateVal) + (xDateVal)) : (xDateVal - prevDateVal);\r\n if (current == previous) {\r\n var diff = this._diffDate(xPoint, new Date(points[point - 1]), (24 * 60));\r\n xVal = (diff > 60) ? (xValue[xValue.length - 1]) + 1 : xVal;\r\n }\r\n }\r\n prevDateVal = xDateVal;\r\n break;\r\n case \"seconds\": // for seconds calculate\r\n current = xPoint.getMinutes();\r\n xDateVal = xPoint.getSeconds();\r\n if (point <= 0) xVal = point + 1;\r\n else {\r\n previous = new Date(points[point - 1]).getMinutes();\r\n xVal += (current != previous) ? ((60 - prevDateVal) + (xDateVal)) : (xDateVal - prevDateVal);\r\n if (current == previous) {\r\n var diff = this._diffDate(xPoint, new Date(points[point - 1]), (24 * 60 * 60));\r\n xVal = (diff > 60) ? (xValue[xValue.length - 1]) + 1 : xVal;\r\n }\r\n }\r\n prevDateVal = xDateVal;\r\n break;\r\n case \"milliseconds\": // for milliseconds calculate\r\n current = xPoint.getSeconds();\r\n xDateVal = xPoint.getMilliseconds();\r\n if (point <= 0) xVal = point + 1;\r\n else {\r\n previous = new Date(points[point - 1]).getSeconds();\r\n xVal += (current != previous) ? ((1000 - prevDateVal) + (xDateVal)) : (xDateVal - prevDateVal);\r\n if (current == previous) {\r\n var diff = this._diffDate(xPoint, new Date(points[point - 1]), (24 * 60 * 60 * 1000));\r\n xVal = (diff > 1000) ? (xValue[xValue.length - 1]) + 1 : xVal;\r\n }\r\n }\r\n prevDateVal = xDateVal;\r\n break;\r\n }\r\n if (axis.intervalType != \"auto\" && xLabels.indexOf(xPoint.getTime()) == -1)\r\n xLabels.push(xPoint.getTime());\r\n xVal = (ser == 0) ? xVal : xValue[xValue.length - 1] + xVal;\r\n if (xValue.indexOf(xVal) == -1)\r\n xValue.push(xVal);\r\n dateLabels.push(xVal);\r\n xVerfiedPoints.push(new Date(points[point]).getTime());\r\n }\r\n if (!axis.maxPointLength) {\r\n if (axis.intervalType != \"auto\")\r\n axis.maxPointLength = xValue.length;\r\n else\r\n axis.maxPointLength = xLabels.length;\r\n }\r\n }\r\n for (m = 0; m < seriesCollection.length; m++) { // set the min and max range for axis\r\n if (!axis.setRange) axis.range = { min: null, max: null, interval: null };\r\n if (!ej.isNullOrUndefined(axis.m_minPointsDelta)) axis.m_minPointsDelta = undefined;\r\n seriesCollection[m].minX = (ej.isNullOrUndefined(axis.range.min)) ? 0 : (axis.range.min < xRange.minX) ? 0 : axis.range.min;\r\n seriesCollection[m].maxX = (ej.isNullOrUndefined(axis.range.max)) ? xLabels.length - 1 : (axis.range.max > xLabels.length - 1) ? xLabels.length - 1 : axis.range.max;\r\n xRange.MaxX = seriesCollection[m].maxX;\r\n xRange.minX = seriesCollection[m].minX;\r\n axis.labels = xLabels;\r\n axis.dateLabels = dateLabels;\r\n axis._categoryValueType = \"date\";\r\n }\r\n if (xRange.minX == xRange.MaxX && axis.labelPlacement.toLowerCase() == \"onticks\") xRange.MaxX += 1;\r\n if (seriesCollection.length > 0) {\r\n deltaX = xRange.MaxX - xRange.minX;\r\n intervalX = ((axis.range.interval == null || axis.range.interval == undefined)) ? 1 : (axis.range.interval < 1) ? 1 : Math.ceil(axis.range.interval);\r\n axis.range = { min: xRange.minX, max: xRange.MaxX, interval: intervalX, Delta: deltaX };\r\n }\r\n else if (!axis.setInterval) {\r\n axis.range = { min: 0, max: 6, interval: 1, Delta: 6 };\r\n axis.dateLabels = [];\r\n for (var i = 0; i <= axis.range.max; i++) {\r\n axis.labels.push(\"\");\r\n axis.dateLabels.push(\"\");\r\n }\r\n }\r\n },\r\n\r\n _diffDate: function (currentPoint, previousPoint, mul) {\r\n var oneDay, diff;\r\n oneDay = 24 * 60 * 60 * 1000;\r\n diff = (Math.abs((currentPoint.getTime() - previousPoint.getTime())) / (oneDay));\r\n return (Math.round(diff * mul));\r\n },\r\n\r\n _calculateAxisLabels: function (axis) // calculate visible labels for axis\r\n {\r\n var interval = axis.visibleRange.interval, currentLabels = [], count = 0, seriesCollection = this.chartObj.model.series.length,\r\n prevLabelVal, pos, arr, currentLabel, expectLabel, index, i, isCurrentLabel, isNextLabel, commonAxesEventArgs;\r\n var position = axis.visibleRange.min - (axis.visibleRange.min % axis.range.interval);\r\n for (; position <= axis.visibleRange.max; position += interval) {\r\n if (ej.EjSvgRender.utils._inside(position, axis.visibleRange)) {\r\n pos = Math.round(position);\r\n arr = axis.dateLabels;\r\n //Commented for the issue JS-55566\r\n //if (axis.intervalType != \"auto\") {\r\n // if (count > 0 && interval > 1) {\r\n // if (pos > arr.length - 1)\r\n // pos = arr.length - 1;\r\n // currentLabel = arr[count];\r\n // expectLabel = prevLabelVal + interval;\r\n // isCurrentLabel = $.inArray(currentLabel, arr);\r\n // isNextLabel = $.inArray(expectLabel, arr);\r\n // if (isCurrentLabel > 0 && (Math.abs(currentLabel - prevLabelVal) == interval) && currentLabel > prevLabelVal) {\r\n // pos = isCurrentLabel;\r\n // prevLabelVal = arr[pos];\r\n // }\r\n // else {\r\n // for (i = 0; i < i + 1; i++) {\r\n // expectLabel += (i == 0) ? i : 1;\r\n // isNextLabel = $.inArray(expectLabel, arr);\r\n // if (isNextLabel > 0) {\r\n // pos = isNextLabel;\r\n // prevLabelVal = arr[pos];\r\n // break;\r\n // }\r\n // }\r\n // }\r\n // }\r\n //}\r\n //count++;\r\n if (!ej.util.isNullOrUndefined(arr)) {\r\n if (((arr[arr.length - 1] - arr[pos]) >= interval) && (axis.visibleRange.max < (position + interval))) axis.visibleRange.max += ((position + interval) - axis.visibleRange.max);\r\n index = $.inArray(arr[pos], currentLabels);\r\n }\r\n if ((index < 0 || axis.intervalType == \"auto\" || seriesCollection == 0) && (pos < axis.labels.length)) {\r\n if (axis.intervalType != \"auto\") {\r\n prevLabelVal = arr[pos];\r\n currentLabels.push(prevLabelVal);\r\n }\r\n axis.visibleLabels.push({ Value: pos, Text: ((!(axis.labelFormat) && axis.labels[Math.floor(pos)] != \"\") ? ej.format(new Date(axis.labels[Math.floor(pos)]), ej.EjSvgRender.utils._dateTimeLabelFormat(axis.intervalType, axis), this.chartObj.model.locale) : ej.EjSvgRender.utils._getLabelContent(pos, axis, this.chartObj.model.locale)) });\r\n commonAxesEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonAxesEventArgs.data = { label: axis.visibleLabels[axis.visibleLabels.length - 1], axis: axis };\r\n this.chartObj._trigger(\"axesLabelRendering\", commonAxesEventArgs);\r\n axis.visibleLabels[axis.visibleLabels.length - 1] = commonAxesEventArgs.data.label;\r\n }\r\n }\r\n }\r\n axis._LableMaxWidth = ej.EjSvgRender.utils._getMaxLabelWidth(axis, this.chartObj);\r\n },\r\n\r\n //Calculates actual interval\r\n _calculateActualInterval: function (delta, axis) {\r\n if (axis.categoryInterval == null)\r\n return Math.max(1, Math.floor(delta / this.GetActualDesiredIntervalsCount(axis, axis.length)));\r\n else\r\n return axis.categoryInterval;\r\n },\r\n\r\n //Apply padding based on labelPlacement\r\n _applyRangePadding: function (axis) {\r\n if (!this.chartObj.zoomed && !this.chartObj._scrollBarEnabled) {\r\n // ticks based on labelplacement and polaraxes\r\n var ticks = 0;\r\n if (this.chartObj.model.AreaType !== 'polaraxes')\r\n ticks = ((axis.labelPlacement === null || axis.labelPlacement === undefined)) ? -0.5 : (axis.labelPlacement.toLowerCase() == \"betweenticks\") ? (-0.5) : 0;\r\n if (ticks < 0) {\r\n axis.range.min = axis.range.min + ticks;\r\n axis.range.max = axis.range.max - ticks;\r\n axis.range.delta = axis.range.max - axis.range.min;\r\n axis.actualRange = axis.range;\r\n } else {\r\n var data = _sideBySeriesPadding(this.chartObj, axis.range.min, axis.range.max, axis);\r\n axis.range.min = data.startPadding;\r\n axis.range.max = data.endPadding;\r\n axis.range.delta = axis.range.max - axis.range.min;\r\n axis.actualRange = axis.range;\r\n }\r\n }\r\n this._calculateVisibleRange(axis);\r\n },\r\n\r\n //Calculates the visible range \r\n _calculateVisibleRange: function (axis, sender, isScroll) {\r\n this.chartObj = sender ? sender : this.chartObj;\r\n axis.visibleRange = (!isScroll) ? $.extend(true, {}, axis.actualRange) : axis.visibleRange;\r\n if ((axis.zoomFactor < 1 || axis.zoomPosition > 0) && this.chartObj.model.AreaType != \"polaraxes\" && !this.chartObj.model.disableZoom) {\r\n axis.zoomFactor = axis.zoomFactor > 1 ? 1 : (axis.zoomFactor < 0 ? 0 : axis.zoomFactor);\r\n axis.zoomPosition = axis.zoomPosition < 0 ? 0 : (axis.zoomPosition > 1 ? 1 : axis.zoomPosition);\r\n var baseRange = axis.actualRange;\r\n if (axis.isInversed) {\r\n var start = axis.actualRange.max - axis.zoomPosition * axis.actualRange.delta;\r\n var end = start - axis.zoomFactor * axis.actualRange.delta;\r\n }\r\n else {\r\n var start = axis.actualRange.min + (axis.zoomPosition * axis.actualRange.delta);\r\n var end = start + axis.zoomFactor * axis.actualRange.delta;\r\n }\r\n\r\n if (start < baseRange.min) {\r\n end = end + (baseRange.min - start);\r\n start = baseRange.min;\r\n }\r\n\r\n if (end > baseRange.max) {\r\n start = start - (end - baseRange.max);\r\n end = baseRange.max;\r\n }\r\n var delta = Math.abs(end - start);\r\n var interval = this._calculateActualInterval(delta, axis);\r\n var min = Math.min(start, end);\r\n var max = Math.max(start, end);\r\n if (isScroll) {\r\n return { min: min, max: max, interval: interval };\r\n }\r\n else {\r\n var delta = Math.abs(end - start);\r\n axis.visibleRange.interval = interval;\r\n axis.visibleRange.min = min;\r\n axis.visibleRange.max = max;\r\n axis.visibleRange.delta = delta;\r\n axis.zoomed = (this.chartObj.zoomed === null || this.chartObj.zoomed === undefined) ? true : this.chartObj.zoomed;\r\n }\r\n }\r\n\r\n },\r\n\r\n _calculateRanges: function (chartObj, axis, seriesCollection) {\r\n this.chartObj = chartObj;\r\n this._saveRange(chartObj, axis);\r\n this._calculateDateTimeCategoryRange(axis, seriesCollection);\r\n if (chartObj.model._drawTrendline)\r\n this._calculateTrendLineRange(chartObj, axis, seriesCollection);\r\n axis._range = axis.range;\r\n this._applyRangePadding(axis);\r\n this._calculateAxisLabels(axis);\r\n }\r\n });\r\n\r\n ej.axisTypes.datetimecategory = ejDateTimeCategory;\r\n\r\n ej.EjAxisRenderer.prototype = {\r\n _drawGridLines: function (axisIndex, axis, params) {\r\n if (this.model.AreaType == \"cartesianaxes\") {\r\n if (axis.orientation.toLowerCase() == \"horizontal\")\r\n this._drawXAxisGridLine(axisIndex, axis, params);\r\n\r\n else\r\n this._drawYAxisGridLine(axisIndex, axis, params);\r\n }\r\n else {\r\n if (axis.orientation.toLowerCase() == \"horizontal\" && axisIndex == 0) {\r\n this._drawPolarGridLine(axis);\r\n this._drawPolarLabels(axis);\r\n\r\n }\r\n else if (axisIndex == 1)\r\n this._drawPolarCircle(axis);\r\n }\r\n },\r\n _drawAxes: function (axisIndex, axis) {\r\n\r\n if (this.model.AreaType == \"cartesianaxes\") {\r\n if (axis.visible && axis.orientation.toLowerCase() == \"horizontal\") {\r\n this._drawXAxisLabels(axisIndex, axis);\r\n this._drawXTitle(axisIndex, axis);\r\n }\r\n\r\n if (axis.visible && axis.orientation.toLowerCase() == \"vertical\") {\r\n this._drawYAxisLabels(axisIndex, axis);\r\n this._drawYTitle(axisIndex, axis);\r\n }\r\n }\r\n },\r\n _getSharpPath: function (width) {\r\n var value = ((width % 2) == 0) ? 0 : 0.5;\r\n return value;\r\n },\r\n _drawAxisLine: function (axis) {\r\n\r\n // Yaxis MajorGridlines, Ticklines and Labels.\r\n var gEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_YAxisLine' });\r\n var sbYMajorTick = ej.EjSvgRender.utils._getStringBuilder();\r\n var x1 = this.model.centerX;\r\n var y1 = this.model.centerY;\r\n var x2 = this.model.centerX;\r\n var y2 = this.model.centerY - this.model.Radius;\r\n var axisLine = \"M\" + \" \" + x1 + \" \" + y1 + \" \" + \"L\" + \" \" + x2 + \" \" + y2;\r\n if (axis.visible && axis.axisLine.visible) {\r\n var options = {\r\n 'id': this.svgObject.id + '_YAxisLines',\r\n 'fill': 'none',\r\n 'stroke-width': axis.axisLine.width,\r\n 'stroke': axis.axisLine.color,\r\n 'opacity': axis.axisLine.opacity,\r\n 'stroke-dasharray': axis.axisLine.dashArray,\r\n 'd': axisLine\r\n };\r\n this.svgRenderer.drawPath(options, gEle);\r\n\r\n //Drawing Major Grid Lines \r\n $(gEle).appendTo(this.gPolarAxisEle);\r\n }\r\n\r\n\r\n if (axis.visible && axis.majorTickLines.visible) {\r\n gEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_YAxisMajorTicks' });\r\n for (var j = 0; j < axis.visibleLabels.length; j++) {\r\n var label = axis.visibleLabels[j];\r\n var radius = this.model.Radius * ej.EjSvgRender.utils._valueToCoefficient(axis, label.Value, this);\r\n var line = {};\r\n line.X1 = this.model.centerX;\r\n line.Y1 = this.model.centerY - radius;\r\n line.X2 = line.X1 - axis.majorTickLines.size;\r\n line.Y2 = line.Y1;\r\n sbYMajorTick.append(\"M\" + \" \" + line.X1 + \" \" + line.Y1 + \" \" + \"L\" + \" \" + line.X2 + \" \" + line.Y2 + \" \");\r\n }\r\n\r\n var yMajorTickDir = sbYMajorTick.toString();\r\n var options = {\r\n 'id': this.svgObject.id + '_YAxisMajorTicks',\r\n 'fill': 'none',\r\n 'stroke-width': axis.majorTickLines.width,\r\n 'stroke': axis.majorTickLines.color,\r\n 'd': yMajorTickDir\r\n };\r\n //Drawing Major Tickline Lines\r\n this.svgRenderer.drawPath(options, gEle);\r\n $(gEle).appendTo(this.gPolarAxisEle);\r\n\r\n }\r\n if (axis.visible) {\r\n var gEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_YAxisLabels' }),\r\n font = axis.font,\r\n bounds,\r\n regionX,\r\n labelsLength = axis.visibleLabels.length;\r\n for (var j = 0; j < labelsLength; j++) {\r\n var radius = (this.model.Radius || this.model._radius) * ej.EjSvgRender.utils._valueToCoefficient(axis, axis.visibleLabels[j].Value, this);\r\n var labelText = axis.visibleLabels[j].Text;\r\n\r\n var size = ej.EjSvgRender.utils._measureText(labelText, null, axis.font);\r\n\r\n var X = this.model.centerX - axis.majorTickLines.size - (this.model.elementSpacing / 3);\r\n var Y = this.model.centerY - radius + (size.height / 5);\r\n\r\n\r\n var options = {\r\n 'id': this.svgObject.id + '_' + axis.name + '_YLabel_' + j,\r\n 'x': X,\r\n 'y': Y,\r\n 'fill': font.color,\r\n 'font-size': font.size,\r\n 'font-family': font.fontFamily,\r\n 'font-style': font.fontStyle,\r\n 'font-weight': font.fontWeight,\r\n 'opacity': font.opacity,\r\n 'text-anchor': 'end'\r\n };\r\n\r\n this.svgRenderer.drawText(options, labelText, gEle);\r\n regionX = options.x - size.width;\r\n bounds = { x: regionX, y: options.y, width: size.width, height: size.height };\r\n axis.visibleLabels[j].region = { bounds: bounds, labelText: labelText };\r\n }\r\n //Drawing YAxis Labels\r\n $(gEle).appendTo(this.gPolarAxisEle);\r\n }\r\n\r\n\r\n },\r\n _drawPolarLabels: function (axis) {\r\n if (!axis.visible)\r\n return 0;\r\n var gEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_XAxisLabels' }),\r\n aroundRadius = this.model.Radius + axis.majorTickLines.size,\r\n font = axis.font,\r\n length = axis.visibleLabels.length,\r\n firstLabelX,\r\n bounds,\r\n regionX,\r\n lastLabelX;\r\n for (var j = 0; j < length; j++) {\r\n var coef = ej.EjSvgRender.utils._valueToPolarCoefficient(axis, axis.visibleLabels[j].Value);\r\n\r\n var vector = ej.EjSvgRender.utils._valueToVector(axis, axis.visibleLabels[j].Value);\r\n if (!isNaN(vector.X) && !isNaN(vector.Y)) {\r\n var labelText = axis.visibleLabels[j].Text;\r\n var x = this.model.centerX + aroundRadius * vector.X;\r\n var y = this.model.centerY + aroundRadius * vector.Y;\r\n var textAnchor = (x < this.model.centerX) ? 'end' : ((x > this.model.centerX) ? 'start' : 'middle');\r\n\r\n var size = ej.EjSvgRender.utils._measureText(labelText, this.model.m_AreaBounds.Height, axis.font);\r\n // calculation for positioning the label along the arc\r\n if (coef == 0.25) {\r\n x -= this.model.elementSpacing / 2;\r\n y += (size.height) / 4;\r\n }\r\n else if (coef == 0.5) {\r\n y += (size.height);\r\n }\r\n else if (coef == 0.75) {\r\n x += this.model.elementSpacing / 2;\r\n y += (size.height) / 4;\r\n }\r\n else if (coef == 1 || coef == 0) {\r\n y -= (size.height) / 2;\r\n }\r\n\r\n else if (0.25 < coef && coef < 0.5) {\r\n x -= this.model.elementSpacing / 2;\r\n y += (size.height) / 2;\r\n }\r\n else if (0.5 < coef && coef <= 0.75) {\r\n x += this.model.elementSpacing / 2;\r\n y += (size.height) / 2;\r\n }\r\n else if (0 < coef && coef < 0.25) {\r\n x -= this.model.elementSpacing / 2;\r\n }\r\n else\r\n x += this.model.elementSpacing / 2;\r\n\r\n if (j == 0) {\r\n firstLabelX = x;\r\n }\r\n if (j == length - 1 && axis._valueType != \"category\") {\r\n lastLabelX = ej.EjSvgRender.utils._measureText(labelText, null, font).width;\r\n lastLabelX += x;\r\n if (lastLabelX > firstLabelX)\r\n labelText = \"\"; //Hide the last overlapping labels\r\n }\r\n var options = {\r\n 'id': this.svgObject.id + '_' + axis.name + '_XLabel_' + j,\r\n 'x': x,\r\n 'y': y,\r\n 'fill': font.color,\r\n 'font-size': font.size,\r\n 'font-family': font.fontFamily,\r\n 'font-style': font.fontStyle,\r\n 'font-weight': font.fontWeight,\r\n 'opacity': font.opacity,\r\n 'text-anchor': textAnchor\r\n };\r\n\r\n this.svgRenderer.drawText(options, labelText, gEle);\r\n if (textAnchor == \"middle\")\r\n regionX = options.x - size.width / 2;\r\n\r\n else if (textAnchor == \"end\")\r\n regionX = options.x - size.width;\r\n else\r\n regionX = options.x;\r\n\r\n bounds = { x: regionX, y: options.y, width: size.width, height: size.height };\r\n axis.visibleLabels[j].region = { bounds: bounds, labelText: labelText };\r\n }\r\n }\r\n\r\n $(gEle).appendTo(this.gXaxisEle);\r\n\r\n },\r\n _drawPolarCircle: function (axis) {\r\n if (axis.majorGridLines.visible) {\r\n var sbYMajorGrid = ej.EjSvgRender.utils._getStringBuilder();\r\n var gEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_YAxisGrid' });\r\n if (this.model.isPolar) {\r\n for (var j = 0; j < axis.visibleLabels.length; j++) {\r\n var label = axis.visibleLabels[j];\r\n var radius = this.model.Radius * ej.EjSvgRender.utils._valueToCoefficient(axis, label.Value, this);\r\n\r\n var options = {\r\n 'id': this.svgObject.id + '_YAxisGridLines_' + j,\r\n 'cx': this.model.centerX,\r\n 'cy': this.model.centerY,\r\n 'r': radius,\r\n 'fill': 'transparent',\r\n 'stroke-width': axis.majorGridLines.width,\r\n 'stroke': axis.majorGridLines.color,\r\n 'opacity': (this.vmlRendering) ? 0.3 : axis.majorGridLines.opacity\r\n };\r\n\r\n //Drawing Major Grid Lines for polar\r\n this.svgRenderer.drawCircle(options, gEle);\r\n\r\n }\r\n }\r\n else {\r\n for (var j = 0; j < axis.visibleLabels.length; j++) {\r\n\r\n var label = axis.visibleLabels[j];\r\n var radius = this.model.Radius * ej.EjSvgRender.utils._valueToCoefficient(axis, label.Value, this);\r\n // calculation for spider web\r\n for (var i = 0; i < this.model._axes[0].visibleLabels.length; i++) {\r\n var xAxis = this.model._axes[0];\r\n var vector = ej.EjSvgRender.utils._valueToVector(xAxis, xAxis.visibleLabels[i].Value);\r\n if (!isNaN(vector.X) && !isNaN(vector.Y)) {\r\n var vector2;\r\n if ((i + 1) < xAxis.visibleLabels.length) {\r\n vector2 = ej.EjSvgRender.utils._valueToVector(xAxis, xAxis.visibleLabels[i + 1].Value);\r\n }\r\n else {\r\n vector2 = ej.EjSvgRender.utils._valueToVector(xAxis, xAxis.visibleLabels[0].Value);\r\n }\r\n var connectPoint = { X: this.model.centerX + radius * vector.X, Y: this.model.centerY + radius * vector.Y };\r\n var endPoint = { X: this.model.centerX + radius * vector2.X, Y: this.model.centerY + radius * vector2.Y };\r\n sbYMajorGrid.append(\"M\" + \" \" + connectPoint.X + \" \" + connectPoint.Y + \" \" + \"L\" + \" \" + endPoint.X + \" \" + endPoint.Y + \" \");\r\n }\r\n }\r\n }\r\n if (axis.majorGridLines.visible) {\r\n var yMajorGridDir = sbYMajorGrid.toString();\r\n var options = {\r\n 'id': this.svgObject.id + '_YAxisGridLines',\r\n 'fill': 'none',\r\n 'stroke-width': axis.majorGridLines.width,\r\n 'stroke': axis.majorGridLines.color,\r\n 'opacity': axis.majorGridLines.opacity,\r\n 'stroke-dasharray': axis.majorGridLines.dashArray,\r\n 'd': yMajorGridDir\r\n };\r\n //Drawing Major Grid Lines for radar\r\n this.svgRenderer.drawPath(options, gEle);\r\n }\r\n }\r\n }\r\n $(gEle).appendTo(this.gYaxisEle);\r\n\r\n },\r\n _drawPolarGridLine: function (axis) {\r\n\r\n var chartModel = this.model,\r\n legend = chartModel.legend,\r\n legendTitleHeight = ej.EjSvgRender.utils._measureText(legend.title.text, null, legend.title.font).height,\r\n legendPosition = legend.position.toLowerCase(),\r\n legXSpace = 0,\r\n legYSpace = 0,\r\n sbXMajorGrid = ej.EjSvgRender.utils._getStringBuilder(),\r\n sbXMajorTick = ej.EjSvgRender.utils._getStringBuilder(),\r\n borderSize = legend.border.width,\r\n yOffset, actualWidth, actualHeight,\r\n isRadar = false, vector, line, xMajorGridDir, xMajorTickDir,\r\n length = axis.visibleLabels.length,\r\n chartBorder = chartModel.border.width,\r\n title = chartModel.title,\r\n subTitle = chartModel.title.subTitle,\r\n titleEnable = title.enableTrim && (title.textOverflow == 'wrap' || title.textOverflow == 'wrapandtrim') ? true : false,\r\n subTitleEnable = subTitle.text != \"\" && subTitle.visible && subTitle.enableTrim && (subTitle.textOverflow == 'wrap' || subTitle.textOverflow == 'wrapandtrim') ? true : false;\r\n if (legend.visible && legendPosition != \"custom\") {\r\n if (legendPosition == \"right\" || legendPosition == \"left\")\r\n legXSpace = ((legendPosition == \"right\") ? chartModel.margin.right : chartModel.margin.left) + chartModel.LegendActualBounds.Width + (borderSize + chartBorder) * 2;\r\n else\r\n legYSpace = ((legendPosition == \"top\") ? chartModel.margin.top : chartModel.margin.bottom) + chartModel.LegendActualBounds.Height + legendTitleHeight + (borderSize + chartBorder) * 2;\r\n\r\n }\r\n // calculating the radius of the chart with avaible size\r\n yOffset = ((chartModel.title.text && chartModel.title.visible) ? chartModel._titleLocation.Y + (titleEnable ? chartModel._titleLocation.size.height : 0) + (subTitleEnable ? chartModel._subTitleLocation.size.height : 0) : 0) + legYSpace;\r\n\r\n actualWidth = chartModel.svgWidth - legXSpace;\r\n actualHeight = chartModel.svgHeight - yOffset;\r\n\r\n chartModel.centerX = actualWidth * 0.5 + ((legendPosition === \"left\") ? legXSpace : 0);\r\n chartModel.centerY = actualHeight * 0.5 + ((legendPosition === \"top\") ? yOffset : ((title.text && title.visible) ? (chartModel._titleLocation.Y + (titleEnable ? chartModel._titleLocation.size.height : 0) +\r\n (subTitleEnable ? chartModel._subTitleLocation.size.height : 0)) : 0));\r\n\r\n var gEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_XAxisGrid' });\r\n chartModel.finalSize = { width: actualWidth, height: actualHeight };\r\n\r\n chartModel.Radius = Math.min(chartModel.finalSize.width, chartModel.finalSize.height) / 2 - (2 * chartModel.elementSpacing) - axis.majorTickLines.size - axis._LableMaxWidth.maxHeight;\r\n\r\n var pos = 0;\r\n\r\n if (axis.majorGridLines.visible) {\r\n\r\n for (var j = 0; j < length; j++) {\r\n\r\n vector = ej.EjSvgRender.utils._valueToVector(axis, axis.visibleLabels[j].Value);\r\n line = {};\r\n line.X1 = chartModel.centerX;\r\n\r\n line.Y1 = chartModel.centerY;\r\n line.X2 = chartModel.centerX + chartModel.Radius * vector.X;\r\n line.Y2 = chartModel.centerY + chartModel.Radius * vector.Y;\r\n sbXMajorGrid.append(\"M\" + \" \" + line.X1 + \" \" + line.Y1 + \" \" + \"L\" + \" \" + line.X2 + \" \" + line.Y2 + \" \");\r\n }\r\n\r\n }\r\n if (axis.visible && axis.majorTickLines.visible) {\r\n var radius = chartModel.Radius;\r\n for (var j = 0; j < length; j++) {\r\n vector = ej.EjSvgRender.utils._valueToVector(axis, axis.visibleLabels[j].Value);\r\n line = {};\r\n line.X1 = chartModel.centerX + radius * vector.X;\r\n line.Y1 = chartModel.centerY + radius * vector.Y;\r\n line.X2 = line.X1 + axis.majorTickLines.size * vector.X;\r\n line.Y2 = line.Y1 + axis.majorTickLines.size * vector.Y;\r\n var direction = \"M\" + \" \" + line.X1 + \" \" + line.Y1 + \" \" + \"L\" + \" \" + line.X2 + \" \" + line.Y2 + \" \";\r\n if (direction.indexOf(\"NaN\") == -1)\r\n sbXMajorTick.append(direction);\r\n }\r\n }\r\n\r\n\r\n\r\n if (axis.majorGridLines.visible) {\r\n xMajorGridDir = sbXMajorGrid.toString();\r\n var options = {\r\n 'id': this.svgObject.id + '_XAxisGridLines',\r\n 'fill': 'none',\r\n 'stroke-width': axis.majorGridLines.width,\r\n 'stroke': axis.majorGridLines.color,\r\n 'opacity': axis.majorGridLines.opacity,\r\n 'stroke-dasharray': axis.majorGridLines.dashArray,\r\n 'd': xMajorGridDir\r\n };\r\n //Drawing XAxis Major Grid Lines\r\n if (xMajorGridDir.indexOf(\"NaN\") == -1) {\r\n this.svgRenderer.drawPath(options, gEle);\r\n $(gEle).appendTo(this.gXaxisEle);\r\n }\r\n }\r\n\r\n if (axis.visible && axis.majorTickLines.visible) {\r\n xMajorTickDir = sbXMajorTick.toString();\r\n var options = {\r\n 'id': this.svgObject.id + '_XAxisMajorTicks',\r\n 'fill': 'none',\r\n 'stroke-width': axis.majorTickLines.width,\r\n 'stroke': axis.majorTickLines.color,\r\n 'd': xMajorTickDir\r\n };\r\n //Drawing XAxis Major Ticks Lines\r\n this.svgRenderer.drawPath(options, gEle);\r\n $(gEle).appendTo(this.gXaxisEle);\r\n }\r\n },\r\n _drawXAxisTickLine: function (axisIndex, xAxis, gEle, params) {\r\n var xMajorTicksDir, xMinorTicksDir;\r\n var sbXMinorTicks = ej.EjSvgRender.utils._getStringBuilder();\r\n var sbXMajorTicks = ej.EjSvgRender.utils._getStringBuilder();\r\n var minorPointX;\r\n var x1 = Math.floor(xAxis.x);\r\n var x2 = Math.floor(xAxis.x + xAxis.width);\r\n var opposedPosition = xAxis._opposed;\r\n var labelValue, xPointValue = [];\r\n var isScroll = xAxis._isScroll && !(xAxis.scrollbarSettings.pointsLength != null && xAxis.scrollbarSettings.pointsLength < xAxis.maxPointLength);\r\n var labelBorder = xAxis.labelBorder;\r\n var isCrossesAt = params.axes[xAxis.name]._validCross;\r\n if (axisIndex != 0 && !isCrossesAt && ((xAxis.labelPosition == 'inside' && xAxis.tickLinesPosition == 'inside') || (xAxis.labelPosition == 'inside' && xAxis.tickLinesPosition != 'inside')) && (!(xAxis.y == (this.model.m_AreaBounds.Height + this.model.m_AreaBounds.Y) || (xAxis.y == this.model.m_AreaBounds.Y)))) {\r\n var y1 = (!opposedPosition) ? Math.floor(xAxis.y + xAxis._LableMaxWidth.height) : Math.floor(xAxis.y - xAxis._LableMaxWidth.height);\r\n var y2 = (!opposedPosition) ? Math.floor(xAxis.y + xAxis._LableMaxWidth.height) : Math.floor(xAxis.y - xAxis._LableMaxWidth.height);\r\n }\r\n else if (axisIndex != 0 && !isCrossesAt && (xAxis.labelPosition != 'inside' && xAxis.tickLinesPosition == 'inside') && (!(xAxis.y == (this.model.m_AreaBounds.Height + this.model.m_AreaBounds.Y) || (xAxis.y == this.model.m_AreaBounds.Y)))) {\r\n var y1 = (!opposedPosition) ? Math.floor(xAxis.y + xAxis.majorTickLines.size) : Math.floor(xAxis.y - xAxis.majorTickLines.size);\r\n var y2 = (!opposedPosition) ? Math.floor(xAxis.y + xAxis.majorTickLines.size) : Math.floor(xAxis.y - xAxis.majorTickLines.size);\r\n }\r\n\r\n else {\r\n var y1 = y2 = (xAxis._y) ? (!xAxis.showNextToAxisLine) ? xAxis._y : xAxis.y : Math.floor(xAxis.y + xAxis.majorTickLines.size - 5);\r\n }\r\n if (!gEle)\r\n var gTickEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_XAxisTicklines' + '_' + axisIndex });\r\n xAxis.labelPlacement = (!(xAxis.labelPlacement)) ? ej.datavisualization.Chart.LabelPlacement.BetweenTicks : xAxis.labelPlacement;\r\n var ticksbwtLabel = ((xAxis.labels.length > 0) && (xAxis.labelPlacement.toLowerCase() == \"betweenticks\")) ? -0.5 : 0;\r\n var collectionLength = xAxis.visibleLabels.length;\r\n //For between ticks and gridlines\r\n if ((xAxis._valueType.toLowerCase() == ej.datavisualization.Chart.ValueType.Category) && ticksbwtLabel < 0) {\r\n collectionLength = collectionLength > 0 ? xAxis.visibleLabels.length + 1 : collectionLength;\r\n }\r\n for (var i = 0; i < collectionLength; i++) {\r\n\r\n labelValue = (!xAxis.visibleLabels[i]) ? xAxis.visibleLabels[i - 1].Value + xAxis.range.interval : xAxis.visibleLabels[i].Value;\r\n\r\n var tempInterval = ((xAxis.labels.length > 0) && (ticksbwtLabel < 0)) ? labelValue + ticksbwtLabel : labelValue;\r\n\r\n tempInterval = (!(xAxis.roundingPlaces)) ? parseFloat(tempInterval.toFixed((ej.EjSvgRender.utils._decimalPlaces(xAxis.visibleRange.interval) == 0 ? 1 : ej.EjSvgRender.utils._decimalPlaces(xAxis.visibleRange.interval)))) : tempInterval;\r\n\r\n if (ej.EjSvgRender.utils._inside(tempInterval, xAxis.visibleRange)) {\r\n\r\n if ((xAxis.hidePartialLabels) && ((i == 0) || (i == (collectionLength - 1))))\r\n continue;\r\n if (xAxis.minorGridLines.visible || xAxis.minorTickLines.visible) {\r\n var ticksVal = this._getSharpPath(xAxis.minorTickLines.width);\r\n var linesVal = this._getSharpPath(xAxis.minorGridLines.width);\r\n var yTickPosition;\r\n if (xAxis._valueType == \"logarithmic\") {\r\n minorTicks = tempInterval;\r\n var logmax = xAxis.visibleRange.max;\r\n var logmin = xAxis.visibleRange.min;\r\n\r\n var logtickstart = Math.pow(xAxis.logBase, minorTicks - xAxis.visibleRange.interval);\r\n var logtickend = Math.pow(xAxis.logBase, minorTicks);\r\n var logtickInterval = (logtickend - logtickstart) / (xAxis.minorTicksPerInterval + 1);\r\n var logtickPos = logtickstart + logtickInterval;\r\n minorTicks = ej.EjSvgRender.utils._logBase(logtickPos, xAxis.logBase);\r\n for (var j = 0; j < xAxis.minorTicksPerInterval; j++) {\r\n\r\n\r\n if (minorTicks < logmax && minorTicks > logmin) {\r\n\r\n minorPointX = Math.ceil(((minorTicks - logmin) / (logmax - logmin)) * (xAxis.width));\r\n\r\n //Calculate Minor Ticks\r\n if ((xAxis.minorTickLines) && xAxis.minorTickLines.visible) {\r\n var xTickPosition = Math.floor(minorPointX + x1);\r\n if ((xAxis.tickLinesPosition != 'inside' && xAxis.labelPosition != 'inside') || (xAxis.tickLinesPosition != 'inside' && xAxis.labelPosition == 'inside'))\r\n yTickPosition = (opposedPosition) ? Math.floor(y1 - xAxis.minorTickLines.size) : Math.floor(xAxis.minorTickLines.size + y1);\r\n else\r\n yTickPosition = (opposedPosition) ? Math.floor(y1 + xAxis.minorTickLines.size) : y1 - Math.floor(xAxis.minorTickLines.size);\r\n sbXMinorTicks.append(\"M\" + \" \" + (xTickPosition + ticksVal) + \" \" + (yTickPosition + ticksVal) + \" \" + \"L\" + \" \" + (xTickPosition + ticksVal) + \" \" + (y1 + ticksVal) + \" \");\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n for (var j = 0, minorTicks = tempInterval; j < xAxis.minorTicksPerInterval; j++) {\r\n minorTicks += xAxis.visibleRange.interval / (xAxis.minorTicksPerInterval + 1);\r\n if (minorTicks < xAxis.visibleRange.max && minorTicks > xAxis.visibleRange.min) {\r\n minorPointX = Math.ceil(((minorTicks - xAxis.visibleRange.min) / (xAxis.visibleRange.max - xAxis.visibleRange.min)) * (xAxis.width));\r\n\r\n //Calculate Minor Ticks\r\n if ((xAxis.minorTickLines) && xAxis.minorTickLines.visible) {\r\n if ((xAxis.tickLinesPosition != 'inside' && xAxis.labelPosition != 'inside') || (xAxis.tickLinesPosition != 'inside' && xAxis.labelPosition == 'inside'))\r\n yTickPosition = (opposedPosition) ? Math.floor(y1 - xAxis.minorTickLines.size) : Math.floor(xAxis.minorTickLines.size + y1);\r\n else\r\n yTickPosition = (opposedPosition) ? Math.floor(y1 + xAxis.minorTickLines.size) : Math.floor(y1 - xAxis.minorTickLines.size);\r\n var points = Math.floor(minorPointX + x1);\r\n sbXMinorTicks.append(\"M\" + \" \" + (points + ticksVal) + \" \" + (yTickPosition + ticksVal) + \" \" + \"L\" + \" \" + (points + ticksVal) + \" \" + (y1 + ticksVal) + \" \");\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n //calculate major ticks\r\n if (xAxis.majorTickLines.visible || xAxis.majorGridLines.visible || labelBorder.width > 0) {\r\n var mtVal = this._getSharpPath(xAxis.majorTickLines.width);\r\n var mlVal = this._getSharpPath(xAxis.majorGridLines.width);\r\n //Calculate Major Ticks and Grid lines\r\n var pointX = xPointValue[i] = this.pointX = Math.ceil(ej.EjSvgRender.utils._getPointXY(tempInterval, xAxis.visibleRange, xAxis.isInversed) * (xAxis.width));\r\n //Calculate Major Ticks\r\n if (xAxis.majorTickLines.visible) {\r\n\r\n var lineStart = xAxis.majorTickLines.size + xAxis.axisLine.width / 2;\r\n if ((xAxis.tickLinesPosition == 'inside' && xAxis.labelPosition == 'inside') || (xAxis.tickLinesPosition == 'inside' && xAxis.labelPosition != 'inside'))\r\n var yPosition = (opposedPosition) ? y1 + lineStart : y1 - lineStart;\r\n else\r\n var yPosition = ((opposedPosition) ? y1 - lineStart : lineStart + y1) - ((isScroll) ? opposedPosition ? this.model.scrollerSize : -this.model.scrollerSize : 0);\r\n sbXMajorTicks.append(\"M\" + \" \" + (Math.floor(pointX + x1) + mtVal) + \" \" + (Math.floor(yPosition) + mtVal) + \" \" + \"L\" + \" \" + (Math.floor(pointX + x1) + mtVal) + \" \" + (Math.floor(y1 + ((opposedPosition) ? (-xAxis.axisLine.width / 2) : (xAxis.axisLine.width / 2))) + mtVal) + \" \");\r\n }\r\n }\r\n }\r\n }\r\n // draw xAxis label border\r\n if (labelBorder.width > 0) {\r\n var xLabelGrid = ej.EjSvgRender.utils._getStringBuilder(), scrollSize = isScroll ? this.model.scrollerSize : 0,\r\n lineStart = xAxis.axisLine.width, yPosition, endY, startX, endX, i, gap, labelPosition = xAxis.labelPosition.toLowerCase(), boundsX = this.model.m_AreaBounds.X,\r\n boundsWidth = this.model.m_AreaBounds.Width, borderSize = labelBorder.width, length = xAxis._LableMaxWidth.height + xAxis.axisLine.width / 2 + 2,\r\n collectionLength = xAxis.visibleLabels.length;\r\n\r\n if (xAxis.tickLinesPosition == labelPosition) length += xAxis.majorTickLines.size;\r\n if (labelPosition == 'inside') {\r\n yPosition = (opposedPosition) ? y1 + lineStart : y1 + lineStart;\r\n endY = opposedPosition ? y1 + length : y1 - length;\r\n }\r\n else {\r\n yPosition = (opposedPosition) ? y1 - lineStart : lineStart + y1 + ((xAxis.zoomFactor < 1 && this.model.zooming.enableScrollbar\r\n && axisIndex == 0) ? this.model.scrollerSize : 0);\r\n endY = opposedPosition ? y1 - length - scrollSize : y1 + length + scrollSize;\r\n }\r\n\r\n for (i = 0; i < collectionLength; i++) {\r\n gap = (xPointValue[xPointValue.length - 1] - xPointValue[xPointValue.length - 2]) / 2;\r\n if (!ej.util.isNullOrUndefined(xPointValue[i]) && xPointValue.length >= 1 && !isNaN(gap)) {\r\n if (xAxis._valueType == \"category\" && xAxis.labelPlacement.toLowerCase() == \"betweenticks\") {\r\n startX = xPointValue[i] + x1;\r\n endX = xPointValue[i] + (gap * 2) + x1;\r\n } else {\r\n startX = xPointValue[i] - gap + x1;\r\n endX = xPointValue[i] + gap + x1;\r\n }\r\n endX = Math.floor(endX);\r\n endY = Math.floor(endY);\r\n startX = Math.floor(startX);\r\n yPosition = Math.floor(yPosition);\r\n if (startX < xAxis.x)\r\n xLabelGrid.append(\"M\" + \" \" + Math.floor(x1) + \" \" + endY + \" \" +\r\n \"L\" + \" \" + endX + \" \" + endY + \" \");\r\n else if (endX > xAxis.width + xAxis.x) {\r\n xLabelGrid.append(\"M\" + \" \" + startX + \" \" + yPosition + \" \" + \"L\" + \" \" + startX + \" \" + endY + \" \" +\r\n \"L\" + \" \" + Math.floor(xAxis.width + x1) + \" \" + endY + \" \");\r\n if (endX - borderSize <= xAxis.width + xAxis.x)\r\n xLabelGrid.append(\"M \" + Math.floor(xAxis.width + x1) + \" \" + endY + \" L \" + (xAxis.x + xAxis.width) + \" \" + yPosition);\r\n }\r\n else {\r\n if (i == 0)\r\n xLabelGrid.append(\"M \" + xAxis.x + \" \" + endY + \" L \" + startX + \" \" + endY + \" \");\r\n xLabelGrid.append(\"M\" + \" \" + startX + \" \" + yPosition + \" \" + \"L\" + \" \" + startX + \" \" + endY + \" \" +\r\n \"L\" + \" \" + endX + \" \" + endY + \" \");\r\n if (i == collectionLength - 1)\r\n xLabelGrid.append(\"M\" + \" \" + endX + \" \" + yPosition + \" \" + \"L\" + \" \" + endX + \" \" + endY + \" \" +\r\n \"M \" + endX + \" \" + endY + \" L \" + (xAxis.x + xAxis.width) + \" \" + endY);\r\n }\r\n }\r\n }\r\n var labelGridOptions = {\r\n 'id': this.svgObject.id + '_XAxisLabelBorder_' + axisIndex,\r\n 'fill': 'transparent',\r\n 'stroke-width': labelBorder.width,\r\n 'stroke': labelBorder.color,\r\n 'd': xLabelGrid.toString()\r\n };\r\n this.svgRenderer.drawPath(labelGridOptions, gEle);\r\n $(gEle).appendTo(this.gXaxisEle);\r\n }\r\n\r\n //draw minor ticks\r\n if (xAxis.minorTickLines.visible && xAxis.visible && xAxis.minorTicksPerInterval > 0) {\r\n xMinorTicksDir = sbXMinorTicks.toString();\r\n var optionsMinorTicks = {\r\n 'id': this.svgObject.id + '_XAxisMinorTicks_' + axisIndex,\r\n 'fill': 'none',\r\n 'stroke-width': xAxis.minorTickLines.width,\r\n 'stroke': xAxis.minorTickLines.color,\r\n 'd': xMinorTicksDir\r\n };\r\n if (!gEle)\r\n this.svgRenderer.drawPath(optionsMinorTicks, gTickEle);\r\n else\r\n this.svgRenderer.drawPath(optionsMinorTicks, gEle);\r\n\r\n }\r\n if (xAxis.majorTickLines.visible && xAxis.visible) {\r\n xMajorTicksDir = sbXMajorTicks.toString();\r\n var optionsMajorTicks = {\r\n 'id': this.svgObject.id + '_XAxisMajorTicks_' + axisIndex,\r\n 'fill': 'none',\r\n 'stroke-width': xAxis.majorTickLines.width,\r\n 'stroke': xAxis.majorTickLines.color,\r\n 'd': xMajorTicksDir\r\n };\r\n if (!gEle) {\r\n\r\n this.svgRenderer.drawPath(optionsMajorTicks, gTickEle);\r\n }\r\n else\r\n this.svgRenderer.drawPath(optionsMajorTicks, gEle);\r\n }\r\n if (xAxis.tickLinesPosition == 'inside')\r\n $(gTickEle).appendTo(this.gXaxisEle);\r\n\r\n },\r\n _drawXAxisGridLine: function (axisIndex, xAxis, params) {\r\n var xMajorGridDir, xMinorGridDir,\r\n sbXMinorGrid = ej.EjSvgRender.utils._getStringBuilder(),\r\n sbXMajorGrid = ej.EjSvgRender.utils._getStringBuilder(),\r\n minorPointX,\r\n xPoint = [], padding = this.model.elementSpacing + 5,\r\n labelValue,\r\n opposedPosition = xAxis._opposed,\r\n x1 = Math.floor(xAxis.x),\r\n x2 = Math.floor(xAxis.x + xAxis.width),\r\n gEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_XAxisGrid' + '_' + axisIndex }),\r\n gAgb = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_XAxisAlternateGridBand' + '_' + axisIndex });\r\n var isCrossesAt = params.axes[xAxis.name]._validCross;\r\n if (axisIndex != 0 && !isCrossesAt && (xAxis.labelPosition == 'inside' && xAxis.tickLinesPosition == 'inside') && (!(xAxis.y == (this.model.m_AreaBounds.Height + this.model.m_AreaBounds.Y) || (xAxis.y == this.model.m_AreaBounds.Y)))) {\r\n var y1 = (!opposedPosition) ? Math.floor(xAxis.y + xAxis._LableMaxWidth.height) : Math.floor(xAxis.y - xAxis._LableMaxWidth.height);\r\n var y2 = (!opposedPosition) ? Math.floor(xAxis.y + xAxis._LableMaxWidth.height) : Math.floor(xAxis.y - xAxis._LableMaxWidth.height);\r\n }\r\n else if ((xAxis.labelPosition == 'inside' && xAxis.tickLinesPosition != 'inside') && (!(xAxis.y == (this.model.m_AreaBounds.Height + this.model.m_AreaBounds.Y) || (xAxis.y == this.model.m_AreaBounds.Y)))) {\r\n var y1 = y2 = (!opposedPosition) ? (xAxis.showNextToAxisLine) ? Math.floor(xAxis.y + xAxis._LableMaxWidth.height) - padding : Math.floor(xAxis.y + xAxis._LableMaxWidth.height) : Math.floor(xAxis.y - xAxis._LableMaxWidth.height) + padding;\r\n }\r\n else if (axisIndex != 0 && !isCrossesAt && (xAxis.labelPosition != 'inside' && xAxis.tickLinesPosition == 'inside') && (!(xAxis.y == (this.model.m_AreaBounds.Height + this.model.m_AreaBounds.Y) || (xAxis.y == this.model.m_AreaBounds.Y)))) {\r\n var y1 = (!opposedPosition) ? Math.floor(xAxis.y + xAxis.majorTickLines.size) : Math.floor(xAxis.y - xAxis.majorTickLines.size);\r\n var y2 = (!opposedPosition) ? Math.floor(xAxis.y + xAxis.majorTickLines.size) : Math.floor(xAxis.y - xAxis.majorTickLines.size);\r\n }\r\n else {\r\n var y1 = Math.floor(xAxis.y);\r\n var y2 = Math.floor(xAxis.y);\r\n }\r\n\r\n if (xAxis.visible && xAxis.axisLine.visible) {\r\n var offset = xAxis.axisLine.offset > 0 ? xAxis.axisLine.offset : 0;\r\n var val = this._getSharpPath(xAxis.axisLine.width);\r\n var optionsLine = {\r\n 'id': this.svgObject.id + '_XAxisLine_' + axisIndex,\r\n x1: (x1 - xAxis.plotOffset) + val + offset,\r\n y1: y1 + val,\r\n x2: (x2 + xAxis.plotOffset) - offset + val,\r\n y2: y2 + val,\r\n 'stroke-dasharray': xAxis.axisLine.dashArray,\r\n 'stroke-width': xAxis.axisLine.width,\r\n 'stroke': xAxis.axisLine.color,\r\n 'opacity': xAxis.axisLine.opacity || 1\r\n };\r\n\r\n params.axes[xAxis.name]._lineOption = [optionsLine, this.gXaxisEle];\r\n }\r\n else\r\n params.axes[xAxis.name]._lineOption = [null, this.gXaxisEle];\r\n xAxis.labelPlacement = (!(xAxis.labelPlacement)) ? ej.datavisualization.Chart.LabelPlacement.BetweenTicks : xAxis.labelPlacement;\r\n var ticksbwtLabel = ((xAxis.labels.length > 0) && (xAxis.labelPlacement.toLowerCase() == \"betweenticks\")) ? -0.5 : 0;\r\n var collectionLength = xAxis.visibleLabels.length;\r\n //For between ticks and gridlines\r\n if ((xAxis._valueType.toLowerCase() == ej.datavisualization.Chart.ValueType.Category) && ticksbwtLabel < 0) {\r\n collectionLength = collectionLength > 0 ? xAxis.visibleLabels.length + 1 : collectionLength;\r\n }\r\n for (var i = 0; i < collectionLength; i++) {\r\n labelValue = (!xAxis.visibleLabels[i]) ? xAxis.visibleLabels[i - 1].Value + xAxis.range.interval : xAxis.visibleLabels[i].Value;\r\n\r\n var tempInterval = ((xAxis.labels.length > 0) && (ticksbwtLabel < 0)) ? labelValue + ticksbwtLabel : labelValue;\r\n\r\n tempInterval = (!(xAxis.roundingPlaces)) ? parseFloat(tempInterval.toFixed((ej.EjSvgRender.utils._decimalPlaces(xAxis.visibleRange.interval) == 0 ? 1 : ej.EjSvgRender.utils._decimalPlaces(xAxis.visibleRange.interval)))) : tempInterval;\r\n\r\n if (ej.EjSvgRender.utils._inside(tempInterval, xAxis.visibleRange)) {\r\n\r\n if ((xAxis.hidePartialLabels) && ((i == 0) || (i == (collectionLength - 1))))\r\n continue;\r\n\r\n //Calculate Minor Ticks and Grid lines\r\n if (xAxis.minorGridLines.visible || xAxis.minorTickLines.visible) {\r\n var ticksVal = this._getSharpPath(xAxis.minorTickLines.width);\r\n var linesVal = this._getSharpPath(xAxis.minorGridLines.width);\r\n var yTickPosition;\r\n if (xAxis._valueType == \"logarithmic\") {\r\n minorTicks = tempInterval;\r\n var logmax = xAxis.visibleRange.max;\r\n var logmin = xAxis.visibleRange.min;\r\n\r\n var logtickstart = Math.pow(xAxis.logBase, minorTicks - xAxis.visibleRange.interval);\r\n var logtickend = Math.pow(xAxis.logBase, minorTicks);\r\n var logtickInterval = (logtickend - logtickstart) / (xAxis.minorTicksPerInterval + 1);\r\n var logtickPos = logtickstart + logtickInterval;\r\n minorTicks = ej.EjSvgRender.utils._logBase(logtickPos, xAxis.logBase);\r\n for (var j = 0; j < xAxis.minorTicksPerInterval; j++) {\r\n\r\n\r\n if (minorTicks < logmax && minorTicks > logmin) {\r\n\r\n minorPointX = Math.ceil(((minorTicks - logmin) / (logmax - logmin)) * (xAxis.width));\r\n\r\n\r\n\r\n //Calculate Minor Gridlines\r\n if ((xAxis.minorGridLines) && xAxis.minorGridLines.visible) {\r\n var tickPosition = Math.floor(minorPointX + x1);\r\n sbXMinorGrid.append(\"M\" + \" \" + (tickPosition + linesVal) + \" \" + (y1 + linesVal) + \" \" + \"L\" + \" \" + (tickPosition + linesVal) + \" \" + (Math.floor(opposedPosition ? this.model.m_AreaBounds.Y + this.model.m_AreaBounds.Height : this.model.m_AreaBounds.Y) + linesVal) + \" \");\r\n }\r\n\r\n }\r\n logtickPos += logtickInterval;\r\n minorTicks = ej.EjSvgRender.utils._logBase(logtickPos, xAxis.logBase);\r\n }\r\n } else {\r\n for (var j = 0, minorTicks = tempInterval; j < xAxis.minorTicksPerInterval; j++) {\r\n minorTicks += xAxis.visibleRange.interval / (xAxis.minorTicksPerInterval + 1);\r\n if (minorTicks < xAxis.visibleRange.max && minorTicks > xAxis.visibleRange.min) {\r\n minorPointX = Math.ceil(((minorTicks - xAxis.visibleRange.min) / (xAxis.visibleRange.max - xAxis.visibleRange.min)) * (xAxis.width));\r\n\r\n\r\n //Calculate Minor Gridlines\r\n if ((xAxis.minorGridLines) && xAxis.minorGridLines.visible)\r\n sbXMinorGrid.append(\"M\" + \" \" + (Math.floor(minorPointX + x1) + linesVal) + \" \" + (y1 + linesVal) + \" \" + \"L\" + \" \" + (Math.floor(minorPointX + x1) + linesVal) + \" \" + (Math.floor(opposedPosition ? this.model.m_AreaBounds.Y + this.model.m_AreaBounds.Height : this.model.m_AreaBounds.Y) + linesVal) + \" \");\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (xAxis.majorTickLines.visible || xAxis.majorGridLines.visible) {\r\n var mtVal = this._getSharpPath(xAxis.majorTickLines.width);\r\n var mlVal = this._getSharpPath(xAxis.majorGridLines.width);\r\n var pointX = this.pointX = Math.ceil(ej.EjSvgRender.utils._getPointXY(tempInterval, xAxis.visibleRange, xAxis.isInversed) * (xAxis.width));\r\n var mX1 = (Math.floor(pointX + x1));\r\n if (xAxis.zoomed)\r\n xPoint[0] = xAxis.x;\r\n if (i == 0) {\r\n if (mX1 == Math.floor(this.model.m_AreaBounds.X)) {\r\n xPoint.push(mX1 + mlVal);\r\n continue;\r\n\r\n }\r\n }\r\n if ((i == (collectionLength - 1)) && (this.model.chartArea.border.color != \"transparent\" && this.model.chartArea.border.width > 0)) {\r\n if (mX1 == Math.floor(this.model.m_AreaBounds.X + this.model.m_AreaBounds.Width))\r\n continue;\r\n if (xAxis.zoomed)\r\n xPoint[collectionLength] = mX1 + mlVal;\r\n\r\n }\r\n\r\n //Calculate Major Gridlines\r\n if (xAxis.majorGridLines.visible)\r\n sbXMajorGrid.append(\"M\" + \" \" + (mX1 + mlVal) + \" \" + (Math.floor(this.model.m_AreaBounds.Y + this.model.m_AreaBounds.Height) + mlVal) + \" \" + \"L\" + \" \" + (mX1 + mlVal) + \" \" + (Math.floor(this.model.m_AreaBounds.Y) + mlVal) + \" \");\r\n if ((xAxis._valueType.toLowerCase() != \"category\") && i == collectionLength - 1)\r\n continue;\r\n xPoint.push((mX1 + mlVal));\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n if (xAxis.alternateGridBand.odd.fill != \"transparent\" || xAxis.alternateGridBand.even.fill != \"transparent\") {\r\n var height = this.model.m_AreaBounds.Height, optionsAlternateeven;\r\n\r\n if (xPoint.length === 0) {\r\n optionsAlternateeven = {\r\n 'id': this.svgObject.id + '_XAxis' + axisIndex + '_Alternateeven' + 0,\r\n 'x': xAxis.x,\r\n 'y': Math.floor(this.model.m_AreaBounds.Y),\r\n 'width': xAxis.width,\r\n 'height': height,\r\n 'fill': xAxis.alternateGridBand.even.fill,\r\n 'opacity': xAxis.alternateGridBand.even.opacity,\r\n 'clip-path': 'url(#' + this.svgObject.id + '_ChartAreaClipRect)',\r\n 'stroke': \"transparent\"\r\n };\r\n this.svgRenderer.drawRect(optionsAlternateeven, gAgb);\r\n }\r\n\r\n for (var i = 1; i < xPoint.length; i += 2) {\r\n var width = xPoint[i + 1] - xPoint[i];\r\n width = (width || xAxis.labelPlacement.toLowerCase() == 'onticks') ? width : (xAxis.width + xAxis.x) - xPoint[i];\r\n if (i == xPoint.length - 1 && xAxis.zoomed)\r\n width = this.model.m_AreaBounds.X + this.model.m_AreaBounds.Width - xPoint[xPoint.length - 1] - xAxis.plotOffset;\r\n var optionsAlternateodd = {\r\n 'id': this.svgObject.id + '_XAxis' + axisIndex + '_Alternateodd' + [i],\r\n 'x': xPoint[i],\r\n 'y': Math.floor(this.model.m_AreaBounds.Y),\r\n 'width': width,\r\n 'height': height,\r\n 'fill': xAxis.alternateGridBand.odd.fill,\r\n 'opacity': xAxis.alternateGridBand.odd.opacity,\r\n 'stroke': \"transparent\",\r\n 'clip-path': 'url(#' + this.svgObject.id + '_ChartAreaClipRect)'\r\n\r\n };\r\n if (width > 0)\r\n this.svgRenderer.drawRect(optionsAlternateodd, gAgb);\r\n }\r\n\r\n for (var i = 0; i < xPoint.length; i += 2) {\r\n var width = xPoint[i + 1] - xPoint[i];\r\n width = (width || xAxis.labelPlacement.toLowerCase() == 'onticks') ? width : (xAxis.width + xAxis.x) - xPoint[i];\r\n if (i == 0 && xAxis.zoomed)\r\n width = xPoint[1] - xAxis.x;\r\n\r\n if (i == xPoint.length - 1 && xAxis.zoomed)\r\n width = this.model.m_AreaBounds.X + this.model.m_AreaBounds.Width - xPoint[xPoint.length - 1] - xAxis.plotOffset;\r\n\r\n optionsAlternateeven = {\r\n 'id': this.svgObject.id + '_XAxis' + axisIndex + '_Alternateeven' + [i],\r\n 'x': xPoint[i],\r\n 'y': Math.floor(this.model.m_AreaBounds.Y),\r\n 'width': width,\r\n 'height': height,\r\n 'fill': xAxis.alternateGridBand.even.fill,\r\n 'opacity': xAxis.alternateGridBand.even.opacity,\r\n 'clip-path': 'url(#' + this.svgObject.id + '_ChartAreaClipRect)',\r\n 'stroke': \"transparent\"\r\n };\r\n if (width > 0)\r\n this.svgRenderer.drawRect(optionsAlternateeven, gAgb);\r\n }\r\n $(gAgb).appendTo(gEle);\r\n }\r\n if (xAxis.minorGridLines.visible && xAxis.minorTicksPerInterval > 0) {\r\n xMinorGridDir = sbXMinorGrid.toString();\r\n //Drawing Minor Grid Lines\r\n var optionsMinorGrid = {\r\n 'id': this.svgObject.id + '_XAxisMinorGridLines_' + axisIndex,\r\n 'fill': 'none',\r\n 'stroke-width': xAxis.minorGridLines.width,\r\n 'stroke': xAxis.minorGridLines.color,\r\n 'stroke-dasharray': xAxis.minorGridLines.dashArray,\r\n 'd': xMinorGridDir\r\n };\r\n this.svgRenderer.drawPath(optionsMinorGrid, gEle);\r\n }\r\n xMajorGridDir = sbXMajorGrid.toString();\r\n if (xAxis.majorGridLines.visible) {\r\n var options = {\r\n 'id': this.svgObject.id + '_XAxisMajorGridLines_' + axisIndex,\r\n 'fill': 'none',\r\n 'stroke-width': xAxis.majorGridLines.width,\r\n 'stroke': xAxis.majorGridLines.color,\r\n 'opacity': xAxis.majorGridLines.opacity,\r\n 'stroke-dasharray': xAxis.majorGridLines.dashArray,\r\n 'd': xMajorGridDir\r\n };\r\n\r\n //Drawing Major Grid Lines\r\n if (options.d != '')\r\n this.svgRenderer.drawPath(options, gEle);\r\n\r\n }\r\n $(gEle).appendTo(this.svgObject);\r\n\r\n\r\n },\r\n\r\n _drawYAxisTickLine: function (axisIndex, yAxis, gEle, isValidCross) {\r\n var yMajorTicksDir = \"\", yMinorTicksDir = \"\";\r\n var pointY = 0;\r\n var isScroll = yAxis._isScroll && !(yAxis.scrollbarSettings.pointsLength != null && yAxis.scrollbarSettings.pointsLength < yAxis.maxPointLength);\r\n var opposedPosition = yAxis._opposed;\r\n var labelValue, yPointValue = [];\r\n var labelBorder = yAxis.labelBorder;\r\n\r\n if (axisIndex != 1 && ((yAxis.labelPosition == 'inside' && yAxis.tickLinesPosition == 'inside') || (yAxis.labelPosition == 'inside' && yAxis.tickLinesPosition != 'inside')) && (!(yAxis.x == (this.model.m_AreaBounds.Width + this.model.m_AreaBounds.X) || (yAxis.x == (this.model.m_AreaBounds.X))))) {\r\n var x1 = (!opposedPosition && !isValidCross) ? Math.floor(yAxis.x - yAxis._LableMaxWidth.width - this.model.elementSpacing) : yAxis.showNextToAxisLine ? yAxis.x : Math.floor(yAxis.x + yAxis._LableMaxWidth.width + this.model.elementSpacing);\r\n var x2 = (!opposedPosition && !isValidCross) ? Math.floor(yAxis.x - yAxis._LableMaxWidth.width - this.model.elementSpacing) : yAxis.showNextToAxisLine ? yAxis.x : Math.floor(yAxis.x + yAxis._LableMaxWidth.width + this.model.elementSpacing);\r\n }\r\n else if (axisIndex != 1 && !isValidCross && (yAxis.labelPosition != 'inside' && yAxis.tickLinesPosition == 'inside') && (!(yAxis.x == (this.model.m_AreaBounds.Width + this.model.m_AreaBounds.X) || (yAxis.x == (this.model.m_AreaBounds.X))))) {\r\n var x1 = Math.floor(yAxis.x + yAxis.majorTickLines.size);\r\n var x2 = Math.floor(yAxis.x + yAxis.majorTickLines.size);\r\n }\r\n else {\r\n var x1 = x2 = (!yAxis.showNextToAxisLine) ? yAxis._x : !yAxis.showNextToAxisLine && yAxis.tickLinesPosition == \"inside\" ? yAxis.x + yAxis.majorTickLines.size : yAxis.x;\r\n }\r\n\r\n var y1 = Math.floor(yAxis.y + yAxis.height);\r\n var y2 = Math.floor(yAxis.y);\r\n\r\n\r\n var sbYMinorTicks = ej.EjSvgRender.utils._getStringBuilder();\r\n var sbYMajorTicks = ej.EjSvgRender.utils._getStringBuilder();\r\n var gTickEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_YAxisTicklines' + '_' + axisIndex });\r\n\r\n yAxis.labelPlacement = (!(yAxis.labelPlacement)) ? ej.datavisualization.Chart.LabelPlacement.BetweenTicks : yAxis.labelPlacement;\r\n var ticksbwtLabel = ((yAxis.labels.length > 0) && (yAxis.labelPlacement.toLowerCase() == \"betweenticks\")) ? -0.5 : 0;\r\n var collectionLength = yAxis.visibleLabels.length;\r\n //For between ticks and gridlines\r\n if ((yAxis._valueType.toLowerCase() == ej.datavisualization.Chart.ValueType.Category) && ticksbwtLabel < 0) {\r\n collectionLength = collectionLength > 0 ? yAxis.visibleLabels.length + 1 : collectionLength;\r\n }\r\n for (var i = 0; i < collectionLength; i++) {\r\n labelValue = (!yAxis.visibleLabels[i]) ? yAxis.visibleLabels[i - 1].Value + yAxis.range.interval : yAxis.visibleLabels[i].Value;\r\n var tempInterval = ((yAxis.labels.length > 0) && (ticksbwtLabel < 0)) ? labelValue + ticksbwtLabel : labelValue;\r\n tempInterval = (!(yAxis.roundingPlaces)) ? parseFloat(tempInterval.toFixed((ej.EjSvgRender.utils._decimalPlaces(yAxis.visibleRange.interval) == 0 ? 1 : ej.EjSvgRender.utils._decimalPlaces(yAxis.visibleRange.interval)))) : tempInterval;\r\n\r\n if (ej.EjSvgRender.utils._inside(tempInterval, yAxis.visibleRange)) {\r\n\r\n if ((yAxis.hidePartialLabels) && ((i == 0) || (i == (yAxis.visibleLabels.length - 1))))\r\n continue;\r\n\r\n // Calculate Minor Ticks and Grid lines \r\n if (yAxis.minorGridLines.visible || yAxis.minorTickLines.visible) {\r\n var minorPointY;\r\n var tickVal = this._getSharpPath(yAxis.minorTickLines.width);\r\n var lineVal = this._getSharpPath(yAxis.minorGridLines.width);\r\n if (yAxis._valueType == \"logarithmic\") {\r\n minorTicks = tempInterval;\r\n var logmax = yAxis.visibleRange.max;\r\n var logmin = yAxis.visibleRange.min;\r\n\r\n var logtickstart = Math.pow(yAxis.logBase, minorTicks - yAxis.visibleRange.interval);\r\n var logtickend = Math.pow(yAxis.logBase, minorTicks);\r\n var logtickInterval = (logtickend - logtickstart) / (yAxis.minorTicksPerInterval + 1);\r\n var logtickPos = logtickstart + logtickInterval;\r\n minorTicks = ej.EjSvgRender.utils._logBase(logtickPos, yAxis.logBase);\r\n for (var j = 0; j < yAxis.minorTicksPerInterval; j++) {\r\n\r\n\r\n if (minorTicks < logmax && minorTicks > logmin) {\r\n\r\n minorPointY = Math.ceil(((minorTicks - logmin) / (logmax - logmin)) * (yAxis.height));\r\n\r\n //Calculate Minor Ticks\r\n if ((yAxis.minorTickLines) && yAxis.minorTickLines.visible) {\r\n\r\n if (yAxis.minorTickLines.visible) {\r\n if ((yAxis.tickLinesPosition != 'inside' && yAxis.labelPosition != 'inside') || (yAxis.tickLinesPosition != 'inside' && yAxis.labelPosition == 'inside'))\r\n ytickPosition = (opposedPosition) ? yAxis.minorTickLines.size : -yAxis.minorTickLines.size;\r\n else\r\n var ytickPosition = (opposedPosition) ? -yAxis.minorTickLines.size : yAxis.minorTickLines.size;\r\n sbYMinorTicks.append(\"M\" + \" \" + (Math.floor(ytickPosition + x1) + tickVal) + \" \" + (Math.floor((minorPointY * -1) + y1) + tickVal) + \" \" + \"L\" + \" \" + (x1 + tickVal) + \" \" + (Math.floor((minorPointY * -1) + y1) + tickVal) + \" \");\r\n }\r\n }\r\n }\r\n logtickPos += logtickInterval;\r\n minorTicks = ej.EjSvgRender.utils._logBase(logtickPos, yAxis.logBase);\r\n }\r\n }\r\n else {\r\n for (var j = 0, minorTicks = tempInterval; j < yAxis.minorTicksPerInterval; j++) {\r\n\r\n minorTicks += yAxis.visibleRange.interval / (yAxis.minorTicksPerInterval + 1);\r\n if (minorTicks < yAxis.visibleRange.max && minorTicks > yAxis.visibleRange.min) {\r\n minorPointY = ((minorTicks - yAxis.visibleRange.min) / (yAxis.visibleRange.delta)) * (yAxis.height);\r\n // Calculate Minor Ticks \r\n if (yAxis.minorTickLines.visible) {\r\n if ((yAxis.tickLinesPosition != 'inside' && yAxis.labelPosition != 'inside') || (yAxis.tickLinesPosition != 'inside' && yAxis.labelPosition == 'inside'))\r\n var ytickPosition = (opposedPosition) ? yAxis.minorTickLines.size : -yAxis.minorTickLines.size;\r\n else\r\n var ytickPosition = (opposedPosition) ? -yAxis.minorTickLines.size : yAxis.minorTickLines.size;\r\n sbYMinorTicks.append(\"M\" + \" \" + (Math.floor(ytickPosition + x1) + tickVal) + \" \" + (Math.floor((minorPointY * -1) + y1) + tickVal) + \" \" + \"L\" + \" \" + (x1 + tickVal) + \" \" + (Math.floor((minorPointY * -1) + y1) + tickVal) + \" \");\r\n }\r\n\r\n }\r\n }\r\n }\r\n }\r\n // Calculate Major Ticks and Grid lines\r\n if (yAxis.majorTickLines.visible || yAxis.majorGridLines.visible || labelBorder.width > 0) {\r\n var mtVal = this._getSharpPath(yAxis.minorTickLines.width);\r\n var mlVal = this._getSharpPath(yAxis.majorGridLines.width);\r\n pointY = yPointValue[i] = ej.EjSvgRender.utils._getPointXY(tempInterval, yAxis.visibleRange, yAxis.isInversed) * (yAxis.height);\r\n // Calculate Major Ticks\r\n if (yAxis.majorTickLines.visible) {\r\n if ((yAxis.tickLinesPosition != 'inside' && yAxis.labelPosition != 'inside') || (yAxis.tickLinesPosition != 'inside' && yAxis.labelPosition == 'inside'))\r\n var xPosition = ((opposedPosition) ? yAxis.majorTickLines.size + yAxis.axisLine.width / 2 : -(yAxis.majorTickLines.size + yAxis.axisLine.width / 2)) + ((isScroll) ? opposedPosition ? this.model.scrollerSize : opposedPosition - this.model.scrollerSize : 0);\r\n else if ((yAxis.tickLinesPosition == 'inside' && yAxis.labelPosition != 'inside') || (yAxis.tickLinesPosition == 'inside' && yAxis.labelPosition == 'inside'))\r\n var xPosition = (opposedPosition) ? -(yAxis.majorTickLines.size + yAxis.axisLine.width / 2) : (yAxis.majorTickLines.size + yAxis.axisLine.width / 2);\r\n\r\n sbYMajorTicks.append(\"M\" + \" \" + (Math.floor(xPosition + x1) + mtVal) + \" \" + (Math.floor((pointY * -1) + y1) + mtVal) + \" \" + \"L\" + \" \" + (Math.floor(x1 + ((opposedPosition) ? (yAxis.axisLine.width / 2) : (yAxis.axisLine.width / 2))) + mtVal) + \" \" + (Math.floor((pointY * -1) + y1) + mtVal) + \" \");\r\n\r\n }\r\n\r\n\r\n\r\n }\r\n }\r\n }\r\n\r\n // draw yAxis label border\r\n if (labelBorder.width > 0) {\r\n var yLabelGrid = ej.EjSvgRender.utils._getStringBuilder(), xPosition = yAxis.axisLine.width / 2, i,\r\n startY, endY, endX, gap, scrollSize = isScroll ? this.model.scrollerSize : 0, length = yAxis._LableMaxWidth.maxWidth + 10;\r\n\r\n if (yAxis.tickLinesPosition == yAxis.labelPosition) length += yAxis.majorTickLines.size;\r\n endX = Math.floor(x1 - length);\r\n if (yAxis.labelPosition == \"outside\")\r\n endX = opposedPosition ? Math.floor(x1 + length) + scrollSize : Math.floor(x1 - length) - scrollSize;\r\n else\r\n endX = opposedPosition ? Math.floor(x1 - length) : Math.floor(x1 + length);\r\n\r\n for (var i = 0; i < collectionLength; i++) {\r\n gap = (yPointValue[yPointValue.length - 1] - yPointValue[yPointValue.length - 2]) / 2;\r\n if (!ej.util.isNullOrUndefined(yPointValue[i]) && yPointValue.length > 1 && !isNaN(gap)) {\r\n if (yAxis._valueType == \"category\" && yAxis.labelPlacement.toLowerCase() == \"betweenticks\") {\r\n startY = Math.floor((yPointValue[i] * -1) + y1);\r\n endY = Math.floor((yPointValue[i] * -1) - (gap * 2) + y1);\r\n } else {\r\n startY = Math.floor((yPointValue[i] * -1) + gap + y1);\r\n endY = Math.floor((yPointValue[i] * -1) - gap + y1);\r\n }\r\n if (startY > y1)\r\n yLabelGrid.append(\"M\" + \" \" + endX + \" \" + y1 + \" \" + \"L\" + \" \" + endX + \" \" + endY + \" \");\r\n else if (endY < this.model.m_AreaBounds.Y)\r\n yLabelGrid.append(\"M\" + \" \" + Math.floor(xPosition + x1) + \" \" + startY + \" \" + \"L\" + \" \" + endX + \" \" + startY + \" \"\r\n + \"L\" + \" \" + endX + \" \" + this.model.m_AreaBounds.Y + \" \");\r\n else {\r\n yLabelGrid.append(\"M\" + \" \" + Math.floor(xPosition + x1) + \" \" + startY + \" \" + \"L\" + \" \" + endX + \" \" + startY + \" \"\r\n + \"L\" + \" \" + endX + \" \" + endY + \" \");\r\n if (i == collectionLength - 1)\r\n yLabelGrid.append(\"M\" + \" \" + Math.floor(xPosition + x1) + \" \" + endY + \" \" + \"L\" + \" \" + endX + \" \" + endY + \" \");\r\n }\r\n }\r\n }\r\n var labelGridOptions = {\r\n 'id': this.svgObject.id + '_YAxisLabelBorder_' + axisIndex,\r\n 'fill': 'none',\r\n 'stroke-width': labelBorder.width,\r\n 'stroke': labelBorder.color,\r\n 'd': yLabelGrid.toString()\r\n };\r\n this.svgRenderer.drawPath(labelGridOptions, gEle);\r\n $(gEle).appendTo(this.gYaxisEle);\r\n }\r\n\r\n //Drawning Minor Ticks\r\n if (yAxis.minorTickLines.visible && yAxis.visible && yAxis.minorTicksPerInterval > 0) {\r\n yMinorTicksDir = sbYMinorTicks.toString();\r\n var optionsMinotTick = {\r\n 'id': this.svgObject.id + '_YAxisMinorTicks_' + axisIndex,\r\n 'fill': 'none',\r\n 'stroke-width': yAxis.minorTickLines.width,\r\n 'stroke': yAxis.minorTickLines.color,\r\n 'd': yMinorTicksDir\r\n };\r\n this.svgRenderer.drawPath(optionsMinotTick, gEle);\r\n }\r\n\r\n\r\n if (yAxis.majorTickLines.visible && yAxis.visible) {\r\n yMajorTicksDir = sbYMajorTicks.toString();\r\n //Drawning Major Ticks\r\n var optionsMajorTick = {\r\n 'id': this.svgObject.id + '_YAxisMajorTicks_' + axisIndex,\r\n 'fill': 'none',\r\n 'stroke-width': yAxis.majorTickLines.width,\r\n 'stroke': yAxis.majorTickLines.color,\r\n 'd': yMajorTicksDir\r\n };\r\n this.svgRenderer.drawPath(optionsMajorTick, gEle);\r\n }\r\n },\r\n\r\n _drawYAxisGridLine: function (axisIndex, yAxis, params) {\r\n\r\n var yMajorGridDir = \"\", yMajorTicksDir = \"\", yMinorTicksDir = \"\", yMinorGridDir = \"\";\r\n var pointY = 0;\r\n var labelValue;\r\n var y1 = Math.floor(yAxis.y + yAxis.height);\r\n var y2 = Math.floor(yAxis.y);\r\n var opposedPosition = yAxis._opposed;\r\n var yPoint = [];\r\n var isCrossesAt = params.axes[yAxis.name]._validCross;\r\n var axisName = (yAxis.name).replace(/[^a-zA-Z0-9]/g, \"\");\r\n if (axisIndex != 1 && !isCrossesAt && ((yAxis.labelPosition == 'inside' && yAxis.tickLinesPosition == 'inside') || (yAxis.labelPosition == 'inside' && yAxis.tickLinesPosition != 'inside')) && (!(yAxis.x == (this.model.m_AreaBounds.Width + this.model.m_AreaBounds.X) || (yAxis.x == (this.model.m_AreaBounds.X))))) {\r\n var x1 = (!opposedPosition) ? Math.floor(yAxis.x - yAxis._LableMaxWidth.width - this.model.elementSpacing) : Math.floor(yAxis.x + yAxis._LableMaxWidth.width + this.model.elementSpacing);\r\n var x2 = (!opposedPosition) ? Math.floor(yAxis.x - yAxis._LableMaxWidth.width - this.model.elementSpacing) : Math.floor(yAxis.x + yAxis._LableMaxWidth.width + this.model.elementSpacing);\r\n }\r\n else if (axisIndex != 1 && !isCrossesAt && (yAxis.labelPosition != 'inside' && yAxis.tickLinesPosition == 'inside') && (!(yAxis.x == (this.model.m_AreaBounds.Width + this.model.m_AreaBounds.X) || (yAxis.x == (this.model.m_AreaBounds.X))))) {\r\n\r\n var x1 = (!opposedPosition) ? Math.floor(yAxis.x - yAxis.majorTickLines.size) : Math.floor(yAxis.x + yAxis.majorTickLines.size);\r\n var x2 = (!opposedPosition) ? Math.floor(yAxis.x - yAxis.majorTickLines.size) : Math.floor(yAxis.x + yAxis.majorTickLines.size);\r\n }\r\n else {\r\n var x1 = Math.floor(yAxis.x);\r\n var x2 = Math.floor(yAxis.x);\r\n }\r\n var sbYMinorGrid = ej.EjSvgRender.utils._getStringBuilder();\r\n var sbYMajorGrid = ej.EjSvgRender.utils._getStringBuilder();\r\n var gEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_YAxisGrid' + '_' + axisIndex });\r\n var gAgb = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_YAxisAlternateGridBand' + '_' + axisIndex });\r\n\r\n if (yAxis.visible && yAxis.axisLine.visible) {\r\n var offset = yAxis.axisLine.offset > 0 ? yAxis.axisLine.offset : 0;\r\n var val = this._getSharpPath(yAxis.axisLine.width);\r\n\r\n var optionsLine = {\r\n 'id': this.svgObject.id + axisName + '_YAxisLine_' + axisIndex,\r\n x1: x1 + val,\r\n y1: (y2 - yAxis.plotOffset) + offset + val,\r\n x2: x2 + val,\r\n y2: (y1 + yAxis.plotOffset) - offset + val,\r\n 'stroke-width': yAxis.axisLine.width,\r\n 'stroke-dasharray': yAxis.axisLine.dashArray,\r\n 'stroke': yAxis.axisLine.color,\r\n 'opacity': yAxis.axisLine.opacity || 1\r\n };\r\n params.axes[yAxis.name]._lineOption = [optionsLine, this.gYaxisEle];\r\n }\r\n else\r\n params.axes[yAxis.name]._lineOption = [null, this.gYaxisEle];\r\n\r\n if (yAxis.axisBottomLine) {\r\n if (yAxis.axisBottomLine.visible) {\r\n var optionsBottomLine = {\r\n 'id': this.svgObject.id + axisName + '_YAxisBottomLine_' + axisIndex,\r\n x1: this.model.m_AreaBounds.X,\r\n y1: y1,\r\n x2: this.model.m_AreaBounds.X + this.model.m_AreaBounds.Width,\r\n y2: y1,\r\n 'stroke-width': yAxis.axisBottomLine.width,\r\n 'stroke': yAxis.axisBottomLine.color\r\n };\r\n this.svgRenderer.drawLine(optionsBottomLine, gEle);\r\n }\r\n }\r\n yAxis.labelPlacement = (!(yAxis.labelPlacement)) ? ej.datavisualization.Chart.LabelPlacement.BetweenTicks : yAxis.labelPlacement;\r\n var ticksbwtLabel = ((yAxis.labels.length > 0) && (yAxis.labelPlacement.toLowerCase() == \"betweenticks\")) ? -0.5 : 0;\r\n var collectionLength = yAxis.visibleLabels.length;\r\n for (var i = 0; i < collectionLength; i++) {\r\n labelValue = yAxis.visibleLabels[i].Value;\r\n var tempInterval = ((yAxis.labels.length > 0) && (ticksbwtLabel < 0)) ? labelValue + ticksbwtLabel : labelValue;\r\n tempInterval = (!(yAxis.roundingPlaces)) ? parseFloat(tempInterval.toFixed((ej.EjSvgRender.utils._decimalPlaces(yAxis.visibleRange.interval) == 0 ? 1 : ej.EjSvgRender.utils._decimalPlaces(yAxis.visibleRange.interval)))) : tempInterval;\r\n\r\n if (ej.EjSvgRender.utils._inside(tempInterval, yAxis.visibleRange)) {\r\n\r\n if ((yAxis.hidePartialLabels) && ((i == 0) || (i == (yAxis.visibleLabels.length - 1))))\r\n continue;\r\n\r\n // Calculate Minor Ticks and Grid lines \r\n if (yAxis.minorGridLines.visible || yAxis.minorTickLines.visible) {\r\n var minorPointY;\r\n var tickVal = this._getSharpPath(yAxis.minorTickLines.width);\r\n var lineVal = this._getSharpPath(yAxis.minorGridLines.width);\r\n if (yAxis._valueType == \"logarithmic\") {\r\n minorTicks = tempInterval;\r\n var logmax = yAxis.visibleRange.max;\r\n var logmin = yAxis.visibleRange.min;\r\n\r\n var logtickstart = Math.pow(yAxis.logBase, minorTicks - yAxis.visibleRange.interval);\r\n var logtickend = Math.pow(yAxis.logBase, minorTicks);\r\n var logtickInterval = (logtickend - logtickstart) / (yAxis.minorTicksPerInterval + 1);\r\n var logtickPos = logtickstart + logtickInterval;\r\n minorTicks = ej.EjSvgRender.utils._logBase(logtickPos, yAxis.logBase);\r\n for (var j = 0; j < yAxis.minorTicksPerInterval; j++) {\r\n\r\n\r\n if (minorTicks < logmax && minorTicks > logmin) {\r\n\r\n minorPointY = Math.ceil(((minorTicks - logmin) / (logmax - logmin)) * (yAxis.height));\r\n\r\n\r\n\r\n //Calculate Minor Gridlines\r\n if (yAxis.minorGridLines.visible)\r\n sbYMinorGrid.append(\"M\" + \" \" + (Math.floor(this.model.m_AreaBounds.X) + lineVal) + \" \" + (Math.floor((minorPointY * -1) + y1) + lineVal) + \" \" + \"L\" + \" \" + (Math.floor(this.model.m_AreaBounds.Width + this.model.m_AreaBounds.X) + lineVal) + \" \" + (Math.floor((minorPointY * -1) + y1) + lineVal) + \" \");\r\n\r\n }\r\n logtickPos += logtickInterval;\r\n minorTicks = ej.EjSvgRender.utils._logBase(logtickPos, yAxis.logBase);\r\n }\r\n } else {\r\n for (var j = 0, minorTicks = tempInterval; j < yAxis.minorTicksPerInterval; j++) {\r\n\r\n minorTicks += yAxis.visibleRange.interval / (yAxis.minorTicksPerInterval + 1);\r\n if (minorTicks < yAxis.visibleRange.max && minorTicks > yAxis.visibleRange.min) {\r\n minorPointY = ((minorTicks - yAxis.visibleRange.min) / (yAxis.visibleRange.delta)) * (yAxis.height);\r\n\r\n // Calculate Minor Grid lines \r\n if (yAxis.minorGridLines.visible)\r\n sbYMinorGrid.append(\"M\" + \" \" + (Math.floor(this.model.m_AreaBounds.X) + lineVal) + \" \" + (Math.floor((minorPointY * -1) + y1) + lineVal) + \" \" + \"L\" + \" \" + (Math.floor(this.model.m_AreaBounds.Width + this.model.m_AreaBounds.X) + lineVal) + \" \" + (Math.floor((minorPointY * -1) + y1) + lineVal) + \" \");\r\n }\r\n }\r\n }\r\n }\r\n // Calculate Grid lines\r\n if (yAxis.majorTickLines.visible || yAxis.majorGridLines.visible) {\r\n var mtVal = this._getSharpPath(yAxis.minorTickLines.width);\r\n var mlVal = this._getSharpPath(yAxis.majorGridLines.width);\r\n\r\n // Calculate Major Grid lines\r\n if (yAxis.majorGridLines.visible) {\r\n pointY = ej.EjSvgRender.utils._getPointXY(tempInterval, yAxis.visibleRange, yAxis.isInversed) * (yAxis.height);\r\n var mX1 = (Math.floor(this.model.m_AreaBounds.X) + mlVal);\r\n var mY1 = (Math.floor((pointY * -1) + y1));\r\n var mX2 = (Math.floor(this.model.m_AreaBounds.Width + this.model.m_AreaBounds.X) + mlVal);\r\n if (i == 0) {\r\n if (mY1 == Math.floor(this.model.m_AreaBounds.Y + this.model.m_AreaBounds.Height))\r\n continue;\r\n if (yAxis.zoomed)\r\n yPoint[0] = mY1 + mlVal;\r\n\r\n }\r\n if ((i == (yAxis.visibleLabels.length - 1)) && (this.model.chartArea.border.color != \"transparent\" && this.model.chartArea.border.width > 0)) {\r\n\r\n if (mY1 == (Math.floor(this.model.m_AreaBounds.Y))) {\r\n yPoint.push(mY1 + mlVal);\r\n continue;\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n sbYMajorGrid.append(\"M\" + \" \" + mX1 + \" \" + (mY1 + mlVal) + \" \" + \"L\" + \" \" + mX2 + \" \" + (mY1 + mlVal) + \" \");\r\n if (i == 0)\r\n continue;\r\n\r\n yPoint.push(mY1 + mlVal);\r\n\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (yAxis.alternateGridBand.odd.fill != \"transparent\" || yAxis.alternateGridBand.even.fill != \"transparent\") {\r\n\r\n var width = this.model.m_AreaBounds.Width;\r\n if (yAxis.zoomed) {\r\n yPoint[yPoint.length] = yAxis.y;\r\n\r\n }\r\n for (var i = 1; i < yPoint.length; i += 2) {\r\n var height = yPoint[0] - yPoint[1];\r\n if (i == yPoint.length - 1 && yAxis.zoomed) {\r\n var zoomHeight = yPoint[yPoint.length - 2] - yAxis.y;\r\n height = zoomHeight;\r\n }\r\n var yoptionsAlternateodd = {\r\n 'id': this.svgObject.id + '_YAxisAlternateodd' + [i],\r\n 'x': Math.floor(this.model.m_AreaBounds.X),\r\n 'y': yPoint[i],\r\n 'width': width,\r\n 'height': height,\r\n 'fill': yAxis.alternateGridBand.odd.fill,\r\n 'opacity': yAxis.alternateGridBand.odd.opacity,\r\n 'stroke': \"transparent\",\r\n 'clip-path': 'url(#' + this.svgObject.id + '_ChartAreaClipRect)'\r\n };\r\n this.svgRenderer.drawRect(yoptionsAlternateodd, gAgb);\r\n }\r\n\r\n for (var i = 0; i < yPoint.length; i += 2) {\r\n var height = yPoint[0] - yPoint[1];\r\n if (i == yPoint.length - 1 && yAxis.zoomed) {\r\n var zoomHeight = yPoint[yPoint.length - 2] - yAxis.y;\r\n height = zoomHeight;\r\n }\r\n if (i == 0 && yAxis.zoomed) {\r\n var zoomHeight = yAxis.y + yAxis.height - yPoint[0] - yAxis.plotOffset;\r\n height = zoomHeight;\r\n }\r\n var yoptionsAlternateeven = {\r\n 'id': this.svgObject.id + '_YAxisAlternateeven' + [i],\r\n 'x': Math.floor(this.model.m_AreaBounds.X),\r\n 'y': yPoint[i],\r\n 'width': width,\r\n 'height': height,\r\n 'fill': yAxis.alternateGridBand.even.fill,\r\n 'opacity': yAxis.alternateGridBand.even.opacity,\r\n 'stroke': \"transparent\",\r\n 'clip-path': 'url(#' + this.svgObject.id + '_ChartAreaClipRect)'\r\n };\r\n this.svgRenderer.drawRect(yoptionsAlternateeven, gAgb);\r\n }\r\n $(gAgb).appendTo(gEle);\r\n }\r\n\r\n\r\n if (yAxis.minorGridLines.visible && yAxis.minorTicksPerInterval > 0) {\r\n //Drawning Minor Grid Lines\r\n yMinorGridDir = sbYMinorGrid.toString();\r\n var optionsMinorGrid = {\r\n 'id': this.svgObject.id + '_YAxisMinorGridLines_' + axisIndex,\r\n 'fill': 'none',\r\n 'stroke-width': yAxis.minorGridLines.width,\r\n 'stroke': yAxis.minorGridLines.color,\r\n 'stroke-dasharray': yAxis.minorGridLines.dashArray,\r\n 'd': yMinorGridDir\r\n };\r\n this.svgRenderer.drawPath(optionsMinorGrid, gEle);\r\n\r\n }\r\n\r\n //Drawing Major Grid Lines\r\n yMajorGridDir = sbYMajorGrid.toString();\r\n if (yAxis.majorGridLines.visible) {\r\n var options = {\r\n 'id': this.svgObject.id + '_YAxisMajorGridLines_' + axisIndex,\r\n 'fill': 'none',\r\n 'stroke-width': yAxis.majorGridLines.width,\r\n 'opacity': yAxis.majorGridLines.opacity,\r\n 'stroke-dasharray': yAxis.majorGridLines.dashArray,\r\n 'stroke': yAxis.majorGridLines.color,\r\n 'd': yMajorGridDir\r\n };\r\n\r\n if (options.d != '')\r\n this.svgRenderer.drawPath(options, gEle);\r\n\r\n }\r\n $(gEle).appendTo(this.svgObject);\r\n },\r\n\r\n textOverflowMultiLevelLabels: function (axis, gap, text, actualText, textOverflow, font, labelSize, textOptions, gMultiLevelEle, chartObj) {\r\n var yVal = textOptions.y, count = 0, bounds;\r\n if (textOverflow == \"wrap\" || textOverflow == \"wrapandtrim\") {\r\n collection = chartObj._wrap(axis, gap, text, textOverflow, font, labelSize);\r\n textCollection = collection[\"text\"];\r\n rows = textCollection.length;\r\n for (j = 0; j < rows; j++) {\r\n textOptions.y += labelSize.height;\r\n if (!chartObj.model.enable3D) {\r\n textOptions.id += \"_\" + j;\r\n chartObj.svgRenderer.drawText(textOptions, textCollection[j], gMultiLevelEle);\r\n }\r\n if (textOverflow == \"wrapandtrim\" && textCollection[j].indexOf(\"...\") > -1) {\r\n if (chartObj.model.enable3D && count == 0)\r\n textOptions.y -= labelSize.height;\r\n unTrimmedText = collection[\"unTrimmedText\"];\r\n labelSize = ej.EjSvgRender.utils._measureText(textCollection[j], null, font);\r\n bounds = { X: textOptions.x - labelSize.width / 2, Y: textOptions.y, Width: labelSize.width, Height: labelSize.height };\r\n chartObj.model.axisMultiLevelLabelRegions.push({ trimText: textCollection[j], labelText: unTrimmedText[count], Bounds: bounds });\r\n count++;\r\n }\r\n }\r\n return textCollection;\r\n } else {\r\n text = (textOverflow == \"trim\") ? ej.EjSvgRender.utils._trimText(actualText, gap, font) : actualText;\r\n // to store region\r\n if (!chartObj.model.enable3D)\r\n yVal = textOptions.y + labelSize.height;\r\n if (axis.orientation.toLowerCase() == \"vertical\")\r\n yVal = textOptions.y - labelSize.height / 4;\r\n labelSize = ej.EjSvgRender.utils._measureText(text, null, font);\r\n bounds = { X: textOptions.x - labelSize.width / 2, Y: yVal, Width: labelSize.width, Height: labelSize.height };\r\n chartObj.model.axisMultiLevelLabelRegions.push({ trimText: text, labelText: actualText, Bounds: bounds });\r\n return text;\r\n }\r\n },\r\n\r\n _triggerMultiLevelLabelsRendering: function (text, x, y, textOverflow, font, border, chart) {\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs); // trigger event\r\n commonEventArgs.data = {\r\n text: text, location: { x: x, y: y },\r\n textOverflow: textOverflow, font: font, border: border\r\n };\r\n chart._trigger(\"multiLevelLabelRendering\", commonEventArgs);\r\n return commonEventArgs.data;\r\n },\r\n\r\n _drawXAxisMultiLevelLabels: function (axisIndex, xAxis) { // to render x axis multi level labels\r\n // declaration \r\n var i, j, x, y, rows, count, gap, actualText, text, labelSize, grpLabel, font, startX, startY, endX, textOptions, level, textOverflow, clipX, clipY, clipWidth, clipHeight, anchor, height, width,\r\n textCollection, borderOptions, border, style, alignment, svgId = this.svgObject.id, range = xAxis.visibleRange,\r\n gMultiLevelEle = this.svgRenderer.createGroup({\r\n 'id': svgId + '_XAxisMultiLevelLabels' + '_' + axisIndex, 'clip-path': 'url(#' + this.svgObject.id +\r\n '_XAxis_Clippath_' + axisIndex + \")\"\r\n }), areaBounds = this.model.m_AreaBounds, opposedPosition = xAxis.opposedPosition, borderWidth,\r\n labelPosition = xAxis.labelPosition.toLowerCase(), labelBorder = xAxis.labelBorder, padding = 10,\r\n scrollerSize = xAxis._isScroll ? this.model.scrollerSize : 0;\r\n\r\n // create clip path\r\n startY = xAxis.majorTickLines.size + xAxis._LableMaxWidth.height + (labelBorder.width);\r\n clipX = xAxis.x;\r\n clipY = xAxis.y + startY + scrollerSize;\r\n clipWidth = xAxis.width + this.model.chartArea.border.width;\r\n clipHeight = xAxis._multiLevelLabelHeight + padding - 2;\r\n\r\n if (opposedPosition) {\r\n if (labelPosition == \"outside\")\r\n clipY = xAxis.y - startY - xAxis._multiLevelLabelHeight - padding / 2 - scrollerSize;\r\n else\r\n clipY = xAxis.y + startY - padding / 2;\r\n } else {\r\n if (labelPosition == \"inside\")\r\n clipY = xAxis.y - startY - xAxis._multiLevelLabelHeight;\r\n }\r\n\r\n // to clip multi level labels\r\n var clipRectOptions = {\r\n 'id': this.svgObject.id + '_XAxis_Clippath_' + axisIndex,\r\n 'x': clipX,\r\n 'y': clipY,\r\n 'width': clipWidth,\r\n 'height': clipHeight,\r\n 'fill': 'white',\r\n 'stroke-width': 1,\r\n 'stroke': 'Gray'\r\n };\r\n this.svgRenderer.drawClipPath(clipRectOptions, gMultiLevelEle);\r\n\r\n for (i = 0; i < xAxis.multiLevelLabels.length; i++) {\r\n // assignment\r\n grpLabel = xAxis.multiLevelLabels[i];\r\n if (typeof grpLabel.start == \"string\" && grpLabel.start.indexOf(\"/Date(\") != -1)\r\n grpLabel.start = parseInt(grpLabel.start.substr(6));\r\n if (typeof grpLabel.end == \"string\" && grpLabel.end.indexOf(\"/Date(\") != -1)\r\n grpLabel.end = parseInt(grpLabel.end.substr(6));\r\n if (grpLabel.visible && ((grpLabel.start >= range.min && grpLabel.start <= range.max)\r\n || (grpLabel.end >= range.min && grpLabel.end <= range.max) ||\r\n (grpLabel.start < range.min && grpLabel.end > range.max))) {\r\n font = grpLabel.font;\r\n border = grpLabel.border;\r\n borderWidth = border.width;\r\n level = grpLabel._level;\r\n textOverflow = grpLabel.textOverflow.toLowerCase();\r\n style = border.type.toLowerCase();\r\n alignment = grpLabel.textAlignment.toLowerCase();\r\n startX = Math.ceil(ej.EjSvgRender.utils._getPointXY(grpLabel.start, range, xAxis.isInversed) * (xAxis.width));\r\n endX = Math.ceil(ej.EjSvgRender.utils._getPointXY(grpLabel.end, range, xAxis.isInversed) * (xAxis.width));\r\n if (xAxis.isInversed) {\r\n startX = startX - endX;\r\n endX = startX + endX;\r\n startX = endX - startX;\r\n }\r\n actualText = grpLabel.text;\r\n labelSize = ej.EjSvgRender.utils._measureText(actualText, null, font);\r\n gap = ej.util.isNullOrUndefined(grpLabel.maximumTextWidth) ? endX - startX - borderWidth - padding : grpLabel.maximumTextWidth - padding;\r\n rows = 1;\r\n count = 0;\r\n x = startX + xAxis.x + padding / 2;\r\n y = startY + xAxis.y;\r\n\r\n // to position text\r\n if (opposedPosition) {\r\n if (labelPosition == \"outside\")\r\n y = xAxis.y - startY - xAxis.multiLevelLabelHeight[level] - padding - xAxis.prevHeight[level] - scrollerSize;\r\n else\r\n y = xAxis.y + startY - padding / 2 + xAxis.prevHeight[level];\r\n } else {\r\n if (labelPosition == \"inside\")\r\n y = xAxis.y - startY - xAxis.multiLevelLabelHeight[level] - xAxis.prevHeight[level];\r\n else\r\n y = startY + xAxis.y + xAxis.prevHeight[level] + scrollerSize;\r\n }\r\n\r\n // to clip canvas\r\n if (this.model.enableCanvasRendering) {\r\n this.svgRenderer.ctx.save();\r\n this.svgRenderer.ctx.beginPath();\r\n this.svgRenderer.ctx.rect(clipX, clipY, clipWidth, clipHeight);\r\n this.svgRenderer.ctx.clip();\r\n }\r\n\r\n // text alignment calculation\r\n if (alignment == \"center\") {\r\n x += gap / 2;\r\n anchor = \"middle\";\r\n } else if (alignment == \"far\") {\r\n x = x + gap - borderWidth / 2;\r\n anchor = \"end\";\r\n } else {\r\n anchor = \"start\";\r\n x += borderWidth / 2;\r\n }\r\n\r\n var data = this._triggerMultiLevelLabelsRendering(actualText, x, y, textOverflow, font, grpLabel.border, this);\r\n var actualText = data.text;\r\n x = data.location.x;\r\n y = data.location.y;\r\n textOverflow = data.textOverflow.toLowerCase();\r\n font = data.font;\r\n border = data.border;\r\n style = data.border.type.toLowerCase();\r\n borderWidth = data.border.width;\r\n\r\n // options required to render text\r\n textOptions = {\r\n 'id': svgId + '_XAxisMultiLevelLabels_Text_' + axisIndex + '_' + i,\r\n 'x': x,\r\n 'y': style == \"curlybrace\" ? y + 10 : y,\r\n 'fill': font.color ? font.color : xAxis.multiLevelLabelsFontColor,\r\n 'font-size': font.size,\r\n 'font-family': font.fontFamily,\r\n 'font-style': font.fontStyle,\r\n 'font-weight': font.fontWeight,\r\n 'opacity': font.opacity,\r\n 'text-anchor': anchor\r\n };\r\n text = actualText;\r\n // calculation for wrap and wrapbyword\r\n if (textOverflow != \"none\")\r\n text = this.textOverflowMultiLevelLabels(xAxis, gap, text, actualText, textOverflow, font, labelSize, textOptions, gMultiLevelEle, this);\r\n\r\n if (textOverflow != \"wrap\" && textOverflow != \"wrapandtrim\") {\r\n textOptions.y += labelSize.height;\r\n if (labelSize.height < xAxis.multiLevelLabelHeight[level])\r\n textOptions.y = textOptions.y + xAxis.multiLevelLabelHeight[level] / 2 - labelSize.height / 2;\r\n this.svgRenderer.drawText(textOptions, text, gMultiLevelEle); // to draw text\r\n }\r\n\r\n // border calculation\r\n if (opposedPosition) {\r\n if (labelPosition == \"inside\")\r\n y = startY + xAxis.y + xAxis.prevHeight[level] - padding / 2;\r\n else\r\n y = xAxis.y - startY - xAxis.multiLevelLabelHeight[level] - padding + 2 - xAxis.prevHeight[level] - scrollerSize;\r\n } else {\r\n if (labelPosition == \"inside\")\r\n y = xAxis.y - startY - xAxis.multiLevelLabelHeight[level] - 3 - xAxis.prevHeight[level];\r\n else\r\n y = startY + xAxis.y + xAxis.prevHeight[level] + scrollerSize;\r\n }\r\n x = startX + xAxis.x;\r\n y += borderWidth;\r\n height = xAxis.multiLevelLabelHeight[level] + padding / 2;\r\n width = gap + padding + borderWidth;\r\n\r\n // storing region for multi level labels click event\r\n var region = { bounds: { x: x, y: y, height: height, width: width }, axisIndex: axisIndex, multiLevelLabel: grpLabel };\r\n this.model.multiLevelLabelRegions.push(region);\r\n\r\n var path = \"\",\r\n braceGap = ((width + borderWidth) - labelSize.width) / 2 - 2;\r\n if (style == \"rectangle\") {\r\n borderOptions = {\r\n 'id': svgId + '_XAxisMultiLevelLabels_Rect_' + axisIndex + '_' + i,\r\n 'x': x,\r\n 'y': y,\r\n 'width': width,\r\n 'height': height,\r\n 'fill': \"transparent\",\r\n 'stroke': border.color ? border.color : xAxis.multiLevelLabelsColor,\r\n 'stroke-width': borderWidth,\r\n };\r\n this.svgRenderer.drawRect(borderOptions, gMultiLevelEle);\r\n } else {\r\n switch (style) {\r\n case \"withouttopandbottomborder\":\r\n path = \"M \" + x + \" \" + y + \" L \" + x + \" \" + (y + height) +\r\n \" M \" + (x + width) + \" \" + y + \" L \" + (x + width) + \" \" + (y + height);\r\n break;\r\n case \"withouttopborder\":\r\n if ((!opposedPosition && labelPosition == \"outside\") || (opposedPosition && labelPosition == \"inside\"))\r\n labelHeight = height;\r\n else\r\n labelHeight = 0;\r\n path = \"M \" + x + \" \" + (y + labelHeight) + \" L \" + (x + width) + \" \" + (y + labelHeight) + \" M \" + x + \" \" + y + \" L \" + x + \" \" +\r\n (y + height) + \" M \" + (x + width) + \" \" + y + \" L \" + (x + width) + \" \" + (y + height);\r\n break;\r\n case \"brace\":\r\n if (alignment == \"near\") {\r\n var value = textOptions.x;\r\n value2 = textOptions.x + labelSize.width + 2;\r\n }\r\n else if (alignment == \"center\") {\r\n var value = textOptions.x - labelSize.width / 2 - 2 <= areaBounds.X + startX ? areaBounds.X + startX + padding :\r\n textOptions.x - labelSize.width / 2 - 2;\r\n var value2 = textOptions.x + labelSize.width / 2 + 2 > areaBounds.X + endX ? areaBounds.X + endX - padding :\r\n textOptions.x + labelSize.width / 2 + 2\r\n } else {\r\n var value = textOptions.x - labelSize.width - 2;\r\n value2 = textOptions.x;\r\n }\r\n if ((!opposedPosition && labelPosition == \"outside\") || (opposedPosition && labelPosition == \"inside\"))\r\n path = \"M \" + x + \" \" + y + \" L \" + x + \" \" + (y + height / 2) +\r\n \" M \" + x + \" \" + (y + height / 2) + \" L \" + (value - 2) + \" \" + (y + height / 2) +\r\n \" M \" + (value2) + \" \" + (y + height / 2) + \" L \" + (x + width) + \" \" + (y + height / 2) +\r\n \" M \" + (x + width) + \" \" + (y + height / 2) + \" L \" + (x + width) + \" \" + (y);\r\n else\r\n path = \"M \" + (x) + \" \" + (y + height) + \" L \" + (x) + \" \" + (y + height / 2) +\r\n \" M \" + x + \" \" + (y + height / 2) + \" L \" + (value) + \" \" + (y + height / 2) +\r\n \" M \" + (value2) + \" \" + (y + height / 2) + \" L \" + (x + width) + \" \" + (y + height / 2) +\r\n \" M \" + (x + width) + \" \" + (y + height) + \" L \" + (x + width) + \" \" + (y + height / 2);\r\n break;\r\n case \"curlybrace\": // using constant values to render a curely brace\r\n y = xAxis.y + startY + xAxis.prevHeight[level];\r\n if (width < 30) {\r\n path = \"M \" + (x + width / 2 - 5) + \" \" + (y + 10) + \" L \" + (x + width / 2) + \" \" + (y + 15) + \" L \" + (x + width / 2 + 5) + \" \" + (y + 10);\r\n }\r\n else if (!opposedPosition) {\r\n if (alignment == \"center\") {\r\n path = \"M \" + x + \" \" + y + \" C \" + x + \" \" + y + \" \" + (x + 5) + \" \" + (y + 10) + \" \" + (x + 10) + \" \" + (y + 10) +\r\n \" L \" + (x + width / 2 - 5) + \" \" + (y + 10) + \" L \" + (x + width / 2) + \" \" + (y + 15) +\r\n \" L \" + (x + width / 2 + 5) + \" \" + (y + 10) + \" L \" + (x + width - 10) + \" \" + (y + 10) +\r\n \" C \" + (x + width - 10) + \" \" + (y + 10) + \" \" + (x + width) + \" \" + (y + 5) + \" \" + (x + width) + \" \" + (y);\r\n } else if (alignment == \"near\") {\r\n path = \"M \" + x + \" \" + y + \" C \" + x + \" \" + y + \" \" + (x + 5) + \" \" + (y + 10) + \" \" + (x + 10) + \" \" + (y + 10) +\r\n \" L \" + (x + 15) + \" \" + (y + 15) +\r\n \" L \" + (x + 15 + 5) + \" \" + (y + 10) + \" L \" + (x + width - 10) + \" \" + (y + 10) +\r\n \" C \" + (x + width - 10) + \" \" + (y + 10) + \" \" + (x + width) + \" \" + (y + 5) + \" \" + (x + width) + \" \" + (y);\r\n } else {\r\n path = \"M \" + x + \" \" + y + \" C \" + x + \" \" + y + \" \" + (x + 5) + \" \" + (y + 10) + \" \" + (x + 10) + \" \" + (y + 10) +\r\n \" L \" + (x + width - 20) + \" \" + (y + 10) + \" L \" + (x + width - 15) + \" \" + (y + 15) +\r\n \" L \" + (x + width - 10) + \" \" + (y + 10) + \" L \" + (x + width - 10) + \" \" + (y + 10) +\r\n \" C \" + (x + width - 10) + \" \" + (y + 10) + \" \" + (x + width) + \" \" + (y + 5) + \" \" + (x + width) + \" \" + (y);\r\n }\r\n }\r\n else {\r\n path = \"M \" + x + \" \" + y + \" C \" + x + \" \" + y + \" \" + (x + 5) + \" \" + (y + 10) + \" \" + (x + 10) + \" \" + (y + 10) +\r\n \" L \" + (x + width / 2 - 5) + \" \" + (y + 10) + \" L \" + (x + width / 2) + \" \" + (y + 15) +\r\n \" L \" + (x + width / 2 + 5) + \" \" + (y + 10) + \" L \" + (x + width - 10) + \" \" + (y + 10) +\r\n \" C \" + (x + width - 10) + \" \" + (y + 10) + \" \" + (x + width) + \" \" + (y + 5) + \" \" + (x + width) + \" \" + (y);\r\n }\r\n break;\r\n }\r\n if (path) {\r\n borderOptions = {\r\n 'id': svgId + '_XAxisMultiLevelLabels_Rect_' + axisIndex + '_' + i,\r\n 'd': path,\r\n 'stroke': border.color ? border.color : xAxis.multiLevelLabelsColor,\r\n 'stroke-width': border.width,\r\n 'fill': 'none'\r\n }\r\n this.svgRenderer.drawPath(borderOptions, gMultiLevelEle);\r\n }\r\n }\r\n if (this.model.enableCanvasRendering)\r\n this.svgRenderer.ctx.restore();\r\n\r\n $(gMultiLevelEle).appendTo(this.gXaxisEle);\r\n }\r\n }\r\n },\r\n\r\n _drawYAxisMultiLevelLabels: function (axisIndex, yAxis) { // to render y axis multi level labels\r\n // declaration \r\n var i, j, x, y, rows, gap, labelSize, grpLabel, font, startX, startY, endX, endY, textOptions, textOverflow, padding = 5, level, maximumTextWidth, actualText, space, count, text, height, width, value1, value2,\r\n textCollection, borderOptions, border, style, alignment, svgId = this.svgObject.id, range = yAxis.visibleRange, clipX, clipY, clipWidth, clipHeight, textX, data, borderWidth, path, braceGap, newHeight,\r\n gMultiLevelEle = this.svgRenderer.createGroup({\r\n 'id': svgId + '_YAxisMultiLevelLabels' + '_' + axisIndex, 'clip-path': 'url(#' + this.svgObject.id +\r\n '_YAxis_Clippath_' + axisIndex + \")\"\r\n }), anchor = \"middle\", areaBounds = this.model.m_AreaBounds, opposedPosition = yAxis.opposedPosition,\r\n labelPosition = yAxis.labelPosition.toLowerCase(), labelBorder = yAxis.labelBorder, multiLevelLabelWidth = yAxis._multiLevelLabelHeight,\r\n startX = yAxis.majorTickLines.size + yAxis._LableMaxWidth.width + (labelBorder.width) + 2 * padding,\r\n scrollerSize = yAxis._isScroll ? this.model.scrollerSize : 0;\r\n\r\n // to clip the multi level labels\r\n clipY = yAxis.y;\r\n clipWidth = multiLevelLabelWidth + padding;\r\n clipHeight = yAxis.height + padding;\r\n if (opposedPosition) {\r\n if (labelPosition == \"outside\")\r\n clipX = yAxis.x + startX - padding + scrollerSize;\r\n else\r\n clipX = yAxis.x - multiLevelLabelWidth - startX + padding;\r\n }\r\n else {\r\n if (labelPosition == \"outside\")\r\n clipX = yAxis.x - multiLevelLabelWidth - startX - scrollerSize;\r\n else\r\n clipX = yAxis.x + startX - padding;\r\n }\r\n var clipRectOptions = {\r\n 'id': this.svgObject.id + '_YAxis_Clippath_' + axisIndex,\r\n 'x': clipX,\r\n 'y': yAxis.y,\r\n 'width': clipWidth,\r\n 'height': clipHeight,\r\n 'fill': 'white',\r\n 'stroke-width': 1,\r\n 'stroke': 'Gray'\r\n };\r\n this.svgRenderer.drawClipPath(clipRectOptions, gMultiLevelEle);\r\n\r\n for (i = 0; i < yAxis.multiLevelLabels.length; i++) {\r\n // assignment\r\n grpLabel = $.extend(true, {}, this.model.multiLevelLabelsDefault, yAxis.multiLevelLabels[i]);\r\n if (grpLabel.visible && ((grpLabel.start >= range.min && grpLabel.start <= range.max)\r\n || (grpLabel.end >= range.min && grpLabel.end <= range.max) ||\r\n (grpLabel.start < range.min && grpLabel.end > range.max))) {\r\n font = grpLabel.font;\r\n border = grpLabel.border;\r\n level = grpLabel._level;\r\n maximumTextWidth = grpLabel.maximumTextWidth;\r\n textOverflow = grpLabel.textOverflow.toLowerCase();\r\n style = border.type.toLowerCase();\r\n alignment = grpLabel.textAlignment.toLowerCase();\r\n startY = Math.ceil(ej.EjSvgRender.utils._getPointXY(grpLabel.start, range, yAxis.isInversed) * (yAxis.height));\r\n endY = Math.ceil(ej.EjSvgRender.utils._getPointXY(grpLabel.end, range, yAxis.isInversed) * (yAxis.height));\r\n if (yAxis.isInversed) {\r\n startY = startY - endY;\r\n endY = startY + endY;\r\n startY = endY - startY;\r\n }\r\n actualText = grpLabel.text;\r\n labelSize = ej.EjSvgRender.utils._measureText(actualText, null, font);\r\n gap = endY - startY - border.width;\r\n space = ej.util.isNullOrUndefined(maximumTextWidth) ? yAxis.multiLevelLabelHeight[level] + padding : maximumTextWidth - padding;\r\n rows = 1; count = 0; textX = 0;\r\n x = yAxis.x - startX - yAxis.prevHeight[level] - yAxis.multiLevelLabelHeight[level] / 2 + border.width - padding / 2;\r\n y = yAxis.height + yAxis.y - startY - (gap / 2);\r\n\r\n // for text position\r\n if ((opposedPosition)) {\r\n if (labelPosition == \"outside\")\r\n x = yAxis.x + startX + yAxis.multiLevelLabelHeight[level] / 2 + yAxis.prevHeight[level] + border.width + scrollerSize;\r\n else\r\n x = yAxis.x - startX - yAxis.multiLevelLabelHeight[level] / 2 - yAxis.prevHeight[level] + border.width + padding / 2;\r\n }\r\n else {\r\n if (labelPosition == \"inside\")\r\n x = yAxis.x + startX + yAxis.multiLevelLabelHeight[level] / 2 + yAxis.prevHeight[level] - padding / 2;\r\n else\r\n x = x + textX - scrollerSize;\r\n }\r\n if (this.model.enableCanvasRendering) {\r\n this.svgRenderer.ctx.save();\r\n this.svgRenderer.ctx.beginPath();\r\n this.svgRenderer.ctx.rect(clipX, clipY, clipWidth, clipHeight);\r\n this.svgRenderer.ctx.clip();\r\n }\r\n\r\n // text alignment calculation\r\n if (alignment == \"far\")\r\n y = y + gap / 2 - labelSize.height / 2;\r\n else if (alignment == \"near\")\r\n y = y - gap / 2 + labelSize.height;\r\n else\r\n y = y + labelSize.height / 4;\r\n data = this._triggerMultiLevelLabelsRendering(actualText, x, y, textOverflow, font, grpLabel.border, this);\r\n var actualText = data.text;\r\n x = data.location.x;\r\n y = data.location.y;\r\n textOverflow = data.textOverflow;\r\n font = data.font;\r\n border = data.border;\r\n style = border.type.toLowerCase();\r\n borderWidth = border.width;\r\n\r\n // options required to render text\r\n textOptions = {\r\n 'id': svgId + '_YAxisMultiLevelLabels_Text_' + axisIndex + '_' + i,\r\n 'x': style == \"curlybrace\" ? (opposedPosition ? x + textX + 10 : x + textX - 10) : x + textX,\r\n 'y': y,\r\n 'fill': font.color ? font.color : yAxis.multiLevelLabelsFontColor,\r\n 'font-size': font.size,\r\n 'font-family': font.fontFamily,\r\n 'font-style': font.fontStyle,\r\n 'font-weight': font.fontWeight,\r\n 'opacity': font.opacity,\r\n 'text-anchor': anchor\r\n };\r\n\r\n text = actualText;\r\n // calculation for wrap and wrapandtrim\r\n if (textOverflow != \"none\")\r\n text = this.textOverflowMultiLevelLabels(yAxis, space, text, actualText, textOverflow, font, labelSize, textOptions, gMultiLevelEle, this);\r\n if (textOverflow != \"wrap\" && textOverflow != \"wrapandtrim\")\r\n this.svgRenderer.drawText(textOptions, text, gMultiLevelEle); // to draw text\r\n x = x - padding / 2 - yAxis.multiLevelLabelHeight[level] / 2;\r\n y = yAxis.y + yAxis.height - endY + border.width;\r\n height = endY - startY;\r\n width = yAxis.multiLevelLabelHeight[level] + padding;\r\n path = \"\";\r\n braceGap = ((width + border.width) - multiLevelLabelWidth) / 2 - 2;\r\n\r\n // storing region for multi level labels click event\r\n var region = { bounds: { x: x, y: y, height: height, width: width }, axisIndex: axisIndex, multiLevelLabel: grpLabel };\r\n this.model.multiLevelLabelRegions.push(region);\r\n\r\n if (style == \"rectangle\") {\r\n borderOptions = {\r\n 'id': svgId + '_YAxisMultiLevelLabels_Rect_' + axisIndex + '_' + i,\r\n 'x': x,\r\n 'y': y,\r\n 'width': width,\r\n 'height': height,\r\n 'fill': \"transparent\",\r\n 'stroke': border.color ? border.color : yAxis.multiLevelLabelsColor,\r\n 'stroke-width': border.width,\r\n };\r\n this.svgRenderer.drawRect(borderOptions, gMultiLevelEle);\r\n } else {\r\n switch (style) {\r\n case \"withouttopandbottomborder\":\r\n path = \"M\" + \" \" + x + \" \" + (y + height) + \" \" + \"L\" + \" \" + (x + width) + \" \" + (y + height) + \" \" +\r\n \"M\" + \" \" + x + \" \" + y + \" \" + \"L\" + \" \" + (x + width) + \" \" + y;\r\n break;\r\n case \"withouttopborder\":\r\n if ((!opposedPosition && labelPosition == \"outside\") || (opposedPosition && labelPosition == \"inside\"))\r\n labelWidth = 0;\r\n else\r\n labelWidth = width;\r\n path = \"M\" + \" \" + x + \" \" + (y + height) + \" \" + \"L\" + \" \" + (x + width) + \" \" + (y + height) + \" \" +\r\n \"M\" + \" \" + x + \" \" + y + \" \" + \"L\" + \" \" + (x + width) + \" \" + y +\r\n \" M\" + \" \" + (x + labelWidth) + \" \" + (y + height) + \" \" + \"L\" + \" \" + (x + labelWidth) + \" \" + (y);\r\n break;\r\n case \"brace\":\r\n value1 = textOptions.y - labelSize.height / 2 - 4;\r\n value2 = textOptions.y + labelSize.height / 4 + 2;\r\n if ((!opposedPosition && labelPosition == \"outside\") || (opposedPosition && labelPosition == \"inside\"))\r\n path = \"M \" + (x + width) + \" \" + y + \" L \" + (x + width / 2) + \" \" + y +\r\n \" M \" + (x + width / 2) + \" \" + y + \" L \" + (x + width / 2) + \" \" + value1 +\r\n \" M \" + (x + width / 2) + \" \" + value2 + \" L \" + (x + width / 2) + \" \" + (y + height) +\r\n \" M \" + (x + width / 2) + \" \" + (y + height) + \" L \" + (x + width) + \" \" + (y + height);\r\n else\r\n path = \"M \" + (x) + \" \" + y + \" L \" + (x + width / 2) + \" \" + y +\r\n \" M \" + (x + width / 2) + \" \" + y + \" L \" + (x + width / 2) + \" \" + value1 +\r\n \" M \" + (x + width / 2) + \" \" + value2 + \" L \" + (x + width / 2) + \" \" + (y + height) +\r\n \" M \" + (x + width / 2) + \" \" + (y + height) + \" L \" + (x) + \" \" + (y + height);\r\n break;\r\n case \"curlybrace\": // using constant values to render a curely brace\r\n x = yAxis.x - startX - yAxis.prevHeight[level];\r\n newHeight = height - 10;\r\n if (height < 30) {\r\n if (opposedPosition) {\r\n x = yAxis.x + startX + yAxis.prevHeight[level];\r\n newHeight = height - 10;\r\n path =\r\n \" M \" + (x + 10) + \" \" + (y + newHeight / 2) + \" \" + \" L \" + (x + 15) + \" \" + (y + newHeight / 2 + 5) +\r\n \" L \" + (x + 10) + \" \" + (y + newHeight / 2 + 10);\r\n }\r\n else\r\n path = \"M \" + (x - 10) + \" \" + (y + height / 2 - 5) + \" L \" + (x - 15) + \" \" + (y + height / 2) + \" L \" + (x - 10) + \" \" + (y + height / 2 + 5);\r\n }\r\n else if (!opposedPosition) {\r\n if (alignment == \"center\") {\r\n path = \"M \" + x + \" \" + y + \" C \" + x + \" \" + y + \" \" + (x - 10) + \" \" + y + \" \" + (x - 10) + \" \" + (y + 10) +\r\n \" L \" + (x - 10) + \" \" + (y + newHeight / 2) + \" L \" + (x - 15) + \" \" + (y + newHeight / 2 + 5) +\r\n \" L \" + (x - 10) + \" \" + (y + newHeight / 2 + 10) + \" L \" + (x - 10) + \" \" + (y + newHeight) +\r\n \" C \" + (x - 10) + \" \" + (y + newHeight) + \" \" + (x - 5) + \" \" + (y + newHeight + 10) + \" \" + x + \" \" + (y + newHeight + 10);\r\n } else if (alignment == \"far\") {\r\n path = \"M \" + x + \" \" + y + \" C \" + x + \" \" + y + \" \" + (x - 10) + \" \" + y + \" \" + (x - 10) + \" \" + (y + 10) +\r\n \" L \" + (x - 10) + \" \" + (y + newHeight - 10) + \" \" + \" L \" + (x - 15) + \" \" + (y + newHeight - 10 + 5) +\r\n \" L \" + (x - 10) + \" \" + (y + newHeight) + \" L \" + (x - 10) + \" \" + (y + newHeight) +\r\n \" C\" + (x - 10) + \" \" + (y + newHeight) + \" \" + (x - 10) + \" \" + (y + newHeight + 10) + \" \" + x + \" \" + (y + newHeight + 10);\r\n } else {\r\n path = \"M \" + x + \" \" + y + \" C \" + x + \" \" + y + \" \" + (x - 10) + \" \" + y + \" \" + (x - 10) + \" \" + (y + 10) +\r\n \" L \" + (x - 15) + \" \" + (y + 10 + 5) +\r\n \" L \" + (x - 10) + \" \" + (y + 10 + 10) + \" L \" + (x - 10) + \" \" + (y + newHeight) +\r\n \" C\" + (x - 10) + \" \" + (y + newHeight) + \" \" + (x - 5) + \" \" + (y + newHeight + 10) + \" \" + x + \" \" + (y + newHeight + 10);\r\n }\r\n } else {\r\n x = yAxis.x + startX + yAxis.prevHeight[level];\r\n newHeight = height - 10;\r\n path = \"M \" + x + \" \" + y + \" C \" + x + \" \" + y + \" \" + (x + 10) + \" \" + y + \" \" + (x + 10) + \" \" + (y + 10) +\r\n \" L \" + (x + 10) + \" \" + (y + newHeight / 2) + \" \" + \" L \" + (x + 15) + \" \" + (y + newHeight / 2 + 5) +\r\n \" L \" + (x + 10) + \" \" + (y + newHeight / 2 + 10) + \" L \" + (x + 10) + \" \" + (y + newHeight) +\r\n \" C\" + (x + 10) + \" \" + (y + newHeight) + \" \" + (x + 5) + \" \" + (y + newHeight + 10) + \" \" + x + \" \" + (y + newHeight + 10);\r\n }\r\n }\r\n if (path) {\r\n borderOptions = {\r\n 'id': svgId + '_YAxisMultiLevelLabels_Rect_' + axisIndex + '_' + i,\r\n 'd': path,\r\n 'stroke': border.color ? border.color : yAxis.multiLevelLabelsColor,\r\n 'stroke-width': border.width,\r\n 'fill': \"none\"\r\n }\r\n this.svgRenderer.drawPath(borderOptions, gMultiLevelEle);\r\n }\r\n }\r\n if (this.model.enableCanvasRendering)\r\n this.svgRenderer.ctx.restore();\r\n $(gMultiLevelEle).appendTo(this.gYaxisEle);\r\n }\r\n }\r\n },\r\n\r\n _drawXAxisLabels: function (axisIndex, xAxis) {\r\n var gTickEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_XAxisLabels' + '_' + axisIndex, 'cursor': 'default' }),\r\n gEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_XAxisLabels' + '_' + axisIndex, 'cursor': 'default' }),\r\n prevLabels = [],\r\n bounds, areaBounds = this.model.m_AreaBounds,\r\n isCanvas = this.model.enableCanvasRendering,\r\n labelSize,\r\n axisName = (xAxis.name).replace(/[^a-zA-Z0-9]/g, \"\"),\r\n opposedPosition = xAxis._opposed,\r\n valueType = xAxis._valueType,\r\n pixel = 3,\r\n xAxisAignment = xAxis.alignment.toLowerCase(),\r\n labelIntersectAction = xAxis.labelIntersectAction,\r\n labelPlacement = xAxis.labelPlacement.toLowerCase(),\r\n x, y, flag = false, count = 0,\r\n insideTicks = xAxis.tickLinesPosition == 'inside',\r\n labelMaxWidth = xAxis._LableMaxWidth,\r\n labelMaxHeight = labelMaxWidth.height,\r\n labelMaxRow = labelMaxWidth.rows == 0 ? 1 : labelMaxWidth.rows,\r\n vmlrendering = this.svgRenderer.vmlNamespace,\r\n lineWidth = xAxis.axisLine.width,\r\n font = xAxis.font,\r\n labelRotation = xAxis.rotationValue,\r\n textSize, trimLabelText,\r\n textWidth,\r\n textHeight,\r\n chartAreaWidth = areaBounds.Width,\r\n chartAreaX = areaBounds.X, anchor,\r\n intersectAction = xAxis.labelIntersectAction.toLowerCase(),\r\n svgWidth = $(this.svgObject).width(), maxLineWidth, gap,\r\n textanchor = null, newGapVal1, newGapVal2, nextPointX, nextLabel, nextLabelValue,\r\n nextPoint, nextTextWidth, value,\r\n textcollection = [], label, labelText,\r\n trimGap = xAxis.maximumLabelWidth, // this holds maximumLabelWidth value \r\n range = xAxis.visibleRange,\r\n areaBoundWidth = chartAreaWidth,\r\n majorTickSize = xAxis.majorTickLines.size,\r\n labels = xAxis.visibleLabels,\r\n valueType = (xAxis.valueType && xAxis.valueType.toLowerCase()),\r\n axisWidth = xAxis.width,\r\n inversed = xAxis.isInversed,\r\n textheight,\r\n majorTickWidth = xAxis.majorTickLines.width,\r\n position, lastLabel, diff,\r\n current = false, scrollerSize = this.model.scrollerSize,\r\n line, textcoll, count, displayText,\r\n preLabel,\r\n temp,\r\n prePoint,\r\n preTextWidth,\r\n insideLabels = xAxis.labelPosition == 'inside',\r\n count1 = 0, multipleRowsColl = [], nextLabelCollection = [], lblCollection = [], highestText;\r\n isScroll = xAxis._isScroll && !(xAxis.scrollbarSettings.pointsLength != null && xAxis.scrollbarSettings.pointsLength < xAxis.maxPointLength);\r\n\r\n this.edgeLabel = false;\r\n\r\n if (axisIndex != 0 && ((insideLabels && insideTicks) || (insideLabels && !insideTicks)) && (!(xAxis.y == (areaBounds.Height + areaBounds.Y) || (xAxis.y == areaBounds.Y))))\r\n xAxis.y = (!opposedPosition) ? Math.floor(xAxis.y + labelMaxHeight) : Math.floor(xAxis.y - labelMaxHeight);\r\n\r\n else if (axisIndex != 0 && (insideLabels && insideTicks) && (!(xAxis.y == (areaBounds.Height + areaBounds.Y) || (xAxis.y == areaBounds.Y))))\r\n xAxis.y = (!opposedPosition) ? Math.floor(xAxis.y + majorTickSize) : Math.floor(xAxis.y - majorTickSize);\r\n\r\n else {\r\n xAxis._y = Math.floor(xAxis.y);//to store the current positons of the labels,before the property showNextToAxisLine as false.\r\n xAxis.y = (!xAxis.showNextToAxisLine) ? opposedPosition ? Math.floor(areaBounds.Y) : Math.floor(areaBounds.Height + areaBounds.Y) : Math.floor(xAxis.y);\r\n }\r\n\r\n // loop to draw labels\r\n for (var i = 0; i < labels.length; i++) {\r\n label = labels[i];\r\n labelText = label.displayText = ej.util.isNullOrUndefined(label.displayText) ? label.Text : label.displayText;\r\n if (ej.EjSvgRender.utils._inside(label.Value, range)) {\r\n gap = axisWidth / labels.length; //space between ticks\t\t\t\t\t \r\n if (!ej.isNullOrUndefined(valueType)) {\r\n if (i < labels.length - 1 && valueType == \"datetimecategory\" && intersectAction == \"wrap\" && labelPlacement == \"betweenticks\") {\r\n nextLabel = labels[i + 1];\r\n label.Value -= .5;\r\n nextLabelValue = nextLabel.Value - .5;\r\n }\r\n }\r\n var pointX = Math.abs(Math.floor(ej.EjSvgRender.utils._getPointXY(label.Value, range, inversed) * (axisWidth)));\r\n if (!ej.isNullOrUndefined(valueType)) {\r\n if (i < labels.length - 1 && valueType == \"datetimecategory\" && intersectAction == \"wrap\" && labelPlacement == \"betweenticks\") {\r\n nextPointX = Math.abs(Math.floor(ej.EjSvgRender.utils._getPointXY(nextLabelValue, range, inversed) * (axisWidth)));\r\n newGapVal1 = (i == 0) ? (xAxis.x + pointX) + (majorTickWidth - 0.5) : (xAxis.x + pointX) + (majorTickWidth + 0.5);\r\n newGapVal2 = (xAxis.x + nextPointX) + (majorTickWidth + 0.5);\r\n gap = newGapVal2 - newGapVal1;\r\n }\r\n else if (valueType == \"datetimecategory\" && intersectAction == \"wrap\" && labelPlacement == \"betweenticks\") {\r\n gap = (axisWidth + xAxis.x) - newGapVal2;\r\n newGapVal1 = newGapVal2;\r\n }\r\n else if (valueType == \"datetimecategory\" && intersectAction == \"wrap\" && labelPlacement == \"onticks\") {\r\n gap = axisWidth / xAxis.labels.length;\r\n }\r\n }\r\n xAxis._gap = newGapVal1;\r\n\r\n this.edgeLabel = false; // flag to find the supprot for edge labels\r\n if (typeof labelText == \"string\" && labelText.indexOf('
') != -1)\r\n highestText = ej.EjSvgRender.utils._getHighestLabel(xAxis, svgWidth, labelText);\r\n else\r\n highestText = labelText;\r\n textSize = ej.EjSvgRender.utils._measureText(highestText, areaBoundWidth, xAxis.font);\r\n textWidth = textSize.width;\r\n textHeight = textSize.height;\r\n count = 0;\r\n flag = false;\r\n\r\n //To Perform trim \r\n if (intersectAction == \"trim\" || xAxis.enableTrim) {\r\n if (labelPlacement == \"onticks\") {\r\n if (i != labels.length - 1) {\r\n var firstLabel = label;\r\n var secondLabel = labels[i + 1];\r\n lblCollection = [], nextLabelCollection = [];\r\n nextLabel = labels[i + 1];\r\n if ((typeof nextLabel.Text == \"string\" && nextLabel.Text.indexOf('
') != -1) || (typeof label.Text == \"string\" && label.Text.indexOf('
') != -1)) {\r\n lblCollection = label.Text.split('
');\r\n nextLabelCollection = nextLabel.Text.split('
');\r\n }\r\n else {\r\n nextLabelCollection.push(nextLabel.Text);\r\n if (label.displayText)\r\n lblCollection.push(label.displayText);\r\n else\r\n lblCollection.push(label.Text);\r\n }\r\n for (var q = 0; q < nextLabelCollection.length; q++) {\r\n nextPoint = Math.abs(Math.floor(ej.EjSvgRender.utils._getPointXY(nextLabel.Value, range, inversed) * (axisWidth)));\r\n nextTextWidth = ej.EjSvgRender.utils._measureText(nextLabelCollection[q], chartAreaWidth, font).width;\r\n value = nextPoint - nextTextWidth / 2;\r\n count = 0;\r\n flag1 = true;\r\n for (var q1 = 0; q1 < lblCollection.length && flag1; q1++) {\r\n var textWidth = ej.EjSvgRender.utils._measureText(lblCollection[q1], areaBoundWidth, xAxis.font).width;\r\n while (value < pointX + textWidth / 2 && count < 2) { // intersect\r\n count++;\r\n if (nextTextWidth > textWidth) { // getting max label\r\n otherLabel = trimLabel = nextLabelCollection[q];\r\n current = false;\r\n }\r\n else {\r\n trimLabel = lblCollection[q1];\r\n current = true;\r\n }\r\n trimLabelText = trimLabel;\r\n var trimmedLabel = {};\r\n trimmedLabel.displayText = trimLabel;\r\n for (var t = 1; t < trimLabelText.length; t++) {\r\n trimLabelText = trimmedLabel.displayText.substring(0, t) + '... ';\r\n newTextWidth = ej.EjSvgRender.utils._measureText(trimLabelText, chartAreaWidth, font).width;\r\n if (!current) { // to trim next label\r\n value = nextPoint - newTextWidth / 2;\r\n if (value < pointX + textWidth / 2) {\r\n if (t - 1 != 0)\r\n trimLabelText = trimLabelText.toString().substring(0, t - 1) + '... ';\r\n nextTextWidth = newTextWidth;\r\n trimmedLabel.displayText = secondLabel.displayText = trimLabelText;\r\n nextLabelCollection[q] = trimLabelText;\r\n flag1 = false;\r\n break;\r\n }\r\n }\r\n else { // to trim current label\r\n value = nextPoint - nextTextWidth / 2;\r\n if (value < pointX + newTextWidth / 2) {\r\n if (t - 1 != 0)\r\n trimLabelText = trimLabelText.toString().substring(0, t - 1) + '... ';\r\n textWidth = newTextWidth;\r\n labelText = trimmedLabel.displayText = firstLabel.displayText = trimLabelText;\r\n lblCollection[q1] = trimLabelText;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n else if (i == labels.length - 1)\r\n lblCollection = nextLabelCollection;\r\n }\r\n else if (labelPlacement == \"betweenticks\") {\r\n var derivedGap = (xAxis.enableTrim) ? trimGap : gap;\r\n var lblCollection = [];\r\n if (typeof labelText == \"string\" && labelText.indexOf('
') != -1)\r\n lblCollection = labelText.split('
');\r\n else\r\n lblCollection.push(labelText);\r\n var lblColLength = lblCollection.length;\r\n for (var q = 0; q < lblColLength; q++) {\r\n label.displayText = lblCollection[q];\r\n textSize = ej.EjSvgRender.utils._measureText(lblCollection[q], areaBoundWidth, xAxis.font);\r\n textWidth = textSize.width;\r\n if (textWidth > derivedGap && lblCollection[q] != \"\") { // check textwidth is greater than gap\r\n for (var t = 1; t < lblCollection[q].toString().length; t++) {\r\n lblCollection[q] = label.displayText.toString().substring(0, t) + '... ';\r\n textWidth = ej.EjSvgRender.utils._measureText(lblCollection[q], chartAreaWidth, font).width;\r\n if (textWidth >= derivedGap) {\r\n lblCollection[q] = lblCollection[q].toString().substring(0, t - 1) + '... ';\r\n label.displayText = lblCollection[q];\r\n if (i == labels.length - 1) {\r\n if (((pointX + xAxis.x) + (textWidth / 2) > (svgWidth)) && derivedGap == gap) {\r\n derivedGap -= (textWidth / 2);\r\n t = 1;\r\n continue;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n label.displayText = lblCollection[q]; // trimed text is assigned to displayText\r\n }\r\n }\r\n }\r\n if (xAxis._valueType != \"double\" || typeof label.displayText == \"string\") {\r\n highestText = lblCollection.length > 0 ? ej.EjSvgRender.utils._getHighestLabel(xAxis, svgWidth, lblCollection, null) : highestText;\r\n textSize = ej.EjSvgRender.utils._measureText(highestText, chartAreaWidth, font);\r\n }\r\n }\r\n else {\r\n if (typeof labelText == \"string\" && labelText.indexOf('
') != -1)\r\n textSize = ej.EjSvgRender.utils._measureText(highestText, chartAreaWidth, font);\r\n else\r\n textSize = ej.EjSvgRender.utils._measureText(label.displayText, chartAreaWidth, font);\r\n }\r\n anchor = textSize.width / 2;\r\n textHeight = textSize.height;\r\n textWidth = textSize.width;\r\n if (xAxis.majorGridLines.width > majorTickWidth)\r\n maxLineWidth = xAxis.majorGridLines.width\r\n else maxLineWidth = majorTickWidth;\r\n if (!ej.util.isNullOrUndefined(label.Text)) {\r\n if (xAxisAignment == \"near\")\r\n x = pointX + xAxis.x + maxLineWidth + ((valueType == \"category\" && labelPlacement != \"onticks\") ? -(axisWidth / xAxis.actualRange.delta) / 2 + pixel : -textSize.width - pixel);\r\n else if (xAxisAignment == \"far\")\r\n x = (pointX + xAxis.x) + ((valueType == \"category\" && labelPlacement != \"onticks\") ? +((axisWidth / xAxis.actualRange.delta) / 2) - textSize.width : +maxLineWidth + pixel);\r\n else\r\n x = pointX + xAxis.x - anchor;\r\n if ((insideLabels && insideTicks) || ((insideLabels && !insideTicks) && intersectAction == 'multiplerows')) {\r\n y = (opposedPosition) ? (xAxis.y + majorTickSize + textHeight / 2 + (lineWidth / 2)\r\n + (labelMaxHeight / (2 * labelMaxRow)) - 5) : (xAxis.y - majorTickSize - (lineWidth / 2)\r\n - (labelMaxHeight / (2 * labelMaxRow)) + 5);\r\n }\r\n else if (insideLabels && !insideTicks) {\r\n y = (opposedPosition) ? (xAxis.y + textHeight / 2 + (lineWidth / 2)\r\n + (labelMaxHeight / (2 * labelMaxRow)) - 5) : (xAxis.y - (lineWidth / 2)\r\n - (labelMaxHeight / (2 * labelMaxRow)) + 5);\r\n }\r\n else if ((!insideLabels && !insideTicks) || ((!insideLabels && insideTicks) && intersectAction == 'multiplerows')) {\r\n y = (opposedPosition) ? (xAxis.y - majorTickSize + textHeight / 2 - (lineWidth / 2)\r\n - (labelMaxHeight / (2 * labelMaxRow)) - 5) : (xAxis.y + majorTickSize + (lineWidth / 2)\r\n + (labelMaxHeight / (2 * labelMaxRow)) + 5);\r\n y = y + ((isScroll ? (opposedPosition ? - scrollerSize : scrollerSize) : 0));\r\n }\r\n else if (!insideLabels && insideTicks) {\r\n y = (opposedPosition) ? (xAxis.y + textHeight / 2 - (lineWidth / 2)\r\n - (labelMaxHeight / (2 * labelMaxRow)) - 5) : (xAxis.y + (lineWidth / 2)\r\n + (labelMaxHeight / (2 * labelMaxRow)) + 5);\r\n y = y + ((isScroll ? (opposedPosition ? - scrollerSize : scrollerSize) : 0));\r\n }\r\n\r\n\r\n if (insideLabels && !insideTicks) {\r\n if (labelRotation == 90 || intersectAction == 'rotate90')\r\n y = (opposedPosition) ? y : y - majorTickSize;\r\n }\r\n else if (!insideLabels && insideTicks) {\r\n if (xAxis.labelRotation == 90 || intersectAction == 'rotate90')\r\n y = (opposedPosition) ? y - majorTickSize : y - majorTickSize;\r\n }\r\n else if (insideLabels && insideTicks) {\r\n if (xAxis.labelRotation == 90 || intersectAction == 'rotate90')\r\n y = (opposedPosition) ? y : y - majorTickSize;\r\n }\r\n\r\n var options = {\r\n 'id': this.svgObject.id + '_' + axisName + '_XLabel_' + i,\r\n 'x': x,\r\n 'y': y,\r\n 'fill': font.color,\r\n 'font-size': font.size,\r\n 'font-family': font.fontFamily,\r\n 'font-style': font.fontStyle,\r\n 'font-weight': font.fontWeight,\r\n 'opacity': font.opacity\r\n };\r\n\r\n // To set position of edge labels\r\n if (xAxis.edgeLabelPlacement) {\r\n position = xAxis.edgeLabelPlacement.toLowerCase();\r\n lastLabel = labels.length - 1;\r\n switch (position) {\r\n case \"none\":\r\n break;\r\n case \"shift\":\r\n {\r\n if (i == 0) { // Shift first label\r\n if (options.x < xAxis.x) {\r\n diff = xAxis.x - options.x;\r\n options.x = x = options.x + diff;\r\n this.diff = diff;\r\n this.edgeLabel = true;\r\n }\r\n } else if (i == lastLabel) // Shift last label\r\n if (options.x + textSize.width > xAxis.x + xAxis.width) {\r\n diff = (options.x + textSize.width) - (xAxis.x + xAxis.width);\r\n options.x = x = options.x - diff;\r\n this.diff = diff;\r\n this.edgeLabel = true;\r\n }\r\n break;\r\n }\r\n case \"hide\": // to hide the edge labels\r\n if ((i == 0 && options.x < xAxis.x) || (i == lastLabel && options.x + textWidth > chartAreaWidth + chartAreaX)) {\r\n labelText = \"\";\r\n }\r\n }\r\n }\r\n //To perform rotation \r\n if (labelRotation != 0 && !vmlrendering) {\r\n label.displayText = typeof label.displayText == \"string\" && label.displayText.indexOf('
') != -1 ? ej.EjSvgRender.utils._getHighestLabel(xAxis, svgWidth, label.displayText) : label.displayText;\r\n this.labelRotation(xAxis, x + anchor, y, options, label, labelRotation);\r\n }\r\n //To perform labelIntersect Actions none , wrap, hide ,multiplerows\r\n if (xAxis.labelIntersectAction || xAxis.enableTrim) {\r\n this.diff = ej.util.isNullOrUndefined(this.diff) ? 0 : this.diff;\r\n if (intersectAction == 'none' && !xAxis.enableTrim) {\r\n if (typeof labelText == \"string\" && labelText.indexOf('
') != -1) {\r\n var labelTextColl = labelText.split('
');\r\n\r\n if (!insideLabels)\r\n options.y = (opposedPosition) ? options.y - (textHeight * (labelTextColl.length - 1)) : options.y;\r\n else\r\n options.y = (opposedPosition) ? options.y : options.y - (textHeight * (labelTextColl.length - 1));\r\n if (labelRotation != 0) {\r\n options.x = options.x + textWidth / 2;\r\n options['text-anchor'] = \"middle\";\r\n }\r\n\r\n this.svgRenderer.drawText(options, labelTextColl, isCanvas ? highestText : gTickEle);\r\n }\r\n else\r\n this.svgRenderer.drawText(options, labelText, isCanvas ? highestText : gTickEle);\r\n //create region to chart axis labels\r\n labels[i].region = this.calculateRegion(labelText, font, options, label);\r\n this.model.xAxisLabelRegions.push(labels[i].region)\r\n if (insideLabels)\r\n $(gTickEle).appendTo(this.gXaxisTickEle);\r\n else\r\n $(gTickEle).appendTo(this.gXaxisEle);\r\n continue;\r\n }\r\n else if ((intersectAction == 'wrap' || intersectAction == 'wrapbyword') && !xAxis.enableTrim) {\r\n\r\n line = 0;\r\n var labelTextColl = [], arrColl = [];\r\n if (typeof labelText == \"string\" && labelText.indexOf('
') != -1)\r\n labelTextColl = labelText.split('
');\r\n else\r\n labelTextColl.push(labelText);\r\n displayText = '';\r\n gap = gap <= 0 ? axisWidth / labels.length : gap;\r\n for (var col = 0; col < labelTextColl.length; col++) {\r\n textcoll = this.rowscalculation(labelTextColl[col].toString(), areaBoundWidth, xAxis, gap, options);\r\n for (var t = 0; t < textcoll.length; t++) {\r\n arrColl.push(textcoll[t]);\r\n displayText = displayText + textcoll[t];\r\n }\r\n }\r\n options.x = options.x + anchor;\r\n if (!(displayText.indexOf(\"...\") != -1))\r\n displayText = labelText;\r\n var highestText = ej.EjSvgRender.utils._getHighestLabel(xAxis, svgWidth, arrColl, null);\r\n var textSize = ej.EjSvgRender.utils._measureText(highestText, chartAreaWidth, font);\r\n var textWidth = textSize.width;\r\n options.x = options.x - (textWidth / 2);\r\n if (!insideLabels)\r\n options.y = (opposedPosition) ? options.y - (textHeight * (arrColl.length - 1)) : options.y;\r\n else\r\n options.y = (opposedPosition) ? options.y : options.y - (textHeight * (arrColl.length - 1));\r\n\r\n if (labelRotation != 0) {\r\n options['text-anchor'] = \"middle\";\r\n options.x = options.x + (textWidth / 2);\r\n }\r\n this.svgRenderer.drawText(options, arrColl, isCanvas ? highestText : gTickEle);\r\n\r\n labelSize = ej.EjSvgRender.utils._measureText(arrColl[0], null, font);\r\n var colLength = arrColl.length;\r\n textheight = labelSize.height * arrColl.length;\r\n bounds = { x: options.x, y: options.y, width: textWidth, height: textheight - textheight / (colLength) };\r\n labels[i].region = { bounds: bounds, labelText: label.Text, displayText: displayText };\r\n labels[i].displayText = displayText;\r\n this.model.xAxisLabelRegions.push(labels[i].region)\r\n continue;\r\n }\r\n else if (intersectAction == 'hide') {\r\n var xAxisLabelLength = labels.length - 1;\r\n for (var j = 0; j < i; j++) {\r\n // loop to get previous label\r\n\r\n preLabel = labels[j];\r\n temp = 0;\r\n prePoint = Math.abs(Math.floor(ej.EjSvgRender.utils._getPointXY(preLabel.Value, range, xAxis.isInversed) * (xAxis.width)));\r\n preTextWidth = ej.EjSvgRender.utils._measureText(preLabel.displayText, areaBoundWidth, xAxis.font).width;\r\n value = prePoint + ((xAxis.isInversed) ? -preTextWidth / 2 : preTextWidth / 2);\r\n value = (j == 0) ? value + this.diff : value;\r\n var width = (preTextWidth == 0) ? preTextWidth : textWidth;\r\n if ((i != xAxisLabelLength) || (i == xAxisLabelLength && textWidth <= preTextWidth))\r\n width = width / 2;\r\n if (position == \"shift\" && i == xAxisLabelLength) {\r\n var nextXLabel = labels[i],\r\n nextPoint = Math.abs(Math.floor(ej.EjSvgRender.utils._getPointXY(nextXLabel.Value, range, xAxis.isInversed) * (xAxis.width))),\r\n nextTextWidth = ej.EjSvgRender.utils._measureText(nextXLabel.displayText, areaBoundWidth, xAxis.font).width,\r\n nextValue = nextPoint + ((xAxis.isInversed) ? nextTextWidth / 2 : -nextTextWidth / 2);\r\n if ((xAxis.isInversed) ? (value <= nextValue - this.diff) : (value >= nextValue - this.diff))\r\n labelText = label.displayText = '';\r\n }\r\n if (intersectAction == 'hide' && ((xAxis.isInversed) ? (value < pointX + width) : (value > pointX - width)))\r\n label.displayText = labelText = '';\r\n }\r\n }\r\n else if (intersectAction == 'multiplerows' && !xAxis.enableTrim) { // to perform multipleRows on intersect\r\n\r\n var currentLabelColl = [];\r\n var currentLabel = label;\r\n if (typeof currentLabel.Text == \"string\" && currentLabel.Text.indexOf('
') != -1)\r\n currentLabelColl = currentLabel.Text.split('
');\r\n else\r\n currentLabelColl.push(currentLabel.Text);\r\n var collectionLength = currentLabelColl.length;\r\n if (labelText == '' && xAxis.edgeLabelPlacement == \"hide\") {\r\n for (var m = 0; m < collectionLength; m++)\r\n currentLabelColl[m] = '';\r\n }\r\n var largestText = ej.EjSvgRender.utils._getHighestLabel(xAxis, svgWidth, currentLabelColl),\r\n textWidth = ej.EjSvgRender.utils._measureText(largestText, chartAreaWidth, font).width,\r\n xAxisLabelLength = xAxis.visibleLabels.length - 1;\r\n textWidth = textWidth / 2;\r\n\r\n if (multipleRowsColl.length > 0) {\r\n var previousLabels = multipleRowsColl;\r\n for (var k = 0; k < previousLabels.length && !flag; k++) {\r\n var prevLabel = previousLabels[k];\r\n for (var l = 0; prevLabel && l < prevLabel.length; l++) {\r\n for (var c = 0; c < collectionLength; c++) {\r\n var temp = 0,\r\n textWidth = ej.EjSvgRender.utils._measureText(currentLabelColl[c], chartAreaWidth, font).width,\r\n preLabel = prevLabel[l],\r\n prePoint = Math.abs(Math.floor(ej.EjSvgRender.utils._getPointXY(preLabel.Value, range, xAxis.isInversed) * (xAxis.width))),\r\n preTextWidth = ej.EjSvgRender.utils._measureText(preLabel.Text, areaBoundWidth, xAxis.font).width;\r\n if (i != xAxisLabelLength)\r\n textWidth = textWidth / 2;\r\n var value = prePoint + ((xAxis.isInversed) ? -preTextWidth / 2 : preTextWidth / 2);\r\n if (this.edgeLabel || previousLabels.length == 1)\r\n value = value + this.diff;\r\n if ((xAxis.isInversed) ? (value < pointX + textWidth) : (value > pointX - textWidth)) {\r\n if (opposedPosition) {\r\n if (!insideLabels)\r\n temp = options.y - textHeight;\r\n else\r\n temp = options.y + textHeight;\r\n options.y = temp;\r\n count = count + 1;\r\n if (count < count1) {\r\n count = count + count1;\r\n count1 = 0;\r\n }\r\n if (k + 1 == previousLabels.length)\r\n flag = true;\r\n break;\r\n } else {\r\n if (!insideLabels)\r\n temp = options.y + textHeight;\r\n else\r\n temp = options.y - textHeight;\r\n options.y = temp;\r\n count = count + 1;\r\n if (count < count1) {\r\n count = count + count1;\r\n count1 = 0;\r\n }\r\n if (k + 1 == previousLabels.length)\r\n flag = true;\r\n break;\r\n\r\n }\r\n }\r\n else {\r\n if (l + 1 == prevLabel.length) {\r\n if (c == collectionLength - 1)\r\n flag = true;\r\n else {\r\n count1++;\r\n flag = false;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (temp == undefined) {\r\n if (multipleRowsColl[0] == undefined)\r\n multipleRowsColl[0] = [];\r\n if (collectionLength == 1)\r\n multipleRowsColl[0].push(currentLabel);\r\n else {\r\n for (var c = 0; c < collectionLength; c++) {\r\n if (multipleRowsColl[c] == undefined)\r\n multipleRowsColl[c] = [];\r\n multipleRowsColl[c].push({\r\n Text: currentLabelColl[c],\r\n Value: currentLabel.Value,\r\n });\r\n }\r\n }\r\n }\r\n else {\r\n if (multipleRowsColl[count] == undefined)\r\n multipleRowsColl[count] = [];\r\n if (collectionLength == 1)\r\n multipleRowsColl[count].push(currentLabel);\r\n else {\r\n for (var c = 0; c < collectionLength; c++) {\r\n if (multipleRowsColl[count] == undefined)\r\n multipleRowsColl[count] = [];\r\n multipleRowsColl[count].push({\r\n Text: currentLabelColl[c],\r\n Value: currentLabel.Value,\r\n });\r\n if (c != collectionLength - 1) {\r\n count = count + 1;\r\n }\r\n }\r\n }\r\n }\r\n if (!insideLabels)\r\n options.y = (opposedPosition) ? options.y - (textHeight * (currentLabelColl.length - 1)) : options.y;\r\n else\r\n options.y = (opposedPosition) ? options.y : options.y - (textHeight * (currentLabelColl.length - 1));\r\n if (labelRotation != 0) {\r\n var largestText = ej.EjSvgRender.utils._getHighestLabel(xAxis, svgWidth, currentLabelColl);\r\n textWidth = ej.EjSvgRender.utils._measureText(largestText, chartAreaWidth, font).width;\r\n options['text-anchor'] = \"middle\";\r\n options.x = options.x + textWidth / 2;\r\n }\r\n this.svgRenderer.drawText(options, currentLabelColl, gTickEle);\r\n\r\n }\r\n\r\n\r\n }\r\n if ((!this.edgeLabel) && !this.zoomed && !xAxis.zoomed && !(labelRotation) && !(labelIntersectAction == \"rotate90\") && !(labelIntersectAction == \"rotate45\") && (((pointX + xAxis.x) + (textWidth / 2)) > ($(this.svgObject).width()))) {\r\n $(options).attr('x', ($(this.svgObject).width() - 2));\r\n $(options).attr('text-anchor', 'end');\r\n }\r\n xAxis.visibleLabels[i].y = options.y;\r\n\r\n if (this.model.enableCanvasRendering && insideLabels && (xAxis.labelIntersectAction == \"rotate45\" || xAxis.labelIntersectAction == \"rotate90\")) {\r\n options.y = options.y - textWidth;\r\n }\r\n\r\n if ((intersectAction == \"trim\" || xAxis.enableTrim) && (xAxis._valueType != \"double\" || typeof label.displayText == \"string\")) {\r\n if (!insideLabels)\r\n options.y = (opposedPosition) ? options.y - (textHeight * (lblCollection.length - 1)) : options.y;\r\n else\r\n options.y = (opposedPosition) ? options.y : options.y - (textHeight * (lblCollection.length - 1));\r\n\r\n label.displayText = lblCollection.length > 0 ? lblCollection.join('') : labelText;\r\n if (!(label.displayText.indexOf(\"...\") != -1))\r\n label.displayText = labelText;\r\n this.svgRenderer.drawText(options, lblCollection.length > 0 ? lblCollection : labelText, isCanvas ? highestText : gTickEle);\r\n }\r\n else if (intersectAction != \"multiplerows\") {\r\n if (typeof labelText == \"string\" && labelText.indexOf('
') != -1) {\r\n labelTextColl = labelText.split('
');\r\n if (!insideLabels)\r\n options.y = (opposedPosition) ? options.y - (textHeight * (labelTextColl.length - 1)) : options.y;\r\n else\r\n options.y = (opposedPosition) ? options.y : options.y - (textHeight * (labelTextColl.length - 1));\r\n if (labelRotation != 0 || labelIntersectAction == \"rotate45\" || labelIntersectAction == \"rotate90\") {\r\n options.x = options.x + textWidth / 2;\r\n options['text-anchor'] = \"middle\";\r\n }\r\n this.svgRenderer.drawText(options, labelTextColl, isCanvas ? highestText : gTickEle);\r\n }\r\n else\r\n this.svgRenderer.drawText(options, labelText, isCanvas ? highestText : gTickEle);\r\n }\r\n //create region to chart axis labels\r\n if (i != labels.length - 1 && (intersectAction == \"trim\" || xAxis.enableTrim))\r\n options.x = options.x - textWidth / 2;\r\n xAxis.visibleLabels[i].region = this.calculateRegion(labelText, font, options, label, lblCollection ? lblCollection : labelTextColl, highestText, intersectAction);\r\n\r\n this.model.xAxisLabelRegions.push(xAxis.visibleLabels[i].region)\r\n }\r\n }\r\n }\r\n $(gTickEle).appendTo(this.gXaxisEle);\r\n\r\n },\r\n calculateRegion: function (labelText, font, options, label, lblCollection, highestText, intersectAction) {\r\n\r\n if (intersectAction == \"trim\" && lblCollection.length > 0) {\r\n var labelTxt = lblCollection.join('');\r\n if (!(labelTxt.indexOf(\"...\") != -1))\r\n labelTxt = label.Text;\r\n }\r\n else\r\n var labelTxt = highestText ? highestText : labelText;\r\n var count = lblCollection ? lblCollection.length : 1;\r\n var labelSize = count > 1 && highestText ? ej.EjSvgRender.utils._measureText(highestText, null, font) : ej.EjSvgRender.utils._measureText(labelTxt, null, font);\r\n var textHeight = labelSize.height * count;\r\n var bounds = { x: options.x, y: options.y, width: labelSize.width, height: textHeight };\r\n var xAxisLabelRegions = { bounds: bounds, trimText: labelTxt, labelText: label.Text };\r\n return xAxisLabelRegions;\r\n },\r\n rowscalculation: function (labelText, areaBoundWidth, xAxis, gap, options) {\r\n var measureText = ej.EjSvgRender.utils._measureText,\r\n font = xAxis.font,\r\n textSize = measureText(labelText, areaBoundWidth, font),\r\n textWidth = textSize.width,\r\n anchor = textWidth / 2,\r\n text = labelText.toString(),\r\n textLength = text.length,\r\n textcollection = [],\r\n i = 0, line, currentTextCollextion,\r\n intersectAction = xAxis.labelIntersectAction,\r\n labelCollection = text.split(' '),\r\n labelCollectionLength = labelCollection.length;\r\n\r\n if (this.edgeLabel) gap = (i == 0) ? gap - this.diff : gap;\r\n\r\n if (textWidth > gap && options) {\r\n line = 0;\r\n if (this.edgeLabel) options.x = (i == 0) ? options.x - this.diff : options.x + this.diff;\r\n }\r\n\r\n if (intersectAction == 'wrap') {\r\n if (textWidth > gap) {\r\n for (var w = 1; w <= text.length; w++) {\r\n labelText = text.substring(0, w);\r\n textWidth = measureText(labelText, areaBoundWidth, font).width;\r\n if (textWidth > gap) {\r\n line = line + 1; // To find the no of rows splitted\r\n labelText = text.substring(0, w - 1);\r\n textcollection[i] = labelText;\r\n text = text.slice(w - 1, textLength);\r\n currentTextCollextion = text.split(' ');\r\n text = labelCollection.indexOf(currentTextCollextion[0]) > -1 ? text : '-' + text;\r\n var newTextWidth = measureText(labelText, areaBoundWidth, font).width;\r\n\r\n i++;\r\n w = 0;\r\n }\r\n }\r\n }\r\n if (options) options.x = (xAxis.valueType == \"datetimeCategory\" && xAxis.labelPlacement.toLowerCase() == \"betweenticks\") ? xAxis._gap : options.x;\r\n textcollection[i] = labelText;\r\n }\r\n else {\r\n var max = 0, word, currentWidth, nextWidth;\r\n\r\n for (var i = 0; i < labelCollectionLength; i++) {\r\n word = labelCollection[i];\r\n currentWidth = measureText(word, areaBoundWidth, font).width;\r\n if (currentWidth < gap && textWidth > gap) {\r\n while (i < labelCollectionLength) {\r\n currentWidth = measureText(word, areaBoundWidth, font).width;\r\n nextWidth = (labelCollection[i + 1]) ? measureText(labelCollection[i + 1], areaBoundWidth, font).width : 0;\r\n if ((currentWidth + nextWidth) <= gap && nextWidth > 0) {\r\n word = word.concat(' ' + labelCollection[i + 1]);\r\n i++;\r\n }\r\n else {\r\n // find the maximum width of the lines\r\n max = Math.max(max, currentWidth);\r\n break;\r\n }\r\n }\r\n textcollection.push(word);\r\n }\r\n else {\r\n if (textWidth > gap) {\r\n word = ej.EjSvgRender.utils._trimText(word, gap, font);\r\n newTextWidth = measureText(word, areaBoundWidth, font).width;\r\n max = Math.max(max, newTextWidth)\r\n textcollection.push(word);\r\n } else {\r\n textcollection.push(labelText);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n return textcollection;\r\n },\r\n\r\n labelRotation: function (axis, x, y, options, label, degree, i) {\r\n var opposedPosition = axis._opposed;\r\n // To rotate axis labels\r\n var labelText = (label.displayText) ? label.displayText : label.Text;\r\n var angle = (degree > 360) ? degree - 360 : (degree < -360) ? degree + 360 : degree;\r\n var rotate = 'rotate(' + angle + ',' + (x) + ',' + y + ')';\r\n $(options).attr('transform', rotate);\r\n $(options).attr('labelRotation', angle);\r\n $(options).attr('labelPosition', axis.labelPosition);\r\n var textElement = this.svgRenderer.createText(options, labelText);\r\n var diffHeight = Math.ceil(ej.EjSvgRender.utils._measureBounds(textElement, this).height - ej.EjSvgRender.utils._measureText(labelText, null, axis.font).height);\r\n diffHeight = axis._LableMaxWidth.height - diffHeight - ej.EjSvgRender.utils._measureText(labelText, null, axis.font).height;\r\n\r\n if (axis.labelPosition != 'inside')\r\n var yLocation = (opposedPosition) ? (diffHeight / 2) : (-diffHeight / 2);\r\n else\r\n var yLocation = (opposedPosition) ? (-diffHeight / 2) : (diffHeight / 2);\r\n\r\n rotate = 'rotate(' + angle + ',' + (x) + ',' + (y + (this.model.enableCanvasRendering && axis.opposedPosition ? -yLocation : yLocation)) + ')';\r\n if (this.edgeLabel && degree == 90)\r\n y = (i == 0) ? options.y + this.diff : options.y - this.diff;\r\n\r\n $(options).attr({\r\n 'transform': rotate,\r\n 'y': (y + (this.model.enableCanvasRendering && axis.opposedPosition ? -yLocation : yLocation))\r\n });\r\n },\r\n\r\n _drawYAxisLabels: function (axisIndex, yAxis) {\r\n // method to draw y axis labels\r\n //if(yAxis.labelPosition=='inside')\r\n var axisName = (yAxis.name).replace(/[^a-zA-Z0-9]/g, \"\"),\r\n gEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_YAxisLabels' + '_' + axisIndex, 'cursor': 'default' }),\r\n labelSize, textElement, diffHeight,\r\n yAxisLabelRegions, opposedPosition = yAxis._opposed,\r\n insideLabels = yAxis.labelPosition == 'inside',\r\n insideTicks = yAxis.tickLinesPosition == 'inside',\r\n bounds,\r\n regionX, areaBounds = this.model.m_AreaBounds,\r\n requireInvertedAxes = this.model.requireInvertedAxes,\r\n isCanvas = this.model.enableCanvasRendering,\r\n isScroll = yAxis._isScroll && !(yAxis.scrollbarSettings.pointsLength != null && yAxis.scrollbarSettings.pointsLength < yAxis.maxPointLength), pointY, text, position, lastLabel,\r\n textHeight, yLocation,\r\n font = yAxis.font,\r\n range = yAxis.visibleRange,\r\n lineWidth = yAxis.axisLine.width,\r\n labelMaxWidth = yAxis._LableMaxWidth,\r\n labelMaxHeight = labelMaxWidth.height,\r\n labelMaxRow = labelMaxWidth.rows,\r\n areaBounds = this.model.m_AreaBounds,\r\n areaBoundWidth = areaBounds.Width,\r\n gap = yAxis.maximumLabelWidth, // width for 4 digits\r\n labelText, x, textAnchor, diff, angle, rotate,\r\n textSize, options, scrollerSize = this.model.scrollerSize,\r\n textWidth, intersectAction = yAxis.labelIntersectAction.toLowerCase(),\r\n label, labels = yAxis.visibleLabels,\r\n visibleRange = range, inversed = yAxis.isInversed, axisHeight = yAxis.height,\r\n prevLabel, temp, prevPoint, prevTextHeight, value,\r\n degree = yAxis.labelRotation, maxLineWidth,\r\n yAxisAlignment = yAxis.alignment.toLowerCase(), pixel = 3, y;\r\n if (axisIndex != 1 && ((insideLabels && insideTicks) || (insideLabels && !insideTicks) && !((yAxis.x == (areaBounds.Width + areaBounds.X)) || (yAxis.x == areaBounds.X))))\r\n yAxis.x = (!opposedPosition) ? (yAxis.showNextToAxisLine) ? Math.floor(yAxis.x) : Math.floor(yAxis.x - labelMaxWidth.width - this.model.elementSpacing) : insideLabels && insideTicks ? Math.floor(yAxis.x) : Math.floor(yAxis.x + labelMaxWidth.width + this.model.elementSpacing);\r\n else if (axisIndex != 1 && (!(yAxis.x == (areaBounds.Width + areaBounds.X)) || (yAxis.x == areaBounds.X)) && (!insideLabels && insideTicks)) {\r\n yAxis._x = Math.floor(yAxis.x);\r\n yAxis.x = (!opposedPosition) ? !yAxis.showNextToAxisLine ? Math.floor(areaBounds.X) : Math.floor(yAxis.x - yAxis.majorTickLines.size) : Math.floor(yAxis.x + yAxis.majorTickLines.size);\r\n }\r\n else {\r\n yAxis._x = Math.floor(yAxis.x);//to store the current positons of the labels,before the property showNextToAxisLine as false.\r\n yAxis.x = (!yAxis.showNextToAxisLine) ? opposedPosition ? Math.floor(areaBounds.X + areaBounds.Width) : Math.floor(areaBounds.X) : Math.floor(yAxis.x);\r\n }\r\n\r\n for (var i = 0; i < labels.length; i++) {\r\n label = labels[i];\r\n if (ej.EjSvgRender.utils._inside(label.Value, visibleRange)) {\r\n pointY = Math.abs(ej.EjSvgRender.utils._getPointXY(label.Value, visibleRange, inversed) * axisHeight);\r\n text = ej.EjSvgRender.utils._measureText(label.Text, areaBounds.Height, font);\r\n textHeight = text.height;\r\n labelText = label.displayText = label.Text;\r\n textSize = ej.EjSvgRender.utils._measureText(labelText, areaBoundWidth, font);\r\n textWidth = textSize.width;\r\n\r\n if (insideLabels && insideTicks) {\r\n x = (opposedPosition) ? (yAxis.x - (yAxis.majorTickLines.size) - (lineWidth / 2) - 5)\r\n : (yAxis.x + (lineWidth / 2) + 5 + yAxis.majorTickLines.size);\r\n textanchor = (opposedPosition) ? 'end' : 'start';\r\n }\r\n else if (insideLabels && !insideTicks) {\r\n x = (opposedPosition) ? (yAxis.x - (lineWidth / 2) - 5)\r\n : (yAxis.x + (lineWidth / 2) + 5);\r\n textanchor = (opposedPosition) ? 'end' : 'start';\r\n }\r\n else if (insideTicks && !insideLabels) {\r\n\r\n x = (opposedPosition) ? ((lineWidth / 2) + yAxis.x + 5)\r\n : (yAxis.x - (lineWidth / 2) - 5);\r\n textanchor = (opposedPosition) ? 'start' : 'end';\r\n x = x - ((isScroll ? (opposedPosition ? -scrollerSize : scrollerSize) : 0));\r\n }\r\n else {\r\n x = (opposedPosition) ? ((yAxis.majorTickLines.size) + (lineWidth / 2) + yAxis.x + 5)\r\n : (yAxis.x - (lineWidth / 2) - 5 - yAxis.majorTickLines.size);\r\n textanchor = (opposedPosition) ? 'start' : 'end';\r\n x = x - ((isScroll ? (opposedPosition ? -scrollerSize : scrollerSize) : 0));\r\n }\r\n if (yAxis.majorGridLines.width > yAxis.majorTickLines.width)\r\n maxLineWidth = yAxis.majorGridLines.width;\r\n else maxLineWidth = yAxis.majorTickLines.width;\r\n if (yAxisAlignment == \"far\")\r\n y = ((-pointY) + (yAxis.y + axisHeight)) - maxLineWidth - pixel;\r\n else if (yAxisAlignment == \"near\")\r\n y = ((-pointY) + (yAxis.y + axisHeight) + textHeight / 2) + maxLineWidth + pixel;\r\n else\r\n y = ((-pointY) + (yAxis.y + axisHeight) + textHeight / 4);\r\n options = {\r\n 'id': this.svgObject.id + '_' + axisName + '_YLabel_' + i,\r\n 'x': x,\r\n 'y': y,\r\n 'fill': font.color,\r\n 'font-size': font.size,\r\n 'font-family': font.fontFamily,\r\n 'font-style': font.fontStyle,\r\n 'font-weight': font.fontWeight,\r\n 'opacity': font.opacity,\r\n 'text-anchor': !ej.util.isNullOrUndefined(degree) && degree != 0 ? \"middle\" : textanchor\r\n };\r\n labelText = (label.displayText) ? label.displayText : label.Text;\r\n var labelCollection = [], highestText;\r\n if (typeof labelText == \"string\" && labelText.indexOf('
') != -1) {\r\n labelCollection = labelText.split('
');\r\n highestText = labelText = ej.EjSvgRender.utils._getHighestLabel(yAxis, areaBounds.Height, labelCollection);\r\n textWidth = ej.EjSvgRender.utils._measureText(labelText, areaBoundWidth, font).width;\r\n }\r\n else\r\n labelCollection.push(labelText);\r\n\r\n // To set position of edge labels in yAxis\r\n if (yAxis.edgeLabelPlacement) {\r\n position = yAxis.edgeLabelPlacement.toLowerCase();\r\n lastLabel = labels.length - 1;\r\n\r\n switch (position) {\r\n case \"none\":\r\n break;\r\n case \"shift\":\r\n {\r\n if (i == 0) { // Shift first label\r\n if (options.y > yAxis.y + axisHeight) {\r\n diff = options.y - (yAxis.y + axisHeight);\r\n options.y = y = options.y - diff;\r\n this.diff = diff;\r\n this.edgeLabel = true;\r\n }\r\n } else if (i == lastLabel) // Shift last label\r\n if (options.y - textHeight / 2 < yAxis.y) {\r\n diff = yAxis.y - (options.y - textHeight / 2);\r\n options.y = y = options.y + diff;\r\n this.diff = diff;\r\n this.edgeLabel = true;\r\n }\r\n break;\r\n }\r\n case \"hide\": //to hide the edge labels\r\n if ((i == 0 && options.y > yAxis.y + axisHeight) || (i == lastLabel && options.y - textHeight / 2 < areaBounds.Y)) {\r\n labelText = label.Text = \"\";\r\n if (labelCollection.length == 1) labelCollection[0] = labelText;\r\n }\r\n }\r\n }\r\n\r\n //To perform rotation \r\n if (!ej.util.isNullOrUndefined(degree) && degree != 0 && !this.svgRenderer.vmlNamespace) {\r\n if (!insideLabels)\r\n x = (opposedPosition) ? (x + textWidth / 2) : (x - textWidth / 2);\r\n else\r\n x = (opposedPosition) ? (x - textWidth / 2) : (x + textWidth / 2);\r\n\r\n labelText = (label.displayText) ? label.displayText : label.Text;\r\n labelText = highestText ? highestText : labelText;\r\n angle = (degree > 360) ? degree - 360 : (degree < -360) ? degree + 360 : degree;\r\n rotate = 'rotate(' + angle + ',' + (x) + ',' + y + ')';\r\n $(options).attr('transform', rotate);\r\n $(options).attr('labelRotation', angle);\r\n textElement = this.svgRenderer.createText(options, labelText);\r\n diffHeight = Math.ceil(ej.EjSvgRender.utils._measureBounds(textElement, this).width -\r\n ej.EjSvgRender.utils._measureText(labelText, null, font).width);\r\n\r\n if (!insideLabels)\r\n yLocation = (opposedPosition) ? (diffHeight / 2) : (-diffHeight / 2);\r\n else\r\n yLocation = (opposedPosition) ? (-diffHeight / 2) : (diffHeight / 2);\r\n\r\n rotate = 'rotate(' + angle + ',' + (x + yLocation) + ',' + (y) + ')';\r\n\r\n $(options).attr({\r\n 'transform': rotate,\r\n 'x': (x + yLocation)\r\n });\r\n }\r\n\r\n //Label intersection\r\n if (yAxis.labelIntersectAction || yAxis.enableTrim) {\r\n if (intersectAction == 'none' && !(yAxis.enableTrim)) {\r\n this.svgRenderer.drawText(options, labelCollection.length > 0 ? labelCollection : label.Text, isCanvas && highestText ? highestText : gEle);\r\n labelSize = ej.EjSvgRender.utils._measureText(labelText, null, font);\r\n if (yAxis.opposedPosition)\r\n regionX = options.x;\r\n else\r\n regionX = options.x - labelSize.width;\r\n // yAxis labels region stored \r\n bounds = { x: regionX, y: options.y, width: labelSize.width, height: labelSize.height };\r\n yAxisLabelRegions = { bounds: bounds, trimText: labelText, labelText: label.Text };\r\n yAxis.visibleLabels[i].region = { bounds: bounds, trimText: labelText, labelText: label.Text };\r\n this.model.yAxisLabelRegions.push(yAxisLabelRegions)\r\n continue;\r\n }\r\n else if (yAxis.enableTrim) {\r\n for (var l = 0; l < labelCollection.length; l++) {\r\n var labelText = labelCollection[l];\r\n textWidth = ej.EjSvgRender.utils._measureText(labelText, null, font).width;\r\n if (textWidth > gap && labelText != \"\") { // check textwidth is greater than gap\r\n for (var t = 1; t < labelText.toString().length; t++) {\r\n labelText = label.displayText.toString().substring(0, t - 1) + '...';\r\n textWidth = ej.EjSvgRender.utils._measureText(labelText, areaBoundWidth, font).width;\r\n if (textWidth >= gap) {\r\n labelText = labelText.toString().substring(0, t - 1) + '...';\r\n break;\r\n }\r\n }\r\n label.displayText = labelCollection[l] = labelText;\r\n }\r\n }\r\n\r\n }\r\n\r\n for (var j = 0; j < i; j++) {\r\n prevLabel = labels[j];\r\n temp = 0;\r\n prevPoint = Math.abs((ej.EjSvgRender.utils._getPointXY(prevLabel.Value, range, inversed) * (axisHeight)));\r\n prevTextHeight = ej.EjSvgRender.utils._measureText(prevLabel.Text, areaBounds.Height, font).height;\r\n value = ((prevPoint * -1) + (yAxis.y + axisHeight) + prevTextHeight / 4);\r\n value = value + ((inversed) ? prevTextHeight / 2 : -prevTextHeight / 2);\r\n if (this.edgeLabel)\r\n value = (j == 0) ? value - prevTextHeight / 4 : value;\r\n if (intersectAction == 'hide' && prevLabel.Text.toString() != \"\" && ((inversed) ? value > options.y - textHeight / 4 : value < options.y + textHeight / 4))\r\n labelText = label.Text = '';\r\n else if (intersectAction == 'multiplerows' && ((inversed) ? value > options.y - textHeight / 4 : value < options.y + textHeight / 4) && prevLabel.x == options.x) {\r\n options.x = prevLabel.x + opposedPosition ? (!insideLabels ? (labelMaxWidth.maxWidth + 5) : (-labelMaxWidth.maxWidth - 5)) : (!insideLabels ? (-labelMaxWidth.maxWidth - 5) : (labelMaxWidth.maxWidth + 5));\r\n }\r\n }\r\n }\r\n\r\n labels[i].x = options.x;\r\n this.svgRenderer.drawText(options, labelCollection.length > 0 ? labelCollection : labelText, gEle);\r\n //create region to chart axis labels\r\n labelSize = ej.EjSvgRender.utils._measureText(labelText, null, font);\r\n\r\n if (opposedPosition)\r\n regionX = options.x;\r\n else\r\n regionX = options.x - labelSize.width;\r\n\r\n // yAxis labels region stored \r\n bounds = { x: regionX, y: options.y, width: labelSize.width, height: labelSize.height };\r\n yAxisLabelRegions = { bounds: bounds, trimText: labelText, labelText: label.Text };\r\n labels[i].region = { bounds: bounds, trimText: labelText, labelText: label.Text };\r\n this.model.yAxisLabelRegions.push(yAxisLabelRegions)\r\n\r\n\r\n }\r\n }\r\n $(gEle).appendTo(this.gYaxisEle);\r\n },\r\n //To Trim axis title\r\n trimText: function (text, maxLength, ellipsis) {\r\n maxLength--;\r\n text = text.substring(0, maxLength - ellipsis.length);\r\n return text + ellipsis;\r\n },\r\n\r\n _drawXTitle: function (axisIndex, axis) {\r\n\r\n if (axis.title.text != \"\" && axis.title.text && axis.title.visible) {\r\n var gEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_XAxis_Title' + '_' + axisIndex, 'cursor': 'default' }),\r\n xtitleLocation = (this.model.elementSpacing) + axis._LableMaxWidth.height,\r\n axisTitleSize = ej.EjSvgRender.utils._measureText(axis.title.text, (axis.width), axis.title.font),\r\n titlesize = axisTitleSize.height / 2,\r\n opposedPosition = axis._opposed,\r\n titleText = axis.title.text,\r\n _LableMaxWidth = axis._LableMaxWidth,\r\n textAnchor = \"middle\",\r\n elementSpacing = this.model.elementSpacing,\r\n isEnableTrim = axis.title.enableTrim,\r\n isScroll = (axis._isScroll || (this.model.zooming.enableScrollbar && axis.scrollbarSettings.visible && (axis.zoomFactor < 1 || axis.zoomPosition > 0))),\r\n axisTitleWidth = axis.title.maximumTitleWidth,\r\n axisTitlePosition = axis.title.position.toLowerCase(),\r\n axisTitleAlignment = axis.title.alignment.toLowerCase(), y,\r\n tickLinesPosition = axis.tickLinesPosition.toLowerCase(),\r\n labelPosition = axis.labelPosition.toLowerCase(),\r\n m_AreaBounds = this.model.m_AreaBounds,\r\n axistitleoffset = axis.title.offset, locX, newY,\r\n scrollerSize = this.model.scrollerSize;\r\n if (isEnableTrim && (ej.util.isNullOrUndefined(axisTitleWidth) || axisTitleWidth > 0 || isNaN(axisTitleWidth))) {\r\n var maxTitleWidth = (!axisTitleWidth) ? axis.width - (elementSpacing * 2) : axisTitleWidth;\r\n while (axisTitleSize.width > maxTitleWidth) {\r\n titleText = this.trimText(titleText, titleText.length, \"...\");\r\n axisTitleSize = ej.EjSvgRender.utils._measureText(titleText, (axis.width), axis.title.font);\r\n if (titleText == \"...\") {\r\n titleText = \"\";\r\n break;\r\n }\r\n }\r\n }\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n\r\n var y = elementSpacing + _LableMaxWidth.height + titlesize + axis._multiLevelLabelHeight + axis.majorTickLines.size + axis.axisLine.width;\r\n\r\n if ((tickLinesPosition == 'inside' && labelPosition == 'inside') && (axisIndex == 0 || (axis.y == (m_AreaBounds.Height + m_AreaBounds.Y)) || (axis.y == (m_AreaBounds.Y))))\r\n y = (axisTitlePosition == \"inside\") ? elementSpacing + _LableMaxWidth.height + titlesize + axis._multiLevelLabelHeight + axis.majorTickLines.size + axis.axisLine.width : elementSpacing + titlesize + axis.axisLine.width;\r\n else if ((axisIndex == 0 || (axis.y == (m_AreaBounds.Width + m_AreaBounds.X)) || (axis.y == (m_AreaBounds.X))) && (tickLinesPosition != 'inside' && labelPosition == 'inside'))\r\n y = (axisTitlePosition == \"inside\") ? elementSpacing + _LableMaxWidth.height + titlesize + axis._multiLevelLabelHeight + axis.axisLine.width : elementSpacing + axis.majorTickLines.size + axis.axisLine.width;\r\n else if ((axisIndex == 0 || (axis.y == (m_AreaBounds.Width + m_AreaBounds.X)) || (axis.y == (m_AreaBounds.X))) && (tickLinesPosition == 'inside' && labelPosition != 'inside'))\r\n y = (axisTitlePosition == \"inside\") ? elementSpacing + titlesize + axis.majorTickLines.size + axis.axisLine.width : elementSpacing + _LableMaxWidth.height + titlesize + axis._multiLevelLabelHeight + axis.axisLine.width;\r\n else if ((tickLinesPosition != 'inside' && labelPosition != 'inside') || (axisIndex != 1))\r\n y = (axisTitlePosition == \"inside\") ? elementSpacing : elementSpacing + _LableMaxWidth.height + titlesize + axis.majorTickLines.size + axis.axisLine.width + axis._multiLevelLabelHeight;\r\n else if ((tickLinesPosition != 'inside' && labelPosition == 'inside' && !axis.showNextToAxisLine))\r\n y = (axisTitlePosition == \"inside\") ? elementSpacing + _LableMaxWidth.height + titlesize + axis._multiLevelLabelHeight + axis.axisLine.width : elementSpacing + titlesize + axis.majorTickLines.size + axis.axisLine.width + elementSpacing + elementSpacing;\r\n if (axisTitleAlignment == \"far\") {\r\n locX = axis.x + axis.width + axistitleoffset;\r\n textAnchor = \"end\";\r\n }\r\n else if (axisTitleAlignment == \"near\") {\r\n locX = axis.x + axistitleoffset;\r\n textAnchor = \"start\";\r\n }\r\n else\r\n locX = (axis.x + axis.width / 2) + axistitleoffset;\r\n\r\n commonEventArgs.data = { title: axis.title.text, location: { x: locX, y: y }, axes: axis };\r\n this._trigger(\"axesTitleRendering\", commonEventArgs);\r\n\r\n if (axisTitlePosition == \"inside\")\r\n newY = ((opposedPosition) ? (tickLinesPosition == \"inside\" && labelPosition == \"outside\" ? axis.y + commonEventArgs.data.location.y - (isScroll ? scrollerSize : 0) - axis.majorTickLines.size\r\n : (axis.y + commonEventArgs.data.location.y - (isScroll ? scrollerSize : 0)))\r\n : (tickLinesPosition == \"outside\" && labelPosition == \"inside\" ? (isScroll ? scrollerSize : 0) + (axis.y - commonEventArgs.data.location.y) + axis.majorTickLines.size\r\n : (isScroll ? scrollerSize : 0) + (axis.y - commonEventArgs.data.location.y))) + axisTitleSize.height / 3.5;\r\n else\r\n newY = ((opposedPosition) ? (tickLinesPosition == \"inside\" && labelPosition == \"outside\" ? axis.y - commonEventArgs.data.location.y - (isScroll ? scrollerSize : 0) - axis.majorTickLines.size\r\n : (axis.y - commonEventArgs.data.location.y - (isScroll ? scrollerSize : 0)))\r\n : (tickLinesPosition == \"outside\" && labelPosition == \"inside\" ? (isScroll ? scrollerSize : 0) + (commonEventArgs.data.location.y + axis.y) - axis.majorTickLines.size\r\n : (isScroll ? scrollerSize : 0) + (commonEventArgs.data.location.y + axis.y))) + axisTitleSize.height / 3.5;\r\n\r\n var options = {\r\n 'id': this.svgObject.id + '_XAxisTitle' + '_' + axisIndex,\r\n 'x': commonEventArgs.data.location.x,\r\n 'y': newY,\r\n 'fill': axis.title.font.color,\r\n 'font-size': axis.title.font.size,\r\n 'font-family': axis.title.font.fontFamily,\r\n 'font-style': axis.title.font.fontStyle,\r\n 'font-weight': axis.title.font.fontWeight,\r\n 'opacity': axis.title.font.opacity,\r\n 'text-anchor': textAnchor\r\n };\r\n if (this.model.enableCanvasRendering) {\r\n var matched = jQuery.uaMatch(navigator.userAgent);\r\n var isIE11 = !!navigator.userAgent.match(/Trident\\/7\\./);\r\n var browser = matched.browser.toLowerCase();\r\n if (browser != \"msie\" && !isIE11)\r\n options.y = !opposedPosition ? options.y + (titlesize / 2) + (browser == \"mozilla\" ? 1 : -2) : options.y + (titlesize / 2) + 1; // text dominant baseline for canvas\r\n }\r\n if ($(this.svgObject).find(\"#\" + this.svgObject.id + '_XAxisTitle' + '_' + axisIndex).length > 0)\r\n $(this.svgObject).find(\"#\" + this.svgObject.id + '_XAxisTitle' + '_' + axisIndex).attr(options);\r\n else if (!isEnableTrim)\r\n this.svgRenderer.drawText(options, commonEventArgs.data.title, gEle);\r\n else if (isEnableTrim && (ej.util.isNullOrUndefined(axisTitleWidth) || axisTitleWidth > 0 || isNaN(axisTitleWidth))) {\r\n var x = (textAnchor == \"middle\") ? options.x - (axisTitleSize.width) / 2 : (textAnchor == \"end\" ? options.x - axisTitleSize.width : options.x);\r\n var bounds = { X: x, Y: options.y, Width: axisTitleSize.width, Height: axisTitleSize.height };\r\n var xAxisTitleRegion = { Bounds: bounds, trimText: titleText, labelText: axis.title.text };\r\n this.model.xAxisTitleRegion.push(xAxisTitleRegion)\r\n this.svgRenderer.drawText(options, titleText, gEle);\r\n }\r\n\r\n if (!this.model.enableCanvasRendering) {\r\n var borderY = (textAnchor == \"start\" ? 0 : (textAnchor == \"end\" ? axisTitleSize.width : axisTitleSize.width / 2));\r\n var borderOptions = {\r\n 'id': this.svgObject.id + '_XAxisTitleBorder' + '_' + axisIndex,\r\n 'x': commonEventArgs.data.location.x - borderY - elementSpacing,\r\n 'y': newY - axisTitleSize.height + (axisTitleSize.height / 4),\r\n 'width': axisTitleSize.width + (2 * elementSpacing),\r\n 'height': axisTitleSize.height,\r\n 'fill': \"transparent\",\r\n 'class': \"e-xaxistitleborder\"\r\n };\r\n this.svgRenderer.drawRect(borderOptions, gEle);\r\n }\r\n $(gEle).appendTo(this.gXaxisEle);\r\n }\r\n },\r\n _drawYTitle: function (axisIndex, yAxis) {\r\n\r\n if (yAxis.title.text != \"\" && yAxis.title.text && yAxis.title.visible) {\r\n var opposedPosition = yAxis._opposed,\r\n elementSpacing = this.model.elementSpacing,\r\n textAnchor = \"middle\",\r\n isTransposed = this.model.series.isTransposed,\r\n majorTickLinesize = yAxis.majorTickLines.size,\r\n axisTitlePosition = yAxis.title.position.toLowerCase(),\r\n _LableMaxWidth = yAxis._LableMaxWidth,\r\n m_AreaBounds = this.model.m_AreaBounds, x,\r\n axisLine = yAxis.axisLine,\r\n tickLinesPosition = yAxis.tickLinesPosition.toLowerCase(),\r\n labelPosition = yAxis.labelPosition.toLowerCase(),\r\n titleText = yAxis.title.text,\r\n isEnableTrim = yAxis.title.enableTrim,\r\n requireInvertedAxes = this.model.requireInvertedAxes, y,\r\n isScroll = yAxis._isScroll,\r\n axisTitleWidth = yAxis.title.maximumTitleWidth,\r\n axistitleoffset = yAxis.title.offset,\r\n axisTitleAlignment = yAxis.title.alignment.toLowerCase(),\r\n gEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_YAxisTitleGroup' + '_' + axisIndex, 'cursor': 'default' });//Group id and text element id should not be same\r\n var titleSize = ej.EjSvgRender.utils._measureText(yAxis.title.text, (yAxis.height), yAxis.title.font);\r\n if ((tickLinesPosition == 'inside' && labelPosition == 'inside') && (axisIndex == 1 || (yAxis.x == (m_AreaBounds.Width + m_AreaBounds.X)) || (yAxis.x == (m_AreaBounds.X)))) {\r\n if (axisTitlePosition == \"inside\")\r\n x = (opposedPosition) ? (yAxis.x - ((3 * elementSpacing) + _LableMaxWidth.width + yAxis._multiLevelLabelHeight + majorTickLinesize + axisLine.width)) : yAxis.x + ((3 * elementSpacing) + _LableMaxWidth.width + yAxis._multiLevelLabelHeight + majorTickLinesize + axisLine.width);\r\n else\r\n x = (opposedPosition) ? yAxis.x + ((3 * elementSpacing) + axisLine.width - 5) : yAxis.x - ((3 * elementSpacing) + axisLine.width);\r\n } else if ((axisIndex == 1 || (yAxis.x == (m_AreaBounds.Width + m_AreaBounds.X)) || (yAxis.x == (m_AreaBounds.X))) && (tickLinesPosition != 'inside' && labelPosition == 'inside')) {\r\n if (axisTitlePosition == \"inside\")\r\n x = (opposedPosition) ? (yAxis.x - ((3 * elementSpacing) + _LableMaxWidth.width + axis._multiLevelLabelHeight + axisLine.width)) : yAxis.x + ((3 * elementSpacing) + _LableMaxWidth.width + yAxis._multiLevelLabelHeight + axisLine.width);\r\n else\r\n x = (opposedPosition) ? yAxis.x + ((3 * elementSpacing) + majorTickLinesize + axisLine.width) : yAxis.x - ((3 * elementSpacing) + majorTickLinesize + axisLine.width);\r\n } else if ((axisIndex == 1 || (yAxis.x == (m_AreaBounds.Width + m_AreaBounds.X)) || (yAxis.x == (m_AreaBounds.X))) && (tickLinesPosition == 'inside' && labelPosition != 'inside')) {\r\n if (axisTitlePosition == \"inside\")\r\n x = (opposedPosition) ? (yAxis.x - ((3 * elementSpacing) + majorTickLinesize + axisLine.width)) : yAxis.x + ((3 * elementSpacing) + majorTickLinesize + axisLine.width) +\r\n (!yAxis.showNextToAxisLine ? -(elementSpacing) : labelPosition == \"inside\" ? -yAxis._multiLevelLabelHeight : yAxis._multiLevelLabelHeight);\r\n\r\n else\r\n x = (opposedPosition) ? yAxis.x + ((3 * elementSpacing) + yAxis._multiLevelLabelHeight + _LableMaxWidth.width + axisLine.width) : yAxis.x - ((3 * elementSpacing) + _LableMaxWidth.width + axisLine.width + yAxis._multiLevelLabelHeight);\r\n } else if ((yAxis.tickLinesPosition != 'inside' && yAxis.labelPosition != 'inside') || (axisIndex != 1)) {\r\n if (axisTitlePosition == \"inside\")\r\n x = (opposedPosition) ? (yAxis.x - (elementSpacing + axisLine.width + majorTickLinesize)) : yAxis.x + (elementSpacing + (!yAxis.showNextToAxisLine ? _LableMaxWidth.width : 0) + axisLine.width + majorTickLinesize);\r\n else\r\n x = (opposedPosition) ? yAxis.x + ((3 * elementSpacing) + yAxis._multiLevelLabelHeight + _LableMaxWidth.width + majorTickLinesize + axisLine.width) : yAxis.x - ((3 * elementSpacing) + _LableMaxWidth.width + yAxis._multiLevelLabelHeight + majorTickLinesize + axisLine.width);\r\n }\r\n var axisTitleSize = ej.EjSvgRender.utils._measureText(titleText, (yAxis.height), yAxis.title.font);\r\n if (isEnableTrim && (ej.util.isNullOrUndefined(axisTitleWidth) || axisTitleWidth > 0 || isNaN(axisTitleWidth))) {\r\n var maxTitleWidth = (!axisTitleWidth) ? yAxis.height - (elementSpacing * 2) : axisTitleWidth;\r\n while (axisTitleSize.width > maxTitleWidth) {\r\n titleText = this.trimText(titleText, titleText.length, \"...\");\r\n axisTitleSize = ej.EjSvgRender.utils._measureText(titleText, (yAxis.height), yAxis.title.font);\r\n if (titleText == \"...\") {\r\n titleText = \"\";\r\n break;\r\n }\r\n\r\n }\r\n }\r\n x = (yAxis.opposedPosition) ? x : x - (isScroll ? this.model.scrollerSize : 0)\r\n if (document.documentMode === 8)\r\n x = (!opposedPosition) ? (x - axisTitleSize.width / 2 + elementSpacing) : (x + axisTitleSize.width / 2 - elementSpacing);\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { title: yAxis.title.text, location: { x: titleSize.width / 2, y: 0 }, axes: yAxis };\r\n this._trigger(\"axesTitleRendering\", commonEventArgs);\r\n y = commonEventArgs.data.location.y + (yAxis.y + yAxis.height) + (((yAxis.height) / 2) * -1);\r\n\r\n if (axisTitleAlignment == \"near\") {\r\n y = (yAxis.y + yAxis.height) - axistitleoffset;\r\n textAnchor = opposedPosition || isTransposed ? \"end\" : \"start\";\r\n }\r\n else if (axisTitleAlignment == \"far\") {\r\n y = yAxis.y - axistitleoffset;\r\n textAnchor = opposedPosition || isTransposed ? \"start\" : \"end\";\r\n }\r\n else if (axisTitleAlignment == \"center\")\r\n y = yAxis.y + (yAxis.height / 2) - axistitleoffset;\r\n\r\n var labelRotation = (opposedPosition) ? 90 : -90;\r\n\r\n var options = {\r\n 'id': this.svgObject.id + '_YAxisTitle' + '_' + axisIndex,\r\n 'x': x,\r\n 'y': y,\r\n 'fill': yAxis.title.font.color,\r\n 'labelRotation': labelRotation,\r\n 'transform': 'rotate(' + labelRotation + ',' + (x) + ',' + y + ')',\r\n 'font-size': yAxis.title.font.size,\r\n 'font-family': yAxis.title.font.fontFamily,\r\n 'font-style': yAxis.title.font.fontStyle,\r\n 'font-weight': yAxis.title.font.fontWeight,\r\n 'opacity': yAxis.title.font.opacity,\r\n 'text-anchor': textAnchor,\r\n 'dominant-baseline': 'middle'\r\n };\r\n if (this.model.enableCanvasRendering) {\r\n var matched = jQuery.uaMatch(navigator.userAgent);\r\n var isIE11 = !!navigator.userAgent.match(/Trident\\/7\\./);\r\n var browser = matched.browser.toLowerCase();\r\n if (browser != \"msie\" && !isIE11)\r\n options.x = !opposedPosition ? options.x + (titleSize.height / 4) + (browser == \"mozilla\" ? 1 : -2) : options.x - (titleSize.height / 4) + 1; // text dominant baseline for canvas\r\n }\r\n if ($(this.svgObject).find(\"#\" + this.svgObject.id + '_YAxisTitle' + '_' + axisIndex).length > 0)\r\n $(this.svgObject).find(\"#\" + this.svgObject.id + '_YAxisTitle' + '_' + axisIndex).attr(options);\r\n else if (!isEnableTrim)\r\n this.svgRenderer.drawText(options, commonEventArgs.data.title, gEle);\r\n else if (isEnableTrim && (ej.util.isNullOrUndefined(axisTitleWidth) || axisTitleWidth > 0 || isNaN(axisTitleWidth))) {\r\n if (!this.svgRenderer.vmlNamespace)\r\n var bounds = { X: options.x - (axisTitleSize.height / 2), Y: options.y + (axisTitleSize.width / 2), Width: (axisTitleSize.height) / 2, Height: axisTitleSize.width };\r\n else\r\n var bounds = { X: options.x - (axisTitleSize.width) / 2, Y: options.y + (axisTitleSize.height / 2), Width: (axisTitleSize.width), Height: axisTitleSize.height };\r\n var yAxisTitleRegion = { Bounds: bounds, trimText: titleText, labelText: yAxis.title.text };\r\n this.model.yAxisTitleRegion.push(yAxisTitleRegion)\r\n this.svgRenderer.drawText(options, titleText, gEle);\r\n }\r\n\r\n if (!this.model.enableCanvasRendering) {\r\n var borderY = (textAnchor == \"start\" ? (axisTitleSize.width) : (textAnchor == \"end\" ? 0 : axisTitleSize.width / 2));\r\n var borderOptions = {\r\n 'id': this.svgObject.id + '_YAxisTitleBorder' + '_' + axisIndex,\r\n 'x': options.x - axisTitleSize.height + (axisTitleSize.height / 2),\r\n 'y': options.y - borderY - elementSpacing,\r\n 'width': axisTitleSize.height,\r\n 'height': axisTitleSize.width + (2 * elementSpacing),\r\n 'fill': \"transparent\",\r\n 'class': \"e-yaxistitleborder\"\r\n };\r\n this.svgRenderer.drawRect(borderOptions, gEle);\r\n }\r\n $(gEle).appendTo(this.gYaxisEle);\r\n }\r\n }\r\n },\r\n ej.EjStripline.prototype = {\r\n _drawStripline: function (axis, stripLine, axisIndex, stripLineIndex) {\r\n\r\n var start = (stripLine.start < axis.range.min) ? axis.range.min : stripLine.start;\r\n var end = (stripLine.end > axis.range.max) ? axis.range.max : stripLine.end;\r\n var x = 0, height = 0, angle = 0;\r\n var y = 0, pointYstart = 0, yHeight = 0;\r\n var width = 0, widthValue = 0, textX = 0, textY = 0;\r\n if (stripLine.visible) {\r\n this.model._stripeline = true;\r\n var striplineid = (stripLine.zIndex == 'over') ? this.gStriplineOver : this.gStriplineBehind;\r\n striplineid = ej.util.isNullOrUndefined(striplineid) ? \"\" : striplineid;\r\n var isVisible = true;\r\n if (axis.orientation.toLowerCase() == \"horizontal\") {\r\n var pointstart = 0;\r\n\r\n if (stripLine.startFromAxis) {\r\n\r\n var point = (ej.util.isNullOrUndefined(stripLine.offset)) ? axis.visibleRange.min : axis.visibleRange.min + stripLine.offset;\r\n pointstart = (((point - axis.visibleRange.min) / (axis.visibleRange.delta)) * (axis.width)) + axis.x; //($(this.svgObject).width() - this.model.m_Spacing.Left - this.model.m_Spacing.Right);\r\n\r\n widthValue = (((point + (ej.util.isNullOrUndefined(stripLine.width) ? 0 : stripLine.width) - axis.visibleRange.min) / (axis.visibleRange.delta)) * (axis.width));\r\n\r\n } else {\r\n if (ej.util.isNullOrUndefined(start) && (ej.util.isNullOrUndefined(end) || ej.util.isNullOrUndefined(stripLine.width))) {\r\n isVisible = false;\r\n } else {\r\n start = (jQuery.type(start) == \"date\") ? (start).getTime() : start;\r\n if (!ej.util.isNullOrUndefined(end) && (jQuery.type(end) == \"date\")) {\r\n end = (end).getTime();\r\n }\r\n pointstart = (ej.EjSvgRender.utils._getPointXY(start, axis.visibleRange, axis.isInversed) * (axis.width)) + axis.x; //($(this.svgObject).width() - this.model.m_Spacing.Left - this.model.m_Spacing.Right);\r\n var pointend = (ej.EjSvgRender.utils._getPointXY(end, axis.visibleRange, axis.isInversed) * (axis.width)) + axis.x; //($(this.svgObject).width() - this.model.m_Spacing.Left - this.model.m_Spacing.Right);\r\n var widthMax = (ej.EjSvgRender.utils._getPointXY((start + (ej.util.isNullOrUndefined(stripLine.width) ? 0 : stripLine.width)), axis.visibleRange, axis.isInversed) * (axis.width)) + axis.x;\r\n\r\n widthValue = (axis.isInversed ? (pointend < widthMax) : (pointend > widthMax)) ? Math.abs(pointstart - pointend) : Math.abs(pointstart - widthMax);\r\n\r\n }\r\n }\r\n width = widthValue;\r\n height = this.chart.model.m_AreaBounds.Height;\r\n x = (axis.isInversed) ? (pointstart - widthValue) : pointstart;\r\n y = this.chart.model.m_AreaBounds.Y;\r\n angle = -90;\r\n var textWidth = ej.EjSvgRender.utils._measureText(stripLine.text, null, stripLine.font).height;\r\n if (stripLine.textAlignment == 'middletop') {\r\n textX = x + textWidth;\r\n textY = Math.abs(y + height / 2);\r\n } else if (stripLine.textAlignment == 'middlecenter') {\r\n textX = (Math.floor(x + width / 2) + (textWidth / 3));\r\n textY = Math.abs(y + height / 2);\r\n } else if (stripLine.textAlignment == 'middlebottom') {\r\n textX = x + width - (textWidth);\r\n textY = Math.abs(y + height / 2);\r\n }\r\n\r\n\r\n } else {\r\n if (stripLine.startFromAxis) {\r\n var pointY = (ej.util.isNullOrUndefined(stripLine.offset)) ? axis.visibleRange.min : axis.visibleRange.min + stripLine.offset;\r\n pointYstart = (axis.y + axis.height) - (((pointY - axis.visibleRange.min) / (axis.visibleRange.delta)) * (axis.height));\r\n widthValue = (((pointY + (ej.util.isNullOrUndefined(stripLine.width) ? 0 : stripLine.width) - axis.visibleRange.min) / (axis.visibleRange.delta)) * (axis.height));\r\n yHeight = widthValue;\r\n } else {\r\n\r\n if (ej.util.isNullOrUndefined(start) && (ej.util.isNullOrUndefined(end) || ej.util.isNullOrUndefined(stripLine.width))) {\r\n isVisible = false;\r\n } else {\r\n start = (jQuery.type(start) == \"date\") ? (start).getTime() : start;\r\n if (!ej.util.isNullOrUndefined(end) && (jQuery.type(end) == \"date\")) {\r\n end = (end).getTime();\r\n }\r\n pointYstart = (axis.y + axis.height) - (ej.EjSvgRender.utils._getPointXY(start, axis.visibleRange, axis.isInversed) * (axis.height));\r\n var pointYend = (axis.y + axis.height) - (ej.EjSvgRender.utils._getPointXY((ej.util.isNullOrUndefined(end) ? 0 : end), axis.visibleRange, axis.isInversed) * (axis.height));\r\n var widthYValue = (axis.y + axis.height) - (ej.EjSvgRender.utils._getPointXY((start + (ej.util.isNullOrUndefined(stripLine.width) ? 0 : stripLine.width)), axis.visibleRange, axis.isInversed) * (axis.height));\r\n yHeight = (axis.isInversed ? (pointYend > widthYValue) : (pointYend < widthYValue)) ? Math.abs(pointYstart - pointYend) : Math.abs(pointYstart - widthYValue);\r\n }\r\n }\r\n height = yHeight;\r\n x = this.chart.model.m_AreaBounds.X;\r\n width = this.chart.model.m_AreaBounds.Width;\r\n y = pointYstart + ((axis.isInversed) ? 0 : -yHeight);\r\n var textHeight = ej.EjSvgRender.utils._measureText(stripLine.text, width, stripLine.font).height;\r\n\r\n if (stripLine.textAlignment == 'middletop') {\r\n textX = x + width / 2;\r\n textY = y + textHeight;\r\n } else if (stripLine.textAlignment == 'middlecenter') {\r\n textX = x + width / 2;\r\n textY = (Math.abs(y + (height / 2)) + (textHeight / 3));\r\n } else if (stripLine.textAlignment == 'middlebottom') {\r\n textX = x + width / 2;\r\n textY = (y + height) - textHeight;\r\n\r\n }\r\n\r\n\r\n }\r\n if (isVisible) {\r\n if (!ej.util.isNullOrUndefined(stripLine.imageUrl)) {\r\n var imgOptions = {\r\n 'height': height,\r\n 'width': width,\r\n 'href': stripLine.imageUrl,\r\n 'x': x,\r\n 'y': y,\r\n 'id': striplineid.id + '_backImage',\r\n 'visibility': 'visible',\r\n 'preserveAspectRatio': 'none'\r\n };\r\n\r\n this.svgRenderer.drawImage(imgOptions, striplineid);\r\n } else {\r\n var options = {\r\n 'id': striplineid.id + '_striplineRect_' + axisIndex + '_' + stripLineIndex,\r\n 'x': x,\r\n 'y': y,\r\n 'width': width,\r\n 'height': height,\r\n 'fill': stripLine.color,\r\n 'opacity': stripLine.opacity,\r\n 'stroke-width': stripLine.borderWidth,\r\n 'stroke': (stripLine.borderWidth == 0) ? \"transparent\" : stripLine.borderColor\r\n };\r\n var textOptions = {\r\n 'id': striplineid.id + '_striplineRectText_' + axisIndex + '_' + stripLineIndex,\r\n 'x': textX,\r\n 'y': textY,\r\n 'fill': stripLine.font.color,\r\n 'transform': 'rotate(' + angle + ',' + (textX) + ',' + textY + ')',\r\n 'labelRotation': angle,\r\n 'font-size': stripLine.font.size,\r\n 'font-family': stripLine.font.fontFamily,\r\n 'font-style': stripLine.font.fontStyle,\r\n 'font-weight': stripLine.font.fontWeight,\r\n 'opacity': stripLine.font.opacity,\r\n 'text-anchor': 'middle'\r\n };\r\n\r\n var bounds = { X: x, Y: y, Width: width, Height: height };\r\n var isStripline = stripLine.zIndex == \"over\" ? true : false;\r\n ej.EjSvgRender.utils.AddRegion(this.chart, bounds, isStripline)\r\n\r\n if (this.chart.model.enableCanvasRendering) {\r\n var ctx = this.chart.svgObject.getContext(\"2d\");\r\n var clipBounds = axis.orientation.toLowerCase() == 'horizontal' ? { X: axis.x, Y: y, Width: axis.width, Height: this.chart.model.m_AreaBounds.Height }\r\n : { X: x, Y: axis.y, Width: this.chart.model.m_AreaBounds.Width, Height: axis.height };\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.rect(clipBounds.X, clipBounds.Y, clipBounds.Width, clipBounds.Height);\r\n ctx.clip();\r\n this.svgRenderer.drawRect(options, striplineid);\r\n this.svgRenderer.drawText(textOptions, stripLine.text, striplineid);\r\n ctx.closePath();\r\n ctx.restore();\r\n }\r\n else {\r\n this.svgRenderer.drawRect(options, striplineid);\r\n this.svgRenderer.drawText(textOptions, stripLine.text, striplineid);\r\n }\r\n }\r\n }\r\n\r\n }\r\n }\r\n };\r\n})(jQuery);\r\nej.EjLegendRender = function (chartobj) {\r\n\r\n this.chartObj = chartobj;\r\n};\r\n\r\n\r\n(function ($) {\r\n ej.EjLegendRender.prototype =\r\n {\r\n sumofArray: function (array) {\r\n var sum = 0,\r\n length = array.length;\r\n for (var i = 0; i < length; i++)\r\n sum += array[i];\r\n return sum;\r\n },\r\n\r\n legendRectSpace: function (svgBounds, divBounds) {\r\n var width = svgBounds.Width - 10;\r\n var height = svgBounds.Height - 10;\r\n var isVisible = false;\r\n if (Math.ceil(divBounds.Width) >= width && Math.ceil(divBounds.Height) >= height)\r\n isVisible = true;\r\n return isVisible;\r\n },\r\n\r\n drawLegendTitle: function () {\r\n //draw legend title\r\n\r\n var chart = this.chartObj,\r\n chartModel = chart.model,\r\n legend = chartModel.legend,\r\n legendBounds = chartModel.LegendBounds,\r\n elementSpacing = chartModel.elementSpacing,\r\n legendTitle = legend.title,\r\n measureText = ej.EjSvgRender.utils._measureText,\r\n font = legendTitle.font,\r\n legendBoundsWidth = legendBounds.Width,\r\n titleSize = measureText(legendTitle.text, null, font),\r\n titleWidth = titleSize.width,\r\n titleHeight = titleSize.height,\r\n textAlignment = legendTitle.textAlignment.toLowerCase(),\r\n startX = 0,\r\n startY = elementSpacing + (titleHeight / 2);\r\n\r\n switch (textAlignment) {\r\n case 'far':\r\n startX = legendBoundsWidth - titleWidth - startX;\r\n break;\r\n case 'center':\r\n startX = legendBoundsWidth / 2 - (titleWidth) / 2;\r\n break;\r\n }\r\n\r\n if (startX < 0) {\r\n startX = 0;\r\n legendBoundsWidth = titleWidth;\r\n }\r\n if (legendBoundsWidth < titleWidth + startX)\r\n legendBoundsWidth = titleWidth + startX;\r\n\r\n var options = {\r\n 'id': chart.svgObject.id + '_LegendTitleText',\r\n 'x': startX,\r\n 'y': startY,\r\n 'fill': font.color,\r\n 'font-size': font.size,\r\n 'font-style': font.fontStyle,\r\n 'font-family': font.fontFamily,\r\n 'font-weight': font.fontWeight,\r\n 'text-anchor': 'start',\r\n 'lgndCtx': true\r\n };\r\n\r\n chart.svgRenderer.drawText(options, legendTitle.text, this.chartObj.gLegendEle);\r\n\r\n },\r\n\r\n drawLegendItem: function (legendItem, x, y) {\r\n var chart = this.chartObj,\r\n chartModel = chart.model,\r\n legend = chartModel.legend,\r\n textOverflow = legend.textOverflow.toLowerCase(),\r\n textMaxWidth = legend.textWidth,\r\n legendBounds = chartModel.LegendBounds,\r\n elementSpacing = chartModel.elementSpacing,\r\n legendBorder = legend.border.width,\r\n measureText = ej.EjSvgRender.utils._measureText,\r\n svgRender = ej.EjSvgRender,\r\n chartSvgRender = chart.svgRenderer,\r\n legendFont = legendItem.Font,\r\n symbolShape = chartModel.symbolShape,\r\n isCanvas = chartModel.enableCanvasRendering,\r\n shapeSize = legend.itemStyle,\r\n textHeight = measureText(legendItem.Text, legendBounds.Width, legendFont).height,\r\n location = {\r\n startX: x + shapeSize.width / 2,\r\n startY: (y + (textHeight > shapeSize.height ? textHeight : shapeSize.height) / 2)\r\n },\r\n pointIndex = legendItem.PointIndex,\r\n seriesIndex = legendItem.SeriesIndex,\r\n index = pointIndex ? pointIndex : seriesIndex,\r\n series = chartModel.series[seriesIndex],\r\n svgObject = chart.svgObject,\r\n legendStyle = legendItem.LegendStyle,\r\n matched = jQuery.uaMatch(navigator.userAgent),\r\n isIE11 = !!navigator.userAgent.match(/Trident\\/7\\./),\r\n color, itemInfo, data, style, startLocation,\r\n seriesType = series.type.toLowerCase(),\r\n drawType = series.drawType,\r\n symbolName, symbol, textinfo, legendTextRegion, textLength;\r\n\r\n for (name in symbolShape) {\r\n if (legendItem.Shape.toLowerCase() == name.toLowerCase()) {\r\n if (name.toLowerCase() == \"seriestype\")\r\n symbolName = \"SeriesType\";\r\n else\r\n symbolName = name;\r\n break;\r\n }\r\n }\r\n\r\n if (symbolName == \"SeriesType\") {\r\n if (seriesType == \"radar\" || seriesType == \"polar\") {\r\n symbol = drawType.toLowerCase() == \"scatter\" ? series.marker.shape : symbol = drawType;\r\n symbolName = (symbol.toLowerCase() == \"rangecolumn\") ? \"RangeColumn\" : symbol.capitalizeFirstString();\r\n }\r\n if (seriesType == \"scatter\") {\r\n symbol = series.marker.shape;\r\n symbolName = symbol.capitalizeFirstString();\r\n }\r\n if (legendItem.drawType)// // TrendLine drawType assigned to legend shape\r\n symbolName = \"SeriesType\";\r\n if (chart.vmlRendering && (seriesType == \"pie\" || seriesType == \"doughnut\" || seriesType == \"pieofpie\"))\r\n symbolName = \"Circle\"; // VML legend shape for pie & doughnut\r\n }\r\n\r\n if (symbolName == \"None\") {\r\n if (seriesType == \"pie\" || seriesType == \"doughnut\" || seriesType == \"pieofpie\")\r\n symbolName = \"Circle\";\r\n else\r\n symbolName = \"Rectangle\";\r\n }\r\n\r\n index = (ej.util.isNullOrUndefined(pointIndex)) ? seriesIndex : pointIndex;\r\n chart.gLegendItemEle = chartSvgRender.createGroup({ 'id': svgObject.id + '_Legend' + index, 'cursor': 'pointer' });\r\n legendItem.CommonEventArgs.data.gLegendItemEle = chart.gLegendItemEle;\r\n data = $.extend(true, {}, legendItem.CommonEventArgs.data);\r\n data.model = chart.model;\r\n style = data.style;\r\n if (!legendItem.CommonEventArgs.cancel) {\r\n startLocation = svgRender.chartSymbol[\"_draw\" + symbolName](location, style, data, chart.gLegendItemEle);\r\n if (legendStyle.Color && legendStyle.Color.toString().toLowerCase() !== 'gray' && isCanvas) // for canvas gradient color\r\n color = legendFont.color;\r\n else if (legendStyle.Color && legendStyle.Color.toLowerCase() !== 'gray') // for svg\r\n color = legendFont.color;\r\n else\r\n color = 'gray';\r\n\r\n itemInfo = legendItem;\r\n textLength = itemInfo.Text.length;\r\n if (legend.shape == \"seriestype\" || legend.shape == \"seriesType\")\r\n x += elementSpacing / 2;\r\n var options = {\r\n 'id': this.chartObj.svgObject.id + '_LegendItemText' + index,\r\n 'x': shapeSize.width + x + elementSpacing / 2,\r\n 'y': location.startY,\r\n 'fill': color,\r\n 'font-size': legendFont.size,\r\n 'font-style': legendFont.fontStyle,\r\n 'font-family': legendFont.fontFamily,\r\n 'font-weight': legendFont.fontWeight,\r\n 'text-anchor': 'start',\r\n\r\n };\r\n if (isCanvas)\r\n options.lgndCtx = true;\r\n options.y = (location.startY + (textHeight / 4));\r\n\r\n if (textOverflow == \"wrap\" || textOverflow == \"wrapandtrim\") {\r\n options.y = options.y - textHeight;\r\n for (var k = 0; k < textLength; k++) {\r\n options.y = options.y + (textHeight);\r\n chartSvgRender.drawText(options, itemInfo.Text[k], chart.gLegendItemEle);\r\n if (textOverflow == \"wrapandtrim\") {\r\n textinfo = { x: options.x + legendBounds.X, y: options.y + legendBounds.Y, height: textHeight * (textLength), width: textMaxWidth };\r\n legendTextRegion = { bounds: textinfo, trimText: itemInfo.Text, labelText: itemInfo.displayText };\r\n chartModel.legendTextRegion.push(legendTextRegion);\r\n }\r\n }\r\n }\r\n else {\r\n if (textOverflow == \"trim\") {\r\n textinfo = { x: options.x + legendBounds.X, y: options.y + legendBounds.Y, height: textHeight + elementSpacing, width: textMaxWidth };\r\n legendTextRegion = { bounds: textinfo, trimText: itemInfo.Text, labelText: itemInfo.displayText };\r\n chartModel.legendTextRegion.push(legendTextRegion);\r\n }\r\n chartSvgRender.drawText(options, itemInfo.Text, chart.gLegendItemEle);\r\n }\r\n chartSvgRender.append(chart.gLegendItemEle, chart.gLegendEle);\r\n var legendbound = {\r\n X: legendBounds.X + legendBorder,\r\n Y: legendBounds.Y + legendBorder\r\n };\r\n\r\n x = (startLocation) ? startLocation : x;\r\n var itembound = {\r\n X: (x), Y: (y), _Width: legendItem.Bounds._Width, Width: legendItem.Bounds.Width, Height: legendItem.Bounds.Height\r\n };\r\n var bounds = { LegendBound: legendbound, ItemBound: itembound };\r\n var legendRegion = {\r\n LegendItem: legendItem,\r\n Location: location, SymbolShape: symbolName, Style: legendItem.CommonEventArgs.data.style, Bounds: bounds\r\n };\r\n chartModel.legendRegion.push(legendRegion);\r\n }\r\n },\r\n\r\n drawLegend: function (params) {\r\n var chart = this.chartObj,\r\n chartModel = chart.model,\r\n legend = chartModel.legend,\r\n legendViewerBounds = chartModel.LegendViewerBounds,\r\n legendBounds = chartModel.LegendBounds,\r\n actualBounds = chartModel.LegendActualBounds,\r\n AreaType = chartModel.AreaType,\r\n legendPosition = legend.position.toLowerCase(),\r\n alignment = legend.alignment.toLowerCase(),\r\n elementSpacing = chartModel.elementSpacing,\r\n svgObjectWidth = chartModel.svgWidth,\r\n svgObjectHeight = chartModel.svgHeight,\r\n title = chartModel.title,\r\n titleFontHeight = title.font.size,\r\n subTitle = title.subTitle,\r\n subTitleFontHeight = title.subTitle.font.size,\r\n legendTitle = legend.title,\r\n legendBorder = legend.border.width,\r\n measureText = ej.EjSvgRender.utils._measureText,\r\n margin = chartModel.margin,\r\n borderSize = chartModel.border.width,\r\n legendCollection = chartModel.legendCollection,\r\n collectionLength = legendCollection.length,\r\n svgWidth = svgObjectWidth - ((borderSize * 2)),\r\n svgHeight = svgObjectHeight - ((borderSize * 2)),\r\n itemPadding = legend.itemPadding > 0 ? legend.itemPadding : 0,\r\n padding = 20,\r\n hPadding = 10,\r\n vPadding = 10,\r\n modelsubTitleHeight = subTitle.text == \"\" || !subTitle.visible || !title.visible ? 0 : measureText(subTitle.text, svgWidth - margin.left - margin.right, subTitle.font).height + elementSpacing,\r\n titleLocation = chartModel._titleLocation ? chartModel._titleLocation.Y : 0 + modelsubTitleHeight,\r\n legendTitleBounds = measureText(legendTitle.text, null, legendTitle.font),\r\n legendTitleHeight = legendTitleBounds.height,\r\n legendTitleWidth = legendTitleBounds.width,\r\n rowDefinitions = chartModel._rowDefinitions,\r\n maxWidth = 0, startX, startY, currentX, currentY,\r\n columnDefinitions = chartModel._columnDefinitions,\r\n vSizeFar = this.sumofArray(rowDefinitions.farSizes),\r\n vSizeNear = this.sumofArray(rowDefinitions.nearSizes),\r\n hSizeFar = this.sumofArray(columnDefinitions.farSizes),\r\n hSizeNear = this.sumofArray(columnDefinitions.nearSizes),\r\n isScrolling = false,\r\n areaBounds = chartModel.m_AreaBounds,\r\n isScroll = legend.enableScrollbar,\r\n legendContainer = $(chart.legendContainer),\r\n leftScroll = $(\"#ScrollerParent_\" + 'vertical' + \"_\" + chart._id).length > 0 ? 18 : 0,\r\n bottomScroll = $(\"#ScrollerParent_\" + 'horizontal' + \"_\" + chart._id).length > 0 ? 18 : 0,\r\n legendSvgContainer = $(chart.legendSvgContainer);\r\n var textBorderConstant = 1.2,\r\n titleBorderSpacing = 10,\r\n subTitleBorderSpacing = 10,\r\n title = chartModel.title,\r\n subTitle = chartModel.title.subTitle,\r\n titleTextHeight = title.visible ? parseInt(titleFontHeight) * textBorderConstant : 0,\r\n subTitleTextHeight = subTitle.visible ? parseInt(subTitleFontHeight) * textBorderConstant : 0,\r\n titleTextHeight = (chartModel.titleWrapTextCollection && chartModel.titleWrapTextCollection.length > 1) ? chartModel._titleLocation._height * chartModel.titleWrapTextCollection.length - 1 : titleTextHeight,\r\n subTitleTextHeight = (chartModel.subTitleWrapTextCollection && chartModel.subTitleWrapTextCollection.length > 1) ? chartModel._subTitleLocation.size.height : subTitleTextHeight;\r\n if ((chartModel.legend.border) && (!subTitle.text)) {\r\n subTitleTextHeight = 0;\r\n subTitleBorderSpacing = 5;\r\n }\r\n\r\n if (legendPosition == 'right' || legendPosition == 'left') {\r\n hPadding = 10;\r\n } else {\r\n vPadding = isScroll ? svgHeight > 200 ? 10 : svgHeight > 100 ? 5 : 0 : 10;\r\n }\r\n legendViewerBounds.Height += legendTitleHeight,\r\n legendBounds.Height += legendTitleHeight;\r\n if (legend.visible) {\r\n // draw legend.\r\n if (legendPosition != 'custom') {\r\n if (AreaType == \"cartesianaxes\") {\r\n switch (legendPosition) {\r\n case \"bottom\":\r\n legendBounds.Y = areaBounds.Y + areaBounds.Height + hSizeNear - (elementSpacing / 2) + bottomScroll;\r\n break;\r\n case \"top\":\r\n legendBounds.Y = titleLocation == 0 ? borderSize + elementSpacing : (titleTextHeight + titleBorderSpacing + subTitleTextHeight + subTitleBorderSpacing + elementSpacing);\r\n break;\r\n case \"right\":\r\n legendBounds.X = areaBounds.X + areaBounds.Width + vSizeFar + elementSpacing * 2;\r\n break;\r\n case \"left\":\r\n legendBounds.X = areaBounds.X - vSizeNear - actualBounds.Width - (elementSpacing / 2) - (legendBorder * 2) - leftScroll;\r\n break;\r\n }\r\n } else {\r\n switch (legendPosition) {\r\n case \"bottom\":\r\n legendBounds.Y = svgHeight - (actualBounds.Height + (legendBorder)) - (elementSpacing * 2);\r\n break;\r\n case \"top\":\r\n legendBounds.Y = titleLocation == 0 ? borderSize + elementSpacing : (titleTextHeight + titleBorderSpacing + subTitleTextHeight + subTitleBorderSpacing + elementSpacing);\r\n break;\r\n case \"right\":\r\n legendBounds.X = svgWidth - actualBounds.Width - (elementSpacing * 2);\r\n break;\r\n case \"left\":\r\n legendBounds.X = borderSize + (elementSpacing * 2);\r\n break;\r\n }\r\n }\r\n //Avoid axis and legend overlapping during crossing\r\n if (!chartModel.enable3D && AreaType == \"cartesianaxes\" && params._crossAxisOverlap != null) {\r\n for (var i = 0, len = chartModel._axes.length; i < len; i++) {\r\n var axis = chartModel._axes[i], axisBounds = params.axes[axis.name]._bounds;\r\n var hor = axis.orientation.toLowerCase() === 'horizontal';\r\n if (legendPosition == \"top\" && hor && axis._opposed && (axis.y - axisBounds < legendBounds.Y + legendBounds.Height))\r\n legendBounds.Y -= legendBounds.Y + legendBounds.Height - axis.y + axisBounds;\r\n else if (legendPosition == \"bottom\" && hor && !axis._opposed && (axis.y + axisBounds > legendBounds.Y))\r\n legendBounds.Y += axis.y + axisBounds - legendBounds.Y;\r\n else if (legendPosition == \"left\" && !hor && axis._opposed && (axis.x - axisBounds < legendBounds.X + legendBounds.Width))\r\n legendBounds.X += axis.x + axisBounds - legendBounds.X;\r\n else if (legendPosition == \"right\" && !hor && !axis._opposed && (axis.x + axisBounds > legendBounds.X))\r\n legendBounds.X -= legendBounds.X + legendBounds.Width - axis.x + axisBounds;\r\n }\r\n }\r\n if (legendPosition == 'left' || legendPosition == 'right') {\r\n if (isScroll) {\r\n switch (alignment) {\r\n case \"center\":\r\n legendBounds.Y = areaBounds.Height / 2 - (actualBounds.Height / 2) + areaBounds.Y - legendBorder;\r\n break;\r\n case \"near\":\r\n legendBounds.Y = areaBounds.Y;\r\n break;\r\n case \"far\":\r\n legendBounds.Y = areaBounds.Y + areaBounds.Height - actualBounds.Height - (legendBorder * 2);\r\n break;\r\n }\r\n } else {\r\n switch (alignment) {\r\n case \"center\":\r\n legendBounds.Y = (svgHeight / 2) - ((actualBounds.Height + legendBorder * 2) / 2) + (elementSpacing / 2);\r\n break;\r\n case \"near\":\r\n legendBounds.Y = borderSize + (elementSpacing * 2);\r\n break;\r\n case \"far\":\r\n legendBounds.Y = svgHeight - (actualBounds.Height + (legendBorder)) - (elementSpacing * 2);\r\n break;\r\n }\r\n }\r\n\r\n } else {\r\n switch (alignment) {\r\n case \"center\":\r\n legendBounds.X = (svgWidth / 2) - ((actualBounds.Width + legendBorder * 2) / 2) + (elementSpacing / 2);\r\n break;\r\n case \"near\":\r\n legendBounds.X = borderSize + (elementSpacing * 2);\r\n break;\r\n case \"far\":\r\n legendBounds.X = svgWidth - (actualBounds.Width + (legendBorder)) - (elementSpacing * 2);\r\n break;\r\n }\r\n }\r\n } else {\r\n legendBounds.Y = (legend.location.y < svgHeight) ? legend.location.y : 0;\r\n legendBounds.X = (legend.location.x < svgWidth) ? legend.location.x : 0;\r\n }\r\n if (isScroll) {\r\n if (legendPosition == 'right' || legendPosition == 'left') {\r\n if (legendBounds.Y < areaBounds.Y || actualBounds.Height + (legendBorder * 2) >= areaBounds.Height) {\r\n var legendHeight = (legendBorder * 2);\r\n for (var k = 0; k < collectionLength; k++) {\r\n legendHeight += legendCollection[k].Bounds.Height + itemPadding;\r\n if (legendHeight > areaBounds.Height) {\r\n actualBounds.Height = areaBounds.Height - (legendBorder * 2);\r\n legendBounds.Y = areaBounds.Y;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n if ((legendBorder * 2 + actualBounds.Width) >= svgWidth) {\r\n var legendWidth = (legendBorder * 2);\r\n for (var k = 0; k < collectionLength; k++) {\r\n legendWidth += legendCollection[k].Bounds.Width + itemPadding;\r\n if (legendWidth > svgWidth) {\r\n actualBounds.Width = svgWidth - (legendBorder * 2) - actualBounds.vScrollSize - (borderSize * 2);\r\n legendBounds.X = (svgWidth / 2) - ((actualBounds.Width + legendBorder * 2) / 2) + (elementSpacing / 2);\r\n break;\r\n }\r\n\r\n }\r\n }\r\n }\r\n }\r\n\r\n //Set height and width to legend Canvas element\r\n chart.legendSvgContainer.setAttribute('height', legendBounds.Height);\r\n chart.legendSvgContainer.setAttribute('width', Math.max(legendTitleWidth, legendBounds.Width));\r\n currentX = startX = hPadding;\r\n currentY = startY = vPadding;\r\n if (legendTitle.text != \"\" && legendTitle.text) {\r\n this.drawLegendTitle();\r\n currentY = startY = vPadding + legendTitleHeight;\r\n }\r\n for (var k = 0; k < collectionLength; k++) {\r\n if ((legend.rowCount < legend.columnCount || legend.rowCount == legend.columnCount) && (legendPosition == 'top' || legendPosition == 'bottom' || legendPosition == 'custom')) {\r\n if ((currentX + legendCollection[k].Bounds.Width) > legendBounds.Width + startX) {\r\n currentX = hPadding;\r\n currentY += legendCollection[k].Bounds.Height + itemPadding;\r\n }\r\n this.drawLegendItem(legendCollection[k], currentX, (currentY));\r\n currentX += legendCollection[k].Bounds.Width + itemPadding;\r\n }\r\n else {\r\n if (((currentY + legendCollection[k].Bounds.Height + itemPadding) + legendTitleHeight + borderSize > legendBounds.Height + startY)) {\r\n currentY = startY;\r\n currentX += maxWidth + (itemPadding);\r\n }\r\n this.drawLegendItem(legendCollection[k], (currentX), (currentY));\r\n currentY += legendCollection[k].Bounds.Height + itemPadding;\r\n maxWidth = Math.max(maxWidth, legendCollection[k].Bounds.Width);\r\n }\r\n }\r\n var legendVal = chart.legendContainer[0].offsetLeft;\r\n var chartOffsetVal = $(chart.element).offset();\r\n var offsetVal = (chart.vmlRendering) ? (legendVal <= 0) ? legendBounds.X : (legendVal - chartOffsetVal.left) :\r\n ($(chart.svgObject).offset().left - chartOffsetVal.left);\r\n var legnTx = (chart.vmlRendering) ? offsetVal : legendBounds.X + (offsetVal <= 0 ? 0 : offsetVal);\r\n legendContainer.attr('style', '');\r\n legendContainer.show();\r\n legendContainer.css({ \"position\": \"absolute\", \"background\": legend.background, \"left\": legnTx, \"top\": legendBounds.Y, \"width\": actualBounds.Width, \"height\": actualBounds.Height, \"border-width\": legend.border.width, \"border-color\": legend.border.color, \"border-style\": \"solid\" });\r\n legendContainer.addClass(\"e-legendborder\");\r\n legendSvgContainer.css({ \"height\": legendBounds.Height, \"width\": legendBounds.Width });\r\n legendBounds.Height = legendBounds.Height - (padding - (vPadding * 2));\r\n var isVisible = this.legendRectSpace(legendBounds, actualBounds);\r\n if (isScroll) {\r\n if (legend._ejScroller) {\r\n if (!isVisible && (legendBounds.Width > Math.ceil(actualBounds.Width) || legendBounds.Height > Math.ceil(actualBounds.Height))) {\r\n $('#' + legendContainer[0].id).ejScroller({ scrollTop: chart.scrolltop, scrollLeft: chart.scrollleft, height: actualBounds.Height, width: actualBounds.Width });\r\n isScrolling = true;\r\n if (legendBounds.Height > Math.ceil(actualBounds.Height)) {\r\n if (actualBounds.vScrollSize == 0) {\r\n vScrollSize = legendContainer[0].offsetWidth + (legendBorder * 5) - legendContainer[0].clientWidth;\r\n legendContainer.css({ \"width\": actualBounds.Width + vScrollSize });\r\n }\r\n }\r\n } else {\r\n $('#' + legendContainer[0].id).ejScroller(\"instance\").destroy();\r\n legend._ejScroller = false;\r\n }\r\n }\r\n else {\r\n if (!isVisible && legendBounds.Width > Math.ceil(actualBounds.Width) && legendBounds.Height > Math.ceil(actualBounds.Height)) {\r\n legendContainer.css({ \"overflow\": \"scroll\" });\r\n isScrolling = true;\r\n } else {\r\n if (!isVisible && legendBounds.Height > Math.ceil(actualBounds.Height) && actualBounds.vScrollSize >= 0) {\r\n legendContainer[0].style.overflowY = \"scroll\";\r\n legendContainer[0].style.overflowX = \"hidden\";\r\n if (actualBounds.vScrollSize == 0) {\r\n vScrollSize = legendContainer[0].offsetWidth - (legendBorder * 2) - legendContainer[0].clientWidth;\r\n legendContainer.css({ \"width\": actualBounds.Width + vScrollSize });\r\n }\r\n isScrolling = true;\r\n }\r\n if (!isVisible && legendBounds.Width > Math.ceil(actualBounds.Width) && actualBounds.hScrollSize >= 0) {\r\n legendContainer[0].style.overflowX = \"scroll\";\r\n legendContainer[0].style.overflowY = \"hidden\";\r\n if (actualBounds.hScrollSize == 0) {\r\n hScrollSize = legendContainer[0].offsetHeight - (legendBorder * 2) - legendContainer[0].clientHeight;\r\n legendContainer.css({ \"height\": actualBounds.Height + hScrollSize });\r\n }\r\n isScrolling = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n chart.svgRenderer.append(chart.gLegendEle, chart.legendSvgContainer);\r\n if (!isScrolling) {\r\n legendContainer.css({ \"width\": actualBounds.Width - actualBounds.vScrollSize, \"height\": actualBounds.Height - actualBounds.hScrollSize });\r\n }\r\n if (!legend._ejScroller) {\r\n if (chart.scrolltop != undefined)\r\n legendContainer.scrollTop(chart.scrolltop);\r\n if (chart.scrollleft != undefined)\r\n legendContainer.scrollLeft(chart.scrollleft);\r\n }\r\n\r\n }\r\n else\r\n legendContainer.hide();\r\n }\r\n };\r\n})(jQuery);;\r\n\r\nej.seriesTypes = {};\r\n\r\nej.EjSeriesRender = function () {\r\n\r\n};\r\nej.indicatorTypes = {};\r\n\r\nej.EjIndicatorRender = function () {\r\n\r\n};\r\nej.trendlineTypes = {};\r\n\r\nej.EjTrendLineRenderer = function () {\r\n\r\n};\r\n(function ($) {\r\n ej.EjTrendLineRenderer.prototype = {\r\n draw: function (trendline, series, sender) {\r\n this.chartObj = sender;\r\n var trendIndex = $.inArray(trendline, series.trendlines);\r\n trendline._isTransposed = sender.model.requireInvertedAxes;\r\n trendline.xAxis = series.xAxis;\r\n trendline.yAxis = series.yAxis;\r\n var type = trendline.type.toLowerCase();\r\n if (trendline.points.length > 1) {\r\n if (type == \"linear\" || type == \"movingaverage\")\r\n this.calculateLineDirection(trendline, series, trendIndex);\r\n else\r\n this.calculateSplineDirection(trendline, series, trendIndex);\r\n }\r\n return false;\r\n },\r\n calculateSplineDirection: function (trendline, series, trendIndex) {\r\n //var series = trendline;\r\n var spDirection = \"\";\r\n var splinesb = ej.EjSvgRender.utils._getStringBuilder();\r\n var startingPoint = true;\r\n var yIndex = 0;\r\n var visiblePoints = trendline.points;\r\n var ySpline = ej.EjSeriesRender.prototype.naturalSpline(visiblePoints, series);\r\n var firstPoint = null;\r\n var secondPoint = null;\r\n var firstIndex = -1;\r\n var canvasX = 0;\r\n var canvasY = 0;\r\n var point, pointIndex;\r\n var length = visiblePoints.length;\r\n for (var i = 0; i < length; i++) {\r\n pointIndex = i;\r\n secondPoint = visiblePoints[i];\r\n if (firstPoint != null) {\r\n var controlPoint1 = null;\r\n var controlPoint2 = null;\r\n var data = ej.EjSeriesRender.prototype.getBezierControlPoints(firstPoint, secondPoint, ySpline[firstIndex], ySpline[pointIndex], yIndex, series, this);\r\n controlPoint1 = data[\"controlPoint1\"];\r\n controlPoint2 = data[\"controlPoint2\"];\r\n var pt1 = ej.EjSvgRender.utils._getPoint(firstPoint, trendline);\r\n var pt2 = ej.EjSvgRender.utils._getPoint(secondPoint, trendline);\r\n var bpt1 = ej.EjSvgRender.utils._getPoint(controlPoint1, trendline);\r\n var bpt2 = ej.EjSvgRender.utils._getPoint(controlPoint2, trendline);\r\n var chartObj = this.chartObj;\r\n if (startingPoint) {\r\n splinesb.append(\"M\" + \" \" + (pt1.X) + \" \" + (pt1.Y) + \" \" + \"C\" + \" \" + (bpt1.X) + \" \" + (bpt1.Y) + \" \" + (bpt2.X) + \" \" + (bpt2.Y) + \" \" + (pt2.X) + \" \" + (pt2.Y) + \" \");\r\n startingPoint = false;\r\n }\r\n else\r\n splinesb.append(\"C\" + \" \" + (bpt1.X) + \" \" + (bpt1.Y) + \" \" + (bpt2.X) + \" \" + (bpt2.Y) + \" \" + (pt2.X) + \" \" + (pt2.Y) + \" \");\r\n }\r\n firstPoint = secondPoint;\r\n firstIndex = pointIndex;\r\n }\r\n spDirection = splinesb.toString();\r\n this._drawLinePath(trendline, series, spDirection, trendIndex);\r\n\r\n return false;\r\n },\r\n calculateLineDirection: function (trendline, series, trendIndex) {\r\n var canvasX = 0;\r\n var canvasY = 0;\r\n var point;\r\n var lDirection;\r\n var sb = ej.EjSvgRender.utils._getStringBuilder();\r\n\r\n var firstPoint = false;\r\n var secondPoint;\r\n var length = trendline.points.length;\r\n for (var i = 0; i < length; i++) {\r\n secondPoint = trendline.points[i];\r\n point = ej.EjSvgRender.utils._getPoint(secondPoint, trendline);\r\n if (firstPoint)\r\n sb.append(\"L\" + \" \" + (point.X) + \" \" + ((point.Y)) + \" \");\r\n else {\r\n sb.append(\"M\" + \" \" + (point.X) + \" \" + ((point.Y)) + \" \");\r\n sb.append(\"L\" + \" \" + (point.X) + \" \" + ((point.Y)) + \" \");\r\n firstPoint = true;\r\n }\r\n }\r\n lDirection = sb.toString();\r\n this._drawLinePath(trendline, series, lDirection, trendIndex);\r\n return false;\r\n },\r\n _drawLinePath: function (trendline, series, lDirection, trendIndex) {\r\n var translate = [];\r\n translate[0] = trendline.xAxis.x;\r\n translate[1] = trendline.yAxis.y;\r\n\r\n if (lDirection != \"\") {\r\n var options = {\r\n 'id': this.chartObj.svgObject.id + \"_\" + trendline.seriesIndex + \"_\" + trendIndex + \"_\" + trendline.name.replace(/[^a-zA-Z ]/g, \"\"),\r\n 'fill': 'none',\r\n 'stroke-dasharray': trendline.dashArray,\r\n 'stroke-width': trendline.width,\r\n 'stroke': trendline.fill,\r\n 'opacity': trendline.opacity,\r\n 'd': lDirection\r\n };\r\n trendline.id = options.id;\r\n this.chartObj.svgRenderer.drawPath(options, series.gTrendGroupEle, translate);\r\n }\r\n this.chartObj.svgRenderer.append(series.gTrendGroupEle, this.chartObj.gTrendlinesGroupEle[trendline.seriesIndex]);\r\n\r\n return false;\r\n },\r\n\r\n calculateTrendLineSegment: function (series, trendline, axis, sender) {\r\n var chartmodel = sender.model;\r\n var axis, points = $.extend([], series.points);\r\n var trendlineType = trendline.type.toLowerCase();\r\n trendline.xAxis = series.xAxis ? series.xAxis : chartmodel.primaryXAxis;\r\n trendline.yAxis = series.yAxis ? series.yAxis : chartmodel.primaryYAxis;\r\n trendline.backwardForecast = trendline.backwardForecast < 0 ? 0 : trendline.backwardForecast;\r\n trendline.forwardForecast = trendline.forwardForecast < 0 ? 0 : trendline.forwardForecast;\r\n points = points.sort(function (a, b) { return (a.xValue > b.xValue) ? 1 : ((b.xValue > a.xValue) ? -1 : 0); });\r\n switch (trendlineType) {\r\n case \"linear\":\r\n this.updateTrendSource(points, trendline);\r\n this.calculateLinearTrendline(series, trendline, axis);\r\n break;\r\n case \"exponential\":\r\n this.updateExponentialTrendSource(points, trendline);\r\n this.calculateExponentialTrendline(series, trendline, axis);\r\n break;\r\n case \"logarithmic\":\r\n this.updateLogarithmicTrendSource(points, trendline);\r\n this.calculateLogarithmicTrendline(series, trendline, axis);\r\n break;\r\n case \"power\":\r\n this.updatePowerTrendSource(points, trendline);\r\n this.calculatePowerTrendline(series, trendline, axis);\r\n break;\r\n case \"polynomial\":\r\n var length = series.points.length;\r\n trendline.polynomialOrder = length <= trendline.polynomialOrder ? length : trendline.polynomialOrder;\r\n trendline.polynomialOrder = trendline.polynomialOrder < 2 ? 2 : trendline.polynomialOrder;\r\n trendline.polynomialOrder = trendline.polynomialOrder > 6 ? 6 : trendline.polynomialOrder;\r\n if (length > 1) {\r\n this.updateTrendSource(points, trendline);\r\n this.calculatePolynomialTrendline(series, trendline, axis);\r\n }\r\n break;\r\n case \"movingaverage\":\r\n this.updateMovingAverageTrendSource(points, trendline);\r\n this.calculateMovingAverageTrendline(series, trendline, axis);\r\n break;\r\n }\r\n if (series.points.length > 1 && trendline.points)\r\n this.calculateTrendLineRange(trendline, axis);\r\n return false;\r\n },\r\n updateTrendSource: function (points, trendline) {\r\n var len = points.length, point, xValue;\r\n\r\n trendline.xPoints = [];\r\n trendline.xValues = [];\r\n trendline.yValues = [];\r\n for (var i = 0; i < len; i++) {\r\n point = points[i];\r\n if (!point.isEmpty && !ej.isNullOrUndefined(point.y)) {\r\n trendline.xPoints.push(point.xValue);\r\n xValue = typeof (point.xValue) === 'number' ? point.xValue : Date.parse(point.xValue);\r\n trendline.xValues.push(xValue);\r\n trendline.yValues.push(point.y);\r\n }\r\n }\r\n this.calculateSumXAndYValue(trendline);\r\n return false;\r\n },\r\n calculateLinearTrendline: function (series, trendline, axis) {\r\n\r\n var count = trendline.xValues.length;\r\n var x1, x2;\r\n trendline.points = [];\r\n\r\n if (count > 1) {\r\n if (axis._valueType.toLowerCase() == \"datetime\") {\r\n x1 = this._increaseDateTimeInterval(trendline.xPoints[0], -trendline.backwardForecast, axis._intervalType);\r\n x2 = this._increaseDateTimeInterval(trendline.xPoints[count - 1], trendline.forwardForecast, axis._intervalType);\r\n } else {\r\n x1 = (trendline.xPoints[0] - trendline.backwardForecast);\r\n x2 = (trendline.xPoints[count - 1] + trendline.forwardForecast);\r\n }\r\n\r\n //trendline linear segment y = ax + b;\r\n var y1 = trendline.slope * x1 + trendline._intercept;\r\n var y2 = trendline.slope * x2 + trendline._intercept;\r\n trendline.points.push({ x: x1, xValue: x1, y: y1, YValues: [], visible: true });\r\n trendline.points.push({ x: x2, xValue: x2, y: y2, YValues: [], visible: true });\r\n\r\n trendline.points[0].YValues[0] = trendline.points[0].y;\r\n trendline.points[1].YValues[0] = trendline.points[1].y;\r\n }\r\n return false;\r\n },\r\n\r\n //// Calculate Trendline range\r\n calculateTrendLineRange: function (trendline, axis) {\r\n\r\n var length = trendline.points.length;\r\n var y;\r\n trendline.minY = trendline.points[0].y;\r\n trendline.maxY = trendline.points[length - 1].y;\r\n if (!axis.setRange) {\r\n if (trendline.backwardForecast > 0 && axis._valueType != \"category\" && length > 1) {\r\n axis.range.min = axis.range.min > trendline.points[0].x ? trendline.points[0].x : axis.range.min;\r\n axis.visibleRange.min = axis.range.min;\r\n }\r\n if (trendline.forwardForecast > 0 && length > 1) {\r\n axis.range.max = axis.range.max < trendline.points[length - 1].x ? trendline.points[length - 1].x : axis.range.max;\r\n axis.visibleRange.max = axis.range.max;\r\n }\r\n }\r\n for (var i = 0; i < length; i++) {\r\n y = trendline.points[i].y;\r\n trendline.minY = Math.min(trendline.minY, y);\r\n trendline.maxY = Math.max(trendline.maxY, y);\r\n }\r\n return false;\r\n },\r\n\r\n /// Calculate Sum of x and y values\r\n calculateSumXAndYValue: function (trendline) {\r\n var points = trendline.points,\r\n N = trendline.xPoints.length,\r\n type = trendline.type.toLowerCase(),\r\n Slope, Intercept, SX = 0, SY = 0,\r\n SXX = 0, SXY = 0, SYY = 0, i,\r\n SumProduct = 0, X = trendline.xValues, Y = trendline.yValues;\r\n\r\n for (i = 0; i < N; i++) {\r\n SX = SX + X[i];\r\n SY = SY + Y[i];\r\n SumProduct = SumProduct + (X[i] * Y[i]);\r\n SXY = SXY + X[i] * Y[i];\r\n SXX = SXX + X[i] * X[i];\r\n SYY = SYY + Y[i] * Y[i];\r\n }\r\n if (!ej.util.isNullOrUndefined(trendline.intercept) && (type == \"linear\" || type == \"exponential\" || type == \"polynomial\")) { //Set intercept value externally\r\n switch (type) {\r\n case \"polynomial\":\r\n Slope = (((SumProduct) - (Math.log(trendline.intercept) * SX)) / SXX) * 3;\r\n break;\r\n case \"linear\":\r\n Slope = ((SumProduct) - (trendline.intercept * SX)) / SXX;\r\n break;\r\n case \"exponential\":\r\n Slope = ((SumProduct) - (Math.log(trendline.intercept) * SX)) / SXX;\r\n break;\r\n\r\n }\r\n trendline._intercept = trendline.intercept;\r\n }\r\n else {\r\n Slope = ((N * SXY) - (SX * SY)) / ((N * SXX) - (SX * SX));\r\n if (type == \"exponential\" || type == \"power\")\r\n Intercept = Math.exp((SY - (Slope * SX)) / N);\r\n else\r\n Intercept = (SY - (Slope * SX)) / N;\r\n\r\n trendline._intercept = Intercept;\r\n }\r\n trendline.slope = Slope;\r\n return false;\r\n },\r\n\r\n ////Calculate forward backward Forecast points for dateTime axis\r\n _increaseDateTimeInterval: function (date, interval, intervalType) {\r\n var result = new Date(date);\r\n date = typeof (date) === \"object\" ? date : result;\r\n if (intervalType.toLowerCase() == \"days\") {\r\n result.setDate(date.getDate() + interval);\r\n } else if (intervalType.toLowerCase() == \"hours\") {\r\n result.setHours(date.getHours() + interval);\r\n } else if (intervalType.toLowerCase() == \"milliseconds\") {\r\n result.setMilliseconds(date.getMilliseconds() + interval);\r\n } else if (intervalType.toLowerCase() == \"seconds\") {\r\n result.setSeconds(date.getSeconds() + interval);\r\n } else if (intervalType.toLowerCase() == \"minutes\") {\r\n result.setMinutes(date.getMinutes() + interval);\r\n } else if (intervalType.toLowerCase() == \"months\") {\r\n result.setMonth(date.getMonth() + interval);\r\n } else if (intervalType.toLowerCase() == \"years\") {\r\n result.setYear(date.getFullYear() + interval);\r\n }\r\n return result;\r\n }\r\n\r\n },\r\n\r\n ej.ejLinear = ejExtendClass(ej.EjTrendLineRenderer);\r\n ej.trendlineTypes.linear = ej.ejLinear;\r\n\r\n ej.Exponential = ejExtendClass(ej.EjTrendLineRenderer, {\r\n\r\n updateExponentialTrendSource: function (points, trendline) {\r\n var len = points.length, point, xValue;\r\n trendline.xPoints = [];\r\n trendline.xValues = [];\r\n trendline.yValues = [];\r\n for (var i = 0; i < len; i++) {\r\n point = points[i];\r\n if (!point.isEmpty && !ej.isNullOrUndefined(point.y)) {\r\n trendline.xPoints.push(point.xValue);\r\n xValue = typeof (point.xValue) === 'number' ? point.xValue : Date.parse(point.xValue);\r\n trendline.xValues.push(xValue);\r\n trendline.yValues.push(Math.log(point.y));\r\n }\r\n }\r\n this.calculateSumXAndYValue(trendline);\r\n return false;\r\n },\r\n calculateExponentialTrendline: function (series, trendline, axis) {\r\n var count = trendline.xValues.length;\r\n var x1, x2, x3;\r\n var X1, X2, X3;\r\n\r\n var midPoint = Math.round((count / 2));\r\n trendline.points = [];\r\n\r\n if (count > 1) {\r\n if (axis._valueType.toLowerCase() == \"datetime\") {\r\n x1 = this._increaseDateTimeInterval(trendline.xPoints[0], -trendline.backwardForecast, axis._intervalType);\r\n X1 = x1.getTime();\r\n x2 = (trendline.xPoints[midPoint - 1]);\r\n X2 = new Date(x2).getTime();\r\n x3 = this._increaseDateTimeInterval(trendline.xPoints[count - 1], trendline.forwardForecast, axis._intervalType);\r\n X3 = x3.getTime();\r\n } else {\r\n x1 = X1 = (trendline.xPoints[0] - trendline.backwardForecast);\r\n x2 = X2 = (trendline.xPoints[midPoint - 1]);\r\n x3 = X3 = (trendline.xPoints[count - 1] + trendline.forwardForecast);\r\n }\r\n\r\n //trendline exponential segment (Intercept * Math.Exp(Slope * xValue));\r\n var y1 = (trendline._intercept * Math.exp(trendline.slope * x1));\r\n var y2 = (trendline._intercept * Math.exp(trendline.slope * x2));\r\n var y3 = (trendline._intercept * Math.exp(trendline.slope * x3));\r\n trendline.points.push({ x: x1, xValue: X1, y: y1, YValues: [], visible: true });\r\n trendline.points.push({ x: x2, xValue: X2, y: y2, YValues: [], visible: true });\r\n trendline.points.push({ x: x3, xValue: X3, y: y3, YValues: [], visible: true });\r\n\r\n trendline.points[0].YValues[0] = trendline.points[0].y;\r\n trendline.points[1].YValues[0] = trendline.points[1].y;\r\n trendline.points[2].YValues[0] = trendline.points[2].y;\r\n }\r\n return false;\r\n }\r\n });\r\n ej.trendlineTypes.exponential = ej.Exponential;\r\n\r\n ej.Logarithmic = ejExtendClass(ej.EjTrendLineRenderer, {\r\n\r\n updateLogarithmicTrendSource: function (points, trendline) {\r\n var len = points.length, point, xValue;\r\n trendline.xPoints = [];\r\n trendline.xValues = [];\r\n trendline.yValues = [];\r\n for (var i = 0; i < len; i++) {\r\n point = points[i];\r\n if (!point.isEmpty && !ej.isNullOrUndefined(point.y)) {\r\n trendline.xPoints.push(point.xValue);\r\n xValue = typeof (point.xValue) === 'number' ? point.xValue : Date.parse(point.xValue);\r\n trendline.xValues.push(Math.log(xValue));\r\n trendline.yValues.push(point.y);\r\n }\r\n }\r\n this.calculateSumXAndYValue(trendline);\r\n return false;\r\n },\r\n calculateLogarithmicTrendline: function (series, trendline, axis) {\r\n var count = trendline.xValues.length;\r\n var x1, x2, x3;\r\n var X1, X2, X3;\r\n var midPoint = Math.round((count / 2));\r\n trendline.points = [];\r\n\r\n if (count > 1) {\r\n if (axis._valueType.toLowerCase() == \"datetime\") {\r\n x1 = this._increaseDateTimeInterval(trendline.xPoints[0], -trendline.backwardForecast, axis._intervalType);\r\n X1 = x1.getTime();\r\n x2 = (trendline.xPoints[midPoint - 1]);\r\n X2 = new Date(x2).getTime();\r\n x3 = this._increaseDateTimeInterval(trendline.xPoints[count - 1], trendline.forwardForecast, axis._intervalType);\r\n X3 = x3.getTime();\r\n } else {\r\n x1 = X1 = (trendline.xPoints[0] - trendline.backwardForecast);\r\n x2 = X2 = (trendline.xPoints[midPoint - 1]);\r\n x3 = X3 = (trendline.xPoints[count - 1] + trendline.forwardForecast);\r\n }\r\n\r\n //trendline logarithmic segment Intercept + Slope * Math.Log(xValue);\r\n var y1 = trendline._intercept + (trendline.slope * Math.log(x1));\r\n var y2 = trendline._intercept + (trendline.slope * Math.log(x2));\r\n var y3 = trendline._intercept + (trendline.slope * Math.log(x3));\r\n trendline.points.push({ x: x1, xValue: X1, y: y1, YValues: [], visible: true });\r\n trendline.points.push({ x: x2, xValue: X2, y: y2, YValues: [], visible: true });\r\n trendline.points.push({ x: x3, xValue: X3, y: y3, YValues: [], visible: true });\r\n\r\n trendline.points[0].YValues[0] = trendline.points[0].y;\r\n trendline.points[1].YValues[0] = trendline.points[1].y;\r\n trendline.points[2].YValues[0] = trendline.points[2].y;\r\n }\r\n return false;\r\n }\r\n });\r\n ej.trendlineTypes.logarithmic = ej.Logarithmic;\r\n\r\n ej.Power = ejExtendClass(ej.EjTrendLineRenderer, {\r\n\r\n updatePowerTrendSource: function (points, trendline) {\r\n var len = points.length, point, xValue;\r\n trendline.xPoints = [];\r\n trendline.xValues = [];\r\n trendline.yValues = [];\r\n for (var i = 0; i < len; i++) {\r\n point = points[i];\r\n if (!point.isEmpty) {\r\n trendline.xPoints.push(point.xValue);\r\n xValue = typeof (point.xValue) === 'number' ? point.xValue : Date.parse(point.xValue);\r\n trendline.xValues.push(Math.log(xValue));\r\n trendline.yValues.push(Math.log(point.y));\r\n }\r\n }\r\n this.calculateSumXAndYValue(trendline);\r\n return false;\r\n },\r\n calculatePowerTrendline: function (series, trendline, axis) {\r\n var count = trendline.xValues.length;\r\n var x1, x2, x3;\r\n var X1, X2, X3;\r\n var midPoint = Math.round((count / 2));\r\n trendline.points = [];\r\n\r\n if (count > 1) {\r\n if (axis._valueType.toLowerCase() == \"datetime\") {\r\n x1 = this._increaseDateTimeInterval(trendline.xPoints[0], -trendline.backwardForecast, axis._intervalType);\r\n X1 = x1.getTime();\r\n x2 = (trendline.xPoints[midPoint - 1]);\r\n X2 = new Date(x2).getTime();\r\n x3 = this._increaseDateTimeInterval(trendline.xPoints[count - 1], trendline.forwardForecast, axis._intervalType);\r\n X3 = x3.getTime();\r\n } else {\r\n var p1 = (trendline.xPoints[0] - trendline.backwardForecast);\r\n x1 = X1 = p1 > -1 ? p1 : 0;\r\n x2 = X2 = (trendline.xPoints[midPoint - 1]);\r\n x3 = X3 = (trendline.xPoints[count - 1] + trendline.forwardForecast);\r\n }\r\n\r\n //trendline power segment (Intercept * Math.Pow(xValue, Slope))\r\n var y1 = trendline._intercept * Math.pow(x1, trendline.slope);\r\n var y2 = trendline._intercept * Math.pow(x2, trendline.slope);\r\n var y3 = trendline._intercept * Math.pow(x3, trendline.slope);\r\n trendline.points.push({ x: x1, xValue: X1, y: y1, YValues: [], visible: true });\r\n trendline.points.push({ x: x2, xValue: X2, y: y2, YValues: [], visible: true });\r\n trendline.points.push({ x: x3, xValue: X3, y: y3, YValues: [], visible: true });\r\n\r\n trendline.points[0].YValues[0] = trendline.points[0].y;\r\n trendline.points[1].YValues[0] = trendline.points[1].y;\r\n trendline.points[2].YValues[0] = trendline.points[2].y;\r\n }\r\n return false;\r\n }\r\n });\r\n ej.trendlineTypes.power = ej.Power;\r\n\r\n ej.Polynomial = ejExtendClass(ej.EjTrendLineRenderer, {\r\n\r\n //// Calculate Polynomial Trendline with order\r\n calculatePolynomialTrendline: function (series, trendline, axis) {\r\n var power = trendline.polynomialOrder;\r\n\r\n // Calculate sum of y datapoints 1 X power matrix\r\n trendline.polynomialSlopes = new Array(power + 1);\r\n var xLength = trendline.xValues.length;\r\n for (var index1 = 0; index1 < xLength; index1++) {\r\n var num2 = trendline.xValues[index1];\r\n var yval = trendline.yValues[index1];\r\n\r\n for (var index2 = 0; index2 <= power; ++index2) {\r\n if (!trendline.polynomialSlopes[index2]) trendline.polynomialSlopes[index2] = 0;\r\n trendline.polynomialSlopes[index2] += Math.pow(num2, index2) * yval;\r\n }\r\n }\r\n\r\n // Calculate sum matrix of x datapoints\r\n var numArray = new Array(1 + 2 * power);\r\n var matrixOfA = new Array(power + 1);\r\n for (var i = 0; i < (power + 1); i++)\r\n matrixOfA[i] = new Array(3);\r\n var num1 = 0;\r\n for (var index1 = 0; index1 < xLength; ++index1) {\r\n var num2 = 1.0;\r\n var d = trendline.xValues[index1];\r\n for (var index2 = 0; index2 < numArray.length; ++index2) {\r\n if (!numArray[index2]) numArray[index2] = 0;\r\n numArray[index2] += num2;\r\n num2 *= d;\r\n ++num1;\r\n }\r\n }\r\n\r\n for (var index1 = 0; index1 <= power; ++index1) {\r\n for (var index2 = 0; index2 <= power; ++index2)\r\n matrixOfA[index1][index2] = numArray[index1 + index2];\r\n }\r\n\r\n //Calculation Gauss jordan eliminiation value of a and b matrix\r\n if (!this.gaussJordanEliminiation(matrixOfA, trendline.polynomialSlopes))\r\n trendline.polynomialSlopes = null;\r\n\r\n //Create segments methods\r\n this.createPolynomialSegments(series, axis, trendline);\r\n return false;\r\n },\r\n createPolynomialSegments: function (series, axis, trendline) {\r\n var polynomialSlopes = trendline.polynomialSlopes;\r\n if (polynomialSlopes != null) {\r\n var count = trendline.xValues.length, midPoint = Math.round((count / 2)), x1 = 1, X, length = polynomialSlopes.length;\r\n var valueType = axis._valueType.toLowerCase();\r\n\r\n trendline.points = [];\r\n for (var i = 1; i <= length; i++) {\r\n var x, y;\r\n if (i == 1) {\r\n if (valueType == \"datetime\") {\r\n x = this._increaseDateTimeInterval(trendline.xPoints[0], -trendline.backwardForecast, axis._intervalType);\r\n X = x.getTime();\r\n }\r\n else\r\n x = X = (trendline.xPoints[0] - trendline.backwardForecast);\r\n var y = this.getPolynomialYValue(polynomialSlopes, X);\r\n }\r\n else if (i == polynomialSlopes.length) {\r\n if (valueType == \"datetime\") {\r\n x = this._increaseDateTimeInterval(trendline.xPoints[count - 1], trendline.forwardForecast, axis._intervalType);\r\n X = x.getTime();\r\n }\r\n else\r\n x = X = (trendline.xPoints[count - 1] + trendline.forwardForecast);\r\n\r\n var y = this.getPolynomialYValue(polynomialSlopes, X);\r\n } else {\r\n x1 += (count + trendline.forwardForecast) / polynomialSlopes.length;\r\n if (valueType == \"category\") {\r\n x = X = trendline.xPoints[0] + (x1 - 1);\r\n\r\n }\r\n else {\r\n x = X = trendline.xPoints[parseInt(x1) - 1];\r\n if (valueType == \"datetime\" && count > x1)\r\n X = new Date(x).getTime();\r\n }\r\n var y = this.getPolynomialYValue(polynomialSlopes, X);\r\n }\r\n if (i == 1 || i == polynomialSlopes.length || valueType == \"category\" || count > x1) {\r\n trendline.points.push({ x: x, xValue: X, y: y, YValues: [], visible: true });\r\n trendline.points[trendline.points.length - 1].YValues[0] = trendline.points[trendline.points.length - 1].y;\r\n }\r\n }\r\n }\r\n return false;\r\n },\r\n\r\n getPolynomialYValue: function (slopes, x) {\r\n var sum = 0;\r\n for (var i = 0; i < slopes.length; i++) {\r\n sum += slopes[i] * Math.pow(x, i);\r\n }\r\n return sum;\r\n },\r\n\r\n gaussJordanEliminiation: function (matrixOfA, polynomialSlopes) {\r\n var length = matrixOfA.length;\r\n var numArray1 = new Array(length);\r\n var numArray2 = new Array(length);\r\n var numArray3 = new Array(length);\r\n for (var index = 0; index < length; ++index)\r\n numArray3[index] = 0;\r\n for (var index1 = 0; index1 < length; ++index1) {\r\n var num1 = 0.0;\r\n var index2 = 0;\r\n var index3 = 0;\r\n for (var index4 = 0; index4 < length; ++index4) {\r\n if (numArray3[index4] != 1) {\r\n for (var index5 = 0; index5 < length; ++index5) {\r\n if (numArray3[index5] == 0 && Math.abs(matrixOfA[index4][index5]) >= num1) {\r\n num1 = Math.abs(matrixOfA[index4][index5]);\r\n index2 = index4;\r\n index3 = index5;\r\n }\r\n }\r\n }\r\n }\r\n ++numArray3[index3];\r\n if (index2 != index3) {\r\n for (var index4 = 0; index4 < length; ++index4) {\r\n var num2 = matrixOfA[index2, index4];\r\n matrixOfA[index2][index4] = matrixOfA[index3][index4];\r\n matrixOfA[index3][index4] = num2;\r\n }\r\n var num3 = polynomialSlopes[index2];\r\n polynomialSlopes[index2] = polynomialSlopes[index3];\r\n polynomialSlopes[index3] = num3;\r\n }\r\n numArray2[index1] = index2;\r\n numArray1[index1] = index3;\r\n if (matrixOfA[index3][index3] == 0.0)\r\n return false;\r\n var num4 = 1.0 / matrixOfA[index3][index3];\r\n matrixOfA[index3][index3] = 1.0;\r\n\r\n for (var index4 = 0; index4 < length; ++index4)\r\n matrixOfA[index3][index4] *= num4;\r\n\r\n polynomialSlopes[index3] *= num4;\r\n\r\n for (var index4 = 0; index4 < length; ++index4) {\r\n if (index4 != index3) {\r\n var num2 = matrixOfA[index4][index3];\r\n matrixOfA[index4][index3] = 0.0;\r\n for (var index5 = 0; index5 < length; ++index5)\r\n matrixOfA[index4][index5] -= matrixOfA[index3][index5] * num2;\r\n polynomialSlopes[index4] -= polynomialSlopes[index3] * num2;\r\n }\r\n }\r\n }\r\n for (var index1 = length - 1; index1 >= 0; --index1) {\r\n if (numArray2[index1] != numArray1[index1]) {\r\n for (var index2 = 0; index2 < length; ++index2) {\r\n var num = matrixOfA[index2, numArray2[index1]];\r\n matrixOfA[index2][numArray2[index1]] = matrixOfA[index2][numArray1[index1]];\r\n matrixOfA[index2][numArray1[index1]] = num;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n });\r\n ej.trendlineTypes.polynomial = ej.Polynomial;\r\n\r\n ej.MovingAverage = ejExtendClass(ej.EjTrendLineRenderer, {\r\n\r\n updateMovingAverageTrendSource: function (points, trendline) {\r\n var len = points.length, i, yVal;\r\n trendline.xPoints = [];\r\n trendline.xValues = [];\r\n trendline.yValues = [];\r\n for (i = 0; i < len; i++) {\r\n trendline.xPoints.push(points[i].xValue);\r\n trendline.xValues.push(i + 1);\r\n yVal = !points[i].isEmpty ? points[i].y : null;\r\n trendline.yValues.push(yVal);\r\n }\r\n return false;\r\n },\r\n calculateMovingAverageTrendline: function (series, trendline, axis) {\r\n var pointsLength = trendline.xPoints.length,\r\n period = trendline.period >= pointsLength ? pointsLength - 1 : trendline.period,\r\n x1, i, j, yVal, count, nullCount, xVal, length;\r\n period = period < 2 ? 2 : period;\r\n trendline.points = [];\r\n\r\n for (i = 0; i < pointsLength - 1; i++) {\r\n yVal = count = nullCount = 0;\r\n for (j = i; count < period; j++) {\r\n count++;\r\n if (ej.util.isNullOrUndefined(trendline.yValues[j])) nullCount++;\r\n yVal += trendline.yValues[j];\r\n }\r\n yVal = period - nullCount <= 0 ? null : yVal / (period - nullCount);\r\n if (!ej.util.isNullOrUndefined(yVal) && !isNaN(yVal)) {\r\n xVal = trendline.xPoints[period - 1 + i];\r\n trendline.points.push({\r\n x: xVal, xValue: xVal,\r\n y: yVal, YValues: [], visible: true\r\n });\r\n length = trendline.points.length;\r\n trendline.points[length - 1].YValues[0] = trendline.points[length - 1].y;\r\n }\r\n }\r\n }\r\n });\r\n ej.trendlineTypes.movingaverage = ej.MovingAverage;\r\n\r\n ej.EjIndicatorRender.prototype = {\r\n\r\n draw: function (indicator, sender) {\r\n\r\n this.chartObj = sender;\r\n var translate = null;\r\n\r\n if (this.chartObj.model.AreaType == \"cartesianaxes\") {\r\n var transX = indicator.xAxis.x;\r\n var transY = indicator.yAxis.y;\r\n translate = 'translate(' + transX + ',' + transY + ')';\r\n }\r\n\r\n var indicatorIndex = $.inArray(indicator, this.chartObj.model.indicators);\r\n var indicatorOptions = { 'id': this.chartObj.svgObject.id + '_indicatorGroup' + '_' + indicatorIndex, 'transform': translate };\r\n this.gIndicatorGroupEle = this.chartObj.svgRenderer.createGroup(indicatorOptions);\r\n\r\n\r\n if (indicator._points.length > 0) {\r\n for (var i = 0; i < indicator.segment.length; i++) {\r\n var segment = indicator.segment[i];\r\n var style = { fill: segment.fill, width: segment.width, opacity: indicator.opacity };\r\n segment.isIndicator = true;\r\n segment.xAxis = indicator.xAxis;\r\n segment.yAxis = indicator.yAxis;\r\n if (segment.type == \"line\")\r\n this.calculateDirection(segment, style, indicatorIndex);\r\n else\r\n this.drawColumn(segment, style, indicator);\r\n }\r\n }\r\n\r\n },\r\n\r\n _drawLinePath: function (indicator, style, lDirection, indicatorIndex) {\r\n\r\n\r\n\r\n\r\n if (lDirection != \"\") {\r\n var options = {\r\n 'name': 'line',\r\n 'id': this.chartObj.svgObject.id + \"_\" + indicatorIndex + \"_\" + indicator.name,\r\n 'fill': 'none',\r\n 'stroke-dasharray': indicator.dashArray,\r\n 'stroke-width': style.width,\r\n 'stroke': style.fill,\r\n 'stroke-linecap': indicator.lineCap,\r\n 'stroke-linejoin': indicator.lineJoin,\r\n 'opacity': style.opacity,\r\n 'd': lDirection\r\n };\r\n\r\n this.chartObj.svgRenderer.drawPath(options, this.gIndicatorGroupEle);\r\n }\r\n\r\n this.chartObj.svgRenderer.append(this.gIndicatorGroupEle, this.chartObj.gIndicatorEle);\r\n },\r\n\r\n calculateDirection: function (currentseries, style, indicatorIndex) {\r\n var canvasX = 0;\r\n var canvasY = 0;\r\n var point;\r\n if (this.chartObj.model.enableCanvasRendering) {\r\n canvasX = currentseries.xAxis.x;\r\n canvasY = currentseries.yAxis.y;\r\n }\r\n currentseries.points = ej.DataManager(currentseries.points, ej.Query().sortBy(\"xValue\")).executeLocal();\r\n\r\n var visiblePoints = ej.EjSeriesRender.prototype._isVisiblePoints(currentseries);\r\n var lDirection;\r\n var sb = ej.EjSvgRender.utils._getStringBuilder();\r\n\r\n // Dashed Line issue in Indicator is fixed.\r\n var firstPoint = false;\r\n var secondPoint;\r\n\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n secondPoint = visiblePoints[i];\r\n if (secondPoint.visible) {\r\n point = ej.EjSvgRender.utils._getPoint(secondPoint, currentseries);\r\n if (firstPoint) {\r\n sb.append(\"L\" + \" \" + (point.X + canvasX) + \" \" + ((point.Y + canvasY)) + \" \");\r\n }\r\n else {\r\n sb.append(\"M\" + \" \" + (point.X + canvasX) + \" \" + ((point.Y + canvasY)) + \" \");\r\n firstPoint = true;\r\n }\r\n\r\n }\r\n else {\r\n firstPoint = false;\r\n }\r\n\r\n }\r\n\r\n lDirection = sb.toString();\r\n\r\n this._drawLinePath(currentseries, style, lDirection, indicatorIndex);\r\n },\r\n\r\n drawColumn: function (option, style, indicator) {\r\n var series = option;\r\n var seriesIndex = $.inArray(indicator, this.chartObj.model.indicators);\r\n series.index = seriesIndex;\r\n var origin = Math.max(option.yAxis.visibleRange.min, 0);\r\n\r\n var sidebysideinfo = { Start: -0.35, End: 0.35 };\r\n var visiblePoints = ej.EjSeriesRender.prototype._isVisiblePoints(series);\r\n\r\n var cSer = this;\r\n var chart = cSer.chartObj;\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n var pointIndex = i;\r\n var point = visiblePoints[i];\r\n\r\n var y1 = point.YValues[0];\r\n var y2 = origin;\r\n if (point.visible) {\r\n //calculate sides\r\n var data = ej.EjSeriesRender.prototype.calculateSides(point, sidebysideinfo);\r\n var x1 = data.x1;\r\n var x2 = data.x2;\r\n var rect = ej.EjSeriesRender.prototype.getRectangle(x1, y1, x2, y2, series, chart);\r\n\r\n //drawing part\r\n var xr = Math.min(0, rect.Width);\r\n var yr = Math.min(0, rect.Height);\r\n if (rect.Width < 0.0001)// condition checked for IE width issue\r\n rect.Width = 0.0001;\r\n var bounds;\r\n if ((xr == 0 || yr == 0) && rect.Width > 0) {\r\n var options = {\r\n 'id': this.chartObj.svgObject.id + \"_\" + seriesIndex + \"_\" + series.name,\r\n 'x': rect.X + cSer.chartObj.canvasX,\r\n 'y': rect.Y + cSer.chartObj.canvasY,\r\n 'width': rect.Width,\r\n 'height': rect.Height,\r\n 'fill': (!visiblePoints[i].fill) ? style.fill : visiblePoints[i].fill,\r\n 'stroke-width': series.border.width,\r\n 'plot': y1 < 0 ? \"negative\" : \"positive\",\r\n 'opacity': series.histogram.opacity,\r\n 'stroke': (!visiblePoints[i].fill) ? series.border.color : visiblePoints[i].fill\r\n };\r\n\r\n this.chartObj.svgRenderer.drawRect(options, this.gIndicatorGroupEle);\r\n\r\n var svgXy = ej.EjSvgRender.utils._getSvgXY(rect.X, (rect.Y), series, cSer.chartObj);\r\n bounds = { X: svgXy.X, Y: svgXy.Y, Width: rect.Width, Height: rect.Height };\r\n\r\n this._addRegion(cSer.chartObj, bounds, series, point, pointIndex);\r\n }\r\n }\r\n }\r\n\r\n this.chartObj.svgRenderer.append(this.gIndicatorGroupEle, this.chartObj.gIndicatorEle);\r\n },\r\n _addRegion: function (chart, bounds, series, point, pointIndex) {\r\n var type = series.type;\r\n if (series.index >= 0) {\r\n var regionItem = { SeriesIndex: series.index, Region: { PointIndex: pointIndex, Bounds: bounds }, type: type, isIndicator: true };\r\n chart.model.chartRegions.push(regionItem);\r\n }\r\n },\r\n\r\n calculateSegment: function (indicator, sender) {\r\n this.chartObj = sender;\r\n indicator.segment = [];\r\n indicator.xRange = {};\r\n indicator.yRange = {};\r\n indicator.period = parseInt(indicator.period); // to convert float value to integer\r\n if (indicator.period < indicator._points.length && indicator.period > 0) {\r\n //Upperband \r\n var upperSeries = $.extend(true, {}, indicator);\r\n upperSeries.name = \"upperseries\";\r\n upperSeries.fill = indicator.upperLine.fill;\r\n upperSeries.width = indicator.upperLine.width;\r\n upperSeries.type = \"line\";\r\n\r\n for (var k = 0; k < indicator._points.length; k++) {\r\n indicator._points[k].YValues.length = 1;\r\n indicator._points[k].YValues[0] = indicator._points[k].y = 70;\r\n }\r\n\r\n upperSeries.points = $.extend(true, [], indicator._points);\r\n var xValues = sender._getXValues(upperSeries.points);\r\n var yValues = sender._getYValues(upperSeries.points);\r\n\r\n indicator.xRange.min = Math.min.apply(Math, xValues);\r\n indicator.xRange.max = Math.max.apply(Math, xValues);\r\n indicator.yRange.min = Math.min.apply(Math, yValues);\r\n indicator.yRange.max = Math.max.apply(Math, yValues);\r\n\r\n indicator.segment.push(upperSeries);\r\n\r\n //Lowerband\r\n var lowerSeries = $.extend(true, {}, indicator);\r\n lowerSeries.name = \"lowerSeries\";\r\n lowerSeries.width = indicator.lowerLine.width;\r\n lowerSeries.fill = indicator.lowerLine.fill;\r\n lowerSeries.type = \"line\";\r\n\r\n\r\n for (var n = 0; n < indicator._points.length; n++) {\r\n indicator._points[n].YValues[0] = indicator._points[n].y = 30;\r\n }\r\n\r\n lowerSeries.points = $.extend(true, [], indicator._points);\r\n\r\n yValues = sender._getYValues(lowerSeries.points);\r\n\r\n indicator.yRange.min = Math.min(Math.min.apply(Math, yValues), indicator.yRange.min);\r\n indicator.yRange.max = Math.max(Math.max.apply(Math, yValues), indicator.yRange.max);\r\n\r\n indicator.segment.push(lowerSeries);\r\n\r\n // signalLine\r\n var trendSeries = $.extend(true, {}, indicator);\r\n trendSeries.name = \"signalSeries\";\r\n trendSeries.width = indicator.width;\r\n trendSeries.fill = indicator.fill;\r\n trendSeries.type = \"line\";\r\n\r\n var c = 0, c1 = 0;\r\n var pmf = 0;\r\n var nmf = 0;\r\n var len = indicator.period;\r\n c1 = indicator._points[0].close;\r\n\r\n for (var i = 1; i <= len; ++i) {\r\n c = indicator._points[i].close;\r\n if (c > c1)\r\n pmf += c - c1;\r\n else if (c < c1)\r\n nmf += c1 - c;\r\n c1 = c;\r\n indicator._points[i - 1].YValues[0] = indicator._points[i - 1].y = null;\r\n }\r\n pmf = pmf / len;\r\n nmf = nmf / len;\r\n\r\n indicator._points[len].YValues[0] = indicator._points[len].y = 100 - 100 / (1 + pmf / nmf);\r\n\r\n for (var j = len + 1; j < indicator._points.length; j++) {\r\n c = indicator._points[j].close;\r\n if (c > c1) {\r\n pmf = (pmf * (len - 1) + (c - c1)) / len;\r\n nmf = (nmf * (len - 1)) / len;\r\n }\r\n else if (c < c1) {\r\n nmf = (nmf * (len - 1) + (c1 - c)) / len;\r\n pmf = (pmf * (len - 1)) / len;\r\n }\r\n c1 = c;\r\n indicator._points[j].YValues[0] = indicator._points[j].y = 100 - (100 / (1 + pmf / nmf));\r\n }\r\n trendSeries.points = $.extend(true, [], indicator._points);\r\n var trendPoints = [];\r\n for (var i = len, j = 0; i < trendSeries.points.length; i++ , j++) {\r\n trendPoints[j] = trendSeries.points[i].y;\r\n }\r\n\r\n indicator.yRange.min = Math.min(Math.min.apply(Math, trendPoints), indicator.yRange.min);\r\n indicator.yRange.max = Math.max(Math.max.apply(Math, trendPoints), indicator.yRange.max);\r\n\r\n indicator.segment.push(trendSeries);\r\n this.calculateIndicatorRange(sender, indicator);\r\n }\r\n },\r\n\r\n calculateIndicatorRange: function (sender, indicator) {\r\n //Indicator X-Axis Calculation\r\n if (sender.model.indicatorRange[indicator.xAxisName] == undefined) {\r\n sender.model.indicatorRange[indicator.xAxisName] = {};\r\n sender.model.indicatorRange[indicator.xAxisName] = { min: indicator.xRange.min, max: indicator.xRange.max };\r\n } else {\r\n if (sender.model.indicatorRange[indicator.xAxisName].min > indicator.xRange.min)\r\n sender.model.indicatorRange[indicator.xAxisName].min = indicator.xRange.min;\r\n if (sender.model.indicatorRange[indicator.xAxisName].max < indicator.xRange.max)\r\n sender.model.indicatorRange[indicator.xAxisName].max = indicator.xRange.max;\r\n }\r\n //Indicator Y-Axis Calculation\r\n if (sender.model.indicatorRange[indicator.yAxisName] === undefined) {\r\n sender.model.indicatorRange[indicator.yAxisName] = {};\r\n sender.model.indicatorRange[indicator.yAxisName] = { min: indicator.yRange.min, max: indicator.yRange.max };\r\n } else {\r\n if (sender.model.indicatorRange[indicator.yAxisName].min > indicator.yRange.min)\r\n sender.model.indicatorRange[indicator.yAxisName].min = indicator.yRange.min;\r\n if (sender.model.indicatorRange[indicator.yAxisName].max < indicator.yRange.max)\r\n sender.model.indicatorRange[indicator.yAxisName].max = indicator.yRange.max;\r\n }\r\n }\r\n },\r\n ej.ejRSI = ejExtendClass(ej.EjIndicatorRender);\r\n\r\n ej.indicatorTypes.rsi = ej.ejRSI;\r\n ej.ejMACD = ejExtendClass(ej.EjIndicatorRender, {\r\n\r\n\r\n calculateSegment: function (indicator, sender) {\r\n this.chartObj = sender;\r\n indicator.segment = [];\r\n indicator.xRange = {};\r\n indicator.yRange = {};\r\n\r\n var pointsLength = indicator._points.length;\r\n var longPeriod = indicator.longPeriod;\r\n var shortPeriod = indicator.shortPeriod;\r\n var trigger = indicator.trigger;\r\n var diff = longPeriod - shortPeriod;\r\n var shortEMA = [];\r\n var longEMA = [];\r\n var macdPoints = [];\r\n var signalEMA = [];\r\n var histogramPoints = [];\r\n var length = longPeriod + trigger;\r\n if (length <= indicator._points.length && ((length - 2) >= 0) && (shortPeriod <= longPeriod) && (shortPeriod > 0)) {\r\n shortEMA = this.calculateEMA(indicator._points, shortPeriod, true);\r\n longEMA = this.calculateEMA(indicator._points, longPeriod, true);\r\n\r\n //Calculte MACD Line points: MACD Line: (shortPeriod EMA - longPeriod EMA) \r\n for (i = 0; i < longEMA.length; i++)\r\n macdPoints.push((shortEMA[i + diff] - longEMA[i]));\r\n\r\n //MACD Line \r\n var macdSeries = $.extend(true, {}, indicator);\r\n macdSeries.name = \"macdSeries\";\r\n macdSeries.fill = indicator.macdLine.fill;\r\n macdSeries.width = indicator.macdLine.width;\r\n macdSeries.type = \"line\";\r\n macdSeries.xAxis = indicator.xAxis;\r\n macdSeries.yAxis = indicator.yAxis;\r\n\r\n var l = longPeriod - 1;\r\n for (var t = 0, i = 0; t < pointsLength; t++) {\r\n if (t < l)\r\n indicator._points[t].YValues[0] = indicator._points[t].y = null;\r\n else {\r\n indicator._points[t].YValues[0] = indicator._points[t].y = macdPoints[i];\r\n i += 1;\r\n }\r\n }\r\n macdSeries.points = $.extend(true, [], indicator._points);\r\n //////////////////////////////////////////////\r\n\r\n //Signal Line: Trigger value(9-day default) EMA of MACD Line \r\n signalEMA = this.calculateEMA(macdPoints, trigger, false);\r\n var trendSeries = $.extend(true, {}, indicator);\r\n trendSeries.name = \"signalSeries\";\r\n trendSeries.fill = indicator.fill;\r\n trendSeries.width = indicator.width;\r\n trendSeries.type = \"line\";\r\n trendSeries.xAxis = indicator.xAxis;\r\n trendSeries.yAxis = indicator.yAxis;\r\n\r\n var l = longPeriod + trigger - 2;\r\n for (var t = 0, i = 0; t < pointsLength; t++) {\r\n if (t < l)\r\n indicator._points[t].YValues[0] = indicator._points[t].y = null;\r\n else {\r\n indicator._points[t].YValues[0] = indicator._points[t].y = signalEMA[i];\r\n i += 1;\r\n }\r\n }\r\n trendSeries.points = $.extend(true, [], indicator._points);\r\n /////////////////////////////////////////\r\n\r\n //MACD Histogram: MACD Line - Signal Line\r\n var histogramSeries = $.extend(true, {}, indicator);\r\n histogramSeries.border = {};\r\n histogramSeries.name = \"histogramSeries\";\r\n histogramSeries.fill = indicator.histogram.fill;\r\n histogramSeries.opacity = indicator.histogram.opacity;\r\n histogramSeries.fill = indicator.histogram.fill;\r\n histogramSeries.border = indicator.histogram.border;\r\n histogramSeries.type = \"column\";\r\n histogramSeries.xAxis = indicator.xAxis;\r\n histogramSeries.yAxis = indicator.yAxis;\r\n\r\n for (var j = 0, k = l; k < pointsLength; j++ , k++)\r\n histogramPoints.push((macdPoints[j + (trigger - 1)]) - (signalEMA[j]));\r\n for (var j = 0, k = l; k < pointsLength; j++ , k++) {\r\n indicator._points[k].YValues[0] = indicator._points[k].y = histogramPoints[j];\r\n }\r\n histogramSeries.points = $.extend(true, [], indicator._points);\r\n var xValues = sender._getXValues(macdSeries.points);\r\n indicator.xRange.min = Math.min.apply(Math, xValues);\r\n indicator.xRange.max = Math.max.apply(Math, xValues);\r\n\r\n switch (indicator.macdType) {\r\n case \"line\":\r\n {\r\n //Push MACD Line\r\n indicator.yRange.min = Math.min.apply(Math, macdPoints);\r\n indicator.yRange.max = Math.max.apply(Math, macdPoints);\r\n indicator.segment.push(macdSeries);\r\n\r\n //Push Signal Line\r\n var min = Math.min.apply(Math, signalEMA), max = Math.max.apply(Math, signalEMA);\r\n indicator.yRange.min = indicator.yRange.min < min ? indicator.yRange.min : min;\r\n indicator.yRange.max = indicator.yRange.max > max ? indicator.yRange.max : max;\r\n indicator.segment.push(trendSeries);\r\n }\r\n break;\r\n case \"histogram\":\r\n {\r\n //Push histogram Series\r\n var min1 = Math.min.apply(Math, histogramPoints), max1 = Math.max.apply(Math, histogramPoints);\r\n indicator.yRange.min = indicator.yRange.min < min1 ? indicator.yRange.min : min1;\r\n indicator.yRange.max = indicator.yRange.max > max1 ? indicator.yRange.max : max1;\r\n indicator.segment.push(histogramSeries);\r\n }\r\n break;\r\n case \"both\":\r\n {\r\n //Push histogram Series\r\n var min1 = Math.min.apply(Math, histogramPoints), max1 = Math.max.apply(Math, histogramPoints);\r\n indicator.yRange.min = indicator.yRange.min < min1 ? indicator.yRange.min : min1;\r\n indicator.yRange.max = indicator.yRange.max > max1 ? indicator.yRange.max : max1;\r\n indicator.segment.push(histogramSeries);\r\n\r\n //Push MACD Line \r\n indicator.yRange.min = Math.min.apply(Math, macdPoints);\r\n indicator.yRange.max = Math.max.apply(Math, macdPoints);\r\n indicator.segment.push(macdSeries);\r\n\r\n //Push Signal Line\r\n var min = Math.min.apply(Math, signalEMA), max = Math.max.apply(Math, signalEMA);\r\n indicator.yRange.min = indicator.yRange.min < min ? indicator.yRange.min : min;\r\n indicator.yRange.max = indicator.yRange.max > max ? indicator.yRange.max : max;\r\n indicator.segment.push(trendSeries);\r\n }\r\n break;\r\n }\r\n this.calculateIndicatorRange(sender, indicator);\r\n }\r\n },\r\n calculateEMA: function (points, period, flag) {\r\n var sma = 0;\r\n var initialEMA = 0;\r\n var pointsLength = points.length;\r\n var getPoints = [];\r\n var getEma = [];\r\n var emaPercent = (2 / (period + 1));\r\n if (flag) { // calculating EMA for Indicators Points\r\n for (var i = 0; i < period; i++) {\r\n getPoints.push(points[i].close);\r\n sma = sma + getPoints[i];\r\n }\r\n\r\n initialEMA = (sma / period);\r\n getEma.push(initialEMA);\r\n var emaAvg = initialEMA;\r\n for (var j = period; j < pointsLength; j++) {\r\n emaAvg = (points[j].close - emaAvg) * emaPercent + emaAvg;\r\n getEma.push(emaAvg);\r\n }\r\n } else { //Calculating EMA for Signal Points\r\n for (var i = 0; i < period; i++) {\r\n getPoints.push(points[i]);\r\n sma = sma + getPoints[i];\r\n }\r\n\r\n initialEMA = (sma / period);\r\n getEma.push(initialEMA);\r\n var emaAvg = initialEMA;\r\n for (var j = period; j < pointsLength; j++) {\r\n emaAvg = (points[j] - emaAvg) * emaPercent + emaAvg;\r\n getEma.push(emaAvg);\r\n }\r\n }\r\n return getEma;\r\n }\r\n\r\n });\r\n\r\n ej.indicatorTypes.macd = ej.ejMACD;\r\n ej.ejSMA = ejExtendClass(ej.EjIndicatorRender, {\r\n\r\n\r\n calculateSegment: function (indicator, sender) {\r\n this.chartObj = sender;\r\n indicator.segment = [];\r\n indicator.xRange = {};\r\n indicator.yRange = {};\r\n\r\n\r\n\r\n // signalLine\r\n var trendSeries = $.extend(true, {}, indicator);\r\n trendSeries.name = \"trendSeries\";\r\n trendSeries.width = indicator.width;\r\n trendSeries.fill = indicator.fill;\r\n trendSeries.type = \"line\";\r\n\r\n //variable declaration\r\n var closevalues = [];\r\n var smavalues = [];\r\n var trendPoints = [];\r\n var sum, xValues;\r\n var length = indicator._points.length;\r\n var period = indicator.period;\r\n\r\n if (period <= 0 || length < period) return;\r\n\r\n //Push the Close values\r\n for (var i = 0; i < length; i++) {\r\n\r\n closevalues.push(indicator._points[i].close);\r\n\r\n }\r\n\r\n var close_length = closevalues.length;\r\n //calculation for SMA values\r\n\r\n\r\n while (close_length >= period) {\r\n sum = 0;\r\n for (var j = 0; j < period; j++) {\r\n sum = sum + closevalues[j];\r\n\r\n }\r\n sum = sum / period;\r\n smavalues.push(sum);\r\n closevalues.splice(0, 1);\r\n close_length = closevalues.length;\r\n }\r\n\r\n\r\n //set the SMA values to Y-Axis\r\n for (var k = 0; k < length; k++) {\r\n if (k < period - 1) {\r\n indicator._points[k].YValues[0] = indicator._points[k].y = null;\r\n\r\n }\r\n else {\r\n indicator._points[k].YValues[0] = indicator._points[k].y = smavalues[k - (period - 1)];\r\n }\r\n\r\n }\r\n\r\n\r\n trendSeries.points = $.extend(true, [], indicator._points);\r\n var xValues = sender._getXValues(trendSeries.points);\r\n\r\n //Assign the Y-Axis values into trendPoints\r\n for (var i = period - 1, j = 0; i < trendSeries.points.length; i++ , j++) {\r\n trendPoints[j] = trendSeries.points[i].y;\r\n }\r\n\r\n //X-Axis and Y-Axis range calculation\r\n indicator.xRange.min = Math.min.apply(Math, xValues);\r\n indicator.xRange.max = Math.max.apply(Math, xValues);\r\n indicator.yRange.min = Math.min.apply(Math, trendPoints);\r\n indicator.yRange.max = Math.max.apply(Math, trendPoints);\r\n\r\n //push trendSeries\r\n indicator.segment.push(trendSeries);\r\n this.calculateIndicatorRange(sender, indicator);\r\n\r\n\r\n }\r\n\r\n });\r\n\r\n ej.indicatorTypes.sma = ej.ejSMA;\r\n\r\n ej.ejEMA = ejExtendClass(ej.EjIndicatorRender, {\r\n\r\n\r\n calculateSegment: function (indicator, sender) {\r\n this.chartObj = sender;\r\n indicator.segment = [];\r\n indicator.xRange = {};\r\n indicator.yRange = {};\r\n\r\n\r\n\r\n // signalLine\r\n\r\n var trendSeries = $.extend(true, {}, indicator);\r\n trendSeries.name = \"trendSeries\";\r\n trendSeries.type = \"line\";\r\n trendSeries.xAxis = indicator.xAxis;\r\n trendSeries.yAxis = indicator.yAxis;\r\n\r\n\r\n var getCloseValues = [];\r\n var ema = [];\r\n var pointsLength = indicator._points.length;\r\n var period = indicator.period;\r\n var sma = 0, xValues;\r\n if (pointsLength < period || period <= 0) return;\r\n // K=Smoothing Factor\r\n var k = (2 / (period + 1));\r\n\r\n //Get a close Values and push the previous Ema \r\n for (var i = 0; i < period; i++) {\r\n getCloseValues.push(indicator._points[i].close);\r\n sma = sma + getCloseValues[i];\r\n }\r\n ema.push(sma / period);\r\n\r\n //Find Remaining EMA by Adding smoothing factor K to the close values\r\n for (j = period; j < pointsLength; j++) {\r\n ema.push((indicator._points[j].close - ema[j - period]) * k + ema[j - period]);\r\n }\r\n\r\n // Set Ema to the Indicator Points\r\n\r\n for (var t = 0; t < pointsLength; t++) {\r\n if (t < (period - 1)) {\r\n indicator._points[t].YValues[0] = indicator._points[t].y = null;\r\n }\r\n else if (t >= (period - 1)) {\r\n indicator._points[t].YValues[0] = indicator._points[t].y = ema[t - (period - 1)];\r\n }\r\n }\r\n\r\n // Send the indicator Points for draw series.\r\n trendSeries.points = $.extend(true, [], indicator._points);\r\n xValues = sender._getXValues(trendSeries.points);\r\n var trendPoints = [];\r\n for (var i = period, j = 0; i < trendSeries.points.length; i++ , j++)\r\n trendPoints[j] = trendSeries.points[i].y;\r\n\r\n indicator.xRange.min = Math.min.apply(Math, xValues);\r\n indicator.xRange.max = Math.max.apply(Math, xValues);\r\n indicator.yRange.min = Math.min.apply(Math, trendPoints);\r\n indicator.yRange.max = Math.max.apply(Math, trendPoints);\r\n\r\n indicator.segment.push(trendSeries);\r\n this.calculateIndicatorRange(sender, indicator);\r\n\r\n\r\n }\r\n\r\n });\r\n\r\n ej.indicatorTypes.ema = ej.ejEMA;\r\n\r\n\r\n ej.ejSTOCHASTIC = ejExtendClass(ej.EjIndicatorRender, {\r\n\r\n calculateSegment: function (indicator, sender) {\r\n this.chartObj = sender;\r\n indicator.segment = [];\r\n indicator.xRange = {};\r\n indicator.yRange = {};\r\n var KPeriod = indicator.kPeriod;\r\n var DPeriod = indicator.dPeriod;\r\n var Period = indicator.period;\r\n if (Period < 1 || DPeriod < 1 || KPeriod < 1) return;\r\n if (Period > indicator._points.length || DPeriod > indicator._points.length || KPeriod > indicator._points.length) return;\r\n // Upper Line Calculation\r\n var upperSeries = $.extend(true, {}, indicator);\r\n upperSeries.name = \"upperseries\";\r\n upperSeries.type = \"line\";\r\n upperSeries.fill = indicator.upperLine.fill;\r\n upperSeries.width = indicator.upperLine.width;\r\n\r\n for (var k = 0; k < indicator._points.length; k++) {\r\n indicator._points[k].YValues.length = 1;\r\n indicator._points[k].YValues[0] = indicator._points[k].y = 80;\r\n }\r\n\r\n upperSeries.points = $.extend(true, [], indicator._points);\r\n var xValues = sender._getXValues(upperSeries.points);\r\n var yValues = sender._getYValues(upperSeries.points);\r\n\r\n indicator.xRange.min = Math.min.apply(Math, xValues);\r\n indicator.xRange.max = Math.max.apply(Math, xValues);\r\n indicator.yRange.min = Math.min.apply(Math, yValues);\r\n indicator.yRange.max = Math.max.apply(Math, yValues);\r\n\r\n indicator.segment.push(upperSeries);\r\n // End for Upper Line Calculation\r\n\r\n // Lower Line Calculation\r\n var lowerSeries = $.extend(true, {}, indicator);\r\n lowerSeries.name = \"lowerSeries\";\r\n lowerSeries.width = indicator.lowerLine.width;\r\n lowerSeries.fill = indicator.lowerLine.fill;\r\n lowerSeries.type = \"line\";\r\n\r\n\r\n for (var n = 0; n < indicator._points.length; n++) {\r\n indicator._points[n].YValues[0] = indicator._points[n].y = 20;\r\n }\r\n\r\n lowerSeries.points = $.extend(true, [], indicator._points);\r\n\r\n xValues = sender._getXValues(lowerSeries.points);\r\n yValues = sender._getYValues(lowerSeries.points);\r\n\r\n indicator.xRange.min = Math.min(Math.min.apply(Math, xValues), indicator.xRange.min);\r\n indicator.xRange.max = Math.max(Math.max.apply(Math, xValues), indicator.xRange.max);\r\n indicator.yRange.min = Math.min(Math.min.apply(Math, yValues), indicator.yRange.min);\r\n indicator.yRange.max = Math.max(Math.max.apply(Math, yValues), indicator.yRange.max);\r\n\r\n indicator.segment.push(lowerSeries);\r\n // End for Lower Line Calculation\r\n\r\n // Signal and Period Line Calculation\r\n\r\n var periodSeries = $.extend(true, {}, indicator);\r\n periodSeries.name = \"periodSeries\";\r\n periodSeries.width = indicator.periodLine.width;\r\n periodSeries.fill = indicator.periodLine.fill;\r\n periodSeries.type = \"line\";\r\n\r\n var HighValues = [];\r\n var LowValues = [];\r\n var CloseValues = [];\r\n var check = [];\r\n for (var i = 0; i < indicator._points.length; i++) {\r\n LowValues[i] = indicator._points[i].low;\r\n HighValues[i] = indicator._points[i].high;\r\n CloseValues[i] = indicator._points[i].close;\r\n }\r\n\r\n\r\n AddPoints(Period, KPeriod, indicator._points);\r\n check = indicator._points;\r\n SMA(Period, KPeriod, indicator._points);\r\n check = indicator._points;\r\n periodSeries.points = $.extend(true, [], indicator._points);\r\n\r\n xValues = sender._getXValues(periodSeries.points);\r\n yValues = sender._getYValues(periodSeries.points);\r\n\r\n indicator.xRange.min = Math.min(Math.min.apply(Math, xValues), indicator.xRange.min);\r\n indicator.xRange.max = Math.max(Math.max.apply(Math, xValues), indicator.xRange.max);\r\n indicator.yRange.min = Math.min(Math.min.apply(Math, yValues), indicator.yRange.min);\r\n indicator.yRange.max = Math.max(Math.max.apply(Math, yValues), indicator.yRange.max);\r\n\r\n indicator.segment.push(periodSeries);\r\n\r\n\r\n var trendSeries = $.extend(true, {}, indicator);\r\n trendSeries.name = \"trendSeries\";\r\n trendSeries.width = indicator.width;\r\n trendSeries.fill = indicator.fill;\r\n trendSeries.type = \"line\";\r\n\r\n SMA((Period + KPeriod - 1), DPeriod, indicator._points);\r\n trendSeries.points = $.extend(true, [], indicator._points);\r\n\r\n indicator.segment.push(trendSeries);\r\n\r\n ///SMA Calculation(Signal Line and Period Line)\r\n\r\n function SMA(Period1, Period2, series) {\r\n if (indicator._points.length >= Period1 + Period2) {\r\n SMACal(Period1, Period2, series);\r\n }\r\n }\r\n\r\n function SMACal(period1, period2, series) {\r\n var count = period1 + (period2 - 1);\r\n var temp = [];\r\n var values = [];\r\n var sum;\r\n for (var i = 0; i < indicator._points.length; i++) {\r\n var val = check[i].y;\r\n temp.push(val);\r\n }\r\n var length = temp.length;\r\n\r\n while (length >= count) {\r\n sum = 0;\r\n for (var j = period1 - 1; j < (period1 + period2 - 1); j++) {\r\n sum = sum + temp[j];\r\n\r\n }\r\n sum = sum / period2;\r\n values.push(sum.toFixed(2));\r\n temp.splice(0, 1);\r\n length = temp.length;\r\n }\r\n var len = count - 1;\r\n for (var k = 0; k < indicator._points.length; k++) {\r\n if (k < len) {\r\n series[k].YValues[0] = series[k].y = null;\r\n\r\n }\r\n else {\r\n series[k].YValues[0] = series[k].y = Number((values[k - len]));\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n // End for SMA Calculation\r\n\r\n // Period Line Calculation\r\n\r\n function AddPoints(Period1, Period2, series) {\r\n if (indicator._points.length > Period1) {\r\n ComputeStochastics(Period1, Period2, series);\r\n }\r\n }\r\n function ComputeStochastics(len1, len2, series) {\r\n var len = len1 + len2;\r\n var mins = [];\r\n var maxs = [];\r\n var max;\r\n var min;\r\n var top = 0;\r\n var bottom = 0;\r\n for (var i = 0; i < len1 - 1; ++i) {\r\n maxs.push(0);\r\n mins.push(0);\r\n }\r\n\r\n for (var i = len1 - 1; i < indicator._points.length; ++i) {\r\n min = Number.MAX_VALUE;\r\n max = Number.MIN_VALUE;\r\n for (var j = 0; j < len1; ++j) {\r\n min = Math.min(min, LowValues[i - j]);\r\n max = Math.max(max, HighValues[i - j]);\r\n }\r\n maxs.push(max);\r\n mins.push(min);\r\n }\r\n\r\n for (var i = 0; i < len - 1; ++i) {\r\n series[i].YValues.length = 1;\r\n series[i].YValues[0] = series[i].y = null;\r\n }\r\n\r\n for (var i = len1 - 1; i < indicator._points.length; ++i) {\r\n top = 0;\r\n bottom = 0;\r\n top += CloseValues[i] - mins[i];\r\n bottom += maxs[i] - mins[i];\r\n series[i].YValues.length = 1;\r\n series[i].YValues[0] = series[i].y = (((top / bottom) * 100));\r\n }\r\n }\r\n\r\n // End for Period Line Calculation\r\n\r\n // Indicator Axis Range Calculation\r\n this.calculateIndicatorRange(sender, indicator);\r\n }\r\n\r\n\r\n });\r\n ej.indicatorTypes.stochastic = ej.ejSTOCHASTIC;\r\n ej.ejbollingerBand = ejExtendClass(ej.EjIndicatorRender, {\r\n calculateSegment: function (indicator, sender) {\r\n this.chartObj = sender;\r\n indicator.segment = [];\r\n indicator.xRange = {};\r\n indicator.yRange = {};\r\n var sum = 0.0;\r\n var deviationSum = 0.0;\r\n var limit = indicator._points.length;\r\n var multiplier = indicator.standardDeviations;\r\n var movingavg = indicator.period;\r\n var length = Math.round(movingavg);\r\n var smaPoints = [];\r\n var deviations = [];\r\n var bbiPoints = [];\r\n //Calculating simple moving average\r\n if ((length < limit) && (length > 0)) {\r\n for (var i = 0; i < length; i++) {\r\n sum += indicator._points[i].close;\r\n\r\n }\r\n var sma = sum / movingavg;\r\n //Calculating smapoints using iteration\r\n for (var i = 0; i < limit; ++i) {\r\n if (i >= length - 1 && i < limit) {\r\n if (i - movingavg >= 0) {\r\n var diff = indicator._points[i].close - indicator._points[i - length].close;\r\n\r\n sum = sum + diff;\r\n sma = sum / (movingavg);\r\n smaPoints[i] = sma;\r\n deviations[i] = Math.pow(indicator._points[i].close - sma, 2);\r\n deviationSum += deviations[i] - deviations[i - length];\r\n\r\n\r\n }\r\n else {\r\n\r\n smaPoints[i] = sma;\r\n deviations[i] = Math.pow(indicator._points[i].close - sma, 2);\r\n deviationSum += deviations[i];\r\n }\r\n\r\n\r\n //calculation for standarddeviation for each period\r\n\r\n var range = Math.sqrt(deviationSum / (movingavg));\r\n\r\n //lower Band points for bollinger band\r\n var lb = smaPoints[i] - (multiplier * range);\r\n //upper Band points for bollinger band\r\n var ub = smaPoints[i] + (multiplier * range);\r\n //Binding the lowerband,upperband and middleband values to bollingerband array if the i value equal to period\r\n if (i + 1 == length) {\r\n for (var j = 0; j < length - 1; j++)\r\n bbiPoints[j] = { \"X\": indicator._points[j].X, \"mb\": smaPoints[i], \"lb\": lb, \"ub\": ub, visible: true };\r\n\r\n\r\n\r\n }\r\n //binding the lb,ub,mb values to bollinger band array if i greather than period value.\r\n bbiPoints[i] = { \"X\": indicator._points[i].X, \"mb\": smaPoints[i], \"lb\": lb, \"ub\": ub, visible: true };\r\n\r\n\r\n }\r\n\r\n\r\n else {\r\n if (i < movingavg - 1) {\r\n\r\n smaPoints[i] = sma;\r\n deviations[i] = Math.pow(indicator._points[i].close - sma, 2);\r\n deviationSum += deviations[i];\r\n }\r\n\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n var upperSeries = $.extend(true, {}, indicator);\r\n upperSeries.name = \"upperseries\";\r\n upperSeries.fill = indicator.upperLine.fill;\r\n upperSeries.width = indicator.upperLine.width;\r\n upperSeries.type = \"line\";\r\n\r\n //binding bollingerband array values to upper series and assigning null values \r\n for (var k = 0; k < indicator._points.length; k++) {\r\n if (k >= (length - 1)) {\r\n indicator._points[k].YValues.length = 1;\r\n indicator._points[k].YValues[0] = indicator._points[k].y = bbiPoints[k].ub;\r\n }\r\n else {\r\n indicator._points[k].YValues[0] = indicator._points[k].y = null;\r\n }\r\n }\r\n\r\n upperSeries.points = $.extend(true, [], indicator._points);\r\n var xValues = sender._getXValues(upperSeries.points);\r\n var values = [];\r\n //storing the y values from the period value\r\n for (var i = length; i < upperSeries.points.length; i++)\r\n values.push(upperSeries.points[i].y);\r\n var yValues = values;\r\n indicator.xRange.min = Math.min.apply(Math, xValues);\r\n indicator.xRange.max = Math.max.apply(Math, xValues);\r\n indicator.yRange.min = Math.min.apply(Math, yValues);\r\n indicator.yRange.max = Math.max.apply(Math, yValues);\r\n\r\n indicator.segment.push(upperSeries);\r\n\r\n\r\n var lowerSeries = $.extend(true, {}, indicator);\r\n lowerSeries.name = \"lowerSeries\";\r\n lowerSeries.width = indicator.lowerLine.width;\r\n lowerSeries.fill = indicator.lowerLine.fill;\r\n lowerSeries.type = \"line\";\r\n\r\n\r\n for (var n = 0; n < indicator._points.length; n++) {\r\n if (n >= (length - 1)) {\r\n indicator._points[n].YValues.length = 1;\r\n indicator._points[n].YValues[0] = indicator._points[n].y = bbiPoints[n].lb;\r\n }\r\n else {\r\n indicator._points[n].YValues[0] = indicator._points[n].y = null;\r\n }\r\n }\r\n\r\n\r\n lowerSeries.points = $.extend(true, [], indicator._points);\r\n\r\n xValues = sender._getXValues(lowerSeries.points);\r\n\r\n var lowvalues = [];\r\n for (var i = length; i < lowerSeries.points.length; i++)\r\n lowvalues.push(lowerSeries.points[i].y);\r\n var yValues = lowvalues;\r\n\r\n indicator.xRange.min = Math.min(Math.min.apply(Math, xValues), indicator.xRange.min);\r\n indicator.xRange.max = Math.max(Math.max.apply(Math, xValues), indicator.xRange.max);\r\n indicator.yRange.min = Math.min(Math.min.apply(Math, yValues), indicator.yRange.min);\r\n indicator.yRange.max = Math.max(Math.max.apply(Math, yValues), indicator.yRange.max);\r\n\r\n indicator.segment.push(lowerSeries);\r\n\r\n\r\n\r\n var trendSeries = $.extend(true, {}, indicator);\r\n trendSeries.name = \"trendSeries\";\r\n trendSeries.width = indicator.width;\r\n trendSeries.fill = indicator.fill;\r\n trendSeries.type = \"line\";\r\n\r\n for (var m = 0; m < indicator._points.length; m++) {\r\n if (m >= (length - 1)) {\r\n indicator._points[m].YValues.length = 1;\r\n indicator._points[m].YValues[0] = indicator._points[m].y = bbiPoints[m].mb;\r\n }\r\n else {\r\n indicator._points[m].YValues[0] = indicator._points[m].y = null;\r\n }\r\n }\r\n trendSeries.points = $.extend(true, [], indicator._points);\r\n xValues = sender._getXValues(trendSeries.points);\r\n var trendvalues = [];\r\n for (var i = length; i < trendSeries.points.length; i++)\r\n trendvalues.push(trendSeries.points[i].y);\r\n var yValues = trendvalues;\r\n\r\n indicator.xRange.min = Math.min(Math.min.apply(Math, xValues), indicator.xRange.min);\r\n indicator.xRange.max = Math.max(Math.max.apply(Math, xValues), indicator.xRange.max);\r\n indicator.yRange.min = Math.min(Math.min.apply(Math, yValues), indicator.yRange.min);\r\n indicator.yRange.max = Math.max(Math.max.apply(Math, yValues), indicator.yRange.max);\r\n indicator.segment.push(trendSeries);\r\n //calculating indicator range\r\n this.calculateIndicatorRange(sender, indicator);\r\n }\r\n }\r\n\r\n });\r\n ej.indicatorTypes.bollingerband = ej.ejbollingerBand;\r\n ej.ejATR = ejExtendClass(ej.EjIndicatorRender, {\r\n calculateSegment: function (indicator, sender) {\r\n //calculation for atr\r\n this.chartObj = sender;\r\n indicator.segment = [];\r\n indicator.xRange = {};\r\n indicator.yRange = {};\r\n var atrPoints = [];\r\n var high_Low, high_ClosePrevious, low_ClosePrevious;\r\n high_Low = high_ClosePrevious = low_ClosePrevious = 0.0;\r\n var trueRange;\r\n var sumTruRange = 0.0;\r\n var firstFlag = false;\r\n var atr;\r\n var period = indicator.period;\r\n if ((period <= 0) || (period > indicator._points.length))\r\n return;\r\n for (var i = 0; i < period; i++) {\r\n\r\n high_Low = indicator._points[i].high - indicator._points[i].low;\r\n if (i > 0) {\r\n high_ClosePrevious = Math.abs(indicator._points[i].high - indicator._points[i - 1].close);\r\n low_ClosePrevious = Math.abs(indicator._points[i].low - indicator._points[i - 1].close);\r\n }\r\n\r\n trueRange = Math.max(high_Low, high_ClosePrevious, low_ClosePrevious);\r\n\r\n sumTruRange += trueRange;\r\n atr = (sumTruRange / period);\r\n\r\n atrPoints[i] = { \"X\": indicator._points[i].X, \"YValues\": atr };\r\n\r\n }\r\n\r\n for (var i = period; i < indicator._points.length; ++i) {\r\n high_Low = indicator._points[i].high - indicator._points[i].low;\r\n high_ClosePrevious = Math.abs(indicator._points[i].high - indicator._points[i - 1].close);\r\n low_ClosePrevious = Math.abs(indicator._points[i].low - indicator._points[i - 1].close);\r\n trueRange = Math.max(high_Low, high_ClosePrevious, low_ClosePrevious);\r\n\r\n atr = (atrPoints[i - 1].YValues * (period - 1) + trueRange) / period;\r\n\r\n atrPoints[i] = {\r\n \"X\": indicator._points[i].X, \"YValues\": atr\r\n };\r\n\r\n }\r\n\r\n\r\n\r\n var trendSeries = $.extend(true, {}, indicator);\r\n\r\n\r\n trendSeries.name = \"trendSeries\";\r\n trendSeries.width = indicator.width;\r\n trendSeries.fill = indicator.fill;\r\n trendSeries.type = \"line\";\r\n\r\n\r\n\r\n for (var k = 0; k < indicator._points.length; k++) {\r\n if (k >= (period - 1)) {\r\n indicator._points[k].YValues.length = 1;\r\n indicator._points[k].YValues[0] = indicator._points[k].y = atrPoints[k].YValues;\r\n }\r\n else {\r\n indicator._points[k].YValues[0] = indicator._points[k].y = null;\r\n }\r\n }\r\n\r\n\r\n\r\n trendSeries.points = $.extend(true, [], indicator._points);\r\n\r\n var xValues = sender._getXValues(trendSeries.points);\r\n\r\n var values = [];\r\n for (var i = period; i < trendSeries.points.length; i++)\r\n values.push(trendSeries.points[i].y);\r\n\r\n indicator.xRange.min = Math.min.apply(Math, xValues);\r\n indicator.xRange.max = Math.max.apply(Math, xValues);\r\n indicator.yRange.min = Math.min.apply(Math, values);\r\n indicator.yRange.max = Math.max.apply(Math, values);\r\n\r\n indicator.segment.push(trendSeries);\r\n\r\n\r\n this.calculateIndicatorRange(sender, indicator);\r\n\r\n\r\n\r\n }\r\n\r\n });\r\n ej.indicatorTypes.atr = ej.ejATR;\r\n\r\n ej.ejaccumulationDistribution = ejExtendClass(ej.EjIndicatorRender, {\r\n calculateSegment: function (indicator, sender) {\r\n this.chartObj = sender;\r\n indicator.segment = [];\r\n indicator.xRange = {};\r\n indicator.yRange = {};\r\n var adlPoints = [];\r\n var sum = 0;\r\n //calculating accumulation distribution line points \r\n for (var i = 0; i < indicator._points.length; i++) {\r\n var close = indicator._points[i].close;\r\n\r\n var value = (((close - indicator._points[i].low) - (indicator._points[i].high - close)) / (indicator._points[i].high - indicator._points[i].low));\r\n sum += (isNaN(value) ? 0 : value) * indicator._points[i].volume;\r\n adlPoints[i] = sum;\r\n\r\n }\r\n var trendSeries = $.extend(true, {}, indicator);\r\n trendSeries.name = \"trendseries\";\r\n trendSeries.fill = indicator.fill;\r\n trendSeries.width = indicator.width;\r\n trendSeries.type = \"line\";\r\n\r\n //Binding the accumulation distribution array values to indicator y values\r\n for (var k = 0; k < indicator._points.length; k++) {\r\n\r\n indicator._points[k].YValues[0] = indicator._points[k].y = adlPoints[k];\r\n }\r\n\r\n trendSeries.points = $.extend(true, [], indicator._points);\r\n var xValues = sender._getXValues(trendSeries.points);\r\n var yValues = sender._getYValues(trendSeries.points);\r\n\r\n indicator.xRange.min = Math.min.apply(Math, xValues);\r\n indicator.xRange.max = Math.max.apply(Math, xValues);\r\n indicator.yRange.min = Math.min.apply(Math, yValues);\r\n indicator.yRange.max = Math.max.apply(Math, yValues);\r\n\r\n indicator.segment.push(trendSeries);\r\n //calculating indicator range\r\n this.calculateIndicatorRange(sender, indicator);\r\n\r\n\r\n }\r\n\r\n });\r\n ej.indicatorTypes.accumulationdistribution = ej.ejaccumulationDistribution;\r\n ej.ejTMA = ejExtendClass(ej.EjIndicatorRender, {\r\n calculateSegment: function (indicator, sender) {\r\n this.chartObj = sender;\r\n indicator.segment = [];\r\n indicator.xRange = {};\r\n indicator.yRange = {};\r\n\r\n // signalLine\r\n var trendSeries = $.extend(true, {}, indicator);\r\n trendSeries.name = \"trendSeries\";\r\n trendSeries.width = indicator.width;\r\n trendSeries.fill = indicator.fill;\r\n trendSeries.type = \"line\";\r\n\r\n //variable declaration\r\n var closevalues = [];\r\n var close_values = [];\r\n var smavalues = [];\r\n var tmavalues = [];\r\n var smaPoints = [];\r\n var trendPoints = [];\r\n var sum = 0;\r\n var sum1;\r\n var length = indicator._points.length;\r\n var period = indicator.period;\r\n if (period < 1) return;\r\n\r\n if (period < length) {\r\n //Push the values to closevalues array\r\n for (var i = 0; i < length; i++) {\r\n closevalues.push(indicator._points[i].close);\r\n }\r\n //find the closevalues length\r\n var close_length = closevalues.length;\r\n\r\n //calculation for SMA values\r\n\r\n while (close_length >= period) {\r\n sum = 0;\r\n for (var j = 0; j < period; j++) {\r\n sum = sum + closevalues[j];\r\n\r\n }\r\n sum = sum / period;\r\n smavalues.push(parseFloat(sum.toFixed(2)));\r\n closevalues.splice(0, 1);\r\n close_length = closevalues.length;\r\n }\r\n //calculating sma values depend on period\r\n for (var k = 0; k < length; k++) {\r\n if (k < period - 1) {\r\n sum = 0;\r\n for (var j = 0; j < k + 1; j++) {\r\n sum = sum + indicator._points[j].close;\r\n\r\n }\r\n sum = sum / (k + 1);\r\n smaPoints[k] = parseFloat(sum.toFixed(2));\r\n }\r\n else {\r\n smaPoints[k] = smavalues[k - (period - 1)];\r\n }\r\n\r\n }\r\n //find the smavalues count\r\n var sma_count = smaPoints.length;\r\n //calculating TMA values\r\n while (sma_count >= period) {\r\n sum1 = 0;\r\n for (var j = 0; j < period; j++) {\r\n sum1 = sum1 + smaPoints[j];\r\n\r\n }\r\n sum1 = sum1 / period;\r\n tmavalues.push(sum1);\r\n smaPoints.splice(0, 1);\r\n sma_count = smaPoints.length;\r\n }\r\n //set the TMA values to Y-Axis\r\n for (var k = 0; k < length; k++) {\r\n if (k < period - 1) {\r\n indicator._points[k].YValues[0] = indicator._points[k].y = null;\r\n\r\n }\r\n else {\r\n indicator._points[k].YValues[0] = indicator._points[k].y = tmavalues[k - (period - 1)];\r\n\r\n }\r\n\r\n }\r\n trendSeries.points = $.extend(true, [], indicator._points);\r\n var xValues = sender._getXValues(trendSeries.points);\r\n\r\n //Assign the Y-Axis values into trendPoints\r\n for (var i = period - 1, j = 0; i < trendSeries.points.length; i++ , j++) {\r\n trendPoints[j] = trendSeries.points[i].y;\r\n }\r\n\r\n //X-Axis and Y-Axis range calculation\r\n indicator.xRange.min = Math.min.apply(Math, xValues);\r\n indicator.xRange.max = Math.max.apply(Math, xValues);\r\n indicator.yRange.min = Math.min.apply(Math, trendPoints);\r\n indicator.yRange.max = Math.max.apply(Math, trendPoints);\r\n\r\n //push trendSeries\r\n indicator.segment.push(trendSeries);\r\n this.calculateIndicatorRange(sender, indicator);\r\n\r\n\r\n }\r\n }\r\n });\r\n ej.indicatorTypes.tma = ej.ejTMA;\r\n\r\n ej.ejMomentum = ejExtendClass(ej.EjIndicatorRender, {\r\n calculateSegment: function (indicator, sender) {\r\n this.chartObj = sender;\r\n indicator.segment = [];\r\n indicator.xRange = {};\r\n indicator.yRange = {};\r\n\r\n //Upperband \r\n var upperSeries = $.extend(true, {}, indicator);\r\n upperSeries.name = \"upperseries\";\r\n upperSeries.fill = indicator.upperLine.fill;\r\n upperSeries.width = indicator.upperLine.width;\r\n upperSeries.type = \"line\";\r\n\r\n var period = indicator.period;\r\n var pointsLength = indicator._points.length;\r\n\r\n if (period > 0 && period < pointsLength - 1) { // to check period value is greater than 0 and it is less than pointslength\r\n for (var k = 0; k < pointsLength; k++) {\r\n indicator._points[k].YValues.length = 1;\r\n indicator._points[k].YValues[0] = indicator._points[k].y = 100;\r\n }\r\n\r\n upperSeries.points = $.extend(true, [], indicator._points);\r\n var xValues = sender._getXValues(upperSeries.points);\r\n var yValues = sender._getYValues(upperSeries.points);\r\n\r\n indicator.xRange.min = Math.min.apply(Math, xValues);\r\n indicator.xRange.max = Math.max.apply(Math, xValues);\r\n indicator.yRange.min = Math.min.apply(Math, yValues);\r\n indicator.yRange.max = Math.max.apply(Math, yValues);\r\n\r\n indicator.segment.push(upperSeries);\r\n\r\n // signalLine\r\n var trendSeries = $.extend(true, {}, indicator);\r\n trendSeries.name = \"trendSeries\";\r\n trendSeries.width = indicator.width;\r\n trendSeries.fill = indicator.fill;\r\n trendSeries.type = \"line\";\r\n\r\n var c = [];\r\n var len = indicator.period; // period value\r\n\r\n for (var i = 0; i < indicator._points.length; ++i) {\r\n var points = indicator._points;\r\n if (!(i < len)) // calculate signal line points\r\n indicator._points[i].YValues[0] = indicator._points[i].y = (points[i].close / (points[i - len].close) * 100);\r\n }\r\n\r\n for (var k = 0; k < len && k < indicator._points.length; k++) {\r\n indicator._points[k].YValues[0] = indicator._points[k].y = null;\r\n }\r\n\r\n trendSeries.points = $.extend(true, [], indicator._points);\r\n xValues = sender._getXValues(trendSeries.points);\r\n var trendPoints = [];\r\n for (var i = len, j = 0; i < trendSeries.points.length; i++ , j++) {\r\n trendPoints[j] = trendSeries.points[i].y;\r\n }\r\n\r\n indicator.xRange.min = Math.min(Math.min.apply(Math, xValues), indicator.xRange.min);\r\n indicator.xRange.max = Math.max(Math.max.apply(Math, xValues), indicator.xRange.max);\r\n indicator.yRange.min = Math.min(Math.min.apply(Math, trendPoints), indicator.yRange.min);\r\n indicator.yRange.max = Math.max(Math.max.apply(Math, trendPoints), indicator.yRange.max);\r\n\r\n indicator.segment.push(trendSeries);\r\n this.calculateIndicatorRange(sender, indicator);\r\n }\r\n }\r\n });\r\n\r\n ej.indicatorTypes.momentum = ej.ejMomentum;\r\n\r\n ej.EjSeriesRender.prototype = {\r\n\r\n getOrigin: function (chart, options, params) {\r\n if (params.axes[options.xAxis.name]._validCross) {\r\n var crossAxis = chart.chartObj._getCrossAxis(chart.chartObj.model._axes, true, options.xAxis.crossesInAxis);\r\n if ((chart.chartObj.model.requireInvertedAxes ? options.xAxis.name : options.yAxis.name === crossAxis.name))\r\n return options.xAxis._crossValue;\r\n }\r\n return Math.max(options.yAxis.visibleRange.min, 0);\r\n },\r\n\r\n setLineSeriesStyle: function (currentSeries) {\r\n\r\n var seriesIndex = $.inArray(currentSeries, this.chartObj.model._visibleSeries);\r\n var serColor = this.chartObj.model.seriesColors[seriesIndex], seriesInterior;\r\n\r\n if (!currentSeries.isTransposed)\r\n seriesInterior = this.chartObj.svgRenderer.createGradientElement(this.getSeriesName(currentSeries) + seriesIndex, serColor, 0, 0, 0, 100, this.chartObj.gSeriesEle);\r\n else\r\n seriesInterior = this.chartObj.svgRenderer.createGradientElement(this.getSeriesName(currentSeries) + seriesIndex, serColor, 100, 0, 0, 0, this.chartObj.gSeriesEle);\r\n var seriesBorder = this.chartObj.model.seriesBorderColors[seriesIndex];\r\n return { SeriesInterior: seriesInterior, SeriesBorder: seriesBorder };\r\n\r\n },\r\n getSeriesName: function (series) {\r\n var serName;\r\n if (series.name)\r\n serName = series.name.replace(/\\s/g, '');\r\n else\r\n serName = \"series\";\r\n\r\n return serName;\r\n },\r\n\r\n drawAreaPath: function (series, style, direction, canvasTranslate) {\r\n var requireInvertedAxes = this.chartObj.model.requireInvertedAxes,\r\n seriesIndex = $.inArray(series, this.chartObj.model._visibleSeries),\r\n translate = null, areaType = this.chartObj.model.AreaType, seriesBorder = series.border;\r\n if (areaType == \"cartesianaxes\") {\r\n var trans = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, requireInvertedAxes);\r\n translate = 'translate(' + trans.x + ',' + trans.y + ')'\r\n }\r\n var serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': translate };\r\n\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n if (direction != \"\") {\r\n var options = {\r\n 'id': this.chartObj.svgObject.id + \"_Series\" + seriesIndex,\r\n 'fill': style.SeriesInterior,\r\n 'fill-opacity': series.opacity,\r\n 'stroke-width': seriesBorder.width,\r\n 'stroke': seriesBorder.color,\r\n 'stroke-dasharray': seriesBorder.dashArray,\r\n 'stroke-linecap': series.lineCap,\r\n 'stroke-linejoin': series.lineJoin,\r\n 'd': direction\r\n };\r\n if (this.chartObj.dragPoint) {\r\n options.id = this.chartObj.svgObject.id + \"_PreviewSeries\" + seriesIndex;\r\n options['fill-opacity'] = 0.6;\r\n if (this.chartObj.model.enableCanvasRendering) this.chartObj.svgRenderer.drawPath(options, this.chartObj.canvasElement, canvasTranslate);\r\n else this.chartObj.svgRenderer.drawPath(options, this.chartObj.gPreviewSeriesGroupEle, canvasTranslate);\r\n }\r\n else\r\n this.chartObj.svgRenderer.drawPath(options, this.gSeriesGroupEle, canvasTranslate);\r\n }\r\n },\r\n\r\n setAreaSeriesStyle: function (series) {\r\n\r\n var seriesIndex = $.inArray(series, this.chartObj.model._visibleSeries);\r\n var serColor = this.chartObj.model.seriesColors[seriesIndex], seriesInterior;\r\n\r\n if (!series.isTransposed)\r\n seriesInterior = this.chartObj.svgRenderer.createGradientElement(this.getSeriesName(series) + seriesIndex, serColor, 0, 0, 0, 100, this.chartObj.gSeriesEle);\r\n else\r\n seriesInterior = this.chartObj.svgRenderer.createGradientElement(this.getSeriesName(series) + seriesIndex, serColor, 100, 0, 0, 0, this.chartObj.gSeriesEle);\r\n return { SeriesInterior: seriesInterior };\r\n\r\n },\r\n\r\n\r\n\r\n\r\n\r\n naturalSpline: function (points, series) {\r\n var count = points.length, dx = [], dy = [], slope = [];\r\n var ySpline = [], ySplineDuplicate = [];\r\n var cardinalSplineTension = ej.util.isNullOrUndefined(series.cardinalSplineTension) ? 0.5 : series.cardinalSplineTension < 0 ? 0 : series.cardinalSplineTension > 1 ? 1 : series.cardinalSplineTension;\r\n if (series.splineType == \"monotonic\") {\r\n for (var i = 0; i < count - 1; i++) {\r\n //slope calculation \r\n dx[i] = points[i + 1].xValue - points[i].xValue;\r\n dy[i] = points[i + 1].YValues[0] - points[i].YValues[0];\r\n slope[i] = dy[i] / dx[i];\r\n }\r\n //interpolant points\r\n var slopeLength = slope.length, interPoint;\r\n // to find the first and last co-efficient value\r\n ySpline[0] = slope[0];\r\n ySpline[count - 1] = slope[slopeLength - 1];\r\n\r\n //to find the other co-efficient values\r\n for (var j = 0; j < dx.length; j++) {\r\n if (slopeLength > j + 1) {\r\n if (slope[j] * slope[j + 1] <= 0)\r\n ySpline[j + 1] = 0;\r\n else {\r\n interPoint = dx[j] + dx[j + 1];\r\n ySpline[j + 1] = 3 * interPoint / ((interPoint + dx[j + 1]) / slope[j] + (interPoint + dx[j]) / slope[j + 1]);\r\n }\r\n\r\n }\r\n }\r\n }\r\n else if (series.splineType == \"cardinal\") {\r\n for (var i = 0; i < count; i++) {\r\n if (i == 0)\r\n ySpline[i] = (count > 2) ? (cardinalSplineTension * (points[i + 2].xValue - points[i].xValue)) : 0;\r\n else if (i == (count - 1))\r\n ySpline[i] = (count > 2) ? (cardinalSplineTension * (points[count - 1].xValue - points[count - 3].xValue)) : 0;\r\n else\r\n ySpline[i] = (cardinalSplineTension * (points[i + 1].xValue - points[i - 1].xValue));\r\n }\r\n\r\n\r\n }\r\n else {\r\n var yIndex = 0, a = 6;\r\n if (series.splineType == \"clamped\") {\r\n // calculating the first and last index value for clamped spline series type\t\t\t\t\t\r\n var firstIndex = (points[1].xValue - points[0].xValue) / (points[1].YValues[yIndex] - points[0].YValues[yIndex]);\r\n var lastIndex = (points[count - 1].xValue - points[count - 2].xValue) / (points[count - 1].YValues[yIndex] - points[count - 2].YValues[yIndex]);\r\n ySpline[0] = (3 * (points[1].YValues[yIndex] - points[0].YValues[yIndex])) / (points[1].xValue - points[0].xValue) - 3 * firstIndex;\r\n ySplineDuplicate[0] = 0.5;\r\n ySpline[points.length - 1] = 3 * lastIndex - (3 * (points[points.length - 1].YValues[yIndex] - points[points.length - 2].YValues[yIndex])) / (points[points.length - 1].xValue - points[points.length - 2].xValue);\r\n ySpline[0] = Math.abs(ySpline[0]) == \"Infinity\" ? 0 : ySpline[0];\r\n ySpline[points.length - 1] = Math.abs(ySpline[points.length - 1]) == \"Infinity\" ? 0 : ySpline[points.length - 1];\r\n }\r\n else {\r\n // assigning the first and last value as zero\r\n ySpline[0] = ySplineDuplicate[0] = 0;\r\n ySpline[points.length - 1] = 0;\r\n }\r\n\r\n for (var i = 1; i < count - 1; i++) {\r\n var d1 = points[i].xValue - points[i - 1].xValue;\r\n var d2 = points[i + 1].xValue - points[i - 1].xValue;\r\n var d3 = points[i + 1].xValue - points[i].xValue;\r\n var dy1 = points[i + 1].YValues[yIndex] - points[i].YValues[yIndex] || null;\r\n var dy2 = points[i].YValues[yIndex] - points[i - 1].YValues[yIndex] || null;\r\n\r\n if (d1 == 0 || d2 == 0 || d3 == 0) {\r\n ySpline[i] = 0;\r\n ySplineDuplicate[i] = 0;\r\n }\r\n else {\r\n var p = 1 / (d1 * ySpline[i - 1] + 2 * d2);\r\n\r\n ySpline[i] = -p * d3;\r\n ySplineDuplicate[i] = p * (a * (dy1 / d3 - dy2 / d1) - d1 * ySplineDuplicate[i - 1]);\r\n }\r\n }\r\n\r\n for (var k = count - 2; k >= 0; k--)\r\n ySpline[k] = ySpline[k] * ySpline[k + 1] + ySplineDuplicate[k];\r\n\r\n }\r\n return ySpline;\r\n\r\n },\r\n\r\n getDaysInMonth: function (month, year) {\r\n return new Date(year, month + 1, 0).getDate();\r\n },\r\n\r\n getBezierControlPoints: function (point1, point2, ySpline1, ySpline2, yIndex, series, chart) {\r\n var controlPoint1;\r\n var controlPoint2;\r\n var yDuplicate1, yDuplicate2;\r\n var oneDay = 24 * 60 * 60 * 1000;\r\n var xPoint = new Date(point1.xValue);\r\n var haxesCount = chart.chartObj.model.hAxes.length;\r\n var seriesIndex = $.inArray(series, chart.chartObj.model._visibleSeries);\r\n var j = (seriesIndex != haxesCount && seriesIndex < haxesCount) ? seriesIndex : 0;\r\n if (series.splineType == \"cardinal\") {\r\n if (ej.util.isNullOrUndefined(chart.chartObj.model.hAxes[j].intervalType) || chart.chartObj.model.hAxes[j].intervalType.toLowerCase() == \"years\" || chart.chartObj.model.hAxes[j].intervalType.toLowerCase() == \"auto\") {\r\n\r\n var year = new Date(xPoint.getFullYear());\r\n var yearValue = (year % 4 == 0 && (year % 100 == 0 || year % 400 != 0)) ? 366 : 365;\r\n yDuplicate1 = (ySpline1 / (oneDay * yearValue));\r\n yDuplicate2 = (ySpline2 / (oneDay * yearValue));\r\n\r\n }\r\n else if (chart.chartObj.model.hAxes[j].intervalType.toLowerCase() == \"months\") {\r\n var dateObj = new Date(xPoint);\r\n var year = dateObj.getFullYear();\r\n var month = dateObj.getMonth();\r\n var CountDays = ej.EjSeriesRender.prototype.getDaysInMonth(month, year);\r\n yDuplicate1 = (ySpline1 / (oneDay * CountDays));\r\n yDuplicate2 = (ySpline2 / (oneDay * CountDays));\r\n }\r\n else {\r\n yDuplicate1 = ySpline1;\r\n yDuplicate2 = ySpline2;\r\n }\r\n\r\n controlPoint1 = { xValue: (point1.xValue + ySpline1 / 3), YValues: [point1.YValues[0] + yDuplicate1 / 3] };\r\n controlPoint2 = { xValue: (point2.xValue - ySpline2 / 3), YValues: [point2.YValues[0] - yDuplicate2 / 3] };\r\n }\r\n else if (series.splineType == \"monotonic\") {\r\n var value = (point2.xValue - point1.xValue) / 3;\r\n controlPoint1 = { xValue: point1.xValue + value, YValues: [point1.YValues[0] + ySpline1 * value] };\r\n controlPoint2 = { xValue: point2.xValue - value, YValues: [point2.YValues[0] - ySpline2 * value] };\r\n }\r\n else {\r\n var one3 = 1 / 3.0;\r\n var deltaX2 = (point2.xValue - point1.xValue);\r\n\r\n deltaX2 = deltaX2 * deltaX2;\r\n\r\n var dx1 = 2 * parseFloat(point1.xValue) + parseFloat(point2.xValue);\r\n var dx2 = parseFloat(point1.xValue) + 2 * parseFloat(point2.xValue);\r\n\r\n var dy1 = 2 * point1.YValues[yIndex] + point2.YValues[yIndex];\r\n var dy2 = point1.YValues[yIndex] + 2 * point2.YValues[yIndex];\r\n\r\n var y1 = one3 * (dy1 - one3 * deltaX2 * (ySpline1 + 0.5 * ySpline2));\r\n var y2 = one3 * (dy2 - one3 * deltaX2 * (0.5 * ySpline1 + ySpline2));\r\n\r\n controlPoint1 = { xValue: dx1 * one3, YValues: [y1] };\r\n controlPoint2 = { xValue: dx2 * one3, YValues: [y2] };\r\n }\r\n return { controlPoint1: controlPoint1, controlPoint2: controlPoint2 };\r\n\r\n\r\n },\r\n\r\n improveChartPerformance: function (chartSeries) {\r\n var tempPoints = [],\r\n seriesPoints = chartSeries.pointCollection && chartSeries.dragPoint ? chartSeries.pointCollection : chartSeries.points,\r\n AreaBounds = this.chartObj.model.m_AreaBounds,\r\n emptyPoints,\r\n emptyPointsCount = 0,\r\n xTolerance = chartSeries.xAxis.visibleRange.delta / AreaBounds.Width,\r\n yTolerance = chartSeries.yAxis.visibleRange.delta / AreaBounds.Height,\r\n prevXValue = (seriesPoints[0] && seriesPoints[0].xValue > xTolerance) ? 0 : xTolerance,\r\n prevYValue = (seriesPoints[0] && seriesPoints[0].y > yTolerance) ? 0 : yTolerance,\r\n xVal = 0, yVal = 0, isEmpty, point, xDiff, yDiff,\r\n currentPointsLenght = seriesPoints.length,\r\n markerCount = 0, dataLabelCount = 0, sorted = true,\r\n count = 0, minPoint = currentPointsLenght > 0 && seriesPoints[0].xValue;\r\n\r\n for (var k = 0; k < currentPointsLenght; k++) {\r\n point = seriesPoints[k];\r\n xVal = point.xValue;\r\n yVal = point.YValues[0];\r\n (point.fill) && (chartSeries.pointFill = true);\r\n if (sorted && xVal != minPoint) {\r\n sorted = minPoint < xVal;\r\n minPoint = xVal;\r\n }\r\n (point.isEmpty || xVal == null || yVal == null || xVal !== xVal || yVal !== yVal || isNaN(xVal) || isNaN(yVal)) && (point.isEmpty = true);\r\n (xVal == null) && (point.xValue = chartSeries.xAxis.visibleRange.min);\r\n (yVal == null) && (point.YValues[0] = chartSeries.yAxis.visibleRange.min);\r\n (point.marker && point.marker.visible) && (markerCount++);\r\n (point.marker && point.marker.dataLabel && point.marker.dataLabel.visible) && (dataLabelCount++);\r\n point.isEmpty && emptyPointsCount++;\r\n xDiff = xVal - prevXValue;\r\n yDiff = yVal - prevYValue;\r\n if ((xDiff >= xTolerance || -xDiff >= xTolerance) || yDiff >= yTolerance || -yDiff >= yTolerance) {\r\n point.visible = !point.isEmpty ? true : (point.visible || false);\r\n tempPoints[count++] = point;\r\n (xVal === xVal) && (prevXValue = xVal);\r\n (yVal === yVal) && (prevYValue = yVal);\r\n }\r\n }\r\n sorted && (chartSeries._sorted = sorted);\r\n chartSeries._pointMarker = markerCount;\r\n chartSeries._dataLabels = dataLabelCount;\r\n return ((emptyPointsCount == 0 && (chartSeries.marker && !chartSeries.marker.dataLabel.visible)) ? tempPoints : this._calculateEmptyPoints(chartSeries, tempPoints));\r\n },\r\n _isVisiblePoints: function (chartSeries) {\r\n var points = chartSeries.pointCollection && chartSeries.dragPoint ? chartSeries.pointCollection : chartSeries.points,\r\n emptyPoints,\r\n isEmpty,\r\n checkNull = ej.util.isNullOrUndefined,\r\n length = points.length;\r\n for (var k = 0; k < length; k++) {\r\n isEmpty = (checkNull(points[k].isEmpty)) ? false : points[k].isEmpty;\r\n points[k].visible = (checkNull(points[k].visible)) ? true : points[k].visible;\r\n if (checkNull(points[k].xValue)) {\r\n points[k].isEmpty = true;\r\n points[k].visible = false;\r\n points[k].xValue = chartSeries.xAxis ? chartSeries.xAxis.visibleRange.min : null;\r\n } else\r\n points[k].isEmpty = isEmpty;\r\n\r\n if ((typeof points[k].YValues[0] != \"object\" && isNaN(points[k].YValues[0]) || points[k].YValues[0] == null || points[k].YValues[0] == 'undefined') ||\r\n (!chartSeries.isIndicator && (chartSeries._hiloTypes && (isNaN(points[k].YValues[1]) || points[k].YValues[1] == undefined || points[k].YValues[1] == null)))) {\r\n points[k].isEmpty = true;\r\n points[k].visible = false;\r\n } else {\r\n points[k].isEmpty = points[k].isEmpty;\r\n points[k].visible = (points[k].isEmpty) ? !points[k].isEmpty : points[k].visible;\r\n }\r\n if (!checkNull(points[k].x)) {\r\n if (jQuery.type(points[k].xValue) == \"date\")\r\n points[k].xValue = (points[k].xValue).getTime();\r\n }\r\n }\r\n if (chartSeries.emptyPointSettings)\r\n emptyPoints = this._calculateEmptyPoints(chartSeries, points);\r\n else\r\n emptyPoints = points;\r\n\r\n if (chartSeries.type.toLowerCase() == \"waterfall\")\r\n this.chartObj.calculateWaterfallSeriesPoints(emptyPoints);\r\n\r\n chartSeries._visiblePoints = emptyPoints;\r\n\r\n return emptyPoints;\r\n\r\n },\r\n\r\n _calculateEmptyPoints: function (series, points, chartObj) {\r\n var currentPoints;\r\n var emptyPoints = series.emptyPointSettings,\r\n style = emptyPoints.style,\r\n fill = style.color,\r\n checkNull = ej.util.isNullOrUndefined,\r\n borderColor = style.border.color,\r\n borderWidth = style.border.width,\r\n mode = emptyPoints.displayMode.toLowerCase(),\r\n emptyPointsVisible = emptyPoints.visible,\r\n length = points.length,\r\n point,\r\n xPoints = [],\r\n visiblePoints = [];\r\n currentPoints = $.extend(true, {}, points, currentPoints);\r\n var seriesType = series.type.toLowerCase();\r\n currentPoints.length = points.length;\r\n mode = (seriesType == \"boxandwhisker\") ? \"gap\" : mode;\r\n if (emptyPointsVisible) {\r\n if (mode != 'gap') {\r\n for (var i = 0; i < length; i++) {\r\n currentPoints[i].actualIndex = checkNull(chartObj) ? i : (chartObj.model._isPieOfPie ? currentPoints[i].actualIndex : i);\r\n point = currentPoints[i];\r\n if ((point.isEmpty) && (!checkNull(point.x) || series._xAxisValueType == \"string\")) {\r\n if (fill != '')\r\n point.fill = fill;\r\n if (borderColor != '') {\r\n point.border = point.border ? point.border : {};\r\n point.border.color = borderColor;\r\n point.border.width = borderWidth;\r\n }\r\n switch (mode) {\r\n case 'average':\r\n if (series._hiloTypes) {\r\n $.each(point.YValues, function (index, value) {\r\n value = ((currentPoints[i - 1] ? currentPoints[i - 1].YValues[index] : 0) + (currentPoints[i + 1] ? (currentPoints[i + 1].isEmpty ? 0 : currentPoints[i + 1].YValues[index]) : 0)) / 2\r\n point.YValues[index] = value;\r\n ej.EjSeriesRender.prototype._sethlocPoint(index, point, value);\r\n })\r\n } else {\r\n value = ((currentPoints[i - 1] ? currentPoints[i - 1].y : 0) + (currentPoints[i + 1] ? (currentPoints[i + 1].isEmpty ? 0 : currentPoints[i + 1].y) : 0)) / 2;\r\n point.YValues[0] = value;\r\n point.y = value;\r\n }\r\n break;\r\n case 'zero':\r\n if (series._hiloTypes) {\r\n $.each(point.YValues, function (index, value) {\r\n point.y = 0;\r\n point.YValues[index] = 0;\r\n ej.EjSeriesRender.prototype._sethlocPoint(index, point, 0);\r\n })\r\n } else {\r\n var yvalue = seriesType.indexOf(\"stackingspline\") != -1 ? currentPoints[i].YValues[0] : 0;\r\n point.YValues[0] = yvalue;\r\n point.y = yvalue;\r\n }\r\n break;\r\n }\r\n point.isEmpty = false;\r\n point.visible = true;\r\n visiblePoints.push(point);\r\n } else {\r\n if (!checkNull(currentPoints[i].x) || series._xAxisValueType == \"string\")\r\n visiblePoints.push(point);\r\n }\r\n }\r\n } else {\r\n for (var i = 0; i < length; i++) {\r\n currentPoints[i].actualIndex = checkNull(chartObj) ? i : (chartObj.model._isPieOfPie ? currentPoints[i].actualIndex : i);\r\n visiblePoints[i] = (currentPoints[i]);\r\n }\r\n }\r\n } else {\r\n for (var i = 0; i < length; i++) {\r\n currentPoints[i].actualIndex = i;\r\n if (currentPoints[i].visible)\r\n visiblePoints.push(currentPoints[i]);\r\n }\r\n }\r\n\r\n return visiblePoints;\r\n\r\n },\r\n\r\n _sethlocPoint: function (index, point, value) {\r\n switch (index) {\r\n case 0:\r\n point.high = value;\r\n break;\r\n case 1:\r\n point.low = value;\r\n break;\r\n case 2:\r\n point.open = value;\r\n break;\r\n case 3:\r\n point.close = value;\r\n break;\r\n }\r\n },\r\n\r\n _calculatePolarAxesSegment: function (currentseries) {\r\n\r\n var points = currentseries._visiblePoints;\r\n var segment = ej.EjSvgRender.utils._getStringBuilder();\r\n var SeriesIndex = $.inArray(currentseries, this.chartObj.model._visibleSeries)\r\n var size;\r\n var interval;\r\n var centerX = this.chartObj.model.centerX;\r\n var centerY = this.chartObj.model.centerY;\r\n // calculating side by side info.\r\n var sideInfo = this._getSeriesPosition(currentseries);\r\n var drawType = currentseries.drawType.toLowerCase();\r\n spDirection = \"\",\r\n splinesb = ej.EjSvgRender.utils._getStringBuilder(),\r\n style = this.setLineSeriesStyle(currentseries),\r\n yIndex = 0,\r\n firstPoint = null,\r\n secondPoint = null,\r\n firstIndex = -1, controlPointsCount = 0,\r\n controlPoint1 = null,\r\n controlPoint2 = null,\r\n data = null,\r\n bpt1 = null,\r\n bpt2 = null,\r\n chartObj = this.chartObj;\r\n size = $.extend(true, {}, currentseries.marker.size, size);\r\n if (size.width <= 10) {\r\n size.width = size.height = (1.5 * this.chartObj.model.elementSpacing);\r\n }\r\n if (currentseries.drawType.toLowerCase() == 'column' || currentseries.drawType.toLowerCase() == 'rangecolumn') {\r\n\r\n var innerRadius = 0;\r\n var serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + SeriesIndex };\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n var interval = currentseries.xAxis.visibleRange.interval;\r\n currentseries.xAxis.labelPlacement = !(currentseries.xAxis.labelPlacement) ? \"betweenticks\" : currentseries.xAxis.labelPlacement;\r\n var ticks = 0, temp, point;\r\n if (currentseries.xAxis._valueType != \"category\" || (currentseries.xAxis._valueType == \"category\" && currentseries.xAxis.labelPlacement == \"onticks\"))\r\n ticks = interval / 2;\r\n var inversed = (currentseries.xAxis.isInversed) ? 0 : 1;\r\n interval = interval / sideInfo.all;\r\n var nextPoint = interval;\r\n var visiblePoints = currentseries._visiblePoints;\r\n var length = visiblePoints.length;\r\n // calculation for start and end angle for each positions.\r\n for (var l = 0; l < length; l++) {\r\n var itemCurrentXPos = temp = (visiblePoints[l].xValue - currentseries.xAxis.visibleRange.min) + ((interval) * sideInfo.pos - ticks);\r\n itemCurrentXPos = (itemCurrentXPos) / this.chartObj.model.sumofYValues;\r\n point = visiblePoints[l];\r\n\r\n var nextPoint = (currentseries.xAxis.visibleRange.interval) / sideInfo.all;\r\n point.startAngle = 2 * Math.PI * itemCurrentXPos;\r\n point.endAngle = 2 * Math.PI * (itemCurrentXPos + ((nextPoint) / this.chartObj.model.sumofYValues));\r\n }\r\n if (!visiblePoints[visiblePoints.length - 1].startAngle) {\r\n visiblePoints[visiblePoints.length - 1].startAngle = visiblePoints[0].startAngle;\r\n visiblePoints[visiblePoints.length - 1].endAngle = visiblePoints[0].endAngle;\r\n }\r\n }\r\n var gap = false;\r\n for (var i = 0; i < points.length; i++) {\r\n var point1;\r\n var point2;\r\n\r\n // drawType 'Scatter' calculation\r\n if (drawType == 'scatter') {\r\n point1 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[i].xValue, points[i].y, this.chartObj);\r\n this.drawSymbol(SeriesIndex, currentseries, i, point1.X, point1.Y);\r\n }\r\n\r\n // drawType 'Line' calculation\r\n else if (currentseries.drawType.toLowerCase() == 'line') {\r\n point1 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[i].xValue, points[i].y, this.chartObj);\r\n\r\n if (i < points.length - 1 && points[i + 1].visible) {\r\n point2 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[i + 1].xValue, points[i + 1].y, this.chartObj);\r\n segment.append(\"M\" + \" \" + (point1.X) + \" \" + (point1.Y) + \" \" + \"L\" + \" \" + (point2.X) + \" \" + (point2.Y) + \" \");\r\n }\r\n // when isClosed is true\r\n else if (i == points.length - 1) {\r\n if (currentseries.isClosed) {\r\n point2 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[0].xValue, points[0].y, this.chartObj);\r\n segment.append(\"M\" + \" \" + (point1.X) + \" \" + (point1.Y) + \" \" + \"L\" + \" \" + (point2.X) + \" \" + (point2.Y) + \" \");\r\n }\r\n }\r\n }\r\n\r\n else if (currentseries.drawType.toLowerCase() == 'column') {\r\n var interval = currentseries.xAxis.visibleRange.interval;\r\n var inversed = (currentseries.xAxis.isInversed) ? 0 : 1;\r\n var interval = interval / sideInfo.all;\r\n // radius for each point based on the y values.\r\n var radius = this.chartObj.model.Radius * ej.EjSvgRender.utils._valueToCoefficient(currentseries.yAxis, points[i].y);\r\n\r\n var chartStartAngle = -.5 * Math.PI;\r\n var startAngle = points[i].startAngle + chartStartAngle;\r\n var endAngle = points[i].endAngle + chartStartAngle - 0.000001;\r\n\r\n var x1, y1, x2, y2, direction;\r\n\r\n // calculating arc when the Stacking mode is enabled\r\n\r\n if (currentseries.isStacking) {\r\n var startValue = currentseries.stackedValue.StartValues[i];\r\n var endValue = currentseries.stackedValue.EndValues[i];\r\n radius = ((startValue == endValue) ? 0 : (this.chartObj.model.Radius * ej.EjSvgRender.utils._valueToCoefficient(currentseries.yAxis, endValue)));\r\n\r\n x1 = centerX + radius * Math.cos(startAngle);\r\n y1 = centerY + radius * Math.sin(startAngle);\r\n\r\n x2 = centerX + radius * Math.cos(endAngle);\r\n y2 = centerY + radius * Math.sin(endAngle);\r\n\r\n innerRadius = this.chartObj.model.Radius * ej.EjSvgRender.utils._valueToCoefficient(currentseries.yAxis, (startValue == 0 && currentseries.yAxis.visibleRange.min != 0) ? currentseries.yAxis.visibleRange.min : startValue);\r\n\r\n var dStartX = centerX + innerRadius * Math.cos(startAngle);\r\n var dStartY = centerY + innerRadius * Math.sin(startAngle);\r\n\r\n var dEndX = centerX + innerRadius * Math.cos(endAngle);\r\n var dEndY = centerY + innerRadius * Math.sin(endAngle);\r\n if (this.chartObj.model.isPolar)\r\n direction = \"M\" + \" \" + x1 + \" \" + y1 + \" \" + \"A\" + \" \" + radius + \" \" + radius + \" \" + \"0\" + \" \" + \"0\" + \" \" + inversed + \" \" + x2 + \" \" + y2 + \" \" + \"L\" + \" \" + dEndX + \" \" + dEndY + \" \" + \"A\" + \" \" + innerRadius + \" \" + innerRadius + \" \" + \"1\" + \" \" + \"0\" + \" \" + \"0\" + \" \" + dStartX + \" \" + dStartY + \" \" + \"z\";\r\n else\r\n direction = \"M\" + \" \" + x1 + \" \" + y1 + \" \" + \"L\" + \" \" + x2 + \" \" + y2 + \" \" + \"L\" + \" \" + dEndX + \" \" + dEndY + \" \" + \"L\" + \" \" + dStartX + \" \" + dStartY + \" \" + \"z\";\r\n }\r\n // calculating arc for normal mode.\r\n else {\r\n\r\n x1 = centerX + radius * Math.cos(startAngle);\r\n y1 = centerY + radius * Math.sin(startAngle);\r\n\r\n x2 = centerX + radius * Math.cos(endAngle);\r\n y2 = centerY + radius * Math.sin(endAngle);\r\n if (this.chartObj.model.isPolar)\r\n direction = \"M\" + \" \" + x1 + \" \" + y1 + \" \" + \"A\" + \" \" + radius + \" \" + radius + \" \" + \"0\" + \" \" + \"0\" + \" \" + inversed + \" \" + x2 + \" \" + y2 + \" \" + \"L\" + \" \" + centerX + \" \" + centerY + \" \" + \"z\";\r\n else\r\n direction = \"M\" + \" \" + x1 + \" \" + y1 + \" \" + \"L\" + \" \" + x2 + \" \" + y2 + \" \" + \"L\" + \" \" + centerX + \" \" + centerY + \" \" + \"z\";\r\n }\r\n\r\n // gradient creation\r\n var seriesInterior = this.chartObj.svgRenderer.createGradientElement(this.getSeriesName(currentseries) + \"_\" + SeriesIndex + i, this.chartObj.model.seriesColors[SeriesIndex], 0, 0, 0, 100, this.chartObj.gSeriesEle),\r\n seriesBorder = currentseries.border;\r\n var options = {\r\n 'id': this.chartObj.svgObject.id + \"_Series\" + SeriesIndex + \"_Point\" + i,\r\n 'fill': seriesInterior,\r\n 'stroke': seriesBorder.color,\r\n 'stroke-dasharray': seriesBorder.dashArray,\r\n 'stroke-width': seriesBorder.width,\r\n\r\n 'opacity': currentseries.opacity,\r\n 'pointIndex': i,\r\n 'd': direction,\r\n 'start': points[i].startAngle - 1.57,\r\n 'end': points[i].endAngle - 1.57,\r\n 'radius': radius,\r\n 'innerR': innerRadius\r\n };\r\n if (this.chartObj.model.isPolar) {\r\n options.x = centerX;\r\n options.y = centerY;\r\n bounds = { PointIndex: i, StartAngle: points[i].startAngle, EndAngle: points[i].endAngle, CenterX: centerX, CenterY: centerY, Radius: radius, DRadius: innerRadius };\r\n }\r\n if (currentseries.type == \"radar\") {\r\n var line1 = { x: centerX, y: centerY };\r\n var line2 = { x: x1, y: y1 };\r\n var line3 = { x: x2, y: y2 };\r\n bounds = { PointIndex: i, Line1: line1, Line2: line2, Line3: line3 };\r\n var hasStackingInnerRadius = innerRadius ? true : false;\r\n options.hasStackingInnerRadius = hasStackingInnerRadius;\r\n }\r\n point = currentseries._visiblePoints[i];\r\n if ((!ej.util.isNullOrUndefined(currentseries.marker) && currentseries.marker.visible) || (!ej.util.isNullOrUndefined(currentseries.marker) && currentseries.marker.dataLabel.visible))\r\n point.symbolLocation = { X: ((x1 + x2) / 2), Y: ((y1 + y2) / 2) };\r\n\r\n this.chartObj.svgRenderer.drawPath(options, this.gSeriesGroupEle);\r\n\r\n }\r\n else if (drawType == 'spline') {\r\n visiblePoints = this.chartObj.dragPoint ? series.pointCollection : this._isVisiblePoints(currentseries),\r\n point1 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[i].xValue, points[i].y, this.chartObj);\r\n if (i < points.length - 1 && points[i + 1].visible) {\r\n point2 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[i + 1].xValue, points[i + 1].y, this.chartObj);\r\n ySpline = this.naturalSpline(points, currentseries),\r\n pointIndex = firstIndex = i;\r\n firstPoint = visiblePoints[i];\r\n secondPoint = visiblePoints[i + 1];\r\n data = this.getBezierControlPoints(firstPoint, secondPoint, ySpline[firstIndex], ySpline[pointIndex], yIndex, currentseries, this);\r\n controlPoint1 = (data[\"controlPoint1\"]);\r\n controlPoint2 = (data[\"controlPoint2\"]);\r\n bpt1 = ej.EjSvgRender.utils.TransformToVisible(currentseries, controlPoint1.xValue, controlPoint1.YValues, chartObj);\r\n bpt2 = ej.EjSvgRender.utils.TransformToVisible(currentseries, controlPoint2.xValue, controlPoint2.YValues, chartObj);\r\n segment.append(\"M\" + \" \" + (point1.X) + \" \" + (point1.Y) + \" \" + \"C\" + \" \" + (bpt1.X) + \" \" + (bpt1.Y) + \" \" + (bpt2.X) + \" \" + (bpt2.Y) + \" \" + (point2.X) + \" \" + (point2.Y) + \" \")\r\n if (currentseries.isClosed) {\r\n if (i == points.length - 1) {\r\n if (point1 != null) {\r\n point3 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[0].xValue, points[0].y, chartObj);\r\n firstPoint = visiblePoints[visiblePoints.length - 1];\r\n secondPoint = visiblePoints[0];\r\n pointIndex = firstIndex = 0;\r\n data = this.getBezierControlPoints(firstPoint, secondPoint, ySpline[firstIndex], ySpline[pointIndex], yIndex, currentseries, this);\r\n controlPoint1 = (data[\"controlPoint1\"]);\r\n controlPoint2 = (data[\"controlPoint2\"]);\r\n bpt1 = ej.EjSvgRender.utils.TransformToVisible(currentseries, controlPoint1.xValue, controlPoint1.YValues, chartObj);\r\n bpt2 = ej.EjSvgRender.utils.TransformToVisible(currentseries, controlPoint2.xValue, controlPoint2.YValues, chartObj);\r\n segment.append(\"M\" + \" \" + (point2.X) + \" \" + (point2.Y) + \" \" + \"C\" + \" \" + (bpt1.X + chartObj.canvasX) + \" \" + (bpt1.Y + chartObj.canvasY) + \" \" + (bpt2.X + chartObj.canvasX) + \" \" + (bpt2.Y + chartObj.canvasY) + \" \" + (point3.X) + \" \" + (point3.Y) + \" \");\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n else if (currentseries.drawType.toLowerCase() == 'rangecolumn') {\r\n var interval = currentseries.xAxis.visibleRange.interval;\r\n var inversed = (currentseries.xAxis.isInversed) ? 0 : 1;\r\n var interval = interval / sideInfo.all;\r\n var chartStartAngle = -.5 * Math.PI;\r\n var startAngle = points[i].startAngle + chartStartAngle;\r\n var endAngle = points[i].endAngle + chartStartAngle - 0.000001;\r\n var x1, y1, x2, y2, direction;\r\n var startValue = points[i].YValues[1];\r\n var endValue = points[i].YValues[0];\r\n radius = ((startValue == endValue) ? 0 : (this.chartObj.model.Radius * ej.EjSvgRender.utils._valueToCoefficient(currentseries.yAxis, endValue)));\r\n x1 = centerX + radius * Math.cos(startAngle);\r\n y1 = centerY + radius * Math.sin(startAngle);\r\n x2 = centerX + radius * Math.cos(endAngle);\r\n y2 = centerY + radius * Math.sin(endAngle);\r\n innerRadius = this.chartObj.model.Radius * ej.EjSvgRender.utils._valueToCoefficient(currentseries.yAxis, (startValue == 0 && currentseries.yAxis.visibleRange.min != 0) ? currentseries.yAxis.visibleRange.min : startValue);\r\n var dStartX = centerX + innerRadius * Math.cos(startAngle);\r\n var dStartY = centerY + innerRadius * Math.sin(startAngle);\r\n var dEndX = centerX + innerRadius * Math.cos(endAngle);\r\n var dEndY = centerY + innerRadius * Math.sin(endAngle);\r\n if (this.chartObj.model.isPolar)\r\n direction = \"M\" + \" \" + x1 + \" \" + y1 + \" \" + \"A\" + \" \" + radius + \" \" + radius + \" \" + \"0\" + \" \" + \"0\" + \" \" + inversed + \" \" + x2 + \" \" + y2 + \" \" + \"L\" + \" \" + dEndX + \" \" + dEndY + \" \" + \"A\" + \" \" + innerRadius + \" \" + innerRadius + \" \" + \"1\" + \" \" + \"0\" + \" \" + \"0\" + \" \" + dStartX + \" \" + dStartY + \" \" + \"z\";\r\n else\r\n direction = \"M\" + \" \" + x1 + \" \" + y1 + \" \" + \"L\" + \" \" + x2 + \" \" + y2 + \" \" + \"L\" + \" \" + dEndX + \" \" + dEndY + \" \" + \"L\" + \" \" + dStartX + \" \" + dStartY + \" \" + \"z\";\r\n var seriesInterior = this.chartObj.svgRenderer.createGradientElement(this.getSeriesName(currentseries) + \"_\" + SeriesIndex + i, this.chartObj.model.seriesColors[SeriesIndex], 0, 0, 0, 100, this.chartObj.gSeriesEle),\r\n seriesBorder = currentseries.border;\r\n var options = {\r\n 'id': this.chartObj.svgObject.id + \"_Series\" + SeriesIndex + \"_Point\" + i,\r\n 'fill': seriesInterior,\r\n 'stroke': seriesBorder.color,\r\n 'stroke-dasharray': seriesBorder.dashArray,\r\n 'stroke-width': seriesBorder.width,\r\n 'opacity': currentseries.opacity,\r\n 'pointIndex': i,\r\n 'd': direction,\r\n 'start': points[i].startAngle - 1.57,\r\n 'end': points[i].endAngle - 1.57,\r\n 'radius': radius,\r\n 'innerR': innerRadius\r\n };\r\n if (this.chartObj.model.isPolar) {\r\n options.x = centerX;\r\n options.y = centerY;\r\n bounds = { PointIndex: i, StartAngle: points[i].startAngle, EndAngle: points[i].endAngle, CenterX: centerX, CenterY: centerY, Radius: radius, DRadius: innerRadius };\r\n }\r\n\r\n if (currentseries.type == \"radar\") {\r\n var line1 = { x: dEndX, y: dEndY };\r\n var line2 = { x: x1, y: y1 };\r\n var line3 = { x: x2, y: y2 };\r\n var line4 = { x: dStartX, y: dStartY };\r\n bounds = { PointIndex: i, Line1: line1, Line2: line2, Line3: line3, Line4: line4 };\r\n var hasStackingInnerRadius = innerRadius ? true : false;\r\n options.hasStackingInnerRadius = hasStackingInnerRadius;\r\n }\r\n point = currentseries._visiblePoints[i];\r\n if ((!ej.util.isNullOrUndefined(currentseries.marker) && currentseries.marker.visible) || (!ej.util.isNullOrUndefined(currentseries.marker) || currentseries.marker.dataLabel.visible)) {\r\n point.symbolLocation = { X: ((x1 + x2) / 2), Y: ((y1 + y2) / 2) };\r\n this.chartObj.svgRenderer.drawPath(options, this.gSeriesGroupEle);\r\n }\r\n }\r\n\r\n // drawType 'Area' calculation\r\n else {\r\n if (currentseries.isStacking) {\r\n startValue = currentseries.stackedValue.StartValues[i];\r\n endValue = currentseries.stackedValue.EndValues[i];\r\n if (i == 0) {\r\n point1 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[i].xValue, endValue, this.chartObj);\r\n for (j = points.length - 1; j >= 0; j--) {\r\n startValue = currentseries.stackedValue.StartValues[j];\r\n points[j].y = Math.max(currentseries.yAxis.actualRange.min, startValue);\r\n //points[j].y=startValue;\r\n point1 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[j].xValue, points[j].y, this.chartObj);\r\n text = (j == points.length - 1) ? \"M\" : \"L\"\r\n segment.append(\"\" + text + \"\" + \" \" + (point1.X) + \" \" + (point1.Y) + \" \");\r\n }\r\n }\r\n if (i <= points.length - 1) {\r\n points[i].y = endValue;\r\n point1 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[i].xValue, points[i].y, this.chartObj);\r\n segment.append(\"L\" + \" \" + (point1.X) + \" \" + (point1.Y) + \" \");\r\n if (i == points.length - 1) {\r\n if (currentseries.isClosed) {\r\n point2 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[0].xValue, currentseries.stackedValue.EndValues[0], this.chartObj);\r\n point3 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[0].xValue, currentseries.stackedValue.StartValues[0], this.chartObj);\r\n point4 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[i].xValue, currentseries.stackedValue.StartValues[i], this.chartObj);\r\n segment.append(\"L\" + \" \" + (point2.X) + \" \" + (point2.Y) + \" \" + \" L\" + \" \" + (point3.X) + \" \" + (point3.Y) + \" \" + \" L\" + \" \" + (point4.X) + \" \" + (point4.Y) + \" \" + \" L\" + \" \" + (point3.X) + \" \" + (point3.Y) + \" \" + \"z \");\r\n }\r\n else\r\n segment.append(\"L\" + \" \" + (centerX) + \" \" + (centerY) + \" \");\r\n }\r\n }\r\n }\r\n else {\r\n point1 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[i].xValue, points[i].y, this.chartObj);\r\n if (i == 0 || gap) {\r\n segment.append(\"M\" + \" \" + (point1.X) + \" \" + (point1.Y) + \" \");\r\n }\r\n // when isClosed is enabled\r\n else if (i == points.length - 1) {\r\n if (!currentseries.isClosed) {\r\n segment.append(\"L\" + \" \" + (point1.X) + \" \" + (point1.Y) + \" \" + \"L\" + \" \" + (centerX) + \" \" + (centerY));\r\n }\r\n else {\r\n point2 = ej.EjSvgRender.utils.TransformToVisible(currentseries, points[0].xValue, points[0].y, this.chartObj);\r\n segment.append(\"L\" + \" \" + (point1.X) + \" \" + (point1.Y) + \" \" + \"z\");\r\n }\r\n }\r\n\r\n else {\r\n if (points[i + 1].visible)\r\n segment.append(\"L\" + \" \" + (point1.X) + \" \" + (point1.Y) + \" \");\r\n else\r\n segment.append(\"L\" + \" \" + (point1.X) + \" \" + (point1.Y) + \" \" + \"L\" + \" \" + (centerX) + \" \" + (centerY) + \" \" + \"z\");\r\n }\r\n if (points[i + 1] && points[i + 1].visible)\r\n gap = false;\r\n else\r\n gap = true;\r\n }\r\n }\r\n if (!currentseries.regionAdded && currentseries.drawType.toLowerCase() != 'column' && (currentseries.drawType.toLowerCase() != 'rangecolumn')) {\r\n var bounds = { X: point1.X - size.width / 2, Y: point1.Y - size.height / 2, Width: size.width, Height: size.height };\r\n ej.EjSvgRender.utils._addRegion(this.chartObj, bounds, currentseries, points[i], i);\r\n }\r\n if (!currentseries.regionAdded && currentseries.drawType.toLowerCase() == 'column' && this.chartObj.model.enableCanvasRendering || (currentseries.drawType.toLowerCase() == 'rangecolumn' && this.chartObj.model.enableCanvasRendering))\r\n ej.EjSvgRender.utils._addRegion(this.chartObj, bounds, currentseries, null, null);\r\n\r\n }\r\n\r\n if (!currentseries.regionAdded && currentseries.drawType.toLowerCase() == 'column' && !this.chartObj.model.enableCanvasRendering || (currentseries.drawType.toLowerCase() == 'rangecolumn' && !this.chartObj.model.enableCanvasRendering))\r\n ej.EjSvgRender.utils._addRegion(this.chartObj, bounds, currentseries, null, null);\r\n return segment.toString();\r\n },\r\n _calculateVisiblePoints: function (currentseries, chartObj) {\r\n var visiblePoints = [],\r\n legendPoints = [],\r\n emptyPointsLength,\r\n checkNull = ej.util.isNullOrUndefined,\r\n points = checkNull(chartObj) ? currentseries.points : (chartObj.model._isPieOfPie ? currentseries.pieCollections[currentseries.collectionIndex] : currentseries.points), currentPoints,\r\n length = points.length, emptyPoints,\r\n point;\r\n\r\n // calculate visible points\r\n for (var i = 0; i < length; i++) {\r\n // for legend visibility\r\n point = points[i];\r\n if (checkNull(point._visibility))\r\n point._visibility = 'visible';\r\n point.actualIndex = checkNull(chartObj) ? i : (chartObj.model._isPieOfPie ? point.actualIndex : i);\r\n point.visible = (point.isEmpty) ? false : point.visible;\r\n if (checkNull(point.visible))\r\n point.visible = true;\r\n if (point.y < 0) {\r\n point.YValues[0] = Math.abs(point.YValues[0])\r\n }\r\n if (checkNull(point.x) && currentseries._xAxisValueType != \"string\") {\r\n point.visible = false;\r\n point.isEmpty = true;\r\n }\r\n if (checkNull(point.y)) {\r\n point.visible = false;\r\n point.isEmpty = true;\r\n }\r\n }\r\n currentPoints = $.extend(true, {}, points, currentPoints);\r\n currentPoints.length = length;\r\n if (currentseries.emptyPointSettings.visible) {\r\n emptyPoints = this._calculateEmptyPoints(currentseries, currentPoints, chartObj);\r\n emptyPointsLength = emptyPoints.length;\r\n for (var j = 0; j < emptyPointsLength; j++) {\r\n if (emptyPoints[j].visible) {\r\n emptyPoints[j].visible = emptyPoints[j]._visibility == 'hidden' ? false : true;\r\n legendPoints.push(emptyPoints[j]);\r\n if (emptyPoints[j].visible)\r\n visiblePoints.push(emptyPoints[j]);\r\n } else {\r\n //calculating gap mode values\r\n emptyPoints[j].y = ((emptyPoints[j - 1] ? emptyPoints[j - 1].y : 0) + (emptyPoints[j + 1] ? emptyPoints[j + 1].y : 0)) / 2;\r\n if (isNaN(emptyPoints[j].y))\r\n emptyPoints[j].y = ((emptyPoints[j - 2] ? emptyPoints[j - 2].y : 0) + (emptyPoints[j + 2] ? emptyPoints[j + 2].y : 0)) / 2;\r\n\r\n emptyPoints[j].YValues[0] = emptyPoints[j].y;\r\n if (!checkNull(emptyPoints[j].x) || currentseries._xAxisValueType == \"string\") {\r\n emptyPoints[j].gapMode = true;\r\n visiblePoints.push(emptyPoints[j]);\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n for (var j = 0; j < length; j++) {\r\n legendPoints.push(currentPoints[j]);\r\n if (currentPoints[j].visible) {\r\n currentPoints[j].visible = currentPoints[j]._visibility == 'hidden' ? false : true;\r\n if (currentPoints[j].visible)\r\n visiblePoints.push(currentPoints[j]);\r\n }\r\n }\r\n }\r\n if (currentseries.visibility == \"hidden\") {\r\n for (var i = 0; i < legendPoints.length; i++) {\r\n legendPoints[i].visible = false;\r\n }\r\n }\r\n currentseries._visiblePoints = visiblePoints;\r\n currentseries.visiblePoints = legendPoints;\r\n\r\n return {\r\n 'visiblePoints': visiblePoints,\r\n 'legendPoints': legendPoints\r\n };\r\n },\r\n getMinMaxValue: function (point1, point2, degree) {\r\n var minX = Math.min(point1.x, point2.x);\r\n var minY = Math.min(point1.y, point2.y);\r\n var maxX = Math.max(point1.x, point2.x);\r\n var maxY = Math.max(point1.y, point2.y);\r\n var pointValue;\r\n switch (degree) {\r\n case 0:\r\n case 360:\r\n pointValue = maxY;\r\n break;\r\n case 90:\r\n pointValue = minX;\r\n break;\r\n case 180:\r\n pointValue = minY;\r\n break;\r\n case 270:\r\n pointValue = maxX;\r\n break;\r\n }\r\n return pointValue;\r\n },\r\n pieDoughnutCenter: function (currentseries) {\r\n var startAngle = currentseries.startAngle;\r\n var endAngle = currentseries.endAngle;\r\n this.chartObj.model.centerCount++;\r\n var seriesIndex = $.inArray(currentseries, this.chartObj.model._visibleSeries);\r\n var regions = [-630, -540, -450, -360, -270, -180, -90, 0, 90, 180, 270, 360, 450, 540, 630];\r\n var region = [];\r\n var oldCenterX = this.chartObj.model.circleCenterX[seriesIndex];\r\n var oldCenterY = this.chartObj.model.circleCenterY[seriesIndex];\r\n\r\n if (currentseries.startAngle < currentseries.endAngle) {\r\n for (i = 0; i < regions.length; i++) {\r\n if (regions[i] > startAngle && regions[i] < endAngle)\r\n region[region.length] = (regions[i] % 360) < 0 ? (regions[i] % 360) + 360 : (regions[i] % 360);\r\n }\r\n }\r\n else {\r\n for (i = 0; i < regions.length; i++) {\r\n if (regions[i] < startAngle && regions[i] > endAngle)\r\n region[region.length] = (regions[i] % 360) < 0 ? (regions[i] % 360) + 360 : (regions[i] % 360);\r\n }\r\n }\r\n if (this.chartObj.model.centerCount == 1) {\r\n\r\n var radius = this.chartObj.model.circularRadius[seriesIndex];\r\n var startRadian = 2 * Math.PI * (startAngle - 90) / 360;\r\n var endRadian = 2 * Math.PI * (endAngle - 90) / 360;\r\n var centerPoint = { x: this.chartObj.model.circleCenterX[seriesIndex], y: this.chartObj.model.circleCenterY[seriesIndex] };\r\n var startPoint = { x: this.chartObj.model.circleCenterX[seriesIndex] + radius * Math.cos(startRadian), y: this.chartObj.model.circleCenterY[seriesIndex] + radius * Math.sin(startRadian) }\r\n var endPoint = { x: this.chartObj.model.circleCenterX[seriesIndex] + radius * Math.cos(endRadian), y: this.chartObj.model.circleCenterY[seriesIndex] + radius * Math.sin(endRadian) }\r\n switch (region.length) {\r\n case 0:\r\n var longX = Math.abs(centerPoint.x - startPoint.x) > Math.abs(centerPoint.x - endPoint.x) ? startPoint.x : endPoint.x;\r\n var longY = Math.abs(centerPoint.y - startPoint.y) > Math.abs(centerPoint.y - endPoint.y) ? startPoint.y : endPoint.y;\r\n var midPoint = { x: (centerPoint.x + longX) / 2, y: (centerPoint.y + longY) / 2 }\r\n this.chartObj.model.circleCenterX[seriesIndex] = this.chartObj.model.circleCenterX[seriesIndex] + (this.chartObj.model.circleCenterX[seriesIndex] - midPoint.x);\r\n this.chartObj.model.circleCenterY[seriesIndex] = this.chartObj.model.circleCenterY[seriesIndex] + (this.chartObj.model.circleCenterY[seriesIndex] - midPoint.y);\r\n break;\r\n case 1:\r\n var maxRadian = 2 * Math.PI * (region[0] - 90) / 360;\r\n var maxPoint = { x: this.chartObj.model.circleCenterX[seriesIndex] + radius * Math.cos(maxRadian), y: this.chartObj.model.circleCenterY[seriesIndex] + radius * Math.sin(maxRadian) }\r\n switch (region[0]) {\r\n case 0:\r\n case 360:\r\n point1 = { x: startPoint.x, y: maxPoint.y };\r\n point2 = { x: endPoint.x, y: centerPoint.y };\r\n break;\r\n case 90:\r\n point1 = { x: centerPoint.x, y: endPoint.y };\r\n point2 = { x: maxPoint.x, y: startPoint.y };\r\n break;\r\n case 180:\r\n point1 = { x: endPoint.x, y: centerPoint.y };\r\n point2 = { x: startPoint.x, y: maxPoint.y };\r\n break;\r\n case 270:\r\n point1 = { x: maxPoint.x, y: startPoint.y };\r\n point2 = { x: centerPoint.x, y: endPoint.y };\r\n break;\r\n }\r\n var midPoint = { x: (point1.x + point2.x) / 2, y: (point1.y + point2.y) / 2 }\r\n this.chartObj.model.circleCenterX[seriesIndex] = this.chartObj.model.circleCenterX[seriesIndex] + ((this.chartObj.model.circleCenterX[seriesIndex] - midPoint.x) >= radius ? 0 : (this.chartObj.model.circleCenterX[seriesIndex] - midPoint.x));\r\n this.chartObj.model.circleCenterY[seriesIndex] = this.chartObj.model.circleCenterY[seriesIndex] + ((this.chartObj.model.circleCenterY[seriesIndex] - midPoint.y) >= radius ? 0 : (this.chartObj.model.circleCenterY[seriesIndex] - midPoint.y));\r\n break;\r\n case 2:\r\n var minRadian = 2 * Math.PI * (region[0] - 90) / 360;\r\n var maxRadian = 2 * Math.PI * (region[1] - 90) / 360;\r\n var maxPoint = { x: this.chartObj.model.circleCenterX[seriesIndex] + radius * Math.cos(maxRadian), y: this.chartObj.model.circleCenterY[seriesIndex] + radius * Math.sin(maxRadian) }\r\n var minPoint = { x: this.chartObj.model.circleCenterX[seriesIndex] + radius * Math.cos(minRadian), y: this.chartObj.model.circleCenterY[seriesIndex] + radius * Math.sin(minRadian) }\r\n var point1;\r\n var point2\r\n if (region[0] == 90 && region[1] == 180 || region[0] == 270 && region[1] == 0)\r\n point1 = { x: minPoint.x, y: maxPoint.y }\r\n else\r\n point1 = { x: maxPoint.x, y: minPoint.y }\r\n if (region[0] == 90 || region[0] == 270)\r\n point2 = { x: this.getMinMaxValue(startPoint, endPoint, region[0]), y: this.getMinMaxValue(startPoint, endPoint, region[1]) }\r\n else\r\n point2 = { x: this.getMinMaxValue(startPoint, endPoint, region[1]), y: this.getMinMaxValue(startPoint, endPoint, region[0]) }\r\n var midPoint = { x: Math.abs(point1.x - point2.x) / 2 >= radius ? 0 : (point1.x + point2.x) / 2, y: Math.abs(point1.y - point2.y) / 2 >= radius ? 0 : (point1.y + point2.y) / 2 }\r\n this.chartObj.model.circleCenterX[seriesIndex] = this.chartObj.model.circleCenterX[seriesIndex] + (midPoint.x == 0 ? 0 : (this.chartObj.model.circleCenterX[seriesIndex] - midPoint.x) >= radius ? 0 : (this.chartObj.model.circleCenterX[seriesIndex] - midPoint.x));\r\n this.chartObj.model.circleCenterY[seriesIndex] = this.chartObj.model.circleCenterY[seriesIndex] + (midPoint.y == 0 ? 0 : (this.chartObj.model.circleCenterY[seriesIndex] - midPoint.y) >= radius ? 0 : (this.chartObj.model.circleCenterY[seriesIndex] - midPoint.y));\r\n break;\r\n }\r\n }\r\n for (var i = 0; i < currentseries.points.length; i++) {\r\n if (seriesIndex < this.chartObj.model._visibleSeries.length && this.chartObj.model.centerCount > 1) {\r\n if (this.chartObj.model._visibleSeries[seriesIndex + 1].startAngle == startAngle && this.chartObj.model._visibleSeries[seriesIndex + 1].endAngle == endAngle) {\r\n this.chartObj.model.circleCenterX[seriesIndex] = this.chartObj.model.circleCenterX[seriesIndex + 1];\r\n this.chartObj.model.circleCenterY[seriesIndex] = this.chartObj.model.circleCenterY[seriesIndex + 1];\r\n }\r\n }\r\n this.chartObj.model.startX[i] = this.chartObj.model.startX[i] - (oldCenterX - this.chartObj.model.circleCenterX[seriesIndex]);\r\n this.chartObj.model.startY[i] = this.chartObj.model.startY[i] - (oldCenterY - this.chartObj.model.circleCenterY[seriesIndex]);\r\n\r\n\r\n }\r\n\r\n },\r\n _drawEmptyPieOfPie: function (chartObj) {\r\n var startAngle = -.5 * Math.PI,\r\n endAngle = 360 * (Math.PI / 180) + (-.5 * Math.PI) - 0.000001,\r\n startX = chartObj.model.circleCenterX[1],\r\n startY = chartObj.model.circleCenterY[1],\r\n radius = chartObj.model.circularRadius[1];\r\n var direction = \"M\" + \" \" + (startX + radius * Math.cos(startAngle)) + \" \" + (startY + radius * Math.sin(startAngle)) + \" \" + \"A\" + \" \" + radius + \" \" + radius + \" \" + \"0\" + \" \" +\r\n 1 + \" \" + 1 + \" \" + (startX + radius * Math.cos(endAngle)) + \" \" + (startY + radius * Math.sin(endAngle)) + \" \" + \"z\";\r\n var theme = chartObj.model.theme.toLowerCase();\r\n var pathOptions = {\r\n 'id': chartObj.svgObject.id + '_Series' + 0 + \"_EmptyCircle\",\r\n 'fill': 'none',\r\n 'stroke-width': 1.5,\r\n 'stroke': theme.indexOf(\"dark\") >= 0 || theme.indexOf(\"contrast\") >= 0 ? \" #FFFFFF\" : \"#000000\",\r\n 'stroke-dasharray': '',\r\n 'd': direction,\r\n 'opacity': 1,\r\n 'radius': radius,\r\n 'start': 0 - 1.57,\r\n 'end': (360 * (Math.PI / 180)) - 1.57,\r\n 'cx': startX,\r\n 'cy': startY\r\n };\r\n return pathOptions;\r\n },\r\n calculatingSliceAngle: function (currentseries, chartObj) {\r\n var chart = this.chartObj ? this.chartObj : chartObj,\r\n chartModel = chart.model,\r\n legend = chartModel.legend,\r\n seriesIndex = $.inArray(currentseries, chartModel._visibleSeries),\r\n legendPosition = legend.position.toLowerCase(),\r\n legendActualBounds = chartModel.LegendActualBounds,\r\n visiblePoints = currentseries._visiblePoints,\r\n visiblePointslength = visiblePoints.length,\r\n legXSpace = 0, totalDegree,\r\n legYSpace = 0,\r\n legendBorder = legend.border.width,\r\n border = chartModel.border.width,\r\n point, margin = chartModel.margin,\r\n elementSpacing = chartModel.elementSpacing,\r\n itemCurrentXPos = 0,\r\n subTitle = chartModel.title.subTitle.text ? chartModel.title.subTitle : '';\r\n chartModel.arcData = [];\r\n currentseries.rightsidePoints = [];\r\n currentseries.leftsidePoints = [];\r\n currentseries.labels = [];\r\n chartModel.sumofYValues = 0;\r\n chartModel.midPoint = 0;\r\n var type = currentseries.type.toLowerCase(),\r\n gapWidthValue = currentseries.gapWidth;\r\n\r\n\r\n for (j = 0; j < visiblePoints.length; j++) {\r\n chartModel.sumofYValues += visiblePoints[j].YValues[0];\r\n }\r\n if (currentseries.endAngle != null && type != \"pieofpie\")\r\n totalDegree = (currentseries.endAngle - currentseries.startAngle);\r\n else\r\n totalDegree = 360;\r\n totalDegree = (totalDegree != 360 && totalDegree != -360) ? totalDegree % 360 : totalDegree;\r\n if (currentseries.startAngle && type != \"pieofpie\") {\r\n currentseries.startAngle = currentseries.startAngle % 360;\r\n currentseries.endAngle = currentseries.startAngle + totalDegree;\r\n itemCurrentXPos = (currentseries.startAngle) ? ((chartModel.sumofYValues / 360) * currentseries.startAngle) : 0;\r\n itemCurrentXPos = itemCurrentXPos / chartModel.sumofYValues;\r\n chartModel.itemCurrentXPos = itemCurrentXPos;\r\n }\r\n else\r\n currentseries.endAngle = totalDegree;\r\n if (legend.visible && legendPosition != \"custom\") {\r\n if (legendPosition == \"right\" || legendPosition == \"left\")\r\n legXSpace += legendActualBounds.Width + (legendBorder * 2) + elementSpacing;\r\n else\r\n legYSpace += legendActualBounds.Height + (legendBorder * 2) + elementSpacing;\r\n\r\n }\r\n\r\n var yOffset = ((chartModel.title.text && chartModel.title.visible) ? chartModel._titleLocation.size.height + chartModel.elementSpacing + (subTitle == '' ? 0 : (subTitle.text && subTitle.visible && subTitle.enableTrim && (subTitle.textOverflow == 'wrap' || subTitle.textOverflow == 'wrapandtrim') ? chartModel._subTitleLocation.size.height : 0)) : 0);\r\n\r\n var constantWidth = 0.1 * Math.min($(chart.svgObject).width(), $(chart.svgObject).height());\r\n var actualWidth = $(chart.svgObject).width() - (legXSpace + margin.left + margin.right + border * 2) - (type == \"pieofpie\" ? gapWidthValue : 0);\r\n var actualHeight = $(chart.svgObject).height() - (legYSpace + yOffset + margin.top + margin.bottom + border * 2);\r\n seriesIndex = chart.model._isPieOfPie ? currentseries.collectionIndex : seriesIndex;\r\n\r\n if (type == \"pieofpie\") {\r\n if (actualWidth < constantWidth) {\r\n var widthDifference = constantWidth - actualWidth;\r\n actualWidth = constantWidth;\r\n }\r\n gapWidthValue = widthDifference ? gapWidthValue - widthDifference : $(chart.svgObject).width() >= gapWidthValue ? gapWidthValue : 0;\r\n }\r\n var value = type == \"pieofpie\" ? (seriesIndex == 0 ? 0.25 : 0.25 * 3) : 0.5;\r\n chartModel.circleCenterX[seriesIndex] = (actualWidth * value) + (seriesIndex == 1 && type == \"pieofpie\" ? gapWidthValue : 0) + margin.left + ((legend.visible && legendPosition === \"left\") ? legXSpace : 0);\r\n chartModel.circleCenterY[seriesIndex] = (actualHeight * 0.5) + margin.top + yOffset + ((legend.visible && legendPosition === \"top\") ? legYSpace : 0);\r\n\r\n if (!ej.util.isNullOrUndefined(chart.model.pieGapWidth) && chart.model.pieGapWidth != 0) {\r\n if (seriesIndex == 0)\r\n chartModel.circleCenterX[seriesIndex] = chartModel.circleCenterX[seriesIndex] + chart.model.pieGapWidth / 2;\r\n else\r\n chartModel.circleCenterX[seriesIndex] = chartModel.circleCenterX[seriesIndex] - chart.model.pieGapWidth / 2;\r\n }\r\n var endAngle;\r\n currentseries.startAngle = (type == \"pieofpie\") ? 0 : currentseries.startAngle;\r\n totalDegree = currentseries.endAngle - currentseries.startAngle;\r\n var pieFactor = totalDegree / 180;\r\n var circleMidAngle = (totalDegree / 4) * (Math.PI / 180);\r\n for (var l = 0; l < visiblePointslength; l++) {\r\n point = currentseries._visiblePoints[l];\r\n if (point.visible || point.gapMode) {\r\n var pointIndex = type == \"pieofpie\" ? point.actualIndex : l;\r\n if (l == 0 && seriesIndex == 0 && type == \"pieofpie\") {\r\n var startAngle = 2 * Math.PI * itemCurrentXPos;\r\n var endAngle = pieFactor * Math.PI * (point.YValues[0] / chartModel.sumofYValues) + startAngle;\r\n endAngle = (isNaN(endAngle)) ? startAngle : endAngle;\r\n midAngle = (endAngle + startAngle) / 2;\r\n point.start = point.startAngle = circleMidAngle - midAngle;\r\n point.end = point.endAngle = circleMidAngle + midAngle;\r\n point.midAngle = circleMidAngle;\r\n }\r\n else {\r\n if (l == 0)\r\n point.startAngle = 2 * Math.PI * itemCurrentXPos;\r\n else\r\n point.startAngle = (type == \"pieofpie\") ? currentseries.pieCollections[seriesIndex][l - 1].endAngle : endAngle;\r\n endAngle = point.endAngle = pieFactor * Math.PI * (point.YValues[0] / chartModel.sumofYValues) + point.startAngle;\r\n endAngle = point.endAngle = (isNaN(endAngle)) ? point.startAngle : endAngle;\r\n point.start = point.startAngle;\r\n point.end = point.endAngle;\r\n point.midAngle = (point.endAngle + point.startAngle) / 2;\r\n }\r\n point.pointIndex = pointIndex;\r\n var chartStartingAngle = -.5 * Math.PI;\r\n\r\n point.radian = (point.midAngle) % (2 * Math.PI)\r\n\r\n if (currentseries.labelPosition.toLowerCase() == \"outsideextended\" && type != \"pieofpie\") {\r\n\r\n if (point.radian < Math.PI)\r\n currentseries.rightsidePoints.push(point);\r\n else\r\n currentseries.leftsidePoints.push(point);\r\n }\r\n itemCurrentXPos += point.YValues[0] / chartModel.sumofYValues;\r\n\r\n var midAngle = point.midAngle + chartStartingAngle;\r\n\r\n if ((point.actualIndex == currentseries.explodeIndex || currentseries.explodeAll) && !chart.vmlRendering) {\r\n\r\n chartModel.startX[pointIndex] = chartModel.circleCenterX[seriesIndex] + Math.cos(midAngle) * currentseries.explodeOffset;\r\n chartModel.startY[pointIndex] = chartModel.circleCenterY[seriesIndex] + Math.sin(midAngle) * currentseries.explodeOffset;\r\n }\r\n else {\r\n chartModel.startX[pointIndex] = chartModel.circleCenterX[seriesIndex];\r\n chartModel.startY[pointIndex] = chartModel.circleCenterY[seriesIndex];\r\n }\r\n }\r\n\r\n }\r\n\r\n if (currentseries.labelPosition.toLowerCase() == \"outsideextended\") {\r\n currentseries.rightsidePoints = ej.DataManager(currentseries.rightsidePoints, ej.Query().sortBy(\"radian\")).executeLocal();\r\n currentseries.leftsidePoints = ej.DataManager(currentseries.leftsidePoints, ej.Query().sortBy(\"radian\")).executeLocal();\r\n }\r\n if (currentseries.marker.dataLabel.template) {\r\n if (currentseries.labelPosition.toLowerCase() == \"outsideextended\") {\r\n for (var i = 0; i < currentseries.rightsidePoints.length; i++) {\r\n ej.EjSvgRender.utils._getSeriesTemplateSize(currentseries.rightsidePoints[i], currentseries.rightsidePoints[i].actualIndex, currentseries, false, chart);\r\n }\r\n for (var k = 0; k < currentseries.leftsidePoints.length; k++) {\r\n ej.EjSvgRender.utils._getSeriesTemplateSize(currentseries.leftsidePoints[k], currentseries.leftsidePoints[k].actualIndex, currentseries, true, chart);\r\n }\r\n\r\n }\r\n else {\r\n for (var j = 0; j < currentseries._visiblePoints.length; j++) {\r\n ej.EjSvgRender.utils._getSeriesTemplateSize(currentseries._visiblePoints[j], currentseries._visiblePoints[j].actualIndex, currentseries, true, chart);\r\n }\r\n }\r\n\r\n }\r\n else {\r\n ej.EjSvgRender.utils._getSeriesMaxLabel(currentseries);\r\n }\r\n\r\n\r\n currentseries.finalSize = { width: actualWidth, height: actualHeight };\r\n return currentseries.finalSize;\r\n },\r\n _drawHiloPath: function (series, style, interior, direction, i, pointbounds) {\r\n\r\n var seriesIndex = $.inArray(series, this.chartObj.model._visibleSeries);\r\n\r\n var options = {\r\n 'name': series.type,\r\n 'id': this.chartObj.svgObject.id + \"_Series\" + seriesIndex + \"_Point\" + i,\r\n 'fill': \"none\",\r\n 'stroke-dasharray': series.dashArray,\r\n 'stroke-width': style.borderWidth,\r\n 'stroke': interior,\r\n 'stroke-linecap': series.lineCap,\r\n 'stroke-linejoin': series.lineJoin,\r\n 'opacity': series.opacity,\r\n 'd': direction\r\n };\r\n this.chartObj.svgRenderer.drawPath(options, this.gSeriesGroupEle);\r\n var valWidth, valHeight, x, y;\r\n var trans = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, this.chartObj.model.requireInvertedAxes);\r\n x = (Math.min(pointbounds.point2.X, pointbounds.point1.X) + trans.x) - (style.borderWidth);\r\n y = (Math.min(pointbounds.point2.Y, pointbounds.point1.Y) + trans.y);\r\n if (pointbounds.point1.Y != pointbounds.point2.Y) {\r\n valWidth = style.borderWidth + (style.borderWidth / 2);\r\n valHeight = Math.abs(pointbounds.point1.Y - pointbounds.point2.Y);\r\n }\r\n else {\r\n valWidth = Math.abs(pointbounds.point2.X - pointbounds.point1.X);\r\n valHeight = style.borderWidth + (style.borderWidth / 2);\r\n }\r\n var bounds = { X: x, Y: y, Width: valWidth, Height: valHeight };\r\n ej.EjSvgRender.utils._addRegion(this.chartObj, bounds, series, null, i);\r\n\r\n },\r\n isIntersec: function (other, currBounds) {\r\n if (currBounds.Bottom < other.Top || currBounds.Right < other.Left\r\n || currBounds.Top > other.Bottom || currBounds.Left > other.Right) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n IntersectWith: function (sender, point, currBounds, labelPosition, seriesIndex, size) {\r\n var chartObj = this, intersect = false,\r\n smartIndex, bounds;\r\n if (ej.util.isNullOrUndefined(sender.model.rightsidebounds[seriesIndex]) || ej.util.isNullOrUndefined(sender.model.leftsidebounds[seriesIndex])) {\r\n sender.model.leftsidebounds[seriesIndex] = [];\r\n sender.model.rightsidebounds[seriesIndex] = [];\r\n sender.model.leftsidebounds[seriesIndex].points = [];\r\n sender.model.rightsidebounds[seriesIndex].points = [];\r\n }\r\n if (labelPosition == \"outsideExtended\") {\r\n for (var i = seriesIndex; i < sender.model.bounds.length; i++) {\r\n if (sender.model._visibleSeries[i].labelPosition.toLowerCase() == \"outsideextended\") {\r\n if ((!ej.util.isNullOrUndefined(sender.model.bounds[i].points[\"left\"])) && (sender.model.bounds[i].points[\"left\"].length > 0)) {\r\n var pointsLength = sender.model.bounds[i].points[\"left\"].length;\r\n for (var j = pointsLength - 1; j >= 0 && !(ej.util.isNullOrUndefined(sender.model.bounds[i].points[\"left\"][j])); j--) {\r\n sender.model.leftsidebounds[i].points[j] = sender.model.bounds[i].points[\"left\"][j];\r\n\r\n }\r\n }\r\n if ((!ej.util.isNullOrUndefined(sender.model.bounds[i].points[\"right\"])) && (sender.model.bounds[i].points[\"right\"].length > 0)) {\r\n var pointsLength = sender.model.bounds[i].points[\"right\"].length;\r\n for (var k = 0; k < pointsLength && !(ej.util.isNullOrUndefined(sender.model.bounds[i].points[\"right\"][k])); k++) {\r\n sender.model.rightsidebounds[i].points[k] = sender.model.bounds[i].points[\"right\"][k];\r\n }\r\n }\r\n\r\n }\r\n }\r\n }\r\n else {\r\n\r\n if (sender.model.bounds[seriesIndex].points.length > 0 || seriesIndex >= 0) {\r\n for (var i = seriesIndex; i < sender.model.bounds.length && (!ej.util.isNullOrUndefined(sender.model.bounds[i])); i++) {\r\n if (sender.model._visibleSeries[i].labelPosition.toLowerCase() != \"outsideextended\") {\r\n var pointsLength = sender.model.bounds[i].points.length;\r\n for (var j = 0; j < pointsLength && !(ej.util.isNullOrUndefined(sender.model.bounds[i].points[j])); j++) {\r\n if (sender.model.bounds[i].points[j].X < sender.model.circleCenterX[seriesIndex]) {\r\n if (($.inArray(sender.model.bounds[i].points[j], sender.model.leftsidebounds[i].points)) == -1)\r\n sender.model.leftsidebounds[i].points[j] = sender.model.bounds[i].points[j];\r\n }\r\n else if (($.inArray(sender.model.bounds[i].points[j], sender.model.rightsidebounds[i].points)) == -1)\r\n sender.model.rightsidebounds[i].points[j] = (sender.model.bounds[i].points[j]);\r\n\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n for (i = seriesIndex; i < sender.model.bounds.length && (!ej.util.isNullOrUndefined(sender.model.bounds[i])); i++) {\r\n if (sender.model.leftsidebounds[i].points.length > 0) {\r\n bounds = sender.model.leftsidebounds[i].points;\r\n if (bounds.length > 0) {\r\n for (var j = bounds.length - 1; j >= 0; j--) {\r\n var other = bounds[j];\r\n\r\n if (!(ej.util.isNullOrUndefined(other) && other != currBounds)) {\r\n if (other.SeriesIndex == currBounds.SeriesIndex && other.PointIndex == currBounds.PointIndex) {\r\n if (point.smartLabelPosition == \"outside\")\r\n continue;\r\n else\r\n break;\r\n }\r\n else if (this.isIntersec(other, currBounds))\r\n return true;\r\n else if (currBounds.X < sender.model.circleCenterX[seriesIndex] && other.X < sender.model.circleCenterX[seriesIndex] && sender.model.series[seriesIndex].marker.dataLabel.shape != \"none\") { \r\n var yDiff = Math.abs(other.Y - currBounds.Y);\r\n if (size && yDiff <= size.height && other.Bottom > currBounds.Top && other.Left < currBounds.X)\r\n currBounds.overlap = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n }\r\n for (i = seriesIndex; i < sender.model.bounds.length && (!ej.util.isNullOrUndefined(sender.model.bounds[i])); i++) {\r\n bounds = sender.model.rightsidebounds[i].points;\r\n if (bounds.length > 0) {\r\n for (var j = bounds.length - 1; j >= 0; j--) {\r\n var other = bounds[j];\r\n if (!(ej.util.isNullOrUndefined(other) && other != currBounds)) {\r\n if (other.SeriesIndex == currBounds.SeriesIndex && other.PointIndex == currBounds.PointIndex) {\r\n if (point.smartLabelPosition == \"outside\")\r\n continue;\r\n else\r\n break;\r\n }\r\n else if (this.isIntersec(other, currBounds))\r\n return true;\r\n else if (currBounds.X > sender.model.circleCenterX[seriesIndex] && other.X > sender.model.circleCenterX[seriesIndex] && sender.model.series[seriesIndex].marker.dataLabel.shape != \"none\") {\r\n var yDiff = Math.abs(other.Y - currBounds.Y);\r\n if (size && yDiff <= size.height && other.Bottom > currBounds.Top && (other.X + (other.Right - other.Left)) > currBounds.X)\r\n currBounds.overlap = true;\r\n }\r\n }\r\n }\r\n\r\n }\r\n }\r\n return intersect;\r\n\r\n },\r\n\r\n\r\n _calculateArcData: function (sender, pointIndex, point, series, seriesIndex, pieSeriesIndex) {\r\n var seriesIndex = sender.model._isPieOfPie ? pieSeriesIndex : seriesIndex;\r\n var visiblePoints = series._visiblePoints;\r\n var index = point.actualIndex;\r\n var chartObj = sender;\r\n var chartStartAngle = -.5 * Math.PI;\r\n var currBounds, startAngle, endAngle;\r\n // fix for doughnut width is inconsistent when series having single point-EJMVC-6272\r\n if (series.type.toLowerCase() == \"doughnut\" && series._visiblePoints.length == 1 && Math.abs(series.endAngle - series.startAngle) == 360\r\n && series.startAngle % 90 != 0) {\r\n startAngle = parseFloat((point.startAngle + chartStartAngle).toFixed(3));\r\n endAngle = parseFloat((point.endAngle + chartStartAngle).toFixed(3)) - 0.000001;\r\n }\r\n else {\r\n startAngle = point.startAngle + chartStartAngle;\r\n endAngle = point.endAngle + chartStartAngle - 0.000001;\r\n }\r\n var totalDegree = series.endAngle - series.startAngle;\r\n var longArc = endAngle - startAngle < Math.PI ? 0 : 1;\r\n var midAngle = (startAngle + endAngle) / 2;\r\n if (ej.util.isNullOrUndefined(point.currentMidAngle)) {\r\n point.currentMidAngle = (startAngle + endAngle) / 2;\r\n }\r\n var direction;\r\n var startX;\r\n var startY\r\n var clockWise = totalDegree > 0 ? 1 : 0;\r\n var longArc = clockWise ? endAngle - startAngle < Math.PI ? 0 : 1 : endAngle - startAngle > -1 * Math.PI ? 0 : 1;\r\n var radius = chartObj.model.circularRadius[seriesIndex];\r\n var innerRadius = chartObj.model.innerRadius[seriesIndex];\r\n if ((index == series.explodeIndex || series.explodeAll) && !chartObj.vmlRendering) {\r\n\r\n startX = chartObj.model.circleCenterX[seriesIndex] + Math.cos(midAngle) * series.explodeOffset;\r\n startY = chartObj.model.circleCenterY[seriesIndex] + Math.sin(midAngle) * series.explodeOffset;\r\n }\r\n else {\r\n startX = chartObj.model.circleCenterX[seriesIndex];\r\n startY = chartObj.model.circleCenterY[seriesIndex];\r\n }\r\n\r\n\r\n var x1 = startX + radius * Math.cos(startAngle);\r\n var y1 = startY + radius * Math.sin(startAngle);\r\n\r\n var x2 = startX + radius * Math.cos(endAngle);\r\n var y2 = startY + radius * Math.sin(endAngle);\r\n\r\n if (series.type.toLowerCase() == \"doughnut\") {\r\n var dStartX = startX + innerRadius * Math.cos(startAngle);\r\n var dStartY = startY + innerRadius * Math.sin(startAngle);\r\n\r\n var dEndX = startX + innerRadius * Math.cos(endAngle);\r\n var dEndY = startY + innerRadius * Math.sin(endAngle);\r\n var dClockWise = clockWise ? 0 : 1;\r\n if ((startAngle < 0) && Math.round(point.endAngle - point.startAngle) == 6) {\r\n dEndX = dEndX - 0.01;\r\n x2 = x2 - 0.01;\r\n }\r\n direction = \"M\" + \" \" + x1 + \" \" + y1 + \" \" + \"A\" + \" \" + radius + \" \" + radius + \" \" + \"0\" + \" \" + longArc + \" \" + clockWise + \" \" + x2 + \" \" + y2 + \" \" + \"L\" + \" \" + dEndX + \" \" + dEndY + \" \" + \"A\" + \" \" + innerRadius + \" \" + innerRadius + \" \" + \"1\" + \" \" + longArc + \" \" + dClockWise + \" \" + dStartX + \" \" + dStartY + \" \" + \"z\";\r\n }\r\n\r\n else {\r\n if ((point.endAngle - point.startAngle).toFixed(4) == (2 * Math.PI).toFixed(4)) {\r\n var centerx = startX;\r\n var centery = startY;\r\n direction = \"M\" + \" \" + x1 + \" \" + y1 + \" \" + \"A\" + \" \" + radius + \" \" + radius + \" \" + \"0\" + \" \" + longArc + \" \" + clockWise + \" \" + x2 + \" \" + y2;\r\n }\r\n else\r\n direction = \"M\" + \" \" + x1 + \" \" + y1 + \" \" + \"A\" + \" \" + radius + \" \" + radius + \" \" + \"0\" + \" \" + longArc + \" \" + clockWise + \" \" + x2 + \" \" + y2 + \" \" + \"L\" + \" \" + startX + \" \" + startY + \" \" + \"z\";\r\n }\r\n\r\n // display label for pie and doughnut chart\r\n\r\n\r\n return { Direction: direction, centerX: centerx, centerY: centery };\r\n\r\n },\r\n\r\n getXCordinate: function (x, radius, angle) {\r\n var x1 = x + radius * (Math.cos(angle));\r\n return x1;\r\n },\r\n\r\n getYCordinate: function (y, radius, angle) {\r\n var y1 = y + radius * (Math.sin(angle));\r\n return y1;\r\n },\r\n getDoubleRange: function (start, end) {\r\n var mstart;\r\n var mend;\r\n if (start > end) {\r\n mstart = end;\r\n mend = start;\r\n }\r\n else {\r\n mstart = start;\r\n mend = end;\r\n }\r\n\r\n var mdelta = mend - mstart;\r\n var mmedian = (mstart + mend) / 2;\r\n var misEmpty = isNaN(mstart) || isNaN(mend);\r\n\r\n return { Start: mstart, End: mend, Delta: mdelta, Median: mmedian, IsEmpty: misEmpty };\r\n\r\n },\r\n isDependentSeries: function (series) {\r\n var type = series.type.toLowerCase();\r\n var requireInvertedAxes = this.chartObj.model.requireInvertedAxes;\r\n if ((!requireInvertedAxes) || (requireInvertedAxes && series.isTransposed))\r\n return ((type.indexOf(\"bar\") != -1 && !series._isTransposed) || (type.indexOf(\"column\") != -1) || (type.indexOf(\"waterfall\") != -1) || (type.indexOf(\"hilo\") != -1) || (type.indexOf(\"candle\") != -1) || (type.indexOf(\"boxandwhisker\") != -1)) ? true : false;\r\n else\r\n return (type.indexOf(\"bar\") != -1) ? true : false;\r\n },\r\n\r\n getPointXYOrgin: function (x, y, series, sender) {\r\n var requireInvertedAxes = sender.model.requireInvertedAxes;\r\n var xvalue;\r\n var yvalue;\r\n if ((series.isTransposed && requireInvertedAxes) || series._isTransposed) {\r\n xvalue = (1 - ej.EjSvgRender.utils._valueToCoefficient(series.xAxis, x)) * (series.xAxis.height);\r\n yvalue = (ej.EjSvgRender.utils._valueToCoefficient(series.yAxis, y)) * (series.yAxis.width);\r\n return { X: yvalue, Y: xvalue };\r\n }\r\n else {\r\n xvalue = ej.EjSvgRender.utils._valueToCoefficient(series.xAxis, x) * (series.xAxis.width);\r\n yvalue = (1 - ej.EjSvgRender.utils._valueToCoefficient(series.yAxis, y)) * (series.yAxis.height);\r\n return { X: xvalue, Y: yvalue };\r\n }\r\n },\r\n getRectangle: function (x1, y1, x2, y2, series, sender) {\r\n var pt1 = this.getPointXYOrgin(x1, y1, series, sender);\r\n var pt2 = this.getPointXYOrgin(x2, y2, series, sender);\r\n return ej.EjSvgRender.utils._correctRect(pt1.X, pt1.Y, pt2.X, pt2.Y);\r\n },\r\n\r\n calculateMean: function (values, series, pointIndex) {\r\n\r\n var q1Arr, q3Arr, q1Arrodd, q1Arreven, q2Arr, q3Arrodd, q3Arreven, q1half, q3half, midhalf, lowerquartile, upperquartile;\r\n var wholenumlower, remainderlower, intpartlower, decimalpartlower, wholenumupper, remainderupper, intpartupper, decimalpartupper,\r\n intpartlowerposition, intpartupperposition, averageValue = 0, boxAverageValue = 0, boxWhiskerValues = [], boxWhiskerCount = 0, boxes = [], boxArrCount = 0;\r\n if (values.length > 1)\r\n values.sort(function (a, b) { return a - b; });\r\n\r\n //showMean calculation\r\n for (var q = 0; q < values.length; q++) {\r\n averageValue = averageValue + values[q];\r\n }\r\n boxAverageValue = averageValue / values.length;\r\n boxAverageValue = parseInt(boxAverageValue.toFixed(2));\r\n boxes[boxArrCount] = boxAverageValue;\r\n boxArrCount++;\r\n\r\n if (series.boxPlotMode.toLowerCase() == \"normal\") {\r\n //Lower quartile calculation for normal mode\r\n q1Arr = (values.length % 2 == 0) ? values.slice(0, (values.length / 2)) : values.slice(0, Math.floor(values.length / 2));\r\n q1half = Math.floor(q1Arr.length / 2);\r\n lowerquartile = q1Arr.length % 2 == 0 ? (q1Arr[q1half - 1] + q1Arr[q1half]) / 2 : q1Arr[q1half];\r\n lowerquartile = (values.length <= 3) ? values[0] : lowerquartile;\r\n boxes[boxArrCount] = lowerquartile;\r\n boxArrCount++;\r\n //Upper quartile calculation for normal mode \t \r\n q3Arr = (values.length % 2 == 0) ? values.slice((values.length / 2), values.length) : values.slice(Math.ceil(values.length / 2), values.length);\r\n q3half = Math.floor(q3Arr.length / 2);\r\n upperquartile = q3Arr.length % 2 == 0 ? (q3Arr[q3half - 1] + q3Arr[q3half]) / 2 : q3Arr[q3half];\r\n upperquartile = (values.length <= 3) ? values[values.length - 1] : upperquartile;\r\n boxes[boxArrCount] = upperquartile;\r\n boxArrCount++;\r\n }\r\n else if (series.boxPlotMode.toLowerCase() == \"exclusive\" || series.boxPlotMode.toLowerCase() == \"inclusive\") {\r\n\r\n //Lower quartile calculation for exclusive meadian and inclusive median \r\n wholenumlower = series.boxPlotMode.toLowerCase() == \"exclusive\" ? (values.length + 1) / 4 : (values.length - 1) / 4;\r\n intpartlower = Math.floor(wholenumlower);\r\n decimalpartlower = wholenumlower - intpartlower;\r\n intpartlowerposition = series.boxPlotMode.toLowerCase() == \"exclusive\" ? intpartlower - 1 : intpartlower;\r\n q1Arr = (1 - decimalpartlower) * values[intpartlowerposition] + decimalpartlower * values[intpartlowerposition + 1];\r\n q1Arr = (values.length <= 3) ? values[0] : q1Arr;\r\n lowerquartile = q1Arr;\r\n boxes[boxArrCount] = lowerquartile;\r\n boxArrCount++;\r\n\r\n //Upper quartile calculation for exclusive meadian and inclusive median \r\n wholenumupper = series.boxPlotMode.toLowerCase() == \"exclusive\" ? (3 * (values.length + 1)) / 4 : (3 * (values.length - 1)) / 4;\r\n intpartupper = Math.floor(wholenumupper);\r\n decimalpartupper = wholenumupper - intpartupper;\r\n intpartupperposition = series.boxPlotMode.toLowerCase() == \"exclusive\" ? intpartupper - 1 : intpartupper;\r\n q3Arr = (1 - decimalpartupper) * values[intpartupperposition] + decimalpartupper * values[intpartupperposition + 1];\r\n q3Arr = (values.length <= 3) ? values[values.length - 1] : q3Arr;\r\n upperquartile = q3Arr;\r\n boxes[boxArrCount] = upperquartile;\r\n boxArrCount++;\r\n }\r\n\r\n\r\n //calculate median\r\n midhalf = Math.floor(values.length / 2);\r\n q2Arr = values.length % 2 == 0 ? (values[midhalf - 1] + values[midhalf]) / 2 : values[midhalf];\r\n boxes[boxArrCount] = q2Arr;\r\n boxArrCount++;\r\n\r\n //calculate interquartile range\r\n var iqr = upperquartile - lowerquartile;\r\n var upperrange = upperquartile + 1.5 * (iqr);\r\n var lowerrange = lowerquartile - 1.5 * (iqr);\r\n var maximum = values[values.length - 1];\r\n var minimum = values[0];\r\n var outliers = [], maxNumCount = 0, index = 0;\r\n\r\n\r\n for (var i = 0; i < values.length; i++) {\r\n if (upperrange < values[i]) {\r\n maxNumCount++;\r\n outliers[index] = values[i];\r\n index++;\r\n maximum = values[i - maxNumCount];\r\n\r\n }\r\n if (lowerrange > values[i]) {\r\n outliers[index] = values[i];\r\n index++;\r\n minimum = values[i + 1];\r\n }\r\n }\r\n boxes[boxArrCount] = minimum;\r\n boxArrCount++;\r\n boxes[boxArrCount] = maximum;\r\n boxArrCount++;\r\n\r\n var boxPlotValues = { Minimum: minimum, LowerQuartile: lowerquartile, midvalue: q2Arr, UpperQuartile: upperquartile, Maximum: maximum, boxAverage: boxAverageValue, outliers: outliers };\r\n series._visiblePoints[pointIndex].boxPlotValues = boxPlotValues;\r\n series._visiblePoints[pointIndex].boxPlotValues.quartileValues = boxes;\r\n\r\n\r\n\r\n\r\n return { Minimum: minimum, LowerQuartile: lowerquartile, midvalue: q2Arr, UpperQuartile: upperquartile, Maximum: maximum, boxAverage: boxAverageValue, outliers: outliers };\r\n },\r\n calculateBoxAndWhiskerPath: function (options, rect, options1, list2, series, point, pointIndex) {\r\n\r\n series._visiblePoints[pointIndex].boxPlotLocation = [];\r\n series._visiblePoints[pointIndex].dataLabelLocation = [];\r\n var boxCount = 0;\r\n var cSer = this, offset = 5;\r\n var isTransposed = series._isTransposed;\r\n var outlierShape = series.outlierSettings.shape.toLowerCase();\r\n var invertedAxis = this.chartObj.model.requireInvertedAxes, whiskerpath, boxAvg, boxAvgValue, fenceValue, outlierpoint;\r\n\r\n\r\n for (var p = 0; p < series._visiblePoints[pointIndex].boxPlotValues.quartileValues.length; p++) {\r\n boxAvg = { \"xValue\": point.xValue, \"YValues\": series._visiblePoints[pointIndex].boxPlotValues.quartileValues[p] };\r\n boxAvgValue = ej.EjSvgRender.utils._getPoint(boxAvg, series);\r\n series._visiblePoints[pointIndex].boxPlotLocation[boxCount] = boxAvgValue;\r\n series._visiblePoints[pointIndex].boxPlotLocation[boxCount].xValue = boxAvg.xValue;\r\n series._visiblePoints[pointIndex].boxPlotLocation[boxCount].YValues = boxAvg.YValues;\r\n if (isTransposed)\r\n series._visiblePoints[pointIndex].dataLabelLocation[boxCount] = { X: boxAvgValue.X, Y: rect.Y + rect.Height / 2 + offset }\r\n else\r\n series._visiblePoints[pointIndex].dataLabelLocation[boxCount] = { X: rect.X + rect.Width / 2, Y: boxAvgValue.Y };\r\n boxCount++;\r\n\r\n }\r\n\r\n for (var k = 0; k < list2.outliers.length && outlierShape != \"none\"; k++) {\r\n fenceValue = { \"xValue\": point.xValue, \"YValues\": list2.outliers[k] };\r\n outlierpoint = ej.EjSvgRender.utils._getPoint(fenceValue, series);\r\n series._visiblePoints[pointIndex].boxPlotLocation[boxCount] = outlierpoint;//to store x and y positions of upper outlier\r\n series._visiblePoints[pointIndex].boxPlotLocation[boxCount].xValue = fenceValue.xValue;\r\n series._visiblePoints[pointIndex].boxPlotLocation[boxCount].YValues = fenceValue.YValues;\r\n series._visiblePoints[pointIndex].boxPlotLocation[boxCount].outlier = true;\r\n if (isTransposed)\r\n outlierpoint.Y = rect.Y + rect.Height / 2;\r\n else\r\n outlierpoint.X = rect.X + rect.Width / 2;\r\n if (isTransposed)\r\n series._visiblePoints[pointIndex].dataLabelLocation[boxCount] = { X: outlierpoint.X - series.outlierSettings.size.height, Y: rect.Y + rect.Height / 2 + series.outlierSettings.size.width, outlier: true }\r\n else\r\n series._visiblePoints[pointIndex].dataLabelLocation[boxCount] = { X: rect.X + rect.Width / 2, Y: outlierpoint.Y, outlier: true };\r\n boxCount++;\r\n }\r\n whiskerpath = series._visiblePoints[pointIndex].boxPlotLocation;\r\n\r\n if (series._isTransposed) {\r\n var plotlowerwhisker = \"M\" + \" \" + (cSer.chartObj.canvasX + whiskerpath[4].X) + \" \" + (cSer.chartObj.canvasY + rect.Y) + \" L \" + (whiskerpath[4].X + cSer.chartObj.canvasX) + \" \" + (rect.Height + rect.Y + cSer.chartObj.canvasY) + \" M \" + (cSer.chartObj.canvasX + whiskerpath[4].X) + \" \" + (cSer.chartObj.canvasY + rect.Y + (rect.Height / 2)) + \" L \" + (cSer.chartObj.canvasX + whiskerpath[1].X) + \" \" + (cSer.chartObj.canvasY + rect.Y + (rect.Height / 2)) + \" \" + \" z\";\r\n var plotupperwhisker = \"M\" + \" \" + (cSer.chartObj.canvasX + whiskerpath[5].X) + \" \" + (cSer.chartObj.canvasY + rect.Y) + \" L \" + (cSer.chartObj.canvasX + whiskerpath[5].X) + \" \" + (rect.Height + rect.Y + cSer.chartObj.canvasY) + \" M \" + (cSer.chartObj.canvasX + whiskerpath[5].X) + \" \" + (cSer.chartObj.canvasY + rect.Y + (rect.Height / 2)) + \" L \" + (cSer.chartObj.canvasX + whiskerpath[2].X) + \" \" + (cSer.chartObj.canvasY + rect.Y + (rect.Height / 2)) + \" \" + \" z\";\r\n\r\n }\r\n else {\r\n var plotlowerwhisker = \"M\" + \" \" + (cSer.chartObj.canvasX + rect.X) + \" \" + (cSer.chartObj.canvasY + whiskerpath[4].Y) + \" L \" + (cSer.chartObj.canvasX + rect.X + rect.Width) + \" \" + (cSer.chartObj.canvasY + whiskerpath[4].Y) + \" M \" + (cSer.chartObj.canvasX + rect.X + (rect.Width / 2)) + \" \" + (cSer.chartObj.canvasY + whiskerpath[4].Y) + \" L \" + (cSer.chartObj.canvasX + rect.X + (rect.Width / 2)) + \" \" + (cSer.chartObj.canvasY + whiskerpath[1].Y) + \" \" + \" z\";\r\n var plotupperwhisker = \"M\" + \" \" + (cSer.chartObj.canvasX + rect.X) + \" \" + (cSer.chartObj.canvasY + whiskerpath[5].Y) + \" L \" + (cSer.chartObj.canvasX + rect.X + rect.Width) + \" \" + (cSer.chartObj.canvasY + whiskerpath[5].Y) + \" M \" + (cSer.chartObj.canvasX + rect.X + (rect.Width / 2)) + \" \" + (cSer.chartObj.canvasY + whiskerpath[5].Y) + \" L \" + (cSer.chartObj.canvasX + rect.X + (rect.Width / 2)) + \" \" + (cSer.chartObj.canvasY + whiskerpath[2].Y) + \" \" + \" z\";\r\n }\r\n\r\n var meanPath = !series._isTransposed ? \"M\" + \" \" + (cSer.chartObj.canvasX + rect.X + (rect.Width / 2) - 5) + \" \" + (cSer.chartObj.canvasY + whiskerpath[0].Y - 5) + \" L \" + (cSer.chartObj.canvasX + rect.X + (rect.Width / 2) + 5) + \" \" + (cSer.chartObj.canvasY + whiskerpath[0].Y + 5) + \" M \" + (cSer.chartObj.canvasX + rect.X + (rect.Width / 2) - 5) + \" \" + (cSer.chartObj.canvasY + whiskerpath[0].Y + 5) + \" L \" + (cSer.chartObj.canvasX + rect.X + (rect.Width / 2) + 5) + \" \" + (cSer.chartObj.canvasY + whiskerpath[0].Y - 5) + \" \" + \"z\" :\r\n \"M\" + \" \" + (cSer.chartObj.canvasX + whiskerpath[0].X - 5) + \" \" + (cSer.chartObj.canvasY + rect.Y + (rect.Height / 2) - 5) + \" L \" + (cSer.chartObj.canvasX + whiskerpath[0].X + 5) + \" \" + (cSer.chartObj.canvasY + rect.Y + (rect.Height / 2) + 5) + \" M \" + (cSer.chartObj.canvasX + whiskerpath[0].X + 5) + \" \" + (cSer.chartObj.canvasY + rect.Y + (rect.Height / 2) - 5) + \" L \" + (cSer.chartObj.canvasX + whiskerpath[0].X - 5) + \" \" + (cSer.chartObj.canvasY + rect.Y + (rect.Height / 2) + 5) + \" \" + \"z\";\r\n\r\n\r\n return { upperWhisker: plotupperwhisker, lowerWhisker: plotlowerwhisker, mean: meanPath };\r\n },\r\n calculateSides: function (point, sidebysideinfo) {\r\n var x1 = point.xValue + sidebysideinfo.Start;\r\n var x2 = point.xValue + sidebysideinfo.End;\r\n return { x1: x1, x2: x2 };\r\n },\r\n _getSeriesPosition: function (currentSeries) {\r\n // calculation for position of series in radar and polar.\r\n if (ej.util.isNullOrUndefined(currentSeries.position) || this.chartObj.model.legendCollapsed) {\r\n var stacked;\r\n var stackingposition\r\n var all = 0;\r\n var seriesCollection = [];\r\n for (var i = 0; i < this.chartObj.model._visibleSeries.length; i++) {\r\n var series = this.chartObj.model._visibleSeries[i];\r\n if (series.visibility.toLowerCase() === 'visible' && series.drawType.toLowerCase() == 'column' || (series.drawType.toLowerCase() == 'rangecolumn')) {\r\n seriesCollection.push(series);\r\n }\r\n }\r\n for (var j = 0; j < seriesCollection.length; j++) {\r\n var series = seriesCollection[j];\r\n if (series._xAxisName == this.chartObj.model._axes[0].name && series._yAxisName == this.chartObj.model._axes[1].name) {\r\n if (series.isStacking) {\r\n if (!stacked) {\r\n stackingposition = all;\r\n all++;\r\n stacked = true;\r\n }\r\n series.position = stackingposition;\r\n }\r\n else {\r\n series.position = all;\r\n all++;\r\n }\r\n }\r\n }\r\n for (var k = 0; k < seriesCollection.length; k++)\r\n seriesCollection[k].all = all;\r\n\r\n }\r\n return { all: currentSeries.all, pos: currentSeries.position };\r\n },\r\n getSideBySidePositions: function (currentSeries, params) {\r\n\r\n var chart = this,\r\n stackingGroup = [],\r\n model = chart.chartObj.model,\r\n vAxeseries, i, j, k, visibleSeriesLength;\r\n i = j = k = 0;\r\n visibleSeriesLength = model._visibleSeries.length;\r\n //Spacing not calculated during resize event because position value in series is not null or undefined\t\t \r\n if (ej.util.isNullOrUndefined(currentSeries.position) || model.legendCollapsed || !params.spacingCalculated) {\r\n var hAxes = (model.requireInvertedAxes) ? model.vAxes : model.hAxes;\r\n var vAxes = (model.requireInvertedAxes) ? model.hAxes : model.vAxes;\r\n\r\n $.each(hAxes, function (index, hAxis) {\r\n var all = 0, seriesCollection = [];\r\n vAxeseries = [];\r\n for (j = 0; j < visibleSeriesLength; j++) {\r\n var series = model._visibleSeries[j];\r\n if (series.visibility.toLowerCase() === 'visible') {\r\n if (chart.isDependentSeries(series)) {\r\n if (hAxis.name == series._xAxisName) {\r\n seriesCollection.push(series);\r\n }\r\n }\r\n }\r\n }\r\n var seriesCollectionLength = seriesCollection.length;\r\n for (j = 0; j < seriesCollectionLength; j++) {\r\n var index = (model.requireInvertedAxes) ? seriesCollection[j].yAxis.columnIndex : seriesCollection[j].yAxis.rowIndex;\r\n if (!vAxeseries[index]) {\r\n vAxeseries[index] = [];\r\n seriesCollection[j].yAxis.position = null;\r\n }\r\n vAxeseries[index].push(seriesCollection[j]);\r\n }\r\n\r\n for (i = 0; i < vAxeseries.length; i++) {\r\n if (!ej.util.isNullOrUndefined(vAxeseries[i])) {\r\n vAxeseries[i].all = 0;\r\n for (j = 0; j < vAxeseries[i].length; j++) {\r\n series = vAxeseries[i][j];\r\n if (series.type.toLowerCase().indexOf(\"stacking\") != -1) {\r\n if (series.stackingGroup) {\r\n if (ej.util.isNullOrUndefined(stackingGroup[series.stackingGroup])) {\r\n vAxeseries[i].all++;\r\n series.position = vAxeseries[i].all;\r\n stackingGroup[series.stackingGroup] = vAxeseries[i].all;\r\n }\r\n else\r\n series.position = stackingGroup[series.stackingGroup];\r\n }\r\n else {\r\n if (ej.util.isNullOrUndefined(series.yAxis.position) || model.legendCollapsed) {\r\n vAxeseries[i].all++;\r\n series.position = vAxeseries[i].all;\r\n series.yAxis.position = vAxeseries[i].all;\r\n model.legendCollapsed = false;\r\n }\r\n else\r\n series.position = series.yAxis.position;\r\n }\r\n }\r\n else {\r\n vAxeseries[i].all++;\r\n series.position = vAxeseries[i].all;\r\n }\r\n }\r\n }\r\n }\r\n var columnWidth = seriesCollectionLength > 0 && seriesCollection[0].columnWidth;\r\n for (k = 0; k < seriesCollectionLength; k++) {\r\n var index = (model.requireInvertedAxes) ? seriesCollection[k].yAxis.columnIndex : seriesCollection[k].yAxis.rowIndex;\r\n seriesCollection[k].all = vAxeseries[index].all;\r\n params.needSpace = params.needSpace || columnWidth != seriesCollection[k].columnWidth\r\n }\r\n\r\n });\r\n if (params.needSpace && this.chartObj.model._sideBySideSeriesPlacement)\r\n this._getColumnSpacing(vAxeseries, params);\r\n params.spacingCalculated = true;\r\n }\r\n return { all: currentSeries.all, pos: currentSeries.position };\r\n },\r\n\r\n getSideBySideInfo: function (series, params) {\r\n if (ej.util.isNullOrUndefined(series.xAxis.m_minPointsDelta)) {\r\n this.chartObj.currentSeries = series;\r\n series.xAxis.m_minPointsDelta = ej.EjSvgRender.utils.getMinPointsDelta(series.xAxis, this.chartObj);\r\n }\r\n var spacing = series.columnSpacing,\r\n columnWidth = series.columnWidth,\r\n data = this.getSideBySidePositions(series, params),\r\n pos = data.pos,\r\n all = data.all,\r\n needSpace = params.needSpace && this.chartObj.model._sideBySideSeriesPlacement,\r\n width = series.xAxis.m_minPointsDelta * (needSpace ? 1 : columnWidth),\r\n loc = needSpace ? params[series.name || series._name].loc : (pos - 1) / all - 0.5,\r\n range = this.getDoubleRange(loc, loc + (needSpace ? columnWidth : 1) / all);\r\n if (!this.chartObj.model._sideBySideSeriesPlacement)\r\n return this.getDoubleRange(-width / 2, width / 2);\r\n\r\n\r\n // multiplying with width and scaling\r\n if (!range.IsEmpty) {\r\n range = this.getDoubleRange(range.Start * width, range.End * width);\r\n var radius = spacing * range.Delta;\r\n range = this.getDoubleRange(range.Start + radius / 2, range.End - radius / 2);\r\n }\r\n return range;\r\n },\r\n\r\n _getColumnSpacing: function (axesSeries, params) {\r\n var i = j = 0, length, len, series, name;\r\n for (len = axesSeries.length; i < len; i++) {\r\n var width = 0, stackingSeries = [], group = {};\r\n for (length = axesSeries[i].length; j < length; j++)\r\n if ((series = axesSeries[i][j]).type.toLowerCase().indexOf(\"stacking\") == -1)\r\n width += series.columnWidth / series.all;\r\n else\r\n group[name = series.stackingGroup] = { width: Math.max(series.columnWidth, group[name] ? group[name].width : 0), all: series.all }\r\n for (var key in group)\r\n width += group[key].width / group[key].all;\r\n\r\n var start = (1 - width) / 2 - .5;\r\n for (j = 0, length = axesSeries[i].length; j < length; j++) {\r\n if ((series = axesSeries[i][j]).type.toLowerCase().indexOf(\"stacking\") == -1) {\r\n params[series.name || (series._name = \"series\" + i + j)] = { loc: start };\r\n start += series.columnWidth / series.all;\r\n }\r\n else {\r\n if (group[name = series.stackingGroup].loc == null) {\r\n params[series.name || (series._name = \"series\" + i + j)] = { loc: start + (group[name].width - series.columnWidth) / 2 / series.all };\r\n group[name].loc = params[series.name || series._name].loc + series.columnWidth / 2 / series.all;\r\n start += group[name].width / series.all;\r\n }\r\n else\r\n params[series.name || series._name] = { loc: group[name].loc - series.columnWidth / 2 / series.all };\r\n }\r\n }\r\n }\r\n },\r\n\r\n _getPoint: function (point, xLength, yLength, xRange, xInversed, yRange, yInversed) {\r\n\r\n var x = point.xValue,\r\n y = point.YValues[0];\r\n\r\n x = (x - xRange.min) / (xRange.delta);\r\n y = (y - yRange.min) / (yRange.delta);\r\n\r\n return { X: (!xInversed ? x : 1 - x) * xLength, Y: (1 - (!yInversed ? y : 1 - y)) * yLength };\r\n },\r\n\r\n _getLogPoint: function (point, xLength, yLength, xRange, xInversed, yRange, yInversed, series) {\r\n\r\n var x = point.xValue,\r\n y = point.YValues[0];\r\n if (series.xAxis._valueType.toLowerCase() == \"logarithmic\")\r\n x = (ej.EjSvgRender.utils._logBase((x == 0 ? 1 : x), series.xAxis.logBase) - xRange.min) / (xRange.delta);\r\n else\r\n x = (x - xRange.min) / (xRange.delta);\r\n\r\n if (series.yAxis._valueType.toLowerCase() == \"logarithmic\")\r\n y = (ej.EjSvgRender.utils._logBase((y == 0 ? 1 : y), series.yAxis.logBase) - yRange.min) / (yRange.delta);\r\n else\r\n y = (y - yRange.min) / (yRange.delta);\r\n\r\n return { X: (!xInversed ? x : 1 - x) * xLength, Y: (1 - (!yInversed ? y : 1 - y)) * yLength };\r\n },\r\n\r\n _getTransposedPoint: function (point, xLength, yLength, xRange, xInversed, yRange, yInversed) {\r\n\r\n var x = point.xValue,\r\n y = point.YValues[0];\r\n\r\n x = (x - xRange.min) / xRange.delta;\r\n y = (y - yRange.min) / yRange.delta;\r\n\r\n return { X: (!yInversed ? y : 1 - y) * yLength, Y: (1 - (!xInversed ? x : 1 - x)) * xLength };\r\n },\r\n\r\n _getTransposedLogPoint: function (point, xLength, yLength, xRange, xInversed, yRange, yInversed, series) {\r\n\r\n var x = point.xValue,\r\n y = point.YValues[0];\r\n\r\n if (series.xAxis._valueType.toLowerCase() == \"logarithmic\")\r\n x = (ej.EjSvgRender.utils._logBase((x == 0 ? 1 : x), series.xAxis.logBase) - xRange.min) / (xRange.delta);\r\n else\r\n x = (x - xRange.min) / (xRange.delta);\r\n\r\n if (series.yAxis._valueType.toLowerCase() == \"logarithmic\")\r\n y = (ej.EjSvgRender.utils._logBase((y == 0 ? 1 : y), series.yAxis.logBase) - yRange.min) / (yRange.delta);\r\n else\r\n y = (y - yRange.min) / (yRange.delta);\r\n\r\n return { X: (!yInversed ? y : 1 - y) * yLength, Y: (1 - (!xInversed ? x : 1 - x)) * xLength };\r\n },\r\n\r\n draw: function (chart, options, excludeDataUpdate) {\r\n\r\n //DrawLineGraph\r\n var lDirection, sb = ej.EjSvgRender.utils._getStringBuilder(),\r\n visiblePoints, limit, i, pathOptions,\r\n firstPoint, secondPoint, firstIndex,\r\n point1, point2, canvasX = chart.canvasX, canvasY = chart.canvasY,\r\n seriesIndex, nextPoint, context,\r\n previousStyle, styleOptions, point,\r\n requireInvertedAxes = chart.model.requireInvertedAxes,\r\n count = 0, isCanvas = chart.model.enableCanvasRendering,\r\n chartObj = chart, trans,\r\n isLog = options.xAxis._valueType.toLowerCase() == \"logarithmic\" || options.yAxis._valueType.toLowerCase() == \"logarithmic\",\r\n isTransposed = options._isTransposed,\r\n xLength = isTransposed ? options.xAxis.height : options.xAxis.width,\r\n yLength = isTransposed ? options.yAxis.width : options.yAxis.height,\r\n xRange = options.xAxis.visibleRange, yRange = options.yAxis.visibleRange,\r\n xInversed = options.xAxis.isInversed, yInversed = options.yAxis.isInversed,\r\n style, getPoint = this[\"_get\" + (isTransposed ? \"Transposed\" : \"\") + (isLog ? \"Log\" : \"\") + \"Point\"];\r\n\r\n this.chartObj = chart;\r\n style = this.setLineSeriesStyle(options);\r\n options._animationType = \"path\";\r\n if (options.sorting)\r\n options.points = ej.DataManager(options.points, ej.Query().sortBy(\"xValue\")).executeLocal();\r\n options._visiblePoints = undefined;\r\n visiblePoints = this.improveChartPerformance(options);\r\n\r\n limit = { min: 0, max: visiblePoints.length };\r\n if (!options.pointFill) {\r\n if (isCanvas) {\r\n context = chart.svgRenderer.ctx;\r\n context.save();\r\n context.beginPath();\r\n if (chart.model.AreaType == \"cartesianaxes\") {\r\n trans = ej.EjSvgRender.utils._getTransform(options.xAxis, options.yAxis, requireInvertedAxes);\r\n trans = 'translate(' + trans.x + ',' + trans.y + ')'\r\n }\r\n styleOptions = {\r\n 'stroke-dasharray': options.dashArray,\r\n 'stroke-width': options.width,\r\n 'stroke': style.SeriesInterior,\r\n 'stroke-linecap': options.lineCap,\r\n 'stroke-linejoin': options.lineJoin,\r\n 'opacity': options.opacity\r\n };\r\n chart.svgRenderer._setLinePathStyle(styleOptions, trans);\r\n }\r\n firstPoint = null;\r\n secondPoint;\r\n firstIndex = -1;\r\n for (i = limit.min; i < limit.max; i++) {\r\n secondPoint = visiblePoints[i];\r\n if (secondPoint.visible !== false) {\r\n if (firstPoint != null && visiblePoints.length > firstIndex + 1) {\r\n nextpoint = visiblePoints[firstIndex + 1];\r\n point1 = getPoint(firstPoint, xLength, yLength, xRange, xInversed, yRange, yInversed, options);\r\n point2 = getPoint(nextpoint, xLength, yLength, xRange, xInversed, yRange, yInversed, options);\r\n if (isCanvas) {\r\n context.moveTo(point1.X + canvasX, point1.Y + canvasY);\r\n context.lineTo(point2.X + canvasX, point2.Y + canvasY);\r\n }\r\n else\r\n sb.append(\"M \" + (point1.X + canvasX) + \" \" + (point1.Y + canvasY) + \" L \" + (point2.X + canvasX) + \" \" + (point2.Y + canvasY) + \" \");\r\n }\r\n firstPoint = secondPoint;\r\n firstIndex = i;\r\n }\r\n else\r\n firstPoint = null;\r\n }\r\n if (isCanvas) {\r\n context.stroke();\r\n context.restore();\r\n }\r\n else\r\n this._drawLinePath(options, style, sb.toString());\r\n }\r\n\r\n else {\r\n seriesIndex = $.inArray(options, this.chartObj.model._visibleSeries),\r\n length = visiblePoints.length - 1;\r\n\r\n trans = ej.EjSvgRender.utils._getTransform(options.xAxis, options.yAxis, requireInvertedAxes);\r\n\r\n canvasX = chartObj.canvasX, canvasY = chartObj.canvasY,\r\n\r\n serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': 'translate(' + trans.x + ',' + trans.y + ')' };\r\n\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n\r\n for (i = 0; i < length; i++) {\r\n point = visiblePoints[i];\r\n nextpoint = visiblePoints[i + 1];\r\n\r\n if (!previousStyle)\r\n previousStyle = this.chartObj.setStyle(this, options, seriesIndex, i, undefined, visiblePoints);\r\n\r\n if (nextpoint.visible && point.visible) {\r\n point1 = ej.EjSvgRender.utils._getPoint(point, options);\r\n\r\n point2 = ej.EjSvgRender.utils._getPoint(nextpoint, options);\r\n\r\n sb.append(\"M\" + \" \" + (point1.X + canvasX) + \" \" + ((point1.Y + canvasY)) + \" \" + \"L\" + \" \" + (point2.X + canvasX) + \" \" + ((point2.Y + canvasY)) + \" \");\r\n }\r\n\r\n styleOptions = this.chartObj.setStyle(this, options, seriesIndex, i + 1, undefined, visiblePoints);\r\n\r\n if (styleOptions.interior == previousStyle.interior && (i != length - 1) && nextpoint.visible)\r\n continue;\r\n\r\n pathOptions = {\r\n 'name': options.type,\r\n 'id': this.chartObj.svgObject.id + '_Series' + seriesIndex + '_Point' + (count++),\r\n 'stroke-dasharray': previousStyle.dashArray,\r\n 'fill': \"none\",\r\n 'stroke-width': previousStyle.width,\r\n 'stroke-linecap': options.lineCap,\r\n 'stroke-linejoin': options.lineJoin,\r\n 'stroke': previousStyle.interior,\r\n 'opacity': previousStyle.opacity,\r\n 'd': sb.toString()\r\n };\r\n\r\n this.chartObj.svgRenderer.drawPath(pathOptions, this.gSeriesGroupEle);\r\n sb = ej.EjSvgRender.utils._getStringBuilder();\r\n previousStyle = styleOptions;\r\n }\r\n }\r\n if (this.chartObj.dragPoint)\r\n this.chartObj.svgRenderer.append(this.chartObj.gPreviewSeriesGroupEle, this.chartObj.gSeriesEle);\r\n else\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n //Calculate visible points for points with data label\r\n if (options._dataLabels > 0 || options.marker && options.marker.dataLabel.visible == true && options.enableSmartLabels)\r\n options._visiblePoints = this._isVisiblePoints(options);\r\n else //Use sampled data points if data labels are not visible \r\n options._visiblePoints = visiblePoints;\r\n },\r\n\r\n doCircularAnimation: function (chartObj, series, seriesType, seriesIndex, duration) {\r\n var type = series.type.toLowerCase();\r\n if (type == \"pie\" || type == \"doughnut\" || type == \"pieofpie\") {\r\n var seriesRender = this, startAngle, endAngle,\r\n angle = (series.points[0]) ? series.points[0].startAngle : 0;\r\n var collectionIndex = chartObj.model._isPieOfPie ? series.collectionIndex : 0,\r\n visiblePoints = series.emptyPointSettings.visible ? series.visiblePoints : series._visiblePoints;\r\n duration = !ej.util.isNullOrUndefined(duration) ? duration : 1200;\r\n $.each(visiblePoints, function (pointIndex, point) {\r\n startAngle = point.startAngle;\r\n endAngle = point.endAngle;\r\n chartObj.model._radius = chartObj.model._isPieOfPie ? chartObj.model.circularRadius[collectionIndex] : chartObj.model.circularRadius[seriesIndex];\r\n point.startAngle = 0;\r\n point.endAngle = point.startAngle;\r\n chartObj.model.Radius = 0;\r\n var piePath = $(chartObj.gSeriesEle).find(\"#\" + chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex)[collectionIndex].childNodes[pointIndex];\r\n if (type == \"pie\" || type == \"pieofpie\") {\r\n $(piePath).each(function () { this.StartAngle = angle, this.EndAngle = angle; }).animate(\r\n { StartAngle: startAngle, EndAngle: endAngle, pieRadius: chartObj.model._radius },\r\n {\r\n duration: duration, queue: false, step: function (now, fx) {\r\n if (fx.prop.toString() === \"StartAngle\") {\r\n point.startAngle = now;\r\n point.endAngle = point.startAngle;\r\n }\r\n else if (fx.prop.toString() == \"pieRadius\" && chartObj.model)\r\n chartObj.model.Radius = now;\r\n else\r\n point.endAngle = now;\r\n if (chartObj.model) {\r\n var result = seriesRender._calculateArcData(chartObj, pointIndex, point, series, seriesIndex, collectionIndex);\r\n chartObj.svgRenderer._setAttr($(piePath), { \"d\": result.Direction });\r\n chartObj.model.Radius = chartObj.model._radius;\r\n }\r\n },\r\n complete: function () {\r\n seriesRender.circularAnimationComplete(pointIndex, chartObj, series);\r\n }\r\n });\r\n }\r\n else {\r\n $(piePath).each(function () { this.StartAngle = angle, this.EndAngle = angle; }).animate(\r\n { StartAngle: startAngle, EndAngle: endAngle },\r\n {\r\n duration: duration, queue: false, step: function (now, fx) {\r\n if (fx.prop.toString() === \"StartAngle\") {\r\n point.startAngle = now;\r\n point.endAngle = point.startAngle;\r\n }\r\n else\r\n point.endAngle = now;\r\n if (chartObj.model) {\r\n var result = seriesRender._calculateArcData(chartObj, pointIndex, point, series, seriesIndex);\r\n chartObj.svgRenderer._setAttr($(piePath), { \"d\": result.Direction });\r\n chartObj.model.Radius = chartObj.model._radius;\r\n }\r\n },\r\n complete: function () {\r\n seriesRender.circularAnimationComplete(pointIndex, chartObj, series);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n },\r\n circularAnimationComplete: function (pointIndex, chartObj, series) {\r\n if (!ej.util.isNullOrUndefined(chartObj.model)) {\r\n var commonEventArgs, i, seriesIndex = $.inArray(series, chartObj.model._visibleSeries), elements;\r\n if (chartObj.gSeriesTextEle[seriesIndex])\r\n chartObj.svgRenderer._setAttr($(chartObj.gSeriesEle).find(\"#\" + chartObj.gSeriesTextEle[seriesIndex].id), { \"visibility\": \"visible\" });\r\n if (chartObj.gSymbolGroupEle[seriesIndex])\r\n chartObj.svgRenderer._setAttr($(chartObj.gSeriesEle).find(\"#\" + chartObj.gSymbolGroupEle[seriesIndex].id), { \"visibility\": \"visible\" });\r\n if (chartObj.gDataLabelEle[seriesIndex])\r\n chartObj.svgRenderer._setAttr($(chartObj.gSeriesEle).find(\"#\" + chartObj.gDataLabelEle[seriesIndex].id), { \"visibility\": \"visible\" });\r\n if (series.marker.dataLabel.template) {\r\n elements = $(chartObj.element[0].childNodes[0].childNodes);\r\n for (i = 0; i < elements.length; i++)\r\n $(elements[i]).css('display', 'block');\r\n }\r\n if (chartObj.gConnectorEle[seriesIndex])\r\n chartObj.svgRenderer._setAttr($(chartObj.gSeriesEle).find(\"#\" + chartObj.gConnectorEle[seriesIndex].id), { \"visibility\": \"visible\" });\r\n if (chartObj.gConnectorLinesGroup)\r\n chartObj.svgRenderer._setAttr($(chartObj.gSeriesEle).find(\"#\" + chartObj.gConnectorLinesGroup.id), { \"visibility\": \"visible\" });\r\n chartObj.model.AnimationComplete = true;\r\n series.AnimationComplete = true;\r\n commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { series: series };\r\n chartObj._trigger(\"animationComplete\", commonEventArgs);\r\n }\r\n },\r\n\r\n _doLineSymbol: function (element, sec, val, series, invertedAxes, chartobj, duration) {\r\n if (element.tagName != \"defs\") {\r\n var beginTime = parseInt(val * sec),\r\n chartObj = (this.chartObj == undefined) ? chartobj : this.chartObj,\r\n box = ej.EjSvgRender.utils._getBoundingClientRect(element, chartObj, series, invertedAxes),\r\n centerX = box.x + (box.width / 2),\r\n centerY = box.y + (box.height / 2),\r\n scaleVal, $ele = $(element),\r\n rotate = chartObj.svgRenderer._getAttrVal($ele, \"transform\");\r\n rotate = !ej.util.isNullOrUndefined(rotate) ? rotate : \" \";\r\n chartObj.svgRenderer._setAttr($ele, { \"transform\": \"scale(0)\" });\r\n $ele.delay(beginTime).animate(\r\n {\r\n scales: 1\r\n },\r\n {\r\n duration: duration,\r\n step: function (now) {\r\n scaleVal = now;\r\n chartObj.svgRenderer._setAttr($ele, { \"transform\": \"translate(\" + centerX + \" \" + centerY + \") scale(\" + scaleVal + \") translate(\" + (-centerX) + \" \" + (-centerY) + \")\" + rotate });\r\n\r\n }\r\n }\r\n );\r\n }\r\n },\r\n animateSymbol: function (element, delayInterval, series, invertedAxes, chartobj, duration) {\r\n if (element.tagName != \"defs\") {\r\n var chartObj = (this.chartObj == undefined) ? chartobj : this.chartObj,\r\n box = ej.EjSvgRender.utils._getBoundingClientRect(element, chartObj, series, invertedAxes),\r\n centerX = box.x + (box.width / 2),\r\n centerY = box.y + (box.height / 2),\r\n scaleVal, $ele = $(element),\r\n rotate = chartObj.svgRenderer._getAttrVal($ele, \"transform\");\r\n rotate = !ej.util.isNullOrUndefined(rotate) ? rotate : \" \";\r\n $ele.delay(delayInterval).each(function () { this.scale = 0.5; }).animate(\r\n {\r\n scales: 1\r\n },\r\n {\r\n duration: duration,\r\n step: function (now) {\r\n scaleVal = now;\r\n chartObj.svgRenderer._setAttr($ele, { \"transform\": \"translate(\" + centerX + \" \" + centerY + \") scale(\" + scaleVal + \") translate(\" + (-centerX) + \" \" + (-centerY) + \")\" + (rotate) });\r\n }\r\n }\r\n );\r\n }\r\n },\r\n animateCylinder: function (chartObj, series, invertedAxes, clipRect, duration) {\r\n if (series.isTransposed && invertedAxes) {\r\n var width = clipRect[0].width.animVal.value\r\n if (chartObj.model.series[0].type.indexOf(\"bar\") > -1) {\r\n chartObj.svgRenderer._setAttr($(clipRect), { \"x\": width });\r\n $(clipRect).animate({\r\n x: 0,\r\n }, duration, function () {\r\n });\r\n }\r\n else {\r\n var height = clipRect[0].height.animVal.value;\r\n chartObj.svgRenderer._setAttr($(clipRect), { \"y\": 0 });\r\n $(clipRect).animate(\r\n {\r\n y: parseFloat(chartObj.svgRenderer._getAttrVal(clipRect, \"y\")),\r\n height: parseFloat(chartObj.svgRenderer._getAttrVal(clipRect, \"height\"))\r\n },\r\n {\r\n duration: duration,\r\n step: function (now) {\r\n chartObj.svgRenderer._setAttr($(clipRect), { \"y\": height - now });\r\n chartObj.svgRenderer._setAttr($(clipRect), { \"height\": now });\r\n }\r\n });\r\n }\r\n }\r\n else {\r\n if (chartObj.model.series[0].type.indexOf(\"bar\") > -1) {\r\n $(clipRect).animate(\r\n {\r\n width: parseFloat(chartObj.svgRenderer._getAttrVal(clipRect, \"width\"))\r\n },\r\n {\r\n duration: duration,\r\n step: function (now) {\r\n chartObj.svgRenderer._setAttr($(clipRect), { \"width\": now });\r\n }\r\n });\r\n }\r\n else {\r\n var height = clipRect[0].height.animVal.value;\r\n chartObj.svgRenderer._setAttr($(clipRect), { \"y\": height });\r\n $(clipRect).animate({\r\n\r\n y: 0,\r\n }, duration, function () {\r\n });\r\n }\r\n }\r\n },\r\n animateRect: function (element, series, invertedAxes, chartObj, duration) {\r\n var animationType = series.animationType.toLowerCase();\r\n var box = ej.EjSvgRender.utils._getBoundingClientRect(\r\n animationType == \"smooth\" ? element[0] : element, chartObj, series, invertedAxes\r\n ), centerX, centerY, scale1, scale2, scaleVal, $element = $(element), size, isBar;\r\n if ((series.isTransposed && invertedAxes) || invertedAxes) {\r\n size = animationType == \"smooth\" ? parseFloat(chartObj.svgRenderer._getAttrVal(element, \"width\")) : 0;\r\n isBar = true;\r\n if (chartObj.svgRenderer._getAttrVal($element, \"plot\") === \"negative\") {\r\n centerX = box.x + box.width;\r\n centerY = box.y + box.height;\r\n } else {\r\n centerX = box.x;\r\n centerY = box.y;\r\n }\r\n scale1 = \") scale(\";\r\n scale2 = \",1) translate(\";\r\n }\r\n else {\r\n size = animationType == \"smooth\" ? parseFloat(chartObj.svgRenderer._getAttrVal(element, \"height\")) : 0;\r\n isBar = false;\r\n if (chartObj.svgRenderer._getAttrVal($element, \"plot\") === \"negative\") {\r\n centerX = box.x;\r\n centerY = box.y;\r\n }\r\n else {\r\n centerX = (box.x + box.width);\r\n centerY = (box.y + box.height);\r\n }\r\n scale1 = \") scale(1,\";\r\n scale2 = \") translate(\";\r\n }\r\n var diff = Math.abs(\r\n ej.EjSvgRender.utils._getPointXY(\r\n series.yAxis.visibleRange.min < 0 ? 0 : series.yAxis.visibleRange.min, series.yAxis.visibleRange, series.yAxis.isInversed\r\n ) * (isBar ? series.yAxis.width : series.yAxis.height)\r\n );\r\n\r\n $element.animate(\r\n {\r\n scales: animationType == \"smooth\" ? size : 1\r\n },\r\n {\r\n duration: duration,\r\n complete: function () {\r\n if (series.type.toLowerCase() == \"waterfall\")\r\n $(\"#\" + chartObj.svgObject.id + '_SeriesGroup' + '_waterfallLine_' + series.index).attr(\"visibility\", \"visible\");\r\n },\r\n step: function (now) {\r\n scaleVal = now;\r\n if (animationType == \"smooth\") {\r\n if (now) {\r\n isBar ? chartObj.svgRenderer._setAttr($element, {\r\n 'width': (diff + now) >= size ? size : now\r\n }) : chartObj.svgRenderer._setAttr($element, {\r\n 'height': now\r\n });\r\n }\r\n isBar ? chartObj.svgRenderer._setAttr($element, { 'x': (diff + now) >= size ? (size  - now) : diff }) :\r\n chartObj.svgRenderer._setAttr($element, { 'y': (size - diff - now) >= 0 ? (size - diff - now) : 0 });\r\n } else {\r\n chartObj.svgRenderer._setAttr($element, { \"transform\": \"translate(\" + centerX + \" \" + centerY + scale1 + scaleVal + scale2 + (-centerX) + \" \" + (-centerY) + \")\" });\r\n }\r\n }\r\n });\r\n },\r\n animateStackingRect: function (element, series, invertedAxes, chartObj, duration) {\r\n var centerX, centerY, scale1, scale2, $element = $(element), boxX, boxY, scaleVal,\r\n box = ej.EjSvgRender.utils._getBoundingClientRect(element, chartObj, series, invertedAxes);\r\n if ((series.isTransposed && invertedAxes) || invertedAxes) {\r\n boxX = (ej.EjSvgRender.utils._valueToCoefficient(series.yAxis, 0)) * (series.yAxis.width);\r\n centerX = boxX;\r\n centerY = box.y;\r\n scale1 = \") scale(\";\r\n scale2 = \",1) translate(\";\r\n }\r\n else {\r\n boxY = (1 - ej.EjSvgRender.utils._valueToCoefficient(series.yAxis, 0)) * (series.yAxis.height);\r\n centerX = box.x;\r\n centerY = boxY;\r\n scale1 = \") scale(1,\";\r\n scale2 = \") translate(\";\r\n }\r\n $element.animate(\r\n {\r\n scales: 1\r\n },\r\n {\r\n duration: duration,\r\n\r\n step: function (now) {\r\n scaleVal = now;\r\n chartObj.svgRenderer._setAttr($element, { \"transform\": \"translate(\" + centerX + \" \" + centerY + scale1 + scaleVal + scale2 + (-centerX) + \" \" + (-centerY) + \")\" });\r\n }\r\n });\r\n },\r\n _doLineAnimation: function (chartObj, clipRect, duration) {\r\n var duration = !ej.util.isNullOrUndefined(duration) ? duration : 2000;\r\n if (chartObj.model.requireInvertedAxes) {\r\n var height = parseFloat(chartObj.svgRenderer._getAttrVal(clipRect, \"height\"));\r\n //Animation for transposed series is working from top to bottom instead of bottom to top\r\n //In some scenario, series is not appearing because clip rect location gets changed\r\n //chartObj.svgRenderer._setAttr($(clipRect), { \"y\": height });\r\n $(clipRect).animate(\r\n {\r\n //y: parseFloat(chartObj.svgRenderer._getAttrVal(clipRect, \"y\")),\r\n clipRectHeight: parseFloat(chartObj.svgRenderer._getAttrVal(clipRect, \"height\"))\r\n },\r\n {\r\n duration: duration,\r\n step: function (now) {\r\n chartObj.svgRenderer._setAttr($(clipRect), { \"y\": height - now });\r\n chartObj.svgRenderer._setAttr($(clipRect), { \"height\": now });\r\n }\r\n });\r\n }\r\n else {\r\n $(clipRect).animate(\r\n {\r\n clipRectWidth: parseFloat(chartObj.svgRenderer._getAttrVal(clipRect, \"width\"))\r\n },\r\n {\r\n duration: duration,\r\n step: function (now) {\r\n chartObj.svgRenderer._setAttr($(clipRect), { \"width\": now });\r\n }\r\n });\r\n }\r\n },\r\n\r\n _drawLinePath: function (series, style, direction) {\r\n var requireInvertedAxes = this.chartObj.model.requireInvertedAxes;\r\n var trans;\r\n var seriesIndex = $.inArray(series, this.chartObj.model._visibleSeries);\r\n var translate = null;\r\n if (this.chartObj.model.AreaType == \"cartesianaxes\") {\r\n trans = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, requireInvertedAxes);\r\n translate = 'translate(' + trans.x + ',' + trans.y + ')'\r\n }\r\n\r\n var serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': translate };\r\n this.chartObj.gSeriesGroupEle = this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n if (direction != \"\" && direction.indexOf(\"NaN\") == -1) {\r\n var options = {\r\n\r\n 'id': this.chartObj.svgObject.id + \"_Series\" + seriesIndex,\r\n 'fill': 'none',\r\n 'stroke-dasharray': series.dashArray,\r\n 'stroke-width': series.width,\r\n 'stroke': style.SeriesInterior,\r\n 'stroke-linecap': series.lineCap,\r\n 'stroke-linejoin': series.lineJoin,\r\n 'opacity': series.opacity,\r\n 'd': direction\r\n };\r\n if (this.chartObj.dragPoint) {\r\n options.id = this.chartObj.svgObject.id + \"_PreviewSeries\" + seriesIndex;\r\n options.opacity = 0.6;\r\n if (this.chartObj.model.enableCanvasRendering) this.chartObj.svgRenderer.drawPath(options, this.chartObj.canvasElement, translate);\r\n else this.chartObj.svgRenderer.drawPath(options, this.chartObj.gPreviewSeriesGroupEle);\r\n }\r\n else\r\n this.chartObj.svgRenderer.drawPath(options, this.gSeriesGroupEle);\r\n }\r\n\r\n\r\n },\r\n\r\n _applySaturation: function (chartObj, pointColor) {\r\n var format, color, rgbValue, contrast;\r\n format = ej.EjSvgRender.prototype.checkColorFormat(pointColor);\r\n if (!format)\r\n pointColor = chartObj.colorNameToHex(pointColor);\r\n rgbColorValue = ej.EjSvgRender.prototype.hexToRGB(pointColor);\r\n contrast = Math.round(((parseInt(rgbColorValue.R) * 299) + (parseInt(rgbColorValue.G) * 587) + (parseInt(rgbColorValue.B) * 114)) / 1000);\r\n color = (contrast >= 128) ? \"black\" : \"white\";\r\n return color;\r\n },\r\n\r\n\r\n\r\n drawDataLabel: function (series, index, point, x, y, chartRegionIndex, params, outlier) {\r\n // method for data label symbols - cartesianaxes\r\n point.marker = point.marker ? point.marker : {};\r\n var labelFormat = series.yAxis.labelFormat, labelPrecision, labelPrecisionDefault = 6, labelPrecisionHighest = 20,\r\n valueType = series.yAxis.valueType, pointText,\r\n boxPlotLabels = series._visiblePoints[index].boxPlotValues,\r\n value = (series.type.toLowerCase() == \"waterfall\" && (point.showIntermediateSum || point.showTotalSum)) ? point.waterfallSum : point.y;\r\n if (point.text)\r\n pointText = point.text;\r\n else if (labelFormat) {\r\n if (labelFormat.indexOf(\"{value}\") > -1)\r\n pointText = labelFormat.replace(\"{value}\", value);\r\n else if (labelFormat.indexOf('e') == 0 || labelFormat.indexOf('E') == 0) {\r\n labelPrecision = labelFormat.match(/(\\d+)/g);\r\n labelPrecision = labelPrecision == null ? labelPrecisionDefault : labelPrecision > labelPrecisionHighest ? labelPrecisionHighest : labelPrecision;\r\n pointText = value.toExponential(labelPrecision);\r\n }\r\n else pointText = ej.format(value, labelFormat, this.chartObj.model.locale);\r\n }\r\n else pointText = value;\r\n var chart = this.chartObj,\r\n chartModel = chart.model,\r\n seriesIndex = $.inArray(series, chartModel._visibleSeries),\r\n textAlign, element, fontBackgroundColor,\r\n textBaseline, symbolName,\r\n marker = $.extend(true, {}, series.marker, point.marker),\r\n dataLabel = marker.dataLabel, areaBounds = chartModel.m_AreaBounds,\r\n dataLabelFont = dataLabel.font,\r\n textPosition = dataLabel.textPosition.toLowerCase(),\r\n type = series.type.toLowerCase(), isCanvas = chartModel.enableCanvasRendering,\r\n regiontype = ej.seriesTypes[type].prototype.isRegion,\r\n size = ej.util.isNullOrUndefined(dataLabelFont.size) ? \"11px\" : dataLabelFont.size,\r\n fontStyle = ej.util.isNullOrUndefined(dataLabelFont.fontStyle) ? \"Normal\" : dataLabelFont.fontStyle,\r\n fontFamily = ej.util.isNullOrUndefined(dataLabelFont.fontFamily) ? \"Segoe UI\" : dataLabelFont.fontFamily,\r\n labelfont = { size: size, fontStyle: fontStyle, fontFamily: fontFamily },\r\n textOffset = ej.EjSvgRender.utils._measureText(pointText, null, labelfont),\r\n position = this.textPosition(series, seriesIndex, point, textOffset, type, x, y, chartRegionIndex, index, params),\r\n commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs), contrastColor = dataLabel.enableContrastColor,\r\n chartAreaBackground = chartModel.chartArea.background.toLowerCase(), chartBackground = chartModel.background.toLowerCase();\r\n commonEventArgs.data = { text: pointText, location: { x: position.x + chart.canvasX, y: position.y + chart.canvasY }, seriesIndex: seriesIndex, pointIndex: index };\r\n if (series.isStacking && series.drawType == \"area\" && ((series.type == \"polar\") || (series.type == \"radar\"))) {\r\n commonEventArgs.data.text = series.stackedValue.EndValues[index] - series.stackedValue.StartValues[index];\r\n }\r\n chart._trigger(\"displayTextRendering\", commonEventArgs);\r\n var dataLabelOffset = (marker.dataLabel.offset.y == undefined) ? marker.dataLabel.offset : marker.dataLabel.offset.y;\r\n var xval = marker.dataLabel.offset.x;\r\n var textOffset = ej.EjSvgRender.utils._measureText(commonEventArgs.data.text, null, labelfont);\r\n if (textPosition == 'bottom')\r\n commonEventArgs.data.location.y = commonEventArgs.data.location.y + dataLabelOffset;\r\n else\r\n commonEventArgs.data.location.y = commonEventArgs.data.location.y - dataLabelOffset;\r\n if (xval)\r\n commonEventArgs.data.location.x = commonEventArgs.data.location.x + xval;\r\n\r\n if (!commonEventArgs.cancel) {\r\n var options = {\r\n 'id': chart.svgObject.id + '_SeriesText' + index + seriesIndex,\r\n 'x': commonEventArgs.data.location.x,\r\n 'y': commonEventArgs.data.location.y,\r\n 'fill': dataLabelFont.color,\r\n 'font-size': dataLabelFont.size,\r\n 'font-family': dataLabelFont.fontFamily,\r\n 'font-style': dataLabelFont.fontStyle,\r\n 'font-weight': dataLabelFont.fontWeight,\r\n 'opacity': dataLabelFont.opacity,\r\n\r\n 'text-anchor': 'middle'\r\n };\r\n var margin = dataLabel.margin,\r\n width = textOffset.width + margin.left + margin.right,\r\n height = textOffset.height + margin.top + margin.bottom,\r\n location = { X: commonEventArgs.data.location.x, Y: commonEventArgs.data.location.y };\r\n\r\n if (ej.util.isNullOrUndefined(dataLabel.template)) {\r\n if (dataLabel.shape)\r\n element = dataLabel.shape;\r\n else\r\n element = \"None\";\r\n $.each(chartModel.symbolShape, function (name) {\r\n if (element.toLowerCase() == name.toLowerCase())\r\n symbolName = name;\r\n });\r\n\r\n var xXalue = commonEventArgs.data.location.x - (margin.left) / 2 + (margin.right) / 2,\r\n yValue = commonEventArgs.data.location.y - (margin.top) / 2 - (height / margin.top) + (margin.bottom) / 2,\r\n degree = dataLabel.angle,\r\n angle = (degree > 360) ? degree - 360 : (degree < -360) ? degree + 360 : degree;\r\n\r\n\r\n\r\n\r\n //For accurate placement of rotated data labels in canvas\r\n if (chartModel.enableCanvasRendering && (degree % 360 != 0)) {\r\n options.y -= textOffset.height / 4;\r\n options.baseline = 'middle';\r\n }\r\n\r\n if (dataLabel.showEdgeLabels) {\r\n xPos = isCanvas ? options.x - chart.canvasX : options.x;\r\n yPos = isCanvas ? options.y - chart.canvasY : options.y;\r\n textWidth = textOffset.width;\r\n textHeight = textOffset.height;\r\n var isLastLabelOut = (series._visiblePoints[series._visiblePoints.length-1] == point) && xPos + textWidth / 2 >= chart.model.m_AreaBounds.Width;\r\n if (xPos - textWidth / 2 < 0 || xPos < -textWidth / 2 || isLastLabelOut) {\r\n diff = xPos - textWidth / 2;\r\n options.x = xXalue = Math.abs(diff) + (!isLastLabelOut ? xPos + 10 : - 10);\r\n }\r\n else if (xPos + textWidth / 2 > areaBounds.textWidth || xPos + textWidth / 2 > areaBounds.textWidth + textWidth / 2) {\r\n diff = xPos - textWidth / 2;\r\n options.x = xXalue = areaBounds.textWidth - textWidth / 2 - 10;\r\n }\r\n if (yPos + textHeight / 2 > areaBounds.textHeight || yPos + textHeight / 2 > areaBounds.textHeight + textHeight / 2) {\r\n diff = yPos + textHeight / 2 - areaBounds.textHeight;\r\n yValue = yPos - diff - 10;\r\n options.y = yValue + 5;\r\n }\r\n else if (yPos - textHeight / 2 < 0 || yPos < -textHeight / 2) {\r\n diff = yPos - textHeight / 2;\r\n yValue += Math.abs(diff) + 10;\r\n options.y = yValue + 5;\r\n }\r\n }\r\n if (series._enableSmartLabels) {\r\n point.dataLabel = { textX: options.x, textY: options.y, x: xXalue, y: yValue, width: width, height: height }\r\n point.margin = { top: margin.top, bottom: margin.bottom }\r\n }\r\n // to get the point color for saturation\r\n pointColor = jQuery.type(chartModel.seriesColors[seriesIndex]) == \"array\" ?\r\n chartModel.seriesColors[seriesIndex][0].color : chartModel.seriesColors[seriesIndex];\r\n pointColor = point.fill ? jQuery.type(point.fill) == \"array\" ? point.fill[0].color : point.fill : pointColor;\r\n if (contrastColor) {\r\n fontBackgroundColor = !regiontype || textPosition == \"top\" ?\r\n (chartAreaBackground === \"transparent\" && chartBackground === \"transparent\") ? \"white\" : (chartAreaBackground != \"transparent\") ?\r\n chartAreaBackground : chartBackground : pointColor;\r\n options.fill = this._applySaturation(chart, fontBackgroundColor);\r\n }\r\n\r\n if (point.y == point.low && !(point.y === undefined && point.low === undefined)) //undefined condition checked for waterfall series sum value display\r\n {\r\n point.xPosLow = xXalue;\r\n point.yPosLow = yValue;\r\n point.widthLow = (symbolName == \"None\") ? textOffset.width : width;\r\n point.heightLow = (symbolName == \"None\") ? textOffset.height : height;\r\n point.textOptionsLow = options;\r\n point.textOptionsLow.angle = angle;\r\n point.drawTextLow = commonEventArgs.data.text;\r\n }\r\n else if (type.toLowerCase() == \"boxandwhisker\" && (boxPlotLabels.midvalue != point.y)) {\r\n var textOptionsBox = {\r\n 'id': chart.svgObject.id + '_SeriesText' + index + seriesIndex,\r\n 'x': ej.util.isNullOrUndefined(outlier) ? commonEventArgs.data.location.x : xXalue,\r\n 'y': ej.util.isNullOrUndefined(outlier) ? commonEventArgs.data.location.y : yValue,\r\n 'fill': dataLabelFont.color,\r\n 'font-size': dataLabelFont.size,\r\n 'font-family': dataLabelFont.fontFamily,\r\n 'font-style': dataLabelFont.fontStyle,\r\n 'font-weight': dataLabelFont.fontWeight,\r\n 'opacity': dataLabelFont.opacity,\r\n\r\n 'text-anchor': 'middle',\r\n };\r\n var boxLabelCount = point.textOptionsBoxValues.length;\r\n\r\n point.textOptionsBoxValues[boxLabelCount] = textOptionsBox;\r\n if (angle != 0)\r\n point.textOptionsBoxValues[boxLabelCount].angle = angle;\r\n point.textOptionsBoxValues[boxLabelCount].drawText = commonEventArgs.data.text;\r\n point.textOptionsBoxValues[boxLabelCount].index = index;\r\n point.textOptionsBoxValues[boxLabelCount].xPos = ej.util.isNullOrUndefined(outlier) ? xXalue : xXalue - (margin.left) / 2 + (margin.right) / 2;\r\n point.textOptionsBoxValues[boxLabelCount].yPos = ej.util.isNullOrUndefined(outlier) ? yValue : yValue - (margin.top) / 2 - (height / margin.top) + (margin.bottom) / 2;\r\n point.textOptionsBoxValues[boxLabelCount].seriesIndex = seriesIndex;\r\n point.textOptionsBoxValues[boxLabelCount].width = (symbolName == \"None\") ? textOffset.width : width;\r\n point.textOptionsBoxValues[boxLabelCount].height = (symbolName == \"None\") ? textOffset.height : height;\r\n point.textOptionsBoxValues[boxLabelCount].symbolName = symbolName;\r\n\r\n }\r\n\r\n else {\r\n // storing the values in point\r\n point.textOptions = options;\r\n\r\n if (angle != 0)\r\n point.textOptions.angle = angle;\r\n point.drawText = commonEventArgs.data.text;\r\n point.index = index;\r\n point.xPos = xXalue;\r\n point.yPos = yValue;\r\n point.seriesIndex = seriesIndex;\r\n point.width = (symbolName == \"None\") ? textOffset.width : width;\r\n point.height = (symbolName == \"None\") ? textOffset.height : height;\r\n if (angle == 90 || angle == -90) //Swapping datalabel text height and width value\r\n point.width = [point.height, point.height = point.width][0];\r\n\r\n point.symbolName = symbolName;\r\n }\r\n }\r\n else {\r\n location.X -= chart.canvasX;\r\n location.Y -= chart.canvasY;\r\n this.drawLabelTemplate(series, point, index, location, chart);\r\n }\r\n // to test the datalabel whether it is placed inside / outside the region in column and bar series \r\n if ((type.indexOf(\"column\") > -1 || type.indexOf(\"bar\") > -1) && contrastColor) {\r\n var region = chart.model.chartRegions[chartRegionIndex];\r\n var group = params.stackingGroup;\r\n if (textPosition == \"top\" && type.indexOf(\"stacking\") > -1) {// to apply the saturation color for the datalabel in stacking column top position \r\n if (ej.util.isNullOrUndefined(series.stackingGroup) || series.stackingGroup == \"\") {\r\n if (seriesIndex < chartModel._visibleSeries.length - 1) {\r\n pointColor = jQuery.type(chartModel.seriesColors[seriesIndex + 1]) == \"array\" ?\r\n chartModel.seriesColors[seriesIndex + 1][0].color : chartModel.seriesColors[seriesIndex + 1];\r\n pointColor = point.fill ? jQuery.type(point.fill) == \"array\" ? point.fill[0].color : point.fill : pointColor;\r\n fontBackgroundColor = pointColor;\r\n }\r\n else\r\n fontBackgroundColor = (chartAreaBackground === \"transparent\" && chartBackground === \"transparent\") ?\r\n \"white\" : (chartAreaBackground != \"transparent\") ? chartAreaBackground : chartBackground;\r\n }\r\n else { // stacking along with grouping \r\n for (var key in group) {\r\n if (key == series.stackingGroup && seriesIndex < group[key].length - 1) {\r\n pointColor = jQuery.type(chartModel.seriesColors[seriesIndex + 1]) == \"array\" ?\r\n chartModel.seriesColors[seriesIndex + 1][0].color : chartModel.seriesColors[seriesIndex + 1];\r\n pointColor = point.fill ? jQuery.type(point.fill) == \"array\" ? point.fill[0].color : point.fill : pointColor;\r\n fontBackgroundColor = pointColor;\r\n break;\r\n }\r\n else {\r\n fontBackgroundColor = (chartAreaBackground === \"transparent\" && chartBackground === \"transparent\") ?\r\n \"white\" : (chartAreaBackground != \"transparent\") ? chartAreaBackground : chartBackground;\r\n break;\r\n }\r\n }\r\n }\r\n options.fill = this._applySaturation(chart, fontBackgroundColor);\r\n }\r\n else { // when the textposition is middle/bottom to check whether the datalabel lies within the region\r\n collide = ej.ejChart.isCollide(region, point, 0, contrastColor, chart);\r\n if ((textPosition == \"bottom\" || textPosition == \"middle\") && !collide.state) {\r\n fontBackgroundColor = (chartAreaBackground === \"transparent\" && chartBackground === \"transparent\") ?\r\n \"white\" : (chartAreaBackground != \"transparent\") ? chartAreaBackground : chartBackground;\r\n options.fill = this._applySaturation(chart, fontBackgroundColor);\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n //smart labels for pie and doughnut\r\n\r\n updateSmartLabelPosition: function (currentseries, point, pointIndex, bounds, midAngle, startPoint, textOffset, size, sender, seriesIndex) {\r\n var renderingPoints = [],\r\n chartObj = sender,\r\n chartModel = chartObj.model,\r\n legend = chartModel.legend,\r\n legendActualBounds = chartModel.LegendActualBounds,\r\n legendPosition = legend.position.toLowerCase(),\r\n seriesType = new ej.seriesTypes[currentseries.type.toLowerCase()](),\r\n connectorDirection = \"\",\r\n bezierPoints = \"\",\r\n connectorX = bounds.connector.connectorX,\r\n connectorY = bounds.connector.connectorY,\r\n midX = bounds.midPoint.midX,\r\n midY = bounds.midPoint.midY,\r\n dMidX = bounds.doughnutMidPoint.dMidX,\r\n dMidY = bounds.doughnutMidPoint.dMidY,\r\n startX = startPoint.startX,\r\n startY = startPoint.startY,\r\n marker = $.extend(true, {}, currentseries.marker, point.marker),\r\n textGap = (marker.dataLabel.template) ? 0 : 4,\r\n outerX, positionX, positionY,\r\n radius,\r\n isIntersectedLabel,\r\n angle = midAngle,\r\n smartAngle = (currentseries.startAngle > currentseries.endAngle) ? -0.01 : 0.01,\r\n connectorType = marker.dataLabel.connectorLine.type.toLowerCase(),\r\n previousLeft, type = currentseries.type.toLowerCase(),\r\n radius = chartModel._isPieOfPie ? chartModel.circularRadius[currentseries.collectionIndex] : chartModel.circularRadius[seriesIndex],\r\n labelPosition = type == \"pieofpie\" ? \"inside\" : currentseries.labelPosition.toLowerCase();\r\n if (ej.util.isNullOrUndefined(chartModel.bounds[seriesIndex])) {\r\n chartModel.bounds[seriesIndex] = [];\r\n chartModel.bounds[seriesIndex].points = [];\r\n if (labelPosition == 'outsideextended') {\r\n chartModel.bounds[seriesIndex].points[\"left\"] = [];\r\n chartModel.bounds[seriesIndex].points[\"right\"] = [];\r\n }\r\n }\r\n\r\n //calculation for inside labels\r\n if (labelPosition == 'inside' && ej.util.isNullOrUndefined(point.smartLabelPosition)) {\r\n positionX = (midX + startX) / 2;\r\n positionY = (midY + startY) / 2;\r\n\r\n positionX = (midX + positionX) / 2;\r\n positionY = (midY + positionY) / 2;\r\n\r\n if (point.isIntersected && chartModel.bounds[seriesIndex].points[point.index]) {\r\n currBounds = chartModel.bounds[seriesIndex].points[point.index];\r\n }\r\n else {\r\n if (midX > startX)\r\n currBounds = { X: positionX, Y: positionY, Left: positionX, Top: positionY, Right: positionX + size.width, Bottom: positionY + size.height, SeriesIndex: seriesIndex, PointIndex: pointIndex };\r\n else\r\n currBounds = { X: positionX, Y: positionY, Left: positionX - size.width, Top: positionY, Right: positionX, Bottom: positionY + size.height, SeriesIndex: seriesIndex, PointIndex: pointIndex };\r\n }\r\n\r\n do {\r\n isIntersectedLabel = false;\r\n if (!this.IntersectWith(chartObj, point, currBounds, \"inside\", seriesIndex)) continue;\r\n previousLeft = currBounds.Left;\r\n var initialAngle = midAngle * 180 / Math.PI;\r\n\r\n //convert radian to degree and break the loop after complete the 360 degree \r\n var degree = angle * 180 / Math.PI;\r\n // chart start the angle from -90. So it will be skip in 270 degree\r\n if (((degree - initialAngle) >= 270)) continue;\r\n\r\n angle += smartAngle;\r\n point.isIntersected = true;\r\n currBounds.Angle = angle;\r\n if (midX > startX) {\r\n currBounds.X = currBounds.Left = seriesType.getXCordinate(startX, (radius) + textOffset, angle);\r\n currBounds.Right = currBounds.X + size.width;\r\n }\r\n else {\r\n currBounds.X = currBounds.Right = seriesType.getXCordinate(startX, (radius) + textOffset, angle);\r\n currBounds.Left = currBounds.Right - size.width;\r\n }\r\n currBounds.Y = currBounds.Top = seriesType.getYCordinate(startY, (radius) + textOffset, angle);\r\n currBounds.Bottom = currBounds.Y + size.height;\r\n isIntersectedLabel = true;\r\n } while (isIntersectedLabel)\r\n if (midX > startX && currBounds.X < startX) {\r\n currBounds.Right = previousLeft;\r\n currBounds.Left = previousLeft - size.width;\r\n }\r\n chartModel.bounds[seriesIndex].points[pointIndex] = currBounds;\r\n\r\n\r\n if (point.isIntersected && chartModel.bounds[seriesIndex].points[pointIndex].Angle) {\r\n\r\n positionX = seriesType.getXCordinate(startX, (radius) + textOffset, chartModel.bounds[seriesIndex].points[pointIndex].Angle);\r\n positionY = seriesType.getYCordinate(startY, (radius) + textOffset, chartModel.bounds[seriesIndex].points[pointIndex].Angle);\r\n\r\n var connectorMidX = seriesType.getXCordinate(startX, (radius) + textOffset / 3, midAngle);\r\n var connectorMidY = seriesType.getYCordinate(startY, (radius) + textOffset / 3, midAngle);\r\n renderingPoints.push({ X: midX, Y: midY });\r\n renderingPoints.push({ X: connectorMidX, Y: connectorMidY });\r\n renderingPoints.push({ X: positionX, Y: positionY });\r\n if (point.isIntersected && connectorType == 'bezier' && !chartObj.vmlRendering) {\r\n bezierPoints = seriesType.drawBezierSegment(renderingPoints, currentseries, pointIndex, chartObj, seriesIndex);\r\n }\r\n connectorDirection = \"M\" + \" \" + midX + \" \" + midY + \" \" + \"L\" + \" \" + connectorMidX + \" \" + connectorMidY + \" \" + \"M\" + \" \" + connectorMidX + \" \" + connectorMidY + \" \" + \"L\" + \" \" + positionX + \" \" + positionY;\r\n\r\n }\r\n }\r\n\r\n //calculation for outside labels\r\n else if (labelPosition == 'outside' || point.smartLabelPosition == \"outside\") {\r\n\r\n if (midX >= startX)\r\n currBounds = { X: connectorX, Y: connectorY, Left: connectorX, Top: connectorY, Right: connectorX + size.width, Bottom: connectorY + size.height, SeriesIndex: seriesIndex, PointIndex: pointIndex };\r\n else\r\n currBounds = { X: connectorX, Y: connectorY, Left: connectorX - size.width, Top: connectorY, Right: connectorX, Bottom: connectorY + size.height, SeriesIndex: seriesIndex, PointIndex: pointIndex };\r\n\r\n do {\r\n isIntersectedLabel = false;\r\n if (!this.IntersectWith(chartObj, point, currBounds, \"outside\", seriesIndex, size)) continue;\r\n previousLeft = currBounds.Left;\r\n angle += smartAngle;\r\n point.isIntersected = true;\r\n if (midX > startX || currentseries.startAngle <= 0) {\r\n currBounds.X = currBounds.Left = seriesType.getXCordinate(startX, (radius) + textOffset, angle);\r\n currBounds.Right = currBounds.X + size.width;\r\n }\r\n else {\r\n currBounds.X = currBounds.Right = seriesType.getXCordinate(startX, (radius) + textOffset, angle);\r\n currBounds.Left = currBounds.Right - size.width;\r\n }\r\n\r\n currBounds.Y = currBounds.Top = seriesType.getYCordinate(startY, (radius) + textOffset, angle);\r\n currBounds.Bottom = currBounds.Y + size.height;\r\n isIntersectedLabel = true;\r\n } while (isIntersectedLabel)\r\n if (midX > startX && currBounds.X < startX) {\r\n currBounds.Right = previousLeft;\r\n currBounds.Left = previousLeft - size.width;\r\n }\r\n chartModel.bounds[seriesIndex].points[pointIndex] = currBounds;\r\n var connectorMidX = seriesType.getXCordinate(startX, (radius) + textOffset / 3, midAngle);\r\n var connectorMidY = seriesType.getYCordinate(startY, (radius) + textOffset / 3, midAngle);\r\n\r\n renderingPoints.push({ X: midX, Y: midY });\r\n renderingPoints.push({ X: connectorMidX, Y: connectorMidY });\r\n renderingPoints.push({ X: currBounds.X, Y: currBounds.Y });\r\n positionX = currBounds.X;\r\n positionY = currBounds.Y;\r\n if (textOffset > 0) {\r\n if (midX < startX) {\r\n outerX = currBounds.X - chartModel.elementSpacing;\r\n positionX = outerX - textGap;\r\n }\r\n else {\r\n outerX = currBounds.X + chartModel.elementSpacing;\r\n positionX = outerX + textGap;\r\n }\r\n renderingPoints.push({ X: outerX, Y: currBounds.Y });\r\n }\r\n if (connectorType == 'bezier' && !chartObj.vmlRendering) {\r\n bezierPoints = seriesType.drawBezierSegment(renderingPoints, currentseries, pointIndex, chartObj, seriesIndex);\r\n }\r\n else {\r\n connectorDirection = \"M\" + \" \" + midX + \" \" + midY + \" \" + \"L\" + \" \" + connectorMidX + \" \" + connectorMidY + \" \" + \"M\" + \" \" + connectorMidX + \" \" + connectorMidY + \" \" + \"L\" + \" \" + currBounds.X + \" \" + currBounds.Y + \" \" + \"M\" + \" \" + currBounds.X + \" \" + currBounds.Y + \" \" + \"L\" + \" \" + outerX + \" \" + currBounds.Y;\r\n }\r\n\r\n }\r\n\r\n\r\n //calculation for outsideExtended labels\r\n else {\r\n var labelX = midX;\r\n var labelY = midY;\r\n\r\n midX = midX + (Math.cos((midAngle)) * (-(radius / 10)));\r\n midY = midY + (Math.sin((midAngle)) * (-(radius / 10)));\r\n\r\n var connectorHeight = radius / 4;\r\n\r\n renderingPoints.push({ X: midX, Y: midY });\r\n midX = midX + (Math.cos((midAngle)) * connectorHeight);\r\n midY = midY + (Math.sin((midAngle)) * connectorHeight);\r\n\r\n renderingPoints.push({ X: midX, Y: midY });\r\n\r\n var legendWidth = (legend.visible && legendPosition == \"left\") ? (chartModel.margin.left + legendActualBounds.Width) : 0;\r\n var centerX = chartModel.circleCenterX[seriesIndex];\r\n var labelEdge, connectorLineEdge;\r\n\r\n if (midX < startX) {\r\n\r\n midX = ((centerX - radius - (connectorHeight * 2) - currentseries.LeftLabelMaxWidth > 0)\r\n ? centerX - radius - (connectorHeight * 2) + legendWidth\r\n : (currentseries.LeftLabelMaxWidth > labelX) ? labelX : currentseries.LeftLabelMaxWidth + legendWidth) - size.width / 2;\r\n\r\n labelEdge = renderingPoints[1].X - currentseries.LeftLabelMaxWidth;\r\n\r\n var height = (centerX - radius - (connectorHeight * 2) - currentseries.LeftLabelMaxWidth > 0) ? connectorHeight\r\n : (currentseries.LeftLabelMaxWidth > labelX) ? 0\r\n : (labelEdge > 3 * (connectorHeight / 2)) ? connectorHeight : labelEdge / 2;\r\n\r\n connectorLineEdge = +size.width / 2;\r\n\r\n }\r\n else {\r\n var legendRight = (legend.visible && legendPosition == \"right\") ? (chartModel.margin.right + legendActualBounds.Width) : 0;\r\n midX = ((centerX + radius + (connectorHeight * 2) + currentseries.RightLabelMaxWidth < $(chartObj.svgObject).width() - legendRight)\r\n ? centerX + radius + (connectorHeight * 2) - legendWidth\r\n : ((centerX + radius + currentseries.RightLabelMaxWidth) > $(chartObj.svgObject).width()) ? labelX : $(chartObj.svgObject).width() - currentseries.RightLabelMaxWidth - legendRight) + size.width / 2;\r\n\r\n\r\n labelEdge = ($(chartObj.svgObject).width() - currentseries.RightLabelMaxWidth) - renderingPoints[1].X;\r\n\r\n var height = (centerX + radius + (connectorHeight * 2) + currentseries.RightLabelMaxWidth < $(chartObj.svgObject).width()) ? connectorHeight\r\n : ((centerX + radius + currentseries.RightLabelMaxWidth) > $(chartObj.svgObject).width()) ? 0\r\n : (labelEdge > 3 * (connectorHeight / 2)) ? connectorHeight : labelEdge / 2;\r\n connectorLineEdge = -size.width / 2;\r\n }\r\n\r\n var distanceFromOrigin = (Math.sqrt(Math.pow(labelX - midX, 2) + Math.pow(labelY - midY, 2))) / 10;\r\n\r\n var isLeft = (midX < startX) ? true : false;\r\n midX = isLeft ? midX + distanceFromOrigin : midX - distanceFromOrigin;\r\n var index = isLeft ? 1 : -1;\r\n\r\n var bounds = isLeft ? chartModel.bounds[seriesIndex].points[\"left\"] : chartModel.bounds[seriesIndex].points[\"right\"];\r\n var currBounds = { X: midX, Y: midY, Left: midX, Top: midY, Right: midX + size.width, Bottom: midY + size.height, index: pointIndex, SeriesIndex: seriesIndex, PointIndex: pointIndex };\r\n var clockwise = currentseries.endAngle > currentseries.startAngle ? true : false;\r\n if (this.IntersectWith(chartObj, point, currBounds, \"outsideExtended\", seriesIndex)) {\r\n renderingPoints.push(midX < startX\r\n ? { X: midX + height + connectorLineEdge, Y: midY }\r\n : { X: midX - height + connectorLineEdge, Y: midY });\r\n if (!clockwise && currentseries.startAngle != null) {\r\n if (!isLeft)\r\n midY = bounds[bounds.length - 1].Y + size.height + 2;\r\n else\r\n midY = bounds[bounds.length - 1].Y - size.height - 2;\r\n }\r\n else {\r\n midY = bounds[bounds.length - 1].Y + size.height + 2;\r\n }\r\n currBounds.Y = midY;\r\n currBounds.Top = midY;\r\n currBounds.Bottom = midY + size.height;\r\n }\r\n renderingPoints.push({ X: midX + connectorLineEdge, Y: midY });\r\n if (centerX < renderingPoints[0].X && (renderingPoints[1].X > renderingPoints[2].X))\r\n renderingPoints[2].X = renderingPoints[1].X;\r\n if (centerX > renderingPoints[0].X && (renderingPoints[1].X < renderingPoints[2].X))\r\n renderingPoints[2].X = renderingPoints[1].X;\r\n if (!isLeft) {\r\n if (!chartModel.bounds[seriesIndex].points[\"right\"])\r\n chartModel.bounds[seriesIndex].points.right = [];\r\n chartModel.bounds[seriesIndex].points[\"right\"].push(currBounds);\r\n if (renderingPoints[renderingPoints.length - 1].X < renderingPoints[renderingPoints.length - 2].X)\r\n renderingPoints[renderingPoints.length - 2].X = renderingPoints[renderingPoints.length - 1].X;\r\n\r\n }\r\n else {\r\n if (!chartModel.bounds[seriesIndex].points[\"left\"])\r\n chartModel.bounds[seriesIndex].points.left = [];\r\n chartModel.bounds[seriesIndex].points[\"left\"].push(currBounds);\r\n if (renderingPoints[renderingPoints.length - 1].X > renderingPoints[renderingPoints.length - 2].X)\r\n renderingPoints[renderingPoints.length - 2].X = renderingPoints[renderingPoints.length - 1].X;\r\n }\r\n\r\n\r\n connectorDirection = ej.EjSvgRender.utils._getStringBuilder();\r\n if (connectorType == 'bezier' && !chartObj.vmlRendering) {\r\n bezierPoints = seriesType.drawBezierSegment(renderingPoints, currentseries, pointIndex, chartObj, seriesIndex);\r\n }\r\n else {\r\n for (k = 0; k < renderingPoints.length; k++) {\r\n if (k == renderingPoints.length - 1)\r\n connectorDirection.append(\" \");\r\n else\r\n connectorDirection.append(\"M\" + \" \" + (renderingPoints[k].X) + \" \" + (renderingPoints[k].Y) + \" \" + \"L\" + \" \" + (renderingPoints[k + 1].X) + \" \" + (renderingPoints[k + 1].Y) + \" \");\r\n }\r\n connectorDirection = connectorDirection.toString();\r\n }\r\n positionX = renderingPoints[renderingPoints.length - 1].X + ((midX < startX) ? -textGap : textGap);\r\n positionY = renderingPoints[renderingPoints.length - 1].Y;\r\n }\r\n return { positionX: positionX, positionY: positionY, connectorDirection: connectorDirection, isInterSected: point.isIntersected, bezierPath: bezierPoints };\r\n },\r\n\r\n updateLabelPosition: function (currentseries, point, pointIndex, bounds, midAngle, startPoint, textOffset, size, sender, seriesIndex) {\r\n\r\n var renderingPoints = [];\r\n var chartObj = sender;\r\n var seriesType = new ej.seriesTypes[currentseries.type.toLowerCase()]();\r\n var connectorDirection = \"\";\r\n\r\n var connectorX = bounds.connector.connectorX;\r\n var connectorY = bounds.connector.connectorY;\r\n var midX = bounds.midPoint.midX;\r\n var midY = bounds.midPoint.midY;\r\n var dMidX = bounds.doughnutMidPoint.dMidX;\r\n var dMidY = bounds.doughnutMidPoint.dMidY;\r\n var startX = startPoint.startX;\r\n var startY = startPoint.startY;\r\n var marker = $.extend(true, {}, currentseries.marker, point.marker);\r\n var textGap = (marker.dataLabel.template) ? 0 : 4;\r\n\r\n var outerX;\r\n var type = currentseries.type.toLowerCase();\r\n var radius = chartObj.model.circularRadius[seriesIndex];\r\n var labelPosition = type == \"pieofpie\" ? \"inside\" : currentseries.labelPosition.toLowerCase();\r\n\r\n //calculation for outside labels\r\n\r\n renderingPoints.push({ X: midX, Y: midY });\r\n renderingPoints.push({ X: connectorX, Y: connectorY });\r\n positionX = connectorX;\r\n positionY = connectorY;\r\n\r\n if (labelPosition == 'outside') {\r\n if (textOffset > 0) {\r\n if (connectorX < startX) {\r\n outerX = connectorX - chartObj.model.elementSpacing;\r\n positionX = outerX - textGap;\r\n }\r\n else {\r\n outerX = connectorX + chartObj.model.elementSpacing;\r\n positionX = outerX + textGap;\r\n }\r\n renderingPoints.push({ X: outerX, Y: connectorY });\r\n }\r\n\r\n if (marker.dataLabel.connectorLine.type.toLowerCase() == 'bezier' && !chartObj.vmlRendering) {\r\n seriesType.drawBezierSegment(renderingPoints, currentseries, pointIndex, chartObj, seriesIndex);\r\n }\r\n else {\r\n connectorDirection = \"M\" + \" \" + midX + \" \" + midY + \" \" + \"L\" + \" \" + connectorX + \" \" + connectorY + \" \" + \"M\" + \" \" + connectorX + \" \" + connectorY + \" \" + \"L\" + \" \" + outerX + \" \" + connectorY;\r\n }\r\n\r\n }\r\n\r\n\r\n //calculation for outsideextended labels\r\n else if (labelPosition == 'outsideextended') {\r\n\r\n labelX = midX;\r\n labelY = midY;\r\n\r\n midX = midX + (Math.cos((midAngle)) * (-(radius / 10)));\r\n midY = midY + (Math.sin((midAngle)) * (-(radius / 10)));\r\n\r\n\r\n var renderingPoints = [];\r\n\r\n var connectorHeight = radius / 4;\r\n\r\n renderingPoints.push({ X: midX, Y: midY });\r\n connectorX = midX + (Math.cos((midAngle)) * connectorHeight);\r\n connectorY = midY + (Math.sin((midAngle)) * connectorHeight);\r\n\r\n renderingPoints.push({ X: connectorX, Y: connectorY });\r\n\r\n var legendWidth = (chartObj.model.legend.visible && (chartObj.model.legend.position.toLowerCase() == \"left\" || chartObj.model.legend.position.toLowerCase() == \"right\")) ? (chartObj.model.elementSpacing) : 0;\r\n\r\n if (midX < startX) {\r\n connectorX = (chartObj.model.centerX - radius - (connectorHeight * 2) - currentseries.LeftLabelMaxWidth > 0)\r\n ? chartObj.model.centerX - radius - (connectorHeight * 2) + legendWidth\r\n : (currentseries.LeftLabelMaxWidth > labelX) ? labelX : currentseries.LeftLabelMaxWidth;\r\n }\r\n else {\r\n connectorX = (chartObj.model.centerX + radius + (connectorHeight * 2) + currentseries.RightLabelMaxWidth < $(chartObj.svgObject).width())\r\n ? chartObj.model.centerX + radius + (connectorHeight * 2) - legendWidth\r\n : ((chartObj.model.centerX + radius + currentseries.RightLabelMaxWidth) > $(chartObj.svgObject).width()) ? labelX : $(chartObj.svgObject).width() - currentseries.RightLabelMaxWidth;\r\n\r\n }\r\n\r\n renderingPoints.push({ X: connectorX, Y: connectorY });\r\n\r\n connectorDirection = ej.EjSvgRender.utils._getStringBuilder();\r\n if (marker.dataLabel.connectorLine.type.toLowerCase() == 'bezier' && !chartObj.vmlRendering) {\r\n seriesType.drawBezierSegment(renderingPoints, currentseries, pointIndex, chartObj, seriesIndex);\r\n }\r\n else {\r\n for (k = 0; k < renderingPoints.length; k++) {\r\n if (k == renderingPoints.length - 1)\r\n connectorDirection.append(\" \");\r\n else\r\n connectorDirection.append(\"M\" + \" \" + (renderingPoints[k].X) + \" \" + (renderingPoints[k].Y) + \" \" + \"L\" + \" \" + (renderingPoints[k + 1].X) + \" \" + (renderingPoints[k + 1].Y) + \" \");\r\n }\r\n connectorDirection = connectorDirection.toString();\r\n }\r\n positionX = renderingPoints[renderingPoints.length - 1].X + ((midX < startX) ? -textGap : textGap);;\r\n positionY = renderingPoints[renderingPoints.length - 1].Y;\r\n }\r\n\r\n //calculation for inside labels\r\n\r\n else {\r\n if (currentseries.type.toLowerCase() == \"doughnut\") {\r\n positionX = (midX + dMidX) / 2;\r\n positionY = (midY + dMidY) / 2;\r\n }\r\n else {\r\n positionX = (midX + startX) / 2;\r\n positionY = (midY + startY) / 2;\r\n\r\n positionX = (midX + positionX) / 2;\r\n positionY = (midY + positionY) / 2;\r\n }\r\n }\r\n\r\n return { positionX: positionX, positionY: positionY, connectorDirection: connectorDirection, points: renderingPoints[renderingPoints.length - 1] };\r\n },\r\n // method to update the position of the data labels in pyramid chart\r\n updateSmartLabel: function (chartObj, currentseries, pointIndex, point) {\r\n // declaration\r\n var datalabelTemplateVisiblity = true,\r\n connectorDirection = \"\",\r\n labelPosition = currentseries.labelPosition.toLowerCase(),\r\n marker = $.extend(true, {}, currentseries.marker, point.marker),\r\n dataLabel = marker.dataLabel,\r\n areaBounds = chartObj.model.m_AreaBounds,\r\n svgHeight = chartObj.model.svgHeight,\r\n type = currentseries.type.toLowerCase(),\r\n pyrX, pyrY, ele, xPos, yPos;\r\n point._labelPlacement = \"\";\r\n if (labelPosition == \"inside\" || labelPosition == \"outsideextended\")\r\n this.calculateInsideConnectorLines(pointIndex, point, currentseries, chartObj);\r\n else\r\n this.compareDataLabels(point, pointIndex, chartObj.model.outsideDataRegionPoints, currentseries, chartObj);\r\n\r\n pyrX = (chartObj.model.enableCanvasRendering && !dataLabel.template) ? chartObj.pyrX : 0;\r\n pyrY = (chartObj.model.enableCanvasRendering && !dataLabel.template) ? chartObj.pyrY : 0;\r\n if (type == \"pyramid\") {\r\n if ((chartObj.model.actualHeight < point.yPos - pyrY) || (point.xPos - pyrX > areaBounds.Width && point._labelPlacement == \"insideoverlap\") || (chartObj.model.legend.position == \"right\" && dataLabel.template && (point.xPos + point.width) > areaBounds.Width + chartObj.model.LegendActualBounds.Width)) {\r\n datalabelTemplateVisiblity = false;\r\n point.drawTextacc = \"\";\r\n }\r\n }\r\n else {\r\n if ((point.yPos - pyrY < 0) || (point.xPos - pyrX > areaBounds.Width && point._labelPlacement == \"insideoverlap\") || (chartObj.model.legend.position == \"right\" && dataLabel.template && (point.xPos + point.width) > areaBounds.Width + chartObj.model.LegendActualBounds.Width)) {\r\n datalabelTemplateVisiblity = false;\r\n point.drawTextacc = \"\";\r\n\r\n }\r\n }\r\n if ((labelPosition == \"outside\" || point._labelPlacement == \"insideoverlap\") && datalabelTemplateVisiblity)\r\n connectorDirection = this.drawConnectorLines(pointIndex, point, currentseries, chartObj);\r\n\r\n if (dataLabel.template) {\r\n ele = $(\"#\" + point.id);\r\n if (!datalabelTemplateVisiblity) {\r\n ele.css(\"display\", \"none\");\r\n }\r\n else {\r\n xPos = (point._labelPlacement == \"insidenooverlap\") ? point.textOptionsacc.x + chartObj.pyrX - point.width / 2 : point.textOptionsacc.x + chartObj.pyrX;\r\n yPos = (point._labelPlacement == \"insidenooverlap\") ? point.textOptionsacc.y + chartObj.pyrY : point.textOptionsacc.y + chartObj.pyrY - chartObj.model.elementSpacing;\r\n ele.css(\"left\", xPos).css(\"top\", yPos);\r\n ele.css(\"height\", point.height).css(\"overflow\", \"hidden\");\r\n }\r\n }\r\n\r\n\r\n return { xPos: point.xPos, yPos: point.yPos, textOptionsacc: point.textOptionsacc, connectorDirection: connectorDirection.connectorDirection, bezierPath: connectorDirection.bezierdir, drawTextacc: point.drawTextacc };\r\n },\r\n // method to compare the data labels in chart for intersection\r\n compareDataLabels: function (point, pointIndex, outsideDataRegionPoints, currentseries, chartObj) {\r\n\r\n var marker = $.extend(true, {}, currentseries.marker, point.marker),\r\n dataLabel = marker.dataLabel,\r\n prevLabel, collide, regionPoint, degree, angle, rotate,\r\n elementSpacing = chartObj.model.elementSpacing,\r\n margin = marker.dataLabel.margin,\r\n visiblePointslength = currentseries._visiblePoints.length,\r\n labelPosition = currentseries.labelPosition.toLowerCase(),\r\n pyrX = (chartObj.model.enableCanvasRendering) ? chartObj.pyrX : 0,\r\n pyrY = (chartObj.model.enableCanvasRendering) ? chartObj.pyrY : 0;\r\n for (var j = 0, length = outsideDataRegionPoints.length; j < length; j++) {\r\n prevLabel = outsideDataRegionPoints[j];\r\n collide = this.isCollide(prevLabel, point, currentseries);\r\n if (collide.state) {\r\n if (labelPosition == \"inside\" || labelPosition == \"outsideextended\") {\r\n point.textOptionsacc.y = point.yPos = point.textOptionsacc.y + collide.height;\r\n positionPoint = (dataLabel.template) ? { x: point.xPos, y: point.yPos } : { x: point.xPos - pyrX, y: point.yPos - pyrY };\r\n for (var k = 0, visibleLength = visiblePointslength; k < visibleLength; k++) {\r\n regionPoint = (chartObj.isPointInPolygon(chartObj.model.chartRegions[0].Region[k].Polygon, positionPoint));\r\n if (regionPoint) {\r\n point.textOptionsacc.x = point.xPos = point.textOptionsacc.x + point.width;\r\n positionPoint = (dataLabel.template) ? { x: point.xPos, y: point.yPos } : { x: point.xPos - pyrX, y: point.yPos - pyrY };\r\n }\r\n }\r\n }\r\n else {\r\n point._labelPlacement = \"outside\";\r\n point.textOptionsacc.y = point.yPos = (currentseries.type.toLowerCase() == \"pyramid\") ? point.yPos + collide.height + elementSpacing / 2 : point.yPos + collide.height - elementSpacing / 2;\r\n point.textOptionsacc.y = point.textOptionsacc.y + point.height / 4 - elementSpacing / 2 + margin.top / 2 - margin.bottom / 2;\r\n }\r\n }\r\n }\r\n degree = dataLabel.angle;\r\n angle = (degree > 360) ? degree - 360 : (degree < -360) ? degree + 360 : degree;\r\n rotate = 'rotate(' + angle + ',' + (point.textOptionsacc.x) + ',' + (point.textOptionsacc.y) + ')';\r\n $(point.textOptionsacc).attr('transform', rotate);\r\n\r\n $(point.textOptionsacc).attr({\r\n 'transform': rotate\r\n });\r\n if (labelPosition == \"inside\" || labelPosition == \"outsideextended\") {\r\n point.yPos = point.yPos + elementSpacing / 4;\r\n point.textOptionsacc.y = point.textOptionsacc.y + point.height / 4 + margin.top / 2 - margin.bottom / 2;\r\n }\r\n outsideDataRegionPoints[outsideDataRegionPoints.length] = point;\r\n },\r\n\r\n //Inside region checking and smartlabels\r\n calculateInsideConnectorLines: function (pointIndex, point, currentseries, chartObj) {\r\n\r\n var polygon = point.Polygon,\r\n marker = $.extend(true, {}, currentseries.marker, point.marker),\r\n dataLabel = marker.dataLabel,\r\n font = dataLabel.font, connectorHeight,\r\n pyrX = (chartObj.model.enableCanvasRendering) ? chartObj.pyrX : 0,\r\n pyrY = (chartObj.model.enableCanvasRendering) ? chartObj.pyrY : 0,\r\n //inside connector line height\r\n connectorLength = 70,\r\n datalabelWidth = ej.EjSvgRender.utils._measureText(point.drawTextacc, null, font),\r\n positionPoint = (dataLabel.template) ? { x: point.xPos, y: point.yPos } : { x: point.xPos + (datalabelWidth.width / 2) - pyrX, y: point.yPos - (point.height / 2) - pyrY },\r\n regionPoint = chartObj.isPointInPolygon(polygon, positionPoint);\r\n if (!regionPoint) {\r\n point._labelPlacement = \"insideoverlap\";\r\n point.textOptionsacc['text-anchor'] = 'start';\r\n if (point.startX + connectorLength < chartObj.model.m_AreaBounds.Width)\r\n connectorHeight = connectorLength;\r\n else\r\n connectorHeight = chartObj.model.m_AreaBounds.Width - (point.startX);\r\n\r\n point.textOptionsacc.x = point.xPos = point.startX + connectorHeight;\r\n point.textOptionsacc.y = point.yPos = point.yLocation;\r\n if (chartObj.model.enableCanvasRendering && !dataLabel.template) {\r\n point.textOptionsacc.x += chartObj.pyrX;\r\n point.textOptionsacc.y += chartObj.pyrY;\r\n point.xPos += chartObj.pyrX;\r\n point.yPos += chartObj.pyrY;\r\n }\r\n this.compareDataLabels(point, pointIndex, chartObj.model.outsideDataRegionPoints, currentseries, chartObj);\r\n\r\n }\r\n\r\n else {\r\n point._labelPlacement = \"insidenooverlap\";\r\n }\r\n },\r\n //smartLabels connector Lines\r\n drawConnectorLines: function (index, currentPoint, currentseries, chartObj) {\r\n var bezierdir = \"\";\r\n var seriesType = new ej.seriesTypes[currentseries.type.toLowerCase()](),\r\n startx = currentseries._visiblePoints[index].startX,\r\n starty = currentseries._visiblePoints[index].startY,\r\n connectorDirection = \"\",\r\n seriesIndex = $.inArray(currentseries, chartObj.model._visibleSeries),\r\n marker = $.extend(true, {}, currentseries.marker, currentPoint.marker),\r\n dataLabel = marker.dataLabel,\r\n endy = currentPoint.textOptionsacc.y - chartObj.model.elementSpacing / 2,\r\n pyrX = (chartObj.model.enableCanvasRendering) ? chartObj.pyrX : 0,\r\n pyrY = (chartObj.model.enableCanvasRendering) ? chartObj.pyrY : 0,\r\n renderingPoints = [{ X: startx + pyrX, Y: starty + pyrY },//bezier curve control points\r\n { X: currentPoint.textOptionsacc.x, Y: endy }];\r\n if (dataLabel.connectorLine.type.toLowerCase() == 'bezier' && !chartObj.vmlRendering)\r\n bezierdir = seriesType.drawBezierSegment(renderingPoints, currentseries, index, chartObj, seriesIndex);\r\n else {\r\n connectorDirection = \"M\" + \" \" + (startx) + \" \" + (starty) + \" \" + \"L\" + \" \" + (currentPoint.textOptionsacc.x) + \" \" + (endy);\r\n if (chartObj.model.enableCanvasRendering && !dataLabel.template)\r\n connectorDirection = \"M\" + \" \" + (startx) + \" \" + (starty) + \" \" + \"L\" + \" \" + (currentPoint.textOptionsacc.x - pyrX) + \" \" + (endy - pyrY);\r\n }\r\n return { connectorDirection: connectorDirection, bezierdir: bezierdir };\r\n },\r\n\r\n //method to detect collision between data labels\r\n isCollide: function (prevlabel, currentlabel, currentseries) {\r\n var width = 0,\r\n height = 0,\r\n type = currentseries.type.toLowerCase(),\r\n state;\r\n state = !(\r\n ((prevlabel.yPos + prevlabel.height) < (currentlabel.yPos)) ||\r\n (prevlabel.yPos > (currentlabel.yPos + currentlabel.height)) ||\r\n ((prevlabel.xPos + prevlabel.width / 2) < currentlabel.xPos - currentlabel.width / 2) ||\r\n ((prevlabel.xPos - prevlabel.width) > (currentlabel.xPos + currentlabel.width)));\r\n\r\n if (state && type == \"pyramid\") {\r\n height = ((prevlabel.yPos + prevlabel.height) - (currentlabel.yPos));\r\n width = (prevlabel.xPos + prevlabel.width) - currentlabel.xPos;\r\n }\r\n else if (state && type == \"funnel\") {\r\n height = ((prevlabel.yPos) - (currentlabel.yPos + currentlabel.height));\r\n width = (prevlabel.xPos + prevlabel.width) - currentlabel.xPos;\r\n }\r\n return { state: state, height: height, width: width };\r\n },\r\n // trimming the text when it exceeds chart area\r\n trimText: function (text, maxLength, ellipsis) {\r\n maxLength--;\r\n var length = maxLength - ellipsis.length,\r\n trimmedText = text.substr(0, length);\r\n return trimmedText + ellipsis;\r\n },\r\n\r\n //calculate a length of a text for datalabel trimming\r\n trimfunction: function (datalabelText, remainingWidth, datalabelLength, elipsis, axisWidth, font) {\r\n var datalabelText, datalabelLength;\r\n while (remainingWidth < datalabelLength) {\r\n datalabelText = this.trimText(datalabelText, datalabelText.length, elipsis);\r\n datalabelLength = ej.EjSvgRender.utils._measureText(datalabelText, axisWidth, font).width;\r\n if (datalabelText == elipsis) {\r\n datalabelText = \"\";\r\n break;\r\n }\r\n }\r\n return datalabelText;\r\n },\r\n\r\n //To calculate start and end point of a text inside a pie and doughnut region\r\n calculatePosition: function (chartObj, textOptions, datalabelLength, startX, startY) {\r\n var rightEndX, rightEndY, leftEndX, leftEndY;\r\n rightEndX = (textOptions.x + (datalabelLength / 2)) - startX;\r\n rightEndY = (textOptions.y) - (startY);\r\n leftEndX = (textOptions.x - (datalabelLength / 2)) - startX;\r\n leftEndY = textOptions.y - startY;\r\n return { rightEndX: rightEndX, rightEndY: rightEndY, leftEndX: leftEndX, leftEndY: leftEndY };\r\n\r\n },\r\n\r\n //To caluculate textoptions\r\n textOption: function (currentseries, chartObj, textsize, pyrX, pyrY, pointIndex, textAnchor, positionX, positionY, seriesIndex, visiblePoint) {\r\n if (chartObj.model._isPieOfPie)\r\n var marker = $.extend(true, {}, currentseries.marker, visiblePoint.marker);\r\n else\r\n var marker = $.extend(true, {}, currentseries.marker, currentseries._visiblePoints[pointIndex].marker);\r\n if (!marker.dataLabel.template) {\r\n $(\"#\" + chartObj.svgObject.id + 'series' + seriesIndex + '_PointText' + pointIndex).remove();\r\n var textOptions = {\r\n 'id': chartObj.svgObject.id + 'series' + seriesIndex + '_PointText' + pointIndex,\r\n 'x': positionX + pyrX,\r\n 'y': positionY + textsize.height / 4 + pyrY,\r\n 'fill': marker.dataLabel.font.color,\r\n 'font-size': marker.dataLabel.font.size,\r\n 'font-family': marker.dataLabel.font.fontFamily,\r\n 'font-style': marker.dataLabel.font.fontStyle,\r\n 'font-weight': marker.dataLabel.font.fontWeight,\r\n 'opacity': marker.dataLabel.font.opacity,\r\n 'text-anchor': textAnchor,\r\n 'cursor': 'default',\r\n 'degree': marker.dataLabel.angle\r\n };\r\n //To rotate datalabels\r\n var degree = marker.dataLabel.angle;\r\n var angle = (degree > 360) ? degree - 360 : (degree < -360) ? degree + 360 : degree;\r\n var rotate = 'rotate(' + angle + ',' + (positionX) + ',' + (positionY) + ')';\r\n $(textOptions).attr('transform', rotate);\r\n if (chartObj.model.enableCanvasRendering) {\r\n $(textOptions).attr('labelRotation', degree);\r\n }\r\n $(textOptions).attr({\r\n 'transform': rotate\r\n });\r\n }\r\n return textOptions;\r\n },\r\n\r\n //To trim datalabel when it exceed a particular pie and doughnut region\r\n labelTrim: function (chartObj, textOptions, datalabelLength, datalabelText, startX, startY, point, font, seriesIndex, pieSeriesIndex) {\r\n var chartStartAngle = -.5 * Math.PI;\r\n var chartEndAngle = .5 * Math.PI;\r\n var position = this.calculatePosition(chartObj, textOptions, datalabelLength, startX, startY);\r\n var startAngle = chartObj.model.series[seriesIndex].startAngle;\r\n var endAngle = chartObj.model.series[seriesIndex].endAngle;\r\n var regionData = (chartObj.model.chartRegions.length < chartObj.model._visibleSeries.length) ? chartObj.model.chartRegions[0].Region : chartObj.model.chartRegions[seriesIndex].Region;\r\n var pointStartAngle, pointEndAngle;\r\n var distanceFromCenter;\r\n var textinRegion;\r\n var trimPosition, datalabelWidth;\r\n var ellipsis = \"...\";\r\n var firstStartAngle = [];\r\n var totalDegree = endAngle - startAngle;\r\n var seriesIndex = chartObj.model._isPieOfPie ? pieSeriesIndex : seriesIndex;\r\n if (totalDegree < 0) {\r\n endAngle = endAngle / 360;\r\n var arcAngle = (endAngle) ? 2 * Math.PI * (endAngle < 0 ? 1 + endAngle : endAngle) : 0;\r\n }\r\n else\r\n var arcAngle = startAngle ? 2 * Math.PI * (chartObj.model.itemCurrentXPos < 0 ? 1 + chartObj.model.itemCurrentXPos : chartObj.model.itemCurrentXPos) : 0;\r\n startAngle = (Math.atan2(position.rightEndY, position.rightEndX) - chartStartAngle - arcAngle) % (2 * Math.PI);\r\n if (startAngle < 0) startAngle = 2 * Math.PI + startAngle;\r\n endAngle = (Math.atan2(position.leftEndY, position.leftEndX) - chartStartAngle - arcAngle) % (2 * Math.PI);\r\n if (endAngle < 0) endAngle = 2 * Math.PI + endAngle;\r\n pointStartAngle = parseFloat(point.start.toFixed(14));\r\n pointEndAngle = parseFloat(point.end.toFixed(14));\r\n if (totalDegree > 0) {\r\n if (ej.util.isNullOrUndefined(chartObj.firstStartAngle[0])) {\r\n chartObj.firstStartAngle.push(pointStartAngle);\r\n }\r\n pointStartAngle = (chartObj.firstStartAngle[0] < 0) ? (chartObj.model._isPieOfPie ? pointStartAngle : 2 * Math.PI + pointStartAngle) : pointStartAngle;\r\n pointEndAngle = (chartObj.firstStartAngle[0] < 0) ? (chartObj.model._isPieOfPie ? pointEndAngle : 2 * Math.PI + pointEndAngle) : pointEndAngle;\r\n }\r\n else {\r\n pointStartAngle = pointStartAngle < 0 ? (chartObj.model._isPieOfPie ? pointStartAngle : 2 * Math.PI + pointStartAngle) : pointStartAngle;\r\n pointEndAngle = pointEndAngle < 0 ? (chartObj.model._isPieOfPie ? pointEndAngle : 2 * Math.PI + pointEndAngle) : pointEndAngle;\r\n }\r\n pointStartAngle -= arcAngle;\r\n pointEndAngle -= arcAngle;\r\n // to check start and end angle when greater than 360 in pieofpie\r\n if (pointStartAngle > 2 * Math.PI && pointEndAngle > 2 * Math.PI) {\r\n startAngle = startAngle + 2 * Math.PI;\r\n endAngle = endAngle + 2 * Math.PI;\r\n }\r\n else if (pointStartAngle < 2 * Math.PI && pointEndAngle > 2 * Math.PI) {\r\n if (startAngle < Math.PI / 2)\r\n startAngle = startAngle + 2 * Math.PI;\r\n if (endAngle < Math.PI / 2)\r\n endAngle = endAngle + 2 * Math.PI;\r\n }\r\n if (startAngle < 0 && (endAngle > 0 || endAngle == null)) {\r\n pointStartAngle = pointStartAngle < 0 ? 2 * Math.PI + pointStartAngle : pointStartAngle;\r\n pointEndAngle = pointEndAngle <= 0 ? 2 * Math.PI + pointEndAngle : pointEndAngle;\r\n }\r\n if (chartObj.model.circleCenterX[seriesIndex] < textOptions.x) {\r\n distanceFromCenter = Math.sqrt(Math.pow(Math.abs(position.rightEndX), 2) + Math.pow(Math.abs(position.rightEndY), 2));\r\n }\r\n else\r\n distanceFromCenter = Math.sqrt(Math.pow(Math.abs(position.leftEndX), 2) + Math.pow(Math.abs(position.leftEndY), 2));\r\n if (totalDegree < 0) {\r\n pointEndAngle = [pointStartAngle, pointStartAngle = pointEndAngle][0];\r\n }\r\n if ((endAngle >= pointStartAngle && endAngle <= pointEndAngle) && (startAngle >= pointStartAngle && startAngle <= pointEndAngle) && (distanceFromCenter <= chartObj.model.circularRadius[seriesIndex] && distanceFromCenter > 0)) {\r\n textinRegion = true;\r\n }\r\n else {\r\n textinRegion = false;\r\n while (!textinRegion) {\r\n datalabelText = this.trimText(datalabelText, datalabelText.length, ellipsis);\r\n if (datalabelText == ellipsis) {\r\n datalabelText = \"\";\r\n break;\r\n }\r\n datalabelWidth = ej.EjSvgRender.utils._measureText(datalabelText, null, font);\r\n trimPosition = this.calculatePosition(chartObj, textOptions, datalabelWidth.width, startX, startY);\r\n var startangle = (Math.atan2(trimPosition.rightEndY, trimPosition.rightEndX) - chartStartAngle - arcAngle) % (2 * Math.PI);\r\n if (startangle < 0) startangle = 2 * Math.PI + startangle;\r\n var endAngle = (Math.atan2(trimPosition.leftEndY, trimPosition.leftEndX) - chartStartAngle - arcAngle) % (2 * Math.PI);\r\n if (endAngle < 0) endAngle = 2 * Math.PI + endAngle;\r\n if (chartObj.model.circleCenterX[seriesIndex] < textOptions.x) {\r\n distanceFromCenter = Math.sqrt(Math.pow(Math.abs(trimPosition.rightEndX), 2) + Math.pow(Math.abs(trimPosition.rightEndY), 2));\r\n }\r\n else\r\n distanceFromCenter = Math.sqrt(Math.pow(Math.abs(trimPosition.leftEndX), 2) + Math.pow(Math.abs(trimPosition.leftEndY), 2));\r\n // to check when startangle and endangle is greater than 360 degree for pieofpie\r\n if ((pointStartAngle > 2 * Math.PI && pointEndAngle > 2 * Math.PI) && chartObj.model._isPieOfPie) {\r\n var stAngle = pointStartAngle - 2 * Math.PI;\r\n pointStartAngle = stAngle;\r\n var enAngle = pointEndAngle - 2 * Math.PI;\r\n pointEndAngle = enAngle;\r\n }\r\n else if ((pointStartAngle != 0 && pointStartAngle < 2 * Math.PI && pointEndAngle >= 2 * Math.PI) && chartObj.model._isPieOfPie) {\r\n var stAngle = pointStartAngle - 2 * Math.PI;\r\n pointStartAngle = stAngle;\r\n }\r\n if ((endAngle >= pointStartAngle && endAngle <= pointEndAngle) &&\r\n (startangle >= pointStartAngle && startangle <= pointEndAngle) &&\r\n (distanceFromCenter <= chartObj.model.circularRadius[seriesIndex] && distanceFromCenter > 0)) {\r\n textinRegion = true;\r\n }\r\n\r\n }\r\n }\r\n\r\n return datalabelText;\r\n },\r\n\r\n\r\n drawDataLabelAcc: function (sender, currentseries, pointIndex, point, seriesIndex, pieSeriesIndex) {\r\n // method for data label symbols - accumulation series\t\r\n var pointMarker = point.marker;\r\n if (point.visible && ((pointMarker && pointMarker.dataLabel && pointMarker.dataLabel.visible) || (!pointMarker || !pointMarker.dataLabel) && currentseries.marker.dataLabel.visible)) {\r\n var chartObj = sender,\r\n type = currentseries.type.toLowerCase(),\r\n seriesType = new ej.seriesTypes[type](),\r\n isNull = ej.util.isNullOrUndefined,\r\n _labelPosition = type == \"pieofpie\" ? \"inside\" : currentseries.labelPosition.toLowerCase(),\r\n chartModel = chartObj.model,\r\n chartTitle = chartModel.title,\r\n measureText = ej.EjSvgRender.utils._measureText,\r\n elementSpacing = chartModel.elementSpacing,\r\n seriesMarker = currentseries.marker,\r\n dataLabel = seriesMarker.dataLabel,\r\n margin = dataLabel.margin,\r\n dataLabelFont = dataLabel.font,\r\n connectorLine = dataLabel.connectorLine,\r\n connectorType = connectorLine.type.toLowerCase(),\r\n legend = chartModel.legend,\r\n legendPosition = legend.position.toLowerCase(),\r\n legendActualBounds = chartModel.LegendActualBounds,\r\n text = isNull(point.text) ? point.y : point.text,\r\n enableWrap = dataLabel.enableWrap,\r\n wrapConnectorpoints, shape, size,\r\n labelText = text,\r\n srIndex = chartModel._isPieOfPie ? pieSeriesIndex : seriesIndex;\r\n\r\n var connectorDirection, labelfont,\r\n commonEventArgs, textsize, position, symbolPos, accDataLabelRegion,\r\n positionX = 0, textWidth, textHeight,\r\n positionY = 0, symbolName,\r\n pointColor, chartBackground = chartModel.background.toLowerCase(), fontBackgroundColor, contrastColor = dataLabel.enableContrastColor;\r\n\r\n if ((type == \"pyramid\" || type == \"funnel\") && _labelPosition == 'outsideextended')\r\n _labelPosition = 'inside';\r\n\r\n commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { text: text, series: currentseries, pointIndex: pointIndex };\r\n chartObj._trigger(\"displayTextRendering\", commonEventArgs);\r\n\r\n labelfont = { size: dataLabelFont.size, fontStyle: dataLabelFont.fontStyle, fontFamily: dataLabelFont.fontFamily };\r\n textsize = measureText(commonEventArgs.data.text, null, labelfont);\r\n textWidth = textsize.width + margin.left + margin.right;\r\n textHeight = textsize.height + margin.top + margin.bottom;\r\n\r\n if (type == \"pyramid\" || type == \"funnel\") {\r\n var measureTitle = (chartModel.title.text) ? measureText(chartModel.title.text, $(this.svgObject).width() - chartModel.margin.left - chartModel.margin.right, chartModel.title.font) : 0;\r\n var mesureSubTitle = (chartObj.model.title.subTitle.text) ? ej.EjSvgRender.utils._measureText(chartObj.model.title.subTitle.text, $(this.svgObject).width() - chartObj.model.margin.left - chartObj.model.margin.right, chartObj.model.title.subTitle.font) : 0;\r\n var subtitleHeight = (chartObj.model.title.subTitle.text === '') ? 0 : mesureSubTitle.height;\r\n var pyrX = elementSpacing + chartModel.margin.left + (legendPosition === \"left\") ? (legendActualBounds.Width) : 0;\r\n var pyrY = ((legendPosition === \"top\") ? (legendActualBounds.Height) : 0) + ((chartModel.title.text && chartModel.title.visible) ? (chartModel._titleLocation.Y + measureTitle.height + subtitleHeight) : (chartModel.margin.top + elementSpacing));\r\n textWidth = textWidth + 10;\r\n var Location = { X: point.xLocation + chartObj.pyrX, Y: point.yLocation + chartObj.pyrY };\r\n positionX = point.xLocation;\r\n positionY = point.yLocation;\r\n var marker = point.marker ? point.marker : seriesMarker;\r\n marker = $.extend(true, {}, seriesMarker, marker);\r\n connectorDirection = point.connectorLine;\r\n symbolPos = { positionX: positionX, positionY: positionY };\r\n }\r\n\r\n if (type != \"pyramid\" && type != \"funnel\") {\r\n var chartStartingAngle = -.5 * Math.PI,\r\n midAngle = point.midAngle + chartStartingAngle,\r\n midPoint, doughnutMidPoint, connector, bounds,\r\n startPoint,\r\n measureTitle = (chartModel.title.text) ? measureText(chartModel.title.text, $(this.svgObject).width() - chartModel.margin.left - chartModel.margin.right, chartModel.title.font) : 0,\r\n mesureSubTitle = (chartObj.model.title.subTitle.text) ? ej.EjSvgRender.utils._measureText(chartObj.model.title.subTitle.text, $(this.svgObject).width() - chartObj.model.margin.left - chartObj.model.margin.right, chartObj.model.title.subTitle.font) : 0,\r\n subtitleHeight = (chartObj.model.title.subTitle.text === '') ? 0 : mesureSubTitle.height,\r\n textOffset, startX, startY, midX, midY, dMidX, dMidY, connectorX, connectorY,\r\n renderingPoints = [],\r\n radius = chartModel.circularRadius[srIndex];\r\n if (isNull(connectorLine.height))\r\n textOffset = measureText(commonEventArgs.data.text, null, dataLabelFont).height;\r\n else\r\n textOffset = connectorLine.height;\r\n var actualIndex = chartObj.model._isPieOfPie ? point.actualIndex : currentseries._visiblePoints[pointIndex].actualIndex;\r\n if ((actualIndex == currentseries.explodeIndex || currentseries.explodeAll) && !chartObj.vmlRendering) {\r\n startX = chartModel.circleCenterX[srIndex] + Math.cos(midAngle) * currentseries.explodeOffset;\r\n startY = chartModel.circleCenterY[srIndex] + Math.sin(midAngle) * currentseries.explodeOffset;\r\n }\r\n else {\r\n startX = chartModel.circleCenterX[srIndex];\r\n startY = chartModel.circleCenterY[srIndex];\r\n }\r\n midX = seriesType.getXCordinate(startX, (radius), midAngle);\r\n midX = point.y != 0 ? midX : parseFloat(midX.toFixed(12));\r\n midY = seriesType.getYCordinate(startY, (radius), midAngle);\r\n\r\n dMidX = seriesType.getXCordinate(startX, (chartModel.innerRadius[seriesIndex]), midAngle);\r\n dMidY = seriesType.getYCordinate(startY, (chartModel.innerRadius[seriesIndex]), midAngle);\r\n\r\n connectorX = this.getXCordinate(startX, (radius) + textOffset, midAngle);\r\n connectorX = point.y != 0 ? connectorX : parseFloat(connectorX.toFixed(12));\r\n connectorY = this.getYCordinate(startY, (radius) + textOffset, midAngle);\r\n\r\n if (dataLabel.template)\r\n size = point.size;\r\n else {\r\n var marker = point.marker ? point.marker : seriesMarker,\r\n marker = $.extend(true, {}, seriesMarker, marker);\r\n shape = marker.dataLabel.shape;\r\n size = measureText(commonEventArgs.data.text, $(chartObj.svgObject).width(), dataLabelFont);\r\n if (shape.toLowerCase() != \"none\") {\r\n size.height = size.height + margin.top + margin.bottom;\r\n size.width = size.width + margin.left + margin.right;\r\n }\r\n }\r\n\r\n midPoint = { midX: midX, midY: midY };\r\n doughnutMidPoint = { dMidX: dMidX, dMidY: dMidY };\r\n connector = { connectorX: connectorX, connectorY: connectorY };\r\n bounds = { midPoint: midPoint, doughnutMidPoint: doughnutMidPoint, connector: connector };\r\n startPoint = { startX: startX, startY: startY };\r\n\r\n if (!currentseries._enableSmartLabels) {\r\n position = seriesType.updateLabelPosition(currentseries, point, pointIndex, bounds, midAngle, startPoint, textOffset, size, sender, seriesIndex);\r\n positionX = position.positionX;\r\n positionY = position.positionY;\r\n connectorDirection = position.connectorDirection;\r\n }\r\n // smart labels\r\n\r\n else {\r\n position = seriesType.updateSmartLabelPosition(currentseries, point, pointIndex, bounds, midAngle, startPoint, textOffset, size, sender, seriesIndex);\r\n if (chartObj.model.bounds[seriesIndex].points[pointIndex])\r\n var isOverlapped = chartObj.model.bounds[seriesIndex].points[pointIndex].overlap;\r\n \t\tpositionX = position.positionX;\r\n\t\t\t\t\t\tpositionY = position.positionY;\r\n symbolPos = { positionX: positionX, positionY: positionY, isInterSected: position.isInterSected };\r\n connectorDirection = chartObj.model._isPieOfPie || isOverlapped ? \"\" : position.connectorDirection;\r\n }\r\n }\r\n\r\n var textAnchor = ((_labelPosition != 'inside' && _labelPosition != 'insidenooverlap') || ((type == \"pyramid\" || type == \"funnel\") && _labelPosition == 'outside')) ? (positionX < chartModel.circleCenterX[srIndex] ? 'end' : 'start') : 'middle',\r\n width = (_labelPosition == 'inside' || _labelPosition == 'insidenooverlap') ? 0 : (positionX < chartModel.circleCenterX[srIndex]) ? -textsize.width : textsize.width,\r\n pyrX = 0, pyrY = 0, textOptions;\r\n\r\n if ((type == \"pie\" || type == \"doughnut\" || type == \"pieofpie\") && _labelPosition == \"inside\")\r\n textAnchor = (connectorDirection != \"\") ? (positionX < chartModel.circleCenterX[srIndex] ? 'end' : 'start') : 'middle';\r\n if ((type == \"pyramid\" || type == \"funnel\") && _labelPosition == \"outside\")\r\n textAnchor = 'start';\r\n\r\n var subtitleHeight = (chartObj.model.title.subTitle.text === '') ? 0 : mesureSubTitle.height;\r\n if ((this.chartObj && chartModel.enableCanvasRendering) && (type == \"pyramid\" || type == \"funnel\")) {\r\n pyrX = ((legendPosition === \"left\") ? (legendActualBounds.Width) : 0) + elementSpacing + chartModel.margin.left;\r\n pyrY = ((legendPosition === \"top\") ? (legendActualBounds.Height) : 0) + ((chartTitle.text) ? (chartModel._titleLocation.Y + measureTitle.height + subtitleHeight) : (chartModel.margin.top + elementSpacing));\r\n }\r\n\r\n pointIndex = chartObj.model._isPieOfPie ? point.actualIndex : pointIndex;\r\n textOptions = this.textOption(currentseries, chartObj, textsize, pyrX, pyrY, pointIndex, textAnchor, positionX, positionY, seriesIndex, point);\r\n // to obtain the background color\r\n pointColor = jQuery.type(chartModel.pointColors[point.actualIndex]) == \"array\" ?\r\n chartModel.pointColors[point.actualIndex][0].color : chartModel.pointColors[point.actualIndex];\r\n // To set the point color when set the color in empty point\r\n pointColor = point.fill ? jQuery.type(point.fill) == \"array\" ? point.fill[0].color : point.fill : pointColor;\r\n if (dataLabel.template) {\r\n Location = isNull(Location) ? { X: positionX, Y: positionY } : Location;\r\n var pointindex = point.actualIndex;\r\n seriesType.drawLabelTemplate(currentseries, point, pointindex, Location, sender);\r\n if (connectorType == \"bezier\" && (position.bezierPath) != \"\")\r\n sender.svgRenderer.drawPolyline(position.bezierPath, sender.gConnectorEle[seriesIndex]);\r\n }\r\n else {\r\n $.each(chartModel.symbolShape, function (name) {\r\n marker = point.marker ? point.marker : seriesMarker;\r\n marker = $.extend(true, {}, seriesMarker, marker);\r\n shape = marker.dataLabel.shape;\r\n if (shape.toLowerCase() == name.toLowerCase())\r\n symbolName = name;\r\n });\r\n\r\n positionX = pyrX + positionX - (margin.left) / 2 + (margin.right) / 2 + width / 2;\r\n positionY = pyrY + positionY - (margin.top) / 2 + (margin.bottom) / 2;\r\n //SmartLabels value storing for pyramid and funnel\r\n if (type == \"pyramid\" || type == \"funnel\") {\r\n point.xPos = symbolPos.positionX + pyrX;\r\n point.yPos = symbolPos.positionY + pyrY;\r\n point.width = (symbolName == \"None\") ? textsize.width : textWidth;\r\n point.height = (symbolName == \"None\") ? textsize.height : textHeight;\r\n point.symbolName = (dataLabel.template) ? \"none\" : symbolName;\r\n point.textOptionsacc = textOptions;\r\n point.drawTextacc = commonEventArgs.data.text;\r\n }\r\n //For accurate placement of rotated data labels in canvas\r\n if (chartModel.enableCanvasRendering && (textOptions.degree % 360 != 0)) {\r\n textOptions.y -= (textsize.height / 4);\r\n textOptions.baseline = 'middle';\r\n }\r\n if (contrastColor && !currentseries._enableSmartLabels) {\r\n fontBackgroundColor = _labelPosition != \"inside\" ? (chartBackground === \"transparent\") ? \"white\" :\r\n chartBackground : pointColor;\r\n textOptions.fill = this._applySaturation(chartObj, fontBackgroundColor);\r\n }\r\n if (currentseries._enableSmartLabels) {\r\n var axisWidth = chartModel.m_AreaBounds.Width + chartModel.m_AreaBounds.X + chartModel.margin.left,\r\n labelPosition = _labelPosition,\r\n enableCanvasRendering = chartModel.enableCanvasRendering,\r\n datalabelText = (typeof commonEventArgs.data.text == \"string\") ? commonEventArgs.data.text : commonEventArgs.data.text.toString(),\r\n datalabelLength = measureText(datalabelText, datalabelText.length, dataLabelFont).width,\r\n legendBounds,\r\n remainingWidth,\r\n legendWidth = 0, legendHeight = 0;\r\n if (legend.visible) {\r\n if (legendPosition == \"left\" || legendPosition == \"right\")\r\n legendBounds = legendActualBounds;\r\n }\r\n else\r\n legendBounds = { Width: 0 };\r\n\r\n if (type == \"pie\" || type == \"doughnut\" || type == \"pieofpie\") {\r\n\r\n if (labelPosition == \"outside\" || labelPosition == \"outsideextended\" || connectorDirection != \"\") {\r\n if (chartModel.circleCenterX[srIndex] < textOptions.x)\r\n remainingWidth = (axisWidth - textOptions.x);\r\n else\r\n remainingWidth = legendPosition == \"left\" ? (textOptions.x - chartModel.margin.left - (chartModel.elementSpacing * 2) - legendBounds.Width) : (textOptions.x - chartModel.margin.left);\r\n datalabelText = this.trimfunction(datalabelText, remainingWidth, datalabelLength, \"...\", axisWidth, dataLabelFont);\r\n\r\n if (legend.visible && (legendPosition == 'top' || legendPosition == 'bottom')) {\r\n datalabelText = this._overlapLegend(textOptions, datalabelText, sender, seriesIndex);\r\n }\r\n }\r\n if (labelPosition == \"inside\" && (connectorDirection == \"\")) {\r\n datalabelText = this.labelTrim(chartObj, textOptions, datalabelLength, datalabelText, startX, startY, point, dataLabelFont, seriesIndex, pieSeriesIndex);\r\n\r\n if (datalabelText == \"\" && !chartObj.model._isPieOfPie) {\r\n point.smartLabelPosition = \"outside\";\r\n position = seriesType.updateSmartLabelPosition(currentseries, point, pointIndex, bounds, midAngle, startPoint, textOffset, size, sender, seriesIndex);\r\n symbolPos = { positionX: position.positionX, positionY: position.positionY, isInterSected: position.isInterSected };\r\n datalabelText = commonEventArgs.data.text;\r\n connectorDirection = position.connectorDirection;\r\n textAnchor = (chartModel.circleCenterX[srIndex] < position.positionX) ? \"start\" : \"end\";\r\n textOptions = this.textOption(currentseries, chartObj, textsize, pyrX, pyrY, pointIndex, textAnchor, position.positionX, position.positionY, seriesIndex, point);\r\n if (chartModel.circleCenterX[srIndex] < position.positionX)\r\n remainingWidth = legendPosition == \"right\" ? (axisWidth - textOptions.x - legendBounds) : (axisWidth - textOptions.x);\r\n else\r\n remainingWidth = legendPosition == \"left\" ? (textOptions.x - legendBounds) : (textOptions.x);\r\n datalabelText = this.trimfunction(datalabelText, remainingWidth, datalabelLength, \"...\", axisWidth, dataLabelFont);\r\n delete point.smartLabelPosition;\r\n }\r\n }\r\n }\r\n else if ((type == \"pyramid\" || type == \"funnel\")) {\r\n position = seriesType.updateSmartLabel(sender, currentseries, pointIndex, point);\r\n positionX = position.xPos;\r\n positionY = position.yPos;\r\n connectorDirection = position.connectorDirection;\r\n textOptions = position.textOptionsacc;\r\n datalabelText = point.drawTextacc;\r\n\r\n if ((connectorDirection != \"\" || connectorType == \"bezier\") && datalabelText != \"\") {\r\n datalabelText = datalabelText.toString();\r\n if (legendPosition == \"right\")\r\n remainingWidth = (enableCanvasRendering) ? (axisWidth - textOptions.x) : (axisWidth - textOptions.x - chartObj.pyrX);\r\n else if (legendPosition == \"left\")\r\n remainingWidth = enableCanvasRendering ? (axisWidth - textOptions.x) : (axisWidth - textOptions.x - chartObj.pyrX);\r\n else if (legendPosition == \"top\")\r\n remainingWidth = (enableCanvasRendering) ? (axisWidth - textOptions.x) : axisWidth - textOptions.x - chartObj.pyrX;\r\n else\r\n remainingWidth = (enableCanvasRendering) ? (axisWidth - textOptions.x) : axisWidth - textOptions.x - chartObj.pyrX;\r\n if (remainingWidth < datalabelLength)\r\n datalabelText = this.trimfunction(datalabelText, remainingWidth, datalabelLength, \"...\", axisWidth, dataLabelFont);\r\n }\r\n }\r\n\r\n var datalabelShape = measureText(datalabelText, null, dataLabelFont);\r\n if (type == \"pie\" || type == \"doughnut\" || type == \"pieofpie\")\r\n var width = ((_labelPosition == 'inside' || _labelPosition == 'insidenooverlap') && !symbolPos.isInterSected && connectorDirection == \"\") ? 0 : (positionX < chartModel.circleCenterX[srIndex]) ? -datalabelShape.width : datalabelShape.width;\r\n else if (type == \"pyramid\" || type == \"funnel\")\r\n var width = (point._labelPlacement == \"insidenooverlap\") ? 0 : datalabelShape.width;\r\n if (type == \"pie\" || type == \"doughnut\" || type == \"pieofpie\") {\r\n positionX = pyrX + symbolPos.positionX - (margin.left) / 2 + (margin.right) / 2 + (width / 2);\r\n positionY = pyrY + symbolPos.positionY - (margin.top) / 2 + (margin.bottom) / 2;\r\n }\r\n else {\r\n positionX = positionX - (margin.left) / 2 + (margin.right) / 2 + (width / 2);\r\n positionY = positionY - (margin.top) / 2 + (margin.bottom) / 2;\r\n }\r\n\r\n var dataLabelEle = $('#' + chartObj.svgObject.id + '_dataLabel_series' + seriesIndex + \"_point_\" + pointIndex);\r\n var conEle = $('#' + chartObj.svgObject.id + \"_connectorLine_series\" + seriesIndex + \"_point_\" + pointIndex);\r\n if (datalabelText !== \"\") {\r\n dataLabelEle.show();\r\n conEle.show();\r\n if (contrastColor) {\r\n fontBackgroundColor = labelPosition != \"inside\" ? (chartBackground === \"transparent\") ? \"white\" : chartBackground :\r\n (position.connectorDirection != \"\" && !ej.util.isNullOrUndefined(position.connectorDirection)\r\n || position.bezierPath != \"\" && !ej.util.isNullOrUndefined(position.bezierPath)) ?\r\n (chartBackground === \"transparent\") ? \"white\" : chartBackground : pointColor;\r\n textOptions.fill = this._applySaturation(chartObj, fontBackgroundColor);\r\n }\r\n if (!enableWrap && !isOverlapped) {\r\n seriesType.dataLabelSymbol(seriesIndex, currentseries, pointIndex, positionX, positionY, textWidth, textHeight, symbolName, chartObj);\r\n }\r\n if (connectorType == \"bezier\" && (position.bezierPath) != \"\" && !(ej.util.isNullOrUndefined(position.bezierPath)))\r\n sender.svgRenderer.drawPolyline(position.bezierPath, sender.gConnectorEle[seriesIndex]);\r\n }\r\n else {\r\n dataLabelEle.hide();\r\n conEle.hide();\r\n connectorDirection = \"\";\r\n }\r\n if (!enableWrap && !isOverlapped)\r\n chartObj.svgRenderer.drawText(textOptions, datalabelText, chartObj.gSeriesTextEle[seriesIndex]);\r\n var datalabelSize = measureText(datalabelText, datalabelText.length, dataLabelFont);\r\n var untrimmedSize = measureText(commonEventArgs.data.text, null, dataLabelFont);\r\n var bounds;\r\n var minX, minY, maxX, maxY;\r\n if (type == \"pie\" || type == \"doughnut\" || type == \"pieofpie\") {\r\n if (labelPosition == \"inside\" && position.connectorDirection == \"\") {\r\n minX = textOptions.x - datalabelShape.width / 2;\r\n maxX = textOptions.x + datalabelShape.width / 2;\r\n minY = textOptions.y - datalabelShape.height / 2;\r\n maxY = textOptions.y + datalabelShape.height / 2;\r\n }\r\n else {\r\n if (chartModel.circleCenterX[srIndex] < textOptions.x) {\r\n minX = textOptions.x;\r\n maxX = textOptions.x + datalabelShape.width;\r\n }\r\n else {\r\n minX = textOptions.x - datalabelShape.width;\r\n maxX = textOptions.x;\r\n }\r\n minY = textOptions.y - datalabelShape.height / 2;\r\n maxY = textOptions.y + datalabelShape.height / 3;\r\n }\r\n bounds = { centerX: chartModel.circleCenterX[srIndex], minX: minX, minY: minY, maxX: maxX, maxY: maxY, width: datalabelSize.width, height: datalabelSize.height, labelPosition: labelPosition };\r\n }\r\n\r\n if ((type == \"funnel\" || type == \"pyramid\")) {\r\n legendWidth = legendPosition == \"left\" ? legendWidth : 0;\r\n var legendHeight = 0;\r\n if (connectorDirection != \"\" || connectorType == \"bezier\") {\r\n minX = textOptions.x - legendWidth;\r\n maxX = textOptions.x + datalabelShape.width - legendWidth;\r\n minY = textOptions.y - datalabelShape.height;\r\n maxY = textOptions.y;\r\n }\r\n if (!enableCanvasRendering)\r\n bounds = { minX: minX + chartObj.pyrX + legendWidth, maxX: maxX + chartObj.pyrX + legendWidth, minY: minY + chartObj.pyrY + legendHeight, maxY: maxY + chartObj.pyrY + legendHeight, width: datalabelSize.width, height: datalabelSize.height, labelPosition: labelPosition };\r\n else\r\n bounds = { minX: minX + legendWidth, maxX: maxX + legendWidth, minY: minY + legendHeight, maxY: maxY + legendHeight, width: datalabelSize.width, height: datalabelSize.height, labelPosition: labelPosition };\r\n }\r\n accDataLabelRegion = { bounds: bounds, trimmedText: datalabelText, text: commonEventArgs.data.text, type: type, font: dataLabelFont };\r\n chartObj.accDataLabelRegion.type = type;\r\n chartObj.accDataLabelRegion.connectorDirection = connectorDirection;\r\n if (ej.util.isNullOrUndefined(chartObj.accDataLabelRegion[srIndex])) {\r\n chartObj.accDataLabelRegion[srIndex] = [];\r\n }\r\n\r\n if (chartObj.accDataLabelRegion[srIndex].length < currentseries._visiblePoints.length)\r\n chartObj.accDataLabelRegion[srIndex].push(accDataLabelRegion);\r\n if (((!isNull(point.index) && currentseries.explode) && (!enableCanvasRendering)))\r\n chartObj.accDataLabelRegion[srIndex].splice(point.index, 1, accDataLabelRegion);\r\n if (pieSeriesIndex == 1 && chartObj.accDataLabelRegion[srIndex].length == currentseries._visiblePoints.length) {\r\n chartObj.accDataLabelRegion[seriesIndex] = $.merge($.merge([], chartObj.accDataLabelRegion[0]), chartObj.accDataLabelRegion[1]);\r\n }\r\n }\r\n\r\n else if (!enableWrap && !isOverlapped) {\r\n seriesType.dataLabelSymbol(seriesIndex, currentseries, point.index, positionX, positionY, textWidth, textHeight, symbolName, chartObj);\r\n chartObj.svgRenderer.drawText(textOptions, commonEventArgs.data.text, chartObj.gSeriesTextEle[seriesIndex]);\r\n }\r\n\r\n if (enableWrap) {\r\n var labelTextSize = measureText(labelText, null, labelfont), maxWidth, collection, padding = 5;\r\n collection = this.updateWrappedText(textOptions, labelText, labelTextSize, point, type, startX, startY, radius, chartModel.innerRadius[seriesIndex], _labelPosition, dataLabel, (connectorType == \"bezier\") ? (currentseries._enableSmartLabels ? (!isNull(position.bezierPath) ? position.bezierPath.points : \"\") : position.points) : connectorDirection);\r\n datalabelText = collection.text;\r\n textOptions.x = parseFloat(collection.x); textOptions.y = parseFloat(collection.y);\r\n if (datalabelText != \"\" && !isOverlapped) {\r\n var x = (textOptions['text-anchor'] == 'start') ? parseFloat(textOptions.x + collection.width / 2) : (isNull(connectorDirection) || connectorDirection == \"\") ? parseFloat(textOptions.x) : parseFloat(textOptions.x - collection.width / 2);\r\n seriesType.dataLabelSymbol(seriesIndex, currentseries, pointIndex, x, textOptions.y + collection.height / 2 - labelTextSize.height / 2 - padding, collection.width, collection.height, symbolName, chartObj);\r\n }\r\n if (!isNull(connectorDirection) && connectorDirection != \"\") {\r\n var pyrX, pyrY;\r\n if (type == \"funnel\" || type == \"pyramid\") {\r\n pyrX = ((chartModel.enableCanvasRendering) ? this.chartObj.pyrX : 0);\r\n pyrY = ((chartModel.enableCanvasRendering) ? this.chartObj.pyrY : 0);\r\n }\r\n var connectorSegments = connectorDirection.split(\" \"), connectorLength = (_labelPosition == \"outsideextended\" && (type == \"pie\" || type == \"doughnut\")) ? connectorSegments.length - 2 : connectorSegments.length;\r\n connectorSegments[connectorLength - 1] = textOptions.y - pyrY + (collection.height / 2 - labelTextSize.height);//canvas connector line issue fix\r\n connectorSegments[connectorLength - 2] = textOptions.x - pyrX;//canvas connector line issue fix\r\n connectorDirection = connectorSegments.toString().replace(/,/g, \" \");\r\n }\r\n connectorDirection = (collection.exceed == false) ? \"\" : connectorDirection;\r\n\r\n if ((chartModel.enableCanvasRendering || this.chartObj.vmlRendering) && (typeof datalabelText == \"object\") && !isOverlapped) {\r\n for (var txt = 0, tempY = textOptions.y, tempX = textOptions.x; txt < datalabelText.length; txt++) {\r\n textOptions.y = parseFloat(tempY) + ((txt) * textsize.height);\r\n textOptions.x = tempX;\r\n chartObj.svgRenderer.drawText(textOptions, datalabelText[txt], chartObj.gSeriesTextEle[seriesIndex]);\r\n }\r\n }\r\n else if(!isOverlapped){\r\n chartObj.svgRenderer.drawText(textOptions, datalabelText, chartObj.gSeriesTextEle[seriesIndex]);\r\n }\r\n }\r\n }\r\n if ((type == \"pyramid\" || type == \"funnel\") && dataLabel.template && currentseries._enableSmartLabels) {\r\n position = seriesType.updateSmartLabel(sender, currentseries, pointIndex, point);\r\n positionX = position.xPos;\r\n positionY = position.yPos;\r\n connectorDirection = position.connectorDirection;\r\n\r\n }\r\n var translate = [];\r\n translate[0] = pyrX;\r\n translate[1] = pyrY;\r\n if ((connectorType != 'bezier' || chartObj.vmlRendering || (type == \"pyramid\" || type == \"funnel\")) && (connectorDirection != '')) {\r\n if (connectorDirection) {\r\n var connectorOptions = {\r\n 'id': chartObj.svgObject.id + \"_connectorLine_series\" + seriesIndex + \"_point_\" + pointIndex,\r\n 'stroke': (connectorLine.color) ? connectorLine.color : pointColor,\r\n 'stroke-width': connectorLine.width,\r\n 'd': connectorDirection\r\n };\r\n chartObj.svgRenderer.drawPath(connectorOptions, chartObj.gConnectorEle[seriesIndex], translate);\r\n }\r\n }\r\n }\r\n },\r\n\r\n _overlapLegend: function (textOptions, datalabelText, chart, seriesIndex) {\r\n\r\n var svgHeight = $(chart.svgObject).height(),\r\n svgWidth = $(chart.svgObject).width(),\r\n legendBounds = chart.model.LegendActualBounds,\r\n elementSpacing = chart.model.elementSpacing,\r\n margin = chart.model.series[seriesIndex].marker.dataLabel.margin,\r\n shape = chart.model.series[seriesIndex].marker.dataLabel.shape,\r\n top = shape != 'none' ? margin.top : 0,\r\n bottom = shape != 'none' ? margin.bottom : 0,\r\n textHeight = ej.EjSvgRender.utils._measureText((datalabelText, null, textOptions)).height,\r\n dataLabelEndPos = textOptions.y + textHeight + bottom,\r\n dataLabelTopPos = textOptions.y - top,\r\n legendPosition = chart.model.legend.position.toLowerCase(),\r\n title = chart.model.title,\r\n subTitle = title.subTitle,\r\n margin = chart.model.margin,\r\n borderSize = chart.model.border.width,\r\n modelsubTitleHeight = subTitle.text == \"\" ? 0 : ej.EjSvgRender.utils._measureText(subTitle.text, svgWidth - margin.left - margin.right, subTitle.font).height + elementSpacing,\r\n titleLocation = chart.model._titleLocation ? chart.model._titleLocation.Y : 0 + modelsubTitleHeight,\r\n text = datalabelText, legendPosY;\r\n\r\n\r\n if (legendPosition == 'bottom') {\r\n legendPosY = svgHeight - chart.model.LegendActualBounds.Height - elementSpacing;\r\n text = dataLabelEndPos > legendPosY ? '' : text;\r\n } else {\r\n legendPosY = titleLocation == 0 ? borderSize + elementSpacing : titleLocation + elementSpacing;\r\n text = dataLabelTopPos < (legendPosY + legendBounds.Height) ? '' : text;\r\n }\r\n if (dataLabelEndPos > svgHeight)\r\n text = '';\r\n return text;\r\n\r\n },\r\n\r\n updateWrappedText: function (textOptions, labelText, textSize, currentPoint, seriesType, centerX, centerY, radius, innerRadius, labelPlacement, dataLabel, connector) {\r\n var chartObj = this.chartObj,\r\n point = currentPoint,\r\n previousBoundary = {},\r\n textWidth = textSize.width,\r\n textHeight = textSize.height,\r\n wrapTrim,\r\n text, arrayText,\r\n textPosX = textOptions.x,\r\n textPosY = textOptions.y,\r\n segmentHeight,\r\n segmentWidth,\r\n midX = textPosX,\r\n exceed = true,\r\n areaSpace = chartObj.model.m_AreaBounds.X,\r\n midY = textPosY,\r\n connectorPoints,\r\n txtLength,\r\n textX, textY;\r\n if (!ej.util.isNullOrUndefined(connector) && connector != \"\") {\r\n if (typeof connector == \"object\") {\r\n textX = connector.X;\r\n textY = connector.Y;\r\n }\r\n else {\r\n connectorPoints = connector.split(\" \"),\r\n txtLength = (labelPlacement == \"outsideextended\") ? (connectorPoints.length - 2) : (dataLabel.connectorLine.type.toLowerCase() == \"bezier\") ? connectorPoints.length - 2 : connectorPoints.length;\r\n if (connectorPoints[txtLength - 1].indexOf(\",\") > -1) {\r\n var tempXY = connectorPoints[txtLength].split(\",\");\r\n textX = tempXY[0];\r\n textY = tempXY[1];\r\n }\r\n else {\r\n textX = connectorPoints[txtLength - 2];\r\n textY = connectorPoints[txtLength - 1];\r\n }\r\n }\r\n }\r\n if (seriesType == 'pie' || seriesType == 'doughnut') {\r\n if (labelPlacement == \"inside\") {\r\n var innerRadius = (ej.util.isNullOrUndefined(innerRadius)) ? 0 : innerRadius,\r\n chartStartingAngle = -.5 * Math.PI,\r\n startAngle = point.startAngle + chartStartingAngle,\r\n endAngle = point.endAngle + chartStartingAngle,\r\n midAngleRadian = point.midAngle + chartStartingAngle,\r\n midAngle = ((180 / Math.PI) * midAngleRadian) % 360,\r\n startANG = ((180 / Math.PI) * startAngle) % 360,\r\n endANG = ((180 / Math.PI) * endAngle) % 360,\r\n radiusTextPosPercentage = (seriesType == \"doughnut\") ? 0.75 : 0.5;\r\n midX = this.getXCordinate(centerX, (radius * radiusTextPosPercentage), midAngleRadian),\r\n midY = this.getYCordinate(centerY, (radius * radiusTextPosPercentage), midAngleRadian),\r\n startPointX = this.getXCordinate(centerX, (radius), startAngle),\r\n startPointY = this.getYCordinate(centerY, (radius), startAngle),\r\n endPointX = this.getXCordinate(centerX, (radius), endAngle),\r\n endPointY = this.getYCordinate(centerY, (radius), endAngle),\r\n midPointX = this.getXCordinate(centerX, (radius), midAngleRadian),\r\n midPointY = this.getYCordinate(centerY, (radius), midAngleRadian),\r\n innerCenterX = this.getXCordinate(centerX, innerRadius, midAngleRadian),\r\n innerCenterY = this.getYCordinate(centerY, innerRadius, midAngleRadian),\r\n segmentBounds = this.getSegementMinMax([startPointX, endPointX, (seriesType == \"doughnut\") ? innerCenterX : centerX, midPointX], [startPointY, endPointY, (seriesType == \"doughnut\") ? innerCenterY : centerY, midPointY]);\r\n segmentBounds.width = (segmentBounds.height > radius) ? segmentBounds.height : segmentBounds.width;\r\n segmentWidth = segmentBounds.width * 0.75;\r\n }\r\n else if (((labelPlacement == \"outside\" || labelPlacement == \"outsideextended\") && (seriesType == 'pie' || seriesType == 'doughnut')) && connector != \"\") {\r\n var areabounds = chartObj.model.m_AreaBounds,\r\n areaStartX = areaSpace,\r\n areaEndX = chartObj.svgWidth - areaSpace;\r\n segmentWidth = (textX <= centerX) ? (textX - areaStartX) : (areaEndX - textX);\r\n midX = textX;\r\n midY = textY;\r\n }\r\n }\r\n else {\r\n var svgWidth = chartObj.svgWidth;\r\n if (labelPlacement == \"outside\") {\r\n segmentWidth = svgWidth - (textX);\r\n }\r\n else {\r\n segmentWidth = point.width;\r\n var insidenooverap = chartObj.isPointInPolygon(point.Polygon, { x: midX + textWidth, y: midY });\r\n if (!insidenooverap) {\r\n segmentWidth = ((seriesType == \"funnel\") ? (point.Polygon[3].x - point.Polygon[4].x) : (point.Polygon[1].x - point.Polygon[0].x));\r\n segmentHeight = point.Polygon[3].y - point.Polygon[0].y;\r\n var changedHeight = Math.round(textWidth / segmentWidth) * textHeight, padding = 5,\r\n exceed = ((changedHeight >= (segmentHeight - (2 * padding))) || (segmentWidth <= 50)) ? true : false;\r\n if (!exceed) {\r\n textOptions[\"text-anchor\"] = \"middle\";\r\n midX = ((seriesType == \"funnel\") ? point.Polygon[4].x : point.Polygon[0].x) + (segmentWidth / 2) + ((chartObj.model.enableCanvasRendering) ? chartObj.pyrX : 0);\r\n midY = ((point.Polygon[0].y + point.Polygon[3].y) / 2) - (changedHeight / 2) + ((chartObj.model.enableCanvasRendering) ? chartObj.pyrY : 0);\r\n point._labelPlacement = \"insidenooverlap\";\r\n }\r\n else {\r\n segmentWidth = svgWidth - midX - areaSpace;\r\n }\r\n }\r\n }\r\n }\r\n if (labelPlacement == \"inside\" || (connector != \"\" || !ej.util.isNullOrUndefined(connector))) {\r\n maxWidth = (dataLabel.maximumLabelWidth != null) ? dataLabel.maximumLabelWidth : parseFloat(segmentWidth);\r\n text = labelText;\r\n wrapText = chartObj._rowsCalculation({ text: text.toString(), font: dataLabel.font }, maxWidth, wrapTrim);\r\n text = wrapText.textCollection;\r\n arrayText = $.extend([], text);\r\n for (var i = 0, temp; i < arrayText.length - 1; i++) {\r\n arrayText[i + 1] = arrayText[i].concat(\"
\", arrayText[i + 1]);\r\n }\r\n arrayText = arrayText[arrayText.length - 1];\r\n }\r\n else {\r\n text = \"\";\r\n }\r\n var changedText = ej.EjSvgRender.utils._measureText(arrayText, segmentWidth, dataLabel.font);\r\n changedText.height += (textHeight / 2);// size differing canvas and svg space between new line text more \r\n if ((seriesType == \"pie\" || seriesType == \"doughnut\") && (labelPlacement == \"inside\")) {\r\n midY = midY - (changedText.height / 2) + (textHeight / 2);\r\n text = (changedText.height > (segmentBounds.height)) ? \"\" : text;\r\n text = (changedText.width > (segmentBounds.width)) ? \"\" : text;\r\n if (text == \"\") {\r\n changedText.width = 0; changedText.height = 0;\r\n }\r\n }\r\n previousBoundary = (this.currentBoundary == 'undefined') ? \"undefined\" : this.currentBoundary;\r\n this.currentBoundary = ({ X: midX - (changedText.width / 2), Y: parseFloat(midY), Height: changedText.height, Width: changedText.width });\r\n if (!!previousBoundary && (point._labelPlacement != \"insidenooverlap\")) {\r\n var overlap = this.checkOverlapping(chartObj, this.currentBoundary, previousBoundary, seriesType, text, firstSegment, midAngle, labelPlacement, { startAngle: startAngle, endAngle: endAngle, radius: radius, centerX: centerX, centerY: centerY });\r\n\r\n if (overlap[1] && (overlap[2] != \"\")) {\r\n previousBoundary = overlap[0];\r\n midX = previousBoundary.X + (previousBoundary.Width / 2);\r\n midY = previousBoundary.Y;\r\n text = overlap[2];\r\n changedText.height = overlap[0].Height;\r\n changedText.width = overlap[0].Width;\r\n }\r\n else {\r\n text = overlap[2];\r\n }\r\n }\r\n else {\r\n firstSegment = this.currentBoundary;\r\n\r\n }\r\n exceed = (text == \"\") ? false : exceed;\r\n this.currentBoundary = (text == \"\") ? previousBoundary : this.currentBoundary;\r\n return { text: text, x: midX, y: midY, exceed: exceed, height: changedText.height, width: changedText.width };\r\n },\r\n checkOverlapping: function (chartObj, current, previous, seriesType, text, firstSegment, midAngle, labelPlacement, segmentBounds) {\r\n var gap = 10, overlap = false, textOverlap, xOverlap, yOverlap;\r\n textOverlap = this.getOverlapArea(current, previous);\r\n overlap = textOverlap.overlap;\r\n xOverlap = textOverlap.xOverlap;\r\n yOverlap = textOverlap.yOverlap;\r\n if (overlap) {\r\n if (seriesType == \"pie\" || seriesType == \"doughnut\") {\r\n if (labelPlacement.toLowerCase() == \"inside\") {\r\n var minDiff = (xOverlap >= yOverlap) ? \"Y\" : \"X\",\r\n flag;\r\n if (minDiff == \"X\") {\r\n flag = (midAngle > 0 && midAngle < 180) ? -1 : 1;\r\n current.X += flag * (xOverlap + gap);\r\n }\r\n else {\r\n flag = (midAngle > 90 && midAngle < 270) ? -1 : 1\r\n current.Y += (flag) * (yOverlap + gap);\r\n }\r\n\r\n }\r\n else {\r\n current.Y -= (yOverlap + gap);\r\n }\r\n }\r\n else if (seriesType == \"funnel\") {\r\n current.Y = (previous.Y - current.Height - gap);\r\n }\r\n else {\r\n current.Y = (previous.Y + previous.Height + gap);\r\n }\r\n }\r\n if ((seriesType == \"pie\" || seriesType == \"doughnut\" || seriesType == \"pieofpie\") && labelPlacement.toLowerCase() == \"inside\") {\r\n textOverlap = this.getOverlapArea(current, firstSegment);\r\n text = (textOverlap.overlap == true) ? \"\" : text;\r\n overlap = (textOverlap.overlap == true) ? true : overlap;\r\n var labelexceeding = this.checkSegmentExceeding(current, segmentBounds);\r\n text = (!labelexceeding) ? \"\" : text;\r\n }\r\n else if (seriesType == \"funnel\") {\r\n if ((current.Y + current.Height) >= previous.Y) {\r\n text = \"\";\r\n }\r\n }\r\n else if (seriesType == \"pyramid\") {\r\n if ((current.Y + current.Height) <= (previous.Y + previous.Height)) {\r\n text = \"\";\r\n }\r\n }\r\n var areaBounds = chartObj.model.m_AreaBounds;\r\n return [{ X: current.X, Y: current.Y, Height: current.Height, Width: current.Width }, overlap, text];\r\n },\r\n getOverlapArea: function (firstTextSegment, lastTextSegment) {\r\n var xOverlap = Math.max(0, Math.min((firstTextSegment.X + firstTextSegment.Width), (lastTextSegment.X + lastTextSegment.Width)) - Math.max(firstTextSegment.X, lastTextSegment.X)),\r\n yOverlap = Math.max(0, Math.min((firstTextSegment.Y + firstTextSegment.Height), (lastTextSegment.Y + lastTextSegment.Height)) - Math.max(firstTextSegment.Y, lastTextSegment.Y)),\r\n overlapArea = xOverlap * yOverlap;\r\n overlap = (overlapArea > 0) ? true : false;\r\n return { overlap: overlap, xOverlap: xOverlap, yOverlap: yOverlap };\r\n },\r\n getSegementMinMax: function (xArray, yArray) {\r\n var minX, maxX, minY, maxY, width, height;\r\n xArray.sort(function (a, b) { return a - b; });\r\n yArray.sort(function (a, b) { return a - b; });\r\n minX = xArray[0]; maxX = xArray[3]; minY = yArray[0]; maxY = yArray[3];\r\n width = maxX - minX;\r\n height = maxY - minY;\r\n return { minX: minX, maxX: maxX, minY: minY, maxY: maxY, width: width, height: height };\r\n },\r\n checkSegmentExceeding: function (textBounds, limits) {\r\n var inside = false, midPointX = textBounds.X + (textBounds.Width / 2), midPointY = textBounds.Y + (textBounds.Height / 2);\r\n var dx = midPointX - limits.centerX, dy = midPointY - limits.centerY, angle = Math.atan2(dy, dx), pointRadius = Math.abs(Math.sqrt(dx * dx + dy * dy));\r\n if (pointRadius <= limits.radius) {\r\n var PI = 2 * Math.PI;\r\n angle = (angle < 0) ? (PI + angle) : angle;\r\n limits.startAngle = (limits.startAngle < 0) ? (PI + limits.startAngle) : limits.startAngle;\r\n limits.endAngle = (limits.endAngle < 0) ? (PI + limits.endAngle) : limits.endAngle;\r\n if (angle <= limits.endAngle && angle >= limits.startAngle) {\r\n inside = true;\r\n }\r\n else if ((angle <= PI && angle >= limits.startAngle && limits.endAngle < limits.startAngle) || (angle > 0 && angle <= limits.endAngle && limits.startAngle > limits.endAngle)) {\r\n inside = true;\r\n }\r\n }\r\n return inside;\r\n },\r\n drawBezierSegment: function (controlpoints, currentseries, pointIndex, sender, seriesIndex) {\r\n //currentseries.points[pointIndex].marker = currentseries.points[pointIndex].marker ? currentseries.points[pointIndex].marker : {};\r\n //var marker = $.extend(true, {}, currentseries.marker, currentseries.points[pointIndex].marker);\r\n var polyLine = ej.EjSvgRender.utils._getStringBuilder();\r\n var seriesType = new ej.seriesTypes[currentseries.type.toLowerCase()]();\r\n for (var i = 0; i <= 16; i++) {\r\n var t = i / 16;\r\n var points = seriesType.GetBezierPoint(t, controlpoints, 0, controlpoints.length, currentseries);\r\n polyLine.append(points.X + \",\" + points.Y + \" \");\r\n }\r\n var connectorOptions = {\r\n 'id': sender.svgObject.id + \"_bezierLine_series\" + seriesIndex + \"_point\" + pointIndex,\r\n 'stroke': (currentseries.marker.dataLabel.connectorLine.color) ? currentseries.marker.dataLabel.connectorLine.color : sender.model.pointColors[pointIndex],\r\n 'stroke-width': currentseries.marker.dataLabel.connectorLine.width,\r\n 'fill': 'none',\r\n 'points': polyLine.toString()\r\n };\r\n if (!currentseries._enableSmartLabels)\r\n sender.svgRenderer.drawPolyline(connectorOptions, sender.gConnectorEle);\r\n else\r\n return connectorOptions;\r\n },\r\n GetBezierPoint: function (t, controlPoints, index, count, currentseries) {\r\n var seriesType = new ej.seriesTypes[currentseries.type.toLowerCase()]();\r\n if (count == 1)\r\n return controlPoints[index];\r\n var p0 = seriesType.GetBezierPoint(t, controlPoints, index, count - 1, currentseries);\r\n var p1 = seriesType.GetBezierPoint(t, controlPoints, index + 1, count - 1, currentseries);\r\n var x = (p0.X) ? p0.X : p0.x;\r\n var y = (p0.Y) ? p0.Y : p0.y;\r\n var x1 = (p1.X) ? p1.X : p1.x;\r\n var y1 = (p1.Y) ? p1.Y : p1.y;\r\n var X = (1 - t) * x + t * x1;\r\n var Y = (1 - t) * y + t * y1;\r\n if (p0.x)\r\n return { x: X, y: Y }\r\n else\r\n return { X: X, Y: Y };;\r\n\r\n\r\n\r\n // return new Point((1 - t) * p0.X + t * p1.X, (1 - t) * p0.Y + t * p1.Y);\r\n },\r\n\r\n drawLabelTemplate: function (series, point, pointIndex, location, sender) {\r\n // method for data label template\r\n if (sender)\r\n this.chartObj = sender;\r\n var areaBoundsX = this.chartObj.model.m_AreaBounds.X;\r\n var areaBoundsY = this.chartObj.model.m_AreaBounds.Y;\r\n var areaBoundsWidth = this.chartObj.model.m_AreaBounds.Width;\r\n var areaBoundsHeight = this.chartObj.model.m_AreaBounds.Height;\r\n var seriesIndex = $.inArray(series, this.chartObj.model._visibleSeries);\r\n var areaType = this.chartObj.model.AreaType;\r\n var currentSeries = this.chartObj.model.series[seriesIndex];\r\n var xPosition = 0, yPosition = 0;\r\n var chartContainer = this.chartObj._id;\r\n var marker = $.extend(true, {}, series.marker, point.marker);\r\n var style = { 'interior': marker.dataLabel.fill, 'opacity': marker.dataLabel.opacity, 'borderColor': marker.dataLabel.border.color, 'borderWidth': marker.dataLabel.border.width };\r\n var color, width, height;\r\n var type = this.chartObj.model.chartRegions[pointIndex] ? this.chartObj.model.chartRegions[pointIndex].type : \"\";\r\n if (areaType != \"none\" || this.chartObj.model.enable3D) {\r\n\r\n if ($('#template_group_' + chartContainer).length != 0)\r\n var templateContainer = $('#template_group_' + chartContainer);\r\n else\r\n templateContainer = $(\"
\").attr('id', \"template_group_\" + chartContainer);\r\n\r\n templateContainer.css('position', 'relative').css('z-index', 1000);\r\n if ($(\"#\" + marker.dataLabel.template).length == 0) // To check the specified div is in DOM\r\n return;\r\n else\r\n var cloneNode = $(\"#\" + marker.dataLabel.template).clone();\r\n $(cloneNode).attr(\"id\", marker.dataLabel.template + '_' + seriesIndex + '_' + pointIndex + '_' + chartContainer);\r\n var $cloneNode = $(cloneNode);\r\n $cloneNode.css(\"position\", \"absolute\");\r\n\r\n var pointX = point.x;\r\n point.dataLabeltemplate = true;\r\n point.id = marker.dataLabel.template + '_' + seriesIndex + '_' + pointIndex + '_' + chartContainer;\r\n if (series.xAxis._valueType.indexOf(\"datetime\") > -1)\r\n point.x = (ej.format(new Date(point.xValue), ((ej.util.isNullOrUndefined(series.xAxis.labelFormat)) ? (series.xAxis._valueType == \"datetime\" ? ej.EjSvgRender.utils._dateTimeLabelFormat(series.xAxis._intervalType, series.xAxis) : ej.EjSvgRender.utils._dateTimeLabelFormat(series.xAxis.intervalType, series.xAxis)) : series.xAxis.labelFormat), this.chartObj.model.locale));\r\n if (series.xAxis._valueType.toLowerCase() == \"category\")\r\n point.x = ej.EjSvgRender.utils._getLabelContent(pointIndex, series.xAxis, this.chartObj.model.locale);\r\n\r\n point.count = 1;\r\n var data = { series: series, point: point };\r\n $cloneNode.html($cloneNode.html().parseTemplate(data));\r\n\r\n point.x = pointX;\r\n var display = (areaType == \"cartesianaxes\" || !series.enableAnimation || (series.type.toLowerCase() == \"pyramid\" || series.type.toLowerCase() == \"funnel\")) ? \"block\" : \"none\";\r\n $cloneNode.css(\"display\", display).appendTo($(templateContainer));\r\n //template_group_container Div appended in chartcontainer_container Div \r\n $(templateContainer).appendTo('#' + 'chartContainer_' + chartContainer);\r\n var areaBound = this.chartObj.model.m_AreaBounds;\r\n if (areaType == \"cartesianaxes\" && !this.chartObj.model.enable3D) {\r\n xPosition = areaBound.X + (this.chartObj.model.requireInvertedAxes ? currentSeries.yAxis.plotOffset : currentSeries.xAxis.plotOffset);\r\n yPosition = currentSeries.yAxis.y;\r\n }\r\n width = $cloneNode.width() / 2;\r\n height = $cloneNode.height();\r\n if (ej.util.isNullOrUndefined(style) && style.interior)\r\n color = style.interior;\r\n else\r\n color = (areaType == \"none\") ? this.chartObj.model.pointColors[pointIndex] : this.chartObj.model.seriesColors[seriesIndex];\r\n }\r\n else {\r\n if (ej.util.isNullOrUndefined(style) && style.interior)\r\n color = style.interior;\r\n else\r\n color = this.chartObj.model.pointColors[pointIndex];\r\n width = this.chartObj.model.circleCenterX[seriesIndex] > location.X ? point.size.width : 0;\r\n $cloneNode = $('#template_group_' + chartContainer).find(\"#\" + marker.dataLabel.template + '_' + seriesIndex + '_' + pointIndex + '_' + chartContainer);\r\n point.id = marker.dataLabel.template + '_' + seriesIndex + '_' + pointIndex + '_' + chartContainer;\r\n height = (!this.chartObj.model.enable3D) ? point.size.height / 2 : 0;\r\n }\r\n\r\n if (currentSeries.type == 'hilo' || currentSeries.type == 'hiloopenclose' || currentSeries.type == 'candle')\r\n color = currentSeries._visiblePoints[pointIndex]._hiloFill;\r\n color = jQuery.type(color) == \"array\" ? color[0].color : color;\r\n\r\n\r\n if (currentSeries.type.indexOf(\"bar\") != -1) {\r\n var left = location.X + xPosition - width;\r\n var top = location.Y + ((!this.chartObj.model.enable3D) ? areaBound.Y : 0) - height + currentSeries.xAxis.plotOffset;\r\n var right = location.X + xPosition + width;\r\n } else {\r\n var left = location.X + xPosition - width;\r\n var top = yPosition + location.Y - height;\r\n var right = location.X + xPosition + width;\r\n }\r\n var backgroundColor = $cloneNode[0].style.backgroundColor;\r\n $cloneNode.css(\"left\", left).css(\"top\", top).css(\"background-color\", (backgroundColor != '' ? backgroundColor : color)).css(\"display\", \"block\").css(\"cursor\", \"default\");\r\n\r\n if (this.chartObj.model.AreaType != \"cartesianaxes\") {\r\n point.xPos = left - this.chartObj.pyrX;\r\n point.yPos = top - this.chartObj.pyrY;\r\n point.textOptionsacc = { x: left - this.chartObj.pyrX, y: top - this.chartObj.pyrY };\r\n }\r\n else {\r\n if (point.y == point.low) {\r\n point.xPosLow = left;\r\n point.yPosLow = top;\r\n point.textOptionsLow = { x: left, y: top };\r\n point.dataLabelLow = { textX: left, textY: top, x: left, y: top };\r\n }\r\n else {\r\n point.xPos = left;\r\n point.yPos = top;\r\n point.seriesIndex = seriesIndex;\r\n point.textOptions = { x: left, y: top };\r\n point.dataLabel = { textX: left, textY: top, x: left, y: top };\r\n point.margin = { top: 0, bottom: 0, left: 0, right: 0 };\r\n }\r\n }\r\n point.height = $cloneNode.outerHeight();\r\n point.width = $cloneNode.outerWidth();\r\n var topHeight, leftWidth, rightWidth;\r\n topHeight = leftWidth = rightWidth = 0;\r\n var bottomHeight = 0;\r\n if (areaType == \"cartesianaxes\") {\r\n if ((left > xPosition + areaBound.Width || top + height > areaBound.Y + areaBound.Height) || ((left < xPosition || top < yPosition || left > xPosition + areaBound.Width || top > yPosition + areaBound.Height || right > areaBound.Width + areaBound.X))) {\r\n width = $cloneNode.outerWidth();\r\n if (left < areaBoundsX) {\r\n leftWidth = areaBoundsX - left;\r\n }\r\n if (areaBoundsHeight + areaBoundsY < top + height) {\r\n var excessHeight = (top + height) - (areaBoundsHeight + areaBoundsY);\r\n bottomHeight = height - excessHeight;\r\n }\r\n if (top < areaBoundsY) {\r\n topHeight = areaBoundsY - top;\r\n }\r\n if (areaBoundsWidth + areaBoundsX < left + width) {\r\n var excessWidth = (left + width) - (areaBoundsWidth + areaBoundsX);\r\n rightWidth = width - excessWidth;\r\n }\r\n rightWidth = (rightWidth == 0) ? width : rightWidth;\r\n bottomHeight = (bottomHeight == 0) ? height : bottomHeight;\r\n if (!currentSeries.marker.dataLabel.showEdgeLabels) {\r\n document.getElementById($cloneNode[0].id).style.clip = \"rect(\" + topHeight + \"px,\" +\r\n rightWidth + \"px,\" +\r\n bottomHeight + \"px,\" +\r\n leftWidth + \"px)\";\r\n }\r\n }\r\n }\r\n },\r\n\r\n animateLabelTemplate: function (options) {\r\n // method to animate data label template\r\n var seriesIndex = $.inArray(options, this.chartObj.model._visibleSeries);\r\n var length = options._visiblePoints.length;\r\n var secondsPerPoint = 1000;\r\n\r\n for (var i = 0; i < length; i++) {\r\n var ele = options.marker.dataLabel.template + '_' + seriesIndex + '_' + i + '_' + this.chartObj._id;\r\n ele = $('#' + ele);\r\n ele.css(\"display\", \"none\");\r\n ele.delay(secondsPerPoint).fadeIn(300);\r\n }\r\n },\r\n\r\n textPosition: function (series, seriesIndex, point, textOffset, type, x, y, chartRegionIndex, index, params) {\r\n var marker = $.extend(true, {}, series.marker, point.marker),\r\n dataLabel = marker.dataLabel,\r\n horizontalTextAlignment = dataLabel.horizontalTextAlignment.toLowerCase(),\r\n verticalTextAlignment = dataLabel.verticalTextAlignment.toLowerCase(),\r\n textPosition = dataLabel.textPosition.toLowerCase(),\r\n visiblePointLength = series._visiblePoints.length,\r\n seriesPointIndex = chartRegionIndex,\r\n lineHeight = 10,\r\n padding = 3,\r\n margin = dataLabel.margin,\r\n isYInversed = series.yAxis.isInversed,\r\n xOrigin = this.chartObj._getXCrossValue(series, series.xAxis, params);\r\n var seriesType = (type.indexOf(\"bar\") != -1 || (type.indexOf(\"column\") != -1 && type != \"rangecolumn\")) ? (this.chartObj.model.requireInvertedAxes) ? \"bar\" : \"column\" : type;\r\n if (seriesType == 'column' || seriesType == 'stackingcolumn' || seriesType == 'stackingcolumn100') {\r\n var bounds = this.chartObj.model.chartRegions[seriesPointIndex].Region.Bounds,\r\n originChanged = params.axes[series.xAxis.name]._validCross || false;\r\n pointHeight = bounds.Height,\r\n pointWidth = bounds.Width;\r\n\r\n if (!originChanged) {\r\n if (textPosition == \"bottom\") {\r\n if ((point.y >= xOrigin && !series.yAxis.isInversed) || (point.y < xOrigin && series.yAxis.isInversed))\r\n y = y + pointHeight - margin.bottom;\r\n else\r\n y = textOffset.height + margin.bottom;\r\n } else if (textPosition == \"middle\") {\r\n if ((point.y > xOrigin && !series.yAxis.isInversed) || (point.y < xOrigin && series.yAxis.isInversed))\r\n y += pointHeight / 2 + (textOffset.height) / 4;\r\n else\r\n y -= pointHeight / 2;\r\n }\r\n else {\r\n if ((point.y > xOrigin && series.yAxis.isInversed) || (point.y < xOrigin && !series.yAxis.isInversed))\r\n y += lineHeight;\r\n else\r\n y -= lineHeight;\r\n }\r\n }\r\n else {\r\n var origin = Math.abs((isYInversed ? series.yAxis.visibleRange.min : series.yAxis.visibleRange.max) - xOrigin) / series.yAxis.visibleRange.delta * series.yAxis.height;\r\n if (textPosition == \"bottom\") {\r\n if (y <= origin)\r\n y = y + pointHeight - margin.bottom;\r\n else\r\n y = y - pointHeight + textOffset.height - margin.bottom;\r\n } else if (textPosition == \"middle\") {\r\n if (y < origin)\r\n y += pointHeight / 2 + (textOffset.height) / 4;\r\n else\r\n y -= pointHeight / 2;\r\n }\r\n else {\r\n if ((y < origin && isYInversed) || (y < origin && !isYInversed))\r\n y -= (lineHeight + (2 * textOffset.height) / 2);\r\n else\r\n y += (lineHeight + (2 * textOffset.height) / 2);\r\n }\r\n }\r\n\r\n if (horizontalTextAlignment && horizontalTextAlignment == \"far\")\r\n x += pointWidth / 2;\r\n else if (horizontalTextAlignment && horizontalTextAlignment == \"near\")\r\n x -= pointWidth / 2;\r\n\r\n if (verticalTextAlignment && verticalTextAlignment == \"near\") {\r\n if (textPosition == \"bottom\")\r\n y += lineHeight;\r\n else\r\n y += lineHeight - padding;\r\n }\r\n else if (verticalTextAlignment && verticalTextAlignment == \"far\") {\r\n if (textPosition == \"bottom\")\r\n y -= lineHeight;\r\n else\r\n y -= lineHeight;\r\n }\r\n }\r\n\r\n else if (seriesType.indexOf(\"bar\") != -1) {\r\n var bounds = this.chartObj.model.chartRegions[seriesPointIndex].Region.Bounds,\r\n pointWidth = bounds.Width,\r\n originChanged = params.axes[series.xAxis.name]._validCross || false,\r\n pointHeight = bounds.Height;\r\n y = y + textOffset.height / 4;\r\n if (!originChanged) {\r\n if (textPosition == \"bottom\") {\r\n if ((point.y >= 0 && !series.yAxis.isInversed) || (point.y < 0 && series.yAxis.isInversed))\r\n x = (seriesType.indexOf(\"stacking\") == -1 && seriesIndex > 0) ? x - pointWidth + textOffset.width / 2 : margin.left + textOffset.width / 4;\r\n else\r\n x += (pointWidth - textOffset.height - margin.right);\r\n } else if (textPosition == \"middle\") {\r\n if ((point.y > 0 && !series.yAxis.isInversed) || (point.y < 0 && series.yAxis.isInversed))\r\n x -= pointWidth / 2 + textOffset.width / 2;\r\n else\r\n x += pointWidth / 2;\r\n } else {\r\n if ((point.y >= 0 && !series.yAxis.isInversed) || (point.y < 0 && series.yAxis.isInversed))\r\n x += textOffset.width / 4 + lineHeight;\r\n else\r\n x -= textOffset.width / 4 + lineHeight;\r\n }\r\n }\r\n else {\r\n var yOrigin = series.xAxis._crossValue || 0,\r\n origin = Math.abs(isYInversed ? series.yAxis.visibleRange.max : series.yAxis.visibleRange.min - yOrigin) / series.yAxis.visibleRange.delta * series.yAxis.width;\r\n if (textPosition == \"bottom\") {\r\n if ((x < origin && !isYInversed) || (x >= origin && isYInversed))\r\n x = x + pointWidth - textOffset.width;\r\n else\r\n x = x - pointWidth + margin.left;\r\n } else if (textPosition == \"middle\") {\r\n if ((x < origin && !isYInversed) || (x >= origin && isYInversed))\r\n x = x + pointWidth / 2 - textOffset.width / 2;\r\n else\r\n x = x - pointWidth / 2 - textOffset.width / 2;\r\n }\r\n else {\r\n if ((x < origin && !isYInversed) || (x >= origin && isYInversed))\r\n x -= (lineHeight + (2 * textOffset.width) / 2);\r\n else\r\n x += (lineHeight + (2 * textOffset.width) / 2);\r\n }\r\n }\r\n\r\n if (horizontalTextAlignment && horizontalTextAlignment == \"far\") {\r\n if (textPosition == \"bottom\")\r\n x += textOffset.width - textOffset.width / 4;\r\n else\r\n x += textOffset.width / 4 + lineHeight;\r\n }\r\n else if (horizontalTextAlignment && horizontalTextAlignment == \"near\") {\r\n if (textPosition == \"bottom\")\r\n x -= textOffset.width / 4;\r\n else\r\n x -= lineHeight - textOffset.width / 4 - padding;\r\n }\r\n else // for center\r\n x += textOffset.width / 4;\r\n\r\n if (verticalTextAlignment && verticalTextAlignment == \"near\")\r\n y += pointHeight / 2;\r\n else if (verticalTextAlignment && verticalTextAlignment == \"far\")\r\n y -= pointHeight / 2;\r\n }\r\n else if (seriesType == \"rangecolumn\") {\r\n var bounds = this.chartObj.model.chartRegions[seriesPointIndex].Region.Bounds;\r\n var height = 0;\r\n var width = 0;\r\n if (point.high != point.y) {\r\n height = bounds.Height;\r\n width = bounds.Width;\r\n }\r\n if (this.chartObj.model.requireInvertedAxes) {\r\n if (textPosition == \"top\")\r\n x = x - width + (lineHeight + (2 * textOffset.width) / 2);\r\n else if (textPosition == \"bottom\")\r\n x = x - width - (2 * textOffset.width + lineHeight);\r\n else if (textPosition == \"middle\")\r\n x = x - width;\r\n }\r\n else {\r\n if (textPosition == \"top\")\r\n y += height - lineHeight;\r\n\r\n else if (textPosition == \"bottom\")\r\n y = y + height + (2 * textOffset.height + lineHeight);\r\n else if (textPosition == \"middle\")\r\n y = y + height;\r\n }\r\n if (horizontalTextAlignment && horizontalTextAlignment.toLowerCase() == \"far\")\r\n x += bounds.Width / 2;\r\n else if (horizontalTextAlignment && horizontalTextAlignment.toLowerCase() == \"near\")\r\n x -= bounds.Width / 2;\r\n if (verticalTextAlignment && verticalTextAlignment.toLowerCase() == \"near\")\r\n y += lineHeight - padding;\r\n else if (verticalTextAlignment && verticalTextAlignment.toLowerCase() == \"far\")\r\n y -= lineHeight;\r\n\r\n }\r\n\r\n else if (seriesType == \"boxandwhisker\") {\r\n var bounds = this.chartObj.model.chartRegions[seriesPointIndex].Region.Bounds;\r\n var height = 0;\r\n var width = 0;\r\n if (this.chartObj.model.requireInvertedAxes) {\r\n if (textPosition == \"top\")\r\n x = x - width + (lineHeight + (2 * textOffset.width) / 2);\r\n else if (textPosition == \"bottom\")\r\n x = x - width - (2 * textOffset.width + lineHeight);\r\n else if (textPosition == \"middle\")\r\n x = x - width;\r\n }\r\n else {\r\n if (textPosition == \"top\")\r\n y += height - padding;\r\n else if (textPosition == \"bottom\")\r\n // y = y + height + (2 * textOffset.height + lineHeight);\r\n y += height + lineHeight + (textOffset.width / 2);\r\n else if (textPosition == \"middle\")\r\n y += height + lineHeight;\r\n }\r\n if (horizontalTextAlignment && horizontalTextAlignment.toLowerCase() == \"far\")\r\n x += 2 * textOffset.width;\r\n else if (horizontalTextAlignment && horizontalTextAlignment.toLowerCase() == \"near\")\r\n x -= 2 * textOffset.width;\r\n\r\n if (verticalTextAlignment && verticalTextAlignment.toLowerCase() == \"near\")\r\n y = (textPosition == \"top\") ? y + lineHeight : y - lineHeight;\r\n else if (verticalTextAlignment && verticalTextAlignment.toLowerCase() == \"far\")\r\n y = (textPosition == \"top\") ? y - lineHeight : y + lineHeight;\r\n\r\n }\r\n\r\n else if (type == \"waterfall\") {\r\n var bounds = this.chartObj.model.chartRegions[seriesPointIndex].Region.Bounds,\r\n pointHeight = bounds.Height,\r\n pointWidth = bounds.Width;\r\n\r\n var isNegativePoint = point.waterfallSum < 0 || (!point.showIntermediateSum && !point.showTotalSum && point.y < 0);\r\n\r\n switch (textPosition) {\r\n case \"bottom\":\r\n if (!series.isTransposed) {\r\n if (!series.yAxis.isInversed)\r\n y = y + pointHeight - margin.bottom - (isNegativePoint ? pointHeight : 0);\r\n else\r\n y = y - textOffset.height + margin.bottom + (isNegativePoint ? pointHeight : 0);\r\n } else {\r\n if (!series.yAxis.isInversed)\r\n x = x - pointWidth + (lineHeight + (2 * textOffset.height) / 2) + (isNegativePoint ? pointWidth : 0);\r\n else\r\n x = x + pointWidth - (lineHeight + (2 * textOffset.height) / 2) - (isNegativePoint ? pointWidth : 0);\r\n }\r\n break;\r\n\r\n case \"middle\":\r\n if (!series.isTransposed) {\r\n if (!series.yAxis.isInversed)\r\n y = y + (pointHeight / 2 + (textOffset.height) / 4) - (isNegativePoint ? pointHeight : 0);\r\n else\r\n y = y - (pointHeight / 2) + (isNegativePoint ? pointHeight : 0);\r\n } else {\r\n if (!series.yAxis.isInversed)\r\n x = x - (pointWidth / 2 + (textOffset.width) / 4) + (isNegativePoint ? pointWidth : 0);\r\n else\r\n x = x + (pointWidth / 2) - (isNegativePoint ? pointWidth : 0);\r\n }\r\n break;\r\n\r\n default:\r\n if (!series.isTransposed) {\r\n if (!series.yAxis.isInversed)\r\n y = y - (lineHeight + (2 * textOffset.height) / 2) - (isNegativePoint ? pointHeight : 0);\r\n else\r\n y = y + (lineHeight + (2 * textOffset.height) / 2) + (isNegativePoint ? pointHeight : 0);\r\n } else {\r\n if (!series.yAxis.isInversed)\r\n x = x + (lineHeight + (2 * textOffset.height) / 2) + (isNegativePoint ? pointWidth : 0);\r\n else\r\n x = x - (lineHeight + (2 * textOffset.height) / 2) - (isNegativePoint ? pointWidth : 0);\r\n }\r\n }\r\n\r\n if (horizontalTextAlignment && horizontalTextAlignment == \"far\")\r\n x += pointWidth / 2;\r\n else if (horizontalTextAlignment && horizontalTextAlignment == \"near\")\r\n x -= pointWidth / 2;\r\n\r\n if (verticalTextAlignment && verticalTextAlignment == \"near\") {\r\n if (textPosition == \"bottom\")\r\n y += textOffset.height / 3;\r\n else\r\n y += (textOffset.height + lineHeight);\r\n }\r\n else if (verticalTextAlignment && verticalTextAlignment == \"far\") {\r\n if (textPosition == \"bottom\")\r\n y -= textOffset.height / 3;\r\n else\r\n y -= (lineHeight + (textOffset.height) / 2);\r\n }\r\n\r\n }\r\n else if (type == \"polar\" || type == \"radar\") {\r\n y += textOffset.height / 4;\r\n if (textPosition == \"bottom\")\r\n y += (textOffset.height);\r\n else if (textPosition == \"top\")\r\n y -= (textOffset.height);\r\n\r\n if (horizontalTextAlignment && horizontalTextAlignment == \"far\")\r\n x += textOffset.width;\r\n else if (horizontalTextAlignment && horizontalTextAlignment == \"near\")\r\n x -= (textOffset.width);\r\n\r\n if (verticalTextAlignment && verticalTextAlignment == \"near\")\r\n y += (textOffset.height) / 2;\r\n else if (verticalTextAlignment && verticalTextAlignment == \"far\")\r\n y -= ((textOffset.height) / 2);\r\n }\r\n else {\r\n if ((seriesType == \"rangearea\") && (point.high != point.y)) {\r\n if (this.chartObj.model.series.length == 1) {\r\n var length = this.chartObj.model.chartRegions[seriesIndex][index].region.length;\r\n y = this.chartObj.model.chartRegions[seriesIndex][index].region[length - 1].Y;\r\n x = this.chartObj.model.chartRegions[seriesIndex][index].region[length - 1].X;\r\n }\r\n else {\r\n var precount = 0;\r\n for (var a = 0; a < seriesIndex; a++) {\r\n var pretype = this.chartObj.model.series[a].type;\r\n if (pretype != \"rangearea\")\r\n precount = precount + this.chartObj.model.series[a].points.length;\r\n else\r\n precount = precount + 1;\r\n\r\n }\r\n var length = this.chartObj.model.chartRegions[precount][index].region.length;\r\n y = this.chartObj.model.chartRegions[precount][index].region[length - 1].Y;\r\n x = this.chartObj.model.chartRegions[precount][index].region[length - 1].X;\r\n }\r\n\r\n\r\n }\r\n if (this.chartObj.model.requireInvertedAxes) {\r\n if (textPosition == \"top\")\r\n x += lineHeight;\r\n else if (textPosition == \"bottom\")\r\n x -= (lineHeight + (2 * textOffset.width) / 2);\r\n }\r\n else {\r\n if (textPosition == \"bottom\") {\r\n if (dataLabel.showEdgeLabels)\r\n y += (2 * textOffset.height - lineHeight);\r\n else\r\n y += (2 * textOffset.height + lineHeight);\r\n }\r\n else if (textPosition == \"top\")\r\n y -= lineHeight;\r\n }\r\n if (horizontalTextAlignment && horizontalTextAlignment == \"far\")\r\n x += textOffset.width + lineHeight;\r\n else if (horizontalTextAlignment && horizontalTextAlignment == \"near\")\r\n x -= ((textOffset.width) + lineHeight);\r\n\r\n if (verticalTextAlignment && verticalTextAlignment == \"near\")\r\n y += lineHeight - padding;\r\n else if (verticalTextAlignment && verticalTextAlignment == \"far\")\r\n y -= lineHeight;\r\n else {\r\n if ((type == \"bubble\" || type == \"scatter\") && textPosition == \"middle\")\r\n y += textOffset.height / 4; // for placing the data label at the center of bubble\r\n }\r\n }\r\n var location = { x: x, y: y };\r\n return location;\r\n },\r\n\r\n\r\n\r\n\r\n changeCrossHairSymbol: function (element, track, ptIndex, serIndex, series) {\r\n var drawType = series.drawType;\r\n if (!ej.util.isNullOrUndefined(track)) {\r\n var trackMarker = {};\r\n element = $.extend(true, {}, series.marker, element);\r\n trackMarker = $.extend(true, {}, this.chartObj.model.crosshair.marker, trackMarker);\r\n var point = series.points[ptIndex], seriesType = series.type.toLowerCase();\r\n if (ej.util.isNullOrUndefined(trackMarker.shape)) {\r\n trackMarker.shape = element.shape;\r\n if (seriesType == 'bubble') {\r\n trackMarker.border.color = ((point.border) && point.border.color) ? point.border.color : series.border.color;\r\n trackMarker.border.width = ((point.border) && point.border.width) ? point.border.width : series.border.width;\r\n }\r\n }\r\n\r\n if ((!this.chartObj.model.crosshair.visible || ej.util.isNullOrUndefined(trackMarker.fill)) && series.type.toLowerCase() != \"bubble\" && series.type.toLowerCase() != \"scatter\" && (drawType != \"scatter\")) {\r\n if (trackMarker.shape.toLowerCase() == \"cross\" || trackMarker.shape.toLowerCase() == \"horizline\" || trackMarker.shape.toLowerCase() == \"vertline\")\r\n trackMarker.fill = jQuery.type(this.chartObj.model.seriesColors[serIndex]) == \"array\" ? this.chartObj.model.seriesColors[serIndex][0].color : this.chartObj.model.seriesColors[serIndex];\r\n else\r\n trackMarker.fill = element.border.color;\r\n }\r\n if (series.type.toLowerCase() == \"bubble\" && !this.chartObj.model.enableCanvasRendering) {\r\n var box = $(this.chartObj.gSeriesEle).find(\"#\" + this.chartObj.svgObject.id + '_Series' + serIndex + '_Point' + ptIndex)[0].getBoundingClientRect();\r\n trackMarker.size.width = (box.right - box.left) / 2 + 15;\r\n trackMarker.size.height = (box.bottom - box.top) / 2 + 15;\r\n } else {\r\n if (trackMarker.size.width <= element.size.width)\r\n trackMarker.size.width = element.size.width + 2;\r\n if (trackMarker.size.height <= element.size.height)\r\n trackMarker.size.height = element.size.height + 2;\r\n\r\n if (ej.util.isNullOrUndefined(trackMarker.border.color) || !this.chartObj.model.crosshair.visible) {\r\n if (!ej.util.isNullOrUndefined(element.fill))\r\n trackMarker.border.color = jQuery.type(element.fill) == \"array\" ? element.fill._gradientStop[0].color : element.fill;\r\n else if (seriesType == 'scatter') {\r\n trackMarker.border.color = ((point.border) && point.border.color) ? point.border.color : series.border.color;\r\n trackMarker.border.width = ((point.border) && point.border.width) ? point.border.width : series.border.width;\r\n }\r\n else\r\n trackMarker.border.color = (point.fill) ? point.fill : (jQuery.type(this.chartObj.model.seriesColors[serIndex]) == \"array\" ? this.chartObj.model.seriesColors[serIndex][0].color : this.chartObj.model.seriesColors[serIndex]);\r\n }\r\n }\r\n }\r\n series._trackMarker = trackMarker;\r\n return trackMarker;\r\n\r\n\r\n },\r\n\r\n dataLabelSymbol: function (seriesIndex, series, pointIndex, x, y, width, height, symbolName, sender, group) {\r\n var chartObj = sender;\r\n if (symbolName == 'None')\r\n return;\r\n var point = chartObj.model._isPieOfPie ? ej.ejChart._getPieOfPiePoint(pointIndex, series) : series._visiblePoints[pointIndex];\r\n var location = { startX: x, startY: y };\r\n if (!sender.model.enable3D)\r\n var symbolEle = group ? group : chartObj.gDataLabelEle[seriesIndex];\r\n symbolEle = chartObj.model.enableCanvasRendering ? null : symbolEle;\r\n var element = $.extend(true, {}, series.marker, point.marker);\r\n var gradientName = \"symbol\";\r\n var style = { 'interior': element.dataLabel.fill, 'opacity': element.dataLabel.opacity, 'borderColor': element.dataLabel.border.color, 'borderWidth': element.dataLabel.border.width };\r\n var options = {\r\n 'style': style,\r\n 'gradientName': gradientName,\r\n 'symbolEle': symbolEle,\r\n 'width': width,\r\n 'height': height,\r\n 'point': point,\r\n 'location': location,\r\n 'seriesIndex': seriesIndex,\r\n 'pointIndex': pointIndex,\r\n 'element': element,\r\n 'symbolName': symbolName,\r\n 'id': chartObj.svgObject.id + '_dataLabel_series' + seriesIndex + \"_\" + pointIndex\r\n };\r\n this.drawSymbolStyle(options, chartObj);\r\n },\r\n\r\n drawSymbolStyle: function (options, sender) {\r\n var chartObj = sender;\r\n var borderColor, borderWidth, opacity;\r\n var style = options.style, gradientName = options.gradientName, symbolEle = options.symbolEle,\r\n width = options.width, dashArray = options.dashArray;\r\n var height = options.height, point = options.point, location = options.location,\r\n seriesIndex = options.seriesIndex, visibility = options.visibility;\r\n var pointIndex = options.pointIndex, element = options.element, symbolName = options.symbolName;\r\n var trackSymbol = options.trackSymbol;\r\n var isCanvas = chartObj.model.enableCanvasRendering;\r\n var isPolar = chartObj.model.AreaType == 'polaraxes';\r\n var series = chartObj.model.series[seriesIndex];\r\n\r\n if (style != null) {\r\n if (style.borderColor != \"\")\r\n borderColor = style.borderColor ? style.borderColor : \"transparent\";\r\n\r\n opacity = style.opacity;\r\n borderWidth = style.borderWidth < 0 ? 0 : style.borderWidth;\r\n }\r\n var colors = null;\r\n if (style.interior) {\r\n colors = ej.util.isNullOrUndefined(style.interior._gradientStop) ? style.interior : style.interior._gradientStop;\r\n }\r\n else {\r\n if (point.fill)\r\n colors = jQuery.type(point.fill) == \"array\" ? point.fill[0].color : point.fill;\r\n else {\r\n var pointColors = chartObj.model.pointColors;\r\n colors = (chartObj.model.AreaType != \"none\") ? ((series.type.toLowerCase() == \"waterfall\" && series.positiveFill && (point.y > 0 || point.waterfallSum > 0)) ? series.positiveFill :\r\n chartObj.model.seriesColors[seriesIndex]) : jQuery.type(pointColors[pointIndex]) == \"array\" ? pointColors[pointIndex][0].color : pointColors[pointIndex];\r\n }\r\n }\r\n chartObj.symbolColorName = chartObj.svgRenderer.createGradientElement(gradientName + seriesIndex, colors, 0, 0, 0, $(chartObj.svgObject).height(), symbolEle);\r\n\r\n var symbolStyle = {\r\n dashArray: options.dashArray,\r\n ShapeSize: {\r\n width: width,\r\n height: height\r\n },\r\n Style: {\r\n BorderColor: borderColor,\r\n BorderWidth: borderWidth,\r\n Opacity: opacity,\r\n Visibility: visibility,\r\n Color: chartObj.symbolColorName\r\n },\r\n PointIndex: pointIndex,\r\n SeriesIndex: seriesIndex,\r\n Imageurl: element.imageUrl,\r\n Image: element.image,\r\n ID: options.id\r\n };\r\n\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { location: location, style: symbolStyle };\r\n chartObj._trigger(\"symbolRendering\", commonEventArgs);\r\n if (!commonEventArgs.cancel) {\r\n if (isCanvas) {\r\n //Added for Marker location while setting plotoffset value to axis\r\n location.startY = (!chartObj.model.requireInvertedAxes) ? (location.startY + (series.yAxis.y ? (series.yAxis.y - chartObj.canvasY) : 0)) : location.startY;\r\n location.startX = (!chartObj.model.requireInvertedAxes) ? (location.startX + (series.xAxis.x ? (series.xAxis.x - chartObj.canvasX) : 0)) : location.startX;\r\n\r\n commonEventArgs.data.location.startY = location.startY;\r\n if (ej.util.isNullOrUndefined(trackSymbol)) { // to draw marker/datalabel\r\n if (chartObj.model.AreaType == \"cartesianaxes\") {\r\n symbolEle = chartObj.svgRenderer.ctx;\r\n chartObj.svgRenderer.ctx.save();\r\n chartObj.svgRenderer.ctx.beginPath();\r\n if (!chartObj.model.requireInvertedAxes)\r\n chartObj.svgRenderer.ctx.rect(series.xAxis.x, series.yAxis.y, series.xAxis.width, series.yAxis.height);\r\n else\r\n chartObj.svgRenderer.ctx.rect(series.yAxis.x, series.xAxis.y, series.yAxis.width, series.xAxis.height);\r\n chartObj.svgRenderer.ctx.clip();\r\n ej.EjSvgRender.chartSymbol[\"_draw\" + symbolName](commonEventArgs.data.location, commonEventArgs.data.style, chartObj, symbolEle);\r\n chartObj.svgRenderer.ctx.restore();\r\n }\r\n else {\r\n if (isCanvas && isPolar) {\r\n chartObj.svgRenderer.ctx.save();\r\n chartObj.svgRenderer.ctx.beginPath();\r\n chartObj.svgRenderer.ctx.arc(chartObj.model.centerX, chartObj.model.centerY, chartObj.model.Radius, 0, 2 * Math.PI, false);\r\n chartObj.svgRenderer.ctx.clip();\r\n }\r\n ej.EjSvgRender.chartSymbol[\"_draw\" + symbolName](commonEventArgs.data.location, commonEventArgs.data.style, chartObj, symbolEle);\r\n if (isCanvas && isPolar)\r\n chartObj.svgRenderer.ctx.restore();\r\n }\r\n\r\n }\r\n else {\r\n var ptIndex = commonEventArgs.data.style.PointIndex;\r\n var serIndex = commonEventArgs.data.style.SeriesIndex;\r\n if (!chartObj.model.series[serIndex].highlightSettings.enable) {\r\n if ($('#' + chartObj._id + '_selection_' + serIndex + '_' + ptIndex + '_canvas').length == 0)\r\n chartObj.svgRenderer.trackSymbol(commonEventArgs.data.style, commonEventArgs.data.location, symbolName, trackSymbol, chartObj);\r\n }\r\n }\r\n }\r\n else {\r\n var ptIndex = commonEventArgs.data.style.PointIndex;\r\n var serIndex = commonEventArgs.data.style.SeriesIndex;\r\n var type = series.type;\r\n var className;\r\n if (series.highlightSettings.enable && trackSymbol && !chartObj.model.crosshair.visible) {\r\n var style = $.extend(true, commonEventArgs.data.style);\r\n var highlight = series.highlightSettings;\r\n style.Style.Color = (highlight.pattern.toLowerCase() == \"none\" || highlight.pattern == \"\") ? (highlight.color != \"\" ? highlight.color : style.Style.Color) : \"url(#\" + highlight.pattern.toLowerCase() + '_Highlight_2D_' + serIndex + \")\";\r\n style.Style.Opacity = highlight.opacity;\r\n style.Style.BorderColor = highlight.border.color;\r\n style.Style.BorderWidth = highlight.border.width;\r\n // checked condition for is already selected or not\r\n if (type == 'bubble')\r\n className = $('#' + this.chartObj.svgObject.id + '_Series' + serIndex + '_Point' + ptIndex).attr('class');\r\n else\r\n className = $('#' + this.chartObj.svgObject.id + '_Series' + serIndex + '_Point' + ptIndex + '_symbol').attr('class');\r\n if (className != \"SelectionStyleseries\" + serIndex)\r\n ej.EjSvgRender.chartSymbol[\"_draw\" + symbolName](commonEventArgs.data.location, style, chartObj, (chartObj.model.enable3D) ? sender.chart3D : symbolEle);\r\n }\r\n else {\r\n if (type == 'scatter')\r\n className = $('#' + chartObj.svgObject.id + '_Series' + serIndex + '_Point' + ptIndex + '_symbol').attr('class');\r\n else\r\n className = $('#' + chartObj.svgObject.id + '_Series' + serIndex + '_Point' + ptIndex).attr('class');\r\n if (className != \"SelectionStyleseries\" + serIndex)\r\n ej.EjSvgRender.chartSymbol[\"_draw\" + symbolName](commonEventArgs.data.location, commonEventArgs.data.style, chartObj, (chartObj.model.enable3D) ? sender.chart3D : symbolEle);\r\n }\r\n }\r\n }\r\n\r\n if (!sender.chart3D && type != \"pieofpie\" && chartObj.model.AreaType == \"none\" && $(symbolEle).children().not(\"defs\").length > chartObj.model._visibleSeries[seriesIndex]._visiblePoints.length) {\r\n $(symbolEle.childNodes[options.pointIndex]).replaceWith($(symbolEle.childNodes[$(symbolEle.childNodes).length - 1]));\r\n }\r\n\r\n },\r\n\r\n drawSymbol: function (seriesIndex, series, pointIndex, x, y, chart, trackSymbol, trackcount) {\r\n var drawType = series.drawType;\r\n if (ej.util.isNullOrUndefined(this.chartObj)) this.chartObj = chart;\r\n\r\n\r\n var point = series._visiblePoints[pointIndex], seriesType = series.type.toLowerCase(),\r\n index = seriesType == \"boxandwhisker\" ? trackcount : pointIndex,\r\n dashArray = (seriesType == 'bubble' || seriesType == 'scatter') ? series.border.dashArray : \"\";\r\n var symbolName = \"None\";\r\n var tracker = this.changeCrossHairSymbol(point.marker ? point.marker : series.marker, trackSymbol, pointIndex, seriesIndex, series);\r\n if (seriesType.toLowerCase() == 'boxandwhisker')\r\n var element = tracker ? tracker : $.extend(true, {}, series.outlierSettings, point.outlierSettings, series.border, point.border);\r\n else\r\n var element = tracker ? tracker : $.extend(true, {}, series.marker, point.marker);\r\n\r\n $.each(this.chartObj.model.symbolShape, function (name) {\r\n if (element.shape.toLowerCase() == name.toLowerCase())\r\n symbolName = name;\r\n });\r\n if (symbolName == \"None\")\r\n return;\r\n var location = this.chartObj.model.AreaType == \"cartesianaxes\" ? { startX: x + this.chartObj.canvasX, startY: y + this.chartObj.canvasY } : { startX: x, startY: y };\r\n var borderColor, borderWidth, style;\r\n if (seriesType == 'scatter' || series.drawType == \"scatter\") {\r\n borderColor = ((point.border) && point.border.color) ? point.border.color : series.border.color;\r\n borderWidth = ((point.border) && point.border.width) ? point.border.width : series.border.width;\r\n style = { 'interior': element.fill, 'opacity': element.opacity, 'borderColor': borderColor, 'borderWidth': borderWidth };\r\n }\r\n else if (seriesType == \"boxandwhisker\") {\r\n borderColor = ((point.border) && point.border.color) ? (point.border.color == \"transparent\" ? this.chartObj._saturationColor(series.fill, -0.6) : point.border.color) : (series.border.color == \"transparent\" ? this.chartObj._saturationColor(series.fill, -0.6) : series.border.color);\r\n borderWidth = ((point.border) && point.border.width) ? point.border.width : series.border.width;\r\n style = { 'interior': series.fill, 'opacity': series.opacity, 'borderColor': borderColor, 'borderWidth': borderWidth };\r\n }\r\n else {\r\n var style = { 'interior': element.fill, 'opacity': element.opacity, 'borderColor': element.border.color, 'borderWidth': element.border.width };\r\n }\r\n var symbolEle = (trackSymbol) ? this.chartObj.gTrackerEle : this.chartObj.gSymbolGroupEle[seriesIndex];\r\n var id = (trackSymbol) ? (this.chartObj.svgObject.id + '_trackSymbol_' + seriesIndex + \"_\" + index) : (this.chartObj.svgObject.id + '_Series' + seriesIndex + '_Point' + index + '_symbol');\r\n var gradientName = trackSymbol ? \"TrackSymbol\" : \"symbol\";\r\n var width = element.size.width;\r\n var height = element.size.height;\r\n var options = {\r\n 'style': style,\r\n 'gradientName': gradientName,\r\n 'symbolEle': symbolEle,\r\n 'width': width,\r\n 'height': height,\r\n 'point': point,\r\n 'location': location,\r\n 'seriesIndex': seriesIndex,\r\n 'pointIndex': pointIndex,\r\n 'element': element,\r\n 'visibility': (point.visible) ? 'visible' : 'hidden',\r\n 'symbolName': symbolName,\r\n 'trackSymbol': trackSymbol,\r\n 'id': id,\r\n 'dashArray': dashArray\r\n };\r\n if (!this.chartObj.model.enableCanvasRendering)\r\n var imgMarkerEle = this.chartObj.gSymbolGroupEle[seriesIndex].childNodes[pointIndex];\r\n if (!ej.util.isNullOrUndefined(imgMarkerEle) && symbolName.toLowerCase() == \"image\") {\r\n imgMarkerEle.setAttribute('width', width);\r\n imgMarkerEle.setAttribute('height', height);\r\n }\r\n else\r\n this.drawSymbolStyle(options, this.chartObj, trackSymbol);\r\n\r\n if (series.type.toLowerCase() == \"scatter\") {\r\n var areaBoundsX = series.xAxis.x;\r\n var areaBoundsY = series.yAxis.y;\r\n if (this.chartObj.model.enableCanvasRendering) {\r\n areaBoundsX = 0;\r\n areaBoundsY = 0;\r\n }\r\n var bounds = { X: areaBoundsX + location.startX - (height / 2), Y: areaBoundsY + location.startY - (width / 2), Height: height, Width: width };\r\n ej.EjSvgRender.utils._addRegion(this.chartObj, bounds, series, null, pointIndex);\r\n }\r\n },\r\n\r\n chartAreaType: \"cartesianAxes\",\r\n requireInvertedAxes: false,\r\n stackingSeries: false,\r\n hiloTypes: false\r\n\r\n };\r\n\r\n\r\n function ejExtendClass(parent, members) {\r\n var object = function () { };\r\n object.prototype = new parent();\r\n $.extend(object.prototype, members);\r\n return object;\r\n }\r\n\r\n ej.ejLineSeries = ejExtendClass(ej.EjSeriesRender);\r\n\r\n ej.seriesTypes.line = ej.ejLineSeries;\r\n\r\n\r\n ej.ejStepLineSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n draw: function (chart, options) {\r\n var chartObj = this.chartObj = chart;\r\n var lDirection;\r\n options._animationType = \"path\";\r\n var sb = ej.EjSvgRender.utils._getStringBuilder();\r\n var currentseries = options;\r\n var style = this.setLineSeriesStyle(currentseries);\r\n if (currentseries.sorting)\r\n currentseries.points = ej.DataManager(currentseries.points, ej.Query().sortBy(\"xValue\")).executeLocal();\r\n var visiblePoints = options._visiblePoints = currentseries.points.length > 100 || !currentseries.enableSmartLabels ? this.improveChartPerformance(currentseries) : this._isVisiblePoints(currentseries);\r\n var firstPoint = null;\r\n var startPath = \"M\";\r\n var secondPoint, nextpoint, point1, point2, point3;\r\n var firstIndex = -1;\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n secondPoint = visiblePoints[i];\r\n if (secondPoint.visible) {\r\n if (firstPoint != null) {\r\n if (visiblePoints.length > firstIndex + 1) {\r\n nextpoint = { xValue: visiblePoints[firstIndex + 1].xValue, YValues: [firstPoint.YValues[0]] };\r\n point1 = ej.EjSvgRender.utils._getPoint(firstPoint, currentseries);\r\n point2 = ej.EjSvgRender.utils._getPoint(nextpoint, currentseries);\r\n point3 = ej.EjSvgRender.utils._getPoint(visiblePoints[firstIndex + 1], currentseries);\r\n chartObj = this.chartObj;\r\n sb.append(startPath + \" \" + (point1.X + chartObj.canvasX) + \" \" + ((point1.Y + chartObj.canvasY)) + \" \" +\r\n \"L\" + \" \" + (point2.X + chartObj.canvasX) + \" \" + ((point2.Y + chartObj.canvasY)) + \" \" +\r\n \"L\" + \" \" + (point3.X + chartObj.canvasX) + \" \" + ((point3.Y + chartObj.canvasY)) + \" \");\r\n }\r\n startPath = \"L\";\r\n }\r\n firstPoint = secondPoint;\r\n firstIndex = i;\r\n }\r\n else {\r\n firstPoint = null;\r\n startPath = \"M\";\r\n }\r\n }\r\n lDirection = sb.toString();\r\n\r\n this._drawLinePath(currentseries, style, lDirection);\r\n\r\n if (this.chartObj.dragPoint)\r\n this.chartObj.svgRenderer.append(this.chartObj.gPreviewSeriesGroupEle, this.chartObj.gSeriesEle);\r\n else\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n }\r\n\r\n });\r\n\r\n ej.ejStepAreaSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n draw: function (chart, options, params) {\r\n this.chartObj = chart;\r\n options._animationType = \"path\";\r\n var requireInvertedAxes = this.chartObj.model.requireInvertedAxes;\r\n var aDirection;\r\n var sb = ej.EjSvgRender.utils._getStringBuilder();\r\n var currentseries = options;\r\n var style = this.setAreaSeriesStyle(currentseries);\r\n if (currentseries.sorting)\r\n currentseries.points = ej.DataManager(currentseries.points, ej.Query().sortBy(\"xValue\")).executeLocal();\r\n var visiblePoints = options._visiblePoints = currentseries.points.length > 100 || !currentseries.enableSmartLabels ? this.improveChartPerformance(currentseries) : this._calculateVisiblePoints(currentseries).visiblePoints;\r\n var xOffset = 0;\r\n var firstPoint = null;\r\n var secondPoint;\r\n if (currentseries.xAxis._valueType.toLowerCase() == \"category\" && currentseries.xAxis.labelPlacement.toLowerCase() != \"onticks\")\r\n xOffset = 0.5;\r\n var origin = ej.EjSeriesRender.prototype.getOrigin(this, currentseries, params);\r\n var startPoint = null;\r\n var start = true;\r\n var chartObj = this.chartObj;\r\n for (var i = 0; i <= visiblePoints.length; i++) {\r\n\r\n if (i < visiblePoints.length) {\r\n if (visiblePoints[i].visible) {\r\n\r\n secondPoint = { xValue: visiblePoints[i].xValue - xOffset, YValues: [visiblePoints[i].y] };\r\n point1 = ej.EjSvgRender.utils._getPoint(secondPoint, currentseries);\r\n if (!startPoint) {\r\n startPoint = { xValue: visiblePoints[i].xValue - xOffset, YValues: [origin] }\r\n var startLoc = ej.EjSvgRender.utils._getPoint(startPoint, currentseries);\r\n sb.append(\"M\" + \" \" + (startLoc.X + chartObj.canvasX) + \" \" + (startLoc.Y + chartObj.canvasY) + \" \");\r\n }\r\n if (firstPoint != null) {\r\n var step = { xValue: secondPoint.xValue, YValues: [firstPoint.YValues[0]] };\r\n var stepPoint = ej.EjSvgRender.utils._getPoint(step, currentseries);\r\n if (start) {\r\n sb.append(\"L\" + \" \" + (point2.X + chartObj.canvasX) + \" \" + (point2.Y + chartObj.canvasY) + \" \");\r\n start = false;\r\n }\r\n sb.append(\"L\" + \" \" + (stepPoint.X + chartObj.canvasX) + \" \" + ((stepPoint.Y + chartObj.canvasY)) + \" \" + \"L\" + \" \" + (point1.X + chartObj.canvasX) + \" \" + (point1.Y + chartObj.canvasY) + \" \");\r\n if ((xOffset == 0 && i == visiblePoints.length - 1) || (i < (visiblePoints.length - 1) && !visiblePoints[i + 1].visible)) {\r\n if (xOffset > 0) {\r\n secondPoint = { xValue: visiblePoints[i].xValue + xOffset, YValues: [visiblePoints[i].y] };\r\n var point1 = ej.EjSvgRender.utils._getPoint(secondPoint, currentseries);\r\n if (requireInvertedAxes)\r\n sb.append(\"L\" + \" \" + (point1.X + chartObj.canvasX) + \" \" + (point1.Y + chartObj.canvasY) + \" \" + \"L\" + \" \" + (point1.Y + chartObj.canvasX) + \" \" + (startLoc.X + chartObj.canvasY) + \" \");\r\n else\r\n sb.append(\"L\" + \" \" + (point1.X + chartObj.canvasX) + \" \" + (point1.Y + chartObj.canvasY) + \" \" + \"L\" + \" \" + (point1.X + chartObj.canvasX) + \" \" + (startLoc.Y + chartObj.canvasY) + \" \");\r\n }\r\n else\r\n if (requireInvertedAxes)\r\n sb.append(\"L\" + \" \" + (startLoc.X + chartObj.canvasY) + \" \" + (point1.Y + chartObj.canvasX) + \" \");\r\n else\r\n sb.append(\"L\" + \" \" + (point1.X + chartObj.canvasX) + \" \" + (startLoc.Y + chartObj.canvasY) + \" \");\r\n startPoint = null;\r\n firstPoint = null;\r\n start = true;\r\n }\r\n }\r\n if (startPoint) {\r\n var point2 = point1;\r\n firstPoint = secondPoint;\r\n }\r\n }\r\n else {\r\n startPoint = null;\r\n firstPoint = null;\r\n start = true;\r\n }\r\n\r\n }\r\n else {\r\n if (visiblePoints[i - 1].visible && xOffset > 0) {\r\n secondPoint = { xValue: visiblePoints[i - 1].xValue + xOffset, YValues: [visiblePoints[i - 1].y] };\r\n var point1 = ej.EjSvgRender.utils._getPoint(secondPoint, currentseries);\r\n if (requireInvertedAxes)\r\n sb.append(\"L\" + \" \" + (point1.X + chartObj.canvasX) + \" \" + (point1.Y + chartObj.canvasY) + \" \" + \"L\" + \" \" + (point1.Y + chartObj.canvasX) + \" \" + (startLoc.X + chartObj.canvasY) + \" \");\r\n else\r\n sb.append(\"L\" + \" \" + (point1.X + chartObj.canvasX) + \" \" + (point1.Y + chartObj.canvasY) + \" \" + \"L\" + \" \" + (point1.X + chartObj.canvasX) + \" \" + (startLoc.Y + chartObj.canvasY) + \" \");\r\n }\r\n }\r\n\r\n }\r\n aDirection = sb.toString();\r\n\r\n this.drawAreaPath(currentseries, style, aDirection);\r\n if (this.chartObj.dragPoint)\r\n this.chartObj.svgRenderer.append(this.chartObj.gPreviewSeriesGroupEle, this.chartObj.gSeriesEle);\r\n else\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n }\r\n });\r\n ej.seriesTypes.steparea = ej.ejStepAreaSeries;\r\n\r\n\r\n ej.seriesTypes.stepline = ej.ejStepLineSeries;\r\n\r\n\r\n ej.ejColumnSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n\r\n\r\n draw: function (chart, options, params) {\r\n this.chartObj = chart;\r\n var requireInvertedAxes = this.chartObj.model.requireInvertedAxes;\r\n options._animationType = \"rect\";\r\n if (options.columnFacet == \"cylinder\")\r\n options._animationType = \"cylinder\";\r\n var series = options;\r\n var cornerRadius = series.cornerRadius;\r\n var seriesIndex = $.inArray(series, this.chartObj.model._visibleSeries);\r\n var origin = ej.EjSeriesRender.prototype.getOrigin(this, series, params);\r\n\r\n var sidebysideinfo = this.getSideBySideInfo(series, params);\r\n if (series.dragSettings.enable) series.sidebysideInfo = sidebysideinfo;\r\n var visiblePoints = this._isVisiblePoints(series);\r\n\r\n var trans = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, requireInvertedAxes);\r\n\r\n var pointMarker;\r\n\r\n var serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': 'translate(' + trans.x + ',' + trans.y + ')' };\r\n\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n\r\n var cSer = this;\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n var pointIndex = i;\r\n var point = visiblePoints[i];\r\n pointMarker = visiblePoints[i].marker;\r\n\r\n var y1 = point.YValues[0];\r\n var y2 = origin;\r\n if (point.visible) {\r\n //calculate sides\r\n var data = cSer.calculateSides(point, sidebysideinfo);\r\n var x1 = data.x1;\r\n var x2 = data.x2;\r\n\r\n var styleOptions = this.chartObj.setStyle(cSer, series, seriesIndex, pointIndex);\r\n\r\n var rect = cSer.getRectangle(x1, y1, x2, y2, series, chart);\r\n\r\n //drawing part\r\n var xr = Math.min(0, rect.Width);\r\n var yr = Math.min(0, rect.Height);\r\n\r\n var bounds;\r\n if ((xr == 0 || yr == 0) && rect.Width > 0) {\r\n options = {\r\n 'id': cSer.chartObj.svgObject.id + '_Series' + seriesIndex + '_Point' + pointIndex,\r\n 'x': rect.X + cSer.chartObj.canvasX,\r\n 'y': rect.Y + cSer.chartObj.canvasY,\r\n 'width': rect.Width,\r\n 'height': rect.Height,\r\n 'fill': styleOptions.interior,\r\n 'plot': y1 < 0 ? \"negative\" : \"positive\",\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'opacity': styleOptions.opacity,\r\n 'stroke': styleOptions.borderColor,\r\n 'stroke-dasharray': styleOptions.dashArray,\r\n };\r\n var cylinderSeriesOption = {\r\n 'isColumn': true,\r\n 'stacking': false,\r\n 'isLastSeries': true,\r\n };\r\n if (series.columnFacet == \"cylinder\")\r\n cSer.chartObj.svgRenderer.drawCylinder(options, cSer.gSeriesGroupEle, cylinderSeriesOption);\r\n //calculate path for rounded corner\r\n else if ((typeof (cornerRadius) != \"object\" && cornerRadius > 0) || cornerRadius.topLeft > 0 || cornerRadius.bottomLeft > 0 || cornerRadius.topRight > 0\r\n || cornerRadius.bottomRight > 0) {\r\n var roundrect = ej.EjSvgRender.utils._calculateroundedCorner(cornerRadius, options);\r\n options.d = roundrect;\r\n series._animationType = \"path\";\r\n cSer.chartObj.svgRenderer.drawPath(options, cSer.gSeriesGroupEle);\r\n }\r\n else if (series.columnFacet == \"rectangle\")\r\n cSer.chartObj.svgRenderer.drawRect(options, cSer.gSeriesGroupEle);\r\n var svgXy = ej.EjSvgRender.utils._getSvgXY(rect.X, (rect.Y), series, cSer.chartObj);\r\n bounds = { X: svgXy.X, Y: svgXy.Y, Width: rect.Width, Height: rect.Height };\r\n ej.EjSvgRender.utils._addRegion(cSer.chartObj, bounds, series, point, pointIndex);\r\n }\r\n options.plot = y1 < 0 ? \"negative\" : \"positive\";\r\n if (requireInvertedAxes)\r\n point.symbolLocation = { X: ((y1 < (series.xAxis._crossValue || 0) && !series.yAxis.isInversed) || (series.yAxis.isInversed && y1 > (series.xAxis._crossValue || 0))) ? (rect.X) : (rect.X + rect.Width), Y: ((rect.Y) + (rect.Height / 2)) };\r\n else\r\n point.symbolLocation = { X: rect.X + (rect.Width / 2), Y: ((y1 < (series.xAxis._crossValue || 0) && !series.yAxis.isInversed) || (series.yAxis.isInversed && y1 > (series.xAxis._crossValue || 0))) ? ((rect.Y) + (rect.Height)) : (rect.Y) };\r\n\r\n }\r\n }\r\n\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n\r\n },\r\n\r\n isRegion: true\r\n\r\n });\r\n ej.seriesTypes.column = ej.ejColumnSeries;\r\n\r\n ej.ejStackingColumnSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n draw: function (chart, options, params) {\r\n this.chartObj = chart;\r\n options._animationType = \"rect\";\r\n if (options.columnFacet == \"cylinder\")\r\n options._animationType = \"cylinder\";\r\n var requireInvertedAxes = this.chartObj.model.requireInvertedAxes;\r\n var series = options;\r\n var cornerRadius = series.cornerRadius;\r\n var seriesIndex = $.inArray(series, this.chartObj.model._visibleSeries);\r\n //var origin = Math.max(options.yAxis.visibleRange.min, 0);\r\n\r\n var sidebysideinfo = this.getSideBySideInfo(series, params);\r\n var visiblePoints = this._isVisiblePoints(series);\r\n\r\n var trans = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, requireInvertedAxes);\r\n\r\n var serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': 'translate(' + trans.x + ',' + trans.y + ')' };\r\n\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n var cSer = this;\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n var pointIndex = i;\r\n var point = series._visiblePoints[i];\r\n\r\n var y2 = series.stackedValue.StartValues[i];\r\n var y1 = series.stackedValue.EndValues[i];\r\n if (point.visible) {\r\n //calculate sides\r\n var data = cSer.calculateSides(point, sidebysideinfo);\r\n var x1 = data.x1;\r\n var x2 = data.x2;\r\n\r\n var styleOptions = this.chartObj.setStyle(cSer, series, seriesIndex, pointIndex);\r\n\r\n var rect = cSer.getRectangle(x1, y1, x2, y2, series, chart);\r\n\r\n //drawing part\r\n var xr = Math.min(0, rect.Width);\r\n var yr = Math.min(0, rect.Height);\r\n\r\n var bounds;\r\n var isstacking100 = series.type == 'stackingcolumn100' ? true : false;\r\n if ((xr == 0 || yr == 0) && rect.Width > 0) {\r\n options = {\r\n 'id': cSer.chartObj.svgObject.id + '_Series' + seriesIndex + '_Point' + pointIndex,\r\n 'x': rect.X + cSer.chartObj.canvasX,\r\n 'y': rect.Y + cSer.chartObj.canvasY,\r\n 'width': rect.Width,\r\n 'height': rect.Height,\r\n 'fill': styleOptions.interior,\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'plot': y1 < 0 ? \"negative\" : \"positive\",\r\n 'opacity': styleOptions.opacity,\r\n 'stroke': styleOptions.borderColor,\r\n 'stroke-dasharray': styleOptions.dashArray,\r\n };\r\n var cylinderSeriesOption = {\r\n 'isColumn': true,\r\n 'stacking': isstacking100,\r\n 'isLastSeries': series.stackedValue.stackedSeries,\r\n };\r\n if (series.columnFacet == \"cylinder\")\r\n cSer.chartObj.svgRenderer.drawCylinder(options, cSer.gSeriesGroupEle, cylinderSeriesOption);\r\n else if ((typeof (cornerRadius) != \"object\" && cornerRadius > 0) || cornerRadius.topLeft > 0 || cornerRadius.bottomLeft > 0\r\n || cornerRadius.topRight > 0 || cornerRadius.bottomRight > 0) //calculate path for rounded corner\r\n {\r\n var roundrect = ej.EjSvgRender.utils._calculateroundedCorner(cornerRadius, options);\r\n options.d = roundrect;\r\n series._animationType = \"path\";\r\n cSer.chartObj.svgRenderer.drawPath(options, cSer.gSeriesGroupEle);\r\n }\r\n else if (series.columnFacet == \"rectangle\")\r\n cSer.chartObj.svgRenderer.drawRect(options, cSer.gSeriesGroupEle);\r\n\r\n var svgXy = ej.EjSvgRender.utils._getSvgXY(rect.X, (rect.Y), series, cSer.chartObj);\r\n bounds = { X: svgXy.X, Y: svgXy.Y, Width: rect.Width, Height: rect.Height };\r\n var rx = rect.Width / 2,\r\n length = Math.round(rect.Height),\r\n ry = Math.round(rx / 4);\r\n if (ry == length)\r\n bounds.Height = rect.Height + 2 * ry;\r\n ej.EjSvgRender.utils._addRegion(cSer.chartObj, bounds, series, point, pointIndex);\r\n }\r\n\r\n if (requireInvertedAxes)\r\n point.symbolLocation = { X: ((y1 < (series.xAxis._crossValue || 0) && !series.yAxis.isInversed) || (series.yAxis.isInversed && y1 > (series.xAxis._crossValue || 0))) ? (rect.X) : (rect.X + rect.Width), Y: ((rect.Y) + (rect.Height / 2)) };\r\n else\r\n point.symbolLocation = { X: rect.X + (rect.Width / 2), Y: ((y1 < (series.xAxis._crossValue || 0) && !series.yAxis.isInversed) || (series.yAxis.isInversed && y1 > (series.xAxis._crossValue || 0))) ? ((rect.Y) + (rect.Height)) : (rect.Y) };\r\n\r\n }\r\n }\r\n\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n\r\n\r\n },\r\n\r\n stackingSeries: true,\r\n isRegion: true\r\n\r\n });\r\n ej.seriesTypes.stackingcolumn = ej.ejStackingColumnSeries;\r\n\r\n ej.seriesTypes.stackingcolumn100 = ej.ejStackingColumnSeries;\r\n\r\n ej.seriesTypes.rangecolumn = ej.ejRangeColumnSeries;\r\n\r\n ej.ejRangeColumnSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n draw: function (chart, options, params) {\r\n this.chartObj = chart;\r\n options._animationType = \"rect\";\r\n var requireInvertedAxes = this.chartObj.model.requireInvertedAxes;\r\n var series = options;\r\n var cornerRadius = series.cornerRadius;\r\n var seriesIndex = $.inArray(series, this.chartObj.model._visibleSeries);\r\n\r\n var sidebysideinfo = this.getSideBySideInfo(series, params);\r\n var visiblePoints = this._isVisiblePoints(series);\r\n\r\n var trans = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, requireInvertedAxes);\r\n\r\n var serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': 'translate(' + trans.x + ',' + trans.y + ')' };\r\n\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n var cSer = this;\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n var pointIndex = i;\r\n var point = visiblePoints[i];\r\n\r\n var y1 = point.YValues[0];\r\n var y2 = point.YValues[1];\r\n if (point.visible) {\r\n //calculate sides\r\n var data = cSer.calculateSides(point, sidebysideinfo);\r\n var x1 = data.x1;\r\n var x2 = data.x2;\r\n\r\n var styleOptions = this.chartObj.setStyle(cSer, series, seriesIndex, pointIndex);\r\n\r\n var rect = cSer.getRectangle(x1, y1, x2, y2, series, chart);\r\n var width = cSer.chartObj.model.m_AreaBounds.Width;\r\n //drawing part\r\n var xr = Math.min(0, rect.Width);\r\n var yr = Math.min(0, rect.Height);\r\n\r\n var bounds;\r\n if (xr == 0 || yr == 0) {\r\n options = {\r\n 'id': cSer.chartObj.svgObject.id + '_Series' + seriesIndex + '_Point' + pointIndex,\r\n 'x': rect.X + cSer.chartObj.canvasX,\r\n 'y': rect.Y + cSer.chartObj.canvasY,\r\n 'width': rect.Width,\r\n 'height': rect.Height,\r\n 'fill': styleOptions.interior,\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'opacity': styleOptions.opacity,\r\n 'stroke': styleOptions.borderColor,\r\n 'stroke-dasharray': styleOptions.dashArray,\r\n };\r\n\r\n if ((typeof (cornerRadius) != \"object\" && cornerRadius > 0) || cornerRadius.topLeft > 0 || cornerRadius.bottomLeft > 0\r\n || cornerRadius.topRight > 0 || cornerRadius.bottomRight > 0) //calculate path for rounded corner\r\n {\r\n var roundrect = ej.EjSvgRender.utils._calculateroundedCorner(cornerRadius, options);\r\n options.d = roundrect;\r\n series._animationType = \"path\";\r\n cSer.chartObj.svgRenderer.drawPath(options, cSer.gSeriesGroupEle);\r\n }\r\n else\r\n cSer.chartObj.svgRenderer.drawRect(options, cSer.gSeriesGroupEle, trans.y);\r\n\r\n cSer.chartObj.svgRenderer.drawRect(options, cSer.gSeriesGroupEle, trans.y);\r\n\r\n //Add region for each rect\r\n var svgXy = ej.EjSvgRender.utils._getSvgXY(rect.X, (rect.Y), series, cSer.chartObj);\r\n bounds = { X: svgXy.X, Y: svgXy.Y, Width: rect.Width, Height: rect.Height };\r\n ej.EjSvgRender.utils._addRegion(cSer.chartObj, bounds, series, point, pointIndex);\r\n }\r\n //Add rect location details for symbol \r\n if (series.type.toLowerCase() == \"waterfall\")\r\n y1 = point.waterfallSum ? point.waterfallSum : point.y;\r\n if (requireInvertedAxes)\r\n point.symbolLocation = { X: ((y1 < 0 && !series.yAxis.isInversed) || (series.yAxis.isInversed && y1 > 0)) ? (rect.X) : (rect.X + rect.Width), Y: ((rect.Y) + (rect.Height / 2)) };\r\n else\r\n point.symbolLocation = { X: rect.X + (rect.Width / 2), Y: ((y1 < 0 && !series.yAxis.isInversed) || (series.yAxis.isInversed && y1 > 0)) ? ((rect.Y) + (rect.Height)) : (rect.Y) };\r\n\r\n }\r\n }\r\n\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n\r\n\r\n },\r\n\r\n hiloTypes: true,\r\n isRegion: true\r\n\r\n });\r\n ej.seriesTypes.rangecolumn = ej.ejRangeColumnSeries;\r\n\r\n\r\n ej.ejBoxandwhiskerSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n draw: function (chart, options, params) {\r\n this.chartObj = chart;\r\n var requireInvertedAxes = this.chartObj.model.requireInvertedAxes, previousStyle;\r\n options._animationType = \"rect\";\r\n var series = options,\r\n seriesIndex = $.inArray(series, this.chartObj.model._visibleSeries),\r\n origin = ej.EjSeriesRender.prototype.getOrigin(this, series, params),\r\n sidebysideinfo = this.getSideBySideInfo(series, params),\r\n visiblePoints = this._isVisiblePoints(series),\r\n trans = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, requireInvertedAxes),\r\n pointMarker, trackCount = 0,\r\n serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': 'translate(' + trans.x + ',' + trans.y + ')' };\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n var cSer = this;\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n var pointIndex = i, list1, list2, count = 0, y1, y2, data, x1, x2, styleOptions, rect, xr, yr, seriesIndex, sb, newPoint, boxplotmidpoint,\r\n bounds, options1, whiskerpath, newPoint1, outlierpoint, svgXyOutlier, boundsOutlier, svgXy,\r\n point = visiblePoints[i];\r\n pointMarker = visiblePoints[i].marker;\r\n list1 = point.YValues[0];\r\n list2 = cSer.calculateMean(list1, series, pointIndex);\r\n y1 = list2.UpperQuartile;\r\n y2 = list2.LowerQuartile;\r\n if (point.visible) {\r\n //calculate sides\r\n data = cSer.calculateSides(point, sidebysideinfo);\r\n x1 = data.x1;\r\n x2 = data.x2;\r\n styleOptions = this.chartObj.setStyle(cSer, series, seriesIndex, pointIndex);\r\n rect = cSer.getRectangle(x1, y1, x2, y2, series, chart);\r\n //drawing part\r\n xr = Math.min(0, rect.Width);\r\n yr = Math.min(0, rect.Height);\r\n seriesIndex = $.inArray(series, this.chartObj.model._visibleSeries);\r\n previousStyle = this.chartObj.setStyle(this, series, seriesIndex, i);\r\n sb = ej.EjSvgRender.utils._getStringBuilder();\r\n newPoint = { \"xValue\": point.xValue, \"YValues\": list2.midvalue };\r\n boxplotmidpoint = ej.EjSvgRender.utils._getPoint(newPoint, series);\r\n var boxStrokeColor = styleOptions.borderColor == \"transparent\" ? this.chartObj._saturationColor(styleOptions.interior, -0.6) : styleOptions.borderColor;\r\n\r\n bounds;\r\n if ((xr == 0 || yr == 0) && rect.Width > 0) {\r\n options = {\r\n 'id': cSer.chartObj.svgObject.id + '_Series' + seriesIndex + '_Point' + pointIndex,\r\n 'x': rect.X + cSer.chartObj.canvasX,\r\n 'y': rect.Y + cSer.chartObj.canvasY,\r\n 'width': rect.Width,\r\n 'height': rect.Height,\r\n 'fill': styleOptions.interior,\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'plot': y1 < 0 ? \"negative\" : \"positive\",\r\n 'opacity': styleOptions.opacity,\r\n 'stroke': boxStrokeColor,\r\n 'stroke-dasharray': styleOptions.dashArray,\r\n };\r\n\r\n options1 = {\r\n 'id': this.chartObj.svgObject.id + '_Series' + seriesIndex + '_Point' + pointIndex + '_median',\r\n x1: series._isTransposed ? boxplotmidpoint.X + cSer.chartObj.canvasX : rect.X + cSer.chartObj.canvasX,\r\n y1: series._isTransposed ? rect.Y + cSer.chartObj.canvasY : boxplotmidpoint.Y + cSer.chartObj.canvasY,\r\n x2: series._isTransposed ? boxplotmidpoint.X + cSer.chartObj.canvasX : rect.X + rect.Width + cSer.chartObj.canvasX,\r\n y2: series._isTransposed ? rect.Y + rect.Height + cSer.chartObj.canvasY : boxplotmidpoint.Y + cSer.chartObj.canvasY,\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'stroke': boxStrokeColor,\r\n };\r\n\r\n cSer.chartObj.svgRenderer.drawRect(options, cSer.gSeriesGroupEle);\r\n\r\n //draw mean line for boxandwhisker\r\n cSer.chartObj.svgRenderer.drawLine(options1, cSer.gSeriesGroupEle);\r\n //draw lowerwhisker path calculation\r\n whiskerpath = cSer.calculateBoxAndWhiskerPath(options, rect, options1, list2, series, point, pointIndex);\r\n options.d = whiskerpath.lowerWhisker;\r\n options.id = options.id + '_whisker';\r\n cSer.chartObj.svgRenderer.drawPath(options, cSer.gSeriesGroupEle);\r\n //draw upperwhisker path calculation\r\n options.d = whiskerpath.upperWhisker;\r\n cSer.chartObj.svgRenderer.drawPath(options, cSer.gSeriesGroupEle);\r\n\r\n if (series.showMedian == true) {\r\n options.d = whiskerpath.mean;\r\n cSer.chartObj.svgRenderer.drawPath(options, cSer.gSeriesGroupEle);\r\n }\r\n\r\n\r\n //draw outliers\r\n for (var k = 0; k < list2.outliers.length; k++) {\r\n newPoint1 = { \"xValue\": point.xValue, \"YValues\": list2.outliers[k] };\r\n outlierpoint = ej.EjSvgRender.utils._getPoint(newPoint1, series);\r\n\r\n\r\n outlierpoint.X = series._isTransposed ? outlierpoint.X : (rect.X + (rect.Width / 2));\r\n outlierpoint.Y = series._isTransposed ? rect.Y + rect.Height / 2 : outlierpoint.Y;\r\n\r\n this.drawSymbol(seriesIndex, series, pointIndex, outlierpoint.X, outlierpoint.Y, null, null, trackCount);\r\n trackCount++;\r\n //to store the outlier regions\r\n svgXyOutlier = ej.EjSvgRender.utils._getSvgXY(outlierpoint.X, outlierpoint.Y, series, cSer.chartObj);\r\n boundsOutlier = { X: svgXyOutlier.X - (series.outlierSettings.size.width / 2), Y: svgXyOutlier.Y - (series.outlierSettings.size.height / 2), Width: series.outlierSettings.size.width, Height: series.outlierSettings.size.height };\r\n ej.EjSvgRender.utils._addRegion(cSer.chartObj, boundsOutlier, series, point, pointIndex);\r\n\r\n }\r\n svgXy = ej.EjSvgRender.utils._getSvgXY(rect.X, (rect.Y), series, cSer.chartObj);\r\n bounds = { X: svgXy.X, Y: svgXy.Y, Width: rect.Width, Height: rect.Height };\r\n ej.EjSvgRender.utils._addRegion(cSer.chartObj, bounds, series, point, pointIndex);\r\n }\r\n }\r\n }\r\n\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n\r\n },\r\n\r\n isRegion: true\r\n\r\n\r\n\r\n });\r\n ej.seriesTypes.boxandwhisker = ej.ejBoxandwhiskerSeries;\r\n\r\n ej.ejWaterfallSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n draw: function (chart, options, params) {\r\n\r\n ej.ejRangeColumnSeries.prototype.draw.call(this, chart, options, params);\r\n options._animationType = \"rect\";\r\n var chartRegions = this.chartObj.model.chartRegions;\r\n var seriesRegions = [];\r\n var areaBounds = this.chartObj.model.m_AreaBounds;\r\n var seriesIndex = $.inArray(options, this.chartObj.model._visibleSeries);\r\n options.index = seriesIndex;\r\n\r\n for (var j = 0, i = 0; j < chartRegions.length; j++) {\r\n if (seriesIndex == chartRegions[j].SeriesIndex) {\r\n seriesRegions[i] = chartRegions[j];\r\n i += 1;\r\n }\r\n }\r\n var serOptions1 = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_waterfallLine_' + seriesIndex };\r\n\r\n this.connectorLineGroup = this.chartObj.svgRenderer.createGroup(serOptions1);\r\n\r\n var sb, point1, point2, y, y1, y2, t1, t2, lineOptions, x, x1, x2, w1, w2, h1, h2, lDirection;\r\n for (var k = 0; k < seriesRegions.length - 1; k++) {\r\n sb = ej.EjSvgRender.utils._getStringBuilder();\r\n point1 = seriesRegions[k].Region.Bounds;\r\n point2 = seriesRegions[k + 1].Region.Bounds;\r\n\r\n if (!options.isTransposed) {\r\n y1 = Math.ceil(point1.Y), h1 = Math.ceil(point1.Height), y2 = Math.ceil(point2.Y), h2 = Math.ceil(point2.Height);\r\n t1 = Math.ceil(point1.Y + point1.Height);\r\n y = ((y1 == y2) ? point1.Y : (t1 == y2 ? point2.Y : (point2.Y + point2.Height)));\r\n sb.append(\"M \" + (point1.X) + \" \" + (y) + \" L \" + (point2.X + point2.Width) + \" \" + y);\r\n } else {\r\n x1 = Math.ceil(point1.X), w1 = Math.ceil(point1.Width), x2 = Math.ceil(point2.X), w2 = Math.ceil(point2.Width);\r\n t1 = Math.ceil(point1.X + point1.Width);\r\n t2 = Math.ceil(point2.X + point2.Width);\r\n x = ((t1 == t2) ? (point1.X + point1.Width) : (x1 == x2 ? point1.X : (x1 == t2 ? point1.X : (point1.X + point1.Width))));\r\n sb.append(\"M \" + (x) + \" \" + (point1.Y + point1.Height) + \" L \" + x + \" \" + (point2.Y));\r\n }\r\n\r\n\r\n lDirection = sb.toString();\r\n if (lDirection != \"\" && point1.Height >= 0) {\r\n lineOptions = {\r\n 'id': this.chartObj.svgObject.id + \"_waterFall_\" + seriesIndex + \"_connectorLine_\" + k,\r\n 'fill': 'none',\r\n 'stroke-dasharray': options.connectorLine.dashArray,\r\n 'stroke-width': options.connectorLine.width,\r\n 'stroke': options.connectorLine.color,\r\n 'opacity': options.connectorLine.opacity,\r\n 'd': lDirection\r\n };\r\n this.chartObj.svgRenderer.drawPath(lineOptions, this.connectorLineGroup);\r\n }\r\n }\r\n this.chartObj.svgRenderer.append(this.connectorLineGroup, this.chartObj.gSeriesEle);\r\n\r\n if (options.enableAnimation && !options._animatedSeries)\r\n this.chartObj.svgRenderer._setAttr(this.connectorLineGroup, { \"visibility\": \"hidden\" });\r\n },\r\n\r\n hiloTypes: false,\r\n isRegion: true\r\n });\r\n ej.seriesTypes.waterfall = ej.ejWaterfallSeries;\r\n\r\n ej.ejStackingBarSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n draw: function (chart, options, params) {\r\n this.chartObj = chart;\r\n options._animationType = \"rect\";\r\n if (options.columnFacet == \"cylinder\")\r\n options._animationType = \"cylinder\";\r\n var requireInvertedAxes = this.chartObj.model.requireInvertedAxes;\r\n var series = options;\r\n var cornerRadius = series.cornerRadius;\r\n var seriesIndex = $.inArray(series, this.chartObj.model._visibleSeries);\r\n //var origin = Math.max(options.yAxis.visibleRange.min, 0);\r\n var sidebysideinfo = this.getSideBySideInfo(series, params);\r\n var visiblePoints = this._isVisiblePoints(series);\r\n var trans = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, requireInvertedAxes);\r\n\r\n var serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': 'translate(' + trans.x + ',' + trans.y + ')' };\r\n\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n var cSer = this;\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n var pointIndex = i;\r\n var point = visiblePoints[i];\r\n var y1 = series.stackedValue.EndValues[i];\r\n var y2 = series.stackedValue.StartValues[i];\r\n if (point.visible) {\r\n //calculate sides\r\n var data = cSer.calculateSides(point, sidebysideinfo);\r\n var x1 = data.x1;\r\n var x2 = data.x2;\r\n\r\n var styleOptions = this.chartObj.setStyle(cSer, series, seriesIndex, pointIndex);\r\n\r\n var rect = cSer.getRectangle(x1, y1, x2, y2, series, chart);\r\n var xr = Math.min(0, rect.Width);\r\n var yr = Math.min(0, rect.Height);\r\n var isstacking100 = series.type == 'stackingbar100' ? true : false;\r\n if (xr == 0 || yr == 0) {\r\n var bounds;\r\n options = {\r\n 'id': cSer.chartObj.svgObject.id + '_Series' + seriesIndex + '_Point' + pointIndex,\r\n 'x': rect.X + cSer.chartObj.canvasX,\r\n 'y': rect.Y + cSer.chartObj.canvasY,\r\n 'width': rect.Width,\r\n 'height': rect.Height,\r\n 'fill': styleOptions.interior,\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'opacity': styleOptions.opacity,\r\n 'stroke': styleOptions.borderColor,\r\n 'stroke-dasharray': styleOptions.dashArray,\r\n };\r\n var cylinderSeriesOption = {\r\n 'isColumn': false,\r\n 'stacking': isstacking100,\r\n 'isLastSeries': series.stackedValue.stackedSeries,\r\n };\r\n if (series.columnFacet == \"cylinder\")\r\n cSer.chartObj.svgRenderer.drawCylinder(options, cSer.gSeriesGroupEle, cylinderSeriesOption);\r\n else if ((typeof (cornerRadius) != \"object\" && cornerRadius > 0) || cornerRadius.topLeft > 0 || cornerRadius.bottomLeft > 0\r\n || cornerRadius.topRight > 0 || cornerRadius.bottomRight > 0) //calculate path for rounded corner\r\n {\r\n var roundrect = ej.EjSvgRender.utils._calculateroundedCorner(cornerRadius, options);\r\n options.d = roundrect;\r\n series._animationType = \"path\";\r\n cSer.chartObj.svgRenderer.drawPath(options, cSer.gSeriesGroupEle);\r\n }\r\n else if (series.columnFacet == \"rectangle\")\r\n cSer.chartObj.svgRenderer.drawRect(options, cSer.gSeriesGroupEle);\r\n\r\n var svgXy = ej.EjSvgRender.utils._getSvgXY((rect.X), (rect.Y), series, cSer.chartObj);\r\n bounds = { X: svgXy.X, Y: svgXy.Y, Width: rect.Width, Height: rect.Height };\r\n\r\n ej.EjSvgRender.utils._addRegion(cSer.chartObj, bounds, series, point, pointIndex);\r\n }\r\n\r\n\r\n if (!requireInvertedAxes)\r\n point.symbolLocation = { X: rect.X + (rect.Width / 2), Y: ((y1 < (series.yAxis._crossValue || 0) && !series.yAxis.isInversed) || (series.yAxis.isInversed && y1 > (series.yAxis._crossValue || 0))) ? ((rect.Y) + (rect.Height)) : (rect.Y) };\r\n else\r\n point.symbolLocation = { X: ((y1 < (series.yAxis._crossValue || 0) && !series.yAxis.isInversed) || (series.yAxis.isInversed && y1 > (series.yAxis._crossValue || 0))) ? (rect.X) : (rect.X + rect.Width), Y: ((rect.Y) + (rect.Height / 2)) };\r\n\r\n }\r\n }\r\n\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n\r\n },\r\n\r\n stackingSeries: true,\r\n requireInvertedAxes: true,\r\n isRegion: true\r\n\r\n });\r\n ej.seriesTypes.stackingbar = ej.ejStackingBarSeries;\r\n\r\n ej.seriesTypes.stackingbar100 = ej.ejStackingBarSeries;\r\n\r\n ej.ejBarSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n draw: function (chart, options, params) {\r\n this.chartObj = chart;\r\n options._animationType = \"rect\";\r\n if (options.columnFacet == \"cylinder\")\r\n options._animationType = \"cylinder\";\r\n var requireInvertedAxes = this.chartObj.model.requireInvertedAxes;\r\n var series = options;\r\n var cornerRadius = series.cornerRadius;\r\n var seriesIndex = $.inArray(series, this.chartObj.model._visibleSeries);\r\n var origin = ej.EjSeriesRender.prototype.getOrigin(this, series, params);\r\n var style = $.extend(true, {}, this.chartObj.model.seriesStyle, series.style);\r\n var sidebysideinfo = this.getSideBySideInfo(series, params);\r\n if (series.dragSettings.enable) series.sidebysideInfo = sidebysideinfo;\r\n var visiblePoints = this._isVisiblePoints(series);\r\n var colors;\r\n var trans = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, requireInvertedAxes);\r\n\r\n var serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': 'translate(' + trans.x + ',' + trans.y + ')' };\r\n\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n var cSer = this;\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n var pointIndex = i;\r\n var point = visiblePoints[i];\r\n var y1 = point.YValues[0];\r\n var y2 = origin;\r\n if (point.visible) {\r\n //calculate sides\r\n var data = cSer.calculateSides(point, sidebysideinfo);\r\n var x1 = data.x1;\r\n var x2 = data.x2;\r\n\r\n var styleOptions = this.chartObj.setStyle(cSer, series, seriesIndex, pointIndex);\r\n\r\n var rect = cSer.getRectangle(x1, y1, x2, y2, series, chart);\r\n\r\n var xr = Math.min(0, rect.Width);\r\n var yr = Math.min(0, rect.Height);\r\n\r\n if (xr == 0 || yr == 0) {\r\n var bounds;\r\n options = {\r\n 'id': cSer.chartObj.svgObject.id + '_Series' + seriesIndex + '_Point' + pointIndex,\r\n 'x': rect.X + cSer.chartObj.canvasX,\r\n 'y': rect.Y + cSer.chartObj.canvasY,\r\n 'width': rect.Width,\r\n 'height': rect.Height,\r\n 'fill': styleOptions.interior,\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'plot': y1 < 0 ? \"negative\" : \"positive\",\r\n 'opacity': styleOptions.opacity,\r\n 'stroke': styleOptions.borderColor,\r\n 'stroke-dasharray': styleOptions.dashArray,\r\n };\r\n var cylinderSeriesOption = {\r\n 'isColumn': false,\r\n 'stacking': false,\r\n 'isLastSeries': true,\r\n };\r\n if (series.columnFacet == \"cylinder\")\r\n cSer.chartObj.svgRenderer.drawCylinder(options, cSer.gSeriesGroupEle, cylinderSeriesOption);\r\n else if ((typeof (cornerRadius) != \"object\" && cornerRadius > 0) || cornerRadius.topLeft > 0 || cornerRadius.bottomLeft > 0\r\n || cornerRadius.topRight > 0 || cornerRadius.bottomRight > 0) //calculate path for rounded corner\r\n {\r\n var roundrect = ej.EjSvgRender.utils._calculateroundedCorner(cornerRadius, options);\r\n options.d = roundrect;\r\n series._animationType = \"path\";\r\n cSer.chartObj.svgRenderer.drawPath(options, cSer.gSeriesGroupEle);\r\n }\r\n else if (series.columnFacet == \"rectangle\")\r\n cSer.chartObj.svgRenderer.drawRect(options, cSer.gSeriesGroupEle);\r\n\r\n var svgXy = ej.EjSvgRender.utils._getSvgXY((rect.X), (rect.Y), series, cSer.chartObj);\r\n bounds = { X: svgXy.X, Y: svgXy.Y, Width: rect.Width, Height: rect.Height };\r\n\r\n ej.EjSvgRender.utils._addRegion(cSer.chartObj, bounds, series, point, pointIndex);\r\n }\r\n\r\n\r\n\r\n if (!requireInvertedAxes)\r\n point.symbolLocation = { X: rect.X + (rect.Width / 2), Y: ((y1 < (series.xAxis._crossValue || 0) && !series.yAxis.isInversed) || (series.yAxis.isInversed && y1 > (series.xAxis._crossValue || 0))) ? ((rect.Y) + (rect.Height)) : (rect.Y) };\r\n else\r\n point.symbolLocation = { X: ((y1 < (series.xAxis._crossValue || 0) && !series.yAxis.isInversed) || (series.yAxis.isInversed && y1 > (series.xAxis._crossValue || 0))) ? (rect.X) : (rect.X + rect.Width), Y: ((rect.Y) + (rect.Height / 2)) };\r\n\r\n }\r\n }\r\n\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n\r\n },\r\n\r\n requireInvertedAxes: true,\r\n isRegion: true\r\n });\r\n ej.seriesTypes.bar = ej.ejBarSeries;\r\n\r\n\r\n ej.ejStackingAreaSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n draw: function (chart, options) {\r\n this.chartObj = chart;\r\n options._animationType = \"path\";\r\n var aDirection, currentPoint, point1;\r\n var areasb = ej.EjSvgRender.utils._getStringBuilder();\r\n var currentSeries = options;\r\n var style = this.setAreaSeriesStyle(currentSeries);\r\n\r\n\r\n\r\n\r\n\r\n var visiblePoints = this._isVisiblePoints(currentSeries);\r\n\r\n var origin = Math.max(options.yAxis.visibleRange.min, currentSeries.stackedValue.StartValues[0]);\r\n var canvasX = this.chartObj.canvasX;\r\n var canvasY = this.chartObj.canvasY;\r\n\r\n var startPoint = { xValue: visiblePoints[0].xValue, YValues: [origin] };\r\n var startLoc = ej.EjSvgRender.utils._getPoint(startPoint, currentSeries), startValue = 0, endLength = currentSeries.stackedValue.EndValues.length;\r\n areasb.append(\"M\" + \" \" + (startLoc.X + canvasX) + \" \" + (startLoc.Y + canvasY) + \" \");\r\n\r\n //var index = $.inArray(currentSeries, this.chartObj.model._visibleSeries);\r\n\r\n for (var j = 0; j <= endLength; j++) {\r\n if (j != endLength && visiblePoints[j].visible) {\r\n currentPoint = { xValue: visiblePoints[j].xValue, YValues: [currentSeries.stackedValue.EndValues[j]] };\r\n if (visiblePoints[j].visible) {\r\n point1 = visiblePoints[j].location = ej.EjSvgRender.utils._getPoint(currentPoint, currentSeries);\r\n areasb.append(\"L\" + \" \" + (point1.X + canvasX) + \" \" + ((point1.Y + canvasY)) + \" \");\r\n visiblePoints[j].YValues[0] = currentPoint.YValues[0];\r\n }\r\n\r\n }\r\n else {\r\n origin = currentSeries.stackedValue.StartValues[j + 1];\r\n for (var i = j - 1; i >= startValue; i--) {\r\n currentPoint = { xValue: visiblePoints[i].xValue, YValues: [currentSeries.stackedValue.StartValues[i]] };\r\n point1 = ej.EjSvgRender.utils._getPoint(currentPoint, currentSeries);\r\n areasb.append(\"L\" + \" \" + (point1.X + canvasX) + \" \" + ((point1.Y + canvasY)) + \" \");\r\n }\r\n if (visiblePoints[j + 1] && visiblePoints[j + 1].visible) {\r\n var startPoint = { xValue: visiblePoints[j + 1].xValue, YValues: [currentSeries.stackedValue.StartValues[j + 1]] };\r\n var startLoc = ej.EjSvgRender.utils._getPoint(startPoint, currentSeries);\r\n areasb.append(\"M\" + \" \" + (startLoc.X + canvasX) + \" \" + (startLoc.Y + canvasY) + \" \");\r\n }\r\n startValue = j + 1;\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n aDirection = areasb.toString();\r\n\r\n this.drawAreaPath(currentSeries, style, aDirection);\r\n\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n\r\n\r\n\r\n },\r\n\r\n stackingSeries: true\r\n\r\n });\r\n ej.seriesTypes.stackingarea = ej.ejStackingAreaSeries;\r\n\r\n ej.seriesTypes.stackingarea100 = ej.ejStackingAreaSeries;\r\n\r\n ej.ejAreaSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n\r\n draw: function (chart, options, params) {\r\n this.chartObj = chart;\r\n var aDirection;\r\n options._animationType = \"path\";\r\n var areasb = ej.EjSvgRender.utils._getStringBuilder();\r\n var currentSeries = options;\r\n var style = this.setAreaSeriesStyle(currentSeries);\r\n var chartObj = this.chartObj;\r\n if (currentSeries.sorting)\r\n currentSeries.points = ej.DataManager(currentSeries.points, ej.Query().sortBy(\"xValue\")).executeLocal();\r\n\r\n var visiblePoints = this.chartObj.dragPoint ? currentSeries.pointCollection : this._isVisiblePoints(currentSeries);\r\n var origin = ej.EjSeriesRender.prototype.getOrigin(this, currentSeries, params);\r\n\r\n var startPoint;\r\n var translate = [];\r\n translate[0] = chartObj.canvasX;\r\n translate[1] = chartObj.canvasY;\r\n if (visiblePoints.length > 0) {\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n if (visiblePoints[i].visible) {\r\n if (visiblePoints.length > i + 1) {\r\n if (!startPoint) {\r\n startPoint = { xValue: visiblePoints[i].xValue, YValues: [origin] }\r\n var point1 = ej.EjSvgRender.utils._getPoint(startPoint, currentSeries);\r\n areasb.append(\"M\" + \" \" + (point1.X) + \" \" + ((point1.Y)) + \" \");\r\n }\r\n\r\n\r\n var point1 = ej.EjSvgRender.utils._getPoint(visiblePoints[i], currentSeries);\r\n\r\n areasb.append(\"L\" + \" \" + (point1.X) + \" \" + ((point1.Y)) + \" \");\r\n\r\n if (!visiblePoints[i + 1].visible) {\r\n var point = { xValue: visiblePoints[i].xValue, YValues: [origin] }\r\n var point2 = ej.EjSvgRender.utils._getPoint(point, currentSeries);\r\n var point3 = ej.EjSvgRender.utils._getPoint(startPoint, currentSeries);\r\n areasb.append(\"L\" + \" \" + (point2.X) + \" \" + ((point2.Y)) + \" \" + \"L\" + \" \" + (point3.X) + \" \" + ((point3.Y)) + \" \");\r\n startPoint = null;\r\n }\r\n }\r\n else {\r\n if (visiblePoints[i - 1] && visiblePoints[i - 1].visible) {\r\n var point1 = ej.EjSvgRender.utils._getPoint(visiblePoints[i], currentSeries);\r\n areasb.append(\"L\" + \" \" + (point1.X) + \" \" + ((point1.Y)) + \" \");\r\n }\r\n }\r\n }\r\n }\r\n\r\n var endPoint = { xValue: visiblePoints[visiblePoints.length - 1].xValue, YValues: [origin] };\r\n var endLoc = ej.EjSvgRender.utils._getPoint(endPoint, currentSeries);\r\n if (visiblePoints.length > 1)\r\n areasb.append(\"L\" + \" \" + (endLoc.X) + \" \" + ((endLoc.Y)) + \" \");\r\n\r\n aDirection = areasb.toString();\r\n\r\n this.drawAreaPath(currentSeries, style, aDirection, translate);\r\n }\r\n if (this.chartObj.dragPoint)\r\n this.chartObj.svgRenderer.append(this.chartObj.gPreviewSeriesGroupEle, this.chartObj.gSeriesEle);\r\n else\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n\r\n\r\n\r\n }\r\n\r\n });\r\n\r\n ej.seriesTypes.area = ej.ejAreaSeries;\r\n\r\n ej.ejRangeAreaSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n\r\n draw: function (chart, options) {\r\n this.chartObj = chart;\r\n var aDirection;\r\n options._animationType = \"path\";\r\n var areasb = ej.EjSvgRender.utils._getStringBuilder();\r\n var currentSeries = options;\r\n var style = this.setAreaSeriesStyle(currentSeries);\r\n var seriesIndex = $.inArray(currentSeries, this.chartObj.model._visibleSeries);\r\n currentSeries.points = ej.DataManager(currentSeries.points, ej.Query().sortBy(\"xValue\")).executeLocal();\r\n\r\n var visiblePoints = this._isVisiblePoints(currentSeries);\r\n var translate = [];\r\n translate[0] = this.chartObj.canvasX;\r\n translate[1] = this.chartObj.canvasY;\r\n var startPoint;\r\n var internalRegion = []\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n internalRegion[i] = { Region: { PointIndex: i }, SeriesIndex: seriesIndex, region: [] };\r\n if (visiblePoints[i].visible) {\r\n if (!startPoint) {\r\n var origin = visiblePoints[i].low;\r\n startPoint = { xValue: visiblePoints[i].xValue, YValues: [origin] }\r\n var point1 = ej.EjSvgRender.utils._getPoint(startPoint, currentSeries);\r\n areasb.append(\"M\" + \" \" + (point1.X) + \" \" + ((point1.Y)) + \" \");\r\n }\r\n var point1 = ej.EjSvgRender.utils._getPoint(visiblePoints[i], currentSeries);\r\n areasb.append(\"L\" + \" \" + (point1.X) + \" \" + ((point1.Y)) + \" \");\r\n internalRegion[i].region.push({ X: point1.X, Y: point1.Y });\r\n if (i != 0)\r\n internalRegion[i - 1].region.push({ X: point1.X, Y: point1.Y });\r\n\r\n if ((i + 1) < visiblePoints.length && !visiblePoints[i + 1].visible) {\r\n for (var j = i; j >= 0; j--) {\r\n if (visiblePoints[j].visible) {\r\n origin = visiblePoints[j].low;\r\n var point = { xValue: visiblePoints[j].xValue, YValues: [origin] };\r\n var point2 = ej.EjSvgRender.utils._getPoint(point, currentSeries);\r\n areasb.append(\"L\" + \" \" + (point2.X) + \" \" + ((point2.Y)) + \" \");\r\n internalRegion[j].region.push({ X: point2.X, Y: point2.Y });\r\n if (j != 0)\r\n internalRegion[j - 1].region.push({ X: point2.X, Y: point2.Y });\r\n }\r\n else\r\n break;\r\n }\r\n startPoint = null;\r\n }\r\n\r\n\r\n }\r\n }\r\n for (var i = visiblePoints.length - 1; i >= 0; i--) {\r\n if (visiblePoints[i].visible) {\r\n origin = visiblePoints[i].low;\r\n var point = { xValue: visiblePoints[i].xValue, YValues: [origin] };\r\n var point2 = ej.EjSvgRender.utils._getPoint(point, currentSeries);\r\n areasb.append(\"L\" + \" \" + (point2.X) + \" \" + ((point2.Y)) + \" \");\r\n internalRegion[i].region.push({ X: point2.X, Y: point2.Y });\r\n if (i != 0)\r\n internalRegion[i - 1].region.push({ X: point2.X, Y: point2.Y });\r\n\r\n }\r\n else if (visiblePoints.length > i && visiblePoints[i].visible) {\r\n var point2 = ej.EjSvgRender.utils._getPoint(visiblePoints[i], currentSeries);\r\n areasb.append(\"L\" + \" \" + (point2.X) + \" \" + ((point2.Y)) + \" \");\r\n break;\r\n }\r\n else if (i != (visiblePoints.length - 1)) {\r\n var count = 0;\r\n for (k = i - 1; k >= 0; k--) {\r\n if (visiblePoints[k].visible)\r\n count++;\r\n else if (!visiblePoints[k].visible)\r\n break;\r\n }\r\n i = i - count;\r\n }\r\n }\r\n aDirection = areasb.toString();\r\n this.chartObj.model.chartRegions.push(internalRegion);\r\n\r\n this.drawAreaPath(currentSeries, style, aDirection, translate);\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n },\r\n\r\n hiloTypes: true\r\n\r\n });\r\n\r\n ej.seriesTypes.rangearea = ej.ejRangeAreaSeries;\r\n\r\n ej.ejSplineSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n draw: function (chart, options, params) {\r\n if (!params.seriesCollection) {\r\n params.seriesCollection = {};\r\n options._name = ej.util.isNullOrUndefined(options.name) ? \"\" : options.name.replace(/ /g, '');\r\n }\r\n if (!params.seriesCollection[options._name])\r\n params.seriesCollection[options._name] = {};\r\n this.chartObj = chart;\r\n options._animationType = \"path\";\r\n var series = options,\r\n spDirection = \"\",\r\n splinesb = ej.EjSvgRender.utils._getStringBuilder(),\r\n style = this.setLineSeriesStyle(series),\r\n yIndex = 0,\r\n visiblePoints = this.chartObj.dragPoint ? series.pointCollection : this._isVisiblePoints(series),\r\n ySpline = params.seriesCollection[series._name].naturalSpline || this.naturalSpline(visiblePoints, series),\r\n firstPoint = null,\r\n secondPoint = null,\r\n firstIndex = -1, controlPointsCount = 0,\r\n controlPoints = params.seriesCollection[series._name].controlPoints || [];\r\n\r\n //Removed spline sorting behavior based on the 'X' points.\r\n //series.points = ej.DataManager(series.points, ej.Query().sortBy(\"X\")).executeLocal();\r\n\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n var pointIndex = i;\r\n secondPoint = visiblePoints[i];\r\n if (secondPoint.visible) {\r\n if (firstPoint != null) {\r\n var controlPoint1 = null;\r\n var controlPoint2 = null;\r\n var data = controlPoints[controlPointsCount++] || this.getBezierControlPoints(firstPoint, secondPoint, ySpline[firstIndex], ySpline[pointIndex], yIndex, series, this);\r\n controlPoint1 = data[\"controlPoint1\"];\r\n controlPoint2 = data[\"controlPoint2\"];\r\n var pt1 = ej.EjSvgRender.utils._getPoint(firstPoint, series);\r\n var pt2 = ej.EjSvgRender.utils._getPoint(secondPoint, series);\r\n var bpt1 = ej.EjSvgRender.utils._getPoint(controlPoint1, series);\r\n var bpt2 = ej.EjSvgRender.utils._getPoint(controlPoint2, series);\r\n var chartObj = this.chartObj;\r\n splinesb.append(\"M\" + \" \" + (pt1.X + chartObj.canvasX) + \" \" + (pt1.Y + chartObj.canvasY) + \" \" + \"C\" + \" \" + (bpt1.X + chartObj.canvasX) + \" \" + (bpt1.Y + chartObj.canvasY) + \" \" + (bpt2.X + chartObj.canvasX) + \" \" + (bpt2.Y + chartObj.canvasY) + \" \" + (pt2.X + chartObj.canvasX) + \" \" + (pt2.Y + chartObj.canvasY) + \" \");\r\n\r\n }\r\n firstPoint = secondPoint;\r\n firstIndex = pointIndex;\r\n } else {\r\n firstPoint = null;\r\n }\r\n }\r\n\r\n spDirection = splinesb.toString();\r\n this._drawLinePath(series, style, spDirection);\r\n if (this.chartObj.dragPoint)\r\n this.chartObj.svgRenderer.append(this.chartObj.gPreviewSeriesGroupEle, this.chartObj.gSeriesEle);\r\n else\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n }\r\n\r\n });\r\n\r\n ej.seriesTypes.spline = ej.ejSplineSeries;\r\n\r\n ej.ejSplineAreaSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n\r\n draw: function (chart, options, params) {\r\n if (!params.seriesCollection) {\r\n params.seriesCollection = {};\r\n options._name = ej.util.isNullOrUndefined(options.name) ? \"\" : options.name.replace(/ /g, '');\r\n }\r\n if (!params.seriesCollection[options._name])\r\n params.seriesCollection[options._name] = {};\r\n this.chartObj = chart;\r\n options._animationType = \"path\";\r\n var requireInvertedAxes = this.chartObj.model.requireInvertedAxes;\r\n var series = options;\r\n var spDirection = \"\";\r\n var splinesb = ej.EjSvgRender.utils._getStringBuilder();\r\n var style = this.setAreaSeriesStyle(series);\r\n var yIndex = 0;\r\n //Removed splineArea sorting behavior based on the 'X' points.\r\n if (series.sorting)\r\n series.points = ej.DataManager(series.points, ej.Query().sortBy(\"xValue\")).executeLocal();\r\n var visiblePoints = this.chartObj.dragPoint ? series.pointCollection : this._isVisiblePoints(series);\r\n var ySpline = params.seriesCollection[series._name].naturalSpline || this.naturalSpline(visiblePoints, series);\r\n var firstPoint = null;\r\n var secondPoint = null;\r\n var firstIndex = -1;\r\n\r\n var origin = ej.EjSeriesRender.prototype.getOrigin(this, series, params);\r\n var startPoint = null;\r\n var start = true;\r\n var chartObj = this.chartObj;\r\n var translate = [], controlPointsCount = 0, controlPoints = params.seriesCollection[series._name].controlPoints || [];\r\n translate[0] = chartObj.canvasX;\r\n translate[1] = chartObj.canvasY;\r\n var count = 0;\r\n var seriesIndex = chartObj.model._seriesIndex;\r\n var previousSeriesPoints = null;\r\n var stackingsplinepath = [];\r\n var seriesType = series.type.toLowerCase();\r\n var emptyPointSettings = series.emptyPointSettings;\r\n chartObj.model._previousSeries = ej.util.isNullOrUndefined(chartObj.model._previousSeries) ? null : chartObj.model._previousSeries;\r\n series._prevpointIndex = null;\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n var pointIndex = i;\r\n secondPoint = visiblePoints[i];\r\n secondPoint.YValues[0] = seriesType.indexOf(\"stackingsplinearea\") != -1 ? series.stackedValue.EndValues[i] : secondPoint.YValues[0];\r\n if (secondPoint.visible) {\r\n if (!startPoint) {\r\n if (seriesIndex == 0 || seriesType.indexOf('stackingsplinearea') == -1)\r\n startPoint = { xValue: visiblePoints[i].xValue, YValues: [origin] };\r\n else {\r\n var actualIndex = $.inArray(options, chartObj.model._visibleSeries);\r\n for (var m = actualIndex; m > 0; m--) {\r\n var ser = chartObj.model.series[m - 1];\r\n if (ser.visibility != \"hidden\") {\r\n previousSeriesPoints = ser.points;\r\n break;\r\n }\r\n }\r\n startPoint = { xValue: visiblePoints[i].xValue, YValues: [previousSeriesPoints[i].YValues[0]] };\r\n }\r\n var startLoc = ej.EjSvgRender.utils._getPoint(startPoint, series);\r\n }\r\n if (firstPoint != null) {\r\n var controlPoint1 = null;\r\n var controlPoint2 = null;\r\n if (seriesType.indexOf(\"stackingsplinearea\") != -1)\r\n var data = controlPoints[pointIndex - 1] || this.getBezierControlPoints(firstPoint, secondPoint, ySpline[firstIndex], ySpline[pointIndex], yIndex, series, this);\r\n else\r\n var data = controlPoints[controlPointsCount++] || this.getBezierControlPoints(firstPoint, secondPoint, ySpline[firstIndex], ySpline[pointIndex], yIndex, series, this);\r\n controlPoint1 = data[\"controlPoint1\"];\r\n controlPoint2 = data[\"controlPoint2\"];\r\n var pt1 = ej.EjSvgRender.utils._getPoint(firstPoint, series);\r\n var pt2 = ej.EjSvgRender.utils._getPoint(secondPoint, series);\r\n var bpt1 = ej.EjSvgRender.utils._getPoint(controlPoint1, series);\r\n var bpt2 = ej.EjSvgRender.utils._getPoint(controlPoint2, series);\r\n if (start) {\r\n if (requireInvertedAxes)\r\n splinesb.append(\"M\" + \" \" + (startLoc.X) + \" \" + (pt1.Y) + \" \" + \"L\" + \" \" + (pt1.X) + \" \" + ((pt1.Y)) + \" \");\r\n else\r\n splinesb.append(\"M\" + \" \" + (pt1.X) + \" \" + (startLoc.Y) + \" \" + \"L\" + \" \" + (pt1.X) + \" \" + ((pt1.Y)) + \" \");\r\n start = false;\r\n }\r\n splinesb.append(\"C\" + \" \" + (bpt1.X) + \" \" + (bpt1.Y) + \" \" + (bpt2.X) + \" \" + (bpt2.Y) + \" \" + (pt2.X) + \" \" + (pt2.Y) + \" \");\r\n if (seriesType.indexOf(\"stackingsplinearea\") != -1)\r\n stackingsplinepath[pointIndex] = (\"C\" + \" \" + (bpt2.X) + \" \" + (bpt2.Y) + \" \" + (bpt1.X) + \" \" + (bpt1.Y) + \" \" + (pt1.X) + \" \" + (pt1.Y) + \" \");\r\n if (pointIndex == visiblePoints.length - 1 || (pointIndex < visiblePoints.length - 1 && !visiblePoints[i + 1].visible)) {\r\n if (seriesIndex != 0 && seriesType.indexOf(\"stackingsplinearea\") != -1) {\r\n startPoint = { xValue: visiblePoints[i].xValue, YValues: [previousSeriesPoints[i].YValues[0]] };\r\n startLoc = ej.EjSvgRender.utils._getPoint(startPoint, series);\r\n }\r\n if (requireInvertedAxes)\r\n splinesb.append(\"L\" + \" \" + (startLoc.X) + \" \" + (pt2.Y) + \" \");\r\n else\r\n splinesb.append(\"L\" + \" \" + (pt2.X) + \" \" + (startLoc.Y) + \" \");\r\n startPoint = null;\r\n start = true;\r\n if (emptyPointSettings.displayMode.toLowerCase() == \"gap\" && pointIndex != visiblePoints.length - 1 && seriesIndex != 0 && seriesType.indexOf(\"stacking\") != -1) {\r\n var minvalue = ej.util.isNullOrUndefined(series._prevpointIndex) ? 1 : series._prevpointIndex;\r\n for (var j = pointIndex; j >= minvalue; j--) {\r\n if (visiblePoints[j - 1].visible && !ej.util.isNullOrUndefined(chartObj.model._previousSeries)) {\r\n splinesb.append(chartObj.model._previousSeries[j]);\r\n chartObj.model._previousSeries[j] = \"\";\r\n }\r\n else\r\n break;\r\n\r\n }\r\n series._prevpointIndex = pointIndex + 3;\r\n }\r\n }\r\n }\r\n else if (seriesType.indexOf('stackingsplinearea') != -1) {\r\n if (pointIndex > 0 && emptyPointSettings.displayMode == \"gap\") {\r\n this.drawbackCurve(controlPoints, series, stackingsplinepath, pointIndex, secondPoint);\r\n }\r\n\r\n }\r\n firstPoint = secondPoint;\r\n firstIndex = pointIndex;\r\n } else {\r\n firstPoint = null;\r\n if (seriesType.indexOf(\"stackingsplinearea\") != -1 && pointIndex > 0 && emptyPointSettings.displayMode == \"gap\") {\r\n this.drawbackCurve(controlPoints, series, stackingsplinepath, pointIndex, secondPoint);\r\n }\r\n }\r\n }\r\n\r\n spDirection = splinesb.toString();\r\n if (seriesType.indexOf(\"stackingsplinearea\") != -1 && seriesIndex > 0) {\r\n chartObj.model._previousSeries = this._getReversePath(chartObj, seriesIndex, chartObj.model._previousSeries);\r\n }\r\n spDirection = ej.util.isNullOrUndefined(chartObj.model._previousSeries) ? spDirection : spDirection + chartObj.model._previousSeries + \"Z\";\r\n chartObj.model._previousSeries = stackingsplinepath;\r\n this.drawAreaPath(series, style, spDirection, translate);\r\n if (this.chartObj.dragPoint)\r\n this.chartObj.svgRenderer.append(this.chartObj.gPreviewSeriesGroupEle, this.chartObj.gSeriesEle);\r\n else\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n },\r\n stackingSeries: true,\r\n\r\n _getReversePath: function (chartObj, seriesIndex, reversePath) {\r\n var emptyPointSettings = chartObj.model.series[seriesIndex].emptyPointSettings,\r\n path = \"\", points = chartObj.model.series[seriesIndex].points;\r\n if (!ej.util.isNullOrUndefined(reversePath)) {\r\n for (var i = 0; i < points.length; i++) {\r\n var pointIndex = i;\r\n if (!points[pointIndex].visible) {\r\n if (!points[pointIndex].isEmpty || emptyPointSettings.displayMode == \"gap\") {\r\n if (pointIndex == 0) {\r\n if (reversePath[pointIndex + 1])\r\n reversePath[pointIndex + 1] = \"\";\r\n }\r\n else if (pointIndex == points.length - 1) {\r\n if (reversePath[pointIndex])\r\n reversePath[pointIndex] = \"\";\r\n }\r\n else {\r\n if (reversePath[pointIndex])\r\n reversePath[pointIndex] = \"\";\r\n if (reversePath[pointIndex + 1])\r\n reversePath[pointIndex + 1] = \"\";\r\n }\r\n }\r\n\r\n }\r\n }\r\n for (var j = reversePath.length - 1; j > 0; j--) {\r\n path = path + reversePath[j];\r\n }\r\n }\r\n return path;\r\n },\r\n\r\n drawbackCurve: function (controlPoints, series, stackingsplinepath, pointIndex, secondPoint) {\r\n var data = controlPoints[pointIndex - 1];\r\n controlPoint1 = data[\"controlPoint1\"];\r\n controlPoint2 = data[\"controlPoint2\"];\r\n var pt1 = ej.EjSvgRender.utils._getPoint(series.points[pointIndex - 1], series);\r\n var pt2 = ej.EjSvgRender.utils._getPoint(secondPoint, series);\r\n var bpt1 = ej.EjSvgRender.utils._getPoint(controlPoint1, series);\r\n var bpt2 = ej.EjSvgRender.utils._getPoint(controlPoint2, series);\r\n stackingsplinepath[pointIndex] = (\"C\" + \" \" + (bpt2.X) + \" \" + (bpt2.Y) + \" \" + (bpt1.X) + \" \" + (bpt1.Y) + \" \" + (pt1.X) + \" \" + (pt1.Y) + \" \");\r\n }\r\n });\r\n\r\n ej.seriesTypes.splinearea = ej.ejSplineAreaSeries;\r\n ej.seriesTypes.stackingsplinearea = ej.ejSplineAreaSeries;\r\n ej.seriesTypes.stackingsplinearea100 = ej.ejSplineAreaSeries;\r\n\r\n\r\n\r\n ej.ejScatterSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n\r\n\r\n draw: function (chart, options) {\r\n this.chartObj = chart;\r\n var series = options;\r\n options._animationType = \"scatter\";\r\n var seriesIndex = $.inArray(options, this.chartObj.model._visibleSeries);\r\n var visiblePoints = series.points.length > 100 || !series.enableSmartLabels ? this.improveChartPerformance(series) : this._isVisiblePoints(series);\r\n var visiblePointsLength = visiblePoints.length;\r\n var point, point1;\r\n options._visiblePoints = visiblePoints;\r\n for (var i = 0; i < visiblePointsLength; i++) {\r\n point = visiblePoints[i];\r\n var pointIndex = i;\r\n point1 = ej.EjSvgRender.utils._getPoint(point, options);\r\n this.drawSymbol(seriesIndex, options, pointIndex, point1.X, point1.Y);\r\n }\r\n\r\n }\r\n });\r\n\r\n ej.seriesTypes.scatter = ej.ejScatterSeries;\r\n\r\n\r\n ej.ejBubbleSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n createBubbleGroup: function (series) {\r\n\r\n var seriesIndex = $.inArray(series, this.chartObj.model.series);\r\n var areaBoundsX = this.chartObj.model.m_AreaBounds.X;\r\n var areaBoundsY = this.chartObj.model.m_AreaBounds.Y;\r\n var isTransposed = series._isTransposed;\r\n var transX = isTransposed ? areaBoundsX : series.xAxis.x;\r\n\r\n var transY = isTransposed ? areaBoundsY : series.yAxis.y;\r\n var serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': 'translate(' + transX + ',' + transY + ')' };\r\n\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n\r\n },\r\n draw: function (chart, options) {\r\n this.chartObj = chart;\r\n options._animationType = \"bubble\";\r\n var series = options;\r\n var cornerRadius = series.cornerRadius;\r\n series.points = ej.DataManager(series.points, ej.Query().sortBy(\"xValue\")).executeLocal();\r\n var seriesIndex = $.inArray(series, this.chartObj.model._visibleSeries);\r\n var visiblePoints = this._isVisiblePoints(series);\r\n var sizeValueIndex = 1;\r\n //bubble responsive\r\n var bubbleOptions = options.bubbleOptions;\r\n var mode = bubbleOptions.radiusMode.toLowerCase();\r\n var temp = 100, minRadius, maxRadius;\r\n var areaBounds = chart.model.m_AreaBounds;\r\n var visibleSeries = chart.model._visibleSeries, maximumSize = 0;\r\n var value = Math.max(areaBounds.Height, areaBounds.Width);\r\n var segmentRadius, radius, percentChange;\r\n\r\n if (mode == \"minmax\") { // minmax mode radius calculation\r\n percentChange = value / temp;\r\n minRadius = bubbleOptions.minRadius * percentChange;\r\n maxRadius = bubbleOptions.maxRadius * percentChange;\r\n radius = maxRadius - minRadius;\r\n maximumSize = Math.max.apply(0, $.map(visiblePoints, function (v) { return v.YValues[sizeValueIndex]; }));\r\n } else { // auto mode radius calculation\r\n maxValue = (value / 5) / 2;\r\n minRadius = maxRadius = 1;\r\n radius = maxValue * maxRadius;\r\n for (m = 0; m < visibleSeries.length; m++) {\r\n if (visibleSeries[m].type.toLowerCase() == \"bubble\" && visibleSeries[m].visibility == \"visible\"\r\n && visibleSeries[m].bubbleOptions.radiusMode.toLowerCase() == \"auto\") {\r\n points = visibleSeries[m]._visiblePoints;\r\n for (n = 0; n < points.length; n++)\r\n maximumSize = maximumSize < points[n].YValues[sizeValueIndex] ? points[n].YValues[sizeValueIndex] : maximumSize;\r\n }\r\n }\r\n }\r\n this.createBubbleGroup(series);\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n var point = visiblePoints[i];\r\n var pointIndex = i;\r\n if (point.visible) {\r\n if (series.bubbleOptions.radiusMode.toLowerCase() == \"minmax\")\r\n segmentRadius = minRadius + radius * Math.abs(point.YValues[sizeValueIndex] / maximumSize);\r\n else\r\n segmentRadius = radius * Math.abs(point.YValues[sizeValueIndex] / maximumSize);\r\n\r\n var location = ej.EjSvgRender.utils._getPoint(point, series);\r\n\r\n var styleOptions = this.chartObj.setStyle(this, series, seriesIndex, pointIndex);\r\n\r\n var options = {\r\n 'id': this.chartObj.svgObject.id + '_Series' + seriesIndex + '_Point' + pointIndex,\r\n 'cx': location.X + this.chartObj.canvasX,\r\n 'cy': (location.Y) + this.chartObj.canvasY,\r\n 'r': segmentRadius,\r\n 'fill': styleOptions.interior,\r\n 'cornerRadius': cornerRadius,\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'stroke-dasharray': styleOptions.dashArray,\r\n 'opacity': styleOptions.opacity,\r\n 'stroke': styleOptions.borderColor\r\n };\r\n if ((typeof (cornerRadius) != \"object\" && cornerRadius > 0) || cornerRadius.topLeft > 0 || cornerRadius.bottomLeft > 0\r\n || cornerRadius.topRight > 0 || cornerRadius.bottomRight > 0) //calculate path for rounded corner\r\n {\r\n var roundrect = ej.EjSvgRender.utils.calculateroundedCorner(options);\r\n options.d = roundrect;\r\n cSer.chartObj.svgRenderer.drawPath(options, cSer.gSeriesGroupEle);\r\n }\r\n else\r\n\r\n point.radius = segmentRadius; // radius is stored to draw tracksymbol for bubble in canvas\r\n\r\n this.chartObj.svgRenderer.drawCircle(options, this.gSeriesGroupEle);\r\n\r\n\r\n\r\n var cx = location.X;\r\n var cy = location.Y;\r\n var r = segmentRadius;\r\n\r\n\r\n var valwidth, x, y, valheight;\r\n x = ((cx - r) + (series.isTransposed ? this.chartObj.model.m_AreaBounds.X : series.xAxis.x));\r\n y = ((cy - r) + (series.isTransposed ? this.chartObj.model.m_AreaBounds.Y : series.yAxis.y));\r\n\r\n valheight = 2 * r;\r\n valwidth = 2 * r;\r\n\r\n var bounds = { X: x, Y: y, Width: valwidth, Height: valheight };\r\n ej.EjSvgRender.utils._addRegion(this.chartObj, bounds, series, null, i);\r\n }\r\n }\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n }\r\n });\r\n\r\n ej.seriesTypes.bubble = ej.ejBubbleSeries;\r\n ej.ejhiloSeries = ejExtendClass(ej.EjSeriesRender, {\r\n draw: function (chart, options, params) {\r\n\r\n this.chartObj = chart;\r\n options._animationType = \"hilo\";\r\n var requireInvertedAxes = this.chartObj.model.requireInvertedAxes;\r\n //DrawHiloGraph \r\n\r\n var currentseries = options;\r\n currentseries.points = ej.DataManager(currentseries.points, ej.Query().sortBy(\"xValue\")).executeLocal();\r\n var visiblePoints = this._isVisiblePoints(currentseries);\r\n var sidebysideinfo = this.getSideBySideInfo(currentseries, params);\r\n var point = null;\r\n\r\n var seriesIndex = $.inArray(currentseries, this.chartObj.model._visibleSeries);\r\n var trans = ej.EjSvgRender.utils._getTransform(currentseries.xAxis, currentseries.yAxis, requireInvertedAxes);\r\n var serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': 'translate(' + trans.x + ',' + trans.y + ')' };\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n\r\n\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n point = visiblePoints[i];\r\n var pointIndex = i;\r\n if (point.visible) {\r\n\r\n var lDirection = \"\";\r\n if (ej.util.isNullOrUndefined(point.YValues[0]) || ej.util.isNullOrUndefined(point.YValues[1]))\r\n continue;\r\n\r\n var styleOptions = this.chartObj.setStyle(this, currentseries, seriesIndex, pointIndex);\r\n\r\n var pathInterior = this.chartObj.setHiloStyle(currentseries, pointIndex, seriesIndex);\r\n\r\n\r\n var lowvalue = {}, highvalue = {};\r\n if (point.YValues[0] < point.YValues[1]) {\r\n lowvalue = { xValue: point.xValue + sidebysideinfo.Median, YValues: [point.YValues[0]] };\r\n highvalue = { xValue: point.xValue + sidebysideinfo.Median, YValues: [point.YValues[1]] };\r\n } else {\r\n lowvalue = { xValue: point.xValue + sidebysideinfo.Median, YValues: [point.YValues[1]] };\r\n highvalue = { xValue: point.xValue + sidebysideinfo.Median, YValues: [point.YValues[0]] };\r\n }\r\n var point1 = ej.EjSvgRender.utils._getPoint(lowvalue, currentseries);\r\n var point2 = ej.EjSvgRender.utils._getPoint(highvalue, currentseries);\r\n lDirection = \"M\" + \" \" + (point1.X + this.chartObj.canvasX) + \" \" + ((point1.Y + this.chartObj.canvasY)) + \" \" + \"L\" + \" \" + (point2.X + this.chartObj.canvasX) + \" \" + ((point2.Y + this.chartObj.canvasY)) + \" \";\r\n var pointbounds = { point1: point1, point2: point2 };\r\n this._drawHiloPath(currentseries, styleOptions, pathInterior, lDirection, i, pointbounds);\r\n }\r\n }\r\n\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n },\r\n\r\n hiloTypes: true\r\n });\r\n\r\n ej.seriesTypes.hilo = ej.ejhiloSeries;\r\n\r\n //Draw HiloOpenClose\r\n ej.ejhiloopencloseSeries = ejExtendClass(ej.EjSeriesRender, {\r\n draw: function (chart, options, params) {\r\n\r\n this.chartObj = chart;\r\n var requireInvertedAxes = this.chartObj.model.requireInvertedAxes;\r\n //DrawHiloGraph \r\n options._animationType = \"hilo\";\r\n var currentseries = options;\r\n currentseries.points = ej.DataManager(currentseries.points, ej.Query().sortBy(\"xValue\")).executeLocal();\r\n var visiblePoints = this._isVisiblePoints(currentseries);\r\n var sidebysideinfo = this.getSideBySideInfo(currentseries, params);\r\n var point = null;\r\n var paletteColor = this.chartObj.model.palette;\r\n var seriesIndex = $.inArray(currentseries, this.chartObj.model._visibleSeries);\r\n var trans = ej.EjSvgRender.utils._getTransform(currentseries.xAxis, currentseries.yAxis, requireInvertedAxes);\r\n var serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': 'translate(' + trans.x + ',' + trans.y + ')' };\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n\r\n var interior;\r\n\r\n\r\n\r\n\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n var pointIndex = i;\r\n point = visiblePoints[i];\r\n if (point.visible) {\r\n\r\n var lDirection = \"\";\r\n var drawOpenWing = (ej.util.isNullOrUndefined(currentseries.drawMode) ? true : (currentseries.drawMode.toLowerCase() == \"both\" || currentseries.drawMode.toLowerCase() == \"open\") ? true : false);\r\n var drawCloseWing = (ej.util.isNullOrUndefined(currentseries.drawMode) ? true : (currentseries.drawMode.toLowerCase() == \"both\" || currentseries.drawMode.toLowerCase() == \"close\") ? true : false);\r\n\r\n\r\n var lowvalue = {}, highvalue = {}, openvalue = {}, closevalue = {};\r\n\r\n\r\n if (point.YValues[0] < point.YValues[1]) {\r\n lowvalue = { xValue: point.xValue + sidebysideinfo.Median, YValues: [point.YValues[0]] };\r\n highvalue = { xValue: point.xValue + sidebysideinfo.Median, YValues: [point.YValues[1]] };\r\n openvalue = { xValue: point.xValue, YValues: [point.YValues[2]] };\r\n closevalue = { xValue: point.xValue, YValues: [point.YValues[3]] };\r\n\r\n } else {\r\n lowvalue = { xValue: point.xValue + sidebysideinfo.Median, YValues: [point.YValues[1]] };\r\n highvalue = { xValue: point.xValue + sidebysideinfo.Median, YValues: [point.YValues[0]] };\r\n openvalue = { xValue: point.xValue, YValues: [point.YValues[2]] };\r\n closevalue = { xValue: point.xValue, YValues: [point.YValues[3]] };\r\n\r\n }\r\n currentseries.fill = currentseries.isFill ? currentseries.fill : null;\r\n if (point.YValues[2] < point.YValues[3])\r\n currentseries.bearFillColor = interior = (ej.util.isNullOrUndefined(currentseries.bearFillColor)) ? ((currentseries.fill) ? currentseries.fill : ((paletteColor && paletteColor.length > 0) ? paletteColor[seriesIndex] : \"#339933\")) : currentseries.bearFillColor;\r\n\r\n else\r\n currentseries.bullFillColor = interior = (ej.util.isNullOrUndefined(currentseries.bullFillColor)) ? ((currentseries.fill) ? currentseries.fill : ((paletteColor && paletteColor.length > 0) ? paletteColor[seriesIndex] : \"#E51400\")) : currentseries.bullFillColor;\r\n\r\n\r\n var styleOptions = this.chartObj.setStyle(this, currentseries, seriesIndex, pointIndex, interior);\r\n\r\n var pathInterior = this.chartObj.setHiloStyle(currentseries, pointIndex, seriesIndex, interior);\r\n\r\n\r\n if (point.fill) {\r\n interior = jQuery.type(point.interior) == \"array\" ? point.fill[0] : point.fill;\r\n }\r\n else {\r\n point._hiloFill = interior;\r\n }\r\n var canvasX = this.chartObj.canvasX;\r\n var canvasY = this.chartObj.canvasY;\r\n\r\n //Draw open points\r\n if (drawOpenWing) {\r\n\r\n var startOpenValue = { xValue: openvalue.xValue + sidebysideinfo.Median, YValues: openvalue.YValues };\r\n var pto1 = ej.EjSvgRender.utils._getPoint(startOpenValue, currentseries);\r\n var endOpenValue = { xValue: openvalue.xValue + sidebysideinfo.Start, YValues: openvalue.YValues };\r\n var pto2 = ej.EjSvgRender.utils._getPoint(endOpenValue, currentseries);\r\n lDirection = \"M\" + \" \" + (pto1.X + canvasX) + \" \" + ((pto1.Y + canvasY)) + \" \" + \"L\" + \" \" + (pto2.X + canvasX) + \" \" + ((pto2.Y + canvasY)) + \" \";\r\n var openbounds = { point1: pto1, point2: pto2 };\r\n this._drawHiloPath(currentseries, styleOptions, pathInterior, lDirection, i, openbounds);\r\n lDirection = \"\";\r\n\r\n }\r\n //Draw close points\r\n if (drawCloseWing) {\r\n var startCloseValue = { xValue: closevalue.xValue + sidebysideinfo.Median, YValues: closevalue.YValues };\r\n var ptc1 = ej.EjSvgRender.utils._getPoint(startCloseValue, currentseries);\r\n var endCloseValue = { xValue: closevalue.xValue + sidebysideinfo.End, YValues: closevalue.YValues };\r\n var ptc2 = ej.EjSvgRender.utils._getPoint(endCloseValue, currentseries);\r\n lDirection = \"M\" + \" \" + (ptc1.X + canvasX) + \" \" + ((ptc1.Y + canvasY)) + \" \" + \"L\" + \" \" + (ptc2.X + canvasX) + \" \" + ((ptc2.Y + canvasY)) + \" \";\r\n var pointbounds = { point1: ptc1, point2: ptc2 };\r\n this._drawHiloPath(currentseries, styleOptions, pathInterior, lDirection, i, pointbounds);\r\n lDirection = \"\";\r\n\r\n }\r\n // Draw High low points\r\n var point1 = ej.EjSvgRender.utils._getPoint(lowvalue, currentseries);\r\n var point2 = ej.EjSvgRender.utils._getPoint(highvalue, currentseries);\r\n lDirection = \"M\" + \" \" + (point1.X + canvasX) + \" \" + ((point1.Y + canvasY)) + \" \" + \"L\" + \" \" + (point2.X + canvasX) + \" \" + ((point2.Y + canvasY)) + \" \";\r\n var bounds = { point1: point1, point2: point2 };\r\n this._drawHiloPath(currentseries, styleOptions, pathInterior, lDirection, i, bounds);\r\n }\r\n\r\n }\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n },\r\n\r\n hiloTypes: true\r\n\r\n });\r\n\r\n ej.seriesTypes.hiloopenclose = ej.ejhiloopencloseSeries;\r\n\r\n //Draw candle\r\n ej.ejCandleSeries = ejExtendClass(ej.EjSeriesRender, {\r\n draw: function (chart, options, params) {\r\n\r\n this.chartObj = chart;\r\n options._animationType = \"hilo\";\r\n var requireInvertedAxes = this.chartObj.model.requireInvertedAxes;\r\n //DrawCandleGraph \r\n\r\n var currentseries = options;\r\n currentseries.points = ej.DataManager(currentseries.points, ej.Query().sortBy(\"xValue\")).executeLocal();\r\n var visiblePoints = this._isVisiblePoints(currentseries);\r\n var sidebysideinfo = this.getSideBySideInfo(currentseries, params);\r\n var point = null;\r\n var paletteColor = this.chartObj.model.palette;\r\n var seriesIndex = $.inArray(currentseries, this.chartObj.model._visibleSeries);\r\n var trans = ej.EjSvgRender.utils._getTransform(currentseries.xAxis, currentseries.yAxis, requireInvertedAxes);\r\n var serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': 'translate(' + trans.x + ',' + trans.y + ')' };\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n var interior, defaultrectHeight = 1;\r\n\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n point = visiblePoints[i];\r\n var pointIndex = i;\r\n if (point.visible) {\r\n\r\n var lDirection = \"\";\r\n\r\n var lowvalue = {}, highvalue = {}, openvalue = {}, closevalue = {};\r\n\r\n\r\n if (point.YValues[0] < point.YValues[1]) {\r\n lowvalue = { xValue: point.xValue + sidebysideinfo.Median, YValues: [point.YValues[0]] };\r\n highvalue = { xValue: point.xValue + sidebysideinfo.Median, YValues: [point.YValues[1]] };\r\n openvalue = { xValue: point.xValue, YValues: [point.YValues[2]] };\r\n closevalue = { xValue: point.xValue, YValues: [point.YValues[3]] };\r\n\r\n } else {\r\n lowvalue = { xValue: point.xValue + sidebysideinfo.Median, YValues: [point.YValues[1]] };\r\n highvalue = { xValue: point.xValue + sidebysideinfo.Median, YValues: [point.YValues[0]] };\r\n openvalue = { xValue: point.xValue, YValues: [point.YValues[2]] };\r\n closevalue = { xValue: point.xValue, YValues: [point.YValues[3]] };\r\n\r\n }\r\n if (point.YValues[2] < point.YValues[3]) {\r\n\r\n openvalue = { xValue: point.xValue, YValues: [point.YValues[2]] };\r\n closevalue = { xValue: point.xValue, YValues: [point.YValues[3]] };\r\n currentseries.bearFillColor = interior = (ej.util.isNullOrUndefined(currentseries.bearFillColor)) ? ((paletteColor && paletteColor.length > 0) ? paletteColor[seriesIndex] : \"#339933\") : currentseries.bearFillColor;\r\n\r\n } else {\r\n\r\n openvalue = { xValue: point.xValue, YValues: [point.YValues[3]] };\r\n closevalue = { xValue: point.xValue, YValues: [point.YValues[2]] };\r\n currentseries.bullFillColor = interior = (ej.util.isNullOrUndefined(currentseries.bullFillColor)) ? ((paletteColor && paletteColor.length > 0) ? paletteColor[seriesIndex] : \"#E51400\") : currentseries.bullFillColor;\r\n\r\n }\r\n\r\n var styleOptions = this.chartObj.setStyle(this, currentseries, seriesIndex, pointIndex, interior);\r\n\r\n var pathInterior = this.chartObj.setHiloStyle(currentseries, pointIndex, seriesIndex, interior);\r\n\r\n if (point.style && point.style.interior) {\r\n interior = jQuery.type(point.style.interior) == \"array\" ? point.style.interior[0] : point.style.interior;\r\n }\r\n\r\n else {\r\n point._hiloFill = pathInterior;\r\n }\r\n\r\n //Draw High low points\r\n var point1 = ej.EjSvgRender.utils._getPoint(lowvalue, currentseries);\r\n var point2 = ej.EjSvgRender.utils._getPoint({ xValue: openvalue.xValue + sidebysideinfo.Median, YValues: [openvalue.YValues[0]] }, currentseries);\r\n var point3 = ej.EjSvgRender.utils._getPoint({ xValue: closevalue.xValue + sidebysideinfo.Median, YValues: [closevalue.YValues[0]] }, currentseries);\r\n var point4 = ej.EjSvgRender.utils._getPoint(highvalue, currentseries);\r\n var canvasX = this.chartObj.canvasX;\r\n var canvasY = this.chartObj.canvasY;\r\n lDirection = \"M\" + \" \" + (point1.X + canvasX) + \" \" + ((point1.Y + canvasY)) + \" \" + \"L\" + \" \" + (point2.X + canvasX) + \" \" + ((point2.Y + canvasY)) + \" \" + \"M\" + \" \" + (point3.X + canvasX) + \" \" + ((point3.Y + canvasY)) + \" \" + \"L\" + \" \" + (point4.X + canvasX) + \" \" + ((point4.Y + canvasY)) + \" \";\r\n var pointbounds = { point1: point1, point2: point2 };\r\n this._drawHiloPath(currentseries, styleOptions, pathInterior, lDirection, i, pointbounds);\r\n //Draw open and close points\r\n\r\n var startRect = { xValue: closevalue.xValue + sidebysideinfo.Start, YValues: closevalue.YValues };\r\n var orginRect = ej.EjSvgRender.utils._getPoint(startRect, currentseries);\r\n\r\n var rectSize = { xValue: openvalue.xValue + sidebysideinfo.End, YValues: openvalue.YValues },\r\n sizeRect = ej.EjSvgRender.utils._getPoint(rectSize, currentseries),\r\n rect = ej.EjSvgRender.utils._correctRect(orginRect.X, orginRect.Y, sizeRect.X, sizeRect.Y);\r\n //line is drawn when open and close value are same \r\n if (openvalue.YValues[0] == closevalue.YValues[0]) {\r\n rect.Y = orginRect.Y - (defaultrectHeight / 2);\r\n rect.Height = defaultrectHeight;\r\n }\r\n var candleOptions = {\r\n 'id': this.chartObj.svgObject.id + '_Series' + seriesIndex + '_Point' + i,\r\n 'x': rect.X + this.chartObj.canvasX,\r\n 'y': rect.Y + this.chartObj.canvasY,\r\n 'width': rect.Width,\r\n 'height': rect.Height,\r\n 'fill': styleOptions.interior,\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'stroke-dasharray': styleOptions.dashArray,\r\n 'stroke': styleOptions.borderColor\r\n };\r\n\r\n this.chartObj.svgRenderer.drawRect(candleOptions, this.gSeriesGroupEle);\r\n\r\n var svgXy = ej.EjSvgRender.utils._getSvgXY(rect.X, rect.Y, currentseries, this.chartObj);\r\n var bounds = { X: svgXy.X, Y: svgXy.Y, Width: rect.Width, Height: rect.Height };\r\n\r\n ej.EjSvgRender.utils._addRegion(this.chartObj, bounds, currentseries, point, i);\r\n\r\n }\r\n\r\n }\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n\r\n },\r\n\r\n hiloTypes: true\r\n });\r\n ej.seriesTypes.candle = ej.ejCandleSeries;\r\n\r\n ej.ejPieOfPieSeries = ejExtendClass(ej.EjSeriesRender, {\r\n draw: function (chart, options) {\r\n this.chartObj = chart;\r\n var series = new ej.seriesTypes[\"pie\"]();\r\n series.draw(chart, options);\r\n },\r\n chartAreaType: \"None\"\r\n });\r\n ej.seriesTypes.pieofpie = ej.ejPieOfPieSeries;\r\n\r\n ej.ejPieSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n draw: function (chart, options) {\r\n\r\n this.chartObj = chart;\r\n var currentseries = options;\r\n var internalRegion = [];\r\n var seriesType = options.type.toLowerCase();\r\n var pieSeriesIndex = options.collectionIndex;\r\n var coefficient = pieSeriesIndex == 0 ? currentseries.pieCoefficient : currentseries.pieOfPieCoefficient;\r\n var isCanvas = this.chartObj.model.enableCanvasRendering;\r\n var visiblePoints = this._calculateVisiblePoints(options, this.chartObj).visiblePoints;\r\n\r\n var size = this.calculatingSliceAngle(currentseries);\r\n var seriesIndex = $.inArray(currentseries, this.chartObj.model._visibleSeries);\r\n var seriesLength = this.chartObj.model._visibleSeries.length;\r\n\r\n var currentSeries = this.chartObj.model._visibleSeries[seriesIndex];\r\n currentSeries._pieCoefficient = currentSeries.pieCoefficient;\r\n if (this.chartObj.model.circularRadius.length > 1) {\r\n for (var i = seriesIndex; !ej.util.isNullOrUndefined(currentSeries.zOrder) ? i >= 0 : i < this.chartObj.model.circularRadius.length; !ej.util.isNullOrUndefined(currentSeries.zOrder) ? i-- : i++) {\r\n if (!ej.util.isNullOrUndefined(this.chartObj.model.circularRadius[i])) {\r\n this.chartObj.model.circularRadius[seriesIndex] = this.chartObj.model.circularRadius[i] * currentSeries._pieCoefficient;\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n if (seriesType == \"pieofpie\" && currentSeries.splitMode != \"\")\r\n this.chartObj.model.circularRadius[pieSeriesIndex] = 0.25 * coefficient * Math.min(size.width, size.height);\r\n else\r\n this.chartObj.model.circularRadius[seriesIndex] = 0.5 * currentSeries._pieCoefficient * Math.min(size.width, size.height);\r\n }\r\n\r\n var min = Math.min(size.width, size.height);\r\n if (min < 0) {\r\n return min;\r\n }\r\n var totalDegree = Math.abs(currentseries.endAngle - currentseries.startAngle);\r\n if (totalDegree < 270)\r\n this.pieDoughnutCenter(currentseries);\r\n var text;\r\n\r\n var serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex };\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n\r\n var visibility = (currentseries.enableAnimation && !currentseries._animatedSeries) ? 'hidden' : 'visible';\r\n\r\n\r\n var txtOptions = { 'id': this.chartObj.svgObject.id + '_TextGroup' + '_' + seriesIndex, 'visibility': visibility };\r\n if (!this.chartObj.gSeriesTextEle) this.chartObj.gSeriesTextEle = [];\r\n this.chartObj.gSeriesTextEle[seriesIndex] = pieSeriesIndex == 1 ? this.chartObj.gSeriesTextEle[0] : this.chartObj.svgRenderer.createGroup(txtOptions);\r\n var symbolOptions = { 'id': this.chartObj.svgObject.id + '_symbolGroup' + '_' + seriesIndex, 'visibility': visibility };\r\n if (!this.chartObj.gSymbolGroupEle) this.chartObj.gSymbolGroupEle = [];\r\n this.chartObj.gSymbolGroupEle[seriesIndex] = this.chartObj.svgRenderer.createGroup(symbolOptions);\r\n\r\n var connectorOptions = { 'id': this.chartObj.svgObject.id + '_connectorGroup' + '_' + seriesIndex, 'visibility': visibility };\r\n if (!this.chartObj.gConnectorEle) this.chartObj.gConnectorEle = [];\r\n this.chartObj.gConnectorEle[seriesIndex] = this.chartObj.svgRenderer.createGroup(connectorOptions);\r\n var dataLabelOptions = { 'id': this.chartObj.svgObject.id + '_DataLabel_' + seriesIndex, 'visibility': visibility };\r\n if (!this.chartObj.gDataLabelEle) this.chartObj.gDataLabelEle = [];\r\n this.chartObj.gDataLabelEle[seriesIndex] = pieSeriesIndex == 1 ? this.chartObj.gDataLabelEle[0] : this.chartObj.svgRenderer.createGroup(dataLabelOptions);\r\n\r\n\r\n for (var j = 0; j < visiblePoints.length; j++) {\r\n var pointIndex = this.chartObj.model._isPieOfPie ? visiblePoints[j].actualIndex : j;\r\n if (isNaN(currentseries._visiblePoints[j].startAngle)) continue;\r\n var point = currentseries._visiblePoints[j];\r\n if (point.visible) {\r\n var result = this._calculateArcData(this.chartObj, pointIndex, point, currentseries, seriesIndex, pieSeriesIndex);\r\n var sliceXY = result.Direction.split(\" \");\r\n var styleOptions = this.chartObj.setStyle(this, currentseries, seriesIndex, j);\r\n if (currentseries.startAngle < currentseries.endAngle) // for canvas rendering with modified start and end angle\r\n var counterClockWise = false;\r\n else\r\n counterClockWise = true;\r\n if (!this.chartObj.model._isPieOfPie) {\r\n for (k = 0; k < currentseries.visiblePoints.length; k++) {\r\n if (point == currentseries.visiblePoints[k]) {\r\n pointIndex = k;\r\n break;\r\n }\r\n }\r\n }\r\n options = {\r\n 'id': this.chartObj.svgObject.id + '_Series' + seriesIndex + \"_Point\" + pointIndex,\r\n 'fill': styleOptions.interior,\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'stroke': styleOptions.borderColor,\r\n 'stroke-dasharray': styleOptions.dashArray,\r\n 'stroke-linecap': currentseries.lineCap,\r\n 'stroke-linejoin': currentseries.lineJoin,\r\n 'd': result.Direction,\r\n 'opacity': styleOptions.opacity,\r\n 'data-pointIndex': pointIndex,\r\n };\r\n\r\n canvasOptions = {\r\n 'id': this.chartObj.svgObject.id + '_Series' + seriesIndex + \"_Point\" + pointIndex,\r\n 'fill': styleOptions.interior,\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'stroke': styleOptions.borderColor,\r\n 'stroke-dasharray': styleOptions.dashArray,\r\n 'stroke-linecap': currentseries.lineCap,\r\n 'stroke-linejoin': currentseries.lineJoin,\r\n 'd': result.Direction,\r\n 'opacity': styleOptions.opacity,\r\n 'radius': seriesType == \"pieofpie\" ? this.chartObj.model.circularRadius[pieSeriesIndex] : this.chartObj.model.circularRadius[seriesIndex],\r\n 'start': point.startAngle - 1.57,\r\n 'end': point.endAngle - 1.57,\r\n 'data-pointIndex': pointIndex,\r\n 'counterClockWise': counterClockWise,\r\n 'innerR': 0,\r\n 'cx': result.centerX,\r\n 'cy': result.centerY,\r\n 'x': sliceXY[12],\r\n 'y': sliceXY[13]\r\n };\r\n\r\n if (isCanvas)\r\n this.chartObj.svgRenderer.drawPath(canvasOptions, this.gSeriesGroupEle);\r\n else\r\n this.chartObj.svgRenderer.drawPath(options, this.gSeriesGroupEle);\r\n\r\n region = {\r\n PointIndex: pointIndex, Index: j, StartAngle: point.startAngle, EndAngle: point.endAngle, StartX: this.chartObj.model.startX[pointIndex], StartY: this.chartObj.model.startY[pointIndex],\r\n PieSeriesIndex: pieSeriesIndex, SeriesIndex: $.inArray(currentseries, this.chartObj.model._visibleSeries)\r\n };\r\n internalRegion.push(region);\r\n\r\n }\r\n }\r\n var seriesIndex = this.chartObj.model._isPieOfPie ? pieSeriesIndex : seriesIndex;\r\n\r\n if (this.chartObj.model._isPieOfPie && pieSeriesIndex == 1\r\n && currentSeries.pieCollections[0].length > 0 && currentSeries.pieCollections[1].length == 0) {\r\n var emptyCircleOptions = this._drawEmptyPieOfPie(this.chartObj);\r\n this.chartObj.svgRenderer.drawPath(emptyCircleOptions, this.gSeriesGroupEle);\r\n }\r\n\r\n var seriesData = { Radius: this.chartObj.model.circularRadius[seriesIndex], CenterX: this.chartObj.model.circleCenterX[seriesIndex], CenterY: this.chartObj.model.circleCenterY[seriesIndex] };\r\n var region = { Series: currentseries, SeriesData: seriesData, Region: internalRegion, SeriesIndex: $.inArray(currentseries, this.chartObj.model._visibleSeries) };\r\n this.chartObj.model.chartRegions.push(region);\r\n\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n },\r\n\r\n chartAreaType: \"None\"\r\n\r\n });\r\n\r\n ej.seriesTypes.pie = ej.ejPieSeries;\r\n\r\n ej.ejDoughnutSeries = ejExtendClass(ej.EjSeriesRender, {\r\n draw: function (chart, options) {\r\n this.chartObj = chart;\r\n var currentseries = options;\r\n var internalRegion = [];\r\n\r\n var visiblePoints = this._calculateVisiblePoints(options).visiblePoints;\r\n var size = this.calculatingSliceAngle(currentseries), isCanvas = this.chartObj.model.enableCanvasRendering;\r\n var visiblePointslength = visiblePoints.length;\r\n var seriesIndex = $.inArray(currentseries, this.chartObj.model._visibleSeries);\r\n var seriesLength = this.chartObj.model._visibleSeries.length;\r\n var seriesLength = this.chartObj.model._visibleSeries.length;\r\n var currentSeries = this.chartObj.model._visibleSeries[seriesIndex];\r\n currentSeries._doughnutSize = currentSeries.doughnutSize;\r\n currentSeries._doughnutCoefficient = currentSeries.doughnutCoefficient;\r\n if (this.chartObj.model.circularRadius.length > 1) {\r\n for (var i = seriesIndex; !ej.util.isNullOrUndefined(currentSeries.zOrder) ? i >= 0 : i < this.chartObj.model.circularRadius.length; !ej.util.isNullOrUndefined(currentSeries.zOrder) ? i-- : i++) {\r\n if (!ej.util.isNullOrUndefined(this.chartObj.model.circularRadius[i])) {\r\n this.chartObj.model.circularRadius[seriesIndex] = this.chartObj.model.circularRadius[i] * currentSeries._doughnutSize;\r\n break;\r\n }\r\n }\r\n }\r\n else\r\n this.chartObj.model.circularRadius[seriesIndex] = 0.5 * currentSeries._doughnutSize * Math.min(size.width, size.height);\r\n var min = Math.min(size.width, size.height);\r\n if (min < 0) {\r\n return min;\r\n }\r\n var totalDegree = Math.abs(currentseries.endAngle - currentseries.startAngle);\r\n if (totalDegree < 270)//for centering the chart\r\n this.pieDoughnutCenter(currentseries);\r\n this.chartObj.model.innerRadius[seriesIndex] = currentSeries._doughnutCoefficient * this.chartObj.model.circularRadius[seriesIndex];\r\n\r\n\r\n var numberToFixed = ej.util.isNullOrUndefined(this.chartObj.model.roundingPlaces) ? 2 : this.chartObj.model.roundingPlaces;\r\n\r\n var seriesIndex = $.inArray(currentseries, this.chartObj.model._visibleSeries);\r\n var serOptions = { 'id': this.chartObj.svgObject.id + '_SeriesGroup' + '_' + seriesIndex };\r\n this.gSeriesGroupEle = this.chartObj.svgRenderer.createGroup(serOptions);\r\n\r\n var visibility = (currentseries.enableAnimation && !currentseries._animatedSeries) ? 'hidden' : 'visible';\r\n\r\n\r\n var txtOptions = { 'id': this.chartObj.svgObject.id + '_TextGroup' + '_' + seriesIndex, 'visibility': visibility };\r\n if (!this.chartObj.gSeriesTextEle) this.chartObj.gSeriesTextEle = [];\r\n this.chartObj.gSeriesTextEle[seriesIndex] = this.chartObj.svgRenderer.createGroup(txtOptions);\r\n\r\n var symbolOptions = { 'id': this.chartObj.svgObject.id + '_symbolGroup' + '_' + seriesIndex, 'visibility': visibility };\r\n if (!this.chartObj.gSymbolGroupEle) this.chartObj.gSymbolGroupEle = [];\r\n this.chartObj.gSymbolGroupEle[seriesIndex] = this.chartObj.svgRenderer.createGroup(symbolOptions);\r\n\r\n var connectorOptions = { 'id': this.chartObj.svgObject.id + '_connectorGroup' + '_' + seriesIndex, 'visibility': visibility };\r\n if (!this.chartObj.gConnectorEle) this.chartObj.gConnectorEle = [];\r\n this.chartObj.gConnectorEle[seriesIndex] = this.chartObj.svgRenderer.createGroup(connectorOptions);\r\n\r\n var dataLabelOptions = { 'id': this.chartObj.svgObject.id + '_DataLabel_' + seriesIndex, 'visibility': visibility };\r\n if (!this.chartObj.gDataLabelEle) this.chartObj.gDataLabelEle = [];\r\n this.chartObj.gDataLabelEle[seriesIndex] = this.chartObj.svgRenderer.createGroup(dataLabelOptions);\r\n if ((currentseries._doughnutSize > 0) && (currentSeries._doughnutCoefficient >= 0) && (currentseries._doughnutSize <= 1) && (currentSeries._doughnutCoefficient <= 1)) {\r\n\r\n for (var j = 0; j < visiblePointslength; j++) {\r\n var point = currentseries._visiblePoints[j];\r\n var pointIndex = j;\r\n if (point.visible) {\r\n var explodeX = 0;\r\n var explodeY = 0;\r\n var result = this._calculateArcData(this.chartObj, pointIndex, point, currentseries, seriesIndex);\r\n //for canvas slice explode\r\n if ((point.actualIndex == currentseries.explodeIndex || currentseries.explodeAll) && !this.chartObj.vmlRendering) {\r\n var chartStartAngle = -.5 * Math.PI;\r\n var startAngle = point.startAngle + chartStartAngle;\r\n var endAngle = point.endAngle + chartStartAngle - 0.000001;\r\n var midAngle = (startAngle + endAngle) / 2;\r\n explodeX = this.chartObj.model.circleCenterX[seriesIndex] + Math.cos(midAngle) * currentseries.explodeOffset;\r\n explodeY = this.chartObj.model.circleCenterY[seriesIndex] + Math.sin(midAngle) * currentseries.explodeOffset;\r\n }\r\n\r\n var styleOptions = this.chartObj.setStyle(this, currentseries, seriesIndex, pointIndex);\r\n\r\n if (currentseries.startAngle < currentseries.endAngle) // for canvas rendering with modified start and end angle\r\n var counterClockWise = false;\r\n else\r\n counterClockWise = true;\r\n for (k = 0; k < currentseries.visiblePoints.length; k++) {\r\n if (point == currentseries.visiblePoints[k]) {\r\n pointIndex = k;\r\n break;\r\n }\r\n }\r\n options = {\r\n 'id': this.chartObj.svgObject.id + '_Series' + seriesIndex + \"_Point\" + pointIndex,\r\n 'fill': styleOptions.interior,\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'stroke': styleOptions.borderColor,\r\n 'stroke-dasharray': styleOptions.dashArray,\r\n 'stroke-linecap': currentseries.lineCap,\r\n 'opacity': styleOptions.opacity,\r\n 'stroke-linejoin': currentseries.lineJoin,\r\n 'd': result.Direction,\r\n 'data-pointIndex': pointIndex,\r\n };\r\n canvasOptions = {\r\n 'id': this.chartObj.svgObject.id + '_Series' + seriesIndex + \"_Point\" + pointIndex,\r\n 'fill': styleOptions.interior,\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'stroke': styleOptions.borderColor,\r\n 'stroke-dasharray': styleOptions.dashArray,\r\n 'stroke-linecap': currentseries.lineCap,\r\n 'opacity': styleOptions.opacity,\r\n 'stroke-linejoin': currentseries.lineJoin,\r\n 'd': result.Direction,\r\n 'start': point.startAngle - 1.57,\r\n 'end': point.endAngle - 1.57,\r\n 'data-pointIndex': pointIndex,\r\n 'radius': this.chartObj.model.circularRadius[seriesIndex],\r\n 'innerR': this.chartObj.model.innerRadius[seriesIndex],\r\n 'counterClockWise': counterClockWise,\r\n 'x': explodeX != 0 ? explodeX : this.chartObj.model.circleCenterX[seriesIndex],\r\n 'y': explodeY != 0 ? explodeY : this.chartObj.model.circleCenterY[seriesIndex]\r\n };\r\n if (isCanvas)\r\n this.chartObj.svgRenderer.drawPath(canvasOptions, this.gSeriesGroupEle);\r\n else\r\n this.chartObj.svgRenderer.drawPath(options, this.gSeriesGroupEle);\r\n\r\n\r\n region = { PointIndex: pointIndex, Index: j, StartAngle: point.startAngle, EndAngle: point.endAngle, StartX: this.chartObj.model.startX[pointIndex], StartY: this.chartObj.model.startY[pointIndex], SeriesIndex: $.inArray(currentseries, this.chartObj.model._visibleSeries) };\r\n internalRegion.push(region);\r\n\r\n }\r\n }\r\n }\r\n var seriesData = { Radius: this.chartObj.model.circularRadius[seriesIndex], DRadius: this.chartObj.model.innerRadius[seriesIndex], CenterX: this.chartObj.model.circleCenterX[seriesIndex], CenterY: this.chartObj.model.circleCenterY[seriesIndex] };\r\n var region = { Series: currentseries, SeriesData: seriesData, Region: internalRegion, SeriesIndex: $.inArray(currentseries, this.chartObj.model._visibleSeries) };\r\n this.chartObj.model.chartRegions.push(region);\r\n\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n },\r\n\r\n chartAreaType: \"None\"\r\n });\r\n\r\n ej.seriesTypes.doughnut = ej.ejDoughnutSeries;\r\n\r\n ej.ejPyramidSeries = ejExtendClass(ej.EjSeriesRender, {\r\n draw: function (chart, options) {\r\n\r\n this.chartObj = chart;\r\n var chartModel = chart.model,\r\n point,\r\n seriesRender = this,\r\n legendActualBounds = chartModel.LegendActualBounds,\r\n currentseries = options,\r\n visiblePoints = this._calculateVisiblePoints(currentseries).visiblePoints,\r\n visiblePointslength = visiblePoints.length,\r\n internalRegion = [],\r\n translate = [],\r\n legend = chartModel.legend,\r\n dataLabel = currentseries.marker.dataLabel,\r\n legendPosition = legend.position.toLowerCase(),\r\n legendWidth = legend.border.width,\r\n textSize = 0,\r\n text,\r\n title = chartModel.title,\r\n subTitle = chartModel.title.subTitle,\r\n borderSize = chartModel.border.width,\r\n titleVisibility = title.text != '' && title.visible && title.enableTrim ? true : false,\r\n subTitleVisibility = subTitle.text != '' && subTitle.visible && subTitle.enableTrim ? true : false,\r\n measureTitle = (chartModel.title.text && chartModel.title.visible) ? ej.EjSvgRender.utils._measureText(chartModel.title.text, $(this.svgObject).width() - chartModel.margin.left - chartModel.margin.right, chartModel.title.font) : 0,\r\n measureSubTitle = (chartModel.title.subTitle.text && chartModel.title.subTitle.visible) ? ej.EjSvgRender.utils._measureText(chartModel.title.subTitle.text, $(this.svgObject).width() - chartModel.margin.left - chartModel.margin.right, chartModel.title.subTitle.font) : 0,\r\n measureTitleHeight = (chart.model.title.text == '' || !chart.model.title.visible) ? 0 : ((titleVisibility && title.textOverflow == 'wrap') ? measureTitle.height * chart.model.titleWrapTextCollection.length : (titleVisibility && title.textOverflow == 'wrapandtrim') ?\r\n measureTitle.height * chart.model.titleWrapTextCollection.length : measureTitle.height),\r\n measureSubTitleHeight = (chart.model.title.subTitle.text == '' || !chart.model.title.subTitle.visible) ? 0 : ((subTitleVisibility && subTitle.textOverflow == 'wrap') ? measureSubTitle.height * chart.model.subTitleWrapTextCollection.length : (subTitleVisibility && subTitle.textOverflow == 'wrapandtrim') ?\r\n measureSubTitle.height * chart.model.subTitleWrapTextCollection.length : measureSubTitle.height),\r\n xOffset = (chartModel.margin.left + chartModel.elementSpacing + (borderSize * 2) + chartModel.elementSpacing + chartModel.margin.right + ((legendPosition === \"right\" || legendPosition === \"left\") ? legendActualBounds.Width + (2 * legendWidth) : 0)),\r\n yOffset = (((chartModel.title.text && chartModel.title.visible) ? (chartModel._titleLocation.Y + measureTitleHeight + measureSubTitleHeight) : chartModel.elementSpacing) + (borderSize * 2) + chartModel.margin.top + chartModel.elementSpacing + chartModel.elementSpacing + ((legendPosition === \"top\" || legendPosition === \"bottom\") ? legendActualBounds.Height + (2 * legendWidth) + chartModel.elementSpacing : 0));\r\n if (dataLabel.visible && dataLabel.shape != 'none' && currentseries.labelPosition == 'outside')\r\n xOffset = xOffset + (dataLabel.margin.left + dataLabel.margin.right);\r\n chartModel.chartRegions = [];\r\n chartModel.sumofYValues = 0;\r\n\r\n if (currentseries.labelPosition.toLowerCase() === 'outside') {\r\n for (var i = 0; i < visiblePointslength; i++) {\r\n var textWidth = ej.EjSvgRender.utils._measureText((ej.util.isNullOrUndefined(visiblePoints[i].text) ? visiblePoints[i].y : visiblePoints[i].text), null, currentseries.marker.dataLabel.font).width;\r\n if (textSize < textWidth)\r\n textSize = textWidth;\r\n }\r\n chartModel.textSize = textSize;\r\n }\r\n if (currentseries._enableSmartLabels) {\r\n chartModel.actualWidth = ($(chart.svgObject).width() - xOffset) * 0.8; //calculate a pyramid width when smartlabel is enabled\r\n chartModel.resWidth = ($(chart.svgObject).width() - xOffset - chartModel.actualWidth) / 2;\r\n }\r\n else {\r\n chartModel.actualWidth = $(chart.svgObject).width() - xOffset - textSize;\r\n chartModel.resWidth = 0;\r\n }\r\n var seriesIndex = $.inArray(currentseries, chartModel._visibleSeries);\r\n chartModel.actualHeight = $(chart.svgObject).height() - yOffset;\r\n var subtitleHeight = (chart.model.title.subTitle.text == '') ? 0 : measureSubTitleHeight;\r\n var pyrX = chart.pyrX = ((legendPosition === \"left\") ? (legendActualBounds.Width + (2 * legendWidth)) : 0) + chartModel.elementSpacing + chartModel.margin.left;\r\n var pyrY = chart.pyrY = ((legendPosition === \"top\") ? (legendActualBounds.Height + (2 * legendWidth)) : 0) + ((title.text && title.visible) ? (chartModel._titleLocation.Y + measureTitleHeight + subtitleHeight) : (chartModel.margin.top + chartModel.elementSpacing));\r\n translate[0] = pyrX;\r\n translate[1] = pyrY;\r\n for (var j = 0; j < visiblePointslength; j++) {\r\n chartModel.sumofYValues += visiblePoints[j].YValues[0];\r\n }\r\n var dataLabelOptions = { 'id': chart.svgObject.id + '_DataLabel_' + seriesIndex, 'transform': 'translate(' + pyrX + ',' + pyrY + ')' };\r\n chart.gDataLabelEle = [];\r\n chart.gDataLabelEle[seriesIndex] = chart.svgRenderer.createGroup(dataLabelOptions);\r\n\r\n\r\n var numberToFixed = ej.util.isNullOrUndefined(chartModel.roundingPlaces) ? 2 : chartModel.roundingPlaces;\r\n\r\n var serOptions = { 'id': chart.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': 'translate(' + pyrX + ',' + pyrY + ')' };\r\n this.gSeriesGroupEle = chart.svgRenderer.createGroup(serOptions);\r\n\r\n\r\n var txtOptions = { 'id': chart.svgObject.id + '_textGroup' + '_' + seriesIndex, 'transform': 'translate(' + pyrX + ',' + pyrY + ')' };\r\n chart.gSeriesTextEle = [];\r\n chart.gSeriesTextEle[seriesIndex] = chart.svgRenderer.createGroup(txtOptions);\r\n\r\n var symbolOptions = { 'id': chart.svgObject.id + '_symbolGroup' + '_' + seriesIndex, 'transform': 'translate(' + pyrX + ',' + pyrY + ')' };\r\n chart.gSymbolGroupEle = [];\r\n chart.gSymbolGroupEle[seriesIndex] = chart.svgRenderer.createGroup(symbolOptions);\r\n\r\n var connectorOptions = { 'id': chart.svgObject.id + '_connectorGroup' + '_' + seriesIndex, 'transform': 'translate(' + pyrX + ',' + pyrY + ')' };\r\n chart.gConnectorEle = [];\r\n chart.gConnectorEle[seriesIndex] = chart.svgRenderer.createGroup(connectorOptions);\r\n\r\n\r\n if (currentseries.pyramidMode.toLowerCase() == \"linear\")\r\n this.calculateLinearSegments(currentseries);\r\n else\r\n this.calculateSurfaceSegments(currentseries);\r\n\r\n for (j = 0; j < visiblePointslength; j++) {\r\n var pointIndex = j;\r\n point = currentseries._visiblePoints[j];\r\n if (point.visible) {\r\n var result = this._getPyramidData(currentseries, pointIndex);\r\n\r\n var styleOptions = chart.setStyle(this, currentseries, 0, pointIndex);\r\n\r\n options = {\r\n 'id': chart.svgObject.id + '_Series' + seriesIndex + \"_Point\" + pointIndex,\r\n 'fill': styleOptions.interior,\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'stroke': styleOptions.borderColor,\r\n 'stroke-dasharray': styleOptions.dashArray,\r\n 'stroke-linecap': currentseries.lineCap,\r\n 'stroke-linejoin': currentseries.lineJoin,\r\n 'opacity': styleOptions.opacity,\r\n 'pointIndex': pointIndex,\r\n 'd': result.Direction\r\n };\r\n chart.svgRenderer.drawPath(options, this.gSeriesGroupEle, translate);\r\n\r\n if (currentseries.marker.dataLabel.template) {\r\n ej.EjSvgRender.utils._getSeriesTemplateSize(point, pointIndex, currentseries, true, chart);\r\n }\r\n\r\n point.xLocation = result.PositionX;\r\n point.yLocation = result.PositionY;\r\n point.connectorLine = result.Connector;\r\n point.startX = result.startX;\r\n point.startY = result.startY;\r\n point.Polygon = result.Polygon;\r\n region = { PointIndex: pointIndex, Line1: result.Line1, Line2: result.Line2, Line3: result.Line3, Line4: result.Line4, Polygon: result.Polygon };\r\n internalRegion.push(region);\r\n }\r\n }\r\n var region = { Series: currentseries, Region: internalRegion, SeriesIndex: $.inArray(currentseries, chartModel._visibleSeries) };\r\n chartModel.chartRegions.push(region);\r\n\r\n if (this.gSeriesGroupEle) {\r\n $(this.gSeriesGroupEle.childNodes[pointIndex]).bind('mousemove', function (evt) {\r\n evt.target = seriesRender.gSeriesGroupEle.childNodes[pointIndex];\r\n seriesRender.chartObj.chartInteractiveBehavior(evt);\r\n });\r\n\r\n chart.svgRenderer.append(this.gSeriesGroupEle, chart.gSeriesEle);\r\n }\r\n\r\n\r\n\r\n },\r\n\r\n _getPyramidData: function (series, index) {\r\n\r\n var model = this.chartObj.model;\r\n var pointMarker = series._visiblePoints[index].marker;\r\n var actualIndex = series._visiblePoints[index].actualIndex;\r\n var offset = ((series.explodeIndex == actualIndex) || (series.explodeAll) ? series.explodeOffset : 0);\r\n var resWidth = model.resWidth;\r\n var top = model.pyramidData[index].CurrY;\r\n var bottom = model.pyramidData[index].CurrY + model.pyramidData[index].Height;\r\n var topRadius = 0.5 * (1 - model.pyramidData[index].CurrY);\r\n var bottomRadius = 0.5 * (1 - bottom);\r\n var point = series.points[index];\r\n\r\n var line1 = { x: resWidth + offset + topRadius * model.actualWidth, y: top * model.actualHeight };\r\n var line2 = { x: resWidth + offset + (1 - topRadius) * model.actualWidth, y: top * model.actualHeight };\r\n var line3 = { x: resWidth + offset + (1 - bottomRadius) * model.actualWidth, y: bottom * model.actualHeight };\r\n var line4 = { x: resWidth + offset + bottomRadius * model.actualWidth, y: bottom * model.actualHeight };\r\n\r\n var direction = \"M\" + \" \" + (line1.x) + \" \" + (line1.y) + \" \" + \"L\" + \" \" + (line2.x) + \" \" + (line2.y) + \" \" + \"L\" + \" \" + (line3.x) + \" \" + (line3.y) + \" \" + \"L\" + \" \" + (line4.x) + \" \" + (line4.y) + \" \" + \"z\";\r\n var polygon = [\r\n { x: line1.x, y: line1.y },\r\n { x: line2.x, y: line2.y },\r\n { x: line3.x, y: line3.y },\r\n { x: line4.x, y: line4.y }\r\n ];\r\n if ((pointMarker && pointMarker.dataLabel && pointMarker.dataLabel.visible) || (!pointMarker || !pointMarker.dataLabel) && series.marker.dataLabel.visible) {\r\n var positionX;\r\n var positionY;\r\n var startX = (line2.x + line3.x) / 2;\r\n var startY = (line2.y + line3.y) / 2;\r\n if (series.labelPosition.toLowerCase() === 'outside') {\r\n\r\n positionX = (line2.x + line3.x) / 2;\r\n positionY = (line2.y + line3.y) / 2;\r\n\r\n var pyrX = ((this.chartObj.model.legend.position.toLowerCase() == \"left\" || this.chartObj.model.legend.position.toLowerCase() == \"right\") ? (this.chartObj.model.LegendActualBounds.Width) : 0) + this.chartObj.model.elementSpacing + this.chartObj.model.margin.left;\r\n\r\n if (ej.util.isNullOrUndefined(series.marker.dataLabel.connectorLine.height)) {\r\n if (series._enableSmartLabels)\r\n var textOffset = $(this.chartObj.svgObject).width() - (pyrX + positionX + resWidth + (2 * this.chartObj.model.elementSpacing));\r\n else\r\n var textOffset = $(this.chartObj.svgObject).width() - (pyrX + positionX + this.chartObj.model.textSize + this.chartObj.model.elementSpacing);\r\n }\r\n else\r\n textOffset = series.marker.dataLabel.connectorLine.height;\r\n\r\n var connectorX = this.getXCordinate(positionX, textOffset, 0);\r\n var connectorY = this.getYCordinate(positionY, textOffset, 0);\r\n\r\n var connectorDirection = \"M\" + \" \" + positionX + \" \" + positionY + \" \" + \"L\" + \" \" + connectorX + \" \" + connectorY;\r\n\r\n positionX = connectorX;\r\n positionY = connectorY;\r\n\r\n\r\n }\r\n else {\r\n positionX = (line1.x + line2.x) / 2;\r\n positionY = (line3.y + line1.y) / 2;\r\n }\r\n }\r\n return { Direction: direction, PositionX: positionX, PositionY: positionY, Connector: connectorDirection, Line1: line1, Line2: line2, Line3: line3, Line4: line4, startX: startX, startY: startY, Polygon: polygon };\r\n },\r\n\r\n calculateLinearSegments: function (series) {\r\n var currY = 0;\r\n var model = this.chartObj.model;\r\n model.pyramidData = [];\r\n var gapRatio = series.gapRatio >= 0 ? (series.gapRatio <= 1 ? series.gapRatio : 1) : 0;\r\n var coef = 1 / (model.sumofYValues * (1 + gapRatio / (1 - gapRatio)));\r\n var count = series._visiblePoints.length;\r\n for (var i = 0; i < count; i++) {\r\n if (series._visiblePoints[i].visible || series._visiblePoints[i].gapMode) {\r\n var height = coef * series._visiblePoints[i].YValues[0];\r\n model.pyramidData[i] = { CurrY: currY, Height: height };\r\n currY += (gapRatio / (count - 1)) + height;\r\n }\r\n }\r\n },\r\n\r\n calculateSurfaceSegments: function (series) {\r\n var count = series._visiblePoints.length;\r\n var model = this.chartObj.model;\r\n model.pyramidData = [];\r\n var currY = 0;\r\n var y = [];\r\n var height = [];\r\n var gapRatio = series.gapRatio >= 0 ? (series.gapRatio <= 1 ? series.gapRatio : 1) : 0;\r\n var gapHeight = gapRatio / (count - 1);\r\n var preSum = this.getSurfaceHeight(0, model.sumofYValues);\r\n for (i = 0; i < count; i++) {\r\n if (series._visiblePoints[i].visible || series._visiblePoints[i].gapMode) {\r\n y[i] = currY;\r\n height[i] = this.getSurfaceHeight(currY, Math.abs(series._visiblePoints[i].YValues[0]));\r\n currY += height[i] + gapHeight * preSum;\r\n }\r\n }\r\n var coef = 1 / (currY - gapHeight * preSum);\r\n for (var i = 0; i < count; i++) {\r\n if (series._visiblePoints[i].visible || series._visiblePoints[i].gapMode) {\r\n var currHeight = coef * y[i];\r\n model.pyramidData[i] = { CurrY: currHeight, Height: coef * height[i] };\r\n }\r\n }\r\n },\r\n\r\n getSurfaceHeight: function (y, surface) {\r\n var result = this.solveQuadraticEquation(1, 2 * y, -surface);\r\n if (result) {\r\n return result;\r\n }\r\n return 0;\r\n },\r\n solveQuadraticEquation: function (a, b, c) {\r\n var root1;\r\n var root2;\r\n\r\n if (a != 0) {\r\n var d = b * b - 4 * a * c;\r\n\r\n if (d >= 0) {\r\n var sd = Math.sqrt(d);\r\n\r\n root1 = (-b - sd) / (2 * a);\r\n root2 = (-b + sd) / (2 * a);\r\n return Math.max(root1, root2);\r\n\r\n }\r\n }\r\n else if (b != 0) {\r\n root1 = -c / b;\r\n root2 = -c / b;\r\n return Math.max(root1, root2);\r\n }\r\n\r\n return false;\r\n },\r\n\r\n chartAreaType: \"None\"\r\n });\r\n\r\n ej.seriesTypes.pyramid = ej.ejPyramidSeries;\r\n\r\n ej.ejFunnelSeries = ejExtendClass(ej.EjSeriesRender, {\r\n draw: function (chart, options) {\r\n this.chartObj = chart;\r\n var chartModel = chart.model,\r\n legend = chartModel.legend,\r\n legendPosition = legend.position.toLowerCase(),\r\n legendActualBounds = chartModel.LegendActualBounds,\r\n point,\r\n seriesRender = this,\r\n currentseries = options,\r\n visiblePoints = this._calculateVisiblePoints(currentseries).visiblePoints,\r\n visiblePointslength = visiblePoints.length,\r\n internalRegion = [],\r\n dataLabel = currentseries.marker,\r\n legendWidth = legend.border.width,\r\n translate = [],\r\n textSize = 0,\r\n text,\r\n title = (chart.model.title.text == '') ? '' : chartModel.title,\r\n subTitle = (chart.model.title.subTitle.text == '') ? '' : chartModel.title.subTitle,\r\n borderSize = chartModel.border.width,\r\n titleVisibility = title.text != '' && title.visible && title.enableTrim ? true : false,\r\n subTitleVisibility = subTitle.text != '' && subTitle.visible && subTitle.enableTrim ? true : false,\r\n measureTitle = (chartModel.title.text && chartModel.title.visible) ? ej.EjSvgRender.utils._measureText(chartModel.title.text, $(this.svgObject).width() - chartModel.margin.left - chartModel.margin.right, chartModel.title.font) : 0,\r\n measureSubTitle = (chartModel.title.subTitle.text && chartModel.title.subTitle.visible) ? ej.EjSvgRender.utils._measureText(chartModel.title.subTitle.text, $(this.svgObject).width() - chartModel.margin.left - chartModel.margin.right, chartModel.title.subTitle.font) : 0,\r\n measureTitleHeight = (chart.model.title.text == '' || !chart.model.title.visible) ? 0 : ((titleVisibility && title.textOverflow == 'wrap') ? measureTitle.height * chart.model.titleWrapTextCollection.length : (titleVisibility && title.textOverflow == 'wrapandtrim') ?\r\n measureTitle.height * chart.model.titleWrapTextCollection.length : measureTitle.height),\r\n measureSubTitleHeight = (chart.model.title.subTitle.text == '' || !chart.model.title.subTitle.visible) ? 0 : ((subTitleVisibility && subTitle.textOverflow == 'wrap') ? measureSubTitle.height * chart.model.subTitleWrapTextCollection.length : (subTitleVisibility && subTitle.textOverflow == 'wrapandtrim') ?\r\n measureSubTitle.height * chart.model.subTitleWrapTextCollection.length : measureSubTitle.height),\r\n xOffset = (chartModel.margin.left + chartModel.elementSpacing + chartModel.elementSpacing + chartModel.margin.right + (borderSize * 2) + ((legendPosition === \"right\" || legendPosition === \"left\") ? legendActualBounds.Width + (2 * legendWidth) : 0)),\r\n yOffset = (((chartModel.title.text && chartModel.title.visible) ? (chartModel._titleLocation.Y + measureTitleHeight + measureSubTitleHeight) : chartModel.elementSpacing) + chartModel.margin.top + (borderSize * 2) + chartModel.elementSpacing + chartModel.elementSpacing + ((legendPosition === \"top\" || legendPosition === \"bottom\") ? legendActualBounds.Height + (2 * legendWidth) + chartModel.elementSpacing : 0));\r\n if (dataLabel.visible && dataLabel.shape != 'none' && currentseries.labelPosition == 'outside')\r\n xOffset = xOffset + (dataLabel.margin.left + dataLabel.margin.right);\r\n chartModel.chartRegions = [];\r\n chartModel.sumofYValues = 0;\r\n if (currentseries.labelPosition.toLowerCase() === 'outside') {\r\n for (var i = 0; i < visiblePointslength; i++) {\r\n var textWidth = ej.EjSvgRender.utils._measureText((ej.util.isNullOrUndefined(visiblePoints[i].text) ? visiblePoints[i].y : visiblePoints[i].text), null, currentseries.marker.dataLabel.font).width;\r\n if (textSize < textWidth)\r\n textSize = textWidth;\r\n }\r\n chartModel.textSize = textSize;\r\n }\r\n if (currentseries._enableSmartLabels) {\r\n chartModel.actualWidth = ($(chart.svgObject).width() - xOffset) * 0.8; //calculate a width of a funnel chart when smartlabel is enabled\r\n chartModel.resWidth = ($(chart.svgObject).width() - xOffset - chartModel.actualWidth) / 2;\r\n }\r\n else {\r\n chartModel.actualWidth = $(chart.svgObject).width() - xOffset - textSize;\r\n chartModel.resWidth = 0;\r\n }\r\n var subtitleHeight = (chart.model.title.subTitle.text == '') ? 0 : measureSubTitleHeight;\r\n chartModel.actualHeight = $(chart.svgObject).height() - yOffset;\r\n var pyrX = chart.pyrX = ((legendPosition === \"left\") ? (legendActualBounds.Width + (2 * legendWidth)) : 0) + chartModel.elementSpacing + chartModel.margin.left;\r\n var pyrY = chart.pyrY = ((legendPosition === \"top\") ? (legendActualBounds.Height + (2 * legendWidth)) : 0) + ((chartModel.title.text && chartModel.title.visible) ? (chartModel._titleLocation.Y + measureTitleHeight + subtitleHeight) : (chartModel.margin.top + chartModel.elementSpacing));\r\n translate[0] = pyrX;\r\n translate[1] = pyrY;\r\n for (var j = 0; j < visiblePointslength; j++) {\r\n chartModel.sumofYValues += visiblePoints[j].YValues[0];\r\n }\r\n\r\n\r\n var numberToFixed = ej.util.isNullOrUndefined(chartModel.roundingPlaces) ? 2 : chartModel.roundingPlaces;\r\n\r\n var seriesIndex = $.inArray(currentseries, chartModel._visibleSeries);\r\n var serOptions = { 'id': chart.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': 'translate(' + pyrX + ',' + pyrY + ')' };\r\n this.gSeriesGroupEle = chart.svgRenderer.createGroup(serOptions);\r\n var dataLabelOptions = { 'id': chart.svgObject.id + '_DataLabel_' + seriesIndex, 'transform': 'translate(' + pyrX + ',' + pyrY + ')' };\r\n chart.gDataLabelEle = [];\r\n chart.gDataLabelEle[seriesIndex] = chart.svgRenderer.createGroup(dataLabelOptions);\r\n\r\n\r\n var txtOptions = { 'id': chart.svgObject.id + '_textGroup' + '_' + seriesIndex, 'transform': 'translate(' + pyrX + ',' + pyrY + ')' };\r\n chart.gSeriesTextEle = [];\r\n chart.gSeriesTextEle[seriesIndex] = chart.svgRenderer.createGroup(txtOptions);\r\n\r\n var symbolOptions = { 'id': chart.svgObject.id + '_symbolGroup' + '_' + seriesIndex, 'transform': 'translate(' + pyrX + ',' + pyrY + ')' };\r\n chart.gSymbolGroupEle = [];\r\n chart.gSymbolGroupEle[seriesIndex] = chart.svgRenderer.createGroup(symbolOptions);\r\n\r\n var connectorOptions = { 'id': chart.svgObject.id + '_connectorGroup' + '_' + seriesIndex, 'transform': 'translate(' + pyrX + ',' + pyrY + ')' };\r\n chart.gConnectorEle = [];\r\n chart.gConnectorEle[seriesIndex] = chart.svgRenderer.createGroup(connectorOptions);\r\n\r\n var currY = 0;\r\n var model = chartModel;\r\n model.funnelData = [];\r\n var gapRatio = currentseries.gapRatio >= 0 ? (currentseries.gapRatio <= 1 ? currentseries.gapRatio : 1) : 0;\r\n var coef = 1 / (model.sumofYValues * (1 + gapRatio / (1 - gapRatio)));\r\n var spacing = gapRatio / visiblePointslength;\r\n for (var i = visiblePointslength - 1; i >= 0; i--) {\r\n if (currentseries._visiblePoints[i].visible || currentseries._visiblePoints[i].gapMode) {\r\n var height = coef * currentseries._visiblePoints[i].YValues[0];\r\n model.funnelData[i] = { CurrY: currY, Height: height };\r\n currY += height + spacing;\r\n }\r\n }\r\n for (j = 0; j < visiblePointslength; j++) {\r\n var pointIndex = j;\r\n point = currentseries._visiblePoints[j];\r\n if (point.visible) {\r\n var result = this._getFunnelData(currentseries, pointIndex, chart);\r\n\r\n var styleOptions = chart.setStyle(this, currentseries, 0, pointIndex);\r\n\r\n options = {\r\n 'id': chart.svgObject.id + '_Series' + seriesIndex + \"_Point\" + pointIndex,\r\n 'fill': styleOptions.interior,\r\n 'stroke-width': styleOptions.borderWidth,\r\n 'stroke': styleOptions.borderColor,\r\n 'stroke-dasharray': styleOptions.dashArray,\r\n 'stroke-linecap': currentseries.lineCap,\r\n 'stroke-linejoin': currentseries.lineJoin,\r\n 'opacity': styleOptions.opacity,\r\n 'pointIndex': pointIndex,\r\n 'd': result.Direction\r\n };\r\n chart.svgRenderer.drawPath(options, this.gSeriesGroupEle, translate);\r\n\r\n if (currentseries.marker.dataLabel.template) {\r\n ej.EjSvgRender.utils._getSeriesTemplateSize(point, pointIndex, currentseries, true, chart);\r\n }\r\n\r\n point.xLocation = result.PositionX;\r\n point.yLocation = result.PositionY;\r\n point.connectorLine = result.Connector;\r\n point.startX = result.startX;\r\n point.startY = result.startY;\r\n point.Polygon = result.Polygon;\r\n region = { PointIndex: pointIndex, Line1: result.Line1, Line2: result.Line2, Line3: result.Line3, Line4: result.Line4, Line5: result.Line5, Line6: result.Line6, Polygon: result.Polygon };\r\n internalRegion.push(region);\r\n }\r\n }\r\n var region = { Series: currentseries, Region: internalRegion, SeriesIndex: $.inArray(currentseries, chartModel._visibleSeries) };\r\n chartModel.chartRegions.push(region);\r\n\r\n if (this.gSeriesGroupEle)\r\n $(this.gSeriesGroupEle.childNodes[pointIndex]).bind('mousemove', function (evt) {\r\n evt.target = seriesRender.gSeriesGroupEle.childNodes[pointIndex];\r\n seriesRender.chartObj.chartInteractiveBehavior(evt);\r\n });\r\n\r\n chart.svgRenderer.append(this.gSeriesGroupEle, chart.gSeriesEle);\r\n\r\n\r\n },\r\n\r\n _getFunnelData: function (series, index, chart) {\r\n\r\n var model = this.chartObj.model,\r\n point = series._visiblePoints[index],\r\n pointMarker = point.marker,\r\n seriesMarer = series.marker,\r\n funnelWidth = series.funnelWidth,\r\n funnelHeight = series.funnelHeight,\r\n actualHeight = model.actualHeight,\r\n actualWidth = model.actualWidth,\r\n elementSpacing = model.elementSpacing,\r\n pyrX, legendPosition = model.legend.position.toLowerCase(),\r\n actualIndex = point.actualIndex,\r\n direction,\r\n resWidth = model.resWidth, polygon,\r\n textOffset, connectorDirection,\r\n offset = ((series.explodeIndex == actualIndex) || (series.explodeAll) ? series.explodeOffset : 0),\r\n topRadius, minRadius, bottomRadius, endTop,\r\n endMin, endBottom, top, bottomY,\r\n bottom, connectorX, connectorY,\r\n positionX, positionY, startX, startY,\r\n line1, line2, line3, line4, line5, line6,\r\n lineWidth, minimumHeight, minimumWidth;\r\n if (funnelHeight.indexOf(\"%\") != -1)\r\n minimumHeight = actualHeight * (parseInt(funnelHeight) / 100);\r\n else\r\n minimumHeight = parseInt(funnelHeight);\r\n if (funnelWidth.indexOf(\"%\") != -1)\r\n minimumWidth = actualWidth * (parseInt(funnelWidth) / 100);\r\n else\r\n minimumWidth = parseInt(funnelWidth);\r\n\r\n top = model.funnelData[index].CurrY * actualHeight;\r\n bottom = top + model.funnelData[index].Height * actualHeight;\r\n lineWidth = minimumWidth + (actualWidth - minimumWidth) * ((actualHeight - minimumHeight - top) / (actualHeight - minimumHeight));\r\n topRadius = (actualWidth / 2) - lineWidth / 2;\r\n endTop = topRadius + lineWidth;\r\n if (bottom > actualHeight - minimumHeight || actualHeight == minimumHeight)\r\n lineWidth = minimumWidth;\r\n else\r\n lineWidth = minimumWidth + (actualWidth - minimumWidth) * ((actualHeight - minimumHeight - bottom) / (actualHeight - minimumHeight));\r\n bottomRadius = (actualWidth / 2) - (lineWidth / 2);\r\n endBottom = bottomRadius + lineWidth;\r\n if (top >= actualHeight - minimumHeight) {\r\n topRadius = bottomRadius = minRadius = (actualWidth / 2) - minimumWidth / 2;\r\n endTop = endBottom = endMin = (actualWidth / 2) + minimumWidth / 2;\r\n\r\n } else if (bottom > (actualHeight - minimumHeight)) {\r\n minRadius = bottomRadius = (actualWidth / 2) - lineWidth / 2;\r\n endMin = endBottom = minRadius + lineWidth;\r\n bottomY = actualHeight - minimumHeight;\r\n }\r\n\r\n line1 = { x: resWidth + offset + topRadius, y: top };\r\n line2 = { x: resWidth + offset + endTop, y: top };\r\n line4 = { x: resWidth + offset + endBottom, y: bottom };\r\n line5 = { x: resWidth + offset + bottomRadius, y: bottom };\r\n line3 = { x: resWidth + offset + endBottom, y: bottom };\r\n line6 = { x: resWidth + offset + bottomRadius, y: bottom };\r\n if (bottomY) {\r\n line3 = { x: resWidth + offset + endMin, y: bottomY };\r\n line6 = { x: resWidth + offset + minRadius, y: bottomY };\r\n }\r\n direction = \"M\" + \" \" + (line1.x) + \" \" + (line1.y) + \" \" + \"L\" + \" \" + (line2.x) + \" \" + (line2.y) + \" \" + \"L\" + \" \" + (line3.x) + \" \" + (line3.y) + \" \" + \"L\" + \" \" + (line4.x) + \" \" + (line4.y) + \" \" + \"L\" + \" \" + (line5.x) + \" \" + (line5.y) + \" \" + \"L\" + \" \" + (line6.x) + \" \" + (line6.y) + \" \" + \"z\";\r\n polygon = [\r\n { x: line1.x, y: line1.y },\r\n { x: line2.x, y: line2.y },\r\n { x: line3.x, y: line3.y },\r\n { x: line4.x, y: line4.y },\r\n { x: line5.x, y: line5.y },\r\n { x: line6.x, y: line6.y }\r\n ];\r\n if ((pointMarker && pointMarker.dataLabel && pointMarker.dataLabel.visible) || (!pointMarker || !pointMarker.dataLabel) && seriesMarer.dataLabel.visible) {\r\n positionX;\r\n positionY;\r\n startX = (line2.x + line3.x) / 2;\r\n startY = (line2.y + line3.y) / 2;\r\n if (series.labelPosition.toLowerCase() === 'outside') {\r\n\r\n positionX = (line2.x + line3.x) / 2;\r\n positionY = (line2.y + line3.y) / 2;\r\n\r\n pyrX = ((legendPosition == \"left\" || legendPosition == \"right\") ? (model.LegendActualBounds.Width) : 0) + elementSpacing + model.margin.left;\r\n\r\n if (ej.util.isNullOrUndefined(seriesMarer.dataLabel.connectorLine.height)) {\r\n if (series._enableSmartLabels)\r\n textOffset = $(this.chartObj.svgObject).width() - (pyrX + positionX + resWidth + (2 * elementSpacing));\r\n else\r\n textOffset = $(this.chartObj.svgObject).width() - (positionX + model.textSize + elementSpacing);\r\n }\r\n else\r\n textOffset = seriesMarer.dataLabel.connectorLine.height;\r\n\r\n connectorX = this.getXCordinate(positionX, textOffset, 0);\r\n connectorY = this.getYCordinate(positionY, textOffset, 0);\r\n\r\n connectorDirection = \"M\" + \" \" + positionX + \" \" + positionY + \" \" + \"L\" + \" \" + connectorX + \" \" + connectorY;\r\n\r\n positionX = connectorX;\r\n positionY = connectorY;\r\n\r\n\r\n }\r\n else {\r\n positionX = (line1.x + line2.x) / 2;\r\n positionY = (line1.y + line4.y) / 2;\r\n }\r\n }\r\n return { Direction: direction, PositionX: positionX, PositionY: positionY, Connector: connectorDirection, Line1: line1, Line2: line2, Line3: line3, Line4: line4, Line5: line5, Line6: line6, startX: startX, startY: startY, Polygon: polygon };\r\n },\r\n\r\n\r\n chartAreaType: \"None\"\r\n });\r\n\r\n ej.seriesTypes.funnel = ej.ejFunnelSeries;\r\n /*Funnel series*/\r\n\r\n ej.ejPolarSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n draw: function (chart, options) {\r\n\r\n this.chartObj = chart;\r\n var point;\r\n var seriesRender = this;\r\n var currentseries = options;\r\n var visiblePoints = this._isVisiblePoints(currentseries);\r\n var internalRegion = [];\r\n\r\n\r\n var style = this.setLineSeriesStyle(currentseries);\r\n\r\n if (currentseries.drawType.toLowerCase() == \"column\" || currentseries.drawType.toLowerCase() == \"rangecolumn\") {\r\n var range = currentseries.xAxis.visibleRange;\r\n range.interval = 1;\r\n var length = (currentseries.xAxis._valueType == \"category\") ? range.max : range.max - 1;\r\n this.chartObj.model.sumofYValues = 0;\r\n var count = range.interval;\r\n var min = range.min;\r\n do {\r\n this.chartObj.model.sumofYValues += range.interval;\r\n min += range.interval;\r\n } while (min <= length)\r\n // this.chartObj.model.sumofYValues = visiblePoints.length;\r\n }\r\n\r\n var direction = this._calculatePolarAxesSegment(currentseries);\r\n\r\n if (currentseries.drawType.toLowerCase() == \"area\")\r\n this.drawAreaPath(currentseries, style, direction);\r\n else if (currentseries.drawType.toLowerCase() == \"line\")\r\n this._drawLinePath(currentseries, style, direction);\r\n else if (currentseries.drawType.toLowerCase() == \"spline\")\r\n this._drawLinePath(currentseries, style, direction);\r\n\r\n\r\n\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n\r\n },\r\n\r\n chartAreaType: \"PolarAxes\"\r\n\r\n });\r\n\r\n ej.seriesTypes.polar = ej.ejPolarSeries;\r\n ej.ejRadarSeries = ejExtendClass(ej.EjSeriesRender, {\r\n\r\n draw: function (chart, options) {\r\n\r\n this.chartObj = chart;\r\n var point;\r\n var seriesRender = this;\r\n var currentseries = options;\r\n var visiblePoints = this._isVisiblePoints(currentseries);\r\n var internalRegion = [];\r\n\r\n var style = this.setLineSeriesStyle(currentseries);\r\n\r\n if (currentseries.drawType.toLowerCase() == \"column\" || currentseries.drawType.toLowerCase() == \"rangecolumn\") {\r\n var range = currentseries.xAxis.visibleRange;\r\n range.interval = 1;\r\n var length = (currentseries.xAxis._valueType == \"category\") ? range.max : range.max - 1;\r\n this.chartObj.model.sumofYValues = 0;\r\n var count = range.interval;\r\n var min = range.min;\r\n do {\r\n this.chartObj.model.sumofYValues += range.interval;\r\n min += range.interval;\r\n } while (min <= length)\r\n // this.chartObj.model.sumofYValues = visiblePoints.length;\r\n }\r\n\r\n var direction = this._calculatePolarAxesSegment(currentseries);\r\n\r\n if (currentseries.drawType.toLowerCase() == \"area\")\r\n this.drawAreaPath(currentseries, style, direction);\r\n else if (currentseries.drawType.toLowerCase() == \"line\")\r\n this._drawLinePath(currentseries, style, direction);\r\n else if (currentseries.drawType.toLowerCase() == \"spline\")\r\n this._drawLinePath(currentseries, style, direction);\r\n\r\n\r\n\r\n this.chartObj.svgRenderer.append(this.gSeriesGroupEle, this.chartObj.gSeriesEle);\r\n\r\n\r\n\r\n },\r\n doAnimation: function (series, chart) { // for polar/radar animation\r\n var chartObj = chart.chartObj;\r\n var drawType = series.drawType.toLowerCase();\r\n series.regionAdded = true;\r\n chartObj.model._radius = chartObj.model.Radius || chartObj.model._radius;\r\n chartObj.model.Radius = 0;\r\n var seriesRender = chart;\r\n var seriesIndex = $.inArray(series, chartObj.model._visibleSeries);\r\n var Path = $(chartObj.gSeriesEle).find(\"#\" + seriesRender.gSeriesGroupEle.id)[0].childNodes[0];\r\n $(Path).animate(\r\n { Radius: chartObj.model._radius },\r\n\r\n {\r\n duration: 1200, queue: false, step: function (now, fx) {\r\n if (!ej.util.isNullOrUndefined(chartObj.model)) {\r\n chartObj.model.Radius = now;\r\n\r\n var direction = seriesRender._calculatePolarAxesSegment(series);\r\n if ((series.drawType.toLowerCase() != 'column') && (series.drawType.toLowerCase() != 'rangecolumn') && (drawType != 'scatter'))\r\n chartObj.svgRenderer._setAttr($(Path), { \"d\": direction });\r\n chartObj.model.Radius = chartObj.model._radius;\r\n }\r\n else\r\n $(Path).stop(true, true);\r\n },\r\n complete: function () {\r\n if (!ej.util.isNullOrUndefined(chartObj.model)) {\r\n series.regionAdded = false;\r\n chartObj.svgRenderer._setAttr($(chartObj.gSeriesEle).find(\"#\" + chartObj.svgObject.id + '_TextGroup' + '_' + seriesIndex), { \"visibility\": \"visible\" });\r\n\r\n chartObj.svgRenderer._setAttr($(chartObj.gSeriesEle).find(\"#\" + chartObj.svgObject.id + '_symbolGroup' + '_' + seriesIndex), { \"visibility\": \"visible\" });\r\n chartObj.svgRenderer._setAttr($(chartObj.gSeriesEle).find(\"#\" + chartObj.svgObject.id + '_DataLabel' + '_' + seriesIndex), { \"visibility\": \"visible\" });\r\n chartObj.model.AnimationComplete = true;\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { series: series };\r\n chartObj._trigger(\"animationComplete\", commonEventArgs);\r\n }\r\n }\r\n\r\n });\r\n },\r\n chartAreaType: \"PolarAxes\"\r\n\r\n });\r\n\r\n ej.seriesTypes.radar = ej.ejRadarSeries;\r\n})(jQuery);;\r\nej.ejChart = {};\r\n(function ($) {\r\n if (!Object.keys) {\r\n Object.keys = (function () {\r\n 'use strict';\r\n var hasOwnProperty = Object.prototype.hasOwnProperty,\r\n hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\r\n dontEnums = [\r\n 'toString',\r\n 'toLocaleString',\r\n 'valueOf',\r\n 'hasOwnProperty',\r\n 'isPrototypeOf',\r\n 'propertyIsEnumerable',\r\n 'constructor'\r\n ],\r\n dontEnumsLength = dontEnums.length;\r\n\r\n return function (obj) {\r\n if (typeof obj !== 'function' && (typeof obj !== 'object' || obj === null)) {\r\n return;\r\n }\r\n\r\n var result = [], prop, i;\r\n\r\n for (prop in obj) {\r\n if (hasOwnProperty.call(obj, prop)) {\r\n result.push(prop);\r\n }\r\n }\r\n\r\n if (hasDontEnumBug) {\r\n for (i = 0; i < dontEnumsLength; i++) {\r\n if (hasOwnProperty.call(obj, dontEnums[i])) {\r\n result.push(dontEnums[i]);\r\n }\r\n }\r\n }\r\n return result;\r\n };\r\n }());\r\n }\r\n\r\n if (!Array.isArray) {\r\n Array.isArray = function (arg) {\r\n return Object.prototype.toString.call(arg) === '[object Array]';\r\n };\r\n }\r\n if (Array.prototype.map === undefined) {\r\n Array.prototype.map = function (fn) {\r\n var rv = [];\r\n\r\n for (var i = 0, l = this.length; i < l; i++)\r\n rv.push(fn(this[i]));\r\n\r\n return rv;\r\n };\r\n }\r\n String.prototype.parseTemplate = function () {\r\n var str = this;\r\n $.each(arguments[0], function (dataIndex, dataValue) {\r\n if (dataValue.count > 0) {\r\n $.each(dataValue, function (datachildIndex, datachildValue) {\r\n var val = new RegExp('#' + dataIndex + '.' + datachildIndex + '#', 'gm')\r\n str = str.replace(val.source, datachildValue);\r\n });\r\n } else {\r\n str = str.replace(new RegExp('\\\\#' + dataIndex + '\\\\#', 'gm'), dataValue);\r\n }\r\n\r\n });\r\n while (str.indexOf('ej.') >= 0) {\r\n substr = str.substring(str.indexOf('ej.'), str.indexOf(\")\") + 1);\r\n str = str.replace(substr, eval(substr));\r\n }\r\n return str;\r\n };\r\n\r\n String.prototype.capitalizeFirstString = (function () {\r\n return this.charAt(0).toUpperCase() + this.slice(1);\r\n });\r\n\r\n var Gradient = function (colors) {\r\n this._gradientStop = [];\r\n for (var j = 0; j < colors.length; j++) {\r\n this._gradientStop.push(colors[j]);\r\n }\r\n };\r\n\r\n\r\n\r\n ej.ejChart = {\r\n\r\n _renderSfChart: function () {\r\n\r\n var svgSupport = (window.SVGSVGElement) ? true : false;\r\n var isCanvas = this.model.enableCanvasRendering;\r\n\t\t\tthis.isChartElemId = false;\r\n //Create id to chart container, if the element don't have id\r\n if (!this.element[0].id)\r\n this._createChartId();\r\n $(\"#chartContainer_\" + this._id).remove();\r\n if (svgSupport) {\r\n this.renderer = new ej.EjSvgRender(this.element);\r\n if (isCanvas) {\r\n this.svgRenderer = new ej.EjCanvasRender(this.element);\r\n this.legendSvgContainer = this.svgRenderer.createLegendCanvas(this.element); //creating new CANVAS element for legend\r\n } else {\r\n this.svgRenderer = new ej.EjSvgRender(this.element);\r\n this.legendSvgContainer = this.svgRenderer.createLegendSvg(this.element); //creating new SVG element for legend\r\n }\r\n this._appendChartElements();\r\n if (!isCanvas)\r\n this.legendContainer.find(\"svg\").attr(\"class\", \"e-designerhide\");\r\n this._createChart();\r\n $(this.svgObject).appendTo(this.element);\r\n }\r\n else {\r\n isCanvas = false;\r\n this.svgRenderer = new ej.EjVmlRender(this.element);\r\n this.legendSvgContainer = this.svgRenderer.createLegendSvg(this.element); //creating new div element for legend\r\n this.renderer = new ej.EjVmlRender(this.element);\r\n this._appendChartElements();\r\n this._createChart();\r\n $(this.svgObject).appendTo(this.chartContainer);\r\n }\r\n return true;\r\n },\r\n\r\n _appendChartElements: function () {\r\n this.legendContainer = $(\"
\").attr('id', \"legend_\" + this._id).css(\"height\", \"0px\");\r\n this.scrollerContainer = $(\"
\").attr('id', \"legend_Scroller\" + this._id).css(\"height\", \"0px\");\r\n this.templateContainer = $(\"
\").attr('id', this._id + \"_container_svg_TrackToolTip\").css(\"height\", \"0px\");\r\n this.chartContainer = $(\"
\").css(\"position\", \"relative\").attr('id', \"chartContainer_\" + this._id);\r\n this.axisScroll = $(\"
\").attr('id', \"axisScrollbar_\" + this._id).css(\"height\", \"0px\");\r\n this.svgRenderer.append(this.legendSvgContainer, this.scrollerContainer);\r\n $(this.scrollerContainer).appendTo(this.legendContainer);\r\n $(this.axisScroll).appendTo(this.chartContainer);\r\n $(this.legendContainer).appendTo(this.chartContainer);\r\n $(this.templateContainer).appendTo(this.chartContainer);\r\n $(this.chartContainer).appendTo(this.element);\r\n },\r\n\r\n setSvgSize: function (sender) {\r\n var chartObj = sender;\r\n var containerHeight = $(chartObj.element).height();\r\n var height = 450; //set default height if size not specified to chart or container\r\n var width = (ej.isTouchDevice()) ? 250 : 600;\r\n var containerWidth = $(chartObj.element).width();\r\n var legendcontainerHeight = $(chartObj.chartContainer).height();\r\n if (chartObj.model.size.width) {\r\n var chartWidth = chartObj.model.size.width;\r\n if (typeof (chartWidth) == \"string\" && chartWidth.indexOf(\"%\") != -1)\r\n width = (containerWidth / 100) * parseInt(chartWidth);\r\n else\r\n width = parseInt(chartWidth);\r\n }\r\n else if (containerWidth > 0)\r\n width = containerWidth;\r\n\r\n $(chartObj.svgObject).width(width);\r\n\r\n if (chartObj.model.size.height) {\r\n var chartHeight = chartObj.model.size.height;\r\n if (typeof (chartHeight) == \"string\" && chartHeight.indexOf(\"%\") != -1)\r\n height = (!this.vmlRendering) ? (containerHeight / 100) * parseInt(chartHeight) : height;\r\n else\r\n height = parseInt(chartHeight);\r\n }\r\n else if (containerHeight > 0)\r\n height = containerHeight;\r\n else\r\n $(chartObj.svgObject).css(\"display\", \"block\"); //Added css to chart due to 5px difference for container and svg (http://jsfiddle.net/Me5Zd/) \r\n $(chartObj.svgObject).height(height);\r\n\r\n $(\"#\" + chartObj._id).css(\"overflow\", \"hidden\");//Added css to remove scrollbar on zooming the chart\r\n chartObj.svgObject.setAttribute('width', width); // assigning width for canvas\r\n chartObj.svgObject.setAttribute('height', height); // assigning height for \r\n },\r\n compareExtend: function (temp, src, def) {\r\n if (typeof def === 'object' && def !== null) {\r\n var defProp = Object.keys(def), len = defProp.length, currPro;\r\n for (var i = 0; i < len; i++) {\r\n currPro = defProp[i];\r\n if (src.hasOwnProperty(currPro) && src[currPro] != null) {\r\n if (Array.isArray(src[currPro]) || typeof src[currPro] === 'object' && src[currPro] !== null) {\r\n this.compareExtend({}, src[currPro], def[currPro]);\r\n }\r\n }\r\n else {\r\n src[currPro] = def[currPro];\r\n }\r\n }\r\n }\r\n return src;\r\n },\r\n setModelProperties: function (excludeDataUpdate) {\r\n\r\n //set size for the svgObject\r\n if (!excludeDataUpdate)\r\n this.setSvgSize(this);\r\n\r\n this.svgWidth = $(this.svgObject).width();\r\n this.svgHeight = $(this.svgObject).height();\r\n\r\n this.chartCross = {\r\n visible: (excludeDataUpdate) ? this.chartCross.visible : this.model.crosshair.visible,\r\n mArea: this.model.crosshair.type\r\n };\r\n\r\n // extend series with commonSeriesOptions\r\n this.serAnimation = [];\r\n if (this.model.series && !excludeDataUpdate) {\r\n var trendlines, len, currentPoint, currentSeries, nullValue = false, trendLineType, datasource;\r\n this.model._drawTrendline = false;\r\n for (var j = 0; j < this.model.series.length; j++) {\r\n if (!ej.util.isNullOrUndefined(this.model.series[j].dataSource) || !ej.util.isNullOrUndefined(this.model.commonSeriesOptions.dataSource)) {\r\n if (!ej.util.isNullOrUndefined(this.model.series[j].dataSource))\r\n datasource = this.model.series[j].dataSource;\r\n else\r\n datasource = this.model.commonSeriesOptions.dataSource;\r\n }\r\n this.model.series[j] = ej.copyObject({}, this.model.commonSeriesOptions, this.model.series[j]);\r\n this.model.series[j].dataSource = datasource;\r\n currentSeries = this.model.series[j];\r\n this.serAnimation.push((currentSeries.enableAnimation === null || currentSeries.enableAnimation === undefined) ? this.model.commonSeriesOptions.enableAnimation : currentSeries.enableAnimation);\r\n trendlines = currentSeries.trendlines;\r\n len = trendlines.length;\r\n for (var i = 0; i < len; i++) {\r\n trendlines[i] = ej.copyObject({}, this.model.trendlineDefaults, trendlines[i]);\r\n trendlines[i]._visibility = trendlines[i].visibility;\r\n if (trendlines[i].visibility.toLowerCase() == \"visible\") {\r\n this.model._drawTrendline = true;\r\n trendLineType = trendlines[i].type.toLowerCase();\r\n if (!ej.util.isNullOrUndefined(currentSeries.points)) {\r\n for (var l = 0; l < currentSeries.points.length; l++) {\r\n currentPoint = currentSeries.points[l];\r\n if (ej.util.isNullOrUndefined(currentPoint.y) || currentPoint.y == 0) {\r\n nullValue = true;\r\n break;\r\n }\r\n }\r\n }\r\n trendlines[i].isNull = nullValue && (trendLineType == \"power\" || trendLineType == \"exponential\") ? true : false;\r\n }\r\n }\r\n }\r\n }\r\n if (this.model.indicators) {\r\n for (var k = 0; k < this.model.indicators.length; k++) {\r\n this.model.indicators[k] = ej.copyObject({}, this.model.indicatorDefaults, this.model.indicators[k]);\r\n }\r\n }\r\n\r\n },\r\n\r\n _createChart: function () {\r\n this.svgObject = this.svgRenderer.svgObj;\r\n var commonlaodEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n this._trigger(\"load\", commonlaodEventArgs);\r\n this.setTheme(ej.EjSvgRender.themes, this.model.theme);\r\n var model = this.model;\r\n\r\n if (model.series[0] && model.series[0]._isdesigntime) {\r\n model.series[0] = {};\r\n model.series[0].points = [];\r\n var randomPoints = [];\r\n for (var i = 1; i <= 10; i++) {\r\n randomPoints.push({ x: i, y: (Math.floor(Math.random() * (10 - 40)) + 40) });\r\n\r\n }\r\n model.series[0].points = randomPoints;\r\n }\r\n this.vmlRendering = (this.svgRenderer.vmlNamespace) ? true : false;\r\n if ($(this.element).is(\":visible\") || $(this.element).css(\"visibility\") != \"hidden\" || $(this.element).css('display') != 'none') {\r\n this.bindEvents();\r\n this.bindTo();\r\n }\r\n },\r\n setTheme: function (jsonObj, themeName) {\r\n var name = themeName.toLowerCase();\r\n if ((name.indexOf(\"azure\") >= 0 || name.indexOf(\"lime\") >= 0 || name.indexOf(\"saffron\") >= 0) && (name.indexOf(\"gradient\") == -1) && (name.indexOf(\"dark\") == -1))\r\n jsonObj[name] = $.extend(true, {}, jsonObj[\"flatlight\"], jsonObj[name]);\r\n else if ((name.indexOf(\"azuredark\") >= 0 || name.indexOf(\"limedark\") >= 0 || name.indexOf(\"saffrondark\")) >= 0 && (name.indexOf(\"gradient\") == -1))\r\n jsonObj[name] = $.extend(true, {}, jsonObj[\"flatdark\"], jsonObj[name]);\r\n else if ((name.indexOf(\"azure\") >= 0 || name.indexOf(\"lime\") >= 0 || name.indexOf(\"saffron\") >= 0) && (name.indexOf(\"gradient\") >= 0) && (name.indexOf(\"dark\") == -1))\r\n jsonObj[name] = $.extend(true, {}, jsonObj[\"gradientlight\"], jsonObj[name]);\r\n else if ((name.indexOf(\"azuredark\") >= 0 || name.indexOf(\"limedark\") >= 0 || name.indexOf(\"saffrondark\") >= 0) && (name.indexOf(\"gradient\") >= 0))\r\n jsonObj[name] = $.extend(true, {}, jsonObj[\"gradientdark\"], jsonObj[name]);\r\n else if ((name.indexOf(\"high\") >= 0))\r\n jsonObj[name] = $.extend(true, {}, jsonObj[\"highcontrast01\"], jsonObj[name]);\r\n else if ((name.indexOf(\"material\") >= 0) || (name.indexOf(\"office\") >= 0))\r\n jsonObj[name] = $.extend(true, {}, jsonObj[\"material\"], jsonObj[name]);\r\n else if (!(jsonObj[name])) name = \"flatlight\";\r\n\r\n if (this.model._themeChanged)\r\n this.model = ej.copyObject({}, this.model, jsonObj[name]);\r\n else\r\n this.model = this.compareExtend({}, this.model, jsonObj[name]);\r\n // added default property background in synchart to work in angular 1\r\n this.model.background = ej.util.isNullOrUndefined(this.model.background) ? jsonObj[name].background : this.model.background;\r\n\r\n\r\n },\r\n _drawBackInterior: function () {\r\n if (this.model.backInterior && this.model.backInterior._gradientStop) {\r\n var options = {\r\n 'id': this.svgObject.id + '_backGradient',\r\n 'x1': '0%',\r\n 'y1': '0%',\r\n 'x2': '0%',\r\n 'y2': $(this.svgObject).height() + '%'\r\n };\r\n this.svgRenderer.drawGradient(options, this.model.backInterior._gradientStop);\r\n }\r\n },\r\n\r\n\r\n\r\n _drawBackImage: function () {\r\n var options = {\r\n 'height': $(this.svgObject).height(),\r\n 'width': $(this.svgObject).width(),\r\n 'href': this.model.backGroundImageUrl,\r\n 'x': 0,\r\n 'y': 0,\r\n 'id': this.svgObject.id + '_backImage',\r\n 'visibility': 'visible',\r\n 'preserveAspectRatio': 'none'\r\n };\r\n\r\n this.svgRenderer.drawImage(options, this.svgObject);\r\n\r\n },\r\n _getDataType: function (val) {\r\n var type = typeof (val);\r\n if (type === \"number\" || type === \"string\")\r\n return type;\r\n else if (jQuery.type(val) == \"date\")\r\n return \"date\";\r\n else if (val == null) {\r\n return null;\r\n }\r\n else\r\n return false;\r\n\r\n },\r\n addedXYValues: function (excludeDataUpdate) {\r\n excludeDataUpdate = (excludeDataUpdate) ? excludeDataUpdate : false;\r\n var model = this.model,\r\n series = model.series,\r\n type = series[0].type.toLowerCase(),\r\n pointLength, visiblePoints, i, j, k,\r\n isNullOrUndefined = ej.util.isNullOrUndefined,\r\n valueType = model.primaryXAxis.valueType,\r\n setXValueType, isDatetime = false, pointX, currentSeries,\r\n setSize, //do not compare and set size for all the points\r\n regExpTest, parsed, points,\r\n areaType;\r\n\r\n areaType = model.AreaType = ej.seriesTypes[type].prototype.chartAreaType;\r\n if (areaType != \"cartesianAxes\" && areaType != \"None\") {\r\n areaType = model.AreaType = \"polaraxes\";\r\n model.isPolar = (type == 'polar');\r\n }\r\n areaType = model.AreaType = model.AreaType.toLowerCase();\r\n if (!excludeDataUpdate) {\r\n for (i = 0; i < series.length; i++) {\r\n if (series[i].visibility == \"visible\") {\r\n setSize = true;\r\n setXValueType = false;\r\n if (!series[i].dataSource || series[i].dataSource.length == 0) {\r\n points = series[i].points;\r\n series[i].points = null;\r\n series[i] = $.extend(true, {}, model.commonSeriesOptions, series[i]);\r\n series[i].points = points;\r\n currentSeries = series[i];\r\n if (valueType == \"datetime\")\r\n isDatetime = true;\r\n pointLength = points.length;\r\n for (var k = 0; k < pointLength; k++) {\r\n points[k].YValues = [];\r\n\r\n //test regular expression only for first point\r\n regExpTest = (/^-?[0-9]*\\.?[0-9]+$/.test(points[k].x) == true);\r\n\r\n //avoid using parseFloat unnecessarily. If x is already a number, then no need to use parseFloat\r\n parsed = (valueType != \"category\") && (valueType != \"datetime\") && (typeof points[k].x === 'string' || points[k].x instanceof String) && parseFloat(points[k].x);\r\n\r\n if (!isNaN(parsed ? points[k].x : parseFloat(points[k].x)) && parsed && regExpTest && (valueType != \"category\") && (areaType != \"none\"))\r\n points[k].x = (!isDatetime ? parseFloat(points[k].x) : new Date(points[k].x));\r\n if (typeof points[k].x == \"string\" && points[k].x.indexOf('
') != -1)\r\n points[k].x = points[k].x.replace(/(
)+/g, '
');\r\n points[k].xValue = points[k].x;\r\n if (!setXValueType) {\r\n pointX = points[k].x;\r\n if (!isNullOrUndefined(pointX)) {\r\n currentSeries._xAxisValueType = this._getDataType(pointX);\r\n setXValueType = true;\r\n }\r\n }\r\n if (!(currentSeries._hiloTypes) && (currentSeries.drawType.toLowerCase() != \"rangecolumn\")) {\r\n points[k].YValues[0] = currentSeries.points[k].y;\r\n\r\n setSize = setSize && !isNullOrUndefined(points[k].size);\r\n if (setSize)\r\n points[k].YValues[1] = points[k].size;\r\n }\r\n else {\r\n if (!isNullOrUndefined(points[k].high)) {\r\n points[k].YValues[0] = points[k].high;\r\n points[k].y = points[k].high;\r\n }\r\n if (!isNullOrUndefined(points[k].low))\r\n points[k].YValues[1] = points[k].low;\r\n if (!isNullOrUndefined(points[k].open))\r\n points[k].YValues[2] = points[k].open;\r\n if (!isNullOrUndefined(points[k].close))\r\n points[k].YValues[3] = points[k].close;\r\n }\r\n }\r\n }\r\n else {\r\n currentSeries = series[i];\r\n currentSeries._xAxisValueType = null;\r\n pointLength = currentSeries.points.length;\r\n pointX = currentSeries.points[0].x;\r\n\r\n if (pointX != null) {\r\n currentSeries._xAxisValueType = this._getDataType(pointX);\r\n }\r\n var pointsLength = currentSeries.points.length;\r\n var points = currentSeries.points;\r\n for (var p = 0; p < pointsLength; p++) {\r\n if (typeof points[p].x == \"string\" && points[p].x.indexOf('
') != -1)\r\n points[p].x = points[p].x.replace(/(
)+/g, '
');\r\n }\r\n }\r\n //Calculate waterfall series points and remove on series changed\r\n if (currentSeries.type.toLowerCase() == \"waterfall\")\r\n this.calculateWaterfallSeriesPoints(currentSeries.points);\r\n else if (currentSeries._previousType && currentSeries._previousType.toLowerCase() == \"waterfall\") {\r\n visiblePoints = currentSeries.points;\r\n for (j = 0; j < visiblePoints.length; j++) {\r\n visiblePoints[j].waterfallSum = undefined;\r\n visiblePoints[j].textOptions = null;\r\n }\r\n }\r\n }\r\n }\r\n this._setInternalValues();\r\n }\r\n },\r\n calculateWaterfallSeriesPoints: function (visiblePoints) {\r\n\r\n var intermediateStartValue = 0;\r\n var totalSum = 0;\r\n var previousSum = 0;\r\n\r\n for (var j = 0; j < visiblePoints.length; j++) {\r\n if (!visiblePoints[j].isEmpty) {\r\n totalSum += ((visiblePoints[j].showIntermediateSum || visiblePoints[j].showTotalSum) ? 0 : visiblePoints[j].y);\r\n\r\n if (visiblePoints[j].showIntermediateSum) {\r\n visiblePoints[j].YValues[1] = intermediateStartValue;\r\n visiblePoints[j].YValues[0] = totalSum;\r\n visiblePoints[j].waterfallSum = totalSum - intermediateStartValue;\r\n intermediateStartValue = totalSum;\r\n } else if (visiblePoints[j].showTotalSum) {\r\n visiblePoints[j].YValues[1] = 0;\r\n visiblePoints[j].YValues[0] = totalSum;\r\n visiblePoints[j].waterfallSum = totalSum;\r\n }\r\n else {\r\n visiblePoints[j].YValues[1] = previousSum;\r\n visiblePoints[j].YValues[0] = previousSum + visiblePoints[j].y;\r\n previousSum = totalSum;\r\n }\r\n } else {\r\n visiblePoints[j].YValues[1] = 0;\r\n visiblePoints[j].YValues[0] = 0;\r\n }\r\n }\r\n },\r\n _setInternalValues: function () {\r\n\r\n for (var k = 0; k < this.model.series.length; k++) {\r\n var series = this.model.series[k];\r\n if (this.model.AreaType == \"cartesianaxes\" && ej.seriesTypes[series.type.toLowerCase()].prototype.chartAreaType == \"cartesianAxes\") {\r\n series._zOrder = (series.zOrder) ? series.zOrder : 0;\r\n this.model._visibleSeries.push(series);\r\n }\r\n else if (this.model.AreaType == \"none\" && ej.seriesTypes[series.type.toLowerCase()].prototype.chartAreaType == \"None\") {\r\n series._zOrder = (series.zOrder) ? series.zOrder : 0;\r\n var type = this.model.series[k].type.toLowerCase();\r\n if (type == 'funnel' || type == 'pyramid') {\r\n this.model._visibleSeries.push(series);\r\n break;\r\n }\r\n else {\r\n this.model._visibleSeries.push(series);\r\n }\r\n }\r\n else if (this.model.AreaType == \"polaraxes\" && ej.seriesTypes[series.type.toLowerCase()].prototype.chartAreaType == \"PolarAxes\") {\r\n series._zOrder = (series.zOrder) ? series.zOrder : 0;\r\n this.model._visibleSeries.push(series);\r\n }\r\n\r\n if (series._yAxisName || series._xAxisName) {\r\n if (this.model._axes) {\r\n for (var t = 0; t < this.model._axes.length; t++) {\r\n if (series._yAxisName && (series._yAxisName == this.model._axes[t].name)) {\r\n this.model._axes[t].orientation = (this.model._axes[t].orientation) ? this.model._axes[t].orientation : (this.model.requireInvertedAxes) ? \"horizontal\" : \"vertical\";\r\n }\r\n if (series._xAxisName && (series._xAxisName == this.model._axes[t].name)) {\r\n this.model._axes[t].orientation = (this.model._axes[t].orientation) ? this.model._axes[t].orientation : (this.model.requireInvertedAxes) ? \"vertical\" : \"horizontal\";\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n setHiloStyle: function (series, pointIndex, seriesIndex, interiorColor) {\r\n var point = series.points[pointIndex], interior, seriesInterior;\r\n\r\n if (point.fill)\r\n interior = point.fill;\r\n else\r\n interior = series.fill ? series.fill : interiorColor;\r\n\r\n // setting default series color\t\t\r\n var colors = interior ? interior : this.model.seriesColors[seriesIndex];\r\n\r\n // applying gradient color\t\t \r\n\r\n seriesInterior = jQuery.type(colors) == \"array\" ? colors[0].color : colors;\r\n\r\n return seriesInterior;\r\n\r\n },\r\n setStyle: function (chart, series, seriesIndex, pointIndex, interiorColor, visiblePoints) {\r\n\r\n var pointsColl = visiblePoints || series._visiblePoints, point = pointsColl[pointIndex], interior, borderColor, borderWidth, dashArray, width,\r\n opacity, seriesFill, pointBorder = point.border, seriesBorder = series.border;\r\n // var pointStyle = point.style ? point.style : \" \";\r\n\r\n if (series._hiloTypes)\r\n seriesFill = series.isFill ? series.fill : null;\r\n\r\n // setting interior\r\n if (chart.chartObj.model.AreaType == \"cartesianaxes\") {\r\n if (point.fill)\r\n interior = point.fill;\r\n else {\r\n if (series.type.toLowerCase() == \"waterfall\") {\r\n if (((point.showIntermediateSum || point.showTotalSum) && (point.waterfallSum > 0)) || (point.y > 0) && !point.showIntermediateSum && !point.showTotalSum)\r\n interior = series.positiveFill ? series.positiveFill : interiorColor;\r\n } else\r\n interior = seriesFill ? seriesFill : interiorColor;\r\n }\r\n\r\n // setting default series color\t\t\r\n var colors = interior ? interior : this.model.seriesColors[seriesIndex];\r\n\r\n // applying gradient color\t\t \r\n if (chart.chartObj.model.requireInvertedAxes)\r\n var seriesInterior = this.svgRenderer.createGradientElement(chart.getSeriesName(series) + \"_\" + seriesIndex + pointIndex, colors, 0, 0, 100, 0, chart.gSeriesGroupEle);\r\n else\r\n seriesInterior = this.svgRenderer.createGradientElement(chart.getSeriesName(series) + \"_\" + seriesIndex + pointIndex, colors, 0, 0, 0, 100, chart.gSeriesGroupEle);\r\n }\r\n\r\n // interior for pie type series\r\n else {\r\n var pointColors = this.model.pointColors;\r\n interior = point.fill ? point.fill : jQuery.type(pointColors[pointIndex]) == \"array\" ? pointColors[pointIndex][0].color : pointColors[pointIndex];\r\n var pointInterior = this.svgRenderer.createGradientElement(chart.getSeriesName(series) + pointIndex, interior, 0, 0, 0, ($(chart.svgObject).height() || parseFloat(this.model.size.height)), chart.chartObj.gSeriesEle);\r\n }\r\n\r\n // setting borderColor\r\n borderColor = ((pointBorder) && pointBorder.color) ? pointBorder.color : seriesBorder.color;\r\n borderWidth = ((pointBorder) && !ej.util.isNullOrUndefined(pointBorder.width)) ? pointBorder.width : seriesBorder.width;\r\n opacity = point.opacity ? point.opacity : series.opacity;\r\n width = (point.width) ? point.width : series.width;\r\n dashArray = ((pointBorder) && pointBorder.dashArray) ? pointBorder.dashArray : seriesBorder.dashArray;\r\n\r\n var options = {\r\n 'interior': seriesInterior ? seriesInterior : pointInterior,\r\n 'borderColor': borderColor,\r\n 'borderWidth': borderWidth,\r\n 'width': width,\r\n 'opacity': opacity,\r\n 'dashArray': dashArray\r\n };\r\n return options;\r\n },\r\n\r\n colorNameToHex: function (colour) {\r\n var color = colour;\r\n var colours = {\r\n \"aliceblue\": \"#f0f8ff\", \"antiquewhite\": \"#faebd7\", \"aqua\": \"#00ffff\", \"aquamarine\": \"#7fffd4\", \"azure\": \"#f0ffff\",\r\n \"beige\": \"#f5f5dc\", \"bisque\": \"#ffe4c4\", \"black\": \"#000000\", \"blanchedalmond\": \"#ffebcd\", \"blue\": \"#0000ff\", \"blueviolet\": \"#8a2be2\", \"brown\": \"#a52a2a\", \"burlywood\": \"#deb887\",\r\n \"cadetblue\": \"#5f9ea0\", \"chartreuse\": \"#7fff00\", \"chocolate\": \"#d2691e\", \"coral\": \"#ff7f50\", \"cornflowerblue\": \"#6495ed\", \"cornsilk\": \"#fff8dc\", \"crimson\": \"#dc143c\", \"cyan\": \"#00ffff\",\r\n \"darkblue\": \"#00008b\", \"darkcyan\": \"#008b8b\", \"darkgoldenrod\": \"#b8860b\", \"darkgray\": \"#a9a9a9\", \"darkgreen\": \"#006400\", \"darkkhaki\": \"#bdb76b\", \"darkmagenta\": \"#8b008b\", \"darkolivegreen\": \"#556b2f\",\r\n \"darkorange\": \"#ff8c00\", \"darkorchid\": \"#9932cc\", \"darkred\": \"#8b0000\", \"darksalmon\": \"#e9967a\", \"darkseagreen\": \"#8fbc8f\", \"darkslateblue\": \"#483d8b\", \"darkslategray\": \"#2f4f4f\", \"darkturquoise\": \"#00ced1\",\r\n \"darkviolet\": \"#9400d3\", \"deeppink\": \"#ff1493\", \"deepskyblue\": \"#00bfff\", \"dimgray\": \"#696969\", \"dodgerblue\": \"#1e90ff\",\r\n \"firebrick\": \"#b22222\", \"floralwhite\": \"#fffaf0\", \"forestgreen\": \"#228b22\", \"fuchsia\": \"#ff00ff\",\r\n \"gainsboro\": \"#dcdcdc\", \"ghostwhite\": \"#f8f8ff\", \"gold\": \"#ffd700\", \"goldenrod\": \"#daa520\", \"gray\": \"#808080\", \"green\": \"#008000\", \"greenyellow\": \"#adff2f\",\r\n \"honeydew\": \"#f0fff0\", \"hotpink\": \"#ff69b4\",\r\n \"indianred \": \"#cd5c5c\", \"indigo \": \"#4b0082\", \"ivory\": \"#fffff0\", \"khaki\": \"#f0e68c\",\r\n \"lavender\": \"#e6e6fa\", \"lavenderblush\": \"#fff0f5\", \"lawngreen\": \"#7cfc00\", \"lemonchiffon\": \"#fffacd\", \"lightblue\": \"#add8e6\", \"lightcoral\": \"#f08080\", \"lightcyan\": \"#e0ffff\", \"lightgoldenrodyellow\": \"#fafad2\",\r\n \"lightgrey\": \"#d3d3d3\", \"lightgreen\": \"#90ee90\", \"lightpink\": \"#ffb6c1\", \"lightsalmon\": \"#ffa07a\", \"lightseagreen\": \"#20b2aa\", \"lightskyblue\": \"#87cefa\", \"lightslategray\": \"#778899\", \"lightsteelblue\": \"#b0c4de\",\r\n \"lightyellow\": \"#ffffe0\", \"lime\": \"#00ff00\", \"limegreen\": \"#32cd32\", \"linen\": \"#faf0e6\",\r\n \"magenta\": \"#ff00ff\", \"maroon\": \"#800000\", \"mediumaquamarine\": \"#66cdaa\", \"mediumblue\": \"#0000cd\", \"mediumorchid\": \"#ba55d3\", \"mediumpurple\": \"#9370d8\", \"mediumseagreen\": \"#3cb371\", \"mediumslateblue\": \"#7b68ee\",\r\n \"mediumspringgreen\": \"#00fa9a\", \"mediumturquoise\": \"#48d1cc\", \"mediumvioletred\": \"#c71585\", \"midnightblue\": \"#191970\", \"mintcream\": \"#f5fffa\", \"mistyrose\": \"#ffe4e1\", \"moccasin\": \"#ffe4b5\",\r\n \"navajowhite\": \"#ffdead\", \"navy\": \"#000080\",\r\n \"oldlace\": \"#fdf5e6\", \"olive\": \"#808000\", \"olivedrab\": \"#6b8e23\", \"orange\": \"#ffa500\", \"orangered\": \"#ff4500\", \"orchid\": \"#da70d6\",\r\n \"palegoldenrod\": \"#eee8aa\", \"palegreen\": \"#98fb98\", \"paleturquoise\": \"#afeeee\", \"palevioletred\": \"#d87093\", \"papayawhip\": \"#ffefd5\", \"peachpuff\": \"#ffdab9\", \"peru\": \"#cd853f\", \"pink\": \"#ffc0cb\", \"plum\": \"#dda0dd\", \"powderblue\": \"#b0e0e6\", \"purple\": \"#800080\",\r\n \"red\": \"#ff0000\", \"rosybrown\": \"#bc8f8f\", \"royalblue\": \"#4169e1\",\r\n \"saddlebrown\": \"#8b4513\", \"salmon\": \"#fa8072\", \"sandybrown\": \"#f4a460\", \"seagreen\": \"#2e8b57\", \"seashell\": \"#fff5ee\", \"sienna\": \"#a0522d\", \"silver\": \"#c0c0c0\", \"skyblue\": \"#87ceeb\", \"slateblue\": \"#6a5acd\", \"slategray\": \"#708090\", \"snow\": \"#fffafa\", \"springgreen\": \"#00ff7f\", \"steelblue\": \"#4682b4\",\r\n \"tan\": \"#d2b48c\", \"teal\": \"#008080\", \"thistle\": \"#d8bfd8\", \"tomato\": \"#ff6347\", \"turquoise\": \"#40e0d0\",\r\n \"violet\": \"#ee82ee\",\r\n \"wheat\": \"#f5deb3\", \"white\": \"#ffffff\", \"whitesmoke\": \"#f5f5f5\",\r\n \"yellow\": \"#ffff00\", \"yellowgreen\": \"#9acd32\"\r\n };\r\n\r\n if (Object.prototype.toString.call(color) == '[object Array]')\r\n return color;\r\n\r\n if (typeof colours[color.toLowerCase()] != 'undefined')\r\n return colours[color.toLowerCase()];\r\n\r\n return color;\r\n },\r\n\r\n _getLocalizedLabels: function () {\r\n return ej.getLocalizedConstants(this.sfType, this.model.locale);\r\n },\r\n\r\n // set culture for chart\r\n _setCulture: function (culture) {\r\n this.culture = ej.preferredCulture(culture);\r\n },\r\n\r\n\r\n draw: function (excludeDataUpdate) {\r\n this.removeMultiRect();\r\n var params = {};\r\n params.axes = {};\r\n this._drawBackInterior();\r\n this.model.chartRegions = [];\r\n this.model.outsideDataRegionPoints = [];\r\n this.model.regionCount = null;\r\n this.model.circularRadius = [];\r\n this.model.innerRadius = [];\r\n this.model.bounds = [];\r\n this.accDataLabelRegion = [];\r\n this.model.rightsidebounds = [];\r\n this.model.leftsidebounds = [];\r\n this.model.excludeDataUpdate = excludeDataUpdate;\r\n this.model.yAxisLabelRegions = [];\r\n this.model.xAxisLabelRegions = [];\r\n this.model.axisMultiLevelLabelRegions = [];\r\n this.model.multiLevelLabelRegions = [];\r\n this.model.minhightwidth = false;\r\n this.model._isPieOfPie = false;\r\n if (!excludeDataUpdate)\r\n this.model._visibleSeries = [];\r\n this.model.stackedValue = {};\r\n this.model._locale = this.model.locale || \"en-US\";\r\n this._setCulture(this.model._locale);\r\n this._localizedLabels = this._getLocalizedLabels();\r\n var seriesLength = this.model.series.length;\r\n var series, seriesType;\r\n if (ej.util.isNullOrUndefined(this.model.sideBySideSeriesPlacement)) // for setting sideBySideSeriesPlacement property values\r\n this.model._sideBySideSeriesPlacement = (this.model.enable3D) ? false : true;\r\n else\r\n this.model._sideBySideSeriesPlacement = this.model.sideBySideSeriesPlacement;\r\n for (var i = 0; i < seriesLength; i++) {\r\n series = this.model.series[i];\r\n seriesType = series.type.toLowerCase();\r\n series._isTransposed = (seriesType.indexOf(\"bar\") == -1) ? series.isTransposed : !series.isTransposed;\r\n }\r\n if (seriesLength > 0)\r\n this.addedXYValues(excludeDataUpdate);\r\n this.model.AreaType = this.model.AreaType || \"cartesianaxes\";\r\n\r\n this._isEjScroller();\r\n\r\n var commonpreRenderEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonpreRenderEventArgs.data = {};\r\n this._trigger(\"preRender\", commonpreRenderEventArgs);\r\n\r\n this.gLegendEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_Legend' });\r\n\r\n this.gTitleEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_ChartTitle', 'cursor': 'default' });\r\n this.gSubTitleEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_ChartsubTitle', 'cursor': 'default' });\r\n this._createAxisLabelAndRange();\r\n for (var i = 0; i < this.model._axes.length; i++)\r\n params.axes[this.model._axes[i].name] = {};\r\n this._initializeSeriesColors();\r\n\r\n this._calculateLegendBounds();\r\n\r\n this.legendRender = new ej.EjLegendRender(this);\r\n\r\n var commonLegendEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonLegendEventArgs.data = { legendBounds: this.model.LegendBounds };\r\n this._trigger(\"legendBoundsCalculate\", commonLegendEventArgs);\r\n\r\n // Assigning indicator points\r\n for (var j = 0; j < this.model.indicators.length; j++) {\r\n var indicator = this.model.indicators[j];\r\n indicator._points = [];\r\n indicator.xAxisName = (!(indicator.xAxisName)) ? this.model._axes[0].name : indicator.xAxisName;\r\n indicator.yAxisName = (!(indicator.yAxisName)) ? this.model._axes[1].name : indicator.yAxisName;\r\n indicator.isIndicator = true;\r\n if (indicator.dataSource && indicator.dataSource.length > 0) {\r\n indicator._hiloTypes = true;\r\n this._processJsonData(indicator.dataSource, indicator);\r\n //Indicator uses _points but ProcessJsonData only populate points collection\r\n indicator._points = indicator.points;\r\n } else if (indicator.points.length > 0) {\r\n for (var i = 0; i < indicator.points.length; i++) {\r\n indicator._points = indicator.points;\r\n indicator._points[i].xValue = indicator.points[i].x;\r\n indicator._points[i].YValues = [];\r\n indicator._points[i].YValues[0] = indicator.points[i].close;\r\n }\r\n }\r\n else if (indicator.seriesName != \"\") {\r\n for (var index = 0; index < this.model._visibleSeries.length; index++) {\r\n var series = this.model._visibleSeries[index];\r\n if (indicator.seriesName == series.name)\r\n indicator._points = $.extend(true, [], series.points);\r\n }\r\n }\r\n }\r\n\r\n // calculate category points\r\n for (k = 0; k < this.model._axes.length; k++) {\r\n if (this.model._axes[k].valueType && this.model._axes[k].valueType.toLowerCase() == \"category\") {\r\n for (i = 0; i < this.model.indicators.length; i++) {\r\n indicator = this.model.indicators[i];\r\n if (this.model._axes[k].name == indicator.xAxisName) {\r\n for (j = 0; j < indicator._points.length; j++)\r\n indicator._points[j].xValue = j;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // calculate ranges for indicator\r\n this.model.indicatorRange = [];\r\n for (index = 0; index < this.model.indicators.length; index++) {\r\n indicator = this.model.indicators[index];\r\n if (indicator._points.length > 0) {\r\n type = indicator.type.toLowerCase();\r\n options = new ej.indicatorTypes[type]();\r\n options.calculateSegment(indicator, this);\r\n }\r\n }\r\n\r\n\r\n for (var m = 0; m < this.model._visibleSeries.length; m++) {\r\n var options = this.model._visibleSeries[m];\r\n for (i = 0; i < options.points.length; i++) {\r\n if (typeof options.points[i].xValue == \"string\" && options.points[i].xValue.indexOf(\"/Date(\") != -1)\r\n options.points[i].xValue = new Date(parseInt(options.points[i].xValue.substr(6)));\r\n else\r\n break;\r\n }\r\n }\r\n this.model.hAxes = [];\r\n this.model.vAxes = [];\r\n var chartobj = this;\r\n var isStriplineOver = false, isStriplineBehind = false;\r\n this._arrangeAxis();\r\n var scrollbarSettings;\r\n this.model.crosshairLabelVisibility = false;\r\n for (var k = 0; k < this.model._axes.length; k++) {\r\n var axis = this.model._axes[k];\r\n this.model.crosshairLabelVisibility = axis.crosshairLabel.visible || this.model.crosshairLabelVisibility;\r\n var seriesCollection = [];\r\n var seriesLength = this.model.series.length;\r\n var orientation = this.model._axes[k].orientation.toLowerCase();\r\n var padding = this.model._axes[k].rangePadding.toLowerCase();\r\n if (padding == \"auto\") {\r\n if (orientation == \"vertical\") {\r\n axis.rangePadding = (!this.model.requireInvertedAxes) ? \"normal\" : \"none\";\r\n }\r\n if (orientation == \"horizontal\") {\r\n axis.rangePadding = (this.model.requireInvertedAxes) ? \"normal\" : \"none\";\r\n }\r\n for (var j = 0; j < seriesLength; j++) {\r\n var type = this.model.series[j].type.toLowerCase();\r\n if (type.indexOf(\"100\") != -1) {\r\n if (axis.name == this.model.series[j]._yAxisName) {\r\n axis.rangePadding = \"round\"; break;\r\n }\r\n }\r\n }\r\n }\r\n for (var slCount = 0; slCount < axis.stripLine.length; slCount++) {\r\n axis.stripLine[slCount] = $.extend(true, {}, this.model.stripLineDefault, axis.stripLine[slCount]);\r\n if (axis.stripLine[slCount].zIndex.toLowerCase() == 'over') {\r\n isStriplineOver = true;\r\n } else {\r\n isStriplineBehind = true;\r\n }\r\n }\r\n var axisOrientation = axis.orientation.toLowerCase();\r\n var zOrder = this.model._visibleSeries.length - 1;\r\n for (j = 0; j < this.model._visibleSeries.length; ++j) {\r\n zOrder -= 1;\r\n\r\n var series = this.model._visibleSeries[j];\r\n this.model._hasSeriesPoints = series.points.length > 0 || this.model._hasSeriesPoints;\r\n if ((!series.xAxisName)) {\r\n series._xAxisName = chartobj.model._axes[0].name;\r\n }\r\n if (!series.yAxisName) {\r\n series._yAxisName = chartobj.model._axes[1].name;\r\n }\r\n series._xAxisName = (!(series._xAxisName)) ? (!(series.xAxisName) ? chartobj.model._axes[0].name : series.xAxisName) : series._xAxisName;\r\n series._yAxisName = (!(series._yAxisName)) ? (!(series.yAxisName) ? chartobj.model._axes[1].name : series.yAxisName) : series._yAxisName;\r\n var xAxisName = series._xAxisName.toLowerCase();\r\n var yAxisName = series._yAxisName.toLowerCase();\r\n var name = axis.name.toLowerCase();\r\n if (xAxisName || yAxisName) {\r\n if (xAxisName == name || yAxisName == name) {\r\n if ((axisOrientation == \"horizontal\" || (series.type.toLowerCase().indexOf(\"bar\") != -1 && axisOrientation == \"vertical\")) && axis.valueType && axis.valueType.toLowerCase() == \"datetime\") {\r\n for (var m = 0; m < series.points.length; m++) {\r\n if (typeof series.points[m].xValue == \"string\" && !isNaN(Date.parse(series.points[m].xValue)))\r\n series.points[m].xValue = new Date(Date.parse(series.points[m].xValue));\r\n }\r\n }\r\n else {\r\n if (series._xAxisValueType == \"string\" && !(axis.valueType))\r\n axis._valueType = (axisOrientation == 'horizontal' && !this.model.requireInvertedAxes) ? 'category' : (axisOrientation == 'vertical' && this.model.requireInvertedAxes) ? 'category' : 'double';\r\n\r\n if (series._xAxisValueType == \"date\" && !(axis.valueType))\r\n axis._valueType = (axisOrientation == 'horizontal' && !this.model.requireInvertedAxes) ? \"datetime\" : (axisOrientation == 'vertical' && this.model.requireInvertedAxes) ? 'datetime' : 'double';\r\n }\r\n if (this.model._visibleSeries[j].visibility.toLowerCase() == 'visible')\r\n seriesCollection.push(series);\r\n }\r\n\r\n }\r\n }\r\n if (axisOrientation == ((!this.model.requireInvertedAxes) ? \"vertical\" : \"horizontal\")) {\r\n var isStacked100 = false;\r\n var isStacked = false;\r\n var seriesLength = seriesCollection.length;\r\n axis.isStacked100 = (seriesCollection.length > 0) ? true : false;\r\n for (var i = 0; i < seriesLength; i++) {\r\n var type = seriesCollection[i].type.toLowerCase();\r\n if (type.indexOf(\"stacking\") != -1 || (this.model.AreaType == 'polaraxes' && (seriesCollection[i].drawType.toLowerCase() == 'column' || seriesCollection[i].drawType.toLowerCase() == 'area') && seriesCollection[i].isStacking)) {\r\n if (type.indexOf(\"100\") != -1 && (!isStacked100)) {\r\n this._calculateStackingCumulativeValues(seriesCollection, axis, params);\r\n isStacked100 = true;\r\n } else if (type.indexOf(\"100\") == -1 && (!isStacked)) {\r\n this._calculateStackingValues(seriesCollection, axis, params);\r\n isStacked = true;\r\n axis.isStacked100 = false;\r\n }\r\n }\r\n else {\r\n axis.isStacked100 = false;\r\n }\r\n }\r\n }\r\n scrollbarSettings = axis.scrollbarSettings;\r\n if ((scrollbarSettings.visible) && (scrollbarSettings.pointsLength != null || scrollbarSettings.range.min != null || scrollbarSettings.range.max != null)) {\r\n this.model.isLazyZooming = true;\r\n }\r\n axis._valueType = (!(axis._valueType)) ? (!(axis.valueType) ? \"double\" : axis.valueType) : axis._valueType;\r\n var axisRange = new ej.axisTypes[axis._valueType.toLowerCase()]();\r\n for (var ser = 0; ser < seriesCollection.length; ser++) {\r\n for (var trend = 0; trend < seriesCollection[ser].trendlines.length; trend++) {\r\n if (seriesCollection[ser].trendlines[trend].visibility == \"visible\") {\r\n this.model._drawTrendline = true;\r\n break;\r\n }\r\n }\r\n }\r\n axisRange._calculateRanges(chartobj, axis, seriesCollection, params, excludeDataUpdate);\r\n }\r\n chartobj._chartResize = false;\r\n\r\n var commonAxesInitEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonAxesInitEventArgs.data = { axes: this.model._axes };\r\n this._trigger(\"axesLabelsInitialize\", commonAxesInitEventArgs);\r\n\r\n this.model.isLazyZooming ? 0 : this._updateScroll();\r\n var prevHeight,\r\n prevWidth;\r\n if (this.svgHeight != this.model.svgHeight || this.svgWidth != this.model.svgWidth) {\r\n // beforeResize event\r\n prevHeight = ej.util.isNullOrUndefined(this.prevHeight) ? this.svgHeight : this.prevHeight;\r\n prevWidth = ej.util.isNullOrUndefined(this.prevWidth) ? this.svgWidth : this.prevWidth;\r\n commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { currentHeight: prevHeight, currentWidth: prevWidth, newHeight: this.model.svgHeight, newWidth: this.model.svgWidth };\r\n this._trigger(\"beforeResize\", commonEventArgs);\r\n if (!commonEventArgs.cancel) {\r\n if (this.model.enableCanvasRendering) {\r\n this.svgRenderer.svgObj.width = commonEventArgs.data.newWidth;\r\n this.svgRenderer.svgObj.height = commonEventArgs.data.newHeight;\r\n }\r\n this.model.svgWidth = commonEventArgs.data.newWidth;\r\n this.model.svgHeight = commonEventArgs.data.newHeight;\r\n $(this.svgObject).width(commonEventArgs.data.newWidth);\r\n $(this.svgObject).height(commonEventArgs.data.newHeight);\r\n }\r\n else {\r\n if (this.model.enableCanvasRendering) {\r\n this.svgRenderer.svgObj.width = commonEventArgs.data.currentWidth;\r\n this.svgRenderer.svgObj.height = commonEventArgs.data.currentHeight;\r\n }\r\n this.model.svgWidth = commonEventArgs.data.currentWidth;\r\n this.model.svgHeight = commonEventArgs.data.currentHeight;\r\n $(this.svgObject).width(commonEventArgs.data.currentWidth);\r\n $(this.svgObject).height(commonEventArgs.data.currentHeight);\r\n }\r\n }\r\n this._calculateAreaBounds(params);\r\n\r\n if (this.model.enable3D) {\r\n\r\n var Ej3DRender = new ej.Ej3DRender();\r\n this.vector = new Ej3DRender.vector3D();\r\n this.matrixobj = new Ej3DRender.matrix3D();\r\n this.bsptreeobj = new Ej3DRender.BSPTreeBuilder();\r\n this.polygon = new Ej3DRender.polygon3D();\r\n this.graphics = new Ej3DRender.Graphics3D();\r\n\r\n this.chart3D = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_Chart3D' });\r\n ej.Ej3DRender.Polygons = [];\r\n }\r\n\r\n\r\n if (this.model.AreaType != \"none\") {\r\n\r\n this._calculateAxisSize(params);\r\n\r\n //AxisCrossing \r\n for (var i = 0, len = this.model._axes.length; i < len; i++)\r\n if (this._validateCrossing(this.model._axes[i]))\r\n this._axisCrossing(this.model._axes[i], false, params);\r\n if (params._crossAxisOverlap) {\r\n for (var i = 0, len = this.model._axes.length; i < len; i++)\r\n if (params.axes[this.model._axes[i].name]._validCross)\r\n this._axisCrossing(this.model._axes[i], true, params);\r\n params._crossAxisOverlap = false;\r\n }\r\n\r\n var commonAreaEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonAreaEventArgs.data = { areaBounds: this.model.m_AreaBounds };\r\n this._trigger(\"chartAreaBoundsCalculate\", commonAreaEventArgs);\r\n\r\n this._drawChartAreaRect();\r\n\r\n if (this.model.title.text != \"\" && this.model.title.text && this.model.title.visible)\r\n this._drawTitle();\r\n\r\n this.gXaxisEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_XAxis' });\r\n\r\n this.gYaxisEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_YAxis' });\r\n\r\n this.gPolarAxisEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_AxisLine' });\r\n if (this.model.enable3D) {\r\n\r\n $.extend(ej.Ej3DAxisRenderer.prototype, this);\r\n this.chartaxis = new ej.Ej3DAxisRenderer(this);\r\n }\r\n else {\r\n $.extend(ej.EjAxisRenderer.prototype, this);\r\n this.chartaxis = new ej.EjAxisRenderer(this);\r\n }\r\n\r\n var chartaxis = this.chartaxis;\r\n this.model.xAxisTitleRegion = [];\r\n this.model.yAxisTitleRegion = [];\r\n\r\n if (this.model.enable3D) {\r\n for (var l = 0; l < this.model._axes.length; l++) {\r\n chartaxis._drawAxes(l, this.model._axes[l], params);\r\n }\r\n ej.Ej3DChart.prototype.update3DWall(this, params);\r\n }\r\n else {\r\n for (var l = 0; l < this.model._axes.length; l++) {\r\n chartaxis._drawGridLines(l, this.model._axes[l], params);\r\n }\r\n }\r\n\r\n\r\n //Based on the column/bar series, modified primaryAxis append to the SVG Object\r\n if (!this.model.requireInvertedAxes) {\r\n this.svgRenderer.append(this.gXaxisEle, this.svgObject);\r\n this.svgRenderer.append(this.gYaxisEle, this.svgObject);\r\n } else {\r\n this.svgRenderer.append(this.gYaxisEle, this.svgObject);\r\n this.svgRenderer.append(this.gXaxisEle, this.svgObject);\r\n }\r\n\r\n var x = (this.model.AreaType == 'polaraxes') ? 0 : this.model.m_AreaBounds.X;\r\n var y = (this.model.AreaType == 'polaraxes') ? 0 : this.model.m_AreaBounds.Y;\r\n\r\n var width = (this.model.AreaType == 'polaraxes') ? $(this.svgObject).width() : this.model.m_AreaBounds.Width;\r\n var height = (this.model.AreaType == 'polaraxes') ? $(this.svgObject).height() : this.model.m_AreaBounds.Height;\r\n\r\n var clipRectOptions = {\r\n 'id': this.svgObject.id + '_ChartAreaClipRect',\r\n 'x': x,\r\n 'y': y,\r\n 'width': width,\r\n 'height': height,\r\n 'fill': 'white',\r\n 'stroke-width': 1,\r\n 'stroke': 'Gray'\r\n };\r\n\r\n this.svgRenderer.drawClipPath(clipRectOptions, this.svgObject);\r\n\r\n this._setZoomProperties();\r\n }\r\n\r\n else {\r\n this._drawChartAreaRect();\r\n\r\n clipRectOptions = {\r\n 'id': this.svgObject.id + '_ChartAreaClipRect',\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': $(this.svgObject).width(),\r\n 'height': $(this.svgObject).height(),\r\n 'fill': 'white',\r\n 'stroke-width': 1,\r\n 'stroke': 'Gray'\r\n };\r\n\r\n this.svgRenderer.drawClipPath(clipRectOptions, this.svgObject);\r\n\r\n if (this.model.title.text != \"\" && this.model.title.text && this.model.title.visible)\r\n this._drawTitle();\r\n }\r\n\r\n if (isStriplineBehind && this.model.AreaType == \"cartesianaxes\" && !this.model.enable3D) {\r\n this.gStriplineBehind = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_StriplineBehind', 'clip-path': 'url(#' + this.svgObject.id + '_ChartAreaClipRect)' });\r\n this._renderStripline('behind');\r\n }\r\n if (this.model.initSeriesRender) {\r\n this.seriesRender(params, excludeDataUpdate);\r\n this.indicatorRender();\r\n }\r\n\r\n var annotationsLength = this.model.annotations.length;\r\n $('#annotation_group_' + this._id).empty();\r\n for (var a = 0; a < annotationsLength; a++) {\r\n var currentAnnotation = this.model.annotations[a];\r\n if (currentAnnotation.visible) {\r\n this.annotationRender(currentAnnotation, a);\r\n }\r\n }\r\n\r\n if (this.model.AreaType == \"polaraxes\" && this.model._axes[1].visible && !this.model.enable3D) {\r\n this.chartaxis._drawAxisLine(this.model._axes[1]);\r\n }\r\n\r\n if (this.model.AreaType === \"cartesianaxes\") {\r\n if (!this.model.requireInvertedAxes) {\r\n this.svgRenderer.append(this.gXaxisEle, this.svgObject);\r\n this.svgRenderer.append(this.gYaxisEle, this.svgObject);\r\n } else {\r\n this.svgRenderer.append(this.gYaxisEle, this.svgObject);\r\n this.svgRenderer.append(this.gXaxisEle, this.svgObject);\r\n }\r\n\r\n this.gXaxisTickEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_XAxisTick' });\r\n\r\n this.gYaxisTickEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_YAxisTick' });\r\n }\r\n\r\n $.extend(ej.EjAxisRenderer.prototype, this);\r\n this.chartaxis = new ej.EjAxisRenderer(this);\r\n var chartaxis = this.chartaxis;\r\n\r\n if (isStriplineOver && this.model.AreaType == \"cartesianaxes\" && !this.model.enable3D) {\r\n this.gStriplineOver = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_StriplineOver', 'clip-path': 'url(#' + this.svgObject.id + '_ChartAreaClipRect)' });\r\n this._renderStripline('over');\r\n }\r\n\r\n if (!this.model.enable3D) {\r\n var isCartesian = this.model.AreaType.toLowerCase() == \"cartesianaxes\",\r\n axes = this.model._axes,\r\n isCanvas = this.model.enableCanvasRendering;\r\n //draw axes, labels and ticks\r\n for (var l = 0, len = axes.length; l < len; l++) {\r\n var axis = axes[l], lineOption = params.axes[axis.name]._lineOption, isValidCross = params.axes[axis.name]._validCross;\r\n if (isCartesian) {\r\n chartaxis._drawAxes(l, axis);\r\n if (lineOption[0])\r\n this.svgRenderer.drawLine(lineOption[0], lineOption[1]);\r\n if (axis.orientation.toLowerCase() === \"horizontal\") {\r\n chartaxis._drawXAxisTickLine(l, axis, isCanvas ? null : lineOption[1], params);\r\n chartaxis._drawXAxisMultiLevelLabels(l, axis);\r\n }\r\n else {\r\n chartaxis._drawYAxisTickLine(l, axis, isCanvas ? null : lineOption[1], isValidCross);\r\n chartaxis._drawYAxisMultiLevelLabels(l, axis);\r\n }\r\n axis._crossValue = null;\r\n }\r\n }\r\n }\r\n if (!this.resetZooming && (this.model._chartAreaZoom || this.panning))\r\n this._enableZoomingButtons();\r\n this.resetZooming = false;\r\n\r\n if (this.svgHeight != this.model.svgHeight || this.svgWidth != this.model.svgWidth) {\r\n\r\n this.prevHeight = this.model.svgHeight;\r\n this.prevWidth = this.model.svgWidth;\r\n // afterResize event \r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { height: this.prevHeight, width: this.prevWidth, prevHeight: prevHeight, prevWidth: prevWidth, originalHeight: this.svgHeight, originalWidth: this.svgWidth };\r\n this._trigger(\"afterResize\", commonEventArgs);\r\n }\r\n\r\n //Checking Selection setting enable \r\n var seriesCollection = this.model._visibleSeries, selectionFound;\r\n selectionFound = $.grep(seriesCollection, function (series) { return series.selectionSettings.enable.toString() == \"true\"; });\r\n if (selectionFound.length == 0) {\r\n this.model.selectionEnable = false;\r\n this._removeSelection();\r\n } else\r\n this.model.selectionEnable = true;\r\n\r\n var selectedData = this.remove_duplicates(this.model.selectedDataPointIndexes);\r\n //Maintaning the selection state and triggering seleceted data\r\n if (this.model.selectionEnable) {\r\n this._removeSelection();\r\n this.model._isStateChaged = true;\r\n var data,\r\n mode,\r\n length = selectedData.length;\r\n for (var i = 0; i < length; i++) {\r\n data = selectedData[i];\r\n series = this.model._visibleSeries[data.seriesIndex];\r\n if (series) {\r\n mode = series.selectionSettings.mode;\r\n if ((mode != 'series' && series.points[data.pointIndex]) || mode == 'series')\r\n this.segmentSelection(data.event, data.legendData, data.seriesIndex, data.pointIndex, data.data);\r\n }\r\n }\r\n }\r\n this.chartUpdating = false;\r\n var commonLoadedEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonLoadedEventArgs.data = { model: this.model };\r\n this._trigger(\"loaded\", commonLoadedEventArgs);\r\n for (var i = 0; i < this.model._axes.length; i++) {\r\n var axis = $.extend(true, {}, this.model._axes[i]);\r\n if (axis._valueType.toLowerCase() != \"logarithmic\")\r\n this.model._axes[i].range = axis._initialRange;\r\n }\r\n\r\n\r\n },\r\n remove_duplicates: function (arr) {\r\n var arr1 = [],\r\n arr2 = [],\r\n length = arr.length,\r\n mode,\r\n currentSeries,\r\n series = this.model._visibleSeries;\r\n for (var i = 0; i < length; i++) {\r\n currentSeries = series[arr[i].seriesIndex];\r\n mode = currentSeries ? currentSeries.selectionSettings.mode : \"\";\r\n if (mode == \"series\") {\r\n if (!(arr1.indexOf(arr[i].seriesIndex) > -1))\r\n arr2.push(arr[i]);\r\n arr1.push(arr[i].seriesIndex);\r\n }\r\n else if (mode == \"cluster\") {\r\n if (!(arr1.indexOf(arr[i].pointIndex) > -1))\r\n arr2.push(arr[i]);\r\n arr1.push(arr[i].pointIndex);\r\n } else {\r\n if (!(arr[i] in arr1))\r\n arr2.push(arr[i]);\r\n arr1.push(arr[i]);\r\n }\r\n }\r\n\r\n return arr2;\r\n\r\n },\r\n\r\n // set value to private variable for two way binding\r\n _setZoomProperties: function () {\r\n\r\n var axis, _zf, _zp, orientation;\r\n for (var l = 0; l < this.model._axes.length; l++) {\r\n axis = this.model._axes[l];\r\n orientation = axis.orientation.toLowerCase();\r\n _zf = axis.zoomFactor.toFixed(3);\r\n _zp = axis.zoomPosition.toFixed(3);\r\n if (orientation == \"horizontal\" && (_zf != this._xZoomFactor() || _zp != this._xZoomPosition())) {\r\n this._xZoomFactor(axis.zoomFactor.toFixed(3));\r\n this._xZoomPosition(axis.zoomPosition.toFixed(3));\r\n }\r\n if (orientation == \"vertical\" && (_zf != this._yZoomFactor() || _zp != this._yZoomPosition())) {\r\n this._yZoomFactor(axis.zoomFactor.toFixed(3));\r\n this._yZoomPosition(axis.zoomPosition.toFixed(3));\r\n }\r\n }\r\n },\r\n\r\n annotationRender: function (currentAnnotation, a) { // method to render annotation\r\n //declaration and initialization\r\n var chartContainer = this._id;\r\n var flag = false;\r\n var currentSeries = this.model.series[0];\r\n var seriesType = currentSeries.type.toLowerCase();\r\n var areaBoundsX = this.model.m_AreaBounds.X;\r\n var areaBoundsY = this.model.m_AreaBounds.Y;\r\n var areaBoundsWidth = this.model.m_AreaBounds.Width;\r\n var areaBoundsHeight = this.model.m_AreaBounds.Height;\r\n var marginLeft = this.model.margin.left;\r\n var marginTop = this.model.margin.top;\r\n\r\n var seriesIndex = $.inArray(currentSeries, this.model._visibleSeries);\r\n var radius = this.model.circularRadius[seriesIndex];\r\n var centerX = this.model.circleCenterX[seriesIndex];\r\n var centerY = this.model.circleCenterY[seriesIndex];\r\n var currentDocument = $(document);\r\n var annotationIndex = false;\r\n\r\n currentAnnotation = $.extend(true, {}, this.model.annotationsDefault, currentAnnotation); // extending defaults\r\n\r\n // creating annotation group\r\n if ($('#annotation_group_' + chartContainer).length != 0)\r\n var annotationContainer = $('#annotation_group_' + chartContainer);\r\n else\r\n annotationContainer = $(\"
\").attr('id', \"annotation_group_\" + chartContainer);\r\n annotationContainer.css({ \"position\": \"absolute\", \"left\": \"0px\", \"top\": \"0px\" });\r\n\r\n var content = currentAnnotation.content;\r\n element = $(\"#\" + content);\r\n if (element.get(0).tagName == \"SCRIPT\") // for jsrender\r\n var element = $($(\"#\" + content)[0].innerHTML);\r\n var cloneNode = element.clone(); // clone\r\n var id = 'annotation_' + chartContainer + \"_\" + content + \"_\" + a;\r\n $(cloneNode).attr(\"id\", id);\r\n var $cloneNode = $(cloneNode);\r\n $cloneNode.css({\r\n 'position': \"absolute\",\r\n 'z-index': 2000\r\n });\r\n\r\n // initialization\r\n var region = currentAnnotation.region.toLowerCase();\r\n var coordinateUnit = currentAnnotation.coordinateUnit.toLowerCase();\r\n var annotationX = (typeof currentAnnotation.x == \"string\" || typeof currentAnnotation.x == \"object\") ? Date.parse(currentAnnotation.x) : currentAnnotation.x;\r\n var annotationY = currentAnnotation.y;\r\n var horizontalAlignment = currentAnnotation.horizontalAlignment.toLowerCase();\r\n var verticalAlignment = currentAnnotation.verticalAlignment.toLowerCase();\r\n\r\n if (coordinateUnit == \"pixels\") { //pixels\r\n if (region == \"series\") { // chart area / series\r\n if ((areaBoundsWidth + areaBoundsX + marginLeft > annotationX + areaBoundsX) &&\r\n areaBoundsHeight + areaBoundsY + marginTop > annotationY + areaBoundsY) {\r\n var left = annotationX + areaBoundsX;\r\n var top = annotationY + areaBoundsY;\r\n }\r\n }\r\n else if (region == \"chart\") { // chart\r\n if (($(this.svgObject).width() > annotationX) &&\r\n $(this.svgObject).height() > annotationY) {\r\n left = annotationX;\r\n top = annotationY;\r\n }\r\n }\r\n\r\n $cloneNode.css({\r\n \"left\": left,\r\n \"top\": top\r\n });\r\n flag = true; // to denote that the annotation should be appended in DOM\r\n } else if (coordinateUnit == \"points\") { //points\r\n var point = {\r\n 'x': annotationX,\r\n 'y': annotationY\r\n };\r\n\r\n if (this.model.AreaType == \"polaraxes\") { // polar\r\n xAxis = this.model._axes[0];\r\n yAxis = this.model._axes[1];\r\n if ((annotationX >= xAxis.visibleRange.min && annotationX <= xAxis.visibleRange.max)\r\n && (annotationY >= yAxis.visibleRange.min && annotationY <= yAxis.visibleRange.max)) {\r\n var location = this.TransformToVisibleAnnotation(xAxis, yAxis, annotationX, annotationY, this);\r\n $cloneNode.css({\r\n \"left\": location.X,\r\n \"top\": location.Y\r\n });\r\n flag = true;\r\n }\r\n } else if (seriesType == \"pyramid\" || seriesType == \"funnel\") { // pyramid and funnel\r\n for (var k = 0; k < currentSeries._visiblePoints.length; k++) {\r\n annotationIndex = (currentSeries._visiblePoints[k].xValue <= annotationX && annotationX < currentSeries._visiblePoints.length) ? true\r\n : (Date.parse(currentSeries._visiblePoints[k].xValue) <= annotationX && annotationX < currentSeries._visiblePoints.length) ? true : false;\r\n if (annotationIndex) {\r\n var currentPoint = currentSeries._visiblePoints[annotationX];\r\n $cloneNode.css({\r\n \"left\": currentPoint.xLocation + this.pyrX,\r\n \"top\": currentPoint.yLocation + this.pyrY - (currentPoint.height / 2)\r\n });\r\n flag = true;\r\n }\r\n }\r\n } else if (seriesType == \"pie\" || seriesType == \"doughnut\" || seriesType == \"pieofpie\") { // pie, pieofpie and doughnut\r\n for (var k = 0; k < currentSeries._visiblePoints.length; k++) {\r\n annotationIndex = (currentSeries._visiblePoints[k].xValue <= annotationX && annotationX < currentSeries._visiblePoints.length) ? true\r\n : (Date.parse(currentSeries._visiblePoints[k].xValue) <= annotationX && annotationX < currentSeries._visiblePoints.length) ? true : false;\r\n if (annotationIndex) {\r\n currentPoint = currentSeries._visiblePoints[annotationX];\r\n var pointIndex = annotationX;\r\n var startX, startY;\r\n var series = new ej.seriesTypes[seriesType]();\r\n var midAngle = currentPoint ? currentPoint.currentMidAngle : 0;\r\n if ((pointIndex == currentSeries.explodeIndex || currentSeries.explodeAll) && !this.vmlRendering) {\r\n startX = centerX + Math.cos(midAngle) * currentSeries.explodeOffset;\r\n startY = centerY + Math.sin(midAngle) * currentSeries.explodeOffset;\r\n } else {\r\n startX = centerX;\r\n startY = centerY;\r\n }\r\n var midX = series.getXCordinate(startX, (radius), midAngle);\r\n var midY = series.getYCordinate(startY, (radius), midAngle);\r\n\r\n positionX = (midX + startX) / 2;\r\n positionY = (midY + startY) / 2;\r\n\r\n positionX = (midX + positionX) / 2;\r\n positionY = (midY + positionY) / 2;\r\n\r\n $cloneNode.css({\r\n \"left\": positionX,\r\n \"top\": positionY\r\n });\r\n flag = true;\r\n }\r\n }\r\n } else { // cartesianaxes\r\n var xAxisName = currentAnnotation.xAxisName;\r\n var yAxisName = currentAnnotation.yAxisName;\r\n var axesLength = this.model._axes.length;\r\n for (var i = 0; i < axesLength; i++) {\r\n if (this.model._axes[i].name == xAxisName)\r\n var xAxis = this.model._axes[i];\r\n if (this.model._axes[i].name == yAxisName)\r\n var yAxis = this.model._axes[i];\r\n }\r\n if (!xAxis) xAxis = this.model._axes[0]; // setting primary axis by default\r\n if (!yAxis) yAxis = this.model._axes[1];\r\n var minRange = (typeof xAxis.range.min == \"string\" || typeof xAxis.range.min == \"object\") ? Date.parse(xAxis.range.min) : xAxis.range.min;\r\n var maxRange = (typeof xAxis.range.max == \"string\" || typeof xAxis.range.max == \"object\") ? Date.parse(xAxis.range.max) : xAxis.range.max;\r\n if (minRange <= annotationX && maxRange >= annotationX) {\r\n\r\n if (!this.model.requireInvertedAxes) {\r\n location = this._getAnnotationPoint(point, xAxis, yAxis);\r\n $cloneNode.css({\r\n \"left\": location.X + areaBoundsX,\r\n \"top\": location.Y + yAxis.y\r\n });\r\n }\r\n else {\r\n point.x = point.y + (point.y = point.x, 0);// swapping x, y => a = b + (b=a, 0)\r\n location = this._getAnnotationPoint(point, yAxis, xAxis);\r\n $cloneNode.css({\r\n \"left\": location.X + areaBoundsX,\r\n \"top\": location.Y + xAxis.y\r\n });\r\n }\r\n flag = true;\r\n }\r\n }\r\n } else { //other alignment\r\n $cloneNode.css(\"display\", \"block\").appendTo($(annotationContainer)); //append\r\n $(annotationContainer).appendTo('#' + 'chartContainer_' + chartContainer);\r\n var width = $cloneNode.outerWidth();\r\n var height = $cloneNode.outerHeight();\r\n if (region == \"chart\") {\r\n switch (horizontalAlignment) {\r\n case \"middle\":\r\n left = $(this.svgObject).width() / 2 - width / 2;\r\n break;\r\n case \"left\":\r\n left = 0;\r\n break;\r\n case \"right\":\r\n left = $(this.svgObject).width() - width;\r\n }\r\n switch (verticalAlignment) {\r\n case \"middle\":\r\n top = $(this.svgObject).height() / 2 - height / 2;\r\n break;\r\n case \"top\":\r\n top = 0;\r\n break;\r\n case \"bottom\":\r\n top = $(this.svgObject).height() - height;\r\n }\r\n } else {\r\n if (seriesType == \"pie\" || seriesType == \"doughnut\" || seriesType == \"pieofpie\") { // for pie, pieofpie and doughnut\r\n left = centerX;\r\n top = centerY;\r\n switch (horizontalAlignment) {\r\n case \"middle\":\r\n left = centerX - width / 2;\r\n break;\r\n case \"left\":\r\n left = centerX - radius;\r\n break;\r\n case \"right\":\r\n left = centerX + radius - width;\r\n }\r\n\r\n switch (verticalAlignment) {\r\n case \"middle\":\r\n top = centerY - height / 2;\r\n break;\r\n case \"top\":\r\n top = centerY - radius;\r\n break;\r\n case \"bottom\":\r\n top = centerY + radius;\r\n }\r\n } else {\r\n switch (horizontalAlignment) {\r\n case \"middle\":\r\n left = areaBoundsX + (areaBoundsWidth / 2) - width / 2;\r\n break;\r\n case \"left\":\r\n left = areaBoundsX;\r\n break;\r\n case \"right\":\r\n left = areaBoundsX + areaBoundsWidth - width;\r\n }\r\n\r\n switch (verticalAlignment) {\r\n case \"middle\":\r\n top = areaBoundsY + (areaBoundsHeight / 2) - height / 2;\r\n break;\r\n case \"top\":\r\n top = areaBoundsY;\r\n break;\r\n case \"bottom\":\r\n top = areaBoundsY + areaBoundsHeight - height;\r\n }\r\n }\r\n }\r\n if (seriesType == \"pyramid\" || seriesType == \"funnel\") { // to remove margin value\r\n left -= marginLeft;\r\n }\r\n $cloneNode.css({\r\n \"left\": left,\r\n \"top\": top\r\n });\r\n }\r\n\r\n left = parseFloat($cloneNode.css(\"left\"));\r\n top = parseFloat($cloneNode.css(\"top\")); // get left and top value\r\n if (coordinateUnit != \"none\" && flag) {\r\n $cloneNode.css(\"display\", \"block\").appendTo($(annotationContainer)); //append\r\n $(annotationContainer).appendTo('#' + 'chartContainer_' + chartContainer);\r\n width = $cloneNode.outerWidth();\r\n height = $cloneNode.outerHeight();\r\n switch (horizontalAlignment) {\r\n case \"middle\":\r\n left -= width / 2;\r\n break;\r\n case \"left\":\r\n left -= width;\r\n break;\r\n }\r\n switch (verticalAlignment) {\r\n case \"middle\":\r\n top -= height / 2;\r\n break;\r\n case \"top\":\r\n top -= height;\r\n break;\r\n }\r\n }\r\n var margin = currentAnnotation.margin; // margin values\r\n left = left + margin.left - margin.right;\r\n top = top + margin.top - margin.bottom;\r\n\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs); // trigger event\r\n commonEventArgs.data = {\r\n content: $cloneNode.html(), location: { x: left, y: top },\r\n opacity: currentAnnotation.opacity, angle: currentAnnotation.angle\r\n };\r\n this._trigger(\"annotationRendering\", commonEventArgs);\r\n\r\n $cloneNode.html(commonEventArgs.data.content);\r\n $cloneNode.css({\r\n \"left\": commonEventArgs.data.location.x,\r\n \"top\": commonEventArgs.data.location.y,\r\n \"opacity\": commonEventArgs.data.opacity //opacity\r\n });\r\n\r\n var angle = commonEventArgs.data.angle; // angle\r\n if (angle) {\r\n $cloneNode.css({\r\n '-ms-transform': 'rotate(' + angle + 'deg)', //IE 10 and 9\r\n '-webkit-transform': 'rotate(' + angle + 'deg)', // chrome\r\n '-moz-transform': 'rotate(' + angle + 'deg)', // firefox\r\n '-o-transform': 'rotate(' + angle + 'deg)', // opera\r\n '-transform': 'rotate(' + angle + 'deg)' // general\r\n });\r\n }\r\n\r\n var eleId = $cloneNode.attr(\"id\"); // id of annotation\r\n var topHeight = bottomHeight = leftWidth = rightWidth = 0;\r\n var chartWidth = $(\"#\" + this._id).width();\r\n var chartHeight = $(\"#\" + this._id).height();\r\n if (flag && (angle == 0) && (region == \"series\" || coordinateUnit == \"points\")) {\r\n if (areaBoundsWidth + areaBoundsX < left + width) { // clip right width\r\n var excessWidth = (left + width) - (areaBoundsWidth + areaBoundsX);\r\n rightWidth = width - excessWidth;\r\n }\r\n if (left < areaBoundsX) { // clip left width\r\n leftWidth = areaBoundsX - left;\r\n }\r\n if (areaBoundsHeight + areaBoundsY < top + height) { // clip bottom height\r\n excessHeight = (top + height) - (areaBoundsHeight + areaBoundsY);\r\n bottomHeight = height - excessHeight;\r\n }\r\n if (top < areaBoundsY) { // clip top height\r\n topHeight = areaBoundsY - top;\r\n }\r\n rightWidth = (rightWidth == 0) ? width : rightWidth;\r\n bottomHeight = (bottomHeight == 0) ? height : bottomHeight;\r\n document.getElementById(eleId).style.clip = \"rect(\" + topHeight.toString() + \"px,\" + // clipping annotation\r\n rightWidth.toString() + \"px,\" +\r\n bottomHeight.toString() + \"px,\" +\r\n leftWidth + \"px)\";\r\n }\r\n else if (flag && (angle == 0) && region == \"chart\") {\r\n if (chartWidth < left + width) { // clip right width\r\n excessWidth = (left + width) - chartWidth;\r\n var rightWidth = width - excessWidth;\r\n }\r\n if (left < 0) { // clip left width\r\n var leftWidth = width + left;\r\n leftWidth = (leftWidth == 0) ? width : leftWidth;\r\n }\r\n if (chartHeight < top + height) { // clip bottom height\r\n var excessHeight = (top + height) - chartHeight;\r\n var bottomHeight = height - excessHeight;\r\n }\r\n if (top < 0) { // clip top height\r\n topHeight = height + top;\r\n topHeight = (topHeight == 0) ? height : topHeight;\r\n }\r\n rightWidth = (rightWidth == 0) ? width : rightWidth;\r\n bottomHeight = (bottomHeight == 0) ? height : bottomHeight;\r\n document.getElementById(eleId).style.clip = \"rect(\" +\r\n topHeight.toString() + \"px,\" +\r\n rightWidth.toString() + \"px,\" +\r\n bottomHeight.toString() + \"px,\" +\r\n leftWidth + \"px)\";\r\n }\r\n else if (flag && (angle == 90) && (region == \"series\" || coordinateUnit == \"points\")) {\r\n\r\n var clientRect = document.getElementById(eleId).getBoundingClientRect();\r\n left = clientRect.left - $(this.svgObject).offset().left + currentDocument.scrollLeft();\r\n top = clientRect.top - $(this.svgObject).offset().top + currentDocument.scrollTop();\r\n\r\n if (areaBoundsHeight + areaBoundsY < top + width) { // clip right width\r\n excessWidth = (top + width) - (areaBoundsHeight + areaBoundsY);\r\n rightWidth = width - excessWidth;\r\n }\r\n\r\n if (left < areaBoundsX) { // clip bottom height\r\n\r\n excessHeight = areaBoundsX - left;\r\n bottomHeight = height - excessHeight;\r\n }\r\n\r\n if (top < areaBoundsY) { // clip left width\r\n leftWidth = areaBoundsY - top;\r\n }\r\n\r\n if (areaBoundsWidth + areaBoundsX < left + height) { // clip top height\r\n excessHeight = (left + height) - (areaBoundsWidth + areaBoundsX);\r\n topHeight = excessHeight;\r\n }\r\n\r\n rightWidth = (rightWidth == 0) ? width : rightWidth;\r\n bottomHeight = (bottomHeight == 0) ? height : bottomHeight;\r\n\r\n document.getElementById(eleId).style.clip = \"rect(\" + topHeight.toString() + \"px,\" + // clipping annotation\r\n rightWidth.toString() + \"px,\" +\r\n bottomHeight.toString() + \"px,\" +\r\n leftWidth + \"px)\";\r\n }\r\n else if (flag && (angle == 90) && region == \"chart\") {\r\n var clientRect = document.getElementById(eleId).getBoundingClientRect();\r\n left = clientRect.left - $(this.svgObject).offset().left;\r\n top = clientRect.top - $(this.svgObject).offset().top;\r\n\r\n if (chartHeight < top + width) { // clip right width\r\n excessWidth = (top + width) - chartHeight;\r\n rightWidth = width - excessWidth;\r\n }\r\n if (left < 0) { // clip bottom height\r\n excessHeight = 0 - left;\r\n bottomHeight = height - excessHeight;\r\n bottomHeight = (bottomHeight == 0) ? height : bottomHeight;\r\n }\r\n if (top < 0) { // clip left width\r\n leftWidth = 0 - top;\r\n leftWidth = (leftWidth == 0) ? width : leftWidth;\r\n }\r\n if (chartWidth < left + height) { // clip top height\r\n excessHeight = (left + height) - chartWidth;\r\n topHeight = excessHeight;\r\n }\r\n\r\n rightWidth = (rightWidth == 0) ? width : rightWidth;\r\n bottomHeight = (bottomHeight == 0) ? height : bottomHeight;\r\n document.getElementById(eleId).style.clip = \"rect(\" +\r\n topHeight.toString() + \"px,\" +\r\n rightWidth.toString() + \"px,\" +\r\n bottomHeight.toString() + \"px,\" +\r\n leftWidth + \"px)\";\r\n }\r\n }, // ---------------------------- end of annotation \r\n\r\n TransformToVisibleAnnotation: function (xAxis, yAxis, x, y, sender) { // method to get the position of points in polar/ radar\r\n x = (xAxis._valueType == \"logarithmic\") && x > 0 ? Math.log(x, xAxis.logBase) : x;\r\n y = (xAxis._valueType == \"logarithmic\") && y > 0 ? Math.log(y, yAxis.logBase) : y;\r\n var radius = sender.model.Radius * ej.EjSvgRender.utils._valueToCoefficient(yAxis, y, this);\r\n var point = ej.EjSvgRender.utils._valueToVector(xAxis, x);\r\n return { X: sender.model.centerX + radius * point.X, Y: sender.model.centerY + radius * point.Y };\r\n },\r\n\r\n _getAnnotationPoint: function (point, xAxis, yAxis) { // method to get the position of points (cartesianaxes)\r\n var requireInvertedAxes = this.model.requireInvertedAxes;\r\n var x = point.x;\r\n var y = point.y;\r\n\r\n var xvalue = (xAxis._valueType == \"logarithmic\") ? ej.EjSvgRender.utils._logBase((x == 0 ? 1 : x), xAxis.logBase) : x;\r\n var yvalue = (yAxis._valueType == \"logarithmic\") ? ej.EjSvgRender.utils._logBase((y == 0 ? 1 : y), xAxis.logBase) : y;\r\n xvalue = ej.EjSvgRender.utils._getPointXY(xvalue, xAxis.visibleRange, xAxis.isInversed) * (xAxis.width);\r\n yvalue = (1 - ej.EjSvgRender.utils._getPointXY(yvalue, yAxis.visibleRange, yAxis.isInversed)) * (yAxis.height);\r\n\r\n point.location = { X: xvalue, Y: yvalue };\r\n return point.location;\r\n },\r\n\r\n indicatorRender: function () {\r\n if ($(this.svgObject).find(\"#\" + this.svgObject.id + \"_IndicatorCollection\").length > 0) {\r\n $(this.svgObject).find(\"#\" + this.svgObject.id + \"_IndicatorCollection\").remove();\r\n }\r\n\r\n var indOptions = { 'id': this.svgObject.id + '_IndicatorCollection', 'clip-path': 'url(#' + this.svgObject.id + '_ChartAreaClipRect)' };\r\n\r\n this.gIndicatorEle = this.svgRenderer.createGroup(indOptions);\r\n\r\n for (var i = 0; i < this.model.indicators.length && this.model.indicators[i].visible && this.model.indicators[i]._points.length > 0; i++) {\r\n var indicator = this.model.indicators[i];\r\n var options;\r\n var duration = indicator.animationDuration;\r\n for (var j = 0; j < this.model._axes.length; j++) {\r\n var axis = this.model._axes[j];\r\n\r\n if (axis.name && axis.orientation.toLowerCase() == 'horizontal' && axis.name.toLowerCase() == indicator.xAxisName.toLowerCase()) {\r\n indicator.xAxis = axis;\r\n } else if (axis.name && axis.orientation.toLowerCase() == 'vertical' && axis.name.toLowerCase() == indicator.yAxisName.toLowerCase()) {\r\n indicator.yAxis = axis;\r\n }\r\n }\r\n var type = indicator.type.toLowerCase();\r\n options = new ej.indicatorTypes[type]();\r\n //Clip the canvas Chart indicator series out of chartArea Bounds\r\n if (this.model.enableCanvasRendering) {\r\n this.svgRenderer.ctx.save();\r\n this.svgRenderer.ctx.beginPath();\r\n this.svgRenderer.ctx.rect(this.model.m_AreaBounds.X, indicator.yAxis.y, indicator.xAxis.width, indicator.yAxis.height);\r\n this.svgRenderer.ctx.clip();\r\n options.draw(indicator, this);\r\n this.svgRenderer.ctx.restore();\r\n } else\r\n options.draw(indicator, this);\r\n var element = options.gIndicatorGroupEle;\r\n if (element) ej.EjSvgRender.utils._drawAxesBoundsClipPath(element, indicator, this);\r\n\r\n if (!this.vmlRendering && !this.model.enableCanvasRendering) {\r\n if (indicator.enableAnimation && (!indicator._animatedSeries || indicator.type != indicator._previousType)) {\r\n this.svgRenderer.append(this.gIndicatorEle, this.svgObject);\r\n var clipRect = $(this.gIndicatorEle).find(\"#\" + this.svgObject.id + '_indicatorGroup' + '_' + i + \"_ClipRect\").children();\r\n ej.EjSeriesRender.prototype._doLineAnimation(this, clipRect, duration); // for indicator animation\r\n this.model.AnimationComplete = true;\r\n indicator._animatedSeries = true;\r\n indicator._previousType = indicator.type;\r\n\r\n }\r\n }\r\n this.svgRenderer.append(this.gIndicatorEle, this.svgObject);\r\n }\r\n\r\n },\r\n\r\n doAnimation: function (series) {\r\n // Declaration\r\n var chartObj = this,\r\n model = chartObj.model,\r\n requireInvertedAxes = model.requireInvertedAxes,\r\n type = series.type.toLowerCase(),\r\n seriesIndex = $.inArray(series, model._visibleSeries),\r\n gSeriesGroupId = this.svgObject.id + \"_SeriesGroup_\" + seriesIndex,\r\n markerElements = $(chartObj.gSymbolGroupEle)[seriesIndex].childNodes,\r\n markerLength = markerElements.length,\r\n dataLabels = $(chartObj.gDataLabelEle)[seriesIndex].childNodes,\r\n dataLabelLength = dataLabels.length,\r\n connectorLines = $(chartObj.gConnectorEle)[seriesIndex].childNodes,\r\n connectorLineLength = connectorLines.length,\r\n errorBarElements = $(chartObj.gErrorBarGroupEle)[seriesIndex] == undefined ?\r\n undefined : $(chartObj.gErrorBarGroupEle)[seriesIndex].childNodes,\r\n errorBarEleLength = ej.util.isNullOrUndefined(errorBarElements) ? 0 : errorBarElements.length,\r\n animationType = series._animationType, clipRect, errorBarInterval, boxWhiskerInterval, lineEle, pathEle,\r\n markerInterval, dataLabelInterval, index, elements, elementsLength, clipRect, time,\r\n ubound = 20, lbound = 0, randomValue, delayInterval, marker, i, j, defaultDuration, doLineSymbolDuration,\r\n animateSymbolDuration, animateRectDuration, animationDuration,\r\n seriesRender = ej.EjSeriesRender.prototype;\r\n chartObj.gSeriesGroupEle = $(\"#\" + gSeriesGroupId)[0];\r\n animationDuration = chartObj.model.series[seriesIndex].animationDuration;\r\n if (!ej.util.isNullOrUndefined(animationDuration)) {\r\n defaultDuration = animateSymbolDuration = animateRectDuration = parseFloat(animationDuration);\r\n doLineSymbolDuration = defaultDuration / 10;\r\n } else {\r\n defaultDuration = 2000;\r\n doLineSymbolDuration = 200;\r\n animateSymbolDuration = 500;\r\n animateRectDuration = 1000;\r\n }\r\n\r\n switch (animationType) {\r\n case \"rect\":\r\n elements = $(this.gSeriesEle).find(\"#\" + gSeriesGroupId).children(\"rect\");\r\n elementsLength = elements.length;\r\n clipRect = $(chartObj.gSeriesEle).find(\"#\" + gSeriesGroupId + \"_ClipRect\").children();\r\n if (type == \"boxandwhisker\") {\r\n lineEle = $(this.gSeriesEle).find(\"#\" + gSeriesGroupId).children(\"line\");\r\n pathEle = $(this.gSeriesEle).find(\"#\" + gSeriesGroupId).children(\"path\");\r\n boxWhiskerInterval = defaultDuration / pathEle.length;\r\n for (var k = 0; k < lineEle.length; k++) {\r\n seriesRender._doLineSymbol(lineEle[k], boxWhiskerInterval, k, series, requireInvertedAxes, chartObj, doLineSymbolDuration);\r\n seriesRender._doLineSymbol(elements[k], boxWhiskerInterval, k, series, requireInvertedAxes, chartObj, doLineSymbolDuration);\r\n }\r\n for (var j = 0; j < pathEle.length; j++) {\r\n seriesRender._doLineSymbol(pathEle[j], boxWhiskerInterval, j, series, requireInvertedAxes, chartObj, doLineSymbolDuration);\r\n }\r\n }\r\n else {\r\n if (!type.indexOf(\"stacking\") > -1 && series.animationType.toLowerCase() == \"smooth\") {\r\n seriesRender.animateRect(clipRect, series, requireInvertedAxes, chartObj, animateRectDuration);\r\n } else {\r\n for (i = 0; i < elementsLength; i++) {\r\n if (type.indexOf(\"stacking\") > -1)\r\n seriesRender.animateStackingRect(elements[i], series, requireInvertedAxes, chartObj, animateRectDuration);\r\n else\r\n seriesRender.animateRect(elements[i], series, requireInvertedAxes, chartObj, animateRectDuration);\r\n }\r\n } \r\n }\r\n markerInterval = dataLabelInterval = errorBarInterval = (defaultDuration / 4);\r\n break;\r\n case \"path\":\r\n clipRect = $(chartObj.gSeriesEle).find(\"#\" + gSeriesGroupId + \"_ClipRect\").children();\r\n seriesRender._doLineAnimation(chartObj, clipRect, defaultDuration);\r\n markerInterval = defaultDuration / markerLength;\r\n dataLabelInterval = defaultDuration / dataLabelLength;\r\n errorBarInterval = defaultDuration / errorBarEleLength;\r\n break;\r\n case \"scatter\":\r\n for (i = 0; i < markerLength; i++) {\r\n randomValue = Math.floor(Math.random() * (ubound - lbound) + lbound);\r\n delayInterval = parseInt(randomValue * 50);\r\n seriesRender.animateSymbol(markerElements[i], delayInterval, series, requireInvertedAxes, chartObj, animateSymbolDuration);\r\n }\r\n break;\r\n case \"bubble\":\r\n elements = $(this.gSeriesGroupEle).children().not(\"defs\");\r\n delayInterval = 0;\r\n for (i = 0; i < elements.length; i++)\r\n seriesRender.animateSymbol(elements[i], delayInterval, series, requireInvertedAxes, chartObj, animateSymbolDuration);\r\n for (i = 0; i < markerLength; i++)\r\n seriesRender.animateSymbol(markerElements[i], delayInterval, series, requireInvertedAxes, chartObj, animateSymbolDuration);\r\n for (i = 0; i < dataLabelLength; i++)\r\n seriesRender.animateSymbol(dataLabels[i], delayInterval, series, requireInvertedAxes, chartObj, animateSymbolDuration);\r\n for (i = 0; i < connectorLineLength; i++)\r\n seriesRender.animateSymbol(connectorLines[i], delayInterval, series, requireInvertedAxes, chartObj, animateSymbolDuration);\r\n break;\r\n case \"hilo\":\r\n elements = $(this.gSeriesGroupEle).children().not(\"defs\");\r\n elementsLength = elements.length;\r\n time = defaultDuration / elementsLength;\r\n for (var i = 0; i < elementsLength; i++)\r\n seriesRender._doLineSymbol(elements[i], time, i, series, requireInvertedAxes, chartObj, doLineSymbolDuration);\r\n dataLabelInterval = defaultDuration / dataLabelLength;\r\n break;\r\n case \"cylinder\":\r\n clipRect = $(chartObj.gSeriesEle).find(\"#\" + gSeriesGroupId + \"_ClipRect\").children();\r\n seriesRender.animateCylinder(chartObj, series, requireInvertedAxes, clipRect, defaultDuration);\r\n markerInterval = dataLabelInterval = errorBarInterval = (defaultDuration / 4);\r\n break;\r\n }\r\n\r\n if (animationType != \"bubble\") {\r\n for (j = 0; j < markerLength; j++) { // for marker\r\n index = animationType == \"rect\" || animationType == \"stackingRect\" ? 2 : j;\r\n seriesRender._doLineSymbol(markerElements[j], markerInterval, index, series, requireInvertedAxes, chartObj, doLineSymbolDuration);\r\n }\r\n\r\n for (j = 0; j < dataLabelLength; j++) { // for data label\r\n index = animationType == \"rect\" || animationType == \"stackingRect\" ? 2 : j;\r\n seriesRender._doLineSymbol(dataLabels[j], dataLabelInterval, index, series, requireInvertedAxes, chartObj, doLineSymbolDuration);\r\n }\r\n\r\n time = defaultDuration / connectorLineLength;\r\n for (j = 0; j < connectorLineLength; j++) { // for connector lines\r\n index = animationType == \"rect\" || animationType == \"stackingRect\" ? 2 : j;\r\n seriesRender._doLineSymbol(connectorLines[j], time, index, series, requireInvertedAxes, chartObj, doLineSymbolDuration);\r\n }\r\n }\r\n\r\n if (series.errorBar.visibility == \"visible\") {\r\n for (j = 0; j < errorBarEleLength; j++) { // for error bar\r\n index = animationType == \"rect\" || animationType == \"stackingRect\" ? 2 : j;\r\n seriesRender._doLineSymbol(errorBarElements[j], errorBarInterval, index, series, requireInvertedAxes, chartObj, doLineSymbolDuration);\r\n }\r\n }\r\n },\r\n _animationElements: function (seriesOptions, seriesType, seriesIndex) {\r\n var chartObj = this;\r\n var animationDuration = chartObj.model.series[seriesIndex].animationDuration;\r\n var duration = !ej.util.isNullOrUndefined(animationDuration) ? parseFloat(animationDuration) : 2000;\r\n seriesOptions._previousType = ej.util.isNullOrUndefined(seriesOptions._previousType) ? seriesOptions.type : seriesOptions._previousType;\r\n if (seriesOptions.enableAnimation && !this.vmlRendering && !this.model.enableCanvasRendering && (!seriesOptions._animatedSeries || seriesOptions.type != seriesOptions._previousType)) {\r\n ej.EjSeriesRender.prototype.doCircularAnimation(this, seriesOptions, seriesType, seriesIndex, duration);\r\n seriesOptions._previousType = seriesOptions.type;\r\n seriesOptions._animatedSeries = chartObj.isSplitted ? false : true;\r\n }\r\n chartObj.isSplitted = false;\r\n this.drawAccDisplayText(seriesType, seriesOptions, seriesIndex);\r\n //Show the datalabel text element on redraw when enable animation of series\r\n if (seriesOptions.enableAnimation && seriesOptions._visiblePoints.length > 0 && seriesOptions.AnimationComplete && !this.vmlRendering && !this.model.enableCanvasRendering) {\r\n chartObj.svgRenderer._setAttr($(chartObj.gSeriesEle).find(\"#\" + chartObj.gSeriesTextEle[seriesIndex].id), { \"visibility\": \"visible\" });\r\n if (chartObj.gSymbolGroupEle)\r\n chartObj.svgRenderer._setAttr($(chartObj.gSeriesEle).find(\"#\" + chartObj.gSymbolGroupEle[seriesIndex].id), { \"visibility\": \"visible\" });\r\n var elements;\r\n if (seriesOptions.marker.dataLabel.template) {\r\n elements = $(chartObj.element[0].childNodes[0].childNodes);\r\n for (var i = 0; i < elements.length; i++)\r\n $(elements[i]).css('display', 'block');\r\n }\r\n if (chartObj.gConnectorEle)\r\n chartObj.svgRenderer._setAttr($(chartObj.gSeriesEle).find(\"#\" + chartObj.gConnectorEle[seriesIndex].id), { \"visibility\": \"visible\" });\r\n if (chartObj.gDataLabelEle)\r\n chartObj.svgRenderer._setAttr($(chartObj.gSeriesEle).find(\"#\" + chartObj.gDataLabelEle[seriesIndex].id), { \"visibility\": \"visible\" });\r\n }\r\n\r\n\r\n\r\n },\r\n _appendConnectorElements: function (i) {\r\n var visibleSeries = ej.DataManager(this.model._visibleSeries, ej.Query().sortBy(\"_zOrder\")).executeLocal();\r\n var currentSeries = visibleSeries[i];\r\n var type = currentSeries.type.toLowerCase();\r\n if (currentSeries.visibility == \"visible\" && !this.model.enable3D && currentSeries.connectorLine && (currentSeries.connectorLines || this.model.AreaType == \"none\")) {\r\n this.svgRenderer.append(this.gConnectorEle[i], this.gSeriesEle);\r\n currentSeries.connectorLines = false;\r\n }\r\n },\r\n _appendDataLabelElement: function (i) {\r\n var currentSeries, type, index;\r\n currentSeries = this.model._visibleSeries[i];\r\n index = !ej.util.isNullOrUndefined(currentSeries.zOrder) ? currentSeries.zOrder : index;\r\n if (currentSeries.visibility == \"visible\" && !this.model.enable3D) {\r\n this.svgRenderer.append(this.gSymbolGroupEle[i], this.gSeriesEle);\r\n if (!this.model.enable3D && !this.model.enableCanvasRendering) {\r\n if (this.gDataLabelEle[i].childNodes.length > 0)\r\n this.svgRenderer.append(this.gDataLabelEle[i], this.gSeriesEle);\r\n if (this.gSeriesTextEle[i].childNodes.length > 0)\r\n this.svgRenderer.append(this.gSeriesTextEle[i], this.gSeriesEle);\r\n }\r\n }\r\n if (!this.vmlRendering && currentSeries.visibility == \"visible\" && !this.model.enableCanvasRendering && !this.model.enable3D) {\r\n this.svgRenderer.append(this.gSeriesEle, this.svgObject);\r\n this.svgRenderer.append(this.svgObject, this.element);\r\n }\r\n\r\n },\r\n _accSeriesDraw: function (index, seriesOptions, type) {\r\n var chartObj = this;\r\n var visibleSeries = ej.DataManager(this.model._visibleSeries, ej.Query().sortBy(\"_zOrder\")).executeLocal();\r\n var seriesIndex = $.inArray(visibleSeries[index], this.model._visibleSeries);\r\n this.model._visibleSeries[seriesIndex] = visibleSeries[index] = $.extend(true, seriesOptions, visibleSeries[index]);\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { series: seriesOptions };\r\n this._trigger(\"seriesRendering\", commonEventArgs);\r\n var seriesType = new ej.seriesTypes[type.toLowerCase()]();\r\n var minhightwidth = seriesType.draw(chartObj, seriesOptions);\r\n if (!minhightwidth) {\r\n this.model.minhightwidth = true;\r\n chartObj._animationElements(seriesOptions, seriesType, seriesIndex);\r\n }\r\n\r\n\r\n },\r\n // to split the series for pie of pie rendering\r\n _splitSeries: function (visibleSeries) {\r\n //declaration of splitseries variables \r\n var pieCollections = [];\r\n pieCollections[0] = $.extend(true, [], visibleSeries._visiblePoints);\r\n pieCollections[1] = [];\r\n var series = visibleSeries,\r\n splitValue = parseInt(series.splitValue),\r\n splitMode = series.splitMode.toLowerCase(),\r\n length = pieCollections[0].length,\r\n count = 0, j = 0, yValues = [], i = 0, totalValue = 0, yvalue, valueType;\r\n // to calculate sum of y values\r\n while (i != length) {\r\n totalValue += pieCollections[0][i].y;\r\n i++;\r\n }\r\n // to split points based on splitmode \r\n if (splitMode == \"position\") {\r\n for (var i = length - 1; i >= 0 && j != splitValue; i--) {\r\n count = count + pieCollections[0][i].y;\r\n pieCollections[1][j] = pieCollections[0][i];\r\n j++;\r\n pieCollections[0].splice(i, 1);\r\n }\r\n pieCollections[1].reverse();\r\n }\r\n else if (splitMode == \"value\" || splitMode == \"percentage\") {\r\n for (var k = 0; k < pieCollections[0].length; k++) {\r\n yvalue = splitMode == \"value\" ? pieCollections[0][k].y : Math.round((pieCollections[0][k].y / totalValue) * 100);\r\n if (yvalue < splitValue) {\r\n count = count + pieCollections[0][k].y;\r\n pieCollections[1][j] = pieCollections[0][k];\r\n j++;\r\n pieCollections[0].splice(k, 1);\r\n k = -1;\r\n }\r\n }\r\n }\r\n else if (splitMode == \"indexes\") {\r\n var splitArray = JSON.parse(\"[\" + series.splitValue + \"]\");\r\n // to remove duplicate indices\r\n splitArray = splitArray.filter(function (item, d, inputArray) {\r\n return inputArray.indexOf(item) == d;\r\n });\r\n splitArray.sort();\r\n for (var k = 0; k < pieCollections[0].length; k++) {\r\n for (var s = 0; s < splitArray.length; s++) {\r\n if (k == splitArray[s]) {\r\n count = count + pieCollections[0][k].y;\r\n pieCollections[1][j] = pieCollections[0][k];\r\n j++;\r\n }\r\n }\r\n }\r\n for (var i = 0; i < splitArray.length; i++) {\r\n var index = splitArray[i] - i;\r\n pieCollections[0].splice(index, 1);\r\n }\r\n }\r\n\r\n // to append the added point in first pie collection\r\n if (pieCollections[1].length > 0) {\r\n yValues[0] = count,\r\n valueType = series._xAxisValueType,\r\n pieCollections[0].unshift({\r\n _visibility: \"visible\",\r\n visible: true,\r\n text: \"Others\",\r\n // dataPoint: undefined,\r\n x: valueType == \"string\" ? \"Others\" : count,\r\n xValue: valueType == \"string\" ? series.points.length : count,\r\n y: count,\r\n YValues: yValues,\r\n fill: this.model.colors[(series.points.length + 1) % this.model.colors.length],\r\n isFill: false,\r\n actualIndex: series.points.length\r\n });\r\n }\r\n this.isSplitted = true;\r\n series.pieCollections = pieCollections;\r\n },\r\n _calculateGapWidth: function (currentSeries) {\r\n var circle1end = 0, circle2start = 0, coefficient, centerX, gapWidth;\r\n var constantWidth = 0.1 * Math.min($(this.svgObject).width(), $(this.svgObject).width());\r\n ej.EjSeriesRender.prototype._calculateVisiblePoints(currentSeries).visiblePoints;\r\n this._splitSeries(currentSeries); // to split the series points for pieofpie seriestype\r\n this.chartObj = this;\r\n // gapwidth calculation for pieofpie series type\r\n for (var j = 0; j < 2; j++) {\r\n coefficient = (j == 0) ? currentSeries.pieCoefficient : currentSeries.pieOfPieCoefficient;\r\n currentSeries._visiblePoints = currentSeries.pieCollections[j];\r\n currentSeries.collectionIndex = j;\r\n gapWidth = currentSeries.gapWidth;\r\n var size = ej.EjSeriesRender.prototype.calculatingSliceAngle(currentSeries, this.chartObj);\r\n var circleradius = size.width < constantWidth ? 0.25 * coefficient * constantWidth : 0.25 * coefficient * Math.min(size.width, size.height);\r\n centerX = this.model.circleCenterX[j];\r\n if (j == 0)\r\n circle1end = centerX + circleradius;\r\n else\r\n circle2start = centerX - circleradius;\r\n }\r\n var pieGapWidth = (circle2start - circle1end) - gapWidth;\r\n this.model.pieGapWidth = (pieGapWidth > 0) ? pieGapWidth : 0;\r\n // to draw connector lines for pieofpie series type\r\n if (currentSeries.pieCollections[0].length > 0 && currentSeries.pieCollections[1].length > 0 && currentSeries.connectorLine.width > 0)\r\n this.drawPieofPieConnectors(size, currentSeries);\r\n return currentSeries;\r\n },\r\n seriesRender: function (params, excludeDataUpdate) {\r\n this.model.allPoints = [];\r\n this.model.markerRegion = [];\r\n this.model.circleCenterX = [];\r\n this.model.circleCenterY = [];\r\n this.model.startX = [];\r\n this.model.startY = [];\r\n this.model.centerCount = 0;\r\n this.gTrendlinesGroupEle = null;\r\n this.model._seriesIndex = null;\r\n this.model._previousSeries = null;\r\n\r\n if (!params) {\r\n params = { _crossAxisOverlap: false, axes: {} };\r\n for (var i = 0; i < this.model._axes.length; i++)\r\n params.axes[this.model._axes[i].name] = {};\r\n }\r\n if ($(this.svgObject).find(\"#\" + this.svgObject.id + \"_SeriesCollection\").length > 0) {\r\n $(this.svgObject).find(\"#\" + this.svgObject.id + \"_SeriesCollection\").remove();\r\n }\r\n var chartObj = this,\r\n svg = this.svgObject,\r\n serOptions = { 'id': svg.id + '_SeriesCollection', 'clip-path': 'url(#' + svg.id + '_ChartAreaClipRect)' },\r\n enable3D = this.model.enable3D,\r\n areaType = this.model.AreaType,\r\n enableCanvasRendering = this.model.enableCanvasRendering,\r\n axesLength = this.model._axes.length,\r\n visibleSeries = ej.DataManager(this.model._visibleSeries, ej.Query().sortBy(\"_zOrder\")).executeLocal(),\r\n visibleSeriesLength = visibleSeries.length,\r\n i, j, axis, index, axisOrientation, index,\r\n seriesOptions, seriesOptionsVisibility, type, commonEventArgs,\r\n currentSeries, currentPoint, points, currentSeriesType,\r\n isCanvas = enableCanvasRendering, renderer = this.svgRenderer,\r\n areaBounds = this.model.m_AreaBounds, currentPointXPos, currentPointYPos,\r\n currentPointLabel, areaBoundsX = areaBounds.X, box,\r\n h, currentPointVisibility, visiblePointsLength, p, length,\r\n s, series, templateContainer, dataLabel, clipRect,\r\n trendlines, trendline, trendlineType, options, trendLineLength, duration,\r\n seriesEle, symbolEle, svgObjectId, waterfallLineEle, size, detachEle,\r\n seriesIndex, seriesType, minhightwidth, showLabels, l, visibility, xVisibleRange, yVisibleRange, zoomed = this.zoomed;\r\n\r\n this.gSeriesEle = renderer.createGroup(serOptions);\r\n\r\n for (i = 0; i < visibleSeriesLength; i++) {\r\n if (visibleSeries[i].visibility == \"visible\") {\r\n if (ej.util.isNullOrUndefined(this.model.series[i].enableSmartLabels)) // for setting enablesmartlabels property values\r\n this.model.series[i]._enableSmartLabels = (areaType) == \"none\" ? true : false;\r\n else\r\n this.model.series[i]._enableSmartLabels = this.model.series[i].enableSmartLabels;\r\n if (!ej.util.isNullOrUndefined(visibleSeries[i].xAxis)) {\r\n visibleSeries[i].xAxis = null;\r\n visibleSeries[i].yAxis = null;\r\n }\r\n for (j = 0; j < axesLength; j++) {\r\n axis = this.model._axes[j];\r\n index = i;\r\n axisOrientation = axis.orientation.toLowerCase();\r\n if (axis.name && axisOrientation == 'horizontal' && axis.name.toLowerCase() == visibleSeries[i]._xAxisName.toLowerCase()) {\r\n visibleSeries[i].xAxis = axis;\r\n }\r\n else if (axis.name && axisOrientation == 'vertical' && axis.name.toLowerCase() == visibleSeries[i]._yAxisName.toLowerCase()) {\r\n visibleSeries[i].yAxis = axis;\r\n }\r\n if (this.model.requireInvertedAxes) {\r\n if (axis.name && axisOrientation == 'vertical' && axis.name.toLowerCase() == visibleSeries[i]._xAxisName.toLowerCase()) {\r\n visibleSeries[i].xAxis = axis;\r\n }\r\n else if (axis.name && axisOrientation == 'horizontal' && axis.name.toLowerCase() == visibleSeries[i]._yAxisName.toLowerCase()) {\r\n visibleSeries[i].yAxis = axis;\r\n }\r\n }\r\n\r\n }\r\n }\r\n }\r\n if (visibleSeriesLength > 0) {\r\n currentSeries = visibleSeries[0];\r\n seriesType = currentSeries.type.toLowerCase(),\r\n visibility = currentSeries.visibility.toLowerCase();\r\n if (seriesType == \"pieofpie\" && visibility == 'visible' && !enable3D) {\r\n this.model._isPieOfPie = true;\r\n currentSeries = this._calculateGapWidth(currentSeries); // method to split point, gapwidth calculation and to draw pieofpie connectors\r\n // pieofpie rendering with splitted points\r\n for (var k = 0; k < 2; k++) {\r\n currentSeries.collectionIndex = k;\r\n currentSeries._visiblePoints = currentSeries.pieCollections[k];\r\n this._accSeriesDraw(0, currentSeries, seriesType);\r\n }\r\n currentSeries._visiblePoints = $.merge(currentSeries.pieCollections[0], currentSeries.pieCollections[1]);\r\n this.model.pieGapWidth = null;\r\n currentSeries.collectionIndex = 0;\r\n }\r\n else {\r\n //pie doughnut rendering from higher order to lower order\r\n for (var l = visibleSeriesLength; l > 0 && areaType == \"none\"; l--) {\r\n index = l - 1;\r\n seriesOptions = visibleSeries[l - 1];\r\n seriesOptionsVisibility = seriesOptions.visibility.toLowerCase();\r\n type = seriesOptions.type.toLowerCase();\r\n if (seriesOptionsVisibility === 'visible' && !enable3D && (type == \"pie\" || type == \"doughnut\")) {\r\n\r\n this._accSeriesDraw(index, seriesOptions, type);\r\n\r\n\r\n }\r\n else {\r\n if ((areaType == \"none\") && seriesOptionsVisibility === 'visible' && !enableCanvasRendering)\r\n ej.Ej3DChart.prototype.renderSeries(this, seriesOptions, excludeDataUpdate);\r\n }\r\n }\r\n }\r\n }\r\n for (m = 0; m < visibleSeriesLength; m++) {\r\n index = m;\r\n seriesOptions = visibleSeries[m];\r\n seriesOptionsVisibility = seriesOptions.visibility.toLowerCase();\r\n type = seriesOptions.type.toLowerCase();\r\n if (areaType == \"none\" && seriesOptionsVisibility === 'visible' && !enable3D && (index === 0) && (type == \"pyramid\" || type == \"funnel\")) {\r\n this._accSeriesDraw(index, seriesOptions, type);\r\n\r\n\r\n }\r\n else {\r\n if (seriesOptionsVisibility === 'visible' && !enable3D && areaType != \"none\") {\r\n this.model._seriesIndex = ej.util.isNullOrUndefined(this.model._seriesIndex) ? 0 : this.model._seriesIndex + 1;\r\n this.renderSeries(seriesOptions, params, excludeDataUpdate);\r\n if (areaType == \"cartesianaxes\" && this.model.series[m].type != \"boxandwhisker\")\r\n this._renderTrendline(chartObj, seriesOptions);\r\n }\r\n else {\r\n if (!enable3D && areaType != \"none\")\r\n renderer.append(svg, this.element);\r\n else {\r\n if ((areaType == \"cartesianaxes\") && seriesOptionsVisibility === 'visible' && !enableCanvasRendering)\r\n ej.Ej3DChart.prototype.renderSeries(this, seriesOptions, params, excludeDataUpdate);\r\n }\r\n }\r\n if (!ej.util.isNullOrUndefined(seriesOptions.xAxis) && seriesOptions.xAxis._valueType == \"datetime\") {\r\n for (var i = 0; i < seriesOptions.points.length; i++) {\r\n if (seriesOptions.points[i].xValue instanceof Date == false)\r\n seriesOptions.points[i].xValue = new Date(seriesOptions.points[i].xValue);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (areaType != \"none\") {\r\n // smart labels for cartesian axis\r\n for (i = 0; i < visibleSeriesLength; i++) {\r\n currentSeries = this.model.series[i];\r\n points = currentSeries._visiblePoints;\r\n if (currentSeries._enableSmartLabels && this.model.AreaType == \"cartesianaxes\") {\r\n currentSeriesType = currentSeries.type.toLowerCase();\r\n if (currentSeriesType == \"column\" || currentSeriesType == \"stackingcolumn\" ||\r\n currentSeriesType == \"bar\" || currentSeriesType == \"stackingbar\" || currentSeriesType == \"waterfall\"\r\n || currentSeriesType == \"stackingbar100\" || currentSeriesType == \"stackingcolumn100\" || currentSeriesType == \"rangecolumn\")\r\n this.cartesianColumnSmartLabels(currentSeries, points, i)\r\n else if (currentSeriesType != \"boxandwhisker\") {\r\n this.cartesianSmartLabels(currentSeries, points, i);\r\n }\r\n for (j = 0; j < points.length; j++) {\r\n currentPoint = points[j]; // condition to hide partially visible labels\r\n currentPoint.hide = false;\r\n currentPointXPos = isCanvas ? currentPoint.xPos - this.canvasX : currentPoint.xPos;\r\n currentPointYPos = isCanvas ? currentPoint.yPos - this.canvasY : currentPoint.yPos;\r\n xVisibleRange = currentSeries.xAxis.visibleRange;\r\n yVisibleRange = currentSeries.yAxis.visibleRange;\r\n if ((currentPointXPos - currentPoint.width / 2 < 0) || (currentPointXPos + currentPoint.width / 2 > areaBounds.Width) ||\r\n (currentPointYPos + currentPoint.height / 2 > areaBounds.Height) || (currentPointYPos - currentPoint.height / 2 < 0) || (zoomed && currentPoint.xValue <= xVisibleRange.min || currentPoint.xValue >= xVisibleRange.max) || currentPoint.y <= yVisibleRange.min || currentPoint.y >= yVisibleRange.max)\r\n currentPoint.hide = true;\r\n }\r\n }\r\n }\r\n\r\n // to draw connector lines for data label\r\n for (i = 0; i < visibleSeriesLength; i++) {\r\n currentSeries = visibleSeries[i];\r\n //For series with improved performance, it will avoid unnecessary looping\r\n showLabels = currentSeries._dataLabels ? (currentSeries.marker.dataLabel.visible || currentSeries._dataLabels > 0) : true;\r\n if (currentSeries.visibility == \"visible\" && showLabels) {\r\n visiblePointsLength = currentSeries._visiblePoints.length;\r\n for (h = 0; h < visiblePointsLength; h++) {\r\n currentPoint = currentSeries._visiblePoints[h];\r\n currentPointVisibility = currentPoint.marker && currentPoint.marker.dataLabel && currentPoint.marker.dataLabel.visible;\r\n if (currentSeries.marker.dataLabel.visible || currentPointVisibility) {\r\n if ((currentPoint.connectorFlag || currentPoint.newConnectorFlag) && !currentPoint.hide && currentPoint.drawText != \"\" && currentSeries.visibility == \"visible\" && !ej.util.isNullOrUndefined(currentPoint.textOptions)) {\r\n currentSeries.connectorLine = true;\r\n if (enableCanvasRendering) {\r\n renderer.ctx.save();\r\n if (!chartObj.model.requireInvertedAxes)\r\n renderer.ctx.rect(areaBoundsX, currentSeries.yAxis.y, currentSeries.xAxis.width, currentSeries.yAxis.height);\r\n else\r\n renderer.ctx.rect(areaBoundsX + currentSeries.yAxis.plotOffset, currentSeries.xAxis.y, currentSeries.yAxis.width, currentSeries.xAxis.height);\r\n renderer.ctx.clip();\r\n this.drawConnectorLines(i, h, currentPoint);\r\n renderer.ctx.restore();\r\n } else if (currentSeries._enableSmartLabels)\r\n this.drawConnectorLines(i, h, currentPoint);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // to draw data label symbol and text\r\n\r\n for (i = 0; i < visibleSeriesLength; i++) {\r\n currentSeries = visibleSeries[i];\r\n type = currentSeries.type.toLowerCase();\r\n //For series with improved performance, it will avoid unnecessary looping\r\n showLabels = currentSeries._dataLabels ? (currentSeries.marker.dataLabel.visible || currentSeries._dataLabels > 0) : true;\r\n if (currentSeries.visibility == \"visible\" && showLabels && !this.model.enable3D) {\r\n visiblePointsLength = currentSeries._visiblePoints.length;\r\n for (h = 0; h < visiblePointsLength; h++) {\r\n currentPoint = currentSeries._visiblePoints[h];\r\n currentPointLabel = currentPoint.marker && currentPoint.marker.dataLabel && currentPoint.marker.dataLabel.visible;\r\n if ((currentSeries.marker.dataLabel.visible || currentPointLabel) && !currentPoint.hide && !currentPoint.dataLabeltemplate && currentSeries.visibility == \"visible\" && !ej.util.isNullOrUndefined(currentPoint.textOptions) && !currentPoint.hide) {\r\n if (!ej.util.isNullOrUndefined(currentPoint.textOptions.angle))\r\n currentPoint.textOptions.transform = 'rotate(' + currentPoint.textOptions.angle + ',' + (currentPoint.xPos) + ',' + (currentPoint.yPos) + ')';\r\n if (enableCanvasRendering) { // for canvas\r\n currentPoint.textOptions.labelRotation = currentPoint.textOptions.angle; //for canvas label rotation\r\n renderer.ctx.save();\r\n if (!chartObj.model.requireInvertedAxes)\r\n renderer.ctx.rect(areaBoundsX, currentSeries.yAxis.y, currentSeries.xAxis.width, currentSeries.yAxis.height);\r\n else\r\n chartObj.svgRenderer.ctx.rect(areaBoundsX + currentSeries.yAxis.plotOffset, currentSeries.xAxis.y, currentSeries.yAxis.width, currentSeries.xAxis.height);\r\n chartObj.svgRenderer.ctx.save();\r\n chartObj.svgRenderer.ctx.clip();\r\n\r\n if (type.toLowerCase() == \"boxandwhisker\") {\r\n if (currentSeries.showMedian == true && currentPoint.textOptionsBoxValues != \"\") {\r\n if (!ej.util.isNullOrUndefined(currentPoint.textOptionsBoxValues[0].angle)) {\r\n currentPoint.textOptionsBoxValues[0].labelRotation = currentPoint.textOptionsBoxValues[0].angle;\r\n currentPoint.textOptionsBoxValues[0].transform = 'rotate(' + currentPoint.textOptionsBoxValues[0].angle + ',' + (currentPoint.textOptionsBoxValues[0].xPos) + ',' + (currentPoint.textOptionsBoxValues[0].yPos) + ')';\r\n }\r\n ej.EjSeriesRender.prototype.dataLabelSymbol(i, currentSeries, h, currentPoint.textOptionsBoxValues[0].xPos, currentPoint.textOptionsBoxValues[0].yPos, currentPoint.textOptionsBoxValues[0].width, currentPoint.textOptionsBoxValues[0].height, currentPoint.textOptionsBoxValues[0].symbolName, this)\r\n delete currentPoint.textOptionsBoxValues[0].angle;\r\n this.svgRenderer.drawText(currentPoint.textOptionsBoxValues[0], currentPoint.textOptionsBoxValues[0].drawText, this.gSeriesTextEle[i]);\r\n }\r\n for (var box = 1; box < currentPoint.textOptionsBoxValues.length; box++) {\r\n if (!ej.util.isNullOrUndefined(currentPoint.textOptionsBoxValues[box].angle)) {\r\n currentPoint.textOptionsBoxValues[box].labelRotation = currentPoint.textOptionsBoxValues[box].angle;\r\n currentPoint.textOptionsBoxValues[box].transform = 'rotate(' + currentPoint.textOptionsBoxValues[box].angle + ',' + (currentPoint.textOptionsBoxValues[box].xPos) + ',' + (currentPoint.textOptionsBoxValues[box].yPos) + ')';\r\n\r\n }\r\n ej.EjSeriesRender.prototype.dataLabelSymbol(i, currentSeries, h, currentPoint.textOptionsBoxValues[box].xPos, currentPoint.textOptionsBoxValues[box].yPos, currentPoint.textOptionsBoxValues[box].width, currentPoint.textOptionsBoxValues[box].height, currentPoint.textOptionsBoxValues[box].symbolName, this)\r\n delete currentPoint.textOptionsBoxValues[box].angle;\r\n this.svgRenderer.drawText(currentPoint.textOptionsBoxValues[box], currentPoint.textOptionsBoxValues[box].drawText, this.gSeriesTextEle[i]);\r\n }\r\n }\r\n else {\r\n ej.EjSeriesRender.prototype.dataLabelSymbol(i, currentSeries, h, currentPoint.xPos, currentPoint.yPos, currentPoint.width, currentPoint.height, currentPoint.symbolName, this)\r\n delete currentPoint.textOptions.angle;\r\n this.svgRenderer.drawText(currentPoint.textOptions, currentPoint.drawText, this.gSeriesTextEle);\r\n }\r\n chartObj.svgRenderer.ctx.restore();\r\n } else {\r\n ej.EjSeriesRender.prototype.dataLabelSymbol(i, currentSeries, h, currentPoint.xPos, currentPoint.yPos, currentPoint.width, currentPoint.height, currentPoint.symbolName, this, this.gDataLabelEle[i])\r\n delete currentPoint.textOptions.angle;\r\n renderer.drawText(currentPoint.textOptions, currentPoint.drawText, this.gSeriesTextEle[i]);\r\n }\r\n if (type == \"rangecolumn\" || type == \"rangearea\") {\r\n\r\n currentPoint.textOptionsLow.transform = 'rotate(' + currentPoint.textOptionsLow.angle + ',' + (currentPoint.xPosLow) + ',' + (currentPoint.yPosLow) + ')';\r\n if (enableCanvasRendering) { // for canvas\r\n currentPoint.textOptionsLow.labelRotation = currentPoint.textOptionsLow.angle; //for canvas label rotation\r\n renderer.ctx.save();\r\n if (!chartObj.model.requireInvertedAxes)\r\n renderer.ctx.rect(areaBoundsX, currentSeries.yAxis.y, currentSeries.xAxis.width, currentSeries.yAxis.height);\r\n else\r\n renderer.ctx.rect(areaBoundsX + currentSeries.yAxis.plotOffset, currentSeries.xAxis.y, currentSeries.yAxis.width, currentSeries.xAxis.height);\r\n renderer.ctx.clip();\r\n\r\n ej.EjSeriesRender.prototype.dataLabelSymbol(i, currentSeries, h, currentPoint.xPosLow, currentPoint.yPosLow, currentPoint.widthLow, currentPoint.heightLow, currentPoint.symbolName, this)\r\n delete currentPoint.textOptionsLow.angle;\r\n renderer.drawText(currentPoint.textOptionsLow, currentPoint.drawTextLow, this.gSeriesTextEle);\r\n renderer.ctx.restore();\r\n }\r\n else {\r\n\r\n ej.EjSeriesRender.prototype.dataLabelSymbol(i, currentSeries, h, currentPoint.xPosLow, currentPoint.yPosLow, currentPoint.widthLow, currentPoint.heightLow, currentPoint.symbolName, this, this.gDataLabelEle[i])\r\n delete currentPoint.textOptionsLow.angle;\r\n renderer.drawText(currentPoint.textOptionsLow, currentPoint.drawTextLow, this.gSeriesTextEle[i]);\r\n }\r\n }\r\n else if (type.toLowerCase() == \"boxandwhisker\") {\r\n if (currentSeries.showMedian == true && currentPoint.textOptionsBoxValues != \"\") {\r\n if (!ej.util.isNullOrUndefined(currentPoint.textOptionsBoxValues[0].angle))\r\n currentPoint.textOptionsBoxValues[0].transform = 'rotate(' + currentPoint.textOptionsBoxValues[0].angle + ',' + (currentPoint.textOptionsBoxValues[0].xPos) + ',' + (currentPoint.textOptionsBoxValues[0].yPos) + ')';\r\n ej.EjSeriesRender.prototype.dataLabelSymbol(i, currentSeries, h, currentPoint.textOptionsBoxValues[0].xPos, currentPoint.textOptionsBoxValues[0].yPos, currentPoint.textOptionsBoxValues[0].width, currentPoint.textOptionsBoxValues[0].height, currentPoint.textOptionsBoxValues[0].symbolName, this)\r\n delete currentPoint.textOptionsBoxValues[0].angle;\r\n this.svgRenderer.drawText(currentPoint.textOptionsBoxValues[0], currentPoint.textOptionsBoxValues[0].drawText, this.gSeriesTextEle[i]);\r\n }\r\n for (var box = 1; box < currentPoint.textOptionsBoxValues.length; box++) {\r\n if (!ej.util.isNullOrUndefined(currentPoint.textOptionsBoxValues[box].angle))\r\n currentPoint.textOptionsBoxValues[box].transform = 'rotate(' + currentPoint.textOptionsBoxValues[box].angle + ',' + (currentPoint.textOptionsBoxValues[box].xPos) + ',' + (currentPoint.textOptionsBoxValues[box].yPos) + ')';\r\n ej.EjSeriesRender.prototype.dataLabelSymbol(i, currentSeries, h, currentPoint.textOptionsBoxValues[box].xPos, currentPoint.textOptionsBoxValues[box].yPos, currentPoint.textOptionsBoxValues[box].width, currentPoint.textOptionsBoxValues[box].height, currentPoint.textOptionsBoxValues[box].symbolName, this)\r\n delete currentPoint.textOptionsBoxValues[box].angle;\r\n this.svgRenderer.drawText(currentPoint.textOptionsBoxValues[box], currentPoint.textOptionsBoxValues[box].drawText, this.gSeriesTextEle[i]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // to append connector lines\r\n if (areaType != \"none\") {\r\n // to append connector lines\r\n for (i = 0; i < visibleSeriesLength; i++) {\r\n this._appendConnectorElements(i);\r\n\r\n }\r\n\r\n // to append marker, data label symbol and text\r\n length = this.model._visibleSeries.length;\r\n for (i = 0; i < length; i++) {\r\n this._appendDataLabelElement(i);\r\n }\r\n }\r\n } //to append conector lines ,marker,datalabel symbol and text for pie and doughnut \r\n else {\r\n for (p = visibleSeriesLength - 1; p >= 0; p--) {\r\n currentSeries = this.model._visibleSeries[p];\r\n type = currentSeries.type.toLowerCase();\r\n if ((type == \"pie\" || type == \"doughnut\") && this.model.minhightwidth)\r\n this._appendConnectorElements(p);\r\n }\r\n length = this.model._visibleSeries.length;\r\n if (length > 0 && type == \"pieofpie\")\r\n this._appendDataLabelElement(0);\r\n else {\r\n for (p = visibleSeriesLength - 1; p >= 0; p--) {\r\n currentSeries = this.model._visibleSeries[p];\r\n type = currentSeries.type.toLowerCase();\r\n if ((type == \"pie\" || type == \"doughnut\") && this.model.minhightwidth)\r\n this._appendDataLabelElement(p);\r\n }\r\n }\r\n }\r\n length = this.model._visibleSeries.length;\r\n for (s = 0; s < length; s++) {\r\n options = this.model._visibleSeries[s];\r\n drawType = options.drawType;\r\n type = options.type.toLowerCase();\r\n options._previousType = ej.util.isNullOrUndefined(options._previousType) ? options.type : options._previousType;\r\n if (!this.vmlRendering && options.visibility == \"visible\" && !enableCanvasRendering && !enable3D && areaType != \"none\") {\r\n this.renderer.append(this.gSeriesEle, this.svgObject);\r\n this.renderer.append(this.svgObject, this.element);\r\n series = new ej.seriesTypes[options.type.toLowerCase()]();\r\n series.chartObj = chartObj;\r\n if (drawType == \"scatter\")\r\n series.gSeriesGroupEle = $(\"#\" + this.svgObject.id + \"_symbolGroup_\" + s)[0];\r\n else\r\n series.gSeriesGroupEle = $(\"#\" + this.svgObject.id + \"_SeriesGroup_\" + s)[0];\r\n if (options.enableAnimation && (!options._animatedSeries || options._previousType != options.type) && this.model.AreaType != \"none\") {\r\n options._animatedSeries = true;\r\n options._previousType = options.type;\r\n templateContainer = $('#template_group_' + this._id);\r\n dataLabel = options.marker.dataLabel;\r\n if (templateContainer.children().length != 0 && (dataLabel.visible && dataLabel.template))\r\n series.animateLabelTemplate(options);\r\n if (type == \"polar\" || type == \"radar\")\r\n ej.ejRadarSeries.prototype.doAnimation(options, series); // to animate polar/ radar\r\n else\r\n this.doAnimation(options); // to animate cartesian series\r\n }\r\n }\r\n }\r\n\r\n // to append trend line to DOM and perform animation\r\n visibleSeries = this.model._visibleSeries;\r\n length = visibleSeries.length;\r\n if (!enableCanvasRendering && !enable3D) {\r\n for (k = 0; k < length; k++) {\r\n if (visibleSeries[k].visibility.toLowerCase() == \"visible\" && this.gTrendlinesGroupEle &&\r\n this.gTrendlinesGroupEle[k] && this.gTrendlinesGroupEle[k].childElementCount != 0)\r\n this.renderer.append(this.gTrendlinesGroupEle[k], svg);\r\n }\r\n }\r\n for (i = 0; i < length; i++) {\r\n currentSeries = this.model._visibleSeries[i];\r\n trendlines = currentSeries.trendlines;\r\n trendLineLength = currentSeries.trendlines.length;\r\n duration = currentSeries.animationDuration;\r\n for (j = 0; j < trendLineLength; j++) {\r\n trendline = trendlines[j];\r\n if (trendline.visibility) {\r\n trendlineType = trendline.type.toLowerCase();\r\n options = new ej.trendlineTypes[trendlineType]();\r\n if (trendline.visibility.toLowerCase() === 'visible' && trendline.points && trendline.points.length > 1 &&\r\n currentSeries.enableAnimation && !this.vmlRendering && (!currentSeries._animatedTrendline || trendline._previousType != trendline.type)) {\r\n trendline._previousType = trendline.type;\r\n clipRect = $(this.svgObject).find(\"#\" + this.svgObject.id + '_TrendGroup' + '_' + i + '_' + j + \"_ClipRect\").children();\r\n ej.EjSeriesRender.prototype._doLineAnimation(this, clipRect, duration); // for trendline animation\r\n currentSeries._animatedTrendline = (trendLineLength - 1 == i) ? true : false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n length = this.model._visibleSeries.length;\r\n svgObjectId = svg.id;\r\n for (i = 0; i < length; i++) {\r\n seriesEle = $(\"#\" + svgObjectId + \"_SeriesGroup_\" + i);\r\n waterfallLineEle = $(\"#\" + svgObjectId + '_SeriesGroup_waterfallLine_' + i);\r\n symbolEle = $(\"#\" + svgObjectId + \"_symbolGroup_\" + i);\r\n if (seriesEle.length > 0 && symbolEle.length > 0)\r\n symbolEle.insertAfter(seriesEle);\r\n if (seriesEle.length > 0 && waterfallLineEle.length > 0)\r\n waterfallLineEle.insertAfter(seriesEle);\r\n }\r\n\r\n\r\n this.model.AnimationComplete = true;\r\n commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { series: options };\r\n this._trigger(\"animationComplete\", commonEventArgs);\r\n\r\n if (enableCanvasRendering) {\r\n renderer.append(svg, this.element);\r\n if (this.panning) $(\"#\" + this._id + \"_canvas\").css({ \"cursor\": \"pointer\" });\r\n }\r\n if (enable3D && !enableCanvasRendering) {\r\n renderer.append(this.chart3D, svg);\r\n\r\n size = { Width: $(svg).width(), Height: $(svg).height() };\r\n this.graphics.prepareView(this.model.perspectiveAngle, this.model.depth, this.model.rotation, this.model.tilt, size, this);\r\n this.graphics.view(svg, this);\r\n renderer.append(svg, this.element);\r\n //for (var i = 0; i < visibleSeries.length; i++) {\r\n // if (visibleSeries[i].visibility.toLowerCase() == \"visible\" && visibleSeries[i].enableAnimation && !(this.model.animated)) {\r\n // var seriesRendering = new ej.Ej3DSeriesRender();\r\n // var type = visibleSeries[i].type.toLowerCase();\r\n // var options = ej.series3DTypes[type];\r\n // if (this.model.AreaType == \"none\" && i > 0)\r\n // break;\r\n // options.doAnimation(visibleSeries[i], seriesRendering);\r\n // }\r\n\r\n //}\r\n\r\n }\r\n\r\n if (renderer.vmlNamespace)\r\n renderer.append(this.gSeriesEle, svg);\r\n if (areaType == 'polaraxes')\r\n renderer.append(this.gPolarAxisEle, svg);\r\n if ($(svg).find(\"#\" + svg.id + \"_StriplineOver\").length > 0) {\r\n detachEle = $(svg).find(\"#\" + svg.id + \"_StriplineOver\").detach();\r\n detachEle.appendTo(svg);\r\n }\r\n\r\n this._renderScrollbar();\r\n\r\n this.legendRender.drawLegend(params);\r\n\r\n chartObj.model.initSeriesRender = true;\r\n },\r\n\r\n _calculateZoomValue: function (startX, endX, axis, scrollObj) {\r\n var model = this.model,\r\n delta, zoomPos, zoomFact, start, end,\r\n scrollRange = axis.scrollbarSettings.range,\r\n valueType = axis._valueType.toLowerCase();\r\n if (valueType == \"datetime\") {\r\n start = Date.parse(!ej.util.isNullOrUndefined(scrollRange.min) ? new Date(scrollRange.min) : startX);\r\n end = Date.parse(!ej.util.isNullOrUndefined(scrollRange.max) ? new Date(scrollRange.max) : endX);\r\n } else {\r\n start = parseFloat(!ej.util.isNullOrUndefined(scrollRange.min) ? scrollRange.min : startX);\r\n end = parseFloat(!ej.util.isNullOrUndefined(scrollRange.max) ? scrollRange.max : endX);\r\n }\r\n start = Math.min(start, startX);\r\n end = Math.max(end, endX);\r\n delta = end - start;\r\n if (!scrollObj.isRTL) {\r\n zoomPos = (startX - start) / delta;\r\n zoomFact = (endX - startX) / delta;\r\n } else {\r\n zoomPos = (end - endX) / delta;\r\n zoomFact = (endX - startX) / delta;\r\n }\r\n scrollObj.scrollRange = { min: start, max: end, delta: end - start };\r\n scrollObj._previousStart = startX;\r\n scrollObj._previousEnd = endX;\r\n scrollObj.zoomPosition = zoomPos;\r\n scrollObj.zoomFactor = zoomFact;\r\n },\r\n\r\n _renderScrollbar: function () {\r\n\r\n var model = this.model,\r\n scrollSize = model.scrollerSize,\r\n scrollObj, index,\r\n chartOffsetVal = $('#' + this._id).offset(),\r\n offsetVal = ($(this.svgObject).offset().left - chartOffsetVal.left),\r\n scrollerWidth, scrollerHeight, scrollerX,\r\n scrollerY, scrollerX, axis, posY, width, isRedraw,\r\n zoomFac, zoomPos, opposed,\r\n axesCollections = model._axes,\r\n axesLength = axesCollections.length, inversed,\r\n zoomingScroll = model.zooming.enableScrollbar, range,\r\n areaType = model.AreaType, scrollbarSettings, pointLength,\r\n scrollEleLength, scrollRange, scrObj,\r\n orientation, valueType, isZoomAble;\r\n\r\n model.scrollObj = model.scrollObj ? model.scrollObj : [];\r\n\r\n\r\n for (var r = 0; r < axesLength; r++) {\r\n axis = axesCollections[r];\r\n valueType = axis._valueType;\r\n scrollbarSettings = axis.scrollbarSettings;\r\n range = scrollbarSettings.range;\r\n inversed = axis.isInversed,\r\n isZoomAble = areaType == \"cartesianaxes\" && !model.enable3D;\r\n opposed = axis._opposed;\r\n pointLength = scrollbarSettings.pointsLength;\r\n orientation = axis.orientation.toLowerCase();\r\n zoomFac = axis.zoomFactor;\r\n scrollEleLength = $(\"#scrollbar_\" + this.axisScroll[0].id + r).length;\r\n zoomPos = axis.zoomPosition;\r\n\r\n if (isZoomAble && ((axis._isScroll && model.isLazyZooming) || ((zoomFac < 1 || zoomPos > 0) && zoomingScroll))) {\r\n\r\n scrollerX = axis.x + ((orientation == \"vertical\") ? (-scrollSize + (opposed ? scrollSize : 0)) : 0) + (offsetVal <= 0 ? 0 : offsetVal);\r\n scrollerY = axis.y + ((orientation == \"horizontal\") ? (axis.height + (opposed ? -scrollSize : 0)) : 0);\r\n posY = scrollerY - (orientation == 'horizontal' ? 0 : axis.plotOffset);\r\n width = axis.plotOffset + (orientation == 'horizontal' ? axis.width : axis.height);\r\n scrObj = model.scrollObj;\r\n if (range.min != null || range.max != null)\r\n isRedraw = scrObj[r] ? (scrObj[r].actualRange.min != range.min || scrObj[r].actualRange.max != range.max) : false;\r\n else\r\n isRedraw = scrObj[r] ? (scrObj[r].actualRange != scrollbarSettings.pointsLength) : false;\r\n this.scrollDraw = scrObj[r] ? (scrObj[r].x != scrollerX || scrObj[r].y != scrollerY || scrObj[r].width != width) : this.scrollDraw;\r\n var options = {\r\n 'orientation': axis.orientation,\r\n 'index': r,\r\n 'width': width,\r\n 'x': scrollerX,\r\n 'y': posY,\r\n 'opposed': opposed,\r\n 'isRTL': inversed,\r\n 'parent': this.axisScroll,\r\n 'enableResize': scrollbarSettings.canResize,\r\n }\r\n if (model.isLazyZooming) {\r\n\r\n if (scrollEleLength == 0 || this.scrollDraw || isRedraw) {\r\n $(\"#scrollbar_\" + this.axisScroll[0].id + r).remove();\r\n if (range.min != null || range.max != null) {\r\n scrollRange = (scrObj[r] && scrObj[r].scrollRange) ? scrObj[r].scrollRange : axis.visibleRange;\r\n if (!this.scrollDraw || isRedraw) {\r\n scrObj[r] = {\r\n 'isVirtual': true,\r\n 'valueType': valueType,\r\n 'scrollRange': scrollRange\r\n };\r\n scrObj[r].actualRange = $.extend(scrObj[r].actualRange, scrollbarSettings.range);\r\n $.extend(scrObj[r], options);\r\n if (valueType == 'datetime') {\r\n scrObj[r].startDateTime = new Date(axis.visibleRange.min);\r\n scrObj[r].endDateTime = new Date(axis.visibleRange.max);\r\n } else {\r\n scrObj[r].startValue = axis.visibleRange.min;\r\n scrObj[r].endValue = axis.visibleRange.max;\r\n }\r\n\r\n this._calculateZoomValue(axis.visibleRange.min, axis.visibleRange.max, axis, this.model.scrollObj[r]);\r\n } else {\r\n scrObj[r].width = width;\r\n scrObj[r].x = scrollerX;\r\n scrObj[r].y = posY;\r\n }\r\n } else if (pointLength >= axis.maxPointLength) {\r\n zoomFac = axis.maxPointLength / pointLength;\r\n zoomPos = (inversed) ? (1 - axis.zoomPosition) : axis.zoomPosition;\r\n if (!this.scrollDraw || isRedraw) {\r\n scrObj[r] = {\r\n 'isVirtual': true,\r\n 'zoomPosition': zoomPos,\r\n 'zoomFactor': zoomFac,\r\n 'scrollRange': {\r\n 'min': 0,\r\n 'max': pointLength - 1,\r\n 'delta': pointLength - 1\r\n },\r\n 'valueType': 'double'\r\n };\r\n scrObj[r].actualRange = scrollbarSettings.pointsLength;\r\n $.extend(scrObj[r], options);\r\n scrObj[r].startValue = 0;\r\n scrObj[r].endValue = axis.maxPointLength;\r\n } else {\r\n scrObj[r].width = width;\r\n scrObj[r].x = scrollerX;\r\n scrObj[r].y = posY;\r\n }\r\n\r\n }\r\n if (this.model.scrollObj[r]) {\r\n this.scrollbarContainer = new ej.EjSvgScrollbarRender(this.axisScroll, this.model.scrollObj[r]);\r\n this.scrollbarContainer._initializeScrollbarVariables(this.model.scrollObj[r]);\r\n this.scrollbarContainer._renderScrollbar.call(this, this.model.scrollObj[r]);\r\n }\r\n }\r\n }\r\n else if (scrollbarSettings.visible) {\r\n\r\n //* Started Resizable Scrollbar here *// \r\n scrObj = model.scrollObj;\r\n\r\n if (scrollEleLength == 0 || this.scrollDraw) {\r\n $(\"#scrollbar_\" + this.axisScroll[0].id + r).remove();\r\n scrObj[r] = {\r\n 'zoomPosition': zoomPos,\r\n 'zoomFactor': zoomFac,\r\n 'valueType': valueType,\r\n 'scrollRange': axis.actualRange,\r\n 'isZooming': true\r\n };\r\n $.extend(scrObj[r], options);\r\n if (scrObj[r].valueType == 'datetime') {\r\n scrObj[r].startDateTime = new Date(scrObj[r].scrollRange.min);\r\n scrObj[r].endDateTime = new Date(scrObj[r].scrollRange.max);\r\n } else {\r\n scrObj[r].startValue = scrObj[r].scrollRange.min;\r\n scrObj[r].endValue = scrObj[r].scrollRange.max;\r\n }\r\n this.scrollbarContainer = new ej.EjSvgScrollbarRender(this.axisScroll, this.model.scrollObj[r]);\r\n this.scrollbarContainer._initializeScrollbarVariables(this.model.scrollObj[r]);\r\n this.scrollbarContainer._renderScrollbar.call(this, this.model.scrollObj[r]);\r\n }\r\n }\r\n\r\n } else {\r\n if (scrollEleLength > 0)\r\n $(\"#scrollbar_\" + this.axisScroll[0].id + r).remove();\r\n\r\n }\r\n }\r\n this.scrollDraw = false;\r\n },\r\n\r\n //Draw the trendline series\r\n _renderTrendline: function (chartObj, seriesOptions) {\r\n // declaration\r\n var seriesIndex = $.inArray(seriesOptions, chartObj.model.series),\r\n transX = chartObj.model.requireInvertedAxes ? seriesOptions.yAxis.x : seriesOptions.xAxis.x,\r\n transY = chartObj.model.requireInvertedAxes ? seriesOptions.xAxis.y : seriesOptions.yAxis.y,\r\n translate = 'translate(' + transX + ',' + transY + ')',\r\n trendlinesOptions = { 'id': chartObj.svgObject.id + '_TrendlinesGroup' + '_' + seriesIndex, 'clip-path': 'url(#' + chartObj.svgObject.id + '_TrendlinesGroup' + '_' + seriesIndex + '_ClipRect)' },\r\n trendlines = seriesOptions.trendlines, m, element, polynomialSlopes, slopeLength,\r\n options, trendline, i, slope, intercept, displayText, text = \"\",\r\n length = trendlines.length, trendOptions, trendlineType, commonEventArgs, backwardPoints, forwardPoints;\r\n\r\n if (!chartObj.gTrendlinesGroupEle) chartObj.gTrendlinesGroupEle = [];\r\n chartObj.gTrendlinesGroupEle[seriesIndex] = chartObj.svgRenderer.createGroup(trendlinesOptions);\r\n for (i = 0; i < length; i++) {\r\n trendline = trendlines[i];\r\n trendline.seriesIndex = seriesIndex;\r\n trendline.isTrendLine = true;\r\n trendline.trendlineIndex = i;\r\n if (trendline.visibility.toLowerCase() === 'visible' && !trendline.isNull && trendline.points) {\r\n trendOptions = { 'id': chartObj.svgObject.id + '_TrendGroup' + '_' + seriesIndex + '_' + i, 'transform': translate, 'clip-path': 'url(#' + chartObj.svgObject.id + '_TrendGroup' + '_' + seriesIndex + '_' + i + '_ClipRect)' };\r\n seriesOptions.gTrendGroupEle = null;\r\n seriesOptions.gTrendGroupEle = chartObj.svgRenderer.createGroup(trendOptions);\r\n trendlineType = trendline.type.toLowerCase();\r\n options = new ej.trendlineTypes[trendlineType]();\r\n slope = trendline.slope;\r\n intercept = trendline._intercept;\r\n switch (trendlineType) {\r\n case \"linear\":\r\n text = \"y = \" + slope.toFixed(4) + \"x + \" + intercept.toFixed(4);\r\n break;\r\n case \"exponential\":\r\n text = \"y = \" + intercept.toFixed(3) + \"e\" + \"^\" + slope.toFixed(4) + \"x\";\r\n break;\r\n case \"logarithmic\":\r\n text = \"y = \" + slope.toFixed(3) + \"ln(x) + \" + intercept.toFixed(4);\r\n break;\r\n case \"power\":\r\n text = \"y = \" + intercept.toFixed(3) + \"x^\" + slope.toFixed(4);\r\n break;\r\n case \"polynomial\":\r\n polynomialSlopes = trendline.polynomialSlopes;\r\n slopeLength = polynomialSlopes.length;\r\n text = \"y = \";\r\n for (m = slopeLength - 1; m >= 0; m--) {\r\n displayText = polynomialSlopes[m];\r\n text += displayText > 0 ? \"+\" + displayText : \"-\" + Math.abs(displayText);\r\n if (m != 0)\r\n text += \"x^\" + m + \" \";\r\n }\r\n break;\r\n }\r\n trendline.equation = text; // for equation\r\n\r\n ////Trigger Trendline rendering events\r\n commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n backwardPoints = trendline.points[0];\r\n forwardPoints = trendline.points[trendline.points.length - 1];\r\n commonEventArgs.data = { series: seriesOptions, trendline: trendline, forwardForecastPoints: forwardPoints, backwardForecastPoints: backwardPoints };\r\n this._trigger(\"trendlineRendering\", commonEventArgs);\r\n\r\n if (chartObj.model.enableCanvasRendering) {\r\n this.svgRenderer.ctx.save();\r\n this.svgRenderer.ctx.beginPath();\r\n this.svgRenderer.ctx.rect(chartObj.model.m_AreaBounds.X, seriesOptions.yAxis.y, seriesOptions.xAxis.width, seriesOptions.yAxis.height);\r\n this.svgRenderer.ctx.clip();\r\n this.svgRenderer.ctx.beginPath();\r\n options.draw(trendline, seriesOptions, chartObj);\r\n this.svgRenderer.ctx.restore();\r\n } else {\r\n options.draw(trendline, seriesOptions, chartObj);\r\n //Add axes bounds clip path for series\r\n element = seriesOptions.gTrendGroupEle;\r\n if (element) ej.EjSvgRender.utils._drawAxesBoundsClipPath(element, seriesOptions, this);\r\n }\r\n }\r\n }\r\n\r\n },\r\n _renderStripline: function (zIndex) {\r\n $.extend(ej.EjStripline.prototype, this);\r\n this.chartstripline = new ej.EjStripline(this);\r\n var stripline = this.chartstripline;\r\n this.model._stripeline = false;\r\n for (var sl = 0; sl < this.model._axes.length; sl++) {\r\n var slAxis = this.model._axes[sl];\r\n for (var slCount = 0; slCount < slAxis.stripLine.length; slCount++) {\r\n if (slAxis.stripLine[slCount].zIndex.toLowerCase() == zIndex)\r\n stripline._drawStripline(slAxis, slAxis.stripLine[slCount], sl, slCount);\r\n }\r\n }\r\n if (zIndex == 'over' && this.model._stripeline) {\r\n\r\n this.svgRenderer.append(this.gStriplineOver, this.svgObject);\r\n } else if (this.model._stripeline) {\r\n this.svgRenderer.append(this.gStriplineBehind, this.svgObject);\r\n }\r\n },\r\n\r\n renderSeries: function (options, params, excludeDataUpdate) {\r\n\r\n var chart = this, axis, showLabels, index;\r\n var drawType = options.drawType;\r\n var seriesIndex = $.inArray(options, this.model._visibleSeries);\r\n\r\n for (var i = 0; i < options.points.length; i++) {\r\n if (typeof options.points[i].x == \"string\" && options.points[i].x.indexOf(\"/Date(\") != -1)\r\n options.points[i].x = new Date(parseInt(options.points[i].x.substr(6)));\r\n else\r\n break;\r\n }\r\n options.xAxis = (options.xAxis === null || options.xAxis === undefined) ? this.model._axes[0] : options.xAxis;\r\n options.yAxis = (options.yAxis === null || options.yAxis === undefined) ? this.model._axes[1] : options.yAxis;\r\n var type = options.type.toLowerCase();\r\n var drawtype = options.drawType.toLowerCase();\r\n var symbolOptions;\r\n var translate = null;\r\n var visibility;\r\n\r\n if (this.model.AreaType == \"cartesianaxes\") {\r\n var trans = ej.EjSvgRender.utils._getTransform(options.xAxis, options.yAxis, this.model.requireInvertedAxes);\r\n var translate = 'translate(' + trans.x + ',' + trans.y + ')';\r\n visibility = 'visible';\r\n }\r\n else {\r\n visibility = (options.enableAnimation && !options._animatedSeries) ? 'hidden' : 'visible'\r\n }\r\n var txtOptions = { 'id': this.svgObject.id + '_TextGroup_' + seriesIndex, 'transform': translate, 'visibility': visibility };\r\n var dataLabelOptions = { 'id': this.svgObject.id + '_DataLabel_' + seriesIndex, 'transform': translate, 'visibility': visibility };\r\n if (type != \"scatter\")\r\n symbolOptions = { 'id': this.svgObject.id + '_symbolGroup_' + seriesIndex, 'transform': translate, 'visibility': visibility };\r\n else\r\n symbolOptions = { 'id': this.svgObject.id + '_SeriesGroup' + '_' + seriesIndex, 'transform': translate };\r\n var connectorOptions = { 'id': this.svgObject.id + '_ConnectorGroup_' + seriesIndex, 'transform': translate, 'visibility': visibility };\r\n if (!this.gSymbolGroupEle) this.gSymbolGroupEle = [];\r\n this.gSymbolGroupEle[seriesIndex] = this.svgRenderer.createGroup(symbolOptions);\r\n if (!this.gSeriesTextEle) this.gSeriesTextEle = [];\r\n this.gSeriesTextEle[seriesIndex] = this.svgRenderer.createGroup(txtOptions);\r\n if (!this.gConnectorEle) this.gConnectorEle = [];\r\n this.gConnectorEle[seriesIndex] = this.svgRenderer.createGroup(connectorOptions);\r\n if (!this.gDataLabelEle) this.gDataLabelEle = [];\r\n this.gDataLabelEle[seriesIndex] = this.svgRenderer.createGroup(dataLabelOptions);\r\n\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { series: options };\r\n this._trigger(\"seriesRendering\", commonEventArgs);\r\n\r\n var series = new ej.seriesTypes[type]();\r\n if (this.model.enableCanvasRendering && this.model.AreaType != \"none\") {\r\n this.svgRenderer.ctx.save();\r\n this.svgRenderer.ctx.beginPath();\r\n if (!this.model.requireInvertedAxes) { //checked for bar and stackingbar series\r\n this.canvasX = options.xAxis.x;\r\n this.canvasY = options.yAxis.y;\r\n this.svgRenderer.ctx.rect(options.xAxis.x, options.yAxis.y, options.xAxis.width, options.yAxis.height);\r\n } else {\r\n var translate = ej.EjSvgRender.utils._getTransform(options.xAxis, options.yAxis, this.model.requireInvertedAxes);\r\n this.canvasX = translate.x;\r\n this.canvasY = translate.y;\r\n this.svgRenderer.ctx.rect(options.yAxis.x, options.xAxis.y, options.yAxis.width, options.xAxis.height);\r\n }\r\n this.svgRenderer.ctx.clip();\r\n series.draw(this, options, params, excludeDataUpdate);\r\n this.svgRenderer.ctx.restore();\r\n }\r\n else if (this.model.enableCanvasRendering && this.model.AreaType == \"polaraxes\") {\r\n this.svgRenderer.ctx.save();\r\n this.svgRenderer.ctx.beginPath();\r\n this.svgRenderer.ctx.arc(this.model.centerX, this.model.centerY, this.model.Radius, 0, 2 * Math.PI, false);\r\n this.svgRenderer.ctx.clip();\r\n this.canvasX = this.canvasY = 0;\r\n series.draw(this, options, excludeDataUpdate);\r\n this.svgRenderer.ctx.restore();\r\n }\r\n else {\r\n this.canvasX = this.canvasY = 0;\r\n if (this.model.AreaType == \"cartesianaxes\")\r\n series.draw(this, options, params);\r\n else if (this.model.AreaType == \"polaraxes\" && (options._xAxisName == this.model._axes[0].name && options._yAxisName == this.model._axes[1].name))\r\n series.draw(this, options, excludeDataUpdate);\r\n }\r\n var errorbar = this.model.series[seriesIndex].errorBar,\r\n areaType = this.model.AreaType;\r\n if (errorbar.visibility == 'visible' && areaType == 'cartesianaxes' && (this.model.series[seriesIndex].type != \"boxandwhisker\"))\r\n this.renderErrorBar(errorbar, options); // to render error bar\r\n\r\n //Add axes bounds clip path for series\r\n var element = series.gSeriesGroupEle;\r\n if (element) ej.EjSvgRender.utils._drawAxesBoundsClipPath(element, options, this);\r\n\r\n // Draw Symbols \r\n if (!(type == \"candle\" || type == \"hilo\" || type == \"hiloopenclose\" || type == \"boxandwhisker\")) {\r\n var chartObj = this, point1,\r\n areatype = chartObj.model.AreaType.toLowerCase(),\r\n regiontype = ej.seriesTypes[type].prototype.isRegion;\r\n showLabels = options._pointMarker ? (options.marker.visible || options._pointMarker) : true;\r\n if (!(type == \"scatter\") && showLabels) {\r\n $.each(options._visiblePoints, function (pointIndex, point) {\r\n if ((point.visible !== false) && (point.x !== \"\") && ((point.marker && point.marker.visible) || (options.marker.visible))) {\r\n //this condition provide for better Scatter performance\r\n if ((areatype == \"polaraxes\" && drawtype == \"column\") || regiontype)\r\n point1 = point.symbolLocation;\r\n else\r\n point1 = (areatype != \"polaraxes\")\r\n ? ej.EjSvgRender.utils._getPoint(point, options) : ej.EjSvgRender.utils.TransformToVisible(options, point.xValue, point.y, chartObj)\r\n if (areatype == \"polaraxes\") {\r\n var labelFormat = options.yAxis.labelFormat ? options.yAxis.labelFormat : \"\";\r\n var pointText = (point.text) ? point.text : point.y + labelFormat.substring(labelFormat.indexOf('}') + 1);\r\n var textOffset = ej.EjSvgRender.utils._measureText(pointText, null, options.marker.dataLabel.font);\r\n }\r\n if ((areatype == \"polaraxes\" && (options._xAxisName == chartObj.model._axes[0].name && options._yAxisName == chartObj.model._axes[1].name)) && ((type.toLowerCase() == \"polar\" || type.toLowerCase() == \"radar\") && (drawType != \"scatter\")) || areatype == \"cartesianaxes\")\r\n series.drawSymbol(seriesIndex, options, pointIndex, point1.X, point1.Y);\r\n }\r\n });\r\n }\r\n if (type != \"scatter\") {\r\n //Add axes bounds clip path for marker\r\n if ((options.marker.visible) && (drawType != \"scatter\")) {\r\n element = this.gSymbolGroupEle[seriesIndex];\r\n ej.EjSvgRender.utils._drawAxesBoundsClipPath(element, options, this);\r\n }\r\n // Add axes bounds clip path for marker text\r\n if (options.marker.dataLabel.visible) {\r\n element = this.gSeriesTextEle[seriesIndex];\r\n ej.EjSvgRender.utils._drawAxesBoundsClipPath(element, options, this);\r\n // for data label shape\r\n element = this.gDataLabelEle[seriesIndex];\r\n ej.EjSvgRender.utils._drawAxesBoundsClipPath(element, options, this);\r\n }\r\n // Add axes bounds clip path for connector line\r\n if (!ej.util.isNullOrUndefined(this.gConnectorEle) && this.gConnectorEle.length > 0) {\r\n element = this.gConnectorEle[seriesIndex];\r\n ej.EjSvgRender.utils._drawAxesBoundsClipPath(element, options, this);\r\n }\r\n } else {\r\n element = this.gSymbolGroupEle[seriesIndex];\r\n ej.EjSvgRender.utils._drawAxesBoundsClipPath(element, options, this);\r\n this.svgRenderer.append(element, this.gSeriesEle);\r\n\r\n if (options.tooltip.visible || type == \"scatter\") {\r\n if (!this.model.enableCanvasRendering)\r\n var elements = $(this.gSymbolGroupEle).children().not(\"defs\");\r\n else\r\n elements = this.model.series[seriesIndex].points;\r\n if (this.vmlRendering) {\r\n this.cloneSeriesEle = $(this.gSeriesEle).clone();\r\n this.cloneobj = $(this.element).clone();\r\n this.svgclone = $(this.svgObject).clone();\r\n $(document.body).append(this.cloneobj);\r\n this.svgRenderer.append(this.cloneSeriesEle, this.svgclone);\r\n this.svgRenderer.append(this.svgclone, this.cloneobj);\r\n }\r\n else {\r\n this.svgRenderer.append(this.gSeriesEle, this.svgObject);\r\n this.svgRenderer.append(this.svgObject, this.element);\r\n }\r\n\r\n if (this.vmlRendering) {\r\n $(this.cloneobj).remove();\r\n $(this.svgclone).remove();\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n //Draw Series Text\r\n showLabels = options._dataLabels ? (options.marker.dataLabel.visible || options._dataLabels > 0) : true;\r\n if (options.marker.dataLabel.visible || showLabels)\r\n this.drawDisplayText(series, options, params);\r\n\r\n\r\n },\r\n\r\n renderErrorBar: function (errorOptions, seriesOptions) {\r\n // declaration\r\n var chartobj = this,\r\n model = chartobj.model,\r\n currentseries = seriesOptions,\r\n type, mode, direction, fill, cap,\r\n capFill, capWidth, capLength,\r\n visiblePoints = currentseries._visiblePoints,\r\n len = visiblePoints.length,\r\n canvasX = chartobj.canvasX, canvasY = chartobj.canvasY,\r\n seriesIndex = $.inArray(currentseries, model._visibleSeries),\r\n translate = null, i,\r\n trans = ej.EjSvgRender.utils._getTransform(currentseries.xAxis, currentseries.yAxis, model.requireInvertedAxes),\r\n verticalErrorValue, horizontalErrorValue,\r\n requireInvertedAxes = model.requireInvertedAxes,\r\n verticalPositive, verticalNegative,\r\n horizontalPositive, horizontalNegative,\r\n svgObjectId = chartobj.svgObject.id,\r\n areaBounds = chartobj.model.m_AreaBounds,\r\n translate = 'translate(' + trans.x + ',' + trans.y + ')',\r\n errorBarElement, errorBarGroup, event, errorBarPoint,\r\n pointIndex, point, yValue, xVal, standY, standX,\r\n location, verHighvalue, verLowvalue,\r\n horHighvalue, horLowvalue, mean, verMean, horMean,\r\n verStandSquareRoot, horStandSquareRoot, centervalueX, centervalueY,\r\n verStandardDeviationValue, horStandardDeviationValue,\r\n verCentervalue, horCentervalue,\r\n verStandardErrorValue, horStandardErrorValue,\r\n values, values1, verHighCapX1, verHighCapX2,\r\n verLowCapX1, verLowCapX2, horHighCapY1, horHighCapY2,\r\n horLowCapY1, horLowCapY2, eDirectionV, cDirectionV,\r\n eDirectionH, cDirectionH, eDirection, cDirection,\r\n fixvalue, pervalue, perY, perX, standDeviValue, standError,\r\n custom, capValues, commonEventArgs, errorBarPointGroup;\r\n\r\n // parent group creation\r\n errorBarGroup = {\r\n 'id': svgObjectId + '_ErrorBarGroup' + '_' + seriesIndex,\r\n 'transform': translate,\r\n 'clip-path': 'url(#' + svgObjectId + '_ChartAreaClipRect)'\r\n };\r\n\r\n if (ej.util.isNullOrUndefined(chartobj.gErrorBarGroupEle))\r\n chartobj.gErrorBarGroupEle = [];\r\n errorBarElement = chartobj.gErrorBarGroupEle[seriesIndex] = chartobj.svgRenderer.createGroup(errorBarGroup);\r\n\r\n commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = {\r\n errorBar: errorOptions\r\n };\r\n this._trigger(\"errorBarRendering\", commonEventArgs); // trigger event\r\n\r\n event = commonEventArgs.data.errorBar;\r\n type = event.type;\r\n mode = event.mode;\r\n direction = event.direction;\r\n fill = event.fill;\r\n cap = event.cap;\r\n capFill = event.cap.fill;\r\n capWidth = event.cap.width;\r\n capLength = event.cap.length;\r\n verticalErrorValue = event.verticalErrorValue;\r\n horizontalErrorValue = event.horizontalErrorValue;\r\n verticalPositive = event.verticalPositiveErrorValue;\r\n verticalNegative = event.verticalNegativeErrorValue;\r\n horizontalPositive = event.horizontalPositiveErrorValue;\r\n horizontalNegative = event.horizontalNegativeErrorValue;\r\n\r\n for (i = 0; i < len; i++) {\r\n if (visiblePoints[i].isEmpty !== true && visiblePoints[i].visible == true) {\r\n // error bar group creation\r\n errorBarPoint = {\r\n 'id': chartobj.svgObject.id + '_ErrorBarGroup' + '_' + seriesIndex + '_Point' + i\r\n }\r\n errorBarPointGroup = chartobj.svgRenderer.createGroup(errorBarPoint);\r\n\r\n pointIndex = i;\r\n point = visiblePoints[i];\r\n yValue = point.YValues[0];\r\n xVal = point.xValue;\r\n standY = visiblePoints[i].YValues[0];\r\n standX = visiblePoints[i].xValue;\r\n\r\n if (type.indexOf(\"column\") || type.indexOf(\"bar\") > -1)\r\n location = point.symbolLocation;\r\n else\r\n location = point.location;\r\n if (ej.util.isNullOrUndefined(location))\r\n location = ej.EjSvgRender.utils._getPoint(point, currentseries);\r\n centervalueX = location.X;\r\n centervalueY = location.Y;\r\n //error bar type calculation\r\n switch (type) {\r\n case \"fixedValue\":\r\n fixvalue = point;\r\n if (mode == 'vertical' || mode == 'both') { //vertical mode calculation for fixed value point location\r\n fixvalue.YValues[0] = yValue + verticalErrorValue;\r\n verHighvalue = ej.EjSvgRender.utils._getPoint(fixvalue, currentseries);\r\n fixvalue.YValues[0] = yValue - verticalErrorValue;\r\n verLowvalue = ej.EjSvgRender.utils._getPoint(fixvalue, currentseries);\r\n if (!requireInvertedAxes)\r\n verHighvalue.X = verLowvalue.X = location.X;\r\n else\r\n verHighvalue.Y = verLowvalue.Y = location.Y;\r\n }\r\n if (mode == 'horizontal' || mode == 'both') {\r\n fixvalue.YValues[0] = yValue;\r\n fixvalue.xValue = xVal; //horizontal mode calculation for fixed value point location\r\n fixvalue.xValue = xVal + horizontalErrorValue;\r\n horHighvalue = ej.EjSvgRender.utils._getPoint(fixvalue, currentseries);\r\n fixvalue.xValue = xVal - horizontalErrorValue;\r\n horLowvalue = ej.EjSvgRender.utils._getPoint(fixvalue, currentseries);\r\n }\r\n fixvalue.YValues[0] = yValue;\r\n fixvalue.xValue = xVal;\r\n break;\r\n\r\n case \"percentage\":\r\n pervalue = point;\r\n perY = verticalErrorValue / 100 * yValue;\r\n perX = horizontalErrorValue / 100 * xVal;\r\n if (mode == 'vertical' || mode == 'both') { //vertical mode calculation for percentage point locaion\r\n pervalue.YValues[0] = yValue + perY;\r\n verHighvalue = ej.EjSvgRender.utils._getPoint(pervalue, currentseries);\r\n pervalue.YValues[0] = yValue - perY;\r\n verLowvalue = ej.EjSvgRender.utils._getPoint(pervalue, currentseries);\r\n if (!requireInvertedAxes)\r\n verHighvalue.X = verLowvalue.X = location.X;\r\n else\r\n verHighvalue.Y = verLowvalue.Y = location.Y;\r\n }\r\n if (mode == 'horizontal' || mode == 'both') {\r\n pervalue.YValues[0] = yValue;\r\n pervalue.xValue = xVal; //horizontal mode calculation for percentage\r\n pervalue.xValue = xVal + perX;\r\n horHighvalue = ej.EjSvgRender.utils._getPoint(pervalue, currentseries);\r\n pervalue.xValue = xVal - perX;\r\n horLowvalue = ej.EjSvgRender.utils._getPoint(pervalue, currentseries);\r\n }\r\n pervalue.YValues[0] = yValue;\r\n pervalue.xValue = xVal;\r\n break;\r\n\r\n case \"standardDeviation\":\r\n standDeviValue = point;\r\n mean = chartobj.meanCalculation(mode, visiblePoints);\r\n verMean = mean.verMean;\r\n horMean = mean.horMean;\r\n verStandSquareRoot = mean.verStandSquareRoot;\r\n horStandSquareRoot = mean.horStandSquareRoot;\r\n if (mode == 'vertical' || mode == 'both') {\r\n verStandardDeviationValue = verticalErrorValue * verStandSquareRoot;\r\n standDeviValue.YValues[0] = verMean;\r\n verCentervalue = ej.EjSvgRender.utils._getPoint(standDeviValue, currentseries);\r\n yValue = standDeviValue.YValues[0];\r\n standDeviValue.YValues[0] = yValue + verStandardDeviationValue;\r\n verHighvalue = ej.EjSvgRender.utils._getPoint(standDeviValue, currentseries);\r\n standDeviValue.YValues[0] = yValue - verStandardDeviationValue;\r\n verLowvalue = ej.EjSvgRender.utils._getPoint(standDeviValue, currentseries);\r\n if (!requireInvertedAxes)\r\n verCentervalue.X = verHighvalue.X = verLowvalue.X = location.X;\r\n else\r\n verCentervalue.Y = verHighvalue.Y = verLowvalue.Y = location.Y;\r\n verCentervalue.X = verCentervalue.X + canvasX;\r\n verCentervalue.Y = verCentervalue.Y + canvasY;\r\n }\r\n if (mode == 'horizontal' || mode == 'both') {\r\n horStandardDeviationValue = horizontalErrorValue * horStandSquareRoot;\r\n standDeviValue.xValue = horMean;\r\n horCentervalue = ej.EjSvgRender.utils._getPoint(standDeviValue, currentseries);\r\n if (!requireInvertedAxes)\r\n horCentervalue.Y = location.Y;\r\n else\r\n horCentervalue.X = location.X;\r\n standDeviValue.YValues[0] = standY;\r\n xVal = standDeviValue.xValue;\r\n standDeviValue.xValue = xVal + horStandardDeviationValue;\r\n horHighvalue = ej.EjSvgRender.utils._getPoint(standDeviValue, currentseries);\r\n standDeviValue.xValue = xVal - horStandardDeviationValue;\r\n horLowvalue = ej.EjSvgRender.utils._getPoint(standDeviValue, currentseries);\r\n horCentervalue.X = horCentervalue.X + canvasX;\r\n horCentervalue.Y = horCentervalue.Y + canvasY;\r\n\r\n }\r\n standDeviValue.YValues[0] = standY;\r\n standDeviValue.xValue = standX;\r\n\r\n break;\r\n case \"standardError\":\r\n standError = point;\r\n mean = chartobj.meanCalculation(mode, visiblePoints);\r\n verStandSquareRoot = mean.verStandSquareRoot;\r\n horStandSquareRoot = mean.horStandSquareRoot;\r\n if (mode == 'vertical' || mode == 'both') { //vertical mode standard Error calculation\r\n verStandardDeviationValue = verticalErrorValue * verStandSquareRoot;\r\n verStandardErrorValue = verStandardDeviationValue / Math.sqrt(len);\r\n standError.YValues[0] = yValue + verStandardErrorValue;\r\n verHighvalue = ej.EjSvgRender.utils._getPoint(standError, currentseries);\r\n standError.YValues[0] = yValue - verStandardErrorValue\r\n verLowvalue = ej.EjSvgRender.utils._getPoint(standError, currentseries);\r\n if (!requireInvertedAxes)\r\n verHighvalue.X = verLowvalue.X = location.X;\r\n else\r\n verHighvalue.Y = verLowvalue.Y = location.Y;\r\n }\r\n if (mode == 'horizontal' || mode == 'both') { //horizontal mode standard Error calculation\r\n horStandardDeviationValue = horizontalErrorValue * horStandSquareRoot;\r\n horStandardErrorValue = horStandardDeviationValue / Math.sqrt(len);\r\n standError.YValues[0] = yValue;\r\n standError.xValue = xVal; //horizontal mode calculation for point location\r\n standError.xValue = xVal + horStandardErrorValue;\r\n horHighvalue = ej.EjSvgRender.utils._getPoint(standError, currentseries);\r\n standError.xValue = xVal - horStandardErrorValue;\r\n horLowvalue = ej.EjSvgRender.utils._getPoint(standError, currentseries);\r\n }\r\n standError.YValues[0] = yValue;\r\n standError.xValue = xVal;\r\n i = pointIndex;\r\n break;\r\n\r\n case \"custom\":\r\n custom = point;\r\n if (mode == 'vertical' || mode == 'both') { //calculation for vertical mode point locaton\r\n custom.YValues[0] = yValue + verticalPositive;\r\n verHighvalue = ej.EjSvgRender.utils._getPoint(custom, currentseries);\r\n custom.YValues[0] = yValue - verticalNegative;\r\n verLowvalue = ej.EjSvgRender.utils._getPoint(custom, currentseries);\r\n if (!requireInvertedAxes)\r\n verHighvalue.X = verLowvalue.X = location.X;\r\n else\r\n verHighvalue.Y = verLowvalue.Y = location.Y;\r\n }\r\n if (mode == 'horizontal' || mode == 'both') {\r\n custom.YValues[0] = yValue;\r\n custom.xValue = xVal; //calculation for horizontal mode point location\r\n custom.xValue = xVal + horizontalPositive;\r\n horHighvalue = ej.EjSvgRender.utils._getPoint(custom, currentseries);\r\n custom.xValue = xVal - horizontalNegative;\r\n horLowvalue = ej.EjSvgRender.utils._getPoint(custom, currentseries);\r\n }\r\n custom.YValues[0] = yValue;\r\n custom.xValue = xVal;\r\n break;\r\n }\r\n\r\n //to render cap \r\n if (cap.visible == true) {\r\n if (mode == 'vertical' || mode == 'both')\r\n values = { verHighvalue: verHighvalue, verLowvalue: verLowvalue }\r\n if (mode == 'horizontal' || mode == 'both')\r\n values1 = { horHighvalue: horHighvalue, horLowvalue: horLowvalue }\r\n capValues = chartobj.renderCap(cap, mode, values, values1, requireInvertedAxes);\r\n verHighCapX1 = capValues.verHighCapX1, verHighCapX2 = capValues.verHighCapX2,\r\n verLowCapX1 = capValues.verLowCapX1, verLowCapX2 = capValues.verLowCapX2,\r\n horHighCapY1 = capValues.horHighCapY1, horHighCapY2 = capValues.horHighCapY2,\r\n horLowCapY1 = capValues.horLowCapY1, horLowCapY2 = capValues.horLowCapY2;\r\n }\r\n centervalueX = centervalueX + canvasX;\r\n centervalueY = centervalueY + canvasY;\r\n if (mode == 'vertical' || mode == 'both') {\r\n verHighvalue.X = verHighvalue.X + canvasX;\r\n verHighvalue.Y = verHighvalue.Y + canvasY;\r\n verLowvalue.X = verLowvalue.X + canvasX;\r\n verLowvalue.Y = verLowvalue.Y + canvasY;\r\n }\r\n if (mode == 'horizontal' || mode == 'both') {\r\n horHighvalue.X = horHighvalue.X + canvasX;\r\n horHighvalue.Y = horHighvalue.Y + canvasY;\r\n horLowvalue.X = horLowvalue.X + canvasX;\r\n horLowvalue.Y = horLowvalue.Y + canvasY;\r\n }\r\n //drawing error bar and error bar cap \r\n //drawing both direction \r\n if (direction == 'both') {\r\n if (mode == 'vertical' || mode == 'both') { //vertical mode for both direction\r\n if (type != 'standardDeviation')\r\n eDirectionV = \"M\" + \" \" + (centervalueX) + \" \" + (centervalueY) + \" \" + \"L\" + \" \" + (verHighvalue.X) + \" \" + (verHighvalue.Y) + \" \" + \"M\" + \" \" + (centervalueX) + \" \" + (centervalueY) + \" \" + \"L\" + \" \" + (verLowvalue.X) + \" \" + (verLowvalue.Y) + \" \";\r\n else if (type == 'standardDeviation')\r\n eDirectionV = \"M\" + \" \" + (verCentervalue.X) + \" \" + (verCentervalue.Y) + \" \" + \"L\" + \" \" + (verHighvalue.X) + \" \" + (verHighvalue.Y) + \" \" + \"M\" + \" \" + (verCentervalue.X) + \" \" + (verCentervalue.Y) + \" \" + \"L\" + \" \" + (verLowvalue.X) + \" \" + (verLowvalue.Y) + \" \";\r\n if (!requireInvertedAxes)\r\n cDirectionV = !cap.visible ? \"\" : \"M\" + \" \" + (verHighvalue.X) + \" \" + (verHighvalue.Y) + \" \" + \"L\" + \" \" + (verHighCapX1) + \" \" + (verHighvalue.Y) + \" \" + \"M\" + \" \" + (verHighvalue.X) + \" \" + (verHighvalue.Y) + \" \" + \"L\" + \" \" + (verHighCapX2) + \" \" + (verHighvalue.Y) + \" \" + \"M\" + \" \" + (verLowvalue.X) + \" \" + (verLowvalue.Y) + \" \" + \"L\" + \" \" + (verLowCapX1) + \" \" + (verLowvalue.Y) + \" \" + \"M\" + \" \" + (verLowvalue.X) + \" \" + (verLowvalue.Y) + \" \" + \"L\" + \" \" + (verLowCapX2) + \" \" + (verLowvalue.Y) + \" \";\r\n else\r\n cDirectionV = !cap.visible ? \"\" : \"M\" + \" \" + (verHighvalue.X) + \" \" + (verHighvalue.Y) + \" \" + \"L\" + \" \" + (verHighvalue.X) + \" \" + (verHighCapX1) + \" \" + \"M\" + \" \" + (verHighvalue.X) + \" \" + (verHighvalue.Y) + \" \" + \"L\" + \" \" + (verHighvalue.X) + \" \" + (verHighCapX2) + \" \" + \"M\" + \" \" + (verLowvalue.X) + \" \" + (verLowvalue.Y) + \" \" + \"L\" + \" \" + (verLowvalue.X) + \" \" + (verLowCapX1) + \" \" + \"M\" + \" \" + (verLowvalue.X) + \" \" + (verLowvalue.Y) + \" \" + \"L\" + \" \" + (verLowvalue.X) + \" \" + (verLowCapX2) + \" \";\r\n eDirection = eDirectionV, cDirection = cDirectionV;\r\n }\r\n if (mode == 'horizontal' || mode == 'both') {\r\n if (type != 'standardDeviation') //horizontal mode for both direction\r\n eDirectionH = \"M\" + \" \" + (centervalueX) + \" \" + (centervalueY) + \" \" + \"L\" + \" \" + (horHighvalue.X) + \" \" + (horHighvalue.Y) + \" \" + \"M\" + \" \" + (centervalueX) + \" \" + (centervalueY) + \" \" + \"L\" + \" \" + (horLowvalue.X) + \" \" + (horLowvalue.Y) + \" \";\r\n else if (type == 'standardDeviation')\r\n eDirectionH = \"M\" + \" \" + (horCentervalue.X) + \" \" + (horCentervalue.Y) + \" \" + \"L\" + \" \" + (horHighvalue.X) + \" \" + (horHighvalue.Y) + \" \" + \"M\" + \" \" + (horCentervalue.X) + \" \" + (horCentervalue.Y) + \" \" + \"L\" + \" \" + (horLowvalue.X) + \" \" + (horLowvalue.Y) + \" \";\r\n if (!requireInvertedAxes)\r\n cDirectionH = !cap.visible ? \"\" : \"M\" + \" \" + (horHighvalue.X) + \" \" + (horHighvalue.Y) + \" \" + \"L\" + \" \" + (horHighvalue.X) + \" \" + (horHighCapY1) + \" \" + \"M\" + \" \" + (horHighvalue.X) + \" \" + (horHighvalue.Y) + \" \" + \"L\" + \" \" + (horHighvalue.X) + \" \" + (horHighCapY2) + \" \" + \"M\" + \" \" + (horLowvalue.X) + \" \" + (horLowvalue.Y) + \" \" + \"L\" + \" \" + (horLowvalue.X) + \" \" + (horLowCapY1) + \" \" + \"M\" + \" \" + (horLowvalue.X) + \" \" + (horLowvalue.Y) + \" \" + \"L\" + \" \" + (horLowvalue.X) + \" \" + (horLowCapY2) + \" \";\r\n else\r\n cDirectionH = !cap.visible ? \"\" : \"M\" + \" \" + (horHighvalue.X) + \" \" + (horHighvalue.Y) + \" \" + \"L\" + \" \" + (horHighCapY1) + \" \" + (horHighvalue.Y) + \" \" + \"M\" + \" \" + (horHighvalue.X) + \" \" + (horHighvalue.Y) + \" \" + \"L\" + \" \" + (horHighCapY2) + \" \" + (horHighvalue.Y) + \" \" + \"M\" + \" \" + (horLowvalue.X) + \" \" + (horLowvalue.Y) + \" \" + \"L\" + \" \" + (horLowCapY1) + \" \" + (horLowvalue.Y) + \" \" + \"M\" + \" \" + (horLowvalue.X) + \" \" + (horLowvalue.Y) + \" \" + \"L\" + \" \" + (horLowCapY2) + \" \" + (horLowvalue.Y) + \" \";\r\n eDirection = eDirectionH, cDirection = cDirectionH;\r\n }\r\n if (mode == 'both') {\r\n eDirectionH += eDirectionV, cDirectionH += cDirectionV;\r\n eDirection = eDirectionH, cDirection = cDirectionH;\r\n }\r\n }\r\n //drawing plus direction\r\n else if (direction == 'plus') {\r\n if (mode == 'vertical' || mode == 'both') { //vertical mode for plus direction\r\n if (type != 'standardDeviation')\r\n eDirectionV = \"M\" + \" \" + (centervalueX) + \" \" + (centervalueY) + \" \" + \"L\" + \" \" + (verHighvalue.X) + \" \" + (verHighvalue.Y) + \" \";\r\n else if (type == 'standardDeviation')\r\n eDirectionV = \"M\" + \" \" + (verCentervalue.X) + \" \" + (verCentervalue.Y) + \" \" + \"L\" + \" \" + (verHighvalue.X) + \" \" + (verHighvalue.Y) + \" \";\r\n if (!requireInvertedAxes)\r\n cDirectionV = !cap.visible ? \"\" : \"M\" + \" \" + (verHighvalue.X) + \" \" + (verHighvalue.Y) + \" \" + \"L\" + \" \" + (verHighCapX1) + \" \" + (verHighvalue.Y) + \" \" + \"M\" + \" \" + (verHighvalue.X) + \" \" + (verHighvalue.Y) + \" \" + \"L\" + \" \" + (verHighCapX2) + \" \" + (verHighvalue.Y) + \" \";\r\n else\r\n cDirectionV = !cap.visible ? \"\" : \"M\" + \" \" + (verHighvalue.X) + \" \" + (verHighvalue.Y) + \" \" + \"L\" + \" \" + (verHighvalue.X) + \" \" + (verHighCapX1) + \" \" + \"M\" + \" \" + (verHighvalue.X) + \" \" + (verHighvalue.Y) + \" \" + \"L\" + \" \" + (verHighvalue.X) + \" \" + (verHighCapX2) + \" \";\r\n var eDirection = eDirectionV, cDirection = cDirectionV;\r\n }\r\n if (mode == 'horizontal' || mode == 'both') {\r\n if (type != 'standardDeviation') //horizontal mode for both direction\r\n eDirectionH = \"M\" + \" \" + (centervalueX) + \" \" + (centervalueY) + \" \" + \"L\" + \" \" + (horHighvalue.X) + \" \" + (horHighvalue.Y) + \" \";\r\n else if (type == 'standardDeviation')\r\n eDirectionH = \"M\" + \" \" + (horCentervalue.X) + \" \" + (horCentervalue.Y) + \" \" + \"L\" + \" \" + (horHighvalue.X) + \" \" + (horHighvalue.Y) + \" \";\r\n if (!requireInvertedAxes)\r\n cDirectionH = !cap.visible ? \"\" : \"M\" + \" \" + (horHighvalue.X) + \" \" + (horHighvalue.Y) + \" \" + \"L\" + \" \" + (horHighvalue.X) + \" \" + (horHighCapY1) + \" \" + \"M\" + \" \" + (horHighvalue.X) + \" \" + (horHighvalue.Y) + \" \" + \"L\" + \" \" + (horHighvalue.X) + \" \" + (horHighCapY2) + \" \";\r\n else\r\n cDirectionH = !cap.visible ? \"\" : \"M\" + \" \" + (horHighvalue.X) + \" \" + (horHighvalue.Y) + \" \" + \"L\" + \" \" + (horHighCapY1) + \" \" + (horHighvalue.Y) + \" \" + \"M\" + \" \" + (horHighvalue.X) + \" \" + (horHighvalue.Y) + \" \" + \"L\" + \" \" + (horHighCapY2) + \" \" + (horHighvalue.Y) + \" \";\r\n eDirection = eDirectionH, cDirection = cDirectionH;\r\n }\r\n if (mode == 'both') {\r\n eDirectionH += eDirectionV, cDirectionH += cDirectionV;\r\n eDirection = eDirectionH, cDirection = cDirectionH;\r\n }\r\n }\r\n // drawing minus direction\r\n else {\r\n if (mode == 'vertical' || mode == 'both') { //vertical mode for both direction\r\n if (type != 'standardDeviation')\r\n eDirectionV = \"M\" + \" \" + (centervalueX) + \" \" + (centervalueY) + \" \" + \"L\" + \" \" + (verLowvalue.X) + \" \" + (verLowvalue.Y) + \" \";\r\n else if (type == 'standardDeviation')\r\n eDirectionV = \"M\" + \" \" + (verCentervalue.X) + \" \" + (verCentervalue.Y) + \" \" + \"L\" + \" \" + (verLowvalue.X) + \" \" + (verLowvalue.Y) + \" \";\r\n if (!requireInvertedAxes)\r\n cDirectionV = !cap.visible ? \"\" : \"M\" + \" \" + (verLowvalue.X) + \" \" + (verLowvalue.Y) + \" \" + \"L\" + \" \" + (verLowCapX1) + \" \" + (verLowvalue.Y) + \" \" + \"M\" + \" \" + (verLowvalue.X) + \" \" + (verLowvalue.Y) + \" \" + \"L\" + \" \" + (verLowCapX2) + \" \" + (verLowvalue.Y) + \" \";\r\n else\r\n cDirectionV = !cap.visible ? \"\" : \"M\" + \" \" + (verLowvalue.X) + \" \" + (verLowvalue.Y) + \" \" + \"L\" + \" \" + (verLowvalue.X) + \" \" + (verLowCapX1) + \" \" + \"M\" + \" \" + (verLowvalue.X) + \" \" + (verLowvalue.Y) + \" \" + \"L\" + \" \" + (verLowvalue.X) + \" \" + (verLowCapX2) + \" \";\r\n var eDirection = eDirectionV, cDirection = cDirectionV;\r\n }\r\n if (mode == 'horizontal' || mode == 'both') {\r\n if (type != 'standardDeviation') //horizontal mode for both direction\r\n eDirectionH = \"M\" + \" \" + (centervalueX) + \" \" + (centervalueY) + \" \" + \"L\" + \" \" + (horLowvalue.X) + \" \" + (horLowvalue.Y) + \" \";\r\n else if (type == 'standardDeviation')\r\n eDirectionH = \"M\" + \" \" + (horCentervalue.X) + \" \" + (horCentervalue.Y) + \" \" + \"L\" + \" \" + (horLowvalue.X) + \" \" + (horLowvalue.Y) + \" \";\r\n if (!requireInvertedAxes)\r\n cDirectionH = !cap.visible ? \"\" : \"M\" + \" \" + (horLowvalue.X) + \" \" + (horLowvalue.Y) + \" \" + \"L\" + \" \" + (horLowvalue.X) + \" \" + (horLowCapY1) + \" \" + \"M\" + \" \" + (horLowvalue.X) + \" \" + (horLowvalue.Y) + \" \" + \"L\" + \" \" + (horLowvalue.X) + \" \" + (horLowCapY2) + \" \";\r\n else\r\n cDirectionH = !cap.visible ? \"\" : \"M\" + \" \" + (horLowvalue.X) + \" \" + (horLowvalue.Y) + \" \" + \"L\" + \" \" + (horLowCapY1) + \" \" + (horLowvalue.Y) + \" \" + \"M\" + \" \" + (horLowvalue.X) + \" \" + (horLowvalue.Y) + \" \" + \"L\" + \" \" + (horLowCapY2) + \" \" + (horLowvalue.Y) + \" \";\r\n eDirection = eDirectionH, cDirection = cDirectionH;\r\n }\r\n if (mode == 'both') {\r\n eDirectionH += eDirectionV, cDirectionH += cDirectionV;\r\n eDirection = eDirectionH, cDirection = cDirectionH;\r\n }\r\n }\r\n\r\n var errorBarOptions = { //error bar path creation\r\n 'id': chartobj.svgObject.id + '_ErrorBar' + '_' + seriesIndex + '_Point' + pointIndex,\r\n 'd': eDirection,\r\n 'stroke': fill,\r\n 'stroke-width': errorOptions.width,\r\n 'opacity': errorOptions.opacity\r\n };\r\n var errorBarCapOptions = { //error bar cap creation\r\n 'id': chartobj.svgObject.id + '_ErrorBarCap' + '_' + seriesIndex + '_Point' + pointIndex,\r\n 'd': cDirection,\r\n 'stroke': capFill,\r\n 'stroke-width': capWidth\r\n }\r\n //canvas rendering\r\n if (chartobj.model.enableCanvasRendering) {\r\n this.svgRenderer.ctx.rect(areaBounds.X, areaBounds.Y, areaBounds.Width, areaBounds.Height);\r\n this.svgRenderer.ctx.clip();\r\n chartobj.svgRenderer.drawPath(errorBarOptions, null); //To draw error bar for canvas\r\n chartobj.svgRenderer.drawPath(errorBarCapOptions, null); //To drae error bar cap for canvas\r\n }\r\n else { //svg rendering\r\n chartobj.svgRenderer.drawPath(errorBarOptions, errorBarPointGroup);\r\n chartobj.svgRenderer.drawPath(errorBarCapOptions, errorBarPointGroup);\r\n chartobj.svgRenderer.append(errorBarPointGroup, errorBarElement);\r\n }\r\n }\r\n }\r\n //append with series group\r\n chartobj.svgRenderer.append(errorBarElement, chartobj.gSeriesEle);\r\n //clip-path \r\n ej.EjSvgRender.utils._drawAxesBoundsClipPath(errorBarElement, currentseries, chartobj);\r\n },\r\n\r\n meanCalculation: function (mode, visiblePoints) {\r\n var temp = temp1 = 0, total, verTotal, horTotal, verMean, horMean, ded, i,\r\n eachDev, squareEachDev, squareTotal, verEachDev, horEachDev,\r\n verSquareEachDev, verSquareTotal, horSquareTotal, horSquareTotal,\r\n verStandardMean, horStandardMean, verStandSquareRoot,\r\n horStandSquareRoot, values, len = visiblePoints.length;\r\n for (i = 0; i < len; i++) {\r\n if (mode == 'vertical') { //vertical mode total calculation\r\n total = temp + visiblePoints[i].y;\r\n temp = total;\r\n }\r\n else if (mode == 'horizontal') { //horizontal mode total calculation \r\n total = temp1 + visiblePoints[i].xValue;\r\n temp1 = total;\r\n }\r\n else { //both mode total calculation\r\n verTotal = temp + visiblePoints[i].y;\r\n temp = verTotal;\r\n horTotal = temp1 + visiblePoints[i].xValue;\r\n temp1 = horTotal;\r\n }\r\n }\r\n verMean = temp / len;\r\n horMean = temp1 / len;\r\n ded = len - 1;\r\n for (i = 0; i < len; i++) {\r\n if (mode == 'vertical') {\r\n eachDev = visiblePoints[i].y - verMean;\r\n squareEachDev = Math.pow(eachDev, 2);\r\n squareTotal = temp + squareEachDev;\r\n temp = squareTotal;\r\n }\r\n else if (mode == 'horizontal') {\r\n eachDev = visiblePoints[i].xValue - horMean;\r\n squareEachDev = Math.pow(eachDev, 2);\r\n squareTotal = temp1 + squareEachDev;\r\n temp1 = squareTotal;\r\n }\r\n else {\r\n verEachDev = visiblePoints[i].y - verMean;\r\n verSquareEachDev = Math.pow(verEachDev, 2);\r\n verSquareTotal = temp + verSquareEachDev;\r\n temp = verSquareTotal;\r\n horEachDev = visiblePoints[i].xValue - horMean;\r\n horSquareEachDiv = Math.pow(horEachDev, 2);\r\n horSquareTotal = temp1 + horSquareEachDiv;\r\n temp1 = horSquareTotal;\r\n }\r\n }\r\n verStandardMean = temp / ded;\r\n verStandSquareRoot = Math.sqrt(verStandardMean);\r\n horStandardMean = temp1 / ded;\r\n horStandSquareRoot = Math.sqrt(horStandardMean);\r\n values = { verStandSquareRoot: verStandSquareRoot, horStandSquareRoot: horStandSquareRoot, verMean: verMean, horMean: horMean }\r\n return values;\r\n },\r\n renderCap: function (cap, mode, values, values1, requireInvertedAxes) {\r\n //declaration\r\n var canvasX, canvasY, capLen, verHighvalue,\r\n verLowvalue, horHighvalue, horLowvalue,\r\n verHighCapX1, verHighCapX2, verLowCapX1,\r\n verLowCapX2, horHighCapY1, horHighCapY2,\r\n horLowCapY1, horLowCapY2, capValues;\r\n canvasX = this.canvasX;\r\n canvasY = this.canvasY;\r\n capLen = cap.length / 2;\r\n if (mode == 'vertical' || mode == 'both') {\r\n verHighvalue = values.verHighvalue;\r\n verLowvalue = values.verLowvalue;\r\n }\r\n if (mode == 'horizontal' || mode == 'both') {\r\n horHighvalue = values1.horHighvalue;\r\n horLowvalue = values1.horLowvalue;\r\n }\r\n if (mode == 'vertical' || mode == 'both') {\r\n if (!requireInvertedAxes) {\r\n verHighCapX1 = verHighvalue.X + canvasX - capLen,\r\n verHighCapX2 = verHighvalue.X + canvasX + capLen,\r\n verLowCapX1 = verLowvalue.X + canvasX - capLen,\r\n verLowCapX2 = verLowvalue.X + canvasX + capLen;\r\n }\r\n else {\r\n verHighCapX1 = verHighvalue.Y + canvasY + capLen;\r\n verHighCapX2 = verHighvalue.Y + canvasY - capLen;\r\n verLowCapX1 = verLowvalue.Y + canvasY + capLen;\r\n verLowCapX2 = verLowvalue.Y + canvasY - capLen;\r\n }\r\n }\r\n if (mode == 'horizontal' || mode == 'both') {\r\n if (!requireInvertedAxes) {\r\n horHighCapY1 = horHighvalue.Y + canvasY - capLen,\r\n horHighCapY2 = horHighvalue.Y + canvasY + capLen,\r\n horLowCapY1 = horLowvalue.Y + canvasY - capLen,\r\n horLowCapY2 = horLowvalue.Y + canvasY + capLen;\r\n }\r\n else {\r\n horHighCapY1 = horHighvalue.X + canvasX + capLen;\r\n horHighCapY2 = horHighvalue.X + canvasX - capLen;\r\n horLowCapY1 = horLowvalue.X + canvasX + capLen;\r\n horLowCapY2 = horLowvalue.X + canvasX - capLen;\r\n }\r\n }\r\n capValues = { verHighCapX1: verHighCapX1, verHighCapX2: verHighCapX2, verLowCapX1: verLowCapX1, verLowCapX2: verLowCapX2, horHighCapY1: horHighCapY1, horHighCapY2: horHighCapY2, horLowCapY1: horLowCapY1, horLowCapY2: horLowCapY2 }\r\n return capValues;\r\n },\r\n\r\n drawDisplayText: function (series, options, params) {\r\n // method to draw text \r\n\r\n var chartObj = this;\r\n var point1;\r\n var type = options.type.toLowerCase();\r\n var areatype = chartObj.model.AreaType.toLowerCase();\r\n var regiontype = ej.seriesTypes[type].prototype.isRegion;\r\n var drawtype = options.drawType.toLowerCase();\r\n var pointMarker;\r\n var zoomed = false;\r\n var seriesIndex = $.inArray(options, chartObj.model._visibleSeries);\r\n if (ej.util.isNullOrUndefined(chartObj.model.regionCount))\r\n chartObj.model.regionCount = -1;\r\n\r\n var isCanvas = chartObj.model.enableCanvasRendering;\r\n var isPolar = chartObj.model.AreaType.toLowerCase() == 'polaraxes';\r\n var j = 0, stackingGroup = {}, length;\r\n for (length = chartObj.model.series.length; j < length; j++)\r\n stackingGroup[name = chartObj.model.series[j].stackingGroup] = { length: stackingGroup[name] ? stackingGroup[name].length + 1 : 1, seriesIndex: j }\r\n params.stackingGroup = stackingGroup;\r\n $.each(options._visiblePoints, function (pointIndex, point) {\r\n var type = chartObj.model.series[seriesIndex].type.toLowerCase();\r\n options._visiblePoints[pointIndex].textOptionsBoxValues = [];\r\n pointMarker = point.marker;\r\n if ((areatype == \"polaraxes\" && drawtype == \"column\") || regiontype || (drawtype == \"rangecolumn\"))\r\n point1 = type.toLowerCase() == \"boxandwhisker\" ? point.dataLabelLocation : point.symbolLocation;\r\n else\r\n point1 = (areatype != \"polaraxes\")\r\n ? ej.EjSvgRender.utils._getPoint(point, options) : ej.EjSvgRender.utils.TransformToVisible(options, point.xValue, point.y, chartObj)\r\n if (point.visible !== false && ((pointMarker && pointMarker.dataLabel && pointMarker.dataLabel.visible) || (!pointMarker || !pointMarker.dataLabel) && options.marker.dataLabel.visible)) {\r\n if (regiontype)\r\n chartObj.model.regionCount++;\r\n\r\n var type = chartObj.model.series[seriesIndex].type.toLowerCase();\r\n for (i = 0; i < chartObj.model._axes.length; i++) {\r\n if (chartObj.model._axes[i].zoomFactor < 1 || chartObj.model._axes[i].zoomPosition > 0) {\r\n zoomed = true;\r\n break;\r\n }\r\n }\r\n //we have reset the chartRegions array based on the zooming points for column and stackingColumn series only\r\n if ((chartObj.zoomed || options.xAxis._isScroll || zoomed) && (type == \"column\" || type == \"stackingcolumn\" || type == \"stackingcolumn100\")) {\r\n for (var i = 0; i < chartObj.model.chartRegions.length; i++) {\r\n if (seriesIndex == chartObj.model.chartRegions[i].SeriesIndex && pointIndex == chartObj.model.chartRegions[i].Region.PointIndex) {\r\n if (isCanvas && chartObj.model.AreaType == \"cartesianaxes\") {\r\n chartObj.svgRenderer.ctx.save();\r\n chartObj.svgRenderer.ctx.beginPath();\r\n if (!chartObj.model.requireInvertedAxes) // checked for bar and stackingbar\r\n chartObj.svgRenderer.ctx.rect(options.xAxis.x, options.yAxis.y, options.xAxis.width, options.yAxis.height);\r\n else\r\n chartObj.svgRenderer.ctx.rect(options.yAxis.x, options.xAxis.y, options.yAxis.width, options.xAxis.height);\r\n chartObj.svgRenderer.ctx.clip();\r\n series.drawDataLabel(options, pointIndex, point, point1.X, point1.Y, i, params);\r\n chartObj.svgRenderer.ctx.restore();\r\n }\r\n else\r\n series.drawDataLabel(options, pointIndex, point, point1.X, point1.Y, i, params);\r\n }\r\n }\r\n }\r\n else {\r\n if (isCanvas && chartObj.model.AreaType == \"cartesianaxes\") {\r\n chartObj.svgRenderer.ctx.save();\r\n chartObj.svgRenderer.ctx.beginPath();\r\n if (!chartObj.model.requireInvertedAxes) // checked for bar and stackingbar\r\n chartObj.svgRenderer.ctx.rect(options.xAxis.x, options.yAxis.y, options.xAxis.width, options.yAxis.height);\r\n else\r\n chartObj.svgRenderer.ctx.rect(options.yAxis.x, options.xAxis.y, options.yAxis.width, options.xAxis.height);\r\n chartObj.svgRenderer.ctx.clip();\r\n //Check regions for column type, bar type and waterfall series\r\n if (chartObj.model.chartRegions[chartObj.model.regionCount] || (type.indexOf('column') == -1 && type.indexOf('bar') == -1 && type.indexOf('waterfall') == -1)) {\r\n if (type.toLowerCase() == \"boxandwhisker\") {\r\n for (var box = 0; box < point1.length; box++) {\r\n point.y = point.boxPlotLocation[box].YValues;\r\n series.drawDataLabel(options, pointIndex, point, point1[box].X, point1[box].Y, chartObj.model.regionCount, params, point1[box].outlier);\r\n }\r\n }\r\n else\r\n series.drawDataLabel(options, pointIndex, point, point1.X, point1.Y, chartObj.model.regionCount, params);\r\n if (type == \"rangecolumn\" || type == \"rangearea\") {\r\n point.y = point.low;\r\n series.drawDataLabel(options, pointIndex, point, point1.X, point1.Y, chartObj.model.regionCount, params);\r\n point.y = point.high;\r\n }\r\n }\r\n chartObj.svgRenderer.ctx.restore();\r\n }\r\n else {\r\n if (isCanvas && isPolar) {\r\n chartObj.svgRenderer.ctx.save();\r\n chartObj.svgRenderer.ctx.beginPath();\r\n chartObj.svgRenderer.ctx.arc(chartObj.model.centerX, chartObj.model.centerY, chartObj.model.Radius, 0, 2 * Math.PI, false);\r\n chartObj.svgRenderer.ctx.clip();\r\n point1.X -= chartObj.canvasX;\r\n point1.Y -= chartObj.canvasY;\r\n }\r\n if ((type == \"column\" || type == \"stackingcolumn\" || type == \"stackingcolumn100\")) {\r\n if (chartObj.model.chartRegions[chartObj.model.regionCount])\r\n series.drawDataLabel(options, pointIndex, point, point1.X, point1.Y, chartObj.model.regionCount, params);\r\n }\r\n else {\r\n if (type.toLowerCase() == \"boxandwhisker\") {\r\n for (var box = 0; box < point1.length; box++) {\r\n point.y = point.boxPlotLocation[box].YValues;\r\n series.drawDataLabel(options, pointIndex, point, point1[box].X, point1[box].Y, chartObj.model.regionCount, params, point1[box].outlier);\r\n }\r\n }\r\n else\r\n series.drawDataLabel(options, pointIndex, point, point1.X, point1.Y, chartObj.model.regionCount, params);\r\n }\r\n if (type == \"rangecolumn\" || type == \"rangearea\") {\r\n point.y = point.low;\r\n series.drawDataLabel(options, pointIndex, point, point1.X, point1.Y, chartObj.model.regionCount, params);\r\n point.y = point.high;\r\n }\r\n if (isCanvas && isPolar)\r\n chartObj.svgRenderer.ctx.restore();\r\n }\r\n }\r\n }\r\n });\r\n },\r\n\r\n // method to avoid collision between data labels \r\n cartesianSmartLabels: function (currentSeries, points, seriesIndex) {\r\n // declaration\r\n var length = points.length;\r\n var count = 0;\r\n this.connectorFlag = false;\r\n this.processCount = 1;\r\n this.posObj = {\r\n top: [], rightTop: [],\r\n left: [], leftTop: [],\r\n right: [], rightTop: [],\r\n rightBottom: [], leftBottom: [],\r\n bottom: []\r\n };\r\n var markerWidth, markerHeight, i, d, c, currentPoint, location,\r\n ele, leftValue, topValue, regionType, type;\r\n // loop to store marker region\r\n for (d = 0; d < this.model.series.length; d++) {\r\n markerWidth = this.model.series[d].marker.size.width;\r\n markerHeight = this.model.series[d].marker.size.height;\r\n type = this.model.series[d].type.toLowerCase();\r\n regionType = ej.seriesTypes[type].prototype.isRegion;\r\n if (this.model.series[d].visibility != \"hidden\" && this.model.series[d].marker.visible && !regionType) {\r\n for (c = 0; c < this.model.series[d]._visiblePoints.length; c++) {\r\n currentPoint = this.model.series[d]._visiblePoints[c];\r\n location = currentPoint.location;\r\n this.model.markerRegion[this.model.markerRegion.length] = { seriesIndex: d, xPos: location.X + this.canvasX, yPos: location.Y + this.canvasY, width: markerWidth, height: markerHeight };\r\n }\r\n }\r\n }\r\n\r\n var currentPoint, j, padding = 10, diff;\r\n var areaBounds = this.model.m_AreaBounds;\r\n var width, height, xPos, yPos;\r\n for (j = 0; j < length; j++) { // to reposition the partially visible data labels\r\n currentPoint = points[j];\r\n currentPoint.hide = false;\r\n xPos = currentPoint.xPos; yPos = currentPoint.yPos;\r\n width = currentPoint.width; height = currentPoint.height;\r\n if (xPos - width / 2 < 0 && xPos > -width / 2) {\r\n diff = xPos - width / 2;\r\n currentPoint.textOptions.x = currentPoint.xPos = xPos + Math.abs(diff) + 10;\r\n currentPoint.newConnectorFlag = true;\r\n }\r\n if (xPos + width / 2 > areaBounds.Width && xPos + width / 2 < areaBounds.Width + width / 2) {\r\n diff = xPos - width / 2;\r\n currentPoint.textOptions.x = currentPoint.xPos = areaBounds.Width - width / 2 - 10;\r\n currentPoint.newConnectorFlag = true;\r\n }\r\n if (yPos + width / 2 > areaBounds.Height && yPos + height / 2 < areaBounds.Height + height / 2) {\r\n diff = yPos + height / 2 - areaBounds.Height;\r\n currentPoint.yPos = yPos - diff - 10;\r\n currentPoint.textOptions.y = currentPoint.yPos + 5;\r\n currentPoint.newConnectorFlag = true;\r\n }\r\n if (yPos - height / 2 < 0 && yPos > -height / 2) {\r\n diff = yPos - height / 2;\r\n currentPoint.yPos = currentPoint.yPos + Math.abs(diff) + 10;\r\n currentPoint.textOptions.y = currentPoint.yPos + 5;\r\n currentPoint.newConnectorFlag = true;\r\n }\r\n }\r\n\r\n // loop to compare the points\r\n for (i = 0; i < length; i++) {\r\n if (!ej.util.isNullOrUndefined(points[i].yPos))\r\n this.model.allPoints[this.model.allPoints.length] = points[i];\r\n else\r\n continue;\r\n this.connectorFlag = false;\r\n this.compareDataLabels(i, points, count, this.processCount);\r\n currentPoint = points[i];\r\n currentPoint.connectorFlag = this.connectorFlag; // flag to draw connector lines\r\n if (points[i].dataLabeltemplate) { // for repositioning data label template\r\n ele = $(\"#\" + points[i].id);\r\n leftValue = points[i].xPos;\r\n topValue = !this.model.enableCanvasRendering ? points[i].yPos : points[i].yPos + this.model.m_AreaBounds.Y;\r\n ele.css(\"left\", leftValue).css(\"top\", topValue);\r\n if (this.model.AreaType == \"cartesianaxes\") { // to avoid template rendering outside area bounds\r\n areaBounds = this.model.m_AreaBounds;\r\n xPosition = areaBounds.X + (this.model.requireInvertedAxes ? currentSeries.yAxis.plotOffset : currentSeries.xAxis.plotOffset);\r\n yPosition = currentSeries.yAxis.y;\r\n width = points[i].width;\r\n height = points[i].height;\r\n if ((leftValue > xPosition + areaBounds.Width || leftValue + width < xPosition || topValue + height < yPosition || topValue + height > areaBounds.Y + areaBounds.Height) ||\r\n (this.zoomed && (leftValue < xPosition || topValue < yPosition || leftValue > xPosition + areaBounds.Width || topValue > yPosition + areaBounds.Height)))\r\n ele.remove();\r\n }\r\n }\r\n // to store data label position for furture processing\r\n this.storeDataLabelPositions(currentPoint);\r\n\r\n }\r\n },\r\n\r\n storeDataLabelPositions: function (currentPoint) {\r\n var position = currentPoint.position;\r\n var posObj = this.posObj;\r\n switch (position) {\r\n case \"top\":\r\n posObj.top[this.processCount - 1] = currentPoint;\r\n this.processCount = 1;\r\n break;\r\n case \"rightTop\":\r\n posObj.rightTop[this.processCount - 1] = currentPoint;\r\n this.processCount = 1;\r\n break;\r\n case \"right\":\r\n posObj.right[this.processCount - 1] = currentPoint;\r\n this.processCount = 1;\r\n break;\r\n case \"rightBottom\":\r\n posObj.rightBottom[this.processCount - 1] = currentPoint;\r\n this.processCount = 1;\r\n break\r\n case \"bottom\":\r\n posObj.bottom[this.processCount - 1] = currentPoint;\r\n this.processCount = 1;\r\n break;\r\n case \"left\":\r\n posObj.left[this.processCount - 1] = currentPoint;\r\n this.processCount = 1;\r\n break;\r\n case \"leftBottom\":\r\n posObj.leftBottom[this.processCount - 1] = currentPoint;\r\n this.processCount = 1;\r\n break;\r\n case \"leftTop\":\r\n posObj.leftTop[this.processCount - 1] = currentPoint;\r\n break;\r\n }\r\n },\r\n\r\n // method to avoid collision between data labels - column series type\r\n cartesianColumnSmartLabels: function (currentSeries, points, seriesIndex) {\r\n var length = points.length, left, top, right;\r\n var count = 0;\r\n this.connectorFlag = false;\r\n this.processCount = 1;\r\n var i, currentPoint, ele;\r\n this.model.outsideLabels = [];\r\n // loop to compare the points\r\n for (i = 0; i < length; i++) {\r\n if (!ej.util.isNullOrUndefined(points[i].yPos) && !isNaN(points[i].yPos))\r\n this.model.allPoints[this.model.allPoints.length] = points[i];\r\n else\r\n continue;\r\n if (currentSeries._enableSmartLabels) {\r\n this.connectorFlag = false;\r\n this.compareColumnDataLabels(currentSeries, i, points, count, this.processCount);\r\n }\r\n currentPoint = currentSeries._visiblePoints[i];\r\n if (points[i].dataLabeltemplate) {\r\n ele = $(\"#\" + points[i].id);\r\n ele.css(\"left\", points[i].xPos).css(\"top\", points[i].yPos);\r\n left = points[i].xPos, top = points[i].yPos;\r\n points.height = ele.outerHeight(); var areaBoundsX = this.model.m_AreaBounds.X;\r\n var areaBoundsY = this.model.m_AreaBounds.Y;\r\n var areaBoundsWidth = this.model.m_AreaBounds.Width;\r\n var areaBoundsHeight = this.model.m_AreaBounds.Height;\r\n points.width = ele.outerWidth(); width = ele.width() / 2;\r\n height = ele.height();\r\n var topHeight, leftWidth, rightWidth;\r\n topHeight = leftWidth = rightWidth = 0;\r\n var bottomHeight = 0, areaBound = this.model.m_AreaBounds;\r\n xPosition = areaBound.X + (this.model.requireInvertedAxes ? currentSeries.yAxis.plotOffset : currentSeries.xAxis.plotOffset);\r\n yPosition = currentSeries.yAxis.y; right = left - width;\r\n if (currentSeries.marker.dataLabel.showEdgeLabels) {\r\n if ((left > xPosition + areaBound.Width || top + height > areaBound.Y + areaBound.Height) || ((left < xPosition || top < yPosition || left > xPosition + areaBound.Width || top > yPosition + areaBound.Height || right > areaBound.Width + areaBound.X))) {\r\n width = ele.outerWidth();\r\n if (left < areaBoundsX) {\r\n leftWidth = areaBoundsX - left;\r\n }\r\n if (areaBoundsHeight + areaBoundsY < top + height) {\r\n var excessHeight = (top + height) - (areaBoundsHeight + areaBoundsY);\r\n bottomHeight = height - excessHeight;\r\n }\r\n if (top < areaBoundsY) {\r\n topHeight = areaBoundsY - top;\r\n }\r\n if (areaBoundsWidth + areaBoundsX < left + width) {\r\n var excessWidth = (left + width) - (areaBoundsWidth + areaBoundsX);\r\n rightWidth = width - excessWidth;\r\n }\r\n rightWidth = (rightWidth == 0) ? width : rightWidth;\r\n bottomHeight = (bottomHeight == 0) ? height : bottomHeight;\r\n document.getElementById(ele[0].id).style.clip = \"rect(\" + topHeight + \"px,\" +\r\n rightWidth + \"px,\" +\r\n bottomHeight + \"px,\" +\r\n leftWidth + \"px)\";\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n\r\n compareColumnDataLabels: function (currentSeries, i, points, count, processCount) {\r\n var length = this.model.allPoints.length - 1, areaBounds = this.model.m_AreaBounds, isOutside;\r\n var prevLabel, currentLabel, padding, enableContrastColor = currentSeries.marker.dataLabel.enableContrastColor,\r\n contrastColorRegion = [];\r\n var type = currentSeries.type.toLowerCase();\r\n var seriesType = new ej.seriesTypes[currentSeries.type.toLowerCase()](); this.firstPoints = [];\r\n for (var j = 0; j < length; j++) {\r\n prevLabel = this.model.allPoints[j];\r\n currentLabel = this.model.allPoints[this.model.allPoints.length - 1];\r\n this.currentCollideLabel = prevLabel;\r\n padding = 5;\r\n collide = this.isCollide(prevLabel, currentLabel);\r\n textPosition = currentSeries.marker.dataLabel.textPosition.toLowerCase(),\r\n dataLabel = currentSeries.marker.dataLabel;\r\n if (collide.state) {\r\n // for vertical orientation series types\r\n if (type == \"column\" || type == \"stackingcolumn\" || type == \"rangecolumn\" || type == \"waterfall\") {\r\n if (dataLabel.showEdgeLabels)\r\n currentLabel.textOptions.y = currentLabel.yPos = currentLabel.yPos + collide.height + padding;\r\n else {\r\n if (textPosition == \"top\" || textPosition == \"middle\")\r\n currentLabel.textOptions.y = currentLabel.yPos = currentLabel.yPos + collide.height + padding;\r\n else\r\n currentLabel.textOptions.y = currentLabel.yPos = currentLabel.yPos - collide.height - padding;\r\n }\r\n currentLabel.textOptions.y = currentLabel.textOptions.y + padding + currentLabel.margin.top / 2 - currentLabel.margin.bottom / 2;\r\n } else {\r\n // for horizontal orientation series types\r\n if (textPosition == \"top\" || textPosition == \"middle\")\r\n currentLabel.textOptions.x = currentLabel.xPos = prevLabel.xPos - prevLabel.width / 2 - currentLabel.width / 2 - padding;\r\n else\r\n currentLabel.textOptions.x = currentLabel.xPos = prevLabel.xPos + prevLabel.width / 2 + currentLabel.width / 2 + padding;\r\n }\r\n this.compareColumnDataLabels(currentSeries, i, points, count, this.processCount); // to call recursive\r\n isOutside = this.checkOutsideLabels(this.model, currentLabel, areaBounds);\r\n for (a = 0; a < this.model.allPoints.length; a++) {\r\n if (a == 0)\r\n this.firstPoints.push(this.model.allPoints[0])\r\n else {\r\n if (this.firstPoints[this.firstPoints.length - 1].x != this.model.allPoints[a].x)\r\n this.firstPoints.push(this.model.allPoints[a]);\r\n }\r\n }\r\n if (isOutside || this.zoomed) {\r\n for (l = 0; l <= this.model.allPoints.length - 1; l++) {\r\n this._positionOutsideLabels(currentLabel, this.model.allPoints, l, type);\r\n }\r\n this.model.outsideLabels.push(currentLabel);\r\n\r\n }\r\n if (enableContrastColor && (type.indexOf(\"stacking\") > -1)) {\r\n var region = this.model.chartRegions;\r\n for (a = 0; a < this.model.chartRegions.length; a++) {\r\n if (region[a].Region.PointIndex == i)\r\n collide = this.isCollide(region[a], currentLabel, 0, enableContrastColor, this);\r\n if (collide.state)\r\n contrastColorRegion.push(region[a]);\r\n }\r\n if (contrastColorRegion.length > 5)\r\n break;\r\n else if (contrastColorRegion.length >= 1) {\r\n pointColor = jQuery.type(this.model.seriesColors[contrastColorRegion[0].SeriesIndex]) == \"array\" ?\r\n this.model.seriesColors[contrastColorRegion[0].SeriesIndex][0].color : this.model.seriesColors[contrastColorRegion[0].SeriesIndex];\r\n currentLabel.textOptions.fill = seriesType._applySaturation(this, pointColor);\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n //to reposition the outside labels in column type series \r\n\r\n _positionOutsideLabels: function (currentLabel, points, k, type) {\r\n\r\n prevLabel = points[k];\r\n var padding = 5;\r\n if (k == 0) {\r\n if (type && (type == \"column\" || type == \"stackingcolumn\" || type == \"rangecolumn\" || type == \"waterfall\")) {\r\n if (this.model.outsideLabels.length > 0 && currentLabel.x == this.model.outsideLabels[this.model.outsideLabels.length - 1].x)\r\n currentLabel.textOptions.y = currentLabel.yPos = this.model.outsideLabels[this.model.outsideLabels.length - 1].yPos - collide.height;\r\n else {\r\n for (k = 0; k < this.firstPoints.length; k++) {\r\n if (currentLabel.x == this.firstPoints[k].x)\r\n currentLabel.textOptions.y = currentLabel.yPos = this.firstPoints[k].yPos - collide.height;\r\n }\r\n }\r\n currentLabel.textOptions.y = currentLabel.textOptions.y + padding + currentLabel.margin.top / 2 - currentLabel.margin.bottom / 2;\r\n }\r\n else\r\n currentLabel.textOptions.x = currentLabel.xPos = this.model.outsideLabels.length > 0 ? this.model.outsideLabels[this.model.outsideLabels.length - 1].xPos : points[0].xPos + prevLabel.width / 2 + currentLabel.width / 2 + padding;\r\n }\r\n collide = this.isCollide(prevLabel, currentLabel);\r\n if (collide.state) {\r\n if (type == \"column\" || type == \"stackingcolumn\" || type == \"rangecolumn\" || type == \"waterfall\") {\r\n currentLabel.textOptions.y = currentLabel.yPos = currentLabel.yPos - collide.height - padding;\r\n currentLabel.textOptions.y = currentLabel.textOptions.y + padding + currentLabel.margin.top / 2 - currentLabel.margin.bottom / 2;\r\n }\r\n else\r\n currentLabel.textOptions.x = currentLabel.xPos = currentLabel.xPos + prevLabel.width / 2 + currentLabel.width / 2 + padding;\r\n }\r\n\r\n },\r\n\r\n // method to comapare data labels and place without collision\r\n compareDataLabels: function (i, points, count, processCount) {\r\n var length = this.model.allPoints.length, areaBounds = this.model.m_AreaBounds, isOutside;\r\n var j, padding, prevLabel, currentLabel, collide, checkCollide, type, isColumn;\r\n var posObj = this.posObj; this.breakLoop = false;\r\n for (j = 0; j < length; j++) {\r\n type = this.model.series[this.model.allPoints[j].seriesIndex].type.toLowerCase();\r\n prevLabel = this.model.allPoints[j];\r\n currentLabel = this.model.allPoints[length - 1];\r\n this.currentCollideLabel = prevLabel;\r\n padding = 10;\r\n collide = this.isCollide(prevLabel, currentLabel, j);\r\n if (collide.state || collide.marker) {\r\n this.connectorFlag = true;\r\n switch (count) {\r\n case 0: // top\r\n if (this.processCount > 1) this.resetValues(currentLabel);\r\n if (!collide.marker) {\r\n if (!ej.util.isNullOrUndefined(this.prevLabel)) {\r\n checkCollide = this.isCollide(this.prevLabel, currentLabel);\r\n if (!checkCollide.state) { this.prevLabel = prevLabel; this.processCount = 1; };\r\n } else {\r\n this.prevLabel = prevLabel;\r\n this.processCount = 1;\r\n }\r\n }\r\n else {\r\n this.prevLabel = collide.markerRegion;\r\n this.processCount = 1;\r\n }\r\n // right\r\n this.resetValues(currentLabel);\r\n if (processCount > 1 && posObj.right[this.processCount - 2]) {\r\n prevLabel = posObj.right[this.processCount - 2];\r\n currentLabel.textOptions.x = currentLabel.xPos = prevLabel.xPos + (prevLabel.width / 2 + currentLabel.width / 2 + padding);\r\n }\r\n else\r\n currentLabel.textOptions.x = currentLabel.xPos = this.prevLabel.xPos + (this.prevLabel.width / 2 + currentLabel.width / 2 + padding);\r\n\r\n count += 1;\r\n currentLabel.position = \"right\";\r\n if (this.breakLoop)\r\n break;\r\n else {\r\n isOutside = this.checkOutsideLabels(this.model, currentLabel, areaBounds);\r\n if (!isOutside) {\r\n this.compareDataLabels(i, points, count, this.processCount);\r\n break;\r\n }\r\n }\r\n case 1:\r\n // right bottom\r\n this.resetValues(currentLabel);\r\n currentLabel.textOptions.x = currentLabel.xPos = this.prevLabel.xPos + this.prevLabel.width / 2 + currentLabel.width / 2 + padding;\r\n if (processCount > 1 && posObj.rightBottom[this.processCount - 2]) {\r\n prevLabel = posObj.rightBottom[this.processCount - 2];\r\n currentLabel.textOptions.y = currentLabel.yPos = prevLabel.yPos + this.canvasY + prevLabel.height + padding;\r\n }\r\n else\r\n currentLabel.textOptions.y = currentLabel.yPos = currentLabel.location.Y + this.canvasY + currentLabel.height + padding / 2;\r\n currentLabel.textOptions.y = currentLabel.textOptions.y + padding / 2 + currentLabel.margin.top / 2 - currentLabel.margin.bottom / 2;\r\n currentLabel.position = \"rightBottom\";\r\n count += 1;\r\n if (this.breakLoop)\r\n break;\r\n else {\r\n isOutside = this.checkOutsideLabels(this.model, currentLabel, areaBounds);\r\n if (!isOutside) {\r\n this.compareDataLabels(i, points, count, this.processCount);\r\n break;\r\n }\r\n }\r\n case 2:\r\n\r\n // bottom\r\n this.resetValues(currentLabel);\r\n currentLabel.textOptions.y = currentLabel.yPos = currentLabel.location.Y + this.canvasY + currentLabel.height + padding / 2;\r\n if (processCount > 1 && posObj.bottom[this.processCount - 2]) {\r\n prevLabel = posObj.bottom[this.processCount - 2];\r\n currentLabel.textOptions.y = currentLabel.yPos = prevLabel.yPos + currentLabel.height + padding;\r\n }\r\n else\r\n currentLabel.textOptions.y = currentLabel.yPos = currentLabel.location.Y + this.canvasY + currentLabel.height + padding / 2;\r\n currentLabel.textOptions.y = currentLabel.textOptions.y + padding / 2 + currentLabel.margin.top / 2 - currentLabel.margin.bottom / 2;\r\n currentLabel.position = \"bottom\";\r\n count += 1;\r\n if (this.breakLoop)\r\n break;\r\n else {\r\n isOutside = this.checkOutsideLabels(this.model, currentLabel, areaBounds);\r\n if (!isOutside) {\r\n this.compareDataLabels(i, points, count, this.processCount);\r\n break;\r\n }\r\n }\r\n case 3:\r\n // left bottom\r\n this.resetValues(currentLabel);\r\n currentLabel.textOptions.x = currentLabel.xPos = this.prevLabel.xPos - this.prevLabel.width / 2 - currentLabel.width / 2 - padding;\r\n if (processCount > 1 && posObj.leftBottom[this.processCount - 2]) {\r\n prevLabel = posObj.leftBottom[this.processCount - 2];\r\n currentLabel.textOptions.y = currentLabel.yPos = prevLabel.yPos + this.canvasY + prevLabel.height + padding;\r\n }\r\n else\r\n currentLabel.textOptions.y = currentLabel.yPos = currentLabel.location.Y + this.canvasY + currentLabel.height + padding / 2;\r\n currentLabel.textOptions.y = currentLabel.textOptions.y + padding / 2 + currentLabel.margin.top / 2 - currentLabel.margin.bottom / 2;\r\n currentLabel.position = \"leftBottom\";\r\n count += 1;\r\n if (this.breakLoop)\r\n break;\r\n else {\r\n isOutside = this.checkOutsideLabels(this.model, currentLabel, areaBounds);\r\n if (!isOutside) {\r\n this.compareDataLabels(i, points, count, this.processCount);\r\n break;\r\n }\r\n }\r\n case 4:\r\n // left\r\n this.resetValues(currentLabel);\r\n if (processCount > 1 && posObj.left[this.processCount - 2]) {\r\n prevLabel = posObj.left[this.processCount - 2];\r\n currentLabel.textOptions.x = currentLabel.xPos = (prevLabel.xPos - prevLabel.width / 2 - currentLabel.width / 2 - padding);\r\n }\r\n else\r\n currentLabel.textOptions.x = currentLabel.xPos = (this.prevLabel.xPos - this.prevLabel.width / 2 - currentLabel.width / 2 - padding);\r\n\r\n currentLabel.position = \"left\";\r\n count += 1;\r\n if (this.breakLoop)\r\n break;\r\n else {\r\n isOutside = this.checkOutsideLabels(this.model, currentLabel, areaBounds);\r\n if (!isOutside) {\r\n this.compareDataLabels(i, points, count, this.processCount);\r\n break;\r\n }\r\n }\r\n case 5:\r\n // left top\r\n this.resetValues(currentLabel);\r\n currentLabel.textOptions.x = currentLabel.xPos = this.prevLabel.xPos - this.prevLabel.width / 2 - currentLabel.width / 2 - padding;\r\n if (processCount > 1 && posObj.leftTop[this.processCount - 2]) {\r\n prevLabel = posObj.leftTop[this.processCount - 2];\r\n currentLabel.textOptions.y = currentLabel.yPos = (prevLabel.yPos) - (currentLabel.height + padding);\r\n }\r\n else\r\n currentLabel.textOptions.y = currentLabel.yPos = this.prevLabel.yPos - currentLabel.height - padding;\r\n currentLabel.textOptions.y = currentLabel.textOptions.y + padding / 2 + currentLabel.margin.top / 2 - currentLabel.margin.bottom / 2;\r\n currentLabel.position = \"leftTop\";\r\n count += 1;\r\n if (this.breakLoop)\r\n break;\r\n else {\r\n isOutside = this.checkOutsideLabels(this.model, currentLabel, areaBounds);\r\n if (!isOutside) {\r\n this.compareDataLabels(i, points, count, this.processCount);\r\n break;\r\n }\r\n }\r\n case 6:\r\n //top\r\n\r\n this.resetValues(currentLabel);\r\n if (processCount > 1 && posObj.top[processCount - 2]) {\r\n prevLabel = posObj.top[processCount - 2];\r\n currentLabel.textOptions.y = currentLabel.yPos = (prevLabel.yPos) - (currentLabel.height + padding);\r\n }\r\n else\r\n currentLabel.textOptions.y = currentLabel.yPos = (this.prevLabel.yPos) - (this.processCount * (currentLabel.height + padding));\r\n currentLabel.textOptions.y = currentLabel.textOptions.y + padding / 2 + currentLabel.margin.top / 2 - currentLabel.margin.bottom / 2;\r\n count += 1;\r\n currentLabel.position = \"top\";\r\n if (this.breakLoop)\r\n break;\r\n else {\r\n isOutside = this.checkOutsideLabels(this.model, currentLabel, areaBounds);\r\n if (!isOutside) {\r\n this.compareDataLabels(i, points, count, this.processCount);\r\n break;\r\n }\r\n }\r\n case 7:\r\n // right top\r\n this.resetValues(currentLabel);\r\n currentLabel.textOptions.x = currentLabel.xPos = this.prevLabel.xPos + this.prevLabel.width / 2 + currentLabel.width / 2 + padding;\r\n if (processCount > 1 && posObj.rightTop[this.processCount - 2]) {\r\n prevLabel = posObj.rightTop[this.processCount - 2];\r\n currentLabel.textOptions.y = currentLabel.yPos = prevLabel.yPos - currentLabel.height - padding;\r\n }\r\n else\r\n currentLabel.textOptions.y = currentLabel.yPos = this.prevLabel.yPos - currentLabel.height - padding;\r\n currentLabel.textOptions.y = currentLabel.textOptions.y + padding / 2 + currentLabel.margin.top / 2 - currentLabel.margin.bottom / 2;\r\n currentLabel.position = \"rightTop\";\r\n count += 1;\r\n if (this.breakLoop)\r\n break;\r\n else {\r\n isOutside = this.checkOutsideLabels(this.model, currentLabel, areaBounds);\r\n if (!isOutside) {\r\n this.compareDataLabels(i, points, count, this.processCount);\r\n break;\r\n }\r\n }\r\n case 8:\r\n\r\n count = 0;\r\n this.processCount += 1;\r\n if (i == this.processCount)\r\n count = 9;\r\n else {\r\n isOutside = this.checkOutsideLabels(this.model, currentLabel, areaBounds);\r\n if (!isOutside) {\r\n this.compareDataLabels(i, points, count, this.processCount);\r\n break;\r\n }\r\n }\r\n case 9:\r\n // to skip the labelplacement when reaching outside the chart Area\r\n if (i == this.processCount || this.processCount > length) {\r\n this.processCount -= 1;\r\n count = count < 0 || count == 8 ? 0 : count - 1;\r\n this.breakLoop = true;\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n checkOutsideLabels: function (model, currentPoint, areaBounds) {\r\n var isCanvas = model.enableCanvasRendering, isTemplate = currentPoint.dataLabeltemplate, height, width;\r\n if (model.series[currentPoint.seriesIndex].marker.dataLabel.showEdgeLabels) {\r\n currentPointXPos = isCanvas ? currentPoint.xPos - this.canvasX : currentPoint.xPos;\r\n currentPointYPos = isCanvas ? currentPoint.yPos - this.canvasY : currentPoint.yPos;\r\n height = isTemplate ? areaBounds.Height + areaBounds.Y : areaBounds.Height;\r\n width = isTemplate ? areaBounds.Width + areaBounds.X : areaBounds.width;\r\n if ((currentPointXPos - currentPoint.width / 2 < 0) || (currentPointXPos + currentPoint.width / 2 > width) ||\r\n (currentPointYPos + currentPoint.height / 2 > height) || (currentPointYPos - currentPoint.height / 2 < 0))\r\n return true;\r\n }\r\n },\r\n\r\n //to draw connector lines for pieofpie series\r\n drawPieofPieConnectors: function (size, series) {\r\n //if (series.connectorLine.width > 0) {\r\n var visibility = (series.enableAnimation && !series._animatedSeries) ? 'hidden' : 'visible';\r\n if (!this.model.enableCanvasRendering) {\r\n if (!this.gConnectorLinesGroup)\r\n this.gConnectorLinesGroup = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_connectorLineGroup', 'visibility': visibility });\r\n else (this.gConnectorLinesGroup.childNodes.length > 0)\r\n $(this.gConnectorLinesGroup.childNodes).remove();\r\n }\r\n var radius = [], startX = [], startY = [], loc = [],\r\n chartStartAngle = -.5 * Math.PI, coefficient, pieCollections;\r\n for (var j = 0; j < 2; j++) {\r\n pieCollections = series.pieCollections[j];\r\n coefficient = j == 0 ? series.pieCoefficient : series.pieOfPieCoefficient;\r\n radius[j] = 0.25 * coefficient * Math.min(size.width, size.height);\r\n startX[j] = this.model.circleCenterX[j];\r\n startX[j] = (j == 0) ? startX[j] + this.model.pieGapWidth / 2 : startX[j] - this.model.pieGapWidth / 2;\r\n startY[j] = this.model.circleCenterY[j];\r\n if (pieCollections[0].start > 0 && pieCollections[0].end < Math.PI && j == 0) {\r\n var startAngle = pieCollections[0].start + chartStartAngle,\r\n endAngle = pieCollections[0].end + chartStartAngle - 0.000001;\r\n var x1 = startX[j] + radius[j] * Math.cos(startAngle),\r\n y1 = startY[j] + radius[j] * Math.sin(startAngle),\r\n x2 = startX[j] + radius[j] * Math.cos(endAngle),\r\n y2 = startY[j] + radius[j] * Math.sin(endAngle);\r\n }\r\n else {\r\n x1 = startX[j] + radius[j] * Math.cos(chartStartAngle),\r\n y1 = startY[j] + radius[j] * Math.sin(chartStartAngle),\r\n x2 = x1,\r\n y2 = y1 + radius[j] * 2;\r\n }\r\n loc.push({ X1: x1, Y1: y1, X2: x2, Y2: y2 });\r\n }\r\n var pieConnectorLines = series.connectorLine;\r\n for (var k = 0; k < 2; k++) {\r\n var lineOptions = {\r\n 'id': this.svgObject.id + '_connectorLine' + k,\r\n 'x1': k == 0 ? loc[k].X1 : loc[k - 1].X2,\r\n 'y1': k == 0 ? loc[k].Y1 : loc[k - 1].Y2,\r\n 'x2': k == 0 ? loc[k + 1].X1 : loc[k].X2,\r\n 'y2': k == 0 ? loc[k + 1].Y1 : loc[k].Y2,\r\n 'stroke': pieConnectorLines.color,\r\n 'stroke-width': pieConnectorLines.width,\r\n 'opacity': pieConnectorLines.opacity,\r\n 'stroke-dasharray': pieConnectorLines.dashArray\r\n };\r\n this.svgRenderer.drawLine(lineOptions, this.gConnectorLinesGroup);\r\n }\r\n this.svgRenderer.append(this.gConnectorLinesGroup, this.gSeriesEle);\r\n },\r\n // method to draw connector lines for data labels in cartesian axis\r\n drawConnectorLines: function (seriesIndex, index, currentPoint) {\r\n var bottom = false;\r\n var drawConnectorLine = true;\r\n var xPos = currentPoint.xPos;\r\n var yPos = currentPoint.yPos;\r\n var areaBounds = this.model.m_AreaBounds;\r\n var dataLabel = this.model.series[seriesIndex].marker.dataLabel;\r\n var location = currentPoint.location ? currentPoint.location : currentPoint.symbolLocation;\r\n if (location.Y > currentPoint.textOptions.y)\r\n var endY = (currentPoint.textOptions.y); // top\r\n else {\r\n bottom = true\r\n endY = (currentPoint.textOptions.y - currentPoint.height / 2); // bottom\r\n }\r\n if (currentPoint.dataLabeltemplate) { // for template\r\n endY = currentPoint.yPos - this.model.m_AreaBounds.Y + currentPoint.height;\r\n currentPoint.textOptions.x = currentPoint.textOptions.x - this.model.m_AreaBounds.X + currentPoint.width / 4 + this.canvasX;\r\n } else if ((xPos > areaBounds.Width || (xPos + currentPoint.width) < 0 ||\r\n yPos - currentPoint.height > areaBounds.Height || yPos + currentPoint.height < 0) && !dataLabel.showEdgeLabels)\r\n drawConnectorLine = false;\r\n if (drawConnectorLine) {\r\n var connectorDirection = \"M\" + \" \" + (location.X + this.canvasX) + \" \" + (location.Y + this.canvasY) + \" \" + \"L\" + \" \" + (currentPoint.textOptions.x) + \" \" + (endY);\r\n var connectorLineValues = this.model.series[seriesIndex].marker.dataLabel.connectorLine;\r\n var stroke = !ej.util.isNullOrUndefined(connectorLineValues.color) ? connectorLineValues.color : this.model.series[seriesIndex].fill;\r\n var connectorOptions = {\r\n 'id': this.svgObject.id + \"_dataLabelConnectorLine_series\" + seriesIndex + \"_\" + index,\r\n 'stroke': stroke,\r\n 'stroke-width': connectorLineValues.width,\r\n 'd': connectorDirection\r\n };\r\n this.model.series[seriesIndex].connectorLines = true;\r\n this.svgRenderer.drawPath(connectorOptions, this.gConnectorEle[seriesIndex]);\r\n }\r\n },\r\n\r\n // to reset the data label values back \r\n resetValues: function (currentPoint) {\r\n currentPoint.textOptions.y = currentPoint.dataLabel.textY;\r\n currentPoint.yPos = currentPoint.dataLabel.y;\r\n currentPoint.textOptions.x = currentPoint.dataLabel.textX;\r\n currentPoint.xPos = currentPoint.dataLabel.x\r\n },\r\n\r\n // to detect collision\r\n isCollide: function (a, b, j, contrastColor, chart) {\r\n var width = 0;\r\n var height = 0;\r\n var state = false, markerState = false, aVal, areaBounds, aBounds;\r\n if (contrastColor) {\r\n aVal = a.Region.Bounds,\r\n areaBounds = chart.model.m_AreaBounds;\r\n aBounds = {\r\n \"X\": aVal.X - areaBounds.X,\r\n \"Y\": aVal.Y - areaBounds.Y,\r\n \"Width\": aVal.Width,\r\n \"Height\": aVal.Height\r\n };\r\n if (b.symbolName != \"None\") {\r\n rectLeft = b.xPos;\r\n rectRight = b.xPos + b.width;\r\n rectTop = b.yPos - b.height / 2;\r\n rectBottom = b.yPos + b.height / 2;\r\n }\r\n else {\r\n rectLeft = b.textOptions.x - b.width / 2;\r\n rectRight = b.textOptions.x + b.width / 2;\r\n rectTop = b.textOptions.y - ((b.textOptions.angle == 90 || b.textOptions.angle == -90) ? b.height / 2 : b.height);\r\n rectBottom = b.textOptions.y + ((b.textOptions.angle == 90 || b.textOptions.angle == -90) ? b.height / 2 : 0);\r\n }\r\n state = ((aBounds.X < rectRight) && ((aBounds.X + aBounds.Width) > rectLeft) &&\r\n (aBounds.Y < rectBottom) && ((aBounds.Y + aBounds.Height) > rectTop));\r\n }\r\n else {\r\n var borderWidth = a.seriesIndex ? this.model.series[a.seriesIndex].marker.dataLabel.border.width : 0;\r\n borderWidth += b.seriesIndex ? this.model.series[b.seriesIndex].marker.dataLabel.border.width : 0;\r\n var series = this.model.series;\r\n var firstSeries = series[a.seriesIndex];\r\n var secondSeries = series[b.seriesIndex];\r\n var aXPos = a.xPos, aYPos = a.yPos, bXPos = b.xPos, bYPos = b.yPos;\r\n a.xPos += firstSeries.xAxis.x, a.yPos += firstSeries.yAxis.y,\r\n b.xPos += secondSeries.xAxis.x, b.yPos += secondSeries.yAxis.y;\r\n\r\n if (a != b) {\r\n state = !( // to compare data labels\r\n ((a.yPos + a.height) < (b.yPos)) ||\r\n (a.yPos > (b.yPos + b.height)) ||\r\n ((a.xPos + a.width / 2 + borderWidth) < b.xPos - b.width / 2) ||\r\n (a.xPos - a.width / 2 > (b.xPos + b.width / 2)));\r\n if (state) {\r\n height = (a.yPos + a.height) - b.yPos;\r\n width = (a.xPos + a.width) - b.xPos;\r\n }\r\n a.xPos = aXPos, a.yPos = aYPos;\r\n }\r\n if (!state) {\r\n for (var f = 0; f < this.model.markerRegion.length; f++) {\r\n a = this.model.markerRegion[f];\r\n firstSeries = series[a.seriesIndex];\r\n aXPos = a.xPos, aYPos = a.yPos;\r\n a.xPos += firstSeries.xAxis.x, b.yPos += firstSeries.yAxis.y;\r\n markerState = !( // to compare data label and marker\r\n ((a.yPos + a.height) < (b.yPos - b.height / 2)) ||\r\n (a.yPos > (b.yPos + b.height)) ||\r\n ((a.xPos + a.width) < b.xPos) ||\r\n (a.xPos > (b.xPos + b.width)));\r\n if (markerState)\r\n break;\r\n }\r\n }\r\n\r\n a.xPos = aXPos, a.yPos = aYPos;\r\n b.xPos = bXPos, b.yPos = bYPos;\r\n // to hide the partially visible data labels\r\n }\r\n\r\n\r\n return { state: state, marker: markerState, markerRegion: a, width: width, height: height };\r\n },\r\n\r\n drawAccDisplayText: function (series, options, seriesIndex) {\r\n // method to draw text \r\n var chartObj = this;\r\n var pointsLength = options._visiblePoints.length;\r\n chartObj.firstStartAngle = [];\r\n var type = options.type.toLowerCase();\r\n if ((type != \"pyramid\" && type != \"funnel\" && type != \"pieofpie\") && (options.leftsidePoints.length > 0 || options.rightsidePoints.length > 0)) {\r\n var rightsidePointsLength = options.rightsidePoints.length;\r\n var leftsidePointsLength = options.leftsidePoints.length;\r\n\r\n for (var i = 0; i < rightsidePointsLength; i++) {\r\n options.rightsidePoints[i].index = i;\r\n series.drawDataLabelAcc(chartObj, options, options.rightsidePoints[i].pointIndex, options.rightsidePoints[i], seriesIndex)\r\n }\r\n for (var j = leftsidePointsLength - 1; j >= 0; j--) {\r\n options.leftsidePoints[j].index = j;\r\n series.drawDataLabelAcc(chartObj, options, options.leftsidePoints[j].pointIndex, options.leftsidePoints[j], seriesIndex)\r\n }\r\n }\r\n else {\r\n for (var i = 0; i < pointsLength; i++) {\r\n options._visiblePoints[i].index = i;\r\n var pointIndex = type == \"pieofpie\" ? options._visiblePoints[i].actualIndex : i;\r\n\t\t\t\t\tif (options._visiblePoints[i].start != options._visiblePoints[i].startAngle)\r\n options._visiblePoints[i].startAngle = options._visiblePoints[i].start;\r\n if (isNaN(options._visiblePoints[i].startAngle) && options.type.toLowerCase() == \"pie\" && options.type.toLowerCase == \"pieofpie\") continue;\r\n series.drawDataLabelAcc(chartObj, options, pointIndex, options._visiblePoints[i], seriesIndex, options.collectionIndex)\r\n }\r\n }\r\n if (options.type.toLowerCase() == \"pyramid\" || options.type.toLowerCase() == \"funnel\") {\r\n this.svgRenderer.append(this.gConnectorEle, this.gSeriesEle);\r\n\r\n this.svgRenderer.append(this.gSymbolGroupEle, this.gSeriesEle);\r\n\r\n this.svgRenderer.append(this.gDataLabelEle, this.gSeriesEle);\r\n\r\n this.svgRenderer.append(this.gSeriesTextEle, this.gSeriesEle);\r\n\r\n\r\n this.svgRenderer.append(this.gSeriesEle, this.svgObject);\r\n\r\n if (!this.vmlRendering)\r\n this.svgRenderer.append(this.svgObject, this.element)\r\n\r\n }\r\n },\r\n\r\n _processOData: function (series) {\r\n var chart = this, type = series.type.toLowerCase();\r\n var queryPromise = series.dataSource.executeQuery(series.query);\r\n queryPromise.done(function (e) {\r\n chart._processJsonData(e.result, series);\r\n series.visibility = 'visible';\r\n $(chart.svgObject).empty();\r\n $(chart.legendSvgContainer).empty();\r\n if (chart.model.enableCanvasRendering) {\r\n chart.svgRenderer.ctx.clearRect(0, 0, chart.svgObject.width, chart.svgObject.height);\r\n $(\"#canvas_trackSymbol\").remove();\r\n }\r\n\r\n var redrawChart = true;\r\n var dec = (type != \"pie\" || type != \"doughnut\") ? 0 : chart.model.series.length - 1\r\n for (var i = dec, cond; cond = (type != \"pie\" || type != \"doughnut\") ? i < chart.model.series.length : i >= 0; (type != \"pie\" || type != \"doughnut\") ? i++ : i--) {\r\n if (chart.model.series[i].dataSource) {\r\n if (chart.model.series[i].visibility == 'hidden') {\r\n redrawChart = false;\r\n break;\r\n }\r\n }\r\n }\r\n if (redrawChart) {\r\n chart.draw();\r\n }\r\n });\r\n queryPromise.fail(function (e) {\r\n series.visibility = 'visible';\r\n $(chart.svgObject).empty();\r\n $(chart.legendSvgContainer).empty();\r\n var redrawChart = true;\r\n for (var i = 0; i < chart.model.series.length; i++)\r\n if (chart.model.series[i].dataSource) {\r\n if (chart.model.series[i].visibility == 'hidden') {\r\n redrawChart = false;\r\n break;\r\n }\r\n }\r\n if (redrawChart) {\r\n chart.draw();\r\n }\r\n });\r\n },\r\n _findDatatype: function (series, chart) {\r\n var isDate;\r\n if (series.xAxisName == null)\r\n isDate = chart.model.primaryXAxis.valueType != null && chart.model.primaryXAxis.valueType.toLowerCase() == \"datetime\" ? true : false;\r\n else {\r\n for (var i = 0; i < chart.model._axes.length; i++) {\r\n var axis = chart.model._axes[i];\r\n if (axis.name == series.xAxisName && axis.valueType != null && axis.valueType.toLowerCase() == \"datetime\")\r\n isDate = true;\r\n else\r\n isDate = false;\r\n }\r\n }\r\n return isDate;\r\n },\r\n _processJsonData: function (jsonObj, series) {\r\n\r\n var xName = series.xName,\r\n yNames = series.yName,\r\n colorMap = series.pointColorMappingName,\r\n textMap = series.marker && series.marker.dataLabel && series.marker.dataLabel.textMappingName,\r\n type = series.type.toLowerCase(),\r\n jsonLength = !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', \"svg\") ? jsonObj.length : jsonObj[jsonObj.length - 1] === undefined ? jsonObj.length - 1 : jsonObj.length,\r\n yLength = yNames.length,\r\n isBubble = type == 'bubble',\r\n checkString = !!jsonObj[0][xName].indexOf || (!series._hiloTypes ? !!(jsonObj[0][yNames] == 0 ? 0 : jsonObj[0][yNames] || jsonObj[0][series.size]).indexOf : (jsonObj[0][series.high] && jsonObj[0][series.high].indexOf)),\r\n isDate = checkString && jsonObj[0][xName].indexOf && (jsonObj[0][xName].indexOf(\"/Date(\") != -1),\r\n point, m = 0, x, y,\r\n hiddenIndex = this.model._hiddenPointIndex;\r\n\r\n series.points = new Array(jsonLength);\r\n\r\n if (!checkString) {\r\n while (m < jsonLength) {\r\n x = jsonObj[m][xName];\r\n if (!series._hiloTypes)\r\n y = jsonObj[m][yNames];\r\n series.points[m++] = { x: x, xValue: x, y: y, YValues: [y] };\r\n }\r\n }\r\n else if (type != \"boxandwhisker\")\r\n this._processStringData(jsonObj, series, xName, yNames, isDate, jsonLength);\r\n\r\n //Using separate function for boxandwhisker series\r\n if (type == \"boxandwhisker\")\r\n this._processBoxandWhiskerData(jsonObj, series, xName, yNames, isDate);\r\n\r\n //Using separate functions for bubble and hilo type series improves the performance a lot\r\n (isBubble || colorMap.length > 0 || textMap.length > 0 || hiddenIndex.length > 0) && this._processBubbleSize(jsonObj, series, checkString, colorMap, textMap, hiddenIndex, isBubble, jsonLength);\r\n\r\n (series._hiloTypes) && this._processHiLoValues(jsonObj, series, checkString, type, jsonLength);\r\n return 0;\r\n },\r\n\r\n _processBoxandWhiskerData: function (jsonObj, series, xName, yName, isDate) {\r\n var m = 0, jsonLength = jsonObj.length, x, y,\r\n isDateString = jsonObj[0][xName].indexOf && jsonObj[0][xName].indexOf(\"/Date(\") != -1;\r\n while (m < jsonLength) {\r\n x = jsonObj[m][xName];\r\n isDate && (x = new Date(isDateString ? parseInt(x.substr(6)) : x));\r\n y = jsonObj[m][yName];\r\n series.points[m++] = { x: x, xValue: x, y: y, YValues: [y] };\r\n }\r\n },\r\n\r\n _processStringData: function (jsonObj, series, xName, yName, isDate, jsonLength) {\r\n var m = 0, x, y,\r\n isDateString = jsonObj[0][xName].indexOf && jsonObj[0][xName].indexOf(\"/Date(\") != -1;\r\n while (m < jsonLength) {\r\n x = jsonObj[m][xName];\r\n isDate && !(x instanceof Date) && (x = new Date(isDateString ? parseInt(x.substr(6)) : x));\r\n y = parseFloat(jsonObj[m][yName]);\r\n series.points[m++] = { x: x, xValue: x, y: y, YValues: [y] };\r\n }\r\n },\r\n\r\n _processBubbleSize: function (jsonObj, series, checkString, colorMap, textMap, hiddenIndex, isBubble, jsonLength) {\r\n var point, m = 0;\r\n for (; m < jsonLength; m++) {\r\n point = series.points[m];\r\n point.YValues[0] = checkString ? parseFloat(jsonObj[m][series.yName]) : jsonObj[m][series.yName];\r\n isBubble && (point.size = point.YValues[1] = checkString ? parseFloat(jsonObj[m][series.size]) : jsonObj[m][series.size]);\r\n (colorMap.length > 0) && (point.fill = jsonObj[m][colorMap]);\r\n (textMap.length > 0) && (point.text = jsonObj[m][textMap]);\r\n (hiddenIndex.length > 0 && m == hiddenIndex[m]) && (point.visibility = \"hidden\");\r\n }\r\n },\r\n _processHiLoValues: function (jsonObj, series, checkString, type, jsonLength) {\r\n var point, obj, m = 0;\r\n for (; m < jsonLength; m++) {\r\n point = series.points[m];\r\n obj = jsonObj[m];\r\n point.y = point.high = point.YValues[0] = checkString ? (this.tryParseFloat(obj[series.high])) : obj[series.high];\r\n point.low = point.YValues[1] = checkString ? this.tryParseFloat(obj[series.low]) : obj[series.low];\r\n if (type != 'hilo' && type != 'rangecolumn' && type != 'waterfall') {\r\n point.open = point.YValues[2] = checkString ? this.tryParseFloat(obj[series.open]) : obj[series.open];\r\n point.close = point.YValues[3] = checkString ? this.tryParseFloat(obj[series.close]) : obj[series.close];\r\n if (series.volume)\r\n point.volume = point.YValues[4] = checkString ? this.tryParseFloat(obj[series.volume]) : obj[series.volume];\r\n }\r\n }\r\n },\r\n tryParseFloat: function (str) {\r\n return (str && str.length > 0) ? parseFloat(str) : str;\r\n },\r\n bindTo: function (excludeDataUpdate) {\r\n var model = this.model,\r\n seriesCollection = model.series;\r\n $(\"#\" + this.svgObject.id + '_CrosshairVertical').remove();\r\n $(\"#\" + this.svgObject.id + '_CrosshairHorizontal').remove();\r\n if ($.finish) {\r\n $(\".ejTooltip\" + this._id).finish();\r\n $(\".tooltipDiv\" + this._id).finish();\r\n }\r\n else {\r\n $(\".ejTooltip\" + this._id).stop(true, true);\r\n $(\".tooltipDiv\" + this._id).stop(true, true);\r\n }\r\n $(document).find('[id*=\"_TrackToolTip\"]').remove();// fixed for mobile issue\r\n $('#template_group_' + this._id).remove();\r\n\t\t\t//Create id to chart elements, if the chart element don't have id\r\n\t\t\tif(this.isChartElemId)\r\n\t\t\t\tthis.createElementsId();\r\n\r\n\r\n model.primaryXAxis._valueType = null;\r\n model.primaryXAxis.position = null;\r\n model.primaryYAxis._valueType = null;\r\n model.primaryYAxis.position = null;\r\n model.requireInvertedAxes = false;\r\n model._hiddenPointIndex = [];\r\n var seriesLength = seriesCollection.length,\r\n axesLength = model.axes.length,\r\n axis;\r\n for (var i = 0; i < axesLength; i++) {\r\n axis = model.axes[i];\r\n axis._valueType = null;\r\n axis.position = null;\r\n }\r\n if (model._axes) {\r\n axesLength = model._axes.length;\r\n for (var j = 0; j < axesLength; j++) {\r\n axis = model._axes[j];\r\n axis._valueType = null;\r\n axis.position = null;\r\n axis.zoomFactor = (axis._pointsLength && axis._pointsLength != axis.scrollbarSettings.pointsLength) ? 1 : axis.zoomFactor;\r\n }\r\n }\r\n for (var i = 0; i < seriesLength; i++) {\r\n var series = seriesCollection[i];\r\n var mappingYNames = [\"y\", \"high\", \"low\", \"open\", \"close\"];\r\n if (!(ej.isNullOrUndefined(series.points))) {\r\n for (var j = 0; j < series.points.length; j++) {\r\n mappingYNames.map(function (name, index) {\r\n var value = series.points[j][name];\r\n if (!ej.isNullOrUndefined(value)) series.points[j][name] = (typeof (value) == \"string\") ? parseFloat(value) : value;\r\n });\r\n }\r\n }\r\n series.position = null;\r\n if (series.fill && this.model.seriesColors && series.fill != this.model.seriesColors[i])\r\n seriesCollection[i].isFill = true;\r\n }\r\n if (model.AreaType && model.AreaType == \"none\") {\r\n var series = seriesCollection[0];\r\n var point;\r\n for (var i = 0; series.points && i < series.points.length; i++) {\r\n point = series.points[i]\r\n //point._visibility = point._visibility ? point._visibility : null;\r\n if (point._visibility == \"hidden\" && model.AreaType == \"none\" && seriesCollection.length == 1)\r\n this.model._hiddenPointIndex[i] = i;\r\n point.isFill = (point.fill && model.pointColors && point.fill != model.pointColors[i]) || point.isFill;\r\n point.fill = !point.isFill ? null : point.fill;\r\n }\r\n }\r\n if (model.enable3D)\r\n ej.Ej3DRender.transform = null;\r\n if (seriesCollection) {\r\n //var series = seriesCollection;\r\n this.setModelProperties(excludeDataUpdate);\r\n if (!excludeDataUpdate) {\r\n for (var i = 0; i < seriesCollection.length; i++) {\r\n var series = seriesCollection[i];\r\n if (series.visibility == null || series.visibility == undefined) {\r\n series.visibility = 'visible';\r\n }\r\n if (series.type) series._hiloTypes = series.type.toLowerCase() == \"polar\" || series.type.toLowerCase() == \"radar\" ? ej.seriesTypes[series.drawType.toLowerCase()].prototype.hiloTypes : ej.seriesTypes[series.type.toLowerCase()].prototype.hiloTypes;\r\n if (!(series.points))\r\n series.points = [];\r\n if (series.dataSource) {\r\n if (series.dataSource instanceof ej.DataManager) {\r\n series.visibility = 'hidden';\r\n if (ej.isNullOrUndefined(series.query) || !(series.query instanceof ej.Query))\r\n series.query = ej.Query();\r\n this._processOData(series);\r\n } else if (series.dataSource.length > 0) {\r\n if (typeof series.dataSource === 'string' || series.dataSource.toLowerCase)\r\n series.dataSource = JSON.parse(series.dataSource.replace(/'''/g, \"\\\"\"));\r\n this._processJsonData(series.dataSource, series);\r\n }\r\n }\r\n }\r\n }\r\n if ($(this.svgObject).width() > 0)\r\n this.draw(excludeDataUpdate);\r\n }\r\n\r\n\r\n\r\n },\r\n\r\n _createChartId: function () {\r\n var exsistId = false, count = 0;\r\n var className = $(this.element)[0].className.split(\" \")[0];\r\n do {\r\n if (!$(\"#\" + className + \"_\" + count).length) {\r\n\t\t\t\t\t$(this).attr(\"_id\", className + \"_\" + count);\r\n\t\t\t\t\t$(this.element).attr('id', className + \"_\" + count);\r\n\t\t\t\t\texsistId = true;\r\n }\r\n count++;\r\n } while (!exsistId);\r\n\t\t\tthis.isChartElemId = true;\r\n },\r\n\t\t\r\n\t\tcreateElementsId: function () {\r\n\t\t\tthis.legendContainer.attr('id', \"legend_\" + this._id);\r\n\t\t\tthis.scrollerContainer.attr('id', \"legend_Scroller\" + this._id);\r\n\t\t\tthis.chartContainer.attr('id', \"chartContainer_\" + this._id);\r\n\t\t\tthis.axisScroll.attr('id', \"axisScrollbar_\" + this._id);\r\n\t\t\t$(this.svgObject).attr('id', this._id + (this.model.enableCanvasRendering ? '_canvas' : '_svg'));\r\n\t\t},\r\n\r\n calculateHeight: function (chart) { // height calculation\r\n var $svgObj = $(chart.svgObject);\r\n var chartHeight = chart.model.size.height;\r\n var containerHeight = $(chart.element).height();\r\n var height = (containerHeight / 100) * parseInt(chartHeight);\r\n $svgObj.height(height);\r\n return height;\r\n },\r\n\r\n calculateWidth: function (chart) { // width calculation\r\n var $svgObj = $(chart.svgObject);\r\n var chartWidth = chart.model.size.width;\r\n var containerWidth = $(chart.element).width();\r\n var width = (containerWidth / 100) * parseInt(chartWidth);\r\n $svgObj.width(width);\r\n return width;\r\n },\r\n\r\n // store the element class logic perform here\r\n selectedStyle: function (chart) {\r\n var selected = $('#' + chart._id).find('[class*=\"Selection\"]');\r\n var selection = [];\r\n for (var i = 0; i < selected.length; i++) {\r\n selection[i] = [];\r\n selection[i].id = selected[i].id;\r\n selection[i].className = $('#' + selection[i].id).attr('class');\r\n }\r\n if ($('[id $= Def ]').length > 0) {\r\n selection.pattern = $('[id $= Def ]');\r\n }\r\n\r\n return selection;\r\n },\r\n\r\n chartResize: function () {\r\n var chart = this;\r\n var $svgObj = $(chart.svgObject);\r\n var selection = this.selectedStyle(chart);\r\n this.removeMultiRect();\r\n this._chartResize = true;\r\n if (this.model.enableCanvasRendering) {\r\n $('[id*=' + this._id + '_Selection_' + ']').remove();\r\n $(\"#canvas_trackSymbol\").remove();\r\n var ctx = chart.svgObject.getContext(\"2d\");\r\n ctx.clearRect(0, 0, this.svgRenderer.svgObj.width, this.svgRenderer.svgObj.height);\r\n\r\n if (typeof chart.model.size.width == \"string\" && chart.model.size.width.indexOf(\"%\") != -1) { // to set width \r\n var width = chart.calculateWidth(chart);\r\n this.svgRenderer.svgObj.width = width;\r\n }\r\n else\r\n this.svgRenderer.svgObj.width = $(\"#\" + this._id).width();\r\n\r\n if (typeof chart.model.size.height == \"string\" && chart.model.size.height.indexOf(\"%\") != -1) { // to set height\r\n var height = chart.calculateHeight(chart);\r\n this.svgRenderer.svgObj.height = height;\r\n }\r\n else\r\n this.svgRenderer.svgObj.height = ej.util.isNullOrUndefined(this.model.size.height) ? \"450\" : parseInt($(chart.element).height());\r\n\r\n\r\n }\r\n if (this.resizeTO) clearTimeout(this.resizeTO);\r\n this.resizeTO = setTimeout(function () {\r\n if (!ej.util.isNullOrUndefined(chart.model)) {\r\n if (typeof chart.model.size.width == \"string\" && chart.model.size.width.indexOf(\"%\") != -1) {\r\n chart.calculateWidth(chart);\r\n }\r\n else\r\n $svgObj.width($(chart.element).width());\r\n\r\n if (typeof chart.model.size.height == \"string\" && chart.model.size.height.indexOf(\"%\") != -1) {\r\n chart.calculateHeight(chart);\r\n }\r\n else\r\n $svgObj.height(chart.model.size.height);\r\n if ($(chart.svgObject).width() > 0) {\r\n $(chart.svgObject).empty();\r\n $(chart.legendSvgContainer).empty();\r\n $('#template_group_' + chart._id).remove();\r\n $(\"#annotation_group_\" + chart._id).remove(); //to remove annotation from DOM on resize\r\n chart.disableAnimation();\r\n for (var j = 0; j < chart.model.series.length; j++)\r\n chart.model.series[j].regionAdded = false;\r\n chart.draw();\r\n for (var i = 0; i < selection.length; i++) {\r\n $('#' + selection[i].id).attr('class', selection[i].className);\r\n }\r\n if (selection.pattern)\r\n chart.svgRenderer.append(selection.pattern, chart.svgObject);\r\n if (chart.zoomed && !chart.vmlRendering)\r\n chart._enableZoomingButtons();\r\n chart.enableAnimation();\r\n }\r\n }\r\n }, 500);\r\n\r\n },\r\n isDevice: function () {\r\n return (/mobile|tablet|android|kindle/i.test(navigator.userAgent.toLowerCase()));\r\n // comment above line temporary. Due to the below code event wont bind for tablet device\r\n // return (/mobile|android|kindle/i.test(navigator.userAgent.toLowerCase()));\r\n },\r\n\r\n //To check whether the device is Windows\r\n isWindows: function () {\r\n if (!ej.getBooleanVal($('head'), 'data-ej-android') && !ej.getBooleanVal($('head'), 'data-ej-ios') && !ej.getBooleanVal($('head'), 'data-ej-ios7') && !ej.getBooleanVal($('head'), 'data-ej-flat'))\r\n return this._windows();\r\n },\r\n\r\n _windows: function () {\r\n return (/trident|windows phone/i.test(navigator.userAgent.toLowerCase())) || (ej.getBooleanVal($('head'), 'data-ej-windows', false) === true);\r\n },\r\n\r\n bindResizeEvents: function () {\r\n if (this.model._resizeEventRegistered)\r\n return 0;\r\n if (ej.isTouchDevice() && this._isOrientationSupported())\r\n this._on($(window), \"orientationchange\", this.chartResize);\r\n else\r\n this._on($(window), \"resize\", this.chartResize);\r\n this.model._resizeEventRegistered = true;\r\n },\r\n removeResizeEvents: function () {\r\n if (this.model._resizeEventRegistered) {\r\n if (ej.isTouchDevice() && this._isOrientationSupported())\r\n this._off($(window), \"orientationchange\", this.chartResize);\r\n else\r\n this._off($(window), \"resize\", this.chartResize);\r\n this.model._resizeEventRegistered = false;\r\n }\r\n },\r\n _isOrientationSupported: function () {\r\n return (\"orientation\" in window && \"onorientationchange\" in window);\r\n },\r\n _calculatePinchZoomPosition: function (e) {\r\n var areaBounds = this.model.m_AreaBounds, zoomPosition, axes = this.model._axes, axis,\r\n event = (e.originalEvent.touches && e.originalEvent.touches.length > 0 ? e.originalEvent.touches[0] : e.originalEvent),\r\n pageX = event.pageX, pageY = event.pageY, panTouch = this.previousPanTouch, pinchPan,\r\n orientation, offset, j = 0, length = axes.length;\r\n\r\n if (pageX > areaBounds.X && pageX < areaBounds.X + areaBounds.Width && pageY > areaBounds.Y && pageY < areaBounds.Y + areaBounds.Height) {\r\n if (!panTouch)\r\n panTouch = this.previousPanTouch = { pageX: pageX, pageY: pageY };\r\n\r\n if (ej.isTouchDevice() || this.model.zooming.enableDeferredZoom) {\r\n this.oPreviousCoords = { x: this.previousPanTouch.pageX, y: this.previousPanTouch.pageY };\r\n return this.chartMouseMove(e); //Deferred panning for slow devices\r\n }\r\n\r\n for (; j < length; j++) {\r\n axis = axes[j];\r\n orientation = axis.orientation.toLowerCase() == \"horizontal\";\r\n offset = orientation ? ((panTouch.pageX - pageX) / axis.width * axis.zoomFactor) : ((panTouch.pageY - pageY) / axis.height * axis.zoomFactor);\r\n zoomPosition = axis.zoomPosition;\r\n axis.zoomPosition = this._ensureValueInMinMax(orientation ? zoomPosition + offset : zoomPosition - offset, 0, 1 - axis.zoomFactor);\r\n pinchPan = pinchPan || (zoomPosition != axis.zoomPosition);\r\n }\r\n this.previousPanTouch = { pageX: pageX, pageY: pageY };\r\n if (pinchPan && !this.chartUpdating) {\r\n this.redraw(true, pinchPan, e.target);\r\n this._enableZoomingButtons();\r\n }\r\n }\r\n\r\n },\r\n _calculateTouchDistance: function (previous, current) {\r\n var result = [], j = 0, length = current.length;\r\n\r\n for (; j < length; j++) {\r\n if (previous[j] == null)\r\n previous[j] = current[j];\r\n result[j] = {};\r\n if (j > 0) {\r\n result[j].scaleX = ((previous[0].pageX != previous[1].pageX) && ((current[0].pageX - current[1].pageX) / (previous[0].pageX - previous[1].pageX)));\r\n result[j].scaleY = ((previous[0].pageY != previous[1].pageY) && ((current[0].pageY - current[1].pageY) / (previous[0].pageY - previous[1].pageY)));\r\n result[j].center = { x: (previous[0].pageX + current[0].pageX) / 2, y: (previous[1].pageY + current[1].pageY) / 2 };\r\n }\r\n }\r\n return result;\r\n },\r\n _ensureValueInMinMax: function (valueToCheck, minValue, maxValue) {\r\n return valueToCheck < minValue ? minValue : (valueToCheck > maxValue ? maxValue : valueToCheck);\r\n },\r\n _calculatePinchZoomFactor: function (scale, orientation, target) {\r\n var model = this.model, axes = model._axes, zoomedOut = true, zoomed, currentScale, origin, cumulativeScale,\r\n axisScale, axis, factor, zoomFactor, zoomPosition, areaBounds = model.m_AreaBounds,\r\n prevScale, scaleLimit = 10000, i = 0, length = axes.length;\r\n\r\n orientation = (orientation == 'x' ? 'horizontal' : (orientation == 'y' ? 'vertical' : null));\r\n\r\n if (this.previousScale != null) {\r\n for (; i < length; i++) {\r\n if (!orientation || axes[i].orientation === orientation) {\r\n axis = axes[i];\r\n currentScale = axis.orientation == 'horizontal' ? scale[1].scaleX : scale[1].scaleY;\r\n if (!currentScale)\r\n break;\r\n prevScale = axis.orientation == 'horizontal' ? this.previousScale[1].scaleX : this.previousScale[1].scaleY;\r\n zoomFactor = axis.zoomFactor;\r\n zoomPosition = axis.zoomPosition;\r\n axisScale = this._ensureValueInMinMax(1 / axis.zoomFactor, 1, scaleLimit);\r\n cumulativeScale = this._ensureValueInMinMax(axisScale + (axisScale * (currentScale - prevScale) / prevScale), 1, scaleLimit);\r\n origin = (axis.orientation == 'horizontal' ? (scale[1].center.x / areaBounds.Width) : (1 - scale[1].center.y / areaBounds.Height));\r\n axis.zoomFactor = this._ensureValueInMinMax(1 / cumulativeScale, 1 / scaleLimit, 1);\r\n axis.zoomPosition = this._ensureValueInMinMax(zoomPosition + (zoomFactor - axis.zoomFactor) * origin, 0, 1 - axis.zoomFactor);\r\n zoomed = zoomed || (zoomFactor != axis.zoomFactor);\r\n zoomedOut = zoomedOut && (axis.zoomFactor == 1);\r\n }\r\n }\r\n if (zoomed && !zoomedOut && !this.chartUpdating) {\r\n this.zoomed = true;\r\n this.redraw(true, true, target);\r\n this._enableZoomingButtons();\r\n }\r\n else if (zoomedOut && this.zoomed && !this.chartUpdating) {\r\n this.redraw(true, true, target);\r\n this.zoomed = false;\r\n this._removeZoomkit();\r\n }\r\n }\r\n this.previousScale = scale;\r\n },\r\n _addTouchPointer: function (touches, e, overwrite, j) {\r\n for (j = touches.length; j--;)\r\n if (e.pointerId == touches[j].pointerId) {\r\n if (overwrite) touches[j] = e;\r\n return 0;\r\n }\r\n touches.push(e);\r\n },\r\n _removeTouchPointer: function (touches, e, j) {\r\n for (j = touches && touches.length; j--;)\r\n if (e.pointerId == touches[j].pointerId) {\r\n touches.splice(j, 1);\r\n return 0;\r\n }\r\n },\r\n _copyTouches: function (touches) {\r\n var target = [], i = 0, length = touches.length;\r\n for (; i < length; i++)\r\n target[i] = { pageX: touches[i].pageX, pageY: touches[i].pageY };\r\n return target;\r\n },\r\n _initEventParams: function () {\r\n return { touches: [], movements: [] };\r\n },\r\n _pointerPinchStart: function (e) {\r\n var event = e.originalEvent, targetId, model = this.model, bounds = model.m_AreaBounds, eventObj, elementOffset = $(this.element).offset(),\r\n params = this.eventParams || (this.eventParams = this._initEventParams()),\r\n x = (event.pageX || event.changedTouches[0].pageX) - elementOffset.left, y = (event.pageY || event.changedTouches[0].pageY) - elementOffset.top;\r\n\r\n if (this.model.selectionEnable) {\r\n this.cancelEvent(e);\r\n event.preventDefault();\r\n }\r\n\r\n if (!model.enable3D && model.AreaType == 'cartesianaxes' && event.pointerType != 'mouse' && event.pointerType != 4 && model.zooming.enable && model.zooming.enablePinching && (event.touches || event.pointerId)) {\r\n targetId = e.target.id;\r\n if (targetId.indexOf(\"ResetZoom\") != -1)\r\n this.resetZoom(e);\r\n else if (targetId.indexOf(\"panIcon\") != -1)\r\n this.startPan(e);\r\n else if (targetId.indexOf(\"ZoomIcon\") != -1)\r\n this.startZoom(e);\r\n else if (targetId.indexOf(\"ZoomOut\") != -1 || targetId.indexOf(\"ZoomIn\") != -1)\r\n this.startZoomInOut(e);\r\n else if (x > bounds.X && x < bounds.X + bounds.Width && y > bounds.Y && y < bounds.Y + bounds.Height) {\r\n event.touches ? (params.touches = this._copyTouches(event.touches)) : this._addTouchPointer(params.touches, { pageX: x, pageY: y, pointerId: event.pointerId });\r\n if (params.touches.length < 2)\r\n this.chartMouseDown(e);\r\n }\r\n else\r\n this.chartMouseDown(e);\r\n }\r\n else\r\n this.chartMouseDown(e);\r\n },\r\n _removeInteractions: function () {\r\n $(\"[id*=_TrackSymbol]\").remove();\r\n this._removeTrackBall();\r\n this._removeHighlight();\r\n $(\"#\" + this.svgObject.id + \"_TrackToolTip\").hide();\r\n $(\"#\" + this._id + \"_tooltip\").remove();\r\n },\r\n _pinchGestureMove: function (e) {\r\n var event = e.originalEvent.changedTouches[0], touches = e.originalEvent.touches, model = this.model, elementOffset = $(this.element).offset(),\r\n areaBounds = model.m_AreaBounds, x = event.pageX - elementOffset.left, y = event.pageY - elementOffset.top;\r\n\r\n this.eventParams = this.eventParams || this._initEventParams(model, event);\r\n if (!model.enable3D && model.AreaType == 'cartesianaxes' && event.pointerType != 'mouse' && event.pointerType != 4 && model.zooming.enable && model.zooming.enablePinching && touches) {\r\n if (x > areaBounds.X && x < areaBounds.X + areaBounds.Width && y > areaBounds.Y && y < areaBounds.Y + areaBounds.Height) {\r\n this._removeInteractions();\r\n if (touches.length > 1)\r\n this._calculatePinchZoomFactor(this._calculateTouchDistance(this.eventParams.touches, touches), model.zooming.type, e.target);\r\n else\r\n\t (this.doPan || this.panning) ? this._calculatePinchZoomPosition(e) : this.chartMouseMove(e);\r\n }\r\n else\r\n this.chartMouseMove(e);\r\n } else\r\n this.chartMouseMove(e);\r\n },\r\n _pointerPinchMove: function (e) {\r\n var areaBounds, touches, j = 0, event = e.originalEvent, elementOffset = $(this.element).offset(), x = event.pageX - elementOffset.left, y = event.pageY - elementOffset.top,\r\n model = this.model, params = this.eventParams || this._initEventParams(model, event), startTouches = params.touches, previous = this.previousPointerMove,\r\n length = startTouches.length, touches = params.movements;\r\n\r\n\r\n if (previous != null && previous.pageX == event.pagex && previous.pageY == event.pageY && previous.pointerId == e.pointerId)\r\n return false;\r\n if (!model.enable3D && model.AreaType == 'cartesianaxes' && event.pointerType != 'mouse' && event.pointerType != 4 && model.zooming.enable && model.zooming.enablePinching) {\r\n areaBounds = model.m_AreaBounds;\r\n if (x > areaBounds.X && x < areaBounds.X + areaBounds.Width && y > areaBounds.Y && y < areaBounds.Y + areaBounds.Height) {\r\n this._addTouchPointer(startTouches, { pageX: x, pageY: y, pointerId: event.pointerId });\r\n if (startTouches && startTouches.length > 1) {\r\n for (; j < length; j++)\r\n this._addTouchPointer(touches, startTouches[j], false);\r\n this._addTouchPointer(touches, { pageX: x, pageY: y, pointerId: event.pointerId }, true);\r\n if (!((touches[0].pageX == startTouches[0].pageX) && (touches[1].pageX == startTouches[1].pageX) && (touches[0].pageY == startTouches[0].pageY) && (touches[1].pageY == touches[1].pageY)))\r\n this._calculatePinchZoomFactor(this._calculateTouchDistance(startTouches, touches), this.model.zooming.type, e.target);\r\n }\r\n else\r\n\t (this.doPan || this.panning) ? this._calculatePinchZoomPosition(e) : this.chartMouseMove(e);\r\n }\r\n else {\r\n startTouches.length > 0 && this._removeTouchPointer(startTouches, e);\r\n touches.length > 0 && this._removeTouchPointer(touches, e);\r\n this.chartMouseMove(e);\r\n }\r\n this.previousPointerMove = { pageX: x, pageY: y, pointerId: event.pointerId };\r\n }\r\n else\r\n this.chartMouseMove(e);\r\n },\r\n _pointerPinchEnd: function (e) {\r\n var model = this.model, event = e.originalEvent, params = this.eventParams || (this.eventParams = this._initEventParams(model, event)),\r\n mouseLeave = (event.type.indexOf(\"leave\") != -1 || event.type.indexOf(\"out\") != -1 || event.type.indexOf(\"Out\") != -1);\r\n if (!model.enable3D && model.AreaType == 'cartesianaxes' && event.pointerType != 'mouse' && event.pointerType != 4 && model.zooming.enable && model.zooming.enablePinching && (event.touches || event.pointerId)) {\r\n if (this.continuePinching != null)\r\n this.svgObject.removeChild(this.svgObject.firstChild);\r\n this.continuePinching = this.previousPanTouch = this.previousScale = null;\r\n if (event.touches) {\r\n this.eventParams = null;\r\n this.chartMouseUp(e);\r\n mouseLeave && this.chartMouseLeave(e);\r\n }\r\n else {\r\n this._removeTouchPointer(params.touches, { pointerId: event.pointerId });\r\n if (params.movements.length > 0)\r\n this._removeTouchPointer(params.movements, { pointerId: event.pointerId });\r\n if (params.touches.length == 0) {\r\n this.chartMouseUp(e);\r\n mouseLeave && this.chartMouseLeave(e);\r\n this.eventParams = null;\r\n }\r\n }\r\n }\r\n else {\r\n this.chartMouseUp(e);\r\n mouseLeave && this.chartMouseLeave(e); //Trigger mouse leave event\r\n }\r\n },\r\n _appendStyle: function (selector) {\r\n var css = '#' + selector + '.e-canvas * {touch-action:none; -ms-touch-action:none}',\r\n head = document.head || document.body,\r\n style = document.createElement('style');\r\n\r\n style.type = 'text/css';\r\n style.appendChild(document.createTextNode(css));\r\n head.appendChild(style);\r\n },\r\n bindEvents: function () {\r\n\r\n var matched = jQuery.uaMatch(navigator.userAgent),\r\n browserInfo = ej.EjSvgRender.utils.browserInfo(),\r\n isPointer = browserInfo.isMSPointerEnabled,\r\n isIE11Pointer = browserInfo.pointerEnabled,\r\n touchStartEvent = isPointer ? (isIE11Pointer ? \"pointerdown\" : \"MSPointerDown\") : \"touchstart mousedown\",\r\n touchStopEvent = isPointer ? (isIE11Pointer ? \"pointerup\" : \"MSPointerUp\") : \"touchend mouseup\",\r\n touchMoveEvent = isPointer ? (isIE11Pointer ? \"pointermove\" : \"MSPointerMove\") : \"touchmove mousemove\",\r\n touchCancelEvent = isPointer ? (isIE11Pointer ? \"pointerleave\" : \"MSPointerOut\") : \"touchleave mouseleave\";\r\n this.model.browserInfo = browserInfo;\r\n\r\n if ((window.navigator.maxTouchPoints > 1 && window.PointerEvent) || window.PointerEventsPolyfill) { //For IE11 and IE devices that supports pointer events\r\n this._on(this.element, \"pointerup pointerleave\", this._pointerPinchEnd);\r\n this._on(this.element, \"pointerdown\", this._pointerPinchStart);\r\n this._on(this.element, \"pointermove\", this._pointerPinchMove);\r\n this._appendStyle(this.element[0].id);\r\n }\r\n else if (window.TouchEvent)//For chrome, safari and android\r\n {\r\n this._on(this.element, \"touchstart\", this._pointerPinchStart);\r\n this._on(this.element, \"touchmove\", this._pinchGestureMove);\r\n this._on(this.element, \"touchend\", this._pointerPinchEnd);\r\n this._on($(this.element), \"mousedown\", this.chartMouseDown);\r\n this._on($(this.element), \"mousemove\", this.chartMouseMove);\r\n this._on(this.element, 'mouseleave', this.chartMouseLeave);\r\n this._on($(document), \"mouseup\", this.chartMouseUp);\r\n this._appendStyle(this.element[0].id);\r\n }\r\n else if (window.navigator.msMaxTouchPoints && window.navigator.msPointerEnabled) { //For IE10\r\n this._on(this.element, \"MSPointerUp\", this._pointerPinchEnd);\r\n this._on(this.element, \"mouseleave\", this.chartMouseLeave);\r\n this._on(this.element, \"MSPointerDown\", this._pointerPinchStart);\r\n this._on(this.element, \"MSPointerMove\", this._pointerPinchMove);\r\n this._appendStyle(this.element[0].id);\r\n }\r\n else {\r\n this._on(this.element, touchMoveEvent, this.chartMouseMove);\r\n this._on(this.element, touchCancelEvent, this.chartMouseLeave);\r\n this._on($(document), touchStopEvent, this.chartMouseUp);\r\n this._on($(this.element), touchStartEvent, this.chartMouseDown);\r\n }\r\n this._isSafari = !!navigator.userAgent.match(/Version\\/[\\d\\.]+.*Safari/);\r\n if ((this.isDevice() && this._isSafari) != true)\r\n this._on($(this.element), \"click\", this.chartMouseClick);\r\n this._on($(this.element), \"contextmenu\", this.chartRightClick);\r\n this._on($(this.element), \"dblclick\", this.chartMouseDoubleClick);\r\n\r\n\r\n if (this.model.canResize || this.model.isResponsive) {\r\n this.bindResizeEvents();\r\n }\r\n var touchAction = this.model.zooming.enable || this.model.commonSeriesOptions.dragSettings.enable ? 'none' : 'pan-y';\r\n\r\n $(this.element).css({ 'ms-touch-action': touchAction, 'touch-action': touchAction, 'content-zooming': 'none' }); //disable browser touch action \r\n // $(this.svgObject).css({ 'ms-touch-action': 'none', 'touch-action': 'none', 'content-zooming': 'none' });\r\n $(this.element).css({\r\n \"-webkit-touch-callout\": \"none\", /* iOS Safari */\r\n \"-webkit-user-select\": \"none\", /* Chrome/Safari/Opera */\r\n \"-moz-user-select\": \"none\", /* Firefox */\r\n \"-ms-user-select\": \"none\", /* Internet Explorer/Edge */\r\n \"user-select\": \"none\"\r\n });\r\n var eventName = matched.browser.toLowerCase() == \"mozilla\" ? (isIE11Pointer ? \"mousewheel\" : \"DOMMouseScroll\") : \"mousewheel\";\r\n this._on(this.element, eventName, this.chartMouseWheel);\r\n\r\n },\r\n\r\n calZoomFactors: function (cumulativeScale, origin, currentZoomFactor, currentZoomPos) {\r\n var calcZoomFactorVal, calcZoomPosition;\r\n if (cumulativeScale == 1) {\r\n calcZoomFactorVal = 1;\r\n calcZoomPosition = 0;\r\n } else {\r\n calcZoomFactorVal = ej.EjSvgRender.utils._minMax(1 / cumulativeScale, 0, 1);\r\n calcZoomPosition = currentZoomPos + ((currentZoomFactor - calcZoomFactorVal) * origin);\r\n }\r\n return { zoomMFactor: calcZoomFactorVal, zoomMPosition: calcZoomPosition };\r\n },\r\n doMouseWheelZoom: function (cumulativeScale, origin, axis) {\r\n if (cumulativeScale >= 1) {\r\n var calZoomVal = this.calZoomFactors(cumulativeScale, origin, axis.zoomFactor, axis.zoomPosition);\r\n //calcZoomPos = Math.Round(calcZoomPos, 2);\r\n if (axis.zoomPosition != calZoomVal.zoomMPosition || axis.zoomFactor != calZoomVal.zoomMFactor) {\r\n this.zoomed = true;\r\n axis.zoomPosition = calZoomVal.zoomMPosition;\r\n axis.zoomFactor = (calZoomVal.zoomMPosition + calZoomVal.zoomMFactor) > 1 ? (1 - calZoomVal.zoomMPosition) : calZoomVal.zoomMFactor;\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n\r\n },\r\n enableAnimation: function () {\r\n for (var m = 0; m < this.model.series.length; m++) {\r\n var series = this.model.series[m];\r\n series.enableAnimation = this.serAnimation[m];\r\n }\r\n },\r\n disableAnimation: function () {\r\n var chart = this;\r\n for (var m = 0; m < chart.model.series.length; m++)\r\n chart.model.series[m].enableAnimation = false;\r\n for (var k = 0; k < chart.model.indicators.length; k++)\r\n chart.model.indicators[k].enableAnimation = false;\r\n },\r\n _removeTrackBall: function () {\r\n var id = \"#\" + this.svgObject.id;\r\n $(\"#\" + this.svgObject.id + \"_trackSymbol\").remove();\r\n $(document).find(\"#measureTex\").remove();\r\n if (this.chartCross.visible) {\r\n // Visibility is set to hidden\r\n var element = $(this.svgObject).find(id + \"_AxisCrossToolTip\");\r\n this.svgRenderer._setAttr($(element), { \"visibility\": 'hidden' });\r\n element = $(this.svgObject).find(id + \"_CrosshairVertical\");\r\n this.svgRenderer._setAttr($(element), { \"d\": 'M 0 0' });\r\n element = $(this.svgObject).find(id + \"_CrosshairHorizontal\");\r\n this.svgRenderer._setAttr($(element), { \"d\": 'M 0 0' });\r\n\r\n element = $(this.svgObject).find(id + \"_TrackAxisToolTip\");\r\n this.svgRenderer._setAttr($(element), { \"visibility\": 'hidden' });\r\n element = $(this.svgObject).find(id + \"_Tracker\");\r\n this.svgRenderer._setAttr($(element), { \"d\": 'M 0 0' });\r\n element = $(this.svgObject).find('[id*=\"_TrackToolTip\"]');\r\n this.svgRenderer._setAttr($(element), { \"visibility\": 'hidden' });\r\n element = $(this.svgObject).find('[id*=\"_TrackToolTip\"]').children();\r\n this.svgRenderer._setAttr($(element), { \"visibility\": 'hidden' });\r\n $(element).css('visibility', 'hidden');\r\n element = $(this.svgObject).find('[id*=\"_trackSymbol_\"]');\r\n this.svgRenderer._setAttr($(element), { \"visibility\": 'hidden' });\r\n $(document).find('[id*=\"_TrackToolTipTemplate_\"]').attr(\"visibility\", \"hidden\");\r\n $(document).find('[id*=\"_TrackToolTipTemplate_\"]').css(\"display\", \"none\");\r\n $(id + \"_CrosshairVertical\").css(\"display\", \"none\");\r\n $(id + \"_CrosshairHorizontal\").css(\"display\", \"none\");\r\n $(\"#\" + this._id).find('[id*=\"canvas_AxisToolTipRect\"]').css(\"visibility\", \"hidden\");\r\n $(\"#\" + this._id).find('[id*=\"canvas_Tracker\"]').remove();\r\n $(\"#\" + this._id).find('[id*=\"canvas_trackSymbol\"]').css(\"visibility\", \"hidden\");\r\n $(\"#\" + this._id).find('[id*=\"_gTooltip_\"]').remove();\r\n $(\"#secondCanvas\").remove();\r\n $(document).find('[id*=\"TrackGroupToolTipTemplate\"]').remove();\r\n $(document).find('[id*=\"_TrackToolTipTemplate_\"]').remove();\r\n $(\"#\" + this._id).find('[id*=\"_trackball_grouping_tooltip\"]').remove();\r\n }\r\n\r\n },\r\n enableTrackBall: function () {\r\n this.model.crosshair.visible = this.chartCross.visible;\r\n this.model.crosshair.type = this.chartCross.mArea;\r\n },\r\n disableTrackBall: function () {\r\n\r\n this.model.crosshair.visible = false;\r\n\r\n this._removeTrackBall();\r\n },\r\n _enableZoomingButtons: function () {\r\n var svgObjectId = this.svgObject.id;\r\n if (this.model.AreaType != 'cartesianaxes') {\r\n $(\"#\" + svgObjectId + \"_ResetZoom\").remove();\r\n $(\"#\" + svgObjectId + \"_PanBtn\").remove();\r\n $(\"#\" + svgObjectId + \"_ZoomBtn\").remove();\r\n $(\"#\" + svgObjectId + \"_ZoomInBtn\").remove();\r\n $(\"#\" + svgObjectId + \"_ZoomOutBtn\").remove();\r\n }\r\n if (this.model.AreaType == 'cartesianaxes') {\r\n //Remove zoom buttons before adding them\r\n this._removeZoomkit();\r\n var toolbar = this.model.zooming.toolbarItems;\r\n var length = toolbar.length;\r\n var currentItem, index;\r\n for (var i = length - 1; i >= 0; i--) {\r\n currentItem = toolbar[i];\r\n index = length - i;\r\n switch (currentItem) {\r\n case \"reset\":\r\n this.resetZoomButton(index);\r\n break;\r\n case \"pan\":\r\n this.panButton(index);\r\n break;\r\n case \"zoom\":\r\n case \"zoomIn\":\r\n case \"zoomOut\":\r\n this.zoomButton(index, currentItem);\r\n break;\r\n default:\r\n length = length - 1;\r\n break;\r\n }\r\n }\r\n }\r\n },\r\n chartMouseWheel: function (e) {\r\n $(\"#\" + this.svgObject.id + \"_TrackToolTip\").hide(); // fixed tooltip mouse wheel issue\r\n $(document).find('[id*=\"TrackGroupToolTipTemplate\"]').remove();\r\n $(document).find('[id*=\"_TrackToolTipTemplate_\"]').remove();\r\n $(this.svgObject).find('[id*=\"_trackSymbol_\"]').remove();\r\n if (this.model.zooming.enableMouseWheel && this.model.AreaType == \"cartesianaxes\" && !this.model.enable3D && !this.vmlRendering && ej.util.isNullOrUndefined(this.model.isLazyZooming)) {\r\n var chart = this;\r\n var chartZoomed;\r\n this.zoomed = false;\r\n var canUpdate = false;\r\n var id = \"#\" + chart.svgObject.id;\r\n var matched = jQuery.uaMatch(navigator.userAgent);\r\n var isIE11 = !!navigator.userAgent.match(/Trident\\/7\\./);\r\n var wheelDelta = e.originalEvent.wheelDelta;\r\n var direction = matched.browser.toLowerCase() == \"mozilla\" ? ((isIE11 ? ((wheelDelta / 120) > 0 ? 1 : -1) : -(e.originalEvent.detail) / 3 > 0 ? 1 : -1)) : ((wheelDelta / 120) > 0 ? 1 : -1);\r\n for (var i = 0; i < this.model._axes.length; i++) {\r\n var axis = this.model._axes[i];\r\n if ((axis.orientation.toLowerCase() == \"vertical\" && (chart.model.zooming.type.toLowerCase() == \"y\" || chart.model.zooming.type.trim().toLowerCase() == \"x,y\")) || (axis.orientation.toLowerCase() == \"horizontal\" && (chart.model.zooming.type.toLowerCase() == \"x\" || chart.model.zooming.type.trim().toLowerCase() == \"x,y\"))) {\r\n\r\n var currentScale = Math.max(1 / ej.EjSvgRender.utils._minMax(axis.zoomFactor, 0, 1), 1);\r\n var cumulativeScale = Math.max(currentScale + (0.25 * direction), 1);\r\n canUpdate = canUpdate | chart.doMouseWheelZoom(cumulativeScale, 0.5, axis);\r\n }\r\n if (axis.zoomFactor != 1 && axis.zoomPosition != 0)\r\n chartZoomed = true;\r\n }\r\n this._updateScroll();\r\n this.disableAnimation();\r\n\r\n this.disableTrackBall();\r\n if (canUpdate) {\r\n this.model.legendCollapsed = false;\r\n this.zoomed = true;\r\n chart.redraw(true);\r\n }\r\n this.model._chartAreaZoom = true;\r\n this._enableZoomingButtons();\r\n this.mouseWheelCoords = { x: e.originalEvent.pageX, y: e.originalEvent.pageY };\r\n if (!chartZoomed) {\r\n $(id + '_ResetZoom').remove();\r\n $(id + '_PanBtn').remove();\r\n $(id + '_ZoomBtn').remove();\r\n $(id + '_ZoomInBtn').remove();\r\n $(id + '_ZoomOutBtn').remove();\r\n this.enableAnimation();\r\n this.panning = false;\r\n }\r\n var matched = jQuery.uaMatch(navigator.userAgent);\r\n if (e.preventDefault && matched.browser == 'chrome' && this.model.zooming.enable)\r\n e.preventDefault();\r\n e.returnValue = false;\r\n }\r\n\r\n $(\".tooltipDiv\" + this._id).remove();\r\n\r\n },\r\n\r\n getAxisMultiLevelLabelsData: function (evt) {\r\n var mouseMoveCords = this.calMousePosition(evt),\r\n grpLabelsLength = this.model.multiLevelLabelRegions.length,\r\n ele, x, y, height, width, i;\r\n this.mousemoveX = mouseMoveCords.X;\r\n this.mousemoveY = mouseMoveCords.Y;\r\n for (i = 0; i < grpLabelsLength; i++) {\r\n ele = this.model.multiLevelLabelRegions[i];\r\n x = ele.bounds.x;\r\n y = ele.bounds.y;\r\n height = ele.bounds.height;\r\n width = ele.bounds.width;\r\n if ((this.mousemoveX >= x) && (this.mousemoveX <= x + width) && (this.mousemoveY <= y + height) && (this.mousemoveY >= y)) {\r\n data = { location: { x: this.mousemoveX, y: this.mousemoveY }, axis: this.model._axes[ele.axisIndex], multiLevelLabel: ele.multiLevelLabel };\r\n return data;\r\n }\r\n }\r\n },\r\n\r\n getAxisLabelData: function (evt) {\r\n\r\n var mouseMoveCords = this.calMousePosition(evt),\r\n targetid = evt.target.id,\r\n region,\r\n x,\r\n y,\r\n width,\r\n height,\r\n data,\r\n labelsLength,\r\n axisVisible,\r\n axesLength = this.model._axes.length;\r\n this.mousemoveX = mouseMoveCords.X;\r\n this.mousemoveY = mouseMoveCords.Y;\r\n if (this.model.AreaType == 'cartesianaxes' || this.model.AreaType == 'polaraxes') {\r\n if (!this.model.enable3D) {\r\n for (var j = 0; j < axesLength; j++) {\r\n labelsLength = this.model._axes[j].visibleLabels.length;\r\n axisVisible = this.model._axes[j].visible;\r\n if (axisVisible)\r\n for (var k = 0; k < labelsLength; k++) {\r\n\r\n region = this.model._axes[j].visibleLabels[k].region;\r\n if (!ej.util.isNullOrUndefined(region)) {\r\n x = region.bounds.x;\r\n y = region.bounds.y;\r\n width = region.bounds.width;\r\n height = region.bounds.height;\r\n x = (this.vmlRendering && (targetid.indexOf(\"_YLabel_\") >= 0)) ? (this.model._axes[j].opposedPosition) ? x : x + width : x;\r\n if ((this.mousemoveX >= x) && (this.mousemoveX <= x + width)) {\r\n if ((this.vmlRendering) ? ((this.mousemoveY <= y + height) && (this.mousemoveY >= y)) : (this.mousemoveY >= y - height) && (this.mousemoveY <= y)) {\r\n data = { location: { x: this.mousemoveX, y: this.mousemoveY }, index: k, axis: this.model._axes[j], text: region.labelText };\r\n return data;\r\n }\r\n }\r\n }\r\n\r\n }\r\n }\r\n }\r\n else {\r\n if (targetid.indexOf(\"horizontal\") >= 0 || targetid.indexOf(\"vertical\") >= 0) {\r\n for (var j = 0; j < axesLength; j++) {\r\n labelsLength = this.model._axes[j].visibleLabels.length;\r\n for (var k = 0; k < labelsLength; k++) {\r\n\r\n if (targetid == this.svgObject.id + this.model._axes[j].orientation + k) {\r\n data = { location: { x: this.mousemoveX, y: this.mousemoveY }, index: k, axis: this.model._axes[j], text: this.model._axes[j].visibleLabels[k].Text };\r\n return data;\r\n\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n getLegendData: function (evt) {\r\n var mouseMoveCords = this.calMousePosition(evt);\r\n mouseMoveCords.X -= parseFloat($(this.element).css(\"padding-left\"));\r\n mouseMoveCords.Y -= parseFloat($(this.element).css(\"padding-top\"));\r\n var isEjScroll = this.model.legend._ejScroller;\r\n var scrolltop = 0;\r\n var scrollleft = 0;\r\n scrolltop = isEjScroll ? $(\"#legend_\" + this._id).ejScroller('instance').model.scrollTop : $(\"#legend_\" + this._id).scrollTop();\r\n scrollleft = isEjScroll ? $(\"#legend_\" + this._id).ejScroller('instance').model.scrollLeft : $(\"#legend_\" + this._id).scrollLeft();\r\n this.scrolltop = scrolltop ? scrolltop : 0;\r\n this.scrollleft = scrollleft ? scrollleft : 0;\r\n this.mousemoveX = mouseMoveCords.X + scrollleft;\r\n this.mousemoveY = mouseMoveCords.Y + scrolltop;\r\n var targetId = evt.target.id;\r\n\r\n {\r\n var currentX = this.mousemoveX;\r\n var currentY = this.mousemoveY;\r\n var chartId = this._id;\r\n var region;\r\n if ((!ej.util.isNullOrUndefined(targetId) && this.svgRenderer._getAttrVal($(evt.target).parents(':eq(1)'), 'id') == this.svgObject.id + '_Legend') || (this.model.enableCanvasRendering && targetId == \"legend_\" + chartId + \"_canvas\") || (this.vmlRendering)) {\r\n $.each(this.model.legendRegion, function (index, regionItem) {\r\n\r\n if ((currentX >= regionItem.Bounds.LegendBound.X + regionItem.Bounds.ItemBound.X) && (currentX <= regionItem.Bounds.LegendBound.X + regionItem.Bounds.ItemBound.X + regionItem.Bounds.ItemBound._Width)) {\r\n if ((currentY >= regionItem.Bounds.LegendBound.Y + regionItem.Bounds.ItemBound.Y - (regionItem.Bounds.ItemBound.Height / 4)) && (currentY <= regionItem.Bounds.LegendBound.Y + regionItem.Bounds.ItemBound.Y + regionItem.Bounds.ItemBound.Height)) {\r\n region = regionItem;\r\n $(\"#legend_\" + chartId + \"_canvas\").css(\"cursor\", \"pointer\");\r\n } else\r\n $(\"#legend_\" + chartId + \"_canvas\").css(\"cursor\", \"default\");\r\n }\r\n });\r\n if (!ej.util.isNullOrUndefined(region)) {\r\n return { legendItem: region, series: this.model._visibleSeries[region.LegendItem.SeriesIndex] };\r\n }\r\n }\r\n\r\n }\r\n return false;\r\n },\r\n\r\n get3DSeriesPoint: function (evt) {\r\n var currentX = this.mousemoveX;\r\n var currentY = this.mousemoveY;\r\n var x = (this.model.AreaType == 'polaraxes') ? 0 : this.model.m_AreaBounds.X;\r\n var y = (this.model.AreaType == 'polaraxes') ? 0 : this.model.m_AreaBounds.Y;\r\n var width = (this.model.AreaType == 'polaraxes') ? $(this.svgObject).width() : this.model.m_AreaBounds.Width;\r\n var height = (this.model.AreaType == 'polaraxes') ? $(this.svgObject).height() : this.model.m_AreaBounds.Height;\r\n var index, pointIndex, seriesIndex, region;\r\n if (currentX > x && currentX < (x + width) && currentY > y && currentY < (y + height)) {\r\n var nodeName = $(evt.target)[0].nodeName;\r\n if ((nodeName == \"path\" || nodeName == \"shape\") && $(evt.target)[0].id.indexOf(\"Region\") > 1) {\r\n index = $(evt.target)[0].id.match(/(\\d+)/g);\r\n pointIndex = parseInt(index[index.length - 1]);\r\n seriesIndex = parseInt(index[index.length - 2]);\r\n var regionValue = {};\r\n regionValue.Region = {};\r\n regionValue.Region.PointIndex = pointIndex;\r\n regionValue.SeriesIndex = seriesIndex;\r\n var pointData = {};\r\n pointData.pointIndex = pointIndex;\r\n region = { region: regionValue, pointData: pointData, location: { x: currentX, y: currentY } };\r\n return region;\r\n }\r\n }\r\n },\r\n\r\n GetSeriesPoint: function (evt) {\r\n var mouseX;\r\n var mouseY;\r\n var currentX = this.mousemoveX;\r\n var currentY = this.mousemoveY;\r\n var region, pointIndex;\r\n var chartObj = this;\r\n var indicators = chartObj.model.indicators;\r\n var seriesCollection = chartObj.model._visibleSeries;\r\n for (var j = 0; j < indicators.length && indicators[j].segment; j++) {\r\n seriesCollection = seriesCollection.concat(indicators[j].segment);\r\n }\r\n if (chartObj.model.enable3D) {\r\n return this.get3DSeriesPoint(evt);\r\n }\r\n var x = (this.model.AreaType == 'polaraxes') ? 0 : this.model.m_AreaBounds.X;\r\n var y = (this.model.AreaType == 'polaraxes') ? 0 : this.model.m_AreaBounds.Y;\r\n var width = (this.model.AreaType == 'polaraxes') ? $(this.svgObject).width() : this.model.m_AreaBounds.Width;\r\n var height = (this.model.AreaType == 'polaraxes') ? $(this.svgObject).height() : this.model.m_AreaBounds.Height;\r\n\r\n if ((this.model.AreaType == 'cartesianaxes' || this.model.AreaType == 'polaraxes')) {\r\n\r\n if (currentX > x && currentX < (x + width) && currentY > y && currentY < (y + height)) {\r\n $.each(this.model.chartRegions, function (index, regionItem) {\r\n if (!ej.util.isNullOrUndefined(regionItem.SeriesIndex)) {\r\n var currentSer = seriesCollection[regionItem.SeriesIndex];\r\n if (chartObj.model.AreaType == \"polaraxes\" && currentSer.drawType.toLowerCase() == 'column' && evt.target || (currentSer.drawType.toLowerCase() == 'rangecolumn')) {\r\n if (chartObj.model.enableCanvasRendering) {\r\n if (currentSer.type.toLowerCase() == \"polar\") {\r\n var bounds = regionItem.Region.Bounds;\r\n var chartStartAngle = -.5 * Math.PI;\r\n var innerRadius = bounds.innerRadius || bounds.DRadius;\r\n var fromCenterX;\r\n var fromCenterY;\r\n fromCenterX = (currentX) - (bounds.CenterX);\r\n fromCenterY = (currentY) - (bounds.CenterY);\r\n var series = chartObj.model._visibleSeries[regionItem.SeriesIndex];\r\n var startAngle = series.startAngle;\r\n var endAngle = series.endAngle;\r\n\r\n var arcAngle = (startAngle) ? 2 * Math.PI * (chartObj.model.itemCurrentXPos < 0 ? 1 + chartObj.model.itemCurrentXPos : chartObj.model.itemCurrentXPos) : 0;\r\n var clickAngle = (Math.atan2(fromCenterY, fromCenterX) - chartStartAngle - arcAngle) % (2 * Math.PI);\r\n if (clickAngle < 0 && bounds.PointIndex != 0) clickAngle = 2 * Math.PI + clickAngle;\r\n\r\n var pointStartAngle = parseFloat(bounds.StartAngle.toFixed(14));\r\n var pointEndAngle = parseFloat(bounds.EndAngle.toFixed(14));\r\n pointStartAngle -= arcAngle;\r\n pointEndAngle -= arcAngle;\r\n\r\n if (clickAngle >= pointStartAngle && clickAngle <= pointEndAngle) {\r\n index = bounds.PointIndex;\r\n distanceFromCenter = Math.sqrt(Math.pow(Math.abs(fromCenterX), 2) + Math.pow(Math.abs(fromCenterY), 2));\r\n if (distanceFromCenter <= bounds.Radius && distanceFromCenter > innerRadius) {\r\n var pointRegion = { Region: { PointIndex: index }, SeriesIndex: regionItem.SeriesIndex, type: regionItem.type };\r\n region = pointRegion;\r\n }\r\n }\r\n } else if (currentSer.type.toLowerCase() == \"radar\") {\r\n var bounds = regionItem.Region.Bounds;\r\n if (bounds.Line1) {\r\n line1 = bounds.Line1;\r\n line2 = bounds.Line2;\r\n line3 = bounds.Line3;\r\n line4 = bounds.Line4;\r\n var polygon = [\r\n { x: line1.x, y: line1.y },\r\n { x: line2.x, y: line2.y },\r\n { x: line3.x, y: line3.y },\r\n ];\r\n var currentPoint = { x: currentX, y: currentY };\r\n var point = false;\r\n if (currentSer.drawType.toLowerCase() == 'column') {\r\n for (var p = false, i = -1, l = polygon.length, j = l - 1; ++i < l; j = i)\r\n ((polygon[i].y <= currentPoint.y && currentPoint.y < polygon[j].y) || (polygon[j].y <= currentPoint.y && currentPoint.y < polygon[i].y))\r\n && (currentPoint.x < (polygon[j].x - polygon[i].x) * (currentPoint.y - polygon[i].y) / (polygon[j].y - polygon[i].y) + polygon[i].x)\r\n && (p = !p);\r\n }\r\n else {\r\n var polygon1 = [\r\n { x: line1.x, y: line1.y },\r\n { x: line2.x, y: line2.y },\r\n { x: line3.x, y: line3.y },\r\n { x: line4.x, y: line4.y }\r\n ];\r\n var i = 0; j = 2;\r\n for (var p = false, q = 0; q < polygon1.length; q++) {\r\n ((polygon1[i].y <= currentPoint.y && currentPoint.y < polygon1[j].y) || (polygon1[j].y <= currentPoint.y && currentPoint.y < polygon1[i].y))\r\n && (currentPoint.x < (polygon1[j].x - polygon1[i].x) * (currentPoint.y - polygon1[i].y) / (polygon1[j].y - polygon1[i].y) + polygon1[i].x)\r\n && (p = !p);\r\n var k;\r\n k = i;\r\n i = j;\r\n j = ++k;\r\n if (q == 2)\r\n j = 0;\r\n }\r\n }\r\n point = p;\r\n if (point) {\r\n index = bounds.PointIndex;\r\n var pointRegion = { Region: { PointIndex: index }, SeriesIndex: regionItem.SeriesIndex, type: regionItem.type };\r\n region = pointRegion;\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n var nodeName = $(evt.target)[0].nodeName;\r\n if ((nodeName == \"path\" || nodeName == \"shape\") && $($(evt.target).parent())[0].id == chartObj.svgObject.id + '_SeriesGroup' + '_' + regionItem.SeriesIndex) {\r\n index = $(evt.target)[0].id.match(/(\\d+)/g);\r\n pointIndex = parseInt(index[index.length - 1]);\r\n regionItem = { Region: { PointIndex: pointIndex }, SeriesIndex: regionItem.SeriesIndex, type: regionItem.type };\r\n region = regionItem;\r\n return false;\r\n }\r\n }\r\n }\r\n else {\r\n if ((((currentX >= regionItem.Region.Bounds.X) && (currentX <= (regionItem.Region.Bounds.X + (regionItem.Region.Bounds.Width))))) && ((currentY > regionItem.Region.Bounds.Y) && (currentY < (regionItem.Region.Bounds.Y) + (regionItem.Region.Bounds.Height)))) {\r\n region = regionItem;\r\n }\r\n }\r\n }\r\n else {\r\n regionValue = chartObj.model.chartRegions;\r\n var pointData = {};\r\n var areaValue;\r\n if (!regionItem.isStripLine) {\r\n var regionLength = regionItem.length;\r\n var requireInvertedAxes = chartObj.model.requireInvertedAxes;\r\n var axisName = (!requireInvertedAxes) ? chartObj.model.series[regionItem[regionLength - 1].SeriesIndex]._yAxisName : chartObj.model.series[regionItem[regionLength - 1].SeriesIndex]._xAxisName;\r\n for (var k = 0; k < chartObj.model._axes.length; k++) {\r\n if (axisName == chartObj.model._axes[k].name) {\r\n areaValue = chartObj.model._axes[k];\r\n break;\r\n }\r\n }\r\n for (var i = 0; i < regionValue.length; i++) {\r\n for (var j = 0; j < regionValue[i].length; j++) {\r\n var polygon = [],\r\n line1 = regionValue[i][j].region;\r\n if (line1[0]) polygon.push({ x: line1[0].X + areaValue.x, y: line1[0].Y + areaValue.y });\r\n if (line1[1]) polygon.push({ x: line1[1].X + areaValue.x, y: line1[1].Y + areaValue.y });\r\n if (line1[2]) polygon.push({ x: line1[2].X + areaValue.x, y: line1[2].Y + areaValue.y });\r\n if (line1[3]) polygon.push({ x: line1[3].X + areaValue.x, y: line1[3].Y + areaValue.y });\r\n\r\n var currentPoint = { x: currentX, y: currentY };\r\n var point = chartObj.isPointInPolygon(polygon, currentPoint);\r\n if (point)\r\n region = regionValue[i][j];\r\n }\r\n\r\n }\r\n }\r\n }\r\n });\r\n }\r\n if (region) {\r\n return { region: region, location: { x: currentX, y: currentY } };\r\n }\r\n }\r\n\r\n else {\r\n var chartObj = this;\r\n var distanceFromCenter;\r\n var regionValue;\r\n var chartRegions = chartObj.model.chartRegions;\r\n if (chartRegions.length > 0 && (chartRegions[0].Series.type.toLowerCase() == \"pyramid\" || chartRegions[0].Series.type.toLowerCase() == \"funnel\")) {\r\n var nodeName = $(evt.target)[0].nodeName;\r\n if ((nodeName == \"path\" || nodeName == \"shape\") && $($(evt.target).parent())[0].id == chartObj.svgObject.id + '_SeriesGroup' + '_' + chartRegions[0].SeriesIndex) {\r\n regionValue = chartObj.model.chartRegions[0];\r\n index = $(evt.target)[0].id.match(/(\\d+)/g);\r\n index = parseInt(index[index.length - 1]);\r\n regionValue.Region.PointIndex = index;\r\n var pointData = {};\r\n pointData.pointIndex = index;\r\n region = { region: regionValue, pointData: pointData, location: { x: currentX, y: currentY } };\r\n return region;\r\n }\r\n else {\r\n regionValue = chartRegions[0];\r\n var pyrX = this.pyrX;\r\n var pyrY = this.pyrY;\r\n var pointData = {};\r\n var polygon, line1, line2, line3, line4, line5, line6;\r\n for (var j = 0; j < regionValue.Region.length; j++) {\r\n line1 = regionValue.Region[j].Line1;\r\n line2 = regionValue.Region[j].Line2;\r\n line3 = regionValue.Region[j].Line3;\r\n line4 = regionValue.Region[j].Line4;\r\n if (chartRegions[0].Series.type.toLowerCase() == \"pyramid\")\r\n polygon = [\r\n { x: line1.x + pyrX, y: line1.y + pyrY },\r\n { x: line2.x + pyrX, y: line2.y + pyrY },\r\n { x: line3.x + pyrX, y: line3.y + pyrY },\r\n { x: line4.x + pyrX, y: line4.y + pyrY }\r\n ];\r\n else {\r\n line5 = regionValue.Region[j].Line5;\r\n line6 = regionValue.Region[j].Line6;\r\n polygon = [\r\n { x: line1.x + pyrX, y: line1.y + pyrY },\r\n { x: line2.x + pyrX, y: line2.y + pyrY },\r\n { x: line3.x + pyrX, y: line3.y + pyrY },\r\n { x: line4.x + pyrX, y: line4.y + pyrY },\r\n { x: line5.x + pyrX, y: line5.y + pyrY },\r\n { x: line6.x + pyrX, y: line6.y + pyrY }\r\n ];\r\n }\r\n\r\n var currentPoint = { x: currentX, y: currentY };\r\n var point = this.isPointInPolygon(polygon, currentPoint);\r\n if (point) {\r\n pointData.pointIndex = regionValue.Region[j].PointIndex;\r\n regionValue.Region.PointIndex = pointData.pointIndex;\r\n region = { region: regionValue, pointData: pointData, location: { x: currentX, y: currentY } };\r\n return region;\r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n else {\r\n // ReSharper disable DuplicatingLocalDeclaration\r\n $.each(chartObj.model.chartRegions, function (regionIndex, regionValue) {\r\n // ReSharper restore DuplicatingLocalDeclaration\r\n var chartStartAngle = -.5 * Math.PI;\r\n var seriesData = regionValue.SeriesData,\r\n regionData = regionValue.Region,\r\n innerRadius = (chartObj.model._visibleSeries[regionValue.SeriesIndex].type.toLowerCase() == 'doughnut') ? seriesData.DRadius : 0;\r\n var fromCenterX;\r\n var fromCenterY;\r\n fromCenterX = (currentX) - (seriesData.CenterX);\r\n fromCenterY = (currentY) - (seriesData.CenterY);\r\n var series = chartObj.model._visibleSeries[regionValue.SeriesIndex];\r\n var startAngle = series.startAngle;\r\n var endAngle = series.endAngle;\r\n startAngle = startAngle < 0 ? startAngle + 360 : startAngle;\r\n endAngle = endAngle < 0 ? endAngle + 360 : endAngle;\r\n var totalDegree = (series.endAngle - series.startAngle);\r\n //Anticlockwise pie and doughnut\r\n if (totalDegree < 0) {\r\n endAngle = endAngle / 360;\r\n var arcAngle = (endAngle) ? 2 * Math.PI * (endAngle < 0 ? 1 + endAngle : endAngle) : 0;\r\n var clickAngle = (Math.atan2(fromCenterY, fromCenterX) - chartStartAngle - arcAngle) % (2 * Math.PI);;\r\n if (clickAngle < 0) clickAngle = 2 * Math.PI + clickAngle;\r\n\r\n pointData = [];\r\n for (var i = 0; i < regionData.length; i++) {\r\n var pointStartAngle = parseFloat(regionData[i].StartAngle.toFixed(14));\r\n var pointEndAngle = parseFloat(regionData[i].EndAngle.toFixed(14));\r\n pointStartAngle = pointStartAngle < 0 ? 2 * Math.PI + pointStartAngle : pointStartAngle;\r\n pointEndAngle = pointEndAngle < 0 ? 2 * Math.PI + pointEndAngle : pointEndAngle;\r\n pointStartAngle -= arcAngle;\r\n pointEndAngle -= arcAngle;\r\n pointStartAngle = parseFloat(pointStartAngle.toFixed(14));\r\n pointEndAngle = parseFloat(pointEndAngle.toFixed(14));\r\n if (series.startAngle >= 0 && series.endAngle <= 0) {\r\n pointStartAngle = pointStartAngle <= 0 ? 2 * Math.PI + pointStartAngle : pointStartAngle;\r\n pointEndAngle = pointEndAngle < 0 ? 2 * Math.PI + pointEndAngle : pointEndAngle;\r\n }\r\n if (clickAngle <= pointStartAngle && clickAngle >= pointEndAngle) {\r\n pointData.push(regionData[i]);\r\n break;\r\n }\r\n }\r\n } //Clockwise pie,pieofpie and doughnut\r\n else {\r\n var arcAngle = (startAngle) ? 2 * Math.PI * (chartObj.model.itemCurrentXPos < 0 ? 1 + chartObj.model.itemCurrentXPos : chartObj.model.itemCurrentXPos) : 0;\r\n var clickAngle = (Math.atan2(fromCenterY, fromCenterX) - chartStartAngle - arcAngle) % (2 * Math.PI);\r\n if (clickAngle < 0) clickAngle = chartObj.model._isPieOfPie ? clickAngle : 2 * Math.PI + clickAngle;\r\n pointData = [];\r\n for (var i = 0; i < regionData.length; i++) {\r\n var pointStartAngle = parseFloat(regionData[i].StartAngle.toFixed(14));\r\n var pointEndAngle = parseFloat(regionData[i].EndAngle.toFixed(14));\r\n pointStartAngle = pointStartAngle < 0 ? (chartObj.model._isPieOfPie ? pointStartAngle : 2 * Math.PI + pointStartAngle) : pointStartAngle;\r\n pointEndAngle = pointEndAngle < 0 ? 2 * Math.PI + pointEndAngle : pointEndAngle;\r\n pointStartAngle -= arcAngle;\r\n pointEndAngle -= arcAngle;\r\n pointStartAngle = parseFloat(pointStartAngle.toFixed(14));\r\n pointEndAngle = parseFloat(pointEndAngle.toFixed(14));\r\n if (series.startAngle < 0 && (series.endAngle > -1 || series.endAngle == null)) {\r\n pointStartAngle = pointStartAngle < 0 ? 2 * Math.PI + pointStartAngle : pointStartAngle;\r\n pointEndAngle = pointEndAngle <= 0 ? 2 * Math.PI + pointEndAngle : pointEndAngle;\r\n }\r\n if (clickAngle + 2 * Math.PI < pointEndAngle && series.type == \"pieofpie\")\r\n clickAngle = clickAngle + 2 * Math.PI;\r\n if (clickAngle >= pointStartAngle && clickAngle <= pointEndAngle) {\r\n pointData.push(regionData[i]);\r\n break;\r\n }\r\n }\r\n }\r\n if (pointData.length > 0) {\r\n var isExploded = (series.explodeAll || (series.explodeIndex == pointData[0].PointIndex));\r\n if (isExploded) {\r\n\r\n var fromCenterX1 = currentX - pointData[0].StartX;\r\n var fromCenterY1 = currentY - pointData[0].StartY;\r\n\r\n if (pointData.length > 0) {\r\n\r\n distanceFromCenter = Math.sqrt(Math.pow(Math.abs(fromCenterX1), 2) + Math.pow(Math.abs(fromCenterY1), 2));\r\n if (distanceFromCenter <= seriesData.Radius && distanceFromCenter > innerRadius) {\r\n regionData.PointIndex = pointData[0].PointIndex;\r\n regionData.Index = pointData[0].Index;\r\n regionData.SeriesIndex = pointData[0].SeriesIndex;\r\n region = { region: regionValue, pointData: pointData, location: { x: currentX, y: currentY } };\r\n }\r\n }\r\n }\r\n else {\r\n distanceFromCenter = Math.sqrt(Math.pow(Math.abs(fromCenterX), 2) + Math.pow(Math.abs(fromCenterY), 2));\r\n if (distanceFromCenter <= seriesData.Radius && distanceFromCenter > innerRadius) {\r\n regionData.PointIndex = pointData[0].PointIndex;\r\n regionData.Index = pointData[0].Index;\r\n regionData.SeriesIndex = pointData[0].SeriesIndex;\r\n region = { region: regionValue, pointData: pointData, location: { x: currentX, y: currentY } };\r\n }\r\n }\r\n }\r\n\r\n });\r\n\r\n return region;\r\n }\r\n }\r\n },\r\n isPointInPolygon: function (polygon, point) {\r\n for (var p = false, i = -1, l = polygon.length, j = l - 1; ++i < l; j = i)\r\n ((polygon[i].y <= point.y && point.y < polygon[j].y) || (polygon[j].y <= point.y && point.y < polygon[i].y))\r\n && (point.x < (polygon[j].x - polygon[i].x) * (point.y - polygon[i].y) / (polygon[j].y - polygon[i].y) + polygon[i].x)\r\n && (p = !p);\r\n return p;\r\n },\r\n mousePosition: function (evt) {\r\n if (!ej.util.isNullOrUndefined(evt.pageX) && evt.pageX > 0)\r\n return { x: evt.pageX, y: evt.pageY };\r\n else if (evt.originalEvent && !ej.util.isNullOrUndefined(evt.originalEvent.pageX) && evt.originalEvent.pageX > 0)\r\n return { x: evt.originalEvent.pageX, y: evt.originalEvent.pageY };\r\n else if (evt.originalEvent && evt.originalEvent.changedTouches != undefined) {\r\n if (!ej.util.isNullOrUndefined(evt.originalEvent.changedTouches[0].pageX) && evt.originalEvent.changedTouches[0].pageX > 0)\r\n return { x: evt.originalEvent.changedTouches[0].pageX, y: evt.originalEvent.changedTouches[0].pageY };\r\n }\r\n else\r\n return { x: 0, y: 0 };\r\n\r\n },\r\n\r\n\r\n calMousePosition: function (e) {\r\n var matched = jQuery.uaMatch(navigator.userAgent);\r\n var mouseposition = this.mousePosition(e);\r\n e.pageX = mouseposition.x;\r\n e.pageY = mouseposition.y;\r\n var mouseX, mouseY;\r\n var browser = matched.browser.toLowerCase();\r\n mouseX = (e.pageX) - $(this.svgObject).offset().left;\r\n mouseY = (e.pageY) - $(this.svgObject).offset().top;\r\n\r\n\r\n return { X: mouseX, Y: mouseY };\r\n\r\n },\r\n\r\n calTouchPosition: function (e) {\r\n var matched = jQuery.uaMatch(navigator.userAgent);\r\n var mouseX, mouseY;\r\n\r\n if (matched.browser.toLowerCase() == \"mozilla\" || matched.browser.toLowerCase() == \"webkit\") {\r\n var touch = e.originalEvent.touches[0];\r\n mouseX = (touch.pageX) - $(this.svgObject).parent().offset().left;\r\n mouseY = (touch.pageY) - $(this.svgObject).parent().offset().top;\r\n this.leftPadding = $(this.svgObject).offset().left;\r\n this.grabPadding = 0;\r\n } else if (matched.browser.toLowerCase() == \"msie\") {\r\n\r\n mouseX = (e.originalEvent.pageX) - $(this.svgObject).offset().left;\r\n mouseY = (e.originalEvent.pageY) - $(this.svgObject).offset().top;\r\n this.leftPadding = $(this.svgObject).offset().left;\r\n }\r\n else {\r\n var touch = e.originalEvent.touches[0];\r\n mouseX = (touch.pageX) - $(this.svgObject).offset().left;\r\n mouseY = (touch.pageY) - $(this.svgObject).offset().top;\r\n this.leftPadding = $(this.svgObject).offset().left;\r\n }\r\n\r\n return { X: mouseX, Y: mouseY };\r\n\r\n },\r\n\r\n cancelEvent: function (e) {\r\n e.stopPropagation();\r\n var matched = jQuery.uaMatch(navigator.userAgent);\r\n if (matched.browser == 'chrome' && (this.model.zooming.enable || this.model.crosshair.visible)) {\r\n e.preventDefault();\r\n }\r\n if (this.model.enable3D) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n e.returnValue = false;\r\n e.cancelBubble = true;\r\n return false;\r\n },\r\n resetZoom: function () {\r\n var chartobj = this;\r\n var id = \"#\" + this.svgObject.id;\r\n $(\".tooltipDiv\" + this._id).remove(); //To remove tooltip template\r\n $(\".zoom\" + this._id).remove();\r\n if (chartobj.zoomed) {\r\n $.each(this.model._axes, function (index, axis) {\r\n axis.zoomed = false;\r\n axis.zoomFactor = 1;\r\n axis.zoomPosition = 0;\r\n });\r\n //Reset primary axis zoomFactor and zoomPosition\r\n chartobj.model.primaryXAxis.zoomFactor = 1;\r\n chartobj.model.primaryYAxis.zoomFactor = 1;\r\n chartobj.model.primaryXAxis.zoomPosition = 0;\r\n chartobj.model.primaryYAxis.zoomPosition = 0;\r\n $(\"#\" + chartobj._id + \"_canvas\").css({ \"cursor\": \"default\" });\r\n $(id + \"_ResetZoom\").remove();\r\n $(id + \"_PanBtn\").remove();\r\n $(id + \"_ZoomBtn\").remove();\r\n $(id + \"_ZoomInBtn\").remove();\r\n $(id + \"_ZoomOutBtn\").remove();\r\n chartobj.zoomed = false;\r\n chartobj.zooming = false;\r\n chartobj.panning = false;\r\n chartobj.model._chartAreaZoom = false;\r\n chartobj.resetZooming = true;\r\n chartobj.enableTrackBall();\r\n //No need for data update during reset zoom\r\n chartobj.redraw(true);\r\n chartobj.enableAnimation();\r\n chartobj.svgRenderer._setAttr($(chartobj.svgObject).find(id + \"_XAxis,\" + id + \"_ChartArea,\" + id + \"_YAxis,\" + id + \"_SeriesCollection\"), { \"cursor\": \"default\" });\r\n }\r\n },\r\n startZoomInOut: function (currentEle) {\r\n var currentItem = currentEle.target.id.indexOf(\"ZoomIn\") > -1 ? \"zoomIn\" : \"zoomOut\";\r\n this.drag = false;\r\n this.zoomed = true;\r\n var type = this.model.zooming.type.toLowerCase();\r\n var zoomValue = currentItem == \"zoomIn\" ? 0.2 : -0.2;\r\n var zoomedOut = true;\r\n var axis, previousZoomFactor, previousZoomPosition;\r\n for (var k = 0; k < this.model._axes.length; k++) {\r\n axis = this.model._axes[k];\r\n previousZoomFactor = axis.zoomFactor;\r\n previousZoomPosition = axis.zoomPosition;\r\n if (axis.orientation.toLowerCase() == \"horizontal\") {\r\n axis.zoomFactor = type != \"y\" ? previousZoomFactor - zoomValue : axis.zoomFactor;\r\n axis.zoomPosition = type != \"y\" ? previousZoomPosition + zoomValue : axis.zoomPosition;\r\n } else {\r\n axis.zoomFactor = type != \"x\" ? previousZoomFactor - zoomValue : axis.zoomFactor;\r\n axis.zoomPosition = type != \"x\" ? previousZoomPosition + zoomValue : axis.zoomPosition;\r\n }\r\n if (parseFloat(axis.zoomFactor.toFixed(3)) <= 0.001) {\r\n axis.zoomFactor = previousZoomFactor;\r\n axis.zoomPosition = previousZoomPosition;\r\n }\r\n if (parseFloat(axis.zoomFactor.toFixed(3)) >= 1) {\r\n axis.zoomFactor = 1;\r\n axis.zoomPosition = 0;\r\n }\r\n zoomedOut = zoomedOut && (axis.zoomFactor == 1);\r\n }\r\n selectedData = this._getZoomedData(this);\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = {};\r\n commonEventArgs.data.series = selectedData;\r\n this._trigger(\"zoomed\", commonEventArgs);\r\n this._updateScroll();\r\n this.redraw(true);\r\n if (zoomedOut) {\r\n this._removeZoomkit();\r\n this.resetZooming = true;\r\n this.zoomed = this.panning = false;\r\n this.model._chartAreaZoom = false\r\n }\r\n else\r\n this._enableZoomingButtons();\r\n },\r\n startZoom: function () {\r\n var chartObj = this;\r\n var id = \"#\" + this.svgObject.id;\r\n $(\".tooltipDiv\" + this._id).remove(); //To remove tooltip template\r\n var iconColor = this.model.theme.toLowerCase().indexOf(\"dark\") >= 0 ? \"#000000\" : \" #FFFFFF\";\r\n chartObj.svgRenderer._setAttr($(id + '_ZoomBtn'), { 'selected': 'true' });\r\n chartObj.svgRenderer._setAttr($(id + '_ZoomPath'), { \"fill\": \"#14B9FF\" });\r\n chartObj.svgRenderer._setAttr($(id + '_ZoomIcon'), { \"fill\": '#FFFFFF' });\r\n chartObj.svgRenderer._setAttr($(id + '_PanPath'), { \"fill\": '#B7B7B7' });\r\n chartObj.svgRenderer._setAttr($(id + '_panIcon'), { \"fill\": iconColor });\r\n $(id + \"_ZoomBtn\").css({ \"border-color\": \"#14B9FF\", \"background-color\": \"#14B9FF\" });\r\n $(id + \"_PanBtn\").css({ \"border-color\": \"#B7B7B7\", \"background-color\": \"#B7B7B7\" });\r\n $(\"#\" + chartObj._id + \"_canvas\").css({ \"cursor\": \"default\" });\r\n this._cursorToDefault();\r\n chartObj.panning = false;\r\n chartObj.enableTrackBall();\r\n },\r\n startPan: function () {\r\n var chartObj = this;\r\n var id = \"#\" + this.svgObject.id;\r\n $(\".tooltipDiv\" + this._id).remove(); //To remove tooltip template\r\n var iconColor = this.model.theme.toLowerCase().indexOf(\"dark\") >= 0 ? \"#000000\" : \" #FFFFFF\";\r\n chartObj.svgRenderer._setAttr($(id + '_ZoomBtn'), { 'selected': 'false' });\r\n chartObj.svgRenderer._setAttr($(id + '_PanBtn'), { 'selected': 'true' });\r\n chartObj.svgRenderer._setAttr($(id + '_ZoomPath'), { \"fill\": \"#B7B7B7\" });\r\n chartObj.svgRenderer._setAttr($(id + '_ZoomIcon'), { \"fill\": iconColor });\r\n chartObj.svgRenderer._setAttr($(id + '_PanPath'), { \"fill\": '#14B9FF' });\r\n chartObj.svgRenderer._setAttr($(id + '_panIcon'), { \"fill\": '#FFFFFF' });\r\n $(id + \"_ZoomBtn\").css({ \"border-color\": \"#B7B7B7\", \"background-color\": \"#B7B7B7\" });\r\n $(id + \"_PanBtn\").css({ \"border-color\": \"#14B9FF\", \"background-color\": \"#14B9FF\" });\r\n $(\"#\" + chartObj._id + \"_canvas\").css({ \"cursor\": \"pointer\" });\r\n this._cursorToPointer();\r\n chartObj.panning = true;\r\n chartObj.disableTrackBall();\r\n\r\n },\r\n zoomButton: function (index, currentItem) {\r\n if (currentItem == \"zoom\")\r\n var currentItemId = \"_Zoom\";\r\n else if (currentItem == \"zoomIn\")\r\n currentItemId = \"_ZoomIn\";\r\n else\r\n currentItemId = \"_ZoomOut\";\r\n\r\n var padding = index * 5 + 5, chartOffset = { left: 0, top: 0 };\r\n var transX = this.model.m_AreaBounds.X + (this.model.m_AreaBounds.Width - (index * 32) - padding); //32 path bouding box for pan,reset, zoom button \r\n var transY = (this.model.m_AreaBounds.Y + this.model.m_AreaBounds.Height) + (this.model.elementSpacing - (this.model.m_AreaBounds.Height));\r\n var iconColor = this.model.theme.toLowerCase().indexOf(\"dark\") >= 0 ? \"#000000\" : \" #FFFFFF\";\r\n\r\n var pathOptions = {\r\n 'id': this.svgObject.id + currentItemId + 'Path',\r\n 'd': \"M32,27c0,2.75-2.25,5-5,5H5c-2.75,0-5-2.25-5-5V5c0-2.75,2.25-5,5-5h22c2.75,0,5,2.25,5,5V27z\",\r\n 'fill': this.panning || currentItem == \"zoomIn\" || currentItem == \"zoomOut\" ? '#b7b7b7' : '#14B9FF',\r\n 'zoomId': this._id + currentItemId + \"Btn\",\r\n 'width': 26,\r\n 'height': 26,\r\n 'left': transX + chartOffset.left,\r\n 'top': transY + chartOffset.top,\r\n 'iconColor': iconColor\r\n };\r\n\r\n ej.EjCanvasRender.prototype.zoomButton(pathOptions, currentItem, this);\r\n if (currentItem == \"zoom\")\r\n this._on($(\"#\" + this.svgObject.id + currentItemId + \"Btn\"), \"touchstart click\", this.startZoom);\r\n else\r\n this._on($(\"#\" + this.svgObject.id + currentItemId + \"Btn\"), \"touchstart click\", this.startZoomInOut);\r\n },\r\n panButton: function (index) {\r\n var padding = index * 5 + 5, chartOffset = { left: 0, top: 0 };\r\n var transX = this.model.m_AreaBounds.X + (this.model.m_AreaBounds.Width - (index * 32) - padding); //32 path bounding box for pan and resetzoom button\r\n var transY = (this.model.m_AreaBounds.Y + this.model.m_AreaBounds.Height) + (this.model.elementSpacing - (this.model.m_AreaBounds.Height));\r\n var iconColor = this.model.theme.toLowerCase().indexOf(\"dark\") >= 0 ? \"#000000\" : \" #FFFFFF\";\r\n\r\n var pathOptions = {\r\n 'id': this.svgObject.id + '_PanPath',\r\n 'd': \"M 32 27 c 0 2.75 -2.25 5 -5 5 H 5 c -2.75 0 -5 -2.25 -5 -5 V 5 c 0 -2.75 2.25 -5 5 -5 h 22 c 2.75 0 5 2.25 5 5 V 27 Z\",\r\n 'fill': !this.panning ? '#b7b7b7' : '#14B9FF',\r\n 'panId': this._id + '_PanBtn',\r\n 'width': 26,\r\n 'height': 26,\r\n 'left': transX + chartOffset.left,\r\n 'top': transY + chartOffset.top,\r\n 'iconColor': iconColor\r\n };\r\n ej.EjCanvasRender.prototype.panButton(pathOptions, this);\r\n this._on($(\"#\" + this.svgObject.id + '_PanBtn'), \"touchstart click\", this.startPan);\r\n },\r\n resetZoomButton: function (index) {\r\n var padding = index * 5 + 5, chartOffset = { left: 0, top: 0 };\r\n var transX = this.model.m_AreaBounds.X + (this.model.m_AreaBounds.Width - (index * 32 + padding)); //32 path bouding box\r\n var transY = (this.model.m_AreaBounds.Y + this.model.m_AreaBounds.Height) + (this.model.elementSpacing - (this.model.m_AreaBounds.Height));\r\n var iconColor = this.model.theme.toLowerCase().indexOf(\"dark\") >= 0 ? \"#000000\" : \" #FFFFFF\";\r\n var options = {\r\n 'id': this.svgObject.id + '_ResetZoomPath',\r\n 'd': \"M 32 27 c 0 2.75 -2.25 5 -5 5 H 5 c -2.75 0 -5 -2.25 -5 -5 V 5 c 0 -2.75 2.25 -5 5 -5 h 22 c 2.75 0 5 2.25 5 5 V 27 Z\",\r\n 'fill': '#b7b7b7',\r\n 'resetZoomId': this._id + '_ResetZoom',\r\n 'width': 26,\r\n 'height': 26,\r\n 'left': transX + chartOffset.left,\r\n 'top': transY + chartOffset.top,\r\n 'iconColor': iconColor\r\n };\r\n ej.EjCanvasRender.prototype.resetZoom(options, this);\r\n var events = (window.TouchEvent ? \"touchstart\" : (window.PointerEvent ? \"pointerdown\" : (window.MSPointerEvent ? \"MSPointerDown\" : \"click\"))) + \" click\";\r\n this._on($(\"#\" + this.svgObject.id + '_ResetZoom'), events, this.resetZoom);\r\n },\r\n\r\n doZoom: function (zoomRect, zoomRectWidth, zoomRectHeight) {\r\n var chart = this;\r\n this.model._chartAreaZoom = true;\r\n this.scrollDraw = true;\r\n $(\".tooltipDiv\" + this._id).remove(); //To remove tooltip template\r\n if (chart.model.enableCanvasRendering) {\r\n var zoomArea = $(\"#\" + this.svgObject.id + \"_ZoomArea\")[0].getClientRects()[0];\r\n var chartArea = $(\"#\" + this.svgObject.id)[0].getClientRects()[0];\r\n var zoomX = zoomArea.left - chartArea.left - $(document).scrollLeft();\r\n var zoomY = zoomArea.top - chartArea.top - $(document).scrollTop();\r\n } else {\r\n var zoomX = parseFloat(chart.svgRenderer._getAttrVal($(zoomRect), \"x\"));\r\n var zoomY = parseFloat(chart.svgRenderer._getAttrVal($(zoomRect), \"y\"));\r\n }\r\n $(\"#\" + this.svgObject.id + \"_ZoomArea\").remove();\r\n this.drag = false;\r\n this.zoomed = true;\r\n for (var k = 0; k < this.model._axes.length; k++) {\r\n var axis = this.model._axes[k];\r\n var previousZoomFactor = axis.zoomFactor;\r\n var previousZoomPosition = axis.zoomPosition;\r\n if (axis.orientation.toLowerCase() == \"horizontal\") {\r\n axis.zoomFactor = chart.model.zooming.type.toLowerCase() != \"y\"\r\n ? previousZoomFactor * (zoomRectWidth / (chart.model.m_AreaBounds.Width)) : axis.zoomFactor;\r\n axis.zoomPosition = chart.model.zooming.type.toLowerCase() != \"y\"\r\n ? previousZoomPosition + Math.abs((zoomX - chart.model.m_AreaBounds.X) / (chart.model.m_AreaBounds.Width)) * previousZoomFactor : axis.zoomPosition;\r\n if (parseFloat(axis.zoomFactor.toFixed(3)) <= 0.001) {\r\n axis.zoomFactor = previousZoomFactor;\r\n axis.zoomPosition = previousZoomPosition;\r\n\r\n }\r\n } else {\r\n axis.zoomFactor = chart.model.zooming.type.toLowerCase() != \"x\"\r\n ? previousZoomFactor * zoomRectHeight / chart.model.m_AreaBounds.Height : axis.zoomFactor;\r\n axis.zoomPosition = chart.model.zooming.type.toLowerCase() != \"x\"\r\n ? previousZoomPosition + (1 - Math.abs((zoomRectHeight + (zoomY - chart.model.m_AreaBounds.Y)) / (chart.model.m_AreaBounds.Height))) * previousZoomFactor : axis.zoomPosition;\r\n if (parseFloat(axis.zoomFactor.toFixed(3)) <= 0.001) {\r\n axis.zoomFactor = previousZoomFactor;\r\n axis.zoomPosition = previousZoomPosition;\r\n\r\n }\r\n }\r\n }\r\n\r\n //Getting zoomed region data when zoomedData event fired \r\n selectedData = this._getZoomedData(chart);\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = {};\r\n commonEventArgs.data.series = selectedData;\r\n this._trigger(\"zoomed\", commonEventArgs);\r\n\r\n this.disableAnimation();\r\n this.model.legendCollapsed = false;\r\n this.redraw(true);\r\n\r\n this._enableZoomingButtons();\r\n },\r\n _getZoomedData: function (chart) {\r\n //Getting zoomed region data when zoomedData event fired \r\n var series = this.model._visibleSeries;\r\n var seriesLength = series.length;\r\n var zoomedData = [];\r\n var selectedData = [];\r\n var points = [];\r\n var type;\r\n var axisValueType;\r\n var xVisibleRange;\r\n var yVisibleRange;\r\n var pointsLength;\r\n for (var j = 0; j < seriesLength; j++) {\r\n if (series[j].visibility == \"visible\") {\r\n points = series[j].points;\r\n pointsLength = points.length;\r\n type = series[j].type.toLowerCase();\r\n axisValueType = new ej.axisTypes[series[j].xAxis._valueType.toLowerCase()]();\r\n axisValueType._calculateVisibleRange(series[j].xAxis, chart);\r\n axisValueType = new ej.axisTypes[series[j].yAxis._valueType.toLowerCase()]();\r\n axisValueType._calculateVisibleRange(series[j].yAxis, chart);\r\n xVisibleRange = series[j].xAxis.visibleRange;\r\n yVisibleRange = series[j].yAxis.visibleRange;\r\n for (var k = 0; k < pointsLength; k++) {\r\n if ((xVisibleRange.min <= points[k].xValue && xVisibleRange.max >= points[k].xValue) && (yVisibleRange.min <= points[k].y && yVisibleRange.max >= points[k].y)) {\r\n if (series[j]._hiloTypes) {\r\n if (type == \"rangearea\" || type == \"rangecolumn\" || type == \"waterfall\" || type == \"hilo\")\r\n zoomedData.push({ XValue: points[k].x, High: points[k].high, Low: points[k].low });\r\n else\r\n zoomedData.push({ XValue: points[k].x, High: points[k].high, Low: points[k].low, Open: points[k].open, Close: points[k].close });\r\n }\r\n else\r\n zoomedData.push({ XValue: points[k].x, YValue: points[k].y });\r\n }\r\n }\r\n }\r\n if (zoomedData.length != 0)\r\n selectedData.push({ selectedData: zoomedData });\r\n zoomedData = [];\r\n }\r\n return selectedData;\r\n },\r\n _cursorToDefault: function () {\r\n var id = \"#\" + this.svgObject.id;\r\n this.svgRenderer._setAttr($(this.svgObject).find(id + \"_XAxis,\" + id + \"_ChartArea,\" + id + \"_YAxis,\" + id + \"_SeriesCollection,\" + id + \"_StriplineBehind,\" + id + '_StriplineOver'), { \"cursor\": \"default\" });\r\n },\r\n _cursorToPointer: function () {\r\n var id = \"#\" + this.svgObject.id;\r\n this.svgRenderer._setAttr($(this.svgObject).find(id + \"_XAxis,\" + id + \"_ChartArea,\" + id + \"_YAxis,\" + id + \"_SeriesCollection,\" + id + \"_StriplineBehind,\" + id + '_StriplineOver'), { \"cursor\": \"pointer\" });\r\n },\r\n //to remove the select region on redraw\r\n removeMultiRect: function () {\r\n $(this.parentgEle).empty();\r\n this.model.selectedDataCollection = [];\r\n },\r\n multiSelectDataCalculation: function () {\r\n var chart = this, selectedData = [], selectedRectIndex = this.selectedRectIndex,\r\n rectX = this.oldRectX[selectedRectIndex],\r\n rectY = this.oldRectY[selectedRectIndex],\r\n rectWidth = this.oldRectWidth[selectedRectIndex],\r\n rectHeight = this.oldRectHeight[selectedRectIndex],\r\n selectFactor = 1,\r\n selectPosition = 0,\r\n seriesCollection = this.model.series,\r\n seriesCollectionLength = seriesCollection.length,\r\n axes = this.multiAxis,\r\n axesLength = axes.length,\r\n multiSelectType = this.multiSelectType,\r\n axis, previousSelectFactor, previousSelectPosition,\r\n xMin, xMax, yMin, yMax,\r\n visiblePoints, type, baseRange,\r\n start, end, isEmpty, xOriginalVisibleRange, yOriginalVisibleRange,\r\n areaType = this.model.AreaType.toLowerCase(),\r\n xValue, y, isInversed, stackYValue,\r\n isTransposed, selectionSettings, series;\r\n for (var i = 0; i < seriesCollectionLength; i++) {\r\n series = seriesCollection[i];\r\n xOriginalVisibleRange = series.xAxis.visibleRange;\r\n yOriginalVisibleRange = series.yAxis.visibleRange;\r\n var xAxisName = axes.some((function (val) {\r\n return val.name.toLowerCase() == series._xAxisName.toLowerCase();\r\n }));\r\n var yAxisName = axes.some((function (val) {\r\n return val.name.toLowerCase() == series._yAxisName.toLowerCase();\r\n }));\r\n\r\n selectionSettings = series.selectionSettings;\r\n if ((xAxisName && yAxisName) && series.visibility.toLowerCase() == 'visible') {\r\n for (var k = 0; k < axesLength; k++) {\r\n axis = axes[k];\r\n previousSelectFactor = selectFactor;\r\n previousSelectPosition = selectPosition;\r\n if (axis.orientation.toLowerCase() == \"horizontal\") {\r\n this.selectFactor = selectionSettings.rangeType.toLowerCase() != \"y\"\r\n ? previousSelectFactor * (rectWidth / (this.multiAxis[k].width)) : selectFactor;\r\n this.selectPosition = selectionSettings.rangeType.toLowerCase() != \"y\"\r\n ? previousSelectPosition + Math.abs((rectX - this.multiAxis[k].x) / (this.multiAxis[k].width)) * previousSelectFactor : selectPosition;\r\n if (parseFloat(selectFactor.toFixed(3)) <= 0.001) {\r\n this.selectFactor = previousSelectFactor;\r\n this.selectPosition = previousSelectPosition;\r\n }\r\n }\r\n else {\r\n this.selectFactor = selectionSettings.rangeType.toLowerCase() != \"x\"\r\n ? previousSelectFactor * rectHeight / this.multiAxis[k].height : selectFactor;\r\n this.selectPosition = selectionSettings.rangeType.toLowerCase() != \"x\"\r\n ? previousSelectPosition + (1 - Math.abs((rectHeight + (rectY - this.multiAxis[k].y)) / (this.multiAxis[k].height))) * previousSelectFactor : selectPosition;\r\n if (parseFloat(selectFactor.toFixed(3)) <= 0.001) {\r\n this.selectFactor = previousSelectFactor;\r\n this.selectPosition = previousSelectPosition;\r\n }\r\n }\r\n axis.visibleRange = $.extend(true, {}, axis.actualRange);\r\n if (this.selectFactor < 1 || this.selectPosition > 0) {\r\n if (axis.valueType == \"logarithmic\") baseRange = axis.visibleRange;\r\n else baseRange = axis.actualRange;\r\n this.selectFactor = this.selectFactor > 1 ? 1 : (this.selectFactor < 0 ? 0 : this.selectFactor);\r\n this.selectPosition = this.selectPosition < 0 ? 0 : (this.selectPosition > 1 ? 1 : this.selectPosition);\r\n if (axis.isInversed) {\r\n start = axis.actualRange.max - this.selectPosition * axis.actualRange.delta;\r\n end = start - this.selectFactor * axis.actualRange.delta;\r\n isInversed = true;\r\n }\r\n else {\r\n start = axis.actualRange.min + this.selectPosition * axis.actualRange.delta;\r\n end = start + this.selectFactor * axis.actualRange.delta;\r\n }\r\n if (start < baseRange.min) {\r\n end = end + (baseRange.min - start);\r\n start = baseRange.min;\r\n }\r\n if (end > baseRange.max) {\r\n start = start - (end - baseRange.max);\r\n end = baseRange.max;\r\n }\r\n if (axis.valueType == \"logarithmic\") {\r\n start = Math.pow(10, start);\r\n end = Math.pow(10, end);\r\n }\r\n axis.visibleRange.min = Math.min(start, end);\r\n axis.visibleRange.max = Math.max(start, end);\r\n }\r\n }\r\n visiblePoints = series._visiblePoints;\r\n type = series.type.toLowerCase(), isTransposed = series.isTransposed;\r\n xMin = series.xAxis.visibleRange.min; xMax = series.xAxis.visibleRange.max;\r\n yMin = series.yAxis.visibleRange.min; yMax = series.yAxis.visibleRange.max;\r\n if (ej.util.isNullOrUndefined(selectedData)) selectedData = [];\r\n if (series.selectionSettings.enable) {\r\n switch (multiSelectType) {\r\n case 'x':\r\n for (var k = 0; k < visiblePoints.length; k++) {\r\n visiblePoints[k].seriesIndex = i;\r\n isEmpty = visiblePoints[k].isEmpty;\r\n xValue = visiblePoints[k].xValue;\r\n y = visiblePoints[k].y;\r\n if (series.xAxis.isInversed || series.yAxis.isInversed) {\r\n if (type.indexOf('bar') >= 0) {\r\n if (type.indexOf('stacking') >= 0) {\r\n stackYValue = series.stackedValue.EndValues[k];\r\n if (!isEmpty && yMax >= stackYValue && yMin <= stackYValue)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n else {\r\n if (type == 'waterfall' && !isEmpty && yMax >= visiblePoints[k].YValues[0] && yMin <= visiblePoints[k].YValues[0])\r\n selectedData.push(visiblePoints[k]);\r\n else if (!isEmpty && yMax >= y && yMin <= y)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n }\r\n else {\r\n if (!isEmpty && xMax >= xValue && xMin <= xValue)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n }\r\n else {\r\n if (isTransposed && (type.indexOf('bar') >= 0)) {\r\n if (!isEmpty && xMin <= xValue && xMax >= xValue)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n else if ((type.indexOf('bar') >= 0) || ((series.isTransposed) && (!(type.indexOf('bar') >= 0)))) {\r\n if (type.indexOf('stacking') >= 0) {\r\n stackYValue = series.stackedValue.EndValues[k];\r\n if (!isEmpty && yMin <= stackYValue && yMax >= stackYValue)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n else {\r\n if (type == 'waterfall' && !isEmpty && yMin <= visiblePoints[k].YValues[0] && yMax >= visiblePoints[k].YValues[0])\r\n selectedData.push(visiblePoints[k]);\r\n else if (!isEmpty && yMin <= y && yMax >= y)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n }\r\n else {\r\n if (!isEmpty && Math.round(xMin) <= xValue && xMax >= xValue)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n }\r\n }\r\n break;\r\n case 'y':\r\n for (var k = 0; k < visiblePoints.length; k++) {\r\n visiblePoints[k].seriesIndex = i;\r\n isEmpty = visiblePoints[k].isEmpty;\r\n xValue = visiblePoints[k].xValue;\r\n y = visiblePoints[k].y;\r\n if (series.xAxis.isInversed || series.yAxis.isInversed) {\r\n if (type.indexOf('bar') >= 0) {\r\n if (!isEmpty && xMax >= xValue && xMin <= xValue)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n else {\r\n if (type.indexOf('stacking') >= 0) {\r\n stackYValue = series.stackedValue.EndValues[k];\r\n if (!isEmpty && yMin <= stackYValue && yMax >= stackYValue)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n else {\r\n if (type == 'waterfall' && !isEmpty && yMax >= visiblePoints[k].YValues[0] && yMin <= visiblePoints[k].YValues[0])\r\n selectedData.push(visiblePoints[k]);\r\n else if (!isEmpty && yMax >= y && yMin <= y)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n }\r\n }\r\n else {\r\n if (isTransposed && (type.indexOf('bar') >= 0)) {\r\n if (type.indexOf('stacking') >= 0) {\r\n stackYValue = series.stackedValue.EndValues[k];\r\n if (!isEmpty && yMin <= stackYValue && yMax >= stackYValue)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n else {\r\n if (type == 'waterfall' && !isEmpty && yMin <= visiblePoints[k].YValues[0] && yMax >= visiblePoints[k].YValues[0])\r\n selectedData.push(visiblePoints[k]);\r\n else if (!isEmpty && yMin <= y && yMax >= y)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n }\r\n else if ((type.indexOf('bar') >= 0) || ((series.isTransposed) && (!(type.indexOf('bar') >= 0)))) {\r\n if (!isEmpty && xMin <= xValue && xMax >= xValue)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n else {\r\n if (type.indexOf('stacking') >= 0) {\r\n stackYValue = series.stackedValue.EndValues[k];\r\n if (!isEmpty && yMin <= stackYValue && yMax >= stackYValue)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n else {\r\n if (type == 'waterfall' && !isEmpty && yMin <= visiblePoints[k].YValues[0] && yMax >= visiblePoints[k].YValues[0])\r\n selectedData.push(visiblePoints[k]);\r\n else if (!isEmpty && yMin <= y && yMax >= y)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n case 'xy':\r\n for (var k = 0; k < visiblePoints.length; k++) {\r\n visiblePoints[k].seriesIndex = i;\r\n isEmpty = visiblePoints[k].isEmpty;\r\n xValue = visiblePoints[k].xValue;\r\n y = visiblePoints[k].y;\r\n if (type.indexOf('stacking') >= 0) {\r\n stackYValue = series.stackedValue.EndValues[k];\r\n if (!isEmpty && xMax >= xValue && xMin <= xValue && yMin <= stackYValue && yMax >= stackYValue)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n else {\r\n if (type == 'waterfall' && !isEmpty && xMax >= xValue && xMin <= xValue && yMin <= visiblePoints[k].YValues[0] && yMax >= visiblePoints[k].YValues[0])\r\n selectedData.push(visiblePoints[k]);\r\n else if (!isEmpty && xMax >= xValue && Math.round(xMin) <= xValue && yMin <= y && yMax >= y)\r\n selectedData.push(visiblePoints[k]);\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n series.xAxis.visibleRange = xOriginalVisibleRange;\r\n series.yAxis.visibleRange = yOriginalVisibleRange;\r\n }\r\n var currentIndex = this.currentIndex;\r\n if (ej.util.isNullOrUndefined(this.model.selectedDataCollection) || $(\"#\" + this.svgObject.id + \"_rectSelectionGroup\").length == 0)\r\n this.model.selectedDataCollection = [];\r\n if (this.removeRect) this.model.selectedDataCollection.splice(currentIndex, 1);\r\n else if (this.rectPan || this.resize) {\r\n this.model.selectedDataCollection[currentIndex] = 0;\r\n this.model.selectedDataCollection[currentIndex] = selectedData;\r\n }\r\n else this.model.selectedDataCollection[this.model.selectedDataCollection.length] = selectedData;\r\n //trigger rangeSelected event to get the selected region's data\r\n var commonloadEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonloadEventArgs.data = {};\r\n commonloadEventArgs.data.selectedData = selectedData;\r\n commonloadEventArgs.data.selectedDataCollection = this.model.selectedDataCollection;\r\n this._trigger(\"rangeSelected\", commonloadEventArgs);\r\n },\r\n multiSelectMouseUp: function (evt) {\r\n if (this._isMultiSelect && (this.multiSelectMode == 'range')) {\r\n var selectRectWidth, selectRectHeight, selectRectX, selectRectY, cx, cy, index,\r\n containerSvg = this.svgObject.id, selectedRectIndex = this.selectedRectIndex,\r\n selectRectId = \"#\" + containerSvg + \"_selectRect\",\r\n selectRectWidth = parseInt($(selectRectId + selectedRectIndex).attr(\"width\")),\r\n selectRectHeight = parseInt($(selectRectId + selectedRectIndex).attr(\"height\")),\r\n selectRectX = parseInt($(selectRectId + selectedRectIndex).attr(\"x\")),\r\n selectRectY = parseInt($(selectRectId + selectedRectIndex).attr(\"y\"));\r\n if ((this.multiSelectDraw || !this.removeRect || !this.resize || !this.rectPan) && (selectRectWidth > 0 && selectRectHeight > 0)) {\r\n var rightRectOptions = {\r\n 'id': containerSvg + '_resize_rightRect' + selectedRectIndex,\r\n 'x': selectRectX + selectRectWidth - 5,\r\n 'y': selectRectY + 10,\r\n 'width': 10,\r\n 'height': selectRectHeight - 20 > 0 ? selectRectHeight - 20 : 0,\r\n 'fill': \"transparent\",\r\n 'stroke': \"transparent\",\r\n 'stroke-width': 2,\r\n 'cursor': 'e-resize'\r\n };\r\n this.svgRenderer.drawRect(rightRectOptions, this.gEle);\r\n var bottomRectOptions = {\r\n 'id': containerSvg + '_resize_bottomRect' + selectedRectIndex,\r\n 'x': selectRectX,\r\n 'y': selectRectY + selectRectHeight - 5,\r\n 'width': selectRectWidth - 10 > 0 ? selectRectWidth - 10 : 0,\r\n 'height': 10,\r\n 'fill': \"transparent\",\r\n 'stroke': \"transparent\",\r\n 'stroke-width': 2,\r\n 'cursor': 's-resize'\r\n };\r\n this.svgRenderer.drawRect(bottomRectOptions, this.gEle);\r\n var leftRectOptions = {\r\n 'id': containerSvg + '_resize_leftRect' + selectedRectIndex,\r\n 'x': selectRectX - 5,\r\n 'y': selectRectY,\r\n 'width': 10,\r\n 'height': selectRectHeight,\r\n 'fill': \"transparent\",\r\n 'stroke': \"transparent\",\r\n 'stroke-width': 2,\r\n 'cursor': 'w-resize'\r\n };\r\n this.svgRenderer.drawRect(leftRectOptions, this.gEle);\r\n var topRectOptions = {\r\n 'id': containerSvg + '_resize_topRect' + selectedRectIndex,\r\n 'x': selectRectX,\r\n 'y': selectRectY - 5,\r\n 'width': selectRectWidth - 10 > 0 ? selectRectWidth - 10 : 0,\r\n 'height': 10,\r\n 'fill': \"transparent\",\r\n 'stroke': \"transparent\",\r\n 'stroke-width': 2,\r\n 'cursor': 'n-resize'\r\n };\r\n this.svgRenderer.drawRect(topRectOptions, this.gEle);\r\n var bottomRightCornerCircleOptions = {\r\n 'id': containerSvg + '_resize_bottomRightCornerCircle' + selectedRectIndex,\r\n 'cx': selectRectX + selectRectWidth,\r\n 'cy': selectRectY + selectRectHeight,\r\n 'r': 10,\r\n 'fill': \"transparent\",\r\n 'stroke': \"transparent\",\r\n 'stroke-width': 2,\r\n 'cursor': 'se-resize'\r\n };\r\n this.svgRenderer.drawCircle(bottomRightCornerCircleOptions, this.gEle);\r\n var topRightCornerCircleOptions = {\r\n 'id': containerSvg + '_closeTopRightCornerCircle' + selectedRectIndex,\r\n 'cx': selectRectX + selectRectWidth,\r\n 'cy': selectRectY,\r\n 'r': 10,\r\n 'fill': \"white\",\r\n 'stroke': \"#2988d6\",\r\n 'stroke-width': 2,\r\n 'cursor': 'pointer'\r\n };\r\n this.svgRenderer.drawCircle(topRightCornerCircleOptions, this.gEle);\r\n var closingPathOptions = {\r\n 'id': containerSvg + '_closePath' + selectedRectIndex,\r\n 'x1': selectRectX + selectRectWidth - 4,\r\n 'y1': selectRectY - 4,\r\n 'x2': selectRectX + selectRectWidth + 4,\r\n 'y2': selectRectY + 4,\r\n 'stroke': \"#2988d6\",\r\n 'stroke-width': 2,\r\n 'cursor': 'pointer'\r\n };\r\n this.svgRenderer.drawLine(closingPathOptions, this.gEle);\r\n var closingPathOppositeOptions = {\r\n 'id': containerSvg + '_closePathOpposite' + selectedRectIndex,\r\n 'x1': selectRectX + selectRectWidth + 4,\r\n 'y1': selectRectY - 4,\r\n 'x2': selectRectX + selectRectWidth - 4,\r\n 'y2': selectRectY + 4,\r\n 'stroke': \"#2988d6\",\r\n 'stroke-width': 2,\r\n 'cursor': 'pointer'\r\n };\r\n this.svgRenderer.drawLine(closingPathOppositeOptions, this.gEle);\r\n cx = [16, 10, 4, 10, 4, 4];\r\n cy = [4, 4, 4, 10, 10, 16];\r\n index = [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\"];\r\n for (var t = 0; t < 6; t++) {\r\n var gripOptions = {\r\n 'id': containerSvg + '_gripCircle_' + index[t] + selectedRectIndex,\r\n 'cx': selectRectX + selectRectWidth - cx[t],\r\n 'cy': selectRectY + selectRectHeight - cy[t],\r\n 'r': 0.4,\r\n 'stroke': \"#5B5B5B\",\r\n 'stroke-width': 2,\r\n }\r\n this.svgRenderer.drawCircle(gripOptions, this.gripCollection);\r\n }\r\n if ((this.gripCollection != null))\r\n $(this.gripCollection).appendTo(this.gEle);\r\n $(\"#\" + containerSvg + \"_gripCollection\" + selectedRectIndex).css({ 'visibility': 'hidden' });\r\n }\r\n if (ej.util.isNullOrUndefined(this.oldRectX)) {\r\n this.oldRectX = []; this.oldRectY = []; this.oldRectWidth = []; this.oldRectHeight = [];\r\n this.oldReRightRectX = []; this.oldReTopRectY = []; this.oldReBottomRectY = [];\r\n }\r\n this.oldRectX[selectedRectIndex] = parseInt($(selectRectId + selectedRectIndex).attr('x'));\r\n this.oldRectY[selectedRectIndex] = parseInt($(selectRectId + selectedRectIndex).attr('y'));\r\n this.oldRectWidth[selectedRectIndex] = parseInt($(selectRectId + selectedRectIndex).attr('width'));\r\n this.oldRectHeight[selectedRectIndex] = parseInt($(selectRectId + selectedRectIndex).attr('height'));\r\n this.oldReRightRectX[selectedRectIndex] = parseInt($(\"#\" + containerSvg + \"_resize_rightRect\" + selectedRectIndex).attr('x'));\r\n this.oldReTopRectY[selectedRectIndex] = parseInt($(\"#\" + containerSvg + \"_resize_topRect\" + selectedRectIndex).attr('y'));\r\n this.oldReBottomRectY[selectedRectIndex] = parseInt($(\"#\" + containerSvg + \"_resize_bottomRect\" + selectedRectIndex).attr('y'));\r\n this.oldMultiSelectType = this.multiSelectType;\r\n if (this.resize || this.rectPan) {\r\n //to remove the grip after resizing at the bottom right corner\r\n if (this.resize)\r\n $(\"#\" + this.svgObject.id + \"_gripCollection\" + selectedRectIndex).attr({ 'transform': \"\" });\r\n $(\"#\" + containerSvg + \"_closeTopRightCornerCircle\" + selectedRectIndex).css({ 'display': 'inline' });\r\n $(\"#\" + containerSvg + \"_closePath\" + selectedRectIndex).css({ 'display': 'inline' });\r\n $(\"#\" + containerSvg + \"_closePathOpposite\" + selectedRectIndex).css({ 'display': 'inline' });\r\n $(\"#\" + containerSvg + '_resize_rightRect' + selectedRectIndex).css({ 'cursor': 'e-resize' });\r\n $(\"#\" + containerSvg + '_resize_leftRect' + selectedRectIndex).css({ 'cursor': 'w-resize' });\r\n $(\"#\" + containerSvg + '_resize_bottomRect' + selectedRectIndex).css({ 'cursor': 's-resize' });\r\n $(\"#\" + containerSvg + '_resize_topRect' + selectedRectIndex).css({ 'cursor': 'n-resize' });\r\n }\r\n this.drag = false;\r\n if (this.removeRect) {\r\n $(\"#\" + containerSvg + \"_selectedRectGroup\" + selectedRectIndex).remove();\r\n if (this.parentgEle.childNodes.length <= 0) $(this.parentgEle).remove();\r\n }\r\n if ((this.multiSelectDraw || this.removeRect || this.resize || this.rectPan) && (selectRectWidth > 0 && selectRectHeight > 0)) {\r\n this.multiSelectDraw = false;\r\n this.multiSelectDataCalculation(evt);\r\n }\r\n if (this.resize) this.resize = false;\r\n if (this.rectPan) this.rectPan = false;\r\n this.removeRect = false;\r\n this.enableTrackBall();\r\n }\r\n },\r\n chartMouseUp: function (evt) {\r\n if (this.isTouch(evt)) {\r\n this.model.touchCross = false;\r\n this.chartMouseUpTouch(evt);\r\n }\r\n if (!this.currentPageX && this.panning) {\r\n var mouseDownCords = this.calMousePosition(evt);\r\n this.currentPageX = mouseDownCords.X;\r\n this.currentPageY = mouseDownCords.Y;\r\n }\r\n\r\n var chart = this;\r\n var model = this.model;\r\n this.mousedownPointX = this.mousedownPointY = null;\r\n $(\"[id*=\" + \"_PreviewSeries\" + \"]\").remove();\r\n $(\"[id*=\" + \"_Marker\" + \"]\").remove();\r\n if (chart.dragPoint) {\r\n var i = this.dragIndex.seriesIndex,\r\n chartSeries = model._visibleSeries[i];\r\n if (!this.model.enableCanvasRendering) {\r\n if (this.gPreviewSeriesGroupEle) {\r\n $(this.svgObject).find(\"#\" + this.svgObject.id + \"_PreviewSeriesGroup_\" + i).remove();\r\n if (this.gPreviewSeriesGroupEle.childNodes.length > 0)\r\n this.gPreviewSeriesGroupEle.removeChild(this.gPreviewSeriesGroupEle.childNodes[0]);\r\n }\r\n }\r\n var commonDragEventArgs, valAxis, srIndex, ptIndex;\r\n this.dragPoint = chartSeries.dragPoint = false;\r\n var draggedPoints = this._getDraggedPoint(chartSeries, this.mousemoveX, this.mousemoveY),\r\n xPoint = draggedPoints.X,\r\n yPoint = draggedPoints.Y;\r\n srIndex = chartSeries.data.seriesIndex,\r\n ptIndex = chartSeries.data.pointIndex;\r\n\r\n var oldValue = { X: this.commonDragEventArgs.data.oldValue.X, Y: this.commonDragEventArgs.data.oldValue.Y },\r\n newValue = { X: xPoint, Y: yPoint };\r\n commonDragEventArgs = $.extend({}, this.commonDragEventArgs);\r\n commonDragEventArgs.data = { series: chartSeries, seriesIndex: srIndex, pointIndex: ptIndex, oldValue: oldValue, newValue: newValue };\r\n this._trigger(\"dragEnd\", commonDragEventArgs);\r\n chart.commonDragEventArgs = commonDragEventArgs;\r\n chart._changeDraggingPoints(chartSeries, ptIndex, commonDragEventArgs.data.newValue.X, commonDragEventArgs.data.newValue.Y);\r\n chartSeries.region = null;\r\n this.redraw();\t\t// to redraw the chart after changing the points \r\n }\r\n if (this.multiSelectAreaType == 'cartesianaxes' && (!model.zooming.enable) && (!model.enableCanvasRendering))\r\n this.multiSelectMouseUp(evt);\r\n var chart = this;\r\n if (model.zooming.enable && model.AreaType == \"cartesianaxes\") {\r\n var zoomRect = $(\"#\" + this.svgObject.id + \"_ZoomArea\");\r\n if (zoomRect[0]) {\r\n if (model.enableCanvasRendering) {\r\n var zoomArea = zoomRect[0].getClientRects()[0];\r\n var zoomRectWidth = zoomArea.width;\r\n var zoomRectHeight = zoomArea.height;\r\n } else {\r\n var $zoomRect = $(zoomRect);\r\n var zoomRectWidth = parseFloat(this.svgRenderer._getAttrVal($zoomRect, \"width\"));\r\n var zoomRectHeight = parseFloat(this.svgRenderer._getAttrVal($zoomRect, \"height\"));\r\n }\r\n }\r\n if (zoomRectWidth > 0 && zoomRectHeight > 0) {\r\n chart.doZoom(zoomRect, zoomRectWidth, zoomRectHeight);\r\n }\r\n else\r\n this.drag = false;\r\n if (!chart.panning)\r\n this.enableTrackBall();\r\n }\r\n // Panning is done on mouse up for other devices and when deferredZoom is set to true\r\n var id = this.svgObject.id;\r\n var parentId = ej.util.isNullOrUndefined(evt.target.parentNode) ? \"\" : evt.target.parentNode.id;\r\n\r\n //condition to find the buttons\r\n if (parentId == id + \"_ResetZoom\" || parentId == id + '_ZoomBtn' || evt.target.id == id + \"_ResetZoom\" || evt.target.id == id + '_ZoomBtn') {\r\n this.panning = false;\r\n this.model._chartAreaZoom = false;\r\n }\r\n\r\n //Panning for other devices\r\n if ((ej.isTouchDevice() || model.zooming.enableDeferredZoom) && this.panning && this.doPan && model.AreaType == \"cartesianaxes\") {\r\n var oDelta;\r\n oDelta = {\r\n 'x': this.oPreviousCoords.x - this.currentPageX,\r\n 'y': this.oPreviousCoords.y - this.currentPageY\r\n };\r\n\r\n this.oPreviousCoords = {\r\n 'x': this.currentPageX,\r\n 'y': this.currentPageY\r\n };\r\n $.each(model._axes, function (index, axis) {\r\n var currentScale = Math.max(1 / ej.EjSvgRender.utils._minMax(axis.zoomFactor, 0, 1), 1);\r\n chart.translate(axis, (oDelta.x), (oDelta.y), currentScale);\r\n });\r\n this.model.legendCollapsed = false;\r\n var panEndEventArgs = panStartEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs),\r\n $proxy = this;\r\n\r\n panStartEventArgs.data = { model: this.model };\r\n this._trigger(\"panStart\", panStartEventArgs);\r\n\r\n //setTimeout is necessary to show waiting popup\r\n window.setTimeout(function () {\r\n $proxy.redraw(true, true, evt.target); //to avoid touch event termination in mobiles / deferred pan \r\n $proxy._cursorToPointer();\r\n $proxy._enableZoomingButtons();\r\n panEndEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n panEndEventArgs.data = { model: $proxy.model };\r\n $proxy._trigger(\"panEnd\", panEndEventArgs);\r\n }, 10);\r\n }\r\n\r\n if (this.doPan)\r\n this.doPan = false;\r\n\r\n this.rotateActivate = false;\r\n },\r\n multiSelectMouseDown: function (evt) {\r\n this.multiSelectAreaType = this.model.AreaType.toLowerCase();\r\n var model = this.model, chartX = model.m_AreaBounds.X, chartWidth = model.m_AreaBounds.Width,\r\n chartY = model.m_AreaBounds.Y, chartHeight = model.m_AreaBounds.Height, mouseDownCords = this.calMousePosition(evt);\r\n //to check whether the click is made within the chart area\r\n if (this.multiSelectAreaType == 'cartesianaxes' && (!model.zooming.enable) && (!model.enableCanvasRendering)\r\n && mouseDownCords.X >= chartX && mouseDownCords.X < (chartX + chartWidth) && mouseDownCords.Y < (chartY + chartHeight) && mouseDownCords.Y >= chartY) {\r\n var seriesCollection = this.model.series,\r\n seriesCollectionLength = seriesCollection.length,\r\n id, mouseDownCords, matchStr,\r\n containerSvg = this.svgObject.id,\r\n selectMode = seriesCollection.some((function (val) {\r\n return val.selectionSettings.mode.toLowerCase() == 'range';\r\n }));\r\n this._isMultiSelect = seriesCollection.some((function (val) {\r\n return val.selectionSettings.enable == true && val.selectionSettings.mode.toLowerCase() == \"range\";\r\n }));\r\n if (selectMode) this.multiSelectMode = 'range';\r\n for (var i = 0; i < seriesCollectionLength; i++) {\r\n if ((seriesCollection[i].selectionSettings.enable == true) && (seriesCollection[i].selectionSettings.mode.toLowerCase() == 'range'))\r\n this.multiSelectType = seriesCollection[i].selectionSettings.rangeType.toLowerCase();\r\n }\r\n if (this._isMultiSelect && this.multiSelectMode == 'range') {\r\n this.disableTrackBall();\r\n mouseDownCords = this.calMousePosition(evt);\r\n this.mouseDownX = mouseDownCords.X;\r\n this.mouseDownY = mouseDownCords.Y;\r\n this.drag = true;\r\n if (($(this.parentgEle).find(\"g\").length < 1))\r\n this.selectedRectIndex = 0;\r\n else {\r\n id = $(this.parentgEle).find(\"g\").last().attr(\"id\");\r\n matchStr = containerSvg + \"_gripCollection\";\r\n id = parseInt(id.substr(matchStr.length));\r\n this.selectedRectIndex = id + 1;\r\n }\r\n if ($(this.parentgEle).find(\"g\").length == 0) {\r\n this.parentgEle = this.svgRenderer.createGroup({ 'id': containerSvg + '_rectSelectionGroup' });\r\n }\r\n this.gEle = this.svgRenderer.createGroup({ 'id': containerSvg + '_selectedRectGroup' + this.selectedRectIndex });\r\n if ($(this.gripCollection).find(\"g\").length == 0)\r\n this.gripCollection = this.svgRenderer.createGroup({ 'id': containerSvg + '_gripCollection' + this.selectedRectIndex });\r\n if (evt.target.id.indexOf(\"resize\") >= 0) {\r\n id = evt.target.id.split(\"resize\")[1].match(/\\d+/)[0];\r\n this.selectedRectIndex = eval(id);\r\n }\r\n if (evt.target.id.indexOf(\"close\") >= 0) {\r\n id = evt.target.id.split(\"close\")[1].match(/\\d+/)[0];\r\n this.selectedRectIndex = eval(id);\r\n }\r\n if ((evt.target.id.indexOf(this.svgObject.id + \"_selectRect\") >= 0)) {\r\n matchStr = this.svgObject.id + \"_selectRect\";\r\n this.selectedRectIndex = parseInt(evt.target.id.substr(matchStr.length));\r\n }\r\n this.currentIndex = $(evt.target.parentNode).index();\r\n var axes = this.model._axes,\r\n axesLength = axes.length, axis,\r\n mouseMoveCords = this.calMousePosition(evt),\r\n mouseMoveX = mouseMoveCords.X,\r\n mouseMoveY = mouseMoveCords.Y;\r\n this.multiAxis = []\r\n for (var k = 0; k < axesLength; k++) {\r\n axis = axes[k];\r\n if ((mouseMoveX > axis.Location.X1) && (mouseMoveX < axis.Location.X2))\r\n this.multiAxis.push(axis);\r\n if ((mouseMoveY < axis.Location.Y1) && (mouseMoveY > axis.Location.Y2))\r\n this.multiAxis.push(axis);\r\n }\r\n }\r\n }\r\n },\r\n //Triggers while start dragging column or bar points\r\n _grab: function (chartSeries, chartObj, srIndex, ptIndex, point) {\r\n var commonDragEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonDragEventArgs.data = { seriesIndex: srIndex, pointIndex: ptIndex, currentPoint: point };\r\n chartObj._trigger(\"dragStart\", commonDragEventArgs);\r\n chartSeries.data = commonDragEventArgs.data;\r\n this.commonDragEventArgs = commonDragEventArgs;\r\n this.mousedownPointX = this.mousedownPointY = null;\r\n },\r\n _enableDragging: function (chartSeries, seriesIndex, e) {\r\n var chartObj = this, closestXyPoint, data,\r\n type = chartSeries.type.toLowerCase(),\r\n areaType = chartObj.model.AreaType,\r\n visibility = chartSeries.visibility.toLowerCase();\r\n if (this.mousedownPointX && this.mousedownPointY && areaType == \"cartesianaxes\" && !this.model.enable3D && visibility == 'visible' && (type == \"line\" || type == \"spline\" || type == \"area\" ||\r\n type == \"stepline\" || type == \"steparea\" || type == \"splinearea\" || type == \"column\" || type == \"bar\" || type == \"bubble\" || type == \"scatter\")) {\r\n var serY = [], serX = [];\r\n closestXyPoint = this.getClosesPointXY(serX, serY, chartSeries, this.mousedownPointX, this.mousedownPointY, e);\r\n this.mousemoveX = this.mousedownPointX;\r\n this.mousemoveY = this.mousedownPointY;\r\n data = this.GetSeriesPoint(e);\r\n if (!ej.util.isNullOrUndefined(closestXyPoint.point)) {\r\n this.dragPoint = chartSeries.dragPoint = true;\r\n closestXyPoint.seriesIndex = seriesIndex;\r\n chartSeries.pointData = closestXyPoint;\r\n var point = { xValue: closestXyPoint.point.xValue, yValue: closestXyPoint.point.YValues };\r\n chartObj._grab(chartSeries, chartObj, seriesIndex, closestXyPoint.index, point);\r\n this.dragIndex = { pointIndex: closestXyPoint.index, seriesIndex: seriesIndex };\r\n }\r\n if (!ej.util.isNullOrUndefined(data)) {\r\n var region = data.region;\r\n if (seriesIndex == region.SeriesIndex) {\r\n chartSeries.region = data.region;\r\n this.dragPoint = chartSeries.dragPoint = true;\r\n var xVal = chartSeries._visiblePoints[region.Region.PointIndex].xValue,\r\n yVal = chartSeries._visiblePoints[region.Region.PointIndex].YValues,\r\n point = { xValue: xVal, yValue: yVal };\r\n chartObj._grab(chartSeries, chartObj, region.SeriesIndex, region.Region.PointIndex, point);\r\n this.dragIndex = { pointIndex: region.Region.PointIndex, seriesIndex: region.SeriesIndex };\r\n }\r\n }\r\n }\r\n },\r\n chartMouseDown: function (e) {\r\n\r\n //this.cancelEvent(e); \r\n\r\n var model = this.model,\r\n matchStr = this._id + '_scrollbar' + '_',\r\n parentNodeId = (e.target.parentNode && e.target.parentNode.id) ? e.target.parentNode.id : '',\r\n selectionIndex = parentNodeId.indexOf(matchStr) > -1 ? parseInt(parentNodeId.substr(matchStr.length)) : NaN,\r\n isZoom = this.isZoomButtonHovered(e.target),\r\n axes = model._axes,\r\n chart = this, id,\r\n mouseDownCords = this.calMousePosition(e),\r\n browserInfo = this.model.browserInfo;\r\n this.mousedownPointX = mouseDownCords.X;\r\n this.mousedownPointY = mouseDownCords.Y;\r\n if (\"which\" in e) // Gecko (Firefox), WebKit (Safari/Chrome) & Opera\r\n this.chartRightClick = e.which == 3;\r\n else if (\"button\" in e) // IE, Opera \r\n this.chartRightClick = e.button == 2;\r\n if (!isNaN(selectionIndex) && !ej.util.isNullOrUndefined(selectionIndex))\r\n axes[selectionIndex].previousRange = $.extend(true, {}, model._axes[selectionIndex].visibleRange);\r\n\r\n this.mousemoveX = this.mouseDownX = mouseDownCords.X;\r\n this.mousemoveY = this.mouseDownY = mouseDownCords.Y;\r\n if (this.isTouch(e)) {\r\n this.model.event = e;\r\n this.model.touchCross = true;\r\n //this.cancelEvent(e); \r\n if ($.finish)\r\n $(this.model.trackerElement).finish();\r\n else\r\n $(this.model.trackerElement).stop(true, true);\r\n this.model.tapNum = this.model.tapNum || 0;\r\n if (!isZoom)\r\n this.doubleTap(e);\r\n if (chart.model.crosshair.visible && !isZoom) {\r\n var timer = setTimeout(function () {\r\n var zoom = $(\"#\" + chart.svgObject.id).find(\"#\" + chart.svgObject.id + '_ZoomArea'),\r\n padding = chart.model.elementSpacing / 2,\r\n pointer = chart.getEvent(chart.model.event), currX = pointer.pageX,\r\n currY = pointer.pageY;\r\n if (chart.model.touchCross && !chart.panning && Math.abs(currX - chart.model.cachedX) < padding && Math.abs(currY - chart.model.cachedY) < padding && (zoom.length == 0 || (parseFloat($(zoom).attr(\"width\")) == 0 || parseFloat($(zoom).attr(\"height\")) == 0))) {\r\n chart.chartInteractiveBehavior(e);\r\n chart.model.crosshairMoved = true;\r\n chart.drag = false;\r\n }\r\n\r\n\r\n }, 500);\r\n\r\n }\r\n\r\n }\r\n\r\n if (this.model.enable3D && this.model.enableRotation)\r\n this.rotateActivate = true;\r\n\r\n if (!this.svgRenderer.vmlNamespace) {\r\n this.oPreviousCoords = {};\r\n if (e.target.id.indexOf(\"resize\") >= 0) {\r\n id = e.target.id.split(\"resize\")[1].match(/\\d+/)[0];\r\n this.selectedRectIndex = eval(id);\r\n this.multiSelectMouseDownId = e.target.id;\r\n this.resize = true;\r\n }\r\n if (e.target.id.indexOf(\"close\") >= 0) {\r\n id = e.target.id.split(\"close\")[1].match(/\\d+/)[0];\r\n this.selectedRectIndex = eval(id);\r\n this.removeRect = true;\r\n }\r\n if ((e.target.id.indexOf(this.svgObject.id + \"_selectRect\") >= 0)) {\r\n matchStr = this.svgObject.id + \"_selectRect\";\r\n this.selectedRectIndex = parseInt(e.target.id.substr(matchStr.length));\r\n }\r\n if (e.target.id == this.svgObject.id + '_selectRect' + this.selectedRectIndex) {\r\n this.rectPan = true;\r\n this.PreviousCoords = {\r\n 'X': e.pageX, 'Y': e.pageY\r\n }\r\n }\r\n if (!this.isTouch(e))\r\n this.multiSelectMouseDown(e);\r\n var parent = this.svgRenderer._getAttrVal($(e.target).parent(), \"id\");\r\n var isZoomToolkit = parent != this.svgObject.id + \"_ZoomBtn\" && parent != this.svgObject.id + \"_ZoomInBtn\" && parent != this.svgObject.id + \"_ZoomOutBtn\" && parent != this.svgObject.id + \"_ResetZoom\" && parent != this.svgObject.id + \"_PanBtn\";\r\n if (isZoomToolkit && this.model.zooming.enable && !this.model.isLazyZooming && !(this.panning) && this.model.AreaType == \"cartesianaxes\") {\r\n\r\n if (this.mouseDownX >= this.model.m_AreaBounds.X && this.mouseDownX < (model.m_AreaBounds.X + model.m_AreaBounds.Width) && this.mouseDownY < (model.m_AreaBounds.Y + model.m_AreaBounds.Height) && this.mouseDownY >= model.m_AreaBounds.Y && !this.isTouch(e)) {\r\n if (isNaN(selectionIndex) || ej.util.isNullOrUndefined(selectionIndex))\r\n this.drag = true;\r\n this.disableTrackBall();\r\n }\r\n\r\n\r\n }\r\n else if (isZoomToolkit && this.panning || $(e.target)[0].className == \"e-hhandle e-box\") {\r\n var mousePanCords = this.calMousePosition(e);\r\n this.mousePanX = mousePanCords.X;\r\n this.mousePanY = mousePanCords.Y;\r\n if (this.mousePanX >= model.m_AreaBounds.X && this.mousePanX < (model.m_AreaBounds.X + model.m_AreaBounds.Width) && this.mousePanY < (model.m_AreaBounds.Y + model.m_AreaBounds.Height + 18) && this.mousePanY >= model.m_AreaBounds.Y) {\r\n this.doPan = true;\r\n\r\n }\r\n }\r\n if (this.rotateActivate || this.doPan)\r\n this.oPreviousCoords = {\r\n 'x': e.pageX,\r\n 'y': e.pageY\r\n };\r\n }\r\n\r\n },\r\n chartMouseLeave: function (evt) {\r\n\r\n this.cancelEvent(evt);\r\n\r\n if (!this.isTouch(evt)) {\r\n // Changes the visibility to hidden\r\n\r\n $(\"[id*=\" + \"_TrackSymbol\" + \"]\").remove();\r\n\r\n this._removeHighlight();\r\n\r\n this._removeTrackBall();\r\n\r\n $(\"#\" + this.svgObject.id + \"_TrackToolTip\").hide();\r\n\r\n $(\"#\" + this._id + \"_tooltip\").remove();\r\n if (($(\".tooltipDiv\" + this._id).hasClass(this.svgObject.id)))\r\n $(\".tooltipDiv\" + this._id).remove();\r\n }\r\n\r\n\r\n\r\n // chartMouseLeave event \r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { location: { x: this.mousemoveX, y: this.mousemoveY }, size: { height: this.model.svgHeight, width: this.model.svgWidth }, id: evt.target.id, pageX: evt.pageX, pageY: evt.pageY };\r\n this._trigger(\"chartMouseLeave\", commonEventArgs);\r\n\r\n },\r\n\r\n\r\n _doClick: function (evt) {\r\n this.drag = false;\r\n if (!this.model.crosshairMoved)\r\n this._removeHighlight();\r\n if (!this.model.selectedDataPointIndexes)\r\n this.model.selectedDataPointIndexes = [];\r\n this.model.clusterPoints = [];\r\n this.model._isStateChaged = false;\r\n var seriesIndex, pointIndex, seriesLength, chartSeries, data, pointer = this.getEvent(evt),\r\n currX = pointer.pageX,\r\n currY = pointer.pageY,\r\n padding = 10,\r\n targetId = evt.target.id,\r\n svgObjectId = this.svgObject.id,\r\n seriesCollection = this.model._visibleSeries,\r\n isZoom = this.isZoomButtonHovered(evt.target),\r\n targetid = evt.target.id;\r\n\r\n //Set current seriesCollection Selection type for selection state maintains \r\n seriesLength = seriesCollection.length;\r\n var isMultiSelection, mode, commonEventArgs, text, getIndex;\r\n data = this.GetSeriesPoint(evt);\r\n if (data) {\r\n seriesIndex = data.region.SeriesIndex;\r\n pointIndex = data.region.Region.PointIndex;\r\n } else {\r\n //Getting SeriesIndex and PointIndex for Path element type series when marker and dataLabels visible\r\n if (this.model.selectionEnable) {\r\n if (!this.model.enable3D && !(evt.target.id.indexOf('LegendItem') != -1) && this.model.AreaType != 'none') {\r\n text = evt.target.id;\r\n getIndex = text.match(/(\\d+)/g);\r\n if (getIndex && (text.indexOf('symbol') != -1 || text.indexOf('Series') != -1) && !(text.indexOf('Text') != -1)) {\r\n seriesIndex = parseInt(getIndex[0]);\r\n pointIndex = isNaN(parseInt(getIndex[1])) ? 0 : parseInt(getIndex[1]);\r\n } else if (getIndex && (text.indexOf('Text') != -1 || text.indexOf('dataLabel') != -1)) {\r\n seriesIndex = parseInt(getIndex[0].charAt(1));\r\n pointIndex = isNaN(parseInt(getIndex[0].charAt(0))) ? parseInt(getIndex[0].charAt(1)) : parseInt(getIndex[0].charAt(0));\r\n }\r\n }\r\n }\r\n }\r\n if (!isZoom || this.model.enableCanvasRendering) {\r\n for (var i = 0; i < this.model._visibleSeries.length; i++) {\r\n chartSeries = this.model._visibleSeries[i];\r\n var type = chartSeries.type.toLowerCase();\r\n if (this.model.AreaType == \"cartesianaxes\" && chartSeries.visibility.toLowerCase() == 'visible' && type !== \"scatter\" && type !== \"bubble\" && type !== \"column\" && type.indexOf(\"bar\") == -1 && type !== \"stackingcolumn\" && type !== \"stackingcolumn100\" && !chartSeries._hiloTypes) {\r\n var serY = [];\r\n var serX = [];\r\n var location = null;\r\n var mouseMoveCords = this.calMousePosition(evt);\r\n this.mousemoveX = mouseMoveCords.X;\r\n this.mousemoveY = mouseMoveCords.Y;\r\n var closestXyPoint = this.getClosesPointXY(serX, serY, chartSeries, this.mousemoveX, this.mousemoveY, evt);\r\n if (!ej.util.isNullOrUndefined(closestXyPoint.point)) {\r\n seriesIndex = i;\r\n pointIndex = closestXyPoint.index;\r\n var commonPointEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonPointEventArgs.data = { location: { x: this.mousemoveX, y: this.mousemoveY }, region: { SeriesIndex: i, Region: { PointIndex: closestXyPoint.index } } };\r\n this._trigger(\"pointRegionClick\", commonPointEventArgs);\r\n }\r\n }\r\n }\r\n if (data && (!isZoom || this.model.enableCanvasRendering)) {\r\n commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = data;\r\n this._trigger(\"pointRegionClick\", commonEventArgs);\r\n }\r\n }\r\n\r\n if (this.model.AreaType == \"none\" && this.model.enable3D && $(evt.target)[0].nodeName == \"path\" && (!this.isTouch(evt) || (Math.abs(currX - this.model.cachedX) < padding && Math.abs(currY - this.model.cachedY) < padding))) {\r\n index = $(evt.target)[0].id.match(/(\\d+)/g);\r\n seriesIndex = parseInt(index[index.length - 2]);\r\n pointIndex = parseInt(index[index.length - 1]);\r\n var currentexplodeindex = this.model._visibleSeries[seriesIndex].explodeIndex;\r\n var actualIndex = this.model._visibleSeries[seriesIndex]._visiblePoints[pointIndex].actualIndex;\r\n if (currentexplodeindex == actualIndex)\r\n this.model._visibleSeries[seriesIndex].explodeIndex = null;\r\n else\r\n this.model._visibleSeries[seriesIndex].explodeIndex = actualIndex;\r\n if (!this.vmlRendering && !this.model.enableCanvasRendering)\r\n var selection = this.selectedStyle(this);\r\n $(this.svgObject).empty();\r\n $(this.legendSvgContainer).empty();\r\n this.draw();\r\n if (this.model.AreaType == 'none') {\r\n this.model._isStateChaged = false;\r\n var className, elementsLenth,\r\n styleLength = selection.length,\r\n pathId = \"_Region_Series_\" + seriesIndex + \"_Point_\" + pointIndex,\r\n gElement = $(this.svgObject).find('[id$=' + pathId + '],[id*=' + pathId + 'back],[id*=' + pathId + 'front]'),\r\n elementsLength = gElement.length;\r\n for (var k = 0; k < styleLength; k++) {\r\n for (var i = 0; i < elementsLength; i++) {\r\n if (selection[k].id == gElement[i].id) {\r\n className = selection[k].className;\r\n if (className.indexOf('SelectionStyle') < 0 && (className.indexOf('Selection' + name + 'Style') < 0)) {\r\n $(\"[id=\" + gElement[i].id + \"]\").attr('class', className);\r\n }\r\n }\r\n }\r\n }\r\n if (selection.pattern)\r\n this.svgRenderer.append(selection.pattern, this.svgObject);\r\n }\r\n else {\r\n $('[id*=' + this.svgObject.id + '_LegendItemShape],[id*=_Region_Series_]').each(function () {\r\n $(this).attr('class', '');\r\n });\r\n }\r\n }\r\n var legenddata = this.getLegendData(evt);\r\n if (legenddata) {\r\n $('#template_group_' + this._id).remove();\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = legenddata;\r\n this._trigger(\"legendItemClick\", commonEventArgs);\r\n var seriesIndex = legenddata.legendItem.LegendItem.SeriesIndex;\r\n // legend selection logic perform here\r\n if (!this.model.legend.toggleSeriesVisibility && legenddata.series.selectionSettings.enable) {\r\n this.model._isStateChaged = false;\r\n this.legendSelection(this, legenddata, evt, data);\r\n }\r\n if (!commonEventArgs.cancel && this.model.legend.toggleSeriesVisibility) {\r\n $('[id*=' + this._id + '_Selection_' + ']').remove();\r\n var length = this.model._visibleSeries.length;\r\n if (this.model.AreaType != \"none\" || this.model.AreaType == \"none\" && type != 'pieofpie' && type != 'pyramid' && type != 'funnel' && length > 1) {\r\n var seriesIndex = legenddata.legendItem.LegendItem.SeriesIndex;\r\n var trendlineIndex = legenddata.legendItem.LegendItem.TrendLineIndex;\r\n if (ej.util.isNullOrUndefined(trendlineIndex)) {\r\n legenddata.series.visibility = legenddata.series.visibility.toLowerCase() === 'visible' ? 'hidden' : 'visible';\r\n this.model.series[seriesIndex].visibility = legenddata.series.visibility;\r\n if (this._notifyArrayChange)\r\n this._notifyArrayChange(\"series[\" + seriesIndex + \"]visibility\", legenddata.series.visibility);\r\n } else {\r\n var trendlineVisible = legenddata.series.trendlines[trendlineIndex].visibility.toLowerCase();\r\n trendlineVisible = trendlineVisible === 'visible' ? 'hidden' : 'visible';\r\n this.model.series[seriesIndex].trendlines[trendlineIndex].visibility = trendlineVisible;\r\n if (this._notifyArrayChange)\r\n this._notifyArrayChange(\"series[\" + seriesIndex + \"].trendlines[\" + trendlineIndex + \"].visibility\", trendlineVisible);\r\n }\r\n }\r\n else {\r\n if (this.model._isPieOfPie) {\r\n var point = this._getPieOfPiePoint(legenddata.legendItem.LegendItem.ActualIndex, legenddata.series, legenddata)._visibility;\r\n var pointIndex = legenddata.legendItem.LegendItem.ActualIndex;\r\n }\r\n else {\r\n var point = legenddata.series.visiblePoints[legenddata.legendItem.LegendItem.PointIndex]._visibility;\r\n var pointIndex = legenddata.series.visiblePoints[legenddata.legendItem.LegendItem.PointIndex].actualIndex;\r\n }\r\n legenddata.series.points[pointIndex]._visibility = point === 'visible' ? 'hidden' : 'visible';\r\n }\r\n if (this.model.enableCanvasRendering) {\r\n /** Canvas Chart image is cleared when click the legend item to show/hide the series**/\r\n var chartRect = document.getElementById(this._id).getClientRects()[0];\r\n this.svgRenderer.ctx.clearRect(0, 0, chartRect.width, chartRect.height);\r\n //Canvas series marker element removed\r\n $(\"#\" + this._id).find('[id*=\"canvas_symbol\"]').remove();\r\n }\r\n $(this.svgObject).empty();\r\n $(this.legendSvgContainer).empty();\r\n for (var j = 0; j < this.model.series.length; j++)\r\n this.model.series[j].regionAdded = false;\r\n this.model.legendCollapsed = true;\r\n this.disableAnimation();\r\n this.draw();\r\n this.enableAnimation();\r\n if (this.model.AreaType != \"none\" && this.zoomed)\r\n this._enableZoomingButtons();\r\n }\r\n }\r\n\r\n //axisLabelClick event\r\n var axisData = this.getAxisLabelData(evt);\r\n if (axisData) {\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = axisData;\r\n this._trigger(\"axisLabelClick\", commonEventArgs);\r\n\r\n }\r\n\r\n // multi level labels click event\r\n var labelData = this.getAxisMultiLevelLabelsData(evt);\r\n if (labelData) {\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = labelData;\r\n this._trigger(\"multiLevelLabelClick\", commonEventArgs);\r\n }\r\n\r\n //annotationClick event\r\n if (targetid.indexOf(\"annotation_\") >= 0) {\r\n var len = targetid.lastIndexOf(\"_\");\r\n var str = targetid.substr(len + 1, targetid.length);\r\n var index = parseInt(str);\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { location: { x: this.mousemoveX, y: this.mousemoveY }, contentData: this.model.annotations[index], pageX: evt.pageX, pageY: evt.pageY };\r\n this._trigger(\"annotationClick\", commonEventArgs);\r\n\r\n\r\n }\r\n\r\n //Selection started here\r\n var isSelectionSetting = !ej.isNullOrUndefined(seriesIndex) ? this.model._visibleSeries[seriesIndex].selectionSettings.enable : false;\r\n if (!ej.isNullOrUndefined(seriesIndex) && !legenddata && isSelectionSetting && (!this.isTouch(evt) || (!this.model.crosshairMoved && Math.abs(currX - this.model.cachedX) < padding && Math.abs(currY - this.model.cachedY) < padding))) {\r\n isMultiSelection = seriesCollection[seriesIndex].selectionSettings.type.toLowerCase() == 'multiple' ? true : false;\r\n mode = seriesCollection[seriesIndex].selectionSettings.mode;\r\n if (mode.toLowerCase() != 'range')\r\n this.segmentSelection(evt, legenddata, seriesIndex, pointIndex, data, seriesCollection);\r\n }\r\n this.model.crosshairMoved = false;\r\n //chartClick event\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { location: { x: this.mousemoveX, y: this.mousemoveY }, size: { height: this.model.svgHeight, width: this.model.svgWidth }, id: targetid, pageX: evt.pageX, pageY: evt.pageY };\r\n this._trigger(\"chartClick\", commonEventArgs);\r\n\r\n },\r\n\r\n //Getting targetId when selection state changed by redraw,setmodel\r\n getTargetId: function (seriesIndex, pointIndex, mode) {\r\n var getSelectionId,\r\n type = this.model._visibleSeries[seriesIndex].type.toLowerCase(),\r\n isAreaType = (type.indexOf(\"area\") != -1 || type.indexOf(\"line\") != -1 || type.indexOf(\"scatter\") != -1 ? true : false) ? true : false;\r\n if (this.model.enable3D)\r\n $(\"[id*=\" + '_Region_Series_' + seriesIndex + '_Point_' + pointIndex + \"]\").each(function () {\r\n getSelectionId = this.id;\r\n });\r\n else {\r\n if (mode != 'series' || this.model.AreaType == 'none')\r\n !isAreaType ? $(\"[id$=\" + this.svgObject.id + '_Series' + seriesIndex + '_Point' + pointIndex + \"]\").each(function () {\r\n getSelectionId = this.id;\r\n }) : $(\"[id*=\" + this.svgObject.id + '_Series' + seriesIndex + '_Point' + pointIndex + '_symbol' + \"]\").each(function () {\r\n getSelectionId = this.id;\r\n });\r\n else\r\n $(\"[id*=\" + this.svgObject.id + '_Series' + seriesIndex + \"]\").each(function () {\r\n getSelectionId = this.id;\r\n });\r\n }\r\n return getSelectionId;\r\n },\r\n\r\n findCanvasSelection: function (seriesIndex, pointIndex, mode) {\r\n var isSelectionFound;\r\n if (mode == 'point')\r\n isSelectionFound = $('#' + this._id + '_Selection_series' + seriesIndex + '_point_' + pointIndex + '_canvas').length;\r\n else if (mode == 'series')\r\n isSelectionFound = $('#' + this._id + '_Selection_series' + seriesIndex + '_canvas').length;\r\n else\r\n isSelectionFound = $('#' + this._id + '_Selection_Cluster' + '_point_' + pointIndex + '_canvas').length;\r\n return isSelectionFound == 1 ? true : false;\r\n },\r\n\r\n //Selection logic started here\r\n segmentSelection: function (evt, legendData, seriesIndex, pointIndex, data) {\r\n var seriesCollection = this.model._visibleSeries,\r\n series = seriesCollection[seriesIndex];\r\n\r\n if (ej.isNullOrUndefined(series)) return 0;\r\n var selectionSettings = series.selectionSettings,\r\n isSelectionSettings = selectionSettings.enable,\r\n isMultiSelection = selectionSettings.type.toLowerCase() == 'multiple' ? true : false,\r\n mode = selectionSettings.mode,\r\n isTrackball = false, chart = this,\r\n targetId, parentNodeId, isSelectionFound, isElement, sIndex, pIndex, data, dataLength, seriesFlag, pointFlag, accPointFlag, clusterFlag, accSeriesClusterFlag, className;\r\n this.model.isSelected = true;\r\n //Calculating cluster points\r\n if (!ej.isNullOrUndefined(pointIndex) && mode == 'cluster') {\r\n var clusterPoints = [],\r\n points, pointsLength,\r\n xvalue = seriesCollection[seriesIndex]._visiblePoints[pointIndex].xValue;\r\n for (var i = 0, len = seriesCollection.length; i < len; i++) {\r\n points = seriesCollection[i].points;\r\n pointsLength = points.length;\r\n for (var j = 0; j < pointsLength; j++)\r\n if (xvalue == points[j].xValue && points[j].isEmpty == false && points[j].visible == true)\r\n clusterPoints[clusterPoints.length] = { seriesIndex: i, pointIndex: j };\r\n }\r\n this.model.clusterPoints = clusterPoints;\r\n }\r\n\r\n //Get Target and parent node Id's by using seriesIndex and pointIndex\r\n if (!this.model.enableCanvasRendering) {\r\n targetId = this.getTargetId(seriesIndex, pointIndex, mode);\r\n if (targetId) {\r\n parentNodeId = $('#' + targetId)[0].parentNode.id;\r\n var parentNode = $('#' + parentNodeId)[0];\r\n //Checking wether target parent or tracker symbols present or not\r\n if (parentNode != null) {\r\n if (parentNodeId) {\r\n isElement = (parentNodeId.indexOf(this.svgObject.id + \"_TextGroup_\") >= 0 || parentNodeId.indexOf(this.svgObject.id + \"_symbolGroup\") >= 0) ? true : false;\r\n if (parentNodeId.indexOf(this.svgObject.id + \"_TrackSymbol_\") >= 0) {\r\n isElement = true;\r\n isTrackball = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (this.model.enableCanvasRendering)\r\n isSelectionFound = this.findCanvasSelection(seriesIndex, pointIndex, mode);\r\n else {\r\n className = $(\"#\" + targetId).attr('class') ? $(\"#\" + targetId).attr('class') : '';\r\n isSelectionFound = className.indexOf('Selection') != -1 ? true : false;\r\n if (this.model.enable3D) {\r\n className = $(\"[id*=\" + '_Region_Series_' + seriesIndex + '_Point_' + pointIndex + \"]\").attr('class') ? $(\"[id*=\" + '_Region_Series_' + seriesIndex + '_Point_' + pointIndex + \"]\").attr('class') : '';\r\n isSelectionFound = className.indexOf('Selection') != -1 ? true : false;\r\n }\r\n }\r\n //Selection Removal Logic \r\n if ((isSelectionFound || !isMultiSelection) || isMultiSelection) {\r\n this.removeSelection(seriesIndex, pointIndex, seriesCollection, mode, isMultiSelection, legendData, isSelectionFound);\r\n data = this.model.selectedDataPointIndexes;\r\n dataLength = data.length;\r\n if (dataLength > 0 && !this.model._isStateChaged) {\r\n if (!isMultiSelection) {\r\n for (var k = 0; k < dataLength; k++) {\r\n sIndex = data[k].seriesIndex;\r\n pIndex = data[k].pointIndex;\r\n seriesFlag = (mode == 'series' && ((sIndex == seriesIndex && pIndex == pointIndex) || (sIndex != seriesIndex || pIndex != pointIndex)));\r\n accPointFlag = ((mode == 'point' || this.model.AreaType == 'none') && (sIndex == seriesIndex && pIndex == pointIndex));\r\n clusterFlag = (mode == 'cluster' && (pIndex == pointIndex));\r\n if (seriesFlag || accPointFlag || clusterFlag) {\r\n data.splice(k, 1); dataLength = data.length; k = -1;\r\n }\r\n }\r\n } else if (isSelectionFound) {\r\n for (var k = 0; k < dataLength; k++) {\r\n sIndex = data[k].seriesIndex;\r\n pIndex = data[k].pointIndex;\r\n seriesFlag = (mode == 'series' && (sIndex == seriesIndex));\r\n accPointFlag = ((mode == 'point' || this.model.AreaType == 'none') && (sIndex == seriesIndex && pIndex == pointIndex));\r\n clusterFlag = (mode == 'cluster' && (pIndex == pointIndex));\r\n if (((seriesFlag || clusterFlag) && this.model.AreaType != 'none') || accPointFlag) {\r\n data.splice(k, 1); dataLength = data.length; k = -1;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n //Selection Started for 2D,3D,Canvas\r\n if (!isSelectionFound) {\r\n this.model.enableCanvasRendering ? this.canvasSelection(this, evt, series, legendData, seriesIndex, pointIndex, data, selectionSettings) : this.selection(chart, evt, series, isTrackball, legendData, seriesIndex, pointIndex, parentNodeId, targetId, data);\r\n data = this.model.selectedDataPointIndexes;\r\n dataLength = data.length;\r\n if (!this.model._isStateChaged) {\r\n if (dataLength > 0) {\r\n if (!isMultiSelection) {\r\n for (var k = 0; k < dataLength; k++) {\r\n sIndex = data[k].seriesIndex;\r\n pIndex = data[k].pointIndex;\r\n accSeriesClusterFlag = ((mode == 'series' || mode == 'cluster' || this.model.AreaType == 'none') && (data[k].SeriesIndex != seriesIndex || data[k].PointIndex != pointIndex));\r\n pointFlag = (mode == 'point' && (data[k].SeriesIndex == seriesIndex));\r\n if (accSeriesClusterFlag || pointFlag) {\r\n data.splice(k, 1); dataLength = this.model.selectedDataPointIndexes.length; k = -1;\r\n }\r\n }\r\n data.push({ 'legendData': legendData, 'seriesIndex': seriesIndex, 'pointIndex': pointIndex });\r\n } else {\r\n data.push({ 'legendData': legendData, 'seriesIndex': seriesIndex, 'pointIndex': pointIndex });\r\n }\r\n } else\r\n data.push({ 'legendData': legendData, 'seriesIndex': seriesIndex, 'pointIndex': pointIndex });\r\n }\r\n }\r\n\r\n //Getting selected data here\r\n var selectedData = { selectedData: this.model.selectedDataPointIndexes };\r\n this._trigger(\"seriesRegionClick\", selectedData);\r\n },\r\n\r\n\r\n //legend Selection logic perform here\r\n legendSelection: function (chart, legenddata, evt, data) {\r\n var selectedData = this.model.selectedDataPointIndexes ? this.model.selectedDataPointIndexes : [],\r\n length = this.model._visibleSeries.length,\r\n index = (chart.model.AreaType == 'none' && length == 1) ? legenddata.legendItem.LegendItem.PointIndex : legenddata.legendItem.LegendItem.SeriesIndex,\r\n seriesIndex = legenddata.legendItem.LegendItem.SeriesIndex,\r\n pointIndex = index,\r\n legendItem = chart.svgObject.id + '_LegendItemShape' + index,\r\n legendClass = $('#' + legendItem).attr('class') ? $('#' + legendItem).attr('class') : '';\r\n if ($('#' + chart._id + '_Selection_Legend' + index + '_canvas').length == 1 || legendClass.indexOf('Selection') != -1) {\r\n $('#' + chart._id + '_Selection_Legend' + index + '_canvas').remove();\r\n $(\"[id*=\" + chart._id + '_Selection_series' + index + \"]\").remove();\r\n $('#' + this._id + '_Selection_series' + seriesIndex + '_point_' + pointIndex + '_canvas').remove();\r\n $('#' + legendItem).attr('class', '');\r\n $(\"[id*=\" + chart.svgObject.id + '_Series' + seriesIndex + \"]\").attr('class', '');\r\n $(\"[id*=\" + '_Region_Series_' + seriesIndex + \"]\").attr('class', '');\r\n for (var k = 0; k < selectedData.length; k++) {\r\n if (selectedData[k].seriesIndex == index || (this.model.AreaType == 'none' && selectedData[k].pointIndex == index)) {\r\n selectedData.splice(k, 1); break;\r\n }\r\n }\r\n }\r\n else\r\n chart.segmentSelection(evt, legenddata, seriesIndex, pointIndex, data);\r\n },\r\n\r\n chartMouseClick: function (evt) {\r\n\r\n this.cancelEvent(evt);\r\n if (window.navigator.msPointerEnabled) {\r\n evt = evt.originalEvent;\r\n }\r\n this._doClick(evt);\r\n },\r\n chartMouseDoubleClick: function (evt) {\r\n\r\n\r\n if (window.navigator.msPointerEnabled) {\r\n evt = evt.originalEvent;\r\n }\r\n //chartDoubleClick event\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { location: { x: this.mousemoveX, y: this.mousemoveY }, size: { height: this.model.svgHeight, width: this.model.svgWidth }, id: evt.target.id, pageX: evt.pageX, pageY: evt.pageY };\r\n this._trigger(\"chartDoubleClick\", commonEventArgs);\r\n\r\n },\r\n drawTrackerSymbol: function (series, seriesIndex, ptIndex, tracker, point, id, trackcount) {\r\n\r\n var type = series.type.toLowerCase(), offsetX, offsetY;\r\n var chartSeriesObj = new ej.seriesTypes[type]();\r\n var index = series.type.toLowerCase() == \"boxandwhisker\" ? trackcount : ptIndex;\r\n var trans = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, this.model.requireInvertedAxes);\r\n offsetX = !series.isTransposed ? series.xAxis.plotOffset : series.yAxis.plotOffset;\r\n offsetY = !series.isTransposed ? series.yAxis.plotOffset : series.xAxis.plotOffset;\r\n var clipRectOptions = {\r\n 'id': this.svgObject.id + '_ClipRectTrack' + '_' + seriesIndex,\r\n 'x': - offsetX,\r\n 'y': - offsetY,\r\n 'width': trans.width + offsetX * 2,\r\n 'height': trans.height + offsetY * 2,\r\n 'fill': 'white',\r\n 'stroke-width': 1,\r\n 'stroke': 'Gray'\r\n };\r\n if (this.model.AreaType != \"none\") {\r\n if (this.model.AreaType == 'cartesianaxes' && ((point.X + trans.x) <= (trans.x + trans.width)) && ((point.X + trans.x) >= trans.x || point.X == 0) &&\r\n ((point.Y + trans.y) >= (trans.y) || point.Y == 0)) {\r\n if (this.model.crosshair.visible || type == \"bubble\" || type == \"scatter\") {\r\n if (!series.trackerRemoved) {\r\n var trackId = this.svgObject.id + '_TrackSymbol' + '_' + seriesIndex;\r\n trackId = (type == \"boxandwhisker\") ? trackId + index : trackId;\r\n $(\"#\" + this._id).find('[id*=' + trackId + ']').remove();\r\n var trackId = \"canvas_trackSymbol_\" + seriesIndex;\r\n trackId = (type == \"boxandwhisker\") ? trackId + index : trackId;\r\n $(\"#\" + this._id).find('[id*=' + trackId + ']').remove();\r\n\r\n }\r\n var transSymbolOptions = { 'clip-path': 'url(#' + this.svgObject.id + '_ClipRectTrack' + '_' + seriesIndex + ')', 'class': 'Tracker', 'id': this.svgObject.id + '_TrackSymbol' + '_' + seriesIndex + '_' + index, 'transform': 'translate(' + trans.x + ',' + trans.y + ')' };\r\n this.gTrackerEle = this.svgRenderer.createGroup(transSymbolOptions);\r\n } else\r\n this.gTrackerEle = null; // empty the previously created tracker group if no tracker is drawn now\r\n }\r\n else {\r\n\r\n $('#' + this.svgObject.id + '_TrackSymbol' + '_' + seriesIndex + '_' + index).remove();\r\n var transSymbolOptions = { 'id': this.svgObject.id + '_TrackSymbol' + '_' + seriesIndex + '_' + index };\r\n this.gTrackerEle = this.svgRenderer.createGroup(transSymbolOptions);\r\n if (!this.model.enableCanvasRendering) {\r\n if (this.model.AreaType == 'polaraxes')\r\n this.gTrackerEle.setAttribute('clip-path', 'url(#' + this.svgObject.id + '_SeriesGroup_' + seriesIndex + '_ClipRect)');\r\n else {\r\n this.gTrackerEle.setAttribute('clip-path', 'url(#' + this.svgObject.id + '_ClipRectTrack' + '_' + seriesIndex + ')');\r\n this.gTrackerEle.setAttribute('transform', 'translate(' + trans.x + ',' + trans.y + ')');\r\n }\r\n }\r\n }\r\n if ($(\"#\" + this.svgObject.id + \"_CrosshairGroup\").length == 0) {\r\n var gTrackballOptions = { 'id': this.svgObject.id + '_CrosshairGroup', 'visibility': 'visible' };\r\n this.gTrackball = this.svgRenderer.createGroup(gTrackballOptions);\r\n this.svgRenderer.append(this.gTrackball, this.svgObject);\r\n }\r\n if (this.model.crosshair.marker.visible && !series.isIndicator && series._visiblePoints[ptIndex].visible) {\r\n chartSeriesObj.drawSymbol(seriesIndex, series, ptIndex, (point.X), (point.Y), this, tracker, trackcount);\r\n if (point.low)\r\n chartSeriesObj.drawSymbol(seriesIndex, series, ptIndex, (this.model.requireInvertedAxes ? point.low : point.X), (this.model.requireInvertedAxes ? point.Y : point.low), this, tracker);\r\n }\r\n if (this.gTrackerEle && $(\"#\" + this.gTrackerEle.id).length < 1)\r\n this.svgRenderer.append(this.gTrackerEle, this.gTrackball);\r\n }\r\n if ($(this.svgObject).find(\"#\" + this.svgObject.id + '_ClipRectTrack' + '_' + seriesIndex).length == 0 && !this.vmlRendering) {\r\n this.svgRenderer.drawClipPath(clipRectOptions, $(\"#\" + this.svgObject.id + \"_CrosshairGroup\"));\r\n }\r\n\r\n\r\n },\r\n getClosesPointXY: function (serX, serY, series, x, y, evt) {\r\n var closestPoint,\r\n valAxis = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, this.model.requireInvertedAxes), outlierPosition,\r\n ptIndex, chartPoint, location, pointIndex, pointVisible, closestX, padding = 10, isTouch = this.isTouch(evt),\r\n visiblePointsLength = series._visiblePoints ? series._visiblePoints.length : 0, closestY,\r\n size = series.marker ? $.extend(true, {}, series.marker.size) : { height: 6, width: 6 };\r\n size.height = (isTouch && size.height < padding * 2) ? size.height + padding : size.height;\r\n size.width = (isTouch && size.width < padding * 2) ? size.width + padding : size.width;\r\n if ((y <= (valAxis.y + valAxis.height) && valAxis.y <= y) && (valAxis.x <= x && x <= (valAxis.x + valAxis.width))) {\r\n for (var i = 0; i < visiblePointsLength; i++) {\r\n chartPoint = series._visiblePoints[i];\r\n location = chartPoint.location;\r\n pointVisible = false;\r\n pointIndex = i;\r\n closestX = null;\r\n closestY = null;\r\n\r\n if (series.type == \"boxandwhisker\" && (!this.model.enable3D) && !(ej.util.isNullOrUndefined(chartPoint.boxPlotLocation))) {\r\n\r\n for (var k = 0; k < chartPoint.boxPlotLocation.length; k++) {\r\n var symbolOptions = {\r\n X: chartPoint.boxPlotLocation[k].X, Y: chartPoint.boxPlotLocation[k].Y\r\n };\r\n if (chartPoint.boxPlotLocation[k].outlier == true) {\r\n if (x > ((symbolOptions.X + valAxis.x) - size.width) && x < (symbolOptions.X + valAxis.x + size.width)) {\r\n closestX = chartPoint.x;\r\n if (ej.util.isNullOrUndefined(closestX))\r\n pointVisible = chartPoint.visible;\r\n if (y > ((symbolOptions.Y + valAxis.y) - size.height) && y < symbolOptions.Y + valAxis.y + size.height + padding) {\r\n closestY = chartPoint.boxPlotValues.outliers[k];\r\n outlierPosition = { X: symbolOptions.X, Y: symbolOptions.Y };\r\n }\r\n if (!ej.util.isNullOrUndefined(outlierPosition)) {\r\n closestPoint = chartPoint;\r\n ptIndex = i;\r\n }\r\n }\r\n }\r\n\r\n }\r\n }\r\n if (location) {\r\n if (x > location.X + valAxis.x - (size.width / 2) && x < location.X + valAxis.x + (size.width / 2)) {\r\n closestX = chartPoint.x;\r\n if (ej.util.isNullOrUndefined(closestX))\r\n pointVisible = chartPoint.visible;\r\n }\r\n if (y > location.Y + valAxis.y - (size.height / 2) && y < location.Y + valAxis.y + (size.height / 2)) {\r\n closestY = chartPoint.YValues[0];\r\n }\r\n if ((!ej.util.isNullOrUndefined(closestX) || pointVisible) && !ej.util.isNullOrUndefined(closestY)) {\r\n closestPoint = chartPoint;\r\n ptIndex = i;\r\n }\r\n }\r\n }\r\n }\r\n return { point: closestPoint, index: ptIndex, outlierPosition: outlierPosition };\r\n },\r\n getClosestPointX: function (serX, series, x, y) {\r\n var closestPoint = [];\r\n var valAxis = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, this.model.requireInvertedAxes);\r\n if (this.model.requireInvertedAxes) {\r\n x = Math.abs(y - (valAxis.y + valAxis.height));\r\n y = Math.abs(x - valAxis.x);\r\n }\r\n else {\r\n x = Math.abs(x - valAxis.x);\r\n y = Math.abs(y - (valAxis.y + valAxis.height));\r\n }\r\n var mousePoint = ej.EjSvgRender.utils._getValuebyPoint(x, y, series, this.model.requireInvertedAxes);\r\n var pointX = (this.model.requireInvertedAxes) ? mousePoint.PointX : mousePoint.PointX;\r\n var ptIndex = [];\r\n\r\n $.each(series.points, function (pointIndex, chartPoint) {\r\n serX.push(chartPoint.xValue);\r\n });\r\n var closest = this.getClosest(serX, pointX);\r\n if (!ej.util.isNullOrUndefined(closest)) {\r\n if (typeof closest == 'number') {\r\n $.each(series._visiblePoints, function (pointIndex, cPoint) {\r\n if (cPoint.xValue == closest) {\r\n closestPoint.push(cPoint);\r\n ptIndex.push(pointIndex);\r\n\r\n }\r\n });\r\n } else {\r\n closest = closest.getTime();\r\n $.each(series._visiblePoints, function (pointIndex, cPoint) {\r\n if (typeof cPoint.xValue == \"number\" ? cPoint.xValue == closest : cPoint.xValue.getTime() == closest) {\r\n closestPoint.push(cPoint);\r\n ptIndex.push(pointIndex);\r\n\r\n }\r\n });\r\n }\r\n }\r\n return { point: closestPoint, index: ptIndex };\r\n },\r\n getClosest: function (obj, val) {\r\n var closest = null;\r\n this._beforeMin = false;\r\n this._afterMax = false;\r\n\r\n // Work out min and max\r\n var min = Math.min.apply(null, obj);\r\n var max = Math.max.apply(null, obj);\r\n\r\n // Only calculate closest if point is within array\r\n if (val >= min - 0.5 && val <= max + 0.5) {\r\n var i;\r\n for (i = 0; i < obj.length; i++) {\r\n if (closest == null || Math.abs(obj[i] - val) < Math.abs(closest - val)) {\r\n closest = obj[i];\r\n }\r\n }\r\n this._closest = null;\r\n }\r\n else {\r\n if (val > max) {\r\n closest = obj[obj.length - 1];\r\n this._closest = ej.util.isNullOrUndefined(this._closest) ? closest : (closest > this._closest ? closest : this._closest);\r\n this._afterMax = true;\r\n }\r\n else {\r\n closest = obj[0];\r\n this._closest = ej.util.isNullOrUndefined(this._closest) ? closest : (closest < this._closest ? closest : this._closest);\r\n this._beforeMin = true;\r\n\r\n }\r\n }\r\n return closest;\r\n },\r\n createTooltip: function (region, evt, series) {\r\n if (!series)\r\n series = this.model._visibleSeries[region.SeriesIndex];\r\n var seriesPoint = (series.type == \"pieofpie\") ? this._getPieOfPiePoint(region.Region.PointIndex, series) : (series.type == \"pie\" || series.type == \"doughnut\") && !this.model.enable3D ? series._visiblePoints[region.Region.Index] : series._visiblePoints[region.Region.PointIndex];\r\n var point = (this.dragPoint) ? series.pointCollection[region.Region.PointIndex] : $.extend(true, {}, seriesPoint);\r\n var tooltipMargin = 10;\r\n if (point.visible !== false) {\r\n var format = series.tooltip.format;\r\n if (series.type == \"boxandwhisker\") {\r\n var mouseMoveCords = this.calMousePosition(evt);\r\n this.mousemoveX = mouseMoveCords.X;\r\n this.mousemoveY = mouseMoveCords.Y;\r\n var flag = region.Region.Bounds ? true : false;\r\n if (flag) {\r\n if (region.Region.Bounds.Width == series.outlierSettings.size.width) {\r\n for (var s = 0; s < point.boxPlotLocation.length; s++) {\r\n if (point.boxPlotLocation[s].outlier == true) {\r\n if ((point.boxPlotLocation[s].X + (series.outlierSettings.size.width / 2) > (this.mousemoveX - series.xAxis.x)) && (point.boxPlotLocation[s].X - (series.outlierSettings.size.width / 2) < (this.mousemoveX - series.xAxis.x))) {\r\n if ((point.boxPlotLocation[s].Y + (series.outlierSettings.size.height / 2) > (this.mousemoveY - series.yAxis.y)) && (point.boxPlotLocation[s].Y - (series.outlierSettings.size.height / 2) < (this.mousemoveY - series.yAxis.y))) {\r\n var dataPoints = this.getTooltipFormat(point, series, region.SeriesIndex, region.Region.PointIndex, format, point.boxPlotLocation[s]);\r\n point.x = dataPoints.data.x;\r\n point.y = dataPoints.text;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n var dataPoints = this.getTooltipFormat(point, series, region.SeriesIndex, region.Region.PointIndex, format, point.boxPlotLocation[0]);\r\n point.x = dataPoints.data.x;\r\n point.y = dataPoints.text;\r\n }\r\n }\r\n }\r\n else {\r\n var dataPoints = this.getTooltipFormat(point, series, region.SeriesIndex, region.Region.PointIndex, format);\r\n point.x = dataPoints.data.x;\r\n point.y = dataPoints.data.y;\r\n }\r\n var tooltip = null;\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { currentText: tooltip, seriesIndex: region.SeriesIndex, pointIndex: region.Region.PointIndex, series: series };\r\n this._trigger(\"toolTipInitialize\", commonEventArgs);\r\n var tooltipdiv = $('.tooltipDiv' + this._id);\r\n $(\"#\" + this.svgObject.id).find(\"#\" + this.svgObject.id + \"_TrackToolTip\").attr('visibility', 'hidden');\r\n $(\"#\" + this.svgObject.id + \"_TrackToolTip\").attr('visibility', 'hidden').hide();\r\n if ($('.tooltipDiv' + this._id).length == 0) {\r\n this.tooltipFirst = true;\r\n tooltipdiv = $(\"
\").attr('class', 'tooltipDiv' + this._id).css({ 'position': 'absolute', 'z-index': '13000', 'display': 'block' });\r\n $(document.body).append(tooltipdiv);\r\n $('.tooltipDiv' + this._id).addClass(this.svgObject.id);\r\n } else {\r\n $(\".tooltipDiv\" + this._id).css(\"display\", \"block\");\r\n this.tooltipFirst = false;\r\n }\r\n if (series.tooltip.template != null) {\r\n var cloneNode = $(\"#\" + series.tooltip.template).clone();\r\n $('.tooltipDiv' + this._id)[0].innerHTML = \"\";\r\n $(cloneNode).css(\"display\", \"block\").appendTo(tooltipdiv);\r\n series.count = 1;\r\n point.count = 1;\r\n var seriesColor = this.getSeriesColor(point, region.SeriesIndex, series);\r\n if (seriesColor)\r\n $(tooltipdiv).css(\"background-color\", jQuery.type(seriesColor) == \"array\" ? seriesColor[0].color : seriesColor);\r\n else\r\n $(tooltipdiv).css(\"background-color\", this.model.pointColors[region.Region.PointIndex]);\r\n var data = { series: series, point: point };\r\n if (!ej.util.isNullOrUndefined(commonEventArgs.data.currentText))\r\n $(tooltipdiv).html($(cloneNode).html(commonEventArgs.data.currentText));\r\n else\r\n $(tooltipdiv).html($(tooltipdiv).html().parseTemplate(data));\r\n } else {\r\n $(tooltipdiv).html(commonEventArgs.data.ToolTip);\r\n }\r\n var areaBounds = this.model.m_AreaBounds;\r\n var xPos = evt.pageX + tooltipMargin;\r\n var yPos = evt.pageY + tooltipMargin;\r\n var tooltipWidth = $(tooltipdiv).width();\r\n var tooltipHeight = $(tooltipdiv).height();\r\n var position = document.getElementById(this.svgObject.id).getClientRects()[0];\r\n if (xPos === undefined || xPos === null)\r\n xPos = evt.pageX + tooltipMargin;\r\n if (yPos === undefined || yPos === null)\r\n yPos = evt.pageY + tooltipMargin;\r\n var leftPos = xPos;\r\n var topPos = yPos;\r\n //Checking top position whether tooltip display outside of the area bounds\r\n if ((xPos - $(this.svgObject).offset().left + tooltipWidth) > (areaBounds.X + areaBounds.Width)) {\r\n var diff = (xPos - (tooltipWidth + (2 * tooltipMargin)));\r\n leftPos = diff + $(document).scrollLeft();\r\n }\r\n if ((yPos - $(this.svgObject).offset().top + tooltipHeight) > areaBounds.Y + areaBounds.Height) {\r\n var diff = (yPos + tooltipHeight) - (areaBounds.Y + areaBounds.Height + position.top)\r\n topPos = yPos - diff + $(document).scrollTop();\r\n }\r\n\r\n $(tooltipdiv).css('left', leftPos);\r\n $(tooltipdiv).css('top', topPos);\r\n\r\n var tooltipOptions = series.tooltip;\r\n if (tooltipOptions.enableAnimation) {\r\n $(tooltipdiv).css({\r\n 'transition-property': 'left,top',\r\n '-moz-transition-property': 'left,top', /* Firefox 4 */\r\n '-webkit-transition-property': 'left,top', /* Safari and Chrome */\r\n '-o-transition-property': 'left,top',\r\n 'transition-duration': tooltipOptions.duration,\r\n '-moz-transition-duration': tooltipOptions.duration, /* Firefox 4 */\r\n\r\n '-webkit-transition-duration': this.tooltipFirst ? '0s' : tooltipOptions.duration, /* Safari and Chrome */\r\n '-o-transition-duration': tooltipOptions.duration /* Opera */\r\n });\r\n }\r\n var templateRect = $(tooltipdiv)[0].getBoundingClientRect();\r\n if (templateRect.top < areaBounds.Y + position.top)\r\n $(tooltipdiv).css('top', areaBounds.Y + position.top + $(document).scrollTop());\r\n }\r\n },\r\n\r\n translate: function (axis, translateX, translateY, currentScale) {\r\n var offset = axis.orientation.toLowerCase() == \"horizontal\"\r\n ? translateX / axis.width / currentScale\r\n : translateY / axis.height / currentScale;\r\n\r\n axis.zoomPosition = axis.orientation.toLowerCase() == \"horizontal\"\r\n ? ej.EjSvgRender.utils._minMax(axis.zoomPosition + offset, 0, (1 - axis.zoomFactor))\r\n : ej.EjSvgRender.utils._minMax(axis.zoomPosition - offset, 0, (1 - axis.zoomFactor));\r\n },\r\n highlightFill: function (highlight, chart, seriesIndex, pointIndex, legendData) {\r\n var seriesColors = chart.model.seriesColors;\r\n var pointColors = chart.model.pointColors;\r\n var color = highlight.color;\r\n var length = this.model._visibleSeries.length;\r\n if (legendData && chart.model.AreaType == 'none') {\r\n if (length == 1)\r\n pointIndex = legendData.legendItem.LegendItem.PointIndex;\r\n else\r\n seriesIndex = legendData.legendItem.LegendItem.SeriesIndex;\r\n }\r\n var pointColor = legendData ? seriesColors[seriesIndex] : pointIndex ? chart.model.series[seriesIndex].points[pointIndex] ? chart.model.series[seriesIndex].points[pointIndex].fill : null : null;\r\n var fill = (color != \"\" ? color : chart.model.AreaType == 'none' ? pointColors[pointIndex] : legendData ? seriesColors[seriesIndex] : pointColor ? pointColor : seriesColors[seriesIndex]);\r\n if (Object.prototype.toString.call(fill) === '[object Array]')\r\n fill = fill[1].color;\r\n return fill;\r\n },\r\n\r\n\r\n\r\n // Canvas highlight and selection started here\r\n // Canvas highlight started here\r\n canvasHighlight: function (chart, evt, series, legendData) {\r\n\r\n var highlight = series.highlightSettings;\r\n var data = series.data;\r\n var color = highlight.color;\r\n var opacity = highlight.opacity;\r\n var borderColor = highlight.border.color;\r\n var borderWidth = highlight.border.width;\r\n var patternName = highlight.pattern.toLowerCase();\r\n var legendVisible = chart.model.legend.visible;\r\n var mode = highlight.mode;\r\n var seriesIndex = series.seriesIndex;\r\n var pointIndex = series.pointIndex;\r\n var seriesType = series.type.toLowerCase();\r\n var containerStyle = document.getElementById(chart._id + '_canvas').getBoundingClientRect();\r\n var regions = [];\r\n var points = [];\r\n var clusterPoints = [];\r\n var length = this.model._visibleSeries.length;\r\n var fill = this.highlightFill(highlight, chart, seriesIndex, pointIndex, legendData);\r\n if (chart.model.AreaType != 'none' || (chart.model.AreaType == 'none' && length > 1 && (mode == 'series' || legendData))) {\r\n for (var i = 0, len = chart.model.chartRegions.length; i < len; i++) {\r\n if ((mode == 'series' || legendData) && (seriesIndex == chart.model.chartRegions[i].SeriesIndex))\r\n regions.push(chart.model.chartRegions[i].Region);\r\n }\r\n\r\n\r\n } else {\r\n for (var i = 0, len = chart.model.chartRegions.length; i < len; i++) {\r\n if (seriesIndex == chart.model.chartRegions[i].SeriesIndex && pointIndex == chart.model.chartRegions[i].Region.PointIndex)\r\n regions.push(chart.model._isPieOfPie ? chart._getPieOfPiePoint(chart.model.chartRegions[i].Region.PointIndex, series) : chart.model.chartRegions[i].Region[pointIndex]);\r\n }\r\n }\r\n if (mode == 'cluster' && chart.model.Areatype != 'none' && typeof pointIndex !== \"undefined\") {\r\n var xvalue = chart.model._visibleSeries[seriesIndex]._visiblePoints[pointIndex].xValue;\r\n for (var i = 0, len = chart.model._visibleSeries.length; i < len; i++) {\r\n for (var j = 0; j < chart.model._visibleSeries[i]._visiblePoints.length; j++) {\r\n if (xvalue == chart.model._visibleSeries[i]._visiblePoints[j].xValue)\r\n clusterPoints[clusterPoints.length] = { seriesIndex: i, pointIndex: j };\r\n\r\n }\r\n }\r\n }\r\n for (var k = 0; k < clusterPoints.length; k++) {\r\n clusterseriesIndex = clusterPoints[k].seriesIndex;\r\n clusterpointIndex = clusterPoints[k].pointIndex;\r\n for (var l = 0; l < chart.model.chartRegions.length; l++) {\r\n if (clusterseriesIndex == chart.model.chartRegions[l].SeriesIndex && clusterpointIndex == chart.model.chartRegions[l].Region.PointIndex)\r\n if (mode != \"cluster\")\r\n regions.push(chart.model.chartRegions[l].Region);\r\n else\r\n regions.push(chart.model.chartRegions[l]);\r\n }\r\n }\r\n var index = (chart.model.AreaType == 'none' && length == 1) ? pointIndex : seriesIndex;\r\n if ((mode == 'series' || legendData) && ($('#' + chart._id + '_Selection_series' + index + '_canvas').length == 0) && $('#' + chart._id + '_Selection_' + 'Cluster' + '_point_' + pointIndex + '_canvas').length == 0 && $('#' + chart._id + '_Selection_' + seriesIndex + '_point_' + pointIndex + '_canvas').length == 0) {\r\n points = series._visiblePoints\r\n ctx = this.createCanvasElement(chart._id + '_Highlight_series' + seriesIndex + '_canvas', chart.svgWidth, chart.svgHeight, containerStyle);\r\n color = (patternName == \"none\" || patternName == \"\") ? fill : this.canvasPattern(ctx, chart, evt, fill, highlight);\r\n this.createRect(chart, ctx);\r\n if (seriesType.indexOf(\"column\") != -1 || seriesType.indexOf(\"waterfall\") != -1 || seriesType.indexOf(\"bar\") != -1) {\r\n for (i = 0; i < regions.length; i++) {\r\n var isUnSelected = $('#' + chart._id + '_Selection_' + seriesIndex + '_point_' + i + '_canvas').length == 0 ? true : false;\r\n this.canvasSeriesRect(regions[i], opacity, borderColor, borderWidth, color, isUnSelected, series);\r\n }\r\n }\r\n else if (seriesType == 'pie' || seriesType == 'doughnut' || seriesType == \"pieofpie\") {\r\n regions = (length == 1) ? regions : regions[0];\r\n this.canvasHighlightCircle(chart, highlight, pointIndex, opacity, borderColor, borderWidth, color, regions, seriesType, ctx);\r\n }\r\n else if (seriesType == 'pyramid' || seriesType == 'funnel')\r\n this.canvasHighlightPyramid(chart, regions[0], highlight, ctx, opacity, borderColor, borderWidth, color, seriesType);\r\n else if (seriesType == 'bubble')\r\n this.canvasBubbleHighlight(highlight, regions, chart, seriesIndex, color, borderWidth, opacity, borderColor);\r\n else if (seriesType == 'scatter')\r\n this.canvasScatterHighlight(regions, color, borderWidth, opacity, borderColor);\r\n }\r\n else if (mode == 'cluster' && $('#' + chart._id + '_Selection_' + 'Cluster' + '_point_' + pointIndex + '_canvas').length == 0 && this.model.AreaType != 'none' && $('#' + chart._id + '_Selection_' + seriesIndex + '_point_' + pointIndex + '_canvas').length == 0 && $('#' + chart._id + '_Selection_series' + seriesIndex + '_canvas').length == 0) {\r\n for (var i = 0, len = this.model._visibleSeries.length; i < len; i++) {\r\n var series = this.model._visibleSeries[i];\r\n series.seriesIndex = i;\r\n points.push(series._visiblePoints[pointIndex]);\r\n\r\n }\r\n var sbRegion = [], colors = [];// scatter & bubble region calculation\r\n ctx = this.createCanvasElement(chart._id + '_Highlight_' + '_Cluster' + '_point_' + pointIndex + '_canvas', chart.svgWidth, chart.svgHeight, containerStyle);\r\n this.createRect(chart, ctx);\r\n for (var i = 0, len = this.model._visibleSeries.length; i < len; i++) {\r\n sbRegion = [];\r\n highlight = chart.model._visibleSeries[i].highlightSettings;\r\n color = highlight.color;\r\n opacity = highlight.opacity;\r\n borderColor = highlight.border.color;\r\n borderWidth = highlight.border.width;\r\n patternName = highlight.pattern.toLowerCase();\r\n fill = this.highlightFill(highlight, chart, i, pointIndex, index, legendData);\r\n color = (patternName == \"none\" || patternName == \"\") ? fill : this.canvasPattern(ctx, chart, evt, fill, highlight);\r\n colors.push(color);\r\n for (var r = 0, rlen = regions.length; r < rlen; r++) {\r\n if (regions[r].SeriesIndex == i) {\r\n sbRegion.push(regions[r].Region);\r\n }\r\n }\r\n if (seriesType.indexOf(\"column\") != -1 || seriesType.indexOf(\"waterfall\") != -1 || seriesType.indexOf(\"bar\") != -1) {\r\n var isUnSelected = $('#' + chart._id + '_Selection_' + i + '_point_' + pointIndex + '_canvas').length == 0 ? true : false;\r\n for (var r = 0, rlen = sbRegion.length; r < rlen; r++) {\r\n this.canvasSeriesRect(sbRegion[r], opacity, borderColor, borderWidth, color, isUnSelected, series);\r\n }\r\n }\r\n else if (seriesType == 'bubble') {\r\n this.canvasBubbleHighlight(highlight, sbRegion, chart, i, color, borderWidth, opacity, borderColor);\r\n }\r\n else if (seriesType == 'scatter') {\r\n this.canvasScatterHighlight(sbRegion, color, borderWidth, opacity, borderColor);\r\n }\r\n\r\n }\r\n }\r\n else if ((mode == \"cluster\" && this.model.AreaType == 'none') || mode == 'point' && $('#' + chart._id + '_Selection_' + seriesIndex + '_point_' + pointIndex + '_canvas').length == 0 && $('#' + chart._id + '_Selection_series' + seriesIndex + '_canvas').length == 0 && $('#' + chart._id + '_Selection_' + 'Cluster' + '_point_' + pointIndex + '_canvas').length == 0) {\r\n points[0] = this.model._isPieOfPie ? this._getPieOfPiePoint(pointIndex, series) : series._visiblePoints[pointIndex];\r\n ctx = this.createCanvasElement(chart._id + '_Highlight_' + seriesIndex + '_point_' + pointIndex + '_canvas', chart.svgWidth, chart.svgHeight, containerStyle);\r\n this.createRect(chart, ctx);\r\n color = (patternName == \"none\" || patternName == \"\") ? fill : this.canvasPattern(ctx, chart, evt, fill, highlight);\r\n if (seriesType.indexOf(\"column\") != -1 || seriesType.indexOf(\"waterfall\") != -1 || seriesType.indexOf(\"bar\") != -1) {\r\n regions = []; regions[0] = data.region.Region;\r\n this.canvasSeriesRect(regions[0], opacity, borderColor, borderWidth, color, true, series);\r\n }\r\n else if (seriesType == 'pie' || seriesType == 'doughnut' || seriesType == \"pieofpie\") {\r\n regions = []; regions[0] = data.pointData[0];\r\n this.canvasHighlightCircle(chart, highlight, pointIndex, opacity, borderColor, borderWidth, color, regions, seriesType, ctx);\r\n }\r\n else if (seriesType == 'pyramid' || seriesType == 'funnel') {\r\n this.canvasHighlightPyramid(chart, regions[0], highlight, ctx, opacity, borderColor, borderWidth, color, seriesType);\r\n }\r\n else if (seriesType == 'bubble') {\r\n regions = []; regions[0] = data.region.Region;\r\n this.canvasBubbleHighlight(highlight, regions, chart, seriesIndex, color, borderWidth, opacity, borderColor);\r\n }\r\n else if (seriesType == 'scatter') {\r\n regions = []; regions[0] = data.region.Region;\r\n this.canvasScatterHighlight(regions, color, borderWidth, opacity, borderColor);\r\n }\r\n }\r\n // legend highlight (legend symbol)\r\n if (legendVisible && $('#' + chart._id + '_Selection_Legend' + index + '_canvas').length == 0) {\r\n if (mode == 'cluster' && !legendData && this.model.AreaType != 'none') {\r\n var serIndex;\r\n for (var i = 0, len = clusterPoints.length; i < len; i++) {\r\n serIndex = clusterPoints[i].seriesIndex;\r\n chartSeries = this.model._visibleSeries[serIndex];\r\n this.canvasHighlightLegend(chart, chartSeries, highlight, 'Highlight', containerStyle, colors[serIndex]);\r\n }\r\n }\r\n else\r\n this.canvasHighlightLegend(chart, series, highlight, 'Highlight', containerStyle, color);\r\n\r\n }\r\n if (series.visibility === 'visible' && series.marker.visible == true && this.model.AreaType != 'none')\r\n this.canvasHighlightMarker(chart, series, points, highlight, ctx, evt, colors);\r\n },\r\n\r\n // canvas rect operations perform here\r\n canvasSeriesRect: function (regions, opacity, borderColor, borderWidth, color, isUnSelected, series) {\r\n var options = {\r\n 'opacity': opacity,\r\n 'stroke': borderColor,\r\n 'stroke-width': borderWidth,\r\n 'fill': color\r\n }\r\n var cornerRadius = series.cornerRadius;\r\n if (regions) {\r\n options.x = regions.Bounds.X;\r\n options.y = regions.Bounds.Y;\r\n options.width = regions.Bounds.Width;\r\n options.height = regions.Bounds.Height;\r\n if (isUnSelected)\r\n if ((typeof (cornerRadius) != \"object\" && cornerRadius > 0) || cornerRadius.topLeft > 0 || cornerRadius.bottomLeft > 0\r\n || cornerRadius.topRight > 0 || cornerRadius.bottomRight > 0) {\r\n var roundrect = ej.EjSvgRender.utils._calculateroundedCorner(cornerRadius, options);\r\n options.d = roundrect;\r\n ej.EjCanvasRender.prototype.drawPath(options, ctx);\r\n }\r\n else\r\n this.drawRect(options, ctx);\r\n }\r\n },\r\n\r\n // // canvas selection logic started here\r\n canvasSelection: function (chart, evt, series, legendData, seriesIndex, pointIndex, data, selectionSettings) {\r\n series.seriesIndex = seriesIndex;\r\n series.pointIndex = pointIndex;\r\n var seriesCollection = this.model._visibleSeries,\r\n color = selectionSettings.color,\r\n opacity = selectionSettings.opacity,\r\n borderColor = selectionSettings.border.color,\r\n borderWidth = selectionSettings.border.width,\r\n patternName = selectionSettings.pattern.toLowerCase(),\r\n legendVisible = chart.model.legend.visible,\r\n mode = selectionSettings.mode,\r\n seriesType = series.type.toLowerCase(),\r\n containerStyle = document.getElementById(chart._id + '_canvas').getBoundingClientRect(),\r\n regions = [],\r\n points = [],\r\n length = this.model._visibleSeries.length,\r\n chartRegions = chart.model.chartRegions,\r\n clusterPoints = this.model.clusterPoints,\r\n seriesData = { seriesIndex: seriesIndex, series: series },\r\n index = (chart.model.AreaType == 'none' && length == 1) ? pointIndex : seriesIndex,\r\n fill = this.highlightFill(selectionSettings, chart, seriesIndex, pointIndex, legendData, data), regionsLength, cRlength;\r\n regionsLength = chartRegions.length;\r\n if (chart.model.AreaType != 'none' || (chart.model.AreaType == 'none' && length > 1)) {\r\n for (var i = 0; i < regionsLength; i++) {\r\n if (((mode == 'series' || legendData) && seriesIndex == chartRegions[i].SeriesIndex) || ((mode == 'point' || legendData) && (seriesIndex == chartRegions[i].SeriesIndex && pointIndex == chartRegions[i].Region.PointIndex))) {\r\n if (chart.model.AreaType == 'none' && mode == 'point' && !legendData)\r\n regions.push(chartRegions[i].Region[pointIndex])\r\n else\r\n regions.push(chartRegions[i].Region);\r\n }\r\n }\r\n } else if (regionsLength > 0) {\r\n if (this.model._isPieOfPie) {\r\n if (legendData) {\r\n for (var p = 0; p < series.pieCollections.length; p++) {\r\n var piePoints = series.pieCollections[p];\r\n for (var q = 0; q < piePoints.length; q++) {\r\n if (piePoints[q].actualIndex == legendData.legendItem.LegendItem.PointIndex) {\r\n var pieColIndex = p;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n var pieSrIndex = series.data ? series.data.pointData[0].PieSeriesIndex : pieColIndex;\r\n var chartRegion = chartRegions[pieSrIndex];\r\n }\r\n else\r\n var chartRegion = chartRegions[0];\r\n cRlength = chartRegion.Region.length;\r\n for (var i = 0; i < cRlength; i++) {\r\n if (pointIndex == chartRegion.Region[i].PointIndex)\r\n regions.push(chartRegion.Region[i]);\r\n }\r\n }\r\n if ((mode == 'series' || legendData) && (this.model.AreaType != 'none' || this.model.AreaType == 'none' && length > 1)) {\r\n points = series._visiblePoints;\r\n ctx = this.createCanvasElement(chart._id + '_Selection_series' + index + '_canvas', chart.svgWidth, chart.svgHeight, containerStyle);\r\n color = (patternName == \"none\" || patternName == \"\") ? fill : this.canvasPattern(ctx, chart, evt, fill, selectionSettings);\r\n this.createRect(chart, ctx);\r\n if (seriesType.indexOf(\"column\") != -1 || seriesType.indexOf(\"waterfall\") != -1 || seriesType.indexOf(\"bar\") != -1) {\r\n for (i = 0; i < regions.length; i++)\r\n this.canvasSeriesRect(regions[i], opacity, borderColor, borderWidth, color, true, series);\r\n }\r\n else if (seriesType == 'pie' || seriesType == 'doughnut' || seriesType == \"pieofpie\")\r\n this.canvasHighlightCircle(chart, selectionSettings, pointIndex, opacity, borderColor, borderWidth, color, regions[0], seriesType, ctx);\r\n else if (seriesType == 'bubble')\r\n this.canvasBubbleHighlight(selectionSettings, regions, chart, seriesIndex, color, borderWidth, opacity, borderColor);\r\n else if (seriesType == 'scatter')\r\n this.canvasScatterHighlight(regions, color, borderWidth, opacity, borderColor);\r\n }\r\n else if (mode == 'cluster' && this.model.AreaType != 'none' && $('#' + chart._id + '_Selection_' + 'Cluster' + '_point_' + pointIndex + '_canvas').length == 0) {\r\n var clength = clusterPoints.length, clusterseriesIndex, clusterpointIndex, region, rlength;\r\n for (var k = 0; k < clength; k++) {\r\n clusterseriesIndex = clusterPoints[k].seriesIndex;\r\n clusterpointIndex = clusterPoints[k].pointIndex;\r\n region = $.grep(chartRegions, function (x) { return x.SeriesIndex == clusterseriesIndex && x.Region.PointIndex == clusterpointIndex });\r\n rlength = region.length;\r\n if (rlength > 0) {\r\n regions.push(region[0]);\r\n points.push(seriesCollection[region[0].SeriesIndex]._visiblePoints[pointIndex]);\r\n } else\r\n points.push(seriesCollection[k]._visiblePoints[pointIndex]);\r\n }\r\n this.selectedPoint = pointIndex;\r\n var sbRegion = [], colors = [];\r\n ctx = this.createCanvasElement(chart._id + '_Selection_' + 'Cluster' + '_point_' + pointIndex + '_canvas', chart.svgWidth, chart.svgHeight, containerStyle);\r\n this.createRect(chart, ctx);\r\n for (i = 0, len = seriesCollection.length; i < len; i++) {\r\n sbRegion = [];// scatter & bubble region calculation\r\n highlight = seriesCollection[i].selectionSettings;\r\n color = highlight.color;\r\n opacity = highlight.opacity;\r\n borderColor = highlight.border.color;\r\n borderWidth = highlight.border.width;\r\n patternName = highlight.pattern.toLowerCase();\r\n fill = this.highlightFill(highlight, chart, i, pointIndex, legendData);\r\n color = (patternName == \"none\" || patternName == \"\") ? fill : this.canvasPattern(ctx, chart, evt, fill, highlight);\r\n colors.push(color);\r\n for (var r = 0, rlen = regions.length; r < rlen; r++) {\r\n if (regions[r].SeriesIndex == i) {\r\n sbRegion.push(regions[r].Region);\r\n }\r\n }\r\n if (seriesType.indexOf(\"column\") != -1 || seriesType.indexOf(\"waterfall\") != -1 || seriesType.indexOf(\"bar\") != -1) {\r\n for (var sr = 0, srlen = sbRegion.length; sr < srlen; sr++) {\r\n this.canvasSeriesRect(sbRegion[sr], opacity, borderColor, borderWidth, color, true, series);\r\n }\r\n }\r\n else if (seriesType == 'bubble')\r\n this.canvasBubbleHighlight(highlight, sbRegion, chart, i, color, borderWidth, opacity, borderColor);\r\n else if (seriesType == 'scatter')\r\n this.canvasScatterHighlight(sbRegion, color, borderWidth, opacity, borderColor);\r\n if (!legendData && this.model.AreaType != 'none' && legendVisible) {\r\n series = seriesCollection[i];\r\n series.seriesIndex = i;\r\n this.canvasHighlightLegend(chart, series, selectionSettings, 'Selection_Cluster', containerStyle, color);\r\n }\r\n }\r\n }\r\n else if ((mode == 'point' && $('#' + chart._id + '_Selection_' + seriesIndex + '_point_' + pointIndex + '_canvas').length == 0) || this.model.AreaType == 'none') {\r\n this.selectedPoint = pointIndex;\r\n\r\n points[0] = this.model._isPieOfPie ? this._getPieOfPiePoint(pointIndex, series) : series._visiblePoints[pointIndex];\r\n ctx = this.createCanvasElement(chart._id + '_Selection_series' + seriesIndex + '_point_' + pointIndex + '_canvas', chart.svgWidth, chart.svgHeight, containerStyle);\r\n this.createRect(chart, ctx);\r\n color = (patternName == \"none\" || patternName == \"\") ? fill : this.canvasPattern(ctx, chart, evt, fill, selectionSettings);\r\n if (seriesType.indexOf(\"column\") != -1 || seriesType.indexOf(\"waterfall\") != -1 || seriesType.indexOf(\"bar\") != -1)\r\n this.canvasSeriesRect(regions[0], opacity, borderColor, borderWidth, color, true, series);\r\n else if (seriesType == 'pie' || seriesType == 'doughnut' || seriesType == \"pieofpie\")\r\n this.canvasHighlightCircle(chart, selectionSettings, pointIndex, opacity, borderColor, borderWidth, color, regions, seriesType, ctx);\r\n else if (seriesType == 'pyramid' || seriesType == 'funnel')\r\n this.canvasHighlightPyramid(chart, regions[0], selectionSettings, ctx, opacity, borderColor, borderWidth, color, seriesType);\r\n else if (seriesType == 'bubble')\r\n this.canvasBubbleHighlight(selectionSettings, regions, chart, seriesIndex, color, borderWidth, opacity, borderColor);\r\n else if (seriesType == 'scatter')\r\n this.canvasScatterHighlight(regions, color, borderWidth, opacity, borderColor);\r\n }\r\n // legend highlight (legend symbol)\r\n if (legendVisible && (mode != 'cluster' || legendData))\r\n this.canvasHighlightLegend(chart, series, selectionSettings, 'Selection', containerStyle, color);\r\n if (series.marker.visible == true && this.model.AreaType != 'none')\r\n this.canvasHighlightMarker(chart, series, points, selectionSettings, ctx, evt, colors);\r\n },\r\n\r\n // clip rect logic calculated here\r\n createRect: function (chart, ctx) {\r\n if (chart.model.AreaType != 'none') {\r\n ctx.lineWidth = 0;\r\n ctx.strokeStyle = 'transparent';\r\n ctx.rect(chart.model.m_AreaBounds.X, chart.model.m_AreaBounds.Y, chart.model.m_AreaBounds.Width, chart.model.m_AreaBounds.Height);\r\n ctx.clip();\r\n ctx.stroke();\r\n ctx.save();\r\n }\r\n },\r\n\r\n //canvas pyramid and funnel draw\r\n canvasHighlightPyramid: function (chart, regions, highlight, ctx, opacity, borderColor, borderWidth, color, seriesType) {\r\n var fill = (highlight.color != \"\" ? highlight.color : chart.model.pointColors[regions.PointIndex]);\r\n var measureTitle = (chart.model.title.text) ? ej.EjSvgRender.utils._measureText(chart.model.title.text, $(this.svgObject).width() - chart.model.margin.left - chart.model.margin.right, chart.model.title.font) : 0;\r\n var pyrX = chart.pyrX = ((chart.model.legend.position.toLowerCase() === \"left\") ? (chart.model.LegendViewerBounds.Width) : 0) + chart.model.elementSpacing + chart.model.margin.left;\r\n var pyrY = chart.pyrY = ((chart.model.legend.position.toLowerCase() === \"top\") ? (chart.model.LegendViewerBounds.Height) : 0) + ((chart.model.title.text) ? (chart.model._titleLocation.Y + measureTitle.height) : (chart.model.margin.top + chart.model.elementSpacing));\r\n var options = {\r\n 'opacity': opacity,\r\n 'stroke': borderColor,\r\n 'stroke-width': borderWidth,\r\n 'fill': color,\r\n 'type': seriesType,\r\n 'd': \"M\" + \" \" + (pyrX + regions.Line1.x) + \" \" + (pyrY + regions.Line1.y) + \" \" + \"L\" + \" \" + (pyrX + regions.Line2.x) + \" \" + (pyrY + regions.Line2.y) + \" \" + \"L\" + \" \" + (pyrX + regions.Line3.x) + \" \" + (pyrY + regions.Line3.y) + \" \" + \"L\" + \" \" + (pyrX + regions.Line4.x) + \" \" + (pyrY + regions.Line4.y) + \" \" + \"z\"\r\n }\r\n if (seriesType == 'funnel')\r\n options.d = \"M\" + \" \" + (pyrX + regions.Line1.x) + \" \" + (pyrY + regions.Line1.y) + \" \" + \"L\" + \" \" + (pyrX + regions.Line2.x) + \" \" + (pyrY + regions.Line2.y) + \" \" + \"L\" + \" \" + (pyrX + regions.Line3.x) + \" \" + (pyrY + regions.Line3.y) + \" \" + \"L\" + \" \" + (pyrX + regions.Line4.x) + \" \" + (pyrY + regions.Line4.y) + \" \" + \"L\" + \" \" + (pyrX + regions.Line5.x) + \" \" + (pyrY + regions.Line5.y) + \" \" + \"L\" + \" \" + (pyrX + regions.Line6.x) + \" \" + (pyrY + regions.Line6.y) + \" \" + \"z\";\r\n ej.EjCanvasRender.prototype.drawPath(options, ctx);\r\n },\r\n\r\n // canvas scatter logic\r\n canvasScatterHighlight: function (regions, color, borderWidth, opacity, borderColor) {\r\n var location, options = {}, size = {};\r\n for (var i = 0; i < regions.length; i++) {\r\n location = { startX: regions[i].Bounds.X + regions[i].Bounds.Height / 2, startY: regions[i].Bounds.Y + regions[i].Bounds.Width / 2 };\r\n size.height = regions[i].Bounds.Height;\r\n size.width = regions[i].Bounds.Width;\r\n options = {};\r\n options.ShapeSize = size;\r\n options.cx = location.startX;\r\n options.cy = location.startY;\r\n options.Style = {};\r\n options.Style.BorderColor = borderColor;\r\n options.Style.Color = color;\r\n options.Style.Opacity = opacity;\r\n options.Style.BorderWidth = borderWidth;\r\n ej.EjSvgRender.chartSymbol['_drawCircle'](location, options, this, ctx);\r\n }\r\n },\r\n\r\n // canvas bubble logic perform here\r\n canvasBubbleHighlight: function (highlight, regions, chart, seriesIndex, color, borderWidth, opacity, borderColor) {\r\n var size = 10, radius, fill, bubbleOptions = {};\r\n for (var i = 0; i < regions.length; i++) {\r\n radius = regions[i].Bounds.Height / 2;\r\n fill = (highlight.color != \"\" ? highlight.color : chart.model.seriesColors[seriesIndex]);\r\n bubbleOptions = {\r\n 'cx': regions[i].Bounds.X - this.model.series[seriesIndex].xAxis.x + radius + this.canvasX,\r\n 'cy': regions[i].Bounds.Y - this.model.series[seriesIndex].yAxis.y + radius + this.canvasY,\r\n 'r': radius,\r\n 'fill': color,\r\n 'stroke-width': borderWidth,\r\n 'opacity': opacity,\r\n 'stroke': borderColor\r\n };\r\n ej.EjCanvasRender.prototype.drawCircle(bubbleOptions, ctx);\r\n }\r\n },\r\n\r\n // canvas circle draw\r\n canvasHighlightCircle: function (chart, highlight, pointIndex, opacity, borderColor, borderWidth, color, regions, seriesType, ctx) {\r\n for (var i = 0; i < regions.length; i++) {\r\n var fill = (highlight.color != \"\" ? highlight.color : (highlight.mode == \"series\" && chart.model._visibleSeries.length > 1) ? chart.model.pointColors[i] : chart.model.pointColors[pointIndex]);\r\n var options = {\r\n 'opacity': opacity,\r\n 'stroke': borderColor,\r\n 'lineWidth': borderWidth,\r\n 'color': color,\r\n 'x': regions[i].StartX,\r\n 'y': regions[i].StartY,\r\n 'radius': chart.model._isPieOfPie ? chart.model.circularRadius[regions[i].PieSeriesIndex] : chart.model.circularRadius[regions[i].SeriesIndex],\r\n 'innerRadius': chart.model.innerRadius[regions[i].SeriesIndex],\r\n 'startAngle': regions[i].StartAngle,\r\n 'endAngle': regions[i].EndAngle,\r\n 'type': seriesType\r\n }\r\n this.highlightSegment(ctx, options);\r\n }\r\n },\r\n\r\n // canvas marker logic\r\n canvasHighlightMarker: function (chart, series, points, settings, ctx, evt, colors) {\r\n var highlight = settings;\r\n var patternName = highlight.pattern.toLowerCase();\r\n var seriesType = series.type.toLowerCase();\r\n var options = {};\r\n var fill = (highlight.color != \"\" ? highlight.color : chart.model.seriesColors[series.seriesIndex]);\r\n color = (patternName == \"none\" || patternName == \"\") ? fill : this.canvasPattern(ctx, chart, evt, fill, highlight);\r\n options.Style = {};\r\n options.Style.BorderColor = highlight.border.color;\r\n options.Style.Opacity = highlight.opacity;\r\n options.Style.BorderWidth = highlight.border.width;\r\n var symbolLocation, location, markerOptions, symbolName;\r\n for (var i = 0; i < points.length; i++) {\r\n symbolLocation = points[i].symbolLocation;\r\n symbolLocation = (seriesType.indexOf(\"line\") != -1 || seriesType.indexOf(\"area\") != -1) ? points[i].location : points[i].symbolLocation;\r\n if (symbolLocation) {\r\n location = this.model.AreaType == \"cartesianaxes\" ? { startX: symbolLocation.X + this.canvasX, startY: symbolLocation.Y + this.canvasY } : { startX: symbolLocation.X, startY: symbolLocation.Y };\r\n markerOptions = series.marker;\r\n symbolName;\r\n $.each(chart.model.symbolShape, function (name) {\r\n if (markerOptions.shape.toLowerCase() == name.toLowerCase())\r\n symbolName = name;\r\n });\r\n options.ShapeSize = markerOptions.size;\r\n options.r = Math.sqrt(markerOptions.size.height * markerOptions.size.height + markerOptions.size.width * markerOptions.size.width) / 2;\r\n options.cx = location.startX;\r\n options.cy = location.startY;\r\n options.Style.Color = colors ? colors[i] : color;\r\n ej.EjSvgRender.chartSymbol['_draw' + symbolName](location, options, chart, ctx);\r\n }\r\n }\r\n\r\n },\r\n\r\n // canvas selction legend logic perform here\r\n canvasHighlightLegend: function (chart, series, settings, name, containerStyle, color) {\r\n var length = this.model._visibleSeries.length;\r\n var index = (chart.model.AreaType == 'none' && length == 1) ? series.pointIndex : series.seriesIndex,\r\n id = chart._id + '_' + name + '_Legend' + index + '_canvas';\r\n if ($('#' + id).length == 0 && index < series.points.length) {\r\n legendCtx = this.createCanvasElement(chart._id + '_' + name + '_Legend' + index + '_canvas', chart.svgWidth, chart.svgHeight, containerStyle);\r\n if (chart.model.AreaType != 'none' || (chart.model.AreaType == \"none\" && length > 1))\r\n legendRegion = chart.model.legendRegion[series.seriesIndex];\r\n else\r\n legendRegion = chart.model.legendRegion[series.pointIndex];\r\n var legendBounds = { startX: legendRegion.Bounds.LegendBound.X + legendRegion.Location.startX, startY: legendRegion.Bounds.LegendBound.Y + legendRegion.Location.startY },\r\n svgData = { svgRenderer: chart.svgRenderer, svgObject: chart.svgObject },\r\n symbolStyle = { 'SeriesIndex': index, 'Style': { 'Color': color, 'Opacity': settings.opacity, 'Visibility': true, 'BorderWidth': 0, BorderColor: color }, 'context': true, 'ShapeSize': legendRegion.Style.ShapeSize }\r\n if (legendRegion.SymbolShape.toLowerCase() == 'seriestype') {\r\n chart.legendItem = legendRegion.LegendItem;\r\n ej.EjSvgRender.chartSymbol[\"_draw\" + legendRegion.SymbolShape](legendBounds, symbolStyle, chart);\r\n } else\r\n ej.EjSvgRender.chartSymbol[\"_draw\" + legendRegion.SymbolShape](legendBounds, symbolStyle, svgData, legendCtx);\r\n }\r\n },\r\n\r\n // canvas create element \r\n createCanvasElement: function (id, width, height, style) {\r\n var chartCavasOffset, highLightCanvas;\r\n svgObj = document.createElement('canvas');\r\n _rootId = jQuery(this.element).attr(\"id\");\r\n svgObj.setAttribute('id', id);\r\n svgObj.height = height;\r\n svgObj.width = width;\r\n svgObj.style[\"touch-action\"] && (svgObj.style[\"touch-action\"] = \"none\")\r\n svgObj.style[\"-ms-touch-action\"] && (svgObj.style[\"-ms-touch-action\"] = \"none\")\r\n this.svgRenderer.append(svgObj, this.element);\r\n var main = document.getElementById(id);\r\n main.style.left = style.left + $(document).scrollLeft() + 'px';\r\n main.style.top = style.top + $(document).scrollTop() + 'px';\r\n main.style.position = \"absolute\";\r\n chartCavasOffset = $(\"#\" + this._id + \"_canvas\").offset();\r\n highLightCanvas = $(main).offset();\r\n if (chartCavasOffset.left < highLightCanvas.left) main.style.left = (style.left - Math.abs(chartCavasOffset.left - highLightCanvas.left) + $(document).scrollLeft()) + \"px\";\r\n if (chartCavasOffset.top < highLightCanvas.top) main.style.top = (style.top - Math.abs(chartCavasOffset.top - highLightCanvas.top) + $(document).scrollTop()) + \"px\";\r\n return svgObj.getContext(\"2d\");\r\n },\r\n\r\n // canvas pie doughnut logic\r\n highlightSegment: function (ctx, options) {\r\n ctx.save();\r\n ctx.beginPath();\r\n if (options.type == 'pie' || options.type == \"pieofpie\") {\r\n ctx.moveTo(options.x, options.y);\r\n ctx.arc(options.x, options.y, options.radius, options.startAngle - 1.57, options.endAngle - 1.57, false);\r\n } else {\r\n ctx.arc(options.x, options.y, options.radius, options.startAngle - 1.57, options.endAngle - 1.57, false);\r\n ctx.arc(options.x, options.y, options.innerRadius, options.endAngle - 1.57, options.startAngle - 1.57, true);\r\n }\r\n ctx.fillStyle = options.color;\r\n ctx.globalAlpha = options.opacity;\r\n ctx.fill();\r\n ctx.lineWidth = options.lineWidth;\r\n ctx.strokeStyle = options.stroke;\r\n ctx.clip();\r\n ctx.stroke();\r\n ctx.closePath();\r\n ctx.restore();\r\n },\r\n\r\n // Canvas pattern started here\r\n canvasPattern: function (ctx, chart, evt, fill, settings) {\r\n\r\n var hoverStyle = settings;\r\n var name = hoverStyle.name;\r\n var style = hoverStyle.pattern.toLowerCase();\r\n var color = fill;\r\n var opacity = hoverStyle.opacity;\r\n var backgroundColor = \"#ffffff\";\r\n var borderColor = hoverStyle.border.color;\r\n var borderWidth = hoverStyle.border.width;\r\n var patternStyle = document.createElement('canvas');\r\n var patternContext = patternStyle.getContext('2d');\r\n var pathOptions = [], translate = [];\r\n switch (style) {\r\n case \"chessboard\":\r\n pathOptions[0] = { 'x': 0, 'y': 0, 'width': 10, 'height': 10, 'fill': 'white', 'stroke': 'white', 'opacity': opacity, 'name': 'rect' };\r\n pathOptions[1] = { 'x': 0, 'y': 0, 'width': 5, 'height': 5, 'fill': color, 'opacity': opacity, 'name': 'rect' };\r\n pathOptions[2] = { 'x': 5, 'y': 5, 'width': 5, 'height': 5, 'fill': color, 'opacity': opacity, 'name': 'rect' };\r\n patternStyle.width = 10;\r\n patternStyle.height = 10;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"pacman\":\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 18, 'height': 18, 'transform': \"translate(0,0)\", 'fill': 'white', 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'path', 'd': 'M 9.081 9.194 L 14.887 6.114 C 14.075000000000001 4.618 12.484 3.0620000000000007 10.596 3.0620000000000007 L 8.835 3.0620000000000007 C 6.138 3.063 3 6.151 3 8.723 L 3 10.402000000000001 C 3 12.974 6.138 16.063000000000002 8.835 16.063000000000002 L 10.596 16.063000000000002 C 12.681000000000001 16.063000000000002 14.431000000000001 14.303000000000003 15.131 12.549000000000003 L 9.081 9.194 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n patternStyle.width = 18;\r\n patternStyle.height = 18;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"crosshatch\":\r\n pathOptions[0] = { 'x': 0, 'y': 0, 'width': 8, 'height': 8, 'fill': 'white', 'stroke': fill, 'opacity': opacity, 'name': 'rect' };\r\n pathOptions[1] = {\r\n 'd': 'M 0 0 L 8 8 Z',\r\n 'stroke-width': 1,\r\n 'stroke': color,\r\n 'name': 'path'\r\n };\r\n pathOptions[2] = {\r\n 'd': 'M 8 0 L 0 8 Z',\r\n 'stroke-width': 1,\r\n 'stroke': color,\r\n 'name': 'path'\r\n };\r\n patternStyle.width = 8;\r\n patternStyle.height = 8;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"dots\":\r\n pathOptions[0] = { 'x': 0, 'y': 0, 'width': 7, 'height': 7, 'transform': \"translate(0,0)\", 'fill': 'white', 'opacity': opacity, 'name': 'rect' };\r\n pathOptions[1] = {\r\n 'cx': 3,\r\n 'cy': 3,\r\n 'r': 2,\r\n 'stroke-width': 1,\r\n 'fill': color,\r\n 'name': 'circle'\r\n };\r\n patternStyle.width = 7;\r\n patternStyle.height = 7;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"diagonalforward\":\r\n pathOptions[0] = { 'x': 0, 'y': 0, 'width': 6, 'height': 6, 'fill': 'white', 'stroke': fill, 'opacity': opacity, 'name': 'rect' };\r\n pathOptions[1] = {\r\n 'd': 'M 3 -3 L 9 3 M 6 6 L 0 0 M 3 9 L -3 3',\r\n 'stroke-width': 2,\r\n 'stroke': color,\r\n 'name': 'path'\r\n };\r\n patternStyle.width = 6;\r\n patternStyle.height = 6;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"diagonalbackward\":\r\n pathOptions[0] = { 'x': 0, 'y': 0, 'width': 6, 'height': 6, 'stroke-width': 2, 'fill': 'white', 'stroke': fill, 'opacity': opacity, 'name': 'rect' };\r\n pathOptions[1] = {\r\n 'd': 'M 3 -3 L -3 3 M 0 6 L 6 0 M 9 3 L 3 9',\r\n 'stroke-width': 2,\r\n 'stroke': color,\r\n 'name': 'path'\r\n };\r\n patternStyle.width = 6;\r\n patternStyle.height = 6;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"grid\":\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 6, 'height': 6, 'transform': \"translate(0,0)\", 'fill': 'white', 'opacity': opacity };\r\n pathOptions[1] = {\r\n 'name': 'path',\r\n 'd': 'M 1 3.5 L 11 3.5 M 0 3.5 L 11 3.5 M 0 7.5 L 11 7.5 M 0 11.5 L 11 11.5 M 5.5 0 L 5.5 12 M 11.5 0 L 11.5 12 Z',\r\n 'stroke-width': 1,\r\n 'stroke': color\r\n };\r\n patternStyle.width = 6;\r\n patternStyle.height = 6;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"turquoise\":\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 17, 'height': 17, 'transform': \"translate(0,0)\", 'fill': 'white', 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'path', 'd': 'M 2.697 0.5319999999999996 C 3.8695005238907747 0.5319999999999996 4.82 1.4771268931071944 4.82 2.643 C 4.82 3.808873106892805 3.8695005238907747 4.754 2.697 4.754 C 1.5244994761092252 4.754 0.5739999999999998 3.808873106892805 0.5739999999999998 2.643 C 0.5739999999999998 1.4771268931071944 1.5244994761092252 0.5319999999999996 2.697 0.5319999999999996 Z', 'stroke-width': 1, 'stroke-miterlimit': 10, 'stroke': color, 'fill': color };\r\n pathOptions[2] = { 'name': 'path', 'd': 'M 13.928 0.5319999999999996 C 15.100500523890776 0.5319999999999996 16.051000000000002 1.4771268931071944 16.051000000000002 2.643 C 16.051000000000002 3.808873106892805 15.100500523890776 4.754 13.928 4.754 C 12.755499476109225 4.754 11.805 3.808873106892805 11.805 2.643 C 11.805 1.4771268931071944 12.755499476109225 0.5319999999999996 13.928 0.5319999999999996 Z', 'stroke-width': 1, 'stroke-miterlimit': 10, 'stroke': color, 'fill': color };\r\n pathOptions[3] = { 'name': 'path', 'd': 'M 8.313 0.5319999999999996 C 9.485500523890776 0.5319999999999996 10.436 1.4771268931071944 10.436 2.643 C 10.436 3.808873106892805 9.485500523890776 4.754 8.313 4.754 C 7.140499476109226 4.754 6.19 3.808873106892805 6.19 2.643 C 6.19 1.4771268931071944 7.140499476109226 0.5319999999999996 8.313 0.5319999999999996 Z', 'stroke-width': 1, 'stroke-miterlimit': 10, 'stroke': color, 'fill': color };\r\n pathOptions[4] = { 'name': 'path', 'd': 'M 13.928 6.16 C 15.100500523890776 6.16 16.051000000000002 7.105126893107196 16.051000000000002 8.271 C 16.051000000000002 9.436873106892806 15.100500523890776 10.382000000000001 13.928 10.382000000000001 C 12.755499476109225 10.382000000000001 11.805 9.436873106892806 11.805 8.271 C 11.805 7.105126893107196 12.755499476109225 6.16 13.928 6.16 Z', 'stroke-width': 1, 'stroke-miterlimit': 10, 'stroke': color, 'fill': color };\r\n pathOptions[5] = { 'name': 'path', 'd': 'M 8.313 6.16 C 9.485500523890776 6.16 10.436 7.105126893107196 10.436 8.271 C 10.436 9.436873106892806 9.485500523890776 10.382000000000001 8.313 10.382000000000001 C 7.140499476109226 10.382000000000001 6.19 9.436873106892806 6.19 8.271 C 6.19 7.105126893107196 7.140499476109226 6.16 8.313 6.16 Z', 'stroke-width': 1, 'stroke-miterlimit': 10, 'stroke': color, 'fill': color };\r\n pathOptions[6] = { 'name': 'path', 'd': 'M 13.928 11.787999999999998 C 15.100500523890776 11.787999999999998 16.051000000000002 12.733126893107194 16.051000000000002 13.899 C 16.051000000000002 15.064873106892804 15.100500523890776 16.009999999999998 13.928 16.009999999999998 C 12.755499476109225 16.009999999999998 11.805 15.064873106892804 11.805 13.899 C 11.805 12.733126893107194 12.755499476109225 11.787999999999998 13.928 11.787999999999998 Z', 'stroke-width': 1, 'stroke-miterlimit': 10, 'stroke': color, 'fill': color };\r\n pathOptions[7] = { 'name': 'path', 'd': 'M 8.313 11.787999999999998 C 9.485500523890776 11.787999999999998 10.436 12.733126893107194 10.436 13.899 C 10.436 15.064873106892804 9.485500523890776 16.009999999999998 8.313 16.009999999999998 C 7.140499476109226 16.009999999999998 6.19 15.064873106892804 6.19 13.899 C 6.19 12.733126893107194 7.140499476109226 11.787999999999998 8.313 11.787999999999998 Z', 'stroke-width': 1, 'stroke-miterlimit': 10, 'stroke': color, 'fill': color };\r\n patternStyle.width = 17;\r\n patternStyle.height = 17;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"star\":\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 21, 'height': 21, 'transform': \"translate(0,0)\", 'fill': 'white', 'opacity': opacity };\r\n pathOptions[1] = {\r\n 'name': 'path',\r\n 'd': 'M 15.913 18.59 L 10.762 12.842 L 5.613 18.75 L 8.291 11.422 L 0.325 9.91 L 8.154 8.33 L 5.337 0.91 L 10.488 6.658 L 15.637 0.75 L 12.959 8.078 L 20.925 9.59 L 13.096 11.17 z',\r\n 'stroke-width': 1,\r\n 'stroke': color,\r\n 'fill': color\r\n };\r\n patternStyle.width = 21;\r\n patternStyle.height = 21;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"triangle\":\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 10, 'height': 10, 'fill': 'white', 'opacity': opacity };\r\n pathOptions[1] = {\r\n 'name': 'path',\r\n 'd': 'M 4.987 0 L 7.48 4.847 L 9.974 9.694 L 4.987 9.694 L 0 9.694 L 2.493 4.847 z',\r\n 'stroke-width': 1,\r\n 'stroke': color,\r\n 'fill': color\r\n };\r\n patternStyle.width = 10;\r\n patternStyle.height = 10;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"circle\":\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 9, 'height': 9, 'transform': \"translate(0,0)\", 'fill': 'white', 'opacity': opacity };\r\n pathOptions[1] = {\r\n 'name': 'circle',\r\n 'cx': 5.125,\r\n 'cy': 3.875,\r\n 'r': 3.625,\r\n 'stroke-width': 1,\r\n 'fill': color\r\n };\r\n patternStyle.width = 9;\r\n patternStyle.height = 9;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"tile\":\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 18, 'height': 18, 'transform': \"translate(0,0)\", 'fill': 'white', 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'path', 'd': 'M 0 9 L 0 0 L 9 0 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n pathOptions[2] = { 'name': 'path', 'd': 'M 9 9 L 9 0 L 18 0 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n pathOptions[3] = { 'name': 'path', 'd': 'M 0 18 L 0 9 L 9 9 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n pathOptions[4] = { 'name': 'path', 'd': 'M 9 18 L 9 9 L 18 9 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n patternStyle.width = 18;\r\n patternStyle.height = 18;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"horizontaldash\":\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 12, 'height': 12, 'transform': \"translate(0,0)\", 'fill': 'white', 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'path', 'd': 'M 0 1.5 L 10 1.5 M 0 5.5 L 10 5.5 M 0 9.5 L 10 9.5 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n patternStyle.width = 12;\r\n patternStyle.height = 12;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"verticaldash\":\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 12, 'height': 12, 'transform': \"translate(0,0)\", 'fill': 'white', 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'path', 'd': 'M 1.5 0 L 1.5 10 M 5.5 0 L 5.5 10 M 9.5 0 L 9.5 10 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n patternStyle.width = 12;\r\n patternStyle.height = 12;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"rectangle\":\r\n pathOptions[0] = { 'x': 0, 'y': 0, 'name': 'rect', 'width': 12, 'height': 12, 'fill': 'white', 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'rect', 'x': 1, 'y': 2, 'width': 4, 'height': 9, 'fill': color, 'opacity': opacity };\r\n pathOptions[2] = { 'name': 'rect', 'x': 7, 'y': 2, 'width': 4, 'height': 9, 'fill': color, 'opacity': opacity };\r\n patternStyle.width = 12;\r\n patternStyle.height = 12;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"box\":\r\n pathOptions[0] = { 'x': 0, 'y': 0, 'name': 'rect', 'width': 13, 'height': 13, 'fill': 'white', 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'rect', 'x': 1.5, 'y': 1.5, 'width': 10, 'height': 9, 'fill': color, 'opacity': opacity };\r\n patternStyle.width = 10;\r\n patternStyle.height = 10;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"horizontalstripe\":\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 10, 'height': 12, 'transform': \"translate(0,0)\", 'fill': 'white', 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'path', 'd': 'M 0 0.5 L 10 0.5 M 0 4.5 L 10 4.5 M 0 8.5 L 10 8.5 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n patternStyle.width = 10;\r\n patternStyle.height = 12;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"verticalstripe\":\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 12, 'height': 10, 'transform': \"translate(0,0)\", 'fill': 'white', 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'path', 'd': 'M 0.5 0 L 0.5 10 M 4.5 0 L 4.5 10 M 8.5 0 L 8.5 10 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n patternStyle.width = 12;\r\n patternStyle.height = 10;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n case \"bubble\":\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 20, 'height': 20, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'circle', 'cx': 5.217, 'cy': 11.325, 'r': 3.429, 'stroke-width': 1, 'fill': '#D0A6D1' };\r\n pathOptions[2] = { 'name': 'circle', 'cx': 13.328, 'cy': 6.24, 'r': 4.884, 'stroke-width': 1, 'fill': color };\r\n pathOptions[3] = { 'name': 'circle', 'cx': 13.277, 'cy': 14.66, 'r': 3.018, 'stroke-width': 1, 'fill': '#D0A6D1' };\r\n patternStyle.width = 20;\r\n patternStyle.height = 20;\r\n this.loadPattern(chart, pathOptions, '', patternContext);\r\n break;\r\n\r\n\r\n\r\n case \"custom\":\r\n patternStyle = document.getElementById(hoverStyle.customPattern);\r\n break;\r\n }\r\n var pattern = ctx.createPattern(patternStyle, 'repeat');\r\n return pattern;\r\n },\r\n // Canvas pattern end\r\n // Canvas highlight and selection end\r\n\r\n //Get selected class for removing lengeds selection in multiselection mode\r\n foundClasses: function (id) {\r\n var pointClasses = [];\r\n $(\"[id*=\" + id + \"]\").each(function () {\r\n var pointClass = $(this).attr('class') ? $(this).attr('class') : '';\r\n if (pointClass.indexOf('Selection') >= 0) {\r\n pointClasses.push(pointClass);\r\n }\r\n });\r\n return pointClasses;\r\n },\r\n // SVG selection started here\r\n selection: function (chart, evt, series, tracker, legendData, seriesIndex, pointIndex, parentNodeId, targetId, data) {\r\n var clusterPoints = this.model.clusterPoints,\r\n clusterPointslength = clusterPoints ? clusterPoints.length : 0,\r\n seriesCollection = this.model._visibleSeries,\r\n seriesLenth = seriesCollection.length,\r\n index = (this.model.AreaType == 'none' && seriesLenth == 1) ? pointIndex : seriesIndex,\r\n highlight = series.selectionSettings,\r\n isMultiSelection = this.model._visibleSeries[seriesIndex].selectionSettings.type.toLowerCase() == 'multiple' ? true : false,\r\n name = 'series' + seriesIndex,\r\n found_class = false,\r\n pathName = $('#' + targetId).attr('name'),\r\n patternName = highlight.pattern.toLowerCase(),\r\n mode = highlight.mode, isElement;\r\n if (parentNodeId)\r\n isElement = (parentNodeId.indexOf(this.svgObject.id + \"_SeriesGroup_\") >= 0 || parentNodeId.indexOf(this.svgObject.id + \"_Chart3D\") >= 0) ? true : false;\r\n\r\n if (this.model.AreaType != 'none' || (this.model.AreaType == 'none' && mode == \"series\" && seriesLenth > 1)) {\r\n $('style').each(function () {\r\n if ($(this).html().indexOf('.' + chart._id + 'SelectionStyle' + name) > -1) {\r\n found_class = true;\r\n }\r\n });\r\n }\r\n if (!chart.vmlRendering && this.model.enable3D) {\r\n if ((mode == 'series' || legendData) && (this.model.AreaType != 'none' || (this.model.AreaType == 'none' && seriesLenth != 1))) {\r\n this.highlightSeries(chart, seriesIndex, pointIndex, 'Selection', name, highlight, evt, legendData, data)\r\n $('#' + this.svgObject.id + '_LegendItemShape' + index).attr('class', 'Selection' + name + 'Style' + name + '1');\r\n }\r\n else if (mode == 'cluster' && chart.model.AreaType != 'none')\r\n this.highlightCluster(chart, seriesIndex, pointIndex, 'Selection', name, highlight, evt, data)\r\n else {\r\n if (this.model.AreaType == 'none') {\r\n this.highlightPoint(chart, seriesIndex, pointIndex, 'Selection', name + index, highlight, evt, data);\r\n $('#' + this.svgObject.id + '_LegendItemShape' + index).attr('class', 'Selection' + name + index + 'Style' + name + index + '1');\r\n } else {\r\n this.highlightPoint(chart, seriesIndex, pointIndex, 'Selection', name, highlight, evt, data)\r\n $('#' + this.svgObject.id + '_LegendItemShape' + index).attr('class', 'Selection' + name + 'Style' + name + '1');\r\n }\r\n }\r\n }\r\n else {\r\n if ((mode != 'cluster' || legendData) || chart.model.AreaType == 'none') {\r\n var colorStyle = {};\r\n colorStyle.name = \"2D\",\r\n colorStyle.index = this.model.AreaType == 'none' ? index : seriesIndex; colorStyle.api = \"Selection\",\r\n colorStyle.color = highlight.color != \"\" ? highlight.color : legendData ? (this.model.AreaType == 'none' ? this.model.pointColors[index] : this.model.seriesColors[index]) :\r\n $('#' + targetId).attr('fill') != 'none' ? $('#' + targetId).attr('fill') : $('#' + targetId).attr('stroke');\r\n if (Object.prototype.toString.call(colorStyle.color) === '[object Array]')\r\n colorStyle.color = colorStyle.color[1].color;\r\n var fill = ((patternName == \"none\" || chart.vmlRendering) || patternName == \"\") ? highlight.color : this.pattern(chart, evt, colorStyle, highlight),\r\n opacity = highlight.opacity,\r\n strokeColor = highlight.border.color,\r\n strokeWidth = highlight.border.width;\r\n if (!found_class) {\r\n if (this.model.AreaType == 'none' && (((mode == 'series' || legendData) && seriesLenth == 1) || (mode != 'series' && !legendData))) {\r\n $('style').each(function () {\r\n if ($(this).html().indexOf('.SelectionStyle' + name + 'Point' + index) > -1) {\r\n found_class = true;\r\n }\r\n });\r\n if (!found_class) {\r\n this.createStyle(chart, chart._id + 'Selection', name + 'Point' + index, opacity, fill, strokeColor, strokeWidth);\r\n this.createStyle(chart, chart._id + 'SelectionLegend', name + 'Point' + index, opacity, fill, 'transparent', 0);\r\n }\r\n } else if (this.model.AreaType == 'none' && seriesLenth > 1 || this.model.AreaType != 'none') {\r\n this.createStyle(chart, chart._id + 'Selection', name, opacity, fill, strokeColor, strokeWidth);\r\n this.createStyle(chart, chart._id + 'SelectionLegend', name, opacity, fill, 'transparent', 0);\r\n }\r\n\r\n }\r\n }\r\n if ((mode == 'series' || legendData) && ((chart.model.AreaType == 'none' && seriesLenth > 1) || (chart.model.AreaType != 'none'))) {\r\n if (!isElement) {\r\n var otherElements = $('#' + parentNodeId).childNodes ? $('#' + parentNodeId).childNodes : [];\r\n for (var i = 0; i < otherElements.length; i++)\r\n $('#' + otherElements[i].id).attr('class', chart._id + 'SelectionStyle');\r\n }\r\n $(\"[id*=\" + this.svgObject.id + '_Series' + index + \"]\").each(function () {\r\n if (this.parentNode.id == chart.svgObject.id + '_SeriesGroup_' + index || this.parentNode.id == chart.svgObject.id + '_symbolGroup_' + index) {\r\n var className = $(this).attr(\"name\") ? chart._id + 'SelectionPathStyle' + name : chart._id + 'SelectionStyle' + name;\r\n $(this).attr('class', className);\r\n }\r\n });\r\n\r\n //for legend selection sets here \r\n $('#' + this.svgObject.id + '_LegendItemShape' + index).attr('class', chart._id + 'SelectionLegendStyle' + name);\r\n\r\n // removed tracker symbol\r\n if (tracker) $('#' + parentNodeId).remove();\r\n\r\n }\r\n\r\n else if (mode == \"cluster\" && (chart.model.AreaType != 'none') && !ej.util.isNullOrUndefined(targetId)) {\r\n var matchString, clustername, indexVal, text, colorStyle, opacity, strokeColor, fill, strokeWidth;\r\n matchString = this.svgObject.id + \"_Series\";\r\n var clusterPoints = chart.model.clusterPoints;\r\n index = targetId.match(/(\\d+)/g);\r\n pointIndex = parseInt(index[index.length - 1]);\r\n if (targetId.indexOf('SeriesText') >= 0) {\r\n var datas = this.GetSeriesPoint(evt);\r\n pointIndex = datas.region.Region.PointIndex;\r\n }\r\n var findClass, seriesSelectionIndex;\r\n for (k = 0; k < clusterPoints.length; k++) {\r\n seriesSelectionIndex = clusterPoints[k].seriesIndex;\r\n name = 'ClusterSeries' + seriesSelectionIndex;\r\n //creating individual styles for the points in different series\r\n colorStyle = {};\r\n colorStyle.index = seriesSelectionIndex;\r\n colorStyle.name = \"2D\"; colorStyle.api = \"Selection\" + name;\r\n highlight = seriesCollection[seriesSelectionIndex].selectionSettings;\r\n colorStyle.color = highlight.color != \"\" ? highlight.color : this.model.seriesColors[seriesSelectionIndex];\r\n if (Object.prototype.toString.call(colorStyle.color) === '[object Array]')\r\n colorStyle.color = colorStyle.color[1].color;\r\n opacity = highlight.opacity;\r\n var strokeColor = highlight.border.color;\r\n var strokeWidth = highlight.border.width;\r\n var fill = ((patternName == \"none\" || chart.vmlRendering) || patternName == \"\") ? colorStyle.color : this.pattern(chart, evt, colorStyle, highlight);\r\n $('style').each(function () {\r\n if ($(this).html().indexOf('.' + chart._id + 'SelectionStyle' + name) > -1) {\r\n findClass = true;\r\n }\r\n });\r\n if (!findClass) {\r\n this.createStyle(chart, chart._id + 'Selection', name, opacity, fill, strokeColor, strokeWidth);\r\n this.createStyle(chart, chart._id + 'SelectionLegend', name, opacity, fill, 'transparent', 0);\r\n }\r\n var className = $('#' + matchString + clusterPoints[k].seriesIndex + '_Point' + clusterPoints[k].pointIndex).attr(\"name\") ? chart._id + 'SelectionPathStyle' + name : chart._id + 'SelectionStyle' + name;\r\n $('#' + matchString + clusterPoints[k].seriesIndex + '_Point' + clusterPoints[k].pointIndex).attr('class', className);\r\n $('#' + matchString + clusterPoints[k].seriesIndex + '_Point' + clusterPoints[k].pointIndex + '_symbol').attr('class', className);\r\n if (chart.model._visibleSeries[seriesSelectionIndex].visibility != \"hidden\")\r\n $('#' + this.svgObject.id + '_LegendItemShape' + seriesSelectionIndex).not(\"[class*='Highlight']\").attr('class', chart._id + 'SelectionLegendStyle' + name);\r\n // checked condition for financial series\r\n var finName = $('#' + targetId).attr(\"name\");\r\n if (finName != undefined && (finName == 'candle' || finName.indexOf('hilo') >= 0)) {\r\n $('[id$=' + matchString + clusterPoints[k].seriesIndex + '_' + 'Point' + clusterPoints[k].pointIndex + ']').attr('class', 'HighlightStyle' + name);\r\n }\r\n }\r\n if (tracker) {\r\n $('#' + this.svgObject.id + '_Series' + seriesSelectionIndex + '_Point' + pointIndex).attr('class', chart._id + 'SelectionStyle' + name);\r\n $('#' + this.svgObject.id + '_Series' + seriesSelectionIndex + '_Point' + pointIndex + '_symbol').attr('class', chart._id + 'SelectionStyle' + name);\r\n $('#' + parentNodeId).remove();\r\n }\r\n }\r\n\r\n\r\n else {\r\n // checked condition for whether target id is area related or not\r\n if ((!$('#' + targetId).attr(\"name\") && targetId != chart.svgObject.id + '_Series' + index) && chart.model.AreaType != 'none') {\r\n $('#' + targetId).attr('class', chart._id + 'SelectionStyle' + name);\r\n if (this.model.commonSeriesOptions.columnFacet == 'cylinder' || series.columnFacet == 'cylinder') {\r\n for (i = 0; i < 2; i++) {\r\n $('#' + targetId.replace(/2$/, i)).attr('class', chart._id + 'SelectionStyle' + name);\r\n }\r\n }\r\n $('#' + this.svgObject.id + '_LegendItemShape' + index).attr('class', chart._id + 'SelectionLegendStyle' + name);\r\n $('#' + targetId + '_symbol').attr('class', chart._id + 'SelectionStyle' + name);\r\n\r\n if (tracker) {\r\n $('#' + targetId + '_symbol').attr('class', chart._id + 'SelectionStyle' + name);\r\n $('#' + parentNodeId).remove();\r\n }\r\n } else {\r\n $('#' + targetId).attr('class', chart._id + 'SelectionStyle' + name + 'Point' + index);\r\n $('#' + this.svgObject.id + '_LegendItemShape' + index).attr('class', chart._id + 'SelectionLegendStyle' + name + 'Point' + index);\r\n if (tracker) $('#' + parentNodeId).remove();\r\n }\r\n\r\n // checked condition for financial series\r\n var finName = $('#' + targetId).attr(\"name\");\r\n if (finName != undefined && (finName == 'candle' || finName.indexOf('hilo') >= 0)) {\r\n $('[id$=' + targetId + ']').attr('class', chart._id + 'SelectionStyle' + name);\r\n $('#' + this.svgObject.id + '_LegendItemShape' + index).attr('class', chart._id + 'SelectionLegendStyle' + name);\r\n }\r\n }\r\n }\r\n },\r\n\r\n //Selection Removing Logic\r\n removeSelection: function (seriesIndex, pointIndex, seriesCollection, mode, isMultiSelection, legendData, isSelected) {\r\n var seriesLength = seriesCollection.length,\r\n clusterPoints = this.model.clusterPoints,\r\n clusterPointslength = clusterPoints ? clusterPoints.length : 0, selectionSettings;\r\n //Removing selectiond mode series\r\n if ((mode == 'series' || legendData) && (this.model.AreaType != 'none' || (this.model.AreaType == 'none' && seriesLength > 1))) {\r\n for (var i = 0; i < seriesLength; i++) {\r\n selectionSettings = seriesCollection[i].selectionSettings;\r\n if ((selectionSettings.mode != 'point' && selectionSettings.type.toLowerCase() == 'single') || (legendData && selectionSettings.type.toLowerCase() == 'single')) {\r\n $(this.svgObject).find('[id*=' + this.svgObject.id + '_SeriesGroup_' + i + '],[id*=' + this.svgObject.id + '_symbolGroup_' + i + '],[id*=_Region_Series_' + i + '_]').each(function () {\r\n $(this).find(\"*\").attr('class', '');\r\n $(this).attr('class', '');\r\n });\r\n $('#' + this._id + '_Selection_Legend' + i + '_canvas').remove();\r\n $('#' + this._id + '_Selection_series' + i + '_canvas').remove();\r\n $(\"[id*=\" + '_Region_Series_' + i + \"]\").attr('class', '');\r\n $('#' + this.svgObject.id + '_LegendItemShape' + i).attr('class', '');\r\n } else if (isSelected && selectionSettings.type.toLowerCase() == 'multiple') {\r\n $('#' + this._id + '_Selection_series' + seriesIndex + '_canvas').remove();\r\n $('#' + this._id + '_Selection_Legend' + seriesIndex + '_canvas').remove();\r\n $(\"[id*=\" + '_Region_Series_' + seriesIndex + \"]\").attr('class', '');\r\n $(\"[id*=\" + this.svgObject.id + '_Series' + seriesIndex + \"]\").attr('class', '');\r\n $('#' + this.svgObject.id + '_LegendItemShape' + seriesIndex).attr('class', '');\r\n }\r\n }\r\n }\r\n //Removing selection mode Cluster\r\n if (mode == 'cluster' && this.model.AreaType != 'none' && !legendData) {\r\n if (!isMultiSelection) {\r\n if (this.model.enableCanvasRendering) {\r\n $('[id*=' + this._id + '_Selection_Cluster' + ']').remove();\r\n $('[id*=' + this._id + '_SelectionCluster_Legend' + ']').remove();\r\n this.selectedPoint = null;\r\n } else\r\n for (var k = 0; k < clusterPointslength; k++) {\r\n $(\"[id*=\" + '_Region_Series_' + clusterPoints[k].seriesIndex + '_Point_' + \"]\").attr('class', '');\r\n $(\"[id*=\" + this.svgObject.id + '_Series' + clusterPoints[k].seriesIndex + '_Point' + \"]\").attr('class', '');\r\n $('#' + this.svgObject.id + '_LegendItemShape' + clusterPoints[k].seriesIndex).attr('class', '');\r\n }\r\n }\r\n else {\r\n if (!this.model.enableCanvasRendering) {\r\n for (var k = 0; k < clusterPointslength; k++) {\r\n $(\"[id*=\" + \"_Region_Series_\" + clusterPoints[k].seriesIndex + \"_Point_\" + clusterPoints[k].pointIndex + \"]\").attr('class', '');\r\n $(\"[id*=\" + this.svgObject.id + '_Series' + clusterPoints[k].seriesIndex + '_Point' + clusterPoints[k].pointIndex + \"]\").attr('class', '');\r\n }\r\n pointClasses = this.model.enable3D ? this.foundClasses('_Region_Series_' + seriesIndex) : this.foundClasses(this.svgObject.id + '_Series' + seriesIndex);\r\n (pointClasses.length == 0) ? $(\"[id*=\" + this.svgObject.id + '_LegendItemShape' + \"]\").attr('class', '') : 0;\r\n } else {\r\n $('[id*=' + this._id + '_Selection_Cluster' + '_point_' + pointIndex + ']').remove();\r\n $('[id*=' + this._id + '_Selection_Cluster' + ']').length == 0 ? $('[id*=' + this._id + '_SelectionCluster_Legend' + ']').remove() : 0;\r\n }\r\n }\r\n }\r\n\r\n //Removing selection mode point\r\n if (mode == 'point' && this.model.AreaType != 'none' && !legendData) {\r\n if (!isMultiSelection) {\r\n $('[id*=' + this._id + '_Selection_series' + seriesIndex + '_point_' + ']').remove();\r\n $('[id*=' + this._id + '_Selection_Legend' + seriesIndex + ']').remove();\r\n $(\"[id*=\" + '_Region_Series_' + seriesIndex + '_Point_' + \"]\").attr('class', '');\r\n $(\"[id*=\" + this.svgObject.id + '_Series' + seriesIndex + '_Point' + \"]\").attr('class', '');\r\n $('#' + this.svgObject.id + '_LegendItemShape' + seriesIndex).attr('class', '');\r\n }\r\n else {\r\n $('#' + this._id + '_Selection_series' + seriesIndex + '_point_' + pointIndex + '_canvas').remove();\r\n $(\"[id*=\" + '_Region_Series_' + seriesIndex + '_Point_' + pointIndex + \"]\").attr('class', '');\r\n $(\"[id*=\" + this.svgObject.id + '_Series' + seriesIndex + '_Point' + pointIndex + \"]\").attr('class', '');\r\n $(\"[id*=\" + this._id + '_Selection_series' + seriesIndex + \"]\").length == 0 ? $('#' + this._id + '_Selection_Legend' + seriesIndex + '_canvas').remove() : 0;\r\n pointClasses = this.model.enable3D ? this.foundClasses('_Region_Series_' + seriesIndex) : this.foundClasses(this.svgObject.id + '_Series' + seriesIndex);\r\n (pointClasses.length == 0) ? $('#' + this.svgObject.id + '_LegendItemShape' + seriesIndex).attr('class', '') : 0;\r\n }\r\n }\r\n\r\n //Removing accoumulation series types selections\r\n if ((mode == 'point' || mode == 'cluster') || (mode == \"series\" && this.model._visibleSeries.length == 1) && this.model.AreaType == 'none' && !legendData) {\r\n if (!isMultiSelection) {\r\n $(\"[id*=\" + this._id + '_Selection_series' + ']').remove();\r\n $(\"[id*=\" + this._id + '_Selection_Legend' + ']').remove()\r\n $(\"[id*=\" + '_Region_Series_' + seriesIndex + '_Point_' + \"]\").attr('class', '');\r\n $(\"[id*=\" + this.svgObject.id + '_Series' + seriesIndex + '_Point' + \"]\").attr('class', '');\r\n (this.model._visibleSeries.length > 1) ? $(\"[id*=\" + this.svgObject.id + '_LegendItemShape' + seriesIndex + \"]\").attr('class', '') : $(\"[id*=\" + this.svgObject.id + '_LegendItemShape' + \"]\").attr('class', '');\r\n } else {\r\n $('#' + this._id + '_Selection_series' + seriesIndex + '_point_' + pointIndex + '_canvas').remove();\r\n $(\"[id*=\" + '_Region_Series_' + seriesIndex + '_Point_' + pointIndex + \"]\").attr('class', '');\r\n $(\"[id*=\" + this.svgObject.id + '_Series' + seriesIndex + '_Point' + pointIndex + \"]\").attr('class', '');\r\n (this.model._visibleSeries.length > 1) ? $('#' + this.svgObject.id + '_LegendItemShape' + seriesIndex).attr('class', '') : $('#' + this.svgObject.id + '_LegendItemShape' + pointIndex).attr('class', '');\r\n (this.model._visibleSeries.length > 1) ? $('#' + this._id + '_Selection_Legend' + seriesIndex + '_canvas').remove() : $('#' + this._id + '_Selection_Legend' + pointIndex + '_canvas').remove();\r\n }\r\n }\r\n },\r\n // style append operation perform here\r\n createStyle: function (chart, api, name, opacity, fill, strokeColor, strokeWidth, strokeOpacity) {\r\n if (chart.vmlRendering) {\r\n var style = document.createElement('style');\r\n style.id = api + \"Segment\";\r\n opacity = opacity * 100;\r\n var text = \".\" + api + \"Style\" + name + \" {filter: alpha(opacity=\" + opacity + \");}.\" + api + \"PathStyle\" + name + \" {filter: alpha(opacity=\" + opacity + \");}\";\r\n style.setAttribute(\"type\", \"text/css\");\r\n if (style.styleSheet) { // for IE\r\n style.styleSheet.cssText = text;\r\n } else { // others\r\n var textnode = document.createTextNode(text);\r\n style.appendChild(textnode);\r\n }\r\n var header = document.getElementsByTagName('head')[0];\r\n header.appendChild(style);\r\n } else {\r\n $(\"\").appendTo(\"body\");\r\n $(\"\").appendTo(\"body\");\r\n }\r\n },\r\n\r\n // point highlight 3D perform here\r\n highlightPoint: function (chart, seriesIndex, pointIndex, api, name, highlight, evt) {\r\n var pathId = \"_Region_Series_\" + seriesIndex + \"_Point_\" + pointIndex,\r\n gElement = $(this.svgObject).find('[id$=' + pathId + '],[id*=' + pathId + 'back],[id*=' + pathId + 'front]');\r\n for (var i = 0; i < gElement.length; i++) {\r\n var style3D = [];\r\n style3D.api = api + name; style3D.seriesName = name;\r\n style3D.name = $(\"[id=\" + gElement[i].id + \"]\").attr('name');\r\n style3D.index = i;\r\n var color = this.highlightFill(highlight, chart, seriesIndex, pointIndex);\r\n var className = ($('#' + gElement[i].id).attr('class'));\r\n className = className ? className : '';\r\n if (className.indexOf('Selection') < 0) {\r\n $(\"[id=\" + gElement[i].id + \"]\").attr('class', this.dStyle(style3D, color, chart, evt, highlight));\r\n }\r\n }\r\n },\r\n //cluster highlight of 3D is perfomed here\r\n highlightCluster: function (chart, seriesIndex, pointIndex, api, name, highlight, evt) {\r\n if (chart.model.AreaType != 'none') {\r\n var name, pathId, gElement, style3D, color, classname, clusterPoints = [];\r\n var xvalue = chart.model._visibleSeries[seriesIndex]._visiblePoints[pointIndex].x;\r\n for (var i = 0, len = chart.model._visibleSeries.length; i < len; i++) {\r\n for (var j = 0; j < chart.model._visibleSeries[i]._visiblePoints.length; j++) {\r\n if (xvalue == chart.model._visibleSeries[i]._visiblePoints[j].x)\r\n clusterPoints[clusterPoints.length] = { seriesIndex: i, pointIndex: j };\r\n }\r\n }\r\n for (k = 0; k < clusterPoints.length; k++) {\r\n name = 'series' + k;\r\n pathId = \"_Region_Series_\" + clusterPoints[k].seriesIndex + \"_Point_\" + clusterPoints[k].pointIndex;\r\n gElement = $(this.svgObject).find('[id$=' + pathId + '],[id*=' + pathId + 'back],[id*=' + pathId + 'front]');\r\n for (var j = 0; j < gElement.length; j++) {\r\n style3D = [];\r\n style3D.api = api + name; style3D.seriesName = 'series' + k;\r\n style3D.name = $(\"[id=\" + gElement[j].id + \"]\").attr('name');\r\n style3D.index = j;\r\n seriesIndex = k;\r\n highlight = (api == 'Highlight') ? chart.model._visibleSeries[k].highlightSettings : chart.model._visibleSeries[k].selectionSettings;\r\n color = this.highlightFill(highlight, chart, seriesIndex, pointIndex);\r\n className = ($('#' + gElement[j].id).attr('class'));\r\n className = className ? className : '';\r\n if ((className.indexOf('Selection' + name + 'Style') < 0) && (className.indexOf('SelectionStyle') < 0)) {\r\n $(\"[id=\" + gElement[j].id + \"]\").attr('class', this.dStyle(style3D, color, chart, evt, highlight));\r\n }\r\n\r\n }\r\n if (api == 'Highlight')\r\n $('#' + this.svgObject.id + '_LegendItemShape' + k).not(\"[class*='Selection']\").attr('class', 'Highlight' + name + 'Style' + name + '1');\r\n else\r\n $('#' + this.svgObject.id + '_LegendItemShape' + k).attr('class', 'Selection' + name + 'Style' + name + '1');\r\n }\r\n\r\n }\r\n },\r\n // point series 3D perform here\r\n highlightSeries: function (chart, seriesIndex, index, api, name, highlight, evt, legendData) {\r\n var seriesIndex = seriesIndex,\r\n pointIndex = index,\r\n length = chart.model._visibleSeries.length,\r\n pathId = (chart.model.AreaType == 'none' && length == 1) ? \"_Region_Series_\" + seriesIndex + \"_Point_\" + index : \"_Region_Series_\" + seriesIndex + \"_Point_\",\r\n gElement = $(this.svgObject).find('[id*=' + pathId + ']'), style3D, color,\r\n className = legendData ? $('#' + this.svgObject.id + '_LegendItemShape' + index).attr('class') : evt ? ($('#' + evt.target.id).attr('class')) : '';\r\n className = className ? className : '';\r\n if (className.indexOf('SelectionStyle') < 0 || legendData) {\r\n for (var i = 0; i < gElement.length; i++) {\r\n style3D = [];\r\n style3D.api = api + name, style3D.seriesName = name,\r\n style3D.name = $(\"[id=\" + gElement[i].id + \"]\").attr('name'),\r\n style3D.index = i;\r\n color = this.highlightFill(highlight, chart, seriesIndex, pointIndex, legendData);\r\n className = $('#' + gElement[i].id).attr('class');\r\n className = className ? className : '';\r\n if (className.indexOf('SelectionStyle') < 0 && (className.indexOf('Selection' + name + 'Style') < 0)) {\r\n $(\"[id=\" + gElement[i].id + \"]\").attr('class', this.dStyle(style3D, color, chart, evt, highlight));\r\n }\r\n }\r\n }\r\n },\r\n\r\n //SVG highlight logic started here\r\n highlight: function (chart, evt, series, legendData, data, parentNodeId, targetID, tracker) {\r\n var highlight = series.highlightSettings;\r\n var seriesIndex = $.inArray(series, chart.model._visibleSeries), pointIndex;\r\n var name = 'series' + seriesIndex;//series.name.replace(/ /g, ''); // removed space for series name\r\n var found_class = false;\r\n var index = seriesIndex;\r\n var targetId = targetID || evt.target.id;\r\n var matched = jQuery.uaMatch(navigator.userAgent);\r\n if (!tracker && this.isTouch(evt) && matched.browser == 'chrome') {\r\n myLocation = evt.originalEvent.changedTouches[0];\r\n targetId = document.elementFromPoint(myLocation.clientX, myLocation.clientY).id;\r\n }\r\n parentNodeId = parentNodeId || evt.target.parentNode.id;\r\n var isElement = (parentNodeId.indexOf(this.svgObject.id + \"_SeriesGroup_\") >= 0 || parentNodeId.indexOf(this.svgObject.id + \"_Chart3D\") >= 0) ? true : false;\r\n var pathName = $('#' + targetId).attr('name');\r\n var patternName = highlight.pattern.toLowerCase();\r\n var length = chart.model._visibleSeries.length;\r\n if (chart.model.AreaType == 'none' && length == 1) {\r\n if (!chart.model.enable3D) {\r\n var matchStr = legendData ? this.svgObject.id + '_LegendItemShape' : this.svgObject.id + \"_Series\" + seriesIndex + \"_Point\";\r\n var id = legendData ? this.svgObject.id + '_LegendItemShape' + legendData.legendItem.LegendItem.PointIndex : targetId;\r\n pointIndex = id.substr(matchStr.length);\r\n index = pointIndex;\r\n } else {\r\n index = legendData ? legendData.legendItem.LegendItem.PointIndex : data.region.Region.PointIndex;\r\n }\r\n }\r\n $('style').each(function () {\r\n if ($(this).html().indexOf('.HighlightStyle' + name) > -1) {\r\n found_class = true;\r\n }\r\n });\r\n if (chart.model.enable3D && !chart.vmlRendering) {\r\n if ((highlight.mode == 'series' || legendData) && ((chart.model.AreaType == 'none' && length != 1) || chart.model.AreaType != 'none')) {\r\n this.highlightSeries(chart, seriesIndex, index, 'Highlight', name, highlight, evt, legendData)\r\n $('#' + this.svgObject.id + '_LegendItemShape' + index).not(\"[class*='Selection']\").attr('class', 'Highlight' + name + 'Style' + name + '1');\r\n } else if (highlight.mode == 'cluster' && chart.model.AreaType != 'none') {\r\n this.highlightCluster(chart, seriesIndex, data.pointData.pointIndex, 'Highlight', name, highlight, evt);\r\n\r\n } else {\r\n pointIndex = data ? data.pointData.pointIndex : index;\r\n this.highlightPoint(chart, seriesIndex, pointIndex, 'Highlight', name + pointIndex, highlight, evt)\r\n $('#' + this.svgObject.id + '_LegendItemShape' + index).not(\"[class*='Selection']\").attr('class', 'Highlight' + name + pointIndex + 'Style' + name + pointIndex + '1');\r\n }\r\n } else {\r\n if (highlight.mode || this.model.AreaType == 'none') {\r\n var colorStyle = {};\r\n colorStyle.name = \"2D\";\r\n colorStyle.index = seriesIndex; colorStyle.api = \"Highlight\"; colorStyle.color = highlight.color != \"\" ? highlight.color : legendData ? (this.model.AreaType == 'none' ? this.model.pointColors[index] : this.model.seriesColors[index]) : $('#' + targetId).attr('fill');\r\n if (Object.prototype.toString.call(colorStyle.color) === '[object Array]')\r\n colorStyle.color = colorStyle.color[1].color;\r\n var fill = ((patternName == \"none\" || chart.vmlRendering) || patternName == \"\") ? highlight.color : this.pattern(chart, evt, colorStyle, highlight);\r\n var opacity = tracker ? 1 : highlight.opacity;\r\n var strokeColor = (tracker) ? ((series.type.toLowerCase().indexOf(\"hilo\") == -1) ? chart.model.highlightColor : fill) : highlight.border.color;\r\n var strokeWidth = tracker ? 3.5 : highlight.border.width;\r\n var strokeOpacity = (tracker && series.type.toLowerCase().indexOf(\"hilo\") == -1) ? 0.5 : 1;\r\n if (!found_class) {\r\n this.createStyle(chart, 'Highlight', name, opacity, fill, strokeColor, strokeWidth, strokeOpacity);\r\n this.createStyle(chart, 'HighlightLegend', name, opacity, fill, 'transparent', 0, strokeOpacity);\r\n }\r\n }\r\n\r\n // sets the style for the segment or path started here\r\n var className = legendData ? $('#' + this.svgObject.id + '_LegendItemShape' + index).attr('class') : $('#' + targetId).attr('class');\r\n className = className ? className : '';\r\n if (className.indexOf(\"Selection\") == -1) {\r\n // checked mode of the highlight series\r\n if (((highlight.mode == 'series' && !tracker) || legendData) && ((chart.model.AreaType == 'none' && length != 1) || chart.model.AreaType != 'none')) {\r\n $(\"[id*=\" + this.svgObject.id + '_Series' + index + \"]\").each(function () {\r\n if (this.parentNode.id == chart.svgObject.id + '_SeriesGroup_' + index || this.parentNode.id == chart.svgObject.id + '_symbolGroup_' + index) {\r\n var selectClass = $(this).attr('class');\r\n var className = $(this).attr(\"name\") ? 'HighlightPathStyle' + name : 'HighlightStyle' + name;\r\n // this condition is checked for whether already selected and it's symbol\r\n if ((selectClass == undefined || selectClass.indexOf('SelectionStyle') == -1) && selectClass != 'SelectionStyle' + name && selectClass != 'SelectionStyleClusterSeries' + seriesIndex && selectClass != 'SelectionPathStyle' + name && parentNodeId.indexOf(chart.svgObject.id + '_symbolGroup_' + index) <= 0) {\r\n $(this).attr('class', className);\r\n }\r\n }\r\n });\r\n //for legend highlight sets here\r\n $('#' + this.svgObject.id + '_LegendItemShape' + index).not(\"[class*='Selection']\").attr('class', 'HighlightLegendStyle' + name);\r\n }\r\n else if (highlight.mode == \"cluster\" && chart.model.AreaType != 'none' && !tracker) {\r\n var matchString = this.svgObject.id + \"_Series\";\r\n var clusterPoints = [], seriesHighlightIndex;\r\n index = targetId.match(/(\\d+)/g);\r\n if (index && targetId.toLowerCase().indexOf(\"point\") > 0) {\r\n pointIndex = parseInt(index[index.length - 1]);\r\n var xvalue = chart.model._visibleSeries[seriesIndex]._visiblePoints[pointIndex].xValue, point;\r\n for (var i = 0, len = chart.model._visibleSeries.length; i < len; i++) {\r\n for (var j = 0; j < chart.model._visibleSeries[i]._visiblePoints.length; j++) {\r\n point = chart.model._visibleSeries[i]._visiblePoints[j];\r\n if (xvalue == point.xValue && point.isEmpty == false && point.visible == true)\r\n clusterPoints[clusterPoints.length] = { seriesIndex: i, pointIndex: j };\r\n }\r\n }\r\n }\r\n for (k = 0; k < clusterPoints.length; k++) {\r\n seriesHighlightIndex = clusterPoints[k].seriesIndex;\r\n name = 'series' + seriesHighlightIndex;\r\n //creating individual styles for the points in different series\r\n colorStyle = {};\r\n colorStyle.name = \"2D\"; colorStyle.api = \"Highlight\" + name;\r\n highlight = chart.model._visibleSeries[seriesHighlightIndex].highlightSettings;\r\n colorStyle.color = highlight.color != \"\" ? highlight.color : this.model.seriesColors[seriesHighlightIndex];\r\n if (Object.prototype.toString.call(colorStyle.color) === '[object Array]')\r\n colorStyle.color = colorStyle.color[1].color;\r\n opacity = highlight.opacity;\r\n strokeColor = highlight.border.color;\r\n strokeWidth = highlight.border.width;\r\n fill = ((patternName == \"none\" || chart.vmlRendering) || patternName == \"\") ? colorStyle.color : this.pattern(chart, evt, colorStyle, highlight);\r\n if (!found_class) {\r\n this.createStyle(chart, 'Highlight', name, opacity, fill, strokeColor, strokeWidth);\r\n this.createStyle(chart, 'HighlightLegend', name, opacity, fill, 'transparent', 0);\r\n }\r\n\r\n //applying the created style to the selected element \r\n var selectClass = $('#' + matchString + clusterPoints[k].seriesIndex + '_Point' + clusterPoints[k].pointIndex).attr('class');\r\n var symbol = $('#' + matchString + clusterPoints[k].seriesIndex + '_Point' + clusterPoints[k].pointIndex + '_symbol').attr('class');\r\n var className = $('#' + matchString + clusterPoints[k].seriesIndex + '_Point' + clusterPoints[k].pointIndex).attr(\"name\") ? 'HighlightPathStyle' + name : 'HighlightStyle' + name;\r\n // this condition is checked for whether already selected and it's symbol\r\n if ((selectClass == undefined || selectClass.indexOf('SelectionStyleseries' + k) == -1) && selectClass != 'SelectionStyle' + 'series' + k && selectClass != 'SelectionPathStyle' + name && parentNodeId.indexOf(chart.svgObject.id + '_symbolGroup_' + k) <= 0) {\r\n $('#' + matchString + clusterPoints[k].seriesIndex + '_' + 'Point' + clusterPoints[k].pointIndex).attr('class', className);\r\n $('#' + matchString + clusterPoints[k].seriesIndex + '_' + 'Point' + clusterPoints[k].pointIndex + '_symbol').attr('class', className);\r\n }\r\n if (chart.model._visibleSeries[seriesHighlightIndex].visibility != \"hidden\")\r\n $('#' + this.svgObject.id + '_LegendItemShape' + seriesHighlightIndex).not(\"[class*='Selection']\").attr('class', 'HighlightLegendStyle' + name);\r\n // checked condition for financial series\r\n var finName = $('#' + targetId).attr(\"name\");\r\n if (finName != undefined && (finName == 'candle' || finName.indexOf('hilo') >= 0)) {\r\n $('[id$=' + matchString + clusterPoints[k].seriesIndex + '_' + 'Point' + clusterPoints[k].pointIndex + ']').attr('class', 'HighlightStyle' + name);\r\n }\r\n }\r\n\r\n }\r\n\r\n else {\r\n // checked condition for whether target id is area related or not\r\n if (!$('#' + targetId).attr(\"name\") && targetId != chart.svgObject.id + '_Series' + index) {\r\n selectClass = $('#' + targetId).attr('class') ? $('#' + targetId).attr('class') : '';\r\n if ((selectClass.indexOf('Selection') != 0 && parentNodeId.indexOf(chart.svgObject.id + '_symbolGroup_' + index) <= 0 && (data || legendData))) {\r\n if (isElement) {\r\n $('#' + targetId).attr('class', 'HighlightStyle' + name);\r\n if (this.model.commonSeriesOptions.columnFacet == 'cylinder' || series.columnFacet == 'cylinder') {\r\n for (i = 0; i < 2; i++) {\r\n $('#' + targetId.replace(/2$/, i)).attr('class', 'HighlightStyle' + name);\r\n }\r\n }\r\n }\r\n $('#' + targetId + '_symbol').attr('class', 'HighlightStyle' + name);\r\n $('#' + this.svgObject.id + '_Series' + seriesIndex + '_Point' + pointIndex).not(\"[class*='Selection']\").attr('class', 'HighlightStyle' + name);\r\n $('#' + this.svgObject.id + '_LegendItemShape' + index).not(\"[class*='Selection']\").attr('class', 'HighlightLegendStyle' + name);\r\n }\r\n if (targetId.indexOf(\"symbol\") > -1)\r\n $('#' + targetId).attr('class', 'HighlightStyle' + name);\r\n }\r\n // checked condition for financial series\r\n var finName = $('#' + targetId).attr(\"name\");\r\n if (finName != undefined && (finName == 'candle' || finName.indexOf('hilo') >= 0)) {\r\n $('[id$=' + targetId + ']').attr('class', 'HighlightStyle' + name);\r\n $('#' + this.svgObject.id + '_LegendItemShape' + index).not(\"[class*='Selection']\").attr('class', 'HighlightLegendStyle' + name);\r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n },\r\n\r\n // 3D style class created here\r\n dStyle: function (style3D, color, chart, evt, settings) {\r\n var vector = ej.Ej3DRender.prototype.polygon3D.prototype;\r\n var highlight = settings;\r\n var name = style3D.api;\r\n var seriesName = style3D.seriesName;\r\n var opacity = highlight.opacity;\r\n color = chart.colorNameToHex(color);\r\n if (style3D.name == \"XLight\")\r\n color = vector.applyXLight(color, chart);\r\n else if (style3D.name == \"ZLight\")\r\n color = vector.applyZLight(color, chart);\r\n else\r\n color = color;\r\n var colorStyle = {};\r\n colorStyle.name = style3D.name; colorStyle.color = color; colorStyle.api = name;\r\n color = (highlight.pattern == \"none\") ? color : this.pattern(chart, evt, colorStyle, highlight);\r\n if (document.getElementById(name + \"Segment\" + seriesName)) {\r\n var style = document.getElementById(name + \"Segment\" + seriesName);\r\n style.innerHTML = style.innerHTML + '.' + name + 'Style' + seriesName + style3D.index + ' { fill:' + color + \";opacity:\" + opacity + ' }';\r\n } else {\r\n var style = document.createElement('style');\r\n style.id = name + \"Segment\" + seriesName;\r\n style.type = 'text/css';\r\n style.innerHTML = '.' + name + 'Style' + seriesName + style3D.index + ' { fill:' + color + \";opacity:\" + opacity + ' }';\r\n document.getElementsByTagName('head')[0].appendChild(style);\r\n }\r\n return name + \"Style\" + seriesName + style3D.index;\r\n\r\n },\r\n\r\n // 3D style class end\r\n\r\n // pattern of the SVG started here\r\n pattern: function (chart, evt, colorStyle, settings) {\r\n var hoverStyle = settings;\r\n var name = colorStyle.api;\r\n var style = hoverStyle.pattern.toLowerCase();\r\n var color = colorStyle.color;\r\n var opacity = hoverStyle.opacity != \"\" ? hoverStyle.opacity : $('#' + evt.target.id).attr('opacity');\r\n var backgroundColor = \"#ffffff\";\r\n if (document.getElementById(name + \"Def\")) {\r\n var svg = $(\"#\" + name + \"Def\")[0];\r\n } else {\r\n var svgid = { 'id': name + \"Def\" }\r\n var svg = chart.svgRenderer.createPattern(svgid, 'svg');\r\n chart.svgRenderer.append(svg, chart.svgObject);\r\n }\r\n if (chart.model.enable3D) {\r\n if (colorStyle.name == \"XLight\")\r\n backgroundColor = \"#595959\";\r\n else if (colorStyle.name == \"ZLight\")\r\n backgroundColor = \"#737373\";\r\n else\r\n backgroundColor = \"#808080\";\r\n }\r\n if ((\"#\" + style + '_' + name + '_' + colorStyle.name + '_' + colorStyle.index))\r\n $(\"#\" + style + '_' + name + '_' + colorStyle.name + '_' + colorStyle.index).remove();\r\n\r\n var pathOptions = [];\r\n switch (style) {\r\n case \"chessboard\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'x': 0, 'y': 0, 'width': 10, 'height': 10 }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'x': 0, 'y': 0, 'width': 10, 'height': 10, 'fill': backgroundColor, 'opacity': opacity, 'name': 'rect' };\r\n pathOptions[1] = { 'x': 0, 'y': 0, 'width': 5, 'height': 5, 'fill': color, 'opacity': opacity, 'name': 'rect' };\r\n pathOptions[2] = { 'x': 5, 'y': 5, 'width': 5, 'height': 5, 'fill': color, 'opacity': opacity, 'name': 'rect' };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"pacman\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '17.917', 'height': '18.384' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 17.917, 'height': 18.384, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'path', 'd': 'M9.081,9.194l5.806-3.08c-0.812-1.496-2.403-3.052-4.291-3.052H8.835C6.138,3.063,3,6.151,3,8.723v1.679 c0,2.572,3.138,5.661,5.835,5.661h1.761c2.085,0,3.835-1.76,4.535-3.514L9.081,9.194z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"crosshatch\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '8', 'height': '8' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'x': 0, 'y': 0, 'width': 8, 'height': 8, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity, 'name': 'rect' };\r\n pathOptions[1] = {\r\n 'd': 'M0 0L8 8ZM8 0L0 8Z',\r\n 'stroke-width': 1,\r\n 'stroke': color,\r\n 'name': 'path'\r\n };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"dots\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '6', 'height': '6' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'x': 0, 'y': 0, 'width': 7, 'height': 7, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity, 'name': 'rect' };\r\n pathOptions[1] = {\r\n 'cx': 3,\r\n 'cy': 3,\r\n 'r': 2,\r\n 'stroke-width': 1,\r\n 'fill': color,\r\n 'name': 'circle'\r\n };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"diagonalforward\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '6', 'height': '6' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'x': 0, 'y': 0, 'width': 6, 'height': 6, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity, 'name': 'rect' };\r\n pathOptions[1] = {\r\n 'd': 'M 3 -3 L 9 3 M 6 6 L 0 0 M 3 9 L -3 3',\r\n 'stroke-width': 2,\r\n 'stroke': color,\r\n 'name': 'path'\r\n };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"diagonalbackward\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '6', 'height': '6' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'x': 0, 'y': 0, 'width': 6, 'height': 6, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity, 'name': 'rect' };\r\n pathOptions[1] = {\r\n 'd': 'M 3 -3 L -3 3 M 0 6 L 6 0 M 9 3 L 3 9',\r\n 'stroke-width': 2,\r\n 'stroke': color,\r\n 'name': 'path'\r\n };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"grid\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '6', 'height': '6' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 6, 'height': 6, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = {\r\n 'name': 'path',\r\n 'd': 'M1 3.5L11 3.5 M0 3.5L11 3.5 M0 7.5L11 7.5 M0 11.5L11 11.5 M5.5 0L5.5 12 M11.5 0L11.5 12Z',\r\n 'stroke-width': 1,\r\n 'stroke': color\r\n };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"turquoise\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '17', 'height': '17' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 17, 'height': 17, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'path', 'd': 'M0.5739999999999998,2.643a2.123,2.111 0 1,0 4.246,0a2.123,2.111 0 1,0 -4.246,0', 'stroke-width': 1, 'stroke-miterlimit': 10, 'stroke': color, 'fill': color };\r\n pathOptions[2] = { 'name': 'path', 'd': 'M11.805,2.643a2.123,2.111 0 1,0 4.246,0a2.123,2.111 0 1,0 -4.246,0', 'stroke-width': 1, 'stroke-miterlimit': 10, 'stroke': color, 'fill': color };\r\n pathOptions[3] = { 'name': 'path', 'd': 'M6.19,2.643a2.123,2.111 0 1,0 4.246,0a2.123,2.111 0 1,0 -4.246,0', 'stroke-width': 1, 'stroke-miterlimit': 10, 'stroke': color, 'fill': color };\r\n pathOptions[4] = { 'name': 'path', 'd': 'M11.805,8.217a2.123,2.111 0 1,0 4.246,0a2.123,2.111 0 1,0 -4.246,0', 'stroke-width': 1, 'stroke-miterlimit': 10, 'stroke': color, 'fill': color };\r\n pathOptions[5] = { 'name': 'path', 'd': 'M6.19,8.217a2.123,2.111 0 1,0 4.246,0a2.123,2.111 0 1,0 -4.246,0', 'stroke-width': 1, 'stroke-miterlimit': 10, 'stroke': color, 'fill': color };\r\n pathOptions[6] = { 'name': 'path', 'd': 'M11.805,13.899a2.123,2.111 0 1,0 4.246,0a2.123,2.111 0 1,0 -4.246,0', 'stroke-width': 1, 'stroke-miterlimit': 10, 'stroke': color, 'fill': color };\r\n pathOptions[7] = { 'name': 'path', 'd': 'M6.19,13.899a2.123,2.111 0 1,0 4.246,0a2.123,2.111 0 1,0 -4.246,0', 'stroke-width': 1, 'stroke-miterlimit': 10, 'stroke': color, 'fill': color };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"star\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '21', 'height': '21' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 21, 'height': 21, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = {\r\n 'name': 'path',\r\n 'd': 'M15.913,18.59L10.762 12.842 5.613 18.75 8.291 11.422 0.325 9.91 8.154 8.33 5.337 0.91 10.488 6.658 15.637 0.75 12.959 8.078 20.925 9.59 13.096 11.17 z',\r\n 'stroke-width': 1,\r\n 'stroke': color,\r\n 'fill': color\r\n };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"triangle\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '10', 'height': '10' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 10, 'height': 10, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = {\r\n 'name': 'path',\r\n 'd': 'M4.987,0L7.48 4.847 9.974 9.694 4.987 9.694 0 9.694 2.493 4.847 z',\r\n 'stroke-width': 1,\r\n 'stroke': color,\r\n 'fill': color\r\n };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"circle\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '9', 'height': '9' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 9, 'height': 9, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = {\r\n 'name': 'circle',\r\n 'cx': 5.125,\r\n 'cy': 3.875,\r\n 'r': 3.625,\r\n 'stroke-width': 1,\r\n 'fill': color\r\n };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"tile\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '18', 'height': '18' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 18, 'height': 18, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'path', 'd': 'M0,9L0 0 9 0 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n pathOptions[2] = { 'name': 'path', 'd': 'M9,9L9 0 18 0 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n pathOptions[3] = { 'name': 'path', 'd': 'M0,18L0 9 9 9 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n pathOptions[4] = { 'name': 'path', 'd': 'M9,18L9 9 18 9 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"horizontaldash\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '12', 'height': '12' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 12, 'height': 12, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'path', 'd': 'M0,1.5 L10 1.5 M0,5.5 L10 5.5 M0,9.5 L10 9.5 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"verticaldash\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '12', 'height': '12' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 12, 'height': 12, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'path', 'd': 'M1.5,0 L1.5 10 M5.5,0 L5.5 10 M9.5,0 L9.5 10 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"rectangle\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'x': 0, 'y': 0, 'width': 12, 'height': 12 }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'name': 'rect', 'width': 12, 'height': 12, 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'rect', 'x': 1, 'y': 2, 'width': 4, 'height': 9, 'fill': color, 'opacity': opacity };\r\n pathOptions[2] = { 'name': 'rect', 'x': 7, 'y': 2, 'width': 4, 'height': 9, 'fill': color, 'opacity': opacity };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"box\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'x': 0, 'y': 0, 'width': 10, 'height': 10 }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'name': 'rect', 'width': 13, 'height': 13, 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'rect', 'x': 1.5, 'y': 1.5, 'width': 10, 'height': 9, 'fill': color, 'opacity': opacity };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"horizontalstripe\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '10', 'height': '12' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 10, 'height': 12, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'path', 'd': 'M0,0.5 L10 0.5 M0,4.5 L10 4.5 M0,8.5 L10 8.5 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"verticalstripe\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '12', 'height': '10' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 12, 'height': 10, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'path', 'd': 'M0.5,0 L0.5 10 M4.5,0 L4.5 10 M8.5,0 L8.5 10 z', 'stroke-width': 1, 'stroke': color, 'fill': color };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"bubble\":\r\n var patternGroup = { 'id': style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index, 'patternUnits': 'userSpaceOnUse', 'width': '20', 'height': '20' }\r\n var pattern = chart.svgRenderer.createPattern(patternGroup, 'pattern');\r\n pathOptions[0] = { 'name': 'rect', 'x': 0, 'y': 0, 'width': 20, 'height': 20, 'transform': \"translate(0,0)\", 'fill': backgroundColor, 'opacity': opacity };\r\n pathOptions[1] = { 'name': 'circle', 'cx': 5.217, 'cy': 11.325, 'r': 3.429, 'stroke-width': 1, 'fill': '#D0A6D1' };\r\n pathOptions[2] = { 'name': 'circle', 'cx': 13.328, 'cy': 6.24, 'r': 4.884, 'stroke-width': 1, 'fill': color };\r\n pathOptions[3] = { 'name': 'circle', 'cx': 13.277, 'cy': 14.66, 'r': 3.018, 'stroke-width': 1, 'fill': '#D0A6D1' };\r\n this.loadPattern(chart, pathOptions, pattern);\r\n svg.appendChild(pattern);\r\n return \"url(#\" + style + \"_\" + name + \"_\" + colorStyle.name + \"_\" + colorStyle.index + \")\";\r\n case \"custom\":\r\n return \"url(#\" + hoverStyle.customPattern + \")\";\r\n }\r\n\r\n },\r\n loadPattern: function (chart, options, pattern, ctx) {\r\n var path;\r\n for (var i = 0; i < options.length; i++) {\r\n if (!ctx) {\r\n path = chart.svgRenderer.createPattern(options[i], options[i].name);\r\n pattern.appendChild(path);\r\n } else {\r\n if (options[i].name == 'rect') {\r\n options[i].stroke = 'transparent';\r\n this.drawRect(options[i], ctx);\r\n }\r\n else if (options[i].name == 'path')\r\n ej.EjCanvasRender.prototype.drawPath(options[i], ctx);\r\n else if (options[i].name == 'circle') {\r\n options[i].stroke = 'transparent';\r\n ej.EjCanvasRender.prototype.drawCircle(options[i], ctx);\r\n }\r\n }\r\n }\r\n },\r\n drawRect: function (options, element) {\r\n element.save();\r\n element.beginPath();\r\n element.globalAlpha = options.opacity;\r\n element.lineWidth = options[\"stroke-width\"];\r\n element.strokeStyle = options.stroke;\r\n element.rect(options.x, options.y, options.width, options.height);\r\n if (options.fill == \"none\") options.fill = \"transparent\";\r\n element.fillStyle = options.fill;\r\n if (options.transform) element.translate(options.transform[0], options.transform[1]);\r\n element.rotate(options.rotate * Math.PI / 180);\r\n element.fillRect(options.x, options.y, options.width, options.height);\r\n element.clip();\r\n element.stroke();\r\n element.restore();\r\n },\r\n // pattern of the SVG end\r\n // SVG highlight and selection end\r\n\r\n chartRightClick: function (evt) {\r\n this.chartRightClick = true;\r\n if (this.isTouch(evt) && this.model.crosshair.visible) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return false;\r\n }\r\n },\r\n\r\n chartMouseUpTouch: function (evt) {\r\n var chart = this,\r\n matched = jQuery.uaMatch(navigator.userAgent),\r\n mouseMoveCords = this.calMousePosition(evt),\r\n browserInfo = this.model.browserInfo,\r\n element;\r\n this.mousemoveX = mouseMoveCords.X;\r\n this.mousemoveY = mouseMoveCords.Y;\r\n this.enableTrackBall();\r\n\r\n clearTimeout(this.model.doubleTapTimer);\r\n\r\n if (!this.drag)\r\n this.model.doubleTapTimer = setTimeout(function () {\r\n if ((chart.model.tapNum < 2 || chart.model.crosshair.visible))\r\n chart.singleTap(evt);\r\n chart.model.tapNum = 0;\r\n chart.model.cachedX = 0;\r\n chart.model.cachedY = 0;\r\n\r\n }, 200);\r\n\r\n if (chart.model.tapNum == 2)\r\n chart.model.doubleTapped = false;\r\n\r\n return true;\r\n },\r\n getEvent: function (event) {\r\n return event.targetTouches && event.targetTouches[0] ? event.targetTouches[0] : event\r\n },\r\n\r\n // Method to check the double tap in chart.\r\n doubleTap: function (e) {\r\n\r\n var pointer = this.getEvent(e),\r\n currX = pointer.pageX,\r\n currY = pointer.pageY,\r\n model = this.model,\r\n padding = 200,\r\n element,\r\n bounds = model.m_AreaBounds;\r\n\r\n this.model.cachedX = this.model.cachedX || currX;\r\n\r\n this.model.cachedY = this.model.cachedY || currY;\r\n\r\n var timestamp = new Date().getTime();\r\n\r\n\r\n if (this.mouseDownX >= bounds.X && this.mouseDownX < (bounds.X + bounds.Width) && this.mouseDownY < (bounds.Y + bounds.Height) && this.mouseDownY >= bounds.Y && Math.abs(currX - this.model.cachedX) < padding && Math.abs(currY - this.model.cachedY) < padding)\r\n this.model.tapNum++;\r\n\r\n\r\n if (this.model.tapNum == 2) {\r\n this.model.doubleTapped = true;\r\n this.multiSelectMouseDown(e);\r\n this.drag = this.model.zooming.enable || this._isMultiSelect;\r\n element = this.model.trackerElement;\r\n if (element) {\r\n $(element).finish();\r\n element = null;\r\n }\r\n }\r\n\r\n },\r\n // Method invoking userinteraction in single Tap.\r\n singleTap: function (evt) {\r\n var chart = this,\r\n targetid = evt.target.id,\r\n seriesCollection = this.model._visibleSeries,\r\n element,\r\n pointer = this.getEvent(evt),\r\n currX = pointer.pageX,\r\n currY = pointer.pageY,\r\n swipeThreshold = 10;\r\n\r\n if ((!this.panning && !this.isZoomButtonHovered(evt.target))) {\r\n this.cancelEvent(evt);\r\n if (chart.model.trackerElement) {\r\n if ($.finish)\r\n $(chart.model.trackerElement).finish();\r\n else\r\n $(chart.model.trackerElement).stop(true, true);\r\n chart.model.trackerElement = null;\r\n }\r\n $(\".ejTooltip\" + this._id).remove();\r\n //if ($(element).find(\"#\" + chart.svgObject.id + \"_CrosshairGroup\").length==0) {\r\n if ((!chart.model.crosshair.visible || chart.model.AreaType != \"cartesianaxes\") && Math.abs(currX - chart.model.cachedX) < swipeThreshold && Math.abs(currY - chart.model.cachedY) < swipeThreshold) {\r\n this.chartInteractiveBehavior(evt);\r\n }\r\n\r\n else {\r\n\r\n chart.model.element = $(document).find(\"#\" + this.svgObject.id + \"_CrosshairGroup\");\r\n chart.model.trackerElement = $(chart.model.element).children().not('.Tracker').not(\"defs\");\r\n if ($(chart.model.trackerElement).length > 0)\r\n $(chart.model.trackerElement).fadeOut(1000, function () {\r\n $(chart.model.element).find('[id*=\"trackSymbol\"]').attr(\"visibility\", \"hidden\");\r\n chart.model.trackerElement = null;\r\n chart._removeHighlight();\r\n });\r\n var groupElement = $(document).find('[id*=\"_trackball_grouping_tooltip\"]');\r\n if ($(groupElement).length > 0)\r\n $(groupElement).fadeOut(1000, function () {\r\n $(groupElement).remove();\r\n });\r\n }\r\n\r\n this.axisTooltip(evt, targetid);\r\n\r\n this.showTitleTooltip(evt, targetid);\r\n\r\n if (this.model.enableCanvasRendering) {\r\n this._textTooltip(evt, this.model.xAxisLabelRegions);\r\n this._textTooltip(evt, this.model.yAxisLabelRegions);\r\n }\r\n\r\n for (var i = 0, seriesLength = this.model.series.length; i < seriesLength; i++) {\r\n var series = this.model.series[i], dataLabel = series.marker.dataLabel;\r\n if (series._enableSmartLabels && !this.model.enable3D && !dataLabel.enableWrap) {\r\n var template = dataLabel.template;\r\n var font = dataLabel.font;\r\n if (this.model.AreaType == \"none\" && ej.util.isNullOrUndefined(template)) {\r\n this.datalabelTooltip(evt, i, font);\r\n }\r\n }\r\n }\r\n\r\n if ($(\".ejTooltip\" + this._id).length > 0)\r\n element = $(\".ejTooltip\" + this._id);\r\n if ($(\".tooltipDiv\" + this._id).length > 0)\r\n element = $(\".tooltipDiv\" + this._id);\r\n window.clearTimeout(chart.model.timer);\r\n chart.model.trackerElement = element;\r\n chart.model.timer = setTimeout(function () {\r\n var pointData = chart.model.prevPoint;\r\n if (chart.model.trackerElement) {\r\n chart.model.trackerElement.fadeOut(500, function () {\r\n if (pointData) {\r\n if (chart.model.AreaType != \"polaraxes\") {\r\n var prevLocation = ej.EjSvgRender.utils._getPoint(pointData.point, pointData.series);\r\n chart.drawTrackerSymbol(pointData.series, pointData.seriesIndex, pointData.pointIndex, null, prevLocation);\r\n }\r\n $(\"#\" + \"canvas\" + \"_trackSymbol\").remove();\r\n }\r\n $(\"[id*=\" + \"_TrackSymbol\" + \"]\").remove();\r\n });\r\n }\r\n else {\r\n if (pointData) {\r\n if (chart.model.AreaType != \"polaraxes\") {\r\n var prevLocation = ej.EjSvgRender.utils._getPoint(pointData.point, pointData.series);\r\n chart.drawTrackerSymbol(pointData.series, pointData.seriesIndex, pointData.pointIndex, null, prevLocation);\r\n }\r\n }\r\n if (!chart.model.crosshair.visible) {\r\n $(\"#\" + \"canvas\" + \"_trackSymbol\").remove();\r\n $(\"[id*=\" + \"_TrackSymbol\" + \"]\").remove();\r\n }\r\n }\r\n\r\n }, 1200);\r\n\r\n\r\n }\r\n if (!evt.originalEvent.pointerType && !this.panning && (this.model.selectionEnable || ((this.isDevice() && this._isSafari))))\r\n this._doClick(evt);\r\n },\r\n _getPieOfPiePoint: function (index, series, legenddata) {\r\n var visiblePoints = legenddata ? series.points : series._visiblePoints;\r\n var length = visiblePoints.length;\r\n for (var j = 0; j < length; j++) {\r\n if (index == visiblePoints[j].actualIndex)\r\n var seriesPoint = visiblePoints[j];\r\n }\r\n return seriesPoint;\r\n },\r\n tooltip: function (chart, evt) {\r\n var tooltipShowing = false;\r\n var chartSeries;\r\n var seriesIndex;\r\n var data = this.GetSeriesPoint(evt);\r\n $(\"#\" + \"canvas\" + \"_trackSymbol\").remove();\r\n if (ej.util.isNullOrUndefined(data) && !this.dragPoint) // To hide the tooltip when it is moved on chartArea other than series\r\n $(\"#\" + chart.svgObject.id + \"_TrackToolTip\").remove();\r\n\r\n if (!this.model.crosshair.visible && this.model.AreaType == \"cartesianaxes\") {\r\n var indicators = this.model.indicators,\r\n seriesCollection = this.model._visibleSeries,\r\n currentIndicator, l, k, trendLines,\r\n length = seriesCollection.length;\r\n var trackcount = 0;\r\n for (k = 0; k < length; k++) {\r\n trendLines = seriesCollection[k].trendlines;\r\n for (l = 0; l < trendLines.length; l++) {\r\n if (trendLines[l].visibility.toLowerCase() == \"visible\" && !trendLines[l].isNull && this.model.series[0].type != \"boxandwhisker\") {\r\n trendLines[l]._visiblePoints = trendLines[l].points;\r\n seriesCollection = seriesCollection.concat(trendLines[l]);\r\n }\r\n }\r\n }\r\n\r\n for (var j = 0; j < indicators.length && indicators[j].segment; j++) {\r\n currentIndicator = indicators[j];\r\n if (currentIndicator.visible)\r\n seriesCollection = seriesCollection.concat(currentIndicator.segment);\r\n }\r\n var seriesCollectionLength = seriesCollection.length;\r\n for (var i = 0; i < seriesCollectionLength; i++) {\r\n chartSeries = seriesCollection[i];\r\n seriesIndex = i;\r\n\r\n var type = chartSeries.type.toLowerCase();\r\n if (chartSeries.visibility.toLowerCase() == 'visible' && type !== \"scatter\" && type !== \"bubble\" && type !== \"column\" && (type.indexOf(\"bar\") == -1) && type !== \"stackingcolumn\" && type !== \"stackingcolumn100\" && !chartSeries._hiloTypes) {\r\n $(\"#\" + chart.svgObject.id + \"_TrackToolTipTemplate_\" + seriesIndex).remove();\r\n if (!($(\".tooltipDiv\" + this._id).hasClass(chart.svgObject.id)))\r\n $(\".tooltipDiv\" + this._id).remove();\r\n $(\"#\" + chart.svgObject.id).find(\"#\" + chart.svgObject.id + \"_TrackSymbol\" + '_' + seriesIndex).remove();\r\n $('#' + chart.svgObject.id + '_TrackSymbol' + '_' + seriesIndex).remove();\r\n var serY = [];\r\n var serX = [];\r\n location = null;\r\n var closestXyPoint = chart.getClosesPointXY(serX, serY, chartSeries, chart.mousemoveX, chart.mousemoveY, evt);\r\n if (ej.util.isNullOrUndefined(closestXyPoint.point) && (!this.model.prevPoint || (this.model.prevPoint.seriesIndex && !this.model.series[this.model.prevPoint.seriesIndex].tooltip.visible)) && !this.dragPoint && ($(\".tooltipDiv\" + this._id).hasClass(this.svgObject.id))) {\r\n clearTimeout(this.removeTooltip);\r\n chart.removeTooltip = setTimeout(function () { // To hide the tooltip when it is moved on chartArea other than series\r\n $(\".tooltipDiv\" + chart._id).remove();\r\n }, 1000);\r\n }\r\n if (closestXyPoint.point) {\r\n if (chartSeries.type.toLowerCase() == \"boxandwhisker\") {\r\n trackcount++;\r\n location = closestXyPoint.outlierPosition;\r\n } else\r\n location = ej.EjSvgRender.utils._getPoint(closestXyPoint.point, chartSeries);\r\n var commonPointEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonPointEventArgs.data = { location: { x: this.mousemoveX, y: this.mousemoveX }, region: { SeriesIndex: i, Region: { PointIndex: closestXyPoint.index } } };\r\n chart._trigger(\"pointRegionMouseMove\", commonPointEventArgs);\r\n }\r\n var pointData = this.model.prevPoint;\r\n if (pointData && pointData.seriesIndex == i && !closestXyPoint.point) {\r\n if (chartSeries.type.toLowerCase() == \"boxandwhisker\") {\r\n trackcount++;\r\n pointLocation = pointData.outlierPosition;\r\n\r\n }\r\n else\r\n var pointLocation = ej.EjSvgRender.utils._getPoint(pointData.point, pointData.series);\r\n if (!chart.model.enableCanvasRendering) // No need to draw again in canvas chart after explode marker\r\n chart.drawTrackerSymbol(pointData.series, pointData.seriesIndex, pointData.pointIndex, null, pointLocation);\r\n this.model.prevPoint = null;\r\n }\r\n if (!chartSeries.isIndicator && !chartSeries.isTrendLine && !chartSeries.selectionSettings.enable && !chartSeries.highlightSettings.enable && (chartSeries.marker.visible || chartSeries.type.toLowerCase() == \"boxandwhisker\") && closestXyPoint.point && !commonPointEventArgs.cancel) {\r\n if (ej.util.isNullOrUndefined(closestXyPoint.point.marker) || ej.util.isNullOrUndefined(closestXyPoint.point.marker.visible) || (closestXyPoint.point.marker && closestXyPoint.point.marker.visible))\r\n chart.drawTrackerSymbol(chartSeries, seriesIndex, closestXyPoint.index, false, location);\r\n else if (chartSeries.type == \"boxandwhisker\" && !closestXyPoint.point.marker)\r\n chart.drawTrackerSymbol(chartSeries, seriesIndex, closestXyPoint.index, false, location);\r\n if (pointData && closestXyPoint.point != pointData.point) {\r\n if (chartSeries.type.toLowerCase() == \"boxandwhisker\") {\r\n trackcount++;\r\n prevLocation = pointData.outlierPosition;\r\n }\r\n else\r\n var prevLocation = ej.EjSvgRender.utils._getPoint(pointData.point, pointData.series);\r\n chart.drawTrackerSymbol(pointData.series, pointData.seriesIndex, pointData.pointIndex, null, prevLocation, id, trackcount);\r\n }\r\n if (ej.util.isNullOrUndefined(closestXyPoint.point.marker) || ej.util.isNullOrUndefined(closestXyPoint.point.marker.visible) || (closestXyPoint.point.marker && closestXyPoint.point.marker.visible))\r\n this.model.prevPoint = { point: closestXyPoint.point, pointIndex: closestXyPoint.index, series: chartSeries, seriesIndex: seriesIndex, outlierPosition: closestXyPoint.outlierPosition };\r\n }\r\n\r\n\r\n if (chartSeries.tooltip.visible && closestXyPoint.point && (!data || (i > data.region.SeriesIndex && !(chartSeries._zOrder < this.model._visibleSeries[data.region.SeriesIndex]._zOrder)))) {\r\n trans = ej.EjSvgRender.utils._getTransform(chartSeries.xAxis, chartSeries.yAxis, chart.model.requireInvertedAxes);\r\n if ((location.X + trans.x) <= (trans.x + trans.width) && ((location.X + trans.x) >= trans.x || location.X == 0) && (Math.abs(location.Y - (trans.y + trans.height)) <= (trans.y + trans.height))\r\n && (Math.abs(location.Y - (trans.y + trans.height)) >= trans.y || location.Y == 0)) {\r\n if (!commonPointEventArgs.cancel) {\r\n if ($(chart.svgObject).find(\"#\" + chart.svgObject.id + \"_TrackToolTip\").length == 0) {\r\n var transOptions = { 'id': chart.svgObject.id + '_TrackToolTip', 'transform': 'translate(' + trans.x + ',' + trans.y + ')' };\r\n chart.gTransToolEle = chart.svgRenderer.createGroup(transOptions);\r\n }\r\n chart.svgRenderer._setAttr($(chart.svgObject).find(\"#\" + chart.svgObject.id + \"_TrackToolTip\"), { 'transform': 'translate(' + trans.x + ',' + trans.y + ')', 'visibility': 'visible' });\r\n if (ej.util.isNullOrUndefined(chartSeries.tooltip.template)) {\r\n tooltipShowing = true;\r\n $(\".tooltipDiv\" + this._id).remove();\r\n chart.displayShowTooltip(location, closestXyPoint.point, chartSeries, closestXyPoint.index);\r\n }\r\n else {\r\n tooltipShowing = true;\r\n $(\"#\" + chart.svgObject.id).find(\"#\" + chart.svgObject.id + \"_TrackToolTip\").attr('visibility', 'hidden');\r\n var region = { SeriesIndex: seriesIndex, Region: { PointIndex: closestXyPoint.index } };\r\n chart.createTooltip(region, evt, chartSeries);\r\n }\r\n\r\n //Comment the below code for VML -The line series tooltip color not displayed due to attach and detach the element to DOM\r\n // var detachEle = $(chart.svgObject).find(\"#\" + chart.svgObject.id + \"_TrackToolTip\").detach();\r\n //detachEle.appendTo(chart.svgObject);\r\n }\r\n\r\n }\r\n }\r\n }\r\n else if (ej.util.isNullOrUndefined(data) && !this.dragPoint && ($(\".tooltipDiv\" + this._id).hasClass(this.svgObject.id))) {\r\n clearTimeout(this.removeTooltip);\r\n chart.removeTooltip = setTimeout(function () { // To hide the tooltip when it is moved on chartArea other than series\r\n $(\".tooltipDiv\" + chart._id).remove();\r\n }, 1000);\r\n }\r\n }\r\n }\r\n else {\r\n $(\"#\" + this.svgObject.id).find(\"#\" + this.svgObject.id + \"_TrackToolTip\").hide();\r\n if (ej.util.isNullOrUndefined(data)) {\r\n clearTimeout(this.removeTooltip);\r\n chart.removeTooltip = setTimeout(function () { // To hide the tooltip when it is moved on chartArea other than series\r\n $(\".tooltipDiv\" + chart._id).remove();\r\n }, 1000);\r\n }\r\n }\r\n\r\n if (!($(\".tooltipDiv\" + this._id).hasClass(this.svgObject.id)))\r\n $(\".tooltipDiv\" + this._id).remove();\r\n if (data && ej.util.isNullOrUndefined(data.region.isStripLine)) {\r\n var seriesType = this.model._visibleSeries[data.region.SeriesIndex].type.toLowerCase();\r\n if ((seriesType == \"pie\" || seriesType == \"pieofpie\" || seriesType == \"doughnut\") && this.model._visibleSeries[data.region.SeriesIndex].explode) {\r\n if (this.model._visibleSeries[data.region.SeriesIndex].enableAnimation) {\r\n if (this.model.AnimationComplete || this.model.enableCanvasRendering)\r\n this.pieExplosion(data, evt);\r\n }\r\n else if (!this.model.enable3D)\r\n this.pieExplosion(data, evt);\r\n }\r\n if (data.region.isIndicator) {\r\n series = this.model.indicators[data.region.SeriesIndex];\r\n var seriesPoint = series.segment[0]._visiblePoints[data.region.Region.PointIndex];\r\n series.fill = series.segment[0].fill;\r\n } else {\r\n series = this.model._visibleSeries[data.region.SeriesIndex];\r\n if (series.type == \"pieofpie\" && !this.model.enable3D)\r\n var seriesPoint = this._getPieOfPiePoint(data.region.Region.PointIndex, series);\r\n else if ((series.type == \"pie\" || series.type == \"doughnut\") && !this.model.enable3D) {\r\n for (var v = 0; v < series._visiblePoints.length; v++) {\r\n if (data.region.Region.length == series._visiblePoints.length) {\r\n if (data.region.Region.PointIndex == series._visiblePoints[v].actualIndex) {\r\n var seriesPoint = this.model._visibleSeries[data.region.SeriesIndex]._visiblePoints[v];\r\n break;\r\n }\r\n }\r\n else {\r\n if (data.region.Region.Index == v) {\r\n var seriesPoint = this.model._visibleSeries[data.region.SeriesIndex]._visiblePoints[v];\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n else\r\n var seriesPoint = this.model._visibleSeries[data.region.SeriesIndex]._visiblePoints[data.region.Region.PointIndex];\r\n }\r\n\r\n if (seriesPoint && this.model.AreaType == 'polaraxes') {\r\n for (var i = 0; i < this.model._visibleSeries.length; i++) {\r\n $(\"[id*=\" + \"_TrackSymbol\" + \"]\").remove();\r\n var trackId = \"canvas_trackSymbol_\" + i;\r\n $(\"#\" + this._id).find('[id*=' + trackId + ']').remove();\r\n }\r\n var pointlocation = (this.model.AreaType != \"polaraxes\")\r\n ? ej.EjSvgRender.utils._getPoint(seriesPoint, series)\r\n : (ej.EjSvgRender.utils.TransformToVisible(series, seriesPoint.xValue, seriesPoint.y, this))\r\n var prevPoint = this.model.prevPoint;\r\n if (!ej.util.isNullOrUndefined(prevPoint) && prevPoint != data && series.marker.visible) {\r\n var series = this.model._visibleSeries[prevPoint.region.SeriesIndex],\r\n prevSeriesPoint = this.model._visibleSeries[prevPoint.region.SeriesIndex]._visiblePoints[prevPoint.region.Region.PointIndex],\r\n prevlocation = ej.EjSvgRender.utils.TransformToVisible(series, prevSeriesPoint.xValue, prevSeriesPoint.y, this);\r\n this.drawTrackerSymbol(series, prevPoint.region.SeriesIndex, prevPoint.region.Region.PointIndex, null, prevlocation);\r\n this.model.prevPoint = null;\r\n }\r\n if ((series.marker.visible && series.drawType != \"column\") && (series.drawType.toLowerCase() != \"rangecolumn\")) {\r\n this.drawTrackerSymbol(series, data.region.SeriesIndex, data.region.Region.PointIndex, true, pointlocation);\r\n this.model.prevPoint = data;\r\n }\r\n }\r\n\r\n if (series.tooltip.visible && !tooltipShowing) {\r\n\r\n if (series.visibility.toLowerCase() == 'visible') {\r\n if (ej.util.isNullOrUndefined(series.tooltip.template)) {\r\n var location;\r\n if (this.model.AreaType == \"cartesianaxes\") {\r\n\r\n var trans = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, this.model.requireInvertedAxes);\r\n if ($(this.svgObject).find(\"#\" + this.svgObject.id + \"_TrackToolTip\").length == 0) {\r\n var transToolOptions = { 'id': this.svgObject.id + '_TrackToolTip', 'transform': 'translate(' + trans.x + ',' + trans.y + ')' };\r\n this.gTransToolEle = this.svgRenderer.createGroup(transToolOptions);\r\n }\r\n this.svgRenderer._setAttr($(this.svgObject).find(\"#\" + this.svgObject.id + \"_TrackToolTip\"), { 'transform': 'translate(' + trans.x + ',' + trans.y + ')' });\r\n $('#' + this.svgObject.id + \"_TrackToolTip\").attr(\"visibility\", \"visible\");\r\n location = { X: (data.location.x - this.model.m_AreaBounds.X), Y: Math.abs(data.location.y - (this.model.m_AreaBounds.Y)) };\r\n } else {\r\n if ($(this.svgObject).find(\"#\" + this.svgObject.id + \"_TrackToolTip\").length == 0) {\r\n var transToolTipOptions = { 'id': this.svgObject.id + '_TrackToolTip' };\r\n this.gTransToolEle = this.svgRenderer.createGroup(transToolTipOptions);\r\n }\r\n location = { X: (data.location.x), Y: Math.abs(data.location.y) };\r\n }\r\n\r\n\r\n $(\".tooltipDiv\" + this._id).remove();\r\n this.displayShowTooltip(location, seriesPoint, series, data.region.Region.PointIndex);\r\n\r\n //Comment the below code for VML -The line series tooltip color not displayed due to attach and detach the element to DOM\r\n // if (series.type.toLowerCase() == \"bubble\" || series.type.toLowerCase() == \"scatter\") {\r\n // var detachEle = $(this.svgObject).find(\"#\" + this.svgObject.id + \"_TrackToolTip\").detach();\r\n // detachEle.appendTo(this.svgObject);\r\n // }\r\n } else {\r\n $(\"#\" + chart.svgObject.id).find(\"#\" + chart.svgObject.id + \"_TrackToolTip\").attr('visibility', 'hidden');\r\n this.createTooltip(data.region, evt);\r\n }\r\n }\r\n }\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = data;\r\n this._trigger(\"pointRegionMouseMove\", commonEventArgs);\r\n }\r\n else if (!ej.util.isNullOrUndefined(this.model.prevPoint) && this.model.AreaType == \"polaraxes\") {\r\n var prevPoint = this.model.prevPoint;\r\n series = this.model._visibleSeries[prevPoint.region.SeriesIndex];\r\n seriesPoint = this.model._visibleSeries[prevPoint.region.SeriesIndex]._visiblePoints[prevPoint.region.Region.PointIndex];\r\n pointlocation = ej.EjSvgRender.utils.TransformToVisible(series, seriesPoint.xValue, seriesPoint.y, this);\r\n this.drawTrackerSymbol(series, prevPoint.region.SeriesIndex, prevPoint.region.Region.PointIndex, null, pointlocation);\r\n this.model.prevPoint = null;\r\n }\r\n else {\r\n if (!ej.util.isNullOrUndefined(this.model.explodeValue)) {\r\n var type = this.model.series[this.model.explodeValue.SeriesIndex].type.toLowerCase();\r\n var series = this.model._visibleSeries[this.model.explodeValue.SeriesIndex];\r\n var seriesType = new ej.seriesTypes[type]();\r\n var targetElement;\r\n var id;\r\n var _labelPosition = series.labelPosition.toLowerCase();\r\n var seriesIndex = this.model.explodeValue.SeriesIndex;\r\n var visiblePoint = (this.model._isPieOfPie) ? this._getPieOfPiePoint(this.model.explodeValue.PointIndex, series) : series._visiblePoints[this.model.explodeValue.Index];\r\n var result = seriesType._calculateArcData(this, this.model.explodeValue.PointIndex, visiblePoint, series, seriesIndex, this.model.explodeValue.PieSeriesIndex);\r\n if (this.model.enableCanvasRendering) {\r\n this.model.series[seriesIndex].explodeIndex = null;\r\n var chartRect = document.getElementById(this.svgObject.id).getClientRects()[0];\r\n this.svgRenderer.ctx.clearRect(chartRect.left, chartRect.top, chartRect.width, chartRect.height);\r\n $(\"#\" + this._id).ejChart(\"redraw\");\r\n }\r\n id = this.svgObject.id + '_SeriesGroup' + '_' + seriesIndex;\r\n targetElement = this.model.explodeValue.PieSeriesIndex == 1 ? $(this.gSeriesEle).children('#' + id)[1] : $(this.gSeriesEle).children('#' + id)[0];\r\n var elements = $(targetElement).children();\r\n for (var i = 0; i < elements.length; i++) {\r\n var element = elements[i];\r\n var index = this.svgRenderer._getAttrVal($(element)[0], \"data-pointIndex\");\r\n if (parseInt(index) == this.model.explodeValue.PointIndex) {\r\n this.svgRenderer._setAttr($(element), { 'd': result.Direction });\r\n break;\r\n }\r\n }\r\n seriesType.drawDataLabelAcc(this, series, this.model.explodeValue.Index, visiblePoint, seriesIndex, this.model.explodeValue.PieSeriesIndex);\r\n this.model.explodeValue = null;\r\n this.model.explode = false;\r\n }\r\n }\r\n },\r\n\r\n chartTrackball: function (chart, mouseLocation, evt) {\r\n var requireInvertedAxes = chart.model.requireInvertedAxes, store = [], color = [], point, seriesColor, closePointLength, seriesIndex, series, dir, indicators = this.model.indicators, seriesCollection = this.model._visibleSeries,\r\n showTrackLine = false, seriesIndex, serX, insideBounds, closestPoint, seriesArray = [], visibleRange, chartPos, pathOptions, leftPos, topPos, chartAreaStartPos, chartAreaEndPos, pointPos, seriesLength, data,\r\n crossHairTrans, tToolOptions, prePoint, initialPoint, rectxt, tooltipfont, textarea, tgap = 0, currentLength, tX, tY, chartLocation, element, visiblepts = [], tooltipRanges = [],\r\n DisplayTooltipOptions = [], enableCanvas = this.model.enableCanvasRendering, totalVisible = 0, maxWidth = 0, heightwidth = 0, chartOffset = $(\"#\" + this._id).offset(),\r\n textCollection = [], textOptionsCollection = [], groupingTextId = [], trackballDisplayMode = this.model.crosshair.trackballTooltipSettings.mode.toLowerCase(), groupTooltipId = chart._id + \"_trackball_grouping_tooltip\",\r\n locale = this.model.locale, boxSeriesCount = 0, trackOutlier = 0;\r\n if ((!this.model.enable3D) && this.model.crosshair.visible && this.model.crosshair.type.toLowerCase() == \"trackball\") {\r\n\r\n if ($(\"#\" + this.svgObject.id + \"_CrosshairGroup\").length == 0) { // condition to check track axis tooltip is existing in DOM\r\n var gTrackballOptions = { 'id': chart.svgObject.id + '_CrosshairGroup', 'visibility': 'visible' };\r\n if (enableCanvas) {\r\n gTrackballOptions.position = \"absolute\";\r\n chart.svgRenderer.drawCrosshairLine(gTrackballOptions, '#chartContainer_' + this._id);\r\n }\r\n else {\r\n chart.gTrackball = chart.svgRenderer.createGroup(gTrackballOptions);\r\n chart.svgRenderer.append(chart.gTrackball, chart.svgObject);\r\n }\r\n }\r\n else {\r\n if (chart.model.trackerElement) {\r\n if ($.finish)\r\n $(chart.model.trackerElement).finish();\r\n else\r\n $(chart.model.trackerElement).stop(true, true);\r\n chart.model.trackerElement = null;\r\n }\r\n }\r\n if (!this.model.enableCanvasRendering) {\r\n // removed highlight style\r\n $(\"[class*=\" + \"HighlightStyle\" + \"]\").attr('class', '');\r\n $(\"[class*=\" + \"HighlightLegendStyle\" + \"]\").attr('class', '');\r\n $(\"[class*=\" + \"HighlightLegendPathStyle\" + \"]\").attr('class', '');\r\n $(\"[class*=\" + \"HighlightPathStyle\" + \"]\").attr('class', '');\r\n $(\"[class*=\" + \"Highlightseries\" + \"]\").attr('class', '');\r\n $(\"[id*=\" + this._id + \"_Highlight_\" + \"]\").remove();// removed canvas highlight \r\n }\r\n //Hiding previous trackball and tooltip when moving from one column to another\r\n $(\"#secondCanvas\").remove(), $(\"#\" + this._id).find('[id*=\"_gTooltip_\"]').remove(), $(\"#\" + groupTooltipId).children().remove(), $(document).find('[id*=\"TrackGroupToolTipTemplate\"]').remove(), $(document).find('[id*=\"TrackToolTipTemplate\"]').remove();\r\n if (enableCanvas) {\r\n $(\"#\" + this._id).find('[id*=\"canvas_trackSymbol\"]').css(\"visibility\", \"hidden\");\r\n }\r\n var seriesLenIndicator = seriesCollection.length;\r\n for (var j = 0; j < indicators.length && indicators[j].segment; j++) {\r\n seriesCollection = seriesCollection.concat(indicators[j].segment);\r\n }\r\n seriesLength = seriesCollection.length;\r\n for (var i = 0; i < seriesLength; i++) {\r\n if (seriesCollection[i].visibility == \"visible\") {\r\n seriesIndex = i;\r\n serX = [];\r\n\r\n if (!requireInvertedAxes)\r\n insideBounds = chart.mousemoveX + seriesCollection[i].xAxis.plotOffset > seriesCollection[i].xAxis.x && chart.mousemoveX < seriesCollection[i].xAxis.x + seriesCollection[i].xAxis.width + seriesCollection[i].xAxis.plotOffset;\r\n else\r\n insideBounds = chart.mousemoveY + seriesCollection[i].xAxis.plotOffset > seriesCollection[i].xAxis.y && chart.mousemoveY < seriesCollection[i].xAxis.y + seriesCollection[i].xAxis.height + seriesCollection[i].xAxis.plotOffset;\r\n if (enableCanvas)\r\n this.canvasX = seriesCollection[i].xAxis.x;\r\n closestPoint = chart.getClosestPointX(serX, seriesCollection[i], chart.mousemoveX, chart.mousemoveY);\r\n visibleRange = seriesCollection[i].xAxis.visibleRange; // condition to check the closestPoint is inside the visible range\r\n if (closestPoint.point != \"\") {\r\n var closestPointValues = seriesCollection[i].type.toLowerCase() == \"boxandwhisker\" ? closestPoint.point[0].boxPlotLocation[0].YValues : closestPoint.point[0].YValues[0];\r\n if (closestPoint.point != \"\" && (closestPointValues >= seriesCollection[i].yAxis.visibleRange.min || trackballDisplayMode == \"grouping\") && (closestPoint.point[0].xValue >= visibleRange.min) && (closestPoint.point[0].xValue <= visibleRange.max)) {\r\n if (insideBounds) {\r\n for (var t = 0; t < closestPoint.point.length; t++) {\r\n if (closestPoint.point[t].visible) {\r\n if (!seriesCollection[i].isIndicator) {\r\n totalVisible++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n for (var i = 0; i < seriesLength; i++) {\r\n // if(seriesCollection[0].xAxis.name == seriesCollection[i].xAxis.name)\r\n seriesIndex = i, series = seriesCollection[i];\r\n var trackPoints = [];\r\n if (series.visibility.toLowerCase() == 'visible') {\r\n serX = [];\r\n if (!requireInvertedAxes)\r\n insideBounds = chart.mousemoveX + seriesCollection[i].xAxis.plotOffset > series.xAxis.x && chart.mousemoveX < series.xAxis.x + series.xAxis.width + seriesCollection[i].xAxis.plotOffset;\r\n else\r\n insideBounds = chart.mousemoveY + seriesCollection[i].xAxis.plotOffset > series.xAxis.y && chart.mousemoveY < series.xAxis.y + series.xAxis.height + seriesCollection[i].xAxis.plotOffset;\r\n if (enableCanvas)\r\n this.canvasX = series.xAxis.x;\r\n closestPoint = chart.getClosestPointX(serX, series, chart.mousemoveX, chart.mousemoveY);\r\n visibleRange = series.xAxis.visibleRange; // condition to check the closestPoint is inside the visible range\r\n var point1;\r\n if (closestPoint.point != \"\") {\r\n var closestPointValues = seriesCollection[i].type.toLowerCase() == \"boxandwhisker\" ? closestPoint.point[0].boxPlotValues.midvalue : closestPoint.point[0].YValues[0];\r\n if ((closestPointValues >= seriesCollection[i].yAxis.visibleRange.min || trackballDisplayMode == \"grouping\") && (closestPoint.point[0].xValue >= visibleRange.min) && (closestPoint.point[0].xValue <= visibleRange.max)) {\r\n if (insideBounds) {\r\n var closePointLength = closestPoint.point.length;\r\n for (var t = 0; t < closePointLength; t++) {\r\n if (closestPoint.point[t].visible) {\r\n if (!series.isIndicator) {\r\n if (series.type == \"boxandwhisker\") {\r\n boxSeriesCount++;\r\n var boxvalue = { \"xValue\": closestPoint.point[t].xValue, \"YValues\": closestPoint.point[t].boxPlotLocation[0].YValues };\r\n point = ej.EjSvgRender.utils._getPoint(boxvalue, series);\r\n point.YValues = boxvalue.YValues;\r\n trackPoints.push(point);\r\n for (var q = 0; q < closestPoint.point[t].boxPlotLocation.length; q++) {\r\n if (closestPoint.point[t].boxPlotLocation[q].outlier == true) {\r\n point1 = { X: closestPoint.point[t].boxPlotLocation[q].X, Y: closestPoint.point[t].boxPlotLocation[q].Y, YValues: closestPoint.point[t].boxPlotLocation[q].YValues, outlier: closestPoint.point[t].boxPlotLocation[q].outlier };\r\n trackPoints.push(point1);\r\n }\r\n }\r\n } else\r\n point = ej.EjSvgRender.utils._getPoint(closestPoint.point[t], series);\r\n this.model.financial = seriesLenIndicator == 1 && closePointLength == 1 && series._hiloTypes || false;\r\n if (requireInvertedAxes) {\r\n if (this.model.financial) {\r\n var high = point.X > point.low ? point.X : point.low;\r\n var low = point.X < point.low ? point.X : point.low;\r\n dir = \"M\" + \" \" + (series.yAxis.x) + \" \" + (point.Y + series.xAxis.y) + \" \" + \"L\" + \" \" + (low + series.yAxis.x) + \" \" + (point.Y + series.xAxis.y) + \" \" + \"M\" + \" \" + (series.yAxis.x + high) + \" \" + (point.Y + series.xAxis.y) + \" \" + \"L\" + \" \" + (series.yAxis.x + series.yAxis.width) + \" \" + (point.Y + series.xAxis.y);\r\n }\r\n else\r\n dir = \"M\" + \" \" + (series.yAxis.x) + \" \" + (point.Y + series.xAxis.y) + \" \" + \"L\" + \" \" + (series.yAxis.x + series.yAxis.width) + \" \" + (point.Y + series.xAxis.y);\r\n if (series.type == \"boxandwhisker\") {\r\n for (var p = 0; p < trackPoints.length; p++) {\r\n visiblepts.push({ X: (trackPoints[p].X), Y: (trackPoints[p].Y), YValues: trackPoints[p].YValues, outlier: trackPoints[p].outlier });\r\n }\r\n } else\r\n visiblepts.push({ X: (closestPoint.point[t].location.X + series.yAxis.x), Y: (closestPoint.point[t].location.Y + series.xAxis.y) });\r\n }\r\n else {\r\n if (this.model.financial) {\r\n var high = point.Y < point.low ? point.Y : point.low;\r\n var low = point.Y > point.low ? point.Y : point.low;\r\n dir = \"M\" + \" \" + (point.X + series.xAxis.x) + \" \" + (chart.model.m_AreaBounds.Y) + \" \" + \"L\" + \" \" + (point.X + series.xAxis.x) + \" \" + (high + series.yAxis.y) + \" \" + \"M\" + \" \" + (point.X + series.xAxis.x) + \" \" + (low + series.yAxis.y) + \" \" + \"L\" + \" \" + (point.X + series.xAxis.x) + \" \" + (chart.model.m_AreaBounds.Y + chart.model.m_AreaBounds.Height);\r\n }\r\n else\r\n dir = \"M\" + \" \" + (point.X + series.xAxis.x) + \" \" + (chart.model.m_AreaBounds.Y) + \" \" + \"L\" + \" \" + (point.X + series.xAxis.x) + \" \" + (chart.model.m_AreaBounds.Y + chart.model.m_AreaBounds.Height);\r\n if (series.type == \"boxandwhisker\") {\r\n for (var p = 0; p < trackPoints.length; p++) {\r\n visiblepts.push({ X: (trackPoints[p].X), Y: (trackPoints[p].Y), YValues: trackPoints[p].YValues, outlier: trackPoints[p].outlier });\r\n }\r\n } else\r\n visiblepts.push({ X: (closestPoint.point[t].location.X + series.xAxis.x), Y: (closestPoint.point[t].location.Y + series.yAxis.y) });\r\n }\r\n\r\n chartPos = { left: chartOffset.left, top: chartOffset.top };\r\n\r\n pathOptions = {\r\n 'id': chart.svgObject.id + \"_Tracker\",\r\n 'fill': 'none',\r\n 'stroke-width': chart.model.crosshair.line.width,\r\n 'clip-path': 'url(#' + chart.svgObject.id + '_ChartAreaClipRect)',\r\n 'stroke': chart.model.crosshair.line.color,\r\n 'd': dir\r\n };\r\n if ($(\"#\" + chart.svgObject.id + \"_Tracker\").length == 0) {\r\n if (enableCanvas) {\r\n var obj = this.svgRenderer.createCrosshairCanvas();\r\n obj.ctx = obj.getContext('2d');\r\n }\r\n else {\r\n var obj = this.svgRenderer;\r\n var parentElement = chart.gTrackball;\r\n }\r\n\r\n chart.svgRenderer.drawPath.call(obj, pathOptions, parentElement);\r\n showTrackLine = true;\r\n\r\n }\r\n else {\r\n showTrackLine = true;\r\n if (!ej.util.isNullOrUndefined(this._closest)) {\r\n if (this._beforeMin) {\r\n if (this._closest >= closestPoint.point[t].xValue)\r\n chart.svgRenderer._setAttr($(chart.svgObject).find(\"#\" + chart.svgObject.id + \"_Tracker\"), { \"d\": dir, \"visibility\": \"visible\" });\r\n\r\n }\r\n else if (this._afterMax) {\r\n if (this._closest <= closestPoint.point[t].xValue)\r\n chart.svgRenderer._setAttr($(chart.svgObject).find(\"#\" + chart.svgObject.id + \"_Tracker\"), { \"d\": dir, \"visibility\": \"visible\" });\r\n }\r\n }\r\n else {\r\n chart.svgRenderer._setAttr($(chart.svgObject).find(\"#\" + chart.svgObject.id + \"_Tracker\"), { \"d\": dir, \"visibility\": \"visible\" });\r\n }\r\n $(\"#\" + chart.svgObject.id + \"_Tracker\").css({ \"display\": \"block\" });\r\n if (enableCanvas) {\r\n var obj = this.svgRenderer.createCrosshairCanvas();\r\n obj.ctx = obj.getContext('2d');\r\n chart.svgRenderer.drawPath.call(obj, pathOptions, chart.gTrackball);\r\n\r\n }\r\n $(\"#\" + this._id).find('[id*=\"canvas_Tracker\"]').css(\"visibility\", \"visible\");\r\n }\r\n\r\n crossHairTrans = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, requireInvertedAxes);\r\n tToolOptions = { 'transform': 'translate(' + crossHairTrans.x + ',' + crossHairTrans.y + ')', 'id': chart.svgObject.id + '_TrackToolTip' + '_' + seriesIndex };\r\n chart.gTransToolEle = chart.svgRenderer.createGroup(tToolOptions);\r\n prePoint = this.model.prePoint;\r\n\r\n //To check the current closestPoint and previous point is same\r\n if (ej.util.isNullOrUndefined(prePoint) || prePoint.pointIndex[0] != closestPoint.index[0] || !$('#' + chart.svgObject.id + \"_trackSymbol_\" + seriesIndex + '_' + closestPoint.index)) {\r\n\r\n //Remove the track elements only once on point change\r\n if (ej.util.isNullOrUndefined(initialPoint)) {\r\n if (chart.gTransToolEle && chart.gTrackerEle) {\r\n $(this.svgObject).find('[id*=\"_TrackSymbol_\"],[id*=\"_TrackToolTip\"]').attr(\"visibility\", \"hidden\");\r\n $(\"#\" + this._id).find('[id*=\"canvas_trackSymbol\"]').css(\"visibility\", \"hidden\");\r\n }\r\n initialPoint = closestPoint;\r\n }\r\n var type = series.type.toLowerCase(), trackcount = 0;\r\n if (!series._hiloTypes || type.indexOf(\"rangearea\") > -1)\r\n if (trackballDisplayMode != \"grouping\" || (trackballDisplayMode == \"grouping\" && type.indexOf(\"column\") < 0 && type.indexOf(\"bar\") < 0))\r\n if (series.type == \"boxandwhisker\") {\r\n for (var z = 0; z < trackPoints.length; z++) {\r\n chart.drawTrackerSymbol(series, seriesIndex, closestPoint.index[t], true, trackPoints[z], null, trackcount);\r\n trackcount++;\r\n }\r\n }\r\n else\r\n chart.drawTrackerSymbol(series, seriesIndex, closestPoint.index[t], true, point);\r\n series.trackerRemoved = true;\r\n\r\n // Condition to find the crosshair is specified with tooltip template\r\n if (!chart.model.crosshair.trackballTooltipSettings.tooltipTemplate) {\r\n var currentLength = visiblepts.length - 1, trackOutlier = trackPoints.length;\r\n if (trackballDisplayMode == \"grouping\") {\r\n var seriesColor = this.getSeriesColor(closestPoint.point[t], seriesIndex, series),\r\n textOptions, tooltipFormat = series.tooltip.format, currentText, boxgroupingtext, boxtext = [];\r\n if (series.type == \"boxandwhisker\") {\r\n for (var p = 0; p < trackOutlier; p++) {\r\n boxgroupingtext = this.getTooltipFormat(closestPoint.point[t], series, seriesIndex, closestPoint.index[t], tooltipFormat, trackPoints[p]);\r\n boxtext.push(boxgroupingtext);\r\n currentText = null;\r\n }\r\n }\r\n else\r\n currentText = this.getTooltipFormat(closestPoint.point[t], series, seriesIndex, closestPoint.index[t], tooltipFormat);\r\n\r\n var textColor = series.tooltip.font ? ((series.tooltip.font.color ? series.tooltip.font.color : seriesColor)) : seriesColor,\r\n font = series.tooltip.font ? $.extend(false, series.font, {}, series.tooltip.font) : series.font;\r\n if (typeof (textColor) == \"object\") {\r\n textColor = seriesColor[1].color;\r\n }\r\n if (series.type == \"boxandwhisker\") {\r\n for (var b = 0; b < boxtext.length; b++)\r\n textCollection.push({ text: boxtext[b].text, seriesIndex: seriesIndex, pointIndex: closestPoint.index[t] });\r\n }\r\n else {\r\n currentText.text = \" \" + currentText.text + \" \";\r\n textCollection.push({ text: currentText.text, seriesIndex: seriesIndex, pointIndex: closestPoint.index[t] });\r\n }\r\n if ((series._hiloTypes && type != \"rangearea\") || type.indexOf(\"column\") > -1 || type.indexOf(\"bar\") > -1) {\r\n data = { region: { Region: { PointIndex: closestPoint.index[t] }, SeriesIndex: seriesIndex } };\r\n this.highlightStart(evt, data, this._id + \"_svg_SeriesGroup_\" + seriesIndex, this._id + \"_svg_Series\" + seriesIndex + \"_Point\" + closestPoint.index[t], true);\r\n }\r\n if (series.type == \"boxandwhisker\") {\r\n for (var b = 0; b < boxtext.length; b++) {\r\n groupingTextId.push(chart._id + \"_grouping_text_\" + seriesIndex + \"_\" + closestPoint.index[t] + b);\r\n }\r\n }\r\n else\r\n groupingTextId.push(chart._id + \"_grouping_text_\" + seriesIndex + \"_\" + closestPoint.index[t]);\r\n textOptions = {\r\n \"color\": textColor,\r\n 'font-size': font.size,\r\n 'font-family': font.fontFamily,\r\n 'font-style': font.fontStyle,\r\n 'font-weight': font.fontWeight,\r\n };\r\n if (series.type == \"boxandwhisker\") {\r\n for (var b = 0; b < boxtext.length; b++) {\r\n textOptionsCollection.push(textOptions);\r\n }\r\n }\r\n else\r\n textOptionsCollection.push(textOptions);\r\n if (boxSeriesCount == totalVisible && series.type == \"boxandwhisker\")\r\n chart.displayTooltip(true, { point: closestPoint.point[t], series: series, textCollection: textCollection, textOptionsCollection: textOptionsCollection, groupingTextId: groupingTextId });\r\n else if (totalVisible == textCollection.length && series.type != \"boxandwhisker\") {\r\n chart.displayTooltip(true, { point: closestPoint.point[t], series: series, textCollection: textCollection, textOptionsCollection: textOptionsCollection, groupingTextId: groupingTextId });\r\n }\r\n }\r\n else {\r\n var rectxt = this.getTooltipFormat(closestPoint.point[t], series, seriesIndex, i, series.tooltip.format, i),\r\n tooltip = series.tooltip, font = tooltip.font ? $.extend(false, series.font, {}, tooltip.font) : series.font, textarea = ej.EjSvgRender.utils._measureText(rectxt.text, null, font), padding, heightwidth = (requireInvertedAxes) ? textarea.height : textarea.width, maxWidth = (maxWidth > heightwidth) ? maxWidth : heightwidth, newLines = Math.ceil(rectxt.text.toString().split(\"
\").length / 2);\r\n this.model.tooltipPadding = Number(font.size.toString().replace(/px/i, '')) / 3;\r\n padding = this.model.tooltipPadding + series.tooltip.border.width * 2;\r\n if (!requireInvertedAxes) {\r\n if (series.type == \"boxandwhisker\") {\r\n for (var p = 0; p < trackOutlier; p++) {\r\n tooltipRanges.push({ Start: trackPoints[p].Y - padding * newLines - textarea.height / 2, End: trackPoints[p].Y + padding * newLines + textarea.height / 2 });\r\n DisplayTooltipOptions.push({ Point: trackPoints[p], ClosestPoint: closestPoint.point[t], Series: series, ClosestPointIndex: closestPoint.index[t], Tgap: tgap, StEnd: tooltipRanges[p], TextArea: textarea, ReqInvertAxis: requireInvertedAxes });\r\n }\r\n }\r\n else {\r\n tooltipRanges.push({ Start: visiblepts[currentLength].Y - padding * newLines - textarea.height / 2, End: visiblepts[currentLength].Y + padding * newLines + textarea.height / 2 });\r\n DisplayTooltipOptions.push({ Point: visiblepts[currentLength], ClosestPoint: closestPoint.point[t], Series: series, ClosestPointIndex: closestPoint.index[t], Tgap: tgap, StEnd: tooltipRanges[currentLength], TextArea: textarea, ReqInvertAxis: requireInvertedAxes });\r\n }\r\n }\r\n else {\r\n tooltipRanges.push({ Start: visiblepts[currentLength].X - padding - (textarea.width / 2), End: visiblepts[currentLength].X + padding + (textarea.width / 2) });\r\n DisplayTooltipOptions.push({ Point: visiblepts[currentLength], ClosestPoint: closestPoint.point[t], Series: series, ClosestPointIndex: closestPoint.index[t], Tgap: tgap, StEnd: tooltipRanges[currentLength], TextArea: textarea, ReqInvertAxis: requireInvertedAxes });\r\n }\r\n if (series.type == \"boxandwhisker\" && boxSeriesCount == totalVisible) {\r\n maxWidth += (2 * padding);\r\n if (requireInvertedAxes) {\r\n DisplayTooltipOptions = DisplayTooltipOptions.sort(function (a, b) { return a.Point.X - b.Point.X });\r\n }\r\n else {\r\n DisplayTooltipOptions = DisplayTooltipOptions.sort(function (a, b) { return a.Point.Y - b.Point.Y });\r\n }\r\n this.SmartTooltipPosition(DisplayTooltipOptions);\r\n var displayLength = DisplayTooltipOptions.length;\r\n chart.displayTooltip(false, DisplayTooltipOptions, maxWidth);\r\n for (var i = 0; i < displayLength; i++) {\r\n var seriesIndex = $.inArray(DisplayTooltipOptions[i].Series, this.model._visibleSeries);\r\n if (DisplayTooltipOptions[i].Series._hiloTypes) {\r\n data = { region: { Region: { PointIndex: DisplayTooltipOptions[i].ClosestPointIndex }, SeriesIndex: seriesIndex } };\r\n this.highlightStart(evt, data, this._id + \"_svg_SeriesGroup_\" + seriesIndex, this._id + \"_svg_Series\" + seriesIndex + \"_Point\" + DisplayTooltipOptions[i].ClosestPointIndex, true);\r\n }\r\n }\r\n }\r\n else if (DisplayTooltipOptions.length == totalVisible && series.type != \"boxandwhisker\") {\r\n maxWidth += (2 * padding);\r\n if (requireInvertedAxes) {\r\n DisplayTooltipOptions = DisplayTooltipOptions.sort(function (a, b) { return a.Point.X - b.Point.X });\r\n }\r\n else {\r\n DisplayTooltipOptions = DisplayTooltipOptions.sort(function (a, b) { return a.Point.Y - b.Point.Y });\r\n }\r\n this.SmartTooltipPosition(DisplayTooltipOptions);\r\n var displayLength = DisplayTooltipOptions.length;\r\n chart.displayTooltip(false, DisplayTooltipOptions, maxWidth);\r\n for (var i = 0; i < displayLength; i++) {\r\n var seriesIndex = $.inArray(DisplayTooltipOptions[i].Series, this.model._visibleSeries);\r\n if (DisplayTooltipOptions[i].Series._hiloTypes) {\r\n data = { region: { Region: { PointIndex: DisplayTooltipOptions[i].ClosestPointIndex }, SeriesIndex: seriesIndex } };\r\n this.highlightStart(evt, data, this._id + \"_svg_SeriesGroup_\" + seriesIndex, this._id + \"_svg_Series\" + seriesIndex + \"_Point\" + DisplayTooltipOptions[i].ClosestPointIndex, true);\r\n }\r\n }\r\n\r\n }\r\n }\r\n }\r\n else {\r\n if (trackballDisplayMode === 'grouping') {\r\n closestPoint = chart.getClosestPointX(serX, series, chart.mousemoveX, chart.mousemoveY);\r\n seriesColor = this.getSeriesColor(closestPoint.point[t], seriesIndex, series);\r\n color.push({ seriesColor: seriesColor });\r\n closePointLength = closestPoint.point.length;\r\n currentText = this.getTooltipFormat(closestPoint.point[t], series, seriesIndex, closestPoint.index[t], tooltipFormat),\r\n currentText.text = \" \" + currentText.text + \" \";\r\n textCollection.push({ text: currentText.text, seriesIndex: seriesIndex, pointIndex: closestPoint.index[t] });\r\n store.push({ point: closestPoint.point[t] }); seriesArray.push({ series: series });\r\n if ((series._hiloTypes && type != \"rangearea\") || type.indexOf(\"column\") > -1 || type.indexOf(\"bar\") > -1) {\r\n data = { region: { Region: { PointIndex: closestPoint.index[t] }, SeriesIndex: seriesIndex } };\r\n this.highlightStart(evt, data, this._id + \"_svg_SeriesGroup_\" + seriesIndex, this._id + \"_svg_Series\" + seriesIndex + \"_Point\" + closestPoint.index[t], true);\r\n }\r\n if (totalVisible === textCollection.length) {\r\n chartLocation = document.getElementById(this.svgRenderer.svgObj.id).getClientRects()[0];\r\n chart.displayGroupingTemplate(tX, tY, point, store, seriesArray, seriesIndex, closestPoint.index[t], chartLocation, color);\r\n }\r\n } else {\r\n tX, tY;\r\n chartLocation = document.getElementById(this.svgRenderer.svgObj.id).getClientRects()[0];\r\n chart.displayTemplateTooltip(tX, tY, point, closestPoint.point[t], series, seriesIndex, closestPoint.index[t], chartLocation);\r\n }\r\n }\r\n } else {\r\n // If both are same points, then viibility is set to visible\r\n element = $(this.svgObject).find('[id*=\"_TrackSymbol_\"],[id*=\"_TrackToolTip\"]');\r\n this.svgRenderer._setAttr($(element), { \"visibility\": 'visible' });\r\n $(\"#\" + this._id).find('[id*=\"canvas_trackSymbol\"]').css(\"visibility\", \"visible\");\r\n element = $(this.svgObject).find('[id*=\"_TrackToolTip\"]').children();\r\n this.svgRenderer._setAttr($(element), { \"visibility\": 'visible' });\r\n\r\n element = $(this.svgObject).find('[id*=\"_trackSymbol_\"]');\r\n this.svgRenderer._setAttr($(element), { \"visibility\": 'visible' });\r\n\r\n $(chart.svgObject).find('[id*=\"_TrackAxisToolTip\"]').attr(\"visibility\", \"visible\");\r\n\r\n // Sets the tooltip template visibility to visible\r\n if (this.model.crosshair.trackballTooltipSettings.tooltipTemplate != null) {\r\n if (trackballDisplayMode === 'grouping') {\r\n element = $(document).find('[id*=\"TrackGroupToolTipTemplate\"]');\r\n this.svgRenderer._setAttr($(element), { \"visibility\": 'visible' });\r\n } else {\r\n element = $(document).find('[id*=\"_TrackToolTipTemplate_\"]');\r\n this.svgRenderer._setAttr($(element), { \"visibility\": 'visible' });\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n\r\n $('#' + this.svgObject.id + '_TrackSymbol_' + seriesIndex).remove();\r\n }\r\n }\r\n }\r\n else {\r\n this._removeTrackBall();\r\n }\r\n }\r\n } else {\r\n if (!showTrackLine) // //condition checked to display Track line for single series when chart have more than one series. \r\n $(chart.svgObject).find('[id*=\"_Tracker\"]').remove();\r\n var elem = $(\"#\" + chart.svgObject.id + \"_TrackSymbol_\" + i);\r\n var trackId = this.svgObject.id + '_TrackSymbol' + '_' + seriesIndex;\r\n $(\"#\" + this._id).find('[id*=' + trackId + ']').remove();\r\n $(\"#\" + chart._id).find('[id*=' + \"_canvas_trackSymbol_\" + i + ']').css(\"visibility\", \"hidden\");\r\n if (!this.model.enableCanvasRendering) {\r\n // removed highlight style\r\n $(\"[class*=\" + \"HighlightStyle\" + \"]\").attr('class', '');\r\n $(\"[class*=\" + \"HighlightLegendStyle\" + \"]\").attr('class', '');\r\n $(\"[class*=\" + \"HighlightLegendPathStyle\" + \"]\").attr('class', '');\r\n $(\"[class*=\" + \"HighlightPathStyle\" + \"]\").attr('class', '');\r\n $(\"[class*=\" + \"Highlightseries\" + \"]\").attr('class', '');\r\n $(\"[id*=\" + this._id + \"_Highlight_\" + \"]\").remove();// removed canvas highlight \r\n }\r\n }\r\n }\r\n series.trackerRemoved = false;\r\n }\r\n\r\n\r\n // To get the previous point values\r\n if (this.model.closestPoint != null) {\r\n this.model.prePoint = { point: closestPoint.point, pointIndex: closestPoint.index, series: series, seriesIndex: seriesIndex };\r\n }\r\n if ($(\"#\" + this.svgObject.id + \"_TrackAxisToolTip\").length == 0 && this.model.crosshairLabelVisibility) { // condition to check track axis tooltip is existing in DOM\r\n var gTrackAxisOptions = { 'id': chart.svgObject.id + '_TrackAxisToolTip', 'visibility': 'visible' };\r\n chart.gTrackAxisEle = chart.svgRenderer.createGroup(gTrackAxisOptions);\r\n chart.svgRenderer.append(chart.gTrackAxisEle, chart.gTrackball);\r\n }\r\n else {\r\n $(\"#\" + this.svgObject.id + \"_TrackAxisToolTip\").css(\"display\", \"block\");\r\n }\r\n\r\n if (point) {\r\n var pointValue = closestPoint.point[0];\r\n //Hide unnecessary crosshair labels. SVG and Canvas renders crosshair labels differently\r\n if (enableCanvas)\r\n $(chart.svgObject.parentElement).find('[id*=\"AxisToolTipRect\"]').css({ \"visibility\": \"hidden\", \"display\": \"none\" });\r\n else\r\n $(chart.svgObject).find('[id*=\"_TrackAxisToolTip\"]').attr(\"visibility\", \"visible\").children().attr({ \"display\": \"none\" });\r\n $.each(chart.model._axes, function (axisIndex, axis) {\r\n var areaX = axis.x;\r\n var opposedPosition = axis._opposed;\r\n if (!requireInvertedAxes) {\r\n if (axis.orientation.toLowerCase() == \"horizontal\" && axis.crosshairLabel.visible) {\r\n if ((point.X + areaX) <= (axis.x + axis.width) && axis.x <= (visiblepts[visiblepts.length - 1].X)) {\r\n var valueType = axis._valueType.toLowerCase(), xVal, pointLocation;\r\n xVal = ((point.X / (axis.width)) * (axis.visibleRange.delta) + axis.visibleRange.min).toFixed(2).replace(new RegExp(\"\\\\.0{\" + 2 + \"}\"), \"\");\r\n if (valueType == \"logarithmic\") xVal = Math.pow(axis.logBase, xVal);\r\n if (valueType == \"datetime\") xVal = (ej.format(new Date(Math.floor(xVal)), ((ej.util.isNullOrUndefined(axis.labelFormat)) ? ej.EjSvgRender.utils._dateTimeLabelFormat(axis._intervalType, axis) : axis.labelFormat), locale));\r\n if (valueType == \"category\" || valueType == \"datetimecategory\") {\r\n if (typeof (pointValue.x) !== \"object\")\r\n xVal = pointValue.xValue;\r\n if (valueType == \"category\" || !ej.util.isNullOrUndefined(axis.labelFormat))\r\n xVal = ej.EjSvgRender.utils._getLabelContent(Math.floor(xVal), axis, locale);\r\n else\r\n xVal = ej.format(new Date(axis.labels[Math.floor(xVal)]), ej.EjSvgRender.utils._dateTimeLabelFormat(axis.intervalType, axis), locale);\r\n xVal = xVal ? xVal : \"undefined\";\r\n }\r\n pointLocation = { X: (visiblepts[visiblepts.length - 1].X), Y: (opposedPosition) ? (axis.y + axis.height - axis.majorTickLines.size) : (axis.y + axis.height + axis.majorTickLines.size + 10) };\r\n chart.displayAxisTooltip(pointLocation, xVal, axis, axisIndex, mouseLocation, true);\r\n }\r\n }\r\n }\r\n else {\r\n if (axis.orientation.toLowerCase() == \"vertical\" && axis.crosshairLabel.visible) {\r\n if ((chart.mousemoveY) <= (axis.y + axis.height) && axis.y <= (chart.mousemoveY)) {\r\n var valueType = axis._valueType.toLowerCase(), yVal = pointValue.xValue, ypointLocation = [];\r\n if (valueType == \"logarithmic\") yVal = Math.pow(axis.logBase, yVal).toFixed(2).replace(new RegExp(\"\\\\.0{\" + 2 + \"}\"), \"\");\r\n if (valueType == \"datetime\") yVal = (ej.format(new Date(Math.floor(yVal)), ((ej.util.isNullOrUndefined(axis.labelFormat)) ? ej.EjSvgRender.utils._dateTimeLabelFormat(axis._intervalType, axis) : axis.labelFormat), locale));\r\n if (valueType == \"category\") yVal = ej.EjSvgRender.utils._getLabelContent(yVal, axis, locale);\r\n ypointLocation = { X: axis.x, Y: (point.Y + axis.y) };\r\n chart.displayAxisTooltip(ypointLocation, yVal, axis, axisIndex, mouseLocation);\r\n }\r\n }\r\n }\r\n\r\n });\r\n }\r\n if (trackballDisplayMode !== \"grouping\" && chart.model.crosshair.trackballTooltipSettings.tooltipTemplate) {\r\n var floatElements = $(document).find('[id*=\"_TrackToolTipTemplate_\"]');\r\n for (var i = 0; i < floatElements.length; i++) {\r\n $(floatElements[i]).appendTo(this.templateContainer);\r\n $(this.templateContainer).appendTo(this.chartContainer);\r\n }\r\n }\r\n }\r\n },\r\n chartCrossHair: function (chart, mouseLocation) {\r\n var round = ((ej.util.isNullOrUndefined(this.model.primaryYAxis.roundingPlaces)) ? 2 : this.model.primaryYAxis.roundingPlaces),\r\n enableCanvas = chart.model.enableCanvasRendering, locale = this.model.locale;\r\n if ((!this.model.enable3D) && this.model.crosshair.visible && this.model.crosshair.type.toLowerCase() == \"crosshair\") {\r\n if ($(\"#\" + this.svgObject.id + \"_CrosshairGroup\").length == 0) {\r\n var gTrackballOptions = { 'id': this.svgObject.id + '_CrosshairGroup', 'visibility': 'visible' };\r\n if (enableCanvas) {\r\n gTrackballOptions.position = \"absolute\";\r\n chart.svgRenderer.drawCrosshairLine(gTrackballOptions, '#chartContainer_' + this._id);\r\n }\r\n else {\r\n this.gCrosshair = this.svgRenderer.createGroup(gTrackballOptions);\r\n this.svgRenderer.append(this.gCrosshair, this.svgObject);\r\n }\r\n }\r\n else\r\n $(\"#\" + this.svgObject.id + \"_CrosshairGroup\").css(\"display\", \"block\");\r\n if (chart.model.trackerElement) {\r\n if ($.finish)\r\n $(this.model.trackerElement).finish();\r\n else\r\n $(this.model.trackerElement).stop(true, true);\r\n this.model.trackerElement = null;\r\n }\r\n\r\n\r\n var minX, maxX, minY, maxY;\r\n for (var i = 0; i < this.model._axes.length; i++) {\r\n var axis = this.model._axes[i];\r\n if (axis.orientation.toLowerCase() == 'vertical') {\r\n if (mouseLocation.y >= axis.y && mouseLocation.y <= axis.y + axis.height)\r\n if (axis.x < mouseLocation.x)\r\n minX = Math.min(minX || axis.x, axis.x);\r\n else\r\n maxX = Math.max(maxX || axis.x, axis.x);\r\n }\r\n else\r\n if (mouseLocation.x >= axis.x && mouseLocation.x <= axis.x + axis.width)\r\n if (axis.y < mouseLocation.y)\r\n minY = Math.min(minY || axis.y, axis.y);\r\n else\r\n maxY = Math.max(maxY || axis.y, axis.y);\r\n }\r\n var left = minX || this.model.m_AreaBounds.X,\r\n width = maxX ? maxX - left : this.model.m_AreaBounds.X + this.model.m_AreaBounds.Width - left,\r\n top = minY || this.model.m_AreaBounds.Y,\r\n height = maxY ? maxY - top : this.model.m_AreaBounds.Y + this.model.m_AreaBounds.Height - top;\r\n\r\n var d = \"M\" + \" \" + (this.mousemoveX) + \" \" + (top) + \" \" + \"L\" + \" \" + (this.mousemoveX) + \" \" + (top + height),\r\n dhor = \"M\" + \" \" + (left) + \" \" + (this.mousemoveY) + \" \" + \"L\" + \" \" + (left + width) + \" \" + (this.mousemoveY),\r\n chartOffset = $(\"#\" + this._id).offset(),\r\n svgObject = chart.svgObject, options, optionsHor,\r\n chartPos = {\r\n left: svgObject.offsetLeft > chartOffset.left ? svgObject.offsetLeft : chartOffset.left,\r\n top: svgObject.offsetTop > chartOffset.top ? svgObject.offsetTop : chartOffset.top\r\n };\r\n if ($(\"#\" + chart.svgObject.id + \"_CrosshairVertical\").length == 0) {\r\n options = {\r\n 'id': chart.svgObject.id + \"_CrosshairVertical\",\r\n 'fill': 'none',\r\n 'stroke-width': chart.model.crosshair.line.width,\r\n 'stroke': chart.model.crosshair.line.color,\r\n 'clip-path': 'url(#' + this.svgObject.id + '_ChartAreaClipRect)',\r\n 'd': d\r\n };\r\n if (enableCanvas) {\r\n options.width = 0,\r\n options.height = height,\r\n options.top = top,\r\n options.left = left,\r\n options.position = \"absolute\", options.style = \"solid\", options.opacity = 0.5,\r\n chart.svgRenderer.drawCrosshairLine(options, '#' + this.svgObject.id + '_CrosshairGroup');\r\n }\r\n else\r\n chart.svgRenderer.drawPath(options, chart.gCrosshair);\r\n } else {\r\n chart.svgRenderer._setAttr($(chart.svgObject).find(\"#\" + chart.svgObject.id + \"_CrosshairVertical\"), { \"d\": d });\r\n if (enableCanvas) {\r\n $(\"#secondCanvas\").remove();\r\n $(\"#\" + chart.svgObject.id + \"_CrosshairVertical\").css(\"left\", this.mousemoveX).css({ \"top\": top, \"height\": height, \"display\": \"block\" });\r\n }\r\n $(\"#\" + chart.svgObject.id + \"_CrosshairVertical\").attr(\"visibility\", \"visible\").css(\"display\", \"block\");\r\n }\r\n\r\n if ($(\"#\" + chart.svgObject.id + \"_CrosshairHorizontal\").length == 0) {\r\n optionsHor = {\r\n 'id': chart.svgObject.id + \"_CrosshairHorizontal\",\r\n 'fill': 'none',\r\n 'stroke-width': chart.model.crosshair.line.width,\r\n 'stroke': chart.model.crosshair.line.color,\r\n 'clip-path': 'url(#' + this.svgObject.id + '_ChartAreaClipRect)',\r\n 'd': dhor\r\n };\r\n if (enableCanvas) {\r\n optionsHor.top = top + chartPos.top,\r\n optionsHor.left = left + chartPos.left,\r\n optionsHor.width = width,\r\n optionsHor.height = 0,\r\n optionsHor.position = \"absolute\", optionsHor.style = \"solid\", optionsHor.opacity = 0.5,\r\n chart.svgRenderer.drawCrosshairLine(optionsHor, '#' + this.svgObject.id + '_CrosshairGroup');\r\n }\r\n else\r\n chart.svgRenderer.drawPath(optionsHor, chart.gCrosshair);\r\n } else {\r\n chart.svgRenderer._setAttr($(chart.svgObject).find(\"#\" + chart.svgObject.id + \"_CrosshairHorizontal\"), { \"d\": dhor });\r\n $(\"#\" + chart.svgObject.id + \"_CrosshairHorizontal\").attr(\"visibility\", \"visible\").css(\"display\", \"block\");\r\n if (enableCanvas) {\r\n $(\"#\" + chart.svgObject.id + \"_CrosshairHorizontal\").css(\"top\", this.mousemoveY).css({ \"left\": left, \"width\": width, \"display\": \"block\" });\r\n }\r\n }\r\n if ($('#' + chart.svgObject.id + '_AxisCrossToolTip').length == 0) {\r\n var gAxisCrossOptions = { 'id': chart.svgObject.id + '_AxisCrossToolTip', 'visibility': 'visible' };\r\n chart.gTrackAxisEle = chart.svgRenderer.createGroup(gAxisCrossOptions);\r\n chart.svgRenderer.append(chart.gTrackAxisEle, chart.gCrosshair);\r\n }\r\n else {\r\n this.svgRenderer._setAttr($(chart.gTrackAxisEle), { \"visibility\": 'visible' });\r\n $(chart.gTrackAxisEle).css('display', 'block');\r\n }\r\n\r\n $.each(chart.model._axes, function (axisIndex, axis) {\r\n var valueType = axis._valueType.toLowerCase();\r\n if (axis.orientation.toLowerCase() == \"horizontal\" && axis.crosshairLabel.visible) {\r\n if ((chart.mousemoveX) <= (axis.x + axis.width) && axis.x <= (chart.mousemoveX)) {\r\n var labelplacement = (axis._valueType == \"category\" && axis.labelPlacement.toLowerCase() == 'betweenticks') ? 0.5 : 0;\r\n var xVal = ((Math.abs(chart.mousemoveX - (axis.isInversed ? axis.x + axis.width : axis.x)) / (axis.width)) * (axis.visibleRange.delta) + axis.visibleRange.min + labelplacement).toFixed(2).replace(new RegExp(\"\\\\.0{\" + 2 + \"}\"), \"\");\r\n if (valueType == \"logarithmic\") xVal = Math.pow(axis.logBase, xVal).toFixed(2).replace(new RegExp(\"\\\\.0{\" + 2 + \"}\"), \"\");\r\n if (valueType == \"datetime\") xVal = (ej.format(new Date(Math.floor(xVal)), ((ej.util.isNullOrUndefined(axis.labelFormat)) ? ej.EjSvgRender.utils._dateTimeLabelFormat(axis._intervalType, axis) : axis.labelFormat), locale));\r\n if (valueType == \"category\" || valueType == \"datetimecategory\") {\r\n if (valueType == \"category\" || !ej.util.isNullOrUndefined(axis.labelFormat))\r\n xVal = ej.EjSvgRender.utils._getLabelContent(xVal, axis, locale);\r\n else {\r\n xVal = xVal < 0 ? 0 : xVal;\r\n xVal = (ej.format(new Date(axis.labels[Math.floor(xVal)]), ej.EjSvgRender.utils._dateTimeLabelFormat(axis.intervalType, axis), locale));\r\n }\r\n }\r\n var xPointLocation = { X: (chart.mousemoveX), Y: (axis.y) };\r\n chart.displayAxisTooltip(xPointLocation, xVal, axis, axisIndex, mouseLocation);\r\n $(\"#\" + chart.svgObject.id + '_AxisToolTipText' + '_' + axisIndex).show();\r\n $(\"#\" + chart.svgObject.id + '_AxisToolTipRect' + '_' + axisIndex).show();\r\n }\r\n else {\r\n $(\"#\" + chart.svgObject.id + '_AxisToolTipText' + '_' + axisIndex).hide();\r\n $(\"#\" + chart.svgObject.id + '_AxisToolTipRect' + '_' + axisIndex).hide();\r\n }\r\n } else if (axis.orientation.toLowerCase() == \"vertical\" && axis.crosshairLabel.visible) {\r\n if ((chart.mousemoveY) <= (axis.y + axis.height) && axis.y <= (chart.mousemoveY)) {\r\n var yVal = ((Math.abs(1 - (Math.abs(chart.mousemoveY - (axis.isInversed ? axis.y + axis.height : axis.y)) / (axis.width)) / (axis.height)) * (axis.visibleRange.delta) + axis.visibleRange.min).toFixed(round).replace(new RegExp(\"\\\\.0{\" + round + \"}\"), \"\"));\r\n if (valueType == \"logarithmic\") yVal = Math.pow(axis.logBase, yVal).toFixed(2).replace(new RegExp(\"\\\\.0{\" + 2 + \"}\"), \"\");\r\n if (valueType == \"datetime\") yVal = (ej.format(new Date(Math.floor(yVal)), ((ej.util.isNullOrUndefined(axis.labelFormat)) ? ej.EjSvgRender.utils._dateTimeLabelFormat(axis._intervalType, axis) : axis.labelFormat), locale));\r\n if (valueType == \"category\" || valueType == \"datetimecategory\") {\r\n if (valueType == \"category\" || ej.util.isNullOrUndefined(axis.labelFormat))\r\n yVal = ej.EjSvgRender.utils._getLabelContent(yVal, axis, locale);\r\n else\r\n yVal = ej.format(new Date(axis.labels[Math.floor(yVal)]), ej.EjSvgRender.utils._dateTimeLabelFormat(axis.intervalType, axis), locale);\r\n\r\n }\r\n var ypointLocation = { X: axis.x, Y: (chart.mousemoveY) };\r\n chart.displayAxisTooltip(ypointLocation, yVal, axis, axisIndex, mouseLocation);\r\n $(\"#\" + chart.svgObject.id + '_AxisToolTipText' + '_' + axisIndex).show();\r\n $(\"#\" + chart.svgObject.id + '_AxisToolTipRect' + '_' + axisIndex).show();\r\n }\r\n else {\r\n $(\"#\" + chart.svgObject.id + '_AxisToolTipText' + '_' + axisIndex).hide();\r\n $(\"#\" + chart.svgObject.id + '_AxisToolTipRect' + '_' + axisIndex).hide();\r\n }\r\n }\r\n });\r\n\r\n }\r\n },\r\n chartTouchMove: function (evt) {\r\n this.cancelEvent(evt);\r\n evt = evt.originalEvent.touches[0];\r\n this.chartInteractiveBehavior(evt);\r\n\r\n },\r\n\r\n isZoomButtonHovered: function (target) {\r\n if (target.parentNode != null) {\r\n var parentId = target.parentNode.id;\r\n var id = target.id;\r\n if (id.indexOf('_ZoomInBtn ') == -1 && id.indexOf('ZoomOutBtn') == -1 && id.indexOf('_ZoomBtn') == -1 && id.indexOf('_ResetZoom') == -1 && id.indexOf('_PanBtn') == -1 && parentId && parentId.indexOf('_ZoomInBtn') == -1 && parentId.indexOf('_ZoomOutBtn') == -1 && parentId.indexOf('_ZoomBtn') == -1 && parentId.indexOf('_ResetZoom') == -1 && parentId.indexOf('_PanBtn') == -1)\r\n return false;\r\n }\r\n return true;\r\n },\r\n showTooltipOnDrag: function (chart, evt) {\r\n $(\"#\" + chart.svgObject.id).find(\"#\" + chart.svgObject.id + \"_TrackToolTip\").attr('visibility', 'visible');\r\n $(\"#\" + chart.svgObject.id + \"_TrackToolTip\").show();\r\n $(\".tooltipDiv\").css(\"display\", \"block\");\r\n },\r\n chartInteractiveBehavior: function (evt) {\r\n var mouseMoveCords = this.calMousePosition(evt);\r\n this.mousemoveX = mouseMoveCords.X;\r\n this.mousemoveY = mouseMoveCords.Y;\r\n\r\n var id = \"#\" + this.svgObject.id;\r\n if (this.mouseWheelCoords) {\r\n var changeX = Math.abs(this.mouseWheelCoords.x - evt.pageX);\r\n var changeY = Math.abs(this.mouseWheelCoords.y - evt.pageY);\r\n if ((changeX > 0 || changeY > 0) && !(this.panning)) {\r\n this.enableTrackBall();\r\n } else {\r\n this.disableTrackBall();\r\n }\r\n }\r\n\r\n var chart = this,\r\n targetId = evt.target.id;\r\n if (chart.model.AreaType == \"cartesianaxes\" && this.mousemoveX >= this.model.m_AreaBounds.X && this.mousemoveX < (this.model.m_AreaBounds.X + this.model.m_AreaBounds.Width) && this.mousemoveY < (this.model.m_AreaBounds.Y + this.model.m_AreaBounds.Height) && this.mousemoveY >= this.model.m_AreaBounds.Y && this.model.initSeriesRender) {\r\n var mouseLocation = { x: chart.mousemoveX, y: chart.mousemoveY };\r\n var targetId = chart.svgRenderer._getAttrVal($(evt.target).parent(), \"id\");\r\n if ((targetId != undefined) && (targetId == chart.svgRenderer._getAttrVal($(this.svgObject).find(id + '_ZoomBtn'), \"id\") || targetId == chart.svgRenderer._getAttrVal($(this.svgObject).find(id + '_ResetZoom'), \"id\") || targetId == chart.svgRenderer._getAttrVal($(this.svgObject).find(id + '_PanBtn'), \"id\"))) {\r\n this.disableTrackBall();\r\n }\r\n else {\r\n this.enableTrackBall();\r\n }\r\n\r\n //show tooltip and track ball\r\n if (!this.model.crosshair.visible && !this.isZoomButtonHovered(evt.target))\r\n this.tooltip(chart, evt);\r\n else {\r\n if (this.dragPoint)\r\n this.showTooltipOnDrag(chart, evt)\r\n else if (!this.closestXyPoint) {\r\n $(\"#\" + chart.svgObject.id).find(\"#\" + chart.svgObject.id + \"_TrackToolTip\").attr('visibility', 'hidden');\r\n $(\"#\" + chart.svgObject.id + \"_TrackToolTip\").hide();\r\n $(\".tooltipDiv\" + this._id).css(\"display\", \"none\");\r\n }\r\n }\r\n if (!this.model.enable3D) {\r\n //crossHair of chart\r\n this.chartTrackball(chart, mouseLocation, evt);\r\n\r\n //crossHair for chart area\r\n this.chartCrossHair(chart, mouseLocation);\r\n }\r\n\r\n } else {\r\n if ((chart.model.AreaType == \"none\" || chart.model.AreaType == 'polaraxes') && !this.isZoomButtonHovered(evt.target))\r\n this.tooltip(chart, evt);\r\n else {\r\n if (this.dragPoint)\r\n this.showTooltipOnDrag(chart, evt)\r\n else if (!this.closestXyPoint) {\r\n $(\"#\" + chart.svgObject.id).find(\"#\" + chart.svgObject.id + \"_TrackToolTip\").attr('visibility', 'hidden');\r\n $(\"#\" + chart.svgObject.id + \"_TrackToolTip\").hide();\r\n $(\".tooltipDiv\" + this._id).css(\"display\", \"none\");\r\n this._removeTrackBall();\r\n this._removeHighlight();\r\n }\r\n }\r\n //Removing exploded marker symbol when placing mouse outside chart area\r\n var pointData = this.model.prevPoint;\r\n if (pointData && pointData.point) {\r\n if (this.model.enableCanvasRendering)\r\n $(\"#canvas_trackSymbol\").remove();\r\n else {\r\n if (pointData.series.type == \"boxandwhisker\")\r\n var pointLocation = pointData.outlierPosition;\r\n else\r\n var pointLocation = ej.EjSvgRender.utils._getPoint(pointData.point, pointData.series);\r\n chart.drawTrackerSymbol(pointData.series, pointData.seriesIndex, pointData.pointIndex, null, pointLocation);\r\n }\r\n this.model.prevPoint = null;\r\n }\r\n }\r\n\r\n },\r\n\r\n // highlight SVG logic started here\r\n highlightSvg: function (chart, parentNodeId, isElement, evt, data, targetID, tracker) {\r\n if (parentNodeId != undefined) {\r\n var matchStr = this.svgObject.id + \"_SeriesGroup_\";\r\n var serIndex = parentNodeId.substr(matchStr.length);\r\n if (parentNodeId.indexOf(this.svgObject.id + \"_symbolGroup_\") >= 0) {\r\n matchStr = this.svgObject.id + \"_symbolGroup_\";\r\n serIndex = parentNodeId.substr(matchStr.length);\r\n }\r\n }\r\n\r\n serIndex = data != undefined ? data.region.SeriesIndex : serIndex\r\n var series = this.model.series[serIndex];\r\n if (isElement && series) {\r\n if (series.highlightSettings.enable || tracker)\r\n this.highlight(chart, evt, series, null, data, parentNodeId, targetID, tracker);\r\n }\r\n\r\n },\r\n\r\n // canvas highlight logic started here\r\n highlightCanvas: function (chart, evt, data) {\r\n for (var i = 0; i < this.model._visibleSeries.length; i++) {\r\n var seriesIndex;\r\n var chartSeries;\r\n seriesIndex = i;\r\n chartSeries = this.model._visibleSeries[i];\r\n var type = chartSeries.type.toLowerCase();\r\n if (this.model.AreaType == \"cartesianaxes\" && chartSeries.visibility.toLowerCase() == 'visible' && type !== \"scatter\" && type !== \"bubble\" && type !== \"column\" && type.indexOf(\"bar\") == -1 && type !== \"stackingcolumn\" && type !== \"stackingcolumn100\" && !chartSeries._hiloTypes) {\r\n var serY = [];\r\n var serX = [];\r\n var location = null;\r\n var mouseMoveCords = this.calMousePosition(evt);\r\n this.mousemoveX = mouseMoveCords.X;\r\n this.mousemoveY = mouseMoveCords.Y;\r\n var closestXyPoint = this.getClosesPointXY(serX, serY, chartSeries, this.mousemoveX, this.mousemoveY, evt);\r\n if (!ej.util.isNullOrUndefined(closestXyPoint.point)) {\r\n var commonPointEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonPointEventArgs.data = { location: { x: this.mousemoveX, y: this.mousemoveY }, region: { SeriesIndex: i, Region: { PointIndex: closestXyPoint.index } } };\r\n }\r\n }\r\n }\r\n var data = commonPointEventArgs ? commonPointEventArgs.data : data;\r\n if (data && this.model.series[data.region.SeriesIndex].highlightSettings.enable) {\r\n var series = $.extend({}, this.model.series[data.region.SeriesIndex]);\r\n series.pointIndex = data.region.Region.PointIndex;\r\n series.seriesIndex = data.region.SeriesIndex;\r\n series.data = data;\r\n if ($('#' + this._id + '_Selection_series' + series.seriesIndex + '_canvas').length == 0) {\r\n // removed canvas highlight\r\n $(\"[id*=\" + this._id + \"_Highlight_\" + \"]\").remove();\r\n if (!this.findCanvasSelection(series.seriesIndex, series.pointIndex, series.selectionSettings.mode.toLowerCase()))\r\n this.canvasHighlight(this, evt, series);\r\n }\r\n }\r\n },\r\n //change cursor symbols after resizing\r\n resizeCursor: function (containerSvg, mousemoveX, mousemoveY, chartAreaX, chartAreaY, chartAreaWidth, chartAreaHeight) {\r\n var selectedRectIndex = this.selectedRectIndex;\r\n if ((mousemoveX <= chartAreaX) || (mousemoveY <= chartAreaY) || (mousemoveX >= (chartAreaWidth + chartAreaX)) || (mousemoveY >= (chartAreaHeight + chartAreaY))) {\r\n $(\"#\" + containerSvg + '_resize_rightRect' + selectedRectIndex).css({ 'cursor': 'default' });\r\n $(\"#\" + containerSvg + '_resize_leftRect' + selectedRectIndex).css({ 'cursor': 'default' });\r\n $(\"#\" + containerSvg + '_resize_bottomRect' + selectedRectIndex).css({ 'cursor': 'default' });\r\n $(\"#\" + containerSvg + '_resize_topRect' + selectedRectIndex).css({ 'cursor': 'default' });\r\n $(\"#\" + containerSvg + '_resize_bottomRightCornerCircle' + selectedRectIndex).css({ 'cursor': 'default' });\r\n }\r\n else if ((mousemoveX >= chartAreaX) || (mousemoveY >= chartAreaY) || (mousemoveX <= (chartAreaWidth + chartAreaX)) || (mousemoveY <= (chartAreaHeight + chartAreaY))) {\r\n $(\"#\" + containerSvg + '_resize_rightRect' + selectedRectIndex).css({ 'cursor': 'e-resize' });\r\n $(\"#\" + containerSvg + '_resize_leftRect' + selectedRectIndex).css({ 'cursor': 'w-resize' });\r\n $(\"#\" + containerSvg + '_resize_bottomRect' + selectedRectIndex).css({ 'cursor': 's-resize' });\r\n $(\"#\" + containerSvg + '_resize_topRect' + selectedRectIndex).css({ 'cursor': 'n-resize' });\r\n $(\"#\" + containerSvg + '_resize_bottomRightCornerCircle' + selectedRectIndex).css({ 'cursor': 'se-resize' });\r\n }\r\n },\r\n multiSelectMouseMove: function (evt) {\r\n if (this._isMultiSelect && (this.multiSelectMode == 'range') && !this.dragPoint) {\r\n var mouseMoveCords = this.calMousePosition(evt),\r\n mouseMoveX = mouseMoveCords.X,\r\n mouseMoveY = mouseMoveCords.Y,\r\n gripMouseMoveX, gripMouseMoveY, translate,\r\n selectionSettingsType = this.multiSelectType,\r\n width, height, x, y,\r\n rectX, rectY, rectWidth, rectHeight, id,\r\n x1, x2, y1, y2, xPlotOffset, yPlotOffset,\r\n modifiedX, modifiedY,\r\n mouseDownX = this.mouseDownX,\r\n mouseDownY = this.mouseDownY,\r\n selectedRectIndex = this.selectedRectIndex,\r\n containerSvg = this.svgObject.id,\r\n chartArea = '#' + containerSvg + '_ChartArea',\r\n chartAreaX = parseInt($(chartArea).attr('x')),\r\n chartAreaY = parseInt($(chartArea).attr('y')),\r\n chartAreaWidth = parseInt($(chartArea).attr('width')),\r\n chartAreaHeight = parseInt($(chartArea).attr('height')),\r\n multiSelectMouseDownId = this.multiSelectMouseDownId,\r\n selctRectId = '#' + containerSvg + '_selectRect',\r\n multiAxis = this.multiAxis;\r\n for (var q = 0; q < multiAxis.length; q++) {\r\n if (multiAxis[q].orientation.toLowerCase() == 'horizontal') {\r\n x1 = multiAxis[q].Location.X1; x2 = multiAxis[q].Location.X2;\r\n xPlotOffset = multiAxis[q].plotOffset;\r\n }\r\n else {\r\n y1 = multiAxis[q].Location.Y1; y2 = multiAxis[q].Location.Y2;\r\n yPlotOffset = multiAxis[q].plotOffset;\r\n }\r\n }\r\n if ((this.drag) && (!this.resize) && (!this.rectPan) && (!this.removeRect)) {\r\n var currentX = mouseMoveX,\r\n currentY = mouseMoveY,\r\n areaBounds = this.model.m_AreaBounds;\r\n this.multiSelectDraw = true;\r\n if (mouseMoveX < areaBounds.X) {\r\n currentX = areaBounds.X;\r\n }\r\n else if (mouseMoveX > (areaBounds.X + areaBounds.Width)) {\r\n currentX = areaBounds.X + areaBounds.Width;\r\n }\r\n if (mouseMoveY < areaBounds.Y) {\r\n currentY = areaBounds.Y;\r\n } else if (mouseMoveY > (areaBounds.Y + areaBounds.Height)) {\r\n currentY = areaBounds.Y + areaBounds.Height;\r\n }\r\n else {\r\n currentY = mouseMoveY;\r\n }\r\n switch (selectionSettingsType) {\r\n case 'x':\r\n width = Math.abs(currentX - mouseDownX);\r\n height = y1 - y2 + yPlotOffset + yPlotOffset;\r\n x = currentX > mouseDownX ? mouseDownX : currentX;\r\n y = y2 - yPlotOffset;\r\n break;\r\n case 'y':\r\n width = x2 - x1 + xPlotOffset + xPlotOffset;\r\n height = Math.abs(currentY - mouseDownY);\r\n x = x1 - xPlotOffset;\r\n y = currentY > mouseDownY ? mouseDownY : currentY;\r\n break;\r\n case 'xy':\r\n width = Math.abs(currentX - mouseDownX);\r\n height = Math.abs(currentY - mouseDownY);\r\n x = currentX > mouseDownX ? mouseDownX : currentX;\r\n y = currentY > mouseDownY ? mouseDownY : currentY;\r\n break;\r\n }\r\n if (width > 0 && height > 0) {\r\n var rectOptions = {\r\n 'id': this.svgObject.id + '_selectRect' + this.selectedRectIndex,\r\n 'x': x,\r\n 'y': y,\r\n 'width': width,\r\n 'height': height,\r\n 'fill': 'rgba(41,136,214,0.2)',\r\n 'stroke-width': 2,\r\n 'stroke': 'rgba(41,136,214,0.5)',\r\n 'cursor': 'pointer',\r\n 'clip-path': 'url(#' + this.svgObject.id + '_ChartAreaClipRect)'\r\n };\r\n if ((x >= x1 + xPlotOffset) && (mouseMoveX <= x2 - xPlotOffset) && (mouseMoveY <= y1 + yPlotOffset) && (y >= y2 - yPlotOffset))\r\n this.svgRenderer.drawRect(rectOptions, this.gEle);\r\n if ((this.gEle != null)) {\r\n $(this.gEle).appendTo(this.parentgEle);\r\n if (this.selectedRectIndex == 0) {\r\n this.model.gCurrentEle = this.gEle;\r\n }\r\n $(this.parentgEle).appendTo(this.svgObject);\r\n }\r\n }\r\n }\r\n rectX = parseInt($(selctRectId + selectedRectIndex).attr('x'));\r\n rectY = parseInt($(selctRectId + selectedRectIndex).attr('y'));\r\n rectWidth = parseInt($(selctRectId + selectedRectIndex).attr('width'));\r\n rectHeight = parseInt($(selctRectId + selectedRectIndex).attr('height'));\r\n if (!this.drag && (evt.target.id.indexOf(\"selectRect\") >= 0 || evt.target.id.indexOf(\"resize\") >= 0)) {\r\n if (evt.target.parentNode.id.indexOf(\"selectedRect\") >= 0) {\r\n id = evt.target.parentNode.id.split(\"selectedRect\")[1].match(/\\d+/)[0];\r\n this.gripIndex = eval(id);\r\n }\r\n var selectRectId = '#' + containerSvg + '_selectRect',\r\n selectRectWidth = parseInt($(selectRectId + this.gripIndex).attr(\"width\")),\r\n selectRectHeight = parseInt($(selectRectId + this.gripIndex).attr(\"height\")),\r\n selectRectX = parseInt($(selectRectId + this.gripIndex).attr(\"x\")),\r\n selectRectY = parseInt($(selectRectId + this.gripIndex).attr(\"y\"));\r\n $(\"#\" + containerSvg + \"_gripCollection\" + selectedRectIndex).css({ 'visibility': 'hidden' });\r\n if (selectRectX + selectRectWidth - 16 >= selectRectX || selectRectY + selectRectHeight - 16 >= selectRectY)\r\n $(\"#\" + this.svgObject.id + \"_gripCollection\" + this.gripIndex).attr({ 'transform': \"\" });\r\n if (selectRectX + selectRectWidth - 16 < selectRectX || selectRectY + selectRectHeight - 16 < selectRectY) {\r\n var translate = 'translate(' + 15 + ',' + 15 + ')';\r\n $(\"#\" + this.svgObject.id + \"_gripCollection\" + this.gripIndex).attr({ 'transform': translate });\r\n }\r\n if (this.oldId != evt.target.id)\r\n $(\"#\" + containerSvg + \"_gripCollection\" + this.oldGripIndex).css({ 'visibility': 'hidden' });\r\n $(\"#\" + containerSvg + \"_gripCollection\" + this.gripIndex).css({ 'visibility': 'visible' });\r\n this.oldId = evt.target.id;\r\n this.oldGripIndex = this.gripIndex;\r\n }\r\n if ((evt.target.id.indexOf(\"selectRect\") < 0) && (evt.target.id.indexOf(\"resize\") < 0))\r\n $(\"#\" + containerSvg + \"_gripCollection\" + this.gripIndex).css({ 'visibility': 'hidden' });\r\n if (this.resize) {\r\n $(\"#\" + containerSvg + \"_closeTopRightCornerCircle\" + selectedRectIndex).hide();\r\n $(\"#\" + containerSvg + \"_closePath\" + selectedRectIndex).hide();\r\n $(\"#\" + containerSvg + \"_closePathOpposite\" + selectedRectIndex).hide();\r\n $(\"#\" + containerSvg + \"_gripCollection\" + selectedRectIndex).css({ 'visibility': 'hidden' });\r\n var oldRectX = this.oldRectX[selectedRectIndex], oldRectY = this.oldRectY[selectedRectIndex],\r\n oldRectHeight = this.oldRectHeight[selectedRectIndex], oldRectWidth = this.oldRectWidth[selectedRectIndex],\r\n oldReBottomRectY = this.oldReBottomRectY[selectedRectIndex],\r\n oldReRightRectX = this.oldReRightRectX[selectedRectIndex];\r\n switch (selectionSettingsType) {\r\n case 'x':\r\n if (multiSelectMouseDownId == containerSvg + '_resize_rightRect' + selectedRectIndex) {\r\n rectWidth = mouseMoveX - oldRectX;\r\n $(\"#\" + containerSvg + \"_resize_rightRect\" + selectedRectIndex).attr('x', mouseMoveX - 5);\r\n if (mouseMoveX < oldRectX) {\r\n rectX = mouseMoveX;\r\n rectWidth = oldRectX - mouseMoveX;\r\n }\r\n else if (mouseMoveX >= oldRectX) rectX = oldRectX;\r\n }\r\n else if (multiSelectMouseDownId == containerSvg + '_resize_leftRect' + selectedRectIndex) {\r\n rectX = mouseMoveX;\r\n rectWidth = oldRectWidth + oldRectX - mouseMoveX;\r\n $(\"#\" + containerSvg + \"_resize_leftRect\" + selectedRectIndex).attr('x', mouseMoveX - 5);\r\n if (mouseMoveX > (oldReRightRectX + 5)) {\r\n rectX = oldReRightRectX + 5;\r\n rectWidth = mouseMoveX - oldRectX - oldRectWidth;\r\n }\r\n }\r\n this.resizeCursor(containerSvg, mouseMoveX, mouseMoveY, chartAreaX, chartAreaY, chartAreaWidth, chartAreaHeight);\r\n break;\r\n case 'y':\r\n if (multiSelectMouseDownId == containerSvg + '_resize_topRect' + selectedRectIndex) {\r\n rectHeight = oldRectHeight + oldRectY - mouseMoveY;\r\n rectY = mouseMoveY;\r\n $(\"#\" + containerSvg + \"_resize_topRect\" + selectedRectIndex).attr('y', mouseMoveY - 5);\r\n if (mouseMoveY > (oldReBottomRectY + 5)) {\r\n rectY = oldReBottomRectY + 5;\r\n rectHeight = mouseMoveY - oldRectY - oldRectHeight;\r\n }\r\n }\r\n else if (multiSelectMouseDownId == (containerSvg + '_resize_bottomRect' + selectedRectIndex)) {\r\n rectHeight = mouseMoveY - oldRectY;\r\n $(\"#\" + containerSvg + \"_resize_bottomRect\" + selectedRectIndex).attr('y', mouseMoveY - 5);\r\n if (mouseMoveY < oldRectY) {\r\n rectY = mouseMoveY;\r\n rectHeight = oldRectY - mouseMoveY;\r\n }\r\n else if (mouseMoveY >= oldRectY) rectY = oldRectY;\r\n }\r\n this.resizeCursor(containerSvg, mouseMoveX, mouseMoveY, chartAreaX, chartAreaY, chartAreaWidth, chartAreaHeight);\r\n break;\r\n case 'xy':\r\n if (multiSelectMouseDownId == containerSvg + '_resize_rightRect' + selectedRectIndex) {\r\n rectWidth = mouseMoveX - oldRectX;\r\n $(\"#\" + containerSvg + \"_resize_rightRect\" + selectedRectIndex).attr('x', mouseMoveX - 5);\r\n if (mouseMoveX < oldRectX) {\r\n rectX = mouseMoveX;\r\n rectWidth = oldRectX - mouseMoveX;\r\n }\r\n else if (mouseMoveX >= oldRectX)\r\n rectX = oldRectX;\r\n }\r\n else if (multiSelectMouseDownId == containerSvg + '_resize_leftRect' + selectedRectIndex) {\r\n rectX = mouseMoveX;\r\n rectWidth = oldRectWidth + oldRectX - mouseMoveX;\r\n $(\"#\" + containerSvg + \"_resize_leftRect\" + selectedRectIndex).attr('x', mouseMoveX - 5);\r\n if (mouseMoveX > (oldReRightRectX + 5)) {\r\n rectX = oldReRightRectX + 5;\r\n rectWidth = mouseMoveX - oldRectX - oldRectWidth;\r\n }\r\n }\r\n else if (multiSelectMouseDownId == containerSvg + '_resize_topRect' + selectedRectIndex) {\r\n rectHeight = oldRectHeight + oldRectY - mouseMoveY;\r\n rectY = mouseMoveY;\r\n $(\"#\" + containerSvg + \"_resize_topRect\" + selectedRectIndex).attr('y', mouseMoveY - 5);\r\n if (mouseMoveY > (oldReBottomRectY + 5)) {\r\n rectY = oldReBottomRectY + 5;\r\n rectHeight = mouseMoveY - oldRectY - oldRectHeight;\r\n }\r\n }\r\n else if (multiSelectMouseDownId == (containerSvg + '_resize_bottomRect' + selectedRectIndex)) {\r\n rectHeight = mouseMoveY - oldRectY;\r\n $(\"#\" + containerSvg + \"_resize_bottomRect\" + selectedRectIndex).attr('y', mouseMoveY - 5);\r\n if (mouseMoveY < oldRectY) {\r\n rectY = mouseMoveY;\r\n rectHeight = oldRectY - mouseMoveY;\r\n }\r\n else if (mouseMoveY >= oldRectY)\r\n rectY = oldRectY;\r\n }\r\n else if (multiSelectMouseDownId == containerSvg + '_resize_bottomRightCornerCircle' + selectedRectIndex) {\r\n rectWidth = mouseMoveX - oldRectX;\r\n rectHeight = mouseMoveY - oldRectY;\r\n $(\"#\" + containerSvg + \"_resize_bottomRightCornerCircle\" + selectedRectIndex).attr({ 'cx': mouseMoveX, 'cy': mouseMoveY });\r\n if ((mouseMoveX < oldRectX) && (mouseMoveY < oldRectY)) {\r\n rectX = mouseMoveX;\r\n rectY = mouseMoveY;\r\n rectWidth = oldRectX - mouseMoveX;\r\n rectHeight = oldRectY - mouseMoveY;\r\n }\r\n else if (mouseMoveX < oldRectX) {\r\n rectX = mouseMoveX;\r\n rectWidth = oldRectX - mouseMoveX;\r\n }\r\n else if (mouseMoveY < oldRectY) {\r\n rectY = mouseMoveY;\r\n rectHeight = oldRectY - mouseMoveY;\r\n }\r\n else if ((mouseMoveX >= oldRectX) && (mouseMoveY >= oldRectY)) {\r\n rectX = oldRectX;\r\n rectY = oldRectY;\r\n }\r\n }\r\n this.resizeCursor(containerSvg, mouseMoveX, mouseMoveY, chartAreaX, chartAreaY, chartAreaWidth, chartAreaHeight);\r\n break;\r\n }\r\n switch (selectionSettingsType) {\r\n case 'x':\r\n if (rectX >= x1 - xPlotOffset && (rectWidth + rectX - x1 <= x2 - x1 - xPlotOffset))\r\n $(selctRectId + selectedRectIndex).attr({ 'x': rectX, 'width': rectWidth });\r\n break;\r\n case 'y':\r\n if (((rectHeight + rectY - y2) <= y1 - y2 + yPlotOffset) && (rectY >= y2 - yPlotOffset))\r\n $(selctRectId + selectedRectIndex).attr({ 'y': rectY, 'height': rectHeight });\r\n break;\r\n case 'xy':\r\n if (rectX >= x1 - xPlotOffset && (rectWidth + rectX - x1 <= x2 - x1 - xPlotOffset) && (rectHeight + rectY - y2 <= y1 - y2 + yPlotOffset) && rectY >= y2 - yPlotOffset)\r\n $(selctRectId + selectedRectIndex).attr({ 'x': rectX, 'y': rectY, 'width': rectWidth, 'height': rectHeight });;\r\n break;\r\n }\r\n }\r\n if ((this.rectPan)) {\r\n $(\"#\" + containerSvg + \"_closeTopRightCornerCircle\" + selectedRectIndex).hide();\r\n $(\"#\" + containerSvg + \"_closePath\" + selectedRectIndex).hide();\r\n $(\"#\" + containerSvg + \"_closePathOpposite\" + selectedRectIndex).hide();\r\n $(\"#\" + containerSvg + \"_gripCollection\" + selectedRectIndex).css({ 'visibility': 'hidden' });\r\n if ((mouseMoveX <= chartAreaX || mouseMoveY <= chartAreaY || (mouseMoveX >= chartAreaX + chartAreaWidth) || (mouseMoveY >= chartAreaY + chartAreaHeight)))\r\n this.multiSelectMouseUp(evt);\r\n modifiedX = this.PreviousCoords.X - evt.pageX;\r\n modifiedY = this.PreviousCoords.Y - evt.pageY;\r\n rectX = rectX - modifiedX;\r\n rectY = rectY - modifiedY;\r\n this.PreviousCoords.X = evt.pageX;\r\n this.PreviousCoords.Y = evt.pageY;\r\n switch (selectionSettingsType) {\r\n case 'x':\r\n if (rectX >= x1 - xPlotOffset && (rectWidth + rectX - x1 <= x2 - x1 - xPlotOffset))\r\n $(selctRectId + selectedRectIndex).attr({ 'x': rectX });\r\n break;\r\n case 'y':\r\n if ((rectHeight + rectY - y2 <= y1 - y2 + yPlotOffset) && rectY >= y2 - yPlotOffset)\r\n $(selctRectId + selectedRectIndex).attr({ 'y': rectY });\r\n break;\r\n case 'xy':\r\n if (rectX >= x1 - xPlotOffset && (rectWidth + rectX - x1 <= x2 - x1 - xPlotOffset) && (rectHeight + rectY - y2 <= y1 - y2 + yPlotOffset) && rectY >= y2 - yPlotOffset)\r\n $(selctRectId + selectedRectIndex).attr({ 'x': rectX, 'y': rectY });\r\n break;\r\n }\r\n }\r\n }\r\n },\r\n isTouch: function (evt) {\r\n var browserInfo = this.model.browserInfo,\r\n event = evt.originalEvent ? evt.originalEvent : evt;\r\n if ((event.pointerType == \"touch\") || (event.pointerType == 2) || (event.type.indexOf(\"touch\") > -1))\r\n return true;\r\n return false;\r\n\r\n },\r\n highlightStart: function (evt, data, parentNodeId, targetID, tracker) {\r\n if (evt.target.parentNode != null) {\r\n var parentNodeId = parentNodeId || evt.target.parentNode.id;\r\n var isElement = (parentNodeId.indexOf(this.svgObject.id + \"_SeriesGroup_\") >= 0 || parentNodeId.indexOf(this.svgObject.id + \"_symbolGroup_\") >= 0 || parentNodeId.indexOf(this.svgObject.id + \"_TrackSymbol_\") >= 0 || parentNodeId.indexOf(this.svgObject.id + \"_Chart3D\") >= 0) ? true : false;\r\n }\r\n\r\n if (this.model.enableCanvasRendering)\r\n this.highlightCanvas(this, evt, data);\r\n else\r\n this.highlightSvg(this, parentNodeId, isElement, evt, data, targetID, tracker)\r\n },\r\n\r\n _changeDraggingPoints: function (chartSeries, index, X, Y) {\r\n X = chartSeries.xAxis._valueType == \"datetime\" ? new Date(X) : X;\r\n Y = chartSeries.yAxis._valueType == \"datetime\" ? new Date(Y) : Y;\r\n var dragType = chartSeries.dragSettings.type.toLowerCase();\r\n if ((dragType == \"x\" || dragType == \"xy\") && chartSeries.xAxis._valueType != \"category\") {\r\n if (this.dragPoint) {\r\n chartSeries.pointCollection[index].x = X;\r\n chartSeries.pointCollection[index].xValue = (chartSeries.xAxis._valueType == \"datetime\" && typeof X != \"object\") ? new Date(X) : X;\r\n }\r\n else {\r\n chartSeries._visiblePoints[index].x = chartSeries.points[index].x = X;\r\n chartSeries._visiblePoints[index].xValue = chartSeries.points[index].xValue = (chartSeries.xAxis._valueType == \"datetime\" && typeof X == \"object\") ? Date.parse(X) : X;\r\n }\r\n if (!ej.util.isNullOrUndefined(chartSeries.dataSource))\r\n chartSeries.dataSource[index][chartSeries.xName] = X;\r\n }\r\n if (dragType == \"y\" || dragType == \"xy\") {\r\n if (this.dragPoint) {\r\n chartSeries.pointCollection[index].y = Y\r\n chartSeries.pointCollection[index].YValues[0] = (chartSeries.yAxis._valueType == \"datetime\" && typeof Y != \"object\") ? new Date(Y) : Y;\r\n }\r\n else {\r\n chartSeries._visiblePoints[index].y = chartSeries.points[index].y = Y;\r\n chartSeries._visiblePoints[index].YValues[0] = chartSeries.points[index].YValues[0] = (chartSeries.yAxis._valueType == \"datetime\" && typeof Y == \"object\") ? Date.parse(Y) : Y;\r\n }\r\n if (!ej.util.isNullOrUndefined(chartSeries.dataSource))\r\n chartSeries.dataSource[index][chartSeries.yName] = Y;\r\n }\r\n },\r\n\r\n // Triggers while dragging the point\r\n _dragDelta: function (newXval, newYval, oldXval, oldYval, srIndex, ptIndex) {\r\n var chart = this,\r\n oldValue = { X: oldXval, Y: oldYval },\r\n newValue = { X: newXval, Y: newYval },\r\n commonDragEventArgs = $.extend({}, this.commonDragEventArgs);\r\n commonDragEventArgs.data = { seriesIndex: srIndex, pointIndex: ptIndex, oldValue: oldValue, newValue: newValue };\r\n this._trigger(\"dragging\", commonDragEventArgs);\r\n this.commonDragEventArgs = commonDragEventArgs;\r\n },\r\n _getDraggedPoint: function (chartSeries, currentX, currentY) {\r\n var mousePoint, PointX, PointY, x, y;\r\n var valAxis = ej.EjSvgRender.utils._getTransform(chartSeries.xAxis, chartSeries.yAxis, this.model.requireInvertedAxes);\r\n if (this.model.requireInvertedAxes) {\r\n x = (valAxis.y + valAxis.height) - currentY;\r\n y = (currentX - valAxis.x);\r\n }\r\n else {\r\n x = (currentX - valAxis.x);\r\n y = (valAxis.y + valAxis.height) - currentY;\r\n }\r\n mousePoint = ej.EjSvgRender.utils._getValuebyPoint(x, y, chartSeries, this.model.requireInvertedAxes);\r\n PointX = parseFloat(mousePoint.PointX.toFixed(2));\r\n PointY = parseFloat(mousePoint.PointY.toFixed(2));\r\n return { X: PointX, Y: PointY };\r\n },\r\n\r\n _pointDragandDrop: function (chartSeries, evt, chart) {\r\n var i = chartSeries.data.seriesIndex,\r\n pointCollection = [], translate = null,\r\n chartType = chartSeries.type.toLowerCase();\r\n var params = {};\r\n params.axes = {};\r\n for (var k = 0; k < this.model._axes.length; k++)\r\n params.axes[this.model._axes[k].name] = {};\r\n\r\n\r\n $(\"[id*=\" + \"_Marker\" + \"]\").remove();\r\n var draggedPoints = this._getDraggedPoint(chartSeries, this.mousemoveX, this.mousemoveY),\r\n xPoint = draggedPoints.X,\r\n yPoint = draggedPoints.Y,\r\n xVal = this.commonDragEventArgs.data.currentPoint ? this.commonDragEventArgs.data.currentPoint.xValue : this.commonDragEventArgs.data.oldValue.X,\r\n yVal = this.commonDragEventArgs.data.currentPoint ? this.commonDragEventArgs.data.currentPoint.yValue[0] : this.commonDragEventArgs.data.oldValue.Y;\r\n if (chartSeries.region) {\r\n var region = chartSeries.region;\r\n chart._dragDelta(xPoint, yPoint, xVal, yVal, region.SeriesIndex, region.Region.PointIndex);\r\n }\r\n else {\r\n var closestPoint = chartSeries.pointData;\r\n chart._dragDelta(xPoint, yPoint, xVal, yVal, closestPoint.seriesIndex, closestPoint.index);\r\n }\r\n if (this.model.enableCanvasRendering) {\r\n if (this.canvasElement) this.canvasElement.clearRect(0, 0, chart.svgWidth, chart.svgHeight);\r\n if ($('#' + chart._id + '_PreviewSeries' + i + '_canvas').length == 0) {\r\n var containerStyle = document.getElementById(chart._id + '_canvas').getBoundingClientRect();\r\n canvasElement = this.createCanvasElement(chart._id + '_PreviewSeries' + i + '_canvas', chart.svgWidth, chart.svgHeight, containerStyle);\r\n this.createRect(chart, canvasElement);\r\n this.canvasElement = canvasElement;\r\n }\r\n }\r\n else {\r\n chartSeries.xAxis = (chartSeries.xAxis === null || chartSeries.xAxis === undefined) ? this.model._axes[0] : chartSeries.xAxis;\r\n chartSeries.yAxis = (chartSeries.yAxis === null || chartSeries.yAxis === undefined) ? this.model._axes[1] : chartSeries.yAxis;\r\n var trans = ej.EjSvgRender.utils._getTransform(chartSeries.xAxis, chartSeries.yAxis, this.model.requireInvertedAxes);\r\n var translate = 'translate(' + trans.x + ',' + trans.y + ')';\r\n var serOptions = { 'id': this.svgObject.id + '_PreviewSeriesGroup', 'transform': translate, 'cursor': 'default', 'visibility': 'visible' };\r\n $(\"#\" + this.svgObject.id + \"_PreviewSeriesGroup\").attr(\"transform\", translate);\r\n if (!this.gPreviewSeriesGroupEle) {\r\n this.chartObj = chart;\r\n this.chartObj.gPreviewSeriesGroupEle = this.gPreviewSeriesGroupEle = this.svgRenderer.createGroup(serOptions);\r\n }\r\n if (this.gPreviewSeriesGroupEle.childNodes.length > 0)\r\n this.gPreviewSeriesGroupEle.removeChild(this.gPreviewSeriesGroupEle.childNodes[0]);\r\n }\r\n pointCollection = $.extend(true, {}, chartSeries._visiblePoints);\r\n chartSeries.pointCollection = pointCollection;\r\n pointCollection.length = chartSeries._visiblePoints.length;\r\n var dragEventArgs = chart.commonDragEventArgs.data;\r\n var ptindex = dragEventArgs.pointIndex,\r\n srindex = dragEventArgs.seriesIndex;\r\n chart._changeDraggingPoints(chartSeries, ptindex, dragEventArgs.newValue.X, dragEventArgs.newValue.Y);\r\n\r\n var series = new ej.seriesTypes[chartType](),\r\n point = chartSeries.pointCollection[ptindex];\r\n if (chartType == \"bubble\") {\r\n var location = ej.EjSvgRender.utils._getPoint(point, chartSeries);\r\n var options = {\r\n 'id': this.svgObject.id + '_PreviewSeries' + srindex + '_Point' + ptindex,\r\n 'cx': location.X + this.canvasX,\r\n 'cy': (location.Y) + this.canvasY,\r\n 'r': point.radius,\r\n 'fill': chartSeries.fill,\r\n 'stroke-width': 2,\r\n 'visibility': 'visible',\r\n 'stroke-dasharray': \"\",\r\n 'opacity': 0.6,\r\n 'stroke': 'transparent'\r\n };\r\n if (this.model.enableCanvasRendering)\r\n ej.EjCanvasRender.prototype.drawCircle(options, canvasElement);\r\n else\r\n this.svgRenderer.drawCircle(options, this.gPreviewSeriesGroupEle);\r\n this.svgRenderer.append(this.gPreviewSeriesGroupEle, this.gSeriesEle);\r\n }\r\n else if (chartType == \"scatter\") {\r\n var location = ej.EjSvgRender.utils._getPoint(point, chartSeries);\r\n var symbolName = (chartSeries.marker.shape).capitalizeFirstString();\r\n var location = { startX: location.X + this.canvasX, startY: location.Y + this.canvasY };\r\n var style = {\r\n ShapeSize: { width: chartSeries.marker.size.width, height: chartSeries.marker.size.height },\r\n ID: this.svgObject.id + '_PreviewSeries' + srindex + '_Point' + ptindex,\r\n Style: {\r\n Color: chartSeries.fill,\r\n BorderWidth: chartSeries.marker.border.width,\r\n BorderColor: 'transparent',\r\n Opacity: 0.6,\r\n Visibility: 'visible'\r\n }\r\n };\r\n if (this.model.enableCanvasRendering)\r\n ej.EjSvgRender.chartSymbol[\"_draw\" + symbolName](location, style, this, canvasElement);\r\n else\r\n ej.EjSvgRender.chartSymbol[\"_draw\" + symbolName](location, style, this, this.gPreviewSeriesGroupEle);\r\n this.svgRenderer.append(this.gPreviewSeriesGroupEle, this.gSeriesEle);\r\n }\r\n\r\n else if (chartType == \"column\" || chartType == \"bar\") {\r\n point.xValue = (typeof point.xValue == \"object\") ? Date.parse(point.xValue) : point.xValue;\r\n var origin = ej.EjSeriesRender.prototype.getOrigin(chart, chartSeries, params);\r\n var sidebysideinfo = chartSeries.sidebysideInfo;\r\n var y1 = point.YValues[0];\r\n var y2 = origin;\r\n //calculate sides\r\n var data = ej.EjSeriesRender.prototype.calculateSides(point, sidebysideinfo);\r\n var x1 = data.x1;\r\n var x2 = data.x2;\r\n var rect = ej.EjSeriesRender.prototype.getRectangle(x1, y1, x2, y2, chartSeries, chart);\r\n options = {\r\n 'id': this.svgObject.id + '_PreviewSeries' + srindex + '_Point' + ptindex,\r\n 'x': rect.X + this.canvasX,\r\n 'y': rect.Y + this.canvasY,\r\n 'width': rect.Width,\r\n 'height': rect.Height,\r\n 'cornerRadius': chartSeries.cornerRadius,\r\n 'fill': chartSeries.fill,\r\n 'stroke-width': 2,\r\n 'plot': y1 < 0 ? \"negative\" : \"positive\",\r\n 'opacity': 0.6,\r\n 'stroke': 'transparent',\r\n 'stroke-dasharray': \"\",\r\n };\r\n if (this.model.enableCanvasRendering)\r\n ej.EjCanvasRender.prototype.drawRect(options, canvasElement);\r\n else {\r\n this.svgRenderer.drawRect(options, this.gPreviewSeriesGroupEle);\r\n this.svgRenderer.append(this.gPreviewSeriesGroupEle, this.gSeriesEle);\r\n }\r\n }\r\n else {\r\n if (chartType == \"spline\" || chartType == \"splinearea\")\r\n point.xValue = (typeof point.xValue == \"object\") ? Date.parse(point.xValue) : point.xValue;\r\n series.draw(this, chartSeries, params);\r\n }\r\n var location = ej.EjSvgRender.utils._getPoint(point, chartSeries);\r\n if (chartSeries.tooltip.visible) {\r\n if (ej.util.isNullOrUndefined(chartSeries.tooltip.template)) {\r\n $(\".tooltipDiv\" + this._id).remove();\r\n chart.displayShowTooltip(location, point, chartSeries, point.actualIndex);\r\n }\r\n else {\r\n $(\"#\" + chart.svgObject.id).find(\"#\" + chart.svgObject.id + \"_TrackToolTip\").attr('visibility', 'hidden');\r\n var region = { SeriesIndex: srindex, Region: { PointIndex: point.actualIndex } };\r\n chart.createTooltip(region, evt, chartSeries);\r\n }\r\n }\r\n\r\n },\r\n // to show marker symbol for line type charts in dragdrop\r\n _dragPointMarker: function (chartSeries, currentX, currentY, evt, closestXyPoint) {\r\n var location = null,\r\n srIndex = chartSeries.seriesIndex;\r\n location = ej.EjSvgRender.utils._getPoint(closestXyPoint.point, chartSeries);\r\n if (this.model.enableCanvasRendering) {\r\n if ($('#' + this.svgObject.id + '_Marker').length == 0) {\r\n var containerStyle = document.getElementById(this.svgObject.id).getBoundingClientRect();\r\n ctx = this.createCanvasElement(this.svgObject.id + '_Marker', this.svgWidth, this.svgHeight, containerStyle);\r\n }\r\n }\r\n else {\r\n var markerOptions = { 'id': this.svgObject.id + '_markerGroup' + '_' + srIndex };\r\n if (!this.gMarkerGroupEle)\r\n this.gMarkerGroupEle = this.svgRenderer.createGroup(markerOptions);\r\n }\r\n var options = {\r\n 'id': this.svgObject.id + '_Series' + srIndex + '_Point' + closestXyPoint.index + '_Marker',\r\n 'cx': location.X + this.model.m_AreaBounds.X,\r\n 'cy': location.Y + this.model.m_AreaBounds.Y,\r\n 'r': 7,\r\n 'fill': chartSeries.fill,\r\n 'stroke-width': 3,\r\n 'opacity': 1,\r\n 'stroke': 'white',\r\n 'visibility': 'visible'\r\n };\r\n if (this.model.enableCanvasRendering)\r\n ej.EjCanvasRender.prototype.drawCircle(options, ctx);\r\n else {\r\n this.svgRenderer.drawCircle(options, this.gMarkerGroupEle);\r\n this.svgRenderer.append(this.gMarkerGroupEle, this.gSeriesEle);\r\n }\r\n },\r\n // to show 3 circles for column and bar while hovering rect in dragdrop\r\n _dragPointGripper: function (data) {\r\n var type = data.region.type.toLowerCase(),\r\n chartSeries = this.model._visibleSeries[data.region.SeriesIndex],\r\n point = chartSeries._visiblePoints[data.region.Region.PointIndex],\r\n transposed = chartSeries.isTransposed,\r\n inversed = chartSeries.yAxis.isInversed;\r\n if (type == \"column\" || type == \"bar\") {\r\n if (this.model.enableCanvasRendering) {\r\n var containerStyle = document.getElementById(this.svgObject.id).getBoundingClientRect();\r\n canvasGripper = this.createCanvasElement(this.svgObject.id + '_Marker', this.svgWidth, this.svgHeight, containerStyle);\r\n document.getElementById(canvasGripper.canvas.id).style.zIndex = 1;\r\n }\r\n else {\r\n var markerOptions = { 'id': this.svgObject.id + '_markerGroup' + '_' + data.region.SeriesIndex };\r\n if (!this.gMarkerGroupEle)\r\n this.gMarkerGroupEle = this.svgRenderer.createGroup(markerOptions);\r\n }\r\n var circleLength = 3, value, boundValue, loc, diff, radius, cxy,\r\n bounds = data.region.Region.Bounds;\r\n if ((transposed && type == \"bar\") || (type == \"column\" && !transposed)) {\r\n value = bounds.Width;\r\n boundValue = bounds.X;\r\n }\r\n if ((!transposed && type == \"bar\") || (type == \"column\" && transposed)) {\r\n value = bounds.Height;\r\n boundValue = bounds.Y;\r\n }\r\n loc = value < 75 ? value - value / 3 : 75 - 25;\r\n diff = value > 75 ? value - 75 : 0;\r\n radius = (loc - 6) / 6;\r\n cxy = diff / 2 + boundValue + loc / 6 + radius / 2;\r\n for (var k = 1; k <= circleLength; k++) {\r\n var options = {\r\n 'id': this.svgObject.id + '_Series' + data.region.SeriesIndex + '_Point' + data.region.Region.PointIndex + '_Marker' + k,\r\n 'fill': 'white',\r\n 'opacity': 1,\r\n 'stroke': 'white',\r\n 'visibility': 'visible'\r\n };\r\n if (k == 1)\r\n cxy += radius;\r\n else\r\n cxy += 2 * radius + 3;\r\n options.r = Math.abs(radius);\r\n if ((transposed && type == \"bar\") || (type == \"column\" && !transposed)) {\r\n options.cx = cxy;\r\n options.cy = inversed ? bounds.Y + bounds.Height - radius - 5 : bounds.Y + radius + 5;\r\n }\r\n if ((!transposed && type == \"bar\") || (type == \"column\" && transposed)) {\r\n options.cx = inversed ? bounds.X + radius + 5 : bounds.X + bounds.Width - radius - 5;\r\n options.cy = cxy;\r\n }\r\n if (this.model.enableCanvasRendering)\r\n ej.EjCanvasRender.prototype.drawCircle(options, canvasGripper);\r\n else\r\n this.svgRenderer.drawCircle(options, this.gMarkerGroupEle);\r\n }\r\n this.svgRenderer.append(this.gMarkerGroupEle, this.gSeriesEle);\r\n }\r\n },\r\n chartMouseMove: function (evt) {\r\n\r\n var data = this.GetSeriesPoint(evt),\r\n svgObject = this.svgObject,\r\n model = this.model, zooming = model.zooming.enable,\r\n enableCanvas = model.enableCanvasRendering;\r\n model.event = evt;\r\n clearTimeout(this.removeTooltip); // to clear the set timeout used to remove the tooltip template\r\n if (this.doPan && evt.target.id.indexOf(this._id + '_scrollbar') > -1)\r\n this.doPan = false;\r\n var classList = evt.target.classList,\r\n chartOffset = { left: 0, top: 0 };\r\n if (this.multiSelectAreaType == 'cartesianaxes' && (!zooming) && (!enableCanvas))\r\n this.multiSelectMouseMove(evt);\r\n if (this.rotateActivate && this.oPreviousCoords) {\r\n var difY = (this.oPreviousCoords.Y - this.mousemoveY);\r\n var difX = (this.oPreviousCoords.X - this.mousemoveX);\r\n if (difX || difY) {\r\n model.tilt -= difY;\r\n model.rotation += difX;\r\n // store the class name \r\n if (this.model.isSelected)\r\n var selection = this.selectedStyle(this);\r\n if (!this.isTouch(evt))\r\n $(this.chart3D).empty();\r\n $('#template_group_' + this._id).empty();\r\n var size = { Width: $(svgObject).width(), Height: $(svgObject).height() };\r\n this.graphics.view(svgObject, this, model.rotation, model.tilt, size, model.perspectiveAngle, model.depth);\r\n this.svgRenderer.append(this.chart3D, svgObject);\r\n // Apply the class\r\n if (this.model.isSelected)\r\n for (var i = 0; i < selection.length; i++) {\r\n $('#' + selection[i].id).attr('class', selection[i].className);\r\n }\r\n }\r\n this.oPreviousCoords.Y = this.mousemoveY;\r\n this.oPreviousCoords.X = this.mousemoveX;\r\n }\r\n\r\n var targetId = evt.target.id,\r\n svgObjectId = svgObject.id,\r\n isZoom = this.isZoomButtonHovered(evt.target),\r\n visibleSeries = model._visibleSeries,\r\n seriesLength = visibleSeries.length;\r\n $(\"[id*=\" + \"_Marker\" + \"]\").remove();\r\n for (var i = seriesLength - 1; i >= 0; i--) {\r\n var chartSeries = visibleSeries[i];\r\n type = chartSeries.type.toLowerCase();\r\n if (chartSeries.dragSettings.enable && !model.enable3D) {\r\n this._enableDragging(chartSeries, i, evt);\r\n if (this.dragPoint)\r\n break;\r\n mouseMoveCords = this.calMousePosition(evt);\r\n this.mousemoveX = mouseMoveCords.X;\r\n this.mousemoveY = mouseMoveCords.Y;\r\n var regionData = this.GetSeriesPoint(evt);\r\n if (!chartSeries.marker.visible && type != \"bubble\" && type != \"scatter\" && type != \"column\" && type != \"bar\") {\r\n var closestXyPoint = this.getClosesPointXY(serX, serY, chartSeries, this.mousemoveX, this.mousemoveY, evt);\r\n if (closestXyPoint.point) {\r\n chartSeries.seriesIndex = i;\r\n this._dragPointMarker(chartSeries, this.mousemoveX, this.mousemoveY, evt, closestXyPoint);\r\n this.closestXyPoint = closestXyPoint;\r\n break;\r\n }\r\n }\r\n if (regionData && regionData.region.SeriesIndex == i) {\r\n this._dragPointGripper(regionData);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n var chart = this;\r\n if (this.dragPoint) {\r\n var serX = [], serY = [], type;\r\n $(document).keyup(function (evt) {\r\n if (evt.keyCode == 27) {\r\n $(\".tooltipDiv\" + this._id).remove();\r\n $(\"#\" + svgObjectId + \"_TrackToolTip\").remove();\r\n chart.dragPoint = false;\r\n visibleSeries[chart.commonDragEventArgs.data.seriesIndex].pointCollection = null;\r\n chart.chartMouseUp(evt);\r\n }\r\n });\r\n var index = this.dragIndex.seriesIndex;\r\n chart._pointDragandDrop(visibleSeries[index], evt, chart);\r\n }\r\n\r\n this.calMousePosition(evt)\r\n $(\"#\" + this._id + \"_tooltip\").remove();\r\n\r\n if (this.dragPoint || (!this.drag && !isZoom && ((!this.isTouch(evt) && !model.doubleTapped) || model.crosshairMoved))) {\r\n this.chartInteractiveBehavior(evt);\r\n }\r\n // Checked condition for series highlighting\r\n if ((!model.crosshair.visible || model.AreaType != \"cartesianaxes\")) {\r\n if (!enableCanvas || !data) {\r\n // removed highlight style\r\n $(\"[class*=\" + \"HighlightStyle\" + \"]\").attr('class', '');\r\n $(\"[class*=\" + \"HighlightLegendStyle\" + \"]\").attr('class', '');\r\n $(\"[class*=\" + \"HighlightLegendPathStyle\" + \"]\").attr('class', '');\r\n $(\"[class*=\" + \"HighlightPathStyle\" + \"]\").attr('class', '');\r\n $(\"[class*=\" + \"Highlightseries\" + \"]\").attr('class', '');\r\n $(\"[id*=\" + this._id + \"_Highlight_\" + \"]\").remove();// removed canvas highlight \r\n }\r\n this.highlightStart(evt, data);\r\n }\r\n if (!this.panning) {\r\n var id = \"#\" + svgObjectId;\r\n if (zooming && model.AreaType == \"cartesianaxes\" && !model.enable3D) {\r\n if (this.drag && !this.dragPoint && !this.chartRightClick) {\r\n this.disableTrackBall();\r\n $('#' + svgObjectId + '_ZoomArea').remove();\r\n var width, height, x, y;\r\n var currentX = this.mousemoveX,\r\n currentY = this.mousemoveY,\r\n areaBounds = model.m_AreaBounds;\r\n if (this.mousemoveX < areaBounds.X) {\r\n currentX = areaBounds.X;\r\n } else if (this.mousemoveX > (areaBounds.X + areaBounds.Width)) {\r\n currentX = areaBounds.X + areaBounds.Width;\r\n }\r\n if (this.mousemoveY < areaBounds.Y) {\r\n currentY = areaBounds.Y;\r\n } else if (this.mousemoveY > (areaBounds.Y + areaBounds.Height)) {\r\n currentY = areaBounds.Y + areaBounds.Height;\r\n }\r\n else {\r\n currentY = this.mousemoveY;\r\n }\r\n var zoomingType = model.zooming.type.toLowerCase();\r\n if (zoomingType == \"x\") {\r\n width = Math.abs(currentX - this.mouseDownX);\r\n height = areaBounds.Height;\r\n x = currentX > this.mouseDownX ? this.mouseDownX : currentX;\r\n y = areaBounds.Y;\r\n } else if (zoomingType == \"y\") {\r\n width = areaBounds.Width;\r\n height = Math.abs(currentY - this.mouseDownY);\r\n x = areaBounds.X;\r\n y = currentY > this.mouseDownY ? this.mouseDownY : currentY;\r\n\r\n } else {\r\n width = Math.abs(currentX - this.mouseDownX);\r\n height = Math.abs(currentY - this.mouseDownY);\r\n x = currentX > this.mouseDownX ? this.mouseDownX : currentX;\r\n y = currentY > this.mouseDownY ? this.mouseDownY : currentY;\r\n\r\n }\r\n $(svgObject).css({\r\n '-moz-user-select': '-moz-none',\r\n '-khtml-user-select': 'none',\r\n '-webkit-user-select': 'none',\r\n '-ms-user-select': 'none',\r\n 'user-select': 'none'\r\n });\r\n\r\n this.zooming = true;\r\n\r\n var rectOptions = {\r\n 'id': svgObjectId + '_ZoomArea',\r\n 'x': x + chartOffset.left,\r\n 'y': y + chartOffset.top,\r\n 'width': width,\r\n 'height': height,\r\n 'fill': 'rgba(69,114,167,0.25)',\r\n 'stroke-width': 1,\r\n 'stroke': 'rgba(69,114,167,0.25)',\r\n 'clip-path': 'url(#' + svgObjectId + '_ChartAreaClipRect)'\r\n };\r\n if (enableCanvas)\r\n this.svgRenderer.drawZoomRect(rectOptions, this);\r\n else\r\n this.svgRenderer.drawRect(rectOptions, svgObject);\r\n }\r\n\r\n }\r\n }\r\n var deferredZoom = model.zooming.enableDeferredZoom;\r\n // Panning\r\n if (this.panning && this.doPan && model.AreaType == \"cartesianaxes\" && !this.dragPoint) {\r\n this.currentPageX = evt.pageX;\r\n this.currentPageY = evt.pageY;\r\n $(\"#\" + this._id + \"_canvas\").css({ \"cursor\": \"pointer\" });\r\n if (!ej.isTouchDevice() && !deferredZoom) {\r\n var oDelta;\r\n oDelta = {\r\n 'x': this.oPreviousCoords.x - evt.pageX,\r\n 'y': this.oPreviousCoords.y - evt.pageY\r\n };\r\n\r\n this.oPreviousCoords = {\r\n 'x': evt.pageX,\r\n 'y': evt.pageY\r\n };\r\n $.each(model._axes, function (index, axis) {\r\n var currentScale = Math.max(1 / ej.EjSvgRender.utils._minMax(axis.zoomFactor, 0, 1), 1);\r\n chart.translate(axis, (oDelta.x), (oDelta.y), currentScale);\r\n });\r\n this._updateScroll();\r\n this.redraw(true, null, evt.target, this.isTouch(evt));\r\n this._cursorToPointer();\r\n this._enableZoomingButtons();\r\n }\r\n // Translate the series for other devices\r\n else if (ej.isTouchDevice() || deferredZoom) {\r\n for (var k = 0; k < visibleSeries.length; k++) {\r\n var series = model.series[k],\r\n transform = ej.EjSvgRender.utils._getTransform(series.xAxis, series.yAxis, model.requireInvertedAxes),\r\n transX = (evt.pageX - this.oPreviousCoords.x) + transform.x,\r\n transY = (evt.pageY - this.oPreviousCoords.y) + transform.y,\r\n translate = 'translate(' + transX + ',' + transY + ')';\r\n\r\n $(\"#\" + svgObjectId + \"_SeriesGroup_\" + k).attr(\"transform\", translate);\r\n $(\"#\" + svgObjectId + \"_symbolGroup_\" + k).attr(\"transform\", translate);\r\n $(\"#\" + svgObjectId + \"_TextGroup_\" + k).attr(\"transform\", translate);\r\n\r\n }\r\n for (var index = 0; index < model.indicators.length && model.indicators[index]._points.length > 0; index++) {\r\n var indicator = model.indicators[index];\r\n transform = ej.EjSvgRender.utils._getTransform(indicator.xAxis, indicator.yAxis, model.requireInvertedAxes);\r\n transX = (evt.pageX - this.oPreviousCoords.x) + transform.x;\r\n transY = (evt.pageY - this.oPreviousCoords.y) + transform.y;\r\n translate = 'translate(' + transX + ',' + transY + ')';\r\n $(\"#\" + svgObjectId + \"_indicatorGroup_\" + index).attr(\"transform\", translate);\r\n }\r\n }\r\n }\r\n\r\n //Declaration\r\n var targetid = evt.target.id;\r\n if (targetid == \"\" && !ej.util.isNullOrUndefined(evt.target.parentNode))\r\n targetid = evt.target.parentNode.id.indexOf(\"_XLabel_\") >= 0 || evt.target.parentNode.id.indexOf(\"_YLabel_\") >= 0 ? evt.target.parentNode.id : targetid;\r\n var id = this._id;\r\n var parentId = ej.util.isNullOrUndefined(evt.target.parentNode) ? \"\" : evt.target.parentNode.id;\r\n\r\n //condition to find the buttons and display tooltip on hover\r\n if (zooming) {\r\n if (parentId == id + '_svg_ResetZoom')\r\n createBtnTooltip(this._localizedLabels.reset);\r\n else if (parentId == id + '_svg_PanBtn')\r\n createBtnTooltip(this._localizedLabels.pan);\r\n else if (parentId == id + '_svg_ZoomBtn')\r\n createBtnTooltip(this._localizedLabels.zoom);\r\n else if (parentId == id + '_svg_ZoomInBtn')\r\n createBtnTooltip(this._localizedLabels.zoomIn);\r\n else if (parentId == id + '_svg_ZoomOutBtn')\r\n createBtnTooltip(this._localizedLabels.zoomOut);\r\n }\r\n // method to create tooltip for zooming and panning buttons\r\n function createBtnTooltip(text) {\r\n var id = chart._id;\r\n if ($(\"#\" + id + \"_tooltip\").length <= 0) {\r\n var tooltipdiv = $(\"
\").attr({ 'id': id + \"_tooltip\", \"class\": \"zoom\" + id });\r\n $(tooltipdiv).html(\" \" + text + \" \");\r\n $(document.body).append(tooltipdiv);\r\n // adding css prop to the div\r\n $(tooltipdiv).css({\r\n \"left\": evt.pageX + 10,\r\n \"top\": evt.pageY + 10,\r\n \"display\": \"block\",\r\n \"position\": \"absolute\",\r\n \"z-index\": \"13000\",\r\n \"cursor\": \"default\",\r\n \"font-family\": \"Segoe UI\",\r\n \"color\": \"#707070\",\r\n \"font-size\": \"12px\",\r\n \"background-color\": \"#FFFFFF\",\r\n \"border\": \"1px solid #707070\"\r\n });\r\n } else {\r\n $(\"#\" + id + \"_tooltip\").css({\r\n \"left\": evt.pageX + 10,\r\n \"top\": evt.pageY + 10\r\n });\r\n }\r\n\r\n }\r\n // axisLabelMouseMove event\r\n var axisData = this.getAxisLabelData(evt);\r\n if (axisData) {\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = axisData;\r\n this._trigger(\"axisLabelMouseMove\", commonEventArgs);\r\n }\r\n\r\n if (!this.isTouch(evt)) {\r\n this.axisTooltip(evt, targetid);\r\n if (model.title.enableTrim)\r\n this.showTitleTooltip(evt, targetid);\r\n for (var i = 0, seriesLength = model.series.length; i < seriesLength; i++) {\r\n var series = model.series[i], dataLabel = series.marker && series.marker.dataLabel;\r\n if (series._enableSmartLabels && !this.model.enable3D && !dataLabel.enableWrap) {\r\n var template = dataLabel.template;\r\n var font = dataLabel.font;\r\n if (model.AreaType == \"none\" && ej.util.isNullOrUndefined(template)) {\r\n this.datalabelTooltip(evt, i, font);\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n if ($(svgObject).find(id + '_ResetZoom,' + id + '_PanBtn,' + id + '_ZoomBtn').length > 0) {\r\n $(svgObject).find(id + '_ResetZoom,' + id + '_PanBtn,' + id + '_ZoomBtn').appendTo(svgObject);\r\n }\r\n\r\n var legenddata = this.getLegendData(evt);\r\n if (legenddata) {\r\n var commonLegendMoveEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonLegendMoveEventArgs.data = legenddata;\r\n if (legenddata.series.highlightSettings.enable) {\r\n if (enableCanvas) {\r\n var series = $.extend({}, legenddata.series);\r\n series.seriesIndex = legenddata.legendItem.LegendItem.SeriesIndex;\r\n series.pointIndex = legenddata.legendItem.LegendItem.PointIndex;\r\n var index = this.model.AreaType == 'none' ? series.pointIndex : series.seriesIndex;\r\n if ($('#' + chart._id + '_Selection_Legend' + index + '_canvas').length == 0) {\r\n //remove canvas legend highlight \r\n $(\"[id*=\" + this._id + \"_Highlight_\" + \"]\").remove();\r\n this.canvasHighlight(chart, evt, series, legenddata);\r\n }\r\n }\r\n else\r\n this.highlight(chart, evt, legenddata.series, legenddata);\r\n }\r\n this._trigger(\"legendItemMouseMove\", commonLegendMoveEventArgs);\r\n if (enableCanvas) {\r\n var mouseMoveCords = this.calMousePosition(evt),\r\n mousemoveX = mouseMoveCords.X,\r\n mousemoveY = mouseMoveCords.Y,\r\n legendBounds = model.LegendBounds;\r\n $(this.legendContainer).children().css({ \"cursor\": \"pointer\" });\r\n if ((mousemoveX >= legendBounds.X) && (mousemoveX <= legendBounds.X + model.LegendViewerBounds.Width)) {\r\n if ((mousemoveY <= legendBounds.Y + (model.LegendViewerBounds.Height)) && (mousemoveY >= legendBounds.Y)) {\r\n this._textTooltip(evt, model.legendTextRegion);\r\n }\r\n }\r\n }\r\n else\r\n this._textTooltip(evt, model.legendTextRegion);\r\n }\r\n else if (enableCanvas)\r\n $(this.legendContainer).children().css('cursor', 'default');\r\n if (enableCanvas) {\r\n\r\n //condition to find the buttons and display tooltip on hover for Canvas\r\n if (targetid.indexOf(\"_ResetZoom\") != -1 || parentId.indexOf(\"_ResetZoom\") != -1)\r\n createBtnTooltip(this._localizedLabels.reset);\r\n else if (targetid.indexOf(\"_PanBtn\") != -1 || parentId.indexOf(\"_PanBtn\") != -1)\r\n createBtnTooltip(this._localizedLabels.pan);\r\n else if (targetid.indexOf(\"_ZoomBtn\") != -1 || parentId.indexOf(\"_ZoomBtn\") != -1)\r\n createBtnTooltip(this._localizedLabels.zoom);\r\n else if (targetid.indexOf(\"_ZoomInBtn\") != -1 || parentId.indexOf(\"_ZoomInBtn\") != -1)\r\n createBtnTooltip(this._localizedLabels.zoomIn);\r\n else if (targetid.indexOf(\"_ZoomOutBtn\") != -1 || parentId.indexOf(\"_ZoomOutBtn\") != -1)\r\n createBtnTooltip(this._localizedLabels.zoomOut);\r\n if (!this.isTouch(evt)) {\r\n this._textTooltip(evt, model.xAxisLabelRegions);\r\n this._textTooltip(evt, model.yAxisLabelRegions);\r\n }\r\n }\r\n\r\n var proxy = this;\r\n if (model.xAxisTitleRegion) {\r\n var currentX = this.mousemoveX,\r\n currentY = this.mousemoveY;\r\n $.each(model.xAxisTitleRegion, function (index, regionItem) {\r\n if ((currentX >= regionItem.Bounds.X) && (currentX <= regionItem.Bounds.X + regionItem.Bounds.Width)) {\r\n if ((currentY >= regionItem.Bounds.Y - (regionItem.Bounds.Height)) && (currentY <= regionItem.Bounds.Y)) {\r\n if (regionItem.trimText != regionItem.labelText) {\r\n proxy.showAxisTooltip(evt.pageX, evt.pageY, regionItem.labelText);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n if (model.yAxisTitleRegion) {\r\n var currentX = this.mousemoveX,\r\n currentY = this.mousemoveY;\r\n $.each(model.yAxisTitleRegion, function (index, regionItem) {\r\n if ((currentX >= regionItem.Bounds.X) && (currentX <= regionItem.Bounds.X + regionItem.Bounds.Width)) {\r\n if ((currentY >= regionItem.Bounds.Y - (regionItem.Bounds.Height)) && (currentY <= regionItem.Bounds.Y)) {\r\n if (regionItem.trimText != regionItem.labelText) {\r\n proxy.showAxisTooltip(evt.pageX, evt.pageY, regionItem.labelText);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n if (model.axisMultiLevelLabelRegions) {\r\n var currentX = this.mousemoveX,\r\n currentY = this.mousemoveY;\r\n $.each(model.axisMultiLevelLabelRegions, function (index, regionItem) {\r\n if ((currentX >= regionItem.Bounds.X) && (currentX <= regionItem.Bounds.X + regionItem.Bounds.Width)) {\r\n if ((currentY >= regionItem.Bounds.Y - (regionItem.Bounds.Height)) && (currentY <= regionItem.Bounds.Y)) {\r\n if (regionItem.trimText != regionItem.labelText) {\r\n proxy.showAxisTooltip(evt.pageX, evt.pageY, regionItem.labelText);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n //chartMouseMove event\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { location: { x: this.mousemoveX, y: this.mousemoveY }, size: { height: model.svgHeight, width: model.svgWidth }, id: evt.target.id, pageX: evt.pageX, pageY: evt.pageY };\r\n this._trigger(\"chartMouseMove\", commonEventArgs);\r\n },\r\n\r\n axisTooltip: function (evt, targetid) {\r\n var svgId = this.svgObject.id,\r\n hAxes = this.model.hAxes,\r\n vAxes = this.model.vAxes;\r\n\r\n //axis label tooltip for 3d \r\n if (targetid.indexOf(\"svghorizontal\") > -1) {\r\n var axis = hAxes[0];\r\n // Loop to find the axis\r\n var labelIndex = ((targetid.replace(this._id, '')).replace('_svghorizontal', ''));\r\n var ele = axis.visibleLabels[parseInt(labelIndex)];\r\n ele.Text = ele.Text.toString();\r\n if (ele.Text.indexOf('...') > -1) {\r\n var str = ele.Text == ele.originalText ? \"\" : ele.originalText;\r\n this.showAxisTooltip(evt.pageX, evt.pageY, str);\r\n }\r\n\r\n }\r\n\r\n if (targetid.indexOf(\"_YLabel_\") >= 0) {\r\n var axis;\r\n // Loop to find the axis\r\n for (var j = 0; j < vAxes.length; j++) {\r\n if (targetid.indexOf(svgId + '_' + vAxes[j].name + '_YLabel_') >= 0) {\r\n axis = vAxes[j];\r\n break;\r\n }\r\n }\r\n if (axis && axis.enableTrim) {\r\n // Loop to find the labels in the axis\r\n visibleLabelsLength = axis.visibleLabels.length;\r\n for (var i = 0; i < visibleLabelsLength && this.model.AreaType == 'cartesianaxes'; i++) {\r\n if (targetid == svgId + '_' + vAxes[j].name + '_YLabel_' + i) {\r\n var ele = axis.visibleLabels[i];\r\n var str = ele.Text == ele.displayText ? \"\" : ((axis.labelFormat) ? axis.labelFormat.replace(\"{value}\", ele.Text) : ele.Text);\r\n if (str == \"\") break;\r\n if (axis.labelPosition.toLowerCase() == 'inside') {\r\n this._hideTooltip();\r\n this._removeTrackBall();\r\n }\r\n this.showAxisTooltip(evt.pageX, evt.pageY, str);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (targetid.indexOf(\"_XLabel_\") >= 0) {\r\n var axis, visibleLabelsLength;\r\n // Loop to find the axis\r\n for (var j = 0; j < hAxes.length; j++) {\r\n if (targetid.indexOf(svgId + '_' + hAxes[j].name + '_XLabel_') >= 0) {\r\n axis = hAxes[j];\r\n break;\r\n }\r\n }\r\n if (axis && (axis.enableTrim || axis.labelIntersectAction.toLowerCase() == \"trim\" || axis.labelIntersectAction.toLowerCase() == \"wrapbyword\")) {\r\n // Loop to find the labels in the axis\r\n visibleLabelsLength = axis.visibleLabels.length;\r\n for (var i = 0; i < visibleLabelsLength && this.model.AreaType == 'cartesianaxes'; i++) {\r\n if (targetid == svgId + '_' + hAxes[j].name + '_XLabel_' + i) {\r\n var ele = axis.visibleLabels[i];\r\n var str = ele.Text == ele.displayText ? \"\" : ele.Text;\r\n if (str == \"\") break;\r\n if (axis.labelPosition.toLowerCase() == 'inside') {\r\n this._hideTooltip();\r\n this._removeTrackBall();\r\n }\r\n this.showAxisTooltip(evt.pageX, evt.pageY, str);\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n showTitleTooltip: function (evt, targetid) {\r\n var measureTitle = ej.EjSvgRender.utils._measureText(this.model.title.text, $(this.svgObject).width() - this.model.margin.left - this.model.margin.right, this.model.title.font), model = this.model,\r\n titleLocation = model._titleLocation,\r\n subTitleLocation = model._subTitleLocation,\r\n titleEnableTrim = model.title.enableTrim,\r\n elementSpacing = model.elementSpacing,\r\n currentX = this.mousemoveX, currentY = this.mousemoveY,\r\n titleTextOverflow = model.title.textOverflow.toLowerCase(),\r\n subTitleEnableTrim = model.title.subTitle.enableTrim,\r\n subTitleTextOverflow = model.title.subTitle.textOverflow.toLowerCase(),\r\n titleText = model.title.text, subTitleText = model.title.subTitle.text;\r\n if (titleEnableTrim && this.model.trimTooltip) {\r\n if (targetid.indexOf(\"ChartTitleText\") >= 0)\r\n this.showAxisTooltip(evt.pageX, evt.pageY, titleText);\r\n else if (this.model.enableCanvasRendering && currentX >= titleLocation.X - elementSpacing && currentX <= titleLocation.X - elementSpacing + titleLocation.size.width &&\r\n currentY >= (titleLocation.Y - (titleLocation._height)) && currentY <= titleLocation.Y + titleLocation.size.height)\r\n this.showAxisTooltip(evt.pageX, evt.pageY, titleText);\r\n }\r\n\r\n if (subTitleEnableTrim && model.subTitleTooltip) {\r\n if (targetid.indexOf(\"ChartSubTitleText\") >= 0)\r\n this.showAxisTooltip(evt.pageX, evt.pageY, subTitleText);\r\n else if (model.enableCanvasRendering && currentX >= subTitleLocation.X && currentX <= subTitleLocation.X + subTitleLocation.size.width &&\r\n currentY >= (subTitleLocation.Y) && currentY <= (subTitleLocation.Y) + subTitleLocation.size.height)\r\n this.showAxisTooltip(evt.pageX, evt.pageY, subTitleText);\r\n }\r\n },\r\n\r\n _updateScroll: function () {\r\n\r\n var scrollObj = this.model.scrollObj,\r\n scrollLength = scrollObj ? scrollObj.length : 0,\r\n axes = this.model._axes,\r\n scroll = this.scrollbarContainer, obj;\r\n for (var i = 0; i < scrollLength; i++) {\r\n if (scrollObj[i]) {\r\n obj = scrollObj[i];\r\n if (obj.zoomPosition != axes[i].zoomPosition || obj.zoomFactor != axes[i].zoomFactor) {\r\n obj.zoomPosition = axes[i].zoomPosition;\r\n obj.zoomFactor = axes[i].zoomFactor;\r\n scroll._initializeScrollbarVariables(obj);\r\n scroll._scrollbarUpdate.call(this, obj);\r\n scroll._setScrollPosition.call(this, obj.startX, obj.startX + obj.rectWidth, obj);\r\n }\r\n }\r\n }\r\n },\r\n\r\n _hideTooltip: function () {\r\n $(\"#\" + this.svgObject.id).find(\"#\" + this.svgObject.id + \"_TrackToolTip\").attr('visibility', 'hidden');\r\n $(\"#\" + this.svgObject.id + \"_TrackToolTip\").attr('visibility', 'hidden').hide();\r\n $('.tooltipDiv' + this._id).css(\"display\", \"none\");\r\n },\r\n _removeHighlight: function () {\r\n $(\"[id*=\" + \"HighlightSegment\" + \"]\").remove();\r\n $(\"[id*=\" + \"HighlightPath\" + \"]\").remove();\r\n $(\"[id*=\" + \"HighlightLegendSegment\" + \"]\").remove();\r\n $(\"[id*=\" + \"HighlightLegendPath\" + \"]\").remove();\r\n $(\"[id*=\" + \"HighlightDef\" + \"]\").remove();\r\n $(\"[id*=\" + \"Highlightseries\" + \"]\").remove();\r\n $(\"[id*=\" + this._id + \"_Highlight_\" + \"]\").remove();\r\n if (!this.model.enableCanvasRendering && !this.vmlRendering) {\r\n var highlightedElement = this.svgObject.querySelector(\"[class^='Highlight']\");\r\n if (highlightedElement !== null && highlightedElement.length == null)\r\n highlightedElement.removeAttribute(\"class\");\r\n else\r\n for (var j = highlightedElement && highlightedElement.length; j--;)\r\n highlightedElement.removeAttribute(\"class\");\r\n }\r\n },\r\n _removeSelection: function () {\r\n $(\"[id*=\" + this._id + '_SelectionCluster_Legend' + \"]\").remove();\r\n $(\"[id*=\" + this._id + '_Selection_series' + \"]\").remove();\r\n $(\"[id*=\" + this._id + '_Selection_Cluster' + \"]\").remove();\r\n $(\"[id*=\" + this._id + \"SelectionSegment\" + \"]\").remove();\r\n $(\"[id*=\" + this._id + \"SelectionPath\" + \"]\").remove();\r\n $(\"[id*=\" + this._id + \"SelectionLegend\" + \"]\").remove();\r\n $(\"[id*=\" + this._id + \"SelectionDef\" + \"]\").remove();\r\n $(\"[id*=\" + this._id + \"Selectionseries\" + \"]\").remove();\r\n $('[id*=' + this._id + '_Selection_' + ']').remove();\r\n },\r\n\r\n\r\n //tooltip for trimmed datalabel\r\n datalabelTooltip: function (evt, i, font) {\r\n var mouseMoveCords = this.calMousePosition(evt);\r\n this.mousemoveX = mouseMoveCords.X;\r\n this.mousemoveY = mouseMoveCords.Y;\r\n var containerId = this._id;\r\n var currentX = this.mousemoveX;\r\n var currentY = this.mousemoveY;\r\n var vmlRendering = this.vmlRendering;\r\n var space = this.model.elementSpacing;\r\n var chart = this;\r\n var minX, minY, maxX, maxY;\r\n var tooltipdiv, tooltipLength;\r\n var remaining, left;\r\n if (!ej.util.isNullOrUndefined(this.accDataLabelRegion[i])) {\r\n $.each(this.accDataLabelRegion[i], function (index, regionItem) {\r\n minX = regionItem.bounds.minX;\r\n minY = regionItem.bounds.minY;\r\n maxX = regionItem.bounds.maxX;\r\n maxY = regionItem.bounds.maxY;\r\n if (vmlRendering) {\r\n minX = regionItem.bounds.minX + (regionItem.bounds.width / 2);\r\n maxX = regionItem.bounds.maxX + (regionItem.bounds.width / 2);\r\n minY = regionItem.bounds.minY;\r\n maxY = regionItem.bounds.maxY;\r\n }\r\n if (currentX >= minX && currentX <= maxX) {\r\n if (currentY >= minY && currentY <= maxY) {\r\n $(\"#\" + containerId + \"_tooltip\").remove();\r\n tooltipdiv = $(\"
\").attr({ 'id': containerId + \"_tooltip\", 'class': 'ejTooltip' + containerId });\r\n if (regionItem.trimmedText != regionItem.text) {\r\n $(\"#\" + chart.svgObject.id + \"_TrackToolTip\").hide();\r\n $(tooltipdiv).html(regionItem.text);\r\n $(document.body).append(tooltipdiv);\r\n tooltipLength = ej.EjSvgRender.utils._measureText(regionItem.text, regionItem.text.length, regionItem.font).width;\r\n $(tooltipdiv).css({\r\n \"top\": evt.pageY + space,\r\n \"display\": \"block\",\r\n \"position\": \"absolute\",\r\n \"z-index\": \"13000\",\r\n \"cursor\": \"default\",\r\n \"color\": \"#000000\",\r\n \"font-size\": font.size,\r\n \"background-color\": \"#FFFFFF\",\r\n \"border\": \"1px solid #707070\",\r\n \"white-space\": \"nowrap\",\r\n \"padding\": \"5px\"\r\n });\r\n if (regionItem.type == \"pyramid\" || regionItem.type == \"funnel\") {\r\n remaining = chart.model.m_AreaBounds.Width + chart.model.m_AreaBounds.X - evt.pageX;\r\n if (remaining > tooltipLength)\r\n $(tooltipdiv).css({ \"left\": evt.pageX + space });\r\n else {\r\n left = evt.pageX - tooltipLength + (2 * space);\r\n $(tooltipdiv).css({ \"left\": left });\r\n\r\n }\r\n }\r\n if (regionItem.type == \"pie\" || regionItem.type == \"doughnut\" || regionItem.type == \"pieofpie\") {\r\n if (minX > regionItem.bounds.centerX) {\r\n remaining = chart.svgWidth - chart.model.margin.left - chart.model.margin.right - currentX;\r\n if (remaining < tooltipLength) {\r\n left = evt.pageX - tooltipLength;\r\n $(tooltipdiv).css({ \"left\": left + space });\r\n }\r\n else\r\n $(tooltipdiv).css({ \"left\": evt.pageX + space });\r\n }\r\n else {\r\n remaining = currentX;\r\n if (remaining < tooltipLength) {\r\n $(tooltipdiv).css({ \"left\": evt.pageX + space });\r\n }\r\n else {\r\n left = evt.pageX - tooltipLength;\r\n $(tooltipdiv).css({ \"left\": left - (2 * space) });\r\n }\r\n }\r\n }\r\n\r\n }\r\n }\r\n }\r\n });\r\n }\r\n },\r\n // Tooltip in svg \r\n showAxisTooltip: function (pageX, pageY, str) {\r\n var id = this._id;\r\n var tooltipdiv = $(\"
\").attr({ 'id': id + \"_tooltip\", 'class': 'ejTooltip' + id });\r\n $(tooltipdiv).html(str);\r\n $(document.body).append(tooltipdiv);\r\n // adding css prop to the div\r\n $(tooltipdiv).css({\r\n \"left\": pageX + 10,\r\n \"top\": pageY + 10,\r\n \"display\": \"block\",\r\n \"position\": \"absolute\",\r\n \"padding-left\": \"3px\",\r\n \"padding-right\": \"3px\",\r\n \"z-index\": \"13000\",\r\n \"cursor\": \"default\",\r\n \"font-family\": \"Segoe UI\",\r\n \"color\": \"#707070\",\r\n \"font-size\": \"12px\",\r\n \"background-color\": \"#FFFFFF\",\r\n \"border\": \"1px solid #707070\"\r\n });\r\n },\r\n _textTooltip: function (evt, region) {\r\n var chart = this,\r\n mouseMoveCords = this.calMousePosition(evt),\r\n isEjScroll = this.model.legend._ejScroller,\r\n scrollleft = 0, scrolltop = 0,\r\n mousemoveX = mouseMoveCords.X,\r\n mousemoveY = mouseMoveCords.Y,\r\n currentX = mousemoveX,\r\n currentY = mousemoveY,\r\n containerId = this._id,\r\n chartModel = chart.model,\r\n legend = chartModel.legend,\r\n isScroll = legend.enableScrollbar,\r\n textOverflow = legend.textOverflow.toLowerCase(),\r\n displayText, tooltipdiv;\r\n scrolltop = isEjScroll ? $(\"#legend_\" + this._id).ejScroller('instance').model.scrollTop : $(\"#legend_\" + this._id).scrollTop();\r\n scrollleft = isEjScroll ? $(\"#legend_\" + this._id).ejScroller('instance').model.scrollLeft : $(\"#legend_\" + this._id).scrollLeft();\r\n\r\n if (isScroll || isEjScroll) {\r\n currentX = mousemoveX + (scrollleft ? scrollleft : 0);\r\n currentY = mousemoveY + (scrolltop ? scrolltop : 0);\r\n }\r\n\r\n $.each(region, function (index, regionItem) {\r\n\r\n if ((currentX >= regionItem.bounds.x) && (currentX <= regionItem.bounds.x + regionItem.bounds.width)) {\r\n if (((currentY >= regionItem.bounds.y) && (currentY <= regionItem.bounds.y + regionItem.bounds.height)) || ((currentY >= regionItem.bounds.y - (regionItem.bounds.height / 3)) && (currentY <= regionItem.bounds.y))) {\r\n\r\n $(\"#\" + containerId + \"_tooltip\").remove();\r\n tooltipdiv = $(\"
\").attr({ 'id': containerId + \"_tooltip\", 'class': 'ejTooltip' + containerId });\r\n displayText = jQuery.type(regionItem.trimText) == \"array\" ? regionItem.trimText.join(\" \") : regionItem.trimText;\r\n if (displayText != regionItem.labelText) {\r\n $(tooltipdiv).html(regionItem.labelText);\r\n $(document.body).append(tooltipdiv);\r\n // adding css prop to the div\r\n $(tooltipdiv).css({\r\n \"left\": evt.pageX + 10,\r\n \"top\": evt.pageY + 10,\r\n \"display\": \"block\",\r\n \"position\": \"absolute\",\r\n \"padding-left\": \"3px\",\r\n \"padding-right\": \"3px\",\r\n \"z-index\": \"13000\",\r\n \"cursor\": \"default\",\r\n \"font-family\": \"Segoe UI\",\r\n \"color\": \"#707070\",\r\n \"font-size\": \"12px\",\r\n \"background-color\": \"#FFFFFF\",\r\n \"border\": \"1px solid #707070\"\r\n });\r\n }\r\n }\r\n }\r\n });\r\n },\r\n pieExplosion: function (data) {\r\n this.model.explode = true;\r\n var region = data;\r\n var id;\r\n var targetElement;\r\n var symbolName, pieSeriesIndex;\r\n var series = region.region.Series;\r\n var seriesIndex = region.region.SeriesIndex;\r\n var seriesType = new ej.seriesTypes[series.type.toLowerCase()]();\r\n var explodePoint = series.explodeIndex;\r\n var _labelPosition = series.labelPosition.toLowerCase();\r\n var currentExplodePoint = { SeriesIndex: region.pointData[0].SeriesIndex, PointIndex: region.pointData[0].Index };\r\n var pieActualIndex = this.model._isPieOfPie ? region.pointData[0].PointIndex : region.region.Series._visiblePoints[region.pointData[0].Index].actualIndex;\r\n if (explodePoint != pieActualIndex && !region.region.Series.explodeAll) {\r\n series.explodeIndex = pieActualIndex;\r\n pieSeriesIndex = region.pointData[0].PieSeriesIndex;\r\n if (!ej.util.isNullOrUndefined(this.model.explodeValue) && this.model.explodeValue != currentExplodePoint) {\r\n if (this.model.explodeValue.SeriesIndex != region.region.SeriesIndex)\r\n series = this.model._visibleSeries[this.model.explodeValue.SeriesIndex];\r\n var visiblePoint = this.model._isPieOfPie ? this._getPieOfPiePoint(this.model.explodeValue.PointIndex, series) : series._visiblePoints[this.model.explodeValue.Index];\r\n var result = seriesType._calculateArcData(this, this.model.explodeValue.PointIndex, visiblePoint, series, this.model.explodeValue.SeriesIndex, this.model.explodeValue.PieSeriesIndex);\r\n id = this.svgObject.id + '_SeriesGroup' + '_' + this.model.explodeValue.SeriesIndex;\r\n\r\n targetElement = (this.model.explodeValue.PieSeriesIndex == 1) ? $(this.gSeriesEle).children('#' + id)[1] : $(this.gSeriesEle).children('#' + id)[0];\r\n var elements = $(targetElement).children();\r\n for (var i = 0; i < elements.length; i++) {\r\n var element = elements[i];\r\n var index = this.svgRenderer._getAttrVal($(element)[0], \"data-pointIndex\");\r\n if (parseInt(index) == this.model.explodeValue.PointIndex) {\r\n this.svgRenderer._setAttr($(element), { 'd': result.Direction });\r\n break;\r\n }\r\n }\r\n\r\n seriesType.drawDataLabelAcc(this, series, this.model.explodeValue.Index, visiblePoint, this.model.explodeValue.SeriesIndex, this.model.explodeValue.PieSeriesIndex)\r\n\r\n }\r\n\r\n var seriesPoint = this.model._isPieOfPie ? this._getPieOfPiePoint(data.region.Region.PointIndex, series) : series._visiblePoints[region.pointData[0].Index];\r\n\r\n result = seriesType._calculateArcData(this, region.pointData[0].PointIndex, seriesPoint, region.region.Series, seriesIndex, pieSeriesIndex);\r\n\r\n id = this.svgObject.id + '_SeriesGroup' + '_' + region.region.SeriesIndex;\r\n targetElement = pieSeriesIndex == 1 ? $(this.gSeriesEle).children('#' + id)[1] : $(this.gSeriesEle).children('#' + id)[0];\r\n\r\n\r\n var elements = $(targetElement).children();\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n var element = elements[i];\r\n var index = this.svgRenderer._getAttrVal($(element)[0], \"data-pointIndex\");\r\n if (parseInt(index) == region.pointData[0].PointIndex) {\r\n this.svgRenderer._setAttr($(element), { 'd': result.Direction });\r\n break;\r\n }\r\n }\r\n if (this.model.enableCanvasRendering) {\r\n var chartRect = document.getElementById(this.svgObject.id).getClientRects()[0];\r\n this.svgRenderer.ctx.clearRect(chartRect.left, chartRect.top, chartRect.width, chartRect.height);\r\n $(\"#\" + this._id).ejChart(\"redraw\");\r\n }\r\n\r\n\r\n seriesType.drawDataLabelAcc(this, series, region.pointData[0].Index, seriesPoint, seriesIndex, pieSeriesIndex)\r\n\r\n\r\n this.model.explodeValue = { SeriesIndex: region.pointData[0].SeriesIndex, PointIndex: region.pointData[0].PointIndex, Index: region.pointData[0].Index, PieSeriesIndex: region.pointData[0].PieSeriesIndex };\r\n }\r\n region.region.Series.explodeIndex = explodePoint;\r\n },\r\n displayGroupingTemplate: function (x, y, location, seriesPoint, series, serIndex, ptIndex, chartLoc, seriescolor) {\r\n var point = [], color = [], childNode = [], seriesCollection = [], seriesLength, padding, templateLocX, templateLocY, xLoc, yLoc, div;\r\n color = $.extend(true, {}, seriescolor);\r\n seriesCollection = $.extend(true, {}, series);\r\n seriesLength = Object.keys(seriesCollection).length;// calculate object length.\r\n point = $.extend(true, {}, seriesPoint);\r\n padding = 5;\r\n for (var i = 0; i < seriesLength; i++) {\r\n isTrans = seriesCollection[i].series.isTransposed;\r\n point[i].point.x = point[i].point.x;\r\n if (seriesCollection[i].series.xAxis._valueType.toLowerCase() == \"datetime\")\r\n point[i].point.x = (ej.format(new Date(point[i].point.x), (ej.EjSvgRender.utils._dateTimeLabelFormat(seriesCollection[i].series.xAxis.intervalType, seriesCollection[i].series.xAxis))));\r\n if (seriesCollection[i].series.xAxis._valueType.toLowerCase() == \"category\") point[i].point.x = ej.EjSvgRender.utils._getLabelContent(ptIndex, seriesCollection[i].series.xAxis);\r\n x = ej.util.isNullOrUndefined(x) ? 0 : x;\r\n y = ej.util.isNullOrUndefined(y) ? 0 : y;\r\n templateLocX = this.model.m_AreaBounds.X;\r\n templateLocY = this.model.m_AreaBounds.Y;\r\n xLoc = (isTrans) ? seriesCollection[i].series.yAxis.y : location.X + x + templateLocX + this.model.crosshair.marker.size.width + padding;\r\n yLoc = (isTrans) ? seriesCollection[i].series.xAxis.x + location.Y : this.model.m_AreaBounds.Height / 2 + templateLocY;\r\n div = $(\"#\" + this.model.crosshair.trackballTooltipSettings.tooltipTemplate).clone();\r\n $(div).css(\"background-color\", color[i].seriesColor);\r\n $(div).css(\"display\", \"block\");\r\n point[i].point.count = 1;\r\n series.count = length;\r\n var data = { series: series, point: point[i].point };\r\n childNode.push($(div).html($(div).html().parseTemplate(data)));\r\n }\r\n if ($(\"#\" + this.svgObject.id + \"_TrackGroupToolTipTemplate\").length == 0) {\r\n tooltipdiv = $(\"
\");\r\n $(tooltipdiv).appendTo(this.chartContainer);\r\n }\r\n $(tooltipdiv).append(childNode);\r\n var border = this.model.crosshair.trackballTooltipSettings.border;\r\n $(tooltipdiv).css(\"border\", border.width + \"px solid \" + border.color);\r\n var templateHeight = parseFloat($(tooltipdiv).css('height'));\r\n var templateWidth = parseFloat($(tooltipdiv).css('width'));\r\n\r\n yLoc = (isTrans) ? yLoc : yLoc - templateHeight / 2;\r\n\r\n if ((seriesLength == 1) && !isTrans) {\r\n yLoc = location.Y + templateLocY + templateHeight / 2;\r\n }\r\n if (seriesLength == 1 && isTrans) {\r\n xLoc = location.X + x + templateLocX + this.model.crosshair.marker.size.width + padding - templateWidth / 2;\r\n yLoc = location.Y + templateLocY - templateHeight - this.model.crosshair.marker.size.height - padding;\r\n }\r\n if ((yLoc + (templateHeight)) < this.model.m_AreaBounds.Y) {\r\n yLoc = this.model.m_AreaBounds.Y;\r\n } else if ((yLoc + (templateHeight / 2)) > (this.model.m_AreaBounds.Height)) {\r\n yLoc -= templateHeight;\r\n }\r\n if ((xLoc + templateWidth > templateLocX + this.model.m_AreaBounds.Width) && (!isTrans)) {\r\n xLoc = location.X + x + templateLocX - this.model.crosshair.marker.size.width - padding - templateWidth;\r\n }\r\n\r\n $(tooltipdiv).css(\"left\", xLoc);\r\n $(tooltipdiv).css(\"top\", yLoc);\r\n\r\n },\r\n displayTemplateTooltip: function (x, y, location, seriesPoint, series, serIndex, ptIndex, chartLoc) {\r\n var point = $.extend(true, {}, seriesPoint);\r\n var padding = 5;\r\n point.x = point.x;\r\n if (series.xAxis._valueType.toLowerCase() == \"datetime\")\r\n point.x = (ej.format(new Date(point.x), (ej.EjSvgRender.utils._dateTimeLabelFormat(series.xAxis.intervalType, series.xAxis))));\r\n if (series.xAxis._valueType.toLowerCase() == \"category\") point.x = ej.EjSvgRender.utils._getLabelContent(ptIndex, series.xAxis);\r\n x = ej.util.isNullOrUndefined(x) ? 0 : x;\r\n y = ej.util.isNullOrUndefined(y) ? 0 : y;\r\n var templateLocX = this.model.m_AreaBounds.X;\r\n var axes = this.model._axes, pointXAxis = series._xAxisName, pointYAxis = series._yAxisName;\r\n var axisY, axisX;\r\n for (var j = 0, len = axes.length; j < len; j++) {\r\n if (pointXAxis == axes[j].name) {\r\n if (!series._isTransposed) {\r\n axisX = axes[j].Location.X1;\r\n } else {\r\n axisY = axes[j].Location.Y1;\r\n }\r\n } else if (pointYAxis == axes[j].name) {\r\n if (!series._isTransposed) {\r\n axisY = axes[j].Location.Y2;\r\n } else {\r\n axisX = axes[j].Location.X2;\r\n }\r\n }\r\n }\r\n var xLoc = location.X + this.model.crosshair.marker.size.width + axisX;\r\n var yLoc = location.Y + y + axisY;\r\n var tooltipdiv;\r\n if ($(\"#\" + this.svgObject.id + \"_TrackToolTipTemplate_\" + serIndex).length == 0) {\r\n tooltipdiv = $(\"
\");\r\n $(document.body).append(tooltipdiv);\r\n }\r\n if (this.model.crosshair.trackballTooltipSettings.tooltipTemplate != null) {\r\n var cloneNode = document.getElementById(this.model.crosshair.trackballTooltipSettings.tooltipTemplate).cloneNode(true);\r\n $(cloneNode).css(\"display\", \"block\").appendTo(tooltipdiv);\r\n series.count = 1;\r\n point.count = 1;\r\n var seriesColor = this.getSeriesColor(point, serIndex, series);\r\n $(tooltipdiv).css(\"background-color\", jQuery.type(seriesColor) == \"array\" ? seriesColor[0].color : seriesColor);\r\n var data = { series: series, point: point };\r\n $(tooltipdiv).html($(tooltipdiv).html().parseTemplate(data));\r\n }\r\n yLoc -= parseFloat($(tooltipdiv).css('height')) / 2;\r\n var templateHeight = parseFloat($(tooltipdiv).css('height'));\r\n var templateWidth = parseFloat($(tooltipdiv).css('width'));\r\n if (series.isTransposed) {\r\n yLoc = (location.Y + this.model.m_AreaBounds.Y) - templateHeight - padding - this.model.crosshair.marker.size.height;\r\n xLoc = location.X + templateLocX - templateWidth / 2;\r\n }\r\n if ((yLoc + templateHeight < this.model.m_AreaBounds.Y) && (series.isTransposed)) {\r\n yLoc += templateHeight + this.model.crosshair.marker.size.height + padding + chartLoc.top;\r\n }\r\n if (xLoc + templateWidth > templateLocX + this.model.m_AreaBounds.Width) {\r\n xLoc -= (templateWidth + (padding * 2) + this.model.crosshair.marker.size.width);\r\n }\r\n $(tooltipdiv).css(\"left\", xLoc);\r\n $(tooltipdiv).css(\"top\", yLoc);\r\n },\r\n displayAxisTooltip: function (location, text, axis, index, mouseLoc, tracker) {\r\n\r\n if (axis._valueType.toLowerCase() == \"double\") {\r\n var customFormat = (!(axis.labelFormat)) ? null : axis.labelFormat.match('{value}');\r\n text = (!(axis.labelFormat)) ? text : (customFormat != null) ? (axis.labelFormat == \"${value}\") ? axis.labelFormat.replace('{value}', '$' + Number(text)) : axis.labelFormat.replace('{value}', Number(text)) : (ej.format(Number(text), axis.labelFormat, this.model.locale));\r\n }\r\n var maxTickSize = 0,\r\n orientation = axis.orientation.toLowerCase(), position,\r\n hPadding = 0,\r\n vPadding = 0,\r\n opposedPosition = axis._opposed,\r\n enableCanvas = this.model.enableCanvasRendering,\r\n maxLocation = opposedPosition ? ((maxTickSize + 10) + (axis.x + axis.width)) : (axis.x + axis.width);\r\n for (var i = 0; i < this.model._axes.length; i++) {\r\n if (this.model._axes[i].majorTickLines.size > maxTickSize) {\r\n maxTickSize = this.model._axes[i].majorTickLines.size;\r\n }\r\n }\r\n\r\n if (location.X >= 0 && location.X <= maxLocation) {\r\n var x = (location.X);\r\n var y = location.Y;\r\n var padding = 5;\r\n var commonTrackTextArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonTrackTextArgs.data = { axisIndex: index, chartAxis: axis, currentTrackText: text, location: mouseLoc };\r\n this._trigger(\"trackAxisToolTip\", commonTrackTextArgs);\r\n\r\n var trackAxisText = commonTrackTextArgs.data.currentTrackText;\r\n\r\n var textOffset = ej.EjSvgRender.utils._measureText(trackAxisText, null, axis.crosshairLabel.font);\r\n if (orientation == 'horizontal') {\r\n x = x - textOffset.width / 2;\r\n if (axis.labelPosition == 'inside' || (opposedPosition ? mouseLoc.y < axis.y : mouseLoc.y > axis.y)) {\r\n if (opposedPosition == false) {\r\n y = axis.y - textOffset.height + maxTickSize - (axis._isScroll ? this.model.scrollerSize : 0);\r\n position = \"top\";\r\n }\r\n if (opposedPosition == true) {\r\n y = axis.y + textOffset.height - maxTickSize;\r\n position = \"bottom\";\r\n }\r\n }\r\n else {\r\n if (opposedPosition == true) {\r\n y = axis.y - textOffset.height / 2 - padding - maxTickSize;\r\n position = \"bottom\";\r\n }\r\n if (opposedPosition == false) {\r\n y = axis.y + textOffset.height - padding + maxTickSize;\r\n position = \"top\";\r\n }\r\n }\r\n hPadding = padding;\r\n y = y + (axis._isScroll ? (axis.opposedPosition ? -this.model.scrollerSize : this.model.scrollerSize) : 0);\r\n }\r\n if (!(opposedPosition) && (x + textOffset.width) > (this.model.m_AreaBounds.Width + this.model.m_AreaBounds.X)) {\r\n x = ((this.model.m_AreaBounds.Width + this.model.m_AreaBounds.X) - textOffset.width) + padding + this.model.elementSpacing;\r\n }\r\n if (orientation == 'vertical') {\r\n y = location.Y + textOffset.height / 4;\r\n if (axis.labelPosition == 'inside' || (!opposedPosition && mouseLoc.x < axis.x)) {\r\n if (opposedPosition == true) {\r\n x = axis.x - textOffset.width + padding - maxTickSize;\r\n position = \"left\";\r\n }\r\n if (opposedPosition == false) {\r\n // Space between the marker and the trackball\r\n x = axis.x + 2 * padding + (axis._isScroll ? this.model.scrollerSize : 0);\r\n position = \"right\";\r\n }\r\n } else {\r\n if (opposedPosition == true) {\r\n // Space between the marker and the trackball\r\n x = axis.x + 3 * padding;\r\n position = \"left\";\r\n }\r\n if (opposedPosition == false) {\r\n x = axis.x - textOffset.width - maxTickSize;\r\n position = \"right\";\r\n }\r\n }\r\n x = x + (axis._isScroll ? (axis.opposedPosition ? this.model.scrollerSize : -this.model.scrollerSize) : 0);\r\n vPadding = padding;\r\n }\r\n\r\n var textAxisOptions = {\r\n 'id': this.svgObject.id + '_AxisToolTipText' + '_' + index,\r\n 'x': x - vPadding,\r\n 'y': y + hPadding,\r\n 'fill': axis.crosshairLabel.font.color,\r\n 'font-size': axis.crosshairLabel.font.size,\r\n 'font-family': axis.crosshairLabel.font.fontFamily,\r\n 'font-style': axis.crosshairLabel.font.fontStyle,\r\n 'font-weight': axis.crosshairLabel.font.fontWeight,\r\n 'text-anchor': 'start',\r\n 'opacity': axis.crosshairLabel.font.opacity\r\n\r\n };\r\n var canvasPadding = (enableCanvas) ? padding / 4 : 0,\r\n fontSize = ej.EjSvgRender.utils._measureText(commonTrackTextArgs.data.currentTrackText, this.model.m_AreaBounds.Width, axis.crosshairLabel.font),\r\n crosshairLabel = axis.crosshairLabel,\r\n x = (x - padding),\r\n y = (y - (fontSize.height)),\r\n width = (fontSize.width) + (2 * padding),\r\n height = (2 * fontSize.height) - (2 * padding);\r\n var toolAxisRectOptions = {\r\n 'x': x - vPadding,\r\n 'y': y + hPadding,\r\n 'width': width,\r\n 'height': height,\r\n 'rx': crosshairLabel.rx * ((enableCanvas) ? 2 : 1),\r\n 'ry': crosshairLabel.ry * ((enableCanvas) ? 2 : 1)\r\n };\r\n var direction = ej.EjSvgRender.utils._calculateroundedCorner(null, toolAxisRectOptions, true, position, 0, tracker);\r\n toolAxisRectOptions = {\r\n 'id': this.svgObject.id + '_AxisToolTipRect' + '_' + index,\r\n 'd': direction,\r\n 'fill': crosshairLabel.fill,\r\n 'stroke-width': crosshairLabel.border.width,\r\n 'stroke': crosshairLabel.border.color\r\n };\r\n\r\n var axes = this.model._axes[index];\r\n if ((mouseLoc.y < (axes.y + axes.height) && mouseLoc.y > axes.y) || (mouseLoc.x < (axes.x + axes.width) && mouseLoc.x > axes.x)) {\r\n this.svgRenderer._setAttr($('#' + this.svgObject.id + '_AxisToolTipRect' + '_' + index), { \"display\": 'block' });\r\n this.svgRenderer._setAttr($('#' + this.svgObject.id + '_AxisToolTipText' + '_' + index), { \"display\": 'block' });\r\n toolAxisRectOptions.display = 'block';\r\n }\r\n else {\r\n this.svgRenderer._setAttr($('#' + this.svgObject.id + '_AxisToolTipRect' + '_' + index), { \"display\": 'none' });\r\n this.svgRenderer._setAttr($('#' + this.svgObject.id + '_AxisToolTipText' + '_' + index), { \"display\": 'none' });\r\n toolAxisRectOptions.display = 'none';\r\n }\r\n if (enableCanvas) {\r\n var obj = this.svgRenderer.createCrosshairCanvas();\r\n obj.ctx = obj.getContext('2d');\r\n }\r\n else\r\n var obj = this.svgRenderer;\r\n this.svgRenderer.drawPath.call(obj, toolAxisRectOptions, this.gTrackAxisEle);\r\n this.svgRenderer.drawText.call(obj, textAxisOptions, commonTrackTextArgs.data.currentTrackText, this.gTrackAxisEle);\r\n }\r\n },\r\n maxWdithArrayCollection: function (arrayCollection, font) {\r\n var maxTextWidth = 0, size, width = 0, height = 0,\r\n measureText = ej.EjSvgRender.utils._measureText;\r\n for (var txt = 0, txtlength = arrayCollection.length; txt < txtlength; txt++) {\r\n size = measureText(arrayCollection[txt], 0, font);\r\n width = size.width;\r\n height += size.height;\r\n maxTextWidth = (maxTextWidth == 0) ? width : (maxTextWidth < width) ? width : maxTextWidth;\r\n }\r\n return { maxTextWidth: maxTextWidth, totalHeight: height };\r\n },\r\n displayTooltip: function (grouping, tooltipCollections, maxWidth) {\r\n // common variables for both grouping and float\r\n var crosshair = this.model.crosshair, trackball = crosshair.trackballTooltipSettings, rx = trackball.rx, ry = trackball.ry, trackballBorder = trackball.border,\r\n m_AreaBounds = this.model.m_AreaBounds;\r\n if (grouping) {\r\n var series = tooltipCollections.series, groupSize, groupHeight, container = document.getElementById(this._id),\r\n offset = $(container).offset(),\r\n rectOptions = series.tooltip, font = rectOptions.font ? $.extend(false, series.font, {}, rectOptions.font) : series.font,\r\n point = series.type == \"boxandwhisker\" ? tooltipCollections.point.boxPlotLocation[3] : tooltipCollections.point.location,\r\n m_width = ((series.marker.size.width / 2 + series.marker.border.width + trackballBorder.width)) + 5,// 5 for space between group element and tracker\r\n yAxisY = ((series._isTransposed) ? (series.xAxis.y + m_width) : series.yAxis.y),\r\n xAxisX = ((series._isTransposed) ? series.yAxis.x : (series.xAxis.x + m_width)),\r\n location = { X: xAxisX + point.X, Y: yAxisY + point.Y },\r\n textCollection = tooltipCollections.textCollection, textOptionsCollection = tooltipCollections.textOptionsCollection,\r\n groupingTextId = tooltipCollections.groupingTextId,\r\n options, span,\r\n groupLocation = { X: (location.X), Y: location.Y },\r\n groupElement = document.getElementById(this._id + \"_trackball_grouping_tooltip\");\r\n this._trigger(\"trackToolTip\", { data: { currentText: textCollection, location: groupLocation } });\r\n if (!ej.util.isNullOrUndefined(this.model.trackToolTip) && this.model.trackToolTip != \"\") {\r\n for (var tx = 0, len = textCollection.length; tx < len - 1; tx++) {\r\n if (textCollection[tx].text == \"\") {\r\n textCollection.splice(tx, 1);\r\n textOptionsCollection.splice(tx, 1);\r\n groupingTextId.splice(tx, 1);\r\n }\r\n }\r\n }\r\n if (ej.util.isNullOrUndefined(groupElement)) {\r\n groupElement = document.createElement(\"div\");\r\n options = {\r\n 'left': groupLocation.X,\r\n 'top': groupLocation.Y,\r\n 'border': parseInt((trackballBorder.width) ? trackballBorder.width : 1) + \"px solid \" + ((trackballBorder.color) ? trackballBorder.color : \"#000000\"),\r\n 'background': (trackball.fill) ? trackball.fill : \"#ffffff\",\r\n 'opacity': trackball.opacity,\r\n 'position': 'absolute',\r\n 'height': 'auto',\r\n 'width': 'auto',\r\n 'border-radius': rx + \"px \" + ry + \"px\",\r\n 'pointer-events': 'none'\r\n };\r\n groupElement.setAttribute('id', this._id + \"_trackball_grouping_tooltip\");\r\n }\r\n else {\r\n options = {\r\n 'left': groupLocation.X,\r\n 'top': groupLocation.Y,\r\n }\r\n }\r\n for (var tx = 0, len = textCollection.length; tx < len; tx++) {\r\n span = document.createElement(\"span\");\r\n span.setAttribute(\"id\", groupingTextId[tx]);\r\n span.innerHTML = textCollection[tx].text + \"
\";\r\n $(span).css(textOptionsCollection[tx]);\r\n groupElement.appendChild(span);\r\n }\r\n var arrayCollection = textCollection.map(function (a) { return a.text; });\r\n groupSize = this.maxWdithArrayCollection(arrayCollection, font);\r\n maxWidth = groupSize.maxTextWidth;\r\n groupHeight = groupSize.totalHeight;\r\n options.top = (series._isTransposed) ? options.top : (options.top - (groupHeight * 0.5));\r\n options.left = (series._isTransposed) ? (options.left - (maxWidth * 0.5)) : options.left;\r\n if (textCollection.length > 1) {\r\n options.top = (series._isTransposed) ? options.top : (yAxisY + (m_AreaBounds.Height * 0.5 - (0.5 * groupHeight)));\r\n options.left = (series._isTransposed) ? (((m_AreaBounds.Width / 2) + m_AreaBounds.X) - (maxWidth * 0.5)) : options.left;\r\n }\r\n if (!series._isTransposed) {\r\n if (options.left + maxWidth >= (m_AreaBounds.X + m_AreaBounds.Width))\r\n options.left -= (maxWidth + (m_width + trackballBorder.width) * 2);// extra space on edge group element swifting for already added need to remove \r\n }\r\n else {\r\n\r\n if ((groupHeight + options.top) > (m_AreaBounds.Y + m_AreaBounds.Height))\r\n options.top -= (groupHeight + (m_width * 2));// extra space on edge group element swifting\r\n }\r\n options.left = (groupLocation.X == location.X) ? options.left : groupLocation.X;\r\n options.top = (groupLocation.Y == location.Y) ? options.top : groupLocation.Y;\r\n $(groupElement).css(options);\r\n $(groupElement).appendTo(this.chartContainer);\r\n\r\n }\r\n else {\r\n for (var init = 0, tlength = tooltipCollections.length; init < tlength; init++) {\r\n\r\n var location = tooltipCollections[init].Point, point = tooltipCollections[init].ClosestPoint, series = tooltipCollections[init].Series, pointIndex = tooltipCollections[init].ClosestPointIndex, tgap = tooltipCollections[init].Tgap,\r\n seriesIndex = $.inArray(series, this.model._visibleSeries),\r\n Axis = { X1: m_AreaBounds.X, Y1: (m_AreaBounds.Y + m_AreaBounds.Height), X2: (m_AreaBounds.X + m_AreaBounds.Width), Y2: m_AreaBounds.Y },\r\n axes = this.model._axes, pointXAxis = series._xAxisName, pointYAxis = series._yAxisName;\r\n\r\n for (var j = 0, len = axes.length; j < len; j++) {\r\n if (pointXAxis == axes[j].name) {\r\n if (!series._isTransposed)\r\n Axis.X1 = axes[j].Location.X1, Axis.X2 = axes[j].Location.X2;\r\n else\r\n Axis.Y1 = axes[j].Location.Y1, Axis.Y2 = axes[j].Location.Y2;\r\n }\r\n else if (pointYAxis == axes[j].name) {\r\n if (!series._isTransposed)\r\n Axis.Y1 = axes[j].Location.Y1, Axis.Y2 = axes[j].Location.Y2;\r\n else\r\n Axis.X1 = axes[j].Location.X1, Axis.X2 = axes[j].Location.X2;\r\n }\r\n }\r\n location.X = (series.type == \"boxandwhisker\") ? location.X + Axis.X1 : location.X;\r\n location.Y = (series.type == \"boxandwhisker\") ? location.Y + Axis.Y2 : location.Y;\r\n if ((location.X >= Axis.X1 && location.X <= Axis.X2 && location.Y >= Axis.Y2 && location.Y <= Axis.Y1) || (grouping)) {\r\n var requireInvertedAxes = this.model.requireInvertedAxes, tx, ty,\r\n x = location.X + (!series.isIndicator ? ((ej.util.isNullOrUndefined(series._trackMarker)) ? series.marker.size.width : (series._trackMarker.size.width)) : 0) + padding + 1,\r\n y = (location.Y), format = series.tooltip.format, numberToFixed = ((ej.util.isNullOrUndefined(series.yAxis.roundingPlaces)) ? 2 : series.yAxis.roundingPlaces);\r\n if (tooltipCollections[init].Series.type == \"boxandwhisker\" && location.outlier)\r\n var trackTooltipText = this.getTooltipFormat(point, series, seriesIndex, pointIndex, format, location);\r\n else\r\n var trackTooltipText = this.getTooltipFormat(point, series, seriesIndex, pointIndex, format, numberToFixed);\r\n var seriesName = (series.name) ? (series.name).replace(' ', '') : \"series\" + seriesIndex, commonTrackTextArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs),\r\n toolRectOptions, direction;\r\n commonTrackTextArgs.data = { Location: { X: x, Y: y }, Series: series, serIndex: seriesIndex, pointIndex: pointIndex, currentText: trackTooltipText.text };\r\n this._trigger(\"trackToolTip\", commonTrackTextArgs);\r\n if (!commonTrackTextArgs.cancel) {\r\n x = commonTrackTextArgs.data.Location.X;\r\n y = commonTrackTextArgs.data.Location.Y;\r\n var padding = this.model.tooltipPadding, tip_pos = tgap, rectOptions = series.tooltip, font = rectOptions.font ? $.extend(false, series.font, {}, rectOptions.font) : series.font, textOffset = ej.EjSvgRender.utils._measureText(commonTrackTextArgs.data.currentText, series.xAxis.width, font), seriesColor = this.getSeriesColor(point, seriesIndex, series);\r\n var toolTipOptions = this.getTooltipOptions(seriesColor, series), rectBorderColor = toolTipOptions.rectBColor, rectFillColor = toolTipOptions.rectFColor, textColor = toolTipOptions.rectTextColor, rectWidth = textOffset.width + (2 * padding), rectHeight = textOffset.height + (2 * padding), poly, tipOpen = (requireInvertedAxes) ? ((rectWidth * 10) / 100) : ((rectHeight * 30) / 100),\r\n axisWidth = (requireInvertedAxes) ? series.yAxis.width : series.xAxis.width, tooltipStartPosition = (requireInvertedAxes) ? (tgap + location.X - rectWidth / 2) : (tgap + location.Y - rectHeight / 2), tooltipEndPosition = (requireInvertedAxes) ? (tgap + location.X + rectWidth / 2) : (tgap + location.Y + rectHeight / 2), boundryStart = (requireInvertedAxes) ? (m_AreaBounds.X) : (m_AreaBounds.Y), boundryEnd = (requireInvertedAxes) ? (m_AreaBounds.X + m_AreaBounds.Width) : (m_AreaBounds.Y + m_AreaBounds.Height), text_pos = [],\r\n marker_width = 3 + crosshair.marker.border.width + ((!requireInvertedAxes) ? crosshair.marker.size.width : crosshair.marker.size.height) / 2,\r\n swp = (!this.model.financial) ? marker_width + 5 : 0, type = series.type.toLowerCase(),\r\n position, hsize = type.indexOf(\"rangearea\") == 0 ? this.model.crosshair.marker.size.height / 2 : 0;\r\n if ((tooltipStartPosition >= boundryStart && tooltipEndPosition <= (boundryEnd)) || this.model.financial) {\r\n if (requireInvertedAxes) {\r\n if (location.Y - swp - maxWidth < m_AreaBounds.Y) {\r\n toolRectOptions = {\r\n 'x': location.X - rectWidth / 2 + tip_pos,\r\n 'y': location.Y + swp,\r\n 'width': rectWidth,\r\n 'height': rectHeight,\r\n 'rx': rx,\r\n 'ry': ry\r\n };\r\n text_pos.push({ X: location.X - rectWidth / 2 + padding + tip_pos, Y: location.Y + swp + rectHeight / 2 - padding });\r\n position = \"top\";\r\n\r\n } else {\r\n if (this.model.financial) {\r\n x = location.X - rectWidth / 2 + tip_pos; y = location.Y + padding + hsize; tx = x + padding; ty = y + 2 * padding;\r\n position = \"top\";\r\n }\r\n else {\r\n x = location.X - rectWidth / 2 + tip_pos; y = location.Y - swp - rectHeight; tx = location.X - rectWidth / 2 + padding + tip_pos; ty = location.Y - swp - rectHeight / 2 - padding;\r\n position = \"bottom\";\r\n }\r\n toolRectOptions = {\r\n 'x': x,\r\n 'y': y,\r\n 'width': rectWidth,\r\n 'height': rectHeight,\r\n 'rx': rx,\r\n 'ry': ry\r\n };\r\n text_pos.push({ X: tx, Y: ty });\r\n\r\n }\r\n }\r\n else {\r\n\r\n if (location.X + swp + maxWidth - m_AreaBounds.X >= axisWidth) {\r\n if (this.model.financial) {\r\n x = location.X - rectWidth / 2; y = location.Y - rectHeight - padding - hsize; tx = x + padding; ty = y + tip_pos + rectHeight;\r\n position = \"bottom\";\r\n }\r\n else {\r\n x = location.X - swp - rectWidth; y = location.Y - rectHeight / 2 + tip_pos; tx = x + padding; ty = location.Y + tip_pos + rectHeight / 2;\r\n position = \"right\";\r\n }\r\n toolRectOptions = {\r\n 'x': x,\r\n 'y': y,\r\n 'width': rectWidth,\r\n 'height': rectHeight,\r\n 'rx': rx,\r\n 'ry': ry\r\n };\r\n\r\n text_pos.push({ X: tx, Y: ty });\r\n\r\n }\r\n else {\r\n if (this.model.financial) {\r\n x = location.X - rectWidth / 2; y = location.Y - hsize - rectHeight - 2 * padding; tx = x + padding; ty = y + tip_pos + rectHeight;\r\n position = \"bottom\";\r\n }\r\n else {\r\n x = location.X + swp; y = location.Y - rectHeight / 2 + tip_pos; tx = x + padding; ty = location.Y + tip_pos + rectHeight / 2;\r\n position = \"left\";\r\n }\r\n\r\n toolRectOptions = {\r\n 'x': x,\r\n 'y': y,\r\n 'width': rectWidth,\r\n 'height': rectHeight,\r\n 'rx': rx,\r\n 'ry': ry\r\n };\r\n\r\n text_pos.push({ X: tx, Y: ty });\r\n\r\n\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n var tooltipfill = seriesColor;\r\n if (typeof (tooltipfill) == \"object\") {\r\n tooltipfill = seriesColor[1].color;\r\n }\r\n\r\n\r\n\r\n var text = commonTrackTextArgs.data.currentText, fontText = text, fontSize = ej.EjSvgRender.utils._measureText(text, series.xAxis.width, font).height, len;\r\n if (commonTrackTextArgs.data.currentText.indexOf(\"
\") >= 0) {\r\n text = commonTrackTextArgs.data.currentText.split(\"
\");\r\n fontText = text[0];\r\n if (!requireInvertedAxes) {\r\n var isCandle = (type.indexOf(\"candle\") >= 0 || type.indexOf(\"hiloopenclose\") >= 0) || false;\r\n if (location.X + swp + maxWidth - m_AreaBounds.X >= axisWidth) {\r\n if (!this.model.financial) {\r\n tx = location.X - rectWidth - swp + padding;\r\n ty = ((location.Y + tip_pos) - (rectHeight / 2) + fontSize / text.length);\r\n }\r\n else {\r\n tx = location.X - rectWidth / 2 + padding;\r\n ty = ((location.Y + tip_pos) - (rectHeight)) - hsize + ((isCandle) ? 0 : 2 * padding);\r\n toolRectOptions.y -= (isCandle) ? padding * 3 : padding;\r\n toolRectOptions.height += (isCandle) ? padding * 2 : padding;\r\n }\r\n\r\n\r\n text_pos.push({ X: tx, Y: ty });\r\n }\r\n else {\r\n if (!this.model.financial) {\r\n tx = location.X + swp + padding;\r\n ty = ((location.Y + tip_pos) - (rectHeight / 2) + fontSize / text.length);\r\n }\r\n else {\r\n\r\n tx = location.X - rectWidth / 2 + padding;\r\n ty = ((location.Y + tip_pos) - (rectHeight)) - hsize + ((isCandle) ? 0 : padding);\r\n toolRectOptions.y -= (isCandle) ? padding * 2 : padding;\r\n toolRectOptions.height += (isCandle) ? padding * 2 : padding;\r\n }\r\n text_pos.push({ X: tx, Y: ty });\r\n }\r\n }\r\n else {\r\n if (location.Y - swp - maxWidth < m_AreaBounds.Y) {\r\n text_pos.push({ X: location.X - rectWidth / 2 + padding + tip_pos, Y: location.Y + swp + (fontSize / text.length) });\r\n }\r\n else {\r\n if (!this.model.financial) {\r\n tx = location.X - rectWidth / 2 + padding + tip_pos;\r\n ty = location.Y - swp - rectHeight + (fontSize / text.length);\r\n }\r\n else {\r\n tx = location.X - rectWidth / 2 + padding + tip_pos;\r\n ty = (location.Y + 4 * padding) + hsize;\r\n }\r\n text_pos.push({ X: tx, Y: ty });\r\n }\r\n }\r\n fontSize = 0;\r\n }\r\n len = text_pos.length - 1;\r\n fontSize = (requireInvertedAxes) ? fontSize : -fontSize;\r\n var index = series.type == \"boxandwhisker\" ? init : pointIndex;\r\n var textOptions = {\r\n 'id': this.svgObject.id + '_ToolTipText' + '_' + seriesIndex + \"_\" + index,\r\n 'x': text_pos[len].X,\r\n 'y': text_pos[len].Y + fontSize / 2,\r\n 'fill': rectOptions.font ? (rectOptions.font.color ? rectOptions.font.color : \"#ffffff\") : \"#ffffff\",\r\n 'font-size': font.size,\r\n 'font-family': font.fontFamily,\r\n 'font-style': font.fontStyle,\r\n 'font-weight': font.fontWeight,\r\n 'text-anchor': 'start',\r\n 'isTrackball': true,\r\n 'padding': this.model.tooltipPadding\r\n };\r\n\r\n direction = ej.EjSvgRender.utils._calculateroundedCorner(null, toolRectOptions, true, position, tip_pos);\r\n\r\n var arrowPath = {\r\n 'id': this.svgObject.id + '_gTooltip_' + seriesIndex + '_' + index,\r\n 'd': direction,\r\n 'fill': ((trackball.fill) ? trackball.fill : tooltipfill),\r\n \"stroke-width\": parseInt(trackball.border.width ? trackball.border.width : 0) + \"px\",\r\n \"stroke\": trackball.border.color ? trackball.border.color : 'transparent',\r\n 'fill-opacity': trackball.opacity\r\n };\r\n\r\n if (this.model.enableCanvasRendering) {\r\n var obj = this.svgRenderer.createCrosshairCanvas();\r\n obj.ctx = obj.getContext('2d');\r\n }\r\n\r\n else\r\n var obj = this.svgRenderer;\r\n\r\n\r\n var gTooltip = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_gTooltip_' + seriesIndex + \"_\" + index, });\r\n\r\n this.svgRenderer.drawPath.call(obj, arrowPath, gTooltip);\r\n this.svgRenderer.drawText.call(obj, textOptions, text, gTooltip, font);\r\n\r\n }\r\n }\r\n\r\n if ($('#' + this.svgObject.id + \"_TrackToolTip_\" + seriesIndex).length == 0)\r\n this.svgRenderer.append($(gTooltip), this.gTrackball);\r\n }\r\n }\r\n }\r\n },\r\n SmartTooltipPosition: function (SmartTooltipOptions) {\r\n var InitialRanges = [[], []], exceed, length_SmartTooltips = SmartTooltipOptions.length, visibleLocation = [], totalSapce = (SmartTooltipOptions[0].Series._isTransposed) ? this.model.m_AreaBounds.Width : this.model.m_AreaBounds.Height, tooltipPadding = this.model.tooltipPadding, tooltipWidth = -tooltipPadding;\r\n for (var a = 0; a < length_SmartTooltips; a++) {\r\n InitialRanges[0][a] = $.extend({}, SmartTooltipOptions[a].StEnd);\r\n InitialRanges[1][a] = { yAxis: SmartTooltipOptions[a].Series._yAxisName, xAxis: SmartTooltipOptions[a].Series._xAxisName, isTransposed: SmartTooltipOptions[a].Series._isTransposed };\r\n if (SmartTooltipOptions[a].ReqInvertAxis) {\r\n visibleLocation[a] = SmartTooltipOptions[a].Point.X;\r\n }\r\n else {\r\n visibleLocation[a] = SmartTooltipOptions[a].Point.Y;\r\n }\r\n tooltipWidth += SmartTooltipOptions[a].StEnd.End - SmartTooltipOptions[a].StEnd.Start + tooltipPadding;\r\n }\r\n this.ContinousOverlappingPoints(InitialRanges[0], visibleLocation);\r\n if (tooltipWidth < totalSapce)\r\n this.verticalArrangeMents(InitialRanges);\r\n for (var a = 0; a < length_SmartTooltips; a++) {\r\n SmartTooltipOptions[a].Tgap = (!this.model.financial) ? InitialRanges[0][a].Start - SmartTooltipOptions[a].StEnd.Start : 0;\r\n }\r\n },\r\n verticalArrangeMents: function (startEndRanges) {\r\n var pointsRanges = startEndRanges[0],\r\n axisNames = startEndRanges[1], //axis names contains isTransposed also\r\n obj = this.model.m_AreaBounds,\r\n padding = this.model.tooltipPadding,\r\n isTransposed,\r\n chartHeight,\r\n startPos,\r\n yAxisName,\r\n axes = this.model._axes,\r\n temp,//current trackabll tooltip start end\r\n secTemp,//vertical arrangements\r\n secWidth,//vertical arrange width\r\n condition,\r\n width, length = pointsRanges.length, i = length - 1, j = 0, k = 0, axisLength = axes.length;\r\n for (; i >= 0; i--) {\r\n isTransposed = axisNames[i].isTransposed;\r\n yAxisName = axisNames[i].yAxis;\r\n for (k = 0; k < axisLength; k++) {\r\n if (yAxisName == axes[k].name) {\r\n if (isTransposed) {\r\n chartHeight = axes[k].Location.X2;\r\n startPos = axes[k].Location.X1;\r\n }\r\n else {\r\n chartHeight = axes[k].Location.Y1;\r\n startPos = axes[k].Location.Y2;\r\n }\r\n }\r\n }\r\n temp = pointsRanges[i];\r\n width = temp.End - temp.Start;\r\n if (chartHeight < temp.End) {\r\n temp.End = chartHeight - 2;\r\n temp.Start = temp.End - width;\r\n for (j = i - 1; j >= 0; j--) {\r\n secTemp = pointsRanges[j];\r\n secWidth = secTemp.End - secTemp.Start;\r\n if (secTemp.End > pointsRanges[j + 1].Start && (pointsRanges[j + 1].Start > startPos && pointsRanges[j + 1].End < chartHeight)) {\r\n secTemp.End = pointsRanges[j + 1].Start - padding;\r\n secTemp.Start = secTemp.End - secWidth;\r\n }\r\n }\r\n }\r\n }\r\n for (i = 0; i < length; i++) {\r\n isTransposed = axisNames[i].isTransposed;\r\n yAxisName = axisNames[i].yAxis;\r\n for (k = 0; k < axisLength; k++) {\r\n if (yAxisName == axes[k].name) {\r\n if (isTransposed) {\r\n chartHeight = axes[k].Location.X2;\r\n startPos = axes[k].Location.X1;\r\n }\r\n else {\r\n chartHeight = axes[k].Location.Y1;\r\n startPos = axes[k].Location.Y2;\r\n }\r\n }\r\n }\r\n temp = pointsRanges[i];\r\n width = temp.End - temp.Start;\r\n if (temp.Start < startPos) {\r\n temp.Start = startPos + 1;\r\n temp.End = temp.Start + width;\r\n for (j = i + 1; j <= (length - 1); j++) {\r\n secTemp = pointsRanges[j];\r\n secWidth = secTemp.End - secTemp.Start;\r\n if (secTemp.Start < pointsRanges[j - 1].End && (pointsRanges[j - 1].Start > startPos && pointsRanges[j - 1].End < chartHeight)) {\r\n secTemp.Start = pointsRanges[j - 1].End + padding;\r\n secTemp.End = secTemp.Start + secWidth;\r\n }\r\n }\r\n }\r\n }\r\n },\r\n ContinousOverlappingPoints: function (TooltipRanges, visibleLocation) {\r\n var padding = this.model.tooltipPadding, temp = 0, Count = 0, Start = 0, StartPoint = 0, endPoint = TooltipRanges.length - 1, Range = (TooltipRanges[0].End - TooltipRanges[0].Start) + padding, halfHeight, midPos, tRange, kRange;\r\n temp = TooltipRanges[0].Start + Range;\r\n Start = TooltipRanges[0].Start;\r\n for (var i = 0; i < endPoint; i++) {\r\n if (temp >= TooltipRanges[i + 1].Start) {\r\n Range = TooltipRanges[i + 1].End - TooltipRanges[i + 1].Start + padding;\r\n temp += Range;\r\n Count++;\r\n if (Count - 1 == endPoint - 1 || i == endPoint - 1) {\r\n halfHeight = (temp - Start) / 2;\r\n midPos = (visibleLocation[StartPoint] + visibleLocation[i + 1]) / 2;\r\n tRange = TooltipRanges[StartPoint].End - TooltipRanges[StartPoint].Start;\r\n TooltipRanges[StartPoint].Start = midPos - halfHeight;\r\n TooltipRanges[StartPoint].End = TooltipRanges[StartPoint].Start + tRange;\r\n for (var k = StartPoint; k > 0; k--) {\r\n if (TooltipRanges[k].Start <= TooltipRanges[k - 1].End + padding) {\r\n kRange = TooltipRanges[k - 1].End - TooltipRanges[k - 1].Start;\r\n TooltipRanges[k - 1].Start = TooltipRanges[k].Start - kRange - padding;\r\n TooltipRanges[k - 1].End = TooltipRanges[k - 1].Start + kRange;\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n for (var j = StartPoint + 1; j <= StartPoint + Count; j++) {\r\n tRange = TooltipRanges[j].End - TooltipRanges[j].Start;\r\n TooltipRanges[j].Start = TooltipRanges[j - 1].End + padding;\r\n TooltipRanges[j].End = TooltipRanges[j].Start + tRange;\r\n\r\n }\r\n }\r\n\r\n }\r\n else {\r\n Count = i > 0 ? Count : 0;\r\n if (Count > 0) {\r\n halfHeight = (temp - Start) / 2;\r\n midPos = (visibleLocation[StartPoint] + visibleLocation[i]) / 2;\r\n tRange = TooltipRanges[StartPoint].End - TooltipRanges[StartPoint].Start;\r\n TooltipRanges[StartPoint].Start = midPos - halfHeight;\r\n TooltipRanges[StartPoint].End = TooltipRanges[StartPoint].Start + tRange;\r\n for (var k = StartPoint; k > 0; k--) {\r\n if (TooltipRanges[k].Start <= TooltipRanges[k - 1].End + padding) {\r\n kRange = TooltipRanges[k - 1].End - TooltipRanges[k - 1].Start;\r\n TooltipRanges[k - 1].Start = TooltipRanges[k].Start - kRange - padding;\r\n TooltipRanges[k - 1].End = TooltipRanges[k - 1].Start + kRange;\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n for (var j = StartPoint + 1; j <= StartPoint + Count; j++) {\r\n tRange = TooltipRanges[j].End - TooltipRanges[j].Start;\r\n TooltipRanges[j].Start = TooltipRanges[j - 1].End + padding;\r\n TooltipRanges[j].End = TooltipRanges[j].Start + tRange;\r\n }\r\n Count = 0;\r\n }\r\n Range = (TooltipRanges[i + 1].End - TooltipRanges[i + 1].Start + padding);\r\n temp = TooltipRanges[i + 1].Start + Range;\r\n Start = TooltipRanges[i + 1].Start;\r\n StartPoint = i + 1;\r\n }\r\n\r\n }\r\n },\r\n getTooltipOptions: function (seriesColor, series) {\r\n var rectBorderColor, rectFillColor, rX, rY, textColor;\r\n if (this.model.theme.indexOf(\"gradient\") >= 0) {\r\n rectBorderColor = jQuery.type(seriesColor) == \"array\" ? seriesColor[0].color : seriesColor;\r\n rectFillColor = 'white';\r\n textColor = \"#333333\";\r\n rX = 5;\r\n rY = 5;\r\n\r\n } else {\r\n var type = series.type.toLowerCase();\r\n if (type.indexOf(\"column\") == -1 && type.indexOf(\"waterfall\") == -1 && type.indexOf(\"bar\") == -1 && type.indexOf(\"box\") == -1 && type != \"rangearea\" && this.model.AreaType != \"none\") {\r\n rectFillColor = jQuery.type(seriesColor) == \"array\" ? seriesColor[0].color : seriesColor;\r\n rectBorderColor = 'transparent';\r\n textColor = \"white\";\r\n } else {\r\n rectBorderColor = \"#333333\";\r\n rectFillColor = 'white';\r\n textColor = \"#333333\";\r\n }\r\n rX = 0;\r\n rY = 0;\r\n }\r\n return { rectBColor: rectBorderColor, rectFColor: rectFillColor, rectTextColor: textColor, rectX: rX, rectY: rY };\r\n },\r\n getSeriesColor: function (point, seriesIndex, series) {\r\n var seriesColor;\r\n if (series && !series.isIndicator && !series.isTrendLine) {\r\n if (point._hiloFill) {\r\n if (!point._hiloFill._gradientStop)\r\n seriesColor = point._hiloFill;\r\n else {\r\n seriesColor = point._hiloFill._gradientStop[0].color;\r\n }\r\n }\r\n else if (point.fill) {\r\n if (!point.fill._gradientStop)\r\n seriesColor = point.fill;\r\n else {\r\n seriesColor = point.fill._gradientStop[0].color;\r\n }\r\n }\r\n else {\r\n if (series.type.toLowerCase() == \"waterfall\" && series.positiveFill &&\r\n ((point.y > 0 && !point.showIntermediateSum && !point.showTotalSum) || point.waterfallSum > 0))\r\n seriesColor = series.positiveFill;\r\n else\r\n seriesColor = this.model.seriesColors[seriesIndex];\r\n\r\n }\r\n } else {\r\n seriesColor = series.fill;\r\n }\r\n return seriesColor;\r\n },\r\n getFormat: function (series, boxLocation) {\r\n\r\n if (!series.tooltip.format) {\r\n var type = series.type.toLowerCase();\r\n var outlierVisible = series.type != \"boxandwhisker\" ? 'null' : boxLocation.outlier;\r\n if (type.indexOf(\"range\") > -1 || (type.indexOf(\"hilo\") > -1 && type.indexOf(\"open\") == -1))\r\n return \"#point.x#
High : #point.high#
Low : #point.low#\";\r\n else if (type.indexOf(\"candle\") > -1 || type.indexOf(\"open\") > -1)\r\n return \"#point.x#
High : #point.high#
Low : #point.low#
Open : #point.open#
Close : #point.close#\";\r\n else if (type.indexOf(\"bubble\") > -1)\r\n return \"#point.x# : #point.y# : #point.size#\"\r\n else if (type.indexOf(\"box\") > -1 && outlierVisible)\r\n return \"X : #boxPlotPoints.xValue# Y : #boxPlotPoints.YValues#\";\r\n else if (type.indexOf(\"box\") > -1)\r\n return \"Minimum : #boxPlotPoints.Minimum#
Upper Quartile : #boxPlotPoints.UpperQuartile#
Median : #boxPlotPoints.midvalue#
Lower Quartile : #boxPlotPoints.LowerQuartile#
Maximum : #boxPlotPoints.Maximum# \";\r\n else\r\n return \"#point.x# : #point.y#\"\r\n }\r\n return series.tooltip.format;\r\n },\r\n getTooltipFormat: function (seriesPoint, series, serIndex, ptIndex, format, boxLocation) {\r\n var point = $.extend(true, {}, seriesPoint),\r\n areaType = this.model.AreaType,\r\n locale = this.model.locale,\r\n xAxis = series.xAxis,\r\n yAxis = series.yAxis,\r\n xAxisValueType = xAxis._valueType.toLowerCase(),\r\n nullorundefined = ej.util.isNullOrUndefined,\r\n xAxisLabelFormat = xAxis.labelFormat,\r\n yAxisLabelFormat = yAxis.labelFormat,\r\n dateTimeFormat = ej.EjSvgRender.utils._dateTimeLabelFormat,\r\n decimalPlaces = ej.EjSvgRender.utils._decimalPlaces,\r\n xGlobalize = false, yGlobalize = false,\r\n xFormat, yFormat,\r\n customFormat, data, substr,\r\n xPrecision, yPrecision, precisionDefault = 6, precisionHighest = 20;\r\n series.count = 1;\r\n point.count = 1;\r\n format = this.getFormat(series, boxLocation);\r\n while (format.indexOf('ej.format(') >= 0) {\r\n substr = format.substring(format.indexOf('ej.format('), format.indexOf(\")\") + 1);\r\n var calculate = substr.substring(substr.indexOf('(') + 1, substr.indexOf(\",\"));\r\n if (calculate == \"#point.x#\") {\r\n xGlobalize = true,\r\n xFormat = substr.substring(substr.indexOf(',') + 1, substr.indexOf(\")\"));\r\n }\r\n else if (calculate == \"#point.y#\") {\r\n yGlobalize = true,\r\n yFormat = substr.substring(substr.indexOf(',') + 1, substr.indexOf(\")\"));\r\n } else {\r\n globalizeformat = substr.substring(substr.indexOf(',') + 1, substr.indexOf(\")\"));\r\n subStr1 = calculate.substring(calculate.indexOf('#') + 1);\r\n val = subStr1.substring(subStr1.indexOf('.') + 1, subStr1.indexOf('#'));\r\n if (point.hasOwnProperty(val) && point[val])\r\n point[val] = ej.format(point[val], globalizeformat, locale);\r\n }\r\n format = format.replace(substr, calculate)\r\n }\r\n if (areaType == \"cartesianaxes\") {\r\n if (xAxisValueType.toLowerCase() == \"datetime\") {\r\n point.x = ej.format(new Date(point.xValue), ((nullorundefined(xAxisLabelFormat)) ? dateTimeFormat(xAxis._intervalType, xAxis) : series.xAxis.labelFormat), locale);\r\n point.x = xGlobalize ? (ej.format(new Date(point.xValue), xFormat, locale)) : point.x;\r\n }\r\n else if (xAxisValueType.toLowerCase() == \"datetimecategory\") {\r\n point.x = ej.format(new Date(point.x), ((nullorundefined(xAxisLabelFormat)) ? dateTimeFormat(xAxis.intervalType, xAxis) : xAxis.labelFormat), locale);\r\n point.x = xGlobalize ? (ej.format(new Date(point.x), xFormat, locale)) : point.x;\r\n }\r\n else if (xAxisValueType.toLowerCase() == \"category\") {\r\n if (this.model.primaryXAxis.isIndexed)\r\n point.x = (point.x) ? point.x : \"undefined\";\r\n else\r\n point.x = ej.EjSvgRender.utils._getLabelContent(point.xValue, series.xAxis, locale);\r\n }\r\n else {\r\n if ((xGlobalize && (xFormat.indexOf('e') == 0 || xFormat.indexOf('E') == 0))) {\r\n point.x = this.convertExponential(xPrecision, precisionDefault, precisionHighest, point.x, xFormat);\r\n }\r\n else\r\n point.x = xGlobalize ? ej.format(point.x, xFormat, locale) : point.x;\r\n customFormat = (!(xAxisLabelFormat)) ? null : xAxisLabelFormat.match('{value}');\r\n point.x = (!(xAxisLabelFormat)) ? point.x : (customFormat != null) ? (xAxisLabelFormat == \"${value}\") ? xAxisLabelFormat.replace('{value}', '$' + point.x) : xAxisLabelFormat.replace('{value}', point.x) : (xGlobalize || (xAxisLabelFormat.indexOf('e') == 0 || xAxisLabelFormat.indexOf('E') == 0)) ? point.x : (ej.format(Number(point.x), xAxisLabelFormat, locale));\r\n\r\n }\r\n }\r\n else {\r\n if (xAxisValueType == \"date\") {\r\n point.x = (ej.format(new Date(point.xValue), (dateTimeFormat('days')), locale));\r\n point.x = xGlobalize ? (ej.format(new Date(point.xValue), xFormat, locale)) : point.x;\r\n }\r\n }\r\n if ((yGlobalize && (yFormat.indexOf('e') == 0 || yFormat.indexOf('E') == 0))) {\r\n point.y = this.convertExponential(yPrecision, precisionDefault, precisionHighest, point.y, yFormat);\r\n }\r\n else {\r\n point.y = point.waterfallSum ? point.waterfallSum : point.y;\r\n point.y = yGlobalize ? ej.format(point.y, yFormat, locale) : point.y;\r\n }\r\n customFormat = (!(yAxisLabelFormat)) ? null : yAxisLabelFormat.match('{value}');\r\n point.y = (!(yAxisLabelFormat)) ? point.y : (customFormat != null) ? (yAxisLabelFormat == \"${value}\") ? yAxisLabelFormat.replace('{value}', '$' + point.y) : yAxisLabelFormat.replace('{value}', point.y) : (yGlobalize || (yAxisLabelFormat.indexOf('e') == 0 || yAxisLabelFormat.indexOf('E') == 0)) ? point.y : (ej.format(Number(point.y), yAxisLabelFormat, locale));\r\n if ((areaType == 'none' || areaType == 'polaraxes') && xGlobalize && (xFormat.indexOf('e') == 0 || xFormat.indexOf('E') == 0)) {\r\n point.x = this.convertExponential(xPrecision, precisionDefault, precisionHighest, point.x, xFormat);\r\n }\r\n if (series.isStacking && series.drawType == \"area\" && ((series.type == \"polar\") || (series.type == \"radar\"))) {\r\n point.y = series.stackedValue.EndValues[ptIndex] - series.stackedValue.StartValues[ptIndex];\r\n }\r\n if (series.type.toLowerCase() == \"boxandwhisker\") {\r\n var boxPlotLabels;\r\n boxPlotLabels = series._visiblePoints[ptIndex].boxPlotValues;\r\n if (boxLocation.outlier == true) {\r\n for (var z = 0; z < boxPlotLabels.outliers.length; z++) {\r\n if (boxLocation.YValues == boxPlotLabels.outliers[z])\r\n boxLocation.YValues = (!(yAxisLabelFormat)) ? boxLocation.YValues : (customFormat != null) ? (yAxisLabelFormat == \"${value}\") ? yAxisLabelFormat.replace('{value}', '$' + boxLocation.YValues) : yAxisLabelFormat.replace('{value}', boxLocation.YValues) : (yGlobalize || (yAxisLabelFormat.indexOf('e') == 0 || yAxisLabelFormat.indexOf('E') == 0)) ? boxLocation.YValues : (ej.format(Number(boxLocation.YValues), yAxisLabelFormat, locale));\r\n }\r\n }\r\n else {\r\n if (boxLocation.YValues == boxPlotLabels.Minimum)\r\n boxPlotLabels.Minimum = (!(yAxisLabelFormat)) ? boxPlotLabels.Minimum : (customFormat != null) ? (yAxisLabelFormat == \"${value}\") ? yAxisLabelFormat.replace('{value}', '$' + boxPlotLabels.Minimum) : yAxisLabelFormat.replace('{value}', boxPlotLabels.Minimum) : (yGlobalize || (yAxisLabelFormat.indexOf('e') == 0 || yAxisLabelFormat.indexOf('E') == 0)) ? boxPlotLabels.Minimum : (ej.format(Number(boxPlotLabels.Minimum), yAxisLabelFormat, locale));\r\n else if (boxLocation.YValues == boxPlotLabels.Maximum)\r\n boxPlotLabels.Maximum = (!(yAxisLabelFormat)) ? boxPlotLabels.Maximum : (customFormat != null) ? (yAxisLabelFormat == \"${value}\") ? yAxisLabelFormat.replace('{value}', '$' + boxPlotLabels.Maximum) : yAxisLabelFormat.replace('{value}', boxPlotLabels.Maximum) : (yGlobalize || (yAxisLabelFormat.indexOf('e') == 0 || yAxisLabelFormat.indexOf('E') == 0)) ? boxPlotLabels.Maximum : (ej.format(Number(boxPlotLabels.Maximum), yAxisLabelFormat, locale));\r\n else if (boxLocation.YValues == boxPlotLabels.UpperQuartile)\r\n boxPlotLabels.UpperQuartile = (!(yAxisLabelFormat)) ? boxPlotLabels.UpperQuartile : (customFormat != null) ? (yAxisLabelFormat == \"${value}\") ? yAxisLabelFormat.replace('{value}', '$' + boxPlotLabels.UpperQuartile) : yAxisLabelFormat.replace('{value}', boxPlotLabels.UpperQuartile) : (yGlobalize || (yAxisLabelFormat.indexOf('e') == 0 || yAxisLabelFormat.indexOf('E') == 0)) ? boxPlotLabels.UpperQuartile : (ej.format(Number(boxPlotLabels.UpperQuartile), yAxisLabelFormat, locale));\r\n else if (boxLocation.YValues == boxPlotLabels.LowerQuartile)\r\n boxPlotLabels.LowerQuartile = (!(yAxisLabelFormat)) ? boxPlotLabels.LowerQuartile : (customFormat != null) ? (yAxisLabelFormat == \"${value}\") ? yAxisLabelFormat.replace('{value}', '$' + boxPlotLabels.LowerQuartile) : yAxisLabelFormat.replace('{value}', boxPlotLabels.LowerQuartile) : (yGlobalize || (yAxisLabelFormat.indexOf('e') == 0 || yAxisLabelFormat.indexOf('E') == 0)) ? boxPlotLabels.LowerQuartile : (ej.format(Number(boxPlotLabels.LowerQuartile), yAxisLabelFormat, locale));\r\n else if (boxLocation.YValues == boxPlotLabels.midvalue)\r\n boxPlotLabels.midvalue = (!(yAxisLabelFormat)) ? boxPlotLabels.midvalue : (customFormat != null) ? (yAxisLabelFormat == \"${value}\") ? yAxisLabelFormat.replace('{value}', '$' + boxPlotLabels.midvalue) : yAxisLabelFormat.replace('{value}', boxPlotLabels.midvalue) : (yGlobalize || (yAxisLabelFormat.indexOf('e') == 0 || yAxisLabelFormat.indexOf('E') == 0)) ? boxPlotLabels.midvalue : (ej.format(Number(boxPlotLabels.midvalue), yAxisLabelFormat, locale));\r\n }\r\n boxPlotLabels.count = series.count;\r\n boxPlotLabels.xValue = point.x;\r\n boxPlotLabels.YValues = boxLocation.YValues;\r\n data = { boxPlotPoints: boxPlotLabels };\r\n }\r\n else\r\n data = { series: series, point: point };\r\n format = format.parseTemplate(data);\r\n return { data: point, text: format };\r\n },\r\n convertExponential: function (precision, precisionDefault, precisionHighest, point, format) {\r\n precision = format.match(/(\\d+)/g);\r\n precision = precision == null ? precisionDefault : precision > precisionHighest ? precisionHighest : precision;\r\n point = point.toExponential(precision);\r\n return point;\r\n },\r\n displayShowTooltip: function (location, point, series, pointIndex) {\r\n var requireInvertedAxes = this.model.requireInvertedAxes;\r\n if (point.visible !== false) {\r\n // fixed multiple tooltip issue in mobile\r\n $(\".ejTooltip\" + this._id).not(\"#\" + this.svgObject.id + \"_TrackToolTip\").remove();\r\n if ($.finish)\r\n $(\".ejTooltip\" + this._id).finish();\r\n else\r\n $(\".ejTooltip\" + this._id).stop(true, true);\r\n var measureText, parentZindex, seriesIndex = (!series.isIndicator && !series.isTrendLine) ? $.inArray(series, this.model._visibleSeries) : 0,\r\n seriesColor,\r\n textOffset,\r\n padding = 7, bubbleSpacing = 15,\r\n x,\r\n y,\r\n trackTooltipText,\r\n format = series.tooltip.format;\r\n var position = document.getElementById(this.svgObject.id).getClientRects()[0];\r\n var chartPos = this.model.m_AreaBounds;\r\n var type = series.type.toLowerCase();\r\n //Set tooltip position ,text and color\r\n switch (this.model.AreaType) {\r\n\r\n case \"cartesianaxes\":\r\n x = location.X + ((!series.isIndicator && !series.isTrendLine) ? ((ej.util.isNullOrUndefined(series._trackMarker)) ?\r\n (type == \"bubble\" ? (point.radius + bubbleSpacing) : series.marker.size.width) : (series._trackMarker.size.width)) : 0) + (type == \"column\" || type == \"bar\" || type == \"stackingbar\" || type == \"stackingcolumn\" || type == \"waterfall\" || type == \"rangecolumn\" ? chartPos.X : (requireInvertedAxes) ? series.yAxis.x : series.xAxis.x);\r\n //condition checked for multipleaxis line tooltip position changed\r\n y = (location.Y) + (type.indexOf(\"column\") != -1 || type.indexOf(\"waterfall\") != -1 || type.indexOf(\"bar\") != -1 || type.indexOf(\"rangearea\") != -1 || type == \"scatter\" || type == \"bubble\" ?\r\n (this.dragPoint ? (requireInvertedAxes ? series.xAxis.y : series.yAxis.y) : chartPos.Y) : (requireInvertedAxes) ? series.xAxis.y : series.yAxis.y);\r\n if (this.dragPoint) {\r\n x = x > series.xAxis.x ? x : series.xAxis.x;\r\n y = y < series.yAxis.height + series.yAxis.y ? y : series.yAxis.height + series.yAxis.y;\r\n }\r\n seriesColor = this.getSeriesColor(point, seriesIndex, series);\r\n break;\r\n\r\n case \"polaraxes\":\r\n x = location.X + padding + ((ej.util.isNullOrUndefined(series._trackMarker)) ? series.marker.size.width : (series._trackMarker.size.width));\r\n y = location.Y;\r\n seriesColor = this.getSeriesColor(point, seriesIndex, series);\r\n break;\r\n\r\n case \"none\":\r\n x = location.X + series.marker.size.width + padding;\r\n y = (location.Y);\r\n seriesColor = this.model.pointColors[pointIndex];\r\n break;\r\n }\r\n\r\n\r\n if (series.type.toLowerCase() == \"boxandwhisker\") {\r\n for (var p = 0; p < series._visiblePoints[pointIndex].boxPlotLocation.length; p++) {\r\n var boxLocation = series._visiblePoints[pointIndex].boxPlotLocation[p];\r\n var outlierVisible = boxLocation.outlier;\r\n if (outlierVisible) {\r\n if (boxLocation.X + (series.outlierSettings.size.width / 2) > location.X && boxLocation.X - (series.outlierSettings.size.width / 2) < location.X) {\r\n if (boxLocation.Y + (series.outlierSettings.size.height / 2) > location.Y && boxLocation.Y - (series.outlierSettings.size.height / 2) < location.Y) {\r\n trackTooltipText = this.getTooltipFormat(point, series, seriesIndex, pointIndex, format, boxLocation);\r\n textOffset = ej.EjSvgRender.utils._measureText(trackTooltipText.text);\r\n }\r\n }\r\n }\r\n else {\r\n trackTooltipText = this.getTooltipFormat(point, series, seriesIndex, pointIndex, format, boxLocation);\r\n textOffset = ej.EjSvgRender.utils._measureText(trackTooltipText.text);\r\n }\r\n }\r\n }\r\n else {\r\n trackTooltipText = this.getTooltipFormat(point, series, seriesIndex, pointIndex, format);\r\n textOffset = ej.EjSvgRender.utils._measureText(trackTooltipText.text);\r\n }\r\n var toolTipOptions = this.getTooltipOptions(seriesColor, series);\r\n var rectBorderColor = toolTipOptions.rectBColor;\r\n var rectFillColor = toolTipOptions.rectFColor;\r\n var textColor = toolTipOptions.rectTextColor;\r\n var rX = toolTipOptions.rectX;\r\n var rY = toolTipOptions.rectY;\r\n var rectOptions = series.tooltip;\r\n //draw tooltip rectangle\r\n var tooltipdivRect;\r\n var padding = 5;\r\n\r\n if (document.getElementById(this.svgObject.id + \"_TrackToolTip\") == null)\r\n tooltipdivRect = $(\"
\").attr({ 'id': this.svgObject.id + \"_TrackToolTip\", 'class': 'ejTooltip' + this._id });\r\n else\r\n tooltipdivRect = $(\"#\" + this.svgObject.id + \"_TrackToolTip\");\r\n var isIE11 = !!navigator.userAgent.match(/Trident\\/7\\./);\r\n if (ej.isTouchDevice() && !isIE11 && !this.vmlRendering) {\r\n if (window.navigator.msPointerEnabled)\r\n this._on(tooltipdivRect, 'MSPointerMove', this.chartTooltipHover);\r\n else\r\n this._on(tooltipdivRect, 'touchmove', this.chartTooltipHover);\r\n }\r\n else {\r\n this._on(tooltipdivRect, 'mousemove', this.chartTooltipHover);\r\n }\r\n $(\"#\" + this.svgObject.id + \"_TrackToolTip\").show();\r\n parentZindex = $('#' + this._id).parent()[0].style.zIndex;\r\n var rectOptions = {\r\n 'top': y + $(document).scrollTop(),\r\n 'left': x + $(document).scrollLeft(),\r\n \"background-color\": (rectOptions.fill) ? rectOptions.fill : rectFillColor,\r\n \"border-style\": \"solid\",\r\n \"position\": \"absolute\",\r\n \"border-color\": (rectOptions.border.color) ? rectOptions.border.color : rectBorderColor,\r\n \"border-width\": (rectOptions.border.width || rectOptions.border.width == 0) ? rectOptions.border.width : 1,\r\n \"opacity\": rectOptions.opacity,\r\n 'z-index': parentZindex + 1000000,\r\n 'border-radius': ((rectOptions.rx) ? rectOptions.rx : rX).toString() + \"px \" + ((rectOptions.ry) ? rectOptions.ry : rY).toString() + \"px\",\r\n \"padding-left\": '5px',\r\n \"padding-right\": '5px',\r\n \"padding-top\": '2px',\r\n \"padding-bottom\": '2px'\r\n };\r\n $(tooltipdivRect).css(rectOptions);\r\n\r\n //event for tooltip text\r\n var commonTrackTextArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonTrackTextArgs.data = { seriesIndex: seriesIndex, pointIndex: pointIndex, currentText: trackTooltipText.text, isTrendLine: series.isTrendLine, trendlineIndex: series.trendlineIndex };\r\n this._trigger(\"toolTipInitialize\", commonTrackTextArgs);\r\n if (!commonTrackTextArgs.cancel) {\r\n //draw tooltip text\r\n var fontSize = 0;\r\n var tooltip = series.tooltip;\r\n var font = (tooltip.font) ? $.extend(false, series.font, {}, tooltip.font) : series.font;\r\n\r\n // draw tooltip text styles\r\n var textOptions = {\r\n 'top': y + $(document).scrollTop(),\r\n 'left': x + $(document).scrollLeft(),\r\n \"color\": (tooltip.font && tooltip.font.color) ? font.color : textColor,\r\n 'font-size': font.size,\r\n 'font-family': font.fontFamily,\r\n 'font-style': font.fontStyle,\r\n 'font-weight': font.fontWeight,\r\n \"align-self\": \"baseline\"\r\n };\r\n $(tooltipdivRect).css(textOptions);\r\n\r\n // append the tooltip Div (condition for performance without remove div)\r\n if (document.getElementById(this.svgObject.id + \"_TrackToolTip\") == null)\r\n $(document.body).append(tooltipdivRect[0]);\r\n\r\n // Add string in text array for tooltip format\r\n var text = measureText = commonTrackTextArgs.data.currentText;\r\n $(\"#\" + this.svgObject.id + \"_TrackToolTip\").html(text);\r\n\r\n // div size calculation perform here\r\n var textHeight = 0;\r\n var textWidth = 0;\r\n text = text.replace(/
/g, \"
\")\r\n .replace(/
/g, \"
\")\r\n .replace(/
/g, \"
\");\r\n text = text.split(\"
\");\r\n for (var i = 0; i < text.length; i++) {\r\n var text1 = text[i];\r\n text1 = text1.split('');\r\n for (var j = 0; j < text1.length; j++) {\r\n var text2 = text1[j];\r\n text2 = this.RemoveTableAttr(text2);\r\n text2 = text2.replace(/ /g, \" \");\r\n textHeight += ej.EjSvgRender.utils._measureText(text2, null, font).height;\r\n var width = ej.EjSvgRender.utils._measureText(text2, null, font).width;\r\n if (textWidth < width)\r\n textWidth = width;\r\n }\r\n }\r\n\r\n fontSize = (this.model.AreaType == \"cartesianaxes\") ? ej.EjSvgRender.utils._measureText(measureText, series.xAxis.width, font).height : ej.EjSvgRender.utils._measureText(text, null, font).height;\r\n var maxWidth = (this.model.AreaType == \"cartesianaxes\") ? (this.model.requireInvertedAxes) ? series.yAxis.width : series.xAxis.width : $(this.svgObject).width() - (this.model.legend.position.toLowerCase() == \"right\" ? (this.model.LegendViewerBounds.Width + 2 * this.model.elementSpacing) : 0);\r\n var maxHeight = (this.model.AreaType == \"cartesianaxes\") ? (this.model.requireInvertedAxes) ? series.xAxis.height : series.yAxis.height : $(this.svgObject).height() - (this.model.legend.position.toLowerCase() == \"bottom\" ? (this.model.LegendViewerBounds.Height + this.model.elementSpacing) : 0);\r\n\r\n //Adjust x-position to display tooltip within chart area \r\n var box = $(\"#\" + this.svgObject.id + \"_TrackToolTip\")[0].getBoundingClientRect();\r\n\r\n $(\"#\" + this.svgObject.id + \"_TrackToolTip\").css(\"top\", ($(document).scrollTop() + box.top + position.top - ((textHeight + 4) / 2)));\r\n $(\"#\" + this.svgObject.id + \"_TrackToolTip\").css(\"left\", ($(document).scrollLeft() + box.left + position.left + (box.left - x)));\r\n if ((x + (textWidth + padding)) >= maxWidth + series.xAxis.x) {\r\n var areaPos = document.getElementById(this.svgObject.id).getClientRects()[0];\r\n var diff = x - ((textWidth + padding * 2) + ((!series.isIndicator && !series.isTrendLine) ? ((ej.util.isNullOrUndefined(series._trackMarker)) ? ((series.marker.visible) ?\r\n series.marker.size.width : (type == \"bubble\" ? (point.radius + bubbleSpacing) : 0)) : series._trackMarker.size.width) : 0) + (2 * padding));\r\n $(\"#\" + this.svgObject.id + \"_TrackToolTip\").css(\"left\", diff + areaPos.left - (padding) + $(document).scrollLeft());\r\n }\r\n box = $(\"#\" + this.svgObject.id + \"_TrackToolTip\")[0].getBoundingClientRect();\r\n if (box.bottom >= (series.yAxis.y + maxHeight + position.top) || box.bottom >= (series.xAxis.y + maxHeight + position.top)) {\r\n var diffY = y - (((box.bottom - box.top) + ((!series.isIndicator && !series.isTrendLine) ? ((ej.util.isNullOrUndefined(series._trackMarker)) ? ((series.marker.visible) ? series.marker.size.height : 0) : series._trackMarker.size.height) : 0))) + padding + position.top;\r\n $(\"#\" + this.svgObject.id + \"_TrackToolTip\").css(\"top\", diffY + $(document).scrollTop());\r\n }\r\n //adjust rectangle size based on text length \r\n box = $(\"#\" + this.svgObject.id + \"_TrackToolTip\")[0].getBoundingClientRect();\r\n if (box.left < 0) {\r\n // checked condition for whether left position display outsude of the chart area\r\n $(\"#\" + this.svgObject.id + \"_TrackToolTip\").css(\"left\", x);\r\n }\r\n if (box.top < position.top || box.top < 0)\r\n $(\"#\" + this.svgObject.id + \"_TrackToolTip\").css(\"top\", (position.top < 0 ? $(document).scrollTop() : position.top) + 'px');\r\n $(\"#\" + this.svgObject.id + \"_TrackToolTip\").show();\r\n }\r\n }\r\n },\r\n\t\tRemoveTableAttr: function (text) {\r\n\t\t\tif (text.indexOf('') != -1 || text.indexOf('
') != -1 || text.indexOf('') != -1 || text.indexOf('') != -1 || \ttext.indexOf('') != -1)\r\n text = text.replace(/\\//g, \"\").replace(//g, \"\").replace(//g, \"\").replace(/ -1) text = text.slice(text.search(/
/g, \"\").replace(/
/g, \"\");\r\n while(text.search(/ -1){\r\n\t\t\t\t\t\t\t\tif(text.search(/
-1 && (text.indexOf('>') > text.search(/\") + 1);\r\n\t\t\t\t\t\t\t\t\t\tvar splitText = text.split('\") > -1 ? currentText.slice(currentText.indexOf(\">\") + 1) : currentText;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\ttext = splitText.join(\"\");\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\treturn text;\r\n\t\t},\r\n chartTooltipHover: function (evt) {\r\n var box = $(\"#\" + evt.target.id)[0].getBoundingClientRect();\r\n var diff = evt.clientX - box.left;\r\n var padding = 5;\r\n $(\"#\" + evt.target.id).css(\"left\", box.left + diff + padding);\r\n box = $(\"#\" + evt.target.id)[0].getBoundingClientRect();\r\n var areaPos = document.getElementById(this.svgObject.id).getClientRects()[0];\r\n if (box.right > areaPos.right + padding)\r\n $(\"#\" + evt.target.id).css(\"left\", evt.clientX - (box.right - box.left) - padding);\r\n },\r\n _initializeSeriesColors: function () {\r\n var chartObj = this;\r\n var modelColor = (chartObj.model.palette) ? chartObj.model.palette : chartObj.model.colors;\r\n var count = modelColor.length;\r\n var areaType = chartObj.model.AreaType;\r\n chartObj.model.seriesColors = [];\r\n chartObj.model.seriesBorderColors = [];\r\n chartObj.model.pointColors = [];\r\n chartObj.model.pointBorderColors = [];\r\n var elementCollection, color, borderColor, element, tlines, visibleSeriesLength = chartObj.model._visibleSeries.length, visibleSeries = chartObj.model._visibleSeries\r\n if (areaType != \"none\") {\r\n elementCollection = chartObj.model._visibleSeries;\r\n color = chartObj.model.seriesColors;\r\n borderColor = chartObj.model.seriesBorderColors;\r\n }\r\n else {\r\n var lgth = 0;\r\n var longest;\r\n for (var i = 0; i < visibleSeriesLength; i++) {\r\n var type = chartObj.model._visibleSeries[i].type.toLowerCase();\r\n if (chartObj.model._visibleSeries[i].points.length > lgth) {\r\n var lgth = chartObj.model._visibleSeries[i].points.length;\r\n longest = chartObj.model._visibleSeries[i].points;\r\n }\r\n else if (chartObj.model._visibleSeries[i].points.length == lgth && type != \"funnel\" && type != \"pieofpie\" && type != \"pyramid\")\r\n longest = chartObj.model._visibleSeries[i].points;\r\n }\r\n elementCollection = longest || [];\r\n color = chartObj.model.pointColors;\r\n borderColor = chartObj.model.pointBorderColors;\r\n }\r\n if (areaType == \"none\" && visibleSeriesLength > 1) {\r\n for (var k = 0; k < visibleSeriesLength; k++) {\r\n chartObj.model.seriesColors[k] = modelColor[k % count];\r\n }\r\n }\r\n for (var i = 0; i < elementCollection.length; i++) {\r\n element = elementCollection[i];\r\n tlines = element.trendlines;\r\n element.isFill = (element.isFill == undefined) ? ((element.fill && element.fill != \"\") ? true : false) : element.isFill;\r\n if (element.isFill) {\r\n color[i] = element.fill;\r\n } else {\r\n color[i] = modelColor[i % count];\r\n if (!element._hiloTypes)\r\n element.fill = color[i];\r\n }\r\n if (areaType != \"none\" && tlines.length > 0)\r\n this._initializeTrendlinesColors(tlines, color[i]);\r\n if (!ej.util.isNullOrUndefined(element.border) && !ej.util.isNullOrUndefined(element.border.color) && element.border.color != \"\") {\r\n borderColor[i] = element.border.color;\r\n } else {\r\n borderColor[i] = chartObj.model.seriesBorderDefaultColors[i % 10];\r\n if (areaType != \"none\")\r\n element.border.color = borderColor[i];\r\n }\r\n element.dataPoint = element.points;\r\n }\r\n },\r\n\r\n _initializeTrendlinesColors: function (tlines, color) {\r\n for (var k in tlines) {\r\n if (ej.util.isNullOrUndefined(tlines[k].fill) || tlines[k].fill == \"\")\r\n tlines[k].fill = color;\r\n }\r\n },\r\n\r\n _createAxisLabelAndRange: function () {\r\n var count = 0,\r\n model = this.model,\r\n seriesCollection = model.series,\r\n seriesLength = seriesCollection.length,\r\n indicatorSeries,\r\n series,\r\n axisScroll,\r\n scrollRange,\r\n axis,\r\n primaryX = model.primaryXAxis,\r\n primaryY = model.primaryYAxis,\r\n axesLength;\r\n\r\n for (var i = 0; i < seriesLength; i++) {\r\n series = seriesCollection[i];\r\n if (series._isTransposed && this.model.AreaType != \"polaraxes\")\r\n count++;\r\n }\r\n\r\n if (seriesLength) {\r\n if (count == seriesLength)\r\n model.requireInvertedAxes = true;\r\n else {\r\n series = seriesCollection[0];\r\n if (series._isTransposed && this.model.AreaType != \"polaraxes\")\r\n model.requireInvertedAxes = true;\r\n }\r\n }\r\n if (model.requireInvertedAxes) {\r\n primaryY.orientation = \"horizontal\";\r\n primaryX.orientation = \"vertical\";\r\n primaryY.labelPlacement = (!(primaryY.labelPlacement)) ? ej.datavisualization.Chart.LabelPlacement.OnTicks : primaryY.labelPlacement;\r\n }\r\n else {\r\n primaryY.orientation = \"vertical\";\r\n primaryX.orientation = \"horizontal\";\r\n }\r\n\r\n primaryY.name = ej.util.isNullOrUndefined(primaryY.name) ? \"SecondaryAxis\" : primaryY.name;\r\n primaryX.name = ej.util.isNullOrUndefined(primaryX.name) ? \"PrimaryAxis\" : primaryX.name;\r\n\r\n model._axes = [];\r\n model._axes[0] = primaryX;\r\n model._axes[1] = primaryY;\r\n\r\n axesLength = model.axes.length;\r\n indicatorSeries = model.indicators;\r\n\r\n for (var i = 0; i < axesLength; i++) {\r\n axis = model.axes[i];\r\n if (axis.name) {\r\n //Sets orientation for axes collections\r\n for (var j = 0; j < seriesLength; j++) {\r\n var type = seriesCollection[j].type.toLowerCase();\r\n if (seriesCollection[j].xAxisName == axis.name) {\r\n axis.orientation = (type.indexOf(\"bar\") != -1) ? seriesCollection[j].isTransposed ? \"horizontal\" : \"vertical\" : seriesCollection[j].isTransposed ? \"vertical\" : \"horizontal\";\r\n break;\r\n }\r\n else if (seriesCollection[j].yAxisName == axis.name) {\r\n axis.orientation = (type.indexOf(\"bar\") != -1) ? seriesCollection[j].isTransposed ? \"vertical\" : \"horizontal\" : seriesCollection[j].isTransposed ? \"horizontal\" : \"vertical\";\r\n break;\r\n }\r\n }\r\n for (var k = 0; k < indicatorSeries.length; k++) {\r\n if (indicatorSeries[k].xAxisName == axis.name) {\r\n axis.orientation = \"horizontal\";\r\n break;\r\n }\r\n else if (indicatorSeries[k].yAxisName == axis.name) {\r\n axis.orientation = \"vertical\";\r\n break;\r\n }\r\n }\r\n if (!axis.orientation) continue;\r\n if (axis.orientation.toLowerCase() == \"horizontal\")\r\n model.axes[i] = $.extend(true, {}, model.secondaryX, axis);\r\n else\r\n model.axes[i] = $.extend(true, {}, model.secondaryY, axis);\r\n model._axes.push(model.axes[i]);\r\n }\r\n }\r\n for (var k = 0; k < model._axes.length; k++) {\r\n var axis = this.model._axes[k],\r\n axisScrollSetings = axis.scrollbarSettings,\r\n scrollRange = axisScrollSetings.range,\r\n orientation = axis.orientation.toLowerCase();\r\n axis.visibleLabels = [];\r\n axis.range = (axis.range.min == null && axis.range.max == null && axis.range.interval == null) ? null : axis.range;\r\n axis.setRange = (!(axis.range)) ? false : (ej.util.isNullOrUndefined(axis.setRange)) ? true : axis.setRange;\r\n axis.setRange = ((axis.actual_Range) || (axis.setRange != false)) ? true : false;\r\n axis.actualRange = (!(axis.actualRange)) ? (axis.range == null) ? {} : $.extend(true, {}, axis.range) : axis.actualRange;\r\n axis.visibleRange = (!(axis.visibleRange)) ? (axis.range == null) ? {} : axis.range : axis.visibleRange;\r\n axis.name = !(axis.name) ? k.toString() : axis.name;\r\n axis._isScroll = ((axisScrollSetings.visible && (axisScrollSetings.pointsLength != null || scrollRange.min != null || scrollRange.max != null)) || ((model.zooming.enableScrollbar && axisScrollSetings.visible) && (axis.zoomFactor < 1 || axis.zoomPosition > 0)))\r\n axis._pointsLength = axisScrollSetings.pointsLength;\r\n if (typeof scrollRange.min == \"string\" && scrollRange.min.indexOf(\"/Date(\") != -1)\r\n scrollRange.min = new Date(parseInt(scrollRange.min.substr(6)));\r\n if (typeof scrollRange.max == \"string\" && scrollRange.max.indexOf(\"/Date(\") != -1)\r\n scrollRange.max = new Date(parseInt(scrollRange.max.substr(6)));\r\n }\r\n },\r\n\r\n\r\n\r\n\r\n\r\n\r\n _drawTitle: function () {\r\n var title = this.model.title;\r\n var margin = this.model.margin;\r\n var svgWidth = $(this.svgObject).width();\r\n var measureTitle = ej.EjSvgRender.utils._measureText(title.text, svgWidth - margin.left - margin.right, title.font);\r\n var elementSpacing = this.model.elementSpacing;\r\n var modelTitleHeight = (title.text == \"\" || !title.visible) ? 0 : (measureTitle.height + elementSpacing);\r\n var margin = margin;\r\n var areaBounds = this.model.m_AreaBounds;\r\n var areaType = this.model.AreaType;\r\n var legendSpace = (this.model.legend.position.toLowerCase() == \"left\") ? this.model.LegendViewerBounds.Width / 2 : ((this.model.legend.position.toLowerCase() == \"right\" ? (-this.model.LegendViewerBounds.Width / 2) : 0));\r\n // Drawing the chart title\r\n var leftSpace = margin.left + elementSpacing + this.model.border.width;\r\n var rightSpace = margin.right + elementSpacing + this.model.border.width;\r\n var collection = this.model.titleWrapTextCollection;\r\n\r\n var titleLocation, textBorderConstant = 1.2,\r\n titleFontSize = parseInt(title.font.size),\r\n titleTextHeight = parseInt(title.font.size) * textBorderConstant,\r\n enableTrim = title.enableTrim, textAnchor,\r\n maxTitleWidth = title.maximumWidth,\r\n textAlignment = title.textAlignment.toLowerCase(),\r\n textOverflow = title.textOverflow.toLowerCase(),\r\n titleText = title.text,\r\n titleEnable = enableTrim && (textOverflow == \"wrap\" || textOverflow == \"wrapandtrim\") && (collection.length > 1) ? true : false;\r\n if (maxTitleWidth.toString() == 'auto' || maxTitleWidth.toString() == '') {\r\n maxTitleWidth = (areaBounds.Width * 0.75);\r\n this.model.titleMaxWidth = maxTitleWidth;\r\n }\r\n else\r\n maxTitleWidth = parseInt(maxTitleWidth);\r\n\r\n var titleWidthEnable = measureTitle.width > maxTitleWidth ? true : false;\r\n //title trim\r\n if (enableTrim && titleWidthEnable && textOverflow == \"trim\") {\r\n titleText = ej.EjSvgRender.utils._trimText(titleText, maxTitleWidth, title.font);\r\n this.model.titleTrim = measureTitle = ej.EjSvgRender.utils._measureText(titleText, svgWidth - margin.left - margin.right, title.font);\r\n this.model.trimTooltip = true;\r\n }\r\n\r\n if (this.model.trimTooltip && textOverflow == \"wrap\")\r\n this.model.trimTooltip = false;\r\n\r\n var textSize = { width: ((this.model.trimTooltip && titleEnable) || collection.length > 1) ? this.model.titleMaxWidth : measureTitle.width, height: (measureTitle.height * (collection.length > 0 ? collection.length - 1 : 1)) };\r\n if (title.text != \"\" && title.text != null) {\r\n if ((title.border.color == 'transparent') && (title.background == 'transparent')) {\r\n titleLocation = margin.top + (modelTitleHeight / 2) + (elementSpacing);\r\n } else {\r\n titleLocation = margin.top + (titleTextHeight / 2) + (elementSpacing) + (titleFontSize / 4);\r\n }\r\n var locX = ((areaType != \"cartesianaxes\") ? (svgWidth - margin.left - margin.right) / 2 + (margin.left + legendSpace) : (leftSpace + (svgWidth - rightSpace) / 2)) - textSize.width / 2;\r\n\r\n if (this.model.title.textAlignment.toLowerCase() == \"near\") {\r\n locX = leftSpace;\r\n }\r\n else if (this.model.title.textAlignment.toLowerCase() == \"far\") {\r\n locX = (svgWidth - rightSpace - textSize.width);\r\n }\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { title: titleText, location: { x: locX, y: titleLocation }, size: measureTitle };\r\n this._trigger(\"titleRendering\", commonEventArgs);\r\n var options = {\r\n 'id': this.svgObject.id + '_ChartTitleText',\r\n 'x': commonEventArgs.data.location.x,\r\n 'y': commonEventArgs.data.location.y,\r\n 'fill': title.font.color,\r\n 'font-size': title.font.size,\r\n 'font-family': title.font.fontFamily,\r\n 'font-style': title.font.fontStyle,\r\n 'font-weight': title.font.fontWeight,\r\n 'opacity': title.font.opacity,\r\n 'text-anchor': 'start'\r\n };\r\n var borderOptions = {\r\n 'id': this.svgObject.id + '_ChartTitleBorder',\r\n 'x': commonEventArgs.data.location.x - elementSpacing,\r\n 'y': commonEventArgs.data.location.y - titleTextHeight + (titleTextHeight / 4),\r\n 'rx': title.border.cornerRadius,\r\n 'ry': title.border.cornerRadius,\r\n 'width': titleEnable && titleWidthEnable ? this.model.titleMaxWidth + (2 * elementSpacing) : measureTitle.width + (2 * elementSpacing),\r\n 'height': titleEnable && titleWidthEnable ? measureTitle.height * collection.length : titleTextHeight,\r\n 'fill': title.background,\r\n 'stroke-width': title.border.width,\r\n 'stroke': title.border.color,\r\n 'opacity': title.border.opacity,\r\n 'class': \"e-titleborder\"\r\n };\r\n this.svgRenderer.drawRect(borderOptions, this.gTitleEle);\r\n\r\n if (titleEnable && titleWidthEnable) {\r\n for (var k = 0; k < collection.length; k++) {\r\n options.id = this.svgObject.id + '_ChartTitleText_' + k;\r\n if (k != 0) options.y = options.y + measureTitle.height;\r\n this.svgRenderer.drawText(options, collection[k], this.gTitleEle);\r\n }\r\n }\r\n else this.svgRenderer.drawText(options, commonEventArgs.data.title, this.gTitleEle);\r\n\r\n this.model._titleLocation = { X: commonEventArgs.data.location.x, Y: commonEventArgs.data.location.y, size: textSize, _height: measureTitle.height };\r\n\r\n this.svgRenderer.append(this.gTitleEle, this.svgObject);\r\n if (title.subTitle.text != \"\" && title.subTitle.text && title.subTitle.visible)\r\n this._drawSubTitle();\r\n }\r\n },\r\n\r\n\r\n\r\n _getLegendSize: function (series) {\r\n\r\n var legend = this.model.legend,\r\n symbolSize = legend.itemStyle,\r\n textSize = ej.EjSvgRender.utils._measureText(series.Text, null, series.Font),\r\n padding = 10,\r\n width = symbolSize.width + padding + textSize.width,\r\n height = Math.max(symbolSize.height, textSize.height);\r\n\r\n return { Width: width, Height: height };\r\n\r\n },\r\n\r\n _getYValues: function (points) {\r\n var values = [],\r\n length = points.length;\r\n for (var i = 0; i < length; i++)\r\n values.push(points[i].y);\r\n return values;\r\n },\r\n _getXValues: function (points) {\r\n var values = [],\r\n length = points.length;\r\n for (var i = 0; i < length; i++)\r\n values.push(points[i].xValue);\r\n return values;\r\n },\r\n\r\n\r\n\r\n\r\n _drawSubTitle: function () {\r\n\r\n var title = this.model.title;\r\n var subTitle = title.subTitle;\r\n var svgWidth = $(this.svgObject).width();\r\n var measureTitle = ej.EjSvgRender.utils._measureText(title.text, svgWidth - this.model.margin.left - this.model.margin.right, title.font);\r\n var measuresubTitle = ej.EjSvgRender.utils._measureText(subTitle.text, svgWidth - this.model.margin.left - this.model.margin.right, subTitle.font);\r\n\r\n var textanchor = \"middle\";\r\n var subTitleLocation, textBorderConstant = 1.2, titleBorderSpacing = 10, subTitleBorderSpacing = 10, elementSpacing = this.model.elementSpacing,\r\n subTitleFontSize = parseInt(subTitle.font.size),\r\n areaBounds = this.model.m_AreaBounds.Width,\r\n titleTextHeight = parseInt(title.font.size) * textBorderConstant,\r\n subTitleTextHeight = parseInt(subTitle.font.size) * textBorderConstant,\r\n modelsubTitleHeight = (subTitle.text == \"\" || !subTitle.visible) ? 0 : (measuresubTitle.height + elementSpacing),\r\n enableTrim = subTitle.enableTrim,\r\n maxSubTitleWidth = subTitle.maximumWidth,\r\n maxTitleWidth = title.maximumWidth,\r\n textOverflow = subTitle.textOverflow.toLowerCase(),\r\n titleTextAlignment = title.textAlignment.toLowerCase(),\r\n subTitleTextAlignment = subTitle.textAlignment.toLowerCase(),\r\n titleText = title.text,\r\n titleEnableTrim = title.enableTrim,\r\n titleTextOverflow = title.textOverflow.toLowerCase(),\r\n subTitleText = subTitle.text, locX,\r\n regionX,\r\n titleVisibility = titleEnableTrim && (titleTextOverflow == \"wrap\" || titleTextOverflow == \"wrapandtrim\") ? true : false,\r\n titleWidthVisibility,\r\n subTitleVisibility = enableTrim && (textOverflow == 'wrap' || textOverflow == 'wrapandtrim') ? true : false;\r\n\r\n maxTitleWidth = (maxTitleWidth.toString() == 'auto' || maxTitleWidth.toString() == '') ? (areaBounds * 0.75) : parseInt(maxTitleWidth);\r\n maxSubTitleWidth = (maxSubTitleWidth.toString() == 'auto' || maxSubTitleWidth.toString() == '') ? (areaBounds * 0.75) : parseInt(maxSubTitleWidth);\r\n var measureTitle = ej.EjSvgRender.utils._measureText(title.text, svgWidth - this.model.margin.left - this.model.margin.right, title.font);\r\n var titleWidthEnable = measureTitle.width > maxTitleWidth ? true : false;\r\n\r\n //subtitle trim\r\n if (enableTrim && measuresubTitle.width > maxSubTitleWidth && textOverflow == \"trim\") {\r\n titleText = titleEnableTrim && titleTextOverflow == 'trim' ? ej.EjSvgRender.utils._trimText(titleText, maxTitleWidth, title.font) : titleText;\r\n subTitleText = ej.EjSvgRender.utils._trimText(subTitleText, maxSubTitleWidth, subTitle.font);\r\n measureTitle = ej.EjSvgRender.utils._measureText(titleText, $(this.svgObject).width() - this.model.margin.left - this.model.margin.right, title.font);\r\n measuresubTitle = ej.EjSvgRender.utils._measureText(subTitleText, $(this.svgObject).width() - this.model.margin.left - this.model.margin.right, subTitle.font);\r\n this.model.subTitleTooltip = true;\r\n }\r\n titleWidthVisibility = measureTitle.width > maxTitleWidth;\r\n // Drawing the chart subtitle\r\n\r\n if (subTitleText != \"\" && subTitleText != null) {\r\n if (((this.model.title.border.color == 'transparent') && (this.model.title.background == 'transparent')) || ((this.model.title.subTitle.border.color == 'transparent') && (this.model.title.subTitle.background == 'transparent'))) {\r\n subTitleLocation = (modelsubTitleHeight) / 2 + elementSpacing + this.model._titleLocation.Y + this.model._titleLocation._height * (this.model.titleWrapTextCollection ? (this.model.titleWrapTextCollection.length - 1) : 0);\r\n } else {\r\n subTitleLocation = (subTitleTextHeight / 2) + subTitleBorderSpacing + elementSpacing + ((titleVisibility && titleWidthVisibility) ? (measureTitle.height * this.model.titleWrapTextCollection.length) : titleTextHeight) + titleBorderSpacing + (subTitleFontSize / 3);\r\n }\r\n var locX = this.model._titleLocation.X + (this.model._titleLocation.size.width / 2);\r\n\r\n if (subTitleTextAlignment == \"near\") {\r\n locX = regionX = this.model._titleLocation.X;\r\n textanchor = \"start\";\r\n }\r\n else if (subTitleTextAlignment == \"far\") {\r\n locX = this.model._titleLocation.X + this.model._titleLocation.size.width;\r\n textanchor = \"end\";\r\n\r\n }\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { subTitle: subTitleText, location: { x: locX, y: subTitleLocation }, size: measuresubTitle };\r\n this._trigger(\"subTitleRendering\", commonEventArgs);\r\n var subTitleYposition = (((title.border.color == 'transparent') && (title.background == 'transparent')) || ((title.subTitle.border.color == 'transparent') && (title.subTitle.background == 'transparent'))) ? commonEventArgs.data.location.y : commonEventArgs.data.location.y - (elementSpacing / 2);\r\n\r\n var options = {\r\n 'id': this.svgObject.id + '_ChartSubTitleText',\r\n\r\n 'x': commonEventArgs.data.location.x,\r\n 'y': subTitleYposition,\r\n 'fill': subTitle.font.color,\r\n 'font-size': subTitle.font.size,\r\n 'font-family': subTitle.font.fontFamily,\r\n 'font-style': subTitle.font.fontStyle,\r\n 'font-weight': subTitle.font.fontWeight,\r\n 'opacity': subTitle.font.opacity,\r\n 'text-anchor': textanchor\r\n };\r\n\r\n var x, y, subTitleXLocation = commonEventArgs.data.location.x;\r\n if (textanchor == \"start\") x = subTitleXLocation - elementSpacing;\r\n else if (textanchor == \"end\")\r\n x = subTitleVisibility ? subTitleXLocation - elementSpacing - this.model.subTitleMaxWidth : subTitleXLocation - elementSpacing - (measuresubTitle.width);\r\n else\r\n x = subTitleVisibility ? subTitleXLocation - elementSpacing - (this.model.subTitleMaxWidth / 2) : subTitleXLocation - elementSpacing - (measuresubTitle.width / 2);\r\n y = (((title.border.color == 'transparent') && (title.background == 'transparent')) || ((subTitle.border.color == 'transparent') && (subTitle.background == 'transparent'))) ? commonEventArgs.data.location.y - subTitleTextHeight + (subTitleTextHeight / 4) : commonEventArgs.data.location.y - subTitleTextHeight + (subTitleTextHeight / 4) - (elementSpacing / 2);\r\n var borderOptions = {\r\n 'id': this.svgObject.id + '_ChartSubTitleBorder',\r\n 'x': x,\r\n 'y': y,\r\n 'rx': subTitle.border.cornerRadius,\r\n 'ry': subTitle.border.cornerRadius,\r\n 'width': subTitleVisibility ? this.model.subTitleMaxWidth + (2 * elementSpacing) : measuresubTitle.width + (2 * elementSpacing),\r\n 'height': subTitleVisibility ? measuresubTitle.height * this.model.subTitleWrapTextCollection.length : subTitleTextHeight,\r\n 'fill': subTitle.background,\r\n 'stroke-width': subTitle.border.width,\r\n 'stroke': subTitle.border.color,\r\n 'opacity': subTitle.border.opacity,\r\n 'class': \"e-subtitleborder\"\r\n };\r\n\r\n this.svgRenderer.drawRect(borderOptions, this.gSubTitleEle);\r\n\r\n if (subTitleVisibility && measuresubTitle.width > maxSubTitleWidth) {\r\n for (var k = 0; k < this.model.subTitleWrapTextCollection.length; k++) {\r\n options.id = this.svgObject.id + '_ChartSubTitleText_' + k;\r\n if (k != 0) options.y = options.y + measuresubTitle.height;\r\n this.svgRenderer.drawText(options, this.model.subTitleWrapTextCollection[k], this.gSubTitleEle);\r\n }\r\n\r\n }\r\n else this.svgRenderer.drawText(options, commonEventArgs.data.subTitle, this.gSubTitleEle);\r\n\r\n var subSize = { width: (this.model.subTitleTooltip) ? maxSubTitleWidth : measuresubTitle.width, height: (measuresubTitle.height * (this.model.subTitleWrapTextCollection.length)) };\r\n if (textanchor == \"middle\")\r\n regionX = locX - subSize.width / 2;\r\n else if (textanchor == \"end\")\r\n regionX = locX - subSize.width;\r\n this.model._subTitleLocation = { X: regionX, Y: (commonEventArgs.data.location.y - measuresubTitle.height / 2), size: subSize };\r\n\r\n this.svgRenderer.append(this.gSubTitleEle, this.gTitleEle);\r\n }\r\n },\r\n\r\n\r\n _calculateStackingValues: function (seriesCollection, axis, params) {\r\n\r\n var chartModel = this.model;\r\n chartModel.stackedValue[axis.name] = [];\r\n var stackedValue = chartModel.stackedValue[axis.name];\r\n stackedValue.min = 0;\r\n stackedValue.max = 0;\r\n var stackAxes = (!chartModel.requireInvertedAxes) ? chartModel.hAxes : chartModel.vAxes,\r\n stackAxesLength = stackAxes.length, visiblePointsLength, yValues, stackingGroup,\r\n seriesLength = seriesCollection.length, visiblePoints,\r\n lastPosValue, lastNegValue, values, lastValue, currentValue,\r\n isNul = ej.util.isNullOrUndefined;\r\n\r\n for (var k = 0; k < stackAxesLength; k++) {\r\n j = 0;\r\n var lastPosValue = [], lastNegValue = [], firstPositive = [], firstNegative = [],\r\n crossing = 0, series, visiblePointIndex;\r\n for (var i = 0; i < seriesCollection.length; i++) {\r\n if (seriesCollection[i]._xAxisName == stackAxes[k].name) {\r\n if (seriesCollection[i].type.toLowerCase().indexOf(\"stacking\") != -1 || seriesCollection[i].isStacking) {\r\n values = {};\r\n values.StartValues = [];\r\n values.EndValues = [];\r\n stackingGroup = seriesCollection[i].stackingGroup;\r\n if (stackingGroup && seriesCollection[i].type.toLowerCase() != \"stackingarea\") {\r\n if (isNul(lastPosValue[stackingGroup])) {\r\n lastPosValue[stackingGroup] = [];\r\n lastNegValue[stackingGroup] = [];\r\n firstPositive[stackingGroup] = [];\r\n firstNegative[stackingGroup] = [];\r\n }\r\n }\r\n\r\n else {\r\n stackingGroup = \"\";\r\n if (isNul(lastPosValue[stackingGroup])) {\r\n lastPosValue[stackingGroup] = [];\r\n lastNegValue[stackingGroup] = [];\r\n firstPositive[stackingGroup] = [];\r\n firstNegative[stackingGroup] = [];\r\n }\r\n }\r\n series = seriesCollection[i];\r\n crossing = this._getXCrossValue(series, stackAxes[k], params);\r\n if (typeof (crossing) !== 'number')\r\n crossing = 0;\r\n visiblePoints = ej.EjSeriesRender.prototype._isVisiblePoints(series);\r\n yValues = this._getYValues(series._visiblePoints);\r\n visiblePointsLength = visiblePoints.length;\r\n for (var j = 0; j < visiblePointsLength; j++) {\r\n var lastValue = 0, correction = 0, currentValue = yValues[j];\r\n if (isNul(lastPosValue[stackingGroup][series._visiblePoints[j].xValue])) {\r\n lastPosValue[stackingGroup][series._visiblePoints[j].xValue] = crossing;\r\n }\r\n if (isNul(lastNegValue[stackingGroup][series._visiblePoints[j].xValue])) {\r\n lastNegValue[stackingGroup][series._visiblePoints[j].xValue] = crossing;\r\n }\r\n if (values.StartValues.length <= j) {\r\n values.StartValues.push(0);\r\n values.EndValues.push(0);\r\n }\r\n if (currentValue >= 0) {\r\n firstPositive[stackingGroup][j] = firstPositive[stackingGroup][j] == null;\r\n currentValue -= firstPositive[stackingGroup][j] && crossing;\r\n if (series.type.toLowerCase().indexOf(\"stacking\") != -1 || currentValue > 0)\r\n lastValue = lastPosValue[stackingGroup][series._visiblePoints[j].xValue];\r\n else\r\n lastValue = 0;\r\n lastPosValue[stackingGroup][series._visiblePoints[j].xValue] += currentValue;\r\n correction = lastValue < crossing ? crossing - lastValue : 0;\r\n values.StartValues[j] = lastValue + correction;\r\n values.EndValues[j] = currentValue + lastValue;\r\n }\r\n else {\r\n firstNegative[stackingGroup][j] = firstNegative[stackingGroup][j] == null;\r\n currentValue -= firstNegative[stackingGroup][j] && crossing;\r\n lastValue = lastNegValue[stackingGroup][series._visiblePoints[j].xValue];\r\n lastNegValue[stackingGroup][series._visiblePoints[j].xValue] += currentValue;\r\n values.StartValues[j] = lastValue;\r\n values.EndValues[j] = currentValue + lastValue;\r\n if (crossing < values.EndValues[j]) {\r\n lastNegValue[stackingGroup][series._visiblePoints[j].xValue] = values.StartValues[j];\r\n lastPosValue[stackingGroup][series._visiblePoints[j].xValue] = values.EndValues[j];\r\n firstPositive[stackingGroup][j] = firstPositive[stackingGroup][j] == null;\r\n }\r\n }\r\n\r\n visiblePointIndex = visiblePoints[j].actualIndex;\r\n series.points[visiblePointIndex].YValues = [values.EndValues[j]];\r\n }\r\n values.stackedSeries = true;\r\n stackedValue.push(values);\r\n if (stackedValue.min > Math.min.apply(0, values.StartValues))\r\n stackedValue.min = Math.min.apply(0, values.StartValues);\r\n if (stackedValue.max < Math.max.apply(0, values.EndValues))\r\n stackedValue.max = Math.max.apply(0, values.EndValues);\r\n series.stackedValue = values;\r\n }\r\n }\r\n }\r\n }\r\n },\r\n _calculateStackingCumulativeValues: function (seriesCollection, axis, params) {\r\n this.model.stackedValue[axis.name] = [];\r\n this.model.stackedValue[axis.name].min = 0;\r\n this.model.stackedValue[axis.name].max = 0;\r\n var stackAxes = (!this.model.requireInvertedAxes) ? this.model.hAxes : this.model.vAxes;\r\n var seriesLength = seriesCollection.length;\r\n var axesLength = stackAxes.length;\r\n var percent;\r\n for (var k = 0; k < axesLength; k++) {\r\n var posValues = [], negValues = [], frequencies = [], stackingName = \" \", firstPositive = [], firstNegative = [], crossing = 0, seriesGroupCount = [];\r\n\r\n //calculate the cumulative frequencies from the collection of series \r\n for (var i = 0; i < seriesLength; i++) {\r\n var visiblePoints = ej.EjSeriesRender.prototype._isVisiblePoints(seriesCollection[i]);\r\n stackingName = seriesCollection[i].stackingGroup;\r\n if (seriesCollection[i].type.toLowerCase().indexOf(\"100\") != -1) {\r\n if (seriesCollection[i]._xAxisName == stackAxes[k].name) {\r\n if (seriesCollection[i].stackingGroup && seriesCollection[i].type.toLowerCase() != \" stackingarea100 \") {\r\n if (!posValues[stackingName]) {\r\n frequencies[stackingName] = [];\r\n posValues[stackingName] = [];\r\n negValues[stackingName] = [];\r\n firstPositive[stackingName] = [];\r\n firstNegative[stackingName] = [];\r\n }\r\n }\r\n else {\r\n seriesCollection[i].stackingGroup = \"\";\r\n stackingName = seriesCollection[i].stackingGroup;\r\n if (!posValues[stackingName]) {\r\n frequencies[stackingName] = [];\r\n posValues[stackingName] = [];\r\n negValues[stackingName] = [];\r\n firstPositive[stackingName] = [];\r\n firstNegative[stackingName] = [];\r\n }\r\n }\r\n seriesGroupCount[stackingName] = i;\r\n var yValues = this._getYValues(seriesCollection[i]._visiblePoints);\r\n var yValuesLength = yValues.length;\r\n for (var j = 0; j < yValuesLength; j++) {\r\n var getYValue = yValues[j];\r\n if (!frequencies[stackingName][seriesCollection[i].points[j].xValue]) {\r\n frequencies[stackingName][seriesCollection[i].points[j].xValue] = 0;\r\n }\r\n frequencies[stackingName][seriesCollection[i].points[j].xValue] += Math.abs(getYValue);\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n //calculate the cumulative percentage for each series points\r\n for (var i = 0; i < seriesLength; i++) {\r\n stackingName = seriesCollection[i].stackingGroup;\r\n if (seriesCollection[i].type.toLowerCase().indexOf(\"100\") != -1) {\r\n var stackedSeries = false;\r\n if (seriesCollection[i]._xAxisName == stackAxes[k].name) {\r\n var values = {};\r\n values.StartValues = [];\r\n values.EndValues = [];\r\n var series = seriesCollection[i];\r\n crossing = this._getXCrossValue(series, stackAxes[k], params);\r\n if (typeof (crossing) !== 'number')\r\n crossing = 0;\r\n var yValues = this._getYValues(series._visiblePoints);\r\n var yValuesLength = yValues.length;\r\n for (var j = 0; j < yValuesLength; j++) {\r\n var lastValue, correction = 0;\r\n var currentValue = yValues[j];\r\n\r\n //Pecentage calculation for point \r\n percent = (currentValue / frequencies[stackingName][series.points[j].xValue]) * 100\r\n currentValue = !isNaN(percent) ? percent : 0;\r\n series.points[j].percentage = currentValue.toFixed(2);\r\n if (!posValues[stackingName][series.points[j].xValue]) {\r\n posValues[stackingName][series.points[j].xValue] = crossing;\r\n }\r\n if (!negValues[stackingName][series.points[j].xValue]) {\r\n negValues[stackingName][series.points[j].xValue] = crossing;\r\n }\r\n if (values.StartValues.length <= j) {\r\n values.StartValues.push(0);\r\n values.EndValues.push(0);\r\n }\r\n if (currentValue >= 0) {\r\n var posValue = posValues[stackingName][series.points[j].xValue];\r\n firstPositive[stackingName][j] = firstPositive[stackingName][j] == null;\r\n currentValue -= firstPositive[stackingName][j] && crossing;\r\n correction = posValue < crossing ? crossing - posValue : 0;\r\n lastValue = posValue;\r\n posValues[stackingName][series.points[j].xValue] += currentValue;\r\n }\r\n else {\r\n var negValue = negValues[stackingName][series.points[j].xValue];\r\n firstNegative[stackingName][j] = firstNegative[stackingName][j] == null;\r\n currentValue -= firstNegative[stackingName][j] && crossing;\r\n correction = negValue > crossing ? crossing - negValue : 0;\r\n lastValue = negValue;\r\n negValues[stackingName][series.points[j].xValue] += currentValue;\r\n }\r\n values.StartValues[j] = lastValue + correction;\r\n values.EndValues[j] = lastValue + currentValue;\r\n if (values.EndValues[j] > 100) values.EndValues[j] = 100;\r\n series.points[j].YValues = [values.EndValues[j]];\r\n stackedSeries = seriesGroupCount[stackingName] == i ? false || (stackedSeries) : true;\r\n }\r\n values.stackedSeries = stackedSeries;\r\n this.model.stackedValue[axis.name].push(values);\r\n if (this.model.stackedValue[axis.name].min > Math.min.apply(0, values.StartValues))\r\n this.model.stackedValue[axis.name].min = Math.min.apply(0, values.StartValues);\r\n if (this.model.stackedValue[axis.name].max < Math.max.apply(0, values.EndValues))\r\n this.model.stackedValue[axis.name].max = Math.max.apply(0, values.EndValues);\r\n if (this.model.stackedValue[axis.name].min > Math.min.apply(0, values.EndValues))\r\n this.model.stackedValue[axis.name].min = -100;\r\n\r\n series.stackedValue = values;\r\n }\r\n }\r\n }\r\n }\r\n },\r\n _legendItemBounds: function (itemCount, legendItemWidth, legendItemHeight) {\r\n var legend = this.model.legend, legVal,\r\n position = legend.position.toLowerCase(),\r\n itemPadding = legend.itemPadding,\r\n legnedHeightIncr, column, legendWidth = 0, legendHeight = 0;\r\n if (ej.util.isNullOrUndefined(legend.columnCount) && legend.rowCount) {\r\n legnedHeightIncr = legend.rowCount;\r\n column = Math.ceil(itemCount / legnedHeightIncr);\r\n legendWidth = legendItemWidth * column;\r\n legendHeight = legendItemHeight * legnedHeightIncr;\r\n }\r\n else if (ej.util.isNullOrUndefined(legend.rowCount) && legend.columnCount) {\r\n legnedHeightIncr = Math.ceil(itemCount / legend.columnCount);\r\n legVal = legend.columnCount;\r\n legendWidth = legendItemWidth * legVal;\r\n legendHeight = legendItemHeight * legnedHeightIncr;\r\n }\r\n else if ((legend.rowCount) && (legend.columnCount)) {\r\n if (legend.columnCount < legend.rowCount) {\r\n legnedHeightIncr = legend.rowCount;\r\n column = Math.ceil(itemCount / legnedHeightIncr);\r\n legendWidth = legendItemWidth * column;\r\n legendHeight = legendItemHeight * legnedHeightIncr;\r\n }\r\n else if (legend.columnCount > legend.rowCount) {\r\n if (position === 'top' || position === 'bottom' || position === 'custom') {\r\n legnedHeightIncr = Math.ceil(itemCount / legend.columnCount);\r\n legVal = legend.columnCount;\r\n legendWidth = legendItemWidth * legVal;\r\n legendHeight = legendItemHeight * legnedHeightIncr;\r\n } else {\r\n legnedHeightIncr = Math.ceil(itemCount / legend.columnCount);\r\n column = Math.ceil(itemCount / legnedHeightIncr);\r\n legendWidth = legendItemWidth * column;\r\n legendHeight = legendItemHeight * legnedHeightIncr;\r\n }\r\n }\r\n else {\r\n if (position === 'top' || position === 'bottom' || position === 'custom') {\r\n legnedHeightIncr = Math.ceil(itemCount / legend.columnCount);\r\n legVal = Math.ceil(itemCount / legend.rowCount);\r\n legendWidth = legendItemWidth * legend.columnCount;\r\n legendHeight = legendItemHeight * legVal;\r\n } else {\r\n legnedHeightIncr = legend.rowCount;\r\n column = Math.ceil(itemCount / legnedHeightIncr);\r\n legendWidth = legendItemWidth * column;\r\n legendHeight = legendItemHeight * legnedHeightIncr;\r\n }\r\n\r\n }\r\n\r\n }\r\n legendHeight += this.model.elementSpacing;\r\n return { LegendWidth: legendWidth, LegendHeight: legendHeight };\r\n },\r\n\r\n _isEjScroller: function () {\r\n var chart = this,\r\n chartModel = chart.model,\r\n legendContainer = $(chart.legendContainer),\r\n legend = chartModel.legend;\r\n if (ej.util.isNullOrUndefined($('#' + legendContainer[0].id).ejScroller))\r\n legend._ejScroller = false;\r\n else\r\n legend._ejScroller = legend.enableScrollbar;\r\n },\r\n\r\n //legend text wrapping\r\n _rowsCalculation: function (data, textmaxwidth, textOverflow) {\r\n var chart = this,\r\n chartModel = chart.model,\r\n legend = chartModel.legend,\r\n word, textCollection = [], currentWidth, nextWidth,\r\n text = data.legendItem ? data.legendItem.Text.toString() : data.text,\r\n legendTextCollection = text.split(' '),\r\n textMaxWidth = textmaxwidth,\r\n font = data.legendItem ? data.legendItem.LegendStyle.Font : data.font,\r\n legendTextLength = legendTextCollection.length,\r\n wordMax = 0;\r\n\r\n for (var i = 0; i < legendTextLength; i++) {\r\n word = legendTextCollection[i];\r\n currentWidth = ej.EjSvgRender.utils._measureText(word, null, font).width;\r\n if (currentWidth <= textMaxWidth) {\r\n while (i < legendTextLength) {\r\n currentWidth = ej.EjSvgRender.utils._measureText(word, null, font).width;\r\n nextWidth = (legendTextCollection[i + 1]) ? ej.EjSvgRender.utils._measureText(legendTextCollection[i + 1], null, font).width : 0;\r\n if ((currentWidth + nextWidth) <= textMaxWidth && nextWidth > 0) {\r\n word = word.concat(' ' + legendTextCollection[i + 1]);\r\n i++;\r\n }\r\n else {\r\n wordMax = Math.max(wordMax, currentWidth);\r\n break;\r\n }\r\n }\r\n textCollection.push(word);\r\n }\r\n else {\r\n if (textOverflow == \"wrapandtrim\") {\r\n word = ej.EjSvgRender.utils._trimText(word, textMaxWidth, font);\r\n textCollection.push(word);\r\n this.model._legendMaxWidth = textMaxWidth;\r\n wordMax = Math.max(wordMax, textMaxWidth);\r\n if (!data.legendItem) this.model.trimTooltip = true;\r\n }\r\n else {\r\n textCollection.push(word);\r\n if (data.legendItem)\r\n this.model._legendMaxWidth = Math.max(this.model._legendMaxWidth, currentWidth);\r\n else wordMax = Math.max(wordMax, currentWidth);\r\n }\r\n }\r\n }\r\n this.model._legendMaxHeight = Math.max(this.model._legendMaxHeight, textCollection.length);\r\n return { textCollection: textCollection, wordMax: wordMax };\r\n },\r\n\r\n _triggerLegendEvent: function (name, color, index) {\r\n var chart = this,\r\n chartModel = chart.model,\r\n legend = chartModel.legend,\r\n areaType = chartModel.AreaType,\r\n itemStyle = legend.itemStyle,\r\n border = itemStyle.border,\r\n elementSpacing = chartModel.elementSpacing,\r\n textMaxWidth = legend.textWidth,\r\n svgRender = ej.EjSvgRender,\r\n chartSvgRender = chart.svgRenderer,\r\n seriesLength = chartModel._visibleSeries.length,\r\n svgObject = chart.svgObject,\r\n isCanvas = chartModel.enableCanvasRendering,\r\n elementSpacing = chartModel.elementSpacing,\r\n textOverflow = legend.textOverflow.toLowerCase(),\r\n legendItem, legendFont, textWidth, commonEventArgs,\r\n style = {\r\n BorderColor: border.color,\r\n BorderWidth: border.width,\r\n Opacity: legend.opacity,\r\n Color: color,\r\n Font: legend.font\r\n };\r\n\r\n commonEventArgs = $.extend({}, svgRender.commonChartEventArgs);\r\n commonEventArgs.data = {\r\n svgRenderer: chartSvgRender,\r\n svgObject: svgObject,\r\n symbolShape: legend.shape,\r\n legendItem: {\r\n Text: name,\r\n Shape: legend.shape,\r\n LegendStyle: style,\r\n SeriesIndex: (areaType == \"none\" && seriesLength == 1) ? 0 : index,\r\n },\r\n style: {\r\n ShapeSize: itemStyle,\r\n ElementSpace: elementSpacing,\r\n Style: style,\r\n ID: chart.svgObject.id + '_LegendItemShape' + index,\r\n SeriesIndex: (areaType == \"none\" && seriesLength == 1) ? 0 : index,\r\n },\r\n gLegendItemEle: chart.gLegendItemEle\r\n };\r\n if (isCanvas)\r\n commonEventArgs.data.style.context = true;\r\n chart._trigger(\"legendItemRendering\", commonEventArgs);\r\n legendItem = commonEventArgs.data.legendItem.Text;\r\n legendFont = commonEventArgs.data.legendItem.LegendStyle.Font;\r\n textWidth = ej.EjSvgRender.utils._measureText(legendItem, null, legendFont).width;\r\n if (textOverflow == \"trim\") {\r\n if (textWidth > textMaxWidth) {\r\n legendItem = ej.EjSvgRender.utils._trimText(legendItem, textMaxWidth, legendFont);\r\n this.model._legendMaxWidth = textMaxWidth;\r\n }\r\n }\r\n else if (textOverflow == \"wrap\" || textOverflow == \"wrapandtrim\") {\r\n legendItem = this._rowsCalculation(commonEventArgs.data, textMaxWidth, this.model.legend.textOverflow.toLowerCase()).textCollection;\r\n }\r\n return { commonEventArgs: commonEventArgs, legendItem: legendItem };\r\n },\r\n\r\n _calculateLegendBounds: function () {\r\n // intialize\r\n this.model.legendCollection = [];\r\n this.model.legendTextRegion = [];\r\n this.model.legendRegion = [];\r\n this.model.svgHeight = $(this.svgObject).height();\r\n this.model.svgWidth = $(this.svgObject).width();\r\n this.model._legendMaxWidth = 0;\r\n this.model._legendMaxHeight = 0;\r\n\r\n var chart = this,\r\n chartModel = chart.model,\r\n math = Math,\r\n max = math.max,\r\n min = math.min,\r\n abs = math.abs,\r\n legend = chartModel.legend,\r\n padding = 10,\r\n legendSizeHeight = legend.size.height,\r\n legendSizeWidth = legend.size.width,\r\n itemPadding = legend.itemPadding > 0 ? legend.itemPadding : 0,\r\n position = legend.position.toLowerCase(),\r\n width = 0, height = 0,\r\n svgHeight = chartModel.svgHeight,\r\n svgWidth = chartModel.svgWidth,\r\n legendItemWidth = 0,\r\n legendItemHeight = 0,\r\n legendWidth = 0,\r\n legendHeight = 0,\r\n legnedHeightIncr = 1,\r\n currentLegend,\r\n index,\r\n bounds, legendBounds,\r\n legendviewerHeight = 0, legendviewerWidth = 0,\r\n legendHeightTemp, legendWidthTemp,\r\n tempSeries = {},\r\n legendSeries = [], trendLineLength, trendLines,\r\n trendLine,\r\n trendlineType,\r\n areaType = chartModel.AreaType,\r\n visibleSeries = chartModel._visibleSeries,\r\n rowCount = legend.rowCount, point,\r\n columnCount = legend.columnCount,\r\n elementSpacing = chartModel.elementSpacing,\r\n visiblePoints, series,\r\n length, legendColor, legendName, legendStyleColor, legendSeriesLength, legendContainer, legendSvgContainer,\r\n titleSize = ej.EjSvgRender.utils._measureText(legend.title.text, null, legend.title.font),\r\n legendsize, colorGradName, visibleOnLegend,\r\n vScrollSize = 0, hScrollSize = 0,\r\n borderSize = chartModel.border.width,\r\n legendBorder = legend.border.width, type,\r\n legendInfo, legendStyle, legendFont, shapeWidth,\r\n textOverflow = legend.textOverflow.toLowerCase(),\r\n svgObjectHeight = svgHeight - ((elementSpacing * 4) + (borderSize * 2) + (legend.border.width * 2)),\r\n svgObjectWidth = svgWidth - ((elementSpacing * 4) + (borderSize * 2) + (legendBorder * 2));\r\n\r\n if (visibleSeries && legend.visible && visibleSeries.length != 0) {\r\n type = visibleSeries[0].type.toLowerCase();\r\n if (areaType == \"none\" && visibleSeries.length == 1 || type == 'pieofpie' || type == 'pyramid' || type == 'funnel') {\r\n\r\n series = visibleSeries[0];\r\n visiblePoints = ej.EjSeriesRender.prototype._calculateVisiblePoints(series).legendPoints;\r\n length = visiblePoints.length;\r\n for (var j = 0; j < length; j++) {\r\n legendColor = legend.fill ? (!(legend.fill._gradientStop) ? legend.fill : legend.fill._gradientStop) : chartModel.pointColors[visiblePoints[j].actualIndex];\r\n point = visiblePoints[j];\r\n legendName = !ej.util.isNullOrUndefined(point.x) ? point.x : 'series' + j;\r\n visibleOnLegend = !(point.visibleOnLegend) ? 'visible' : point.visibleOnLegend;\r\n if (!point.isEmpty && visibleOnLegend.toLowerCase() == 'visible' && series.visibleOnLegend.toLowerCase() == \"visible\") {\r\n legendInfo = this._triggerLegendEvent(legendName, legendColor, j);\r\n legendStyle = legendInfo.commonEventArgs.data.legendItem.LegendStyle;\r\n tempSeries = {\r\n Text: legendInfo.legendItem,\r\n displayText: legendInfo.commonEventArgs.data.legendItem.Text,\r\n Font: legendStyle.Font,\r\n SeriesIndex: 0,\r\n PointIndex: j,\r\n ActualIndex: point.actualIndex,\r\n fill: legendStyle.Color,\r\n visibility: (point.visible !== false) ? 'visible' : 'hidden',\r\n Shape: legendInfo.commonEventArgs.data.legendItem.Shape,\r\n LegendStyle: legendStyle,\r\n CommonEventArgs: { cancel: legendInfo.commonEventArgs.cancel, data: legendInfo.commonEventArgs.data }\r\n };\r\n legendSeries.push(tempSeries);\r\n }\r\n }\r\n }\r\n else {\r\n length = visibleSeries.length;\r\n for (var j = 0; j < length; j++) {\r\n legendColor = legend.fill ? (!(legend.fill._gradientStop) ? legend.fill : legend.fill._gradientStop) : ej.util.isNullOrUndefined(chartModel.seriesColors[j]) ? chartModel.pointColors[j] : chartModel.seriesColors[j];\r\n series = visibleSeries[j];\r\n legendName = series.name ? series.name : 'series' + j;\r\n if (series.visibleOnLegend.toLowerCase() == \"visible\") {\r\n legendInfo = this._triggerLegendEvent(legendName, legendColor, j);\r\n legendStyle = legendInfo.commonEventArgs.data.legendItem.LegendStyle;\r\n tempSeries = {\r\n Text: legendInfo.legendItem,\r\n displayText: legendInfo.commonEventArgs.data.legendItem.Text,\r\n Font: legendStyle.Font,\r\n SeriesIndex: j,\r\n fill: legendStyle.Color,\r\n visibility: series.visibility,\r\n Shape: legendInfo.commonEventArgs.data.legendItem.Shape,\r\n LegendStyle: legendStyle,\r\n CommonEventArgs: { cancel: legendInfo.commonEventArgs.cancel, data: legendInfo.commonEventArgs.data }\r\n };\r\n legendSeries.push(tempSeries);\r\n }\r\n trendLines = series.trendlines;\r\n trendLineLength = trendLines.length;\r\n for (var i = 0; i < trendLineLength; i++) {\r\n trendLine = trendLines[i];\r\n legendColor = legend.fill ? (!(legend.fill._gradientStop) ? legend.fill : legend.fill._gradientStop) : trendLine.fill;\r\n legendName = trendLine.name ? trendLine.name : 'series' + j;\r\n if (trendLine.visibility != '' && trendLine.visibleOnLegend.toLowerCase() == \"visible\") {\r\n legendInfo = this._triggerLegendEvent(legendName, legendColor, j);\r\n legendStyle = legendInfo.commonEventArgs.data.legendItem.LegendStyle;\r\n tempSeries = {\r\n Text: legendInfo.legendItem,\r\n displayText: legendInfo.commonEventArgs.data.legendItem.Text,\r\n Font: legendStyle.Font,\r\n SeriesIndex: j,\r\n trendLineIndex: i,\r\n fill: legendStyle.Color,\r\n isTrendLine: true,\r\n visibility: series.visibility.toLowerCase() == \"visible\" ? trendLine.visibility : \"hidden\",\r\n Shape: legendInfo.commonEventArgs.data.legendItem.Shape,\r\n LegendStyle: legendStyle,\r\n CommonEventArgs: { cancel: legendInfo.commonEventArgs.cancel, data: legendInfo.commonEventArgs.data }\r\n };\r\n legendSeries.push(tempSeries);\r\n }\r\n }\r\n }\r\n }\r\n\r\n legendSeriesLength = legendSeries.length;\r\n for (var j = 0; j < legendSeriesLength; j++) {\r\n currentLegend = legendSeries[j];\r\n shapeWidth = currentLegend.CommonEventArgs.data.style.ShapeSize.width;\r\n legendsize = chart._getLegendSize(currentLegend);\r\n legendItemWidth = max(this.model._legendMaxWidth > 0 ? (this.model._legendMaxWidth + itemPadding + shapeWidth) : legendsize.Width, legendItemWidth);\r\n legendItemHeight = max((textOverflow == \"wrap\" || textOverflow == \"wrapandtrim\") ? legendsize.Height * this.model._legendMaxHeight : legendsize.Height, legendItemHeight);\r\n }\r\n legendHeight = legendItemHeight + elementSpacing * 2;\r\n legendWidth = legendItemWidth;\r\n\r\n if (columnCount || rowCount) {\r\n legendBounds = chart._legendItemBounds(legendSeries.length, legendItemWidth + (itemPadding), legendItemHeight + (itemPadding));\r\n legendWidth = legendBounds.LegendWidth;\r\n legendHeight = legendBounds.LegendHeight;\r\n if (position === 'top' || position === 'bottom' || position === 'custom')\r\n legendHeight = legendHeight - itemPadding + elementSpacing;\r\n else\r\n legendWidth = legendWidth - itemPadding;\r\n }\r\n for (var k = 0; k < legendSeriesLength; k++) {\r\n currentLegend = legendSeries[k];\r\n index = currentLegend.SeriesIndex;\r\n series = chartModel.series[index];\r\n legendsize = chart._getLegendSize(currentLegend);\r\n if (textOverflow == \"wrap\" || textOverflow == \"wrapandtrim\") {\r\n legendsize.Width = legendItemWidth;\r\n legendsize.Height = legendItemHeight;\r\n }\r\n if (!(rowCount) && !(columnCount)) {\r\n\r\n if ((position == 'top' || position == 'bottom' || position == 'custom')) {\r\n width += legendsize.Width + itemPadding;\r\n if (width > svgObjectWidth && k != 0) {\r\n width -= legendsize.Width + itemPadding;\r\n legendWidth = max(legendWidth, width);\r\n width = legendsize.Width + itemPadding;\r\n legnedHeightIncr++;\r\n legendHeight += legendItemHeight + itemPadding;\r\n }\r\n else\r\n legendWidth = max(legendWidth, width);\r\n\r\n height = max(height, legendItemHeight);\r\n }\r\n else {\r\n height += legendsize.Height + itemPadding;\r\n if (height > svgObjectHeight) {\r\n height -= legendsize.Height + itemPadding;\r\n legendHeight = max(legendHeight, height);\r\n height = legendsize.Height + itemPadding;\r\n legendWidth += legendItemWidth + itemPadding;\r\n }\r\n else\r\n legendHeight = max(legendHeight, height);\r\n\r\n width = max(width, legendItemWidth);\r\n }\r\n }\r\n if (currentLegend.visibility.toLowerCase() == \"visible\")\r\n colorGradName = chart.svgRenderer.createGradientElement('legend' + k, legendSeries[k].fill, 0, 0, 0, svgObjectHeight, chart.gLegendEle);\r\n else\r\n colorGradName = 'gray';\r\n currentLegend.CommonEventArgs.data.legendItem.LegendStyle.Color = colorGradName;\r\n bounds = (rowCount || columnCount) ? { Width: legendItemWidth, Height: legendItemHeight } : legendsize;\r\n bounds._Width = legendsize.Width;\r\n\r\n if (currentLegend.isTrendLine) {\r\n currentLegend.TrendLineIndex = currentLegend.trendLineIndex;\r\n trendlineType = series.trendlines[currentLegend.trendLineIndex].type.toLowerCase();\r\n currentLegend.CommonEventArgs.data.legendItem.drawType = currentLegend.drawType = trendlineType == 'linear' || trendlineType == \"movingaverage\" ? 'line' : 'spline';\r\n }\r\n legendSeries[k].Bounds = bounds;\r\n chartModel.legendCollection.push(currentLegend);\r\n }\r\n\r\n //LegendBounds calculation Perform here..\r\n if (position === 'top' || position === 'bottom' || position === 'custom') {\r\n legendWidth = titleSize.width > legendWidth - itemPadding ? (titleSize.width + padding * 2 + itemPadding) : legendWidth + padding * 2;\r\n width += padding;\r\n height += padding * 2;\r\n chartModel.LegendBounds = { Width: max(legendWidth, width) - itemPadding, Height: max(legendHeight, height), Rows: legnedHeightIncr };\r\n }\r\n else {\r\n legendWidth = titleSize.width > legendWidth ? (titleSize.width + padding * 2) : legendWidth + padding * 2;\r\n width += padding;\r\n height += padding;\r\n chartModel.LegendBounds = { Width: max(legendWidth, width), Height: max(legendHeight, height) + padding - itemPadding, Columns: legnedHeightIncr };\r\n }\r\n //Calculating legend viewer bounds or calculate user specified legend bounds\r\n chartModel.LegendViewerBounds = { Width: \"0\", Height: \"0\" };\r\n\r\n if (legendSizeHeight == \"\" || legendSizeHeight == null) {\r\n if (position == 'left' || position == 'right' || position == 'custom')\r\n legendHeightTemp = abs(svgHeight);\r\n else\r\n legendHeightTemp = abs((svgHeight / 100) * parseInt('20%'));\r\n chartModel.LegendViewerBounds.Height = min(legendHeightTemp, chartModel.LegendBounds.Height);\r\n }\r\n else {\r\n if (legendSizeHeight.indexOf(\"%\") != -1)\r\n chartModel.LegendViewerBounds.Height = abs((svgHeight / 100) * parseInt(legendSizeHeight));\r\n else\r\n chartModel.LegendViewerBounds.Height = parseInt(legendSizeHeight);\r\n }\r\n\r\n if (legendSizeWidth == \"\" || legendSizeWidth == null) {\r\n if (position == 'top' || position == 'bottom' || position == 'custom')\r\n legendWidthTemp = abs(svgWidth);\r\n else\r\n legendWidthTemp = abs((svgWidth / 100) * parseInt('20%'));\r\n chartModel.LegendViewerBounds.Width = min(legendWidthTemp, chartModel.LegendBounds.Width);\r\n }\r\n else {\r\n if (legendSizeWidth.indexOf(\"%\") != -1)\r\n chartModel.LegendViewerBounds.Width = abs((svgWidth / 100) * parseInt(legendSizeWidth));\r\n else\r\n chartModel.LegendViewerBounds.Width = parseInt(legendSizeWidth);\r\n }\r\n }\r\n else {\r\n chartModel.LegendBounds = { Width: 0, Height: 0 };\r\n chartModel.LegendViewerBounds = { Width: 0, Height: 0 };\r\n }\r\n legendContainer = $(chart.legendContainer);\r\n legendSvgContainer = $(chart.legendSvgContainer);\r\n if (legend.enableScrollbar) {\r\n chartModel.LegendActualBounds = chartModel.LegendViewerBounds;\r\n legendContainer.removeAttr(\"style\");\r\n legendContainer.css({ \"visibility\": 'hidden', \"width\": chartModel.LegendViewerBounds.Width, \"height\": chartModel.LegendViewerBounds.Height });\r\n legendSvgContainer.css({ \"height\": chartModel.LegendBounds.Height, \"width\": chartModel.LegendBounds.Width });\r\n\r\n if (legend._ejScroller)\r\n $('#' + legendContainer[0].id).ejScroller({ width: chartModel.LegendViewerBounds.Width, height: chartModel.LegendViewerBounds.Height })\r\n else\r\n legendContainer.css({ \"overflow\": \"scroll\" });\r\n\r\n if (chartModel.LegendBounds.Width > chartModel.LegendViewerBounds.Width && chartModel.LegendBounds.Height > chartModel.LegendViewerBounds.Height) {\r\n if (legend._ejScroller) {\r\n hScrollSize = $('.e-hscrollbar').height() || 0;\r\n vScrollSize = $('.e-vscrollbar').width() || 0;\r\n } else {\r\n legendContainer.css({ \"overflow\": \"scroll\" });\r\n hScrollSize = legendContainer[0].offsetHeight - (legendBorder * 2) - legendContainer[0].clientHeight;\r\n vScrollSize = legendContainer[0].offsetWidth - (legendBorder * 2) - legendContainer[0].clientWidth;\r\n }\r\n } else if (chartModel.LegendBounds.Width > chartModel.LegendViewerBounds.Width) {\r\n if (legend._ejScroller) {\r\n hScrollSize = $('.e-hscrollbar').height() || 0;\r\n vScrollSize = 0;\r\n }\r\n else {\r\n legendContainer[0].style.overflowX = \"scroll\";\r\n legendContainer[0].style.overflowY = \"hidden\";\r\n hScrollSize = legendContainer[0].offsetHeight - (legendBorder * 2) - legendContainer[0].clientHeight;\r\n vScrollSize = 0;\r\n }\r\n } else if (chartModel.LegendBounds.Height > chartModel.LegendViewerBounds.Height) {\r\n if (legend._ejScroller) {\r\n hScrollSize = 0;\r\n vScrollSize = $('.e-vscrollbar').width();\r\n }\r\n else {\r\n legendContainer[0].style.overflowY = \"scroll\";\r\n legendContainer[0].style.overflowX = \"hidden\";\r\n hScrollSize = 0;\r\n vScrollSize = legendContainer[0].offsetWidth - (legendBorder * 2) - legendContainer[0].clientWidth;\r\n }\r\n }\r\n\r\n }\r\n else {\r\n chartModel.LegendActualBounds = chartModel.LegendBounds;\r\n if (legendSizeWidth != \"\" && legendSizeWidth != null)\r\n chartModel.LegendActualBounds.Width = parseInt(legendSizeWidth);\r\n if (legendSizeHeight != \"\" && legendSizeHeight != null)\r\n chartModel.LegendActualBounds.Height = parseInt(legendSizeHeight);\r\n }\r\n chartModel.LegendActualBounds.Height += Math.abs(hScrollSize);\r\n chartModel.LegendActualBounds.Width += Math.abs(vScrollSize);\r\n chartModel.LegendActualBounds.hScrollSize = hScrollSize;\r\n chartModel.LegendActualBounds.vScrollSize = vScrollSize;\r\n },\r\n\r\n GetPointXYOrgin: function (x, y, orginX, orginY) {\r\n\r\n var xvalue = ((x - orginX) / (this.model.axes.PrimaryXaxis.visibleRange.max - orginX)) * (this.model.m_AreaBounds.Width);\r\n var yvalue = ((y - orginY) / (this.model.axes.PrimaryYaxis.visibleRange.max - orginY)) * (this.model.m_AreaBounds.Height - this.GetPointXY(this.model.axes.PrimaryXaxis.visibleRange.min, Math.max(this.model.axes.PrimaryYaxis.visibleRange.min, 0)).Y);\r\n\r\n return { X: xvalue, Y: yvalue };\r\n },\r\n\r\n _wrap: function (axis, gap, labelText, textOverflow, font, textSize) {\r\n var text = labelText, textWidth = textSize.width, textCollection = [], unTrimmedText = [], textLength = text.length,\r\n line = 0, i = 0, labelCollection = labelText.split(' '), labelCollectionLength = labelCollection.length;\r\n if (textOverflow == 'wrap') {\r\n if (textWidth > gap) {\r\n for (var w = 1; w <= text.length; w++) {\r\n labelText = text.substring(0, w);\r\n textWidth = ej.EjSvgRender.utils._measureText(labelText, null, font).width;\r\n if (textWidth > gap) {\r\n line = line + 1; // To find the no of rows splitted\r\n labelText = text.substring(0, w - 1);\r\n textCollection[i] = labelText;\r\n text = text.slice(w - 1, textLength);\r\n currentTextCollextion = text.split(' ');\r\n text = labelCollection.indexOf(currentTextCollextion[0]) > -1 ? text : '-' + text;\r\n var newTextWidth = ej.EjSvgRender.utils._measureText(labelText, null, font).width;\r\n i++;\r\n w = 0;\r\n }\r\n }\r\n }\r\n textCollection[i] = labelText;\r\n }\r\n else if (textOverflow == \"wrapandtrim\") {\r\n var max = 0, word, currentWidth, nextWidth;\r\n for (var i = 0; i < labelCollectionLength; i++) {\r\n word = labelCollection[i];\r\n currentWidth = ej.EjSvgRender.utils._measureText(word, null, font).width;\r\n if (currentWidth < gap && textWidth > gap) {\r\n while (i < labelCollectionLength) {\r\n currentWidth = ej.EjSvgRender.utils._measureText(word, null, font).width;\r\n nextWidth = (labelCollection[i + 1]) ? ej.EjSvgRender.utils._measureText(labelCollection[i + 1], null, font).width : 0;\r\n if ((currentWidth + nextWidth) <= gap && nextWidth > 0) {\r\n word = word.concat(' ' + labelCollection[i + 1]);\r\n i++;\r\n }\r\n else {\r\n // find the maximum width of the lines\r\n max = Math.max(max, currentWidth);\r\n break;\r\n }\r\n }\r\n textCollection.push(word);\r\n }\r\n else {\r\n if (textWidth > gap) {\r\n unTrimmedText.push(word);\r\n word = ej.EjSvgRender.utils._trimText(word, gap, font);\r\n newTextWidth = ej.EjSvgRender.utils._measureText(word, null, font).width;\r\n max = Math.max(max, newTextWidth)\r\n textCollection.push(word);\r\n } else {\r\n textCollection.push(labelText);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return { text: textCollection, unTrimmedText: unTrimmedText };\r\n },\r\n\r\n // to get the size of multi level labels\r\n getMultiLevelLabelSize: function (axis) {\r\n var value = 0;\r\n axis._multiLevelLabelHeight = 0;\r\n\r\n // declaration\r\n var grpLabelArr = [], multiLevelLabelHeight = [], prevHeight = [], grpLabelLength = axis.multiLevelLabels.length,\r\n range = axis.visibleRange, grpLabel, level, i, startX, endX, labelSize, gap, height, padding = 10, textCollection, axisValue, borderStyle, greaterIndex, textOverflow,\r\n orientation = axis.orientation.toLowerCase(), braceFlag = [];\r\n if (orientation == \"vertical\")\r\n axisValue = axis.length;\r\n else\r\n axisValue = axis.width ? axis.width : (this.model.primaryYAxis.AxisMaxWidth ? axis.length - this.model.primaryYAxis.AxisMaxWidth : axis.length);\r\n for (i = 0; i < grpLabelLength; i++) {\r\n grpLabel = axis.multiLevelLabels[i] = grpLabelArr[i] = $.extend(true, {}, this.model.multiLevelLabelsDefault, axis.multiLevelLabels[i]);\r\n borderStyle = grpLabel.border.type.toLowerCase();\r\n level = grpLabel.level;\r\n if (grpLabel.visible && grpLabel.text != \"\" && !ej.util.isNullOrUndefined(grpLabel.start) && !ej.util.isNullOrUndefined(grpLabel.end)) {\r\n startX = Math.ceil(ej.EjSvgRender.utils._getPointXY(grpLabel.start, range, axis.isInversed) * (axisValue));\r\n endX = Math.ceil(ej.EjSvgRender.utils._getPointXY(grpLabel.end, range, axis.isInversed) * (axisValue));\r\n labelSize = ej.EjSvgRender.utils._measureText(grpLabel.text, null, grpLabel.font);\r\n textOverflow = grpLabel.textOverflow.toLowerCase();\r\n gap = ej.util.isNullOrUndefined(grpLabel.maximumTextWidth) ? endX - startX : grpLabel.maximumTextWidth;\r\n height = orientation == \"vertical\" ? (grpLabel.maximumTextWidth ? grpLabel.maximumTextWidth : labelSize.width) : labelSize.height;\r\n height += 2 * grpLabel.border.width;\r\n if (labelSize.width > gap - padding && (textOverflow == \"wrap\" || textOverflow == \"wrapandtrim\")) { // for wrap\r\n textCollection = this._wrap(axis, gap - padding, grpLabel.text, textOverflow, grpLabel.font, labelSize);\r\n textCollection = textCollection[\"text\"];\r\n height = orientation == \"vertical\" ? gap - padding : (height * (textCollection.length));\r\n }\r\n if (ej.util.isNullOrUndefined(multiLevelLabelHeight[level]))\r\n multiLevelLabelHeight[level] = height;\r\n else\r\n multiLevelLabelHeight[level] = multiLevelLabelHeight[level] < height ? height : multiLevelLabelHeight[level];\r\n }\r\n }\r\n // to sort based on level\r\n grpLabelArr.sort(function (a, b) {\r\n return parseFloat(a.level) - parseFloat(b.level);\r\n });\r\n axis.multiLevelLabels.sort(function (a, b) {\r\n return parseFloat(a.level) - parseFloat(b.level);\r\n });\r\n // to modify the level\r\n for (var j = 0; j < grpLabelArr.length; j++) {\r\n if (j == 0) {\r\n axis.multiLevelLabels[j]._level = grpLabelArr[j]._level = 0;\r\n greaterIndex = 0;\r\n }\r\n else if (grpLabelArr[j].level > greaterIndex + 1) {\r\n axis.multiLevelLabels[j]._level = grpLabelArr[j]._level = greaterIndex + 1;\r\n greaterIndex = grpLabelArr[j]._level;\r\n }\r\n else {\r\n axis.multiLevelLabels[j]._level = grpLabelArr[j]._level = grpLabelArr[j].level;\r\n greaterIndex = grpLabelArr[j].level > greaterIndex ? grpLabelArr[j].level : greaterIndex;\r\n }\r\n if (borderStyle == \"curlybrace\")\r\n braceFlag[axis.multiLevelLabels[j]._level] = true;\r\n }\r\n // to find the sum\r\n for (var i = 0; i < multiLevelLabelHeight.length; i++) {\r\n prevHeight[i] = value;\r\n if (!ej.util.isNullOrUndefined(multiLevelLabelHeight[i])) {\r\n value = borderStyle == \"brace\" ? value + multiLevelLabelHeight[i] : value + multiLevelLabelHeight[i] + padding / 2;\r\n if (braceFlag[i]) {\r\n value += padding;\r\n multiLevelLabelHeight[i] += padding;\r\n }\r\n }\r\n else {\r\n multiLevelLabelHeight.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n axis._multiLevelLabelHeight = value;\r\n axis.multiLevelLabelHeight = multiLevelLabelHeight;\r\n axis.prevHeight = prevHeight;\r\n\r\n return value;\r\n },\r\n\r\n _saturationColor: function (color, lum) {\r\n\r\n // validate hex string\r\n color = this.colorNameToHex(color);\r\n color = String(color).replace(/[^0-9a-f]/gi, '');\r\n if (color.length < 6) {\r\n color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2];\r\n }\r\n lum = lum || 0;\r\n\r\n // convert to decimal and change luminosity\r\n var rgb = \"#\", c, i;\r\n for (i = 0; i < 3; i++) {\r\n c = parseInt(color.substr(i * 2, 2), 16);\r\n c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16);\r\n rgb += (\"00\" + c).substr(c.length);\r\n }\r\n\r\n return rgb;\r\n },\r\n\r\n _drawChartAreaRect: function () {\r\n\r\n var fillColor = !(this.model.background && this.model.background._gradientStop) ? this.model.background : 'url(#' + this.svgObject.id + '_backGradient)';\r\n\r\n if (this.model.backGroundImageUrl)\r\n fillColor = 'transparent';\r\n\r\n var chartBorder = this.model.border;\r\n var options = {\r\n 'id': this.svgObject.id + '_SvgRect',\r\n 'x': chartBorder.width / 2,\r\n 'y': chartBorder.width / 2,\r\n 'width': $(this.svgObject).width() - (2 * chartBorder.width),\r\n 'height': $(this.svgObject).height() - (2 * chartBorder.width),\r\n 'fill': fillColor,\r\n 'opacity': chartBorder.opacity,\r\n 'stroke-width': chartBorder.width,\r\n 'stroke': chartBorder.color,\r\n 'class': \"e-chartborder\"\r\n };\r\n this.svgRenderer.drawRect(options, this.svgObject);\r\n\r\n\r\n\r\n if (this.model.backGroundImageUrl)\r\n this._drawBackImage();\r\n\r\n if (this.model.AreaType == 'cartesianaxes' && !this.model.enable3D) {\r\n var borderOptions = {\r\n 'id': this.svgObject.id + '_ChartArea',\r\n 'x': this.model.m_AreaBounds.X,\r\n 'y': this.model.m_AreaBounds.Y,\r\n 'width': this.model.m_AreaBounds.Width,\r\n 'height': this.model.m_AreaBounds.Height,\r\n 'fill': this.model.chartArea.background,\r\n 'stroke-width': this.model.chartArea.border.width,\r\n 'opacity': this.model.chartArea.border.opacity,\r\n 'stroke': this.model.chartArea.border.color,\r\n 'class': \"e-chartareaborder\"\r\n };\r\n this.svgRenderer.drawRect(borderOptions, this.svgObject);\r\n\r\n\r\n }\r\n\r\n },\r\n axesIndexCount: function (axis, index) {\r\n var vRowcount = [];\r\n for (var k = 0; k < axis.length; k++) {\r\n var currentAxis = axis[k];\r\n if (currentAxis.orientation.toLowerCase() == \"vertical\") {\r\n if (currentAxis.rowIndex == index)\r\n vRowcount.push(currentAxis);\r\n }\r\n else {\r\n if (currentAxis.columnIndex == index)\r\n vRowcount.push(currentAxis);\r\n }\r\n }\r\n return vRowcount;\r\n },\r\n axesCount: function (axis) {\r\n var vRowcount = [], indexValue = [], definitionsLength = 0;\r\n var chartModel = this.model;\r\n $.each(axis, function (index, currentAxis) {\r\n if (currentAxis.orientation.toLowerCase() == \"vertical\") {\r\n definitionsLength = (chartModel.rowDefinitions) ? chartModel.rowDefinitions.length : 0;\r\n if (index == 0) vRowcount.push({ axis: currentAxis, index: currentAxis.rowIndex });\r\n else if (currentAxis.rowIndex != vRowcount[vRowcount.length - 1].axis.rowIndex)\r\n vRowcount.push({ axis: currentAxis, index: currentAxis.rowIndex });\r\n }\r\n else {\r\n definitionsLength = (chartModel.columnDefinitions) ? chartModel.columnDefinitions.length : 0;\r\n if (index == 0) vRowcount.push({ axis: currentAxis, index: currentAxis.columnIndex });\r\n else if (currentAxis.columnIndex != vRowcount[vRowcount.length - 1].axis.columnIndex)\r\n vRowcount.push({ axis: currentAxis, index: currentAxis.columnIndex });\r\n }\r\n });\r\n var length = vRowcount.length;\r\n if (definitionsLength > length) {\r\n length = definitionsLength;\r\n for (var l = 0; l < definitionsLength; l++)\r\n indexValue.push(l);\r\n } else {\r\n for (var i = 0; i < length; i++)\r\n indexValue.push(vRowcount[i].index);\r\n }\r\n\r\n return { length: length, indexValue: indexValue };\r\n\r\n },\r\n\r\n //Calculate position for each vertical axis\r\n _calRowSize: function () {\r\n var start = 0;\r\n var yaxisOrign = [];\r\n var totalRealLength = 0;\r\n var orginY = this.model.m_AreaBounds.Y + this.model.m_AreaBounds.Height;\r\n //Caluculate size for rowdefinitions values\r\n if (this.model._rowDefinitions[0].rowDefinitions != null) {\r\n for (var i = 0, rowMax = this.model._rowDefinitions.length; i < rowMax; i++) {\r\n var rowDef = this.model._rowDefinitions[i].rowDefinitions;\r\n rowDef.rowHeight = Math.abs(rowDef.rowHeight);\r\n var realLength = 0;\r\n if (rowDef.unit.toLowerCase() == \"percentage\") {\r\n var length = this._axisRowDefinitionSize(this.model.rowDefinitions);\r\n realLength = Math.floor((this.model.m_AreaBounds.Height) * (rowDef.rowHeight / length));\r\n }\r\n else\r\n realLength = rowDef.rowHeight;\r\n if (i == 0) yaxisOrign.push(orginY);\r\n\r\n yaxisOrign.push((orginY - realLength - totalRealLength));\r\n totalRealLength += realLength;\r\n\r\n\r\n }\r\n\r\n }\r\n //Calculate size based on chart area size\r\n else {\r\n var height = Math.floor((this.model.m_AreaBounds.Height) / this.model._rowDefinitions.length);\r\n\r\n for (start = (orginY); start >= this.model.m_AreaBounds.Y; start = start - height) {\r\n yaxisOrign.push(start);\r\n }\r\n }\r\n return yaxisOrign;\r\n },\r\n\r\n //Calculate position for each horizontal axis\r\n _calColumnSize: function () {\r\n var xaxisOrign = [];\r\n var orginX = this.model.m_AreaBounds.X;\r\n var areaWidth = this.model.m_AreaBounds.Width;\r\n var totalRealLength = 0;\r\n var columnDef = this.model._columnDefinitions;\r\n //Caluculate size for columndefinitions values\r\n if (columnDef[0].columnDefinitions != null) {\r\n for (var i = 0, max = columnDef.length; i < max; i++) {\r\n var rowDef = columnDef[i].columnDefinitions;\r\n rowDef.columnWidth = Math.abs(rowDef.columnWidth);\r\n var realLength;\r\n if (rowDef.unit.toLowerCase() == \"percentage\") {\r\n var length = this._axisColumnDefinitionSize(this.model.columnDefinitions);\r\n realLength = Math.floor((areaWidth) * (rowDef.columnWidth / length));\r\n }\r\n else\r\n realLength = rowDef.columnWidth;\r\n if (i == 0) xaxisOrign.push(orginX);\r\n\r\n xaxisOrign.push((orginX + realLength + totalRealLength));\r\n totalRealLength += realLength;\r\n }\r\n }\r\n //Caluculate size based on chart area size\r\n else {\r\n var width = Math.floor((areaWidth) / columnDef.length);\r\n for (var start = orginX, maxStart = orginX + areaWidth; start <= maxStart; start = start + width) {\r\n xaxisOrign.push(start);\r\n\r\n }\r\n }\r\n return xaxisOrign;\r\n },\r\n\r\n //Calculate position and size for each axis\r\n _calculateAxisSize: function (params) {\r\n\r\n //For Horizontal\r\n var isInitAxes = true, isOppInitAxes = true;\r\n var xaxisOrign = this._calColumnSize();\r\n var columnDefinition = this.model._columnDefinitions;\r\n for (var i = 0, maxLength = columnDefinition.length; i < maxLength; i++) {\r\n var x1 = xaxisOrign[i];\r\n var x2 = xaxisOrign[i + 1];\r\n var nearIndexVal = 0;\r\n var farIndexVal = 0;;\r\n var isColFirstAxes = true, isColOppFirstAxes = true;\r\n var oppY = this.model.m_AreaBounds.Y;\r\n var norY = oppY + this.model.m_AreaBounds.Height;\r\n for (var j = 0, maxCol = columnDefinition[i].axis.length; j < maxCol; j++) {\r\n var currentColAxis = columnDefinition[i].axis[j];\r\n var realY = 0, axisColumnSpace = 0;\r\n var opposedPosition = currentColAxis._opposed;\r\n if (!params.axes[currentColAxis.name]._validCross) {\r\n if (!opposedPosition) {\r\n if (!(isColFirstAxes && (isInitAxes || nearIndexVal == 0))) {\r\n axisColumnSpace = columnDefinition.nearSizes[nearIndexVal];\r\n realY = norY = (norY + axisColumnSpace);\r\n nearIndexVal++;\r\n }\r\n else {\r\n realY = norY;\r\n isColFirstAxes = false;\r\n }\r\n\r\n } else {\r\n if (!(isColOppFirstAxes && (isOppInitAxes || farIndexVal == 0))) {\r\n axisColumnSpace = columnDefinition.farSizes[farIndexVal];\r\n realY = oppY = (oppY - axisColumnSpace);\r\n farIndexVal++;\r\n }\r\n else {\r\n realY = oppY;\r\n isColOppFirstAxes = false;\r\n }\r\n }\r\n }\r\n if (currentColAxis.columnSpan) {\r\n //Skip the axis size calculation for duplicate span axis\r\n if (!(columnDefinition[i].index == currentColAxis.columnIndex))\r\n continue;\r\n var axisSize = (maxLength >= (i + currentColAxis.columnSpan)) ? i + currentColAxis.columnSpan : i + 1;\r\n x2 = xaxisOrign[axisSize];\r\n if (!opposedPosition && nearIndexVal == 0) isInitAxes = isColFirstAxes;\r\n if (opposedPosition && farIndexVal == 0) isOppInitAxes = isColOppFirstAxes;\r\n } else {\r\n x2 = xaxisOrign[i + 1];\r\n isInitAxes = true;\r\n isOppInitAxes = true;\r\n }\r\n\r\n currentColAxis.Location = {};\r\n currentColAxis.Location.X1 = x1 + currentColAxis.plotOffset;\r\n currentColAxis.Location.Y1 = realY;\r\n currentColAxis.Location.X2 = x2 - currentColAxis.plotOffset;\r\n currentColAxis.Location.Y2 = realY;\r\n currentColAxis.x = currentColAxis.Location.X1;\r\n currentColAxis.y = currentColAxis.Location.Y1;\r\n currentColAxis.width = (currentColAxis.Location.X2 - currentColAxis.Location.X1);\r\n currentColAxis.height = currentColAxis.Location.Y2 - currentColAxis.Location.Y1;\r\n\r\n }\r\n }\r\n\r\n //For Vertical\r\n isInitAxes = true, isOppInitAxes = true;\r\n var yaxisOrign = this._calRowSize();\r\n var rowDefinition = this.model._rowDefinitions;\r\n for (var i = 0, rowLength = rowDefinition.length; i < rowLength; i++) {\r\n var y1 = yaxisOrign[i];\r\n var y2 = yaxisOrign[i + 1];\r\n var nearIndex = 0;\r\n var farIndex = 0;\r\n var isFirstAxes = true, isOppFirstAxes = true;\r\n var x = this.model.m_AreaBounds.X;\r\n var norX = x, oppX = x + this.model.m_AreaBounds.Width;\r\n for (var j = 0, maxRow = rowDefinition[i].axis.length; j < maxRow; j++) {\r\n var axisSpace = 0;\r\n var realX = 0;\r\n\r\n var currentAxis = rowDefinition[i].axis[j];\r\n var opposedPosition = currentAxis._opposed;\r\n if (!params.axes[currentAxis.name]._validCross) {\r\n if (!opposedPosition) {\r\n if (!(isFirstAxes && (isInitAxes || nearIndex == 0))) {\r\n axisSpace = rowDefinition.nearSizes[nearIndex];\r\n realX = norX = (norX - axisSpace);\r\n nearIndex++;\r\n } else {\r\n realX = x;\r\n isFirstAxes = false;\r\n }\r\n\r\n } else {\r\n if (!(isOppFirstAxes && (isOppInitAxes || isOppInitAxes == 0))) {\r\n axisSpace = rowDefinition.farSizes[farIndex];\r\n realX = oppX = (oppX + axisSpace);\r\n farIndex++;\r\n } else {\r\n realX = oppX;\r\n isOppFirstAxes = false;\r\n }\r\n }\r\n }\r\n if (currentAxis.rowSpan) {\r\n //Skip the axis size calculation for duplicate span axis\r\n if (!(rowDefinition[i].index == currentAxis.rowIndex))\r\n continue;\r\n var axisRowSize = (rowLength >= (i + currentAxis.rowSpan)) ? i + currentAxis.rowSpan : i + 1;\r\n y2 = yaxisOrign[axisRowSize];\r\n if (!opposedPosition && nearIndex == 0) isInitAxes = isFirstAxes;\r\n if (opposedPosition && farIndex == 0) isOppInitAxes = isOppFirstAxes;\r\n } else {\r\n y2 = yaxisOrign[i + 1];\r\n isInitAxes = true;\r\n isOppInitAxes = true;\r\n }\r\n currentAxis.Location = {};\r\n currentAxis.Location.X1 = realX;\r\n currentAxis.Location.Y1 = y1 - currentAxis.plotOffset;\r\n currentAxis.Location.X2 = realX;\r\n currentAxis.Location.Y2 = y2 + currentAxis.plotOffset;\r\n currentAxis.x = currentAxis.Location.X1;\r\n currentAxis.y = currentAxis.Location.Y2;\r\n currentAxis.height = (currentAxis.Location.Y1 - currentAxis.Location.Y2);\r\n currentAxis.width = currentAxis.axisLine.width;\r\n\r\n }\r\n }\r\n },\r\n\r\n //Validates whether provided crossing value is valid or not\r\n _validateCrossing: function (axis) {\r\n axis._opposedPosition = false;\r\n if (axis.crossesAt != null) {\r\n var crossAxis = this._getCrossAxis(this.model._axes, axis.orientation.toLowerCase() == 'horizontal', axis.crossesInAxis);\r\n axis._crossValue = this._getCrossValue(axis, crossAxis, crossAxis._valueType);\r\n if ((crossAxis.isInversed ? !axis.opposedPosition : axis.opposedPosition) ? axis._crossValue <= crossAxis.visibleRange.min : axis._crossValue >= crossAxis.visibleRange.max)\r\n axis._opposedPosition = true;\r\n return (crossAxis.visibleRange.min < axis._crossValue && crossAxis.visibleRange.max > axis._crossValue);\r\n }\r\n return false;\r\n },\r\n\r\n //Method to place axis at crossed location\r\n _axisCrossing: function (axis, locateAxis, params) {\r\n var hor = axis.orientation.toLowerCase() == 'horizontal';\r\n var crossAxis = this._getCrossAxis(this.model._axes, hor, axis.crossesInAxis);\r\n var crossValue = axis._crossValue;\r\n var delta = Math.abs((crossAxis.isInversed ? crossAxis.visibleRange.max : crossAxis.visibleRange.min) - crossValue);\r\n this._locateAxis(axis, crossAxis, hor, delta);\r\n if (!locateAxis)\r\n params._crossAxisOverlap = this._avoidOverlapping(axis, this.model.m_AreaBounds, hor, axis.opposedPosition, params) || params._crossAxisOverlap;\r\n },\r\n\r\n _locateAxis: function (axis, crossAxis, hor, delta) {\r\n var loc = (hor ? crossAxis.height : crossAxis.width) * delta / crossAxis.visibleRange.delta;\r\n if (hor)\r\n axis.y = crossAxis.y + crossAxis.height - loc;\r\n else\r\n axis.x = crossAxis.x + loc;\r\n },\r\n\r\n _avoidOverlapping: function (axis, bounds, hor, opposed, params) {\r\n var diff = 0;\r\n var axisbounds = axis.showNextToAxisLine ? params.axes[axis.name]._bounds : 0;\r\n if (hor) {\r\n if (!opposed && axis.y + axisbounds > bounds.Y + bounds.Height) {\r\n bounds.Height -= diff = axis.y + axisbounds - bounds.Y - bounds.Height;\r\n this._recalculateSpace(axis, hor, opposed, diff);\r\n return true;\r\n }\r\n else if (opposed && axis.y - axisbounds < bounds.Y) {\r\n bounds.Y += diff = axisbounds - (axis.y - bounds.Y);\r\n bounds.Height -= diff;\r\n this._recalculateSpace(axis, hor, opposed, diff);\r\n return true;\r\n }\r\n }\r\n else {\r\n if (!opposed && axis.x - axisbounds < bounds.X) {\r\n bounds.X += diff = axisbounds - (axis.x - bounds.X);\r\n bounds.Width -= diff;\r\n this._recalculateSpace(axis, hor, opposed, diff);\r\n return true;\r\n }\r\n else if (opposed && axis.x + axisbounds > bounds.X + bounds.Width) {\r\n bounds.Width -= diff = axis.x + axisbounds - bounds.X - bounds.Width;\r\n this._recalculateSpace(axis, hor, opposed, diff);\r\n return true;\r\n }\r\n else if (axis.labelPosition == \"inside\" && axis.x + axisbounds > bounds.X + bounds.Width) {\r\n bounds.Width -= diff = axis.x + axisbounds - bounds.X - bounds.Width;\r\n this._recalculateSpace(axis, hor, opposed, diff, axis.showNextToAxisLine);\r\n return true;\r\n }\r\n }\r\n },\r\n\r\n _recalculateSpace: function (axis, isHor, opposed, diff, isCrossing) {\r\n if (isHor) {\r\n var def = this.model._rowDefinitions;\r\n var index = opposed ? def.length - 1 : 0;\r\n for (var i = 0, len = def[index].axis.length; i < len; i++) {\r\n def[index].axis[i].height -= diff;\r\n def[index].axis[i].Location.Y2 -= diff;\r\n if (opposed)\r\n def[index].axis[i].Location.Y1 = def[index].axis[i].y += diff;\r\n }\r\n var colIndex = axis.columnIndex;\r\n def = this.model._columnDefinitions\r\n for (var i = 0, len = def.length; i < len; i++)\r\n if (i !== colIndex)\r\n for (var j = 0, length = def[i].axis.length; j < length; j++)\r\n if (def[i].axis[j]._opposed === opposed)\r\n def[i].axis[j].Location.Y1 = def[i].axis[j].Location.Y2 = def[i].axis[j].y += (opposed ? 1 : -1) * diff;\r\n }\r\n else {\r\n var def = this.model._columnDefinitions;\r\n var index = opposed ? def.length - 1 : 0;\r\n for (var i = 0, len = def[index].axis.length; i < len; i++) {\r\n def[index].axis[i].width -= diff;\r\n if (!isCrossing) {\r\n if (opposed)\r\n def[index].axis[i].Location.X2 -= diff;\r\n else\r\n def[index].axis[i].Location.X1 = def[index].axis[i].x += diff;\r\n }\r\n\r\n }\r\n var rowIndex = axis.rowIndex;\r\n def = this.model._rowDefinitions\r\n for (var i = 0, len = def.length; i < len; i++)\r\n if (i !== rowIndex)\r\n for (var j = 0, length = def[i].axis.length; j < length; j++)\r\n if (def[i].axis[j]._opposed === opposed)\r\n def[i].axis[j].Location.X1 = def[i].axis[j].Location.X2 = def[i].axis[j].x += (opposed ? -1 : 1) * diff;\r\n }\r\n },\r\n\r\n _getCrossValue: function (axis, crossAxis, type) {\r\n switch (type.toLowerCase()) {\r\n case 'category':\r\n return crossAxis.labels.indexOf(axis.crossesAt) != -1 ? crossAxis.labels.indexOf(axis.crossesAt) : axis.crossesAt;\r\n case 'datetime':\r\n return isNaN(Date.parse(axis.crossesAt)) ? null : Date.parse(axis.crossesAt);\r\n case 'logarithmic':\r\n return Math.log(axis.crossesAt) / Math.log(crossAxis.logBase);\r\n }\r\n return axis.crossesAt;\r\n },\r\n\r\n _getXCrossValue: function (series, axis, params) {\r\n var crossesInAxis = axis.crossesInAxis, yAxisName = series._yAxisName, validCross = params.axes[axis.name]._validCross || params.axes[axis.name]._validCross == null;\r\n //Checks whether origin should be changed for current series or not.\r\n return validCross && axis.crossesAt && ((!crossesInAxis && yAxisName === this.model.primaryYAxis.name) || (crossesInAxis && this._getCrossAxis(this.model._axes, true, crossesInAxis).name === yAxisName)) ? axis.crossesAt : 0;\r\n },\r\n\r\n _getAxisByName: function (axes, hor, name) {\r\n if (name) {\r\n for (var i = 0, count = axes.length; i < count; i++)\r\n if (axes[i].name === name && (hor ? axes[i].orientation == 'vertical' : axes[i].orientation == 'horizontal'))\r\n return axes[i];\r\n }\r\n },\r\n\r\n _getCrossAxis: function (axes, hor, value) {\r\n return this._getAxisByName(axes, hor, value) || (this.model.requireInvertedAxes ? hor ? this.model.primaryXAxis : this.model.primaryYAxis : hor ? this.model.primaryYAxis : this.model.primaryXAxis);\r\n },\r\n\r\n _arrangeAxis: function () {\r\n var chartobj = this;\r\n var axis;\r\n var customRow;\r\n //Generate columnIndex/RowIndex value if it is not specify in sample \r\n for (var i = 0; i < this.model._axes.length; i++) {\r\n axis = this.model._axes[i];\r\n if (axis.orientation.toLowerCase() == \"horizontal\") {\r\n chartobj.model.hAxes.push(axis);\r\n axis.columnIndex = (ej.util.isNullOrUndefined(axis.columnIndex)) ? 0 : (axis.columnIndex);\r\n chartobj.model.hAxes[chartobj.model.hAxes.length - 1].columnIndex = axis.columnIndex;\r\n } else if (axis.orientation.toLowerCase() == \"vertical\") {\r\n\r\n chartobj.model.vAxes.push(axis);\r\n axis.rowIndex = (ej.util.isNullOrUndefined(axis.rowIndex)) ? 0 : (axis.rowIndex);\r\n chartobj.model.vAxes[chartobj.model.vAxes.length - 1].rowIndex = axis.rowIndex;\r\n customRow = (!ej.util.isNullOrUndefined(chartobj.model.rowDefinitions)) ? chartobj.model.rowDefinitions[axis.rowIndex] : null;\r\n if (customRow) {\r\n axis.axisBottomLine = {};\r\n axis.axisBottomLine.visible = true;\r\n axis.axisBottomLine.lineWidth = customRow.lineWidth;\r\n axis.axisBottomLine.color = customRow.lineColor;\r\n }\r\n }\r\n }\r\n\r\n this.model.hAxes = ej.DataManager(this.model.hAxes, ej.Query().sortBy(\"columnIndex\")).executeLocal();\r\n\r\n this.model.vAxes = ej.DataManager(this.model.vAxes, ej.Query().sortBy(\"rowIndex\")).executeLocal();\r\n\r\n //column axis information push into _rowDefinitions\r\n var rowCount = this.axesCount(chartobj.model.vAxes);\r\n chartobj.model._rowDefinitions = [];\r\n if (chartobj.model.vAxes.length > 0) {\r\n for (var j = 0; j < rowCount.length; j++) {\r\n var rowCollection = chartobj.model.rowDefinitions;\r\n var rowDefinitions = ((rowCollection)) ? (rowCollection[j] ? rowCollection[j] : rowCollection[0]) : null;\r\n chartobj.model._rowDefinitions.push({\r\n axis: this.axesIndexCount(chartobj.model.vAxes, rowCount.indexValue[j])\r\n , index: rowCount.indexValue[j], rowDefinitions: rowDefinitions\r\n });\r\n }\r\n }\r\n\r\n var rowDefinition = chartobj.model._rowDefinitions;\r\n //Using filter to get spanning row axis collection\r\n var spanningRow = this._axisFilter(rowDefinition, \"rowSpan\");\r\n //Arrange the entire axis for row span\r\n this._SpanningAxes(rowDefinition, spanningRow, true);\r\n\r\n //column axis information push into _columnDefinitions\r\n var columnCount = this.axesCount(chartobj.model.hAxes);\r\n chartobj.model._columnDefinitions = [];\r\n if (chartobj.model.hAxes.length > 0) {\r\n for (var k = 0; k < columnCount.length; k++) {\r\n var columnCollection = chartobj.model.columnDefinitions;\r\n var columnDefinitions = (columnCollection) ? (columnCollection[k] ? columnCollection[k] : columnCollection[0]) : null;\r\n chartobj.model._columnDefinitions.push({\r\n axis: this.axesIndexCount(chartobj.model.hAxes, columnCount.indexValue[k])\r\n , index: columnCount.indexValue[k], columnDefinitions: columnDefinitions\r\n });\r\n }\r\n }\r\n\r\n var columnDefinition = chartobj.model._columnDefinitions;\r\n //Using filter to get spanning column axis collection\r\n var spanningColumn = this._axisFilter(columnDefinition, \"columnSpan\");\r\n //Arrange the entire axis for column span\r\n this._SpanningAxes(columnDefinition, spanningColumn, false);\r\n\r\n this._axisSize();\r\n\r\n\r\n },\r\n\r\n //Arrange the entire axis for spanning\r\n _SpanningAxes: function (definition, spanningCollection, isRow) {\r\n for (var spanIndex = 0, spanMax = spanningCollection.length; spanIndex < spanMax; spanIndex++) {\r\n var currentAxis = spanningCollection[spanIndex];\r\n if (currentAxis == null) break;\r\n var span = isRow ? currentAxis.rowSpan : currentAxis.columnSpan;\r\n var index = isRow ? currentAxis.rowIndex : currentAxis.columnIndex;\r\n if (definition[index] != undefined) {\r\n var axisIndex = definition[index].axis.indexOf(currentAxis);\r\n for (var k = 1, m = index + 1; k < span && m < definition.length; k++ , m++) {\r\n if (definition[m].axis.length >= axisIndex) {\r\n //Insert duplicate span row to appropriate rowdefinition\r\n definition[m].axis.splice(axisIndex, 0, currentAxis);\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n //Filter span axis from axes\r\n _axisFilter: function (definition, fieldName) {\r\n var axisResult = [];\r\n definition.filter(function (axes) {\r\n //Execute query to get spanning axis from axis array\r\n var axisCollection = ej.DataManager(axes[\"axis\"], ej.Query().where(fieldName, \">\", 1)).executeLocal();\r\n for (var i = 0, max = axisCollection.length; i < max; i++)\r\n axisResult.push(axisCollection[i]);\r\n });\r\n return axisResult;\r\n },\r\n\r\n _axisSize: function () {\r\n //The below calcultion to get approximate length of axis\r\n var spaceValue = this._getLegendSpace();\r\n var hSpace = $(this.svgObject).width() - this.model.margin.left - this.model.margin.right - (this.model.elementSpacing * 2) - spaceValue.leftLegendWidth - spaceValue.rightLegendWidth;\r\n var hWidth = Math.floor(hSpace / this.axesCount(this.model.hAxes).length);\r\n\r\n var vSpace = $(this.svgObject).height() - this.model.margin.top - this.model.margin.bottom - (this.model.elementSpacing * 2) - spaceValue.topLegendHeight - spaceValue.bottomLegendHeight - spaceValue.modelTitleHeight - spaceValue.modelsubTitleHeight;\r\n var vWidth = Math.floor(vSpace / this.axesCount(this.model.vAxes).length);\r\n\r\n\r\n\r\n for (var j = 0; j < this.model._axes.length; j++) {\r\n var axis = this.model._axes[j];\r\n if (axis.orientation.toLowerCase() == \"horizontal\") {\r\n if (this.model.AreaType != \"polaraxes\") {\r\n var customColumn = (!ej.util.isNullOrUndefined(this.model.columnDefinitions)) ? this.model.columnDefinitions[axis.columnIndex] : [];\r\n var columnLength = hWidth;\r\n if (customColumn) {\r\n customColumn.unit = (customColumn.unit == undefined) ? \"percentage\" : customColumn.unit;\r\n customColumn.columnWidth = (customColumn.columnWidth == undefined) ? 100 : customColumn.columnWidth;\r\n if (customColumn.unit.toLowerCase() == \"percentage\") {\r\n var length = this._axisColumnDefinitionSize(this.model.columnDefinitions);\r\n columnLength = Math.floor((hWidth) * (customColumn.columnWidth / length));\r\n }\r\n else\r\n columnLength = customColumn.columnWidth;\r\n\r\n }\r\n axis.length = axis.columnSpan ? axis.columnSpan * columnLength : columnLength;\r\n }\r\n else {\r\n if (hSpace > vSpace * 2)\r\n axis.length = hSpace - vSpace;\r\n else\r\n axis.length = hSpace;\r\n }\r\n } else if (axis.orientation.toLowerCase() == \"vertical\") {\r\n if (this.model.AreaType != \"polaraxes\") {\r\n var customRow = (!ej.util.isNullOrUndefined(this.model.rowDefinitions)) ? this.model.rowDefinitions[axis.rowIndex] : [];\r\n var realLength = vWidth;\r\n if (customRow) {\r\n customRow.unit = (customRow.unit == undefined) ? \"percentage\" : customRow.unit;\r\n customRow.rowHeight = (customRow.rowHeight == undefined) ? 100 : customRow.rowHeight;\r\n if (customRow.unit.toLowerCase() == \"percentage\") {\r\n var length = this._axisRowDefinitionSize(this.model.rowDefinitions);\r\n realLength = Math.floor((vWidth) * (customRow.rowHeight / length));\r\n }\r\n else\r\n realLength = customRow.rowHeight;\r\n\r\n }\r\n axis.length = axis.rowSpan ? (axis.rowSpan * realLength) : realLength;\r\n }\r\n else {\r\n axis.length = vSpace / 2;\r\n }\r\n }\r\n }\r\n },\r\n _axisRowDefinitionSize: function (array) {\r\n var length = 0;\r\n if (array) {\r\n for (var i = 0; i < array.length; i++) {\r\n length = length + array[i].rowHeight;\r\n }\r\n }\r\n length = length > 100 ? length : 100;\r\n return length;\r\n },\r\n _axisColumnDefinitionSize: function (array) {\r\n var length = 0;\r\n if (array) {\r\n for (var i = 0; i < array.length; i++) {\r\n length = length + array[i].columnWidth;\r\n }\r\n }\r\n length = length > 100 ? length : 100;\r\n return length;\r\n },\r\n _axisMeasure: function (axis, realWidth, orientation, j) {\r\n var axisTitleHeight = 0, labelSize = 0, multiLevelLabelSize = 0;\r\n axis.axisLine.width = axis.axisLine.width < 0 ? 0 : axis.axisLine.width;\r\n axis.majorTickLines.size = axis.majorTickLines.size < 0 ? 0 : axis.majorTickLines.size;\r\n var axisLineWidth = !this.model.enable3D && axis.axisLine.visible && axis.axisLine.width;\r\n var size = ej.EjSvgRender.utils._measureText(axis.title.text, realWidth, axis.title.font);\r\n if (orientation == \"vertical\") {\r\n labelSize = axis._LableMaxWidth.width;\r\n axisTitleHeight = (axis.title.text == \"\" || !(axis.title.visible) || !(axis.visible)) ? 0 : ((document.documentMode === 8) ? size.width : size.height + (2 * this.model.elementSpacing));\r\n }\r\n else {\r\n labelSize = (axis._LableMaxWidth.height);\r\n axisTitleHeight = (axis.title.text == \"\" || !(axis.title.visible) || !(axis.visible)) ? 0 : (size.height + (this.model.elementSpacing));\r\n }\r\n axisTitleHeight = axis.title.position.toLowerCase() == \"inside\" ? 0 : axisTitleHeight;\r\n multiLevelLabelSize = this.getMultiLevelLabelSize(axis);\r\n var width;\r\n if ((j == 0) && (axis.tickLinesPosition == 'inside' && axis.labelPosition == 'inside'))\r\n axis.AxisMaxWidth = axisTitleHeight + multiLevelLabelSize + axisLineWidth + (this.model.elementSpacing);\r\n else if ((j == 0) && (axis.tickLinesPosition == 'inside' && axis.labelPosition != 'inside'))\r\n axis.AxisMaxWidth = axisTitleHeight + multiLevelLabelSize + axisLineWidth + (this.model.elementSpacing) + labelSize;\r\n else if ((j == 0) && (axis.tickLinesPosition != 'inside' && axis.labelPosition == 'inside'))\r\n axis.AxisMaxWidth = axisTitleHeight + multiLevelLabelSize + axisLineWidth + (this.model.elementSpacing) + axis.majorTickLines.size;\r\n else\r\n axis.AxisMaxWidth = axisTitleHeight + multiLevelLabelSize + axisLineWidth + this.model.elementSpacing + axis.majorTickLines.size + labelSize;\r\n axis.AxisMaxWidth += axis._isScroll ? 18 : 0;\r\n return axis.AxisMaxWidth;\r\n },\r\n\r\n _arraySum: function (val) {\r\n var total = 0;\r\n for (var i = 0; i < val.length; i++) {\r\n total += parseFloat(val[i]) || 0;\r\n }\r\n return total;\r\n },\r\n _calSpace: function (realWidth, definitions, orientation, params) {\r\n var nearSizes = [];\r\n var farSizes = [];\r\n var bounds, validCross, measureValue;\r\n for (var i = 0; i < definitions.length; i++) {\r\n var nearIndex = 0, farIndex = 0;\r\n for (var j = 0; j < definitions[i].axis.length; j++) {\r\n var currentaxis = definitions[i].axis[j];\r\n bounds = params.axes[currentaxis.name]._bounds = this._axisMeasure(currentaxis, realWidth, orientation, j);\r\n validCross = params.axes[currentaxis.name]._validCross = this._validateCrossing(currentaxis);\r\n measureValue = validCross ? 0 : bounds;\r\n currentaxis._opposed = currentaxis.opposedPosition ? !currentaxis._opposedPosition : currentaxis._opposedPosition || currentaxis.opposedPosiiton || false;\r\n if (validCross && definitions[i].axis[j].showNextToAxisLine)\r\n continue;\r\n if (!currentaxis.showNextToAxisLine) { measureValue = (currentaxis.labelPosition == \"inside\") ? bounds - currentaxis._multiLevelLabelHeight : bounds; }\r\n if (!currentaxis._opposed) {\r\n if (nearSizes.length <= nearIndex) {\r\n nearSizes.push(measureValue);\r\n } else if (nearSizes[nearIndex] < (measureValue)) {\r\n nearSizes[nearIndex] = measureValue;\r\n }\r\n nearIndex++;\r\n }\r\n else {\r\n if (farSizes.length <= farIndex) {\r\n farSizes.push(measureValue);\r\n } else if (farSizes[farIndex] < (measureValue)) {\r\n farSizes[farIndex] = measureValue;\r\n }\r\n farIndex++;\r\n }\r\n\r\n }\r\n }\r\n return { nearSizes: nearSizes, farSizes: farSizes };\r\n },\r\n\r\n _getLegendSpace: function () {\r\n var chart = this.model,\r\n legend = chart.legend,\r\n position = legend.position.toLowerCase(),\r\n bounds = chart.LegendActualBounds,\r\n measureText = ej.EjSvgRender.utils._measureText,\r\n title = chart.title,\r\n subTitle = title.subTitle,\r\n elementSpacing = chart.elementSpacing,\r\n margin = chart.margin,\r\n svgWidth = chart.svgWidth,\r\n legendBorder = legend.border.width,\r\n ltheight = 0, space = 0,\r\n itemPadding = 10,\r\n leftLegendWidth = 0, rightLegendWidth = 0,\r\n topLegendHeight = 0, bottomLegendHeight = 0,\r\n labelCollection = title.text.split(' '),\r\n text, line = 0, enableTrim = title.enableTrim,\r\n maxTitleWidth = title.maximumWidth,\r\n maxTitleWidth = (maxTitleWidth.toString() == 'auto' || maxTitleWidth.toString() == '') ? (svgWidth * 0.75) : parseInt(maxTitleWidth),\r\n textOverflow = title.textOverflow.toLowerCase(),\r\n titleText = title.text,\r\n titleVisible = title.visible, titleCollection, subTitleCollection, data,\r\n measureTitle = ej.EjSvgRender.utils._measureText(title.text, $(this.svgObject).width() - this.model.margin.left - this.model.margin.right, title.font),\r\n subTitleLabelCollection = subTitle.text.split(' '),\r\n subTitleEnableTrim = subTitle.enableTrim,\r\n maxSubTitleWidth = subTitle.maximumWidth,\r\n maxSubTitleWidth = (maxSubTitleWidth.toString() == 'auto' || maxSubTitleWidth.toString() == '') ? (svgWidth * 0.75) : parseInt(maxSubTitleWidth),\r\n subTitleTextOverflow = subTitle.textOverflow.toLowerCase(),\r\n subTitleText = subTitle.text,\r\n subTitleVisible = subTitle.visible,\r\n measureSubTitle = ej.EjSvgRender.utils._measureText(subTitle.text, $(this.svgObject).width() - this.model.margin.left - this.model.margin.right, subTitle.font),\r\n titleVisibility = titleVisible && enableTrim && measureTitle.width > maxTitleWidth ? true : false,\r\n subTitleVisibility = subTitleVisible && subTitleEnableTrim && measureSubTitle.width > maxSubTitleWidth ? true : false,\r\n textOverflowVisibility = textOverflow == \"wrap\" || textOverflow == \"wrapandtrim\" ? true : false,\r\n subTitleTextOverflowVisibility = subTitleTextOverflow == \"wrap\" || subTitleTextOverflow == \"wrapandtrim\" ? true : false;\r\n this.model.titleWrapTextCollection = [];\r\n this.model.subTitleWrapTextCollection = [];\r\n this.model.trimTooltip = false;\r\n this.model.subTitleTooltip = false;\r\n if (legend.visible) {\r\n space = (bounds.Width + (itemPadding / 2) + elementSpacing + (2 * legendBorder));\r\n leftLegendWidth = position == 'left' ? space : 0;\r\n rightLegendWidth = position == 'right' ? space : 0;\r\n if (legend.title.text)\r\n ltheight = measureText(legend.title, null, legend.title.font).height;\r\n topLegendHeight = position == 'top' ? (bounds.Height + ltheight + (2 * legendBorder)) : 0;\r\n bottomLegendHeight = position == 'bottom' ? (bounds.Height + ltheight + (2 * legendBorder)) : 0;\r\n }\r\n if (titleVisibility && textOverflow == \"wrap\") {\r\n data = { text: titleText, font: title.font };\r\n titleCollection = this._rowsCalculation(data, maxTitleWidth, textOverflow);\r\n }\r\n else if (titleVisibility && textOverflow == \"wrapandtrim\") {\r\n data = { text: titleText, font: title.font };\r\n titleCollection = this._rowsCalculation(data, maxTitleWidth, textOverflow);\r\n }\r\n else if (textOverflow == \"wrapandtrim\" || textOverflow == \"wrap\") {\r\n data = { text: titleText, font: title.font };\r\n titleCollection = this._rowsCalculation(data, ej.EjSvgRender.utils._measureText(titleText, null, title.font).width, textOverflow);\r\n }\r\n this.model.titleWrapTextCollection = titleCollection ? titleCollection.textCollection : \"\";\r\n this.model.titleMaxWidth = titleCollection ? titleCollection.wordMax : maxTitleWidth;\r\n if (subTitleVisibility && subTitleTextOverflow == \"wrap\") {\r\n data = { text: subTitleText, font: subTitle.font };\r\n subTitleCollection = this._rowsCalculation(data, maxSubTitleWidth, subTitleTextOverflow);\r\n }\r\n else if (subTitleVisibility && subTitleTextOverflow == \"wrapandtrim\") {\r\n data = { text: subTitleText, font: subTitle.font };\r\n subTitleCollection = this._rowsCalculation(data, maxSubTitleWidth, subTitleTextOverflow);\r\n this.model.subTitleTooltip = this.model.trimTooltip;\r\n }\r\n else if (subTitleTextOverflow == \"wrapandtrim\" || subTitleTextOverflow == \"wrap\") {\r\n data = { text: subTitleText, font: subTitle.font };\r\n subTitleCollection = this._rowsCalculation(data, maxSubTitleWidth, subTitleTextOverflow);\r\n }\r\n this.model.subTitleWrapTextCollection = subTitleCollection ? subTitleCollection.textCollection : \"\";\r\n this.model.subTitleMaxWidth = subTitleCollection ? subTitleCollection.wordMax : maxSubTitleWidth;\r\n var titleHeight = measureText(title.text, svgWidth - margin.left - margin.right, title.font).height,\r\n subTitleHeight = measureText(subTitle.text, svgWidth - margin.left - margin.right, subTitle.font).height;\r\n var modelTitleHeight = (title.text == \"\" || !title.visible) ? 0 : (enableTrim && (textOverflowVisibility) && measureTitle.width > maxTitleWidth) ?\r\n ((titleHeight * this.model.titleWrapTextCollection.length) + elementSpacing) : (titleHeight + elementSpacing);\r\n var modelsubTitleHeight = (subTitle.text == \"\" || !subTitle.visible || !title.visible) ? 0 : (subTitleEnableTrim && (subTitleTextOverflowVisibility) && measureSubTitle.width > maxSubTitleWidth) ?\r\n ((subTitleHeight * this.model.subTitleWrapTextCollection.length) + elementSpacing) : (subTitleHeight + elementSpacing);\r\n\r\n return {\r\n leftLegendWidth: leftLegendWidth, rightLegendWidth: rightLegendWidth, topLegendHeight: topLegendHeight, bottomLegendHeight: bottomLegendHeight, modelTitleHeight: modelTitleHeight, modelsubTitleHeight: modelsubTitleHeight\r\n };\r\n },\r\n\r\n\r\n _arraySome: function (axes, orientation) {\r\n var scroll = false,\r\n isZoomScroll = this.model.zooming.enableScrollbar,\r\n count = axes.length,\r\n scrollbar,\r\n pointLength;\r\n\r\n for (var i = 0; i < count; i++) {\r\n scrollbar = axes[i].scrollbarSettings.enableScrollbar;\r\n pointLength = axes[i].scrollbarSettings.pointsLength;\r\n scroll = (scroll || (((axes[i]._isScroll && axes[i].maxPointLength < pointLength) || (axes[i].zoomFactor < 1 && scrollbar && isZoomScroll)) && axes[i].orientation.toLowerCase() == orientation));\r\n }\r\n\r\n return scroll;\r\n },\r\n\r\n _calculateAreaBounds: function (params) {\r\n var chartobj = this,\r\n realWidth = $(this.svgObject).width() - this.model.margin.left - this.model.margin.right,\r\n // Calculate area bounds X and width\r\n chartBorderWidth = chartobj.model.border.width,\r\n axis = this.model._axes[0],\r\n zomming = this.model.zooming.enableScrollbar,\r\n type = this.model.zooming.type.toLowerCase();\r\n chartobj.model.scrollerSize = 18;\r\n this.model._yScroll = this._arraySome(this.model._axes, 'vertical');\r\n this.model._xScroll = this._arraySome(this.model._axes, 'horizontal');\r\n\r\n //Calcultion for multiple axes(vertical)\r\n var sizes = this._calSpace(realWidth, chartobj.model._rowDefinitions, \"vertical\", params);\r\n chartobj.model._rowDefinitions.nearSizes = sizes.nearSizes;\r\n chartobj.model._rowDefinitions.farSizes = sizes.farSizes;\r\n var vAxesWidth = this._arraySum(sizes.nearSizes);\r\n var vAxesOppWidth = this._arraySum(sizes.farSizes);\r\n\r\n var spaceValue = this._getLegendSpace();\r\n\r\n var x = vAxesWidth + spaceValue.leftLegendWidth + chartobj.model.margin.left + chartBorderWidth;\r\n var rightSpacing = vAxesOppWidth + spaceValue.rightLegendWidth + chartobj.model.margin.right + chartobj.model.margin.left + (2 * chartBorderWidth);\r\n var width = $(this.svgObject).width();\r\n var boundsWidth = width - (x + rightSpacing);\r\n if (boundsWidth <= 0 && this.model.AreaType == \"cartesianaxes\") {\r\n $(this.svgObject).width(width - boundsWidth + 1);\r\n this._calculateAreaBounds(params);\r\n }\r\n else {\r\n // Calculate area bounds Y and Height \r\n\r\n //Calcultion for multiple axes(Horizontal)\r\n var columnSizes = this._calSpace(realWidth, chartobj.model._columnDefinitions, \"horizontal\", params);\r\n chartobj.model._columnDefinitions.nearSizes = columnSizes.nearSizes;\r\n chartobj.model._columnDefinitions.farSizes = columnSizes.farSizes;\r\n var hAxesWidth = this._arraySum(columnSizes.nearSizes);\r\n var hAxesOppWidth = this._arraySum(columnSizes.farSizes);\r\n\r\n var y = hAxesOppWidth + this.model.margin.top + (this.model.elementSpacing) + spaceValue.modelTitleHeight + (spaceValue.modelsubTitleHeight) + spaceValue.topLegendHeight + chartBorderWidth;\r\n var bottomSpacing = hAxesWidth + this.model.margin.bottom + spaceValue.bottomLegendHeight + (2 * chartBorderWidth);\r\n var boundsHeight = Math.abs($(this.svgObject).height() - (y + bottomSpacing));\r\n boundsHeight = boundsHeight == 0 ? 1 : boundsHeight;\r\n this.model.m_AreaBounds = { X: x, Y: y, Width: boundsWidth, Height: boundsHeight };\r\n this.model.m_Spacing = { Left: x, Top: y, Right: rightSpacing, Bottom: bottomSpacing };\r\n\r\n if (this.model.enableCanvasRendering) { // for adding bounds in canvas rendering\r\n this.canvasX = x;\r\n this.canvasY = y;\r\n this.canvasWidth = boundsWidth;\r\n this.canvasHeight = boundsHeight;\r\n } else\r\n this.canvasX = this.canvasY = this.canvasHeight = this.canvasWidth = 0;\r\n }\r\n }\r\n };\r\n\r\n jQuery.uaMatch = function (ua) {\r\n ua = ua.toLowerCase();\r\n\r\n var match = /(chrome)[ \\/]([\\w.]+)/.exec(ua) ||\r\n /(webkit)[ \\/]([\\w.]+)/.exec(ua) ||\r\n /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(ua) ||\r\n /(msie) ([\\w.]+)/.exec(ua) ||\r\n ua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec(ua) ||\r\n [];\r\n\r\n return {\r\n browser: match[1] || \"\",\r\n version: match[2] || \"0\"\r\n };\r\n };\r\n\r\n\r\n\r\n})(jQuery);;\r\n/**\r\n* @fileOverview Plugin to style the Html Chart elements\r\n* @copyright Copyright Syncfusion Inc. 2001 - 2013. All rights reserved.\r\n* Use of this code is subject to the terms of our license.\r\n* A copy of the current license can be obtained at any time by e-mailing\r\n* licensing@syncfusion.com. Any infringement will be prosecuted under\r\n* applicable laws. \r\n* @version 12.1 \r\n* @author Syncfusion Inc\r\n*/\r\n\r\n(function ($, ej) {\r\n\r\n ej.widget(\"ejChart\", \"ej.datavisualization.Chart\", {\r\n\r\n element: null,\r\n\r\n model: null,\r\n\r\n validTags: [\"div\"],\r\n\r\n defaults: {\r\n\r\n border: {\r\n\r\n color: 'transparent',\r\n\r\n width: 0,\r\n\r\n opacity: 0.3\r\n },\r\n\r\n chartArea:\r\n {\r\n\r\n border: {\r\n\r\n color: 'Gray',\r\n\r\n width: 0.5,\r\n\r\n opacity: 0.3\r\n },\r\n\r\n background: 'transparent'\r\n\r\n },\r\n\r\n highlightColor: null,\r\n\r\n primaryXAxis:\r\n {\r\n crossesAt: null,\r\n\r\n crossesInAxis: null,\r\n\r\n isIndexed: false,\r\n\r\n multiLevelLabelsColor: null,\r\n\r\n multiLevelLabelsFontColor: null,\r\n\r\n alignment: \"center\",\r\n\r\n labelPlacement: \"\",\r\n\r\n scrollbarSettings: {\r\n\r\n visible: true,\r\n\r\n canResize: true,\r\n\r\n range: {\r\n\r\n min: null,\r\n\r\n max: null,\r\n },\r\n\r\n pointsLength: null\r\n\r\n },\r\n\r\n range: {\r\n\r\n min: null,\r\n\r\n max: null,\r\n\r\n interval: null\r\n },\r\n\r\n labelPosition: 'outside',\r\n\r\n tickLinesPosition: 'outside',\r\n\r\n alternateGridBand:\r\n {\r\n\r\n odd: {\r\n\r\n fill: \"transparent\",\r\n\r\n opacity: 1\r\n },\r\n\r\n even: {\r\n\r\n fill: \"transparent\",\r\n\r\n opacity: 1\r\n }\r\n },\r\n\r\n enableAutoIntervalOnZooming: true,\r\n\r\n\r\n majorGridLines:\r\n {\r\n color: null,\r\n\r\n width: 1,\r\n\r\n dashArray: \"\",\r\n\r\n visible: true,\r\n\r\n opacity: 1\r\n\r\n },\r\n\r\n majorTickLines:\r\n {\r\n color: null,\r\n\r\n width: 1,\r\n\r\n size: 5,\r\n\r\n visible: true\r\n },\r\n\r\n minorGridLines:\r\n {\r\n color: null,\r\n\r\n width: 1,\r\n\r\n dashArray: \"\",\r\n\r\n visible: true\r\n\r\n },\r\n\r\n minorTickLines:\r\n {\r\n color: null,\r\n\r\n width: 1,\r\n\r\n size: 5,\r\n\r\n visible: true\r\n },\r\n\r\n labelBorder:\r\n {\r\n color: null,\r\n\r\n width: 0\r\n },\r\n\r\n multiLevelLabels: [{\r\n visible: false,\r\n text: \"\",\r\n textAlignment: \"center\",\r\n start: null,\r\n end: null,\r\n level: 0,\r\n maximumTextWidth: null,\r\n textOverflow: \"trim\",\r\n font: {\r\n fontFamily: 'Segoe UI',\r\n fontStyle: 'Normal',\r\n size: '12px',\r\n fontWeight: 'Regular',\r\n opacity: 1\r\n },\r\n border: {\r\n type: 'rectangle',\r\n width: 1\r\n }\r\n }],\r\n\r\n minorTicksPerInterval: null,\r\n\r\n columnIndex: null,\r\n\r\n columnSpan: null,\r\n\r\n labelRotation: null,\r\n\r\n valueType: null,\r\n\r\n name: null,\r\n\r\n labelFormat: null,\r\n\r\n desiredIntervals: null,\r\n\r\n intervalType: null,\r\n\r\n roundingPlaces: null,\r\n\r\n logBase: 10,\r\n\r\n plotOffset: 0,\r\n labels: [],\r\n\r\n stripLine: [\r\n {\r\n\r\n visible: false,\r\n\r\n startFromAxis: false,\r\n\r\n text: \"\",\r\n\r\n width: 0,\r\n\r\n textAlignment: \"middlecenter\",\r\n\r\n font: {\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n size: '12px',\r\n\r\n fontWeight: 'Regular',\r\n\r\n color: 'black',\r\n\r\n opacity: 1\r\n },\r\n\r\n start: null,\r\n\r\n end: null,\r\n\r\n color: 'gray',\r\n\r\n borderColor: 'black',\r\n\r\n zIndex: 'over'\r\n }\r\n ],\r\n\r\n title:\r\n {\r\n\r\n\r\n text: \"\",\r\n\r\n visible: true,\r\n\r\n enableTrim: false,\r\n\r\n offset: 0,\r\n\r\n alignment: 'center',\r\n\r\n position: 'outside',\r\n\r\n maximumTitleWidth: null,\r\n\r\n font:\r\n {\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n size: '14px',\r\n\r\n opacity: 1,\r\n\r\n fontWeight: 'regular',\r\n\r\n color: null\r\n\r\n }\r\n },\r\n rangePadding: 'Auto',\r\n additionalPadding: [1, 1],\r\n orientation: 'Horizontal',\r\n\r\n maximumLabels: 3,\r\n\r\n opposedPosition: false,\r\n\r\n showNextToAxisLine: true,\r\n\r\n axisLine:\r\n {\r\n\r\n visible: true,\r\n\r\n width: 1,\r\n\r\n dashArray: \"\",\r\n\r\n offset: 0,\r\n\r\n color: null\r\n\r\n },\r\n\r\n labelIntersectAction: \"none\",\r\n\r\n maximumLabelWidth: 34,\r\n\r\n enableTrim: false,\r\n\r\n\r\n edgeLabelPlacement: \"none\",\r\n\r\n\r\n\r\n isInversed: false,\r\n\r\n\r\n\r\n font:\r\n {\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n size: '11px',\r\n\r\n color: null,\r\n\r\n fontWeight: 'regular',\r\n\r\n opacity: 1\r\n\r\n },\r\n\r\n visible: true,\r\n\r\n crosshairLabel:\r\n {\r\n rx: 3, ry: 3,\r\n border: { color: null, width: 1 },\r\n fill: null,\r\n font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: null },\r\n visible: false\r\n },\r\n\r\n zoomFactor: 1,\r\n\r\n zoomPosition: 0\r\n },\r\n\r\n\r\n primaryYAxis:\r\n {\r\n crossesAt: null,\r\n crossesInAxis: null,\r\n showNextToAxisLine: true,\r\n\r\n alignment: \"center\",\r\n\r\n startFromZero: true,\r\n\r\n range: {\r\n\r\n min: null,\r\n\r\n max: null,\r\n\r\n interval: null\r\n },\r\n\r\n scrollbarSettings: {\r\n\r\n visible: true,\r\n\r\n canResize: true,\r\n\r\n range: {\r\n\r\n min: null,\r\n\r\n max: null,\r\n },\r\n\r\n pointsLength: null\r\n\r\n },\r\n\r\n labelPlacement: \"\",\r\n\r\n labelPosition: 'outside',\r\n\r\n tickLinesPosition: 'outside',\r\n\r\n multiLevelLabelsColor: null,\r\n multiLevelLabelsFontColor: null,\r\n\r\n alternateGridBand:\r\n {\r\n\r\n odd: {\r\n\r\n fill: \"transparent\",\r\n\r\n opacity: 1\r\n },\r\n\r\n even: {\r\n\r\n\r\n fill: \"transparent\",\r\n\r\n opacity: 1\r\n }\r\n },\r\n\r\n enableAutoIntervalOnZooming: true,\r\n\r\n majorGridLines:\r\n {\r\n color: null,\r\n\r\n width: 1,\r\n\r\n dashArray: \"\",\r\n\r\n visible: true,\r\n\r\n opacity: 1\r\n\r\n },\r\n\r\n majorTickLines:\r\n {\r\n color: null,\r\n\r\n width: 1,\r\n\r\n size: 5,\r\n\r\n visible: true\r\n },\r\n\r\n minorGridLines:\r\n {\r\n color: null,\r\n\r\n width: 1,\r\n\r\n dashArray: \"\",\r\n\r\n visible: true\r\n\r\n },\r\n\r\n minorTickLines:\r\n {\r\n color: null,\r\n\r\n width: 1,\r\n\r\n size: 5,\r\n\r\n visible: true\r\n },\r\n\r\n labelBorder:\r\n {\r\n\r\n color: null,\r\n\r\n width: 0\r\n },\r\n\r\n multiLevelLabels: [{\r\n visible: false,\r\n text: \"\",\r\n textAlignment: \"center\",\r\n start: null,\r\n end: null,\r\n level: 0,\r\n maximumTextWidth: null,\r\n textOverflow: \"trim\",\r\n font: {\r\n fontFamily: 'Segoe UI',\r\n fontStyle: 'Normal',\r\n size: '12px',\r\n fontWeight: 'Regular',\r\n opacity: 1\r\n },\r\n border: {\r\n type: 'rectangle',\r\n width: 1\r\n }\r\n }],\r\n\r\n minorTicksPerInterval: null,\r\n\r\n rowIndex: null,\r\n\r\n rowSpan: null,\r\n\r\n valueType: null,\r\n\r\n name: null,\r\n\r\n labelFormat: null,\r\n\r\n desiredIntervals: null,\r\n\r\n intervalType: null,\r\n\r\n roundingPlaces: null,\r\n labels: [],\r\n\r\n title:\r\n {\r\n\r\n text: \"\",\r\n\r\n visible: true,\r\n\r\n enableTrim: false,\r\n\r\n offset: 0,\r\n\r\n alignment: 'center',\r\n\r\n position: 'outside',\r\n\r\n maximumTitleWidth: null,\r\n\r\n font:\r\n {\r\n color: null,\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n opacity: 1,\r\n\r\n size: '14px',\r\n\r\n fontWeight: 'regular'\r\n }\r\n },\r\n\r\n rangePadding: 'Auto',\r\n\r\n\r\n stripLine: [\r\n {\r\n\r\n visible: false,\r\n\r\n startFromAxis: false,\r\n\r\n width: 0,\r\n\r\n text: \"\",\r\n\r\n textAlignment: \"middlecenter\",\r\n\r\n font: {\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontWeight: 'Regular',\r\n\r\n fontStyle: 'Normal',\r\n\r\n size: '12px',\r\n\r\n color: 'black',\r\n\r\n opacity: 1\r\n },\r\n\r\n start: null,\r\n\r\n end: null,\r\n\r\n color: 'gray',\r\n\r\n borderColor: 'black',\r\n\r\n zIndex: 'over'\r\n }\r\n ],\r\n\r\n logBase: 10,\r\n\r\n plotOffset: 0,\r\n\r\n orientation: 'Vertical',\r\n\r\n maximumLabels: 3,\r\n\r\n labelIntersectAction: \"none\",\r\n\r\n\r\n maximumLabelWidth: 34,\r\n\r\n enableTrim: false,\r\n\r\n edgeLabelPlacement: \"none\",\r\n\r\n\r\n isInversed: false,\r\n\r\n\r\n crosshairLabel:\r\n {\r\n rx: 3, ry: 3,\r\n border: { color: null, width: 1 },\r\n fill: null,\r\n font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: null },\r\n visible: false\r\n },\r\n\r\n visible: true,\r\n\r\n opposedPosition: false,\r\n\r\n font:\r\n {\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n size: '11px',\r\n\r\n opacity: 1,\r\n\r\n fontWeight: 'regular',\r\n\r\n color: null\r\n\r\n },\r\n\r\n axisLine:\r\n {\r\n\r\n visible: true,\r\n\r\n width: 1,\r\n\r\n dashArray: \"\",\r\n\r\n offset: 0,\r\n\r\n color: null\r\n },\r\n\r\n\r\n zoomFactor: 1,\r\n\r\n zoomPosition: 0\r\n },\r\n axes: [],\r\n\r\n secondaryX:\r\n {\r\n crossesAt: null,\r\n crossesInAxis: null,\r\n showNextToAxisLine: true,\r\n alignment: \"center\",\r\n multiLevelLabelsColor: null,\r\n multiLevelLabelsFontColor: null,\r\n range: {\r\n min: null,\r\n max: null,\r\n interval: null\r\n },\r\n\r\n scrollbarSettings: {\r\n\r\n visible: true,\r\n\r\n canResize: true,\r\n\r\n range: {\r\n\r\n min: null,\r\n\r\n max: null,\r\n },\r\n\r\n pointsLength: null\r\n\r\n },\r\n\r\n tickLinesPosition: \"outside\",\r\n labelPosition: \"outside\",\r\n\r\n majorGridLines:\r\n {\r\n\r\n color: null,\r\n\r\n width: 1,\r\n\r\n dashArray: \"\",\r\n\r\n visible: true\r\n },\r\n alternateGridBand:\r\n {\r\n odd: {\r\n fill: \"transparent\",\r\n opacity: 1\r\n },\r\n even: {\r\n fill: \"transparent\",\r\n opacity: 1\r\n }\r\n },\r\n\r\n enableAutoIntervalOnZooming: true,\r\n\r\n majorTickLines:\r\n {\r\n\r\n color: null,\r\n\r\n width: 1,\r\n\r\n size: 5,\r\n\r\n visible: true\r\n },\r\n\r\n minorGridLines:\r\n {\r\n color: null,\r\n\r\n width: 1,\r\n\r\n dashArray: \"\",\r\n\r\n visible: true\r\n\r\n },\r\n\r\n minorTickLines:\r\n {\r\n color: null,\r\n\r\n width: 1,\r\n\r\n size: 5,\r\n\r\n visible: true\r\n },\r\n\r\n labelBorder:\r\n {\r\n color: null,\r\n\r\n width: 0\r\n },\r\n\r\n multiLevelLabels: [{\r\n visible: false,\r\n text: \"\",\r\n textAlignment: \"center\",\r\n start: null,\r\n end: null,\r\n level: 0,\r\n maximumTextWidth: null,\r\n textOverflow: \"trim\",\r\n font: {\r\n fontFamily: 'Segoe UI',\r\n fontStyle: 'Normal',\r\n size: '12px',\r\n fontWeight: 'Regular',\r\n opacity: 1\r\n },\r\n border: {\r\n type: 'rectangle',\r\n width: 1\r\n }\r\n }],\r\n\r\n minorTicksPerInterval: null,\r\n\r\n columnIndex: null,\r\n\r\n columnSpan: null,\r\n\r\n labelRotation: null,\r\n\r\n valueType: null,\r\n\r\n name: null,\r\n\r\n labelFormat: null,\r\n\r\n labelPlacement: \"\",\r\n\r\n desiredIntervals: null,\r\n\r\n intervalType: null,\r\n\r\n roundingPlaces: null,\r\n\r\n logBase: 10,\r\n\r\n plotOffset: 0,\r\n labels: [],\r\n stripLine: [\r\n {\r\n visible: false,\r\n startFromAxis: false,\r\n text: \"\",\r\n textAlignment: \"middlecenter\",\r\n font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', fontWeight: 'regular', size: '12px', color: 'black', opacity: 1 },\r\n start: null,\r\n end: null,\r\n color: 'gray',\r\n borderColor: 'black',\r\n zIndex: 'over'\r\n }\r\n ],\r\n\r\n title:\r\n {\r\n\r\n\r\n text: \"\",\r\n visible: true,\r\n enableTrim: false,\r\n offset: 0,\r\n alignment: 'center',\r\n position: 'outside',\r\n maximumTitleWidth: null,\r\n font:\r\n {\r\n\r\n color: null,\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n size: '14px',\r\n\r\n opacity: 1,\r\n\r\n fontWeight: 'regular'\r\n\r\n }\r\n\r\n },\r\n\r\n rangePadding: 'Auto',\r\n additionalPadding: [1, 1],\r\n\r\n orientation: 'Horizontal',\r\n\r\n maximumLabels: 3,\r\n\r\n opposedPosition: false,\r\n\r\n axisLine:\r\n {\r\n\r\n visible: true,\r\n\r\n width: 1,\r\n\r\n dashArray: \"\",\r\n\r\n offset: 0,\r\n\r\n color: null\r\n },\r\n\r\n labelIntersectAction: \"none\",\r\n\r\n edgeLabelPlacement: \"none\",\r\n\r\n font:\r\n {\r\n color: null,\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n size: '11px',\r\n\r\n fontWeight: 'regular',\r\n\r\n opacity: 1\r\n },\r\n\r\n visible: true,\r\n\r\n crosshairLabel:\r\n {\r\n rx: 3, ry: 3,\r\n border: { color: null, width: 1 },\r\n fill: null,\r\n font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: null },\r\n visible: false\r\n },\r\n\r\n zoomFactor: 1,\r\n\r\n zoomPosition: 0\r\n },\r\n\r\n secondaryY:\r\n {\r\n crossesAt: null,\r\n crossesInAxis: null,\r\n showNextToAxisLine: true,\r\n alignment: \"center\",\r\n startFromZero: true,\r\n multiLevelLabelsColor: null,\r\n multiLevelLabelsFontColor: null,\r\n range: {\r\n min: null,\r\n max: null,\r\n interval: null\r\n },\r\n\r\n scrollbarSettings: {\r\n\r\n visible: true,\r\n\r\n canResize: true,\r\n\r\n range: {\r\n\r\n min: null,\r\n\r\n max: null,\r\n },\r\n\r\n pointsLength: null\r\n\r\n },\r\n\r\n tickLinesPosition: \"outside\",\r\n labelPosition: \"outside\",\r\n\r\n majorGridLines:\r\n {\r\n\r\n color: null,\r\n\r\n width: 1,\r\n\r\n dashArray: \"\",\r\n\r\n visible: true\r\n\r\n },\r\n alternateGridBand:\r\n {\r\n odd: {\r\n fill: \"transparent\",\r\n opacity: 1\r\n },\r\n even: {\r\n fill: \"transparent\",\r\n opacity: 1\r\n }\r\n },\r\n\r\n enableAutoIntervalOnZooming: true,\r\n\r\n majorTickLines:\r\n {\r\n color: null,\r\n\r\n width: 1,\r\n\r\n size: 5,\r\n\r\n visible: true\r\n },\r\n\r\n minorGridLines:\r\n {\r\n color: null,\r\n\r\n width: 1,\r\n\r\n dashArray: \"\",\r\n\r\n visible: true\r\n\r\n },\r\n\r\n minorTickLines:\r\n {\r\n color: null,\r\n\r\n width: 1,\r\n\r\n size: 5,\r\n\r\n visible: true\r\n },\r\n\r\n labelBorder:\r\n {\r\n color: null,\r\n\r\n width: 0\r\n },\r\n\r\n multiLevelLabels: [{\r\n visible: false,\r\n text: \"\",\r\n textAlignment: \"center\",\r\n start: null,\r\n end: null,\r\n level: 0,\r\n maximumTextWidth: null,\r\n textOverflow: \"trim\",\r\n font: {\r\n fontFamily: 'Segoe UI',\r\n fontStyle: 'Normal',\r\n size: '12px',\r\n fontWeight: 'Regular',\r\n opacity: 1\r\n },\r\n border: {\r\n type: 'rectangle',\r\n width: 1\r\n }\r\n }],\r\n\r\n minorTicksPerInterval: null,\r\n\r\n rowIndex: null,\r\n\r\n rowSpan: null,\r\n\r\n valueType: null,\r\n\r\n name: null,\r\n\r\n labelFormat: null,\r\n\r\n desiredIntervals: null,\r\n\r\n intervalType: null,\r\n\r\n roundingPlaces: null,\r\n labels: [],\r\n\r\n title:\r\n {\r\n\r\n text: \"\",\r\n visible: true,\r\n enableTrim: false,\r\n offset: 0,\r\n alignment: 'center',\r\n position: 'outside',\r\n maximumTitleWidth: null,\r\n font:\r\n {\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n opacity: 1,\r\n\r\n size: '14px',\r\n\r\n fontWeight: 'regular',\r\n\r\n color: null\r\n }\r\n },\r\n\r\n rangePadding: 'Auto',\r\n\r\n stripLine: [\r\n {\r\n visible: false,\r\n startFromAxis: false,\r\n text: \"\",\r\n textAlignment: \"middlecenter\",\r\n font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', fontWeight: 'regular', size: '12px', color: 'black', opacity: 1 },\r\n start: null,\r\n end: null,\r\n color: 'gray',\r\n borderColor: 'black',\r\n zIndex: 'over'\r\n }\r\n ],\r\n\r\n logBase: 10,\r\n\r\n plotOffset: 0,\r\n\r\n orientation: 'Vertical',\r\n\r\n maximumLabels: 3,\r\n\r\n labelIntersectAction: \"none\",\r\n\r\n labelPlacement: \"\",\r\n\r\n edgeLabelPlacement: \"none\",\r\n\r\n crosshairLabel:\r\n {\r\n rx: 3, ry: 3,\r\n border: { color: null, width: 1 },\r\n fill: null,\r\n font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', size: '13px', fontWeight: 'regular', opacity: 1, color: null },\r\n visible: false\r\n },\r\n\r\n visible: true,\r\n\r\n opposedPosition: false,\r\n\r\n font:\r\n {\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n size: '11px',\r\n\r\n opacity: 1,\r\n\r\n fontWeight: 'regular'\r\n\r\n },\r\n\r\n axisLine:\r\n {\r\n color: null,\r\n\r\n visible: true,\r\n\r\n width: 1,\r\n\r\n dashArray: \"\",\r\n\r\n offset: 0\r\n },\r\n\r\n\r\n zoomFactor: 1,\r\n\r\n zoomPosition: 0\r\n },\r\n trendlineDefaults: {\r\n type: \"linear\",\r\n visibility: \"\",\r\n visibleOnLegend: \"visible\",\r\n name: \"Trendline\",\r\n fill: \"\",\r\n width: 1,\r\n opacity: 1,\r\n dashArray: \"\",\r\n forwardForecast: 0,\r\n backwardForecast: 0,\r\n polynomialOrder: 2,\r\n period: 2,\r\n intercept: null,\r\n tooltip: {\r\n visible: false, format: null, fill: null, border: { width: 1, color: null }, duration: '500ms', enableAnimation: true, opacity: 0.95, font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', fontWeight: 'Regular', size: '12px', opacity: 1 }\r\n }\r\n },\r\n indicatorDefaults: {\r\n visible: true,\r\n points: [],\r\n tooltip: { visible: false, format: null, fill: null, border: { width: 1, color: null }, duration: '500ms', enableAnimation: true, opacity: 0.95 },\r\n seriesName: \"\",\r\n font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', fontWeight: 'Regular', size: '12px', color: '#707070', opacity: 1 },\r\n type: \"SMA\",\r\n period: 14,\r\n standardDeviations: 2,\r\n kPeriod: 3,\r\n dPeriod: 3,\r\n periodLine: { fill: \"blue\", width: 2 },\r\n lowerLine: { fill: \"#008000\", width: 2 },\r\n upperLine: { fill: \"#ff0000\", width: 2 },\r\n macdLine: { fill: \"#ff9933\", width: 2 },\r\n histogram: { fill: \"#ccccff\", opacity: 1, border: { color: \"#9999ff\", width: 1 } },\r\n fill: \"#00008B\",\r\n width: 2,\r\n xAxisName: \"\",\r\n yAxisName: \"\",\r\n visibility: \"visible\",\r\n macdType: \"line\",\r\n shortPeriod: 12,\r\n longPeriod: 26,\r\n trigger: 9,\r\n enableAnimation: false,\r\n animationDuration: null,\r\n },\r\n annotationsDefault: {\r\n visible: false,\r\n content: \"\",\r\n coordinateUnit: \"none\",\r\n verticalAlignment: \"middle\",\r\n horizontalAlignment: \"middle\",\r\n region: \"chart\",\r\n x: 0,\r\n y: 0,\r\n opacity: 1,\r\n angle: 0,\r\n xAxisName: \"\",\r\n yAxisName: \"\",\r\n margin: {\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n top: 0\r\n }\r\n },\r\n multiLevelLabelsDefault: {\r\n visible: false,\r\n text: \"\",\r\n textAlignment: \"center\",\r\n start: null,\r\n end: null,\r\n level: 0,\r\n maximumTextWidth: null,\r\n textOverflow: \"trim\",\r\n font: {\r\n fontFamily: 'Segoe UI',\r\n fontStyle: 'Normal',\r\n size: '12px',\r\n fontWeight: 'Regular',\r\n opacity: 1\r\n },\r\n border: {\r\n type: 'rectangle',\r\n width: 1\r\n }\r\n },\r\n stripLineDefault: {\r\n\r\n visible: false,\r\n\r\n startFromAxis: false,\r\n\r\n width: 0,\r\n\r\n text: \"\",\r\n\r\n textAlignment: 'middlecenter',\r\n\r\n font:\r\n {\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n fontWeight: 'Regular',\r\n\r\n size: '12px',\r\n\r\n color: 'black',\r\n\r\n opacity: 1\r\n },\r\n\r\n start: null,\r\n\r\n end: null,\r\n\r\n color: 'gray',\r\n\r\n borderColor: 'black',\r\n\r\n zIndex: 'over',\r\n\r\n borderWidth: 1\r\n },\r\n\r\n rowDefinitions: null,\r\n\r\n columnDefinitions: null,\r\n\r\n title:\r\n {\r\n\r\n text: \"\",\r\n\r\n enableTrim: false,\r\n\r\n visible: true,\r\n\r\n maximumWidth: 'auto',\r\n\r\n textOverflow: \"trim\",\r\n\r\n textAlignment: \"center\",\r\n\r\n background: 'transparent',\r\n\r\n border: {\r\n\r\n color: 'transparent',\r\n\r\n width: 1,\r\n\r\n opacity: 0.8,\r\n\r\n cornerRadius: 0.8\r\n\r\n },\r\n\r\n font: {\r\n\r\n color: null,\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n size: '16px',\r\n\r\n opacity: 1,\r\n\r\n fontWeight: 'regular'\r\n },\r\n\r\n\r\n subTitle:\r\n {\r\n\r\n text: \"\",\r\n\r\n enableTrim: false,\r\n\r\n visible: true,\r\n\r\n maximumWidth: 'auto',\r\n\r\n textOverflow: \"trim\",\r\n\r\n textAlignment: 'far',\r\n\r\n background: 'transparent',\r\n\r\n border: {\r\n\r\n color: 'transparent',\r\n\r\n width: 1,\r\n\r\n opacity: 0.8,\r\n\r\n cornerRadius: 0.8\r\n\r\n },\r\n\r\n\r\n font:\r\n {\r\n color: null,\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n size: '12px',\r\n\r\n opacity: 1,\r\n\r\n fontWeight: 'regular'\r\n }\r\n }\r\n\r\n },\r\n\r\n\r\n\r\n\r\n\r\n lineCap: { butt: 'butt', round: 'round', square: 'square' },\r\n lineJoin: { round: 'round', bevel: 'bevel', miter: 'miter' },\r\n legendAlignment: { near: 'near', center: 'center', far: 'far' },\r\n legendPosition: { top: 'top', bottom: 'bottom', right: 'right', left: 'left', custom: 'custom' },\r\n\r\n enableAnimation: true,\r\n\r\n legend:\r\n {\r\n\r\n title:\r\n {\r\n text: \"\",\r\n\r\n textAlignment: 'center',\r\n\r\n font:\r\n {\r\n color: null,\r\n\r\n size: '12px',\r\n\r\n fontFamily: \"Segoe UI\",\r\n\r\n fontStyle: 'normal',\r\n\r\n fontWeight: 'regular'\r\n }\r\n },\r\n\r\n border:\r\n {\r\n\r\n color: 'transparent',\r\n\r\n\r\n width: 1\r\n },\r\n\r\n visible: true,\r\n\r\n textOverflow: 'none',\r\n\r\n textWidth: 34,\r\n\r\n toggleSeriesVisibility: true,\r\n\r\n enableScrollbar: true,\r\n\r\n itemPadding: 10,\r\n\r\n shape: 'None',\r\n\r\n alignment: 'Center',\r\n\r\n position: 'Bottom',\r\n\r\n location:\r\n {\r\n\r\n x: 0,\r\n\r\n y: 0\r\n },\r\n\r\n itemStyle:\r\n {\r\n height: 9,\r\n\r\n width: 9,\r\n\r\n border:\r\n {\r\n\r\n color: 'transparent',\r\n\r\n width: 1\r\n }\r\n },\r\n\r\n rowCount: null,\r\n\r\n columnCount: null,\r\n\r\n opacity: 1,\r\n\r\n fill: null,\r\n\r\n background: null,\r\n\r\n font:\r\n {\r\n color: null,\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n fontWeight: 'Regular',\r\n\r\n size: '12px'\r\n },\r\n\r\n size:\r\n {\r\n\r\n height: null,\r\n\r\n width: null\r\n }\r\n },\r\n\r\n indicators: [\r\n {\r\n points: [],\r\n\r\n tooltip:\r\n {\r\n\r\n visible: false,\r\n\r\n format: null,\r\n\r\n fill: null,\r\n\r\n border: {\r\n\r\n width: 1,\r\n\r\n color: null\r\n },\r\n\r\n duration: '500ms',\r\n\r\n enableAnimation: true,\r\n\r\n opacity: 0.95\r\n },\r\n\r\n seriesName: \"\",\r\n\r\n animationDuration: null,\r\n\r\n type: \"SMA\",\r\n\r\n period: 14,\r\n\r\n standardDeviations: 2,\r\n\r\n kPeriod: 3,\r\n\r\n dPeriod: 3,\r\n\r\n periodLine: {\r\n\r\n fill: \"blue\",\r\n\r\n width: 2\r\n },\r\n\r\n lowerLine: {\r\n\r\n\r\n fill: \"#008000\",\r\n\r\n width: 2\r\n },\r\n\r\n upperLine: {\r\n\r\n fill: \"#ff0000\",\r\n\r\n width: 2\r\n },\r\n\r\n macdLine: {\r\n\r\n fill: \"#ff9933\",\r\n\r\n width: 2\r\n },\r\n\r\n histogram: {\r\n\r\n fill: \"#ccccff\",\r\n\r\n opacity: 1,\r\n\r\n border: {\r\n\r\n color: \"#9999ff\",\r\n\r\n width: 1\r\n }\r\n },\r\n\r\n fill: \"#00008B\",\r\n\r\n visible: true,\r\n\r\n font: {\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n fontWeight: 'Regular',\r\n\r\n size: '12px',\r\n\r\n color: '#707070',\r\n\r\n opacity: 1\r\n },\r\n\r\n width: 2,\r\n\r\n xAxisName: \"\",\r\n\r\n yAxisName: \"\",\r\n\r\n macdType: \"line\",\r\n\r\n shortPeriod: 12,\r\n\r\n longPeriod: 26,\r\n\r\n trigger: 9,\r\n\r\n visibility: \"visible\",\r\n\r\n enableAnimation: false\r\n }\r\n ],\r\n\r\n background: null,\r\n\r\n backGroundImageUrl: null,\r\n\r\n annotations: [{\r\n\r\n visible: false,\r\n\r\n content: \"\",\r\n\r\n coordinateUnit: \"none\",\r\n\r\n verticalAlignment: \"middle\",\r\n\r\n horizontalAlignment: \"middle\",\r\n\r\n region: \"chart\",\r\n\r\n x: 0,\r\n\r\n y: 0,\r\n\r\n opacity: 1,\r\n\r\n angle: 0,\r\n\r\n xAxisName: \"\",\r\n\r\n yAxisName: \"\",\r\n\r\n margin: {\r\n\r\n left: 0,\r\n\r\n right: 0,\r\n\r\n bottom: 0,\r\n\r\n top: 0\r\n }\r\n }],\r\n\r\n series: [\r\n {\r\n dragSettings: {\r\n enable: false,\r\n type: 'xy'\r\n },\r\n\r\n type: 'column',\r\n\r\n splitMode: 'value',\r\n\r\n splitValue: null,\r\n\r\n splineType: 'natural',\r\n\r\n cardinalSplineTension: 0.5,\r\n\r\n gapWidth: 50,\r\n\r\n pieOfPieCoefficient: 0.6,\r\n\r\n visibleOnLegend: \"visible\",\r\n\r\n enableAnimation: false,\r\n\r\n animationDuration: null,\r\n\r\n animationType: 'linear',\r\n\r\n isClosed: true,\r\n\r\n isTransposed: false,\r\n\r\n isStacking: true,\r\n\r\n columnSpacing: 0,\r\n\r\n columnWidth: 0.7,\r\n\r\n columnFacet: 'rectangle',\r\n drawType: 'line',\r\n\r\n doughnutCoefficient: 0.4,\r\n\r\n explodeOffset: 25,\r\n\r\n pyramidMode: 'linear',\r\n\r\n boxPlotMode: 'exclusive',\r\n\r\n funnelWidth: '11.6%',\r\n\r\n funnelHeight: '32.7%',\r\n\r\n positiveFill: null,\r\n\r\n showMedian: true,\r\n\r\n outlierSettings: {\r\n\r\n shape: 'circle',\r\n\r\n size:\r\n {\r\n width: 6,\r\n\r\n height: 6\r\n\r\n },\r\n },\r\n\r\n cornerRadius: {\r\n\r\n topLeft: 0,\r\n\r\n topRight: 0,\r\n\r\n bottomLeft: 0,\r\n\r\n bottomRight: 0\r\n },\r\n\r\n connectorLine: {\r\n\r\n width: 1,\r\n\r\n opacity: 1,\r\n\r\n dashArray: null\r\n },\r\n\r\n errorBar: {\r\n\r\n visibility: \"hidden\",\r\n\r\n mode: \"vertical\",\r\n\r\n type: \"fixedValue\",\r\n\r\n horizontalErrorValue: 1,\r\n\r\n verticalErrorValue: 3,\r\n\r\n horizontalPositiveErrorValue: 1,\r\n\r\n horizontalNegativeErrorValue: 1,\r\n\r\n verticalPositiveErrorValue: 5,\r\n\r\n verticalNegativeErrorValue: 5,\r\n\r\n direction: \"both\",\r\n\r\n cap: {\r\n\r\n visible: true,\r\n\r\n width: 1,\r\n\r\n length: 20,\r\n\r\n },\r\n\r\n\r\n width: 1,\r\n\r\n opacity: 1,\r\n\r\n },\r\n\r\n highlightSettings: {\r\n\r\n enable: false,\r\n\r\n mode: 'series',\r\n\r\n color: \"\",\r\n\r\n opacity: 0.6,\r\n\r\n border: {\r\n\r\n color: \"\",\r\n\r\n width: 2\r\n },\r\n\r\n pattern: 'none',\r\n\r\n customPattern: \"\"\r\n },\r\n\r\n selectionSettings: {\r\n\r\n type: 'Single',\r\n\r\n enable: false,\r\n\r\n mode: 'series',\r\n\r\n rangeType: 'xy',\r\n\r\n color: \"\",\r\n\r\n opacity: 0.6,\r\n\r\n border: {\r\n\r\n color: \"\",\r\n\r\n width: 2\r\n },\r\n\r\n pattern: 'none',\r\n\r\n customPattern: \"\"\r\n },\r\n\r\n emptyPointSettings: {\r\n\r\n visible: true,\r\n\r\n style: {\r\n\r\n color: '',\r\n\r\n border: {\r\n\r\n color: '',\r\n\r\n width: 1\r\n\r\n }\r\n\r\n },\r\n\r\n displayMode: 'gap'\r\n },\r\n\r\n labelPosition: 'inside',\r\n\r\n gapRatio: 0,\r\n\r\n points: null,\r\n\r\n pieCoefficient: 0.8,\r\n\r\n doughnutSize: 0.8,\r\n\r\n dataSource: null,\r\n\r\n high: '',\r\n\r\n low: '',\r\n\r\n open: '',\r\n\r\n close: '',\r\n\r\n bullFillColor: null,\r\n\r\n bearFillColor: null,\r\n\r\n query: null,\r\n\r\n xName: '',\r\n\r\n yName: '',\r\n\r\n pointColorMappingName: '',\r\n\r\n\r\n\r\n visibility: \"visible\",\r\n\r\n startAngle: null,\r\n\r\n endAngle: null,\r\n\r\n xAxisName: null,\r\n\r\n yAxisName: null,\r\n\r\n explodeAll: null,\r\n\r\n explode: false,\r\n\r\n explodeIndex: null,\r\n\r\n enableSmartLabels: null,\r\n\r\n tooltip: {\r\n\r\n visible: false,\r\n\r\n format: null,\r\n\r\n template: null,\r\n\r\n\r\n fill: null,\r\n\r\n border: {\r\n\r\n width: 1,\r\n\r\n color: null\r\n },\r\n\r\n enableAnimation: true,\r\n\r\n duration: '500ms',\r\n\r\n opacity: 0.95\r\n },\r\n\r\n fill: null,\r\n\r\n opacity: 1,\r\n\r\n lineCap: 'butt',\r\n\r\n lineJoin: 'round',\r\n\r\n dashArray: \"\",\r\n\r\n border: {\r\n\r\n width: 1,\r\n\r\n color: 'transparent',\r\n\r\n dashArray: \"\"\r\n },\r\n width: 2,\r\n\r\n marker: {\r\n\r\n shape: 'circle',\r\n\r\n imageUrl: \"\",\r\n\r\n size: {\r\n\r\n width: 6,\r\n\r\n height: 6\r\n },\r\n\r\n visible: false,\r\n\r\n opacity: 1,\r\n\r\n fill: null,\r\n\r\n border: {\r\n\r\n color: 'white',\r\n\r\n width: 3\r\n },\r\n\r\n dataLabel: {\r\n\r\n visible: false,\r\n\r\n angle: 0,\r\n\r\n showEdgeLabels: false,\r\n\r\n enableContrastColor: false,\r\n\r\n textMappingName: '',\r\n\r\n verticalTextAlignment: 'center',\r\n\r\n horizontalTextAlignment: 'center',\r\n\r\n textPosition: 'top',\r\n\r\n shape: 'none',\r\n\r\n opacity: 1,\r\n\r\n fill: null,\r\n\r\n border: {\r\n\r\n color: 'white',\r\n\r\n width: 0.1\r\n },\r\n\r\n maximumLabelWidth: null,\r\n\r\n enableWrap: false,\r\n\r\n connectorLine: {\r\n\r\n width: 0.5,\r\n\r\n type: 'line',\r\n\r\n color: null\r\n },\r\n\r\n offset: {\r\n\r\n x: 0,\r\n\r\n y: 0\r\n },\r\n\r\n font: {\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n fontWeight: 'Regular',\r\n\r\n color: null,\r\n\r\n size: '11px',\r\n\r\n opacity: 1\r\n },\r\n\r\n margin: {\r\n\r\n left: 5,\r\n\r\n top: 5,\r\n\r\n bottom: 5,\r\n\r\n right: 5\r\n }\r\n\r\n }\r\n },\r\n\r\n bubbleOptions: {\r\n\r\n radiusMode: \"minmax\",\r\n\r\n minRadius: 1,\r\n\r\n maxRadius: 3\r\n\r\n },\r\n\r\n trendlines: [{\r\n\r\n visibility: \"\",\r\n\r\n visibleOnLegend: \"visible\",\r\n\r\n type: \"linear\",\r\n\r\n name: \"Trendline\",\r\n\r\n fill: \"\",\r\n\r\n width: 1,\r\n\r\n opacity: 1,\r\n\r\n dashArray: \"\",\r\n\r\n forwardForecast: 0,\r\n\r\n backwardForecast: 0,\r\n\r\n polynomialOrder: 2,\r\n\r\n period: 2,\r\n\r\n intercept: null,\r\n\r\n tooltip:\r\n {\r\n\r\n visible: false,\r\n\r\n format: null,\r\n\r\n fill: null,\r\n\r\n border: {\r\n\r\n width: 1,\r\n\r\n color: null\r\n },\r\n\r\n duration: '500ms',\r\n\r\n enableAnimation: true,\r\n\r\n opacity: 0.95,\r\n\r\n font: {\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n fontWeight: 'Regular',\r\n\r\n color: null,\r\n\r\n size: '12px',\r\n\r\n opacity: 1\r\n }\r\n }\r\n }],\r\n\r\n\r\n font: {\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n fontWeight: 'Regular',\r\n\r\n size: '12px',\r\n\r\n color: '#707070',\r\n\r\n opacity: 1\r\n },\r\n _isdesigntime: true\r\n\r\n }\r\n ],\r\n\r\n commonSeriesOptions: {\r\n dragSettings: {\r\n enable: false,\r\n type: 'xy'\r\n },\r\n\r\n type: 'column',\r\n\r\n splitMode: 'value',\r\n\r\n splitValue: null,\r\n\r\n splineType: 'natural',\r\n\r\n cardinalSplineTension: 0.5,\r\n\r\n gapWidth: 50,\r\n\r\n pieOfPieCoefficient: 0.6,\r\n\r\n visibleOnLegend: \"visible\",\r\n\r\n enableAnimation: false,\r\n\r\n animationDuration: null,\r\n\r\n animationType: 'linear',\r\n\r\n isClosed: true,\r\n\r\n isTransposed: false,\r\n\r\n isStacking: false,\r\n\r\n columnWidth: 0.7,\r\n\r\n columnSpacing: 0,\r\n\r\n columnFacet: 'rectangle',\r\n\r\n drawType: 'line',\r\n\r\n doughnutCoefficient: 0.4,\r\n\r\n explodeOffset: 25,\r\n\r\n pyramidMode: 'linear',\r\n\r\n boxPlotMode: 'exclusive',\r\n\r\n funnelWidth: '11.6%',\r\n\r\n funnelHeight: '32.7%',\r\n\r\n positiveFill: null,\r\n\r\n showMedian: true,\r\n\r\n outlierSettings: {\r\n\r\n shape: 'circle',\r\n\r\n size:\r\n {\r\n width: 6,\r\n\r\n height: 6\r\n\r\n },\r\n },\r\n\r\n cornerRadius: {\r\n\r\n topLeft: 0,\r\n\r\n topRight: 0,\r\n\r\n bottomLeft: 0,\r\n\r\n bottomRight: 0\r\n },\r\n\r\n connectorLine: {\r\n\r\n width: 1,\r\n\r\n opacity: 1,\r\n\r\n dashArray: null\r\n },\r\n\r\n errorBar: {\r\n\r\n visibility: \"hidden\",\r\n\r\n mode: \"vertical\",\r\n\r\n type: \"fixedValue\",\r\n\r\n horizontalErrorValue: 1,\r\n\r\n verticalErrorValue: 3,\r\n\r\n horizontalPositiveErrorValue: 1,\r\n\r\n horizontalNegativeErrorValue: 1,\r\n\r\n verticalPositiveErrorValue: 5,\r\n\r\n verticalNegativeErrorValue: 5,\r\n\r\n direction: \"both\",\r\n\r\n cap: {\r\n\r\n visible: true,\r\n\r\n width: 1,\r\n\r\n length: 20,\r\n\r\n },\r\n\r\n\r\n width: 1,\r\n\r\n opacity: 1,\r\n\r\n },\r\n\r\n highlightSettings: {\r\n\r\n enable: false,\r\n\r\n mode: 'series',\r\n\r\n color: \"\",\r\n\r\n opacity: 0.6,\r\n\r\n border: {\r\n\r\n color: \"\",\r\n\r\n width: 2\r\n },\r\n\r\n pattern: 'none',\r\n\r\n customPattern: \"\"\r\n },\r\n\r\n selectionSettings: {\r\n\r\n type: 'Single',\r\n\r\n enable: false,\r\n\r\n mode: 'series',\r\n\r\n rangeType: 'xy',\r\n\r\n color: \"\",\r\n\r\n opacity: 0.6,\r\n\r\n border: {\r\n\r\n color: \"\",\r\n\r\n width: 2\r\n },\r\n\r\n pattern: 'none',\r\n\r\n customPattern: \"\"\r\n },\r\n\r\n emptyPointSettings: {\r\n\r\n visible: true,\r\n\r\n style: {\r\n\r\n color: '',\r\n\r\n border: {\r\n\r\n color: '',\r\n\r\n width: 1\r\n\r\n }\r\n\r\n },\r\n\r\n displayMode: 'gap'\r\n },\r\n\r\n labelPosition: 'inside',\r\n\r\n gapRatio: 0,\r\n\r\n pieCoefficient: 0.8,\r\n\r\n doughnutSize: 0.8,\r\n\r\n dataSource: null,\r\n\r\n xName: '',\r\n\r\n yName: '',\r\n\r\n pointColorMappingName: '',\r\n\r\n high: '',\r\n\r\n low: '',\r\n\r\n open: '',\r\n\r\n close: '',\r\n\r\n startAngle: null,\r\n\r\n endAngle: null,\r\n\r\n xAxisName: null,\r\n\r\n yAxisName: null,\r\n\r\n explodeAll: false,\r\n\r\n explode: false,\r\n\r\n explodeIndex: null,\r\n\r\n enableSmartLabels: null,\r\n\r\n tooltip: {\r\n\r\n visible: false,\r\n\r\n format: null,\r\n\r\n template: null,\r\n\r\n fill: null,\r\n\r\n border: {\r\n\r\n color: null,\r\n\r\n width: 1\r\n },\r\n\r\n enableAnimation: true,\r\n\r\n duration: '500ms',\r\n\r\n opacity: 0.95\r\n },\r\n\r\n fill: null,\r\n\r\n opacity: 1,\r\n\r\n lineCap: 'butt',\r\n\r\n lineJoin: 'round',\r\n\r\n dashArray: \"\",\r\n\r\n border: {\r\n\r\n color: 'transparent',\r\n\r\n width: 1,\r\n\r\n dashArray: \"\"\r\n },\r\n width: 2,\r\n\r\n marker:\r\n {\r\n\r\n shape: 'circle',\r\n\r\n imageUrl: \"\",\r\n\r\n size: {\r\n\r\n width: 6,\r\n\r\n height: 6\r\n },\r\n\r\n visible: false,\r\n\r\n opacity: 1,\r\n\r\n fill: null,\r\n\r\n border: {\r\n\r\n color: 'white',\r\n\r\n width: 3\r\n },\r\n\r\n dataLabel:\r\n {\r\n\r\n visible: false,\r\n\r\n angle: 0,\r\n\r\n enableContrastColor: false,\r\n\r\n showEdgeLabels: false,\r\n\r\n textMappingName: '',\r\n\r\n verticalTextAlignment: 'center',\r\n\r\n horizontalTextAlignment: 'center',\r\n\r\n textPosition: 'top',\r\n\r\n shape: 'none',\r\n\r\n maximumLabelWidth: null,\r\n\r\n enableWrap: false,\r\n\r\n opacity: 1,\r\n\r\n fill: null,\r\n\r\n border: {\r\n\r\n color: 'white',\r\n\r\n width: 0.1\r\n },\r\n\r\n offset: {\r\n\r\n x: 0,\r\n\r\n y: 0\r\n },\r\n\r\n connectorLine:\r\n {\r\n\r\n width: 0.5,\r\n\r\n type: 'line',\r\n\r\n height: null\r\n },\r\n\r\n font:\r\n {\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n fontWeight: 'Regular',\r\n\r\n size: '11px',\r\n\r\n color: null,\r\n\r\n opacity: 1\r\n },\r\n\r\n margin:\r\n {\r\n\r\n left: 5,\r\n\r\n top: 5,\r\n\r\n bottom: 5,\r\n\r\n right: 5\r\n }\r\n }\r\n },\r\n\r\n bubbleOptions: {\r\n\r\n radiusMode: \"minmax\",\r\n\r\n minRadius: 1,\r\n\r\n maxRadius: 3\r\n\r\n },\r\n\r\n trendlines: [{\r\n\r\n visibility: \"\",\r\n\r\n visibleOnLegend: \"visible\",\r\n\r\n type: \"linear\",\r\n\r\n name: \"Trendline\",\r\n\r\n fill: \"\",\r\n\r\n width: 1,\r\n\r\n opacity: 1,\r\n\r\n dashArray: \"\",\r\n\r\n forwardForecast: 0,\r\n\r\n backwardForecast: 0,\r\n\r\n polynomialOrder: 2,\r\n\r\n period: 2,\r\n\r\n intercept: null,\r\n\r\n tooltip:\r\n {\r\n\r\n visible: false,\r\n\r\n format: null,\r\n\r\n fill: null,\r\n\r\n border: {\r\n\r\n width: 1,\r\n\r\n color: null\r\n },\r\n\r\n duration: '500ms',\r\n\r\n enableAnimation: true,\r\n\r\n opacity: 0.95,\r\n\r\n font: {\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n fontWeight: 'Regular',\r\n\r\n color: null,\r\n\r\n size: '12px',\r\n\r\n opacity: 1\r\n }\r\n }\r\n }],\r\n\r\n font: {\r\n\r\n fontFamily: 'Segoe UI',\r\n\r\n fontStyle: 'Normal',\r\n\r\n fontWeight: 'Regular',\r\n\r\n size: '12px',\r\n\r\n color: '#707070',\r\n\r\n opacity: 1\r\n }\r\n },\r\n\r\n crosshair:\r\n {\r\n line: {\r\n\r\n\r\n width: 1\r\n },\r\n marker:\r\n {\r\n\r\n visible: true,\r\n\r\n size:\r\n {\r\n\r\n width: 10,\r\n\r\n height: 10\r\n },\r\n\r\n opacity: 1,\r\n\r\n border:\r\n {\r\n\r\n width: 3\r\n }\r\n },\r\n\r\n visible: false,\r\n\r\n type: \"crosshair\",\r\n\r\n trackballTooltipSettings: {\r\n\r\n fill: null,\r\n\r\n mode: \"float\",\r\n\r\n border: {\r\n\r\n width: null,\r\n\r\n color: null,\r\n\r\n },\r\n\r\n rx: 3,\r\n\r\n ry: 3,\r\n\r\n opacity: 1,\r\n\r\n tooltipTemplate: null\r\n }\r\n },\r\n\r\n\r\n pointStyle:\r\n {\r\n lineCap: 'butt', lineJoin: 'round', opacity: 1, interior: null, borderColor: null, borderWidth: 1\r\n },\r\n textStyle:\r\n {\r\n marker: { textAlignment: 'center', textPosition: 'top' },\r\n font: { fontFamily: 'Segoe UI', fontStyle: 'Normal', fontWeight: 'Regular', size: '12px', color: '#707070', opacity: 1 }\r\n },\r\n symbolShape: {\r\n None: 0,\r\n LeftArrow: 1,\r\n RightArrow: 2,\r\n Circle: 3,\r\n Cross: 4,\r\n HorizLine: 5,\r\n VertLine: 6,\r\n Diamond: 7,\r\n Rectangle: 8,\r\n Triangle: 9,\r\n InvertedTriangle: 10,\r\n Hexagon: 11,\r\n Pentagon: 12,\r\n Star: 13,\r\n Ellipse: 14,\r\n Wedge: 15,\r\n Trapezoid: 16,\r\n UpArrow: 17,\r\n DownArrow: 18,\r\n Image: 19,\r\n SeriesType: 20\r\n\r\n },\r\n initSeriesRender: true,\r\n\r\n theme: \"flatlight\",\r\n\r\n canResize: false,\r\n\r\n isResponsive: false,\r\n\r\n enable3D: false,\r\n\r\n enableRotation: false,\r\n\r\n sideBySideSeriesPlacement: null,\r\n\r\n perspectiveAngle: 90,\r\n\r\n rotation: 0,\r\n\r\n tilt: 0,\r\n\r\n wallSize: 2,\r\n\r\n depth: 100,\r\n\r\n enableCanvasRendering: false,\r\n\r\n selectedDataPointIndexes: [],\r\n\r\n exportSettings: {\r\n\r\n type: \"png\",\r\n\r\n fileName: \"Chart\",\r\n\r\n orientation: \"portrait\",\r\n\r\n angle: 0,\r\n\r\n mode: \"client\",\r\n\r\n action: \"\",\r\n\r\n multipleExport: false\r\n },\r\n\r\n zooming:\r\n {\r\n\r\n enable: false,\r\n\r\n enableScrollbar: false,\r\n\r\n type: 'x,y',\r\n\r\n enablePinching: true,\r\n\r\n enableMouseWheel: false,\r\n\r\n enableDeferredZoom: false,\r\n\r\n toolbarItems: [\"zoomIn\", \"zoomOut\", \"zoom\", \"pan\", \"reset\"]\r\n },\r\n type: 'x,y',\r\n\r\n locale: null,\r\n\r\n xZoomFactor: 1,\r\n\r\n yZoomFactor: 1,\r\n\r\n xZoomPosition: 0,\r\n\r\n yZoomPosition: 0,\r\n\r\n load: \"\",\r\n\r\n axesLabelRendering: \"\",\r\n\r\n axesRangeCalculate: \"\",\r\n\r\n axesTitleRendering: \"\",\r\n\r\n dragStart: \"\",\r\n\r\n dragging: \"\",\r\n\r\n dragEnd: \"\",\r\n\r\n chartAreaBoundsCalculate: \"\",\r\n\r\n legendItemRendering: \"\",\r\n\r\n legendBoundsCalculate: \"\",\r\n\r\n preRender: \"\",\r\n\r\n seriesRendering: \"\",\r\n\r\n\r\n trendlineRendering: \"\",\r\n\r\n symbolRendering: \"\",\r\n\r\n titleRendering: \"\",\r\n subtitleRendering: \"\",\r\n\r\n axesLabelsInitialize: \"\",\r\n\r\n pointRegionClick: \"\",\r\n\r\n seriesRegionClick: \"\",\r\n\r\n annotationClick: \"\",\r\n\r\n axisLabelClick: \"\",\r\n\r\n chartClick: \"\",\r\n\r\n scrollStart: \"\",\r\n\r\n scrollEnd: \"\",\r\n\r\n scrollChanged: \"\",\r\n\r\n chartDoubleClick: \"\",\r\n\r\n pointRegionMouseMove: \"\",\r\n\r\n legendItemClick: \"\",\r\n\r\n axisLabelMouseMove: \"\",\r\n\r\n chartMouseMove: \"\",\r\n\r\n legendItemMouseMove: \"\",\r\n\r\n chartMouseLeave: \"\",\r\n\r\n displayTextRendering: \"\",\r\n\r\n toolTipInitialize: \"\",\r\n\r\n trackAxisToolTip: \"\",\r\n\r\n trackToolTip: \"\",\r\n\r\n animationComplete: \"\",\r\n\r\n zoomed: \"\",\r\n\r\n destroy: \"\",\r\n\r\n create: \"\",\r\n\r\n beforeResize: \"\",\r\n\r\n afterResize: \"\",\r\n\r\n rangeSelected: \"\",\r\n\r\n multiLevelLabelClick: \"\",\r\n\r\n multiLevelLabelRendering: \"\",\r\n\r\n margin: { left: 10, right: 10, top: 10, bottom: 10 },\r\n size: { width: null, height: null },\r\n elementSpacing: 10,\r\n\r\n dateStart: 25568.791666666668\r\n\r\n },\r\n\r\n dataTypes: {\r\n commonSeriesOptions: { dataSource: \"data\" },\r\n axes: \"array\",\r\n series: \"array\",\r\n annotations: \"array\",\r\n indicators: \"array\",\r\n seriesColors: \"array\",\r\n palette: \"array\",\r\n rowDefinitions: \"array\",\r\n columnDefinitions: \"array\",\r\n seriesBorderColors: \"array\",\r\n pointColors: \"array\",\r\n pointBorderColors: \"array\",\r\n initSeriesRender: \"boolean\",\r\n theme: \"enum\",\r\n canResize: \"boolean\",\r\n isResponsive: \"boolean\",\r\n elementSpacing: \"number\",\r\n primaryXAxis: {\r\n labels: \"array\",\r\n multiLevelLabels: \"array\",\r\n stripLine: \"array\",\r\n orientation: \"enum\",\r\n rangePadding: \"enum\",\r\n labelPlacement: \"enum\",\r\n tickLinesPosition: \"enum\",\r\n labelPosition: \"enum\",\r\n opposedPosition: \"boolean\",\r\n zoomFactor: \"number\",\r\n zoomPosition: \"number\",\r\n showNextToAxisLine: \"boolean\"\r\n },\r\n primaryYAxis: {\r\n labels: \"array\",\r\n multiLevelLabels: \"array\",\r\n stripLine: \"array\",\r\n orientation: \"enum\",\r\n rangePadding: \"enum\",\r\n labelPlacement: \"enum\",\r\n opposedPosition: \"boolean\",\r\n zoomFactor: \"number\",\r\n zoomPosition: \"number\"\r\n },\r\n legend: {\r\n textOverflow: \"enum\",\r\n shape: \"enum\",\r\n alignment: \"enum\",\r\n position: \"enum\",\r\n itemPadding: \"number\"\r\n },\r\n exportSettings: {\r\n type: \"string\",\r\n fileName: \"string\",\r\n orientation: \"enum\",\r\n angle: \"number\",\r\n mode: \"enum\",\r\n action: \"string\",\r\n multipleExport: \"boolean\"\r\n },\r\n zooming: {\r\n enable: \"boolean\",\r\n type: \"string\",\r\n enableMouseWheel: \"boolean\",\r\n toolbarItems: \"array\",\r\n enableScrollbar: \"boolean\"\r\n },\r\n size: {\r\n width: \"string\",\r\n height: \"string\"\r\n }\r\n\r\n },\r\n\r\n observables: [\"xZoomFactor\", \"yZoomFactor\", \"xZoomPosition\", \"yZoomPosition\"],\r\n\r\n _tags: [{\r\n tag: \"series\",\r\n attr: [\"xAxisName\", \"yAxisName\", \"zOrder\", \"endAngle\", \"startAngle\", \"explodeIndex\", \"labelPosition\", \"xName\", \"yName\", \"pointColorMappingName\", \"pyramidMode\", \"boxPlotMode\", \"showMedian\",\r\n \"pieCoefficient\", \"explodeAll\", \"explodeOffset\", \"funnelWidth\", \"columnFacet\", \"funnelHeight\", \"gapRatio\", \"isClosed\", \"isTransposed\",\r\n \"isStacking\", \"bearFillColor\", \"bullFillColor\", \"dataSource\", \"enableAnimation\", \"animationDuration\", \"doughnutCoefficient\", \"doughnutSize\",\r\n \"enableSmartLabels\", \"drawType\", \"dashArray\", \"visibleOnLegend\", \"columnSpacing\", \"columnWidth\", \"drawType\", \"positiveFill\", \"explodeIndex\", \"cornerRadius\",\r\n \"lineCap\", \"lineJoin\", \"highlightSettings.enable\", \"highlightSettings.mode\", \"highlightSettings.pattern\", \"highlightSettings.color\", \"highlightSettings.opacity\",\r\n \"highlightSettings.customPattern\", \"highlightSettings.border.color\", \"highlightSettings.border.width\", \"selectionSettings.enable\", \"selectionSettings.mode\", \"selectionSettings.pattern\",\r\n \"selectionSettings.color\", \"selectionSettings.opacity\", \"selectionSettings.customPattern\", \"selectionSettings.type\", \"selectionSettings.rangeType\",\r\n \"selectionSettings.border.width\", \"selectionSettings.border.color\", \"dragSettings.enable\", \"dragSettings.type\",\r\n \"connectorLine.width\", \"connectorLine.opacity\", \"connectorLine.dashArray\", \"cornerRadius.topLeft\", \"cornerRadius.topRight\", \"cornerRadius.bottomLeft\", \"cornerRadius.bottomRight\",\r\n \"errorBar.visibility\", \"errorBar.mode\", \"errorBar.type\", \"errorBar.horizontalErrorValue\", \"errorBar.verticalErrorValue\", \"errorBar.horizontalPositiveErrorValue\",\r\n \"errorBar.horizontalNegativeErrorValue\", \"errorBar.verticalPositiveErrorValue\", \"errorBar.verticalNegativeErrorValue\", \"errorBar.direction\",\r\n \"errorBar.cap.visible\", \"errorBar.cap.width\", \"errorBar.cap.length\", \"errorBar.width\", \"errorBar.opacity\", \"emptyPointSettings.visible\",\r\n \"emptyPointSettings.style.color\", \"emptyPointSettings.style.border.color\", \"emptyPointSettings.style.border.width\", \"emptyPointSettings.displayMode\",\r\n \"bubbleOptions.minRadius\", \"bubbleOptions.maxRadius\", \"bubbleOptions.radiusMode\",\r\n \"tooltip.visible\", \"tooltip.format\", \"tooltip.template\", \"tooltip.fill\", \"tooltip.border.width\", \"tooltip.border.color\", \"tooltip.enableAnimation\", \"tooltip.duration\",\r\n \"tooltip.opacity\", \"tooltip.font.size\", \"tooltip.font.opacity\", \"tooltip.font.fontFamily\", \"tooltip.font.fontStyle\", \"tooltip.font.fontWeight\", \"tooltip.font.color\", \"border.width\", \"border.color\", \"border.dashArray\", \"marker.shape\", \"marker.imageUrl\", \"marker.size.width\", \"marker.size.height\",\r\n \"marker.visible\", \"marker.opacity\", \"marker.fill\", \"marker.border.color\", \"marker.border.width\", \"marker.dataLabel.visible\", \"marker.dataLabel.angle\",\r\n \"marker.dataLabel.template\", \"marker.dataLabel.textMappingName\", \"marker.dataLabel.verticalTextAlignment\", \"marker.dataLabel.horizontalTextAlignment\", \"marker.dataLabel.textPosition\", \"marker.dataLabel.shape\",\r\n \"marker.dataLabel.opacity\", \"marker.dataLabel.fill\", \"marker.dataLabel.border.color\", \"marker.dataLabel.border.width\", \"marker.dataLabel.maximumLabelWidth\", \"marker.dataLabel.enableWrap\",\r\n \"marker.dataLabel.connectorLine.width\", \"marker.dataLabel.connectorLine.type\", \"marker.dataLabel.connectorLine.color\", \"marker.dataLabel.offset\", \"marker.dataLabel.offset.x\", \"marker.dataLabel.offset.y\",\r\n \"marker.dataLabel.font.size\", \"marker.dataLabel.font.color\", \"marker.dataLabel.enableContrastColor\", \"marker.dataLabel.showEdgeLabels\", \"marker.dataLabel.font.opacity\", \"marker.dataLabel.font.fontFamily\", \"marker.dataLabel.font.fontStyle\", \"marker.dataLabel.font.fontWeight\",\r\n \"marker.dataLabel.margin\", \"marker.dataLabel.margin.left\", \"marker.dataLabel.margin.top\", \"marker.dataLabel.margin.bottom\", \"marker.dataLabel.margin.right\",\r\n \"font.size\", \"font.opacity\", \"font.fontFamily\", \"font.fontStyle\", \"font.fontWeight\", \"font.color\", \"splineType\", \"cardinalSplineTension\",\r\n [\r\n {\r\n tag: \"trendlines\", attr: [\"visibility\", \"visibilityOnLegend\", \"dashArray\", \"forewardForecast\", \"backwardForecast\", \"polynomialOrder\",\r\n \"tooltip.visible\", \"tooltip.format\", \"tooltip.fill\", \"tooltip.border.width\", \"tooltip.border.color\", \"tooltip.enableAnimation\", \"tooltip.duration\",\r\n \"tooltip.opacity\", \"tooltip.font.size\", \"tooltip.font.opacity\", \"tooltip.font.fontFamily\", \"tooltip.font.fontStyle\", \"tooltip.font.fontWeight\", \"tooltip.font.color\",\r\n ], singular: \"trendline\"\r\n }\r\n ],\r\n [\r\n {\r\n tag: \"points\", attr: [\"x\", \"y\", \"text\", \"textMappingName\", \"isEmpty\", \"fill\", \"visible\"], singular: \"points\"\r\n }\r\n ]\r\n\r\n ],\r\n singular: \"series\"\r\n }, {\r\n tag: \"axes\",\r\n attr: [\"columnIndex\", \"rowIndex\", \"desiredIntervals\", \"multiLevelLabelsColor\", \"multiLevelLabelsFontColor\", \"isIndexed\", \"labelPlacement\", \"edgeLabelPlacement\", \"intervalType\", \"labelFormat\", \"labelPosition\", \"labelRotation\", \"logBase\",\r\n \"labelIntersectAction\", \"opposedPosition\", \"plotOffset\", \"rangePadding\", \"roundingPlaces\", \"valueType\", \"zoomFactor\", \"zoomPosition\", \"orientation\",\r\n \"crossesAt\", \"crossesInAxis\", \"scrollbarSettings.visible\", \"scrollbarSettings.canResize\", \"scrollbarSettings.range.min\", \"scrollbarSettings.range.max\", \"scrollbarSettings.pointsLength\",\r\n \"range.min\", \"range.max\", \"range.interval\", \"tickLinesPosition\", \"alternateGridBand.odd.fill\", \"alternateGridBand.odd.opacity\", \"alternateGridBand.even.fill\", \"alternateGridBand.even.opacity\",\r\n \"enableAutoIntervalOnZooming\", \"majorGridLines.width\", \"majorGridLines.color\", \"majorGridLines.dashArray\", \"majorGridLines.visible\", \"majorGridLines.opacity\", \"majorTickLines.color\", \"majorTickLines.width\", \"majorTickLines.size\", \"majorTickLines.visible\",\r\n \"minorGridLines.width\", \"minorGridLines.dashArray\", \"minorGridLines.color\", \"minorGridLines.visible\", \"minorTickLines.color\", \"minorTickLines.width\", \"minorTickLines.size\", \"minorTickLines.visible\", \"labelBorder.color\", \"labelBorder.width\", \"minorTicksPerInterval\",\r\n \"columnSpan\", \"crosshairLabel.visible\", \"crosshairLabel.rx\", \"crosshairLabel.ry\", \"crosshairLabel.border.color\", \"crosshairLabel.border.width\", \"crosshairLabel.fill\",\r\n \"crosshairLabel.font.fontFamily\", \"crosshairLabel.font.fontStyle\", \"crosshairLabel.font.size\", \"crosshairLabel.font.fontWeight\", \"crosshairLabel.font.opacity\", \"crosshairLabel.font.color\", \"font.size\", \"font.color\", \"font.opacity\", \"font.fontFamily\", \"font.fontStyle\", \"font.fontWeight\", \"isInversed\", \"enableTrim\", \"maximumLabelWidth\",\r\n \"axisLine.visible\", \"axisLine.width\", \"axisLine.color\", \"axisLine.dashArray\", \"axisLine.offset\", \"maximumLabels\", \"title.text\", \"title.visible\", \"title.enableTrim\", \"title.offset\",\r\n \"title.alignment\", \"title.position\", \"title.maximumTitleWidth\", \"title.font.size\", \"title.font.color\", \"title.font.opacity\", \"title.font.fontFamily\", \"title.font.fontStyle\", \"title.font.fontWeight\",\r\n \"additionalPadding\", \"showNextToAxisLine\",\r\n [\r\n {\r\n tag: \"stripLine\", attr: [\"borderColor\", \"startFromAxis\", \"zIndex\", \"textAlignment\", \"font.size\", \"font.opacity\", \"font.fontFamily\", \"font.fontStyle\", \"font.fontWeight\", \"font.color\"],\r\n singular: \"stripLine\"\r\n }\r\n ],\r\n [\r\n {\r\n tag: \"multiLevelLabels\", attr: [\"textOverflow\", \"maximumTextWidth\", \"textAlignment\", \"font.size\", \"font.opacity\", \"font.fontFamily\", \"font.fontStyle\", \"font.fontWeight\", \"border.type\", \"border.width\"],\r\n singular: \"multiLevelLabel\"\r\n }\r\n ],\r\n ],\r\n singular: \"axis\"\r\n },\r\n {\r\n tag: \"primaryXAxis.stripLine\",\r\n attr: [\"borderColor\", \"startFromAxis\", \"zIndex\", \"textAlignment\", \"font.size\", \"font.opacity\", \"font.fontFamily\", \"font.fontStyle\", \"font.fontWeight\", \"font.color\"],\r\n singular: \"primaryXAxis.stripLine\"\r\n },\r\n {\r\n tag: \"primaryYAxis.stripLine\",\r\n attr: [\"borderColor\", \"startFromAxis\", \"zIndex\", \"textAlignment\", \"font.size\", \"font.opacity\", \"font.fontFamily\", \"font.fontStyle\", \"font.fontWeight\", \"font.color\"],\r\n singular: \"primaryYAxis.stripLine\"\r\n },\r\n {\r\n tag: \"primaryXAxis.multiLevelLabels\",\r\n attr: [\"textOverflow\", \"maximumTextWidth\", \"textAlignment\", \"font.size\", \"font.opacity\", \"font.fontFamily\", \"font.fontStyle\", \"font.fontWeight\", \"border.type\", \"border.width\"],\r\n singular: \"primaryXAxis.multiLevelLabel\"\r\n },\r\n {\r\n tag: \"primaryYAxis.multiLevelLabels\",\r\n attr: [\"textOverflow\", \"maximumTextWidth\", \"textAlignment\", \"font.size\", \"font.opacity\", \"font.fontFamily\", \"font.fontStyle\", \"font.fontWeight\", \"border.type\", \"border.width\"],\r\n singular: \"primaryYAxis.multiLevelLabel\"\r\n },\r\n {\r\n tag: \"indicators\",\r\n attr: [\"seriesName\", \"xName\", \"xAxisName\", \"macdType\", \"shortPeriod\", \"longPeriod\", \"enableAnimation\", \"animationDuration\",\r\n \"yAxisName\", \"standardDeviations\", \"kPeriod\", \"dPeriod\", \"periodLine.fill\", \"periodLine.width\", \"lowerLine.fill\",\r\n \"lowerLine.width\", \"upperLine.fill\", \"upperLine.width\", \"macdLine.fill\", \"macdLine.width\", \"histogram.fill\", \"histogram.opacity\",\r\n \"histogram.border.color\", \"histogram.border.width\", \"font.size\", \"font.opacity\", \"font.fontFamily\", \"font.fontStyle\", \"font.fontWeight\", \"font.color\",\r\n \"tooltip.visible\", \"tooltip.format\", \"tooltip.fill\", \"tooltip.border.width\", \"tooltip.border.color\", \"tooltip.enableAnimation\", \"tooltip.duration\",\r\n \"tooltip.opacity\",\r\n [\r\n {\r\n tag: \"points\", attr: []\r\n }\r\n ]\r\n ],\r\n singular: \"indicator\"\r\n },\r\n {\r\n tag: \"annotations\",\r\n attr: [\"coordinateUnit\", \"verticalAlignment\", \"horizontalAlignment\", \"xAxisName\", \"yAxisName\", \"margin.left\", \"margin.right\", \"margin.top\", \"margin.bottom\"],\r\n singular: \"annotation\"\r\n },\r\n {\r\n tag: \"rowDefinitions\",\r\n attr: [\"rowHeight\", \"lineColor\", \"lineWidth\", \"unit\"],\r\n singular: \"rowDefinition\"\r\n },\r\n {\r\n tag: \"columnDefinitions\",\r\n attr: [\"columnWidth\", \"lineColor\", \"lineWidth\", \"unit\"],\r\n singular: \"columnDefinition\"\r\n },\r\n ],\r\n _xZoomFactor: ej.util.valueFunction(\"xZoomFactor\"),\r\n _yZoomFactor: ej.util.valueFunction(\"yZoomFactor\"),\r\n _xZoomPosition: ej.util.valueFunction(\"xZoomPosition\"),\r\n _yZoomPosition: ej.util.valueFunction(\"yZoomPosition\"),\r\n\r\n\r\n _init: function () {\r\n\r\n this._renderSfChart();\r\n\r\n },\r\n _destroy: function () {\r\n $('#template_group_' + this._id).remove();\r\n $(\"#annotation_group_\" + this._id).remove();\r\n $(this.element).removeClass(\"e-chart e-js\").find(\"#\" + this.svgObject.id).remove();\r\n $(this.element).removeClass(\"e-chart e-js\").find(\"#legend_\" + this.svgObject.id).remove();\r\n },\r\n\r\n _series: function (index, property, value, old) {\r\n this.redraw();\r\n this._trigger(\"refresh\");\r\n },\r\n _series_points: function (index, property, value, old) {\r\n this.redraw();\r\n this._trigger(\"refresh\");\r\n },\r\n _primaryXAxis_stripLine: function (index, property, value, old) {\r\n this.redraw();\r\n this._trigger(\"refresh\");\r\n },\r\n _primaryYAxis_stripLine: function (index, property, value, old) {\r\n this.redraw();\r\n this._trigger(\"refresh\");\r\n },\r\n _axes: function (index, property, value, old) {\r\n this.redraw();\r\n this._trigger(\"refresh\");\r\n },\r\n _axes_stripLine: function (index, property, value, old) {\r\n this.redraw();\r\n this._trigger(\"refresh\");\r\n },\r\n\r\n _ignoreOnExport: [\"dataSource\"],\r\n\r\n\r\n _removeZoomkit: function () {\r\n if (this.model.zooming.enable) {\r\n $(\"[id^=\" + this._id + \"_][id$=\" + \"_ResetZoom\" + \"]\").remove();\r\n $(\"[id^=\" + this._id + \"_][id$=\" + \"_PanBtn\" + \"]\").remove();\r\n $(\"[id^=\" + this._id + \"_][id$=\" + \"_ZoomBtn\" + \"]\").remove();\r\n $(\"[id^=\" + this._id + \"_][id$=\" + \"_ZoomInBtn\" + \"]\").remove();\r\n $(\"[id^=\" + this._id + \"_][id$=\" + \"_ZoomOutBtn\" + \"]\").remove();\r\n }\r\n },\r\n\r\n //to create a new canvas element to export and print\r\n getCanvasElement: function (id) {\r\n var chart,\r\n printId = $(\"#\" + id),\r\n exportPrintCanvas = document.createElement('canvas'),\r\n expCtx = exportPrintCanvas.getContext(\"2d\"),\r\n chartWidth = $(\"#\" + id + \"_canvas\").width(),\r\n chartHeight = $(\"#\" + id + \"_canvas\").height();\r\n exportPrintCanvas.setAttribute('width', chartWidth);\r\n exportPrintCanvas.setAttribute('height', chartHeight);\r\n chart = $(\"#\" + id + '_canvas')[0];\r\n expCtx.drawImage(chart, 0, 0, chartWidth, chartHeight);\r\n\r\n return { canvasContainer: exportPrintCanvas, canvasArea: expCtx, width: chartWidth, height: chartHeight };\r\n\r\n },\r\n // export and print the svg element\r\n getSVGElement: function (id) {\r\n var chartWidthSVG = $(\"#\" + id + \"_svg\").width(),\r\n chartHeightSVG = $(\"#\" + id + \"_svg\").height(),\r\n svgChart = document.getElementById(id + \"_svg\"),\r\n containerSVG = $('
').append($(svgChart).clone()).html(),\r\n legendChart = document.getElementById(\"legend_\" + id + \"_svg\"),\r\n position = $(\"#legend_\" + id).position(),\r\n element = $(\"#\" + id + \"_svg_Legend\").attr('transform', \"translate(\" + position.left + \",\" + position.top + \")\"),\r\n containerLegendSVG = $('
').append($(legendChart).clone()).html();\r\n\r\n return { chartSVG: containerSVG, legendChartSVG: containerLegendSVG, width: chartWidthSVG, height: chartHeightSVG };\r\n },\r\n\r\n print: function () {\r\n //declaration\r\n var contentSVG, Id, svgID, canvasElement, chartObj, printId, printCtxAnnot, legend, selectionChart, selectionLegendChart,\r\n selectionChartSVG, legendChartSVG, annotationChartCanvas, canvasChart = [], writeCode = [], containerselectionChartSVG,\r\n containerSelectionLegendSVG, legendPos, annotationChartSVG, containerAnnotationChartSVG,\r\n serIndex = this.model.series.length, scrollbar, TDStyle = \"\", oImg = \"\", chartHeight = 0, chartDistance = 50;\r\n for (var i = 0; i < arguments.length; i++) {\r\n\r\n printId = $(\"#\" + arguments[i]);\r\n Id = arguments[i];\r\n\r\n //to check whether the div contains chart element\r\n if (printId.hasClass(\"e-datavisualization-chart\")) {\r\n chartObj = printId.ejChart(\"instance\");\r\n contentSVG = \"
\";\r\n scrollbar = \"\";\r\n svgID = chartObj.svgObject.id;\r\n\r\n chartHeight = $(\"#\" + svgID).height() + chartDistance;\r\n\r\n if ($(\"#axisScrollbar_\" + Id)[0])\r\n scrollbar = $(\"#axisScrollbar_\" + Id)[0].innerHTML;\r\n\r\n var zoomButton = [\"ResetZoom\", \"PanBtn\", \"ZoomBtn\", \"ZoomOutBtn\", \"ZoomInBtn\"], zoomBtnObj = [], zoomToolbarID, btnCount = 5;\r\n for (var l = 0; l < btnCount; l++) {\r\n zoomToolbarID = \"#\" + svgID + \"_\" + zoomButton[l];\r\n if ($(zoomToolbarID)[0]) {\r\n zoomBtnObj.push($(zoomToolbarID));\r\n //Remove zoomButtons on printing\r\n $(zoomToolbarID).remove();\r\n }\r\n }\r\n\r\n if (chartObj.model.enableCanvasRendering == true) { //to check the chart to render in canvas\r\n canvasElement = this.getCanvasElement(Id);\r\n\r\n //to find the lengend position \r\n legendPos = chartObj.model.LegendBounds;\r\n\r\n oImg = document.createElement(\"img\");\r\n oImg.setAttribute('src', $('#legend_' + Id + '_canvas')[0].toDataURL());\r\n $(\"#legend_Scroller\" + Id).prepend(oImg);\r\n contentSVG += document.getElementById('chartContainer_' + Id).outerHTML;\r\n $(oImg).remove();\r\n oImg = \"\";\r\n\r\n var mode;\r\n //selection chart to print in canvas\r\n for (var index = 0; index < serIndex; index++) {\r\n mode = chartObj.model.series[index].selectionSettings.mode.toLowerCase();\r\n if (chartObj.model.AreaType != \"none\") {\r\n if (mode == \"series\") {\r\n if ($(printId).find(\"#\" + Id + \"_Selection_series\" + index + \"_canvas\").length > 0) {\r\n selectionChart = $(\"#\" + Id + \"_Selection_series\" + index + \"_canvas\")[0];\r\n canvasElement.canvasArea.drawImage(selectionChart, 0, 0, canvasElement.width, canvasElement.height);\r\n }\r\n if ($(printId).find(\"#\" + Id + \"_Selection_Legend\" + index + \"_canvas\").length > 0) {\r\n selectionLegendChart = $(\"#\" + Id + \"_Selection_Legend\" + index + \"_canvas\")[0];\r\n oImg = \"\";\r\n }\r\n } else if (mode == \"point\") {\r\n var selectedPoints = chartObj.model.selectedDataPointIndexes;\r\n for (var l = 0; l < selectedPoints.length; l++) {\r\n if (selectedPoints[l].seriesIndex == index) {\r\n if ($(printId).find(\"#\" + Id + \"_Selection_series\" + index + \"_point_\" + selectedPoints[l].pointIndex + \"_canvas\").length > 0) {\r\n selectionChart = $(\"#\" + Id + \"_Selection_series\" + index + \"_point_\" + selectedPoints[l].pointIndex + \"_canvas\")[0];\r\n canvasElement.canvasArea.drawImage(selectionChart, 0, 0, canvasElement.width, canvasElement.height);\r\n }\r\n }\r\n }\r\n if ($(printId).find(\"#\" + Id + \"_Selection_Legend\" + index + \"_canvas\").length > 0) {\r\n selectionLegendChart = $(\"#\" + Id + \"_Selection_Legend\" + index + \"_canvas\")[0];\r\n oImg = \"\";\r\n }\r\n } else {\r\n var selectedPoints = chartObj.model.selectedDataPointIndexes;\r\n for (var l = 0; l < selectedPoints.length; l++) {\r\n if (selectedPoints[l].seriesIndex == index) {\r\n if ($(printId).find(\"#\" + Id + \"_Selection_Cluster_point_\" + selectedPoints[l].pointIndex + \"_canvas\").length > 0) {\r\n selectionChart = $(\"#\" + Id + \"_Selection_Cluster_point_\" + selectedPoints[l].pointIndex + \"_canvas\")[0];\r\n canvasElement.canvasArea.drawImage(selectionChart, 0, 0, canvasElement.width, canvasElement.height);\r\n }\r\n }\r\n }\r\n if ($(printId).find(\"#\" + Id + \"_SelectionCluster_Legend\" + index + \"_canvas\").length > 0) {\r\n selectionLegendChart = $(\"#\" + Id + \"_SelectionCluster_Legend\" + index + \"_canvas\")[0];\r\n oImg = \"\";\r\n }\r\n }\r\n } else {\r\n var selectedPoints = chartObj.model.selectedDataPointIndexes;\r\n for (var l = 0; l < selectedPoints.length; l++) {\r\n if (selectedPoints[l].seriesIndex == index) {\r\n if ($('#' + Id + '_Selection_series' + index + \"_point_\" + selectedPoints[l].pointIndex + \"_canvas\").length > 0) {\r\n selectionChart = document.getElementById(Id + '_Selection_series' + index + \"_point_\" + selectedPoints[l].pointIndex + \"_canvas\");\r\n canvasElement.canvasArea.drawImage(selectionChart, 0, 0, canvasElement.width, canvasElement.height);\r\n if ($('#' + Id + \"_Selection_Legend\" + selectedPoints[l].pointIndex + \"_canvas\").length > 0) {\r\n selectionLegendChart = document.getElementById(Id + \"_Selection_Legend\" + selectedPoints[l].pointIndex + \"_canvas\");\r\n oImg = \"\";\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n canvasElement.canvasArea.save();\r\n //to store the chart canvas element\r\n canvasChart.push(canvasElement.canvasContainer);\r\n }\r\n //to check the chart to render in svg\r\n else {\r\n var printSvgElement = this.getSVGElement(Id);\r\n\r\n $(\"#\" + Id + \"_svg_Legend\").removeAttr(\"transform\");\r\n contentSVG += $(\"#chartContainer_\" + Id)[0].outerHTML;\r\n\r\n //selection chart to print in svg\r\n contentSVG = this._getSelectionContentInSVG(chartObj, Id, contentSVG, \"print\");\r\n\r\n //draw background image for chart\r\n if (chartObj.model.backGroundImageUrl != null) {\r\n var img = new Image();\r\n img.src = chartObj.model.backGroundImageUrl;\r\n var canvasObj = document.createElement('canvas');\r\n var ctx = canvasObj.getContext(\"2d\");\r\n canvasObj.setAttribute('width', printSvgElement.width);\r\n canvasObj.setAttribute('height', printSvgElement.height);\r\n ctx.drawImage(img, 0, 0, printSvgElement.width, printSvgElement.height);\r\n contentSVG += \"\";\r\n }\r\n contentSVG += '';\r\n contentSVG += printSvgElement.chartSVG.toString() + \" \";\r\n\r\n //Add zooming scrollbar with chart\r\n contentSVG += scrollbar + \"
\";\r\n\r\n //to store the chart svg element\r\n writeCode.push(contentSVG);\r\n }\r\n\r\n for (var l = 0; l < zoomBtnObj.length; l++) {\r\n //push zoomButtons again\r\n $(\"#chartContainer_\" + Id).append(zoomBtnObj[l]);\r\n }\r\n }\r\n //the div does not contains the chart element\r\n else {\r\n contentSVG = \"\";\r\n contentSVG += document.getElementById(arguments[i]).innerHTML;\r\n contentSVG += \"\";\r\n //to store the div id elements\r\n writeCode.push(contentSVG);\r\n }\r\n }\r\n //to print the chart in a new window\r\n var win = window.open();\r\n for (var s = 0; s < writeCode.length; s++)\r\n win.document.write(writeCode[s]);\r\n //to open a print window for canvas element\r\n if (canvasChart.length > 0) {\r\n var img = new Image();\r\n for (var y = 0; y < canvasChart.length; y++) {\r\n contentSVG += \"\";\r\n img.src = canvasChart[y].toDataURL();\r\n }\r\n contentSVG += oImg;\r\n //Add zooming scrollbar with chart\r\n contentSVG += scrollbar + \"
\";\r\n img.onload = function () {\r\n win.document.write(contentSVG);\r\n contentSVG = \"\";\r\n win.document.close();\r\n win.focus();\r\n win.print();\r\n win.close();\r\n }\r\n }\r\n //to open a print window for svg element\r\n else if (writeCode.length > 0) {\r\n contentSVG = \"\";\r\n win.document.close();\r\n win.focus();\r\n win.print();\r\n win.close();\r\n }\r\n\r\n },\r\n\r\n\r\n redraw: function (excludeDataUpdate, pinchPanning, target, isTouch) {\r\n if (this.model.enableCanvasRendering) {\r\n if (this.model.zooming.enable && this.svgRenderer.ctx)\r\n this.svgRenderer.ctx.clearRect(0, 0, $(\"#\" + this._id).width(), $(\"#\" + this._id).height());\r\n else {\r\n $(this.svgObject).remove();\r\n var width = this.svgWidth;\r\n $(\"#canvas_trackSymbol\").remove();\r\n $(\"#\" + this._id + \"_canvas_Tracker\").remove();\r\n $(\"#secondCanvas\").remove();\r\n this.svgRenderer = new ej.EjCanvasRender(this.element); // to create canvas container\r\n this.svgRenderer.svgObj.height = ej.util.isNullOrUndefined(this.model.size.height) ? \"450\" : this.model.size.height;\r\n this.svgRenderer.svgObj.width = ej.util.isNullOrUndefined(this.model.size.width) ? width : this.model.size.width;\r\n this.svgObject = this.svgRenderer.svgObj;\r\n var ctx = this.svgRenderer.svgObj.getContext(\"2d\");\r\n\r\n $(this.scrollerContainer).remove();\r\n $(this.legendSvgContainer).remove();\r\n $(this.legendContainer).remove();\r\n this.legendContainer = $(\"
\").attr('id', \"legend_\" + this._id).css(\"height\", \"0px\");\r\n this.scrollerContainer = $(\"
\").attr('id', \"legend_Scroller\" + this._id).css(\"height\", \"0px\");\r\n this.legendSvgContainer = this.svgRenderer.createLegendCanvas(this.element); //creating new CANVAS element for legend\r\n this.svgRenderer.append(this.legendSvgContainer, this.scrollerContainer);\r\n $(this.scrollerContainer).appendTo(this.legendContainer);\r\n $(this.legendContainer).appendTo(this.chartContainer);\r\n }\r\n }\r\n else if ((this.svgObject.id).indexOf(\"_canvas\") != -1) {\r\n this._removeZoomkit();\r\n $(this.svgObject).remove();\r\n this.svgRenderer = new ej.EjSvgRender(this.element); // to create svg container\r\n this.svgObject = this.svgRenderer.svgObj;\r\n this.canvasX = this.canvasY = 0;\r\n\r\n $(this.scrollerContainer).remove();\r\n $(this.legendSvgContainer).remove();\r\n $(this.legendContainer).remove();\r\n this.legendContainer = $(\"
\").attr('id', \"legend_\" + this._id).css(\"height\", \"0px\");\r\n this.scrollerContainer = $(\"
\").attr('id', \"legend_Scroller\" + this._id).css(\"height\", \"0px\");\r\n this.legendSvgContainer = this.svgRenderer.createLegendSvg(this.element); //creating new SVG element for legend\r\n this.svgRenderer.append(this.legendSvgContainer, this.scrollerContainer);\r\n $(this.scrollerContainer).appendTo(this.legendContainer);\r\n $(this.legendContainer).appendTo(this.chartContainer);\r\n } else {\r\n if (!this.dragPoint || (!pinchPanning && (!this.panning || !target || this.scrollbarUpdate || (isTouch || this.panning && this.model.browserInfo.name != \"chrome\")) || this.model.enable3D)) {\r\n $(this.svgObject).empty(); // using existing svg container\r\n $(this.legendSvgContainer).empty();\r\n }\r\n else {\r\n var svg = this.svgObject;\r\n this.chartUpdating = true;\r\n if (!this.continuePinching && target) {\r\n target.id = \"\";\r\n target.setAttribute(\"opacity\", 0);\r\n svg.appendChild(target);\r\n this.continuePinching = false;\r\n }\r\n while (svg.childNodes.length > 1)\r\n svg.removeChild(svg.firstChild);\r\n\r\n $(this.legendSvgContainer).empty();\r\n }\r\n }\r\n\t\t\tif(this.model._chartAreaZoom)\r\n\t\t\tthis.zoomed = this.model._chartAreaZoom = this.model._axes.some((function (val) {\r\n return val.zoomFactor < 1 || val.zoomPosition > 0;\r\n }));\r\n\t\t\tthis._removeZoomkit();\r\n $(\"#annotation_group_\" + this._id).remove(); // to remove annotation on redraw\r\n if (!excludeDataUpdate) {\r\n\r\n if (this.model.canResize || this.model.isResponsive)\r\n this.bindResizeEvents();\r\n else\r\n this.removeResizeEvents();\r\n }\r\n this.bindTo(excludeDataUpdate);\r\n },\r\n\r\n \"export\": function (type, action, multipleExport) { // method to export chart\r\n var data,\r\n exporting = this.model.exportSettings,\r\n type = ej.util.isNullOrUndefined(type) ? exporting.type : type.toLowerCase(),\r\n action = ej.util.isNullOrUndefined(action) ? exporting.action : action.toLowerCase();\r\n\r\n if (type == \"xlsx\")\r\n this._getExportModel(type, action, multipleExport);\r\n else if (type == \"svg\" || !this.model.enableCanvasRendering)\r\n data = this.svgExport();\r\n else\r\n data = this.imageExport();\r\n\r\n return data;\r\n },\r\n\r\n _getExportModel: function (type, action, multipleExport) { // to export chart as excel\r\n var modelClone = $.extend(true, {}, this.model),\r\n exporting = this.model.exportSettings,\r\n multipleExport = ej.util.isNullOrUndefined(type) ? exporting.multipleExport : multipleExport,\r\n svgHeight = this.svgHeight, svgWidth = this.svgWidth,\r\n actualHeight = modelClone.size.height, actualWidth = modelClone.size.width,\r\n attr = { action: action, method: 'post' },\r\n form = ej.buildTag('form', \"\", null, attr),\r\n series, chartobj = this;\r\n modelClone.event = null; // event is not API and having circular structure object type\r\n modelClone.primaryXAxis.range = modelClone.primaryXAxis.actualRange;\r\n modelClone.primaryYAxis.range = modelClone.primaryYAxis.actualRange;\r\n if (this._ignoreOnExport) {\r\n series = modelClone.series;\r\n for (var j = 0; j < series.length; j++) {\r\n delete series[j].dataSource;\r\n delete series[j].query;\r\n series[j].fill = jQuery.type(series[j].fill) == \"array\" ? series[j].fill[0].color : series[j].fill;\r\n }\r\n }\r\n for (var j = 0; j < series.length; j++) {\r\n if (!series[j].dataPoint) {\r\n series[j].dataPoint = series[j].points;\r\n for (var k = 0; k < series[j].dataPoint.length; k++) {\r\n if (!series[j].dataPoint[k].fill && modelClone.pointColors.length > k)\r\n series[j].dataPoint[k].fill = modelClone.pointColors[k];\r\n }\r\n }\r\n }\r\n if (ej.raiseWebFormsServerEvents) {\r\n this.raiseWebServerEvents(JSON.stringify(modelClone), \"excelExporting\");\r\n this.raiseWebServerEvents(JSON.stringify(modelClone));\r\n }\r\n else {\r\n if (modelClone.size.height && modelClone.size.height.indexOf(\"%\") != -1)\r\n modelClone.size.height = $(this.svgObject).height().toString();\r\n if (modelClone.size.width && modelClone.size.width.indexOf(\"%\") != -1)\r\n modelClone.size.width = $(this.svgObject).width().toString();\r\n\r\n if (multipleExport) {\r\n var chartObjectArray = {};\r\n $('body').find('.e-datavisualization-chart').each(function (index, object) {\r\n var chartObject = $(object).data('ejChart');\r\n if (!ej.isNullOrUndefined(chartObject)) {\r\n chartObject.model.event = null;\r\n var modelClone = JSON.parse(JSON.stringify(chartObject.model));\r\n if (chartobj._ignoreOnExport) {\r\n series = modelClone.series;\r\n for (var j = 0; j < series.length; j++) {\r\n delete series[j].dataSource;\r\n delete series[j].query;\r\n series[j].fill = jQuery.type(series[j].fill) == \"array\" ? series[j].fill[0].color : series[j].fill;\r\n }\r\n chartObjectArray[index] = JSON.stringify(modelClone);\r\n var inputAttr = { name: 'ChartModel', type: 'hidden', value: JSON.stringify(modelClone) }\r\n var input = ej.buildTag('input', \"\", null, inputAttr);\r\n form.append(input);\r\n }\r\n }\r\n });\r\n }\r\n else {\r\n var inputAttr = { name: 'ChartModel', type: 'hidden', value: JSON.stringify(modelClone) }\r\n var input = ej.buildTag('input', \"\", null, inputAttr);\r\n form.append(input);\r\n form.append(this);\r\n }\r\n $('body').append(form);\r\n form.submit();\r\n modelClone.size = { width: actualWidth, height: actualHeight };\r\n }\r\n return modelClone;\r\n },\r\n\r\n imageExport: function () { // to export chart as image\r\n var modelClone = $.extend(true, {}, this.model);\r\n modelClone.primaryXAxis.range = modelClone.primaryXAxis.actualRange;\r\n modelClone.primaryYAxis.range = modelClone.primaryYAxis.actualRange;\r\n modelClone.event = null; // event is not API and having circular structure object type\r\n var Id = this._id,\r\n selectionChart = $('[id*=' + Id + '_Selection_' + ']'),\r\n legend = $('#legend_' + Id + '_canvas')[0],\r\n exporting = this.model.exportSettings,\r\n angle = exporting.angle, exportChart, exprtCtx, chartWidth, chartHeight, chart,\r\n legendPos = this.model.LegendBounds, containerStyle, i, dataURL,\r\n exportCanvas = this.getCanvasElement(Id);\r\n exportChart = exportCanvas.canvasContainer;\r\n exprtCtx = exportCanvas.canvasArea;\r\n chartWidth = exportCanvas.width;\r\n chartHeight = exportCanvas.height;\r\n chart = $(\"#\" + Id + '_canvas')[0];\r\n exportChart.setAttribute('id', 'Export_' + Id);\r\n if (angle == 0) {\r\n legendPos = this.model.LegendBounds;\r\n if (legendPos.X && (legendPos.Width != 0 && legendPos.Height != 0))\r\n exprtCtx.drawImage(legend, legendPos.X, legendPos.Y);\r\n } else if (angle == 90 || angle == -90) {\r\n exportChart.setAttribute('width', chartHeight);\r\n exportChart.setAttribute('height', chartWidth);\r\n exprtCtx.save();\r\n exprtCtx.translate(chartHeight / 2, chartWidth / 2);\r\n exprtCtx.rotate(angle * Math.PI / 180);\r\n exprtCtx.drawImage(chart, -chartWidth / 2, - chartHeight / 2);\r\n exprtCtx.restore();\r\n if (legendPos.X) {\r\n exprtCtx.save();\r\n if (angle == 90)\r\n exprtCtx.translate(chartHeight - legendPos.Y - legendPos.Height / 2, chartWidth - legendPos.X - legendPos.Width / 2);\r\n else\r\n exprtCtx.translate(legendPos.Y + legendPos.Height / 2, legendPos.X + legendPos.Width / 2);\r\n exprtCtx.rotate(angle * Math.PI / 180);\r\n exprtCtx.drawImage(legend, -legendPos.Width / 2, -legendPos.Height / 2);\r\n exprtCtx.restore();\r\n }\r\n } else {\r\n exportChart.setAttribute('width', chartWidth);\r\n exportChart.setAttribute('height', chartHeight);\r\n exprtCtx.save();\r\n exprtCtx.translate(chartWidth, chartHeight);\r\n exprtCtx.rotate(180 * Math.PI / 180);\r\n exprtCtx.drawImage(chart, 0, 0);\r\n exprtCtx.restore();\r\n if (legendPos.X) {\r\n exprtCtx.save();\r\n exprtCtx.translate(legendPos.X + legendPos.Width / 2, chartHeight - legendPos.Y - legendPos.Height / 2);\r\n exprtCtx.rotate(angle * Math.PI / 180);\r\n exprtCtx.drawImage(legend, -legendPos.Width / 2, -legendPos.Height / 2);\r\n exprtCtx.restore();\r\n }\r\n }\r\n\r\n for (i = 0; i < selectionChart.length; i++) { // export for selection\r\n containerStyle = document.getElementById(selectionChart[i].id).getBoundingClientRect();\r\n if (angle == 0)\r\n exprtCtx.drawImage(selectionChart[i], 0, 0);\r\n else if (angle == 90 || angle == -90) {\r\n exprtCtx.save();\r\n exprtCtx.translate(chartHeight / 2, chartWidth / 2);\r\n exprtCtx.rotate(angle * Math.PI / 180);\r\n exprtCtx.drawImage(selectionChart[i], -chartWidth / 2, -chartHeight / 2);\r\n exprtCtx.restore();\r\n if (angle == 90 && selectionChart[i].id.indexOf(Id + '_Selection_Legend') >= 0) {\r\n exprtCtx.save();\r\n exprtCtx.translate(chartHeight - legendPos.Y - legendPos.Height / 2, chartWidth - legendPos.X - legendPos.Width / 2);\r\n exprtCtx.rotate(angle * Math.PI / 180);\r\n exprtCtx.drawImage(selectionChart[i], -legendPos.Width / 2, -legendPos.Height / 2);\r\n exprtCtx.restore();\r\n }\r\n else if (angle == -90 && selectionChart[i].id.indexOf(Id + '_Selection_Legend') >= 0) {\r\n exprtCtx.save();\r\n exprtCtx.translate(legendPos.X + legendPos.Width / 2, chartHeight - legendPos.Y - legendPos.Height / 2);\r\n exprtCtx.rotate(angle * Math.PI / 180);\r\n exprtCtx.drawImage(selectionChart[i], -legendPos.Width / 2, -legendPos.Height / 2);\r\n exprtCtx.restore();\r\n }\r\n }\r\n else if (angle == 180) {\r\n exprtCtx.save();\r\n exprtCtx.translate(chartWidth, chartHeight);\r\n exprtCtx.rotate(180 * Math.PI / 180);\r\n exprtCtx.drawImage(selectionChart[i], 0, 0);\r\n exprtCtx.restore();\r\n if (angle == 180 && selectionChart[i].id.indexOf(Id + '_Selection_Legend') >= 0) {\r\n exprtCtx.save();\r\n exprtCtx.translate(legendPos.X + legendPos.Width / 2, chartHeight - legendPos.Y - legendPos.Height / 2);\r\n exprtCtx.rotate(angle * Math.PI / 180);\r\n exprtCtx.drawImage(selectionChart[i], -legendPos.Width / 2, -legendPos.Height / 2);\r\n exprtCtx.restore();\r\n }\r\n }\r\n }\r\n dataURL = exporting.type == \"jpg\" ? exportChart.toDataURL(\"image/jpeg\") : exportChart.toDataURL();\r\n if (exporting.mode == \"client\") // for client side\r\n return exportChart;\r\n else if (ej.raiseWebFormsServerEvents) // for web forms\r\n this.raiseWebServerEvents(dataURL);\r\n else if (exporting.mode == \"server\") { // server side\r\n var attr, form, chartModel, input1, data, input2;\r\n attr = { action: exporting.action, method: 'post' };\r\n form = ej.buildTag('form', \"\", null, attr);\r\n chartModel = { name: 'ChartModel', type: 'hidden', value: JSON.stringify(modelClone) };\r\n input1 = ej.buildTag('input', \"\", null, chartModel);\r\n data = { name: 'Data', type: 'hidden', value: dataURL };\r\n input2 = ej.buildTag('input', \"\", null, data);\r\n form.append(input1).append(input2).append(this);\r\n $('body').append(form);\r\n form.submit();\r\n }\r\n },\r\n\r\n svgExport: function () { // to export chart as SVG\r\n var svgObj = this.svgObject.id,\r\n modelClone = $.extend(true, {}, this.model);\r\n for (var i = 0; i < this.model._axes.length; i++)\r\n modelClone._axes[i].range = modelClone._axes[i].actual_Range;\r\n modelClone.event = null; // event is not API and having circular structure object type\r\n var Id = this._id,\r\n exportChartSVG = this.getSVGElement(Id),\r\n exporting = this.model.exportSettings, angle = exporting.angle, chartHeight = exportChartSVG.height,\r\n svg = exportChartSVG.chartSVG, legend = exportChartSVG.legendChartSVG, chartWidth = exportChartSVG.width,\r\n content = '', selectionContent;\r\n if (angle == 0)\r\n content = content + svg.toString() + legend.toString() + \"\";\r\n else if (angle == 90)\r\n content = content + '' + svg.toString() + legend.toString() + \"\";\r\n else if (angle == -90)\r\n content = content + '' + svg.toString() + legend.toString() + \"\";\r\n else\r\n content = content + '' + svg.toString() + legend.toString() + \"\";\r\n selectionContent = this._getSelectionContentInSVG(this, Id, content, \"export\");//export the chart along with selection\r\n var selected = $('#' + Id).find('[class*=\"Selection\"]');\r\n content = selected.length > 0 ? selectionContent : content;\r\n content = encodeURIComponent(content);\r\n $(\"#\" + svgObj + \"_Legend\").removeAttr(\"transform\");\r\n if (exporting.mode == \"client\") // for client side\r\n return content;\r\n else if (ej.raiseWebFormsServerEvents) // for web forms\r\n this.raiseWebServerEvents(content);\r\n else if (exporting.mode == \"server\") { // server side\r\n var attr, form, inputAttr, input, input1, chartModel;\r\n attr = { action: exporting.action, method: 'post' };\r\n form = ej.buildTag('form', \"\", null, attr);\r\n chartModel = { name: 'ChartModel', type: 'hidden', value: JSON.stringify(modelClone) };\r\n input1 = ej.buildTag('input', \"\", null, chartModel);\r\n inputAttr = { name: 'Data', type: 'hidden', value: content };\r\n input = ej.buildTag('input', \"\", null, inputAttr);\r\n form.append(input).append(input1).append(this);\r\n $('body').append(form);\r\n form.submit();\r\n }\r\n },\r\n _getSelectionContentInSVG: function (chartObj, Id, contentSVG, method) {\r\n var serIndex = this.model.series.length, selectionContent;\r\n //selection chart to export/ print in SVG\r\n if (!chartObj.model.enable3D) {\r\n var mode;\r\n for (var index = 0; index < serIndex; index++) {\r\n mode = chartObj.model.series[index].selectionSettings.mode.toLowerCase();\r\n if (chartObj.model.AreaType != \"none\") {\r\n if (mode != \"cluster\") {\r\n if ($('#' + Id + 'SelectionSegmentseries' + index).length > 0) {\r\n selectionChartSVG = document.getElementById(Id + \"SelectionSegmentseries\" + index);\r\n containerselectionChartSVG = $('
').append($(selectionChartSVG).clone()).html();\r\n legendChartSVG = document.getElementById(Id + \"SelectionLegendSegmentseries\" + index);\r\n containerSelectionLegendSVG = $('
').append($(legendChartSVG).clone()).html();\r\n if (method === \"export\") {\r\n selectionContent = contentSVG.slice(0, contentSVG.length - 6);\r\n selectionContent += '' + containerselectionChartSVG.toString() + containerSelectionLegendSVG.toString() + \"\" + \"\";\r\n }\r\n else\r\n contentSVG += containerselectionChartSVG.toString() + containerSelectionLegendSVG.toString();\r\n }\r\n } else {\r\n if ($('#' + Id + 'SelectionSegmentClusterSeries' + index).length > 0) {\r\n selectionChartSVG = document.getElementById(Id + \"SelectionSegmentClusterSeries\" + index);\r\n containerselectionChartSVG = $('
').append($(selectionChartSVG).clone()).html();\r\n legendChartSVG = document.getElementById(Id + \"SelectionLegendSegmentClusterSeries\" + index);\r\n containerSelectionLegendSVG = $('
').append($(legendChartSVG).clone()).html();\r\n if (method === \"export\") {\r\n selectionContent = ej.util.isNullOrUndefined(selectionContent) ? contentSVG.slice(0, contentSVG.length - 6) : selectionContent;\r\n selectionContent += '' + containerselectionChartSVG.toString() + containerSelectionLegendSVG.toString() + \"\";\r\n }\r\n else\r\n contentSVG += containerselectionChartSVG.toString() + containerSelectionLegendSVG.toString();\r\n }\r\n }\r\n } else {\r\n var selectedPoints = chartObj.model.selectedDataPointIndexes;\r\n for (var l = 0; l < selectedPoints.length; l++) {\r\n if (selectedPoints[l].seriesIndex == index) {\r\n if ($('#' + Id + 'SelectionSegmentseries' + index + \"Point\" + selectedPoints[l].pointIndex).length > 0) {\r\n selectionChartSVG = document.getElementById(Id + 'SelectionSegmentseries' + index + \"Point\" + selectedPoints[l].pointIndex);\r\n containerselectionChartSVG = $('
').append($(selectionChartSVG).clone()).html();\r\n legendChartSVG = document.getElementById(Id + \"SelectionLegendSegmentseries\" + index + \"Point\" + selectedPoints[l].pointIndex);\r\n containerSelectionLegendSVG = $('
').append($(legendChartSVG).clone()).html();\r\n if (method === \"export\") {\r\n selectionContent = contentSVG.slice(0, contentSVG.length - 6);\r\n selectionContent += '' + containerselectionChartSVG.toString() + containerSelectionLegendSVG.toString() + \"\" + \"\";\r\n }\r\n else\r\n contentSVG += containerselectionChartSVG.toString() + containerSelectionLegendSVG.toString();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (mode == \"cluster\" && method === \"export\") selectionContent += \"\"\r\n } else {\r\n TDStyle = \"\";\r\n for (var index = 0; index < serIndex; index++) {\r\n if ($(\"#Selectionseries\" + index + \"Segmentseries\" + index).length > 0) {\r\n TDStyle += $(\"#Selectionseries\" + index + \"Segmentseries\" + index)[0].outerHTML;\r\n }\r\n }\r\n contentSVG += TDStyle;\r\n }\r\n return method === \"export\" ? selectionContent : contentSVG;\r\n },\r\n raiseWebServerEvents: function (content, event) { // to trigger server events in web forms\r\n var modelClone = $.extend(true, {}, this.model),\r\n exporting = this.model.exportSettings,\r\n event = ej.util.isNullOrUndefined(event) ? \"exporting\" : event;\r\n this.model.size._width = $(this.svgObject).width();\r\n this.model.size._height = $(this.svgObject).height();\r\n args = { model: modelClone, originalEventType: event },\r\n clientArgs = { Data: content, Format: exporting.type, Orientation: exporting.orientation, FileName: exporting.fileName };\r\n ej.raiseWebFormsServerEvents(event, args, clientArgs);\r\n },\r\n\r\n animate: function (options) {\r\n if (!options) { // Animate the entire series and indicators \"previous behavior\"\r\n var series = this.model.series;\r\n for (var i = 0; i < series.length; i++) {\r\n series[i]._animatedSeries = false;\r\n series[i]._animatedTrendline = false;\r\n series[i].AnimationComplete = false; //pie doughnut animation with datalabel\r\n }\r\n var indicators = this.model.indicators;\r\n for (var j = 0; j < indicators.length; j++) {\r\n indicators[j]._animatedSeries = false;\r\n indicators[j]._animatedTrendline = false;\r\n }\r\n } else if (options.constructor === Array) { // Animate array of series\r\n for (var i = 0; i < options.length; i++) {\r\n options[i]._animatedSeries = false;\r\n options[i]._animatedTrendline = false;\r\n options[i].AnimationComplete = false; //pie doughnut animation with datalabel\r\n }\r\n } else { // Animate the specific series\r\n options._animatedSeries = false;\r\n options._animatedTrendline = false;\r\n options.AnimationComplete = false; //pie doughnut animation with datalabel\r\n }\r\n this.redraw();\r\n },\r\n\r\n\r\n _setModel: function (options) {\r\n var series, axes;\r\n for (var prop in options) {\r\n this.disableAnimation();\r\n switch (prop) {\r\n case \"theme\":\r\n this.model._themeChanged = true;\r\n this.model.theme = options[prop];\r\n this.setTheme(ej.EjSvgRender.themes, this.model.theme);\r\n $.extend(true, this.model.primaryXAxis, ej.EjSvgRender.themes[this.model.theme].primaryXAxis);\r\n $.extend(true, this.model.primaryYAxis, ej.EjSvgRender.themes[this.model.theme].primaryYAxis);\r\n for (var k = 0; k < this.model.axes.length; k++) {\r\n if (this.model.axes[k].orientation && this.model.axes[k].orientation.toLowerCase() == \"horizontal\")\r\n $.extend(true, this.model.axes[k], ej.EjSvgRender.themes[this.model.theme].secondaryX);\r\n else\r\n $.extend(true, this.model.axes[k], ej.EjSvgRender.themes[this.model.theme].secondaryY);\r\n }\r\n for (var l = 0; l < this.model.series.length; l++) {\r\n $.extend(true, this.model.series[l], ej.EjSvgRender.themes[this.model.theme].commonSeriesOptions);\r\n }\r\n break;\r\n case \"commonSeriesOptions\":\r\n for (var i = 0; i < this.model.series.length; i++) {\r\n if (options[prop].dataSource)\r\n this.model.series[i].dataSource = null;\r\n $.extend(true, this.model.series[i], {}, options[prop]);\r\n }\r\n break;\r\n case \"series\":\r\n\t\t\t\t\t\tif (options[prop].length < this.model.series.length) { \r\n\t\t\t\t\t\t\tthis.model.series = this.model.series.slice(0, options[prop].length);\r\n\t\t\t\t\t\t} \r\n series = this.model.series;\r\n for (var i = 0; i < series.length; i++) {\r\n if (options[prop][i].dataSource) {\r\n series[i].dataSource = null;\r\n }\r\n }\r\n $.extend(true, series, {}, options[prop]);\r\n for (var i = 0, len = series.length; i < len; i++) {\r\n if (series[i].enableAnimation)\r\n series[i]._animatedSeries = false;\r\n if (options[prop][i] && options[prop][i].dataSource instanceof ej.DataManager)\r\n //jQuery extends data manager as object.\r\n series[i].dataSource = options[prop][i].dataSource;\r\n if (options[prop][i] && options[prop][i].query instanceof ej.Query)\r\n //jQuery.extend does not update the existing query with new one.\r\n series[i].query = options[prop][i].query;\r\n }\r\n break;\r\n case \"legend\":\r\n $.extend(true, this.model.legend, {}, options[prop]);\r\n break;\r\n case \"axes\":\r\n $.extend(true, this.model.axes, {}, options[prop]);\r\n break;\r\n case \"primaryXAxis\":\r\n this.model.primaryXAxis.setRange = (options[prop].range) ? true : false;\r\n this.model.primaryXAxis.setAxisInterval = (options[prop].range && options[prop].range.interval) ? true : this.model.primaryXAxis.setAxisInterval;\r\n this.model.primaryXAxis.actual_Range = (this.model._axes[0].setRange) ? null : this.model._axes[0].actual_Range;\r\n $.extend(true, this.model.primaryXAxis, {}, options[prop]);\r\n break;\r\n case \"primaryYAxis\":\r\n this.model.primaryYAxis.setRange = (options[prop].range) ? true : false;\r\n this.model.primaryYAxis.log_Range = options[prop].range ? options[prop].range : this.model.primaryYAxis.log_Range;\r\n this.model.primaryYAxis.actual_Range = (this.model._axes[1].setRange) ? null : this.model._axes[1].actual_Range;\r\n $.extend(true, this.model.primaryYAxis, {}, options[prop]);\r\n break;\r\n case \"xZoomFactor\":\r\n this.model.primaryXAxis.zoomFactor = this._xZoomFactor();\r\n axes = this.model.axes;\r\n for (var i = 0; i < axes.length; i++) {\r\n if (axes[i].orientation.toLowerCase() == \"horizontal\")\r\n axes[i].zoomFactor = this._xZoomFactor();\r\n }\r\n break;\r\n case \"yZoomFactor\":\r\n this.model.primaryYAxis.zoomFactor = this._yZoomFactor();\r\n axes = this.model.axes;\r\n for (var i = 0; i < axes.length; i++) {\r\n if (axes[i].orientation.toLowerCase() == \"vertical\")\r\n axes[i].zoomFactor = this._yZoomFactor();\r\n }\r\n break;\r\n case \"xZoomPosition\":\r\n this.model.primaryXAxis.zoomPosition = this._xZoomPosition();\r\n axes = this.model.axes;\r\n for (var i = 0; i < axes.length; i++) {\r\n if (axes[i].orientation.toLowerCase() == \"horizontal\")\r\n axes[i].zoomPosition = this._xZoomPosition();\r\n }\r\n break;\r\n case \"yZoomPosition\":\r\n this.model.primaryYAxis.zoomPosition = this._yZoomPosition();\r\n axes = this.model.axes;\r\n for (var i = 0; i < axes.length; i++) {\r\n if (axes[i].orientation.toLowerCase() == \"vertical\")\r\n axes[i].zoomPosition = this._yZoomPosition();\r\n }\r\n break;\r\n case \"drilldown\":\r\n this.model.series = [];\r\n this.model.explodeValue = null;\r\n $.extend(true, this.model, {}, options[prop]);\r\n break;\r\n case \"datasource\":\r\n for (var i = 0; i < this.model.series.length; i++) {\r\n this.model.series[i].dataSource = null;\r\n this.model.series[i].points = null;\r\n }\r\n $.extend(true, this.model, {}, options[prop]);\r\n break;\r\n case \"chartArea\":\r\n $.extend(true, this.model.chartArea, {}, options[prop]);\r\n break;\r\n\r\n default:\r\n $.extend(true, this.model, {}, options[prop]);\r\n series = this.model.series;\r\n for (var i = 0, len = series.length; i < len; i++) {\r\n if (series[i].enableAnimation)\r\n series[i]._animatedSeries = false;\r\n }\r\n }\r\n }\r\n if (this.model.canResize || this.model.isResponsive)\r\n this.bindResizeEvents();\r\n else\r\n this.removeResizeEvents();\r\n $(\"#annotation_group_\" + this._id).remove(); // to remove annotation on set model\r\n if (this.model.enableCanvasRendering) {\r\n $(this.svgObject).remove();\r\n $(\"#canvas_trackSymbol\").remove();\r\n $(\"#\" + this._id + \"_canvas_Tracker\").remove();\r\n $(\"#secondCanvas\").remove();\r\n this.svgRenderer = new ej.EjCanvasRender(this.element); // to create canvas container\r\n this.svgRenderer.svgObj.height = ej.util.isNullOrUndefined(this.model.size.height) ? \"450\" : this.model.size.height;\r\n this.svgRenderer.svgObj.width = ej.util.isNullOrUndefined(this.model.size.width) ? $(\"#\" + this._id).width() : this.model.size.width;\r\n this.svgObject = this.svgRenderer.svgObj;\r\n\r\n $(this.legendSvgContainer).remove();\r\n this.legendSvgContainer = this.svgRenderer.createLegendCanvas(this.element); //creating new CANVAS element for legend\r\n this.svgRenderer.append(this.legendSvgContainer, this.legendContainer);\r\n }\r\n else if ((this.svgObject.id).indexOf(\"_canvas\") != -1) {\r\n this._removeZoomkit();\r\n $(this.svgObject).remove();\r\n this.svgRenderer = new ej.EjSvgRender(this.element); // to create svg container\r\n this.svgObject = this.svgRenderer.svgObj;\r\n this.canvasX = this.canvasY = 0;\r\n\r\n $(this.legendSvgContainer).remove();\r\n this.legendSvgContainer = this.svgRenderer.createLegendSvg(this.element); //creating new SVG element for legend\r\n this.svgRenderer.append(this.legendSvgContainer, this.legendContainer);\r\n }\r\n else if (!this.chartUpdating) { // Condition checked to avoid knockout removing event.target\r\n $(this.svgObject).empty(); // using existing svg container\r\n $(this.legendSvgContainer).empty();\r\n }\r\n\r\n this.bindTo();\r\n }\r\n });\r\n\r\n ej.datavisualization.Chart.Locale = ej.datavisualization.Chart.Locale || {};\r\n ej.datavisualization.Chart.Locale['default'] = ej.datavisualization.Chart.Locale['en-US'] = {\r\n zoomIn: \"Zoom In\",\r\n zoomOut: \"Zoom Out\",\r\n zoom: \"Zoom\",\r\n pan: \"Pan\",\r\n reset: \"Reset\"\r\n };\r\n ej.datavisualization.Chart.CrosshairType = {\r\n\r\n Crosshair: 'crosshair',\r\n\r\n TrackBall: 'trackBall'\r\n };\r\n ej.datavisualization.Chart.TrackballDisplayMode = {\r\n\r\n Float: 'float',\r\n\r\n Grouping: 'grouping'\r\n };\r\n\r\n ej.datavisualization.Chart.VisibleOnLegend = {\r\n\r\n Visible: 'visible',\r\n\r\n Hidden: 'hidden'\r\n };\r\n\r\n ej.datavisualization.Chart.ExportingType = {\r\n\r\n PNG: 'png',\r\n\r\n JPG: 'jpg',\r\n\r\n PDF: 'pdf',\r\n\r\n SVG: 'svg',\r\n\r\n DOCX: 'docx',\r\n\r\n XLSX: 'xlsx'\r\n };\r\n\r\n ej.datavisualization.Chart.ExportingMode = {\r\n\r\n Client: 'client',\r\n\r\n Server: 'server'\r\n };\r\n\r\n ej.datavisualization.Chart.ExportingOrientation = {\r\n\r\n Portrait: 'portrait',\r\n\r\n Landscape: 'landscape'\r\n };\r\n\r\n ej.datavisualization.Chart.ValueType = {\r\n\r\n Double: 'double',\r\n\r\n DateTime: 'datetime',\r\n\r\n Category: 'category',\r\n\r\n Logarithmic: 'logarithmic',\r\n\r\n DateTimeCategory: 'datetimecategory'\r\n };\r\n\r\n ej.datavisualization.Chart.TextOverflow = {\r\n\r\n None: 'none',\r\n\r\n Wrap: 'wrap',\r\n\r\n Trim: 'trim',\r\n\r\n WrapAndTrim: 'wrapandtrim'\r\n };\r\n\r\n ej.datavisualization.Chart.Type = {\r\n\r\n Line: 'line',\r\n\r\n Spline: 'spline',\r\n\r\n Column: 'column',\r\n\r\n Doughnut: 'doughnut',\r\n\r\n Area: 'area',\r\n\r\n SplineArea: 'splinearea',\r\n\r\n StepLine: 'stepline',\r\n\r\n StepArea: 'steparea',\r\n\r\n Pie: 'pie',\r\n\r\n PieOfPie: 'pieofpie',\r\n\r\n Hilo: 'hilo',\r\n\r\n HiloOpenClose: 'hiloopenclose',\r\n\r\n Candle: 'candle',\r\n\r\n Bubble: 'bubble',\r\n\r\n Scatter: 'scatter',\r\n\r\n Bar: 'bar',\r\n\r\n StackingArea: 'stackingarea',\r\n\r\n StackingArea100: 'stackingarea100',\r\n\r\n RangeColumn: 'rangecolumn',\r\n\r\n StackingColumn: 'stackingcolumn',\r\n\r\n StackingColumn100: 'stackingcolumn100',\r\n\r\n StackingBar: 'stackingbar',\r\n\r\n StackingBar100: 'stackingbar100',\r\n\r\n Pyramid: 'pyramid',\r\n\r\n Funnel: 'funnel',\r\n\r\n Polar: 'polar',\r\n\r\n Radar: 'radar',\r\n\r\n RangeArea: 'rangearea',\r\n\r\n Waterfall: 'waterfall',\r\n\r\n BoxAndWhishker: 'boxandwhisker',\r\n\r\n StackingSplineArea: 'stackingsplinearea',\r\n\r\n StackingSplineArea100: 'stackingsplinearea100'\r\n\r\n };\r\n ej.datavisualization.Chart.SplitMode = {\r\n\r\n Position: 'position',\r\n\r\n Value: 'value',\r\n\r\n Percentage: 'percentage',\r\n\r\n Indexes: 'indexes'\r\n\r\n };\r\n\r\n ej.datavisualization.Chart.SplineType = {\r\n\r\n Natural: 'natural',\r\n\r\n Monotonic: 'monotonic',\r\n\r\n Cardinal: 'cardinal',\r\n\r\n Clamped: 'clamped'\r\n\r\n };\r\n ej.datavisualization.Chart.DragType = {\r\n\r\n XY: \"xy\",\r\n\r\n X: \"x\",\r\n\r\n Y: \"y\"\r\n };\r\n ej.datavisualization.Chart.LabelPlacement = {\r\n\r\n BetweenTicks: \"betweenTicks\",\r\n\r\n OnTicks: \"onTicks\"\r\n };\r\n\r\n ej.datavisualization.Chart.TrendlinesType = {\r\n\r\n Linear: \"linear\",\r\n\r\n Exponential: \"exponential\",\r\n\r\n Logarithmic: \"logarithmic\",\r\n\r\n Power: \"power\",\r\n\r\n Polynomial: \"polynomial\"\r\n };\r\n\r\n ej.datavisualization.Chart.ErrorBarType = {\r\n\r\n FixedValue: \"fixedValue\",\r\n\r\n Percentage: \"percentage\",\r\n\r\n StandardDeviation: \"standardDeviation\",\r\n\r\n StandardError: \"standardError\",\r\n\r\n Custom: \"custom\"\r\n };\r\n\r\n ej.datavisualization.Chart.ErrorBarMode = {\r\n\r\n Both: \"both\",\r\n\r\n Vertical: \"vertical\",\r\n\r\n Horizontal: \"horizontal\"\r\n };\r\n\r\n ej.datavisualization.Chart.ErrorBarDirection = {\r\n\r\n Both: \"both\",\r\n\r\n Plus: \"plus\",\r\n\r\n Minus: \"minus\"\r\n };\r\n\r\n ej.datavisualization.Chart.LabelIntersectAction = {\r\n\r\n None: \"none\",\r\n\r\n Rotate90: \"rotate90\",\r\n\r\n Rotate45: \"rotate45\",\r\n\r\n Wrap: \"wrap\",\r\n\r\n WrapByword: \"wrapByWord\",\r\n\r\n Trim: \"trim\",\r\n\r\n Hide: \"hide\",\r\n\r\n MultipleRows: \"multipleRows\"\r\n };\r\n\r\n ej.datavisualization.Chart.EdgeLabelPlacement = {\r\n\r\n None: \"none\",\r\n\r\n Shift: \"shift\",\r\n\r\n Hide: \"hide\"\r\n };\r\n\r\n ej.datavisualization.Chart.roundedCorner = {\r\n\r\n Both: \"both\",\r\n\r\n Start: \"start\",\r\n\r\n End: \"end\"\r\n\r\n };\r\n\r\n ej.datavisualization.Chart.Theme = {\r\n\r\n Azure: 'azure',\r\n\r\n FlatLight: 'flatlight',\r\n\r\n Azuredark: 'azuredark',\r\n\r\n Lime: 'lime',\r\n\r\n LimeDark: 'limedark',\r\n\r\n Saffron: 'saffron',\r\n\r\n SaffronDark: 'saffrondark',\r\n\r\n GradientLight: 'gradientlight',\r\n\r\n GradientDark: 'gradientdark',\r\n\r\n HighContrast01: 'highcontrast01',\r\n\r\n HighContrast02: 'highcontrast02',\r\n\r\n Material: 'material',\r\n\r\n Office365: 'office365',\r\n\r\n Bootstrap: 'bootstrap'\r\n };\r\n\r\n ej.datavisualization.Chart.FontStyle = {\r\n\r\n Normal: 'normal',\r\n\r\n Italic: 'italic'\r\n };\r\n\r\n ej.datavisualization.Chart.FontWeight = {\r\n\r\n Regular: 'regular',\r\n\r\n Bold: 'bold',\r\n\r\n Lighter: 'lighter'\r\n };\r\n\r\n ej.datavisualization.Chart.IntervalType = {\r\n\r\n Auto: 'auto',\r\n\r\n Days: 'days',\r\n\r\n Hours: 'hours',\r\n\r\n Seconds: 'seconds',\r\n\r\n Milliseconds: 'milliseconds',\r\n\r\n Minutes: 'minutes',\r\n\r\n Months: 'months',\r\n\r\n Years: 'years'\r\n };\r\n\r\n ej.datavisualization.Chart.RangePadding = {\r\n\r\n Additional: 'additional',\r\n\r\n Normal: 'normal',\r\n\r\n None: 'none',\r\n\r\n Round: 'round',\r\n\r\n Auto: 'auto'\r\n };\r\n\r\n ej.datavisualization.Chart.TextAlignment = {\r\n\r\n MiddleTop: 'middletop',\r\n\r\n MiddleCenter: 'middlecenter',\r\n\r\n MiddleBottom: 'middlebottom'\r\n };\r\n\r\n ej.datavisualization.Chart.LabelPosition = {\r\n\r\n Inside: 'inside',\r\n\r\n Outside: 'outside'\r\n };\r\n\r\n ej.datavisualization.Chart.ZIndex = {\r\n\r\n Over: 'over',\r\n\r\n Behind: 'behind'\r\n };\r\n\r\n ej.datavisualization.Chart.Unit = {\r\n\r\n percentage: 'percentage',\r\n\r\n pixel: 'pixel'\r\n };\r\n\r\n ej.datavisualization.Chart.PyramidMode = {\r\n\r\n Linear: 'linear',\r\n\r\n Surface: 'Surface'\r\n };\r\n\r\n ej.datavisualization.Chart.DrawType = {\r\n\r\n Line: 'line',\r\n\r\n Column: 'column',\r\n\r\n Area: 'area',\r\n\r\n RangeColumn: 'rangecolumn',\r\n\r\n Scatter: 'scatter',\r\n\r\n Spline: 'spline'\r\n };\r\n\r\n ej.datavisualization.Chart.AnimationType = {\r\n\r\n Linear: 'linear',\r\n\r\n Smooth: 'smooth'\r\n\r\n };\r\n\r\n ej.datavisualization.Chart.columnFacet = {\r\n\r\n Rectangle: 'rectangle',\r\n\r\n Cylinder: 'cylinder'\r\n };\r\n\r\n ej.datavisualization.Chart.EmptyPointMode = {\r\n\r\n Gap: 'gap',\r\n\r\n Zero: 'zero',\r\n\r\n Average: 'average'\r\n\r\n };\r\n\r\n ej.datavisualization.Chart.Pattern = {\r\n\r\n None: 'none',\r\n\r\n Chessboard: 'chessboard',\r\n\r\n Crosshatch: 'crosshatch',\r\n\r\n Dots: 'dots',\r\n\r\n Pacman: 'pacman',\r\n\r\n DiagonalBackward: 'diagonalBackward',\r\n\r\n DiagonalForward: 'diagonalForward',\r\n\r\n Grid: 'grid',\r\n\r\n Turquoise: 'turquoise',\r\n\r\n Star: 'star',\r\n\r\n Triangle: 'triangle',\r\n\r\n Circle: 'circle',\r\n\r\n Tile: 'tile',\r\n\r\n HorizontalDash: 'horizontalDash',\r\n\r\n VerticalDash: 'verticalDash',\r\n\r\n Rectangle: 'rectangle',\r\n\r\n Box: 'box',\r\n\r\n VerticalStripe: 'verticalStripe',\r\n\r\n HorizontalStripe: 'horizontalStripe',\r\n\r\n Bubble: 'bubble',\r\n\r\n Custom: 'custom'\r\n };\r\n\r\n ej.datavisualization.Chart.Mode = {\r\n\r\n Series: 'series',\r\n\r\n Point: 'point',\r\n\r\n Cluster: 'cluster',\r\n\r\n Range: 'range'\r\n };\r\n\r\n ej.datavisualization.Chart.SelectionType = {\r\n\r\n Single: 'single',\r\n\r\n Multiple: 'multiple'\r\n };\r\n ej.datavisualization.Chart.Shape = {\r\n\r\n None: 'none',\r\n\r\n LeftArrow: 'leftarrow',\r\n\r\n RightArrow: 'rightarrow',\r\n\r\n Circle: 'circle',\r\n\r\n Cross: 'cross',\r\n\r\n HorizLine: 'horizline',\r\n\r\n VertLine: 'vertLine',\r\n\r\n Diamond: 'diamond',\r\n\r\n Rectangle: 'rectangle',\r\n\r\n Triangle: 'triangle',\r\n\r\n InvertedTriangle: 'invertedtriangle',\r\n\r\n Hexagon: 'hexagon',\r\n\r\n Pentagon: 'pentagon',\r\n\r\n Star: 'star',\r\n\r\n Ellipse: 'ellipse',\r\n\r\n Wedge: 'wedge',\r\n\r\n Trapezoid: 'trapezoid',\r\n\r\n UpArrow: 'uparrow',\r\n\r\n DownArrow: 'downarrow',\r\n\r\n Image: 'image'\r\n };\r\n\r\n ej.datavisualization.Chart.DrawMode = {\r\n\r\n Both: 'both',\r\n\r\n Open: 'open',\r\n\r\n Close: 'close'\r\n };\r\n\r\n ej.datavisualization.Chart.LineCap = {\r\n\r\n Butt: 'butt',\r\n\r\n Round: 'round',\r\n\r\n Square: 'square'\r\n };\r\n\r\n ej.datavisualization.Chart.LineJoin = {\r\n\r\n Round: 'round',\r\n\r\n Bevel: 'bevel',\r\n\r\n Miter: 'miter'\r\n };\r\n\r\n ej.datavisualization.Chart.Position = {\r\n\r\n Top: 'top',\r\n\r\n Middle: 'middle',\r\n\r\n Bottom: 'bottom'\r\n };\r\n\r\n ej.datavisualization.Chart.Alignment = {\r\n\r\n Center: 'center',\r\n\r\n Near: 'near',\r\n\r\n Far: 'far'\r\n };\r\n\r\n ej.datavisualization.Chart.TickLinesPosition = {\r\n\r\n Inside: 'inside',\r\n\r\n Outside: 'outside'\r\n };\r\n\r\n ej.datavisualization.Chart.CoordinateUnit = {\r\n\r\n None: 'none',\r\n\r\n Pixels: 'pixels',\r\n\r\n Points: 'points'\r\n };\r\n\r\n ej.datavisualization.Chart.HorizontalAlignment = {\r\n\r\n Left: 'left',\r\n\r\n Right: 'right',\r\n\r\n Middle: 'middle'\r\n };\r\n\r\n ej.datavisualization.Chart.VerticalAlignment = {\r\n\r\n Top: 'top',\r\n\r\n Bottom: 'bottom',\r\n\r\n Middle: 'middle'\r\n };\r\n\r\n ej.datavisualization.Chart.Region = {\r\n\r\n Chart: 'chart',\r\n\r\n Series: 'series'\r\n };\r\n\r\n ej.datavisualization.Chart.ConnectorLineType = {\r\n\r\n Line: 'line',\r\n\r\n Bezier: 'bezier'\r\n };\r\n\r\n ej.datavisualization.Chart.HorizontalTextAlignment = {\r\n\r\n Near: 'near',\r\n\r\n Far: 'far',\r\n\r\n Center: 'center'\r\n };\r\n\r\n ej.datavisualization.Chart.VerticalTextAlignment = {\r\n\r\n Near: 'near',\r\n\r\n Far: 'far',\r\n\r\n Center: 'center'\r\n };\r\n\r\n ej.datavisualization.Chart.multiLevelLabelsBorderType = {\r\n\r\n None: 'none',\r\n\r\n Rectangle: 'rectangle',\r\n\r\n WithoutTopAndBottom: 'withouttopandbottom',\r\n\r\n Brace: 'brace',\r\n\r\n CurlyBrace: 'curlybrace'\r\n };\r\n\r\n ej.datavisualization.Chart.MACDType = {\r\n\r\n Line: 'line',\r\n\r\n Histogram: 'histogram',\r\n\r\n Both: 'both'\r\n };\r\n\r\n ej.datavisualization.Chart.IndicatorsType = {\r\n\r\n RSI: 'rsi',\r\n\r\n Momentum: 'momentum',\r\n\r\n Bollingerband: 'bollingerband',\r\n\r\n Accumulationdistribution: 'accumulationdistribution',\r\n\r\n EMA: 'ema',\r\n\r\n SMA: 'sma',\r\n\r\n Stochastic: 'stochastic',\r\n\r\n ATR: 'atr',\r\n\r\n MACD: 'macd',\r\n\r\n TMA: 'tma'\r\n };\r\n\r\n ej.datavisualization.Chart.BoxPlotMode = {\r\n\r\n Normal: 'normal',\r\n\r\n Exclusive: 'exclusive',\r\n\r\n Inclusive: 'inclusive',\r\n\r\n\r\n };\r\n\r\n ej.datavisualization.Chart.BubbleRadiusMode = {\r\n\r\n MinMax: 'minmax',\r\n\r\n Auto: 'auto'\r\n\r\n };\r\n\r\n $.extend(ej.datavisualization.Chart.prototype, ej.ejChart);\r\n})(jQuery, Syncfusion);;\r\nej.EjCanvasRender = function (element) {\r\n this.svgObj = document.createElement('canvas');\r\n this._rootId = jQuery(element).attr(\"id\");\r\n this.svgObj.setAttribute('id', this._rootId + '_canvas');\r\n this.ctx = this.svgObj.getContext(\"2d\");\r\n\r\n};\r\n(function ($) {\r\n ej.EjCanvasRender.prototype = {\r\n\r\n drawPath: function (options, element, canvasTranslate) {\r\n var hasStackingInnerRadius = options.hasStackingInnerRadius ? options.hasStackingInnerRadius : false;\r\n var path = options.d;\r\n var dataSplit = path.split(\" \");\r\n var borderWidth = options[\"stroke-width\"];\r\n if (!options.lgndCtx) {\r\n var canvasCtx = this.ctx;\r\n this.ctx = element != undefined ? element : this.ctx;\r\n this.ctx.save();\r\n this.ctx.beginPath();\r\n if (canvasTranslate) this.ctx.translate(canvasTranslate[0], canvasTranslate[1]);\r\n this.ctx.globalAlpha = options.opacity ? options.opacity : options[\"fill-opacity\"];\r\n var flag = true;\r\n this.ctx.lineWidth = borderWidth;\r\n var dashArray = options[\"stroke-dasharray\"] ? options[\"stroke-dasharray\"].split(\",\") : false;\r\n if (dashArray) this.ctx.setLineDash(dashArray);\r\n this.ctx.strokeStyle = options.stroke;\r\n for (var i = 0; i < dataSplit.length; i = i + 3) {\r\n var x1 = parseFloat(dataSplit[i + 1]);\r\n var y1 = parseFloat(dataSplit[i + 2]);\r\n switch (dataSplit[i]) {\r\n case \"M\":\r\n if ((!options.innerR || hasStackingInnerRadius) && !options.cx)\r\n this.ctx.moveTo(x1, y1);\r\n break;\r\n case \"L\":\r\n if (!options.innerR || hasStackingInnerRadius)\r\n this.ctx.lineTo(x1, y1);\r\n break;\r\n case \"C\":\r\n this.ctx.bezierCurveTo(x1, y1, parseFloat(dataSplit[i + 3]), parseFloat(dataSplit[i + 4]), parseFloat(dataSplit[i + 5]), parseFloat(dataSplit[i + 6]));\r\n i = i + 4;\r\n break;\r\n case \"A\":\r\n if (!options.innerR) {\r\n if (options.cx) {\r\n this.ctx.arc(options.cx, options.cy, options.radius, 0, 2 * Math.PI, options.counterClockWise);\r\n }\r\n else {\r\n this.ctx.moveTo(options.x, options.y);\r\n this.ctx.arc(options.x, options.y, options.radius, options.start, options.end, options.counterClockWise);\r\n this.ctx.lineTo(options.x, options.y);\r\n }\r\n }\r\n else if (flag) {\r\n this.ctx.arc(options.x, options.y, options.radius, options.start, options.end, options.counterClockWise);\r\n this.ctx.arc(options.x, options.y, options.innerR, options.end, options.start, !options.counterClockWise);\r\n flag = false;\r\n }\r\n i = i + 5;\r\n break;\r\n case \"Q\":\r\n this.ctx.bezierCurveTo(x1, y1, parseFloat(dataSplit[i + 1]), parseFloat(dataSplit[i + 2]), parseFloat(dataSplit[i + 3]), parseFloat(dataSplit[i + 4]));\r\n i = i + 2;\r\n break;\r\n case \"z\":\r\n this.ctx.closePath();\r\n break;\r\n }\r\n }\r\n if (options.fill != \"none\" && options.fill != undefined) {\r\n this.ctx.fillStyle = options.fill;\r\n this.ctx.fill();\r\n }\r\n if (borderWidth > 0)\r\n this.ctx.stroke();\r\n this.ctx.restore();\r\n this.ctx = canvasCtx;\r\n } else {\r\n var legendCtx = this.lgndCtx;\r\n this.lgndCtx = element != undefined ? element : this.lgndCtx;\r\n this.lgndCtx.save();\r\n this.lgndCtx.beginPath();\r\n if (canvasTranslate) this.lgndCtx.translate(canvasTranslate[0], canvasTranslate[1]);\r\n this.lgndCtx.globalAlpha = options.opacity ? options.opacity : options[\"fill-opacity\"];\r\n\r\n this.lgndCtx.lineWidth = options[\"stroke-width\"];\r\n this.lgndCtx.strokeStyle = options.stroke;\r\n for (var i = 0; i < dataSplit.length; i = i + 3) {\r\n var x1 = parseFloat(dataSplit[i + 1]);\r\n var y1 = parseFloat(dataSplit[i + 2]);\r\n switch (dataSplit[i]) {\r\n case \"M\":\r\n this.lgndCtx.moveTo(x1, y1);\r\n break;\r\n case \"L\":\r\n this.lgndCtx.lineTo(x1, y1);\r\n break;\r\n case \"C\":\r\n this.lgndCtx.bezierCurveTo(x1, y1, parseFloat(dataSplit[i + 3]), parseFloat(dataSplit[i + 4]), parseFloat(dataSplit[i + 5]), parseFloat(dataSplit[i + 6]));\r\n i = i + 4;\r\n break;\r\n case \"A\":\r\n this.lgndCtx.arc(parseFloat(dataSplit[i - 5]), parseFloat(dataSplit[i - 4]), x1, 0, 2 * Math.PI, false);\r\n i = i + 5;\r\n break;\r\n case \"a\":\r\n this.lgndCtx.beginPath();\r\n var centerX = parseFloat(dataSplit[i - 2]) + x1;\r\n var centerY = dataSplit[i - 1];\r\n this.lgndCtx.arc(centerX, centerY, x1, 0, 2 * Math.PI, false);\r\n i = i + 5;\r\n break;\r\n case \"Z\":\r\n this.lgndCtx.fillStyle = options.fill;\r\n this.lgndCtx.fill();\r\n i = i - 2;\r\n break;\r\n case \"Q\":\r\n this.lgndCtx.quadraticCurveTo(x1, y1, parseFloat(dataSplit[i + 3]), parseFloat(dataSplit[i + 4]));\r\n i = i + 2;\r\n break;\r\n }\r\n }\r\n if (options.fill != \"none\" && options.fill != undefined) {\r\n this.lgndCtx.fillStyle = options.fill;\r\n this.lgndCtx.fill();\r\n }\r\n this.lgndCtx.stroke();\r\n this.lgndCtx.restore();\r\n this.lgndCtx = legendCtx;\r\n }\r\n },\r\n\r\n _setLinePathStyle: function (options, canvasTranslate) {\r\n\r\n var borderWidth = options[\"stroke-width\"],\r\n dashArray;\r\n\r\n if (canvasTranslate) this.ctx.translate(canvasTranslate[0], canvasTranslate[1]);\r\n this.ctx.globalAlpha = options.opacity ? options.opacity : options[\"fill-opacity\"];\r\n this.ctx.lineWidth = borderWidth;\r\n dashArray = options[\"stroke-dasharray\"] ? options[\"stroke-dasharray\"].split(\",\") : false;\r\n if (dashArray) this.ctx.setLineDash(dashArray);\r\n this.ctx.strokeStyle = options.stroke;\r\n\r\n if (options.fill != \"none\" && options.fill != undefined) {\r\n this.ctx.fillStyle = options.fill;\r\n this.ctx.fill();\r\n }\r\n },\r\n\r\n\r\n drawRect: function (options, element) {\r\n var canvasCtx = this.ctx, cornerRadius = options.rx;\r\n this.ctx = element ? (element.canvas ? element : this.ctx) : this.ctx;\r\n this.ctx.save();\r\n this.ctx.beginPath();\r\n this.ctx.globalAlpha = options.opacity;\r\n this.ctx.lineWidth = options[\"stroke-width\"];\r\n var dashArray = options[\"stroke-dasharray\"] ? options[\"stroke-dasharray\"].split(\",\") : false;\r\n if (dashArray) this.ctx.setLineDash(dashArray);\r\n this.ctx.strokeStyle = options.stroke;\r\n this.ctx.rect(options.x, options.y, options.width, options.height);\r\n if (cornerRadius != null && cornerRadius >= 0) {\r\n this.drawCornerRadius(options);\r\n }\r\n else {\r\n if (options.fill == \"none\") options.fill = \"transparent\";\r\n this.ctx.fillStyle = options.fill;\r\n this.ctx.fillRect(options.x, options.y, options.width, options.height);\r\n this.ctx.stroke();\r\n }\r\n if (options.id.indexOf(\"Series\") >= 0)\r\n this.ctx.clip();\r\n this.ctx.restore();\r\n this.ctx = canvasCtx;\r\n },\r\n drawCylinder: function (options, element, seriesOption) {\r\n var canvasCtx = this.ctx;\r\n this.ctx = element ? (element.canvas ? element : this.ctx) : this.ctx;\r\n this.ctx.save();\r\n var grad = ej.datavisualization.Chart.prototype.colorNameToHex(options.fill);\r\n var obj = { svgRenderer: ej.EjSvgRender.prototype };\r\n 'use strict';\r\n var i, xPos, yPos, pi = Math.PI, twoPi = 2 * pi + 0.1, rx, ry, cx1, cx2, cy1, cy2, x1, x2, y1, y2, cx, cy, xl, yl, step, ini, gx1, gy2, gx2, gy1, rxt, ryt;\r\n var x = options.x, y = options.y, w = options.width, h = options.height, a = twoPi;\r\n this.ctx.fillStyle = ej.Ej3DRender.prototype.polygon3D.prototype.applyZLight(grad, obj)\r\n this.ctx.lineWidth = 0;\r\n this.ctx.strokeStyle = ej.Ej3DRender.prototype.polygon3D.prototype.applyZLight(grad, obj);\r\n this.ctx.globalAlpha = options.opacity;\r\n if (seriesOption.isColumn == true) {\r\n gx1 = x;\r\n gx2 = w + x;\r\n gy1 = gy2 = 0;\r\n rx = w / 2;\r\n ry = rx / 4;\r\n cx2 = cx1 = x + rx;\r\n y2 = cy1 = y - ry;\r\n x2 = x;\r\n x1 = x + w;\r\n cy2 = y1 = y + h - ry;\r\n ini = 0;\r\n step = pi;\r\n rxt = -rx;\r\n ryt = ry;\r\n if (seriesOption.stacking = true) {\r\n if (!seriesOption.isLastSeries) {\r\n y2 = cy1 = y + ry;\r\n\r\n }\r\n }\r\n\r\n }\r\n else {\r\n gx1 = gx2 = 0;\r\n gy2 = h + y;\r\n gy1 = y;\r\n ry = h / 2;\r\n rx = ry / 4;\r\n x2 = cx1 = x + rx;\r\n x1 = cx2 = x + w + rx;\r\n y1 = y + h;\r\n y2 = y;\r\n cy2 = cy1 = y + ry;\r\n ini = pi / 2;\r\n step = pi * 1.5;\r\n if (seriesOption.stacking = true) {\r\n if (!seriesOption.isLastSeries) {\r\n x1 = cx2 = x + w - rx;\r\n }\r\n }\r\n ry = -ry;\r\n rx = -rx;\r\n rxt = rx;\r\n ryt = -ry;\r\n }\r\n var color = ej.Ej3DRender.prototype.polygon3D.prototype.applyXLight(grad, obj);\r\n var grd = this.ctx.createLinearGradient(gx1, gy1, gx2, gy2);\r\n grd.addColorStop(0, grad);\r\n grd.addColorStop(0.3, color);\r\n grd.addColorStop(0.7, color);\r\n grd.addColorStop(1, grad);\r\n\r\n for (j = 1; j <= 4; j++) {\r\n var i = 0;\r\n j < 4 ? this.ctx.beginPath() : \"\";\r\n if (j % 2 == 0) {\r\n cx = cx2; cy = cy2; xl = x2; yl = y2;\r\n }\r\n else {\r\n cx = cx1; cy = cy1; xl = x1; yl = y1;\r\n }\r\n if (j == 4) {\r\n rx = rxt;\r\n ry = ryt;\r\n this.ctx.fillStyle = grd;\r\n }\r\n if (j > 2) {\r\n i = ini;\r\n a = step;\r\n }\r\n for (; i <= a; i += 0.1) {\r\n xPos = cx - (rx * Math.cos(i));\r\n yPos = cy + (ry * Math.sin(i));\r\n\r\n if (i === 0) {\r\n this.ctx.moveTo(xPos, yPos);\r\n } else {\r\n this.ctx.lineTo(xPos, yPos);\r\n }\r\n }\r\n\r\n if (j > 2) {\r\n\r\n this.ctx.lineTo(xl, yl);\r\n }\r\n if (j != 3) {\r\n\r\n this.ctx.stroke();\r\n this.ctx.fill();\r\n }\r\n }\r\n\r\n if (options.id.indexOf(\"Series\") >= 0)\r\n this.ctx.clip();\r\n this.ctx.restore();\r\n this.ctx = canvasCtx;\r\n },\r\n drawCornerRadius: function (options) {\r\n var cornerRadius = options.rx, x = options.x, y = options.y, width = options.width, height = options.height;\r\n if (options.fill == \"none\") options.fill = \"transparent\";\r\n this.ctx.fillStyle = options.fill;\r\n if (width < 2 * cornerRadius) cornerRadius = width / 2;\r\n if (height < 2 * cornerRadius) cornerRadius = height / 2;\r\n this.ctx.beginPath();\r\n this.ctx.moveTo(x + width - cornerRadius, y);\r\n this.ctx.arcTo(x + width, y, x + width, y + height, cornerRadius);\r\n this.ctx.arcTo(x + width, y + height, x, y + height, cornerRadius);\r\n this.ctx.arcTo(x, y + height, x, y, cornerRadius);\r\n this.ctx.arcTo(x, y, x + width, y, cornerRadius);\r\n this.ctx.closePath();\r\n this.ctx.fill();\r\n this.ctx.stroke();\r\n },\r\n\r\n createGradientElement: function (name, colors) {\r\n var colorName;\r\n var ctx = this.ctx;\r\n if (Object.prototype.toString.call(colors) == '[object Array]') {\r\n var my_gradient = ctx.createLinearGradient(0, 0, 0, this.svgObj.height);\r\n\r\n for (var i = 0; i <= colors.length - 1; i++) {\r\n var color = colors[i].color;\r\n var colorStop = (colors[i].colorStop).slice(0, -1);\r\n colorStop = parseInt(colorStop) / 100;\r\n my_gradient.addColorStop(colorStop, color);\r\n\r\n }\r\n colorName = my_gradient;\r\n }\r\n else {\r\n colorName = colors;\r\n }\r\n return colorName;\r\n },\r\n drawLine: function (options) {\r\n this.ctx.save();\r\n this.ctx.beginPath();\r\n this.ctx.lineWidth = options[\"stroke-width\"];\r\n this.ctx.strokeStyle = options.stroke;\r\n this.ctx.moveTo(options.x1, options.y1);\r\n this.ctx.lineTo(options.x2, options.y2);\r\n this.ctx.stroke();\r\n this.ctx.restore();\r\n },\r\n drawText: function (options, label, highestText) {\r\n if (!ej.util.isNullOrUndefined(options[\"font-weight\"]) && options[\"font-weight\"].toLowerCase() == \"regular\")\r\n options[\"font-weight\"] = \"normal\";\r\n var font = (options[\"font-style\"].toLowerCase() + \" \" + options[\"font-weight\"] + \" \" + options[\"font-size\"] + \" \" + options[\"font-family\"]);\r\n // text-anchor\r\n var anchor = options[\"text-anchor\"];\r\n var opacity = options[\"opacity\"] !== undefined ? options[\"opacity\"] : 1;\r\n if (anchor == \"middle\")\r\n anchor = \"center\";\r\n if (!options.lgndCtx) {\r\n this.ctx.save();\r\n this.ctx.fillStyle = options.fill;\r\n this.ctx.font = font;\r\n this.ctx.textAlign = anchor;\r\n this.ctx.globalAlpha = opacity;\r\n if (options.baseline)\r\n this.ctx.textBaseline = options.baseline;\r\n // dominant-baseline\r\n //if (options[\"dominant-baseline\"] == \"middle\")\r\n //this.ctx.textBaseline = \"center\";\r\n if (!options.labelRotation) {\r\n if (typeof label == \"object\" || options.isTrackball) {\r\n if (options.isTrackball && typeof label == \"string\")\r\n this.ctx.fillText(label, options.x, options.y);\r\n else {\r\n var len = label.length;\r\n for (var i = 0; i < len; i++) {\r\n var padding = ej.util.isNullOrUndefined(options.padding) ? 0 : options.padding;\r\n var height = (ej.EjSvgRender.utils._measureText(label[i], null, font)).height;\r\n var fontvalue = options.isTrackball ? Number(parseInt(options[\"font-size\"])) : height;\r\n this.ctx.fillText(label[i], options.x, options.y + (fontvalue + padding) * i);\r\n }\r\n }\r\n }\r\n else {\r\n this.ctx.fillText(label, options.x, options.y);\r\n }\r\n } else {\r\n var txtlngth = 0, rotation = options.labelRotation;\r\n if ((rotation) && (options.id.indexOf(\"XLabel\") != -1 || options.id.indexOf(\"YLabel\") != -1)) {\r\n var rotate = 'rotate(' + options.labelRotation.toString() + 'deg)';\r\n $(options).attr('rotateAngle', rotate);\r\n\r\n var labelText = highestText ? highestText : label;\r\n var textElement = this.createText(options, labelText);\r\n $(document.body).append(textElement);\r\n var box = textElement.getBoundingClientRect();\r\n $(textElement).remove();\r\n txtlngth = box.height;\r\n if (rotation < 0) {\r\n rotation = 360 + rotation;\r\n }\r\n var str = options.transform.split(',');\r\n if (options.labelPosition == \"outside\")\r\n this.ctx.translate(parseFloat(str[1]), parseFloat(str[2]) + (txtlngth / 2));\r\n else\r\n this.ctx.translate(parseFloat(str[1]), parseFloat(str[2]) - (txtlngth / 2));\r\n this.ctx.textAlign = \"center\";\r\n this.ctx.rotate(rotation * (Math.PI / 180));\r\n if (typeof label == \"object\") {\r\n var len = label.length;\r\n for (var i = 0; i < len; i++) {\r\n var height = (ej.EjSvgRender.utils._measureText(label[i], null, font)).height;\r\n this.ctx.fillText(label[i], 0, i * height);\r\n }\r\n }\r\n else\r\n this.ctx.fillText(label, 0, 0);\r\n }\r\n else {\r\n this.ctx.translate(options.x, options.y);\r\n this.ctx.rotate(options.labelRotation * Math.PI / 180);\r\n this.ctx.fillText(label, 0, 0);\r\n }\r\n }\r\n this.ctx.restore();\r\n } else {\r\n this.lgndCtx.save();\r\n this.lgndCtx.fillStyle = options.fill;\r\n this.lgndCtx.font = font;\r\n this.lgndCtx.textAlign = anchor;\r\n this.lgndCtx.globalAlpha = opacity;\r\n // dominant-baseline\r\n if (options[\"dominant-baseline\"] == \"middle\")\r\n this.lgndCtx.textBaseline = \"center\";\r\n if (!options.labelRotation) {\r\n this.lgndCtx.fillText(label, options.x, options.y);\r\n } else {\r\n this.lgndCtx.translate(options.x, options.y);\r\n this.lgndCtx.rotate(options.labelRotation * Math.PI / 180);\r\n this.lgndCtx.fillText(label, 0, 0);\r\n }\r\n this.lgndCtx.restore();\r\n }\r\n },\r\n drawZoomRect: function (options, chartObj) {\r\n\r\n var chartPos = { left: 0, top: 0 };\r\n var zoomRect = $(\"
\");\r\n var areaBounds = chartObj.model.m_AreaBounds;\r\n\r\n // for drawing zoom area within the chartArea\r\n if (options.x < areaBounds.X || options.x + chartPos.left + options.width > chartPos.left + $(this.svgObj).width() - 20) {\r\n width = this.prevWidth;\r\n x = this.prevX;\r\n } else {\r\n width = this.prevWidth = options.width;\r\n x = this.prevX = options.x + chartPos.left;\r\n }\r\n\r\n if (options.y < areaBounds.Y || options.y + chartPos.top + options.height > chartPos.top + areaBounds.Y + areaBounds.Height) {\r\n height = this.prevHeight;\r\n y = this.prevY;\r\n } else {\r\n height = this.prevHeight = options.height;\r\n y = this.prevY = options.y + chartPos.top;\r\n }\r\n\r\n $(zoomRect).css({\r\n \"width\": width,\r\n \"height\": height,\r\n \"top\": y,\r\n \"left\": x,\r\n \"background-color\": options.fill,\r\n \"border-style\": \"solid\",\r\n \"position\": \"absolute\",\r\n \"border-color\": options.stroke,\r\n \"border-width\": options[\"stroke-width\"]\r\n });\r\n document.getElementById(\"chartContainer_\" + this._rootId).appendChild(zoomRect[0]);\r\n },\r\n zoomButton: function (options, currentItem, chart) {\r\n var svgObj = chart.svgObj ? chart.svgObj : chart.svgObject;\r\n var id = chart._rootId ? chart._rootId : chart._id;\r\n if (currentItem == \"zoom\")\r\n var currentItemId = \"_Zoom\";\r\n else if (currentItem == \"zoomIn\")\r\n currentItemId = \"_ZoomIn\";\r\n else\r\n currentItemId = \"_ZoomOut\";\r\n\r\n var chartPos = { left: 0, top: 0 };\r\n if ($(\"#\" + options.zoomId).length <= 0) {\r\n var zoomButton = $(\"
\");\r\n $(zoomButton).css({\r\n \"width\": options.width,\r\n \"height\": options.height,\r\n \"top\": options.top + chartPos.top,\r\n \"left\": options.left + chartPos.left,\r\n \"background-color\": options.fill,\r\n \"border-style\": \"solid\",\r\n \"position\": \"absolute\",\r\n \"border-radius\": \"0.4em\",\r\n \"border-color\": options.fill,\r\n \"box-sizing\": \"content-box\",\r\n \"z-index\": 2000\r\n });\r\n var svgLink = \"http://www.w3.org/2000/svg\";\r\n var svgShape = document.createElementNS(svgLink, \"svg\");\r\n svgShape.setAttribute('id', options.zoomId);\r\n svgShape.setAttribute('width', 25);\r\n svgShape.setAttribute('height', 25);\r\n\r\n if (currentItem == \"zoom\") {\r\n var direction = \"M26.101,22.893l-6.605-6.174c1.414-2.781,0.897-6.267-1.496-8.504c-2.901-2.711-7.448-2.56-10.161,0.341 c-2.712,2.9-2.56,7.45,0.341,10.163c2.426,2.266,6,2.523,8.694,0.853l6.579,6.151L26.101,22.893z M10.186,16.571 c-1.715-1.604-1.805-4.293-0.203-6.009c1.605-1.715,4.295-1.805,6.009-0.201c1.715,1.603,1.805,4.293,0.202,6.007 C14.59,18.084,11.901,18.175,10.186,16.571\";\r\n var transform = \"translate(-3,-3)\";\r\n } else if (currentItem == \"zoomIn\") {\r\n direction = \"M9.0983096,4.2999878L9.0983096,9.3999634 3.9983783,9.3999634 3.9983783,12.699951 9.0983096,12.699951 9.0983096,17.799988 12.398249,17.799988 12.398249,12.699951 17.49818,12.699951 17.49818,9.5 12.398249,9.5 12.398249,4.2999878z M10.998276,0C14.298215,0 17.49818,1.3999634 19.69813,4.1999512 22.79809,8.0999756 22.79809,13.5 19.998144,17.399963L28.597992,28.299988 23.898081,32 15.398205,21.199951C10.898271,23.099976 5.5983606,21.899963 2.3983956,17.899963 -1.4015366,13.099976 -0.60156059,6.0999756 4.1983567,2.3999634 6.1983276,0.79998779 8.5983163,0 10.998276,0z\";\r\n transform = \"translate(4,4) scale(0.6)\";\r\n } else {\r\n direction = \"M3.9983433,9.5L3.9983433,12.799988 17.598165,12.799988 17.598165,9.5z M10.998234,0C14.298169,0 17.498131,1.3999634 19.698108,4.1999512 22.798034,8.0999756 22.798034,13.5 19.998092,17.399963L28.597994,28.299988 23.898054,32 15.398188,21.199951C10.898259,23.099976 5.5983546,21.899963 2.398393,17.899963 -1.4015351,13.099976 -0.60155994,6.0999756 4.1983522,2.3999634 6.1983207,0.79998779 8.5983074,0 10.998234,0z\";\r\n transform = \"translate(4,4) scale(0.6)\";\r\n }\r\n\r\n var attrOptions = {\r\n 'id': currentItemId + 'Path',\r\n 'fill': options.iconColor,\r\n 'transform': transform,\r\n 'd': direction\r\n };\r\n\r\n var path = document.createElementNS(svgLink, \"path\");\r\n $(path).attr(attrOptions).appendTo(svgShape);\r\n zoomButton[0].appendChild(svgShape);\r\n document.getElementById(\"chartContainer_\" + id).appendChild(zoomButton[0]);\r\n } else {\r\n var zoomButton = document.getElementById(svgObj.id + currentItemId + 'Btn');\r\n $(zoomButton).css({\r\n \"top\": options.top + chartPos.top,\r\n \"left\": options.left + chartPos.left\r\n });\r\n }\r\n },\r\n panButton: function (options, chart) {\r\n var svgObj = chart.svgObj ? chart.svgObj : chart.svgObject;\r\n var id = chart._rootId ? chart._rootId : chart._id;\r\n var chartPos = { left: 0, top: 0 };\r\n if ($(\"#\" + options.panId).length <= 0) {\r\n var panButton = $(\"
\");\r\n $(panButton).css({\r\n \"width\": options.width,\r\n \"height\": options.height,\r\n \"top\": options.top + chartPos.top,\r\n \"left\": options.left + chartPos.left,\r\n \"background-color\": options.fill,\r\n \"border-style\": \"solid\",\r\n \"position\": \"absolute\",\r\n \"border-radius\": \"0.4em\",\r\n \"border-color\": options.fill,\r\n \"box-sizing\": \"content-box\",\r\n \"z-index\": 2000\r\n });\r\n var svgLink = \"http://www.w3.org/2000/svg\";\r\n var svgShape = document.createElementNS(svgLink, \"svg\");\r\n svgShape.setAttribute('id', options.panId);\r\n svgShape.setAttribute('width', 25);\r\n svgShape.setAttribute('height', 25);\r\n\r\n var attrOptions = {\r\n 'id': 'panPath',\r\n 'fill': options.iconColor,\r\n 'transform': 'translate(-3,-3)'\r\n };\r\n attrOptions.points = \"26.105,16 21.053,12.211 21.053,14.737 17.263,14.737 17.263,10.947 19.834,10.947 16.044,5.895 12.255,10.947 14.737,10.947 14.737,14.737 10.947,14.737 10.947,12.211 5.895,16 10.947,19.789 10.947,17.263 14.737,17.263 14.737,21.053 12.255,21.053 16.044,26.105 19.834,21.053 17.263,21.053 17.263,17.263 21.053,17.263 21.053,19.789\";\r\n\r\n var path = document.createElementNS(svgLink, \"polygon\");\r\n $(path).attr(attrOptions).appendTo(svgShape);\r\n panButton[0].appendChild(svgShape);\r\n document.getElementById(\"chartContainer_\" + id).appendChild(panButton[0]);\r\n } else {\r\n var panButton = document.getElementById(svgObj.id + '_PanBtn');\r\n $(panButton).css({\r\n \"top\": options.top + chartPos.top,\r\n \"left\": options.left + chartPos.left\r\n });\r\n }\r\n },\r\n resetZoom: function (options, chart) {\r\n var svgObj = chart.svgObj ? chart.svgObj : chart.svgObject;\r\n var id = chart._rootId ? chart._rootId : chart._id;\r\n var chartPos = { left: 0, top: 0 };\r\n if ($(\"#\" + options.resetZoomId).length <= 0) {\r\n var resetZoom = $(\"
\");\r\n $(resetZoom).css({\r\n \"width\": options.width,\r\n \"height\": options.height,\r\n \"top\": options.top + chartPos.top,\r\n \"left\": options.left + chartPos.left,\r\n \"background-color\": options.fill,\r\n \"border-style\": \"solid\",\r\n \"border-radius\": \"0.4em\",\r\n \"position\": \"absolute\",\r\n \"border-color\": options.fill,\r\n \"box-sizing\": \"content-box\",\r\n \"z-index\": 2000\r\n });\r\n var svgLink = \"http://www.w3.org/2000/svg\";\r\n var svgShape = document.createElementNS(svgLink, \"svg\");\r\n svgShape.setAttribute('id', options.resetZoomId);\r\n svgShape.setAttribute('width', 25);\r\n svgShape.setAttribute('height', 25);\r\n\r\n var points1 = {\r\n 'id': 'p1',\r\n 'fill': options.iconColor,\r\n 'transform': 'translate(-3,-3)'\r\n };\r\n points1.points = \"11.895,18.398 8.061,22.23 5.796,19.967 5.796,26.283 12.112,26.283 9.848,24.018 13.682,20.186\";\r\n\r\n var path1 = document.createElementNS(svgLink, \"polygon\");\r\n $(path1).attr(points1).appendTo(svgShape);\r\n\r\n var points2 = {\r\n 'id': 'p2',\r\n 'fill': options.iconColor,\r\n 'transform': 'translate(-3,-3)'\r\n };\r\n points2.points = \"19.691,6.072 21.955,8.337 18.121,12.172 19.908,13.959 23.742,10.123 26.007,12.389 26.007,6.072\";\r\n\r\n var path2 = document.createElementNS(svgLink, \"polygon\");\r\n $(path2).attr(points2).appendTo(svgShape);\r\n\r\n var points3 = {\r\n 'id': 'p3',\r\n 'fill': options.iconColor,\r\n 'transform': 'translate(-3,-3)'\r\n };\r\n points3.points = \"11.895,13.958 13.682,12.172 9.848,8.337 12.112,6.072 5.796,6.072 5.796,12.389 8.061,10.123\";\r\n\r\n var path3 = document.createElementNS(svgLink, \"polygon\");\r\n $(path3).attr(points3).appendTo(svgShape);\r\n\r\n var points4 = {\r\n 'id': 'p4',\r\n 'fill': options.iconColor,\r\n 'transform': 'translate(-3,-3)'\r\n };\r\n points4.points = \"19.908,18.396 18.121,20.186 21.955,24.018 19.691,26.283 26.007,26.283 26.007,19.967 23.741,22.23\";\r\n\r\n var path4 = document.createElementNS(svgLink, \"polygon\");\r\n $(path4).attr(points4).appendTo(svgShape);\r\n\r\n resetZoom[0].appendChild(svgShape);\r\n document.getElementById(\"chartContainer_\" + id).appendChild(resetZoom[0]);\r\n } else {\r\n var resetZoom = document.getElementById(svgObj.id + '_ResetZoom');\r\n $(resetZoom).css({\r\n \"top\": options.top + chartPos.top,\r\n \"left\": options.left + chartPos.left\r\n });\r\n }\r\n },\r\n drawCrosshairLine: function (options, element) {\r\n var line = $(\"
\");\r\n $(line).css({\r\n \"width\": options.width,\r\n \"height\": options.height,\r\n \"left\": options.left,\r\n \"top\": options.top,\r\n \"border-style\": options.style,\r\n \"opacity\": options.opacity,\r\n \"visibility\": \"visible\",\r\n \"border-color\": options.stroke,\r\n \"border-width\": options[\"stroke-width\"],\r\n \"position\": options.position\r\n });\r\n $(element).append(line[0]);\r\n },\r\n drawCrosshairlabel: function (rectOptions, textOptions, text) {\r\n var chartOffset = $(\"#\" + this._rootId).offset(),\r\n chartPos = { left: 0, top: 0 };\r\n if ($(\"#\" + rectOptions.id).length > 0) {\r\n var label = document.getElementById(rectOptions.id);\r\n $(label).css({\r\n \"width\": rectOptions.width - 5,\r\n \"height\": rectOptions.height - 5,\r\n \"left\": textOptions.x + chartPos.left - 5,\r\n \"top\": textOptions.y + chartPos.top - 15,\r\n \"visibility\": \"visible\",\r\n \"display\": rectOptions.display\r\n });\r\n document.getElementById(rectOptions.id).textContent = text;\r\n } else {\r\n var label = $(\"
\");\r\n $(label).css({\r\n \"color\": textOptions.fill,\r\n \"font-family\": textOptions[\"font-family\"],\r\n \"font-size\": textOptions[\"font-size\"],\r\n \"font-weight\": textOptions[\"font-weight\"],\r\n \"font-style\": textOptions[\"font-style\"],\r\n \"background-color\": rectOptions.fill,\r\n \"border-style\": \"solid\",\r\n \"border-color\": rectOptions.stroke,\r\n \"border-width\": rectOptions[\"stroke-width\"],\r\n \"opacity\": rectOptions[\"fill-opacity\"],\r\n \"text-align\": \"center\"\r\n });\r\n\r\n document.getElementById(this._rootId).appendChild(label[0]);\r\n }\r\n },\r\n createCrosshairCanvas: function () {\r\n\r\n var chartCanvas = document.getElementById(this._rootId + \"_canvas\"),\r\n chartOffset = $(\"#\" + this._rootId).offset(), secCanvas,\r\n chartPos = { left: 0, top: 0 };\r\n\r\n if (!$(\"#secondCanvas\").length) {\r\n secCanvas = document.createElement('canvas');\r\n $(document).find(\"#\" + this.svgObj.id + '_CrosshairGroup').append(secCanvas);\r\n $(secCanvas).attr({\r\n 'id': 'secondCanvas',\r\n 'width': chartCanvas.width,\r\n 'height': chartCanvas.height,\r\n 'top': chartPos.top,\r\n 'left': chartPos.left,\r\n });\r\n $(secCanvas).css({\r\n 'width': chartCanvas.width,\r\n 'height': chartCanvas.height,\r\n 'top': chartPos.top,\r\n 'left': chartPos.left\r\n });\r\n }\r\n else {\r\n secCanvas = document.getElementById(\"secondCanvas\");\r\n }\r\n return secCanvas;\r\n },\r\n drawTrackToolTip: function (rectOptions, textOptions, text, padding) {\r\n var chartPos = { left: this.svgObj.offsetLeft, top: this.svgObj.offsetTop };\r\n if ($(\"#\" + rectOptions.id).length > 0) {\r\n var label = document.getElementById(rectOptions.id);\r\n $(label).css({\r\n \"left\": rectOptions.x + chartPos.left,\r\n \"top\": rectOptions.y + chartPos.top,\r\n \"visibility\": \"visible\",\r\n \"border-box\": \"content-box\",\r\n \"background-color\": rectOptions.fill,\r\n \"color\": textOptions.fill,\r\n \"border-color\": rectOptions.stroke,\r\n \"border-width\": rectOptions[\"stroke-width\"]\r\n });\r\n if (jQuery.type(text) == \"array\") {\r\n var j = 0;\r\n var arrayText = \"\";\r\n for (var i = 0; i < text.length; i++) {\r\n arrayText = arrayText + text[i] + '
';\r\n }\r\n $(\"#\" + rectOptions.id).html(arrayText);\r\n } else\r\n $(\"#\" + rectOptions.id).html(text);\r\n } else {\r\n var label = $(\"
\");\r\n $(label).css({\r\n \"color\": textOptions.fill,\r\n \"font-family\": textOptions[\"font-family\"],\r\n \"font-size\": textOptions[\"font-size\"],\r\n \"font-weight\": textOptions[\"font-weight\"],\r\n \"font-style\": textOptions[\"font-style\"],\r\n \"width\": rectOptions.width,\r\n \"height\": rectOptions.height - padding - 2 * rectOptions[\"stroke-width\"],\r\n \"background-color\": rectOptions.fill,\r\n \"border-style\": \"solid\",\r\n \"text-align\": \"center\",\r\n \"padding\": \"0px\",\r\n \"padding-top\": (padding / 2) + 'px',\r\n \"padding-bottom\": (padding / 2) + 'px',\r\n \"border-color\": rectOptions.stroke,\r\n \"border-width\": rectOptions[\"stroke-width\"],\r\n \"opacity\": rectOptions[\"fill-opacity\"]\r\n });\r\n document.getElementById(this._rootId).appendChild(label[0]);\r\n }\r\n },\r\n trackSymbol: function (options, evt, symbolName, trackSymbol, chartObj) {\r\n var chartAreaRect = chartObj.model.m_AreaBounds, chartOffset = $(\"#\" + this._rootId).offset(), parent;\r\n if (evt.startX >= chartAreaRect.X && evt.startX <= chartAreaRect.X + chartAreaRect.Width && evt.startY >= chartAreaRect.Y && evt.startY <= chartAreaRect.Y + chartAreaRect.Height) {\r\n var seriesIndex = options.SeriesIndex, radius;\r\n var pointIndex = options.PointIndex;\r\n if (chartObj.model.series[seriesIndex].type.toLowerCase() == \"bubble\") {\r\n var point = chartObj.model.series[seriesIndex]._visiblePoints[pointIndex];\r\n radius = (point.radius * 2) + 5;//exploding the bubble\r\n options.Style.BorderColor = options.Style.Color;\r\n }\r\n\r\n if (chartObj.model.series[seriesIndex].type.toLowerCase() == \"scatter\" && ej.util.isNullOrUndefined(trackSymbol)) {\r\n var circleOptions = {\r\n \"cx\": evt.startX - 2,\r\n \"cy\": evt.startY - 2,\r\n \"r\": options.ShapeSize.width / 2,\r\n \"fill\": options.Style.Color,\r\n \"opacity\": options.Style.Opacity,\r\n \"stroke\": options.Style.BorderColor\r\n };\r\n this.drawCircle(circleOptions, null);\r\n }\r\n\r\n else {\r\n if ($(\"#\" + \"canvas_trackSymbol\").length > 0) {\r\n var parentDiv = $(\"#\" + \"canvas_trackSymbol\");\r\n $(parentDiv).css({ \"visibility\": \"visible\", \"display\": \"block\" });\r\n }\r\n else\r\n parentDiv = $(\"
\");\r\n\r\n var chartPos = { left: evt.startX, top: evt.startY };\r\n\r\n var symbol = $(\"
\");\r\n var left = (chartPos.left - (radius || options.ShapeSize.width));\r\n var top = (chartPos.top - (radius || options.ShapeSize.height));\r\n\r\n $(symbol).css({\r\n\r\n \"left\": left,\r\n \"top\": top,\r\n \"box-sizing\": 'content-box',\r\n \"position\": \"absolute\",\r\n \"visibility\": \"visible\",\r\n \"opacity\": options.Style.Opacity,\r\n \"z-index\": 200\r\n });\r\n var style = options.ShapeSize;\r\n options.symbol = symbol;\r\n var shapeAttr = {};\r\n switch (symbolName.toLowerCase()) {\r\n case \"circle\":\r\n $(symbol).css({\r\n //radius for bubble exploding\r\n \"width\": radius || options.ShapeSize.width + 'px',\r\n \"height\": radius || options.ShapeSize.height + 'px',\r\n \"left\": radius ? (left + radius / 2) : (left + options.ShapeSize.width / 2 - options.Style.BorderWidth) + 'px',\r\n \"top\": radius ? (top + radius / 2) : (top + options.ShapeSize.height / 2 - options.Style.BorderWidth) + 'px',\r\n \"border-style\": \"solid\",\r\n \"background-color\": options.Style.Color,\r\n \"border-color\": options.Style.BorderColor,\r\n \"border-width\": options.Style.BorderWidth,\r\n \"border-radius\": \"100%\"\r\n });\r\n break;\r\n case \"rectangle\":\r\n $(symbol).css({\r\n \"width\": options.ShapeSize.width,\r\n \"height\": options.ShapeSize.height,\r\n \"left\": left + options.ShapeSize.width / 2 - options.Style.BorderWidth / 2,\r\n \"top\": top + options.Style.BorderWidth / 2,\r\n \"border-style\": \"solid\",\r\n \"background-color\": options.Style.Color,\r\n \"border-color\": options.Style.BorderColor,\r\n \"border-width\": options.Style.BorderWidth\r\n });\r\n break;\r\n case \"diamond\":\r\n\r\n var direction = \"M\" + \" \" + (evt.startX + (-style.width / 2)) + \" \" + (evt.startY) + \" \"\r\n + \"L\" + \" \" + (evt.startX) + \" \" + (evt.startY + (-options.ShapeSize.height / 2)) + \" \"\r\n + \"L\" + \" \" + (evt.startX + (options.ShapeSize.width / 2)) + \" \" + (evt.startY) + \" \"\r\n + \"L\" + \" \" + (evt.startX) + \" \" + (evt.startY + (options.ShapeSize.height / 2)) + \" \"\r\n + \"L\" + \" \" + (evt.startX + (-options.ShapeSize.width / 2)) + \" \" + (evt.startY) + \"z\";\r\n shapeAttr.direction = direction;\r\n this.drawSvgShape(options, shapeAttr);\r\n\r\n break;\r\n case \"triangle\":\r\n\r\n var direction = \"M\" + \" \" + (evt.startX + (-style.width / 2)) + \" \" + (evt.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (evt.startX) + \" \" + (evt.startY + (-style.height / 2))\r\n + \" \" + \"L\" + \" \" + (evt.startX + (style.width / 2)) + \" \" + (evt.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (evt.startX + (-style.width / 2)) + \" \" + (evt.startY + (style.height / 2)) + \"z\";\r\n shapeAttr.direction = direction;\r\n this.drawSvgShape(options, shapeAttr);\r\n\r\n break;\r\n case \"invertedtriangle\":\r\n\r\n var direction = \"M\" + \" \" + (evt.startX + (-style.width / 2)) + \" \" + (evt.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (evt.startX) + \" \" +\r\n (evt.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (evt.startX + (style.width / 2)) + \" \" + (evt.startY + (style.height / 2)) + \" \" + \"L\" + \" \" +\r\n (evt.startX + (-style.width / 2)) + \" \" + (evt.startY + (style.height / 2)) + \"z\";\r\n var x = evt.startX;\r\n var y = evt.startY;\r\n var rotate = 'rotate(180,' + x + ',' + y + ')';\r\n\r\n shapeAttr.direction = direction;\r\n shapeAttr.rotate = rotate;\r\n this.drawSvgShape(options, shapeAttr);\r\n\r\n break;\r\n\r\n case \"cross\":\r\n\r\n var direction = \"M\" + \" \" + (evt.startX + (-style.width / 2)) + \" \" + (evt.startY) + \" \" + \"L\" + \" \" + (evt.startX + (style.width / 2))\r\n + \" \" + (evt.startY) + \" \" + \"M\" + \" \" + (evt.startX) + \" \" + (evt.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (evt.startX) + \" \" +\r\n (evt.startY + (-style.height / 2)) + \"z\";\r\n\r\n shapeAttr.direction = direction;\r\n this.drawSvgShape(options, shapeAttr);\r\n\r\n break;\r\n case \"star\":\r\n\r\n var direction = \"M\" + \" \" + (evt.startX + (style.width / 3)) + \" \" + (evt.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (evt.startX + (-style.width / 2)) + \" \" +\r\n (evt.startY + (style.height / 6)) + \" \" + \"L\" + \" \" + (evt.startX + (style.width / 2)) + \" \" + (evt.startY + (style.height / 6)) + \" \" + \"L\" + \" \" + (evt.startX + (-style.width / 3)) + \" \" +\r\n (evt.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (evt.startX) + \" \" + (evt.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (evt.startX + (style.width / 3)) + \" \" + (evt.startY + (-style.height / 2)) + \"z\";\r\n\r\n shapeAttr.direction = direction;\r\n this.drawSvgShape(options, shapeAttr);\r\n\r\n break;\r\n case \"hexagon\":\r\n\r\n var direction = \"M\" + \" \" + (evt.startX + (-style.width / 2)) + \" \" + (evt.startY) + \" \" + \"L\" + \" \" + (evt.startX + (-style.width / 4)) + \" \" +\r\n (evt.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (evt.startX + (style.width / 4)) + \" \" + (evt.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" +\r\n (evt.startX + (style.width / 2)) + \" \" + (evt.startY) + \" \" + \"L\" + \" \" + (evt.startX + (style.width / 4)) + \" \" + (evt.startY + (style.height / 2)) + \" \" + \"L\" + \" \" +\r\n (evt.startX + (-style.width / 4)) + \" \" + (evt.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (evt.startX + (-style.width / 2)) + \" \" + (evt.startY) + \"z\";\r\n\r\n shapeAttr.direction = direction;\r\n this.drawSvgShape(options, shapeAttr);\r\n\r\n break;\r\n case \"wedge\":\r\n\r\n var direction = \"M\" + \" \" + (evt.startX - style.width) + \" \" + (evt.startY) + \" \" + \"L\" + \" \" + (evt.startX + style.width) + \" \" +\r\n (evt.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + (evt.startX + (3 * (style.width / 4))) + \" \" + (evt.startY) + \" \" + \"L\" + \" \" +\r\n (evt.startX + (style.width)) + \" \" + (evt.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (evt.startX - style.width) + \" \" + (evt.startY) + \"z\";\r\n\r\n shapeAttr.direction = direction;\r\n this.drawSvgShape(options, shapeAttr);\r\n\r\n break;\r\n case \"trapezoid\":\r\n\r\n var direction = \"M\" + \" \" + (evt.startX + (-style.width / 2)) + \" \" + (evt.startY) + \" \" + \"L\" + \" \" + (evt.startX + (-style.width / 2)) + \" \" +\r\n (evt.startY + (-style.height / 4)) + \" \" + \"L\" + \" \" + (evt.startX + (-style.width / 2) + (style.width)) + \" \" + (evt.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" +\r\n (evt.startX + (-style.width / 2) + (style.width)) + \" \" + (evt.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + (evt.startX + (-style.width / 2)) + \" \" + (evt.startY + (style.height / 4)) +\r\n \" \" + \"L\" + \" \" + (evt.startX + (-style.width / 2)) + \" \" + (evt.startY) + \"z\";\r\n\r\n shapeAttr.direction = direction;\r\n this.drawSvgShape(options, shapeAttr);\r\n\r\n break;\r\n case \"uparrow\":\r\n\r\n var direction = \"M\" + \" \" + ((evt.startX - (style.width / 2) + (style.width / 4))) + \" \" + (evt.startY - (style.height / 2) + (style.height)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2) + (style.width / 4))) + \" \" + (evt.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2))) + \" \" + (evt.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX)) + \" \" + (evt.startY - (style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX + (style.width / 2))) + \" \" + (evt.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX + (style.width / 2) - (style.width / 4))) + \" \" + (evt.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX + (style.width / 2) - (style.width / 4))) + \" \" + (evt.startY - (style.height / 2) + (style.height)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2) + (style.width / 4))) + \" \" + (evt.startY - (style.height / 2) + (style.height)) + \"z\";\r\n shapeAttr.direction = direction;\r\n this.drawSvgShape(options, shapeAttr);\r\n\r\n break;\r\n case \"downarrow\":\r\n\r\n var direction = \"M\" + \" \" + ((evt.startX - (style.width / 2) + (style.width / 4))) + \" \" + (evt.startY - (style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX + (style.width / 2) - (style.width / 4))) + \" \" + (evt.startY - (style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX + (style.width / 2) - (style.width / 4))) + \" \" + (evt.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX + (style.width / 2))) + \" \" + (evt.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX)) + \" \" + (evt.startY - (style.height / 2) + (style.height)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2))) + \" \" + (evt.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2) + (style.width / 4))) + \" \" + (evt.startY - (style.height / 2) + (style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2) + (style.width / 4))) + \" \" + (evt.startY - (style.height / 2)) + \"z\";\r\n shapeAttr.direction = direction;\r\n this.drawSvgShape(options, shapeAttr);\r\n\r\n break;\r\n case \"leftarrow\":\r\n\r\n var direction = \"M\" + \" \" + ((evt.startX - (style.width / 2)) + style.width) + \" \" + (evt.startY + (style.height / 4)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2)) + style.width) + \" \" + (evt.startY + (-style.height / 4)) + \" \" + \"L\" + \" \" +\r\n ((evt.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (evt.startY + (-style.height / 4)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (evt.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX -\r\n (style.width / 2))) + \" \" + (evt.startY) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (evt.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2)) + (style.width / 2)) + \" \" +\r\n (evt.startY + (style.height / 4)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2)) + style.width) + \" \" + (evt.startY + (style.height / 4)) + \"z\";\r\n\r\n shapeAttr.direction = direction;\r\n this.drawSvgShape(options, shapeAttr);\r\n\r\n break;\r\n case \"rightarrow\":\r\n\r\n var direction = \"M\" + \" \" + ((evt.startX - (style.width / 2))) + \" \" + (evt.startY + (style.height / 4)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2))) + \" \" + (evt.startY + (-style.height / 4)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (evt.startY + (-style.height / 4)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (evt.startY + (-style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2)) + style.width) + \" \" + (evt.startY) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (evt.startY + (style.height / 2)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2)) + (style.width / 2)) + \" \" + (evt.startY + (style.height / 4)) + \" \" + \"L\" + \" \" + ((evt.startX - (style.width / 2))) + \" \" + (evt.startY + (style.height / 4)) + \"z\";\r\n shapeAttr.direction = direction;\r\n this.drawSvgShape(options, shapeAttr);\r\n\r\n break;\r\n case \"pentagon\":\r\n\r\n var eq = 72;\r\n var radius = Math.sqrt(style.height * style.height + style.width * style.width) / 2;\r\n var sb = ej.EjSvgRender.utils._getStringBuilder();\r\n for (var i = 0; i <= 5; i++) {\r\n var deg = i * eq;\r\n var rad = (Math.PI / 180) * deg;\r\n var x1 = radius * Math.cos(rad);\r\n var y1 = radius * Math.sin(rad);\r\n if (i == 0)\r\n sb.append(\"M\" + \" \" + (evt.startX + x1) + \" \" + (evt.startY + y1) + \" \");\r\n else\r\n sb.append(\"L\" + \" \" + (evt.startX + x1) + \" \" + (evt.startY + y1) + \" \");\r\n }\r\n sb.append(\"z\");\r\n var direction = sb.toString();\r\n shapeAttr.direction = direction;\r\n this.drawSvgShape(options, shapeAttr);\r\n\r\n break;\r\n case \"ellipse\":\r\n $(symbol).css({\r\n \"width\": options.ShapeSize.width,\r\n \"height\": options.ShapeSize.height / 2,\r\n \"border-style\": \"solid\",\r\n \"left\": left + options.ShapeSize.height / 2 - options.Style.BorderWidth / 2,\r\n \"top\": (evt.startY + chartPos.top - options.ShapeSize.height + 4),\r\n \"background-color\": options.Style.Color,\r\n \"border-color\": options.Style.BorderColor,\r\n \"border-width\": options.Style.BorderWidth,\r\n \"-moz-border-radius\": \"50%\",\r\n \"-webkit-border-radius\": \"50%\",\r\n \"border-radius\": \"50%\",\r\n \"border-box\": \"content-box\"\r\n });\r\n break;\r\n case \"horizline\":\r\n $(symbol).css({\r\n \"width\": options.ShapeSize.width,\r\n \"height\": 0,\r\n \"border-style\": \"solid\",\r\n \"left\": left + options.ShapeSize.width / 2,\r\n \"top\": (evt.startY + chartPos.top - 1),\r\n \"border-color\": options.Style.BorderColor,\r\n \"border-width\": '2px',\r\n \"border-box\": \"content-box\"\r\n });\r\n break;\r\n case \"vertline\":\r\n $(symbol).css({\r\n \"width\": 0,\r\n \"height\": options.ShapeSize.height,\r\n \"border-style\": \"solid\",\r\n \"left\": (evt.startX + chartPos.left - 1),\r\n \"top\": top + options.ShapeSize.height / 2 - 2,\r\n \"border-color\": options.Style.BorderColor,\r\n \"border-width\": '2px',\r\n \"border-box\": \"content-box\"\r\n });\r\n break;\r\n default:\r\n $(symbol).css({\r\n \"width\": options.ShapeSize.width,\r\n \"height\": options.ShapeSize.height,\r\n \"border-style\": \"solid\",\r\n \"background-color\": options.Style.Color,\r\n \"border-color\": options.Style.BorderColor,\r\n \"border-width\": options.Style.BorderWidth,\r\n \"border-radius\": \"50px\"\r\n });\r\n break;\r\n }\r\n parentDiv[0].appendChild(symbol[0]);\r\n parent = document.getElementById(this.svgObj.id + '_CrosshairGroup') || document.getElementById(\"chartContainer_\" + this._rootId);\r\n parent.appendChild(parentDiv[0]);\r\n }\r\n }\r\n },\r\n //draw SVG Marker shape on mouse over the points\r\n drawSvgShape: function (options, attr) {\r\n var chartCanvas = document.getElementById(this._rootId + \"_canvas\");\r\n var chartPos = { left: 0, top: 0 };\r\n var svgLink = \"http://www.w3.org/2000/svg\";\r\n var svgShape = document.createElementNS(svgLink, \"svg\");\r\n svgShape.setAttribute('id', 'mySVG');\r\n svgShape.setAttribute('width', $(chartCanvas).width());\r\n svgShape.setAttribute('height', $(chartCanvas).height());\r\n $(options.symbol).css({\r\n \"left\": chartPos.left + 'px',\r\n \"top\": chartPos.top + 'px'\r\n });\r\n var attrOptions = {\r\n 'id': 'svgPath',\r\n 'fill-opacity': options.Style.Opacity,\r\n 'stroke-width': options.Style.BorderWidth,\r\n 'fill': options.Style.Color,\r\n 'transform': attr.rotate,\r\n 'stroke': options.Style.BorderColor\r\n };\r\n attrOptions.d = attr.direction;\r\n\r\n var path = document.createElementNS(svgLink, \"path\");\r\n $(path).attr(attrOptions).appendTo(svgShape);\r\n options.symbol[0].appendChild(svgShape);\r\n },\r\n drawCircle: function (options, element) {\r\n if (!options.lgndCtx) {\r\n var canvasCtx = this.ctx, dashArray;\r\n this.ctx = element != undefined ? element : this.ctx;\r\n this.ctx.save();\r\n this.ctx.beginPath();\r\n this.ctx.arc(options.cx, options.cy, options.r, 0, 2 * Math.PI);\r\n this.ctx.fillStyle = options.fill;\r\n this.ctx.globalAlpha = options.opacity;\r\n this.ctx.fill();\r\n this.ctx.lineWidth = options[\"stroke-width\"];\r\n dashArray = options[\"stroke-dasharray\"] ? options[\"stroke-dasharray\"].split(\",\") : false;\r\n if (dashArray) this.ctx.setLineDash(dashArray);\r\n this.ctx.strokeStyle = options.stroke;\r\n this.ctx.stroke();\r\n this.ctx.restore();\r\n this.ctx = canvasCtx;\r\n } else {\r\n var legendCtx = this.lgndCtx;\r\n this.lgndCtx = element != undefined ? element : this.lgndCtx;\r\n this.lgndCtx.save();\r\n this.lgndCtx.beginPath();\r\n this.lgndCtx.arc(options.cx, options.cy, options.r, 0, 2 * Math.PI);\r\n this.lgndCtx.fillStyle = options.fill;\r\n this.lgndCtx.globalAlpha = options.opacity;\r\n this.lgndCtx.fill();\r\n this.lgndCtx.lineWidth = options[\"stroke-width\"];\r\n this.lgndCtx.strokeStyle = options.stroke;\r\n this.lgndCtx.stroke();\r\n this.lgndCtx.restore();\r\n this.lgndCtx = legendCtx;\r\n }\r\n },\r\n\r\n drawPolyline: function (options, element) {\r\n\r\n this.ctx.save();\r\n this.ctx.beginPath();\r\n var points = options.points.split(\" \");\r\n for (var i = 0; i < points.length - 1; i++) {\r\n var point = points[i].split(\",\");\r\n var x = point[0];\r\n var y = point[1];\r\n if (i == 0)\r\n this.ctx.moveTo(x, y);\r\n else\r\n this.ctx.lineTo(x, y);\r\n }\r\n this.ctx.lineWidth = options[\"stroke-width\"];\r\n this.ctx.strokeStyle = options.stroke;\r\n this.ctx.stroke();\r\n this.ctx.restore();\r\n },\r\n drawPolygon: function (options, element) {\r\n\r\n },\r\n setFillAttribute: function (element, options) {\r\n\r\n },\r\n setStrokeAttribute: function (element, options) {\r\n\r\n },\r\n changePathValue: function (options) {\r\n\r\n },\r\n\r\n\r\n drawArc: function (w, h, options) {\r\n var x = 0, y = 0;\r\n\r\n },\r\n changeVMLStyle: function ($element, options) {\r\n\r\n },\r\n applyVMLStyle: function ($element, options) {\r\n\r\n },\r\n\r\n drawEllipse: function (options, element) {\r\n var canvasCtx = this.ctx;\r\n this.ctx = element != undefined ? element : this.ctx;\r\n var circumference = Math.max(options.rx, options.ry);\r\n var scaleX = options.rx / circumference;\r\n var scaleY = options.ry / circumference;\r\n if (!options.lgndCtx) {\r\n this.ctx.save();\r\n this.ctx.beginPath();\r\n this.ctx.translate(options.cx, options.cy);\r\n this.ctx.save();\r\n this.ctx.scale(scaleX, scaleY);\r\n this.ctx.arc(0, 0, circumference, 0, 2 * Math.PI, false);\r\n this.ctx.fillStyle = options.fill;\r\n this.ctx.fill();\r\n this.ctx.restore();\r\n this.ctx.lineWidth = options[\"stroke-width\"];\r\n this.ctx.strokeStyle = options.stroke;\r\n this.ctx.stroke();\r\n this.ctx.restore();\r\n this.ctx = canvasCtx;\r\n } else {\r\n this.lgndCtx.save();\r\n this.lgndCtx.beginPath();\r\n this.lgndCtx.translate(options.rx, options.ry);\r\n this.lgndCtx.scale(scaleX, scaleY);\r\n this.lgndCtx.arc(options.cx - options.rx, options.cy * 2 - options.rx, options.rx, 0, 2 * Math.PI, false);\r\n this.lgndCtx.fillStyle = options.fill;\r\n this.lgndCtx.fill();\r\n this.lgndCtx.restore();\r\n this.lgndCtx.lineWidth = options[\"stroke-width\"];\r\n this.lgndCtx.strokeStyle = options.stroke;\r\n this.lgndCtx.stroke();\r\n this.lgndCtx.restore();\r\n }\r\n },\r\n\r\n _getAttrVal: function (ele, val, option) {\r\n var value = $(ele).attr(val);\r\n if (value != null)\r\n return value;\r\n else\r\n return option;\r\n },\r\n _setAttr: function (element, attribute) {\r\n\r\n },\r\n\r\n setSpanAttr: function (options, label, element) {\r\n\r\n },\r\n\r\n //text element attributes values are replaced \r\n _textAttrReplace: function (options, label, font, $Ele) {\r\n\r\n },\r\n\r\n drawImage: function (options, element) {\r\n this.ctx.save();\r\n var renderer = this;\r\n var imageObj = new Image();\r\n imageObj.src = options.href;\r\n imageObj.onload = function () {\r\n renderer.ctx.drawImage(imageObj, options.x, options.y, options.width, options.height);\r\n }\r\n this.ctx.restore();\r\n },\r\n\r\n createDefs: function () {\r\n\r\n },\r\n\r\n createGroup: function (options) {\r\n\r\n },\r\n\r\n createText: function (options, label) {\r\n var text = document.createElement(\"div\");\r\n var diff = 1.1; // difference between svg and div element rotated text height\r\n $(text).css({\r\n \"transform\": options.rotateAngle,\r\n \"font-family\": parseFloat(options[\"font-family\"]),\r\n \"font-size\": parseFloat(options[\"font-size\"]) * diff,\r\n \"position\": \"absolute\"\r\n });\r\n if (!ej.util.isNullOrUndefined(label))\r\n text.textContent = label;\r\n return text;\r\n },\r\n\r\n\r\n //Draw clip path for each series to avoid series overlap in multiple axes zooming\r\n drawAxesBoundsClipPath: function (gSeriesGroupEle, options, invertedAxis) {\r\n var clipOptions = options;\r\n\r\n },\r\n\r\n getAttrVal: function (ele, val, option) {\r\n\r\n },\r\n\r\n hexFromRGB: function (color) {\r\n\r\n },\r\n\r\n createDelegate: function (context, handler) {\r\n\r\n },\r\n\r\n drawClipPath: function (options, element) {\r\n\r\n },\r\n\r\n drawCircularClipPath: function (options, element) {\r\n\r\n },\r\n\r\n append: function (childEle, parentEle) {\r\n $(childEle).appendTo(parentEle);\r\n },\r\n\r\n createLegendCanvas: function (element) {\r\n this.legendsvgObj = document.createElement('canvas');\r\n this._rootId = jQuery(element).attr(\"id\");\r\n this.legendsvgObj.setAttribute('id', \"legend_\" + this._rootId + '_canvas');\r\n this.lgndCtx = this.legendsvgObj.getContext(\"2d\");\r\n return this.legendsvgObj;\r\n }\r\n\r\n };\r\n})(jQuery);\r\n\r\n\r\n;\r\nej.Ej3DAxisRenderer = function () {\r\n};\r\n\r\nej.Ej3DSeriesRender = function () {\r\n};\r\n\r\n\r\nej.Ej3DChart = function () {\r\n};\r\n\r\nej.series3DTypes = {};\r\n\r\n(function ($) {\r\n\r\n ej.Ej3DAxisRenderer.prototype = {\r\n\r\n _drawAxes: function (index, axis, params) {\r\n if (axis.majorGridLines.visible)\r\n this._drawGridLines3D(axis, params);\r\n if (axis.visible && axis.majorTickLines.visible)\r\n this._renderTicks3D(axis, axis.majorTickLines.size, axis.majorTickLines.width, params);\r\n\r\n if (axis.visible) {\r\n this._drawAxisLabel(axis, params);\r\n this._drawMultiLevelLabel(index, axis, params);\r\n this._drawAxisTitle(axis);\r\n }\r\n },\r\n\r\n _drawAxisTitle: function (axis) {\r\n if (axis.title.visible) {\r\n var font = axis.title.font;\r\n this.gAxisTitleEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + \"axisTitle_\" + axis.name });\r\n var opposedPosition = axis._opposed;\r\n var size = { Width: $(this.svgObject).width(), Height: $(this.svgObject).height() },\r\n padding = 10,\r\n transform = ej.EjSvgRender.chartTransform3D.transform3D(size);\r\n transform.mViewport = size;\r\n transform.Rotation = 0;\r\n transform.Tilt = 0;\r\n transform.Depth = 100;\r\n transform.PerspectiveAngle = 90;\r\n ej.EjSvgRender.chartTransform3D.transform(transform);\r\n var result = ej.EjSvgRender.chartTransform3D.result,\r\n matrix3D = ej.Ej3DRender.prototype.matrix3D.prototype,\r\n orientation = axis.orientation.toLowerCase(),\r\n multiLevelLabelsVisible = false, currentAxis, element;\r\n\r\n for (var i = 0; i < this.model._axes.length; i++) {\r\n currentAxis = this.model._axes[i];\r\n if (currentAxis.orientation.toLowerCase() == orientation) {\r\n for (var j = 0; j < currentAxis.multiLevelLabels.length; j++) {\r\n if (currentAxis.multiLevelLabels[j].visible) {\r\n multiLevelLabelsVisible = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (orientation == \"horizontal\") {\r\n var xtitleLocation = (this.model.elementSpacing) + axis._LableMaxWidth.height;\r\n var titlesize = (ej.EjSvgRender.utils._measureText(axis.title.text, (axis.width), axis.title.font).height / 2);\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { Text: axis.title.text, location: { x: (axis.width) / 2, y: (xtitleLocation + titlesize + axis.majorTickLines.size + axis.axisLine.width + this.model.wallSize + axis._multiLevelLabelHeight) }, axes: axis };\r\n this._trigger(\"axesTitleRendering\", commonEventArgs);\r\n\r\n font = axis.title.font;\r\n var x1 = commonEventArgs.data.location.x + axis.x;\r\n var y1 = (opposedPosition) ? (axis.y - commonEventArgs.data.location.y) : (commonEventArgs.data.location.y + axis.y);\r\n\r\n element = { Width: titlesize.width, Height: titlesize.height, Label: commonEventArgs.data, TextAnchor: 'middle', tag: 'text', font: font, id: this.svgObject.id + \"axisTitle\", child: this.chart3D };\r\n if (!multiLevelLabelsVisible)\r\n this.graphics.addVisual(this.polygon.createTextElement(this.vector.vector3D(x1, y1, 0), element, 10, 10));\r\n else {\r\n\r\n var options = {\r\n 'id': this.svgObject.id + \"axisTitle\",\r\n 'x': x1,\r\n 'y': y1,\r\n 'fill': font.color,\r\n 'font-size': font.size,\r\n 'font-family': font.fontFamily,\r\n 'font-style': font.fontStyle,\r\n 'font-weight': font.fontWeight,\r\n 'opacity': font.opacity,\r\n 'text-anchor': \"middle\"\r\n };\r\n var newOptions = ej.EjSvgRender.chartTransform3D.toScreen({ x: x1, y: y1, z: 0 }, transform, result, matrix3D);\r\n options.x = newOptions.x; options.y = newOptions.y;\r\n this.svgRenderer.drawText(options, commonEventArgs.data.Text, this.gAxisTitleEle);\r\n this.svgRenderer.append(this.gAxisTitleEle, this.svgObject);\r\n }\r\n }\r\n else {\r\n var titleSize = ej.EjSvgRender.utils._measureText(axis.title.text, (axis.height), axis.title.font);\r\n var x1 = (opposedPosition) ? axis.x + ((4 * this.model.elementSpacing) + axis._LableMaxWidth.width + axis.majorTickLines.size + axis.axisLine.width + this.model.wallSize + axis._multiLevelLabelHeight) : axis.x - ((3 * this.model.elementSpacing) + axis._LableMaxWidth.width + axis.majorTickLines.size + axis.axisLine.width + this.model.wallSize + axis._multiLevelLabelHeight);\r\n\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { Text: axis.title.text, location: { x: titleSize.width / 2, y: 0 }, axes: axis };\r\n this._trigger(\"axesTitleRendering\", commonEventArgs);\r\n\r\n font = axis.title.font;\r\n var y1 = commonEventArgs.data.location.y + (axis.y + axis.height) + (((axis.height) / 2) * -1);\r\n\r\n var labelRotation = (opposedPosition) ? 90 : -90;\r\n var value = opposedPosition ? 25 : -25;\r\n element = { Width: titleSize.width, Height: titleSize.height, Angle: -90, Label: commonEventArgs.data, TextAnchor: 'middle', tag: 'text', font: font, id: this.svgObject.id + '_YAxisTitle', child: this.chart3D };\r\n if (!multiLevelLabelsVisible)\r\n this.graphics.addVisual(this.polygon.createTextElement(this.vector.vector3D(x1, y1, 0), element, 10, 10));\r\n else {\r\n\r\n var options = {\r\n 'id': id,\r\n 'x': x1,\r\n 'y': y1,\r\n 'fill': font.color,\r\n 'font-size': font.size,\r\n 'font-family': font.fontFamily,\r\n 'font-style': font.fontStyle,\r\n 'font-weight': font.fontWeight,\r\n 'opacity': font.opacity,\r\n 'text-anchor': \"middle\",\r\n 'transform': 'rotate(' + -90 + ',' + (x1) + ',' + (opposedPosition ? y1 + padding : y1 - padding) + ')',\r\n };\r\n var newOptions = ej.EjSvgRender.chartTransform3D.toScreen({ x: x1, y: y1, z: 0 }, transform, result, matrix3D);\r\n options.x = newOptions.x + value; options.y = newOptions.y;\r\n this.svgRenderer.drawText(options, commonEventArgs.data.Text, this.gAxisTitleEle);\r\n this.svgRenderer.append(this.gAxisTitleEle, this.svgObject);\r\n }\r\n }\r\n }\r\n },\r\n\r\n _drawMultiLevelLabel: function (axisIndex, axis, params) { // to render multilevel labels\r\n // declaration\r\n this.gMultiLevelEle = this.svgRenderer.createGroup({ 'id': this.svgObject.id + '_axisMultiLevelLabels' + '_' + axisIndex });\r\n var i, j, x, y, rows, gap, labelSize, grpLabel, id, font, center, centerX, startX, startY, endX, textOptions, textOverflow, depth = 0,\r\n textCollection, borderOptions, border, style, alignment, multiLevelLabelsLength = axis.multiLevelLabels.length, model = this.model,\r\n elementSpacing = model.elementSpacing, padding = 10, x1 = 0, y1 = 0, element, anchor, topValue, bottomValue, leftValue, text, actualText,\r\n rightValue, lineTop, bottom, right, left, areaBounds = model.m_AreaBounds, textSize, visibleRange = axis.visibleRange, actual3DPosition1,\r\n wallSize = model.wallSize, opposedPosition = axis._opposed, validCross = params.axes[axis.name]._validCross, actual3DPosition2,\r\n orientation = axis.orientation.toLowerCase(), y = validCross ? axis.y : areaBounds.Y + (!opposedPosition && areaBounds.Height), alignment,\r\n x = validCross ? axis.x : areaBounds.X + (opposedPosition && areaBounds.Width), options, newOptions, vectorColl = [], l, borderWidth;\r\n\r\n var size = { Width: $(this.svgObject).width(), Height: $(this.svgObject).height() };\r\n var transform = ej.EjSvgRender.chartTransform3D.transform3D(size);\r\n transform.mViewport = size;\r\n transform.Rotation = 0;\r\n transform.Tilt = 0;\r\n transform.Depth = 100;\r\n transform.PerspectiveAngle = model.perspectiveAngle;\r\n ej.EjSvgRender.chartTransform3D.transform(transform);\r\n var result = ej.EjSvgRender.chartTransform3D.result,\r\n matrix3D = ej.Ej3DRender.prototype.matrix3D.prototype;\r\n\r\n for (var i = 0; i < multiLevelLabelsLength; i++) {\r\n grpLabel = axis.multiLevelLabels[i];\r\n id = this.svgObject.id + \"_\" + axis.name + \"MultiLevelLabels_\" + axisIndex + \"_\" + i;\r\n if (grpLabel.text != \"\" && grpLabel.visible) {\r\n level = grpLabel._level;\r\n anchor = \"middle\";\r\n font = grpLabel.font;\r\n borderWidth = grpLabel.border.width;\r\n maximumTextWidth = grpLabel.maximumTextWidth;\r\n alignment = grpLabel.textAlignment.toLowerCase();\r\n actualText = text = grpLabel.text;\r\n textOverflow = grpLabel.textOverflow.toLowerCase();\r\n textSize = ej.EjSvgRender.utils._measureText(grpLabel.text, areaBounds.Width, grpLabel.font);\r\n center = (grpLabel.end - grpLabel.start) / 2;\r\n centerX = (grpLabel.start + center - visibleRange.min) / (visibleRange.delta);\r\n startX = (grpLabel.start - visibleRange.min) / (visibleRange.delta);\r\n endX = (grpLabel.end - visibleRange.min) / (visibleRange.delta);\r\n if (axis.isInversed) {\r\n centerX = isNaN(centerX) ? 0 : 1 - centerX;\r\n startX = isNaN(startX) ? 0 : 1 - startX;\r\n endX = isNaN(endX) ? 0 : 1 - endX;\r\n }\r\n if (orientation == \"horizontal\") { // start, end and gap calculation\r\n x1 = (Math.round(axis.width * centerX)) + areaBounds.X + ((axis.plotOffset));\r\n y1 = (opposedPosition) ? (y - wallSize - (axis.majorTickLines.size) - elementSpacing - padding / 2 - axis._LableMaxWidth.height) : y + wallSize + (axis.majorTickLines.size) + elementSpacing + axis._LableMaxWidth.height;\r\n startX = (Math.round(axis.width * startX)) + areaBounds.X + ((axis.plotOffset));\r\n endX = (Math.round(axis.width * endX)) + areaBounds.X + ((axis.plotOffset));\r\n gap = maximumTextWidth ? maximumTextWidth : endX - startX - padding;\r\n } else {\r\n y1 = Math.round(axis.plotOffset + axis.y + (axis.height * (1 - centerX)));\r\n x1 = (opposedPosition) ? (axis.x + wallSize + axis.majorTickLines.size + axis.axisLine.width + elementSpacing / 2 + axis._LableMaxWidth.width + axis.multiLevelLabelHeight[level] / 2) : (x - wallSize - axis.majorTickLines.size - elementSpacing / 2 - axis._LableMaxWidth.width - axis.multiLevelLabelHeight[level] / 2);\r\n startX = Math.round(axis.plotOffset + axis.y + (axis.height * (1 - startX)));\r\n endX = Math.round(axis.plotOffset + axis.y + (axis.height * (1 - endX)));\r\n gap = maximumTextWidth ? maximumTextWidth : axis.multiLevelLabelHeight[level] + padding;\r\n }\r\n y1 = opposedPosition ? y1 - axis.prevHeight[level] : y1 + axis.prevHeight[level];\r\n\r\n if (alignment == \"far\") {\r\n x1 = x1 + gap / 2 - borderWidth / 2;\r\n anchor = \"end\";\r\n } else if (alignment == \"near\") {\r\n anchor = \"start\";\r\n x1 = x1 - (gap / 2) + (borderWidth / 2);\r\n }\r\n\r\n // to trigger event\r\n var data = ej.EjAxisRenderer.prototype._triggerMultiLevelLabelsRendering(actualText, x1, y1, textOverflow, font, grpLabel.border, this), text, actualText;\r\n text = actualText = data.text;\r\n x1 = data.location.x;\r\n y1 = data.location.y;\r\n textOverflow = data.textOverflow.toLowerCase();\r\n font = data.font;\r\n font.color = font.color ? font.color : axis.multiLevelLabelsFontColor;\r\n border = data.border;\r\n style = data.border.type.toLowerCase();\r\n borderWidth = data.border.width;\r\n\r\n options = {\r\n 'id': id,\r\n 'x': x1,\r\n 'y': y1,\r\n 'fill': font.color,\r\n 'font-size': font.size,\r\n 'font-family': font.fontFamily,\r\n 'font-style': font.fontStyle,\r\n 'font-weight': font.fontWeight,\r\n 'opacity': font.opacity,\r\n 'text-anchor': anchor\r\n };\r\n\r\n // calculation for wrap and wrapbyword\r\n if (textOverflow != \"none\")\r\n text = ej.EjAxisRenderer.prototype.textOverflowMultiLevelLabels(axis, gap, text, actualText, textOverflow, font, textSize, { x: x1, y: y1 }, null, this);\r\n if (textOverflow == \"wrap\" || textOverflow == \"wrapandtrim\") {\r\n newY = y1;\r\n for (j = 0; j < text.length; j++) {\r\n textSize = ej.EjSvgRender.utils._measureText(text[j], null, font);\r\n if (j != 0) newY = opposedPosition ? newY - textSize.height : newY + textSize.height;\r\n element = { Width: textSize.width, Height: textSize.height, Label: { \"Text\": text[j] }, TextAnchor: anchor, tag: 'text', font: font, id: id + \"_\" + j, child: this.chart3D };\r\n options.id = options.id + \"_\" + j;\r\n var newOptions = ej.EjSvgRender.chartTransform3D.toScreen({ x: x1, y: newY + padding / 2, z: 0 }, transform, result, matrix3D);\r\n options.x = newOptions.x; options.y = newOptions.y;\r\n this.svgRenderer.drawText(options, text[j], this.gMultiLevelEle);\r\n }\r\n }\r\n x1 = orientation == \"horizontal\" ? x1 : (opposedPosition ? x1 + padding : x1 - padding);\r\n\r\n //rendering multi level labels text\r\n if (textOverflow != \"wrap\" && textOverflow != \"wrapandtrim\") {\r\n element = { Width: textSize.width, Height: textSize.height, Label: { \"Text\": text }, TextAnchor: anchor, tag: 'text', font: font, id: id, child: this.chart3D };\r\n var newOptions = ej.EjSvgRender.chartTransform3D.toScreen({ x: x1, y: y1 + padding / 2, z: 0 }, transform, result, matrix3D);\r\n options.x = newOptions.x; options.y = newOptions.y;\r\n this.svgRenderer.drawText(options, text, this.gMultiLevelEle);\r\n }\r\n // storing region for multi level labels click event\r\n if (orientation == \"horizontal\")\r\n var region = { bounds: { x: startX, y: y1 - padding, height: axis.multiLevelLabelHeight[level], width: gap }, axisIndex: axisIndex, multiLevelLabel: grpLabel };\r\n else\r\n var region = { bounds: { x: x1 - width / 2 - padding / 2, y: endX, height: startX - endX, width: width }, axisIndex: axisIndex, multiLevelLabel: grpLabel };\r\n this.model.multiLevelLabelRegions.push(region);\r\n\r\n // to render border\r\n if (style != \"none\" && borderWidth > 0) {\r\n id = this.svgObject.id + \"_\" + axis.name + \"MultiLevelLabelsBorder_\" + axisIndex + \"_\" + i;\r\n var height = y1 - padding + axis.multiLevelLabelHeight[level] + padding / 2;\r\n var borderColor = grpLabel.border.color ? grpLabel.border.color : axis.multiLevelLabelsColor\r\n if (orientation == \"horizontal\") {\r\n topValue = { x1: startX, y1: y1 - padding, x2: endX, y2: y1 - padding };\r\n bottomValue = { x1: startX, y1: height, x2: endX, y2: height };\r\n leftValue = { x1: startX, y1: y1 - padding, x2: startX, y2: height };\r\n rightValue = { x1: endX, y1: y1 - padding, x2: endX, y2: height };\r\n } else {\r\n width = axis.multiLevelLabelHeight[level];\r\n topValue = { x1: x1 - width / 2 - padding / 2, y1: endX, x2: x1 + width / 2 + padding / 2, y2: endX };\r\n bottomValue = { x1: x1 - width / 2 - padding / 2, y1: startX, x2: x1 + width / 2 + padding / 2, y2: startX };\r\n leftValue = { x1: x1 - width / 2 - padding / 2, y1: endX, x2: x1 - width / 2 - padding / 2, y2: startX };\r\n rightValue = { x1: x1 + width / 2 + padding / 2, y1: endX, x2: x1 + width / 2 + padding / 2, y2: startX };\r\n }\r\n for (l = 0; l < 4; l++) {\r\n switch (l) {\r\n case 0:\r\n newId = id + \"_top\";\r\n value = topValue;\r\n break;\r\n case 1:\r\n newId = id + \"_bottom\";\r\n value = bottomValue;\r\n break;\r\n case 2:\r\n newId = id + \"_left\";\r\n value = leftValue;\r\n break;\r\n case 3:\r\n newId = id + \"_right\";\r\n value = rightValue;\r\n break;\r\n }\r\n vectorColl[0] = ej.Ej3DRender.prototype.vector3D.prototype.vector3D(value.x1, value.y1, depth);\r\n vectorColl[1] = ej.Ej3DRender.prototype.vector3D.prototype.vector3D(value.x2, value.y2, depth);\r\n actual3DPosition1 = ej.EjSvgRender.chartTransform3D.toScreen(vectorColl[0], transform, result, matrix3D);\r\n actual3DPosition2 = ej.EjSvgRender.chartTransform3D.toScreen(vectorColl[1], transform, result, matrix3D);\r\n options = {\r\n 'id': newId,\r\n 'x1': actual3DPosition1.x,\r\n 'y1': actual3DPosition1.y,\r\n 'x2': actual3DPosition2.x,\r\n 'y2': actual3DPosition2.y,\r\n 'stroke': borderColor,\r\n 'stroke-width': borderWidth\r\n };\r\n this.svgRenderer.drawLine(options, this.gMultiLevelEle);\r\n }\r\n this.svgRenderer.append(this.gMultiLevelEle, this.svgObject);\r\n }\r\n }\r\n }\r\n },\r\n\r\n _textTrim: function (maxWidth, text, font) {\r\n var textLength = text.length; var trimmedSize;\r\n var label;\r\n var textSize = ej.EjSvgRender.utils._measureText(text, this.model.m_AreaBounds.Width, font);\r\n if (textSize.width > maxWidth) {\r\n for (var k = textLength - 1; k >= 0; --k) {\r\n label = text.substring(0, k) + '...';\r\n trimmedSize = ej.EjSvgRender.utils._measureText(label, this.model.m_AreaBounds.Width, font)\r\n if (trimmedSize.width <= maxWidth) {\r\n return label;\r\n }\r\n }\r\n } else {\r\n return text;\r\n }\r\n },\r\n\r\n _textWrap: function (maxWidth, currentLabel, font) {\r\n var textCollection = currentLabel.toString().split(' ');\r\n var label = '';\r\n var labelCollection = []; var length = textCollection.length;\r\n var text = '';\r\n for (var i = 0; i < length; i++) {\r\n text = textCollection[i];\r\n if (ej.EjSvgRender.utils._measureText(label.concat(text), this.model.m_AreaBounds.Width, font).width < maxWidth) {\r\n label = label.concat((label === '' ? '' : ' ') + text);\r\n } else {\r\n if (label !== '') {\r\n labelCollection.push(this._textTrim(maxWidth, label, font));\r\n label = text;\r\n } else {\r\n labelCollection.push(this._textTrim(maxWidth, text, font));\r\n text = '';\r\n }\r\n }\r\n if (label && i === length - 1) {\r\n labelCollection.push(this._textTrim(maxWidth, label, font));\r\n }\r\n }\r\n return labelCollection;\r\n\r\n },\r\n\r\n _textWrapByLength: function (maxWidth, currentLabel, font) {\r\n var start = 0; var labelCollection = []; var tempLabel = '';\r\n currentLabel = currentLabel.toString();\r\n var maxWordLength = currentLabel.length;\r\n for (var j = 0; j <= maxWordLength; j++) {\r\n tempLabel = start == 0 ? currentLabel.slice(start, j) : '-' + currentLabel.slice(start, j);\r\n if (ej.EjSvgRender.utils._measureText(tempLabel, this.model.m_AreaBounds.Width, font).width > maxWidth - 5) {\r\n labelCollection.push(tempLabel);\r\n start = j++;\r\n } else if (j === maxWordLength) {\r\n labelCollection.push(tempLabel);\r\n }\r\n }\r\n return labelCollection;\r\n },\r\n\r\n _multipleRows: function (length, currentX, currentLabel, axis) {\r\n var label, pointX, labelSize;\r\n var store = [];\r\n var isMultiRows;\r\n\r\n for (var i = length - 1; i >= 0; i--) {\r\n label = axis.visibleLabels[i];\r\n labelSize = ej.EjSvgRender.utils._measureText(label.Text, this.model.m_AreaBounds.Width, axis.font);\r\n pointX = ej.EjSvgRender.utils._valueToCoefficient(axis, i) * axis.width + axis.x\r\n isMultiRows = currentX < (pointX + labelSize.width / 2);\r\n if (isMultiRows) {\r\n label.index = label.index ? label.index : 0;\r\n store.push(label.index);\r\n currentLabel.index = (currentLabel.index > label.index) ? currentLabel.index : label.index + 1;\r\n } else {\r\n currentLabel.index = store.indexOf(label.index) > - 1 ? currentLabel.index : label.index;\r\n }\r\n }\r\n },\r\n\r\n _drawAxisLabel: function (axis, params) {\r\n var labels = []; var angleValue = null; var extraHeight = 0;\r\n var labelsCount = axis.visibleLabels.length,\r\n areaBounds = this.model.m_AreaBounds,\r\n opposedPosition = axis._opposed, element,\r\n validCross = params.axes[axis.name]._validCross,\r\n y = validCross ? axis.y : areaBounds.Y + (!opposedPosition && areaBounds.Height),\r\n x = validCross ? axis.x : areaBounds.X + (opposedPosition && areaBounds.Width);\r\n\r\n for (var i = 0; i < labelsCount; i++) {\r\n if (!ej.util.isNullOrUndefined(axis.visibleLabels[i].Text)) {\r\n var x1 = 0, y1 = 0, x2 = 0, y2 = 0; var pointX; var previousVisblelabel;\r\n axis.visibleLabels[i].originalText = axis.visibleLabels[i].Text;\r\n var textAnchor;\r\n\r\n var textSize = ej.EjSvgRender.utils._measureText(axis.visibleLabels[i].Text, this.model.m_AreaBounds.Width, axis.font);\r\n var value = (axis.visibleLabels[i].Value - axis.visibleRange.min) / (axis.visibleRange.delta);\r\n value = (axis.isInversed) ? 1 - value : value;\r\n value = isNaN(value) ? 0 : value;\r\n\r\n if (axis.orientation.toLowerCase() == \"horizontal\") {\r\n x2 = x1 = (Math.round(axis.width * value)) + this.model.m_AreaBounds.X + ((axis.plotOffset));\r\n y1 = (opposedPosition) ? (y - this.model.wallSize - (axis.majorTickLines.size) - (this.model.elementSpacing / 2)) : y + this.model.wallSize + (axis.majorTickLines.size) + this.model.elementSpacing;\r\n textAnchor = \"middle\"\r\n }\r\n else {\r\n y1 = y2 = Math.round(axis.plotOffset + axis.y + (textSize.height / 4) + (axis.height * (1 - value)));\r\n x1 = (opposedPosition) ? (axis.x + axis.majorTickLines.size + axis.axisLine.width + this.model.elementSpacing / 2) : (x - this.model.wallSize - axis.majorTickLines.size - this.model.elementSpacing / 2);\r\n textAnchor = (opposedPosition) ? \"start\" : \"end\"\r\n }\r\n labels.push({ x: x1, y: y1, size: textSize })\r\n var maxWidth = axis.width / axis.visibleLabels.length - 5;\r\n var label = labels[i];\r\n if (((label.x - label.size.width / 2 < axis.x && i === 0) || (label.x + label.size.width / 2 > axis.x + axis.width && i === axis.visibleLabels.length - 1)) && axis.labelIntersectAction != 'trim' && axis.labelIntersectAction.indexOf('wrap') < 0) {\r\n if (axis.edgeLabelPlacement === 'hide') {\r\n continue;\r\n } else if (axis.edgeLabelPlacement === 'shift') {\r\n if (i == 0) {\r\n label.x = x1 = axis.x + label.size.width / 2;\r\n } else if (i == axis.visibleLabels.length - 1) {\r\n label.x = x1 = axis.x + axis.width - label.size.width / 2;\r\n }\r\n\r\n }\r\n }\r\n\r\n //angle rotation and label intersect actions for 3d-chart\r\n if (axis.orientation.toLowerCase() == 'horizontal') {\r\n if (axis.labelRotation) {\r\n angleValue = axis.labelRotation;\r\n var rotatedSize = ej.EjSvgRender.utils.rotatedLabel(axis, this, axis.labelRotation, axis.visibleLabels[i].Text, true);\r\n y1 += rotatedSize.height / 2;\r\n } else {\r\n if (axis.labelIntersectAction == 'trim') {\r\n axis.visibleLabels[i].Text = this._textTrim(maxWidth, axis.visibleLabels[i].Text, axis.font);\r\n } else if (axis.labelIntersectAction == 'wrapByWord') {\r\n axis.visibleLabels[i].Text = this._textWrap(maxWidth, axis.visibleLabels[i].Text, axis.font);\r\n } else if (axis.labelIntersectAction == 'wrap') {\r\n axis.visibleLabels[i].Text = this._textWrapByLength(maxWidth, axis.visibleLabels[i].Text, axis.font);\r\n } else if (axis.labelIntersectAction == 'rotate45' || axis.labelIntersectAction == 'rotate90') {\r\n angleValue = axis.labelIntersectAction.indexOf('45') > -1 ? 45 : 90;\r\n var rotatedSize = ej.EjSvgRender.utils.rotatedLabel(axis, this, angleValue, axis.visibleLabels[i].Text, true);\r\n y1 += rotatedSize.height / 2;\r\n } else if (axis.labelIntersectAction === 'multipleRows') {\r\n pointX = label.x\r\n pointX -= textSize.width / 2;\r\n this._multipleRows(i, pointX, axis.visibleLabels[i], axis);\r\n y1 = axis.visibleLabels[i].index ? y1 + axis.visibleLabels[i].index * (textSize.height + 5) : y1;\r\n } else if (axis.labelIntersectAction === 'hide') {\r\n previousVisblelabel = previousVisblelabel ? previousVisblelabel : 0;\r\n if (i != 0) {\r\n if (labels[previousVisblelabel].x + labels[previousVisblelabel].size.width / 2 >= labels[i].x - labels[i].size.width / 2) {\r\n continue;\r\n }\r\n }\r\n previousVisblelabel = i;\r\n }\r\n }\r\n }\r\n\r\n element = { Width: textSize.width, Height: textSize.height, Label: axis.visibleLabels[i], TextAnchor: textAnchor, tag: 'text', font: axis.font, id: this.svgObject.id + axis.orientation + i, child: this.chart3D, Angle: angleValue };\r\n\r\n this.graphics.addVisual(this.polygon.createTextElement(this.vector.vector3D(x1, y1, 0), element, 10, 10));\r\n }\r\n }\r\n\r\n },\r\n\r\n _renderTicks3D: function (axis, size, width, params) {\r\n var labelsCount = axis.visibleLabels.length,\r\n parent,\r\n gEle,\r\n m_AreaBounds = this.model.m_AreaBounds,\r\n y = axis.y;\r\n\r\n for (var i = 0; i < labelsCount; i++) {\r\n var x1 = 0, x2 = 0, y1 = 0, y2 = 0;\r\n\r\n\r\n var value = (axis.visibleLabels[i].Value - axis.visibleRange.min) / (axis.visibleRange.delta);\r\n value = (axis.isInversed) ? 1 - value : value;\r\n value = isNaN(value) ? 0 : value;\r\n\r\n if (axis.orientation.toLowerCase() == \"horizontal\") {\r\n x2 = x1 = (Math.round(axis.width * value)) + m_AreaBounds.X + ((axis.plotOffset));\r\n }\r\n else {\r\n y1 = y2 = Math.round(axis.plotOffset + ((axis.height) * (1 - value)) + axis.y);\r\n }\r\n\r\n var position = this._calculatePosition3D(axis, axis.tickLinesPosition, size, width, x1, y1, x2, y2, params);\r\n\r\n\r\n var line = { width: axis.majorTickLines.width, stroke: axis.majorTickLines.color, child: this.chart3D, tag: 'line' };\r\n\r\n line.id = this.svgObject.id + axis.name + \"_majorTickLines_\" + i;\r\n\r\n this.graphics.addVisual(this.polygon.createLine(line, position.X1, position.Y1, position.X2, position.Y2, 0));\r\n\r\n if (axis.minorGridLines.visible && axis.minorTicksPerInterval > 0 && i < labelsCount - 1) {\r\n minorTicks = axis.visibleRange.interval / (axis.minorTicksPerInterval + 1);\r\n for (var k = 0; k < axis.minorTicksPerInterval; k++) {\r\n value = ej.EjSvgRender.utils._valueToCoefficient(axis, axis.visibleLabels[i].Value + (minorTicks * (k + 1)));\r\n\r\n value = isNaN(value) ? 0 : value;\r\n\r\n if (axis.orientation.toLowerCase() == \"horizontal\") {\r\n x1 = x2 = Math.round(axis.plotOffset + (m_AreaBounds.Width * value) + m_AreaBounds.X);\r\n }\r\n else {\r\n y1 = y2 = Math.round(axis.plotOffset + ((m_AreaBounds.Height) * (1 - value))) + axis.y;\r\n }\r\n\r\n var position = this._calculatePosition3D(axis, axis.tickLinesPosition, size, width, x1, y1, x2, y2, params);\r\n\r\n\r\n var line = { width: axis.minorTickLines.width, stroke: axis.minorTickLines.color, child: this.chart3D, tag: 'line' };\r\n\r\n line.id = this.svgObject.id + axis.name + \"_minorTickLines_\" + i + k;\r\n\r\n this.graphics.addVisual(this.polygon.createLine(line, position.X1, position.Y1, position.X2, position.Y2, 0));\r\n }\r\n }\r\n }\r\n },\r\n\r\n _calculatePosition3D: function (axis, ticksPosition, tickSize, width, x1, y1, x2, y2, params) {\r\n var orientation = axis.orientation;\r\n var isOpposed = axis._opposed,\r\n ticksPosition = \"outside\",\r\n areaBounds = this.model.m_AreaBounds,\r\n validCross = params.axes[axis.name]._validCross,\r\n y = validCross ? axis.y : areaBounds.Y + (!isOpposed && areaBounds.Height),\r\n x = validCross ? axis.x : areaBounds.X + (isOpposed && areaBounds.Width);\r\n if (axis.orientation.toLowerCase() == \"horizontal\") {\r\n switch (ticksPosition) {\r\n case \"inside\":\r\n y1 = isOpposed ? width : 0;\r\n y2 = isOpposed ? y1 + tickSize : tickSize;\r\n break;\r\n case \"outside\":\r\n y1 = 0;\r\n y2 = isOpposed ? tickSize : y1 + tickSize;\r\n break;\r\n }\r\n var screenPositionTop = ((isOpposed) ? y - this.model.wallSize - (tickSize) : y + this.model.wallSize - (tickSize / 2));\r\n var screenPositionLeft = axis.x;\r\n y1 += screenPositionTop;\r\n y2 += screenPositionTop;\r\n\r\n x1 = x2 = x1;\r\n }\r\n else {\r\n switch (ticksPosition) {\r\n case \"inside\":\r\n x1 = 0;\r\n x2 = isOpposed ? tickSize : x1 + tickSize;\r\n break;\r\n case \"outside\":\r\n x1 = 0;\r\n x2 = isOpposed ? x1 + tickSize : tickSize;\r\n break;\r\n }\r\n var screenPositionLeft = (isOpposed) ? x + this.model.wallSize : (x - this.model.wallSize - tickSize);\r\n var screenPositionTop = this.model.m_AreaBounds.Y;\r\n x1 += screenPositionLeft;\r\n x2 += screenPositionLeft;\r\n\r\n y1 = y2 = y1;\r\n }\r\n return { X1: x1, Y1: y1, X2: x2, Y2: y2 };\r\n },\r\n\r\n\r\n\r\n _drawGridLines3D: function (axis, params) {\r\n if (axis == null)\r\n return;\r\n\r\n var labelsCount = axis.visibleLabels.length,\r\n minorTicks, opposedPosition = axis._opposed,\r\n orientation = axis.orientation, validCross = params.axes[axis.name]._validCross,\r\n x1, x2, y1, y2, index;\r\n if (orientation.toLowerCase() == \"horizontal\") {\r\n\r\n var i;\r\n for (i = 0; i < labelsCount; i++) {\r\n var value = ej.EjSvgRender.utils._valueToCoefficient(axis, axis.visibleLabels[i].Value);\r\n value = isNaN(value) ? 0 : value;\r\n x2 = x1 = (Math.round(axis.width * value)) + this.model.m_AreaBounds.X + axis.plotOffset;\r\n y1 = this.model.m_AreaBounds.Y;\r\n y2 = this.model.m_AreaBounds.Y + this.model.m_AreaBounds.Height;\r\n\r\n\r\n var depth = this.model.depth > 2 ? this.model.depth - 2 : 1;\r\n var bottom = validCross ? axis.y : this.model.m_AreaBounds.Y + (!opposedPosition && this.model.m_AreaBounds.Height);\r\n\r\n var line = { opacity: axis.majorGridLines.opacity, width: axis.majorGridLines.width, stroke: axis.majorGridLines.color, child: this.chart3D, tag: 'line' };\r\n line.id = this.svgObject.id + axis.name + \"_gridlines_\" + i;\r\n this.graphics.addVisual(this.polygon.createLine(line, x1, y1, x2, y2, depth));\r\n var parallelLine = $.extend({}, line);\r\n parallelLine.id = this.svgObject.id + axis.name + \"_parallelGridlines_\" + i;\r\n\r\n var line3D = this.polygon.createLine(parallelLine, x2, 0, x2, -depth, bottom);\r\n //To fold the gridline alone the wall(bottom)\r\n this.polygon.transform(this.matrixobj.tilt((parseFloat)(Math.PI / 2)), line3D);\r\n\r\n this.graphics.addVisual(line3D);\r\n\r\n if (axis.minorGridLines.visible && axis.minorTicksPerInterval > 0 && i < labelsCount - 1) {\r\n minorTicks = axis.visibleRange.interval / (axis.minorTicksPerInterval + 1);\r\n for (var k = 0; k < axis.minorTicksPerInterval; k++) {\r\n value = ej.EjSvgRender.utils._valueToCoefficient(axis, axis.visibleLabels[i].Value + (minorTicks * (k + 1)));\r\n value = isNaN(value) ? 0 : value;\r\n x2 = x1 = (Math.round(this.model.m_AreaBounds.Width * value) + this.model.m_AreaBounds.X);\r\n y1 = this.model.m_AreaBounds.Y;\r\n y2 = this.model.m_AreaBounds.Y + this.model.m_AreaBounds.Height;\r\n\r\n var line = { opacity: axis.minorGridLines.opacity, width: axis.minorGridLines.width, stroke: axis.minorGridLines.color, child: this.chart3D, tag: 'line' };\r\n line.id = this.svgObject.id + axis.name + \"_minorgridlines_\" + i + k;\r\n this.graphics.addVisual(this.polygon.createLine(line, x1, y1, x2, y2, depth));\r\n var parallelLine = $.extend({}, line);\r\n parallelLine.id = this.svgObject.id + axis.name + \"_parallelMinorGridlines_\" + i + k;\r\n\r\n var line3D = this.polygon.createLine(parallelLine, x2, 0, x2, -depth, bottom);\r\n //To fold the gridline alone the wall(bottom)\r\n this.polygon.transform(this.matrixobj.tilt((parseFloat)(Math.PI / 2)), line3D);\r\n\r\n this.graphics.addVisual(line3D);\r\n }\r\n }\r\n\r\n index++;\r\n }\r\n }\r\n else {\r\n var i;\r\n\r\n\r\n for (i = 0; i < labelsCount; i++) {\r\n //if (i < linesCount)\r\n //{\r\n var line;\r\n var value = (axis.visibleLabels[i].Value - axis.visibleRange.min) / (axis.visibleRange.delta);\r\n value = (axis.isInversed) ? 1 - value : value;\r\n value = isNaN(value) ? 0 : value;\r\n x1 = this.model.m_AreaBounds.X;\r\n y1 = Math.round((axis.height) * (1 - value)) + 0.5;\r\n y1 += axis.y;\r\n x2 = x1 + this.model.m_AreaBounds.Width;\r\n y2 = y1;\r\n\r\n var depth = this.model.depth > 2 ? this.model.depth - 2 : 1;\r\n\r\n var line = { opacity: axis.majorGridLines.opacity, width: axis.majorGridLines.width, stroke: axis.majorGridLines.color, axisName: axis.name, child: this.chart3D, tag: 'line' };\r\n\r\n line.id = this.svgObject.id + axis.name + \"_gridlines_\" + i;\r\n\r\n this.graphics.addVisual(this.polygon.createLine(line, x1, y1, x2, y2, depth));\r\n\r\n var depthD = validCross ? axis.x : this.model.m_AreaBounds.X + (opposedPosition && this.model.m_AreaBounds.Width + 1);\r\n\r\n var sideLine = $.extend({}, line);\r\n sideLine.id = this.svgObject.id + axis.name + \"_parallelGridlines_\" + i;\r\n\r\n var line3D = this.polygon.createLine(sideLine, -depth, y2, 0, y2, depthD);\r\n //To fold the gridline alone the wall(right of vertical)\r\n this.polygon.transform(this.matrixobj.turn((parseFloat)(-Math.PI / 2)), line3D);\r\n this.graphics.addVisual(line3D);\r\n\r\n if (axis.minorGridLines.visible && axis.minorTicksPerInterval > 0 && i < labelsCount - 1) {\r\n minorTicks = axis.visibleRange.interval / (axis.minorTicksPerInterval + 1);\r\n for (var k = 0; k < axis.minorTicksPerInterval; k++) {\r\n var value = ej.EjSvgRender.utils._valueToCoefficient(axis, axis.visibleLabels[i].Value + (minorTicks * (k + 1)));\r\n value = isNaN(value) ? 0 : value;\r\n x1 = this.model.m_AreaBounds.X;\r\n y1 = Math.round((axis.height) * (1 - value)) + 0.5;\r\n y1 += axis.y;\r\n x2 = x1 + this.model.m_AreaBounds.Width;\r\n y2 = y1;\r\n var line = { opacity: axis.minorGridLines.opacity, width: axis.minorGridLines.width, stroke: axis.minorGridLines.color, axisName: axis.name, child: this.chart3D, tag: 'line' };\r\n\r\n line.id = this.svgObject.id + axis.name + \"_minorgridlines_\" + i + k;\r\n\r\n this.graphics.addVisual(this.polygon.createLine(line, x1, y1, x2, y2, depth));\r\n\r\n var sideLine = $.extend({}, line);\r\n sideLine.id = this.svgObject.id + axis.name + \"_parallelMinorGridlines_\" + i + k;\r\n\r\n var line3D = this.polygon.createLine(sideLine, -depth, y2, 0, y2, depthD);\r\n //To fold the gridline alone the wall(right of vertical)\r\n this.polygon.transform(this.matrixobj.turn((parseFloat)(-Math.PI / 2)), line3D);\r\n this.graphics.addVisual(line3D);\r\n }\r\n }\r\n\r\n ////}\r\n index++;\r\n }\r\n\r\n }\r\n }\r\n\r\n },\r\n\r\n\r\n\r\n ej.Ej3DSeriesRender.prototype = {\r\n _getSegmentDepth: function (series) {\r\n var actualDepth = this.chartObj.model.depth;\r\n var start, end;\r\n\r\n if (this.chartObj.model._sideBySideSeriesPlacement) {\r\n var space = actualDepth / 4;\r\n start = space;\r\n end = space * 3;\r\n }\r\n else {\r\n var index = series.position - 1;\r\n var count = series.all;\r\n var space = actualDepth / ((count * 2) + count + 1);\r\n start = space + (space * index * 3);\r\n end = start + space * 2;\r\n }\r\n return { Start: start, End: end, Delta: end - start };\r\n },\r\n\r\n createSegment: function (center, start, end, height, r, i, y, insideRadius, pointindex) {\r\n\r\n return {\r\n StartValue: start,\r\n EndValue: end,\r\n depth: height,\r\n radius: r,\r\n index: i,\r\n YData: y,\r\n Center: center,\r\n inSideRadius: insideRadius,\r\n ActualEndValue: end,\r\n ActualStartValue: start,\r\n pointIndex: pointindex\r\n }\r\n\r\n return segment;\r\n\r\n },\r\n\r\n calculateSize: function (sender, series) {\r\n var legend = sender.chartObj.model.legend;\r\n\r\n var legXSpace = 0;\r\n var legYSpace = 0,\r\n title = sender.chartObj.model.title,\r\n subTitle = sender.chartObj.model.title.subTitle,\r\n titleLocation = sender.chartObj.model._titleLocation,\r\n subTitleLocation = sender.chartObj.model._subTitleLocation,\r\n titleTextOverflow = sender.chartObj.model.title.textOverflow,\r\n subTitleTextOverflow = sender.chartObj.model.title.subTitle.textOverflow,\r\n titleEnable = (title.text && title.visible && title.enableTrim && (titleTextOverflow == 'wrap' || titleTextOverflow == 'wrapandtrim')) ? true : false,\r\n subTitleEnable = (subTitle.text && subTitle.visible && subTitle.enableTrim && (subTitleTextOverflow == 'wrap' || subTitleTextOverflow == 'wrapandtrim')) ? true : false;\r\n if (legend.visible && legend.position.toLowerCase() != \"custom\") {\r\n if (legend.position.toLowerCase() == \"right\" || legend.position.toLowerCase() == \"left\")\r\n legXSpace = ((legend.position.toLowerCase() == \"right\") ? sender.chartObj.model.margin.right : sender.chartObj.model.margin.left) + sender.chartObj.model.LegendViewerBounds.Width;\r\n else\r\n legYSpace = ((legend.position.toLowerCase() == \"top\") ? sender.chartObj.model.margin.top : sender.chartObj.model.margin.bottom) + sender.chartObj.model.LegendViewerBounds.Height;\r\n\r\n }\r\n series.actualWidth = $(sender.chartObj.svgObject).width() - legXSpace;\r\n var centerx = series.actualWidth * 0.5 + ((legend.position.toLowerCase() === \"left\") ? legXSpace : 0);\r\n if (titleEnable || subTitleEnable) {\r\n var yOffset = titleLocation.size.height + (subTitleEnable ? subTitleLocation.size.height : 0) + legYSpace;\r\n series.actualHeight = $(sender.chartObj.svgObject).height() - yOffset;\r\n var centery = series.actualHeight * 0.5 + ((legend.position.toLowerCase() === \"top\") ? yOffset : titleLocation.size.height + (subTitleEnable ? subTitleLocation.size.height : 0));\r\n }\r\n else {\r\n var yOffset = ((title.text && title.visible) ? titleLocation.Y : 0) + legYSpace;\r\n series.actualHeight = $(sender.chartObj.svgObject).height() - yOffset;\r\n var centery = series.actualHeight * 0.5 + ((legend.position.toLowerCase() === \"top\") ? yOffset : ((title.text && title.visible) ? (titleLocation.Y) : 0));\r\n }\r\n return { centerX: centerx, centerY: centery };\r\n },\r\n\r\n createPoints: function (series, sender) {\r\n series.segments = [];\r\n var size = this.calculateSize(sender, series),\r\n all = 0,\r\n visiblepoints = this._calculateVisiblePoints(series).visiblePoints,\r\n count = series._visiblePoints.length;\r\n for (var j = 0; j < count; j++)\r\n all += visiblepoints[j].YValues[0];\r\n var coef = 360 / all,\r\n seriesIndex = $.inArray(series, sender.chartObj.model._visibleSeries),\r\n seriesLength = this.chartObj.model._visibleSeries.length,\r\n InsideRadius = sender.chartObj.model.innerRadius[seriesIndex],\r\n YValues = sender.chartObj._getYValues(series._visiblePoints),\r\n pieHeight = sender.chartObj.model.depth, center,\r\n arcStartAngle = 0, arcEndAngle = 0,\r\n current = 0, pointindex, val, rect, offset, segment,\r\n segindex = 0,\r\n radius = sender.chartObj.model.circularRadius[seriesIndex];\r\n\r\n for (var i = 0; i < count; i++) {\r\n if (series._visiblePoints[i].visible || series._visiblePoints[i].gapMode) {\r\n pointindex = $.inArray(series._visiblePoints[i], series._visiblePoints);\r\n val = Math.abs(YValues[i]);\r\n arcEndAngle = Math.abs(val) * ((Math.PI * 2) / all);\r\n rect = {};\r\n rect.x = 0;\r\n rect.y = 0;\r\n\r\n if (val != 0) {\r\n if (series.explodeIndex == series._visiblePoints[i].actualIndex || series.explodeAll) {\r\n offset = { X: 0, Y: 0 };\r\n offset.X = Math.cos(2 * Math.PI * (current + val / 2) / all),\r\n offset.Y = Math.sin(2 * Math.PI * (current + val / 2) / all);\r\n rect.x = 0.01 * radius * offset.X * series.explodeOffset;\r\n rect.y = 0.01 * radius * offset.Y * series.explodeOffset;\r\n }\r\n\r\n center = sender.chartObj.vector.vector3D(rect.x + size.centerX, rect.y + size.centerY, 0);\r\n {\r\n segment = this.createSegment(center, (parseFloat)(coef * current), (parseFloat)(coef * val), pieHeight, radius, i, val, InsideRadius, pointindex, series);\r\n if (series._visiblePoints[i].gapMode)\r\n segment.visible = false;\r\n else\r\n segment.visible = true;\r\n series.segments.push(segment);\r\n }\r\n }\r\n\r\n if (series.marker.dataLabel.visible)\r\n this._addPieDataLabel(segindex, YValues[i], arcStartAngle, arcStartAngle + arcEndAngle, i, radius, this._isChartRotated(sender) ? sender.chartObj.model.depth + 5 : 0, center, series._visiblePoints[i]);\r\n\r\n segindex++;\r\n arcStartAngle += arcEndAngle;\r\n current += val;\r\n\r\n }\r\n }\r\n return series.segments;\r\n },\r\n\r\n _addPieDataLabel: function (x, y, startAngle, endAngle, i, radius, startDepth, center, point) {\r\n var angle = (startAngle + endAngle) / 2;\r\n point.symbolLocation = { x: 0, y: 0, radius: 0, angle: 0, StartDepth: 0 };\r\n point.symbolLocation.x = x;\r\n point.symbolLocation.y = y;\r\n point.symbolLocation.radius = radius;\r\n point.symbolLocation.angle = angle;\r\n point.symbolLocation.center = center;\r\n point.startDepth = startDepth;\r\n },\r\n\r\n _isChartRotated: function (sender) {\r\n var actualTiltView = Math.abs(sender.chartObj.model.tilt % 360);\r\n var actualRotateView = Math.abs(sender.chartObj.model.rotattion % 360);\r\n if ((actualTiltView > 90 && actualTiltView < 270) ^ (actualRotateView > 90 && actualRotateView < 270)) {\r\n return true;\r\n }\r\n return false;\r\n },\r\n\r\n createSector: function (seg, sender, style, seriesIndex) {\r\n var count = (parseInt)(Math.ceil(seg.ActualEndValue / 6));\r\n var DtoR = Math.PI / 180;\r\n var inc = 0;\r\n var Points = [];\r\n var depth = sender.chartObj.model.depth;\r\n if (count < 1) return null;\r\n var res = [];\r\n var f = seg.ActualEndValue / count;\r\n\r\n var oPts = [];\r\n var iPts = [];\r\n\r\n for (var i = 0; i < count + 1; i++) {\r\n var ox = (parseFloat)(seg.Center.x + seg.radius * Math.cos((seg.ActualStartValue + i * f) * DtoR));\r\n var oy = (parseFloat)(seg.Center.y + seg.radius * Math.sin((seg.ActualStartValue + i * f) * DtoR));\r\n\r\n oPts[i] = { X: ox, Y: oy };\r\n\r\n var ix = (parseFloat)(seg.Center.x + seg.inSideRadius * Math.cos((seg.ActualStartValue + i * f) * DtoR));\r\n var iy = (parseFloat)(seg.Center.y + seg.inSideRadius * Math.sin((seg.ActualStartValue + i * f) * DtoR));\r\n\r\n iPts[i] = { X: ix, Y: iy };\r\n Points.push({ X: ox, Y: oy });\r\n }\r\n\r\n var oPlgs = [], vts;\r\n\r\n for (var i = 0; i < count; i++) {\r\n vts = new Array(sender.chartObj.vector.vector3D(oPts[i].X, oPts[i].Y, 0),\r\n sender.chartObj.vector.vector3D(oPts[i].X, oPts[i].Y, depth),\r\n sender.chartObj.vector.vector3D(oPts[i + 1].X, oPts[i + 1].Y, depth),\r\n sender.chartObj.vector.vector3D(oPts[i + 1].X, oPts[i + 1].Y, 0))\r\n\r\n\r\n oPlgs[i] = sender.chartObj.polygon.polygon3D(vts, this, seg.index, style.borderColor, style.borderWidth, style.opacity, style.interior, inc.toString() + \"_Region\" + \"_Series_\" + seriesIndex + \"_Point_\" + seg.index, sender.chartObj.chart3D);\r\n inc++;\r\n }\r\n\r\n res[1] = oPlgs;\r\n\r\n if (seg.inSideRadius > 0) {\r\n var iPlgs = [];\r\n\r\n for (var i = 0; i < count; i++) {\r\n vts = new Array(sender.chartObj.vector.vector3D(iPts[i].X, iPts[i].Y, 0),\r\n sender.chartObj.vector.vector3D(iPts[i].X, iPts[i].Y, depth),\r\n sender.chartObj.vector.vector3D(iPts[i + 1].X, iPts[i + 1].Y, depth),\r\n sender.chartObj.vector.vector3D(iPts[i + 1].X, iPts[i + 1].Y, 0))\r\n\r\n\r\n iPlgs[i] = sender.chartObj.polygon.polygon3D(vts, this, seg.index, style.borderColor, style.borderWidth, style.opacity, style.interior, inc.toString() + \"_Region\" + \"_Series_\" + seriesIndex + \"_Point_\" + seg.index, sender.chartObj.chart3D);\r\n inc++;\r\n }\r\n\r\n res[3] = iPlgs;\r\n }\r\n\r\n var tVtxs = [];\r\n var bVtxs = [];\r\n\r\n for (var i = 0; i < count + 1; i++) {\r\n tVtxs.push(sender.chartObj.vector.vector3D(oPts[i].X, oPts[i].Y, 0));\r\n bVtxs.push(sender.chartObj.vector.vector3D(oPts[i].X, oPts[i].Y, depth));\r\n }\r\n\r\n if (seg.inSideRadius > 0) {\r\n for (var i = count; i > -1; i--) {\r\n tVtxs.push(sender.chartObj.vector.vector3D(iPts[i].X, iPts[i].Y, 0));\r\n bVtxs.push(sender.chartObj.vector.vector3D(iPts[i].X, iPts[i].Y, depth));\r\n }\r\n }\r\n else {\r\n tVtxs.push(seg.Center);\r\n bVtxs.push(sender.chartObj.vector.vector3D(seg.Center.x, seg.Center.y, depth));\r\n }\r\n res[0] = [];\r\n res[0].push(sender.chartObj.polygon.polygon3D(tVtxs, this, seg.index, style.borderColor, style.borderWidth, style.opacity, style.interior, inc.toString() + \"_Region\" + \"_Series_\" + seriesIndex + \"_Point_\" + seg.index, sender.chartObj.chart3D));\r\n inc++;\r\n res[0].push(sender.chartObj.polygon.polygon3D(bVtxs, this, seg.index, style.borderColor, style.borderWidth, style.opacity, style.interior, inc.toString() + \"_Region\" + \"_Series_\" + seriesIndex + \"_Point_\" + seg.index, sender.chartObj.chart3D));\r\n inc++;\r\n\r\n\r\n\r\n if (seg.inSideRadius > 0) {\r\n var rvts = new Array(\r\n\r\n sender.chartObj.vector.vector3D(oPts[0].X, oPts[0].Y, 0),\r\n sender.chartObj.vector.vector3D(oPts[0].X, oPts[0].Y, depth),\r\n sender.chartObj.vector.vector3D(iPts[0].X, iPts[0].Y, depth),\r\n sender.chartObj.vector.vector3D(iPts[0].X, iPts[0].Y, 0)\r\n )\r\n\r\n var lvts = new Array\r\n (\r\n sender.chartObj.vector.vector3D(oPts[count].X, oPts[count].Y, 0),\r\n sender.chartObj.vector.vector3D(oPts[count].X, oPts[count].Y, depth),\r\n sender.chartObj.vector.vector3D(iPts[count].X, iPts[count].Y, depth),\r\n sender.chartObj.vector.vector3D(iPts[count].X, iPts[count].Y, 0)\r\n )\r\n res[2] = [];\r\n\r\n res[2].push(sender.chartObj.polygon.polygon3D(rvts, this, seg.index, style.borderColor, style.borderWidth, style.opacity, style.interior, inc.toString() + \"_Region\" + \"_Series_\" + seriesIndex + \"_Point_\" + seg.index, sender.chartObj.chart3D));\r\n inc++;\r\n res[2].push(sender.chartObj.polygon.polygon3D(lvts, this, seg.index, style.borderColor, style.borderWidth, style.opacity, style.interior, inc.toString() + \"_Region\" + \"_Series_\" + seriesIndex + \"_Point_\" + seg.index, sender.chartObj.chart3D));\r\n inc++;\r\n\r\n }\r\n else {\r\n var rvts = new Array(\r\n sender.chartObj.vector.vector3D(oPts[0].X, oPts[0].Y, 0),\r\n sender.chartObj.vector.vector3D(oPts[0].X, oPts[0].Y, depth),\r\n sender.chartObj.vector.vector3D(seg.Center.x, seg.Center.y, depth),\r\n sender.chartObj.vector.vector3D(seg.Center.x, seg.Center.y, 0)\r\n )\r\n\r\n var lvts = new Array(\r\n sender.chartObj.vector.vector3D(oPts[count].X, oPts[count].Y, 0),\r\n sender.chartObj.vector.vector3D(oPts[count].X, oPts[count].Y, depth),\r\n sender.chartObj.vector.vector3D(seg.Center.x, seg.Center.y, depth),\r\n sender.chartObj.vector.vector3D(seg.Center.x, seg.Center.y, 0)\r\n )\r\n res[2] = [];\r\n res[2].push(sender.chartObj.polygon.polygon3D(rvts, this, seg.index, style.borderColor, style.borderWidth, style.opacity, style.interior, inc.toString() + \"_Region\" + \"_Series_\" + seriesIndex + \"_Point_\" + seg.index, sender.chartObj.chart3D));\r\n inc++;\r\n res[2].push(sender.chartObj.polygon.polygon3D(lvts, this, seg.index, style.borderColor, style.borderWidth, style.opacity, style.interior, inc.toString() + \"_Region\" + \"_Series_\" + seriesIndex + \"_Point_\" + seg.index, sender.chartObj.chart3D));\r\n inc++;\r\n\r\n\r\n }\r\n\r\n\r\n return res;\r\n },\r\n\r\n createPolygons: function (series, sender, returnPoly) {\r\n var segments, poligons = [], seg, style,\r\n pointindex, segmentsLength, plgs,\r\n seriesIndex = $.inArray(series, sender.chartObj.model._visibleSeries);\r\n if (!series.segments || !returnPoly)\r\n segments = this.createPoints(series, sender);\r\n else\r\n segments = series.segments;\r\n segmentsLength = segments.length;\r\n for (var i = 0; i < segmentsLength; i++) {\r\n seg = segments[i];\r\n if (seg.visible) {\r\n pointindex = segments[i].pointIndex;\r\n style = sender.chartObj.setStyle(sender, series, seriesIndex, pointindex);\r\n if (typeof (sender.chartObj.model.pointColors[pointindex]) == \"object\")\r\n style.interior = sender.chartObj.model.pointColors[pointindex][0].color;\r\n plgs = this.createSector(seg, sender, style, seriesIndex);\r\n if (plgs != null)\r\n for (var ai = 0; ai < plgs.length; ai++) {\r\n if (!poligons[ai])\r\n poligons[ai] = [];\r\n if (plgs[ai] != null) {\r\n for (var pi = 0; pi < plgs[ai].length; pi++) {\r\n poligons[ai].push(plgs[ai][pi]);\r\n\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n }\r\n if (returnPoly) {\r\n return poligons;\r\n }\r\n\r\n for (var ai = 0; ai < poligons.length; ai++) {\r\n for (var k = 0; k < poligons[ai].length; k++) {\r\n sender.chartObj.graphics.addVisual(poligons[ai][k]);\r\n }\r\n }\r\n },\r\n\r\n draw3DDataLabel: function (series, pointIndex, point, sender) {\r\n\r\n var connectorHeight = series.marker.dataLabel.connectorLine.height;\r\n var tag, radius, pointX, pointY;\r\n var xOffset = 0; var yOffset = 0;\r\n if (typeof (series.marker.dataLabel.offset) === 'number') {\r\n yOffset = series.marker.dataLabel.offset;\r\n } else {\r\n xOffset = series.marker.dataLabel.offset.x;\r\n yOffset = series.marker.dataLabel.offset.y;\r\n }\r\n if (this.chartObj.model.AreaType == \"none\") {\r\n location = { x: 0, y: 0 };\r\n var pointText = (point.text) ? point.text : point.y;\r\n var seriesIndex = $.inArray(series, this.chartObj.model.series);\r\n if (series.type.toLowerCase() == \"doughnut\" || series.type.toLowerCase() == \"pie\") {\r\n\r\n var width = Math.min(series.actualWidth, series.actualHeight) / 2;\r\n var center = point.symbolLocation.center;\r\n var xOffset = series.marker.dataLabel.offset.x;\r\n var yOffset = series.marker.dataLabel.offset.y;\r\n var dradius = point.symbolLocation.radius * series._coefficient;\r\n if (ej.util.isNullOrUndefined(connectorHeight))\r\n connectorHeight = ej.EjSvgRender.utils._measureText(pointText, null, series.marker.dataLabel.font).height;\r\n if (series != null && series.labelPosition != \"inside\")\r\n radius = point.symbolLocation.radius + connectorHeight;\r\n else if (series != null)\r\n radius = dradius + (point.symbolLocation.radius - dradius) / 2;\r\n pointX = location.X = center.x + radius * Math.cos(point.symbolLocation.angle) + xOffset;\r\n pointY = location.Y = center.y + radius * Math.sin(point.symbolLocation.angle) + yOffset;\r\n\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { text: pointText, location: { x: pointX, y: pointY }, series: series, pointIndex: pointIndex, seriesIndex: seriesIndex };\r\n this.chartObj._trigger(\"displayTextRendering\", commonEventArgs);\r\n commonEventArgs.data.Text = commonEventArgs.data.text;\r\n var size = ej.EjSvgRender.utils._measureText(commonEventArgs.data.Text, null, series.marker.dataLabel.font);\r\n pointX = location.X = commonEventArgs.data.location.x;\r\n pointY = location.Y = commonEventArgs.data.location.y;\r\n }\r\n }\r\n else {\r\n var labelFormat = series.yAxis.labelFormat ? series.yAxis.labelFormat : \"\";\r\n var seriesIndex = $.inArray(series, this.chartObj.model.series);\r\n var labelPrecisionDefault = 6, labelPrecisionHighest = 20;\r\n var pointText = (point.text) ? point.text : point.y ;\r\n if (labelFormat) {\r\n if (labelFormat.indexOf(\"{value}\") > -1)\r\n pointText = labelFormat.replace(\"{value}\", value);\r\n else if (labelFormat.indexOf('e') == 0 || labelFormat.indexOf('E') == 0) {\r\n labelPrecision = labelFormat.match(/(\\d+)/g);\r\n labelPrecision = labelPrecision == null ? labelPrecisionDefault : labelPrecision > labelPrecisionHighest ? labelPrecisionHighest : labelPrecision;\r\n pointText = point.y.toExponential(labelPrecision);\r\n }\r\n else pointText = ej.globalize.format(point.y, labelFormat, this.chartObj.model.locale);\r\n }\r\n var pointHeight = 0;\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n var size = ej.EjSvgRender.utils._measureText(pointText, null, series.marker.dataLabel.font);\r\n var location = ej.EjSvgRender.utils.Transform3DToVisible(series, point.symbolLocation.x, point.symbolLocation.y, this.chartObj);\r\n var connectorHeight = (series.marker.dataLabel.connectorLine.height) ? series.marker.dataLabel.connectorLine.height : 0;\r\n var angle = (6.28 * (1 - (90 / 360.0)));\r\n var pointY = location.Y;\r\n var pointX = location.X;\r\n if (!this.chartObj.model.requireInvertedAxes) {\r\n if (point.y > 0)\r\n pointY = location.Y + (Math.sin((angle)) * connectorHeight);\r\n else\r\n pointY = location.Y + (Math.sin((-angle)) * connectorHeight);\r\n }\r\n else {\r\n if (point.x > 0)\r\n pointX = location.X - (Math.sin((angle)) * connectorHeight);\r\n else\r\n pointX = location.X + (Math.sin((angle)) * connectorHeight);\r\n pointHeight = - size.height / 3;\r\n }\r\n if (series.marker.dataLabel.textPosition == 'bottom')\r\n pointY = location.Y + yOffset;\r\n else\r\n pointY = location.Y - yOffset;\r\n pointX = location.X + xOffset;\r\n commonEventArgs.data = { text: pointText, location: { x: pointX, y: pointY }, series: series, pointIndex: pointIndex };\r\n commonEventArgs.data.Text = commonEventArgs.data.text;\r\n this.chartObj._trigger(\"displayTextRendering\", commonEventArgs);\r\n pointX = commonEventArgs.data.location.x;\r\n pointY = commonEventArgs.data.location.y;\r\n }\r\n\r\n\r\n\r\n var depthInfo = this._getSegmentDepth(series);\r\n\r\n\r\n\r\n if (series.marker.dataLabel.shape.toLowerCase() != \"none\" && !point.marker.dataLabel.template && commonEventArgs.data.Text != '') {\r\n\r\n var element = { tag: 'dataLabel', series: series, point: point, pointIndex: pointIndex, id: this.chartObj.svgObject.id + seriesIndex + '_DataLabel' + pointIndex, child: this.chartObj.chart3D };\r\n\r\n this.chartObj.graphics.addVisual(this.chartObj.polygon.createTextElement(this.chartObj.vector.vector3D(pointX, pointY, (point.symbolLocation.z) ? point.symbolLocation.z : 0), element, 0, -size.height));\r\n }\r\n\r\n tag = (!point.marker.dataLabel.template) ? \"text\" : \"template\";\r\n\r\n var element = { Width: size.width, Height: size.height, Label: commonEventArgs.data, TextAnchor: \"middle\", tag: tag, font: series.marker.dataLabel.font, Angle: series.marker.dataLabel.angle, id: this.chartObj.svgObject.id + '_SeriesText' + pointIndex + seriesIndex, child: this.chartObj.chart3D };\r\n\r\n\r\n if (this.chartObj.model.AreaType != \"none\") {\r\n if (series.marker.dataLabel.connectorLine.height && series.marker.dataLabel.connectorLine.height > 0) {\r\n var drawPoints = [];\r\n drawPoints.push({ x: location.X, y: location.Y + pointHeight, z: point.symbolLocation.z });\r\n\r\n drawPoints.push({ x: pointX, y: pointY + pointHeight, z: point.symbolLocation.z });\r\n this.drawLineSegment(drawPoints, pointIndex, series);\r\n }\r\n this.chartObj.graphics.addVisual(this.chartObj.polygon.createTextElement(this.chartObj.vector.vector3D(pointX, pointY, point.symbolLocation.z), element, 0, -size.height));\r\n }\r\n else {\r\n if (series.labelPosition.toLowerCase() != \"inside\")\r\n this.updateConnectorLine(point, pointIndex, series, location, connectorHeight)\r\n var finalSize = { x: series.actualWidth, y: series.actualHeight };\r\n this.chartObj.graphics.addVisual(this.chartObj.polygon.createTextElement(this.chartObj.vector.vector3D(location.X, location.Y, -1), element, 0, -size.height));\r\n }\r\n },\r\n updateConnectorLine: function (point, pointIndex, series, location, connectorHeight) {\r\n var drawPoints = [];\r\n var symbolLocation = point.symbolLocation;\r\n var x = symbolLocation.center.x + Math.cos(symbolLocation.angle) * symbolLocation.radius;\r\n var y = symbolLocation.center.y + Math.sin(symbolLocation.angle) * symbolLocation.radius;\r\n drawPoints.push({ x: x, y: y });\r\n var labelRadiusFromOrigin = symbolLocation.radius + connectorHeight;\r\n x = symbolLocation.center.x + (Math.cos((symbolLocation.angle)) * (labelRadiusFromOrigin));\r\n y = symbolLocation.center.y + (Math.sin((symbolLocation.angle)) * (labelRadiusFromOrigin));\r\n\r\n drawPoints.push({ x: x, y: y });\r\n //var hipen = height / 5;\r\n //x += (x > symbolLocation.center.x) ? hipen : -hipen;\r\n //drawPoints.push({ x: x, y: y });\r\n if (series.marker.dataLabel.connectorLine.type == \"bezier\")\r\n drawPoints = this.getBezierApproximation(drawPoints, 256, series);\r\n this.drawLineSegment(drawPoints, pointIndex, series)\r\n },\r\n /// \r\n getBezierApproximation: function (controlPoints, outputSegmentCount, series) {\r\n var points = [];\r\n for (var i = 0; i <= outputSegmentCount; i++) {\r\n var t = i / outputSegmentCount;\r\n points.push(this.GetBezierPoint(t, controlPoints, 0, controlPoints.length, series));\r\n }\r\n return points;\r\n },\r\n drawLineSegment: function (drawpoints, pointIndex, series) {\r\n var vectorPoints = [];\r\n for (var i = 0; i < drawpoints.length; i++) {\r\n vectorPoints.push(this.chartObj.vector.vector3D(drawpoints[i].x, drawpoints[i].y, drawpoints[i].z ? drawpoints[i].z : 0));\r\n }\r\n var seriesIndex = $.inArray(series, this.chartObj.model._visibleSeries);\r\n var color = (this.chartObj.model.AreaType == \"none\") ? this.chartObj.model.pointColors[pointIndex] : this.chartObj.model.seriesColors[seriesIndex];\r\n var stroke = (series.marker.dataLabel.connectorLine.stroke) ? series.marker.dataLabel.connectorLine.stroke : color;\r\n var line = { width: series.marker.dataLabel.connectorLine.width, stroke: stroke, child: this.chartObj.chart3D, tag: 'polyline', id: this.chartObj.svgObject.id + \"_\" + seriesIndex + \"_\" + pointIndex };\r\n\r\n this.chartObj.graphics.addVisual(this.chartObj.polygon.createPolyline(vectorPoints, line));\r\n }\r\n\r\n },\r\n\r\n ej.ejCircularSeries = {\r\n\r\n draw: function (series, sender, type) {\r\n var MARGINS_RATIO = 0.03,\r\n\r\n seriesLength = sender.chartObj.model._visibleSeries.length,\r\n seriesIndex = $.inArray(series, sender.chartObj.model._visibleSeries);\r\n sender._calculateVisiblePoints(series);\r\n sender.calculateSize(sender, series);\r\n\r\n if (type == \"pie\") {\r\n series._size = series.pieCoefficient;\r\n series._coefficient = seriesIndex == 0 ? 0 : series._size;\r\n }\r\n else {\r\n series._size = series.doughnutSize;\r\n series._coefficient = series.doughnutCoefficient;\r\n }\r\n if (sender.chartObj.model.circularRadius.length > 1) {\r\n for (i = seriesIndex; i < sender.chartObj.model.circularRadius.length; i++) {\r\n if (!ej.util.isNullOrUndefined(sender.chartObj.model.circularRadius[i])) {\r\n sender.chartObj.model.circularRadius[seriesIndex] = sender.chartObj.model.circularRadius[i] * series._size;\r\n break;\r\n }\r\n }\r\n }\r\n else\r\n sender.chartObj.model.circularRadius[seriesIndex] = (((1 - MARGINS_RATIO) * Math.min(series.actualWidth / 2, series.actualHeight / 2)) * series._size);\r\n sender.chartObj.model.innerRadius[seriesIndex] = series._coefficient * sender.chartObj.model.circularRadius[seriesIndex];\r\n sender.createPolygons(series, sender);\r\n },\r\n doAnimation: function (series, sender) {\r\n var seriesRendering = this;\r\n series.count = 0;\r\n $.each(series.segments, function (pointIndex, point) {\r\n\r\n var radius = point.radius;\r\n var insideRadius = point.inSideRadius;\r\n\r\n series.animate = true;\r\n $(sender.chartObj.element).each(function () { point.radius = 0, point.inSideRadius = 0 }).animate(\r\n { Radius: radius, InsideRadius: insideRadius },\r\n\r\n {\r\n duration: 1000, queue: false, step: function (now, fx) {\r\n\r\n\r\n if (fx.prop.toString() === \"Radius\") {\r\n point.radius = now;\r\n }\r\n else {\r\n point.inSideRadius = now;\r\n }\r\n\r\n\r\n var poligons = sender.createPolygons(series, sender, true);\r\n\r\n for (var ai = 0; ai < poligons.length; ai++) {\r\n for (var k = 0; k < poligons[ai].length; k++) {\r\n sender.chartObj.polygon.update(poligons[ai][k].VectorPoints, poligons[ai][k], sender)\r\n }\r\n }\r\n\r\n },\r\n complete: function () {\r\n sender.chartObj.model.AnimationComplete = true;\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { series: series };\r\n sender.chartObj._trigger(\"animationComplete\", commonEventArgs);\r\n\r\n }\r\n });\r\n });\r\n }\r\n },\r\n\r\n ej.series3DTypes.doughnut = ej.ejCircularSeries;\r\n ej.series3DTypes.pie = ej.ejCircularSeries;\r\n\r\n\r\n\r\n ej.ej3DStackingColumn = {\r\n\r\n draw: function (series, sender, type, params) {\r\n var visiblePoints = sender._isVisiblePoints(series);\r\n this.createSegments(series, sender, params);\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n if (visiblePoints[i].visible) {\r\n series._visiblePoints[i].plans = null;\r\n ej.ej3DColumnSeries.update(series, series._visiblePoints[i], i, sender)\r\n }\r\n }\r\n },\r\n\r\n createSegments: function (series, sender, params) {\r\n var xValues = sender.chartObj._getXValues(series._visiblePoints);\r\n\r\n var median,\r\n cons = 0.2;\r\n if (xValues == null) return;\r\n\r\n var sbsInfo = sender.getSideBySideInfo(series, params);\r\n var depthInfo = sender._getSegmentDepth(series);\r\n median = sbsInfo.Delta / 2;\r\n var visiblePoints = sender._isVisiblePoints(series);\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n\r\n var x1 = xValues[i] + sbsInfo.Start;\r\n var x2 = xValues[i] + sbsInfo.End;\r\n var y2 = series.stackedValue.StartValues[i];\r\n var y1 = series.stackedValue.EndValues[i];\r\n\r\n ej.ej3DColumnSeries._setData(x1, y1, x2, y2, depthInfo.Start, depthInfo.End, sender, visiblePoints[i]);\r\n\r\n if (!series.marker.dataLabel.visible) continue;\r\n visiblePoints[i].symbolLocation = { x: 0, y: 0, z: 0 };\r\n switch (series.marker.dataLabel.textPosition) {\r\n case \"top\":\r\n visiblePoints[i].symbolLocation.x = x1 + median;\r\n visiblePoints[i].symbolLocation.y = y1;\r\n visiblePoints[i].symbolLocation.z = depthInfo.Start + (depthInfo.Delta / 2);\r\n break;\r\n case \"bottom\":\r\n visiblePoints[i].symbolLocation.x = x1 + median;\r\n visiblePoints[i].symbolLocation.y = y2 - cons;\r\n visiblePoints[i].symbolLocation.z = depthInfo.Start + (depthInfo.End - depthInfo.Start) / 2;\r\n break;\r\n default:\r\n visiblePoints[i].symbolLocation.x = x1 + median;\r\n visiblePoints[i].symbolLocation.y = y1 + (y2 - y1) / 2;\r\n visiblePoints[i].symbolLocation.z = depthInfo.Start;\r\n break;\r\n }\r\n\r\n }\r\n\r\n },\r\n\r\n doAnimation: function (series, sender) {\r\n\r\n var seriesRender = this;\r\n\r\n $.each(series._visiblePoints, function (pointIndex, point) {\r\n\r\n var topValue = point.Top;\r\n var bottomValue = point.Bottom;\r\n\r\n $(point).each(function () { point.Top = 0, point.Bottom = 0 }).animate(\r\n { Top: topValue, Bottom: bottomValue },\r\n\r\n {\r\n duration: 1200, queue: false, step: function (now, fx) {\r\n\r\n if (fx.prop.toString() === \"Top\") {\r\n point.Top = now;\r\n }\r\n if (fx.prop.toString() === \"Bottom\") {\r\n point.Bottom = now;\r\n }\r\n\r\n ej.ej3DColumnSeries.update(series, point, pointIndex, sender);\r\n\r\n },\r\n\r\n complete: function () {\r\n\r\n sender.chartObj.model.AnimationComplete = true;\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { series: series };\r\n sender.chartObj._trigger(\"animationComplete\", commonEventArgs);\r\n\r\n }\r\n\r\n });\r\n\r\n });\r\n\r\n }\r\n\r\n\r\n\r\n },\r\n\r\n ej.series3DTypes.stackingcolumn = ej.ej3DStackingColumn;\r\n\r\n ej.series3DTypes.stackingbar = ej.ej3DStackingColumn;\r\n\r\n ej.series3DTypes.stackingbar100 = ej.ej3DStackingColumn;\r\n\r\n ej.series3DTypes.stackingcolumn100 = ej.ej3DStackingColumn;\r\n\r\n ej.ej3DColumnSeries = {\r\n draw: function (series, sender, type, params) {\r\n var visiblePoints = sender._isVisiblePoints(series);\r\n this.createSegments(series, sender, params);\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n if (visiblePoints[i].visible) {\r\n series._visiblePoints[i].plans = null;\r\n this.update(series, series._visiblePoints[i], i, sender);\r\n }\r\n }\r\n },\r\n\r\n update: function (series, point, pointIndex, sender) {\r\n var plans;\r\n var valueType = series.xAxis._valueType.toLowerCase();\r\n var seriesIndex = $.inArray(series, sender.chartObj.model._visibleSeries);\r\n var xBase = (valueType == \"logarithmic\") ? null : 1;\r\n var xIsLogarithmic = (valueType == \"logarithmic\") ? true : false;\r\n var left = xIsLogarithmic ? Math.log(point.Left, xBase) : point.Left;\r\n var right = xIsLogarithmic ? Math.log(point.Right, xBase) : point.Right;\r\n var bottom = series.yAxis.visibleRange.min;\r\n var top = series.yAxis.visibleRange.max;\r\n var xStart = series.xAxis.visibleRange.min;\r\n var xEnd = series.xAxis.visibleRange.max;\r\n if ((!(left >= xStart) || !(left <= xEnd)) && (!(right >= xStart) || !(right <= xEnd))) return;\r\n\r\n var topValue;\r\n if (point.Top < 0)\r\n topValue = point.Top > bottom ? point.Top : bottom;\r\n else\r\n topValue = (series.yAxis.valueType && series.yAxis.valueType.toLowerCase() == \"logarithmic\") ? point.Top : point.Top < top ? point.Top : top;\r\n var tlpoint = ej.EjSvgRender.utils.Transform3DToVisible(series, point.Left > xStart ? point.Left : xStart, topValue, sender.chartObj);\r\n var rbpoint = ej.EjSvgRender.utils.Transform3DToVisible(series, xEnd > point.Right ? point.Right : xEnd, bottom > point.Bottom ? bottom : point.Bottom, sender.chartObj);\r\n\r\n var tlfVector = sender.chartObj.vector.vector3D(Math.min(tlpoint.X, rbpoint.X), Math.min(tlpoint.Y, rbpoint.Y), point.StartDepth);\r\n var brbVector = sender.chartObj.vector.vector3D(Math.max(tlpoint.X, rbpoint.X), Math.max(tlpoint.Y, rbpoint.Y), point.EndDepth);\r\n\r\n var styleOptions = sender.chartObj.setStyle(sender, series, seriesIndex, pointIndex);\r\n if (styleOptions.interior.indexOf(\"url\") >= 0)\r\n styleOptions.interior = sender.chartObj.model.seriesColors[seriesIndex][0].color;\r\n var name = \"Region\" + \"_Series_\" + seriesIndex + \"_Point_\" + pointIndex\r\n if (series.columnFacet == \"cylinder\")\r\n\r\n sender.chartObj.polygon.createCylinder(tlfVector, brbVector, this, pointIndex, series.type,\r\n styleOptions.borderColor, styleOptions.interior, styleOptions.borderWidth, styleOptions.opacity, sender.chartObj.model.requireInvertedAxes, name, sender.chartObj.chart3D);\r\n else if (series.columnFacet == \"rectangle\")\r\n sender.chartObj.polygon.createBox(tlfVector, brbVector, this, pointIndex, series.type,\r\n styleOptions.borderColor, styleOptions.interior, styleOptions.borderWidth, styleOptions.opacity, sender.chartObj.model.requireInvertedAxes, name, sender.chartObj.chart3D);\r\n\r\n },\r\n\r\n _setData: function () {\r\n var values = arguments,\r\n point = arguments[arguments.length - 1],\r\n sender = arguments[arguments.length - 2];\r\n\r\n point.Left = values[0];\r\n point.Bottom = values[3];\r\n point.Top = values[1];\r\n point.Right = values[2];\r\n point.StartDepth = values[4];\r\n point.EndDepth = values[5];\r\n point.XRange = sender.getDoubleRange(point.Left, point.Right);\r\n if (!isNaN(point.Top) && !isNaN(point.Bottom))\r\n point.YRange = sender.getDoubleRange(point.Top, point.Bottom);\r\n },\r\n\r\n createSegments: function (series, sender, params) {\r\n var xValues = sender.chartObj._getXValues(series._visiblePoints),\r\n YValues = sender.chartObj._getYValues(series._visiblePoints);\r\n if (xValues == null) return;\r\n\r\n var sbsInfo = sender.getSideBySideInfo(series, params),\r\n depthInfo = sender._getSegmentDepth(series),\r\n crossValue = sender.chartObj._getXCrossValue(series, series.xAxis, params),\r\n median = sbsInfo.Delta / 2,\r\n visiblePoints = series._visiblePoints,\r\n cons = 0.2, XData, YData;\r\n for (var i = 0; i < visiblePoints.length; i++) {\r\n var x1 = xValues[i] + sbsInfo.Start,\r\n x2 = xValues[i] + sbsInfo.End,\r\n y1 = YValues[i],\r\n y2 = crossValue;\r\n\r\n this._setData(x1, y1, x2, y2, depthInfo.Start, depthInfo.End, sender, visiblePoints[i]);\r\n\r\n XData = xValues[i];\r\n YData = YValues[i];\r\n //Item = ActualData[i];\r\n\r\n if (!series.marker.dataLabel.visible) continue;\r\n visiblePoints[i].symbolLocation = { x: 0, y: 0, z: 0 };\r\n switch (series.marker.dataLabel.textPosition) {\r\n case \"top\":\r\n visiblePoints[i].symbolLocation.x = x1 + median;\r\n visiblePoints[i].symbolLocation.y = y1;\r\n visiblePoints[i].symbolLocation.z = depthInfo.Start;\r\n break;\r\n case \"bottom\":\r\n visiblePoints[i].symbolLocation.x = x1 + median;\r\n visiblePoints[i].symbolLocation.y = y2 - cons;\r\n visiblePoints[i].symbolLocation.z = depthInfo.Start + (depthInfo.End - depthInfo.Start) / 2;\r\n break;\r\n default:\r\n visiblePoints[i].symbolLocation.x = x1 + median;\r\n visiblePoints[i].symbolLocation.y = Math.abs(y2 - y1) / 2;\r\n visiblePoints[i].symbolLocation.z = depthInfo.Start;\r\n break;\r\n }\r\n\r\n }\r\n\r\n\r\n },\r\n\r\n doAnimation: function (series, sender) {\r\n\r\n var seriesRender = this;\r\n\r\n $.each(series._visiblePoints, function (pointIndex, point) {\r\n\r\n var topValue = point.Top;\r\n $(point).each(function () { point.Top = 0 }).animate(\r\n { Top: topValue },\r\n\r\n {\r\n duration: 1200, queue: false, step: function (now, fx) {\r\n\r\n if (fx.prop.toString() === \"Top\") {\r\n point.Top = now;\r\n }\r\n\r\n seriesRender.update(series, point, pointIndex, sender);\r\n\r\n },\r\n\r\n complete: function () {\r\n sender.chartObj.model.AnimationComplete = true;\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { series: series };\r\n sender.chartObj._trigger(\"animationComplete\", commonEventArgs);\r\n\r\n }\r\n\r\n });\r\n\r\n })\r\n\r\n }\r\n\r\n }\r\n\r\n ej.series3DTypes.column = ej.ej3DColumnSeries;\r\n\r\n //bar series\r\n ej.series3DTypes.bar = ej.ej3DColumnSeries;\r\n\r\n ej.Ej3DChart.prototype = {\r\n renderSeries: function (sender, series, params) {\r\n\r\n var series;\r\n ej.Ej3DSeriesRender.prototype.chartObj = sender;\r\n\r\n $.extend(ej.Ej3DSeriesRender.prototype, ej.EjSeriesRender.prototype);\r\n\r\n var seriesRendering = new ej.Ej3DSeriesRender();\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = { \"series\": series };\r\n seriesRendering.chartObj._trigger(\"seriesRendering\", commonEventArgs);\r\n var type = series.type.toLowerCase();\r\n var options = ej.series3DTypes[type];\r\n if (ej.util.isNullOrUndefined(options)) return;\r\n options.draw(series, seriesRendering, type, params);\r\n if (series.marker.dataLabel.visible) {\r\n $.each(series._visiblePoints, function (pointIndex, point) {\r\n point.marker = $.extend(true, {}, series.marker, point.marker);\r\n if (point.visible && (ej.util.isNullOrUndefined(point.marker) || (point.marker.dataLabel && point.marker.dataLabel.visible)))\r\n seriesRendering.draw3DDataLabel(series, pointIndex, point, sender);\r\n });\r\n }\r\n\r\n\r\n\r\n\r\n },\r\n update3DWall: function (sender, params) {\r\n if (sender.model.AreaType == \"cartesianaxes\") {\r\n $.extend(ej.Ej3DRender.prototype, this);\r\n this.updateBackWall(sender);\r\n for (var i = 0; i < sender.model._axes.length; i++) {\r\n var axis = sender.model._axes[i],\r\n opposedPosition = axis._opposed;\r\n if (axis.orientation.toLowerCase() == \"vertical\") {\r\n if (!opposedPosition)\r\n this.updateLeftWall(sender, axis, params);\r\n else\r\n this.updateRightWall(sender, axis, params);\r\n }\r\n else {\r\n if (!opposedPosition)\r\n this.updateBottomWall(sender, axis, params);\r\n else\r\n this.updateTopWall(sender, axis, params);\r\n }\r\n }\r\n }\r\n },\r\n\r\n updateTopWall: function (sender, axis, params) {\r\n\r\n var offset = 0;\r\n var areaBounds = sender.model.m_AreaBounds, y = params.axes[axis.name]._validCross ? axis.y : areaBounds.Y;\r\n if (sender.model.wallSize < y)\r\n offset = y - sender.model.wallSize;\r\n else\r\n offset = -(sender.model.wallSize - y);\r\n var tlfVector = sender.vector.vector3D(areaBounds.X + areaBounds.Width, -sender.model.depth, y - 0.1);\r\n var brbVector = sender.vector.vector3D(areaBounds.X, - 0.1, offset);\r\n topSideWallPlans = sender.polygon.createBox(tlfVector, brbVector, this, 0, \"Graphics3D\", \"#e2e1e1\", \"#e2e1e1\", 0, 0.15, false, \"TopWallBrush\", sender.chart3D);\r\n\r\n for (var i = 0; i < topSideWallPlans.length; i++)\r\n sender.polygon.transform(sender.matrixobj.tilt((parseFloat)(Math.PI / 2)), topSideWallPlans[i]);\r\n\r\n\r\n },\r\n\r\n updateRightWall: function (sender, axis, params) {\r\n var x = params.axes[axis.name]._validCross ? axis.x : sender.model.m_AreaBounds.X + sender.model.m_AreaBounds.Width;\r\n var rightRect = { left: -(sender.model.depth), top: sender.model.m_AreaBounds.Y, bottom: sender.model.m_AreaBounds.Height + sender.model.m_AreaBounds.Y, right: 0 };\r\n var tlfVector = sender.vector.vector3D(rightRect.left, rightRect.top, x + 1.5);\r\n var brbVector = sender.vector.vector3D(rightRect.right, rightRect.bottom, x + sender.model.wallSize);\r\n rightSideWallPlans = sender.polygon.createBox(tlfVector, brbVector, sender, 0, \"Graphics3D\", \"#e2e1e1\", \"#e2e1e1\", 0, 0.15, false, \"RightWallBrush\", sender.chart3D);\r\n for (var i = 0; i < rightSideWallPlans.length; i++)\r\n sender.polygon.transform(sender.matrixobj.turn((parseFloat)(-Math.PI / 2)), rightSideWallPlans[i]);\r\n },\r\n updateBackWall: function (sender) {\r\n var areaBounds = sender.model.m_AreaBounds;\r\n var tlfVector = sender.vector.vector3D(areaBounds.X, areaBounds.Y, sender.model.depth == 0 ? 1.5 : sender.model.depth + sender.model.wallSize);\r\n var brbVector = sender.vector.vector3D((areaBounds.X + areaBounds.Width), areaBounds.Y + areaBounds.Height, sender.model.depth == 0 ? 1.5 : sender.model.depth);\r\n\r\n sender.polygon.createBox(tlfVector, brbVector, sender, 0, \"Graphics3D\", \"#e2e1e1\", \"#e2e1e1\", 0, 0.15, false, \"BackWallBrush\", sender.chart3D);\r\n },\r\n updateLeftWall: function (sender, axis, params) {\r\n var leftRect = { left: -(sender.model.depth), top: sender.model.m_AreaBounds.Y, bottom: sender.model.m_AreaBounds.Height + sender.model.m_AreaBounds.Y, right: 0 },\r\n offset = params.axes[axis.name]._validCross ? axis.x : sender.model.m_AreaBounds.X;\r\n var tlfVector = sender.vector.vector3D(leftRect.left, leftRect.top, offset - 0.1);\r\n var brbVector = sender.vector.vector3D(leftRect.right, leftRect.bottom, offset - sender.model.wallSize);\r\n\r\n var leftSideWallPlans = sender.polygon.createBox(tlfVector, brbVector, this, 0, \"Graphics3D\", \"#e2e1e1\", \"#e2e1e1\", 0, 0.15, false, \"LeftWallBrush\", sender.chart3D);\r\n for (var i = 0; i < leftSideWallPlans.length; i++)\r\n sender.polygon.transform(sender.matrixobj.turn((parseFloat)(-Math.PI / 2)), leftSideWallPlans[i]);\r\n },\r\n updateBottomWall: function (sender, axis, params) {\r\n var areaBounds = sender.model.m_AreaBounds;\r\n var y = params.axes[axis.name]._validCross ? axis.y : areaBounds.Y + areaBounds.Height;\r\n var tlfVector = sender.vector.vector3D((areaBounds.X + areaBounds.Width), -(sender.model.depth), sender.model.wallSize + y);\r\n var brbVector = sender.vector.vector3D(areaBounds.X, -0.1, y + 1);\r\n\r\n var bottomSideWallPlans = sender.polygon.createBox(brbVector, tlfVector, this, 0, \"Graphics3D\", \"#D3D3D3\", \"#D3D3D3\", 0, 0.15, false, \"BottomWallBrush\", sender.chart3D);\r\n for (var i = 0; i < bottomSideWallPlans.length; i++)\r\n sender.polygon.transform(sender.matrixobj.tilt((parseFloat)(Math.PI / 2)), bottomSideWallPlans[i]);\r\n }\r\n }\r\n\r\n})(jQuery);\r\n\r\nej.Ej3DRender = function () {\r\n\r\n\r\n};\r\n\r\n(function ($) {\r\n\r\n ej.Ej3DRender.Polygons = [];\r\n\r\n\r\n ej.Ej3DRender.prototype = {\r\n matrix3D: function () {\r\n\r\n },\r\n\r\n vector3D: function () {\r\n\r\n },\r\n\r\n BSPTreeBuilder: function () {\r\n\r\n },\r\n\r\n Graphics3D: function () {\r\n\r\n },\r\n\r\n polygon3D: function () {\r\n\r\n }\r\n }\r\n\r\n var Ej3DRender = new ej.Ej3DRender();\r\n\r\n Ej3DRender.vector3D.prototype = {\r\n //Members\r\n x: \"\",\r\n y: \"\",\r\n z: \"\",\r\n Epsilon: 0.00001,\r\n //all coordinates indicate 0\r\n // empty: new Vector3D(0, 0, 0),\r\n\r\n //isValid: !isNaN(this.x) && !isNaN(this.y) && !isNaN(this.z),\r\n isValid: function (point) {\r\n return !isNaN(point.x) && !isNaN(point.y) && !isNaN(point.z)\r\n },\r\n //Constructor\r\n vector3D: function (points, vz) {\r\n this.x = points.x;\r\n this.y = points.y;\r\n this.z = vz;\r\n },\r\n\r\n vector3D: function (vx, vy, vz) {\r\n this.x = vx;\r\n this.y = vy;\r\n this.z = vz;\r\n return { x: vx, y: vy, z: vz }\r\n },\r\n\r\n //operations\r\n vector3DMinus: function (v1, v2) {\r\n return this.vector3D(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);\r\n },\r\n\r\n vector3DPlus: function (v1, v2) {\r\n return this.vector3D(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);\r\n },\r\n\r\n vector3DMultiply: function (v1, v2) {\r\n var _x = v1.y * v2.z - v2.y * v1.z;\r\n var _y = v1.z * v2.x - v2.z * v1.x;\r\n var _z = v1.x * v2.y - v2.x * v1.y;\r\n\r\n return this.vector3D(_x, _y, _z);\r\n },\r\n\r\n vector3dAND: function (v1, v2) {\r\n return (v1.x * v2.x + v1.y * v2.y + v1.z * v2.z);\r\n },\r\n\r\n vector3DStarMultiply: function (v1, val) {\r\n var _x = v1.x * val;\r\n var _y = v1.y * val;\r\n var _z = v1.z * val;\r\n\r\n return this.vector3D(_x, _y, _z);\r\n },\r\n\r\n //Methods\r\n getLength: function (vector) {\r\n var sqt = this.vector3dAND(vector, vector);\r\n return Math.sqrt(sqt);\r\n },\r\n\r\n\r\n\r\n normalize: function () {\r\n var l = this.getLength();\r\n x /= l;\r\n y /= l;\r\n z /= l;\r\n },\r\n getNormal: function (v1, v2, v3) {\r\n var v4 = this.vector3DMinus(v1, v2);\r\n var v5 = this.vector3DMinus(v3, v2);\r\n var n = this.vector3DMultiply(v4, v5);\r\n var l = this.getLength(n);\r\n\r\n if (l < this.Epsilon) {\r\n l = 0;\r\n }\r\n return { x: n.x / l, y: n.y / l, z: n.z / l }\r\n }\r\n }\r\n\r\n Ej3DRender.matrix3D.prototype = {\r\n //Memebr\r\n MATRIX_SIZE: 4,\r\n //Constructor\r\n matrix3D: function (size) {\r\n var mData = [];\r\n for (var i = 0; i < size; i++) {\r\n mData[i] = this.createArray(size);\r\n }\r\n return mData;\r\n },\r\n\r\n //method\r\n isAffine: function (mData) {\r\n\r\n return (mData[0][3] == 0) && (mData[1][3] == 0)\r\n && (mData[2][3] == 0) && (mData[3][3] == 1);\r\n },\r\n createArray: function (initialSize) {\r\n var a = [];\r\n for (var index = 0; index < initialSize; ++index) {\r\n a[index] = 0;\r\n }\r\n return a;\r\n },\r\n\r\n getIdentity: function () {\r\n\r\n var mData = this.matrix3D(this.MATRIX_SIZE);\r\n\r\n for (var i = 0; i < this.MATRIX_SIZE; i++) {\r\n mData[i][i] = 1.0;\r\n }\r\n\r\n return mData;\r\n },\r\n\r\n getInvertal: function (matrix) {\r\n var m = this.getIdentity();\r\n\r\n for (var i = 0; i < this.MATRIX_SIZE; i++) {\r\n for (var j = 0; j < this.MATRIX_SIZE; j++) {\r\n m[i][j] = this.getMinor(matrix, i, j);\r\n }\r\n }\r\n\r\n m = this.transposed(m);\r\n m = this.getMatrixMultiple((1 / this.getDeterminant(matrix)), m);\r\n\r\n return m;\r\n },\r\n getMatrixMultiple: function (factor, matrix) {\r\n for (var i = 0; i < matrix.length; i++) {\r\n for (var j = 0; j < matrix[i].length; j++) {\r\n matrix[i][j] = matrix[i][j] * factor;\r\n }\r\n }\r\n return matrix;\r\n },\r\n getMatrixVectorMutiple: function (m1, point) {\r\n var x = m1[0][0] * point.x + m1[1][0] * point.y + m1[2][0] * point.z + m1[3][0];\r\n var y = m1[0][1] * point.x + m1[1][1] * point.y + m1[2][1] * point.z + m1[3][1];\r\n var z = m1[0][2] * point.x + m1[1][2] * point.y + m1[2][2] * point.z + m1[3][2];\r\n\r\n if (!this.isAffine(m1)) {\r\n var c = 1 / (m1[0][3] * point.x + m1[1][3] * point.y + m1[2][3] * point.z + m1[3][3]);\r\n x *= c;\r\n y *= c;\r\n z *= c;\r\n }\r\n\r\n return { x: x, y: y, z: z };\r\n },\r\n getMatrixVectorAnd: function (m1, v1) {\r\n var x = m1[0][0] * v1.x + m1[1][0] * v1.y + m1[2][0] * v1.z;\r\n var y = m1[0][1] * v1.x + m1[1][1] * v1.y + m1[2][1] * v1.z;\r\n var z = m1[0][2] * v1.x + m1[1][2] * v1.y + m1[2][2] * v1.z;\r\n\r\n return Ej3DRender.vector3D.prototype.vector3D(x, y, z);\r\n },\r\n getMatrixAdd: function (m1, m2) {\r\n var m = this.matrix3D(4);\r\n\r\n for (var i = 0; i < 4; i++) {\r\n for (var j = 0; j < 4; j++) {\r\n m[i][j] = m1[i][j] + m2[i][j];\r\n }\r\n }\r\n\r\n return m;\r\n },\r\n getMatrixMultiplication: function (m1, m2) {\r\n var res = this.getIdentity();\r\n\r\n for (var i = 0; i < this.MATRIX_SIZE; i++) {\r\n for (var j = 0; j < this.MATRIX_SIZE; j++) {\r\n var v = 0;\r\n\r\n for (var k = 0; k < this.MATRIX_SIZE; k++) {\r\n v += m1[k][j] * m2[i][k];\r\n var t = v;\r\n }\r\n\r\n res[i][j] = v;\r\n }\r\n }\r\n\r\n return res;\r\n },\r\n getMatrixEqual: function (m1, m2) {\r\n var res = true;\r\n\r\n for (var i = 0; i < m1.length; i++) {\r\n for (var j = 0; j < m1.length; j++) {\r\n if (m1[i][j] != m2[i][j]) {\r\n res = false;\r\n }\r\n }\r\n }\r\n\r\n return res;\r\n },\r\n getMatrixNotEqual: function (m1, m2) {\r\n var res = true;\r\n\r\n for (var i = 0; i < m1.length; i++) {\r\n for (var j = 0; j < m1.length; j++) {\r\n if (m1[i][j] != m2[i][j]) {\r\n res = false;\r\n }\r\n }\r\n }\r\n\r\n return !res;\r\n },\r\n\r\n\r\n getMinor: function (dd, columnIndex, rowIndex) {\r\n return (((columnIndex + rowIndex) % 2 == 0) ? 1 : -1) * this.getDeterminant(this.getMMtr(dd, columnIndex, rowIndex));\r\n\r\n },\r\n\r\n getMMtr: function (dd, columnIndex, rowIndex) {\r\n var count = dd.length - 1;\r\n var d = this.createArray(count);\r\n\r\n for (var i = 0; i < count; i++) {\r\n var m = (i >= columnIndex) ? i + 1 : i;\r\n d[i] = this.createArray(count);\r\n\r\n for (var j = 0; j < count; j++) {\r\n var n = (j >= rowIndex) ? j + 1 : j;\r\n\r\n d[i][j] = dd[m][n];\r\n }\r\n }\r\n return d;\r\n },\r\n getDeterminant: function (dd) {\r\n var count = dd.length;\r\n var res = 0;\r\n\r\n if (count < 2) {\r\n res = dd[0][0];\r\n }\r\n else {\r\n var k = 1;\r\n\r\n for (var i = 0; i < count; i++) {\r\n var dm = this.getMMtr(dd, i, 0);\r\n\r\n res += k * dd[i][0] * this.getDeterminant(dm);\r\n k = (k > 0) ? -1 : 1;\r\n }\r\n }\r\n\r\n return res;\r\n },\r\n\r\n\r\n transform: function (x, y, z) {\r\n var res = this.getIdentity();\r\n\r\n res[3][0] = x;\r\n res[3][1] = y;\r\n res[3][2] = z;\r\n\r\n return res;\r\n },\r\n\r\n\r\n turn: function (angle) {\r\n var res = this.getIdentity();\r\n\r\n res[0][0] = Math.cos(angle);\r\n res[2][0] = -Math.sin(angle);\r\n res[0][2] = Math.sin(angle);\r\n res[2][2] = Math.cos(angle);\r\n\r\n return res;\r\n },\r\n\r\n tilt: function (angle) {\r\n var res = this.getIdentity();\r\n\r\n res[1][1] = Math.cos(angle);\r\n res[2][1] = Math.sin(angle);\r\n res[1][2] = -(Math.sin(angle));\r\n res[2][2] = Math.cos(angle);\r\n\r\n return res;\r\n },\r\n transposed: function (matrix3D) {\r\n var m = this.getIdentity();\r\n\r\n for (var i = 0; i < this.MATRIX_SIZE; i++) {\r\n for (var j = 0; j < this.MATRIX_SIZE; j++) {\r\n m[i][j] = matrix3D[j][i];\r\n }\r\n }\r\n return m;\r\n },\r\n shear: function (xy, xz, yx, yz, zx, zy) {\r\n var res = this.getIdentity();\r\n\r\n res[1, 0] = xy;\r\n res[2, 0] = xz;\r\n res[0, 1] = yx;\r\n res[2, 1] = yz;\r\n res[0, 2] = zx;\r\n res[1, 2] = zy;\r\n\r\n return res;\r\n }\r\n\r\n\r\n }\r\n Ej3DRender.Graphics3D.prototype = {\r\n addVisual: function (polygon) {\r\n if ((polygon == null) || (polygonobj.test(polygon))) {\r\n return -1;\r\n }\r\n polygon.Graphics3D = this;\r\n return bsptreeobj.add(polygon);\r\n },\r\n\r\n getVisualCount: function () {\r\n return ej.Ej3DRender.Polygons.length();\r\n },\r\n remove: function (polygon) {\r\n ej.Ej3DRender.Polygons.Remove(polygon);\r\n },\r\n\r\n clearVisual: function () {\r\n ej.Ej3DRender.Polygons = null;\r\n },\r\n\r\n getVisual: function () {\r\n return ej.Ej3DRender.Polygons;\r\n },\r\n prepareView: function (perspectiveAngle, depth, rotation, tilt, size, sender) {\r\n if (arguments.length == 0) {\r\n bsptreeobj.build();\r\n }\r\n else {\r\n if (ej.Ej3DRender.transform == null)\r\n ej.Ej3DRender.transform = ej.EjSvgRender.chartTransform3D.transform3D(size);\r\n else\r\n ej.Ej3DRender.transform.mViewport = size;\r\n if (!ej.Ej3DRender.tree)\r\n ej.Ej3DRender.tree = [];\r\n ej.Ej3DRender.transform.Rotation = rotation;\r\n ej.Ej3DRender.transform.Tilt = tilt;\r\n ej.Ej3DRender.transform.Depth = depth;\r\n ej.Ej3DRender.transform.PerspectiveAngle = perspectiveAngle;\r\n ej.EjSvgRender.chartTransform3D.transform(ej.Ej3DRender.transform);\r\n ej.Ej3DRender.tree[sender._id] = bsptreeobj.build();\r\n\r\n }\r\n },\r\n view: function (panel, sender, rotation, tilt, size, perspectiveAngle, depth) {\r\n var MaxValue = 32767;\r\n if (arguments.length == 2) {\r\n if (panel == null) return;\r\n var eye = vector.vector3D(0, 0, MaxValue);\r\n this.drawBspNode3D(ej.Ej3DRender.tree[sender._id], eye, panel, sender);\r\n }\r\n else {\r\n if (panel == null) return;\r\n\r\n if (ej.Ej3DRender.transform == null)\r\n ej.Ej3DRender.transform = ej.EjSvgRender.chartTransform3D.transform3D(size);\r\n else\r\n ej.Ej3DRender.transform.mViewport = size;\r\n ej.Ej3DRender.transform.Rotation = rotation;\r\n ej.Ej3DRender.transform.Tilt = tilt;\r\n ej.Ej3DRender.transform.Depth = depth;\r\n ej.Ej3DRender.transform.PerspectiveAngle = perspectiveAngle;\r\n ej.EjSvgRender.chartTransform3D.transform(ej.Ej3DRender.transform);\r\n var eye = vector.vector3D(0, 0, MaxValue);\r\n this.drawBspNode3D(ej.Ej3DRender.tree[sender._id], eye, panel, sender);\r\n }\r\n },\r\n\r\n draw3DElement: function (tr, sender) {\r\n if (tr.Plane.element) {\r\n if (tr.Plane.element.tag == \"text\" || tr.Plane.element.tag == \"dataLabel\")\r\n polygonobj.drawText(tr.Plane, sender);\r\n else if (tr.Plane.element.tag == \"polyline\")\r\n polygonobj.drawPolyLine(tr.Plane, sender);\r\n else if (tr.Plane.element.tag == \"template\")\r\n polygonobj.drawTemplate(tr.Plane, sender);\r\n else\r\n polygonobj.drawLine(tr.Plane, sender);\r\n }\r\n\r\n else\r\n polygonobj.draw(tr.Plane, sender);\r\n },\r\n\r\n drawBspNode3D: function (tr, eye, panel, sender) {\r\n if (tr == null || ej.Ej3DRender.transform == null) return;\r\n while (true) {\r\n var r = vector.vector3dAND(polygonobj.getNormal(ej.EjSvgRender.chartTransform3D.result(ej.Ej3DRender.transform), tr.Plane.VectorPoints), eye);\r\n if (r > tr.Plane.D) {\r\n if (tr.Front != null) {\r\n this.drawBspNode3D(tr.Front, eye, panel, sender);\r\n }\r\n\r\n this.draw3DElement(tr, sender);\r\n\r\n if (tr.Back != null) {\r\n tr = tr.Back;\r\n continue;\r\n }\r\n }\r\n else {\r\n if (tr.Back != null) {\r\n this.drawBspNode3D(tr.Back, eye, panel, sender);\r\n }\r\n\r\n this.draw3DElement(tr, sender);\r\n\r\n if (tr.Front != null) {\r\n tr = tr.Front;\r\n continue;\r\n }\r\n }\r\n break;\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n Ej3DRender.BSPTreeBuilder.prototype = {\r\n //Members\r\n EPSILON: 0.0005,\r\n Polygon: [],\r\n\r\n //Methods\r\n add: function (poly) {\r\n ej.Ej3DRender.Polygons.push(poly);\r\n return ej.Ej3DRender.Polygons.length - 1;\r\n },\r\n\r\n remove: function (index) {\r\n ej.Ej3DRender.Polygons.splice(index, 1);\r\n },\r\n\r\n clear: function () {\r\n ej.Ej3DRender.Polygons = [];\r\n },\r\n\r\n count: function () {\r\n return ej.Ej3DRender.Polygons.length;\r\n },\r\n\r\n getNext: function (i, count) {\r\n if (i >= count) {\r\n return i - count;\r\n }\r\n if (i < 0) {\r\n return i + count;\r\n }\r\n\r\n return i;\r\n },\r\n getNodeCount: function (el) {\r\n return (el == null) ? 0 : 1 + this.getNodeCount(el.Back) + this.getNodeCount(el.Front);\r\n },\r\n vector3DIndexClassification: function (point, ind, res) {\r\n return {\r\n index: ind,\r\n result: res,\r\n vector: point,\r\n\r\n isCuttingBackPoint: false,\r\n cuttingBackPairIndex: null,\r\n alreadyCuttedBack: false,\r\n\r\n isCuttingFrontPoint: false,\r\n cuttingFrontPairIndex: null,\r\n alreadyCuttedFront: false\r\n }\r\n },\r\n classifyPoint: function (pt, pln) {\r\n var res = \"OnPlane\";\r\n var sv = -pln.D - Ej3DRender.vector3D.prototype.vector3dAND(pt, pln.normal);\r\n\r\n if (sv > this.EPSILON) {\r\n res = \"OnBack\";\r\n }\r\n else if (sv < -this.EPSILON) {\r\n res = \"OnFront\";\r\n }\r\n\r\n return res;\r\n },\r\n\r\n classifyPolygon: function (pln, plg) {\r\n var res = \"Unknown\";\r\n var points = plg.Points;\r\n\r\n if (points == null)\r\n return res;\r\n var onBack = 0;\r\n var onFront = 0;\r\n var onPlane = 0;\r\n var normal = pln.normal;// root node normailized value perpendicular direction\r\n var d = pln.D; // constant of the plan or depth\r\n\r\n for (var i = 0, len = points.length; i < len; i++) {\r\n var r = -d - Ej3DRender.vector3D.prototype.vector3dAND(points[i], normal); // Comparision of Plane point depth with the other nodes\r\n\r\n if (r > this.EPSILON) {\r\n onBack++;\r\n }\r\n else if (r < -this.EPSILON) {\r\n onFront++;\r\n }\r\n else {\r\n onPlane++;\r\n }\r\n\r\n if ((onBack > 0) && (onFront > 0)) {\r\n break;\r\n }\r\n }\r\n if (onPlane == points.length) {\r\n res = \"OnPlane\";\r\n }\r\n else if (onFront + onPlane == points.length) {\r\n res = \"ToRight\";\r\n }\r\n else if (onBack + onPlane == points.length) {\r\n res = \"ToLeft\";\r\n }\r\n else {\r\n res = \"Unknown\";\r\n }\r\n return res;\r\n },\r\n splitPolygon: function (poly, part) {\r\n var backP = [];\r\n var frontP = [];\r\n\r\n // this code looks for points which lie on the part plane and divide polygon into two parts\r\n if (poly.Points != null) {\r\n var polyPoints = [];\r\n var backPartPoints = [];\r\n var frontPartPoints = [];\r\n\r\n var outpts;\r\n var inpts;\r\n\r\n var count = poly.Points.length;\r\n for (var i = 0; i < count; i++) {\r\n var ptB = poly.Points[i];\r\n var ptC = poly.Points[this.getNext(i + 1, count)];\r\n var sideB = this.classifyPoint(ptB, part);\r\n var sideC = this.classifyPoint(ptC, part);\r\n\r\n var vwiwcB = this.vector3DIndexClassification(ptB, polyPoints.length, sideB);\r\n polyPoints.push(vwiwcB);\r\n\r\n if ((sideB != sideC) && (sideB != \"OnPlane\") &&\r\n (sideC != \"OnPlane\")) {\r\n var v = vector.vector3DMinus(ptB, ptC);\r\n var dir = vector.vector3DMinus(vector.vector3DStarMultiply(part.normal, (-part.D)), ptC);\r\n\r\n var sv = vector.vector3dAND(dir, part.normal);\r\n var sect = sv / vector.vector3dAND(part.normal, v);\r\n var ptP = vector.vector3DPlus(ptC, vector.vector3DStarMultiply(v, sect));\r\n var vwiwc = this.vector3DIndexClassification(ptP, polyPoints.length, \"OnPlane\");\r\n\r\n polyPoints.push(vwiwc);\r\n backPartPoints.push(vwiwc);\r\n frontPartPoints.push(vwiwc);\r\n }\r\n else\r\n if (sideB == \"OnPlane\") {\r\n var ptA = poly.Points[this.getNext(i - 1, count)];\r\n var sideA = this.classifyPoint(ptA, part);\r\n if ((sideA == sideC)) continue;\r\n if ((sideA != \"OnPlane\") && (sideC != \"OnPlane\")) {\r\n backPartPoints.push(vwiwcB);\r\n frontPartPoints.push(vwiwcB);\r\n }\r\n else\r\n if (sideA == \"OnPlane\") {\r\n switch (sideC) {\r\n case \"OnBack\":\r\n backPartPoints.push(vwiwcB);\r\n break;\r\n case \"OnFront\":\r\n frontPartPoints.push(vwiwcB);\r\n break;\r\n }\r\n }\r\n else\r\n if (sideC == \"OnPlane\") {\r\n switch (sideA) {\r\n case \"OnBack\":\r\n backPartPoints.push(vwiwcB);\r\n break;\r\n case \"OnFront\":\r\n frontPartPoints.push(vwiwcB);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if ((frontPartPoints.length != 0) || (backPartPoints.length != 0)) {\r\n for (var i = 0; i < backPartPoints.length - 1; i += 2) {\r\n var vwiwc1 = backPartPoints[i];\r\n var vwiwc2 = backPartPoints[i + 1];\r\n vwiwc1.CuttingBackPoint = true;\r\n vwiwc2.CuttingBackPoint = true;\r\n vwiwc1.CuttingBackPairIndex = vwiwc2.index;\r\n vwiwc2.CuttingBackPairIndex = vwiwc1.index;\r\n }\r\n for (var i = 0; i < frontPartPoints.length - 1; i += 2) {\r\n var vwiwc1 = frontPartPoints[i];\r\n var vwiwc2 = frontPartPoints[i + 1];\r\n vwiwc1.CuttingFrontPoint = true;\r\n vwiwc2.CuttingFrontPoint = true;\r\n vwiwc1.CuttingFrontPairIndex = vwiwc2.index;\r\n vwiwc2.CuttingFrontPairIndex = vwiwc1.index;\r\n }\r\n\r\n\r\n for (var i = 0; i < backPartPoints.length - 1; i++) {\r\n var vwiwc1 = backPartPoints[i];\r\n if (vwiwc1.alreadyCuttedBack) continue;\r\n var outpts = this.cutOutBackPolygon(polyPoints, vwiwc1);\r\n\r\n if (outpts.length > 2) {\r\n var polygon1 = polygonobj.polygon3D(outpts, poly);\r\n backP.push($.extend({}, polygon1));\r\n }\r\n }\r\n\r\n for (var i = 0; i < frontPartPoints.length - 1; i++) {\r\n var vwiwc2 = frontPartPoints[i];\r\n if (vwiwc2.alreadyCuttedFront) continue;\r\n inpts = this.cutOutFrontPolygon(polyPoints, vwiwc2);\r\n if (inpts.length > 2) {\r\n var polygon2 = polygonobj.polygon3D(inpts, poly);\r\n frontP.push($.extend({}, polygon2));\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n backP.push(poly);\r\n frontP.push(poly);\r\n }\r\n\r\n return { BackP: backP, FrontP: frontP }\r\n },\r\n cutOutFrontPolygon: function (polyPoints, vwiwc) {\r\n var points = [];\r\n\r\n var curVW = vwiwc;\r\n\r\n while (true) {\r\n curVW.alreadyCuttedFront = true;\r\n points.push(curVW.vector);\r\n\r\n var curVWPair = polyPoints[curVW.CuttingFrontPairIndex];\r\n\r\n if (curVW.CuttingFrontPoint) {\r\n if (!curVWPair.alreadyCuttedFront) {\r\n curVW = curVWPair;\r\n }\r\n else {\r\n var curVWPrev = polyPoints[this.getNext(curVW.index - 1, polyPoints.length)];\r\n var curVWNext = polyPoints[this.getNext(curVW.index + 1, polyPoints.length)];\r\n\r\n if ((curVWPrev.result == \"OnFront\") && !curVWPrev.alreadyCuttedFront) {\r\n curVW = curVWPrev;\r\n }\r\n else\r\n if ((curVWNext.result == \"OnFront\") && !curVWNext.alreadyCuttedFront) {\r\n curVW = curVWNext;\r\n }\r\n else {\r\n return points;\r\n }\r\n }\r\n }\r\n else {\r\n var curPrev = polyPoints[this.getNext(curVW.index - 1, polyPoints.length)];\r\n var curNext = polyPoints[this.getNext(curVW.index + 1, polyPoints.length)];\r\n\r\n if ((curPrev.result != \"OnBack\") && !curPrev.alreadyCuttedFront) {\r\n curVW = curPrev;\r\n }\r\n else\r\n if ((curNext.result != \"OnBack\") && !curNext.alreadyCuttedFront) {\r\n curVW = curNext;\r\n }\r\n else {\r\n return points;\r\n }\r\n }\r\n }\r\n return points;\r\n },\r\n\r\n cutOutBackPolygon: function (polyPoints, vwiwc) {\r\n var points = [];\r\n var curVW = vwiwc;\r\n\r\n while (true) {\r\n curVW.alreadyCuttedBack = true;\r\n points.push(curVW.vector);\r\n\r\n var curVWPair = polyPoints[curVW.CuttingBackPairIndex];\r\n\r\n if (curVW.CuttingBackPoint) {\r\n if (!curVWPair.alreadyCuttedBack) {\r\n curVW = curVWPair;\r\n }\r\n else {\r\n var curVWPrev = polyPoints[this.getNext(curVW.index - 1, polyPoints.length)];\r\n var curVWNext = polyPoints[this.getNext(curVW.index + 1, polyPoints.length)];\r\n\r\n if ((curVWPrev.result == \"OnBack\") && !curVWPrev.alreadyCuttedBack) {\r\n curVW = curVWPrev;\r\n }\r\n else\r\n if ((curVWNext.result == \"OnBack\") && !curVWNext.alreadyCuttedBack) {\r\n curVW = curVWNext;\r\n }\r\n else {\r\n return points;\r\n }\r\n }\r\n }\r\n else {\r\n var curVWPrev = polyPoints[this.getNext(curVW.index - 1, polyPoints.length)];\r\n var curVWNext = polyPoints[this.getNext(curVW.index + 1, polyPoints.length)];\r\n\r\n if ((curVWPrev.result != \"OnFront\") && !curVWPrev.alreadyCuttedBack) {\r\n curVW = curVWPrev;\r\n }\r\n else\r\n if ((curVWNext.result != \"OnFront\") && !curVWNext.alreadyCuttedBack) {\r\n curVW = curVWNext;\r\n }\r\n else {\r\n return points;\r\n }\r\n }\r\n }\r\n return points\r\n },\r\n build: function () {\r\n if (!arguments[0]) {\r\n return (this.build(ej.Ej3DRender.Polygons));\r\n }\r\n else {\r\n var arlist = arguments[0];\r\n if (arlist.length < 1) return null;\r\n var bspNode = { Back: null, Front: null, Plane: null }\r\n var plane = arlist[0];\r\n bspNode.Plane = plane;\r\n var arleft = [];\r\n var arright = [];\r\n\r\n for (var i = 1, len = arlist.length; i < len; i++) {\r\n var pln = arlist[i];\r\n\r\n if (pln == plane) continue;\r\n var r = this.classifyPolygon(plane, pln);\r\n\r\n switch (r) {\r\n case \"OnPlane\":\r\n case \"ToRight\":\r\n arright.push(pln);\r\n break;\r\n\r\n case \"ToLeft\":\r\n arleft.push(pln);\r\n break;\r\n\r\n case \"Unknown\":\r\n //if (pln is Line3D || pln is UIElement3D)\r\n if (pln.element && (pln.element.tag == \"line\" || pln.element.tag == \"text\")) {\r\n arleft.push(pln);\r\n }\r\n else {\r\n\r\n var result = this.splitPolygon(pln, plane);\r\n for (var k = 0; k < result.BackP.length; k++) {\r\n result.BackP[k].Name = result.BackP[k].Name + \"back\";\r\n arleft.push(result.BackP[k]);\r\n }\r\n for (var j = 0; j < result.FrontP.length; j++) {\r\n result.FrontP[j].Name = result.FrontP[j].Name + \"front\";\r\n arright.push(result.FrontP[j]);\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n\r\n if (arleft.length > 0) {\r\n bspNode.Back = this.build(arleft);\r\n }\r\n\r\n if (arright.length > 0) {\r\n bspNode.Front = this.build(arright);\r\n }\r\n\r\n return bspNode;\r\n }\r\n }\r\n\r\n }\r\n\r\n Ej3DRender.polygon3D.prototype = {\r\n // Member \r\n epsilon: 0.00001,\r\n normal: { x: 0, y: 0, z: 0 },\r\n\r\n vector: new (new ej.Ej3DRender()).vector3D(),\r\n\r\n // Constructor\r\n polygon3D: function (points, tag, index, stroke, strokeThickness, opacity, fill, name) {\r\n\r\n if (arguments.length == 3) {\r\n this.calcNormal(arguments[0], arguments[1], arguments[2])\r\n }\r\n else if (arguments.length == 2) {\r\n points = arguments[0];\r\n this.calcNormal(points[0], points[1], points[2]);\r\n this.vectorPoints = points;\r\n this.calcNormal(this.vectorPoints);\r\n var polygon = arguments[1];\r\n polygon.Normal = this.normal;\r\n polygon.normal = this.normal;\r\n polygon.Points = points;\r\n polygon.VectorPoints = this.vectorPoints;\r\n polygon.IsSplitted = true;\r\n polygon.d = this.d;\r\n polygon.D = this.d;\r\n return polygon;\r\n\r\n }\r\n else {\r\n this.calcNormal(points[0], points[1], points[2]);\r\n this.vectorPoints = points;\r\n this.calcNormal(this.vectorPoints);\r\n var element = { Tag: 'path', Parent: arguments[arguments.length - 1] }\r\n var polygon = {\r\n Normal: this.normal,\r\n normal: this.normal,\r\n Points: points,\r\n VectorPoints: this.vectorPoints,\r\n Index: index,\r\n Tag: tag,\r\n Name: (name) ? name : null,\r\n StrokeThickness: strokeThickness,\r\n Opacity: opacity,\r\n Fill: fill,\r\n d: this.d,\r\n D: this.d\r\n }\r\n if (arguments.length != 1)\r\n polygon.Element = element;\r\n\r\n return polygon;\r\n\r\n }\r\n },\r\n\r\n //Methods\r\n createLine: function (line, x1, y1, x2, y2, depth) {\r\n var strokeThickness = line.width;\r\n var vectorColl = [];\r\n vectorColl[0] = vector.vector3D(x1, y1, depth);\r\n vectorColl[1] = vector.vector3D(x1 + strokeThickness, y2 + strokeThickness, depth);\r\n vectorColl[2] = vector.vector3D(x2, y2, depth);\r\n return this.line3D(line, vectorColl);\r\n },\r\n createPolyline: function (points, element) {\r\n if (points.length == 2) {\r\n var prePoint = points[1];\r\n points.push(vector.vector3D(prePoint.x, prePoint.y, prePoint.z));\r\n }\r\n return this.polyLine3D(element, points);\r\n },\r\n polyLine3D: function (element, points) {\r\n var plane = this.polygon3D(points);\r\n plane.element = element;\r\n return plane;\r\n },\r\n\r\n line3D: function (element, points) {\r\n var plane = this.polygon3D(points);\r\n plane.element = element;\r\n return plane;\r\n },\r\n text3D: function (element, points) {\r\n var plane = this.polygon3D(points);\r\n plane.element = element;\r\n return plane;\r\n },\r\n createCylinder: function (v1, v2, tag, index, type, stroke, fill, strokeThickness, opacity, inverse, name, parent) {\r\n var i = 0, ox, oy, oz, vts, pathCount = 24, theta = 360 / pathCount, DtoR = Math.PI / 180, CenterZ = (parseFloat)((v1.z + v2.z) / 2), res = [], oPts = [], tVtxs = [], bVtxs = [], radiusb = (v2.y - v1.y) < (v2.z - v1.z) ? (parseFloat)((v2.y - v1.y) / 2) : (parseFloat)((v2.z - v1.z) / 2), radiusc = (v2.x - v1.x) < (v2.z - v1.z) ? (parseFloat)((v2.x - v1.x) / 2) : (parseFloat)((v2.z - v1.z) / 2), CenterX = (parseFloat)((v1.x + v2.x) / 2), CenterY = (parseFloat)((v1.y + v2.y) / 2);\r\n switch (type) {\r\n case \"bar\":\r\n case \"stackingbar\":\r\n case \"stackingbar100\":\r\n pathCount++;\r\n while (pathCount--) {\r\n oy = (parseFloat)(CenterY + radiusb * Math.cos((i * theta) * DtoR));\r\n oz = (parseFloat)(CenterZ + radiusb * Math.sin((i * theta) * DtoR));\r\n oPts[i] = { Y: oy, Z: oz };\r\n tVtxs.push(vector.vector3D(v1.x, oPts[i].Y, oPts[i].Z));\r\n bVtxs.push(vector.vector3D(v2.x, oPts[i].Y, oPts[i].Z));\r\n if (i > 0) {\r\n vts = new Array(vector.vector3D(v1.x, oPts[i - 1].Y, oPts[i - 1].Z),\r\n vector.vector3D(v2.x, oPts[i - 1].Y, oPts[i - 1].Z),\r\n vector.vector3D(v2.x, oPts[i].Y, oPts[i].Z),\r\n vector.vector3D(v1.x, oPts[i].Y, oPts[i].Z))\r\n res[i + 1] = this.polygon3D(vts, tag, index, fill, 0, opacity, fill, \"_\" + (i + 1).toString() + \"_\" + name, parent);\r\n graphics.addVisual(res[i + 1]);\r\n }\r\n i++;\r\n }\r\n break;\r\n case \"column\":\r\n case \"stackingcolumn\":\r\n case \"stackingcolumn100\":\r\n pathCount++;\r\n while (pathCount--) {\r\n ox = (parseFloat)(CenterX + radiusc * Math.cos((i * theta) * DtoR));\r\n oz = (parseFloat)(CenterZ + radiusc * Math.sin((i * theta) * DtoR));\r\n oPts[i] = { X: ox, Z: oz };\r\n tVtxs.push(vector.vector3D(oPts[i].X, v1.y, oPts[i].Z));\r\n bVtxs.push(vector.vector3D(oPts[i].X, v2.y, oPts[i].Z));\r\n if (i > 0) {\r\n vts = new Array(vector.vector3D(oPts[i - 1].X, v1.y, oPts[i - 1].Z),\r\n vector.vector3D(oPts[i - 1].X, v2.y, oPts[i - 1].Z),\r\n vector.vector3D(oPts[i].X, v2.y, oPts[i].Z),\r\n vector.vector3D(oPts[i].X, v1.y, oPts[i].Z))\r\n res[i + 1] = this.polygon3D(vts, tag, index, fill, 0, opacity, fill, \"_\" + (i + 1).toString() + \"_\" + name, parent);\r\n graphics.addVisual(res[i + 1]);\r\n }\r\n i++;\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n res[0] = this.polygon3D(bVtxs, tag, index, stroke, 0, opacity, fill, \"_0_\" + name, parent);\r\n res[1] = this.polygon3D(tVtxs, tag, index, stroke, strokeThickness, opacity, fill, \"_1_\" + name, parent);\r\n graphics.addVisual(res[0]);\r\n graphics.addVisual(res[1]);\r\n return res;\r\n },\r\n\r\n createBox: function (v1, v2, tag, index, graphics3D, stroke, fill, strokeThickness, opacity, inverse, name, parent) {\r\n var res = [];\r\n\r\n var p1 = new Array(vector.vector3D(v1.x, v1.y, v1.z),\r\n vector.vector3D(v2.x, v1.y, v1.z),\r\n vector.vector3D(v2.x, v2.y, v1.z),\r\n vector.vector3D(v1.x, v2.y, v1.z))\r\n\r\n var p2 = new Array(\r\n vector.vector3D(v1.x, v1.y, v2.z),\r\n vector.vector3D(v2.x, v1.y, v2.z),\r\n vector.vector3D(v2.x, v2.y, v2.z),\r\n vector.vector3D(v1.x, v2.y, v2.z)\r\n )\r\n\r\n var p3 = new Array(\r\n\r\n vector.vector3D(v1.x, v1.y, v2.z),\r\n vector.vector3D(v2.x, v1.y, v2.z),\r\n vector.vector3D(v2.x, v1.y, v1.z),\r\n vector.vector3D(v1.x, v1.y, v1.z)\r\n )\r\n\r\n var p4 = new Array(\r\n vector.vector3D(v1.x, v2.y, v2.z),\r\n vector.vector3D(v2.x, v2.y, v2.z),\r\n vector.vector3D(v2.x, v2.y, v1.z),\r\n vector.vector3D(v1.x, v2.y, v1.z)\r\n )\r\n\r\n var p5 = new Array(\r\n vector.vector3D(v1.x, v1.y, v1.z),\r\n vector.vector3D(v1.x, v1.y, v2.z),\r\n vector.vector3D(v1.x, v2.y, v2.z),\r\n vector.vector3D(v1.x, v2.y, v1.z)\r\n )\r\n\r\n var p6 = new Array(\r\n vector.vector3D(v2.x, v1.y, v1.z),\r\n vector.vector3D(v2.x, v1.y, v2.z),\r\n vector.vector3D(v2.x, v2.y, v2.z),\r\n vector.vector3D(v2.x, v2.y, v1.z)\r\n )\r\n if (arguments[10]) {\r\n\r\n res[0] = this.polygon3D(p1, tag, index, stroke, strokeThickness, opacity, fill, \"_0_\" + name, parent);\r\n res[1] = this.polygon3D(p2, tag, index, stroke, strokeThickness, opacity, fill, \"_1_\" + name, parent);\r\n res[2] = this.polygon3D(p3, tag, index, stroke, strokeThickness, opacity, fill, \"_2_\" + name, parent);\r\n res[3] = this.polygon3D(p4, tag, index, stroke, strokeThickness, opacity, fill, \"_3_\" + name, parent);\r\n res[4] = this.polygon3D(p5, tag, index, stroke, strokeThickness, opacity, fill, \"_4_\" + name, parent);\r\n res[5] = this.polygon3D(p6, tag, index, stroke, strokeThickness, opacity, fill, \"_5_\" + name, parent);\r\n }\r\n else {\r\n var parent = arguments[arguments.length - 1];\r\n res[0] = this.polygon3D(p1, tag, index, stroke, strokeThickness, opacity, fill, \"_0_\" + index, parent);\r\n res[1] = this.polygon3D(p2, tag, index, stroke, strokeThickness, opacity, fill, \"_1_\" + index, parent);\r\n res[2] = this.polygon3D(p3, tag, index, stroke, strokeThickness, opacity, fill, \"_2_\" + index, parent);\r\n res[3] = this.polygon3D(p4, tag, index, stroke, strokeThickness, opacity, fill, \"_3_\" + index, parent);\r\n res[4] = this.polygon3D(p5, tag, index, stroke, strokeThickness, opacity, fill, \"_4_\" + index, parent);\r\n res[5] = this.polygon3D(p6, tag, index, stroke, strokeThickness, opacity, fill, \"_5_\" + index, parent);\r\n }\r\n\r\n if (inverse) {\r\n graphics.addVisual(res[0]);\r\n graphics.addVisual(res[1]);\r\n graphics.addVisual(res[2]);\r\n graphics.addVisual(res[3]);\r\n graphics.addVisual(res[4]);\r\n graphics.addVisual(res[5]);\r\n }\r\n else {\r\n graphics.addVisual(res[5]);\r\n graphics.addVisual(res[4]);\r\n graphics.addVisual(res[0]);\r\n graphics.addVisual(res[1]);\r\n graphics.addVisual(res[2]);\r\n graphics.addVisual(res[3]);\r\n\r\n }\r\n return res;\r\n },\r\n\r\n\r\n calcNormal: function () {\r\n if (arguments.length >= 3) {\r\n // Relative information of the points\r\n var v1 = arguments[0];\r\n var v2 = arguments[1];\r\n var v3 = arguments[2];\r\n var v4 = vector.vector3DMinus(v1, v2);\r\n var v5 = vector.vector3DMinus(v3, v2);\r\n var n = vector.vector3DMultiply(v4, v5);\r\n\r\n var l = vector.getLength(n);//Get length of the vector\r\n\r\n if (l < this.epsilon) {\r\n l = 1;\r\n }\r\n\r\n this.normal = vector.vector3D(n.x / l, n.y / l, n.z / l); //Calculate normalization of the vector\r\n this.d = -(this.normal.x * v1.x + this.normal.y * v1.y + this.normal.z * v1.z);// Normalized values * 1st coordinates Coordinates - Depth of the plan\r\n\r\n if (arguments[3]) {\r\n arguments[3].normal = this.normal;\r\n arguments.d = this.d;\r\n }\r\n }\r\n else {\r\n var Points = arguments[0];\r\n this.calcNormal(Points[0], Points[1], Points[2], arguments[1]);\r\n\r\n for (var i = 3; (i < Points.length) && (this.test()); i++) {\r\n this.calcNormal(Points[i], Points[0], Points[i / 2]);\r\n }\r\n }\r\n },\r\n\r\n test: function () {\r\n return !vector.isValid(this.normal);\r\n },\r\n\r\n transform: function (matrix, plan) {\r\n if (plan.Points != null) {\r\n for (var i = 0; i < plan.Points.length; i++) {\r\n\r\n plan.VectorPoints[i] = plan.Points[i] = matrixobj.getMatrixVectorMutiple(matrix, plan.Points[i]);\r\n }\r\n\r\n this.calcNormal(plan.VectorPoints, plan);\r\n }\r\n else {\r\n var v = matrix * (plan.normal * -plan.d);\r\n plan.normal = matrixobj.getMatrixVectorAnd(matrix, plan.normal);\r\n vector.normalize(normal);\r\n plan.d = -(plan.normal & v);\r\n }\r\n },\r\n\r\n getPoint: function (x, y, normal, d) {\r\n if (typeof x == double) {\r\n var z = -(normal.x * x + normal.y * y + d) / normal.z;\r\n\r\n return vector.vector3D(x, y, z);\r\n }\r\n else {\r\n var position = x;\r\n var ray = y;\r\n var dir = vector.vector3DMinus(vector.vector3DStarMultiply(normal, (-d)), position);\r\n\r\n var sv = vector.vector3dAND(dir, normal);\r\n var sect = sv / vector.vector3dAND(normal, ray);\r\n\r\n return vector.vector3DPlus(position, (vector.vector3DStarMultiply(ray * sect)));\r\n }\r\n },\r\n\r\n getNormal: function (transform, VectorPoints) {\r\n var norm;\r\n\r\n if (VectorPoints != null) {\r\n norm = vector.getNormal(matrixobj.getMatrixVectorMutiple(transform, VectorPoints[0]),\r\n matrixobj.getMatrixVectorMutiple(transform, VectorPoints[1]), matrixobj.getMatrixVectorMutiple(transform, VectorPoints[2]))\r\n\r\n\r\n for (var i = 3; (i < VectorPoints.length) && !vector.isValid(norm) && VectorPoints[i / 2]; i++) {\r\n var v1 = matrixobj.getMatrixVectorMutiple(transform, VectorPoints[i]);\r\n var v2 = matrixobj.getMatrixVectorMutiple(transform, VectorPoints[0]);\r\n var v3 = matrixobj.getMatrixVectorMutiple(transform, VectorPoints[i / 2]);\r\n\r\n norm = vector.getNormal(v1, v2, v3);\r\n }\r\n }\r\n else {\r\n norm = matrixobj.getMatrixVectorAnd(transform, normal);\r\n vector.normalize();\r\n }\r\n\r\n return norm;\r\n\r\n },\r\n\r\n createTextElement: function (position, element, xLen, yLen) {\r\n\r\n var vectorColl = [];\r\n var x = position.x;\r\n var y = position.y;\r\n\r\n var desiredWidth = element.Width;\r\n var desiredHeight = element.Height;\r\n\r\n vectorColl[0] = this.vector.vector3D(x, y, position.z);\r\n vectorColl[1] = this.vector.vector3D(x + desiredWidth, y + desiredHeight + yLen, position.z);\r\n vectorColl[2] = this.vector.vector3D(x + desiredWidth + xLen, y + desiredHeight + yLen, position.z);\r\n return this.text3D(element, vectorColl);\r\n },\r\n\r\n redraw: function () { },\r\n\r\n drawPolyLine: function (panel, sender) {\r\n var transform = ej.Ej3DRender.transform;\r\n var pathDirection = ej.EjSvgRender.utils._getStringBuilder();\r\n var StartPoint = ej.EjSvgRender.chartTransform3D.toScreen(panel.VectorPoints[0], transform);\r\n pathDirection.append(\"M\" + \" \" + (StartPoint.x) + \" \" + (StartPoint.y) + \" \");\r\n for (var i = 0; i < panel.VectorPoints.length; i++) {\r\n var lineSegment = ej.EjSvgRender.chartTransform3D.toScreen(panel.VectorPoints[i], transform);\r\n pathDirection.append(\"L\" + \" \" + (lineSegment.x) + \" \" + (lineSegment.y) + \" \");\r\n\r\n }\r\n\r\n var direction = pathDirection.toString();\r\n\r\n\r\n var optionsLine = {\r\n 'id': panel.element.id,\r\n 'stroke-dasharray': panel.element.dashArray,\r\n 'stroke-width': panel.element.width,\r\n 'stroke': panel.element.stroke,\r\n 'd': direction\r\n };\r\n optionsLine.id = (optionsLine.id).replace(/[^a-zA-Z0-9]/g, \"\");\r\n sender.svgRenderer.drawPath(optionsLine, panel.element.child);\r\n },\r\n\r\n drawLine: function (panel, sender) {\r\n\r\n var transform = ej.Ej3DRender.transform;\r\n if (transform == null) return;\r\n var actual3DPosition1 = ej.EjSvgRender.chartTransform3D.toScreen(panel.VectorPoints[0], transform);\r\n var actual3DPosition2 = ej.EjSvgRender.chartTransform3D.toScreen(panel.VectorPoints[2], transform);\r\n\r\n var optionsLine = {\r\n 'id': panel.element.id,\r\n x1: actual3DPosition1.x,\r\n y1: actual3DPosition1.y,\r\n x2: actual3DPosition2.x,\r\n y2: actual3DPosition2.y,\r\n 'stroke-dasharray': panel.element.dashArray,\r\n 'stroke-width': panel.element.width,\r\n 'stroke': panel.element.stroke,\r\n 'opacity': panel.element.opacity\r\n };\r\n optionsLine.id = (optionsLine.id).replace(/[^a-zA-Z0-9]/g, \"\");\r\n sender.svgRenderer.drawLine(optionsLine, panel.element.child);\r\n\r\n\r\n },\r\n drawTemplate: function (panel, sender) {\r\n var element = panel.element;\r\n var transform = ej.Ej3DRender.transform;\r\n if (transform == null) return;\r\n var actual3DPosition = ej.EjSvgRender.chartTransform3D.toScreen(panel.VectorPoints[0], transform);\r\n ej.EjSeriesRender.prototype.drawLabelTemplate(element.Label.series, element.Label.series.points[element.Label.pointIndex], element.Label.pointIndex, { X: actual3DPosition.x, Y: actual3DPosition.y }, sender)\r\n },\r\n drawText: function (panel, sender) {\r\n\r\n var element = panel.element;\r\n var transform = ej.Ej3DRender.transform;\r\n if (transform == null) return;\r\n var actual3DPosition = ej.EjSvgRender.chartTransform3D.toScreen(panel.VectorPoints[0], transform);\r\n var x = actual3DPosition.x;\r\n var y = actual3DPosition.y;\r\n\r\n if (element.tag == \"text\") {\r\n var options = {\r\n 'id': element.id,\r\n 'x': x,\r\n 'y': y,\r\n 'fill': element.font.color,\r\n 'font-size': element.font.size,\r\n 'font-family': element.font.fontFamily,\r\n 'font-style': element.font.fontStyle,\r\n 'font-weight': element.font.fontWeight,\r\n 'opacity': element.font.opacity,\r\n 'text-anchor': element.TextAnchor,\r\n \"cursor\": \"default\",\r\n 'transform': element.Angle ? 'rotate(' + element.Angle + ',' + (x) + ',' + y + ')' : null\r\n };\r\n\r\n sender.svgRenderer.drawText(options, panel.element.Label.Text, panel.element.child, panel.element.font);\r\n }\r\n else {\r\n var series = element.series;\r\n\r\n var labelFormat = (series.yAxis && series.yAxis.labelFormat) ? series.yAxis.labelFormat : \"\";\r\n var pointText = (element.point.text) ? element.point.text : element.point.y + labelFormat.substring(labelFormat.indexOf('}') + 1);\r\n var textOffset = ej.EjSvgRender.utils._measureText(pointText, null, series.marker.dataLabel.font);\r\n var margin = series.marker.dataLabel.margin;\r\n var width = textOffset.width + margin.left + margin.right;\r\n var height = textOffset.height + margin.top + margin.bottom;\r\n var location = { X: actual3DPosition.x, Y: actual3DPosition.y }, symbolName;\r\n\r\n\r\n if (series.marker.dataLabel.shape)\r\n var elementShape = series.marker.dataLabel.shape;\r\n else if (series.marker.dataLabel.shape)\r\n elementShape = marker.dataLabel.shape;\r\n else\r\n elementShape = \"None\";\r\n\r\n $.each(sender.model.symbolShape, function (name) {\r\n if (elementShape.toLowerCase() == name.toLowerCase())\r\n symbolName = name;\r\n });\r\n\r\n var xXalue = location.X - (margin.left) / 2 + (margin.right) / 2;\r\n var yValue = location.Y - (margin.top) / 2 - (height / margin.top) + (margin.bottom) / 2;\r\n\r\n var seriesIndex = $.inArray(series, sender.model.series);\r\n ej.EjSeriesRender.prototype.dataLabelSymbol(seriesIndex, series, element.pointIndex, xXalue, yValue, width, height, symbolName, sender);\r\n\r\n }\r\n\r\n },\r\n\r\n draw: function (panel, sender) {\r\n if (panel.VectorPoints == null || panel.VectorPoints.length <= 0) return;\r\n var transform = ej.Ej3DRender.transform;\r\n var pathDirection = ej.EjSvgRender.utils._getStringBuilder();\r\n var color = panel.Fill;\r\n var format = sender.svgRenderer.checkColorFormat(color);\r\n if (!format)\r\n color = sender.colorNameToHex(color);\r\n var figure = { Segments: null, StartPoint: null };\r\n if (transform != null) {\r\n figure.StartPoint = ej.EjSvgRender.chartTransform3D.toScreen(panel.VectorPoints[0], transform);\r\n pathDirection.append(\"M\" + \" \" + (figure.StartPoint.x) + \" \" + (figure.StartPoint.y) + \" \");\r\n for (var i = 0; i < panel.VectorPoints.length; i++) {\r\n var lineSegment = ej.EjSvgRender.chartTransform3D.toScreen(panel.VectorPoints[i], transform);\r\n pathDirection.append(\"L\" + \" \" + (lineSegment.x) + \" \" + (lineSegment.y) + \" \");\r\n\r\n }\r\n }\r\n\r\n var direction = pathDirection.toString();\r\n\r\n var name = \"Light\";\r\n var lightCoefZ = (2 * (Math.abs(vector.vector3dAND(panel.normal, vector.vector3D(0, 0, 1))) - 1));\r\n var lightCoefY = (2 * (Math.abs(vector.vector3dAND(panel.normal, vector.vector3D(0, 1, 0))) - 1));\r\n var lightCoefX = (2 * (Math.abs(vector.vector3dAND(panel.normal, vector.vector3D(1, 0, 0))) - 1));\r\n if (lightCoefZ == lightCoefX) {\r\n name = \"ZLight\";\r\n color = this.applyZLight(color, sender);\r\n }\r\n else if (((lightCoefY == lightCoefZ) || (lightCoefZ != 0 && lightCoefY < lightCoefZ))) {\r\n name = \"XLight\";\r\n color = this.applyXLight(color, sender);\r\n }\r\n else if (lightCoefZ < 0) {\r\n name = \"ZLight\";\r\n color = this.applyZLight(color, sender);\r\n }\r\n else {\r\n name = \"Light\";\r\n color = color;\r\n }\r\n if (sender.model.AreaType == \"none\")\r\n panel.StrokeThickness = 0;\r\n var optionsMinorGrid = {\r\n 'id': sender.svgObject.id + \"_\" + panel.Name,\r\n 'name': name,\r\n 'fill': color,\r\n 'stroke': panel.Stroke,\r\n 'stroke-width': panel.StrokeThickness,\r\n 'opacity': panel.Opacity,\r\n 'd': direction\r\n };\r\n sender.svgRenderer.drawPath(optionsMinorGrid, panel.Element.Parent);\r\n if (sender.model.previousID && sender.model.touchCross)\r\n $(\"#\" + optionsMinorGrid.id).insertAfter($(\"#\" + sender.model.previousID));\r\n\r\n sender.model.previousID = optionsMinorGrid.id;\r\n },\r\n\r\n applyXLight: function (color, sender) {\r\n var RGB = sender.svgRenderer.hexToRGB(color);\r\n RGB.R = (parseInt)(RGB.R * 0.7);\r\n RGB.G = (parseInt)(RGB.G * 0.7);\r\n RGB.B = (parseInt)(RGB.B * 0.7);\r\n return sender.svgRenderer.hexFromRGB(RGB);\r\n },\r\n\r\n applyZLight: function (color, sender) {\r\n var RGB = sender.svgRenderer.hexToRGB(color);\r\n RGB.R = (parseInt)(RGB.R * 0.9);\r\n RGB.G = (parseInt)(RGB.G * 0.9);\r\n RGB.B = (parseInt)(RGB.B * 0.9);\r\n return sender.svgRenderer.hexFromRGB(RGB);\r\n },\r\n\r\n update: function (updatedVectors, panel, sender) {\r\n if (panel.VectorPoints == null || panel.VectorPoints.length <= 0) return;\r\n panel.VectorPoints = updatedVectors;\r\n var transform = ej.Ej3DRender.transform;\r\n var pathDirection = ej.EjSvgRender.utils._getStringBuilder();\r\n var color = panel.Fill;\r\n var figure = { Segments: null, StartPoint: null };\r\n if (transform != null) {\r\n figure.StartPoint = ej.EjSvgRender.chartTransform3D.toScreen(panel.VectorPoints[0], transform);\r\n pathDirection.append(\"M\" + \" \" + (figure.StartPoint.x) + \" \" + (figure.StartPoint.y) + \" \");\r\n for (var i = 0; i < panel.VectorPoints.length; i++) {\r\n var lineSegment = ej.EjSvgRender.chartTransform3D.toScreen(panel.VectorPoints[i], transform);\r\n pathDirection.append(\"L\" + \" \" + (lineSegment.x) + \" \" + (lineSegment.y) + \" \");\r\n\r\n }\r\n }\r\n\r\n var direction = pathDirection.toString();\r\n\r\n if ($(sender.chartObj.chart3D).find(\"#\" + sender.chartObj.svgObject.id + \"_\" + panel.Name).length > 0) {\r\n var element = $(sender.chartObj.chart3D).find(\"#\" + sender.chartObj.svgObject.id + \"_\" + panel.Name)[0];\r\n sender.chartObj.svgRenderer._setAttr($(element), { 'd': direction });\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n }\r\n var Ej3DRender = new ej.Ej3DRender();\r\n var vector = new Ej3DRender.vector3D();\r\n var matrixobj = new Ej3DRender.matrix3D();\r\n var bsptreeobj = new Ej3DRender.BSPTreeBuilder();\r\n var polygonobj = new Ej3DRender.polygon3D();\r\n var graphics = new Ej3DRender.Graphics3D();\r\n\r\n\r\n})(jQuery);;\r\nej.EjSvgScrollbarRender = function (element, scrollObj) {\r\n this.svgSupport = (window.SVGSVGElement) ? true : false;\r\n var id = jQuery(element).attr(\"id\");\r\n this.scrollsvgObj = this.scrollsvgObj ? this.scrollsvgObj : [];\r\n if (this.svgSupport) {\r\n this.svgLink = \"http://www.w3.org/2000/svg\";\r\n this.scrollsvgObj[scrollObj.index] = document.createElementNS(this.svgLink, \"svg\");\r\n this.scrollsvgObj[scrollObj.index].setAttribute('id', \"scrollbar_\" + id + scrollObj.index);\r\n } else {\r\n var doc = document;\r\n this.scrollsvgObj[scrollObj.index] = doc.createElement(\"div\");\r\n this.scrollsvgObj[scrollObj.index].style.position = 'relative';\r\n this.scrollsvgObj[scrollObj.index].setAttribute('id', \"scrollbar_\" + id + scrollObj.index);\r\n }\r\n};\r\n\r\n(function ($) {\r\n ej.EjSvgScrollbarRender.prototype = {\r\n\r\n _initializeScrollbarVariables: function (scrollObj) {\r\n scrollObj.offsetLeftX = 0\r\n scrollObj.rectWidth = scrollObj.offsetRightX = scrollObj.oldWidth = scrollObj.width;\r\n scrollObj.startX = 0, scrollObj.endX = 0;\r\n scrollObj.scrollbarLoaded = false;\r\n\r\n if (scrollObj.zoomPosition || scrollObj.zoomFactor) {\r\n scrollObj.offsetLeftX = (scrollObj.zoomPosition * scrollObj.width);\r\n scrollObj.rectWidth = (scrollObj.zoomFactor) * scrollObj.width;\r\n }\r\n },\r\n\r\n _scrollbarUpdate: function (scrollObj) {\r\n\r\n var width = parseFloat(scrollObj.width),\r\n arrowsize = 15,\r\n minimumRect = 44,\r\n panningRect = width - 30;// arrowSize * 2 \r\n scrollObj.offsetLeftX = !scrollObj.scrollbarLoaded ? scrollObj.offsetLeftX : (scrollObj.offsetLeftX - arrowsize);\r\n scrollObj.offsetLeftX = scrollObj.offsetLeftX < arrowsize ? 0 : scrollObj.offsetLeftX;\r\n var offsetLeftX = ((scrollObj.offsetLeftX / scrollObj.oldWidth) * panningRect) + arrowsize;\r\n var rectWidth = ((scrollObj.rectWidth / scrollObj.oldWidth) * panningRect);\r\n isMinWidth = rectWidth < minimumRect;\r\n scrollObj._diff = isMinWidth ? minimumRect - rectWidth : 0;\r\n rectWidth = rectWidth > minimumRect ? rectWidth : minimumRect;\r\n scrollObj.oldWidth = panningRect;\r\n var offsetRightX = offsetLeftX + rectWidth;\r\n scrollObj.rectWidth = rectWidth;\r\n scrollObj.offsetLeftX = scrollObj.startX = offsetLeftX;\r\n scrollObj.offsetRightX = (offsetRightX - arrowsize) <= offsetLeftX ? (offsetRightX + arrowsize) : offsetRightX;\r\n scrollObj.endX = scrollObj.width - scrollObj.offsetRightX;\r\n scrollObj.startX = offsetLeftX < arrowsize ? arrowsize : offsetLeftX;\r\n if ((offsetLeftX + rectWidth) > (scrollObj.width - arrowsize)) {\r\n scrollObj.offsetLeftX = scrollObj.startX = scrollObj.width - arrowsize - rectWidth;\r\n scrollObj.offsetRightX = scrollObj.width - arrowsize;\r\n scrollObj.endX = scrollObj.width - scrollObj.offsetRightX;\r\n }\r\n scrollObj.scrollbarLoaded = true;\r\n\r\n },\r\n\r\n _renderScrollbar: function (scrollObj) {\r\n\r\n this.scrollsvgObj = this.scrollsvgObj ? this.scrollsvgObj : [];\r\n $(this.scrollsvgObj[scrollObj.index]).empty();\r\n if (this.scrollsvgObj[scrollObj.index])\r\n $(document).find('[id*= ' + this.scrollsvgObj[scrollObj.index].id + ']').attr('height', '0px');\r\n var id = this._id;\r\n var arrowSize = 15;\r\n var scrollHeight = 18;\r\n var minimumScrollSize = 44;\r\n this.scrollsvgObj[scrollObj.index] = this.scrollbarContainer.scrollsvgObj[scrollObj.index];\r\n var height = 17, width = parseFloat(scrollObj.width), padding = 8, centerY = (height / 2), panningRect = width - (arrowSize * 2);\r\n scrollObj.offsetLeftX = !scrollObj.scrollbarLoaded ? scrollObj.offsetLeftX : (scrollObj.offsetLeftX - arrowSize);\r\n scrollObj.offsetLeftX = scrollObj.offsetLeftX < arrowSize ? 0 : scrollObj.offsetLeftX;\r\n var offsetLeftX = ((scrollObj.offsetLeftX / scrollObj.oldWidth) * panningRect) + arrowSize;\r\n var rectWidth = ((scrollObj.rectWidth / scrollObj.oldWidth) * panningRect);\r\n isMinWidth = rectWidth < minimumScrollSize;\r\n scrollObj._diff = isMinWidth ? minimumScrollSize - rectWidth : 0;\r\n rectWidth = rectWidth > minimumScrollSize ? rectWidth : minimumScrollSize;\r\n scrollObj.oldWidth = panningRect;\r\n offsetLeftX = ((offsetLeftX + rectWidth) > panningRect) ? (panningRect - (rectWidth - arrowSize)) : offsetLeftX;\r\n var offsetRightX = offsetLeftX + rectWidth;\r\n scrollObj.rectWidth = rectWidth;\r\n scrollObj.offsetLeftX = scrollObj.startX = offsetLeftX;\r\n scrollObj.offsetRightX = offsetLeftX + rectWidth;\r\n scrollObj.endX = scrollObj.width - scrollObj.offsetRightX;\r\n scrollObj.scrollbarLoaded = true;\r\n offsetRightX = (offsetRightX - arrowSize) <= offsetLeftX ? (offsetRightX + arrowSize) : offsetRightX;\r\n var xPadding = this.padding || 0;\r\n var yPadding = !this.vmlRendering ? 0 : -5;\r\n if (scrollObj.orientation == 'horizontal')\r\n this.scrollbar = this.renderer.createGroup({ 'id': id + '_scrollbar' + '_' + scrollObj.index, transform: \"translate(\" + xPadding + \",\" + yPadding + \")\" });\r\n else\r\n this.scrollbar = this.renderer.createGroup({ 'id': id + '_scrollbar' + '_' + scrollObj.index, transform: \"translate(\" + 0 + \",\" + scrollObj.width + \") rotate(270)\" });\r\n //Draw a rounded corner path direction\r\n var makeShape = function (x, y, width, height, r, scrollObj) {\r\n var\r\n spc = \" \", // path drawing instruction letters with readable names\r\n moveTo = \"M\",\r\n horizLineTo = \"h\",\r\n vertLineTo = \"v\",\r\n arcTo = \"a\",\r\n closePath = \"z\",\r\n ori = scrollObj.orientation,\r\n opp = scrollObj.opposed,\r\n dStr;\r\n if ((ori == 'vertical' && !opp) || (opp && ori != 'vertical')) {\r\n dStr = // the \"d\" path for the svg path\r\n moveTo + spc + x + spc + r + spc +\r\n vertLineTo + spc + (height - r) + spc +\r\n horizLineTo + spc + (width) + spc +\r\n vertLineTo + spc + (r - height) + spc +\r\n arcTo + spc + r + spc + r + spc + 0 + spc + 0 + spc + 0 + spc + (-r) + spc + (-r) + spc +\r\n horizLineTo + spc + -(width - 2 * r) + spc +\r\n arcTo + spc + r + spc + r + spc + 0 + spc + 0 + spc + 0 + spc + (-4) + spc + (r) + spc +\r\n closePath;\r\n\r\n } else {\r\n dStr = // the \"d\" path for the svg path\r\n moveTo + spc + x + spc + y + spc +\r\n vertLineTo + spc + (height - r) + spc +\r\n arcTo + spc + r + spc + r + spc + 0 + spc + 0 + spc + 0 + spc + r + spc + r + spc +\r\n horizLineTo + spc + (width - 2 * r) + spc +\r\n arcTo + spc + r + spc + r + spc + 0 + spc + 0 + spc + 0 + spc + r + spc + (-r) + spc +\r\n vertLineTo + spc + (r - height) + spc +\r\n closePath;\r\n }\r\n\r\n return dStr;\r\n };\r\n var direction = makeShape(0, 0, width, scrollHeight, 4, scrollObj);\r\n\r\n //Create a scrollbar background rectangle\r\n var rectBorder = {\r\n 'id': id + '_scrollbarBackRect_' + scrollObj.index,\r\n 'stroke-width': 1,\r\n 'height': scrollHeight,\r\n 'width': width,\r\n 'stroke-linejoin': \"round\",\r\n 'stroke': \"#B4B4B4\",\r\n 'fill': \"#F7F7F7\",\r\n 'class': 'e-rangeScroll-backRect'\r\n };\r\n\r\n if (!this.vmlRendering) {\r\n rectBorder.d = direction;\r\n this.renderer.drawPath(rectBorder, this.scrollbar);\r\n } else\r\n this.renderer.drawRect(rectBorder, this.scrollbar);\r\n\r\n var rightRectBorder = {\r\n 'id': id + '_scrollbarRightRect_' + scrollObj.index,\r\n 'stroke-width': 1,\r\n 'x': (width - 5),\r\n 'height': scrollHeight,\r\n 'width': 5,\r\n 'stroke-linejoin': \"round\",\r\n 'stroke': \"transparent\",\r\n 'fill': \"transparent\"\r\n };\r\n this.renderer.drawRect(rightRectBorder, this.scrollbar);\r\n\r\n var leftRectBorder = {\r\n 'id': id + '_scrollbarLeftRect_' + scrollObj.index,\r\n 'stroke-width': 1,\r\n 'x': 0,\r\n 'height': scrollHeight,\r\n 'width': 5,\r\n 'stroke-linejoin': \"round\",\r\n 'stroke': \"transparent\",\r\n 'fill': \"transparent\"\r\n };\r\n this.renderer.drawRect(leftRectBorder, this.scrollbar);\r\n\r\n //Create a left Arrow\r\n var leftArrow = {\r\n 'id': id + '_scrollbarLeftArrow_' + scrollObj.index,\r\n 'stroke-width': 1,\r\n 'stroke': \"#999999\",\r\n 'd': \"M \" + 5 + \" \" + 9 + \" \" + \"L \" + 10 + \" \" + 14 + \" \" + \"L \" + 10 + \" \" + 3.5 + \" Z\",\r\n 'fill': \"#999999\",\r\n 'class': \"e-rangeScroll-arrow\"\r\n };\r\n this.renderer.drawPath(leftArrow, this.scrollbar);\r\n\r\n ////Create a right Arrow\r\n var rightArrow = {\r\n 'id': id + '_scrollbarRightArrow_' + scrollObj.index,\r\n 'stroke-width': 1,\r\n 'stroke': \"#999999\",\r\n 'd': \"M \" + (width - 5) + \" \" + 9 + \" \" + \"L \" + (width - 10) + \" \" + 14 + \" \" + \"L \" + (width - 10) + \" \" + 3.5 + \" Z\",\r\n 'fill': \"#999999\",\r\n 'class': \"e-rangeScroll-arrow\"\r\n };\r\n this.renderer.drawPath(rightArrow, this.scrollbar);\r\n\r\n var options = {\r\n 'id': id + '_scrollbarSelect_' + scrollObj.index,\r\n x: offsetLeftX,\r\n y: 0,\r\n 'width': rectWidth,\r\n 'rx': 4,\r\n 'ry': 4,\r\n 'height': height,\r\n 'stroke': \"#999999\",\r\n 'stroke-width': 1,\r\n 'fill': \"#CECECE\",\r\n 'class': 'e-rangeScroll-select'\r\n };\r\n this.renderer.drawRect(options, this.scrollbar);\r\n this.centerLine = this.renderer.createGroup({ 'id': id + '_scrollbarCenterLine_' + scrollObj.index, transform: \"translate(\" + (offsetLeftX + (rectWidth / 2) - 7.5) + \")\" });\r\n\r\n //Create a center shape\r\n var shape = {\r\n 'id': id + '_scrollbarCenterShape_' + scrollObj.index,\r\n 'stroke-width': 1,\r\n 'stroke': \"#999999\",\r\n 'd': \"M \" + 0 + \" \" + 3.5 + \" \" + \"L \" + 0 + \" \" + 13.5 + \" Z\" + \"M \" + 5 + \" \" + 3.5 + \" \" + \"L \" + 5 + \" \" + 13.5 + \" Z\" + \"M \" + 10 + \" \" + 3.5 + \" \" + \"L \" + 10 + \" \" + 13.5 + \" Z\" + \"M \" + 15 + \" \" + 3.5 + \" \" + \"L \" + 15 + \" \" + 13.5 + \" Z\",\r\n 'fill': \"#999999\",\r\n 'class': 'e-rangeScroll-centerShape'\r\n };\r\n this.renderer.drawPath(shape, this.centerLine);\r\n this.renderer.append(this.centerLine, this.scrollbar);\r\n var leftHeaderHideRectOptions = {\r\n 'id': id + '_leftHeaderHideRect_' + scrollObj.index,\r\n 'x': offsetLeftX,\r\n 'y': 0,\r\n 'width': 11,\r\n 'height': 17,\r\n 'fill': 'transparent',\r\n 'opacity': 0,\r\n 'stroke-width': 1,\r\n 'class': 'e-rangeScroll-leftRect'\r\n }\r\n this.renderer.drawRect(leftHeaderHideRectOptions, this.scrollbar);\r\n var leftHeaderOptions = {\r\n 'id': id + '_scrollbarLeftHeader_' + scrollObj.index,\r\n 'cx': offsetLeftX + padding,\r\n 'cy': centerY,\r\n 'r': 3,\r\n \"fill\": \"#999999\",\r\n 'stroke': \"#999999\",\r\n 'stroke-width': 1,\r\n 'class': 'e-rangeScroll-leftCircle'\r\n };\r\n this.renderer.drawCircle(leftHeaderOptions, this.scrollbar);\r\n var rightHeaderHideRectOptions = {\r\n 'id': id + '_rightHeaderHideRect_' + scrollObj.index,\r\n 'x': offsetRightX - 11,\r\n 'y': 0,\r\n 'width': 11,\r\n 'height': height,\r\n 'fill': 'transparent',\r\n 'opacity': 0,\r\n 'stroke-width': 1,\r\n 'class': 'e-rangeScroll-rightRect'\r\n };\r\n this.renderer.drawRect(rightHeaderHideRectOptions, this.scrollbar);\r\n var rightHeaderOptions = {\r\n 'id': id + '_scrollbarRightHeader_' + scrollObj.index,\r\n \"fill\": \"#999999\",\r\n 'cx': offsetRightX - padding,\r\n 'cy': centerY,\r\n 'r': 3,\r\n 'stroke': \"#999999\",\r\n 'stroke-width': 1,\r\n 'class': 'e-rangeScroll-rightCircle'\r\n };\r\n this.renderer.drawCircle(rightHeaderOptions, this.scrollbar);\r\n\r\n this.renderer.append(this.scrollbar, this.scrollsvgObj[scrollObj.index]);\r\n if (scrollObj.orientation == 'horizontal') {\r\n this.scrollsvgObj[scrollObj.index].setAttribute(\"height\", scrollHeight);\r\n this.scrollsvgObj[scrollObj.index].setAttribute(\"width\", width);\r\n } else {\r\n this.scrollsvgObj[scrollObj.index].setAttribute(\"height\", width);\r\n this.scrollsvgObj[scrollObj.index].setAttribute(\"width\", scrollHeight);\r\n }\r\n this.renderer.append(this.scrollsvgObj[scrollObj.index], scrollObj.parent);\r\n\r\n //Apply CSS styles to scrollbar controls \r\n var vmlPadding = !this.vmlRendering ? scrollObj.y : scrollObj.y + 5;\r\n if (this.pluginName == \"ejRangeNavigator\")\r\n this.scrollsvgObj[scrollObj.index].setAttribute('style', 'overflow:visible;position:relative;display:block; top:' + (vmlPadding - scrollObj.y) + 'px;' + 'left:' + scrollObj.x + 'px');\r\n else\r\n this.scrollsvgObj[scrollObj.index].setAttribute('style', 'overflow:visible;position:absolute;display:block; top:' + vmlPadding + 'px;' + 'left:' + scrollObj.x + 'px');\r\n $(\"#\" + id + \"_scrollbarSelect_\" + scrollObj.index).css({ \"cursor\": \"pointer\" });\r\n if (scrollObj.enableResize) {\r\n $(\"#\" + id + \"_leftHeaderHideRect_\" + scrollObj.index).css({ \"cursor\": scrollObj.orientation == 'horizontal' ? \"w-resize\" : \"n-resize\" });\r\n $(\"#\" + id + \"_rightHeaderHideRect_\" + scrollObj.index).css({ \"cursor\": scrollObj.orientation == 'horizontal' ? \"w-resize\" : \"n-resize\" });\r\n $(\"#\" + id + \"_scrollbarRightHeader_\" + scrollObj.index).css({ \"cursor\": scrollObj.orientation == 'horizontal' ? \"w-resize\" : \"n-resize\" });\r\n $(\"#\" + id + \"_scrollbarLeftHeader_\" + scrollObj.index).css({ \"cursor\": scrollObj.orientation == 'horizontal' ? \"w-resize\" : \"n-resize\" });\r\n } else {\r\n $(\"#\" + id + \"_leftHeaderHideRect_\" + scrollObj.index).hide();\r\n $(\"#\" + id + \"_rightHeaderHideRect_\" + scrollObj.index).hide();\r\n $(\"#\" + id + '_scrollbarLeftHeader_' + scrollObj.index).hide();\r\n $(\"#\" + id + '_scrollbarRightHeader_' + scrollObj.index).hide();\r\n }\r\n\r\n if (this.vmlRendering) {\r\n $('#' + id + '_leftHeaderHideRect_' + scrollObj.index).css(\"visibility\", 'hidden');\r\n $('#' + id + '_rightHeaderHideRect_' + scrollObj.index).css(\"visibility\", 'hidden');\r\n }\r\n\r\n this.scrollbarContainer._bindScrollEvents.call(this, scrollObj);\r\n },\r\n\r\n _bindScrollEvents: function (scrollObj) {\r\n //Binding Mouse Events to scrollbar\r\n var rootId = this._id;\r\n var matched = jQuery.uaMatch(navigator.userAgent);\r\n var isIE11 = !!navigator.userAgent.match(/Trident\\/7\\./);\r\n bindDesktopEvents.call(this, scrollObj);\r\n if (window.PointerEvent) { //Added pointer event for IE11\r\n\r\n this._on($('#' + rootId + '_scrollbarLeftHeader_' + scrollObj.index), \"pointerdown\", this.scrollbarContainer._leftScrollbarDown);\r\n this._on($('#' + rootId + '_scrollbarRightHeader_' + scrollObj.index), \"pointerdown\", this.scrollbarContainer._rightScrollbarDown);\r\n\r\n this._on($('#' + rootId + '_leftHeaderHideRect_' + scrollObj.index), \"pointerdown\", this.scrollbarContainer._leftScrollbarDown);\r\n this._on($('#' + rootId + '_rightHeaderHideRect_' + scrollObj.index), \"pointerdown\", this.scrollbarContainer._rightScrollbarDown);\r\n\r\n this._on($('#' + rootId + '_scrollbarLeftArrow_' + scrollObj.index), \"pointerdown\", this.scrollbarContainer._leftArrowDown);\r\n this._on($('#' + rootId + '_scrollbarLeftArrow_' + scrollObj.index), \"pointerup\", this.scrollbarContainer._leftArrowUp);\r\n\r\n this._on($('#' + rootId + '_scrollbarRightArrow_' + scrollObj.index), \"pointerdown\", this.scrollbarContainer._rightArrowDown);\r\n this._on($('#' + rootId + '_scrollbarRightArrow_' + scrollObj.index), \"pointerup\", this.scrollbarContainer._rightArrowUp);\r\n\r\n this._on($('#' + rootId + '_scrollbarSelect_' + scrollObj.index), \"pointerdown\", this.scrollbarContainer._scrollSelectRectDown);\r\n this._on($('#' + rootId + '_scrollbarBackRect_' + scrollObj.index), \"pointerdown\", this.scrollbarContainer._scrollBackRectDown);\r\n this._on($('#' + rootId + '_scrollbarBackRect_' + scrollObj.index), \"pointerup\", this.scrollbarContainer._scrollBackRectUp);\r\n\r\n this._on($(window), \"pointermove\", this.scrollbarContainer._scrollbarMove);\r\n this._on($(window), \"pointerup\", this.scrollbarContainer._scrollbarUp);\r\n this._on($(this.scrollsvgObj[scrollObj.index]), \"pointermove\", this.scrollbarContainer._scrollbarMove);\r\n this._on($(this.scrollsvgObj[scrollObj.index]), \"pointerup\", this.scrollbarContainer._scrollbarUp);\r\n\r\n $(this.scrollsvgObj[scrollObj.index]).css('touch-action', 'none');\r\n }\r\n else if (window.navigator.msPointerEnabled && !isIE11) {\r\n\r\n this._on($('#' + rootId + '_scrollbarLeftHeader_' + scrollObj.index), \"MSPointerDown\", this.scrollbarContainer._leftScrollbarDown);\r\n this._on($('#' + rootId + '_scrollbarRightHeader_' + scrollObj.index), \"MSPointerDown\", this.scrollbarContainer._rightScrollbarDown);\r\n\r\n this._on($('#' + rootId + '_leftHeaderHideRect_' + scrollObj.index), \"MSPointerDown\", this.scrollbarContainer._leftScrollbarDown);\r\n this._on($('#' + rootId + '_rightHeaderHideRect_' + scrollObj.index), \"MSPointerDown\", this.scrollbarContainer._rightScrollbarDown);\r\n\r\n this._on($('#' + rootId + '_scrollbarLeftArrow_' + scrollObj.index), \"MSPointerDown\", this.scrollbarContainer._leftArrowDown);\r\n this._on($('#' + rootId + '_scrollbarLeftArrow_' + scrollObj.index), \"MSPointerUp\", this.scrollbarContainer._leftArrowUp);\r\n\r\n this._on($('#' + rootId + '_scrollbarRightArrow_' + scrollObj.index), \"MSPointerDown\", this.scrollbarContainer._rightArrowDown);\r\n this._on($('#' + rootId + '_scrollbarRightArrow_' + scrollObj.index), \"MSPointerUp\", this.scrollbarContainer._rightArrowUp);\r\n\r\n this._on($('#' + rootId + '_scrollbarSelect_' + scrollObj.index), \"MSPointerDown\", this.scrollbarContainer._scrollSelectRectDown);\r\n this._on($('#' + rootId + '_scrollbarBackRect_' + scrollObj.index), \"MSPointerDown\", this.scrollbarContainer._scrollBackRectDown);\r\n this._on($('#' + rootId + '_scrollbarBackRect_' + scrollObj.index), \"MSPointerUp\", this.scrollbarContainer._scrollBackRectUp);\r\n\r\n this._on($(window), \"MSPointerMove\", this.scrollbarContainer._scrollbarMove);\r\n this._on($(window), \"MSPointerUp\", this.scrollbarContainer._scrollbarUp);\r\n this._on($(this.scrollsvgObj[scrollObj.index]), \"MSPointerMove\", this.scrollbarContainer._scrollbarMove);\r\n this._on($(this.scrollsvgObj[scrollObj.index]), \"MSPointerUp\", this.scrollbarContainer._scrollbarUp);\r\n\r\n $(this.scrollsvgObj[scrollObj.index]).css('-ms-touch-action', 'none');\r\n\r\n } else if (matched.browser.toLowerCase() == \"chrome\") {\r\n bindTouchEvents.call(this, scrollObj);\r\n } else if (this.isDevice()) {\r\n\r\n var isSafari = (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1);\r\n var isInIframe = (window.location != window.parent.location) ? true : false;\r\n var userAgent = isInIframe ? window.parent.navigator.userAgent.toLowerCase() : window.navigator.userAgent.toLowerCase();\r\n var device = /mobile|tablet|android|kindle/i.test(userAgent);\r\n if ((ej.isMobile() && this.isWindows()) || (!device && ej.isMobile() && isSafari)) { // for safari mobile browser and windows phone \r\n bindDesktopEvents.call(this);\r\n $(this.scrollsvgObj[scrollObj.index]).css('-ms-touch-action', 'none');\r\n } else\r\n bindTouchEvents.call(this, scrollObj);\r\n }\r\n var eventName = matched.browser.toLowerCase() == \"mozilla\" ? (isIE11 ? \"mousewheel\" : \"DOMMouseScroll\") : \"mousewheel\";\r\n this._on($(this.scrollsvgObj[scrollObj.index]), eventName, this.scrollbarContainer._scrollMouseWheel);\r\n\r\n if (isIE11)\r\n $(this.scrollsvgObj[scrollObj.index]).css('touch-action', 'none');\r\n\r\n function bindDesktopEvents(scrollObj) {\r\n this._on($('#' + rootId + '_scrollbarLeftHeader_' + scrollObj.index), \"mousedown\", this.scrollbarContainer._leftScrollbarDown);\r\n this._on($('#' + rootId + '_scrollbarRightHeader_' + scrollObj.index), \"mousedown\", this.scrollbarContainer._rightScrollbarDown);\r\n\r\n this._on($('#' + rootId + '_leftHeaderHideRect_' + scrollObj.index), \"mousedown\", this.scrollbarContainer._leftScrollbarDown);\r\n this._on($('#' + rootId + '_rightHeaderHideRect_' + scrollObj.index), \"mousedown\", this.scrollbarContainer._rightScrollbarDown);\r\n\r\n this._on($('#' + rootId + '_scrollbarLeftArrow_' + scrollObj.index), \"mousedown\", this.scrollbarContainer._leftArrowDown);\r\n this._on($('#' + rootId + '_scrollbarLeftArrow_' + scrollObj.index), \"mouseup\", this.scrollbarContainer._leftArrowUp);\r\n\r\n this._on($('#' + rootId + '_scrollbarRightArrow_' + scrollObj.index), \"mousedown\", this.scrollbarContainer._rightArrowDown);\r\n this._on($('#' + rootId + '_scrollbarRightArrow_' + scrollObj.index), \"mouseup\", this.scrollbarContainer._rightArrowUp);\r\n\r\n this._on($('#' + rootId + '_scrollbarSelect_' + scrollObj.index), \"mousedown\", this.scrollbarContainer._scrollSelectRectDown);\r\n this._on($('#' + rootId + '_scrollbarBackRect_' + scrollObj.index), \"mousedown\", this.scrollbarContainer._scrollBackRectDown);\r\n this._on($('#' + rootId + '_scrollbarBackRect_' + scrollObj.index), \"mouseup\", this.scrollbarContainer._scrollBackRectUp);\r\n\r\n this._on($(window), \"mousemove\", this.scrollbarContainer._scrollbarMove);\r\n this._on($(window), \"mouseup\", this.scrollbarContainer._scrollbarUp);\r\n this._on($(this.svgObject), \"mousemove\", this.scrollbarContainer._scrollbarMove);\r\n this._on($(this.scrollsvgObj[scrollObj.index]), \"mousemove\", this.scrollbarContainer._scrollbarMove);\r\n this._on($(this.scrollsvgObj[scrollObj.index]), \"mouseup\", this.scrollbarContainer._scrollbarUp);\r\n }\r\n\r\n function bindTouchEvents(scrollObj) {\r\n this._on($('#' + rootId + '_scrollbarLeftHeader_' + scrollObj.index), \"touchstart\", this.scrollbarContainer._leftScrollbarDown);\r\n this._on($('#' + rootId + '_scrollbarRightHeader_' + scrollObj.index), \"touchstart\", this.scrollbarContainer._rightScrollbarDown);\r\n\r\n this._on($('#' + rootId + '_leftHeaderHideRect_' + scrollObj.index), \"touchstart\", this.scrollbarContainer._leftScrollbarDown);\r\n this._on($('#' + rootId + '_rightHeaderHideRect_' + scrollObj.index), \"touchstart\", this.scrollbarContainer._rightScrollbarDown);\r\n\r\n this._on($('#' + rootId + '_scrollbarLeftArrow_' + scrollObj.index), \"touchstart\", this.scrollbarContainer._leftArrowDown);\r\n this._on($('#' + rootId + '_scrollbarLeftArrow_' + scrollObj.index), \"touchend\", this.scrollbarContainer._leftArrowUp);\r\n\r\n this._on($('#' + rootId + '_scrollbarRightArrow_' + scrollObj.index), \"touchstart\", this.scrollbarContainer._rightArrowDown);\r\n this._on($('#' + rootId + '_scrollbarRightArrow_' + scrollObj.index), \"touchend\", this.scrollbarContainer._rightArrowUp);\r\n\r\n this._on($('#' + rootId + '_scrollbarSelect_' + scrollObj.index), \"touchstart\", this.scrollbarContainer._scrollSelectRectDown);\r\n this._on($('#' + rootId + '_scrollbarBackRect_' + scrollObj.index), \"touchstart\", this.scrollbarContainer._scrollBackRectDown);\r\n this._on($('#' + rootId + '_scrollbarBackRect_' + scrollObj.index), \"touchend\", this.scrollbarContainer._scrollBackRectUp);\r\n\r\n this._on($(window), \"touchmove\", this.scrollbarContainer._scrollbarMove);\r\n this._on($(window), \"touchend\", this.scrollbarContainer._scrollbarUp);\r\n this._on($(this.scrollsvgObj[scrollObj.index]), \"touchmove\", this.scrollbarContainer._scrollbarMove);\r\n this._on($(this.scrollsvgObj[scrollObj.index]), \"touchend\", this.scrollbarContainer._scrollbarUp);\r\n\r\n }\r\n },\r\n\r\n _setScrollPosition: function (startX, offsetRightX, scrollObj) {\r\n var padding = 8;\r\n var rootId = this._id;\r\n var centerLine = (startX + (scrollObj.rectWidth / 2) - 7.5);\r\n $('#' + rootId + '_scrollbarLeftHeader_' + scrollObj.index).attr(\"cx\", startX + padding);\r\n $('#' + rootId + '_leftHeaderHideRect_' + scrollObj.index).attr(\"x\", startX);\r\n\r\n $('#' + rootId + '_scrollbarRightHeader_' + scrollObj.index).attr(\"cx\", offsetRightX - padding);\r\n $('#' + rootId + '_rightHeaderHideRect_' + scrollObj.index).attr(\"x\", offsetRightX - 5);\r\n $('#' + rootId + '_scrollbarSelect_' + scrollObj.index).attr(\"x\", startX);\r\n $('#' + rootId + '_scrollbarSelect_' + scrollObj.index).attr(\"width\", scrollObj.rectWidth);\r\n $('#' + rootId + '_scrollbarCenterLine_' + scrollObj.index).attr('transform', 'translate(' + centerLine + ')');\r\n //Apply styles for VML support\r\n if (this.pluginName == \"ejRangeNavigator\") {\r\n $('#' + rootId + '_scrollbarLeftHeader_' + scrollObj.index).css(\"left\", startX);\r\n $('#' + rootId + '_leftHeaderHideRect_' + scrollObj.index).css(\"left\", startX);\r\n $('#' + rootId + '_scrollbarRightHeader_' + scrollObj.index).css(\"left\", offsetRightX - padding);\r\n $('#' + rootId + '_rightHeaderHideRect_' + scrollObj.index).css(\"left\", offsetRightX - 5);\r\n $('#' + rootId + '_scrollbarSelect_' + scrollObj.index).css(\"left\", startX);\r\n $('#' + rootId + '_scrollbarCenterLine_' + scrollObj.index).css('left', centerLine);\r\n }\r\n },\r\n _calculateScrollLeftMove: function (moveLength, scrollObj) {\r\n\r\n if (scrollObj._startX - moveLength > 15) {\r\n scrollObj.startX = scrollObj._startX - moveLength;\r\n scrollObj.offsetLeftX = scrollObj.startX;\r\n scrollObj._offsetRightX = scrollObj.startX + scrollObj.rectWidth;\r\n scrollObj.offsetRightX = scrollObj._offsetRightX;\r\n scrollObj.endX = scrollObj.width - scrollObj.offsetRightX;\r\n } else {\r\n scrollObj.startX = 15;\r\n scrollObj._offsetLeftX = scrollObj.offsetLeftX;\r\n scrollObj.offsetLeftX = scrollObj.startX;\r\n scrollObj._offsetRightX = scrollObj.startX + scrollObj.rectWidth;\r\n scrollObj.offsetRightX = scrollObj._offsetRightX;\r\n scrollObj.endX = scrollObj.width - scrollObj.offsetRightX;\r\n }\r\n },\r\n _calculateScrollRightMove: function (moveLength, scrollObj) {\r\n if (scrollObj && (scrollObj._offsetRightX + (Math.abs(moveLength))) < scrollObj.width - 15) {\r\n scrollObj._startX = scrollObj.startX + Math.abs(moveLength);\r\n scrollObj.offsetLeftX = scrollObj._startX;\r\n scrollObj.offsetRightX = scrollObj._offsetRightX + Math.abs(moveLength);\r\n scrollObj.endX = scrollObj.width - scrollObj.offsetRightX;\r\n } else {\r\n scrollObj._ofsetRightX = scrollObj.offsetRightX;\r\n scrollObj.offsetRightX = scrollObj.width - 15;\r\n scrollObj._startX = scrollObj.offsetRightX - scrollObj.rectWidth;\r\n scrollObj.offsetLeftX = scrollObj._startX;\r\n scrollObj.endX = scrollObj.width - scrollObj.offsetRightX;\r\n }\r\n },\r\n _calculateRange: function (startX, endX, scrollObj) {\r\n\r\n var zoomPos, zoomFactor, scrollRange, start, end, padding = 30, startArgs, endArgs;\r\n\r\n //Modify scrollbar center rectangle position on mouse move\r\n zoomPos = (startX - 15) / (scrollObj.width - padding - scrollObj._diff);\r\n scrollRange = scrollObj.scrollRange;\r\n zoomFactor = ((scrollObj.rectWidth - scrollObj._diff) / (scrollObj.width - padding - scrollObj._diff));\r\n if (!scrollObj.isRTL) {\r\n start = scrollRange.min + zoomPos * scrollRange.delta;\r\n end = start + zoomFactor * scrollRange.delta;\r\n } else {\r\n end = scrollRange.max - zoomPos * scrollRange.delta;\r\n start = end - zoomFactor * scrollRange.delta;\r\n }\r\n if (scrollObj.valueType == \"datetime\") {\r\n startArgs = scrollObj.startDateTime;\r\n endArgs = scrollObj.endDateTime;\r\n scrollObj.startDateTime = this.startDateTime = start = new Date(start);\r\n scrollObj.endDateTime = this.endDateTime = end = new Date(end);\r\n } else {\r\n startArgs = parseInt(scrollObj.startValue);\r\n endArgs = parseInt(scrollObj.endValue);\r\n scrollObj.startValue = this.startValue = start = Math.ceil(start);\r\n scrollObj.endValue = this.endValue = end = Math.ceil(end);\r\n }\r\n\r\n //Bind event on changing scrollbar position \r\n scrollObj._scrollChanged = true;\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = {\r\n zoomPosition: zoomPos, zoomFactor: zoomFactor,\r\n oldRange: {\r\n start: startArgs,\r\n end: endArgs\r\n },\r\n newRange: {\r\n start: start,\r\n end: end\r\n }\r\n };\r\n\r\n scrollObj.zoomPosition = zoomPos;\r\n scrollObj.zoomFactor = zoomFactor;\r\n\r\n return commonEventArgs;\r\n },\r\n _calculateScrollPosition: function (mouseX, scrollObj) {\r\n var zoomPos, zoomFact, scrollRange, start, end, startArgs, endArgs, width,\r\n padding = 30, offset = 15, valueType, startRange, minScrollWidth = 36;\r\n\r\n if (this.leftScrollbarClicked && scrollObj.enableResize) {\r\n mouseX = mouseX >= offset ? mouseX : offset;\r\n mouseX = (mouseX >= offset && mouseX < scrollObj.offsetRightX - offset) ? mouseX : scrollObj.offsetRightX - offset;\r\n zoomPos = (mouseX - minScrollWidth) / (scrollObj.width - padding);\r\n zoomFact = scrollObj.rectWidth / (scrollObj.width - padding);\r\n\r\n valueType = scrollObj.valueType.toLowerCase();\r\n scrollRange = scrollObj.scrollRange;\r\n if (!scrollObj.isRTL) {\r\n start = scrollRange.min + zoomPos * scrollRange.delta;\r\n start = start > scrollRange.min ? start : scrollRange.min;\r\n if (valueType == \"datetime\") {\r\n startArgs = scrollObj.startDateTime;\r\n endArgs = scrollObj.endDateTime;\r\n scrollObj.startDateTime = this.startDateTime = start = new Date(start), end = scrollObj.endDateTime;\r\n }\r\n else {\r\n startArgs = parseInt(scrollObj.startValue);\r\n endArgs = parseInt(scrollObj.endValue);\r\n scrollObj.startValue = this.startValue = start = Math.ceil(start), end = Math.ceil(scrollObj.endValue);\r\n }\r\n } else {\r\n end = scrollRange.max - zoomPos * scrollRange.delta;\r\n end = end < scrollRange.max ? end : scrollRange.max;\r\n if (valueType == \"datetime\") {\r\n startArgs = scrollObj.startDateTime;\r\n endArgs = scrollObj.endDateTime;\r\n scrollObj.endDateTime = this.endDateTime = end = new Date(end), start = scrollObj.startDateTime;\r\n }\r\n else {\r\n startArgs = parseInt(scrollObj.startValue);\r\n endArgs = parseInt(scrollObj.endValue);\r\n scrollObj.endValue = this.endValue = end = Math.ceil(end), start = Math.ceil(scrollObj.startValue);\r\n }\r\n }\r\n //Bind event on changing scrollbar position \r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = {\r\n zoomPosition: zoomPos, zoomFactor: zoomFact,\r\n oldRange: {\r\n start: startArgs,\r\n end: endArgs\r\n },\r\n newRange: {\r\n start: start,\r\n end: end\r\n }\r\n };\r\n scrollObj._scrollChanged = true;\r\n scrollObj.zoomPosition = zoomPos;\r\n scrollObj.zoomFactor = zoomFact;\r\n\r\n return commonEventArgs;\r\n }\r\n if (this.rightScrollbarClicked && scrollObj.enableResize) {\r\n scrollRange = scrollObj.scrollRange;\r\n zoomFact = scrollObj.rectWidth / (scrollObj.width - padding);\r\n zoomPos = scrollObj.zoomPosition;\r\n valueType = scrollObj.valueType.toLowerCase();\r\n if (!scrollObj.isRTL) {\r\n startRange = scrollRange.min + zoomPos * scrollRange.delta;\r\n end = startRange + zoomFact * scrollRange.delta;\r\n if (valueType == \"datetime\") {\r\n startArgs = scrollObj.startDateTime;\r\n endArgs = scrollObj.endDateTime;\r\n scrollObj.endDateTime = this.endDateTime = end = new Date(end), start = scrollObj.startDateTime;\r\n }\r\n else {\r\n startArgs = parseInt(scrollObj.startValue);\r\n endArgs = parseInt(scrollObj.endValue);\r\n scrollObj.endValue = this.endValue = end = Math.floor(end), start = Math.ceil(scrollObj.startValue);\r\n }\r\n } else {\r\n zoomPos = (mouseX - minScrollWidth) / (scrollObj.width - padding);\r\n start = scrollRange.max - zoomPos * scrollRange.delta;\r\n if (valueType == \"datetime\") {\r\n startArgs = scrollObj.startDateTime;\r\n endArgs = scrollObj.endDateTime;\r\n scrollObj.startDateTime = this.startDateTime = start = new Date(start), end = scrollObj.endDateTime;\r\n }\r\n else {\r\n startArgs = parseInt(scrollObj.startValue);\r\n endArgs = parseInt(scrollObj.endValue);\r\n scrollObj.startValue = this.startValue = start = Math.floor(start), end = Math.ceil(scrollObj.endValue);\r\n }\r\n }\r\n\r\n //Bind event on changing scrollbar position \r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = {\r\n zoomPosition: scrollObj.zoomPosition ? scrollObj.zoomPosition : 0, zoomFactor: zoomFact,\r\n oldRange: {\r\n start: startArgs,\r\n end: endArgs\r\n },\r\n newRange: {\r\n start: start,\r\n end: end\r\n }\r\n };\r\n scrollObj._scrollChanged = true;\r\n scrollObj.zoomFactor = zoomFact;\r\n\r\n return commonEventArgs;\r\n }\r\n if (scrollObj && this.scrollRectClicked) {\r\n var moveLength = this.mouseDownPos - mouseX;\r\n if (moveLength > 0 && scrollObj.offsetLeftX >= 0) {\r\n this.scrollbarContainer._calculateScrollLeftMove.call(this, moveLength, scrollObj);\r\n return this.scrollbarContainer._calculateRange.call(this, scrollObj.startX, scrollObj.offsetRightX, scrollObj);\r\n }\r\n if (moveLength < 0) {\r\n this.scrollbarContainer._calculateScrollRightMove.call(this, moveLength, scrollObj);\r\n return this.scrollbarContainer._calculateRange.call(this, scrollObj._startX, scrollObj.offsetRightX, scrollObj);\r\n }\r\n }\r\n },\r\n\r\n _scrollbarMove: function (evt) {\r\n\r\n this.moveClientX = !ej.isNullOrUndefined(evt.clientX) ? evt.clientX : (evt.originalEvent.clientX == null ? evt.originalEvent.touches[0].clientX : evt.originalEvent.clientX);\r\n if (this.moveClientX != this.downClientX) {//update scrollbar only on mouse move\r\n var zoomPos, axis, start, end, width, padding = 8, minScrollWidth = 34, mouseX, centerLine;\r\n var rangePadding = this.model.padding || 0;\r\n var matched = jQuery.uaMatch(navigator.userAgent);\r\n var scrollObj = this.scrollbarContainer._doScrollIndex.call(this, evt);\r\n if (!scrollObj) return 0;\r\n\r\n this.lastIndex = scrollObj.index;\r\n if (((!this.vmlRendering && evt.originalEvent.toString() !== \"[object TouchEvent]\") && matched.browser.toLowerCase() != \"msie\") || (this.vmlRendering))\r\n mouseX = (scrollObj.orientation == 'horizontal' ? this.calMousePosition(evt).X - scrollObj.x : scrollObj.width - (this.calMousePosition(evt).Y - scrollObj.y)) - rangePadding;\r\n else\r\n mouseX = (scrollObj.orientation == 'horizontal' ? this.calTouchPosition(evt).X - scrollObj.x : scrollObj.width - (this.calTouchPosition(evt).Y - scrollObj.y)) - rangePadding;\r\n\r\n this.mouseX = mouseX;\r\n var rootId = this._id;\r\n if (this.leftScrollbarClicked && scrollObj.enableResize) {\r\n\r\n\r\n if (scrollObj && (mouseX > minScrollWidth || mouseX > 23) && mouseX < scrollObj.offsetRightX - minScrollWidth) {\r\n scrollObj.rectWidth = scrollObj.width - (scrollObj.endX + mouseX - padding);\r\n centerLine = ((mouseX - padding) + (scrollObj.rectWidth / 2) - 7.5);\r\n $('#' + rootId + '_scrollbarLeftHeader_' + scrollObj.index).attr(\"cx\", mouseX);\r\n $('#' + rootId + '_leftHeaderHideRect_' + scrollObj.index).attr(\"x\", mouseX - 7.5);\r\n $('#' + rootId + '_scrollbarSelect_' + scrollObj.index).attr('x', mouseX - padding);\r\n $('#' + rootId + '_scrollbarSelect_' + scrollObj.index).attr(\"width\", scrollObj.rectWidth);\r\n $('#' + rootId + '_scrollbarCenterLine_' + scrollObj.index).attr('transform', 'translate(' + centerLine + ')');\r\n //Apply styles for VML support\r\n if (this.pluginName == \"ejRangeNavigator\") {\r\n $('#' + rootId + '_scrollbarLeftHeader_' + scrollObj.index).css(\"left\", mouseX);\r\n $('#' + rootId + '_leftHeaderHideRect_' + scrollObj.index).css(\"left\", mouseX - 7.5);\r\n $('#' + rootId + '_scrollbarSelect_' + scrollObj.index).css('left', mouseX);\r\n $('#' + rootId + '_scrollbarSelect_' + scrollObj.index).css(\"width\", scrollObj.rectWidth);\r\n $('#' + rootId + '_scrollbarCenterLine_' + scrollObj.index).css('left', centerLine);\r\n }\r\n scrollObj.offsetLeftX = scrollObj.startX = mouseX - 8;\r\n this.scrollbarContainer._scrollStartArgs.call(this, scrollObj);\r\n this.scrollbarContainer._scrollChangeArgs.call(this, scrollObj);\r\n scrollObj._diff = 0;\r\n } else if (mouseX > scrollObj.offsetRightX - minScrollWidth)\r\n this.rectWidth = 42.89984101748814;\r\n }\r\n if (this.rightScrollbarClicked && scrollObj.enableResize) {\r\n if (scrollObj && (mouseX <= scrollObj.width - minScrollWidth || mouseX <= scrollObj.width - 23) && mouseX > scrollObj.offsetLeftX + minScrollWidth) {\r\n scrollObj.rectWidth = mouseX - scrollObj.offsetLeftX + padding;\r\n centerLine = (scrollObj.offsetLeftX + (scrollObj.rectWidth / 2) - 7.5);\r\n $('#' + rootId + '_scrollbarRightHeader_' + scrollObj.index).attr(\"cx\", mouseX);\r\n $('#' + rootId + '_rightHeaderHideRect_' + scrollObj.index).attr(\"x\", mouseX - 2.5);\r\n $('#' + rootId + '_scrollbarSelect_' + scrollObj.index).attr(\"width\", scrollObj.rectWidth);\r\n $('#' + rootId + '_scrollbarCenterLine_' + scrollObj.index).attr('transform', 'translate(' + centerLine + ')');\r\n //Apply styles for VML support\r\n if (this.pluginName == \"ejRangeNavigator\") {\r\n $('#' + rootId + '_scrollbarRightHeader_' + scrollObj.index).css(\"left\", mouseX);\r\n $('#' + rootId + '_rightHeaderHideRect_' + scrollObj.index).css(\"left\", mouseX - 2.5);\r\n $('#' + rootId + '_scrollbarSelect_' + scrollObj.index).css(\"width\", scrollObj.rectWidth);\r\n $('#' + rootId + '_scrollbarCenterLine_' + scrollObj.index).css('left', centerLine);\r\n }\r\n scrollObj.offsetRightX = mouseX + padding;\r\n scrollObj.endX = scrollObj.width - mouseX - padding;\r\n // this.scrollbarContainer._calculateScrollPosition.call(this, mouseX, scrollObj);\r\n this.scrollbarContainer._scrollStartArgs.call(this, scrollObj);\r\n this.scrollbarContainer._scrollChangeArgs.call(this, scrollObj);\r\n scrollObj._diff = 0;\r\n }\r\n\r\n }\r\n if (this.scrollRectClicked) {\r\n var moveLength = this.mouseDownPos - mouseX;\r\n scrollObj._startX = ej.isNullOrUndefined(scrollObj._startX) ? scrollObj.startX : scrollObj._startX;\r\n if (scrollObj && moveLength > 0 && scrollObj.offsetLeftX >= 0) {\r\n this.scrollbarContainer._calculateScrollLeftMove.call(this, moveLength, scrollObj);\r\n this.scrollbarContainer._setScrollPosition.call(this, scrollObj.startX, scrollObj.offsetRightX, scrollObj);\r\n if (scrollObj.offsetLeftX > 15 || scrollObj.offsetLeftX != scrollObj._offsetLeftX) {\r\n this.scrollbarContainer._scrollStartArgs.call(this, scrollObj);\r\n this.scrollbarContainer._scrollChangeArgs.call(this, scrollObj);\r\n }\r\n }\r\n\r\n if (scrollObj && moveLength < 0) {\r\n if (ej.isNullOrUndefined(scrollObj._offsetRightX)) {\r\n this.scrollbarContainer._scrollSelectRectDown.call(this, evt);\r\n this.scrollbarContainer._scrollbarMove.call(this, evt);\r\n }\r\n this.scrollbarContainer._calculateScrollRightMove.call(this, moveLength, scrollObj);\r\n this.scrollbarContainer._setScrollPosition.call(this, scrollObj._startX, (scrollObj._startX + scrollObj.rectWidth), scrollObj);\r\n if (scrollObj.offsetRightX < scrollObj.width - 15 || scrollObj.offsetRightX != scrollObj._ofsetRightX) {\r\n this.scrollbarContainer._scrollStartArgs.call(this, scrollObj);\r\n if (this.model.enableDeferredUpdate === false || scrollObj.isZooming || this.model.scrollChanged != '') {\r\n var commonEventArgs = this.scrollbarContainer._calculateRange.call(this, scrollObj._startX, (scrollObj._startX + scrollObj.rectWidth), scrollObj);\r\n var oldRange = commonEventArgs.data.oldRange,\r\n newRange = commonEventArgs.data.newRange, oldStart, oldEnd, newStart, newEnd;\r\n if (scrollObj.valueType.toLowerCase() == 'datetime') {\r\n oldStart = Date.parse(oldRange.start), newStart = Date.parse(newRange.start),\r\n oldEnd = Date.parse(oldRange.end), newEnd = Date.parse(newRange.end);\r\n } else {\r\n oldStart = oldRange.start, newStart = newRange.start,\r\n oldEnd = oldRange.end, newEnd = newRange.end;\r\n }\r\n if (this.model.scrollChanged != '' && ((oldStart != newStart) || (oldEnd != newEnd))) {\r\n commonEventArgs = this.scrollbarContainer._args.call(this, scrollObj, commonEventArgs);\r\n this._trigger(\"scrollChanged\", commonEventArgs);\r\n }\r\n if (!this.model.enableDeferredUpdate)\r\n this.scrollUpdate ? this.scrollUpdate = false : this.scrollbarContainer._appendScrollRange.call(this, scrollObj);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this.offsetX = mouseX;\r\n },\r\n _scrollbarUp: function (evt) {\r\n var scrollObj = this.scrollbarContainer._doScrollIndex.call(this, evt);\r\n $(\"[id^=\" + this._id + '_scrollbarSelect_' + \"]\").attr('class', 'e-rangeScroll-select');\r\n this.lastIndex = null;\r\n var args = this.scrollbarContainer._calculateScrollPosition.call(this, this.mouseX, scrollObj),\r\n deferred = this.model.enableDeferredUpdate;\r\n if (args) {\r\n var oldRange = args.data.oldRange,\r\n newRange = args.data.newRange, oldStart, oldEnd, newStart, newEnd;\r\n if (scrollObj.valueType.toLowerCase() == 'datetime') {\r\n oldStart = Date.parse(oldRange.start), newStart = Date.parse(newRange.start),\r\n oldEnd = Date.parse(oldRange.end), newEnd = Date.parse(newRange.end);\r\n } else {\r\n oldStart = oldRange.start, newStart = newRange.start,\r\n oldEnd = oldRange.end, newEnd = newRange.end;\r\n }\r\n\r\n if (((oldStart != newStart) || (oldEnd != newEnd)) || (this.scrollRectClicked && !deferred) || (deferred) || (this.leftScrollbarClicked || this.rightScrollbarClicked)) {\r\n //Checked condition for chrome browser mouse click issue.. on mouseClick in chrome move event also triggered\r\n var is_chrome = ((navigator.userAgent.toLowerCase().indexOf('chrome') > -1) && (navigator.vendor.toLowerCase().indexOf(\"google\") > -1));\r\n if (!is_chrome || (is_chrome && ((this.leftScrollbarClicked || this.rightScrollbarClicked) && this.downClientX != this.moveClientX)\r\n || this.scrollRectClicked || this.leftArrowClicked || this.rightArrowClicked)) {\r\n //event will no trigger when rect value is not changed on left and right header moved\r\n if ((!this.leftScrollbarClicked && !this.rightScrollbarClicked) ||\r\n ((this.leftScrollbarClicked || this.rightScrollbarClicked) && Math.ceil(scrollObj.rectWidth) != Math.ceil(this.rectOldWidth) && (Math.abs(scrollObj.rectWidth - scrollObj.rectOldWidth) > 4 || !scrollObj.rectOldWidth))) {\r\n if (ej.isNullOrUndefined(scrollObj._previousStart) || ((scrollObj._previousStart != newStart) || (scrollObj._previousEnd != newEnd))) {\r\n args = this.scrollbarContainer._args.call(this, scrollObj, args);\r\n this._trigger(\"scrollEnd\", args);\r\n scrollObj._scrollStarted = false;\r\n scrollObj._previousStart = newStart;\r\n scrollObj._previousEnd = newEnd;\r\n scrollObj.rectOldWidth = scrollObj.rectWidth;\r\n this.scrollUpdate ? this.scrollUpdate = false : this.scrollbarContainer._appendScrollRange.call(this, scrollObj);\r\n }\r\n }\r\n }\r\n }\r\n scrollObj.release = true;\r\n scrollObj.clicked = false;\r\n }\r\n this._scrollEnd = false;\r\n this.leftScrollbarClicked = false;\r\n this.rightScrollbarClicked = false;\r\n this.scrollRectClicked = false;\r\n this.leftArrowClicked = false;\r\n this.rightArrowClicked = false;\r\n this.scrollbarBackRectClicked = false;\r\n },\r\n _leftScrollbarDown: function (evt) {\r\n evt.preventDefault();\r\n this.leftScrollbarClicked = true;\r\n this.downClientX = !ej.isNullOrUndefined(evt.clientX) ? evt.clientX : evt.originalEvent.touches[0].clientX;\r\n },\r\n\r\n _rightScrollbarDown: function (evt) {\r\n evt.preventDefault();\r\n this.rightScrollbarClicked = true;\r\n this.downClientX = !ej.isNullOrUndefined(evt.clientX) ? evt.clientX : evt.originalEvent.touches[0].clientX;\r\n },\r\n\r\n _scrollSelectRectDown: function (evt) {\r\n var scrollObj = this.scrollbarContainer._doScrollIndex.call(this, evt);\r\n $('#' + this._id + '_scrollbarSelect_' + scrollObj.index).attr('class', 'e-rangeScroll-select e-rangeScroll-select-hover');\r\n evt.preventDefault();\r\n var matched = jQuery.uaMatch(navigator.userAgent);\r\n var rangePadding = this.model.padding || 0;\r\n var scrollObj = this.scrollbarContainer._doScrollIndex.call(this, evt);\r\n if (((!this.vmlRendering && evt.originalEvent.toString() !== \"[object TouchEvent]\") && matched.browser.toLowerCase() != \"msie\") || (this.vmlRendering))\r\n var mouseX = (scrollObj.orientation == 'horizontal' ? this.calMousePosition(evt).X - scrollObj.x : scrollObj.width - (this.calMousePosition(evt).Y - scrollObj.y)) - rangePadding;\r\n else\r\n var mouseX = (scrollObj.orientation == 'horizontal' ? this.calTouchPosition(evt).X - scrollObj.x : scrollObj.width - (this.calTouchPosition(evt).Y - scrollObj.y)) - rangePadding;\r\n this.mouseDownPos = mouseX;\r\n scrollObj._startX = scrollObj.startX = scrollObj.offsetLeftX;\r\n scrollObj._offsetRightX = scrollObj.offsetRightX;\r\n scrollObj.clicked = true;\r\n scrollObj.release = false;\r\n this.scrollRectClicked = true;\r\n },\r\n\r\n //MouseWheel Scrolling event for scrollbarControl\r\n _scrollMouseWheel: function (e) {\r\n e.preventDefault();\r\n var scrollObj = this.scrollbarContainer._doScrollIndex.call(this, e);\r\n var isIE11 = !!navigator.userAgent.match(/Trident\\/7\\./);\r\n var wheelDelta = e.originalEvent.wheelDelta;\r\n var matched = jQuery.uaMatch(navigator.userAgent);\r\n var direction = matched.browser.toLowerCase() == \"mozilla\" ? ((isIE11 ? ((wheelDelta / 120) > 0 ? 1 : -1) : -(e.originalEvent.detail) / 3 > 0 ? 1 : -1)) : ((wheelDelta / 120) > 0 ? 1 : -1);\r\n var currentScale = Math.max(1 / ej.EjSvgRender.utils._minMax(scrollObj.zoomFactor, 0, 1), 1);\r\n var cumulativeScale = Math.max(currentScale + (0.25 * direction), 1);\r\n this.scrollbarContainer.doMouseWheelZoom.call(this, cumulativeScale, 0.5, scrollObj);\r\n\r\n },\r\n\r\n _scrollStartArgs: function (scrollObj) {\r\n scrollObj._scrollStarted = true;\r\n if (this.model.scrollStart != '' && !this._scrollEnd) {\r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n if (!scrollObj.isZooming) {\r\n commonEventArgs.data = {\r\n startRange: scrollObj.valueType == \"datetime\" ? scrollObj.startDateTime : scrollObj.startValue,\r\n endRange: scrollObj.valueType == \"datetime\" ? scrollObj.endDateTime : scrollObj.endValue\r\n };\r\n } else {\r\n commonEventArgs.data = {\r\n axis: this.model._axes[scrollObj.index],\r\n currentRange: this.model._axes[scrollObj.index].visibleRange\r\n };\r\n }\r\n this._trigger(\"scrollStart\", commonEventArgs);\r\n this._scrollEnd = true;\r\n }\r\n },\r\n\r\n _scrollChangeArgs: function (scrollObj) {\r\n if (this.model.enableDeferredUpdate === false || scrollObj.isZooming || this.model.scrollChanged != '') {\r\n var commonEventArgs = this.scrollbarContainer._calculateRange.call(this, scrollObj.offsetLeftX, scrollObj.offsetRightX, scrollObj);\r\n var oldRange = commonEventArgs.data.oldRange,\r\n newRange = commonEventArgs.data.newRange, oldStart, oldEnd, newStart, newEnd;\r\n if (scrollObj.valueType.toLowerCase() == 'datetime') {\r\n oldStart = Date.parse(oldRange.start), newStart = Date.parse(newRange.start),\r\n oldEnd = Date.parse(oldRange.end), newEnd = Date.parse(newRange.end);\r\n } else {\r\n oldStart = oldRange.start, newStart = newRange.start,\r\n oldEnd = oldRange.end, newEnd = newRange.end;\r\n }\r\n\r\n if (this.model.scrollChanged != '' && ((oldStart != newStart) || (oldEnd != newEnd))) {\r\n commonEventArgs = this.scrollbarContainer._args.call(this, scrollObj, commonEventArgs);\r\n this._trigger(\"scrollChanged\", commonEventArgs);\r\n }\r\n if (!this.model.enableDeferredUpdate)\r\n this.scrollUpdate ? this.scrollUpdate = false : this.scrollbarContainer._appendScrollRange.call(this, scrollObj);\r\n }\r\n },\r\n\r\n _scrollEndArgs: function (startX, scrollObj) {\r\n var args = this.scrollbarContainer._calculateRange.call(this, startX, scrollObj.offsetRightX, scrollObj);\r\n if (args && scrollObj._scrollStarted) {\r\n var oldRange = args.data.oldRange,\r\n newRange = args.data.newRange, oldStart, oldEnd, newStart, newEnd;\r\n if (scrollObj.valueType.toLowerCase() == 'datetime') {\r\n oldStart = Date.parse(oldRange.start), newStart = Date.parse(newRange.start),\r\n oldEnd = Date.parse(oldRange.end), newEnd = Date.parse(newRange.end);\r\n } else {\r\n oldStart = oldRange.start, newStart = newRange.start,\r\n oldEnd = oldRange.end, newEnd = newRange.end;\r\n }\r\n\r\n if (((oldStart != newStart) || (oldEnd != newEnd)) || (this.leftScrollbarClicked || this.rightScrollbarClicked)) {\r\n args = this.scrollbarContainer._args.call(this, scrollObj, args);\r\n this._trigger(\"scrollEnd\", args);\r\n }\r\n scrollObj._scrollStarted = false;\r\n this.scrollUpdate ? this.scrollUpdate = false : this.scrollbarContainer._appendScrollRange.call(this, scrollObj);\r\n }\r\n },\r\n\r\n _args: function (scrollObj, args) {\r\n if (scrollObj.isZooming) {\r\n var axis = this.model._axes[scrollObj.index],\r\n data = args.data;\r\n data.axis = axis;\r\n data.newRange = axis.visibleRange;\r\n data.oldRange = axis.previousRange;\r\n }\r\n\r\n if (scrollObj.isVirtual) {\r\n args.data.axis = this.model._axes[scrollObj.index];\r\n delete args.data.zoomFactor;\r\n delete args.data.zoomPosition;\r\n }\r\n return args;\r\n },\r\n\r\n doMouseWheelZoom: function (cumulativeScale, origin, scrollObj) {\r\n if (cumulativeScale >= 1) {\r\n var calZoomVal = this.scrollbarContainer.calZoomFactors(cumulativeScale, origin, scrollObj.zoomFactor, scrollObj.zoomPosition);\r\n\r\n if (scrollObj.zoomPosition != calZoomVal.zoomMPosition && calZoomVal.zoomMPosition + scrollObj.zoomFactor <= 1 && scrollObj.zoomPosition >= 0) {\r\n if (calZoomVal.zoomMPosition + scrollObj.zoomFactor >= 1) {\r\n calZoomVal.zoomMPosition = 1 - scrollObj.zoomFactor\r\n }\r\n if (calZoomVal.zoomMPosition < 0) {\r\n calZoomVal.zoomMPosition = 0;\r\n }\r\n scrollObj.zoomPosition = calZoomVal.zoomMPosition;\r\n scrollObj.startX = ((scrollObj.zoomPosition) * (scrollObj.width - 30 - scrollObj._diff) + 15);\r\n scrollObj.startX = (scrollObj.startX + scrollObj.rectWidth + 5) > scrollObj.width ? (scrollObj.width - scrollObj.rectWidth - 15) : scrollObj.startX;\r\n scrollObj.offsetLeftX = scrollObj.startX;\r\n\r\n scrollObj._offsetRightX = scrollObj.startX + scrollObj.rectWidth;\r\n if (scrollObj._offsetRightX > scrollObj.width - 15) {\r\n scrollObj.offsetRightX = scrollObj.width - 15;\r\n scrollObj.startX = scrollObj.offsetRightX - scrollObj.rectWidth;\r\n scrollObj.offsetLeftX = scrollObj.startX;\r\n } else {\r\n scrollObj.offsetRightX = scrollObj._offsetRightX;\r\n }\r\n scrollObj.endX = scrollObj.width - scrollObj.offsetRightX;\r\n this.scrollbarContainer._setScrollPosition.call(this, scrollObj.startX, scrollObj.offsetRightX, scrollObj);\r\n this.scrollbarContainer._calculateMouseWheelRange.call(this, scrollObj.startX, scrollObj.offsetRightX, scrollObj);\r\n }\r\n }\r\n return false;\r\n },\r\n _calculateMouseWheelRange: function (startX, endX, scrollObj) {\r\n\r\n var scrollRange, start, end, padding = 30, startArgs, endArgs;\r\n scrollObj.zoomFactor = (scrollObj.rectWidth / (scrollObj.width - padding));\r\n scrollObj.zoomPosition = (startX - 15) / (scrollObj.width - padding - scrollObj._diff);\r\n scrollRange = scrollObj.scrollRange;\r\n\r\n if (!scrollObj.isRTL) {\r\n start = scrollRange.min + scrollObj.zoomPosition * scrollRange.delta;\r\n end = start + scrollObj.zoomFactor * scrollRange.delta;\r\n } else {\r\n end = scrollRange.max - scrollObj.zoomPosition * scrollRange.delta;\r\n start = end - scrollObj.zoomFactor * scrollRange.delta;\r\n }\r\n\r\n if (scrollObj.valueType == \"datetime\") {\r\n startArgs = scrollObj.startDateTime;\r\n endArgs = scrollObj.endDateTime;\r\n scrollObj.startDateTime = this.startDateTime = start = new Date(start);\r\n scrollObj.endDateTime = this.endDateTime = end = new Date(end);\r\n } else {\r\n startArgs = parseInt(scrollObj.startValue);\r\n endArgs = parseInt(scrollObj.endValue);\r\n scrollObj.startValue = this.startValue = start = Math.ceil(start);\r\n scrollObj.endValue = this.endValue = end = Math.ceil(end);\r\n }\r\n\r\n //Bind event on changing scrollbar position \r\n var commonEventArgs = $.extend({}, ej.EjSvgRender.commonChartEventArgs);\r\n commonEventArgs.data = {\r\n zoomPosition: scrollObj.zoomPosition, zoomFactor: scrollObj.zoomFactor,\r\n oldRange: {\r\n start: startArgs,\r\n end: endArgs\r\n },\r\n newRange: {\r\n start: start,\r\n end: end\r\n }\r\n };\r\n scrollObj._scrollChanged = true;\r\n scrollObj._scrollStarted = false;\r\n var oldRange = commonEventArgs.data.oldRange,\r\n newRange = commonEventArgs.data.newRange, oldStart, oldEnd, newStart, newEnd;\r\n if (scrollObj.valueType.toLowerCase() == 'datetime') {\r\n oldStart = Date.parse(oldRange.start), newStart = Date.parse(newRange.start),\r\n oldEnd = Date.parse(oldRange.end), newEnd = Date.parse(newRange.end);\r\n } else {\r\n oldStart = oldRange.start, newStart = newRange.start,\r\n oldEnd = oldRange.end, newEnd = newRange.end;\r\n }\r\n if (oldStart != newStart || oldEnd != newEnd || scrollObj.isZooming) {\r\n this.scrollbarContainer._scrollStartArgs.call(this, scrollObj);\r\n commonEventArgs = this.scrollbarContainer._args.call(this, scrollObj, commonEventArgs);\r\n this._trigger(\"scrollEnd\", commonEventArgs);\r\n this.scrollUpdate ? this.scrollUpdate = false : this.scrollbarContainer._appendScrollRange.call(this, scrollObj);\r\n this._scrollEnd = false;\r\n }\r\n },\r\n calZoomFactors: function (cumulativeScale, origin, currentZoomFactor, currentZoomPos) {\r\n var calcZoomFactorVal, calcZoomPosition;\r\n if (cumulativeScale == 1) {\r\n calcZoomFactorVal = 1;\r\n calcZoomPosition = 0;\r\n } else {\r\n calcZoomFactorVal = ej.EjSvgRender.utils._minMax(1 / cumulativeScale, 0, 1);\r\n calcZoomPosition = currentZoomPos + ((currentZoomFactor - calcZoomFactorVal) * origin);\r\n }\r\n return { zoomMFactor: calcZoomFactorVal, zoomMPosition: calcZoomPosition };\r\n },\r\n _leftArrowDown: function (evt) {\r\n this.leftArrowClicked = true;\r\n var scrollObj = this.scrollbarContainer._doScrollIndex.call(this, evt);\r\n scrollObj._startX = scrollObj.startX = scrollObj.offsetLeftX;\r\n scrollObj._offsetRightX = scrollObj.offsetRightX;\r\n scrollObj.leftIncrement = 5;\r\n var range = this;\r\n scrollObj.interval = setInterval(function () {\r\n range.scrollbarContainer.leftArrowRecursive.call(range, scrollObj)\r\n }, 50);\r\n },\r\n\r\n _leftArrowUp: function (evt) {\r\n this.leftArrowClicked = false;\r\n var scrollObj = this.scrollbarContainer._doScrollIndex.call(this, evt);\r\n this.scrollbarContainer.leftArrowRecursive.call(this, scrollObj);\r\n },\r\n\r\n leftArrowRecursive: function (scrollObj) {\r\n if (this.leftArrowClicked) {\r\n var rootId = this._id;\r\n this.scrollbarContainer._calculateScrollLeftMove.call(this, scrollObj.leftIncrement, scrollObj);\r\n scrollObj._scrollStarted = true;\r\n if (scrollObj.startX > 15)\r\n this.scrollbarContainer._scrollEndArgs.call(this, scrollObj.startX, scrollObj);\r\n this.scrollbarContainer._setScrollPosition.call(this, scrollObj.startX, scrollObj.offsetRightX, scrollObj);\r\n scrollObj.leftIncrement += 5;\r\n } else {\r\n clearInterval(scrollObj.interval);\r\n scrollObj.leftIncrement = 0;\r\n }\r\n },\r\n\r\n _rightArrowDown: function (evt) {\r\n this.rightArrowClicked = true;\r\n var scrollObj = this.scrollbarContainer._doScrollIndex.call(this, evt);\r\n scrollObj._startX = scrollObj.startX = scrollObj.offsetLeftX;\r\n scrollObj._offsetRightX = scrollObj.offsetRightX;\r\n scrollObj.rightIncrement = -5;\r\n var range = this;\r\n scrollObj.interval = setInterval(function () { range.scrollbarContainer.rightArrowRecursive.call(range, scrollObj) }, 50);\r\n },\r\n\r\n _rightArrowUp: function (evt) {\r\n this.rightArrowClicked = false;\r\n var scrollObj = this.scrollbarContainer._doScrollIndex.call(this, evt);\r\n this.scrollbarContainer.rightArrowRecursive.call(this, scrollObj);\r\n },\r\n\r\n rightArrowRecursive: function (scrollObj) {\r\n if (this.rightArrowClicked) {\r\n var rootId = this._id;\r\n this.scrollbarContainer._calculateScrollRightMove.call(this, scrollObj.rightIncrement, scrollObj);\r\n scrollObj._scrollStarted = true;\r\n if (scrollObj.offsetRightX < scrollObj.width - 15)\r\n this.scrollbarContainer._scrollEndArgs.call(this, scrollObj._startX, scrollObj);\r\n this.scrollbarContainer._setScrollPosition.call(this, scrollObj._startX, scrollObj.offsetRightX, scrollObj);\r\n scrollObj.rightIncrement -= 5;\r\n } else {\r\n clearInterval(scrollObj.interval);\r\n scrollObj.rightIncrement = 0;\r\n }\r\n },\r\n\r\n _scrollBackRectDown: function (evt) {\r\n\r\n var matched = jQuery.uaMatch(navigator.userAgent);\r\n var rangePadding = this.model.padding || 0;\r\n var scrollObj = this.scrollbarContainer._doScrollIndex.call(this, evt);\r\n if (((!this.vmlRendering && evt.originalEvent.toString() !== \"[object TouchEvent]\") && matched.browser.toLowerCase() != \"msie\") || (this.vmlRendering))\r\n var mouseX = (scrollObj.orientation == 'horizontal' ? this.calMousePosition(evt).X - scrollObj.x : scrollObj.width - (this.calMousePosition(evt).Y - scrollObj.y)) - rangePadding;\r\n else\r\n var mouseX = (scrollObj.orientation == 'horizontal' ? this.calTouchPosition(evt).X - scrollObj.x : scrollObj.width - (this.calTouchPosition(evt).Y - scrollObj.y)) - rangePadding;\r\n this.mouseDownPos = mouseX;\r\n this.scrollbarBackRectClicked = true;\r\n\r\n var range = this;\r\n this.scrollbarContainer._scrollStartArgs.call(this, scrollObj);\r\n var interval = setInterval(function () {\r\n range.scrollbarContainer.scrollBackRectRecursive.call(range, scrollObj)\r\n if (!this.scrollbarBackRectClicked)\r\n clearInterval(interval);\r\n }, 50);\r\n },\r\n _scrollBackRectUp: function (evt) {\r\n this.scrollbarBackRectClicked = false;\r\n var scrollObj = this.scrollbarContainer._doScrollIndex.call(this, evt);\r\n this.scrollbarContainer.scrollBackRectRecursive.call(this, scrollObj);\r\n },\r\n\r\n _doScrollIndex: function (evt) {\r\n var matchStr = this._id + '_scrollbar' + '_';\r\n var parentNodeId = (evt.target.parentNode && evt.target.parentNode.id) ? evt.target.parentNode.id : '';\r\n var selectionIndex = parentNodeId.indexOf(matchStr) > -1 ? parseInt(parentNodeId.substr(matchStr.length)) : NaN;\r\n if (!ej.isNullOrUndefined(this.lastIndex) && !isNaN(this.lastIndex)) {\r\n if (!this.model.scrollObj[this.lastIndex].release && this.model.scrollObj[this.lastIndex].clicked)\r\n selectionIndex = this.lastIndex;\r\n }\r\n this.lastIndex = ej.isNullOrUndefined(this.lastIndex) ? selectionIndex : this.lastIndex;\r\n var scrollObj = ej.isNullOrUndefined(this.model.scrollObj[selectionIndex]) ? this.model.scrollObj[this.lastIndex] : this.model.scrollObj[selectionIndex];\r\n\r\n return scrollObj;\r\n },\r\n\r\n scrollBackRectRecursive: function (scrollObj) {\r\n if (this.scrollbarBackRectClicked) {\r\n var moveLength = (10 / 100) * (scrollObj.width - 30);\r\n scrollObj._startX = scrollObj.startX = scrollObj.offsetLeftX;\r\n scrollObj._offsetRightX = scrollObj.offsetRightX;\r\n if (this.mouseDownPos < scrollObj.startX) {\r\n moveLength = moveLength < scrollObj.startX ? moveLength : (scrollObj.startX - 16);\r\n this.scrollbarContainer._calculateScrollLeftMove.call(this, moveLength, scrollObj);\r\n scrollObj._scrollStarted = true;\r\n this.scrollbarContainer._scrollEndArgs.call(this, scrollObj.startX, scrollObj);\r\n this.scrollbarContainer._setScrollPosition.call(this, scrollObj.startX, scrollObj.offsetRightX, scrollObj);\r\n } else if (this.mouseDownPos > scrollObj.offsetRightX) {\r\n moveLength = (moveLength < scrollObj.endX ? moveLength : (scrollObj.endX - 16)) * -1;\r\n this.scrollbarContainer._calculateScrollRightMove.call(this, moveLength, scrollObj);\r\n scrollObj._scrollStarted = true;\r\n this.scrollbarContainer._scrollEndArgs.call(this, scrollObj._startX, scrollObj);\r\n this.scrollbarContainer._setScrollPosition.call(this, scrollObj._startX, scrollObj.offsetRightX, scrollObj);\r\n } else {\r\n scrollObj._scrollStarted = false;\r\n }\r\n } else {\r\n scrollObj._scrollStarted = false;\r\n }\r\n },\r\n\r\n //Redraw the RangeNavigator and Chart\r\n _appendScrollRange: function (scrollObj) {\r\n this.scrollbarUpdate = true;\r\n if (this.pluginName == \"ejRangeNavigator\")\r\n this.renderNavigator();\r\n else {\r\n var index = scrollObj.index,\r\n axes = this.model._axes[index];\r\n if (scrollObj.isZooming && (axes.zoomFactor != scrollObj.zoomFactor || axes.zoomPosition != scrollObj.zoomPosition)) {\r\n axes.zoomFactor = scrollObj.zoomFactor;\r\n axes.zoomPosition = scrollObj.zoomPosition;\r\n this.redraw(true);\r\n }\r\n }\r\n this.scrollbarUpdate = false;\r\n }\r\n\r\n };\r\n})(jQuery);;"]}