http://git-wip-us.apache.org/repos/asf/airavata-php-gateway/blob/7d786c83/public/js/flot/jquery.flot.pie.js
----------------------------------------------------------------------
diff --git a/public/js/flot/jquery.flot.pie.js 
b/public/js/flot/jquery.flot.pie.js
new file mode 100644
index 0000000..b46c03c
--- /dev/null
+++ b/public/js/flot/jquery.flot.pie.js
@@ -0,0 +1,750 @@
+/*
+Flot plugin for rendering pie charts. The plugin assumes the data is 
+coming is as a single data value for each series, and each of those 
+values is a positive value or zero (negative numbers don't make 
+any sense and will cause strange effects). The data values do 
+NOT need to be passed in as percentage values because it 
+internally calculates the total and percentages.
+
+* Created by Brian Medendorp, June 2009
+* Updated November 2009 with contributions from: btburnett3, Anthony Aragues 
and Xavi Ivars
+
+* Changes:
+       2009-10-22: lineJoin set to round
+       2009-10-23: IE full circle fix, donut
+       2009-11-11: Added basic hover from btburnett3 - does not work in IE, 
and center is off in Chrome and Opera
+       2009-11-17: Added IE hover capability submitted by Anthony Aragues
+       2009-11-18: Added bug fix submitted by Xavi Ivars (issues with arrays 
when other JS libraries are included as well)
+               
+
+Available options are:
+series: {
+       pie: {
+               show: true/false
+               radius: 0-1 for percentage of fullsize, or a specified pixel 
length, or 'auto'
+               innerRadius: 0-1 for percentage of fullsize or a specified 
pixel length, for creating a donut effect
+               startAngle: 0-2 factor of PI used for starting angle (in 
radians) i.e 3/2 starts at the top, 0 and 2 have the same result
+               tilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, 
and 0 is completely flat (nothing will show)
+               offset: {
+                       top: integer value to move the pie up or down
+                       left: integer value to move the pie left or right, or 
'auto'
+               },
+               stroke: {
+                       color: any hexidecimal color value (other formats may 
or may not work, so best to stick with something like '#FFF')
+                       width: integer pixel width of the stroke
+               },
+               label: {
+                       show: true/false, or 'auto'
+                       formatter:  a user-defined function that modifies the 
text/style of the label text
+                       radius: 0-1 for percentage of fullsize, or a specified 
pixel length
+                       background: {
+                               color: any hexidecimal color value (other 
formats may or may not work, so best to stick with something like '#000')
+                               opacity: 0-1
+                       },
+                       threshold: 0-1 for the percentage value at which to 
hide labels (if they're too small)
+               },
+               combine: {
+                       threshold: 0-1 for the percentage value at which to 
combine slices (if they're too small)
+                       color: any hexidecimal color value (other formats may 
or may not work, so best to stick with something like '#CCC'), if null, the 
plugin will automatically use the color of the first slice to be combined
+                       label: any text value of what the combined slice should 
be labeled
+               }
+               highlight: {
+                       opacity: 0-1
+               }
+       }
+}
+
+More detail and specific examples can be found in the included HTML file.
+
+*/
+
+(function ($) 
+{
+       function init(plot) // this is the "body" of the plugin
+       {
+               var canvas = null;
+               var target = null;
+               var maxRadius = null;
+               var centerLeft = null;
+               var centerTop = null;
+               var total = 0;
+               var redraw = true;
+               var redrawAttempts = 10;
+               var shrink = 0.95;
+               var legendWidth = 0;
+               var processed = false;
+               var raw = false;
+               
+               // interactive variables        
+               var highlights = [];    
+       
+               // add hook to determine if pie plugin in enabled, and then 
perform necessary operations
+               plot.hooks.processOptions.push(checkPieEnabled);
+               plot.hooks.bindEvents.push(bindEvents); 
+
+               // check to see if the pie plugin is enabled
+               function checkPieEnabled(plot, options)
+               {
+                       if (options.series.pie.show)
+                       {
+                               //disable grid
+                               options.grid.show = false;
+                               
+                               // set labels.show
+                               if (options.series.pie.label.show=='auto')
+                                       if (options.legend.show)
+                                               options.series.pie.label.show = 
false;
+                                       else
+                                               options.series.pie.label.show = 
true;
+                               
+                               // set radius
+                               if (options.series.pie.radius=='auto')
+                                       if (options.series.pie.label.show)
+                                               options.series.pie.radius = 3/4;
+                                       else
+                                               options.series.pie.radius = 1;
+                                               
+                               // ensure sane tilt
+                               if (options.series.pie.tilt>1)
+                                       options.series.pie.tilt=1;
+                               if (options.series.pie.tilt<0)
+                                       options.series.pie.tilt=0;
+                       
+                               // add processData hook to do transformations 
on the data
+                               
plot.hooks.processDatapoints.push(processDatapoints);
+                               plot.hooks.drawOverlay.push(drawOverlay);       
+                               
+                               // add draw hook
+                               plot.hooks.draw.push(draw);
+                       }
+               }
+       
+               // bind hoverable events
+               function bindEvents(plot, eventHolder)          
+               {               
+                       var options = plot.getOptions();
+                       
+                       if (options.series.pie.show && options.grid.hoverable)
+                               
eventHolder.unbind('mousemove').mousemove(onMouseMove);
+                               
+                       if (options.series.pie.show && options.grid.clickable)
+                               eventHolder.unbind('click').click(onClick);
+               }       
+               
+
+               // debugging function that prints out an object
+               function alertObject(obj)
+               {
+                       var msg = '';
+                       function traverse(obj, depth)
+                       {
+                               if (!depth)
+                                       depth = 0;
+                               for (var i = 0; i < obj.length; ++i)
+                               {
+                                       for (var j=0; j<depth; j++)
+                                               msg += '\t';
+                               
+                                       if( typeof obj[i] == "object")
+                                       {       // its an object
+                                               msg += ''+i+':\n';
+                                               traverse(obj[i], depth+1);
+                                       }
+                                       else
+                                       {       // its a value
+                                               msg += ''+i+': '+obj[i]+'\n';
+                                       }
+                               }
+                       }
+                       traverse(obj);
+                       alert(msg);
+               }
+               
+               function calcTotal(data)
+               {
+                       for (var i = 0; i < data.length; ++i)
+                       {
+                               var item = parseFloat(data[i].data[0][1]);
+                               if (item)
+                                       total += item;
+                       }
+               }       
+               
+               function processDatapoints(plot, series, data, datapoints) 
+               {       
+                       if (!processed)
+                       {
+                               processed = true;
+                       
+                               canvas = plot.getCanvas();
+                               target = $(canvas).parent();
+                               options = plot.getOptions();
+                       
+                               plot.setData(combine(plot.getData()));
+                       }
+               }
+               
+               function setupPie()
+               {
+                       legendWidth = 
target.children().filter('.legend').children().width();
+               
+                       // calculate maximum radius and center point
+                       maxRadius =  
Math.min(canvas.width,(canvas.height/options.series.pie.tilt))/2;
+                       centerTop = 
(canvas.height/2)+options.series.pie.offset.top;
+                       centerLeft = (canvas.width/2);
+                       
+                       if (options.series.pie.offset.left=='auto')
+                               if (options.legend.position.match('w'))
+                                       centerLeft += legendWidth/2;
+                               else
+                                       centerLeft -= legendWidth/2;
+                       else
+                               centerLeft += options.series.pie.offset.left;
+                                       
+                       if (centerLeft<maxRadius)
+                               centerLeft = maxRadius;
+                       else if (centerLeft>canvas.width-maxRadius)
+                               centerLeft = canvas.width-maxRadius;
+               }
+               
+               function fixData(data)
+               {
+                       for (var i = 0; i < data.length; ++i)
+                       {
+                               if (typeof(data[i].data)=='number')
+                                       data[i].data = [[1,data[i].data]];
+                               else if (typeof(data[i].data)=='undefined' || 
typeof(data[i].data[0])=='undefined')
+                               {
+                                       if (typeof(data[i].data)!='undefined' 
&& typeof(data[i].data.label)!='undefined')
+                                               data[i].label = 
data[i].data.label; // fix weirdness coming from flot
+                                       data[i].data = [[1,0]];
+                                       
+                               }
+                       }
+                       return data;
+               }
+               
+               function combine(data)
+               {
+                       data = fixData(data);
+                       calcTotal(data);
+                       var combined = 0;
+                       var numCombined = 0;
+                       var color = options.series.pie.combine.color;
+                       
+                       var newdata = [];
+                       for (var i = 0; i < data.length; ++i)
+                       {
+                               // make sure its a number
+                               data[i].data[0][1] = 
parseFloat(data[i].data[0][1]);
+                               if (!data[i].data[0][1])
+                                       data[i].data[0][1] = 0;
+                                       
+                               if 
(data[i].data[0][1]/total<=options.series.pie.combine.threshold)
+                               {
+                                       combined += data[i].data[0][1];
+                                       numCombined++;
+                                       if (!color)
+                                               color = data[i].color;
+                               }                               
+                               else
+                               {
+                                       newdata.push({
+                                               data: [[1,data[i].data[0][1]]], 
+                                               color: data[i].color, 
+                                               label: data[i].label,
+                                               angle: 
(data[i].data[0][1]*(Math.PI*2))/total,
+                                               percent: 
(data[i].data[0][1]/total*100)
+                                       });
+                               }
+                       }
+                       if (numCombined>0)
+                               newdata.push({
+                                       data: [[1,combined]], 
+                                       color: color, 
+                                       label: options.series.pie.combine.label,
+                                       angle: (combined*(Math.PI*2))/total,
+                                       percent: (combined/total*100)
+                               });
+                       return newdata;
+               }               
+               
+               function draw(plot, newCtx)
+               {
+                       if (!target) return; // if no series were passed
+                       ctx = newCtx;
+               
+                       setupPie();
+                       var slices = plot.getData();
+               
+                       var attempts = 0;
+                       while (redraw && attempts<redrawAttempts)
+                       {
+                               redraw = false;
+                               if (attempts>0)
+                                       maxRadius *= shrink;
+                               attempts += 1;
+                               clear();
+                               if (options.series.pie.tilt<=0.8)
+                                       drawShadow();
+                               drawPie();
+                       }
+                       if (attempts >= redrawAttempts) {
+                               clear();
+                               target.prepend('<div class="error">Could not 
draw pie with labels contained inside canvas</div>');
+                       }
+                       
+                       if ( plot.setSeries && plot.insertLegend )
+                       {
+                               plot.setSeries(slices);
+                               plot.insertLegend();
+                       }
+                       
+                       // we're actually done at this point, just defining 
internal functions at this point
+                       
+                       function clear()
+                       {
+                               ctx.clearRect(0,0,canvas.width,canvas.height);
+                               target.children().filter('.pieLabel, 
.pieLabelBackground').remove();
+                       }
+                       
+                       function drawShadow()
+                       {
+                               var shadowLeft = 5;
+                               var shadowTop = 15;
+                               var edge = 10;
+                               var alpha = 0.02;
+                       
+                               // set radius
+                               if (options.series.pie.radius>1)
+                                       var radius = options.series.pie.radius;
+                               else
+                                       var radius = maxRadius * 
options.series.pie.radius;
+                                       
+                               if (radius>=(canvas.width/2)-shadowLeft || 
radius*options.series.pie.tilt>=(canvas.height/2)-shadowTop || radius<=edge)
+                                       return; // shadow would be outside 
canvas, so don't draw it
+                       
+                               ctx.save();
+                               ctx.translate(shadowLeft,shadowTop);
+                               ctx.globalAlpha = alpha;
+                               ctx.fillStyle = '#000';
+
+                               // center and rotate to starting position
+                               ctx.translate(centerLeft,centerTop);
+                               ctx.scale(1, options.series.pie.tilt);
+                               
+                               //radius -= edge;
+                               for (var i=1; i<=edge; i++)
+                               {
+                                       ctx.beginPath();
+                                       ctx.arc(0,0,radius,0,Math.PI*2,false);
+                                       ctx.fill();
+                                       radius -= i;
+                               }       
+                               
+                               ctx.restore();
+                       }
+                       
+                       function drawPie()
+                       {
+                               startAngle = 
Math.PI*options.series.pie.startAngle;
+                               
+                               // set radius
+                               if (options.series.pie.radius>1)
+                                       var radius = options.series.pie.radius;
+                               else
+                                       var radius = maxRadius * 
options.series.pie.radius;
+                               
+                               // center and rotate to starting position
+                               ctx.save();
+                               ctx.translate(centerLeft,centerTop);
+                               ctx.scale(1, options.series.pie.tilt);
+                               //ctx.rotate(startAngle); // start at top; -- 
This doesn't work properly in Opera
+                               
+                               // draw slices
+                               ctx.save();
+                               var currentAngle = startAngle;
+                               for (var i = 0; i < slices.length; ++i)
+                               {
+                                       slices[i].startAngle = currentAngle;
+                                       drawSlice(slices[i].angle, 
slices[i].color, true);
+                               }
+                               ctx.restore();
+                               
+                               // draw slice outlines
+                               ctx.save();
+                               ctx.lineWidth = options.series.pie.stroke.width;
+                               currentAngle = startAngle;
+                               for (var i = 0; i < slices.length; ++i)
+                                       drawSlice(slices[i].angle, 
options.series.pie.stroke.color, false);
+                               ctx.restore();
+                                       
+                               // draw donut hole
+                               drawDonutHole(ctx);
+                               
+                               // draw labels
+                               if (options.series.pie.label.show)
+                                       drawLabels();
+                               
+                               // restore to original state
+                               ctx.restore();
+                               
+                               function drawSlice(angle, color, fill)
+                               {       
+                                       if (angle<=0)
+                                               return;
+                               
+                                       if (fill)
+                                               ctx.fillStyle = color;
+                                       else
+                                       {
+                                               ctx.strokeStyle = color;
+                                               ctx.lineJoin = 'round';
+                                       }
+                                               
+                                       ctx.beginPath();
+                                       if (Math.abs(angle - Math.PI*2) > 
0.000000001)
+                                               ctx.moveTo(0,0); // Center of 
the pie
+                                       else if ($.browser.msie)
+                                               angle -= 0.0001;
+                                       //ctx.arc(0,0,radius,0,angle,false); // 
This doesn't work properly in Opera
+                                       
ctx.arc(0,0,radius,currentAngle,currentAngle+angle,false);
+                                       ctx.closePath();
+                                       //ctx.rotate(angle); // This doesn't 
work properly in Opera
+                                       currentAngle += angle;
+                                       
+                                       if (fill)
+                                               ctx.fill();
+                                       else
+                                               ctx.stroke();
+                               }
+                               
+                               function drawLabels()
+                               {
+                                       var currentAngle = startAngle;
+                                       
+                                       // set radius
+                                       if (options.series.pie.label.radius>1)
+                                               var radius = 
options.series.pie.label.radius;
+                                       else
+                                               var radius = maxRadius * 
options.series.pie.label.radius;
+                                       
+                                       for (var i = 0; i < slices.length; ++i)
+                                       {
+                                               if (slices[i].percent >= 
options.series.pie.label.threshold*100)
+                                                       drawLabel(slices[i], 
currentAngle, i);
+                                               currentAngle += slices[i].angle;
+                                       }
+                                       
+                                       function drawLabel(slice, startAngle, 
index)
+                                       {
+                                               if (slice.data[0][1]==0)
+                                                       return;
+                                                       
+                                               // format label text
+                                               var lf = 
options.legend.labelFormatter, text, plf = options.series.pie.label.formatter;
+                                               if (lf)
+                                                       text = lf(slice.label, 
slice);
+                                               else
+                                                       text = slice.label;
+                                               if (plf)
+                                                       text = plf(text, slice);
+                                                       
+                                               var halfAngle = 
((startAngle+slice.angle) + startAngle)/2;
+                                               var x = centerLeft + 
Math.round(Math.cos(halfAngle) * radius);
+                                               var y = centerTop + 
Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt;
+                                               
+                                               var html = '<span 
class="pieLabel" id="pieLabel'+index+'" style="position:absolute;top:' + y + 
'px;left:' + x + 'px;">' + text + "</span>";
+                                               target.append(html);
+                                               var label = 
target.children('#pieLabel'+index);
+                                               var labelTop = (y - 
label.height()/2);
+                                               var labelLeft = (x - 
label.width()/2);
+                                               label.css('top', labelTop);
+                                               label.css('left', labelLeft);
+                                               
+                                               // check to make sure that the 
label is not outside the canvas
+                                               if (0-labelTop>0 || 
0-labelLeft>0 || canvas.height-(labelTop+label.height())<0 || 
canvas.width-(labelLeft+label.width())<0)
+                                                       redraw = true;
+                                               
+                                               if 
(options.series.pie.label.background.opacity != 0) {
+                                                       // put in the 
transparent background separately to avoid blended labels and label boxes
+                                                       var c = 
options.series.pie.label.background.color;
+                                                       if (c == null) {
+                                                               c = slice.color;
+                                                       }
+                                                       var pos = 
'top:'+labelTop+'px;left:'+labelLeft+'px;';
+                                                       $('<div 
class="pieLabelBackground" style="position:absolute;width:' + label.width() + 
'px;height:' + label.height() + 'px;' + pos +'background-color:' + c + ';"> 
</div>').insertBefore(label).css('opacity', 
options.series.pie.label.background.opacity);
+                                               }
+                                       } // end individual label function
+                               } // end drawLabels function
+                       } // end drawPie function
+               } // end draw function
+               
+               // Placed here because it needs to be accessed from multiple 
locations 
+               function drawDonutHole(layer)
+               {
+                       // draw donut hole
+                       if(options.series.pie.innerRadius > 0)
+                       {
+                               // subtract the center
+                               layer.save();
+                               innerRadius = options.series.pie.innerRadius > 
1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius;
+                               layer.globalCompositeOperation = 
'destination-out'; // this does not work with excanvas, but it will fall back 
to using the stroke color
+                               layer.beginPath();
+                               layer.fillStyle = 
options.series.pie.stroke.color;
+                               layer.arc(0,0,innerRadius,0,Math.PI*2,false);
+                               layer.fill();
+                               layer.closePath();
+                               layer.restore();
+                               
+                               // add inner stroke
+                               layer.save();
+                               layer.beginPath();
+                               layer.strokeStyle = 
options.series.pie.stroke.color;
+                               layer.arc(0,0,innerRadius,0,Math.PI*2,false);
+                               layer.stroke();
+                               layer.closePath();
+                               layer.restore();
+                               // TODO: add extra shadow inside hole (with a 
mask) if the pie is tilted.
+                       }
+               }
+               
+               //-- Additional Interactive related functions --
+               
+               function isPointInPoly(poly, pt)
+               {
+                       for(var c = false, i = -1, l = poly.length, j = l - 1; 
++i < l; j = i)
+                               ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || 
(poly[j][1] <= pt[1] && pt[1]< poly[i][1]))
+                               && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] 
- poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0])
+                               && (c = !c);
+                       return c;
+               }
+               
+               function findNearbySlice(mouseX, mouseY)
+               {
+                       var slices = plot.getData(),
+                               options = plot.getOptions(),
+                               radius = options.series.pie.radius > 1 ? 
options.series.pie.radius : maxRadius * options.series.pie.radius;
+                       
+                       for (var i = 0; i < slices.length; ++i) 
+                       {
+                               var s = slices[i];      
+                               
+                               if(s.pie.show)
+                               {
+                                       ctx.save();
+                                       ctx.beginPath();
+                                       ctx.moveTo(0,0); // Center of the pie
+                                       //ctx.scale(1, 
options.series.pie.tilt);        // this actually seems to break everything 
when here.
+                                       
ctx.arc(0,0,radius,s.startAngle,s.startAngle+s.angle,false);
+                                       ctx.closePath();
+                                       x = mouseX-centerLeft;
+                                       y = mouseY-centerTop;
+                                       if(ctx.isPointInPath)
+                                       {
+                                               if 
(ctx.isPointInPath(mouseX-centerLeft, mouseY-centerTop))
+                                               {
+                                                       //alert('found slice!');
+                                                       ctx.restore();
+                                                       return {datapoint: 
[s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i};
+                                               }
+                                       }
+                                       else
+                                       {
+                                               // excanvas for IE doesn;t 
support isPointInPath, this is a workaround. 
+                                               p1X = (radius * 
Math.cos(s.startAngle));
+                                               p1Y = (radius * 
Math.sin(s.startAngle));
+                                               p2X = (radius * 
Math.cos(s.startAngle+(s.angle/4)));
+                                               p2Y = (radius * 
Math.sin(s.startAngle+(s.angle/4)));
+                                               p3X = (radius * 
Math.cos(s.startAngle+(s.angle/2)));
+                                               p3Y = (radius * 
Math.sin(s.startAngle+(s.angle/2)));
+                                               p4X = (radius * 
Math.cos(s.startAngle+(s.angle/1.5)));
+                                               p4Y = (radius * 
Math.sin(s.startAngle+(s.angle/1.5)));
+                                               p5X = (radius * 
Math.cos(s.startAngle+s.angle));
+                                               p5Y = (radius * 
Math.sin(s.startAngle+s.angle));
+                                               arrPoly = 
[[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,p5Y]];
+                                               arrPoint = [x,y];
+                                               // TODO: perhaps do some 
mathmatical trickery here with the Y-coordinate to compensate for pie tilt?
+                                               if(isPointInPoly(arrPoly, 
arrPoint))
+                                               {
+                                                       ctx.restore();
+                                                       return {datapoint: 
[s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i};
+                                               }                       
+                                       }
+                                       ctx.restore();
+                               }
+                       }
+                       
+                       return null;
+               }
+
+               function onMouseMove(e) 
+               {
+                       triggerClickHoverEvent('plothover', e);
+               }
+               
+        function onClick(e) 
+               {
+                       triggerClickHoverEvent('plotclick', e);
+        }
+
+               // trigger click or hover event (they send the same parameters 
so we share their code)
+               function triggerClickHoverEvent(eventname, e) 
+               {
+                       var offset = plot.offset(),
+                               canvasX = parseInt(e.pageX - offset.left),
+                               canvasY =  parseInt(e.pageY - offset.top),
+                               item = findNearbySlice(canvasX, canvasY);
+                       
+                       if (options.grid.autoHighlight) 
+                       {
+                               // clear auto-highlights
+                               for (var i = 0; i < highlights.length; ++i) 
+                               {
+                                       var h = highlights[i];
+                                       if (h.auto == eventname && !(item && 
h.series == item.series))
+                                               unhighlight(h.series);
+                               }
+                       }
+                       
+                       // highlight the slice
+                       if (item) 
+                           highlight(item.series, eventname);
+                               
+                       // trigger any hover bind events
+                       var pos = { pageX: e.pageX, pageY: e.pageY };
+                       target.trigger(eventname, [ pos, item ]);       
+               }
+
+               function highlight(s, auto) 
+               {
+                       if (typeof s == "number")
+                               s = series[s];
+
+                       var i = indexOfHighlight(s);
+                       if (i == -1) 
+                       {
+                               highlights.push({ series: s, auto: auto });
+                               plot.triggerRedrawOverlay();
+                       }
+                       else if (!auto)
+                               highlights[i].auto = false;
+               }
+
+               function unhighlight(s) 
+               {
+                       if (s == null) 
+                       {
+                               highlights = [];
+                               plot.triggerRedrawOverlay();
+                       }
+                       
+                       if (typeof s == "number")
+                               s = series[s];
+
+                       var i = indexOfHighlight(s);
+                       if (i != -1) 
+                       {
+                               highlights.splice(i, 1);
+                               plot.triggerRedrawOverlay();
+                       }
+               }
+
+               function indexOfHighlight(s) 
+               {
+                       for (var i = 0; i < highlights.length; ++i) 
+                       {
+                               var h = highlights[i];
+                               if (h.series == s)
+                                       return i;
+                       }
+                       return -1;
+               }
+
+               function drawOverlay(plot, octx) 
+               {
+                       //alert(options.series.pie.radius);
+                       var options = plot.getOptions();
+                       //alert(options.series.pie.radius);
+                       
+                       var radius = options.series.pie.radius > 1 ? 
options.series.pie.radius : maxRadius * options.series.pie.radius;
+
+                       octx.save();
+                       octx.translate(centerLeft, centerTop);
+                       octx.scale(1, options.series.pie.tilt);
+                       
+                       for (i = 0; i < highlights.length; ++i) 
+                               drawHighlight(highlights[i].series);
+                       
+                       drawDonutHole(octx);
+
+                       octx.restore();
+
+                       function drawHighlight(series) 
+                       {
+                               if (series.angle < 0) return;
+                               
+                               //octx.fillStyle = 
parseColor(options.series.pie.highlight.color).scale(null, null, null, 
options.series.pie.highlight.opacity).toString();
+                               octx.fillStyle = "rgba(255, 255, 255, 
"+options.series.pie.highlight.opacity+")"; // this is temporary until we have 
access to parseColor
+                               
+                               octx.beginPath();
+                               if (Math.abs(series.angle - Math.PI*2) > 
0.000000001)
+                                       octx.moveTo(0,0); // Center of the pie
+                               
octx.arc(0,0,radius,series.startAngle,series.startAngle+series.angle,false);
+                               octx.closePath();
+                               octx.fill();
+                       }
+                       
+               }       
+               
+       } // end init (plugin body)
+       
+       // define pie specific options and their default values
+       var options = {
+               series: {
+                       pie: {
+                               show: false,
+                               radius: 'auto', // actual radius of the visible 
pie (based on full calculated radius if <=1, or hard pixel value)
+                               innerRadius:0, /* for donut */
+                               startAngle: 3/2,
+                               tilt: 1,
+                               offset: {
+                                       top: 0,
+                                       left: 'auto'
+                               },
+                               stroke: {
+                                       color: '#FFF',
+                                       width: 1
+                               },
+                               label: {
+                                       show: 'auto',
+                                       formatter: function(label, slice){
+                                               return '<div 
style="font-size:x-small;text-align:center;padding:2px;color:'+slice.color+';">'+label+'<br/>'+Math.round(slice.percent)+'%</div>';
+                                       },      // formatter function
+                                       radius: 1,      // radius at which to 
place the labels (based on full calculated radius if <=1, or hard pixel value)
+                                       background: {
+                                               color: null,
+                                               opacity: 0
+                                       },
+                                       threshold: 0    // percentage at which 
to hide the label (i.e. the slice is too narrow)
+                               },
+                               combine: {
+                                       threshold: -1,  // percentage at which 
to combine little slices into one larger slice
+                                       color: null,    // color to give the 
new slice (auto-generated if null)
+                                       label: 'Other'  // label to give the 
new slice
+                               },
+                               highlight: {
+                                       //color: '#FFF',                // will 
add this functionality once parseColor is available
+                                       opacity: 0.5
+                               }
+                       }
+               }
+       };
+    
+       $.plot.plugins.push({
+               init: init,
+               options: options,
+               name: "pie",
+               version: "1.0"
+       });
+})(jQuery);

