/**
 * Handle: easyChartBuilder
 * Version: 0.1
 * Enqueue: true
 *
 * Author: dyerware
 * Author URI: http://www.dyerware.com
 * Copyright 2009  dyerware  (email : support@dyerware.com)
 */
 
 
var easyChartBuilder = Class.create();

String.prototype.trim = function () 
{
    return this.replace(/^\s*/, "").replace(/\s*$/, "");
}


easyChartBuilder.prototype = 
{  	
    
    chart             : {},
    chartEncodeMap    : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.',
    
    initialize        : function() 
    {
    },
    
    pieChart: function(chartImg, chartWidth, chartHeight, chartHandle)
    {
        var chartTitle = chartHandle.get("title");
        
        var tempString = chartHandle.get("groupnames");

        var tempGroupNames = tempString.split(",");
        var chartGroups = tempGroupNames.length;
        var chartGroupNames = this.constructList(tempString, ",", "|",0);
       
        if (chartHeight >= chartWidth)     
            chartHeight = parseInt(chartWidth / 2.0);
            
        tempString = chartHandle.get("groupcolors");
        var chartColors = this.constructList(tempString, ",", ",",0);
 
        var groupName;
        var chartValues = new Array(chartGroups);
        for (var i = 0; i < chartGroups; i++)
        {
            var groupName = "group" + (i+1) + "values";
            tempString = chartHandle.get(groupName);
            
            chartValues[i] = this.extractValues(tempString, ",", 1); 
        }
        
        var maxVal = this.normalizeValues(chartValues);   
        var chartValuesString = this.encodeValues(chartValues, ""); 
                               
  	 	var url_src ="http://chart.apis.google.com/chart?cht=p&chbh=r,0.2,1.0&chs=" + chartWidth + "x" + chartHeight + 
	 	"&chma=10,10,10,40" +
	 	"&chf=c,lg,90,FFFFFF,0.2,DDDDDD,0|bg,s,00000000" + 
	 	"&chtt=" + chartTitle + 
	 	"&chl=" + chartGroupNames +
	 	"&chco=" + chartColors + "&chd=e:" + chartValuesString;
        
         chartImg.src = url_src;
    },
    
    vertBarChart: function(chartImg, chartWidth, chartHeight, chartHandle)
    {
        var chartTitle = chartHandle.get("title");
        
        var tempString = chartHandle.get("groupnames");
        var tempGroupNames = tempString.split(",");
        var chartGroups = tempGroupNames.length;
        var chartGroupNames = this.constructList(tempString, ",", "|",0);
       
        tempString = chartHandle.get("groupcolors");
        var chartColors = this.constructList(tempString, ",", ",",0);
        
        tempString = chartHandle.get("valuenames");
        var chartValueNames = "|" + this.constructList(tempString, ",", "|",0) + "|";
 
        var groupName;
        var chartValues = new Array(chartGroups);
        for (var i = 0; i < chartGroups; i++)
        {
            var groupName = "group" + (i+1) + "values";
            tempString = chartHandle.get(groupName);
            
            chartValues[i] = this.extractValues(tempString, ",", 0); 
        }
        
        var maxVal = this.normalizeValues(chartValues);   
        var chartValuesString = this.encodeValues(chartValues, ","); 
                               
  	 	var url_src ="http://chart.apis.google.com/chart?cht=bvg&chbh=r,0.2,1.0&chs=" + chartWidth + "x" + chartHeight + 
	 	"&chma=10,10,10,40" +
	 	"&chf=c,lg,90,FFFFFF,0.2,DDDDDD,0|bg,s,00000000" + 
	 	"&chtt=" + chartTitle + 
	 	"&chdl=" + chartGroupNames + "&chdlp=b" +
	 	"&chco=" + chartColors + "&chd=e:" + chartValuesString +
	 	"&chxt=y,x&chxr=0,0," + maxVal + "&chxl=1:" + chartValueNames;
        
         chartImg.src = url_src;
    },

    
    horizBarChart: function(chartImg, chartWidth, chartHeight, chartHandle)
    {
        var chartTitle = chartHandle.get("title");
        
        var tempString = chartHandle.get("groupnames");
        var tempGroupNames = tempString.split(",");
        var chartGroups = tempGroupNames.length;
        var chartGroupNames = this.constructList(tempString, ",", "|",0);
          
        tempString = chartHandle.get("groupcolors");
        var chartColors = this.constructList(tempString, ",", ",",0);
        
        tempString = chartHandle.get("valuenames");
        var chartValueNames = "|" + this.constructList(tempString, ",", "|",0) + "|";

        var groupName;
        var chartValues = new Array(chartGroups);
        for (var i = 0; i < chartGroups; i++)
        {
            var groupName = "group" + (i+1) + "values";
            tempString = chartHandle.get(groupName);
            
            chartValues[i] = this.extractValues(tempString, ",", 0); 
        }
        
        var maxVal = this.normalizeValues(chartValues);   
        var chartValuesString = this.encodeValues(chartValues, ",");  
  	 	var url_src ="http://chart.apis.google.com/chart?cht=bhg&chbh=r,0.2,1.0&chs=" + chartWidth + "x" + chartHeight + 
	 	"&chma=10,10,10,40" +
	 	"&chf=c,lg,90,FFFFFF,0.2,DDDDDD,0|bg,s,00000000" + 
	 	"&chtt=" + chartTitle + 
	 	"&chdl=" + chartGroupNames + "&chdlp=b" +
	 	"&chco=" + chartColors + "&chd=e:" + chartValuesString +
	 	"&chxt=x,y&chxr=0,0," + maxVal + "&chxl=1:" + chartValueNames;
        
         chartImg.src = url_src;
    },
 
    encodeValues: function(valueGrid, separator)
    {
        var output = "";
        var len = valueGrid.length;
        
        for (var t = 0; t < len; t++)
        {
            if (t > 0)
                output = output + separator;
                
            for (var v = 0; v < valueGrid[t].length; v++)
            {
                var quotient = Math.floor(valueGrid[t][v] / this.chartEncodeMap.length);
                var remainder = valueGrid[t][v] - this.chartEncodeMap.length * quotient
                output = output + this.chartEncodeMap.charAt(quotient) + this.chartEncodeMap.charAt(remainder);
            }
        }   

        return output;
    },
     
    normalizeValues: function(valueGrid)
    {
        var len = valueGrid.length;
        var maxVal = 0;
        
        for (var t = 0; t < len; t++)
        {
            for (var v = 0; v < valueGrid[t].length; v++)
                maxVal = Math.max(valueGrid[t][v] , maxVal);
        }
        
        if (maxVal > 4095)
        {
            var ratio = maxVal / 4095;
            
            for (var t = 0; t < len; t++)
            {
                for (var v = 0; v < valueGrid[t].length; v++)
                    valueGrid[t][v] = parseInt(valueGrid[t][v] * ratio);
            }
        }  
        else
        {
            var ratio = 4095 / maxVal;
            
            for (var t = 0; t < len; t++)
            {
                for (var v = 0; v < valueGrid[t].length; v++)
                    valueGrid[t][v] = parseInt(valueGrid[t][v] * ratio);
            }           
        }   
        
        return parseInt(maxVal);
    }, 
    
    extractValues: function(origString, separator, limit)
    {
        var retString = new Array();
        var tempList = origString.split(separator);
        
        if (limit == 0 || limit > tempList.length)
            limit = tempList.length;          
            
        for (var t = 0; t < limit; t++)
        {
            retString[t] = parseInt(tempList[t]);    
            if (isNaN(retString[t]))
                retString[t] = 0;
        } 
        
        return retString;        
    },   
        
    constructList: function(origString, separator, joiner, limit)
    {
        var retString = "";
        var tempList = origString.split(separator);
        
        if (limit == 0 || limit > tempList.length)
            limit = tempList.length;          
            
        for (var t = 0; t < limit; t++)
        {
            // Trim any excess spaces back
            tempList[t] = tempList[t].trim();
            if (t == 0)
                retString = tempList[t];
            else
                retString = retString + joiner + tempList[t];
        }
        
        return retString;
    },
    
    wpNewChart: function(chartId, chartInfo)
    {
        var chartHandle = $H(chartInfo);  
        var chartWidth = chartHandle.get("width");
        var chartHeight = chartHandle.get("height");      
	    var img_ratio = chartHeight / chartWidth;
	    
	    // Fit chart to size (bigger or smaller) 
	    var mydiv = document.getElementById(chartId);
	    var new_width = mydiv.offsetWidth;
	    var new_height = chartHeight * (new_width / chartWidth);
	
	   	// Prune by maximum google chart size 
	   	if (new_width * new_height > 300000)
	   	{
	   		var adjust = 300000 / (new_width * new_height);
	   		adjust = Math.sqrt(adjust);
	   		new_width = new_width * adjust;
	   		new_height = new_height * adjust;
	   	}
	   
	    new_width = parseInt(new_width.toString());
	   	new_height = parseInt(new_height.toString());

	   	var imgId = document.getElementById(chartId+"_img");
	   	
	   	var chartType = chartHandle.get("type"); 
        if (chartType == "pie")
        {
            this.pieChart(imgId, new_width, new_height, chartHandle);
        }
        else if (chartType == "vertbar")
        {
            this.vertBarChart(imgId, new_width, new_height, chartHandle);
        }
        else if (chartType == "horizbar")
        {
            this.horizBarChart(imgId, new_width, new_height, chartHandle);
        }
        else
        {
            alert("Unknown chart type: " + chartType);
            imgId.src = "NO_VALID_CHART_TYPE";
        }   
    }
}

var wpEasyChart = new easyChartBuilder();
