// originally taken from:  		http://apps.pachube.com/google_viz
// modified with ideas from:	http://community.pachube.com/node/182

function jsonToGDataTable(retdata, tzoffset, lbl) {
	var d; 
	var val; 
	var data = new google.visualization.DataTable(); 
	data.addColumn('datetime', 'Date'); 
	var graphs = retdata.length;
	
	for (var k=0; k<graphs; k++){ 
		data.addColumn('number', lbl[k]);
	} 
	for ( var i in retdata[0].time ) { 
		var timestamp = retdata[0].time[i]; 
		if (typeof(timestamp) != "function") { 
			var thisrow = data.addRow(); 
			var ts_parts = timestamp.split('T'); 
			var d_parts = ts_parts[0].split('-'); 
			var t_parts = ts_parts[1].split(':'); 
			d = new Date(parseInt(d_parts[0],10), parseInt(d_parts[1],10)-1 ,parseInt(d_parts[2],10), parseInt(t_parts[0],10)+tzoffset, parseInt(t_parts[1],10), parseInt(t_parts[2],10) ); 
			data.setValue(thisrow, 0, d); 
			for (var j=0;j<graphs;j++){ 
				val = parseFloat(retdata[j].value[i]); 
				data.setValue(thisrow, j+1, val); 
			}
		}
	} 
	return data;
}

function requestData(viz, f, ds) {
	var headID = document.getElementsByTagName('head')[0]; 
	var newScript = document.createElement('script'); 
	newScript.type = 'text/javascript'; 
	newScript.src = 'http://apps.pachube.com/history/archive_json.php?f='+f+'&d='+ds+'&callback=doViz_'+viz+'.process'; 
	headID.appendChild(newScript); 
}	

function drawGraph(viz, p_min, p_max, tz, p_col, lbl, jsdata) {
	var data = jsonToGDataTable(jsdata,tz,lbl); 
	var chart = new google.visualization.AnnotatedTimeLine(document.getElementById('vis_'+viz)); 
	if ((p_min !== undefined) && (p_max !== undefined)) {
		chart.draw(data, {displayAnnotations:true,thickness:1,scaleType:'allmaximized',min:p_min,max:p_max,displayExactValues:true,fill:10,colors:p_col}); 
	}
	else {
		chart.draw(data, {displayAnnotations:true,thickness:1,displayExactValues:true,fill:10,colors:p_col}); 
	}
}

function createViz(vizname,feed,datastream,dslabel,width,height,color,tzoffset,min,max){ 

var maxmin=""; 
var scriptsrc="";

if ((min !== undefined) && (max !== undefined)) {
	maxmin="scaleType:'allmaximized',min:"+min+",max:"+max+","; 
}
if (tzoffset === undefined) {
	tzoffset = 0;
}

var feed_setup="";
var datastream_setup="";
var m_color="[";
var m_label="[";
var first_feed;

// make pretty
first_feed =  (feed[0].length !== undefined) ? feed[0][0] : feed[0];

for (var i=0;i<feed.length;i++){
	if (feed[i].length !== undefined) {
		for (var j=0; j < feed[i].length; j++) {
			if (j===0) { 
				feed_setup+="feed["+i+"]=[];";
				datastream_setup+="datastream["+i+"]=[];";
			}
			feed_setup+="feed["+i+"]["+j+"]="+feed[i][j]+";";
			datastream_setup+="datastream["+i+"]["+j+"]="+datastream[i][j]+";";
		}
	}
	else { 
		feed_setup+="feed["+i+"]="+feed[i]+";";
		datastream_setup+="datastream["+i+"]="+datastream[i]+";";
	}
 }
for (var i=0;i<datastream.length;i++){
	m_color+="'#"+color[i]+"'";
	m_label+="'"+dslabel[i]+"'";
	if (i<(datastream.length-1)) {
		m_color+=",";
		m_label+=",";
	}
}
m_color+="]";
m_label+="]";

scriptsrc="<script type=\"text\/javascript\"> \
	function doViz_"+vizname+" () { \
			var feed=[]; \
			var datastream=[]; \
			"+feed_setup+datastream_setup+" \
			var lbl="+m_label+"; \
			var color="+m_color+"; \
			var maindata = []; \
			var tempdata; \
			var i = 0; var j; \
			var data; \
			google.load(\'visualization\',\'1\',{packages:[\'annotatedtimeline\']}); \
			function drawVisualization(){ \
				if ((feed[i] !== undefined) && (feed[i].length !== undefined)) { \
					j = 0; \
					requestData(\'"+vizname+"\', feed[i][j], datastream[i][j]); \
				} \
				else { \
					j = null; \
					requestData(\'"+vizname+"\', feed[i], datastream[i]); \
				} \
			} \
			doViz_"+vizname+".process = function (archive) { \
				var val1; var val2; var total; \
				if (j !== null) {	\
					if (j === 0) { \
						tempdata = archive;	\
					} \
					else  { \
						for (var x in archive.value) {	\
							val1 = parseFloat(archive.value[x]);	\
							val2 = parseFloat(tempdata.value[x]); \
							total = val1 + val2; \
							tempdata.value[x] = total; \
						} \
					} \
					j++; \
					if (feed[i][j] !== undefined) { \
						requestData(\'"+vizname+"\', feed[i][j], datastream[i][j]); \
						return; \
					} \
					else { \
						maindata.push(tempdata); \
						tempdata = null; \
						j = null; \
					} \
				} \
				else { \
					maindata.push(archive); \
				} \
				i++; j=0; \
				if (feed[i] !== undefined) { \
					if (feed[i][j] !== undefined) { \
						requestData(\'"+vizname+"\', feed[i][j], datastream[i][j]); \
					} \
					else { \
						j=null;  \
						requestData(\'"+vizname+"\', feed[i], datastream[i]); \
					} \
				} \
				else { \
					drawGraph(\'"+vizname+"\',"+min+","+max+","+tzoffset+",color,lbl,maindata); \
				}\
			} ;\
			google.setOnLoadCallback(drawVisualization); \
	} \
	doViz_"+vizname+"(); \
			</script> \
			<div id=\"vis_"+vizname+"\" style=\"width:"+width+"px; height:"+height+"px; font-size:small;\"></div> \
			<div style=\"width:"+width+"px; background-color:#fff; margin:3px; padding-top:6px;\"> \
				<a href=\"http://www.pachube.com/feeds/"+first_feed+"\" target=\"_new\"> <img src=\"http://apps.pachube.com/google_viz/powered_by_pachube.png\" alt=\"powered by pachube!\" border=\"0\" style=\"\"> \
			</a></div>";

if (typeof(google) == 'undefined'){ 
	document.write("<script type=\"text/javascript\" src=\"http://www.google.com/jsapi\"></script>"); 
} 
document.write(scriptsrc);}