http://git-wip-us.apache.org/repos/asf/airavata-php-gateway/blob/7d786c83/public/js/flot/jquery.flot.resize.js
----------------------------------------------------------------------
diff --git a/public/js/flot/jquery.flot.resize.js 
b/public/js/flot/jquery.flot.resize.js
new file mode 100644
index 0000000..1178425
--- /dev/null
+++ b/public/js/flot/jquery.flot.resize.js
@@ -0,0 +1,60 @@
+/* Flot plugin for automatically redrawing plots as the placeholder resizes.
+
+Copyright (c) 2007-2013 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+It works by listening for changes on the placeholder div (through the jQuery
+resize event plugin) - if the size changes, it will redraw the plot.
+
+There are no options. If you need to disable the plugin for some plots, you
+can just fix the size of their placeholders.
+
+*/
+
+/* Inline dependency:
+ * jQuery resize event - v1.1 - 3/14/2010
+ * http://benalman.com/projects/jquery-resize-plugin/
+ *
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+
+(function($,h,c){var 
a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return
 false}var 
l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return
 false}var 
l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return
 false}var n;function m(s,o,p){var 
q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return
 m}else{n=l.handler;l.handler=m}}};function 
g(){i=h[k](function(){a.each(function(){var 
n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this);
+
+(function ($) {
+    var options = { }; // no options
+
+    function init(plot) {
+        function onResize() {
+            var placeholder = plot.getPlaceholder();
+
+            // somebody might have hidden us and we can't plot
+            // when we don't have the dimensions
+            if (placeholder.width() == 0 || placeholder.height() == 0)
+                return;
+
+            plot.resize();
+            plot.setupGrid();
+            plot.draw();
+        }
+        
+        function bindEvents(plot, eventHolder) {
+            plot.getPlaceholder().resize(onResize);
+        }
+
+        function shutdown(plot, eventHolder) {
+            plot.getPlaceholder().unbind("resize", onResize);
+        }
+        
+        plot.hooks.bindEvents.push(bindEvents);
+        plot.hooks.shutdown.push(shutdown);
+    }
+    
+    $.plot.plugins.push({
+        init: init,
+        options: options,
+        name: 'resize',
+        version: '1.0'
+    });
+})(jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata-php-gateway/blob/7d786c83/public/js/flot/jquery.flot.tooltip.min.js
----------------------------------------------------------------------
diff --git a/public/js/flot/jquery.flot.tooltip.min.js 
b/public/js/flot/jquery.flot.tooltip.min.js
new file mode 100644
index 0000000..09e3bbf
--- /dev/null
+++ b/public/js/flot/jquery.flot.tooltip.min.js
@@ -0,0 +1,12 @@
+/*
+ * jquery.flot.tooltip
+ * 
+ * description: easy-to-use tooltips for Flot charts
+ * version: 0.6.2
+ * author: Krzysztof Urbas @krzysu [myviews.pl]
+ * website: https://github.com/krzysu/flot.tooltip
+ * 
+ * build on 2013-09-30
+ * released under MIT License, 2012
+*/ 
+(function(t){var o={tooltip:!1,tooltipOpts:{content:"%s | X: %x | Y: 
%y",xDateFormat:null,yDateFormat:null,shifts:{x:10,y:20},defaultTheme:!0,onHover:function(){}}},i=function(t){this.tipPosition={x:0,y:0},this.init(t)};i.prototype.init=function(o){function
 i(t){var o={};o.x=t.pageX,o.y=t.pageY,s.updateTooltipPosition(o)}function 
e(t,o,i){var e=s.getDomElement();if(i){var 
n;n=s.stringFormat(s.tooltipOptions.content,i),e.html(n),s.updateTooltipPosition({x:o.pageX,y:o.pageY}),e.css({left:s.tipPosition.x+s.tooltipOptions.shifts.x,top:s.tipPosition.y+s.tooltipOptions.shifts.y}).show(),"function"==typeof
 s.tooltipOptions.onHover&&s.tooltipOptions.onHover(i,e)}else 
e.hide().html("")}var 
s=this;o.hooks.bindEvents.push(function(o,n){s.plotOptions=o.getOptions(),s.plotOptions.tooltip!==!1&&void
 
0!==s.plotOptions.tooltip&&(s.tooltipOptions=s.plotOptions.tooltipOpts,s.getDomElement(),t(o.getPlaceholder()).bind("plothover",e),t(n).bind("mousemove",i))}),o.hooks.shutdown.push(function(o,s){t(o.g
 
etPlaceholder()).unbind("plothover",e),t(s).unbind("mousemove",i)})},i.prototype.getDomElement=function(){var
 o;return t("#flotTip").length>0?o=t("#flotTip"):(o=t("<div 
/>").attr("id","flotTip"),o.appendTo("body").hide().css({position:"absolute"}),this.tooltipOptions.defaultTheme&&o.css({background:"#fff","z-index":"100",padding:"0.4em
 0.6em","border-radius":"0.5em","font-size":"0.8em",border:"1px solid 
#111",display:"none","white-space":"nowrap"})),o},i.prototype.updateTooltipPosition=function(o){var
 
i=t("#flotTip").outerWidth()+this.tooltipOptions.shifts.x,e=t("#flotTip").outerHeight()+this.tooltipOptions.shifts.y;o.x-t(window).scrollLeft()>t(window).innerWidth()-i&&(o.x-=i),o.y-t(window).scrollTop()>t(window).innerHeight()-e&&(o.y-=e),this.tipPosition.x=o.x,this.tipPosition.y=o.y},i.prototype.stringFormat=function(t,o){var
 
i=/%p\.{0,1}(\d{0,})/,e=/%s/,s=/%x\.{0,1}(?:\d{0,})/,n=/%y\.{0,1}(?:\d{0,})/;return"function"==typeof
 t&&(t=t(o.series.label,o.series.data[o.dataIndex][0],o.se
 ries.data[o.dataIndex][1],o)),o.series.percent!==void 
0&&(t=this.adjustValPrecision(i,t,o.series.percent)),o.series.label!==void 
0&&(t=t.replace(e,o.series.label)),this.isTimeMode("xaxis",o)&&this.isXDateFormat(o)&&(t=t.replace(s,this.timestampToDate(o.series.data[o.dataIndex][0],this.tooltipOptions.xDateFormat))),this.isTimeMode("yaxis",o)&&this.isYDateFormat(o)&&(t=t.replace(n,this.timestampToDate(o.series.data[o.dataIndex][1],this.tooltipOptions.yDateFormat))),"number"==typeof
 
o.series.data[o.dataIndex][0]&&(t=this.adjustValPrecision(s,t,o.series.data[o.dataIndex][0])),"number"==typeof
 
o.series.data[o.dataIndex][1]&&(t=this.adjustValPrecision(n,t,o.series.data[o.dataIndex][1])),o.series.xaxis.tickFormatter!==void
 
0&&(t=t.replace(s,o.series.xaxis.tickFormatter(o.series.data[o.dataIndex][0],o.series.xaxis))),o.series.yaxis.tickFormatter!==void
 
0&&(t=t.replace(n,o.series.yaxis.tickFormatter(o.series.data[o.dataIndex][1],o.series.yaxis))),t},i.prototype.isTimeMode=function(t,o){retur
 n o.series[t].options.mode!==void 
0&&"time"===o.series[t].options.mode},i.prototype.isXDateFormat=function(){return
 this.tooltipOptions.xDateFormat!==void 
0&&null!==this.tooltipOptions.xDateFormat},i.prototype.isYDateFormat=function(){return
 this.tooltipOptions.yDateFormat!==void 
0&&null!==this.tooltipOptions.yDateFormat},i.prototype.timestampToDate=function(o,i){var
 e=new Date(o);return 
t.plot.formatDate(e,i)},i.prototype.adjustValPrecision=function(t,o,i){var 
e,s=o.match(t);return 
null!==s&&""!==RegExp.$1&&(e=RegExp.$1,i=i.toFixed(e),o=o.replace(t,i)),o};var 
e=function(t){new 
i(t)};t.plot.plugins.push({init:e,options:o,name:"tooltip",version:"0.6.1"})})(jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata-php-gateway/blob/7d786c83/public/js/morris/morris-data.js
----------------------------------------------------------------------
diff --git a/public/js/morris/morris-data.js b/public/js/morris/morris-data.js
new file mode 100644
index 0000000..f9dcb05
--- /dev/null
+++ b/public/js/morris/morris-data.js
@@ -0,0 +1,227 @@
+// Morris.js Charts sample data for SB Admin template
+
+$(function() {
+
+    // Area Chart
+    Morris.Area({
+        element: 'morris-area-chart',
+        data: [{
+            period: '2010 Q1',
+            iphone: 2666,
+            ipad: null,
+            itouch: 2647
+        }, {
+            period: '2010 Q2',
+            iphone: 2778,
+            ipad: 2294,
+            itouch: 2441
+        }, {
+            period: '2010 Q3',
+            iphone: 4912,
+            ipad: 1969,
+            itouch: 2501
+        }, {
+            period: '2010 Q4',
+            iphone: 3767,
+            ipad: 3597,
+            itouch: 5689
+        }, {
+            period: '2011 Q1',
+            iphone: 6810,
+            ipad: 1914,
+            itouch: 2293
+        }, {
+            period: '2011 Q2',
+            iphone: 5670,
+            ipad: 4293,
+            itouch: 1881
+        }, {
+            period: '2011 Q3',
+            iphone: 4820,
+            ipad: 3795,
+            itouch: 1588
+        }, {
+            period: '2011 Q4',
+            iphone: 15073,
+            ipad: 5967,
+            itouch: 5175
+        }, {
+            period: '2012 Q1',
+            iphone: 10687,
+            ipad: 4460,
+            itouch: 2028
+        }, {
+            period: '2012 Q2',
+            iphone: 8432,
+            ipad: 5713,
+            itouch: 1791
+        }],
+        xkey: 'period',
+        ykeys: ['iphone', 'ipad', 'itouch'],
+        labels: ['iPhone', 'iPad', 'iPod Touch'],
+        pointSize: 2,
+        hideHover: 'auto',
+        resize: true
+    });
+
+    // Donut Chart
+    Morris.Donut({
+        element: 'morris-donut-chart',
+        data: [{
+            label: "Download Sales",
+            value: 12
+        }, {
+            label: "In-Store Sales",
+            value: 30
+        }, {
+            label: "Mail-Order Sales",
+            value: 20
+        }],
+        resize: true
+    });
+
+    // Line Chart
+    Morris.Line({
+        // ID of the element in which to draw the chart.
+        element: 'morris-line-chart',
+        // Chart data records -- each entry in this array corresponds to a 
point on
+        // the chart.
+        data: [{
+            d: '2012-10-01',
+            visits: 802
+        }, {
+            d: '2012-10-02',
+            visits: 783
+        }, {
+            d: '2012-10-03',
+            visits: 820
+        }, {
+            d: '2012-10-04',
+            visits: 839
+        }, {
+            d: '2012-10-05',
+            visits: 792
+        }, {
+            d: '2012-10-06',
+            visits: 859
+        }, {
+            d: '2012-10-07',
+            visits: 790
+        }, {
+            d: '2012-10-08',
+            visits: 1680
+        }, {
+            d: '2012-10-09',
+            visits: 1592
+        }, {
+            d: '2012-10-10',
+            visits: 1420
+        }, {
+            d: '2012-10-11',
+            visits: 882
+        }, {
+            d: '2012-10-12',
+            visits: 889
+        }, {
+            d: '2012-10-13',
+            visits: 819
+        }, {
+            d: '2012-10-14',
+            visits: 849
+        }, {
+            d: '2012-10-15',
+            visits: 870
+        }, {
+            d: '2012-10-16',
+            visits: 1063
+        }, {
+            d: '2012-10-17',
+            visits: 1192
+        }, {
+            d: '2012-10-18',
+            visits: 1224
+        }, {
+            d: '2012-10-19',
+            visits: 1329
+        }, {
+            d: '2012-10-20',
+            visits: 1329
+        }, {
+            d: '2012-10-21',
+            visits: 1239
+        }, {
+            d: '2012-10-22',
+            visits: 1190
+        }, {
+            d: '2012-10-23',
+            visits: 1312
+        }, {
+            d: '2012-10-24',
+            visits: 1293
+        }, {
+            d: '2012-10-25',
+            visits: 1283
+        }, {
+            d: '2012-10-26',
+            visits: 1248
+        }, {
+            d: '2012-10-27',
+            visits: 1323
+        }, {
+            d: '2012-10-28',
+            visits: 1390
+        }, {
+            d: '2012-10-29',
+            visits: 1420
+        }, {
+            d: '2012-10-30',
+            visits: 1529
+        }, {
+            d: '2012-10-31',
+            visits: 1892
+        }, ],
+        // The name of the data record attribute that contains x-visitss.
+        xkey: 'd',
+        // A list of names of data record attributes that contain y-visitss.
+        ykeys: ['visits'],
+        // Labels for the ykeys -- will be displayed when you hover over the
+        // chart.
+        labels: ['Visits'],
+        // Disables line smoothing
+        smooth: false,
+        resize: true
+    });
+
+    // Bar Chart
+    Morris.Bar({
+        element: 'morris-bar-chart',
+        data: [{
+            device: 'iPhone',
+            geekbench: 136
+        }, {
+            device: 'iPhone 3G',
+            geekbench: 137
+        }, {
+            device: 'iPhone 3GS',
+            geekbench: 275
+        }, {
+            device: 'iPhone 4',
+            geekbench: 380
+        }, {
+            device: 'iPhone 4S',
+            geekbench: 655
+        }, {
+            device: 'iPhone 5',
+            geekbench: 1571
+        }],
+        xkey: 'device',
+        ykeys: ['geekbench'],
+        labels: ['Geekbench'],
+        barRatio: 0.4,
+        xLabelAngle: 35,
+        hideHover: 'auto',
+        resize: true
+    });
+
+
+});

http://git-wip-us.apache.org/repos/asf/airavata-php-gateway/blob/7d786c83/public/js/morris/morris.min.js
----------------------------------------------------------------------
diff --git a/public/js/morris/morris.min.js b/public/js/morris/morris.min.js
new file mode 100644
index 0000000..c3bda2f
--- /dev/null
+++ b/public/js/morris/morris.min.js
@@ -0,0 +1,7 @@
+/* @license
+morris.js v0.5.0
+Copyright 2014 Olly Smith All rights reserved.
+Licensed under the BSD-2-Clause License.
+*/
+(function(){var a,b,c,d,e=[].slice,f=function(a,b){return function(){return 
a.apply(b,arguments)}},g={}.hasOwnProperty,h=function(a,b){function 
c(){this.constructor=a}for(var d in b)g.call(b,d)&&(a[d]=b[d]);return 
c.prototype=b.prototype,a.prototype=new 
c,a.__super__=b.prototype,a},i=[].indexOf||function(a){for(var 
b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return 
b;return-1};b=window.Morris={},a=jQuery,b.EventEmitter=function(){function 
a(){}return a.prototype.on=function(a,b){return 
null==this.handlers&&(this.handlers={}),null==this.handlers[a]&&(this.handlers[a]=[]),this.handlers[a].push(b),this},a.prototype.fire=function(){var
 
a,b,c,d,f,g,h;if(c=arguments[0],a=2<=arguments.length?e.call(arguments,1):[],null!=this.handlers&&null!=this.handlers[c]){for(g=this.handlers[c],h=[],d=0,f=g.length;f>d;d++)b=g[d],h.push(b.apply(null,a));return
 h}},a}(),b.commas=function(a){var b,c,d,e;return 
null!=a?(d=0>a?"-":"",b=Math.abs(a),c=Math.floor(b).toFixed(0),d+=c.replace(/(?=(?:\d{3})
 
+$)(?!^)/g,","),e=b.toString(),e.length>c.length&&(d+=e.slice(c.length)),d):"-"},b.pad2=function(a){return(10>a?"0":"")+a},b.Grid=function(c){function
 d(b){this.resizeHandler=f(this.resizeHandler,this);var 
c=this;if(this.el="string"==typeof 
b.element?a(document.getElementById(b.element)):a(b.element),null==this.el||0===this.el.length)throw
 new Error("Graph container element not 
found");"static"===this.el.css("position")&&this.el.css("position","relative"),this.options=a.extend({},this.gridDefaults,this.defaults||{},b),"string"==typeof
 this.options.units&&(this.options.postUnits=b.units),this.raphael=new 
Raphael(this.el[0]),this.elementWidth=null,this.elementHeight=null,this.dirty=!1,this.selectFrom=null,this.init&&this.init(),this.setData(this.options.data),this.el.bind("mousemove",function(a){var
 b,d,e,f,g;return 
d=c.el.offset(),g=a.pageX-d.left,c.selectFrom?(b=c.data[c.hitTest(Math.min(g,c.selectFrom))]._x,e=c.data[c.hitTest(Math.max(g,c.selectFrom))]._x,f=e-b,c.selectionRect.attr
 
({x:b,width:f})):c.fire("hovermove",g,a.pageY-d.top)}),this.el.bind("mouseleave",function(){return
 
c.selectFrom&&(c.selectionRect.hide(),c.selectFrom=null),c.fire("hoverout")}),this.el.bind("touchstart
 touchmove touchend",function(a){var b,d;return 
d=a.originalEvent.touches[0]||a.originalEvent.changedTouches[0],b=c.el.offset(),c.fire("hovermove",d.pageX-b.left,d.pageY-b.top)}),this.el.bind("click",function(a){var
 b;return 
b=c.el.offset(),c.fire("gridclick",a.pageX-b.left,a.pageY-b.top)}),this.options.rangeSelect&&(this.selectionRect=this.raphael.rect(0,0,0,this.el.innerHeight()).attr({fill:this.options.rangeSelectColor,stroke:!1}).toBack().hide(),this.el.bind("mousedown",function(a){var
 b;return 
b=c.el.offset(),c.startRange(a.pageX-b.left)}),this.el.bind("mouseup",function(a){var
 b;return 
b=c.el.offset(),c.endRange(a.pageX-b.left),c.fire("hovermove",a.pageX-b.left,a.pageY-b.top)})),this.options.resize&&a(window).bind("resize",function(){return
 null!=c.timeoutId&&window.clearTimeout(
 
c.timeoutId),c.timeoutId=window.setTimeout(c.resizeHandler,100)}),this.el.css("-webkit-tap-highlight-color","rgba(0,0,0,0)"),this.postInit&&this.postInit()}return
 
h(d,c),d.prototype.gridDefaults={dateFormat:null,axes:!0,grid:!0,gridLineColor:"#aaa",gridStrokeWidth:.5,gridTextColor:"#888",gridTextSize:12,gridTextFamily:"sans-serif",gridTextWeight:"normal",hideHover:!1,yLabelFormat:null,xLabelAngle:0,numLines:5,padding:25,parseTime:!0,postUnits:"",preUnits:"",ymax:"auto",ymin:"auto
 
0",goals:[],goalStrokeWidth:1,goalLineColors:["#666633","#999966","#cc6666","#663333"],events:[],eventStrokeWidth:1,eventLineColors:["#005a04","#ccffbb","#3a5f0b","#005502"],rangeSelect:null,rangeSelectColor:"#eef",resize:!1},d.prototype.setData=function(a,c){var
 d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;return 
null==c&&(c=!0),this.options.data=a,null==a||0===a.length?(this.data=[],this.raphael.clear(),null!=this.hover&&this.hover.hide(),void
 0):(o=this.cumulative?0:null,p=this.cumulative?0:null,this.options.goals.leng
 
th>0&&(h=Math.min.apply(Math,this.options.goals),g=Math.max.apply(Math,this.options.goals),p=null!=p?Math.min(p,h):h,o=null!=o?Math.max(o,g):g),this.data=function(){var
 
c,d,g;for(g=[],f=c=0,d=a.length;d>c;f=++c)j=a[f],i={src:j},i.label=j[this.options.xkey],this.options.parseTime?(i.x=b.parseDate(i.label),this.options.dateFormat?i.label=this.options.dateFormat(i.x):"number"==typeof
 i.label&&(i.label=new 
Date(i.label).toString())):(i.x=f,this.options.xLabelFormat&&(i.label=this.options.xLabelFormat(i))),l=0,i.y=function(){var
 
a,b,c,d;for(c=this.options.ykeys,d=[],e=a=0,b=c.length;b>a;e=++a)n=c[e],q=j[n],"string"==typeof
 q&&(q=parseFloat(q)),null!=q&&"number"!=typeof 
q&&(q=null),null!=q&&(this.cumulative?l+=q:null!=o?(o=Math.max(q,o),p=Math.min(q,p)):o=p=q),this.cumulative&&null!=l&&(o=Math.max(l,o),p=Math.min(l,p)),d.push(q);return
 d}.call(this),g.push(i);return 
g}.call(this),this.options.parseTime&&(this.data=this.data.sort(function(a,b){return(a.x>b.x)-(b.x>a.x)})),this.xmin=this.da
 
ta[0].x,this.xmax=this.data[this.data.length-1].x,this.events=[],this.options.events.length>0&&(this.events=this.options.parseTime?function(){var
 
a,c,e,f;for(e=this.options.events,f=[],a=0,c=e.length;c>a;a++)d=e[a],f.push(b.parseDate(d));return
 
f}.call(this):this.options.events,this.xmax=Math.max(this.xmax,Math.max.apply(Math,this.events)),this.xmin=Math.min(this.xmin,Math.min.apply(Math,this.events))),this.xmin===this.xmax&&(this.xmin-=1,this.xmax+=1),this.ymin=this.yboundary("min",p),this.ymax=this.yboundary("max",o),this.ymin===this.ymax&&(p&&(this.ymin-=1),this.ymax+=1),((r=this.options.axes)===!0||"both"===r||"y"===r||this.options.grid===!0)&&(this.options.ymax===this.gridDefaults.ymax&&this.options.ymin===this.gridDefaults.ymin?(this.grid=this.autoGridLines(this.ymin,this.ymax,this.options.numLines),this.ymin=Math.min(this.ymin,this.grid[0]),this.ymax=Math.max(this.ymax,this.grid[this.grid.length-1])):(k=(this.ymax-this.ymin)/(this.options.numLines-1),this.grid=function(){var
 
 
a,b,c,d;for(d=[],m=a=b=this.ymin,c=this.ymax;k>0?c>=a:a>=c;m=a+=k)d.push(m);return
 d}.call(this))),this.dirty=!0,c?this.redraw():void 
0)},d.prototype.yboundary=function(a,b){var c,d;return 
c=this.options["y"+a],"string"==typeof 
c?"auto"===c.slice(0,4)?c.length>5?(d=parseInt(c.slice(5),10),null==b?d:Math[a](b,d)):null!=b?b:0:parseInt(c,10):c},d.prototype.autoGridLines=function(a,b,c){var
 d,e,f,g,h,i,j,k,l;return 
h=b-a,l=Math.floor(Math.log(h)/Math.log(10)),j=Math.pow(10,l),e=Math.floor(a/j)*j,d=Math.ceil(b/j)*j,i=(d-e)/(c-1),1===j&&i>1&&Math.ceil(i)!==i&&(i=Math.ceil(i),d=e+i*(c-1)),0>e&&d>0&&(e=Math.floor(a/i)*i,d=Math.ceil(b/i)*i),1>i?(g=Math.floor(Math.log(i)/Math.log(10)),f=function(){var
 
a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(parseFloat(k.toFixed(1-g)));return
 b}()):f=function(){var 
a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(k);return 
b}(),f},d.prototype._calc=function(){var a,b,c,d,e,f,g,h;return 
e=this.el.width(),c=this.el.height(),(this.elementWidth!==e||this.elem
 
entHeight!==c||this.dirty)&&(this.elementWidth=e,this.elementHeight=c,this.dirty=!1,this.left=this.options.padding,this.right=this.elementWidth-this.options.padding,this.top=this.options.padding,this.bottom=this.elementHeight-this.options.padding,((g=this.options.axes)===!0||"both"===g||"y"===g)&&(f=function(){var
 
a,c,d,e;for(d=this.grid,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(this.measureText(this.yAxisFormat(b)).width);return
 
e}.call(this),this.left+=Math.max.apply(Math,f)),((h=this.options.axes)===!0||"both"===h||"x"===h)&&(a=function(){var
 
a,b,c;for(c=[],d=a=0,b=this.data.length;b>=0?b>a:a>b;d=b>=0?++a:--a)c.push(this.measureText(this.data[d].text,-this.options.xLabelAngle).height);return
 
c}.call(this),this.bottom-=Math.max.apply(Math,a)),this.width=Math.max(1,this.right-this.left),this.height=Math.max(1,this.bottom-this.top),this.dx=this.width/(this.xmax-this.xmin),this.dy=this.height/(this.ymax-this.ymin),this.calc)?this.calc():void
 0},d.prototype.transY=function(a){return t
 his.bottom-(a-this.ymin)*this.dy},d.prototype.transX=function(a){return 
1===this.data.length?(this.left+this.right)/2:this.left+(a-this.xmin)*this.dx},d.prototype.redraw=function(){return
 
this.raphael.clear(),this._calc(),this.drawGrid(),this.drawGoals(),this.drawEvents(),this.draw?this.draw():void
 0},d.prototype.measureText=function(a,b){var c,d;return 
null==b&&(b=0),d=this.raphael.text(100,100,a).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).rotate(b),c=d.getBBox(),d.remove(),c},d.prototype.yAxisFormat=function(a){return
 
this.yLabelFormat(a)},d.prototype.yLabelFormat=function(a){return"function"==typeof
 
this.options.yLabelFormat?this.options.yLabelFormat(a):""+this.options.preUnits+b.commas(a)+this.options.postUnits},d.prototype.drawGrid=function(){var
 
a,b,c,d,e,f,g,h;if(this.options.grid!==!1||(e=this.options.axes)===!0||"both"===e||"y"===e){for(f=this.grid,h=[],c=0,d=f.length;d>c;c++)a=
 
f[c],b=this.transY(a),((g=this.options.axes)===!0||"both"===g||"y"===g)&&this.drawYAxisLabel(this.left-this.options.padding/2,b,this.yAxisFormat(a)),this.options.grid?h.push(this.drawGridLine("M"+this.left+","+b+"H"+(this.left+this.width))):h.push(void
 0);return h}},d.prototype.drawGoals=function(){var 
a,b,c,d,e,f,g;for(f=this.options.goals,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.goalLineColors[c%this.options.goalLineColors.length],g.push(this.drawGoal(b,a));return
 g},d.prototype.drawEvents=function(){var 
a,b,c,d,e,f,g;for(f=this.events,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.eventLineColors[c%this.options.eventLineColors.length],g.push(this.drawEvent(b,a));return
 g},d.prototype.drawGoal=function(a,b){return 
this.raphael.path("M"+this.left+","+this.transY(a)+"H"+this.right).attr("stroke",b).attr("stroke-width",this.options.goalStrokeWidth)},d.prototype.drawEvent=function(a,b){return
 this.raphael.path("M"+this.transX(a)+","+this.bottom+"V"+this.top).attr("
 
stroke",b).attr("stroke-width",this.options.eventStrokeWidth)},d.prototype.drawYAxisLabel=function(a,b,c){return
 
this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor).attr("text-anchor","end")},d.prototype.drawGridLine=function(a){return
 
this.raphael.path(a).attr("stroke",this.options.gridLineColor).attr("stroke-width",this.options.gridStrokeWidth)},d.prototype.startRange=function(a){return
 
this.hover.hide(),this.selectFrom=a,this.selectionRect.attr({x:a,width:0}).show()},d.prototype.endRange=function(a){var
 b,c;return 
this.selectFrom?(c=Math.min(this.selectFrom,a),b=Math.max(this.selectFrom,a),this.options.rangeSelect.call(this.el,{start:this.data[this.hitTest(c)].x,end:this.data[this.hitTest(b)].x}),this.selectFrom=null):void
 0},d.prototype.resizeHandler=function(){return 
this.timeoutId=null,this.raphael.setSize(this.el.width(),this
 .el.height()),this.redraw()},d}(b.EventEmitter),b.parseDate=function(a){var 
b,c,d,e,f,g,h,i,j,k,l;return"number"==typeof a?a:(c=a.match(/^(\d+) 
Q(\d)$/),e=a.match(/^(\d+)-(\d+)$/),f=a.match(/^(\d+)-(\d+)-(\d+)$/),h=a.match(/^(\d+)
 W(\d+)$/),i=a.match(/^(\d+)-(\d+)-(\d+)[ 
T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/),j=a.match(/^(\d+)-(\d+)-(\d+)[ 
T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/),c?new 
Date(parseInt(c[1],10),3*parseInt(c[2],10)-1,1).getTime():e?new 
Date(parseInt(e[1],10),parseInt(e[2],10)-1,1).getTime():f?new 
Date(parseInt(f[1],10),parseInt(f[2],10)-1,parseInt(f[3],10)).getTime():h?(k=new
 
Date(parseInt(h[1],10),0,1),4!==k.getDay()&&k.setMonth(0,1+(4-k.getDay()+7)%7),k.getTime()+6048e5*parseInt(h[2],10)):i?i[6]?(g=0,"Z"!==i[6]&&(g=60*parseInt(i[8],10)+parseInt(i[9],10),"+"===i[7]&&(g=0-g)),Date.UTC(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)+g)):new
 Date(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(
 
i[4],10),parseInt(i[5],10)).getTime():j?(l=parseFloat(j[6]),b=Math.floor(l),d=Math.round(1e3*(l-b)),j[8]?(g=0,"Z"!==j[8]&&(g=60*parseInt(j[10],10)+parseInt(j[11],10),"+"===j[9]&&(g=0-g)),Date.UTC(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10)+g,b,d)):new
 
Date(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10),b,d).getTime()):new
 Date(parseInt(a,10),0,1).getTime())},b.Hover=function(){function 
c(c){null==c&&(c={}),this.options=a.extend({},b.Hover.defaults,c),this.el=a("<div
 
class='"+this.options["class"]+"'></div>"),this.el.hide(),this.options.parent.append(this.el)}return
 c.defaults={"class":"morris-hover 
morris-default-style"},c.prototype.update=function(a,b,c){return 
a?(this.html(a),this.show(),this.moveTo(b,c)):this.hide()},c.prototype.html=function(a){return
 this.el.html(a)},c.prototype.moveTo=function(a,b){var c,d,e,f,g,h;return 
g=this.options.parent.innerWidth(),f=this.options.parent.innerHei
 
ght(),d=this.el.outerWidth(),c=this.el.outerHeight(),e=Math.min(Math.max(0,a-d/2),g-d),null!=b?(h=b-c-10,0>h&&(h=b+10,h+c>f&&(h=f/2-c/2))):h=f/2-c/2,this.el.css({left:e+"px",top:parseInt(h)+"px"})},c.prototype.show=function(){return
 this.el.show()},c.prototype.hide=function(){return 
this.el.hide()},c}(),b.Line=function(a){function c(a){return 
this.hilight=f(this.hilight,this),this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this
 instanceof b.Line?(c.__super__.constructor.call(this,a),void 0):new 
b.Line(a)}return 
h(c,a),c.prototype.init=function(){return"always"!==this.options.hideHover?(this.hover=new
 
b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void
 
0},c.prototype.defaults={lineWidth:3,pointSize:4,lineColors:["#0b62a4","#7A92A3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],pointStrokeWidths:[1],pointStrokeColo
 
rs:["#ffffff"],pointFillColors:[],smooth:!0,xLabels:"auto",xLabelFormat:null,xLabelMargin:24,hideHover:!1},c.prototype.calc=function(){return
 this.calcPoints(),this.generatePaths()},c.prototype.calcPoints=function(){var 
a,b,c,d,e,f;for(e=this.data,f=[],c=0,d=e.length;d>c;c++)a=e[c],a._x=this.transX(a.x),a._y=function(){var
 
c,d,e,f;for(e=a.y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b?f.push(this.transY(b)):f.push(b);return
 
f}.call(this),f.push(a._ymax=Math.min.apply(Math,[this.bottom].concat(function(){var
 
c,d,e,f;for(e=a._y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b&&f.push(b);return 
f}())));return f},c.prototype.hitTest=function(a){var 
b,c,d,e,f;if(0===this.data.length)return 
null;for(f=this.data.slice(1),b=d=0,e=f.length;e>d&&(c=f[b],!(a<(c._x+this.data[b]._x)/2));b=++d);return
 b},c.prototype.onGridClick=function(a,b){var c;return 
c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},c.prototype.onHoverMove=function(a){var
 b;return b=this.hitTest(a),this.displayHoverForRow(
 b)},c.prototype.onHoverOut=function(){return 
this.options.hideHover!==!1?this.displayHoverForRow(null):void 
0},c.prototype.displayHoverForRow=function(a){var b;return 
null!=a?((b=this.hover).update.apply(b,this.hoverContentForRow(a)),this.hilight(a)):(this.hover.hide(),this.hilight())},c.prototype.hoverContentForRow=function(a){var
 b,c,d,e,f,g,h;for(d=this.data[a],b="<div 
class='morris-hover-row-label'>"+d.label+"</div>",h=d.y,c=f=0,g=h.length;g>f;c=++f)e=h[c],b+="<div
 class='morris-hover-point' style='color: "+this.colorFor(d,c,"label")+"'>\n  
"+this.options.labels[c]+":\n  
"+this.yLabelFormat(e)+"\n</div>";return"function"==typeof 
this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),[b,d._x,d._ymax]},c.prototype.generatePaths=function(){var
 a,c,d,e;return this.paths=function(){var 
f,g,h,j;for(j=[],c=f=0,g=this.options.ykeys.length;g>=0?g>f:f>g;c=g>=0?++f:--f)e="boolean"==typeof
 this.options.smooth?this.options.smooth:(h=this.options.ykeys[c],i.call(th
 is.options.smooth,h)>=0),a=function(){var 
a,b,e,f;for(e=this.data,f=[],a=0,b=e.length;b>a;a++)d=e[a],void 
0!==d._y[c]&&f.push({x:d._x,y:d._y[c]});return 
f}.call(this),a.length>1?j.push(b.Line.createPath(a,e,this.bottom)):j.push(null);return
 j}.call(this)},c.prototype.draw=function(){var 
a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries(),this.options.hideHover===!1?this.displayHoverForRow(this.data.length-1):void
 0},c.prototype.drawXAxis=function(){var 
a,c,d,e,f,g,h,i,j,k,l=this;for(h=this.bottom+this.options.padding/2,f=null,e=null,a=function(a,b){var
 c,d,g,i,j;return 
c=l.drawXAxisLabel(l.transX(b),h,a),j=c.getBBox(),c.transform("r"+-l.options.xLabelAngle),d=c.getBBox(),c.transform("t0,"+d.height/2+"..."),0!==l.options.xLabelAngle&&(i=-.5*j.width*Math.cos(l.options.xLabelAngle*Math.PI/180),c.transform("t"+i+",0...")),d=c.getBBox(),(null==f||f>=d.x+d.width||null!=e&&e>=d.x)&&d.x>=0&&d.x+d.width<l.el.width()?(0!==l.options.xLabelAngle&&(g=1.2
 
5*l.options.gridTextSize/Math.sin(l.options.xLabelAngle*Math.PI/180),e=d.x-g),f=d.x-l.options.xLabelMargin):c.remove()},d=this.options.parseTime?1===this.data.length&&"auto"===this.options.xLabels?[[this.data[0].label,this.data[0].x]]:b.labelSeries(this.xmin,this.xmax,this.width,this.options.xLabels,this.options.xLabelFormat):function(){var
 
a,b,c,d;for(c=this.data,d=[],a=0,b=c.length;b>a;a++)g=c[a],d.push([g.label,g.x]);return
 
d}.call(this),d.reverse(),k=[],i=0,j=d.length;j>i;i++)c=d[i],k.push(a(c[0],c[1]));return
 k},c.prototype.drawSeries=function(){var 
a,b,c,d,e,f;for(this.seriesPoints=[],a=b=d=this.options.ykeys.length-1;0>=d?0>=b:b>=0;a=0>=d?++b:--b)this._drawLineFor(a);for(f=[],a=c=e=this.options.ykeys.length-1;0>=e?0>=c:c>=0;a=0>=e?++c:--c)f.push(this._drawPointFor(a));return
 f},c.prototype._drawPointFor=function(a){var 
b,c,d,e,f,g;for(this.seriesPoints[a]=[],f=this.data,g=[],d=0,e=f.length;e>d;d++)c=f[d],b=null,null!=c._y[a]&&(b=this.drawLinePoint(c._x,c._y[a],this.colorFor(c
 ,a,"point"),a)),g.push(this.seriesPoints[a].push(b));return 
g},c.prototype._drawLineFor=function(a){var b;return 
b=this.paths[a],null!==b?this.drawLinePath(b,this.colorFor(null,a,"line"),a):void
 0},c.createPath=function(a,c,d){var 
e,f,g,h,i,j,k,l,m,n,o,p,q,r;for(k="",c&&(g=b.Line.gradients(a)),l={y:null},h=q=0,r=a.length;r>q;h=++q)e=a[h],null!=e.y&&(null!=l.y?c?(f=g[h],j=g[h-1],i=(e.x-l.x)/4,m=l.x+i,o=Math.min(d,l.y+i*j),n=e.x-i,p=Math.min(d,e.y-i*f),k+="C"+m+","+o+","+n+","+p+","+e.x+","+e.y):k+="L"+e.x+","+e.y:c&&null==g[h]||(k+="M"+e.x+","+e.y)),l=e;return
 k},c.gradients=function(a){var 
b,c,d,e,f,g,h,i;for(c=function(a,b){return(a.y-b.y)/(a.x-b.x)},i=[],d=g=0,h=a.length;h>g;d=++g)b=a[d],null!=b.y?(e=a[d+1]||{y:null},f=a[d-1]||{y:null},null!=f.y&&null!=e.y?i.push(c(f,e)):null!=f.y?i.push(c(f,b)):null!=e.y?i.push(c(b,e)):i.push(null)):i.push(null);return
 i},c.prototype.hilight=function(a){var 
b,c,d,e,f;if(null!==this.prevHilight&&this.prevHilight!==a)for(b=c=0,e=this.seriesPoints.l
 
ength-1;e>=0?e>=c:c>=e;b=e>=0?++c:--c)this.seriesPoints[b][this.prevHilight]&&this.seriesPoints[b][this.prevHilight].animate(this.pointShrinkSeries(b));if(null!==a&&this.prevHilight!==a)for(b=d=0,f=this.seriesPoints.length-1;f>=0?f>=d:d>=f;b=f>=0?++d:--d)this.seriesPoints[b][a]&&this.seriesPoints[b][a].animate(this.pointGrowSeries(b));return
 
this.prevHilight=a},c.prototype.colorFor=function(a,b,c){return"function"==typeof
 
this.options.lineColors?this.options.lineColors.call(this,a,b,c):"point"===c?this.options.pointFillColors[b%this.options.pointFillColors.length]||this.options.lineColors[b%this.options.lineColors.length]:this.options.lineColors[b%this.options.lineColors.length]},c.prototype.drawXAxisLabel=function(a,b,c){return
 
this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},c.prototype.drawLinePath=function(a,b,c){return
 this
 
.raphael.path(a).attr("stroke",b).attr("stroke-width",this.lineWidthForSeries(c))},c.prototype.drawLinePoint=function(a,b,c,d){return
 
this.raphael.circle(a,b,this.pointSizeForSeries(d)).attr("fill",c).attr("stroke-width",this.pointStrokeWidthForSeries(d)).attr("stroke",this.pointStrokeColorForSeries(d))},c.prototype.pointStrokeWidthForSeries=function(a){return
 
this.options.pointStrokeWidths[a%this.options.pointStrokeWidths.length]},c.prototype.pointStrokeColorForSeries=function(a){return
 
this.options.pointStrokeColors[a%this.options.pointStrokeColors.length]},c.prototype.lineWidthForSeries=function(a){return
 this.options.lineWidth instanceof 
Array?this.options.lineWidth[a%this.options.lineWidth.length]:this.options.lineWidth},c.prototype.pointSizeForSeries=function(a){return
 this.options.pointSize instanceof 
Array?this.options.pointSize[a%this.options.pointSize.length]:this.options.pointSize},c.prototype.pointGrowSeries=function(a){return
 Raphael.animation({r:this.pointSizeForSeries
 (a)+3},25,"linear")},c.prototype.pointShrinkSeries=function(a){return 
Raphael.animation({r:this.pointSizeForSeries(a)},25,"linear")},c}(b.Grid),b.labelSeries=function(c,d,e,f,g){var
 h,i,j,k,l,m,n,o,p,q,r;if(j=200*(d-c)/e,i=new Date(c),n=b.LABEL_SPECS[f],void 
0===n)for(r=b.AUTO_LABEL_ORDER,p=0,q=r.length;q>p;p++)if(k=r[p],m=b.LABEL_SPECS[k],j>=m.span){n=m;break}for(void
 
0===n&&(n=b.LABEL_SPECS.second),g&&(n=a.extend({},n,{fmt:g})),h=n.start(i),l=[];(o=h.getTime())<=d;)o>=c&&l.push([n.fmt(h),o]),n.incr(h);return
 l},c=function(a){return{span:60*a*1e3,start:function(a){return new 
Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())},incr:function(b){return
 
b.setUTCMinutes(b.getUTCMinutes()+a)}}},d=function(a){return{span:1e3*a,start:function(a){return
 new 
Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours(),a.getMinutes())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())+":"+b
 .pad2(a.getSeconds())},incr:function(b){return 
b.setUTCSeconds(b.getUTCSeconds()+a)}}},b.LABEL_SPECS={decade:{span:1728e8,start:function(a){return
 new 
Date(a.getFullYear()-a.getFullYear()%10,0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return
 a.setFullYear(a.getFullYear()+10)}},year:{span:1728e7,start:function(a){return 
new 
Date(a.getFullYear(),0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return
 
a.setFullYear(a.getFullYear()+1)}},month:{span:24192e5,start:function(a){return 
new 
Date(a.getFullYear(),a.getMonth(),1)},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)},incr:function(a){return
 a.setMonth(a.getMonth()+1)}},week:{span:6048e5,start:function(a){return new 
Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return
 a.setDate(a.getDate()+7)}},day:{span:864e5,start:function(a){return new 
Date(a.getFullYear(),a.getMont
 
h(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return
 
a.setDate(a.getDate()+1)}},hour:c(60),"30min":c(30),"15min":c(15),"10min":c(10),"5min":c(5),minute:c(1),"30sec":d(30),"15sec":d(15),"10sec":d(10),"5sec":d(5),second:d(1)},b.AUTO_LABEL_ORDER=["decade","year","month","week","day","hour","30min","15min","10min","5min","minute","30sec","15sec","10sec","5sec","second"],b.Area=function(c){function
 d(c){var f;return this instanceof 
b.Area?(f=a.extend({},e,c),this.cumulative=!f.behaveLikeLine,"auto"===f.fillOpacity&&(f.fillOpacity=f.behaveLikeLine?.8:1),d.__super__.constructor.call(this,f),void
 0):new b.Area(c)}var e;return 
h(d,c),e={fillOpacity:"auto",behaveLikeLine:!1},d.prototype.calcPoints=function(){var
 
a,b,c,d,e,f,g;for(f=this.data,g=[],d=0,e=f.length;e>d;d++)a=f[d],a._x=this.transX(a.x),b=0,a._y=function(){var
 
d,e,f,g;for(f=a.y,g=[],d=0,e=f.length;e>d;d++)c=f[d],this.options.behaveLikeLine?g.push(this
 .transY(c)):(b+=c||0,g.push(this.transY(b)));return 
g}.call(this),g.push(a._ymax=Math.max.apply(Math,a._y));return 
g},d.prototype.drawSeries=function(){var 
a,b,c,d,e,f,g,h;for(this.seriesPoints=[],b=this.options.behaveLikeLine?function(){f=[];for(var
 a=0,b=this.options.ykeys.length-1;b>=0?b>=a:a>=b;b>=0?a++:a--)f.push(a);return 
f}.apply(this):function(){g=[];for(var 
a=e=this.options.ykeys.length-1;0>=e?0>=a:a>=0;0>=e?a++:a--)g.push(a);return 
g}.apply(this),h=[],c=0,d=b.length;d>c;c++)a=b[c],this._drawFillFor(a),this._drawLineFor(a),h.push(this._drawPointFor(a));return
 h},d.prototype._drawFillFor=function(a){var b;return 
b=this.paths[a],null!==b?(b+="L"+this.transX(this.xmax)+","+this.bottom+"L"+this.transX(this.xmin)+","+this.bottom+"Z",this.drawFilledPath(b,this.fillForSeries(a))):void
 0},d.prototype.fillForSeries=function(a){var b;return 
b=Raphael.rgb2hsl(this.colorFor(this.data[a],a,"line")),Raphael.hsl(b.h,this.options.behaveLikeLine?.9*b.s:.75*b.s,Math.min(.98,this.options.beha
 veLikeLine?1.2*b.l:1.25*b.l))},d.prototype.drawFilledPath=function(a,b){return 
this.raphael.path(a).attr("fill",b).attr("fill-opacity",this.options.fillOpacity).attr("stroke","none")},d}(b.Line),b.Bar=function(c){function
 d(c){return 
this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this
 instanceof 
b.Bar?(d.__super__.constructor.call(this,a.extend({},c,{parseTime:!1})),void 
0):new b.Bar(c)}return h(d,c),d.prototype.init=function(){return 
this.cumulative=this.options.stacked,"always"!==this.options.hideHover?(this.hover=new
 
b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void
 
0},d.prototype.defaults={barSizeRatio:.75,barGap:3,barColors:["#0b62a4","#7a92a3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],barOpacity:1,barRadius:[0,0,0,0],xLabelMargin:50},d.prototype.calc=function(){var
 a;return this.calcBars(),this.optio
 
ns.hideHover===!1?(a=this.hover).update.apply(a,this.hoverContentForRow(this.data.length-1)):void
 0},d.prototype.calcBars=function(){var 
a,b,c,d,e,f,g;for(f=this.data,g=[],a=d=0,e=f.length;e>d;a=++d)b=f[a],b._x=this.left+this.width*(a+.5)/this.data.length,g.push(b._y=function(){var
 
a,d,e,f;for(e=b.y,f=[],a=0,d=e.length;d>a;a++)c=e[a],null!=c?f.push(this.transY(c)):f.push(null);return
 f}.call(this));return g},d.prototype.draw=function(){var 
a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries()},d.prototype.drawXAxis=function(){var
 
a,b,c,d,e,f,g,h,i,j,k,l,m;for(j=this.bottom+(this.options.xAxisLabelTopPadding||this.options.padding/2),g=null,f=null,m=[],a=k=0,l=this.data.length;l>=0?l>k:k>l;a=l>=0?++k:--k)h=this.data[this.data.length-1-a],b=this.drawXAxisLabel(h._x,j,h.label),i=b.getBBox(),b.transform("r"+-this.options.xLabelAngle),c=b.getBBox(),b.transform("t0,"+c.height/2+"..."),0!==this.options.xLabelAngle&&(e=-.5*i.width*Math.cos(this.options
 
.xLabelAngle*Math.PI/180),b.transform("t"+e+",0...")),(null==g||g>=c.x+c.width||null!=f&&f>=c.x)&&c.x>=0&&c.x+c.width<this.el.width()?(0!==this.options.xLabelAngle&&(d=1.25*this.options.gridTextSize/Math.sin(this.options.xLabelAngle*Math.PI/180),f=c.x-d),m.push(g=c.x-this.options.xLabelMargin)):m.push(b.remove());return
 m},d.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;return 
c=this.width/this.options.data.length,h=this.options.stacked?1:this.options.ykeys.length,a=(c*this.options.barSizeRatio-this.options.barGap*(h-1))/h,this.options.barSize&&(a=Math.min(a,this.options.barSize)),l=c-a*h-this.options.barGap*(h-1),g=l/2,o=this.ymin<=0&&this.ymax>=0?this.transY(0):null,this.bars=function(){var
 
h,l,p,q;for(p=this.data,q=[],d=h=0,l=p.length;l>h;d=++h)i=p[d],e=0,q.push(function(){var
 
h,l,p,q;for(p=i._y,q=[],j=h=0,l=p.length;l>h;j=++h)n=p[j],null!==n?(o?(m=Math.min(n,o),b=Math.max(n,o)):(m=n,b=this.bottom),f=this.left+d*c+g,this.options.stacked||(f+=j*(a+this.options.
 
barGap)),k=b-m,this.options.verticalGridCondition&&this.options.verticalGridCondition(i.x)&&this.drawBar(this.left+d*c,this.top,c,Math.abs(this.top-this.bottom),this.options.verticalGridColor,this.options.verticalGridOpacity,this.options.barRadius),this.options.stacked&&(m-=e),this.drawBar(f,m,a,k,this.colorFor(i,j,"bar"),this.options.barOpacity,this.options.barRadius),q.push(e+=k)):q.push(null);return
 q}.call(this));return q}.call(this)},d.prototype.colorFor=function(a,b,c){var 
d,e;return"function"==typeof 
this.options.barColors?(d={x:a.x,y:a.y[b],label:a.label},e={index:b,key:this.options.ykeys[b],label:this.options.labels[b]},this.options.barColors.call(this,d,e,c)):this.options.barColors[b%this.options.barColors.length]},d.prototype.hitTest=function(a){return
 
0===this.data.length?null:(a=Math.max(Math.min(a,this.right),this.left),Math.min(this.data.length-1,Math.floor((a-this.left)/(this.width/this.data.length))))},d.prototype.onGridClick=function(a,b){var
 c;return c=this.hitTes
 
t(a),this.fire("click",c,this.data[c].src,a,b)},d.prototype.onHoverMove=function(a){var
 b,c;return 
b=this.hitTest(a),(c=this.hover).update.apply(c,this.hoverContentForRow(b))},d.prototype.onHoverOut=function(){return
 this.options.hideHover!==!1?this.hover.hide():void 
0},d.prototype.hoverContentForRow=function(a){var 
b,c,d,e,f,g,h,i;for(d=this.data[a],b="<div 
class='morris-hover-row-label'>"+d.label+"</div>",i=d.y,c=g=0,h=i.length;h>g;c=++g)f=i[c],b+="<div
 class='morris-hover-point' style='color: "+this.colorFor(d,c,"label")+"'>\n  
"+this.options.labels[c]+":\n  
"+this.yLabelFormat(f)+"\n</div>";return"function"==typeof 
this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),e=this.left+(a+.5)*this.width/this.data.length,[b,e]},d.prototype.drawXAxisLabel=function(a,b,c){var
 d;return 
d=this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill
 ",this.options.gridTextColor)},d.prototype.drawBar=function(a,b,c,d,e,f,g){var 
h,i;return 
h=Math.max.apply(Math,g),i=0===h||h>d?this.raphael.rect(a,b,c,d):this.raphael.path(this.roundedRect(a,b,c,d,g)),i.attr("fill",e).attr("fill-opacity",f).attr("stroke","none")},d.prototype.roundedRect=function(a,b,c,d,e){return
 
null==e&&(e=[0,0,0,0]),["M",a,e[0]+b,"Q",a,b,a+e[0],b,"L",a+c-e[1],b,"Q",a+c,b,a+c,b+e[1],"L",a+c,b+d-e[2],"Q",a+c,b+d,a+c-e[2],b+d,"L",a+e[3],b+d,"Q",a,b+d,a,b+d-e[3],"Z"]},d}(b.Grid),b.Donut=function(c){function
 
d(c){this.resizeHandler=f(this.resizeHandler,this),this.select=f(this.select,this),this.click=f(this.click,this);var
 d=this;if(!(this instanceof b.Donut))return new 
b.Donut(c);if(this.options=a.extend({},this.defaults,c),this.el="string"==typeof
 
c.element?a(document.getElementById(c.element)):a(c.element),null===this.el||0===this.el.length)throw
 new Error("Graph placeholder not found.");void 
0!==c.data&&0!==c.data.length&&(this.raphael=new Raphael(this.el[0]),thi
 s.options.resize&&a(window).bind("resize",function(){return 
null!=d.timeoutId&&window.clearTimeout(d.timeoutId),d.timeoutId=window.setTimeout(d.resizeHandler,100)}),this.setData(c.data))}return
 
h(d,c),d.prototype.defaults={colors:["#0B62A4","#3980B5","#679DC6","#95BBD7","#B0CCE1","#095791","#095085","#083E67","#052C48","#042135"],backgroundColor:"#FFFFFF",labelColor:"#000000",formatter:b.commas,resize:!1},d.prototype.redraw=function(){var
 
a,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;for(this.raphael.clear(),c=this.el.width()/2,d=this.el.height()/2,n=(Math.min(c,d)-10)/3,l=0,u=this.values,o=0,r=u.length;r>o;o++)m=u[o],l+=m;for(i=5/(2*n),a=1.9999*Math.PI-i*this.data.length,g=0,f=0,this.segments=[],v=this.values,e=p=0,s=v.length;s>p;e=++p)m=v[e],j=g+i+a*(m/l),k=new
 
b.DonutSegment(c,d,2*n,n,g,j,this.data[e].color||this.options.colors[f%this.options.colors.length],this.options.backgroundColor,f,this.raphael),k.render(),this.segments.push(k),k.on("hover",this.select),k.on("click",this.cl
 
ick),g=j,f+=1;for(this.text1=this.drawEmptyDonutLabel(c,d-10,this.options.labelColor,15,800),this.text2=this.drawEmptyDonutLabel(c,d+10,this.options.labelColor,14),h=Math.max.apply(Math,this.values),f=0,w=this.values,x=[],q=0,t=w.length;t>q;q++){if(m=w[q],m===h){this.select(f);
+break}x.push(f+=1)}return x},d.prototype.setData=function(a){var b;return 
this.data=a,this.values=function(){var 
a,c,d,e;for(d=this.data,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(parseFloat(b.value));return
 e}.call(this),this.redraw()},d.prototype.click=function(a){return 
this.fire("click",a,this.data[a])},d.prototype.select=function(a){var 
b,c,d,e,f,g;for(g=this.segments,e=0,f=g.length;f>e;e++)c=g[e],c.deselect();return
 
d=this.segments[a],d.select(),b=this.data[a],this.setLabels(b.label,this.options.formatter(b.value,b))},d.prototype.setLabels=function(a,b){var
 c,d,e,f,g,h,i,j;return 
c=2*(Math.min(this.el.width()/2,this.el.height()/2)-10)/3,f=1.8*c,e=c/2,d=c/3,this.text1.attr({text:a,transform:""}),g=this.text1.getBBox(),h=Math.min(f/g.width,e/g.height),this.text1.attr({transform:"S"+h+","+h+","+(g.x+g.width/2)+","+(g.y+g.height)}),this.text2.attr({text:b,transform:""}),i=this.text2.getBBox(),j=Math.min(f/i.width,d/i.height),this.text2.attr({transform:"S"+j+","+j+","+(i.x+i.width/2
 )+","+i.y})},d.prototype.drawEmptyDonutLabel=function(a,b,c,d,e){var f;return 
f=this.raphael.text(a,b,"").attr("font-size",d).attr("fill",c),null!=e&&f.attr("font-weight",e),f},d.prototype.resizeHandler=function(){return
 
this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.DonutSegment=function(a){function
 
b(a,b,c,d,e,g,h,i,j,k){this.cx=a,this.cy=b,this.inner=c,this.outer=d,this.color=h,this.backgroundColor=i,this.index=j,this.raphael=k,this.deselect=f(this.deselect,this),this.select=f(this.select,this),this.sin_p0=Math.sin(e),this.cos_p0=Math.cos(e),this.sin_p1=Math.sin(g),this.cos_p1=Math.cos(g),this.is_long=g-e>Math.PI?1:0,this.path=this.calcSegment(this.inner+3,this.inner+this.outer-5),this.selectedPath=this.calcSegment(this.inner+3,this.inner+this.outer),this.hilight=this.calcArc(this.inner)}return
 
h(b,a),b.prototype.calcArcPoints=function(a){return[this.cx+a*this.sin_p0,this.cy+a*this.cos_p0,this.cx+a*this.sin_p1,this.c
 y+a*this.cos_p1]},b.prototype.calcSegment=function(a,b){var 
c,d,e,f,g,h,i,j,k,l;return 
k=this.calcArcPoints(a),c=k[0],e=k[1],d=k[2],f=k[3],l=this.calcArcPoints(b),g=l[0],i=l[1],h=l[2],j=l[3],"M"+c+","+e+("A"+a+","+a+",0,"+this.is_long+",0,"+d+","+f)+("L"+h+","+j)+("A"+b+","+b+",0,"+this.is_long+",1,"+g+","+i)+"Z"},b.prototype.calcArc=function(a){var
 b,c,d,e,f;return 
f=this.calcArcPoints(a),b=f[0],d=f[1],c=f[2],e=f[3],"M"+b+","+d+("A"+a+","+a+",0,"+this.is_long+",0,"+c+","+e)},b.prototype.render=function(){var
 a=this;return 
this.arc=this.drawDonutArc(this.hilight,this.color),this.seg=this.drawDonutSegment(this.path,this.color,this.backgroundColor,function(){return
 a.fire("hover",a.index)},function(){return 
a.fire("click",a.index)})},b.prototype.drawDonutArc=function(a,b){return 
this.raphael.path(a).attr({stroke:b,"stroke-width":2,opacity:0})},b.prototype.drawDonutSegment=function(a,b,c,d,e){return
 
this.raphael.path(a).attr({fill:b,stroke:c,"stroke-width":3}).hover(d).click(e)},b.prot
 otype.select=function(){return this.selected?void 
0:(this.seg.animate({path:this.selectedPath},150,"<>"),this.arc.animate({opacity:1},150,"<>"),this.selected=!0)},b.prototype.deselect=function(){return
 
this.selected?(this.seg.animate({path:this.path},150,"<>"),this.arc.animate({opacity:0},150,"<>"),this.selected=!1):void
 0},b}(b.EventEmitter)}).call(this);
\ No newline at end of file

Reply via email to