// chartviz 0.1 - javascript charting/visualization library - http://jekor.com/chartviz/
// 
// Copyright 2009 Chris Forno
// Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
var CHARTVIZ=CHARTVIZ||{};CHARTVIZ.timeSeries=function(b,a){return{dataColor:"#07C",dataPointRadius:4.5,dataPointHoverRadius:6,labelColor:"#333",textHeight:14,textStrokeWidth:0.2,style:{baseLine:{stroke:"#666"},topLine:{stroke:"#AAA"},gridLine:{stroke:"#CCC","stroke-dasharray":["."]},dataLine:{"stroke-width":4},dataArea:{"stroke-width":0,opacity:0.1},yAxisLabel:{fill:"#222"},xAxisLabel:{fill:"black"},tooltip:{cornerRadius:5,box:{fill:"white",stroke:"#474747","stroke-width":2},date:{fill:"#07C",stroke:"#07C"},unit:{"font-size":"12px"},value:{"font-size":"13px","font-weight":"bold"}}},monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],singleDigitTicks:[[],[1],[1,2],[1,3],[2,4],[2,5],[3,6],[3,7],[4,8],[4,9]],max:function(e){var c=0;for(var d=0;d<e.length;d++){if(e[d]>c){c=e[d]}}return c},reverse:function(c){return c.split("").reverse().join("")},formatNumber:function(c){return this.reverse(this.reverse(c.toString()).replace(/(\d{3})(?=\d)/g,"$1,"))},plotHeight:function(){return b.height-this.textHeight},graphYHelper:function(d){var c=this;return function(e){var f=(e/d)*(c.plotHeight()-c.dataPointHoverRadius-1);return Math.round(c.plotHeight()-(f+1))}},graphXHelper:function(c){return function(d){return Math.round(((d*2+1)/(c*2))*b.width)}},getYAxisTicks:function(f){if(f===0){return[]}var d=Math.floor(Math.log(f)/Math.log(10))+1;if(d===1){return this.singleDigitTicks[f]}else{var e=f/Math.pow(10,d-2);for(var c=5;e>c*2;c+=5){}c*=Math.pow(10,d-2);return[c,c*2]}},getXAxisTicks:function(d){var e=[];if(d<7){for(var c=0;c<d;c++){e.push(c)}}else{var f=Math.max(Math.ceil(d/11),7);for(var c=d;c>0;c-=f){e.unshift(c-1)}}return e},pointDate:function(c,d){return new Date(c.getTime()+(86400000*d))},dateLabel:function(c){return this.monthNames[c.getMonth()]+" "+c.getDate()+", "+c.getFullYear()},drawYAxisLabel:function(c,d){b.text(0,d,this.formatNumber(c)).attr(this.style.yAxisLabel).attr({"text-anchor":"start",stroke:this.gridLineColor,"stroke-width":this.textStrokeWidth});b.text(b.width,d,this.formatNumber(c)).attr(this.style.yAxisLabel).attr({"text-anchor":"end",stroke:this.gridLineColor,"stroke-width":this.textStrokeWidth})},drawGrid:function(m,c,l,i){var j=this.plotHeight();var k=this.getYAxisTicks(this.max(m));if(k.length>0){if(k.length>1){var d=k.shift();b.path("M0,{1}h{0}",b.width,i(d)).attr(this.style.gridLine);this.drawYAxisLabel(d,i(d)+this.textHeight/2+2)}this.drawYAxisLabel(k.shift(),this.textHeight)}var f=this.getXAxisTicks(m.length);var e=$.map(f,function(o){return l(o)});var h=$.map(e,function(o){return"M"+o+",0v"+j});var g=$.map(e,function(o){return"M"+o+","+j+"v"+(this.textHeight-3)});b.path(h.join("")).attr(this.style.gridLine);b.path(g.join("")).attr(this.style.baseLine);for(var n=0;n<f.length;n++){if(b.width-l(f[n])>100){b.text(l(f[n])+4,j+this.textHeight/2+1,this.dateLabel(this.pointDate(c,f[n]))).attr(this.style.xAxisLabel).attr({"text-anchor":"start",stroke:this.labelColor,"stroke-width":this.textStrokeWidth})}}b.path("M0,{1}h{0}",b.width,j).attr(this.style.baseLine)},plotPoints:function(o,k,g){var m="M"+k(0)+","+g(o[0]);for(var f=1;f<o.length;f++){m+="L"+k(f)+","+g(o[f])}b.path(m+"L"+k(o.length-1)+","+this.plotHeight()+"L"+k(0)+","+this.plotHeight()+"Z").attr(this.style.dataArea).attr("fill",this.dataColor);b.path(m).attr(this.style.dataLine).attr("stroke",this.dataColor);var q=b.width/(o.length*this.dataPointRadius*2)>0.5;var d=b.width/o.length;var n=[];for(var e=0;e<o.length;e++){var l=k(e);var h=g(o[e]);var c=b.circle(l,h,this.dataPointRadius);c.attr({fill:this.dataColor,stroke:"white"});if(!q){c.hide()}n.push({x:l,y:h,p:c})}return n},dilate:function(c){c.p.attr({r:this.dataPointHoverRadius,"stroke-width":2})},contract:function(c){c.p.attr({r:this.dataPointRadius,"stroke-width":1})},tooltip:function(d,c,e){return{chart:this,box:b.rect(0,0,0,0,this.style.tooltip.cornerRadius).attr(this.style.tooltip.box).hide(),date:b.text(0,0,"").attr(this.style.tooltip.date).attr({"stroke-width":this.textStrokeWidth,"text-anchor":"start"}).hide(),unit:b.text(0,0,"").attr(this.style.tooltip.unit).attr({fill:this.labelColor,stroke:this.labelColor,"stroke-width":this.textStrokeWidth,"text-anchor":"start"}).hide(),value:b.text(0,0,"").attr(this.style.tooltip.value).attr({fill:this.labelColor,stroke:this.labelColor,"stroke-width":this.textStrokeWidth,"text-anchor":"start"}).hide(),update:function(g){var f=this.chart.pointDate(c,g);this.date.attr("text",this.chart.dayNames[f.getDay()]+", "+this.chart.dateLabel(f));this.unit.attr("text",e);this.value.attr("text",this.chart.formatNumber(d[g]))},width:function(){return Math.max(this.date.getBBox().width,this.unit.getBBox().width+this.value.getBBox().width+5)+14},height:function(){return this.date.getBBox().height+this.value.getBBox().height+10},x:function(g){var f=g-this.width()-12;if(f+this.chart.style.tooltip.box["stroke-width"]<0){f=g+12}return f},y:function(f){var g=f-(2/3)*this.height();if(g+this.chart.style.tooltip.box["stroke-width"]<0){g=this.chart.style.tooltip.box["stroke-width"]}else{if(g+this.height()+this.chart.style.tooltip.box["stroke-width"]>this.chart.plotHeight()){g=this.chart.plotHeight()-this.height()}}return g},hide:function(){this.value.hide();this.unit.hide();this.date.hide();this.box.hide()},show:function(){this.value.show();this.unit.show();this.date.show();this.box.show()},moveTo:function(f,h){var k={x:this.x(f.x),y:this.y(f.y),width:this.width(),height:this.height()};var i={x:k.x+7,y:k.y+this.date.getBBox().height+1};var j={x:k.x+7,y:k.y+this.date.getBBox().height+this.value.getBBox().height-1};var g={x:k.x+this.unit.getBBox().width+10,y:k.y+this.date.getBBox().height+this.value.getBBox().height-1};if(h){this.box.animate(k,100);this.date.animate(i,100);this.unit.animate(j,100);this.value.animate(g,100)}else{this.box.attr(k);this.date.attr(i);this.unit.attr(j);this.value.attr(g)}}}},connectEvents:function(d,f,c){var e=this;var g=d.offset().left;var h=null;d.mousemove(function(j){var i=Math.floor((j.pageX-g)*(c.length/b.width));if(i>=0&&i<c.length){if(i!==h){if(h!==null){e.contract(c[h])}e.dilate(c[i]);f.update(i);if(h===null){f.moveTo(c[i],false);f.show()}else{f.moveTo(c[i],true)}h=i}}else{if(h!==null){e.contract(c[h]);f.hide()}h=null}});d.mouseleave(function(){if(h!==null){e.contract(c[h]);f.hide()}h=null})},plot:function(d,c,g){if(!(d.length>0)){throw"You must provide at least 1 value to plot."}var f=this.graphYHelper(this.max(d));var i=this.graphXHelper(d.length);this.drawGrid(d,c,i,f);var e=this.plotPoints(d,i,f);b.path("M0,0h{0}",b.width).attr(this.style.topLine);var h=this.tooltip(d,c,g);this.connectEvents(a,h,e)}}};