/**
 * Handle: easyChartBuilder
 * Version: 0.4
 * Enqueue: true
 *
 * Author: dyerware
 * Author URI: http://www.dyerware.com
 * Copyright © 2009  dyerware
 * Support: support@dyerware.com)
 */
 

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


function easyChartBuilder()
{  	
}
    
easyChartBuilder.prototype.pieChart = function(chartId, chartImg, chartWidth, chartHeight, chartHandle)
{
    var chartTitle = chartHandle["title"];
    
    var tempString = chartHandle["groupnames"];

    var tempGroupNames = tempString.split(",");
    var chartGroups = tempGroupNames.length;
    var chartGroupNames = this.constructList(tempString, ",", "|",0, false);
    
    if (chartHeight >= chartWidth)     
        {chartHeight = parseInt(chartWidth / 2.0);}
        
    tempString = chartHandle["groupcolors"];
    var chartColors = this.constructList(tempString, ",", ",",tempGroupNames.length, false);

    var groupName;
    var chartValues = new Array(chartGroups);
    for (var i = 0; i < chartGroups; i++)
    {
        groupName = "group" + (i+1) + "values";
        tempString = chartHandle[groupName];
        
        chartValues[i] = this.extractValues(tempString, ",", 1); 
    }

    var hideChartData = chartHandle["hidechartdata"];
    if (hideChartData == false)
    {
        var tblIdContainer = document.getElementById(chartId + "_data");
        var tblId = document.getElementById(chartId + "_dataTable");
        if (tblId == undefined && tblIdContainer != undefined)
        {
            tblId = document.createElement('div');
            tblId.setAttribute('id',chartId + '_dataTable');  
                                
            var chartColorOrig = chartHandle["groupcolors"].split(",");
            var chartValueTitleOrig = chartHandle["valuenames"].split(",");
            var chartCSS = chartHandle["datatablecss"];
            tblId.innerHTML = this.buildChartDataPie(chartCSS, tempGroupNames, 
                chartColorOrig, chartValueTitleOrig, chartValues);
            tblIdContainer.appendChild(tblId);
        }
    }
            
    var maxVal = this.normalizeValues(chartValues);   
    var chartValuesString = this.encodeValues(chartValues, ""); 
    var chartColor = chartHandle["chartcolor"];    
    var chartFadeColor = chartHandle["chartfadecolor"];                  
	 	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," + chartColor + ",0.2," + chartFadeColor + ",0|bg,s,00000000" + 
 	"&chtt=" + chartTitle + 
 	"&chl=" + chartGroupNames +
 	"&chco=" + chartColors + "&chd=e:" + chartValuesString;
    
        chartImg.src = url_src;
};
    
easyChartBuilder.prototype.vertBarChart = function(chartId, chartImg, chartWidth, chartHeight, chartHandle)
{
    var chartTitle = chartHandle["title"];
    
    var tempString = chartHandle["groupnames"];
    var tempGroupNames = tempString.split(",");
    var chartGroups = tempGroupNames.length;
    var chartGroupNames = this.constructList(tempString, ",", "|",0, false);
    
    tempString = chartHandle["groupcolors"];
    var chartColors = this.constructList(tempString, ",", ",",0, false);
    
    tempString = chartHandle["valuenames"];
    var chartValueNames = "|" + this.constructList(tempString, ",", "|",0, false) + "|";

    var groupName;
    var chartValues = new Array(chartGroups);
    for (var i = 0; i < chartGroups; i++)
    {
        groupName = "group" + (i+1) + "values";
        tempString = chartHandle[groupName];
        
        chartValues[i] = this.extractValues(tempString, ",", 0); 
    }
    
    var hideChartData = chartHandle["hidechartdata"];
    if (hideChartData == false)
    {
        var tblIdContainer = document.getElementById(chartId + "_data");
        var tblId = document.getElementById(chartId + "_dataTable");
        if (tblId == undefined && tblIdContainer != undefined)
        {
            tblId = document.createElement('div');
            tblId.setAttribute('id',chartId + '_dataTable');  
                                
            var chartColorOrig = chartHandle["groupcolors"].split(",");
            var chartValueTitleOrig = chartHandle["valuenames"].split(",");
            var chartCSS = chartHandle["datatablecss"];
            tblId.innerHTML = this.buildChartData(chartCSS, tempGroupNames, chartColorOrig, chartValueTitleOrig, chartValues);
            tblIdContainer.appendChild(tblId);
        }
    }
    
    var maxVal = this.normalizeValues(chartValues);   
    var chartValuesString = this.encodeValues(chartValues, ","); 
    var chartColor = chartHandle["chartcolor"]; 
    var chartFadeColor = chartHandle["chartfadecolor"];                    
	 	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," + chartColor + ",0.2," + chartFadeColor + ",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;
};

    
easyChartBuilder.prototype.horizBarChart = function(chartId, chartImg, chartWidth, chartHeight, chartHandle)
{
    var chartTitle = chartHandle["title"];
    
    var tempString = chartHandle["groupnames"];
    var tempGroupNames = tempString.split(",");
    var chartGroups = tempGroupNames.length;
    var chartGroupNames = this.constructList(tempString, ",", "|",0, false);
        
    tempString = chartHandle["groupcolors"];
    var chartColors = this.constructList(tempString, ",", ",",0, false);
    
    tempString = chartHandle["valuenames"];
    var chartValueNames = "|" + this.constructList(tempString, ",", "|",0, true) + "|";

    var groupName;
    var chartValues = new Array(chartGroups);
    for (var i = 0; i < chartGroups; i++)
    {
        groupName = "group" + (i+1) + "values";
        tempString = chartHandle[groupName];
        
        chartValues[i] = this.extractValues(tempString, ",", 0); 
    }
    
    var hideChartData = chartHandle["hidechartdata"];
    if (hideChartData == false)
    {
        var tblIdContainer = document.getElementById(chartId + "_data");
        var tblId = document.getElementById(chartId + "_dataTable");
        if (tblId == undefined && tblIdContainer != undefined)
        {
            tblId = document.createElement('div');
            tblId.setAttribute('id',chartId + '_dataTable');  
                                
            var chartColorOrig = chartHandle["groupcolors"].split(",");
            var chartValueTitleOrig = chartHandle["valuenames"].split(",");
            var chartCSS = chartHandle["datatablecss"];
            tblId.innerHTML = this.buildChartData(chartCSS, tempGroupNames, chartColorOrig, chartValueTitleOrig, chartValues);
            tblIdContainer.appendChild(tblId);
        }
    }
    
    var maxVal = this.normalizeValues(chartValues);   
    var chartValuesString = this.encodeValues(chartValues, ",");  
    var chartColor = chartHandle["chartcolor"];
    var chartFadeColor = chartHandle["chartfadecolor"];
	 	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," + chartColor + ",0.2," + chartFadeColor + ",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;
};

