var min = 1000000;
var max = 0;

function getSettings(range)
{
	var legend_layout	= "<legend layout='hide'/>";
	var license			= "<license>ITA4V9313VFO.945CWK-2XOI1X0-7L</license>";
	var context_menu	= "<context_menu about='false' jpeg_url='/imagechart'/>";
	var chart_type		= "<chart_type>line</chart_type>";
	
	var chart_pref		= "<chart_pref line_thickness='3' fill_shape='false' point_size='9' connect='true' />";			
	var series_color 	= "<series_color><color>5bab33</color><color>3972cd</color><color>ff7439</color><color>cc2b41</color></series_color>";
	
	var chart_border	= "<chart_border top_thickness='0' bottom_thickness='0' left_thickness='0' right_thickness='0' color='d7d7d7' />";
	var chart_rect		= "<chart_rect x='60' y='40' height='160' width='525' positive_alpha='0' negative_alpha='5' negative-color='ffffff' />";
	var chart_grid_h	= "<chart_grid_h thickness='1' type='dashed' alpha='15' />";
	
	var chart_grid_v	= "<chart_grid_v thickness='1' type='dashed' alpha='15' />";
	var axis_ticks		= "<axis_ticks category_ticks='false' />";
	var chart_label		= "<chart_label position='hide' font='arial' bold='true' size='24' color='333333' />";
	
	if(range=='week')
		var axis_category	= "<axis_category skip='0' font='arial' size='12' color='555555' />";
	else
		var axis_category	= "<axis_category skip='3' font='arial' size='12' color='555555' />";
	
	min = min -5;
	
	var max_len = max+'';
	max_len = max_len.length - 1;
	max = max + (Math.pow(10,max_len)/2);
	
	var axis_value		= "<axis_value alpha='90' min='"+min+"' max='"+max+"' font='arial' size='13' color='555555' steps='3' orientation='horizontal' />";
	var tooltip 		= "<tooltip size='12' duration='10' opacity='90' />";
	var transition		= "<chart_transition type='none' order='all' />";
	
	if(range=='all_time')
	{
		var chart_pref		= "<chart_pref line_thickness='2' fill_shape='false' point_size='0' />";			
		var chart_grid_v	= "<chart_grid_v thickness='1' type='dashed' alpha='0' />";
		var skipval = Math.ceil(getRange(range)/12);
		var axis_category	= "<axis_category skip='"+skipval+"' font='arial' size='12' color='555555' />";
	}
	
	var combined	= license + scroll + legend_layout + context_menu + tooltip + chart_type + chart_pref + series_color + chart_border + chart_rect + chart_grid_h + chart_grid_v + axis_ticks + chart_label + axis_category + axis_value + transition;
	
	return combined;
}

function getDates(r)
{
	
	//we get got the dates!
	
	var range = getRange(r);
	var start = end_date - range;
	
	var dates = "<row><null/>";
	for (var d=start; d<= end_date; d++ )
	{
		var thedate = new Date(d*1000*86400);
		dates += "<string>" + thedate.format('j M') + "</string>";
	}
	
	dates += "</row>";
	
	return dates;
}

function getRange(r)
{
	switch(r)
	{
		case "week":
			return 7;
		case "month":
			return 30;
		case "all_time":
			return end_date - start_date;
		default:
			return 30;
	}
}

//This function gets the graph for one metric (mostly for compare)

function showTheGraph(artistString, range, metric)
{
	var dates = getDates(range);
	
	var artist_data ="";
	
	//need to go fetch the data :)
	var delt = getRange(range);
	var start = end_date - delt;
	
	var band_data = loadDataForArtists(artistString, range, metric, start);
	
	for(var i =0; i< band_data.length; i++)
	{
		var data = band_data[i];
		artist_data += dataToXML(data, metric, range);
	}
	settings = getSettings(range);
	
	return "<chart>" + settings + "<chart_data>" + dates + artist_data + "</chart_data></chart>";
}

