
var global_items = null;

function get_label(path){
	var m = path.match(/\/([^\/]*)$/);
	if(m && m[1]) return m[1];
	return path;
}

function make_chart_url(args){
	var url = "http://chart.apis.google.com/chart?";
	var first = true;
	for(var i in args){
		if(!first) url+="&";
		first = false;		
		url+=i+"="+args[i];		
	}
	return url;
}

function process_data(items,slotname){
	var data = [];
	var max = null;
	var min = null;
	for(var i in items){
		if(!items[i].slots) continue;
		var x = to_int(items[i].slots[slotname]);
		if(!max || x > max) max = x;
		if(!min || x < min) min = x;
		data.push(x);
	}
	var range = max - min;
	min -= range / 20;  // make some space
	if(!global_settings.cliporigin) min = 0;
	var encoded = simpleEncode(data,min,max);
	return {max:max,min:min,data:encoded};
}

function to_int(x){
	if(!x) return null;
	x = x[0];
	if(!x) return null;
	x = x.replace(/,/g,"");
	var num = parseInt(x);
	if(num) return num;
	for(var i = 1; i < x.length; i++){
		num = parseInt(x.substring(i));
		if(num) return num;
	}
	return null;
}

function set_items(additems){
  global_items = additems;
  mashmaker_widget_resizenotify();
}

function mashmaker_widget_resizenotify(){
	var size = clip_size();
 	var url = make_url(global_items,size.width,size.height);	
	document.getElementById("img").setAttribute("src", url);
	if(global_settings.title){
		mashmaker.setName(global_settings.title + " - Google Charts");
	}
	mashmaker.done();
}

function clip_size(){
	var width = window.innerWidth;
	var height = window.innerHeight;
	if(width * height > 250000){
		height = parseInt(250000/width);		
	}
	return {width:width,height:height};
}

function bar_concat(list){
	var s = "";
	for(var i in list){
		var x = list[i];
		if(global_settings.namelength && x.length > global_settings.namelength){
			x = x.substring(0,global_settings.namelength)+"...";
		}
		x = encodeURIComponent(x);
		if(s) s += "|";
		s+=x;
	}
	return s; 
}

function group_by_x(items){
	var groups = {};
	for(i in items){
		var item = items[i];
		var key = getstr(item.slots.x);
		if(!groups[key]) groups[key] = {};
		
		for(var j in item.slots.y){
			var col = item.slots.y[j];
			var val = to_int(col.items);
			if(!groups[key][col.path]) groups[key][col.path] = [];
			groups[key][col.path].push(val);						
		}		
	}
	return groups;
}

function aggregate_datasets(groups){
	var min = null;
	var max = null;

	var keys = [];
	for(var key in groups){
		keys.push(key);
	}
	
	var cols = [];
	for(var i = 0; i < global_settings.y.length; i++){
		cols[i] = [];
		var path = global_settings.y[i];
		for(var k = 0; k < keys.length; k++){
			var vals = groups[keys[k]][path];
			var val = apply_op(global_settings.op,vals);
			if(!max || val > max) max = val;
			if(!min || val < min) min = val;			
			cols[i][k] = val;
		}
	}

	if(max == min){
		max = min + 1;
	}
	
	var range = max - min;
	max += range / 20;  // make some space
		
	if(global_settings.cliporigin && min > (range / 20)){
		 min -= range / 20;
	}else if(!global_settings.cliporigin){
  	 min = 0;
	}		
	
	return {max:max,min:min,keys:keys,cols:cols};
}

function encode_datasets(rawdata,min,max){
	var encsets = {};
	for(var i in rawdata){		
		encsets[i] = simpleEncode(rawdata[i],min,max);
	}
	return encsets;
}

// TODO: this is inefficient
function apply_op(op,vals){
	var max = null;
	var min = null;
	var sum = 0;
	var count = 0;
	for(var i in vals){
		if(x === null) continue;
		var x = vals[i];
		if(!max || x > max) max = x;
		if(!min || x < min) min = x;
		sum+=x;
		count++;
	}		
	switch(op){
		case "max": return max;
		case "min": return min;
		case "rng": return max-min;
		case "avg": return sum/count;
		case "cnt": return count;
		case "sum": return sum;
	}
}

function getstr(x){
	if(!x) return null;
	if(!x[0]) return null;
	return x[0];
}

var simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
 
function simpleEncode(valueArray,minValue,maxValue) {
	var range = maxValue - minValue;
	var chartData = [];
	  for (var i = 0; i < valueArray.length; i++) {
	    var currentValue = valueArray[i];
	    if (!isNaN(currentValue) && currentValue >= 0) {
		    chartData.push(simpleEncoding.charAt(Math.round((simpleEncoding.length-1) * (currentValue - minValue) / range)));
	    }
      else {
	      chartData.push('_');
      }
	  }
	return chartData.join('');
}