easyChartBuilder.prototype.buildChartData = function(css, headers, headerColors, valueTitles, valueGrid)
{
    var output;
    var len = headers.length;

    output = "<table class='" + css + "' border='0' style='text-align:center;' frame='box' align='center' bgcolor='FFFFFF'><thead><tr><td></td>";

    for (var h=0;h<len;h++)
        {output = output + "<th>" + headers[h].trim() + "</th>";}
    output = output + "</tr><tr style='height:4px;'><td></td>";

    for (var i=0;i<len;i++)
        {output = output + "<th style='background: #FFFFFF; background-color:#" + headerColors[i].trim() + "'></th>";}
    output = output + "</tr></thead>";
            
    for (var t = 0; t < valueTitles.length; t++)
    {       
        output = output + "<tr><th align='right'>" + valueTitles[t].trim() + "</th>";
        for (var v = 0; v < valueGrid.length; v++)
            {output = output + "<td>" + valueGrid[v][t] + "</td>";}
        output = output + "</tr>";
    }   

    output = output + "</table>";
    return output;
};
     
easyChartBuilder.prototype.buildChartDataPie = function(css, headers, headerColors, valueTitles, valueGrid)
{
    var output;
    var len = headers.length;
    
    output = "<table  class='" + css + "' border='0' style='text-align:center;' frame='box' align='center' bgcolor='FFFFFF'><thead><tr><td></td>";

    for (var h=0;h<len;h++)
        {output = output + "<th>" + headers[h].trim() + "</th>";}
    output = output + "</tr><tr style='height:4px;'><td></td>";

    for (var i=0;i<len;i++)
        {output = output + "<th style='background-color:#" + headerColors[i].trim() + "'></th>";}
    output = output + "</tr></thead>";
        
    output = output + "<tr><td></td>";      
    for (var t = 0; t < valueGrid.length; t++)
        {output = output + "<td>" + valueGrid[t] + "</td>";}
    
    output = output + "</tr></table>";
    return output;
};
    
easyChartBuilder.prototype.encodeValues =  function(valueGrid, separator)
{
    var chartEncodeMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.';
    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] / chartEncodeMap.length);
            var remainder = valueGrid[t][v] - chartEncodeMap.length * quotient;
            output = output + chartEncodeMap.charAt(quotient) + chartEncodeMap.charAt(remainder);
        }
    }   

    return output;
};
     
easyChartBuilder.prototype.normalizeValues = function(valueGrid)
{
    var len = valueGrid.length;
    var maxVal = 0;
    var t, v, ratio;
    
    for (t = 0; t < len; t++)
    {
        for (v = 0; v < valueGrid[t].length; v++)
            {maxVal = Math.max(valueGrid[t][v] , maxVal);}
    }
    
    ratio = 4095 / maxVal;
    
    for (t = 0; t < len; t++)
    {
        for (v = 0; v < valueGrid[t].length; v++)
            {valueGrid[t][v] = parseInt(valueGrid[t][v] * ratio);}
    }            
    
    return parseInt(maxVal);
};
    
easyChartBuilder.prototype.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] = parseFloat(tempList[t]);    
        if (isNaN(retString[t]))
            {retString[t] = 0;}
    } 
    
    return retString;        
};  
        
easyChartBuilder.prototype.constructList = function(origString, separator, joiner, limit, flipOrder)
{
    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
        {
            if (flipOrder)
                {retString = tempList[t] + joiner + retString;}
            else
                {retString = retString + joiner + tempList[t];}
        }
    }
    
    return retString;
};
    
easyChartBuilder.prototype.wpNewChart= function(chartId, chartHandle)
{
    
    var chartWidth = chartHandle["width"];
    var chartHeight = chartHandle["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["type"]; 
    if (chartType == "pie")
    {
        this.pieChart(chartId, imgId, new_width, new_height, chartHandle);
    }
    else if (chartType == "vertbar")
    {
        this.vertBarChart(chartId, imgId, new_width, new_height, chartHandle);
    }
    else if (chartType == "horizbar")
    {
        this.horizBarChart(chartId, imgId, new_width, new_height, chartHandle);
    }
    else
    {
        alert("Unknown chart type: " + chartType);
        imgId.src = "NO_VALID_CHART_TYPE";
    }   
};

var wpEasyChart = new easyChartBuilder();

