google.load('jquery', '1.3.2');
google.load('visualization', '1', {
    'packages' : [ 'piechart', 'areachart', 'table', 'barchart', 'columnchart' ]
});

var napcs = (function(){
    var widgets = {};
    var waiting = {};
    
    function invokeWhenReady(id, func) {
        if (widgets[id]) {
            func(widgets[id]);
        }
        if (!waiting[id]) {
            waiting[id] = [];
        }
        waiting[id].push(func);
    };
    
    function ready(id, obj) {
        widgets[id] = obj;
        if (waiting[id]) {
            for ( var i = 0; i < waiting[id].length; i++) {
                waiting[id][i](obj);
            }
            delete waiting[id];
        }
    };
    
    function drawChart(id, jsonString, parameters, formats, chartFunc) {
        var data = new google.visualization.DataTable(jsonString, 0.6);
        
        // Format the data
        if (formats) {
            for (var i = 0; i < formats.length; i++) {
                var col = formats[i].col;
                var form = formats[i].format;
                form.format(data, col);
            }
        }
        var chart = widgets[id];
        if (!chart && chartFunc) {
            chart = chartFunc();
        }
        if (chart) {
            chart.draw(data, parameters);
            ready(id, chart);
        }
    }
    
    function removeChart(id) {
        var chart = widgets[id];
        if (chart) {
            delete widgets[id];
        }
    }
    
    function enablePieChart(id, jsonString, parameters, formats) {
        drawChart(id, jsonString, parameters, formats, function() {
            return new google.visualization.PieChart(wicketGet(id));
        });
    }
    
    function enableTimeLine(id, jsonString, parameters, formats) {
        drawChart(id, jsonString, parameters, formats, function() {
            return new google.visualization.AreaChart(wicketGet(id));
        });
    }
    
    function enableTable(id, jsonString, parameters, formats) {
        drawChart(id, jsonString, parameters, formats, function() {
            return new google.visualization.Table(wicketGet(id));
        });
    }
    
    function enableBarChart(id, jsonString, parameters, formats) {
        drawChart(id, jsonString, parameters, formats, function() {
            return new google.visualization.BarChart(wicketGet(id));
        });
    }
    
    function enableColumnChart(id, jsonString, parameters, formats) {
        drawChart(id, jsonString, parameters, formats, function() {
            return new google.visualization.ColumnChart(wicketGet(id));
        });
    }
    
    function registerSelectionCallback(id, url) {
        invokeWhenReady(id, function(chart) {
            google.visualization.events.addListener(chart, 'select', function() {
                var sel = chart.getSelection();
                if (sel[0].row) {
                    wicketAjaxGet(url + '&id=' + id + '&row=' + sel[0].row, function() {}, function() {});
                }
            });
        });
    }
    
    return {
        removeChart: removeChart,
        enablePieChart: enablePieChart,
        enableTimeLine: enableTimeLine,
        enableTable: enableTable,
        enableBarChart: enableBarChart,
        enableColumnChart: enableColumnChart,
        registerSelectionCallback: registerSelectionCallback
    }
})();