function loadDataForArtists(string, range, metric, start)
{

	var artist_ids = string.split(',');
	var d_metric = "delta_"+metric;
	var url = '/labs/test_ericdb';
	
	var artistArr = new Array();
	
	for(var i=0; i<artist_ids.length; i++)
	{
		$.ajax({
				type:	'GET',
				url:	url+"/"+artist_ids[i]+"/"+d_metric+"/"+start_date+"/"+end_date+"/true", 
				dataType:	'json',
				success: function(data)
				{
				$.each(data.groups, function(index, val){
					//is there enough data?
					var name = val.name;
					var metrics = val.metrics;
					var all_metrics = new Hash();
					$.each(metrics, function(index, metric){
						
						//Get the services associated with this metric
						var services = metric.services;
						
						//Let's create a 'dictionary' object that will store this data
						// total, service1, service2, etc.
						var metric_data = new Hash();
						
						//This will store the total values summed across the services
						var total = new Hash();
						
						$.each(services, function(index, service){
							var date = service.start_day;
							var service_data = service.data;
							var final_value = parseInt(service.final_total);
							
							var service_dictionary = new Hash();
				
					
							$.each(service_data, function(index, value){
							
							service_dictionary.setItem(date, value);
													
							if(!total.hasItem(date))
							{
								
								if(isNaN(value))
									total.setItem(date, 0);
								else
									total.setItem(date, parseInt(value));
							}
							else
							{
								var val1 = total.getItem(date);
								var val2 = parseInt(value);
								
								if(isNaN(val1) && isNaN(val2))
									total.setItem(date, 0);
								else if(isNaN(val1) && !isNaN(val2))
									total.setItem(date, val2);
								else if(!isNaN(val1) && isNaN(val2))
									total.setItem(date, val1);
								else
									total.setItem(date, val1 + val2);
							}
							
							date++;
							
						});
							
							metric_data.setItem('final_'+service.service, final_value);
							metric_data.setItem(service.service, service_dictionary);
							metric_data.setItem('TOTAL', total);
							
							if(total.length>0)
								enough = true;						
						});
						all_metrics.setItem(metric.metric, metric_data);					
					});
					
					//Now that the data is organized, create the new Artist!				
					var newArtist = new Artist(artist_ids[i], name, all_metrics, enough);
					artistArr.push(newArtist);
				});
				
			},
				async: false
			});
	}
	
	return artistArr;
	
	
}

function Artist(band_id, name, metrics, enough)
{
	this.band_id = band_id;
	this.name = name;
	this.metrics = metrics;
}

Artist.prototype.getName = function(){
	return this.name;
}

function dataToXML(data, metric, range)
{
	min = 1000000;
	max = 0;
	
	var artist_data = "<row>";
	artist_data += "<string>" + data.name + "</string>";
	
	var metrics = data.metrics;
	
	var current_metric = "delta_"+metric;
	
	var current_range = range;
	if(metrics.hasItem(current_metric))
	{
		var cur_metric = metrics.getItem(current_metric);
		var total = cur_metric.getItem('TOTAL');
		
		//Let's grab all the data possible going back to June 6, 2009
		
		var r = getRange(range);
		var start = end_date - r;
		
		for (var d=start; d<= end_date; d++ )
		{
			//let's get the tooltips later
			if(total.hasItem(d))
			{
				if(!isNaN(total.getItem(d)) && total.getItem(d) < min && (current_metric !='delta_plays' && current_metric !='delta_views'))
					min = total.getItem(d);
					
				if(!isNaN(total.getItem(d)) && total.getItem(d) > max)
					max = total.getItem(d);
			
				var tooltip = getToolTipBreakdownMonth(cur_metric, d, current_metric);
				
				if(current_range=='all_time')
					var tooltip = getToolTipBreakdownAllTime(cur_metric, d, current_metric);

				tooltip = data.name + "\n" + tooltip;
				
				if(total.getItem(d) >=0 || current_range =='week')
				{
					if(current_range == 'week' && total.getItem(d) <=0)
						artist_data += "<number tooltip='" + tooltip + "'>0</number>";
					else
					{
						artist_data += "<number tooltip='" + tooltip + "'>" + total.getItem(d) + "</number>";
						
						if(total.getItem(d) < min)
							min = total.getItem(d);
					
						if(total.getItem(d) > max)
							max = total.getItem(d);
					}
				}
				else if(isNaN(total.getItem(d)) || (current_metric=='delta_plays' || current_metric == 'delta_views'))
					artist_data += "<null/>";
				else
					artist_data += "<number tooltip='" + tooltip + "'>" + total.getItem(d) + "</number>";
			}
			else
				artist_data += "<number>0</number>";
		}
	}
	
	artist_data += "</row>";
	return artist_data;
}


