[doc] get back baseviews documentation into the code, enhance it and reorganize the module accordingly
also properly deprecates SecondaryView as it should have been done a while ago.
+ − ( function (){ jQuery . color = {}; jQuery . color . make = function ( G , H , J , I ){ var A = {}; A . r = G || 0 ; A . g = H || 0 ; A . b = J || 0 ; A . a = I != null ? I : 1 ; A . add = function ( C , D ){ for ( var E = 0 ; E < C . length ; ++ E ){ A [ C . charAt ( E )] += D } return A . normalize ()}; A . scale = function ( C , D ){ for ( var E = 0 ; E < C . length ; ++ E ){ A [ C . charAt ( E )] *= D } return A . normalize ()}; A . toString = function (){ if ( A . a >= 1 ){ return "rgb(" + [ A . r , A . g , A . b ]. join ( "," ) + ")" } else { return "rgba(" + [ A . r , A . g , A . b , A . a ]. join ( "," ) + ")" }}; A . normalize = function (){ function C ( E , D , F ){ return D < E ? E : ( D > F ? F : D )} A . r = C ( 0 , parseInt ( A . r ), 255 ); A . g = C ( 0 , parseInt ( A . g ), 255 ); A . b = C ( 0 , parseInt ( A . b ), 255 ); A . a = C ( 0 , A . a , 1 ); return A }; A . clone = function (){ return jQuery . color . make ( A . r , A . b , A . g , A . a )}; return A . normalize ()}; jQuery . color . extract = function ( E , F ){ var A ; do { A = E . css ( F ). toLowerCase (); if ( A != "" && A != "transparent" ){ break } E = E . parent ()} while ( ! jQuery . nodeName ( E . get ( 0 ), "body" )); if ( A == "rgba(0, 0, 0, 0)" ){ A = "transparent" } return jQuery . color . parse ( A )}; jQuery . color . parse = function ( A ){ var F , H = jQuery . color . make ; if ( F = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/ . exec ( A )){ return H ( parseInt ( F [ 1 ], 10 ), parseInt ( F [ 2 ], 10 ), parseInt ( F [ 3 ], 10 ))} if ( F = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/ . exec ( A )){ return H ( parseInt ( F [ 1 ], 10 ), parseInt ( F [ 2 ], 10 ), parseInt ( F [ 3 ], 10 ), parseFloat ( F [ 4 ]))} if ( F = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/ . exec ( A )){ return H ( parseFloat ( F [ 1 ]) * 2.55 , parseFloat ( F [ 2 ]) * 2.55 , parseFloat ( F [ 3 ]) * 2.55 )} if ( F = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/ . exec ( A )){ return H ( parseFloat ( F [ 1 ]) * 2.55 , parseFloat ( F [ 2 ]) * 2.55 , parseFloat ( F [ 3 ]) * 2.55 , parseFloat ( F [ 4 ]))} if ( F = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/ . exec ( A )){ return H ( parseInt ( F [ 1 ], 16 ), parseInt ( F [ 2 ], 16 ), parseInt ( F [ 3 ], 16 ))} if ( F = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/ . exec ( A )){ return H ( parseInt ( F [ 1 ] + F [ 1 ], 16 ), parseInt ( F [ 2 ] + F [ 2 ], 16 ), parseInt ( F [ 3 ] + F [ 3 ], 16 ))} var G = jQuery . trim ( A ). toLowerCase (); if ( G == "transparent" ){ return H ( 255 , 255 , 255 , 0 )} else { F = B [ G ]; return H ( F [ 0 ], F [ 1 ], F [ 2 ])}}; var B = { aqua : [ 0 , 255 , 255 ], azure : [ 240 , 255 , 255 ], beige : [ 245 , 245 , 220 ], black : [ 0 , 0 , 0 ], blue : [ 0 , 0 , 255 ], brown : [ 165 , 42 , 42 ], cyan : [ 0 , 255 , 255 ], darkblue : [ 0 , 0 , 139 ], darkcyan : [ 0 , 139 , 139 ], darkgrey : [ 169 , 169 , 169 ], darkgreen : [ 0 , 100 , 0 ], darkkhaki : [ 189 , 183 , 107 ], darkmagenta : [ 139 , 0 , 139 ], darkolivegreen : [ 85 , 107 , 47 ], darkorange : [ 255 , 140 , 0 ], darkorchid : [ 153 , 50 , 204 ], darkred : [ 139 , 0 , 0 ], darksalmon : [ 233 , 150 , 122 ], darkviolet : [ 148 , 0 , 211 ], fuchsia : [ 255 , 0 , 255 ], gold : [ 255 , 215 , 0 ], green : [ 0 , 128 , 0 ], indigo : [ 75 , 0 , 130 ], khaki : [ 240 , 230 , 140 ], lightblue : [ 173 , 216 , 230 ], lightcyan : [ 224 , 255 , 255 ], lightgreen : [ 144 , 238 , 144 ], lightgrey : [ 211 , 211 , 211 ], lightpink : [ 255 , 182 , 193 ], lightyellow : [ 255 , 255 , 224 ], lime : [ 0 , 255 , 0 ], magenta : [ 255 , 0 , 255 ], maroon : [ 128 , 0 , 0 ], navy : [ 0 , 0 , 128 ], olive : [ 128 , 128 , 0 ], orange : [ 255 , 165 , 0 ], pink : [ 255 , 192 , 203 ], purple : [ 128 , 0 , 128 ], violet : [ 128 , 0 , 128 ], red : [ 255 , 0 , 0 ], silver : [ 192 , 192 , 192 ], white : [ 255 , 255 , 255 ], yellow : [ 255 , 255 , 0 ]}})();( function ( C ){ function B ( l , W , X , E ){ var O = [], g = { colors : [ "#edc240" , "#afd8f8" , "#cb4b4b" , "#4da74d" , "#9440ed" ], legend : { show : true , noColumns : 1 , labelFormatter : null , labelBoxBorderColor : "#ccc" , container : null , position : "ne" , margin : 5 , backgroundColor : null , backgroundOpacity : 0.85 }, xaxis : { mode : null , transform : null , inverseTransform : null , min : null , max : null , autoscaleMargin : null , ticks : null , tickFormatter : null , labelWidth : null , labelHeight : null , tickDecimals : null , tickSize : null , minTickSize : null , monthNames : null , timeformat : null , twelveHourClock : false }, yaxis : { autoscaleMargin : 0.02 }, x2axis : { autoscaleMargin : null }, y2axis : { autoscaleMargin : 0.02 }, series : { points : { show : false , radius : 3 , lineWidth : 2 , fill : true , fillColor : "#ffffff" }, lines : { lineWidth : 2 , fill : false , fillColor : null , steps : false }, bars : { show : false , lineWidth : 2 , barWidth : 1 , fill : true , fillColor : null , align : "left" , horizontal : false }, shadowSize : 3 }, grid : { show : true , aboveData : false , color : "#545454" , backgroundColor : null , tickColor : "rgba(0,0,0,0.15)" , labelMargin : 5 , borderWidth : 2 , borderColor : null , markings : null , markingsColor : "#f4f4f4" , markingsLineWidth : 2 , clickable : false , hoverable : false , autoHighlight : true , mouseActiveRadius : 10 }, hooks : {}}, P = null , AC = null , AD = null , Y = null , AJ = null , s = { xaxis : {}, yaxis : {}, x2axis : {}, y2axis : {}}, e = { left : 0 , right : 0 , top : 0 , bottom : 0 }, y = 0 , Q = 0 , I = 0 , t = 0 , L = { processOptions : [], processRawData : [], processDatapoints : [], draw : [], bindEvents : [], drawOverlay : []}, G = this ; G . setData = f ; G . setupGrid = k ; G . draw = AH ; G . getPlaceholder = function (){ return l }; G . getCanvas = function (){ return P }; G . getPlotOffset = function (){ return e }; G . width = function (){ return I }; G . height = function (){ return t }; G . offset = function (){ var AK = AD . offset (); AK . left += e . left ; AK . top += e . top ; return AK }; G . getData = function (){ return O }; G . getAxes = function (){ return s }; G . getOptions = function (){ return g }; G . highlight = AE ; G . unhighlight = x ; G . triggerRedrawOverlay = q ; G . pointOffset = function ( AK ){ return { left : parseInt ( T ( AK , "xaxis" ). p2c ( + AK . x ) + e . left ), top : parseInt ( T ( AK , "yaxis" ). p2c ( + AK . y ) + e . top )}}; G . hooks = L ; b ( G ); r ( X ); c (); f ( W ); k (); AH (); AG (); function Z ( AM , AK ){ AK = [ G ]. concat ( AK ); for ( var AL = 0 ; AL < AM . length ; ++ AL ){ AM [ AL ]. apply ( this , AK )}} function b (){ for ( var AK = 0 ; AK < E . length ; ++ AK ){ var AL = E [ AK ]; AL . init ( G ); if ( AL . options ){ C . extend ( true , g , AL . options )}}} function r ( AK ){ C . extend ( true , g , AK ); if ( g . grid . borderColor == null ){ g . grid . borderColor = g . grid . color } if ( g . xaxis . noTicks && g . xaxis . ticks == null ){ g . xaxis . ticks = g . xaxis . noTicks } if ( g . yaxis . noTicks && g . yaxis . ticks == null ){ g . yaxis . ticks = g . yaxis . noTicks } if ( g . grid . coloredAreas ){ g . grid . markings = g . grid . coloredAreas } if ( g . grid . coloredAreasColor ){ g . grid . markingsColor = g . grid . coloredAreasColor } if ( g . lines ){ C . extend ( true , g . series . lines , g . lines )} if ( g . points ){ C . extend ( true , g . series . points , g . points )} if ( g . bars ){ C . extend ( true , g . series . bars , g . bars )} if ( g . shadowSize ){ g . series . shadowSize = g . shadowSize } for ( var AL in L ){ if ( g . hooks [ AL ] && g . hooks [ AL ]. length ){ L [ AL ] = L [ AL ]. concat ( g . hooks [ AL ])}} Z ( L . processOptions ,[ g ])} function f ( AK ){ O = M ( AK ); U (); m ()} function M ( AN ){ var AL = []; for ( var AK = 0 ; AK < AN . length ; ++ AK ){ var AM = C . extend ( true ,{}, g . series ); if ( AN [ AK ]. data ){ AM . data = AN [ AK ]. data ; delete AN [ AK ]. data ; C . extend ( true , AM , AN [ AK ]); AN [ AK ]. data = AM . data } else { AM . data = AN [ AK ]} AL . push ( AM )} return AL } function T ( AM , AK ){ var AL = AM [ AK ]; if ( ! AL || AL == 1 ){ return s [ AK ]} if ( typeof AL == "number" ){ return s [ AK . charAt ( 0 ) + AL + AK . slice ( 1 )]} return AL } function U (){ var AP ; var AV = O . length , AK = [], AN = []; for ( AP = 0 ; AP < O . length ; ++ AP ){ var AS = O [ AP ]. color ; if ( AS != null ){ -- AV ; if ( typeof AS == "number" ){ AN . push ( AS )} else { AK . push ( C . color . parse ( O [ AP ]. color ))}}} for ( AP = 0 ; AP < AN . length ; ++ AP ){ AV = Math . max ( AV , AN [ AP ] + 1 )} var AL = [], AO = 0 ; AP = 0 ; while ( AL . length < AV ){ var AR ; if ( g . colors . length == AP ){ AR = C . color . make ( 100 , 100 , 100 )} else { AR = C . color . parse ( g . colors [ AP ])} var AM = AO % 2 == 1 ?- 1 : 1 ; AR . scale ( "rgb" , 1 + AM * Math . ceil ( AO / 2 ) * 0.2 ); AL . push ( AR ); ++ AP ; if ( AP >= g . colors . length ){ AP = 0 ; ++ AO }} var AQ = 0 , AW ; for ( AP = 0 ; AP < O . length ; ++ AP ){ AW = O [ AP ]; if ( AW . color == null ){ AW . color = AL [ AQ ]. toString (); ++ AQ } else { if ( typeof AW . color == "number" ){ AW . color = AL [ AW . color ]. toString ()}} if ( AW . lines . show == null ){ var AU , AT = true ; for ( AU in AW ){ if ( AW [ AU ]. show ){ AT = false ; break }} if ( AT ){ AW . lines . show = true }} AW . xaxis = T ( AW , "xaxis" ); AW . yaxis = T ( AW , "yaxis" )}} function m (){ var AW = Number . POSITIVE_INFINITY , AQ = Number . NEGATIVE_INFINITY , Ac , Aa , AZ , AV , AL , AR , Ab , AX , AP , AO , AK , Ai , Af , AT ; for ( AK in s ){ s [ AK ]. datamin = AW ; s [ AK ]. datamax = AQ ; s [ AK ]. used = false } function AN ( Al , Ak , Aj ){ if ( Ak < Al . datamin ){ Al . datamin = Ak } if ( Aj > Al . datamax ){ Al . datamax = Aj }} for ( Ac = 0 ; Ac < O . length ; ++ Ac ){ AR = O [ Ac ]; AR . datapoints = { points : []}; Z ( L . processRawData ,[ AR , AR . data , AR . datapoints ])} for ( Ac = 0 ; Ac < O . length ; ++ Ac ){ AR = O [ Ac ]; var Ah = AR . data , Ae = AR . datapoints . format ; if ( ! Ae ){ Ae = []; Ae . push ({ x : true , number : true , required : true }); Ae . push ({ y : true , number : true , required : true }); if ( AR . bars . show ){ Ae . push ({ y : true , number : true , required : false , defaultValue : 0 })} AR . datapoints . format = Ae } if ( AR . datapoints . pointsize != null ){ continue } if ( AR . datapoints . pointsize == null ){ AR . datapoints . pointsize = Ae . length } AX = AR . datapoints . pointsize ; Ab = AR . datapoints . points ; insertSteps = AR . lines . show && AR . lines . steps ; AR . xaxis . used = AR . yaxis . used = true ; for ( Aa = AZ = 0 ; Aa < Ah . length ; ++ Aa , AZ += AX ){ AT = Ah [ Aa ]; var AM = AT == null ; if ( ! AM ){ for ( AV = 0 ; AV < AX ; ++ AV ){ Ai = AT [ AV ]; Af = Ae [ AV ]; if ( Af ){ if ( Af . number && Ai != null ){ Ai =+ Ai ; if ( isNaN ( Ai )){ Ai = null }} if ( Ai == null ){ if ( Af . required ){ AM = true } if ( Af . defaultValue != null ){ Ai = Af . defaultValue }}} Ab [ AZ + AV ] = Ai }} if ( AM ){ for ( AV = 0 ; AV < AX ; ++ AV ){ Ai = Ab [ AZ + AV ]; if ( Ai != null ){ Af = Ae [ AV ]; if ( Af . x ){ AN ( AR . xaxis , Ai , Ai )} if ( Af . y ){ AN ( AR . yaxis , Ai , Ai )}} Ab [ AZ + AV ] = null }} else { if ( insertSteps && AZ > 0 && Ab [ AZ - AX ] != null && Ab [ AZ - AX ] != Ab [ AZ ] && Ab [ AZ - AX + 1 ] != Ab [ AZ + 1 ]){ for ( AV = 0 ; AV < AX ; ++ AV ){ Ab [ AZ + AX + AV ] = Ab [ AZ + AV ]} Ab [ AZ + 1 ] = Ab [ AZ - AX + 1 ]; AZ += AX }}}} for ( Ac = 0 ; Ac < O . length ; ++ Ac ){ AR = O [ Ac ]; Z ( L . processDatapoints ,[ AR , AR . datapoints ])} for ( Ac = 0 ; Ac < O . length ; ++ Ac ){ AR = O [ Ac ]; Ab = AR . datapoints . points , AX = AR . datapoints . pointsize ; var AS = AW , AY = AW , AU = AQ , Ad = AQ ; for ( Aa = 0 ; Aa < Ab . length ; Aa += AX ){ if ( Ab [ Aa ] == null ){ continue } for ( AV = 0 ; AV < AX ; ++ AV ){ Ai = Ab [ Aa + AV ]; Af = Ae [ AV ]; if ( ! Af ){ continue } if ( Af . x ){ if ( Ai < AS ){ AS = Ai } if ( Ai > AU ){ AU = Ai }} if ( Af . y ){ if ( Ai < AY ){ AY = Ai } if ( Ai > Ad ){ Ad = Ai }}}} if ( AR . bars . show ){ var Ag = AR . bars . align == "left" ? 0 :- AR . bars . barWidth / 2 ; if ( AR . bars . horizontal ){ AY += Ag ; Ad += Ag + AR . bars . barWidth } else { AS += Ag ; AU += Ag + AR . bars . barWidth }} AN ( AR . xaxis , AS , AU ); AN ( AR . yaxis , AY , Ad )} for ( AK in s ){ if ( s [ AK ]. datamin == AW ){ s [ AK ]. datamin = null } if ( s [ AK ]. datamax == AQ ){ s [ AK ]. datamax = null }}} function c (){ function AK ( AM , AL ){ var AN = document . createElement ( "canvas" ); AN . width = AM ; AN . height = AL ; if ( C . browser . msie ){ AN = window . G_vmlCanvasManager . initElement ( AN )} return AN } y = l . width (); Q = l . height (); l . html ( "" ); if ( l . css ( "position" ) == "static" ){ l . css ( "position" , "relative" )} if ( y <= 0 || Q <= 0 ){ throw "Invalid dimensions for plot, width = " + y + ", height = " + Q } if ( C . browser . msie ){ window . G_vmlCanvasManager . init_ ( document )} P = C ( AK ( y , Q )). appendTo ( l ). get ( 0 ); Y = P . getContext ( "2d" ); AC = C ( AK ( y , Q )). css ({ position : "absolute" , left : 0 , top : 0 }). appendTo ( l ). get ( 0 ); AJ = AC . getContext ( "2d" ); AJ . stroke ()} function AG (){ AD = C ([ AC , P ]); if ( g . grid . hoverable ){ AD . mousemove ( D )} if ( g . grid . clickable ){ AD . click ( d )} Z ( L . bindEvents ,[ AD ])} function k (){ function AL ( AT , AU ){ function AP ( AV ){ return AV } var AS , AO , AQ = AU . transform || AP , AR = AU . inverseTransform ; if ( AT == s . xaxis || AT == s . x2axis ){ AS = AT . scale = I / ( AQ ( AT . max ) - AQ ( AT . min )); AO = AQ ( AT . min ); if ( AQ == AP ){ AT . p2c = function ( AV ){ return ( AV - AO ) * AS }} else { AT . p2c = function ( AV ){ return ( AQ ( AV ) - AO ) * AS }} if ( ! AR ){ AT . c2p = function ( AV ){ return AO + AV / AS }} else { AT . c2p = function ( AV ){ return AR ( AO + AV / AS )}}} else { AS = AT . scale = t / ( AQ ( AT . max ) - AQ ( AT . min )); AO = AQ ( AT . max ); if ( AQ == AP ){ AT . p2c = function ( AV ){ return ( AO - AV ) * AS }} else { AT . p2c = function ( AV ){ return ( AO - AQ ( AV )) * AS }} if ( ! AR ){ AT . c2p = function ( AV ){ return AO - AV / AS }} else { AT . c2p = function ( AV ){ return AR ( AO - AV / AS )}}}} function AN ( AR , AT ){ var AQ , AS = [], AP ; AR . labelWidth = AT . labelWidth ; AR . labelHeight = AT . labelHeight ; if ( AR == s . xaxis || AR == s . x2axis ){ if ( AR . labelWidth == null ){ AR . labelWidth = y / ( AR . ticks . length > 0 ? AR . ticks . length : 1 )} if ( AR . labelHeight == null ){ AS = []; for ( AQ = 0 ; AQ < AR . ticks . length ; ++ AQ ){ AP = AR . ticks [ AQ ]. label ; if ( AP ){ AS . push ( '<div class="tickLabel" style="float:left;width:' + AR . labelWidth + 'px">' + AP + "</div>" )}} if ( AS . length > 0 ){ var AO = C ( '<div style="position:absolute;top:-10000px;width:10000px;font-size:smaller">' + AS . join ( "" ) + '<div style="clear:left"></div></div>' ). appendTo ( l ); AR . labelHeight = AO . height (); AO . remove ()}}} else { if ( AR . labelWidth == null || AR . labelHeight == null ){ for ( AQ = 0 ; AQ < AR . ticks . length ; ++ AQ ){ AP = AR . ticks [ AQ ]. label ; if ( AP ){ AS . push ( '<div class="tickLabel">' + AP + "</div>" )}} if ( AS . length > 0 ){ var AO = C ( '<div style="position:absolute;top:-10000px;font-size:smaller">' + AS . join ( "" ) + "</div>" ). appendTo ( l ); if ( AR . labelWidth == null ){ AR . labelWidth = AO . width ()} if ( AR . labelHeight == null ){ AR . labelHeight = AO . find ( "div" ). height ()} AO . remove ()}}} if ( AR . labelWidth == null ){ AR . labelWidth = 0 } if ( AR . labelHeight == null ){ AR . labelHeight = 0 }} function AM (){ var AP = g . grid . borderWidth ; for ( i = 0 ; i < O . length ; ++ i ){ AP = Math . max ( AP , 2 * ( O [ i ]. points . radius + O [ i ]. points . lineWidth / 2 ))} e . left = e . right = e . top = e . bottom = AP ; var AO = g . grid . labelMargin + g . grid . borderWidth ; if ( s . xaxis . labelHeight > 0 ){ e . bottom = Math . max ( AP , s . xaxis . labelHeight + AO )} if ( s . yaxis . labelWidth > 0 ){ e . left = Math . max ( AP , s . yaxis . labelWidth + AO )} if ( s . x2axis . labelHeight > 0 ){ e . top = Math . max ( AP , s . x2axis . labelHeight + AO )} if ( s . y2axis . labelWidth > 0 ){ e . right = Math . max ( AP , s . y2axis . labelWidth + AO )} I = y - e . left - e . right ; t = Q - e . bottom - e . top } var AK ; for ( AK in s ){ K ( s [ AK ], g [ AK ])} if ( g . grid . show ){ for ( AK in s ){ F ( s [ AK ], g [ AK ]); p ( s [ AK ], g [ AK ]); AN ( s [ AK ], g [ AK ])} AM ()} else { e . left = e . right = e . top = e . bottom = 0 ; I = y ; t = Q } for ( AK in s ){ AL ( s [ AK ], g [ AK ])} if ( g . grid . show ){ h ()} AI ()} function K ( AN , AQ ){ var AM =+ ( AQ . min != null ? AQ . min : AN . datamin ), AK =+ ( AQ . max != null ? AQ . max : AN . datamax ), AP = AK - AM ; if ( AP == 0 ){ var AL = AK == 0 ? 1 : 0.01 ; if ( AQ . min == null ){ AM -= AL } if ( AQ . max == null || AQ . min != null ){ AK += AL }} else { var AO = AQ . autoscaleMargin ; if ( AO != null ){ if ( AQ . min == null ){ AM -= AP * AO ; if ( AM < 0 && AN . datamin != null && AN . datamin >= 0 ){ AM = 0 }} if ( AQ . max == null ){ AK += AP * AO ; if ( AK > 0 && AN . datamax != null && AN . datamax <= 0 ){ AK = 0 }}}} AN . min = AM ; AN . max = AK } function F ( AP , AS ){ var AO ; if ( typeof AS . ticks == "number" && AS . ticks > 0 ){ AO = AS . ticks } else { if ( AP == s . xaxis || AP == s . x2axis ){ AO = 0.3 * Math . sqrt ( y )} else { AO = 0.3 * Math . sqrt ( Q )}} var AX = ( AP . max - AP . min ) / AO , AZ , AT , AV , AW , AR , AM , AL ; if ( AS . mode == "time" ){ var AU = { second : 1000 , minute : 60 * 1000 , hour : 60 * 60 * 1000 , day : 24 * 60 * 60 * 1000 , month : 30 * 24 * 60 * 60 * 1000 , year : 365.2425 * 24 * 60 * 60 * 1000 }; var AY = [[ 1 , "second" ],[ 2 , "second" ],[ 5 , "second" ],[ 10 , "second" ],[ 30 , "second" ],[ 1 , "minute" ],[ 2 , "minute" ],[ 5 , "minute" ],[ 10 , "minute" ],[ 30 , "minute" ],[ 1 , "hour" ],[ 2 , "hour" ],[ 4 , "hour" ],[ 8 , "hour" ],[ 12 , "hour" ],[ 1 , "day" ],[ 2 , "day" ],[ 3 , "day" ],[ 0.25 , "month" ],[ 0.5 , "month" ],[ 1 , "month" ],[ 2 , "month" ],[ 3 , "month" ],[ 6 , "month" ],[ 1 , "year" ]]; var AN = 0 ; if ( AS . minTickSize != null ){ if ( typeof AS . tickSize == "number" ){ AN = AS . tickSize } else { AN = AS . minTickSize [ 0 ] * AU [ AS . minTickSize [ 1 ]]}} for ( AR = 0 ; AR < AY . length - 1 ; ++ AR ){ if ( AX < ( AY [ AR ][ 0 ] * AU [ AY [ AR ][ 1 ]] + AY [ AR + 1 ][ 0 ] * AU [ AY [ AR + 1 ][ 1 ]]) / 2 && AY [ AR ][ 0 ] * AU [ AY [ AR ][ 1 ]] >= AN ){ break }} AZ = AY [ AR ][ 0 ]; AV = AY [ AR ][ 1 ]; if ( AV == "year" ){ AM = Math . pow ( 10 , Math . floor ( Math . log ( AX / AU . year ) / Math . LN10 )); AL = ( AX / AU . year ) / AM ; if ( AL < 1.5 ){ AZ = 1 } else { if ( AL < 3 ){ AZ = 2 } else { if ( AL < 7.5 ){ AZ = 5 } else { AZ = 10 }}} AZ *= AM } if ( AS . tickSize ){ AZ = AS . tickSize [ 0 ]; AV = AS . tickSize [ 1 ]} AT = function ( Ac ){ var Ah = [], Af = Ac . tickSize [ 0 ], Ai = Ac . tickSize [ 1 ], Ag = new Date ( Ac . min ); var Ab = Af * AU [ Ai ]; if ( Ai == "second" ){ Ag . setUTCSeconds ( A ( Ag . getUTCSeconds (), Af ))} if ( Ai == "minute" ){ Ag . setUTCMinutes ( A ( Ag . getUTCMinutes (), Af ))} if ( Ai == "hour" ){ Ag . setUTCHours ( A ( Ag . getUTCHours (), Af ))} if ( Ai == "month" ){ Ag . setUTCMonth ( A ( Ag . getUTCMonth (), Af ))} if ( Ai == "year" ){ Ag . setUTCFullYear ( A ( Ag . getUTCFullYear (), Af ))} Ag . setUTCMilliseconds ( 0 ); if ( Ab >= AU . minute ){ Ag . setUTCSeconds ( 0 )} if ( Ab >= AU . hour ){ Ag . setUTCMinutes ( 0 )} if ( Ab >= AU . day ){ Ag . setUTCHours ( 0 )} if ( Ab >= AU . day * 4 ){ Ag . setUTCDate ( 1 )} if ( Ab >= AU . year ){ Ag . setUTCMonth ( 0 )} var Ak = 0 , Aj = Number . NaN , Ad ; do { Ad = Aj ; Aj = Ag . getTime (); Ah . push ({ v : Aj , label : Ac . tickFormatter ( Aj , Ac )}); if ( Ai == "month" ){ if ( Af < 1 ){ Ag . setUTCDate ( 1 ); var Aa = Ag . getTime (); Ag . setUTCMonth ( Ag . getUTCMonth () + 1 ); var Ae = Ag . getTime (); Ag . setTime ( Aj + Ak * AU . hour + ( Ae - Aa ) * Af ); Ak = Ag . getUTCHours (); Ag . setUTCHours ( 0 )} else { Ag . setUTCMonth ( Ag . getUTCMonth () + Af )}} else { if ( Ai == "year" ){ Ag . setUTCFullYear ( Ag . getUTCFullYear () + Af )} else { Ag . setTime ( Aj + Ab )}}} while ( Aj < Ac . max && Aj != Ad ); return Ah }; AW = function ( Aa , Ad ){ var Af = new Date ( Aa ); if ( AS . timeformat != null ){ return C . plot . formatDate ( Af , AS . timeformat , AS . monthNames )} var Ab = Ad . tickSize [ 0 ] * AU [ Ad . tickSize [ 1 ]]; var Ac = Ad . max - Ad . min ; var Ae = ( AS . twelveHourClock ) ? " %p" : "" ; if ( Ab < AU . minute ){ fmt = "%h:%M:%S" + Ae } else { if ( Ab < AU . day ){ if ( Ac < 2 * AU . day ){ fmt = "%h:%M" + Ae } else { fmt = "%b %d %h:%M" + Ae }} else { if ( Ab < AU . month ){ fmt = "%b %d" } else { if ( Ab < AU . year ){ if ( Ac < AU . year ){ fmt = "%b" } else { fmt = "%b %y" }} else { fmt = "%y" }}}} return C . plot . formatDate ( Af , fmt , AS . monthNames )}} else { var AK = AS . tickDecimals ; var AQ =- Math . floor ( Math . log ( AX ) / Math . LN10 ); if ( AK != null && AQ > AK ){ AQ = AK } AM = Math . pow ( 10 , - AQ ); AL = AX / AM ; if ( AL < 1.5 ){ AZ = 1 } else { if ( AL < 3 ){ AZ = 2 ; if ( AL > 2.25 && ( AK == null || AQ + 1 <= AK )){ AZ = 2.5 ; ++ AQ }} else { if ( AL < 7.5 ){ AZ = 5 } else { AZ = 10 }}} AZ *= AM ; if ( AS . minTickSize != null && AZ < AS . minTickSize ){ AZ = AS . minTickSize } if ( AS . tickSize != null ){ AZ = AS . tickSize } AP . tickDecimals = Math . max ( 0 ,( AK != null ) ? AK : AQ ); AT = function ( Ac ){ var Ae = []; var Af = A ( Ac . min , Ac . tickSize ), Ab = 0 , Aa = Number . NaN , Ad ; do { Ad = Aa ; Aa = Af + Ab * Ac . tickSize ; Ae . push ({ v : Aa , label : Ac . tickFormatter ( Aa , Ac )}); ++ Ab } while ( Aa < Ac . max && Aa != Ad ); return Ae }; AW = function ( Aa , Ab ){ return Aa . toFixed ( Ab . tickDecimals )}} AP . tickSize = AV ? [ AZ , AV ] : AZ ; AP . tickGenerator = AT ; if ( C . isFunction ( AS . tickFormatter )){ AP . tickFormatter = function ( Aa , Ab ){ return "" + AS . tickFormatter ( Aa , Ab )}} else { AP . tickFormatter = AW }} function p ( AO , AQ ){ AO . ticks = []; if ( ! AO . used ){ return } if ( AQ . ticks == null ){ AO . ticks = AO . tickGenerator ( AO )} else { if ( typeof AQ . ticks == "number" ){ if ( AQ . ticks > 0 ){ AO . ticks = AO . tickGenerator ( AO )}} else { if ( AQ . ticks ){ var AP = AQ . ticks ; if ( C . isFunction ( AP )){ AP = AP ({ min : AO . min , max : AO . max })} var AN , AK ; for ( AN = 0 ; AN < AP . length ; ++ AN ){ var AL = null ; var AM = AP [ AN ]; if ( typeof AM == "object" ){ AK = AM [ 0 ]; if ( AM . length > 1 ){ AL = AM [ 1 ]}} else { AK = AM } if ( AL == null ){ AL = AO . tickFormatter ( AK , AO )} AO . ticks [ AN ] = { v : AK , label : AL }}}}} if ( AQ . autoscaleMargin != null && AO . ticks . length > 0 ){ if ( AQ . min == null ){ AO . min = Math . min ( AO . min , AO . ticks [ 0 ]. v )} if ( AQ . max == null && AO . ticks . length > 1 ){ AO . max = Math . max ( AO . max , AO . ticks [ AO . ticks . length - 1 ]. v )}}} function AH (){ Y . clearRect ( 0 , 0 , y , Q ); var AL = g . grid ; if ( AL . show &&! AL . aboveData ){ S ()} for ( var AK = 0 ; AK < O . length ; ++ AK ){ AA ( O [ AK ])} Z ( L . draw ,[ Y ]); if ( AL . show && AL . aboveData ){ S ()}} function N ( AL , AR ){ var AO = AR + "axis" , AK = AR + "2axis" , AN , AQ , AP , AM ; if ( AL [ AO ]){ AN = s [ AO ]; AQ = AL [ AO ]. from ; AP = AL [ AO ]. to } else { if ( AL [ AK ]){ AN = s [ AK ]; AQ = AL [ AK ]. from ; AP = AL [ AK ]. to } else { AN = s [ AO ]; AQ = AL [ AR + "1" ]; AP = AL [ AR + "2" ]}} if ( AQ != null && AP != null && AQ > AP ){ return { from : AP , to : AQ , axis : AN }} return { from : AQ , to : AP , axis : AN }} function S (){ var AO ; Y . save (); Y . translate ( e . left , e . top ); if ( g . grid . backgroundColor ){ Y . fillStyle = R ( g . grid . backgroundColor , t , 0 , "rgba(255, 255, 255, 0)" ); Y . fillRect ( 0 , 0 , I , t )} var AL = g . grid . markings ; if ( AL ){ if ( C . isFunction ( AL )){ AL = AL ({ xmin : s . xaxis . min , xmax : s . xaxis . max , ymin : s . yaxis . min , ymax : s . yaxis . max , xaxis : s . xaxis , yaxis : s . yaxis , x2axis : s . x2axis , y2axis : s . y2axis })} for ( AO = 0 ; AO < AL . length ; ++ AO ){ var AK = AL [ AO ], AQ = N ( AK , "x" ), AN = N ( AK , "y" ); if ( AQ . from == null ){ AQ . from = AQ . axis . min } if ( AQ . to == null ){ AQ . to = AQ . axis . max } if ( AN . from == null ){ AN . from = AN . axis . min } if ( AN . to == null ){ AN . to = AN . axis . max } if ( AQ . to < AQ . axis . min || AQ . from > AQ . axis . max || AN . to < AN . axis . min || AN . from > AN . axis . max ){ continue } AQ . from = Math . max ( AQ . from , AQ . axis . min ); AQ . to = Math . min ( AQ . to , AQ . axis . max ); AN . from = Math . max ( AN . from , AN . axis . min ); AN . to = Math . min ( AN . to , AN . axis . max ); if ( AQ . from == AQ . to && AN . from == AN . to ){ continue } AQ . from = AQ . axis . p2c ( AQ . from ); AQ . to = AQ . axis . p2c ( AQ . to ); AN . from = AN . axis . p2c ( AN . from ); AN . to = AN . axis . p2c ( AN . to ); if ( AQ . from == AQ . to || AN . from == AN . to ){ Y . beginPath (); Y . strokeStyle = AK . color || g . grid . markingsColor ; Y . lineWidth = AK . lineWidth || g . grid . markingsLineWidth ; Y . moveTo ( AQ . from , AN . from ); Y . lineTo ( AQ . to , AN . to ); Y . stroke ()} else { Y . fillStyle = AK . color || g . grid . markingsColor ; Y . fillRect ( AQ . from , AN . to , AQ . to - AQ . from , AN . from - AN . to )}}} Y . lineWidth = 1 ; Y . strokeStyle = g . grid . tickColor ; Y . beginPath (); var AM , AP = s . xaxis ; for ( AO = 0 ; AO < AP . ticks . length ; ++ AO ){ AM = AP . ticks [ AO ]. v ; if ( AM <= AP . min || AM >= s . xaxis . max ){ continue } Y . moveTo ( Math . floor ( AP . p2c ( AM )) + Y . lineWidth / 2 , 0 ); Y . lineTo ( Math . floor ( AP . p2c ( AM )) + Y . lineWidth / 2 , t )} AP = s . yaxis ; for ( AO = 0 ; AO < AP . ticks . length ; ++ AO ){ AM = AP . ticks [ AO ]. v ; if ( AM <= AP . min || AM >= AP . max ){ continue } Y . moveTo ( 0 , Math . floor ( AP . p2c ( AM )) + Y . lineWidth / 2 ); Y . lineTo ( I , Math . floor ( AP . p2c ( AM )) + Y . lineWidth / 2 )} AP = s . x2axis ; for ( AO = 0 ; AO < AP . ticks . length ; ++ AO ){ AM = AP . ticks [ AO ]. v ; if ( AM <= AP . min || AM >= AP . max ){ continue } Y . moveTo ( Math . floor ( AP . p2c ( AM )) + Y . lineWidth / 2 , - 5 ); Y . lineTo ( Math . floor ( AP . p2c ( AM )) + Y . lineWidth / 2 , 5 )} AP = s . y2axis ; for ( AO = 0 ; AO < AP . ticks . length ; ++ AO ){ AM = AP . ticks [ AO ]. v ; if ( AM <= AP . min || AM >= AP . max ){ continue } Y . moveTo ( I - 5 , Math . floor ( AP . p2c ( AM )) + Y . lineWidth / 2 ); Y . lineTo ( I + 5 , Math . floor ( AP . p2c ( AM )) + Y . lineWidth / 2 )} Y . stroke (); if ( g . grid . borderWidth ){ var AR = g . grid . borderWidth ; Y . lineWidth = AR ; Y . strokeStyle = g . grid . borderColor ; Y . strokeRect ( - AR / 2 , - AR / 2 , I + AR , t + AR )} Y . restore ()} function h (){ l . find ( ".tickLabels" ). remove (); var AK = [ '<div class="tickLabels" style="font-size:smaller;color:' + g . grid . color + '">' ]; function AM ( AP , AQ ){ for ( var AO = 0 ; AO < AP . ticks . length ; ++ AO ){ var AN = AP . ticks [ AO ]; if ( ! AN . label || AN . v < AP . min || AN . v > AP . max ){ continue } AK . push ( AQ ( AN , AP ))}} var AL = g . grid . labelMargin + g . grid . borderWidth ; AM ( s . xaxis , function ( AN , AO ){ return '<div style="position:absolute;top:' + ( e . top + t + AL ) + "px;left:" + Math . round ( e . left + AO . p2c ( AN . v ) - AO . labelWidth / 2 ) + "px;width:" + AO . labelWidth + 'px;text-align:center" class="tickLabel">' + AN . label + "</div>" }); AM ( s . yaxis , function ( AN , AO ){ return '<div style="position:absolute;top:' + Math . round ( e . top + AO . p2c ( AN . v ) - AO . labelHeight / 2 ) + "px;right:" + ( e . right + I + AL ) + "px;width:" + AO . labelWidth + 'px;text-align:right" class="tickLabel">' + AN . label + "</div>" }); AM ( s . x2axis , function ( AN , AO ){ return '<div style="position:absolute;bottom:' + ( e . bottom + t + AL ) + "px;left:" + Math . round ( e . left + AO . p2c ( AN . v ) - AO . labelWidth / 2 ) + "px;width:" + AO . labelWidth + 'px;text-align:center" class="tickLabel">' + AN . label + "</div>" }); AM ( s . y2axis , function ( AN , AO ){ return '<div style="position:absolute;top:' + Math . round ( e . top + AO . p2c ( AN . v ) - AO . labelHeight / 2 ) + "px;left:" + ( e . left + I + AL ) + "px;width:" + AO . labelWidth + 'px;text-align:left" class="tickLabel">' + AN . label + "</div>" }); AK . push ( "</div>" ); l . append ( AK . join ( "" ))} function AA ( AK ){ if ( AK . lines . show ){ a ( AK )} if ( AK . bars . show ){ n ( AK )} if ( AK . points . show ){ o ( AK )}} function a ( AN ){ function AM ( AY , AZ , AR , Ad , Ac ){ var Ae = AY . points , AS = AY . pointsize , AW = null , AV = null ; Y . beginPath (); for ( var AX = AS ; AX < Ae . length ; AX += AS ){ var AU = Ae [ AX - AS ], Ab = Ae [ AX - AS + 1 ], AT = Ae [ AX ], Aa = Ae [ AX + 1 ]; if ( AU == null || AT == null ){ continue } if ( Ab <= Aa && Ab < Ac . min ){ if ( Aa < Ac . min ){ continue } AU = ( Ac . min - Ab ) / ( Aa - Ab ) * ( AT - AU ) + AU ; Ab = Ac . min } else { if ( Aa <= Ab && Aa < Ac . min ){ if ( Ab < Ac . min ){ continue } AT = ( Ac . min - Ab ) / ( Aa - Ab ) * ( AT - AU ) + AU ; Aa = Ac . min }} if ( Ab >= Aa && Ab > Ac . max ){ if ( Aa > Ac . max ){ continue } AU = ( Ac . max - Ab ) / ( Aa - Ab ) * ( AT - AU ) + AU ; Ab = Ac . max } else { if ( Aa >= Ab && Aa > Ac . max ){ if ( Ab > Ac . max ){ continue } AT = ( Ac . max - Ab ) / ( Aa - Ab ) * ( AT - AU ) + AU ; Aa = Ac . max }} if ( AU <= AT && AU < Ad . min ){ if ( AT < Ad . min ){ continue } Ab = ( Ad . min - AU ) / ( AT - AU ) * ( Aa - Ab ) + Ab ; AU = Ad . min } else { if ( AT <= AU && AT < Ad . min ){ if ( AU < Ad . min ){ continue } Aa = ( Ad . min - AU ) / ( AT - AU ) * ( Aa - Ab ) + Ab ; AT = Ad . min }} if ( AU >= AT && AU > Ad . max ){ if ( AT > Ad . max ){ continue } Ab = ( Ad . max - AU ) / ( AT - AU ) * ( Aa - Ab ) + Ab ; AU = Ad . max } else { if ( AT >= AU && AT > Ad . max ){ if ( AU > Ad . max ){ continue } Aa = ( Ad . max - AU ) / ( AT - AU ) * ( Aa - Ab ) + Ab ; AT = Ad . max }} if ( AU != AW || Ab != AV ){ Y . moveTo ( Ad . p2c ( AU ) + AZ , Ac . p2c ( Ab ) + AR )} AW = AT ; AV = Aa ; Y . lineTo ( Ad . p2c ( AT ) + AZ , Ac . p2c ( Aa ) + AR )} Y . stroke ()} function AO ( AX , Ae , Ac ){ var Af = AX . points , AR = AX . pointsize , AS = Math . min ( Math . max ( 0 , Ac . min ), Ac . max ), Aa , AV = 0 , Ad = false ; for ( var AW = AR ; AW < Af . length ; AW += AR ){ var AU = Af [ AW - AR ], Ab = Af [ AW - AR + 1 ], AT = Af [ AW ], AZ = Af [ AW + 1 ]; if ( Ad && AU != null && AT == null ){ Y . lineTo ( Ae . p2c ( AV ), Ac . p2c ( AS )); Y . fill (); Ad = false ; continue } if ( AU == null || AT == null ){ continue } if ( AU <= AT && AU < Ae . min ){ if ( AT < Ae . min ){ continue } Ab = ( Ae . min - AU ) / ( AT - AU ) * ( AZ - Ab ) + Ab ; AU = Ae . min } else { if ( AT <= AU && AT < Ae . min ){ if ( AU < Ae . min ){ continue } AZ = ( Ae . min - AU ) / ( AT - AU ) * ( AZ - Ab ) + Ab ; AT = Ae . min }} if ( AU >= AT && AU > Ae . max ){ if ( AT > Ae . max ){ continue } Ab = ( Ae . max - AU ) / ( AT - AU ) * ( AZ - Ab ) + Ab ; AU = Ae . max } else { if ( AT >= AU && AT > Ae . max ){ if ( AU > Ae . max ){ continue } AZ = ( Ae . max - AU ) / ( AT - AU ) * ( AZ - Ab ) + Ab ; AT = Ae . max }} if ( ! Ad ){ Y . beginPath (); Y . moveTo ( Ae . p2c ( AU ), Ac . p2c ( AS )); Ad = true } if ( Ab >= Ac . max && AZ >= Ac . max ){ Y . lineTo ( Ae . p2c ( AU ), Ac . p2c ( Ac . max )); Y . lineTo ( Ae . p2c ( AT ), Ac . p2c ( Ac . max )); AV = AT ; continue } else { if ( Ab <= Ac . min && AZ <= Ac . min ){ Y . lineTo ( Ae . p2c ( AU ), Ac . p2c ( Ac . min )); Y . lineTo ( Ae . p2c ( AT ), Ac . p2c ( Ac . min )); AV = AT ; continue }} var Ag = AU , AY = AT ; if ( Ab <= AZ && Ab < Ac . min && AZ >= Ac . min ){ AU = ( Ac . min - Ab ) / ( AZ - Ab ) * ( AT - AU ) + AU ; Ab = Ac . min } else { if ( AZ <= Ab && AZ < Ac . min && Ab >= Ac . min ){ AT = ( Ac . min - Ab ) / ( AZ - Ab ) * ( AT - AU ) + AU ; AZ = Ac . min }} if ( Ab >= AZ && Ab > Ac . max && AZ <= Ac . max ){ AU = ( Ac . max - Ab ) / ( AZ - Ab ) * ( AT - AU ) + AU ; Ab = Ac . max } else { if ( AZ >= Ab && AZ > Ac . max && Ab <= Ac . max ){ AT = ( Ac . max - Ab ) / ( AZ - Ab ) * ( AT - AU ) + AU ; AZ = Ac . max }} if ( AU != Ag ){ if ( Ab <= Ac . min ){ Aa = Ac . min } else { Aa = Ac . max } Y . lineTo ( Ae . p2c ( Ag ), Ac . p2c ( Aa )); Y . lineTo ( Ae . p2c ( AU ), Ac . p2c ( Aa ))} Y . lineTo ( Ae . p2c ( AU ), Ac . p2c ( Ab )); Y . lineTo ( Ae . p2c ( AT ), Ac . p2c ( AZ )); if ( AT != AY ){ if ( AZ <= Ac . min ){ Aa = Ac . min } else { Aa = Ac . max } Y . lineTo ( Ae . p2c ( AT ), Ac . p2c ( Aa )); Y . lineTo ( Ae . p2c ( AY ), Ac . p2c ( Aa ))} AV = Math . max ( AT , AY )} if ( Ad ){ Y . lineTo ( Ae . p2c ( AV ), Ac . p2c ( AS )); Y . fill ()}} Y . save (); Y . translate ( e . left , e . top ); Y . lineJoin = "round" ; var AP = AN . lines . lineWidth , AK = AN . shadowSize ; if ( AP > 0 && AK > 0 ){ Y . lineWidth = AK ; Y . strokeStyle = "rgba(0,0,0,0.1)" ; var AQ = Math . PI / 18 ; AM ( AN . datapoints , Math . sin ( AQ ) * ( AP / 2 + AK / 2 ), Math . cos ( AQ ) * ( AP / 2 + AK / 2 ), AN . xaxis , AN . yaxis ); Y . lineWidth = AK / 2 ; AM ( AN . datapoints , Math . sin ( AQ ) * ( AP / 2 + AK / 4 ), Math . cos ( AQ ) * ( AP / 2 + AK / 4 ), AN . xaxis , AN . yaxis )} Y . lineWidth = AP ; Y . strokeStyle = AN . color ; var AL = V ( AN . lines , AN . color , 0 , t ); if ( AL ){ Y . fillStyle = AL ; AO ( AN . datapoints , AN . xaxis , AN . yaxis )} if ( AP > 0 ){ AM ( AN . datapoints , 0 , 0 , AN . xaxis , AN . yaxis )} Y . restore ()} function o ( AN ){ function AP ( AU , AT , Ab , AR , AV , AZ , AY ){ var Aa = AU . points , AQ = AU . pointsize ; for ( var AS = 0 ; AS < Aa . length ; AS += AQ ){ var AX = Aa [ AS ], AW = Aa [ AS + 1 ]; if ( AX == null || AX < AZ . min || AX > AZ . max || AW < AY . min || AW > AY . max ){ continue } Y . beginPath (); Y . arc ( AZ . p2c ( AX ), AY . p2c ( AW ) + AR , AT , 0 , AV , false ); if ( Ab ){ Y . fillStyle = Ab ; Y . fill ()} Y . stroke ()}} Y . save (); Y . translate ( e . left , e . top ); var AO = AN . lines . lineWidth , AL = AN . shadowSize , AK = AN . points . radius ; if ( AO > 0 && AL > 0 ){ var AM = AL / 2 ; Y . lineWidth = AM ; Y . strokeStyle = "rgba(0,0,0,0.1)" ; AP ( AN . datapoints , AK , null , AM + AM / 2 , Math . PI , AN . xaxis , AN . yaxis ); Y . strokeStyle = "rgba(0,0,0,0.2)" ; AP ( AN . datapoints , AK , null , AM / 2 , Math . PI , AN . xaxis , AN . yaxis )} Y . lineWidth = AO ; Y . strokeStyle = AN . color ; AP ( AN . datapoints , AK , V ( AN . points , AN . color ), 0 , 2 * Math . PI , AN . xaxis , AN . yaxis ); Y . restore ()} function AB ( AV , AU , Ad , AQ , AY , AN , AL , AT , AS , Ac , AZ ){ var AM , Ab , AR , AX , AO , AK , AW , AP , Aa ; if ( AZ ){ AP = AK = AW = true ; AO = false ; AM = Ad ; Ab = AV ; AX = AU + AQ ; AR = AU + AY ; if ( Ab < AM ){ Aa = Ab ; Ab = AM ; AM = Aa ; AO = true ; AK = false }} else { AO = AK = AW = true ; AP = false ; AM = AV + AQ ; Ab = AV + AY ; AR = Ad ; AX = AU ; if ( AX < AR ){ Aa = AX ; AX = AR ; AR = Aa ; AP = true ; AW = false }} if ( Ab < AT . min || AM > AT . max || AX < AS . min || AR > AS . max ){ return } if ( AM < AT . min ){ AM = AT . min ; AO = false } if ( Ab > AT . max ){ Ab = AT . max ; AK = false } if ( AR < AS . min ){ AR = AS . min ; AP = false } if ( AX > AS . max ){ AX = AS . max ; AW = false } AM = AT . p2c ( AM ); AR = AS . p2c ( AR ); Ab = AT . p2c ( Ab ); AX = AS . p2c ( AX ); if ( AL ){ Ac . beginPath (); Ac . moveTo ( AM , AR ); Ac . lineTo ( AM , AX ); Ac . lineTo ( Ab , AX ); Ac . lineTo ( Ab , AR ); Ac . fillStyle = AL ( AR , AX ); Ac . fill ()} if ( AO || AK || AW || AP ){ Ac . beginPath (); Ac . moveTo ( AM , AR + AN ); if ( AO ){ Ac . lineTo ( AM , AX + AN )} else { Ac . moveTo ( AM , AX + AN )} if ( AW ){ Ac . lineTo ( Ab , AX + AN )} else { Ac . moveTo ( Ab , AX + AN )} if ( AK ){ Ac . lineTo ( Ab , AR + AN )} else { Ac . moveTo ( Ab , AR + AN )} if ( AP ){ Ac . lineTo ( AM , AR + AN )} else { Ac . moveTo ( AM , AR + AN )} Ac . stroke ()}} function n ( AM ){ function AL ( AS , AR , AU , AP , AT , AW , AV ){ var AX = AS . points , AO = AS . pointsize ; for ( var AQ = 0 ; AQ < AX . length ; AQ += AO ){ if ( AX [ AQ ] == null ){ continue } AB ( AX [ AQ ], AX [ AQ + 1 ], AX [ AQ + 2 ], AR , AU , AP , AT , AW , AV , Y , AM . bars . horizontal )}} Y . save (); Y . translate ( e . left , e . top ); Y . lineWidth = AM . bars . lineWidth ; Y . strokeStyle = AM . color ; var AK = AM . bars . align == "left" ? 0 :- AM . bars . barWidth / 2 ; var AN = AM . bars . fill ? function ( AO , AP ){ return V ( AM . bars , AM . color , AO , AP )} : null ; AL ( AM . datapoints , AK , AK + AM . bars . barWidth , 0 , AN , AM . xaxis , AM . yaxis ); Y . restore ()} function V ( AM , AK , AL , AO ){ var AN = AM . fill ; if ( ! AN ){ return null } if ( AM . fillColor ){ return R ( AM . fillColor , AL , AO , AK )} var AP = C . color . parse ( AK ); AP . a = typeof AN == "number" ? AN : 0.4 ; AP . normalize (); return AP . toString ()} function AI (){ l . find ( ".legend" ). remove (); if ( ! g . legend . show ){ return } var AP = [], AN = false , AV = g . legend . labelFormatter , AU , AR ; for ( i = 0 ; i < O . length ; ++ i ){ AU = O [ i ]; AR = AU . label ; if ( ! AR ){ continue } if ( i % g . legend . noColumns == 0 ){ if ( AN ){ AP . push ( "</tr>" )} AP . push ( "<tr>" ); AN = true } if ( AV ){ AR = AV ( AR , AU )} AP . push ( '<td class="legendColorBox"><div style="border:1px solid ' + g . legend . labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + AU . color + ';overflow:hidden"></div></div></td><td class="legendLabel">' + AR + "</td>" )} if ( AN ){ AP . push ( "</tr>" )} if ( AP . length == 0 ){ return } var AT = '<table style="font-size:smaller;color:' + g . grid . color + '">' + AP . join ( "" ) + "</table>" ; if ( g . legend . container != null ){ C ( g . legend . container ). html ( AT )} else { var AQ = "" , AL = g . legend . position , AM = g . legend . margin ; if ( AM [ 0 ] == null ){ AM = [ AM , AM ]} if ( AL . charAt ( 0 ) == "n" ){ AQ += "top:" + ( AM [ 1 ] + e . top ) + "px;" } else { if ( AL . charAt ( 0 ) == "s" ){ AQ += "bottom:" + ( AM [ 1 ] + e . bottom ) + "px;" }} if ( AL . charAt ( 1 ) == "e" ){ AQ += "right:" + ( AM [ 0 ] + e . right ) + "px;" } else { if ( AL . charAt ( 1 ) == "w" ){ AQ += "left:" + ( AM [ 0 ] + e . left ) + "px;" }} var AS = C ( '<div class="legend">' + AT . replace ( 'style="' , 'style="position:absolute;' + AQ + ";" ) + "</div>" ). appendTo ( l ); if ( g . legend . backgroundOpacity != 0 ){ var AO = g . legend . backgroundColor ; if ( AO == null ){ AO = g . grid . backgroundColor ; if ( AO && typeof AO == "string" ){ AO = C . color . parse ( AO )} else { AO = C . color . extract ( AS , "background-color" )} AO . a = 1 ; AO = AO . toString ()} var AK = AS . children (); C ( '<div style="position:absolute;width:' + AK . width () + "px;height:" + AK . height () + "px;" + AQ + "background-color:" + AO + ';"> </div>' ). prependTo ( AS ). css ( "opacity" , g . legend . backgroundOpacity )}}} var w = [], J = null ; function AF ( AR , AP , AM ){ var AX = g . grid . mouseActiveRadius , Aj = AX * AX + 1 , Ah = null , Aa = false , Af , Ad ; for ( Af = 0 ; Af < O . length ; ++ Af ){ if ( ! AM ( O [ Af ])){ continue } var AY = O [ Af ], AQ = AY . xaxis , AO = AY . yaxis , Ae = AY . datapoints . points , Ac = AY . datapoints . pointsize , AZ = AQ . c2p ( AR ), AW = AO . c2p ( AP ), AL = AX / AQ . scale , AK = AX / AO . scale ; if ( AY . lines . show || AY . points . show ){ for ( Ad = 0 ; Ad < Ae . length ; Ad += Ac ){ var AT = Ae [ Ad ], AS = Ae [ Ad + 1 ]; if ( AT == null ){ continue } if ( AT - AZ > AL || AT - AZ <- AL || AS - AW > AK || AS - AW <- AK ){ continue } var AV = Math . abs ( AQ . p2c ( AT ) - AR ), AU = Math . abs ( AO . p2c ( AS ) - AP ), Ab = AV * AV + AU * AU ; if ( Ab <= Aj ){ Aj = Ab ; Ah = [ Af , Ad / Ac ]}}} if ( AY . bars . show &&! Ah ){ var AN = AY . bars . align == "left" ? 0 :- AY . bars . barWidth / 2 , Ag = AN + AY . bars . barWidth ; for ( Ad = 0 ; Ad < Ae . length ; Ad += Ac ){ var AT = Ae [ Ad ], AS = Ae [ Ad + 1 ], Ai = Ae [ Ad + 2 ]; if ( AT == null ){ continue } if ( O [ Af ]. bars . horizontal ? ( AZ <= Math . max ( Ai , AT ) && AZ >= Math . min ( Ai , AT ) && AW >= AS + AN && AW <= AS + Ag ) : ( AZ >= AT + AN && AZ <= AT + Ag && AW >= Math . min ( Ai , AS ) && AW <= Math . max ( Ai , AS ))){ Ah = [ Af , Ad / Ac ]}}}} if ( Ah ){ Af = Ah [ 0 ]; Ad = Ah [ 1 ]; Ac = O [ Af ]. datapoints . pointsize ; return { datapoint : O [ Af ]. datapoints . points . slice ( Ad * Ac ,( Ad + 1 ) * Ac ), dataIndex : Ad , series : O [ Af ], seriesIndex : Af }} return null } function D ( AK ){ if ( g . grid . hoverable ){ H ( "plothover" , AK , function ( AL ){ return AL . hoverable != false })}} function d ( AK ){ H ( "plotclick" , AK , function ( AL ){ return AL . clickable != false })} function H ( AL , AK , AM ){ var AN = AD . offset (), AS = { pageX : AK . pageX , pageY : AK . pageY }, AQ = AK . pageX - AN . left - e . left , AO = AK . pageY - AN . top - e . top ; if ( s . xaxis . used ){ AS . x = s . xaxis . c2p ( AQ )} if ( s . yaxis . used ){ AS . y = s . yaxis . c2p ( AO )} if ( s . x2axis . used ){ AS . x2 = s . x2axis . c2p ( AQ )} if ( s . y2axis . used ){ AS . y2 = s . y2axis . c2p ( AO )} var AT = AF ( AQ , AO , AM ); if ( AT ){ AT . pageX = parseInt ( AT . series . xaxis . p2c ( AT . datapoint [ 0 ]) + AN . left + e . left ); AT . pageY = parseInt ( AT . series . yaxis . p2c ( AT . datapoint [ 1 ]) + AN . top + e . top )} if ( g . grid . autoHighlight ){ for ( var AP = 0 ; AP < w . length ; ++ AP ){ var AR = w [ AP ]; if ( AR . auto == AL &&! ( AT && AR . series == AT . series && AR . point == AT . datapoint )){ x ( AR . series , AR . point )}} if ( AT ){ AE ( AT . series , AT . datapoint , AL )}} l . trigger ( AL ,[ AS , AT ])} function q (){ if ( ! J ){ J = setTimeout ( v , 30 )}} function v (){ J = null ; AJ . save (); AJ . clearRect ( 0 , 0 , y , Q ); AJ . translate ( e . left , e . top ); var AL , AK ; for ( AL = 0 ; AL < w . length ; ++ AL ){ AK = w [ AL ]; if ( AK . series . bars . show ){ z ( AK . series , AK . point )} else { u ( AK . series , AK . point )}} AJ . restore (); Z ( L . drawOverlay ,[ AJ ])} function AE ( AM , AK , AN ){ if ( typeof AM == "number" ){ AM = O [ AM ]} if ( typeof AK == "number" ){ AK = AM . data [ AK ]} var AL = j ( AM , AK ); if ( AL ==- 1 ){ w . push ({ series : AM , point : AK , auto : AN }); q ()} else { if ( ! AN ){ w [ AL ]. auto = false }}} function x ( AM , AK ){ if ( AM == null && AK == null ){ w = []; q ()} if ( typeof AM == "number" ){ AM = O [ AM ]} if ( typeof AK == "number" ){ AK = AM . data [ AK ]} var AL = j ( AM , AK ); if ( AL !=- 1 ){ w . splice ( AL , 1 ); q ()}} function j ( AM , AN ){ for ( var AK = 0 ; AK < w . length ; ++ AK ){ var AL = w [ AK ]; if ( AL . series == AM && AL . point [ 0 ] == AN [ 0 ] && AL . point [ 1 ] == AN [ 1 ]){ return AK }} return - 1 } function u ( AN , AM ){ var AL = AM [ 0 ], AR = AM [ 1 ], AQ = AN . xaxis , AP = AN . yaxis ; if ( AL < AQ . min || AL > AQ . max || AR < AP . min || AR > AP . max ){ return } var AO = AN . points . radius + AN . points . lineWidth / 2 ; AJ . lineWidth = AO ; AJ . strokeStyle = C . color . parse ( AN . color ). scale ( "a" , 0.5 ). toString (); var AK = 1.5 * AO ; AJ . beginPath (); AJ . arc ( AQ . p2c ( AL ), AP . p2c ( AR ), AK , 0 , 2 * Math . PI , false ); AJ . stroke ()} function z ( AN , AK ){ AJ . lineWidth = AN . bars . lineWidth ; AJ . strokeStyle = C . color . parse ( AN . color ). scale ( "a" , 0.5 ). toString (); var AM = C . color . parse ( AN . color ). scale ( "a" , 0.5 ). toString (); var AL = AN . bars . align == "left" ? 0 :- AN . bars . barWidth / 2 ; AB ( AK [ 0 ], AK [ 1 ], AK [ 2 ] || 0 , AL , AL + AN . bars . barWidth , 0 , function (){ return AM }, AN . xaxis , AN . yaxis , AJ , AN . bars . horizontal )} function R ( AM , AL , AQ , AO ){ if ( typeof AM == "string" ){ return AM } else { var AP = Y . createLinearGradient ( 0 , AQ , 0 , AL ); for ( var AN = 0 , AK = AM . colors . length ; AN < AK ; ++ AN ){ var AR = AM . colors [ AN ]; if ( typeof AR != "string" ){ AR = C . color . parse ( AO ). scale ( "rgb" , AR . brightness ); AR . a *= AR . opacity ; AR = AR . toString ()} AP . addColorStop ( AN / ( AK - 1 ), AR )} return AP }}} C . plot = function ( G , E , D ){ var F = new B ( C ( G ), E , D , C . plot . plugins ); return F }; C . plot . plugins = []; C . plot . formatDate = function ( H , E , G ){ var L = function ( N ){ N = "" + N ; return N . length == 1 ? "0" + N : N }; var D = []; var M = false ; var K = H . getUTCHours (); var I = K < 12 ; if ( G == null ){ G = [ "Jan" , "Feb" , "Mar" , "Apr" , "May" , "Jun" , "Jul" , "Aug" , "Sep" , "Oct" , "Nov" , "Dec" ]} if ( E . search ( /%p|%P/ ) !=- 1 ){ if ( K > 12 ){ K = K - 12 } else { if ( K == 0 ){ K = 12 }}} for ( var F = 0 ; F < E . length ; ++ F ){ var J = E . charAt ( F ); if ( M ){ switch ( J ){ case "h" : J = "" + K ; break ; case "H" : J = L ( K ); break ; case "M" : J = L ( H . getUTCMinutes ()); break ; case "S" : J = L ( H . getUTCSeconds ()); break ; case "d" : J = "" + H . getUTCDate (); break ; case "m" : J = "" + ( H . getUTCMonth () + 1 ); break ; case "y" : J = "" + H . getUTCFullYear (); break ; case "b" : J = "" + G [ H . getUTCMonth ()]; break ; case "p" : J = ( I ) ? ( "am" ) : ( "pm" ); break ; case "P" : J = ( I ) ? ( "AM" ) : ( "PM" ); break } D . push ( J ); M = false } else { if ( J == "%" ){ M = true } else { D . push ( J )}}} return D . join ( "" )}; function A ( E , D ){ return D * Math . floor ( E / D )}})( jQuery );