function getToolTipBreakDownSingle(service, metric, day)
{
	if(current_metric == 'delta_fans')
		var removeOrLost = 'Lost ';
	else
		var removeOrLost = 'Removed ';
	
	if(metric.getItem(day) <0)
		var tool = removeOrLost + commaCoder(metric.getItem(day)*-1) + " " + getMetricByNetwork(current_metric, service) + " \n";
	else
		var tool = commaCoder(metric.getItem(day)) + " New " + getMetricByNetwork(current_metric, service) + " \n";
	var thedate = new Date(day*1000*86400);

	return tool + thedate.format('D M j Y');
}


function getToolTipBreakdownAllTime(metric, day, current_metric)
{
	var total = metric.getItem('TOTAL');
	
	if(current_metric == 'delta_fans')
		var removeOrLost = 'Lost';
	else
		var removeOrLost = 'Removed';
	
	if(total.getItem(day) <0)
	{
		if(removeOrLost =='Lost')
			var tool = 'Lost ' + commaCoder(total.getItem(day)*-1) + " " + getPrettyMetric(current_metric) + " \n";
		else
			var tool = commaCoder(total.getItem(day)*-1) + " Removed " + getPrettyMetric(current_metric) + " \n";
			
	}
	else
		var tool = commaCoder(total.getItem(day)) + " New " + getPrettyMetric(current_metric) + " \n";
	
	var thedate = new Date(day*1000*86400);
	return tool + thedate.format('D M j Y');
}

/*
	This function returns the tooltip information for the metric and a given day. 
	Month view uses this.
*/


function getToolTipBreakdownMonth(metric, day, current_metric)
{
	var total = metric.getItem('TOTAL');
	
	var active_services = getCurrentActiveServices();
	var services = active_services[0]; 
	var services_pretty = active_services[1]; 
	
	if(current_metric == 'delta_fans')
		var removeOrLost = 'Lost ';
	else
		var removeOrLost = 'Removed ';
	
	
	if(total.getItem(day) <0)
	{
		if(removeOrLost =='Lost')
			var tool = 'Lost ' + commaCoder(total.getItem(day)*-1) + " " + getPrettyMetric(current_metric) + " \n";
		else
			var tool = commaCoder(total.getItem(day)*-1) + " Removed " + getPrettyMetric(current_metric) + " \n";
			
	}
	else
		var tool = commaCoder(total.getItem(day)) + " New " + getPrettyMetric(current_metric) + " \n";
	
	for(var i=0; i< services.length; i++)
	{
		if(metric.hasItem(services[i]))
		{
			var service = metric.getItem(services[i]);
			var per = Math.round(100*(service.getItem(day)/total.getItem(day)));
			
			if(per>=100)
				per=100
			
			if(per>0)
				tool += per + "% " + services_pretty[i] + "\n";
			
		}
	}
	
	var thedate = new Date(day*1000*86400);
	return tool + thedate.format('D M j Y');
		
}

function getPrettyMetric(metric)
{
	switch(metric)
	{
		case "delta_plays":
			return "Plays";
		case "delta_fans":
			return "Fans";
		case "delta_views":
			return "Views";
		case "delta_comments":
			return "Comments";
		default:
			return "Unknown Metric";
	}
}

var prettyNames = new Hash();
function getPrettyService(service_name)
{
	var active_services = getCurrentActiveServices();
	var services = active_services[0]; 
	var services_pretty = active_services[1]; 
	
	if(prettyNames.length ==0)
		for(var i=0; i<services.length; i++)
			prettyNames.setItem(services[i], services_pretty[i]);
	
	if(prettyNames.hasItem(service_name))
		return prettyNames.getItem(service_name);
	else
		return "Total";
}

function commaCoder(num)
{
	num += '';
	x = num.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
	
}