function amProcessCompleted(chart_id, process) {
    var tmp_lst = chart_id.split("_");
    var flashobj_id = "";
    for (var i = 0; i < tmp_lst.length; i++) {
        if (tmp_lst[i] != "chart") {
            flashobj_id += tmp_lst[i];
            flashobj_id += "_";
        }
    }
    flashobj_id += "flashobj";
    var div_id = $("#" + chart_id.replace("_chart", ""));

    if (process != "showAll") {
        if (process != "appendData") $(div_id).data('annotation_binded', 'false');
        document.getElementById(flashobj_id).showAll();
    }
    if (process == "showAll" && $(div_id).data('annotation_binded') == 'false' && !$('#createnew').length > 0) {
        $(div_id).data('annotation_binded', 'true');
        if ($(div_id).attr('id') == $('div[chart_uuid]:data("has_annotation"):visible:last').attr('id')) {
            bind_annotation();
        }
    }
}

function amClickedOnBullet(chart_id, graph_index, value, series, a_lst) {
    var new_chart_id = chart_id.replace(/_chart/, "").replace(/_\d_tab/, "");
    handle_select_annotation(new_chart_id, a_lst);
}

// firefox 3.5.x under Windoz doesn't feel instantiating
// flash objects to its entirety unless it's visible to
// the user. This posts problems to us, since we need the
// call amchart related function.
// Sol'n : Store the arguments to _setSwfSettings and
// _reload_singular_chart_url.
// When the charts become visible, let them complete their
// instantiaton. Then, via amChartInited we force another
// data and setting reload.
var swf_setting_assoc_array = {};

function amChartInited(chart_id) {
    var plugin_id = chart_id.split("_chart")[0];
    var flashobj_id = plugin_id + "_flashobj";
    var setting_str = swf_setting_assoc_array[plugin_id];

    if (setting_str != undefined) {
        document.getElementById(flashobj_id).setSettings(setting_str);
        delete swf_setting_assoc_array[plugin_id];
    }

    $(document).trigger('resend_realtime_data');
}

var point_data_lst = []; // array storing all annotation on a date.
var point_data = {}; // object storing specific annotation.
var editable = false; // submit vs edit variable.


(function($) {

    /////////////////////// AbstractAmChartHandler ///////////////////////


    function AbstractAmChartHandler(element, options) {
        this.inheritedFrom = AbstractChartHandler;
        this.inheritedFrom(element, options);

        // Should generate the XML all dynamically
        this._color_hover = '#99FF00';
        this._line_width = 2;
        var balloon_text_xml_start = '<balloon_text><![CDATA[ {title}: ';
        var balloon_text_xml_middle = '{value}';
        var balloon_text_xml_end = ']]></balloon_text>';

        color_hover_xml = '<color_hover>' + this._color_hover + '</color_hover>';

        this._graph_format_xml_start = balloon_text_xml_start;
        this._graph_format_xml_middle = balloon_text_xml_middle;
        this._graph_format_xml_end = balloon_text_xml_end + color_hover_xml;

        // _last_ajax_get_data_url is obviously used to keep track of the last url that is used for fetching data.
        // Our export functionality depends on it.
        this._last_ajax_get_data_url = null;
    }
    AbstractAmChartHandler.prototype = new AbstractChartHandler();

    $.extend(AbstractAmChartHandler.prototype, {
        // This is a work around hack..
        // AMChart has a bug where if the unit text is a %, you have to escape it the first time, and have to not escape
        // it the second time.
        _get_graph_format_xml: function(prefix, suffix) {
            if (!prefix) {
                prefix = this.prefix;
            }
            if (!suffix) {
                suffix = this.suffix;
            }
            return this._graph_format_xml_start + prefix + this._graph_format_xml_middle + suffix + this._graph_format_xml_end;
        },

        _save_applied_multi_filters: function(filter_idx_lst, filter_name_lst) {
            this._applied_multi_filters = filter_idx_lst;
            this._applied_multi_filter_names = filter_name_lst;
            KtDebug("------->setting _applied_multi_filter_names: " + filter_name_lst); //xxx
            KtDebug(this); //xxx
        },

        _clear_applied_multi_filter: function() {
            this._applied_multi_filters = null;
            this._applied_multi_filter_names = null;
        },

        _set_chart_param: function(name, value) {
            var flashobj_id = this._id + "_flashobj";
            document.getElementById(flashobj_id).setParam(name, value);
        },

        _reload_url_cache_helper: function(new_url) {
            if (this._disable_data_load) {
                return;
            }

            var flashobj_id = this._id + "_flashobj";
            KtDebug("last:" + this._last_ajax_get_data_url); //xxx
            KtDebug("new :" + new_url); //xxx
            //if(this._last_ajax_get_data_url != new_url)
            try {
                var var_dict = this._so.getVariables();
                var_dict['data_file'] = escape(new_url);
                var var_lst = [];
                $.each(var_dict, function(k, v) {
                    var_lst.push(k + "=" + v);
                });

                document.getElementById(flashobj_id).setAttribute("flashvars", var_lst.join("&"));
                document.getElementById(flashobj_id).reloadData(escape(new_url));
            } catch (err) {}
            this._last_ajax_get_data_url = new_url;
        },

        _get_additional_simple_chart_settings_str: function() {
            alert("_get_additional_simple_chart_settings_str not defined");
        },

        _setSwfSettings: function(setting_xml_str) {
            try {
                var flashobj_id = this._id + "_flashobj";
                document.getElementById(flashobj_id).setSettings(setting_xml_str);
                //this._so.addVariable("additional_chart_settings", setting_xml_str);
            } catch (err) {
                swf_setting_assoc_array[this._id] = setting_xml_str;
            }
        },

      bind_events: function() {
        var so = this._so;
        var chart_obj = this;
        var flashobj_id = this._id + "_flashobj";

        $(this._element).bind('restart_swf', function(event) {
          var chart_type = chart_obj._options['type'];
          if (chart_type != 'tab_refactored') so.write('so_' + chart_obj._id);
        });

        $(this._element).bind('trend_button_clicked',

                              function(event) {
                                if ($('a.time_mode_button.active').data('time-mode') == 'daily'){ 
                                  chart_obj._load_trend_popup(chart_obj._id);
                                }
                              });

        $(this._element).bind('reload_chart', function(event, extra_query_params) {
          var chart_type = chart_obj._options['type'];
          var joined_query_params = chart_obj._ajax.query_params_to_array(extra_query_params);

          if (chart_obj._applied_multi_filters == null) {
            if (chart_type == 'simple') {
              chart_obj._reload_singular_chart_url(joined_query_params);
            } else if (chart_type == 'dropdown') {
              var sel_val = chart_obj._get_dropdownSelVal();
              chart_obj._reload_dropdown_chart_url(sel_val, joined_query_params);
            }
          } else {
            if (chart_type == 'simple') {
              chart_obj._reload_multi_chart_url(chart_obj._applied_multi_filters, joined_query_params);
            } else if (chart_type == 'dropdown') {
              var sel_val = chart_obj._get_dropdownSelVal();
              chart_obj._reload_multi_dropdown_chart_url(chart_obj._applied_multi_filters, sel_val, joined_query_params);
            }
          }
        });

        // When the chart is first loaded
        $(document).bind('initialize_amchart', function(event) {
          var func = chart_obj._options['filter_type_func'];

          var filter_type_dict = func();
          var chart_type = chart_obj._options['type'];
          // SINGLE FILTER (NON SAVED FILTER)
          if (filter_type_dict['type'] == 'singular_filter') {
            KtDebug('singular_filter'); //xxx
            chart_obj._clear_applied_multi_filter();
            so.addVariable("additional_chart_settings", encodeURIComponent(chart_obj._get_additional_simple_chart_settings_str()));
            if (chart_type == 'simple') {
              KtDebug('simple'); //xxx
              so.addVariable("data_file", escape(chart_obj._get_singular_chart_url()));
            } else if (chart_type == 'dropdown') {
              var sel_val = chart_obj._get_dropdownSelVal();
              so.addVariable("additional_chart_settings", encodeURIComponent(chart_obj._get_additional_simple_chart_settings_str()));
              so.addVariable("data_file", escape(chart_obj._get_dropdown_chart_url(sel_val)));
            }
          }
          // SAVED FILTER(S)
          else if (filter_type_dict['type'] == 'multiple_filter') {
            chart_obj._save_applied_multi_filters(filter_type_dict['saved_filters'], filter_type_dict['saved_filter_names']);
            so.addVariable("additional_chart_settings", encodeURIComponent(chart_obj._get_additional_simple_chart_settings_str()));
            if (chart_type == 'simple') {
              so.addVariable("data_file", escape(chart_obj._get_multi_chart_url(filter_type_dict['saved_filters'])));
            } else if (chart_type == 'dropdown') {
              var sel_val = chart_obj._get_dropdownSelVal();
              so.addVariable("data_file", escape(chart_obj._get_multi_dropdown_chart_url(filter_type_dict['saved_filters'], sel_val)));
            }
          }
          KtDebug(chart_obj._id); //xxx
          if (chart_type != 'tab_refactored') so.write('so_' + chart_obj._id);
        });

        $(document).bind('clear_all_chart', function(event, msg) {
          var flashobj_id = chart_obj._id + "_flashobj";
          try {
            try {
              // Reload Line Charts
              document.getElementById(flashobj_id).setToBlank();
            } catch (err) {
              // Reload Pie Charts
              document.getElementById(flashobj_id).setData([]);
            }
          } catch (err) {}
        });

        // When a simple filter is applied
        $(document).bind('load_all_chart', function(event, msg) {
          chart_obj._clear_applied_multi_filter();
          var chart_type = chart_obj._options['type'];
          if (chart_type == 'simple') {
            KtDebug("\t chart_type is simple"); //xxx
            chart_obj._reload_singular_chart_url();
          } else if (chart_type == 'dropdown') {
            KtDebug(">>dropdown"); //xxx
            var sel_val = chart_obj._get_dropdownSelVal();
            chart_obj._reload_dropdown_chart_url(sel_val);
          }
        });

        $(document).bind('load_all_charts_multi', function(event, msg) {
          KtDebug('load_all_charts_multi'); //xxx
          var len = event.saved_filters.length - 1;
          var func = chart_obj._options['filter_type_func'];
          var chart_type = chart_obj._options['type'];
          var filter_type_dict = func();
          KtDebug("calling save_applied_multi_filters from here."); //xxx
          KtDebug(filter_type_dict);
          KtDebug(event);
          chart_obj._save_applied_multi_filters(event.saved_filters, event.saved_filter_names);
          if (chart_type == 'dropdown') {
            var sel_val = chart_obj._get_dropdownSelVal();
            chart_obj._reload_multi_dropdown_chart_url(event.saved_filters, sel_val);
          } else {
            chart_obj._reload_multi_chart_url(event.saved_filters);
          }
        } //function(event,msg)
                        );

        $(document).bind('annotation_saved', function(event, msg) {
          KtDebug(event);
          var flashobj_id = chart_obj._id + "_flashobj";
          var selected_chart_id = chart_obj._selected_chart_id();

          point_data['title'] = event.title;
          point_data['text'] = event.text;
          point_data['share_level'] = event.share_level;
          point_data['keyid'] = event.keyid;
          point_data['creator'] = event.creator;
          var xml_str = "";
          if (selected_chart_id == event.selected_chart_id) {
            if (event.submit_type == "edit") {
              $("tr[id='au_" + point_data.keyid + "']").find('.title span').text(point_data.title);
              $("tr[id='au_" + point_data.keyid + "']").find('.text span:last').text(point_data.text);
              $("tr[id='au_" + point_data.keyid + "']").find('.text span.acess_label').text(point_data.share_level.toLowerCase());
            } else if (event.submit_type == "delete") {
              $("tr[id='au_" + point_data.keyid + "']").remove();
            }

            point_data['xid'] = event.xid;
            if (point_data['gid'] == undefined) {
              point_data['gid'] = "0";
            }
            xml_str += chart_obj._get_additional_simple_chart_data_str(
              point_data['xid'], point_data['keyid'], point_data['title'], point_data['text'], point_data['share_level'], point_data['creator'], event.submit_type);
            if (point_data.share_level == "GLOBAL") {
              var selector = $('object').length > 0 ? "object" : "embed";
              $('div:data("has_annotation"):visible ' + selector).each(function() {
                flashobj_id = $(this).attr('id');
                document.getElementById(flashobj_id).appendData(xml_str);
              });
            } else {
              document.getElementById(flashobj_id).appendData(xml_str);
            }
          }
        });

        $(document).bind('line_chart_dropdown_selected', function(event, msg) {
          KtDebug('handling line_chart_dropdown_selected'); //xxx
          KtDebug(msg); //xxxx
          KtDebug(chart_obj._id); //xxx
          if (msg == chart_obj._id) {
            KtDebug(chart_obj._applied_multi_filter_names); //xxx
            if (chart_obj._applied_multi_filters == null) {
              chart_obj._reload_dropdown_chart_url(event.dropdown_v);
            } else {
              chart_obj._reload_multi_dropdown_chart_url(chart_obj._applied_multi_filters, event.dropdown_v);
            }
          }
        });
        this._bind_export(this);
      },

        instantiate_am_chart: function() {
            alert("instantiate_am_chart not defined");
        },

        init_impl: function() { /* Settings in abstract_chart_handler.js run first */
            this._common_assignments();
            var chart_obj = this;
            var chart_type = this._options['type'];
            KtDebug("chart_type: " + chart_type); //xxx
            var $this = $(this);
            var data_export_anchor = "";
            if (this._enable_data_export) data_export_anchor = '<a href = "#" title="Export to CSV" id="' + this._data_export_id + '" class="k-box-icon export_link">&nbsp;</a>';

            this._disable_data_load = ('disable_data_load' in this._options && this._options['disable_data_load']);
            if (chart_type == 'simple') {
                ////// simple chart //////
                var template_str = this._get_simple_header();
                $(this._element).ktTemplate({
                    template: template_str
                });

                var params = {
                    title: this._options['title'],
                    chart_index: this._options['chart_index'],
                    bubble_text: this._options['bubble'],
                    data_export_id: this._data_export_id,
                    id: this._id,
                    height: this._height
                };

                $(this._element).ktTemplate('render', params);
                $(this._element).find(".k-box-head-info").data("esc-title", escape(this._options['title']));
                if ('has_annotation' in this._options) {
                    $(this._element).data("has_annotation", this._options['has_annotation']);
                } else {
                    $(this._element).data("has_annotation", true);
                }

            } else if (chart_type == 'dropdown') {
                var dropdown_chart_id = this._id + "_dropdown";
                var header_html_str = this._get_dropdown_header();

                KtDebug(header_html_str); //xxx
                $(this._element).append(header_html_str);
                $(this._element).find(".k-box-head-info").data("esc-title", escape(this._options['title']));

                //TODO: bind the event handler
                $("#" + dropdown_chart_id).change(function() {
                    var sel_id = $(this).attr('id');
                    var sel_v = $("#" + sel_id + " option:selected").val();
                    $(document).trigger({
                        type: 'line_chart_dropdown_selected',
                        dropdown_v: sel_v
                    }, [chart_obj._id]);
                });
            } else if (chart_type == 'tab_refactored') {
                var media_url = this._options['media_url'];
                var tab_list = this._options['chart_widget_lst'];
                var header_html_str = '<div class="k-box"><div class="k-box-head"><div class="k-box-head-info"><h1>' + this._options['title'] + '</h1><a href="#" class="help" index="' + this._options['chart_index'] + '" title="' + this._options['bubble'] + '">help</a><ul class="icons"><li><a href="#"><img src="' + media_url + '/images/ico6.jpg" width="19" height="24" alt="" /></a></li><li><a href="#"><img src="' + media_url + '/images/ico3.jpg" width="19" height="24" alt="" /></a></li><li><a href="#"><img src="' + media_url + '/images/ico9.jpg" width="16" height="24" alt="" /></a></li></ul>';

                /* chart header icons */
                this.selected_chart = this.get_selected_chart_obj()
                if(this._enable_print_link) {
                    header_html_str += '<a href="#" class="k-box-icon print_link" title="Print Chart">&nbsp;</a>';
                }

                if (this._enable_data_export) {
                    header_html_str += '<a href="#" class="k-box-icon export_link" title="Export to CSV">&nbsp;</a>';
                }

                if(this._enable_advanced_link) {
                    header_html_str += '<a href="#" class="k-box-icon advanced_link" title="Advanced Graph View">&nbsp;</a>';
                }

                if (this._show_trend_option()) {
                    if ($('a.time_mode_button.active').data('time-mode') == 'daily')
                        header_html_str += '<a href="javascript:void(0)" class="k-box-icon trends" id="' + this._trend_id + '" title="Trends">&nbsp;</a>';
                    else 
                        header_html_str += '<a href="javascript:void(0)" class="k-box-icon trends" id="' + this._trend_id + '" title="Trendlines are currently only supported in daily time series">&nbsp;</a>';

                }

                header_html_str += '</div></div><div class="k-box-body"><ul>';

                for (var i = 0; i < tab_list.length; i++) {
                    var tabObj = tab_list[i];
                    var tabStr = tabObj['tab_str'];
                    var tabStrID = tabObj['tab_id'];
                    //var tabStrID = this._id + "_" + i + "_tab";
                    if (i == 0) {
                        header_html_str += '<li class="first"><a href="#" class="active" id="' + tabStrID + '"';
                    } else {
                        header_html_str += '<li><a href="#" id="' + tabStrID + '"';
                    }
                    header_html_str += ' sub_tab="true" chart_id="' + this._id + '" index="' + i + '"><span>' + tabStr + '</span></a>';

                    if(i != tab_list.length - 1) {
                        header_html_str += '|'; // separator
                    }

                    header_html_str += '</li>';
                }
                header_html_str += '</ul></div> </div>';
                $(this._element).append(header_html_str);

                //TODO: setup event
            }

            if (this._show_option_menu()) {
                this._load_options_menu();
            }

            $(this._element).data("show_trend_option", this._show_trend_option());

            if (this._show_trend_option()) {
                var chart_obj = this;

                $("#" + this._trend_id).click(function() {
                    $("#" + chart_obj._id).trigger("trend_button_clicked");
                });
            }

            if (chart_type != 'tab_refactored') {
                this.instantiate_am_chart();
            }

            this.bind_events();
        }
    });

    AbstractAmChartHandler.prototype._send_parent_last_ajax_url_ifHasOne = function() {
        var parent_id = this._get_parent_id();
        if (parent_id != null) {
            $(document).trigger({
                type: 'push_child_last_url_info',
                last_ajax_url: this._last_ajax_get_data_url,
                tab_id: this._id
            }, [parent_id]);
        }
    };

    // possible urls:
    // singular
    // multi
    // singular tab
    // multi tab
    //doesn't cache _last_ajax_get_data_url
    AbstractAmChartHandler.prototype._get_singular_chart_url_impl = function() {
        KtDebug("calling _get_singular_chart_url"); //xxx
        var key = 'get_singular_chart_url';
        var r = null;
        if (this._options[key] == undefined) {
            r = this._default_get_singular_chart_url();
        } else {
            r = this._options[key](this);
        }
        return r;
    };

    //does cache _last_ajax_get_data_url
    AbstractAmChartHandler.prototype._get_singular_chart_url = function() {
        var r = this._get_singular_chart_url_impl();
        if (this._last_ajax_get_data_url == null) {
            this._last_ajax_get_data_url = r;
        }
        KtDebug(r);

        this._send_parent_last_ajax_url_ifHasOne();
        return r;
    };

    // doesn't cache _last_ajax_get_data_url
    AbstractAmChartHandler.prototype._get_dropdown_chart_url_impl = function(dropdown_v) {
        var key = 'get_dropdown_chart_url';
        var r = null;
        if (this._options[key] == undefined) {
            r = this._default_get_dropdown_chart_url(dropdown_v);
        } else {
            r = this._options[key](this, dropdown_v);
        }
        return r;
    };

    // does cache _last_ajax_get_data_url
    AbstractAmChartHandler.prototype._get_dropdown_chart_url = function(dropdown_v) {
        var r = this._get_dropdown_chart_url_impl(dropdown_v);

        if (this._last_ajax_get_data_url == null) {
            this._last_ajax_get_data_url = r;
        }
        return r;
    };

    // doesn't cache _last_ajax_get_data_url
    AbstractAmChartHandler.prototype._get_multi_dropdown_chart_url_impl = function(saved_filters, dropdown_v) {
        var key = 'get_multi_dropdown_chart_url';
        var r = null;
        if (this._options[key] == undefined) {
            r = this._default_get_multi_dropdown_chart_url(saved_filters, dropdown_v);
        } else {
            r = this._options[key](this, saved_filters, dropdown_v);
        }
        return r;
    };

    // does cache _last_ajax_get_data_url
    AbstractAmChartHandler.prototype._get_multi_dropdown_chart_url = function(saved_filters, dropdown_v) {
        var r = this._get_multi_dropdown_chart_url_impl(saved_filters, dropdown_v);
        if (this._last_ajax_get_data_url == null) {
            this._last_ajax_get_data_url = r;
        }
        return r;
    };

    // doesn't cache _last_ajax_get_data_url
    AbstractAmChartHandler.prototype._get_multi_chart_url_impl = function(saved_filters) {
        KtDebug("calling _get_multi_chart_url"); //xxxx
        var key = 'get_multi_chart_url';
        var r = null;
        if (this._options[key] == undefined) {
            r = this._default_get_multi_chart_url(saved_filters);
        } else {
            r = this._options[key](this, saved_filters);
        }
        return r;
    };

    // does cache _last_ajax_get_data_url
    AbstractAmChartHandler.prototype._get_multi_chart_url = function(saved_filters) {
        var r = this._get_multi_chart_url_impl(saved_filters);
        if (this._last_ajax_get_data_url == null) {
            this._last_ajax_get_data_url = r;
        }
        return r;
    };

    AbstractAmChartHandler.prototype._reload_singular_chart_url = function(query_params) {
        var new_url = this._get_singular_chart_url_impl();
        new_url = this._ajax.append_query_params(new_url, query_params);
        this._reload_url_cache_helper(new_url);
    };

    AbstractAmChartHandler.prototype._reload_dropdown_chart_url = function(dropdown_v, query_params) {
        var new_url = this._get_dropdown_chart_url_impl(dropdown_v);
        new_url = this._ajax.append_query_params(new_url, query_params);
        this._reload_url_cache_helper(new_url);
    };

    AbstractAmChartHandler.prototype._reload_multi_dropdown_chart_url = function(saved_filters, dropdown_v, query_params) {
        var new_url = this._get_multi_dropdown_chart_url_impl(saved_filters, dropdown_v, query_params);
        new_url = this._ajax.append_query_params(new_url, query_params);
        this._reload_url_cache_helper(new_url);
    };

    AbstractAmChartHandler.prototype._reload_multi_chart_url = function(saved_filters, query_params) {
        var new_url = this._get_multi_chart_url_impl(saved_filters);
        new_url = this._ajax.append_query_params(new_url, query_params);
        this._reload_url_cache_helper(new_url);
    };

    // default functions are for the old ui framework. see query_conf.py
    AbstractAmChartHandler.prototype._default_get_singular_chart_url = function() {
        var url_str = this._root_url + '/ajax_get_chart_data/?chart_id=' + this._id + '&curr_url=' + this._get_curr_url();
        return url_str;
    };

    AbstractAmChartHandler.prototype._default_get_dropdown_chart_url = function(dropdown_v) {
        var url_str = this._root_url + '/ajax_get_chart_data/?chart_id=' + this._id + '&dropdown_v=' + dropdown_v + '&curr_url=' + this._get_curr_url();
        return url_str;
    };

    AbstractAmChartHandler.prototype._default_get_multi_dropdown_chart_url = function(saved_filters, dropdown_v) {
        var f_ids = saved_filters.join(",");
        var url_str = this._root_url + '/ajax_get_chart_data_multi_filter/?chart_id=' + this._id + '&dropdown_v=' + dropdown_v + '&f_ids=' + f_ids + '&curr_url=' + this._get_curr_url();
        return url_str;
    };

    /////////////////////// ChartNotPermitted ////////////////////////

    function ChartNotPermittedHandler(element, options) {
        this._element = element;
        this._options = options;
        this._chart_index = null;
    }

    ChartNotPermittedHandler.prototype = {
        _show_frame: function() {
            var show_chart_frame = true;
            if (this._options['show_frame'] != undefined && this._options['show_frame'] == false) {
                show_chart_frame = false;
            }
            return show_chart_frame;
        },

        _get_simple_header: function() {
            var text_str = '<div style="font-weight: bold; color:#666666;text-align:center; padding-top:[=half_height]">\
                        <span style="font-weight: bold; font-size: 14px; color:#333333;">You are not permitted to view this chart.</span><br />\
                        <span>Contact an admin for this account to get access.</span>\
                    </div>';

            if (this._show_frame()) {
                var template_str = '<div class="k-box"> \
                    <div class="k-box-head"> \
                        <div class="k-box-head-info"> \
                            <h1>[=title]</h1> \
                        </div> \
                    </div> \
                    <div class="k-box-body" id="so_[=id]" style="height:[=height]; position:relative;">' + text_str + '</div>\
                </div>';
            } else {
                var template_str = '<div id="so_[=id]" style="height:[=height]; position:relative;">' + text_str + '</div>';
            }
            return template_str;
        },
        _attach_header: function(template_str, params) {
            $(this._element).ktTemplate({
                template: template_str
            });
            $(this._element).ktTemplate('render', params);
        },
        init_impl: function() {
            var chart_id = $(this._element).attr('id');
            this._id = chart_id;
            this._chart_index = this._options['chart_index'];

            this._height = this._options['height'];
            //This is a hack.  Tried using display:table and display:table-cell with
            //vertical-align:middle but this wouldn't work with the border and would
            //require a hack on the width which breaks on window resize and the height
            //hack only breaks when font is resized
            this._int_height = parseInt(this._height, 10) / 2.1 + "px";

            KtDebug("chart_type: ChartNotPermitted"); //xxx
            var $this = $(this);

            var template_str = this._get_simple_header();

            var params = {
                title: this._options['title'],
                chart_index: this._options['chart_index'],
                id: this._id,
                height: this._height,
                half_height: this._int_height
            };

            this._attach_header(template_str, params);
            $(this._element).attr("not_permitted", true);
        }
    };

    function ChartNotPermitted() {
        this.handler = null;
        this._init = function() {
            this.handler = new ChartNotPermittedHandler(this.element, this.options);
            this.handler.init_impl();
        };
    }
    /////////////////////// ChartNotPermittedOldStyle ///////////////////////

    function ChartNotPermittedOldStyleHandler(element, options) {
        this.inheritedFrom = ChartNotPermittedHandler;
        this.inheritedFrom(element, options);
    }

    ChartNotPermittedOldStyleHandler.prototype = new ChartNotPermittedHandler();

    ChartNotPermittedOldStyleHandler.prototype._attach_header = function(template_str, params) {
        $(this._element).attr('class', 'k-box');
        $(this._element).ktTemplate({
            template: template_str
        });
        $(this._element).ktTemplate('renderPrepend', params);
    };

    ChartNotPermittedOldStyleHandler.prototype._get_simple_header = function() {
        var text_str = '<div style="font-weight: bold; color:#666666;text-align:center; padding-top:[=half_height]">\
                       <span style="font-weight: bold; font-size: 14px; color:#333333;">You are not permitted to view this chart.</span><br />\
                       <span>Contact an admin for this account to get access.</span>\
                  </div>';

        if (this._show_frame()) {
            var template_str = '<div class="k-box-head"> \
                <div class="k-box-head-info"> \
                    <h1>[=title]</h1> \
                </div> \
            </div> \
            <div class="k-box-body" id="so_[=id]" style="height:[=height]; position:relative;">' + text_str + '</div>';
        } else {
            var template_str = '<div id="so_[=id]" style="height:[=height]; position:relative;">' + text_str + '</div>';
        }
        return template_str;
    };

    function ChartNotPermittedOldStyle() {
        this.handler = null;
        this._init = function() {
            this.handler = new ChartNotPermittedOldStyleHandler(this.element, this.options);
            this.handler.init_impl();
        };
    }

    /////////////////////// AmLineChartHandler ///////////////////////

    function AmLineChartHandler(element, options) {
        this.inheritedFrom = AbstractAmChartHandler;
        this.inheritedFrom(element, options);
    }

    AmLineChartHandler.prototype = new AbstractAmChartHandler();

    AmLineChartHandler.prototype.instantiate_am_chart = function() {
        var media_url = this._options['media_url'];
        var so = new SWFObject(media_url + "/amchart/amline/amline.swf", this._id + "_flashobj", "100%", "100%", "8", "#ffffff");
        so.addVariable("path", media_url + "/amchart/amline/");
        so.addVariable("chart_id", this._id + "_chart");
        so.addVariable("settings_file", escape(media_url + "/amchart/amline/amline_settings.xml?v=2.8.1"));
        so.addParam("wmode", "opaque");
        this._so = so;
    };

    AmLineChartHandler.prototype._get_additional_simple_chart_data_str = function(xid, keyid, title, text, share_level, creator, submit_type) {
        var xml_str = "<annotations><value xid=\"" + xid + "\" keyid=\"" + keyid + "\" title=\"" + encodeURIComponent(title) + "\" share=\"" + share_level + "\" creator=\"" + encodeURIComponent(creator) + "\"";

        if (submit_type == "delete") {
            xml_str += " deleteMe=\"true\"";
        }

        xml_str += ">" + text + "</value></annotations>";
        return xml_str;
    };

    AmLineChartHandler.prototype._get_additional_simple_chart_settings_str = function() {
        var xml_str = undefined;
        xml_str = "<settings>";

        var has_y_axi_setting = (this._options['y_max_value'] != undefined || (this._options['prefix'] != '' && this._options['prefix'] != undefined) || (this._options['suffix'] != '' && this._options['suffix'] != undefined));

        if (has_y_axi_setting) {
            xml_str += "<values><y_left>";

            if (this._options['y_max_value'] != undefined) xml_str += "<max>" + this._options['y_max_value'] + "</max>";
            if (this._options['prefix'] != '' && this._options['prefix'] != undefined) xml_str += "<unit><![CDATA[" + this._options['prefix'] + "]]></unit><unit_position>left</unit_position>";
            else if (this._options['suffix'] != '' && this._options['suffix'] != undefined) xml_str += "<unit><![CDATA[" + this._options['suffix'] + "]]></unit><unit_position>right</unit_position>";
            xml_str += "</y_left></values>";
        }
        xml_str += "</settings>";
        KtDebug(xml_str);
        return xml_str;
    };

    function AmLineChart() {
        this.handler = null;
        this._init = function() {
            this.handler = new AmLineChartHandler(this.element, this.options);
            this.handler.init_impl();
        };
    }

    /////////////////////// AmPieChartHandler ///////////////////////

    function AmPieChartHandler(element, options) {
        this.inheritedFrom = AbstractAmChartHandler;
        this.inheritedFrom(element, options);
    }

    AmPieChartHandler.prototype = new AbstractAmChartHandler();
    //   AmPieChartHandler.prototype = AbstractAmChartHandler.prototype;
    AmPieChartHandler.prototype.instantiate_am_chart = function() {
        var media_url = this._options['media_url'];
        var has_annotation = this._options['has_annotation'];
        var so = new SWFObject(media_url + "/amchart/ampie/ampie.swf", this._id + "_flashobj", "100%", "100%", "8", "#ffffff");
        so.addVariable("path", media_url + "/amchart/ampie/");
        so.addVariable("chart_id", this._id + "_chart");
        so.addVariable("settings_file", escape(media_url + "/amchart/ampie/ampie_settings.xml?v=2.8.1"));
        so.addParam("wmode", "opaque");
        this._so = so;
    };

    AmPieChartHandler.prototype._get_additional_simple_chart_settings_str = function() {
        return '';
    };

    function AmPieChart() {
        this.handler = null;
        this._init = function() {
            this.handler = new AmPieChartHandler(this.element, this.options);
            this.handler.init_impl();
        };
    }


    /////////////////////// AmColumnChartHandler ///////////////////////

    function AmColumnChartHandler(element, options) {
        this.inheritedFrom = AmLineChartHandler;
        this.inheritedFrom(element, options);
    }

    AmColumnChartHandler.prototype = new AmLineChartHandler();

    AmColumnChartHandler.prototype.instantiate_am_chart = function() {
        var media_url = this._options['media_url'];
        var so = new SWFObject(media_url + "/amchart/amcolumn/amcolumn.swf", this._id + "_flashobj", "100%", "100%", "8", "#ffffff");
        so.addVariable("path", media_url + "/amchart/amcolumn/");
        so.addVariable("chart_id", this._id + "_chart");
        so.addVariable("settings_file", escape(media_url + "/amchart/amcolumn/amcolumn_settings.xml?v=2.8.1"));
        so.addParam("wmode", "opaque");
        this._so = so;
    };

    AmColumnChartHandler.prototype._get_additional_simple_chart_settings_str = function() {
        var xml_str = "<settings>";
        var has_y_axi_setting = ((this._options['prefix'] != '' && this._options['prefix'] != undefined) || (this._options['suffix'] != '' && this._options['suffix'] != undefined));
        if (has_y_axi_setting) {
            xml_str += "<values><value>";

            if (this._options['prefix'] != '' && this._options['prefix'] != undefined) xml_str += "<unit><![CDATA[" + this._options['prefix'] + "]]></unit><unit_position>left</unit_position>";
            if (this._options['suffix'] != '' && this._options['suffix'] != undefined) xml_str += "<unit><![CDATA[" + this._options['suffix'] + "]]></unit><unit_position>right</unit_position>";
            xml_str += "</values>";
        }
        xml_str += "</settings>";

        KtDebug(xml_str); //xxx
        return xml_str;
    };

    function AmColumnChart() {
        this.handler = null;
        this._init = function() {
            this.handler = new AmColumnChartHandler(this.element, this.options);
            this.handler.init_impl();
        };
    }


    /////////////////////// AmRealTimeChartHandler ///////////////////////

    function AmRealTimeChartHandler(element, options) {
        this.inheritedFrom = AbstractAmChartHandler;
        this.inheritedFrom(element, options);
    }

    AmRealTimeChartHandler.prototype = new AbstractAmChartHandler();

    AmRealTimeChartHandler.prototype.instantiate_am_chart = function() {
        var media_url = this._options['media_url'];
        var chart_style = this._options['chart_style'];
        var height = this._options['height'];

        var so = new SWFObject(media_url + "/amchart/" + chart_style + "/" + chart_style + ".swf", this._id + "_flashobj", "100%", height, "8", "#ffffff");
        so.addVariable("path", media_url + "/amchart/" + chart_style + "/");
        so.addVariable("chart_id", this._id + "_chart");
        so.addVariable("settings_file", escape(media_url + "/amchart/amrealtime/amrealtime_" + chart_style + "_settings.xml?v=2.8.1"));
        so.addParam("wmode", "opaque");
        this._so = so;
    };

    AmRealTimeChartHandler.prototype.bind_events = function() {
        AmColumnChartHandler.prototype.bind_events.call(this);

        var flashobj_id = this._id + "_flashobj";
        var index = this._options['realtime_data_index'];

        $(document).bind('set_realtime_data', function(event, data) {

            try {
                document.getElementById(flashobj_id).setData(data[index]);
            } catch (err) {
                //Javascript complains about setData not existing but the call goes through anyway
            }
        });
    };

    AmRealTimeChartHandler.prototype._get_additional_simple_chart_settings_str = function() {
        var xml_str = '<settings>';

        var mini_chart = this._options['mini_chart'];

        if (mini_chart == "true") {
            xml_str += '<labels> \
                      <label lid="0"> \
                      <x></x> \
                      <y></y> \
                      <rotate></rotate> \
                      <width></width> \
                      <align>center</align> \
                      <text><![CDATA[<b>' + this._options['title'] + '</b>]]></text> \
                      </label> \
                      </labels>';

            xml_str += '<labels> \
                      <label lid="1"> \
                      <x>-5</x> \
                      <y>60%</y> \
                      <rotate>90</rotate> \
                      <width></width> \
                      <align>left</align> \
                      <text><![CDATA[' + this._options['y_label'] + ']]></text> \
                      </label> \
                      </labels>';

            xml_str += '<plot_area> \
                      <margins> \
                      <left>45</left> \
                      <top>20</top> \
                      <right>0</right> \
                      <bottom>40</bottom> \
                      </margins> \
                      </plot_area>';
        } else {
            xml_str += '<graphs> \
                      <graph gid="0"> \
                      <color>#057D9F</color> \
                      <alpha>60</alpha> \
                      <axis>left</axis> \
                      <balloon_color>#057D9F</balloon_color> \
                      <bullet_color>#057D9F</bullet_color> \
                      <fill_alpha>20</fill_alpha> \
                      <fill_color>#057D9F</fill_color> \
                      <line_width>3</line_width> \
                      <bullet>round_outlined</bullet> \
                      <bullet_size>8</bullet_size> \
                      </graph> \
                      </graphs>';

            xml_str += '<labels> \
                      <label lid="1"> \
                      <x>15</x> \
                      <y>55%</y> \
                      <rotate>90</rotate> \
                      <width></width> \
                      <align>left</align> \
                      <text><![CDATA[' + this._options['y_label'] + ']]></text> \
                      </label> \
                      </labels>';
        }

        xml_str += '</settings>';
        return xml_str;
    };

    function AmRealTimeChart() {
        this.handler = null;
        this._init = function() {
            this.handler = new AmRealTimeChartHandler(this.element, this.options);
            this.handler.init_impl();
        };
    }


    /////////////////////// AmBarChartHandler ///////////////////////

    function AmBarChartHandler(element, options) {
        this.inheritedFrom = AmColumnChartHandler;
        this.inheritedFrom(element, options);
    }

    AmBarChartHandler.prototype = new AmColumnChartHandler();

    AmBarChartHandler.prototype.instantiate_am_chart = function() {
        var media_url = this._options['media_url'];
        var so = new SWFObject(media_url + "/amchart/amcolumn/amcolumn.swf", this._id + "_flashobj", "100%", "100%", "8", "#ffffff");
        so.addVariable("path", media_url + "/amchart/amcolumn/");
        so.addVariable("chart_id", this._id + "_chart");
        so.addVariable("settings_file", escape(media_url + "/amchart/amcolumn/ambar_settings.xml?v=2.8.1"));
        so.addParam("wmode", "opaque");
        this._so = so;
    };

    AmBarChartHandler.prototype._get_additional_simple_chart_settings_str = function() {
        var xml_str = "<settings><column><data_labels><![CDATA[{value}" + this.suffix + "]]></data_labels><balloon_text><![CDATA[{series}: {value}" + this.suffix + "]]></balloon_text></column><values><value><unit>" + this.suffix + "</unit></value></values></settings>";
        KtDebug(xml_str); //xxx
        return xml_str;
    };

    function AmBarChart() {
        this.handler = null;
        this._init = function() {
            this.handler = new AmBarChartHandler(this.element, this.options);
            this.handler.init_impl();
        };
    }


    /////////////////////// AmColumnStackedChartHandler ///////////////////////

    function AmColumnStackedChartHandler(element, options) {
        this.inheritedFrom = AmColumnChartHandler;
        this.inheritedFrom(element, options);
    }

    AmColumnStackedChartHandler.prototype = new AmColumnChartHandler();
    AmColumnStackedChartHandler.prototype.instantiate_am_chart = function() {
        var media_url = this._options['media_url'];
        var so = new SWFObject(media_url + "/amchart/amcolumn/amcolumn.swf", this._id + "_flashobj", "100%", "100%", "8", "#ffffff");
        so.addVariable("path", media_url + "/amchart/amcolumn/");
        so.addVariable("chart_id", this._id + "_chart");
        so.addVariable("settings_file", escape(media_url + "/amchart/amcolumn/amcolumnstacked_settings.xml?v=2.8.1"));
        so.addParam("wmode", "opaque");
        this._so = so;
    };

    function AmColumnStackedChart() {
        this.handler = null;
        this._init = function() {
            this.handler = new AmColumnStackedChartHandler(this.element, this.options);
            this.handler.init_impl();
        };
    }

    /////////////////////// AmColumn100StackedChartHandler ///////////////////////

    function AmColumn100StackedChartHandler(element, options) {
        this.inheritedFrom = AmColumnChartHandler;
        this.inheritedFrom(element, options);
        this._graph_format_xml_middle = '{percents}';
    }

    AmColumn100StackedChartHandler.prototype = new AmColumnChartHandler();
    // AmColumn100StackedChartHandler.prototype._get_additional_simple_chart_settings_str = function()
    // {
    //   var xml_str = "<settings>";
    //   xml_str +="</settings>";
    //   KtDebug(xml_str); //xxx
    //   return xml_str;
    // };
    AmColumn100StackedChartHandler.prototype.instantiate_am_chart = function() {
        var media_url = this._options['media_url'];
        var so = new SWFObject(media_url + "/amchart/amcolumn/amcolumn.swf", this._id + "_flashobj", "100%", "100%", "8", "#ffffff");
        so.addVariable("path", media_url + "/amchart/amcolumn/");
        so.addVariable("chart_id", this._id + "_chart");
        so.addVariable("settings_file", escape(media_url + "/amchart/amcolumn/amcolumn100stacked_settings.xml?v=2.8.1"));
        so.addParam("wmode", "opaque");
        this._so = so;
    };

    function AmColumn100StackedChart() {
        this.handler = null;
        this._init = function() {
            this.handler = new AmColumn100StackedChartHandler(this.element, this.options);
            this.handler.init_impl();
        };
    }

    /////////////////////// AmConversionChartHandler ///////////////////////

    function AmConversionChartHandler(element, options) {
        this.inheritedFrom = AmColumnChartHandler;
        this.inheritedFrom(element, options);
    }
  
  
    AmConversionChartHandler.prototype = new AmColumnChartHandler();
    AmConversionChartHandler.prototype.instantiate_am_chart = function() {
        var media_url = this._options['media_url'];
        var width = this._options['width'];
        var height = this._options['height'];

        var so = new SWFObject(media_url + "/amchart/amcolumn/amcolumn.swf", this._id + "_flashobj", width, height, "8", "#ffffff");
        so.addVariable("path", media_url + "/amchart/amcolumn/");
        so.addVariable("chart_id", this._id + "_chart");
        so.addVariable("settings_file", escape(media_url + "/amchart/amcolumn/amconversion_settings.xml?v=2.8.1"));
        so.addParam("wmode", "opaque");
        this._so = so;
    };

    AmConversionChartHandler.prototype._get_additional_simple_chart_settings_str = function() {
        xml_str = "<settings>";
        xml_str += "</settings>";
      
        return xml_str;
    };

    function AmConversionChart() {
        this.handler = null;
        this._init = function() {
          this.handler = new AmConversionChartHandler(this.element, this.options);
          this.handler.init_impl();
          $(this.handler._element).find('div.k-box-body').removeClass('k-box-body').addClass('k-box-body-horizontal-scrollbar');
        };
    }

    /////////////////////// TabChart ///////////////////////

    function TabChartHandler(element, options) {
        this.inheritedFrom = AbstractAmChartHandler;
        this.inheritedFrom(element, options);
        this._tab_last_ajax_url_dict = {};
        this._sel_index = null;

        element.addClass('kt_tab_chart');
    }
    TabChartHandler.prototype = new AbstractAmChartHandler();

    TabChartHandler.prototype.get_selected_chart_obj = function() {
        var selected_chart_location = $("#" + this._sel_index);
        return selected_chart_location.data('chart_obj');
    };

    TabChartHandler.prototype._highlight_selected_tab = function(tab_id) {
        var index = "c";
        if (tab_id == undefined) {
            //pick the first one
            var $tab = $($("#" + this._id + " a[sub_tab='true']")[0]);
            $tab.addClass('active');
            index += $tab.attr('id');
        } else {
            var active_chart_link = $($("#" + this._id + " a[id='" + tab_id + "']")[0]);
            active_chart_link.addClass('active');
            index += tab_id;
        }

        $("#cluetip").hide();
        var show_trend_option = $("#" + index).data("show_trend_option");

        if (show_trend_option != undefined) {
            var trend_option = $("#trend_" + this._id);

            if (show_trend_option) {
                trend_option.show();
            } else {
                trend_option.hide();
            }
        }

        this._sel_index = index;
        this._last_ajax_get_data_url = this._tab_last_ajax_url_dict[index];

        this.bind_events();
    };

    TabChartHandler.prototype._unhighlight_selected_tab = function(tab_id) {
        $($("#" + this._id + " a[id='" + tab_id + "']")[0]).removeClass('active');
    };

    TabChartHandler.prototype.init_impl = function() {
        AbstractAmChartHandler.prototype.init_impl.call(this); //call parents init_impl
        var chart_widget_list = this._options['chart_widget_lst'];
        var chart_widget_list_len = chart_widget_list.length;
        for (var i = 0; i < chart_widget_list_len; i++) {
            $("#c" + this._chart_index + " div[class='k-box-body']").append($("#c" + chart_widget_list[i]['tab_id']));
        }

        //bind button
        var _this_obj = this;
        $("#" + this._id + " a[sub_tab='true']").click(

        function() {
            for (var i = 0; i < chart_widget_list_len; i++) {
                var sub_tab_index = chart_widget_list[i]['tab_id'];
                var chart_box_id = "#c" + sub_tab_index;
                var chart_box = $(chart_box_id);

                if (sub_tab_index == $(this).attr('id')) {
                    _this_obj._highlight_selected_tab(sub_tab_index);

                    /* highcharts needs to redraw on tab change */
                    chart_box.show().trigger("redraw_chart");

                    if (chart_box.data("has_annotation") == false) {
                        chart_box.parents(".k-box").parent().siblings('.annotation').hide();
                    }
                } else {
                    _this_obj._unhighlight_selected_tab(sub_tab_index);
                    chart_box.hide();
                }
            }
            return false;
        });

        this._highlight_selected_tab();
    };

    TabChartHandler.prototype.bind_events = function() {
        var chart_obj = this;
        $(document).bind('push_child_last_url_info', function(event) {
            chart_obj._tab_last_ajax_url_dict[event.tab_id] = event.last_ajax_url;
            if (chart_obj._sel_index == event.tab_id) {
                chart_obj._last_ajax_get_data_url = event.last_ajax_url;
            }
        });

        $(this._element).unbind('trend_button_clicked');
        $(this._element).bind('trend_button_clicked', function(event) {
           if ($('a.time_mode_button.active').data('time-mode') == 'daily'){ 
             chart_obj._load_trend_popup(chart_obj._sel_index);
           }
        });


        if (this._enable_data_export) {
            var export_obj = $("#" + this._data_export_id);

            export_obj.unbind('click');
            export_obj.click(function() {
                var selected_chart = chart_obj.get_selected_chart_obj();
                var original_url = selected_chart._ajax.current_url();

                var data_export_url = chart_obj._get_export_url(original_url);
                document.location = data_export_url;
                return false;
            });
        }

        this.selected_chart = this.get_selected_chart_obj();
        if(typeof this.selected_chart != "undefined") {
            this._element.find('.advanced_link').attr('href', this.selected_chart.advanced_link());
            selected_chart = this.selected_chart;

            this._element.find('.print_link').click(function() {
                selected_chart.chart.print();
                return false;
            });

            this._element.find('.export_link').attr('id', this._data_export_id);
            this._bind_export(selected_chart);
        }
    };

    function TabChart() {
        this.handler = null;
        this._init = function() {
            this.handler = new TabChartHandler(this.element, this.options);
            this.handler.init_impl();
        };
    }

    /////////////////////// Widget Construction ///////////////////////
    var chartNotPermitted = new ChartNotPermitted();
    $.widget("ui.ChartNotPermitted", chartNotPermitted);
    $.ui.ChartNotPermitted.defaults = {
        title: 'You need to specify the TITLE attribute to am_chart()',
        height: '300px'
    };

    var chartNotPermittedOldStyle = new ChartNotPermittedOldStyle();
    $.widget("ui.ChartNotPermittedOldStyle", chartNotPermittedOldStyle);
    $.ui.ChartNotPermittedOldStyle.defaults = {
        title: 'You need to specify the TITLE attribute to am_chart()',
        height: '300px'
    };

    var amLineChart = new AmLineChart();
    $.widget("ui.AmLineChart", amLineChart);
    $.ui.AmLineChart.getter = ["get_root_url"];
    $.ui.AmLineChart.defaults = {
        title: 'You need to specify the TITLE attribute to am_chart()',
        bubble: 'You need to specify the BUBBLE attribute to am_chart()',
        height: '300px'
    };

    var amPieChart = new AmPieChart();
    $.widget("ui.AmPieChart", amPieChart);
    $.ui.AmPieChart.getter = ["get_root_url"];
    $.ui.AmPieChart.defaults = {
        title: 'You need to specify the TITLE attribute to am_chart()',
        bubble: 'You need to specify the BUBBLE attribute to am_chart()',
        height: '300px'
    };

    var amColumnChart = new AmColumnChart();
    $.widget("ui.AmColumnChart", amColumnChart);
    $.ui.AmColumnChart.getter = ["get_root_url"];
    $.ui.AmColumnChart.defaults = {
        title: 'You need to specify the TITLE attribute to am_chart()',
        bubble: 'You need to specify the BUBBLE attribute to am_chart()',
        height: '300px'
    };

    var amRealTimeChart = new AmRealTimeChart();
    $.widget("ui.AmRealTimeChart", amRealTimeChart);
    $.ui.AmRealTimeChart.getter = ["get_root_url"];
    $.ui.AmRealTimeChart.defaults = {
        title: 'You need to specify the TITLE attribute to am_chart()',
        bubble: 'You need to specify the BUBBLE attribute to am_chart()'
    };

    var amBarChart = new AmBarChart();
    $.widget("ui.AmBarChart", amBarChart);
    $.ui.AmBarChart.getter = ["get_root_url"];
    $.ui.AmBarChart.defaults = {
        title: 'You need to specify the TITLE attribute to am_chart()',
        bubble: 'You need to specify the BUBBLE attribute to am_chart()',
        height: '300px'
    };

    var amColumnStackedChart = new AmColumnStackedChart();
    $.widget("ui.AmColumnStackedChart", amColumnStackedChart);
    $.ui.AmColumnStackedChart.getter = ["get_root_url"];
    $.ui.AmColumnStackedChart.defaults = {
        title: 'You need to specify the TITLE attribute to am_chart()',
        bubble: 'You need to specify the BUBBLE attribute to am_chart()',
        height: '300px'
    };

    var amColumn100StackedChart = new AmColumn100StackedChart();
    $.widget("ui.AmColumn100StackedChart", amColumn100StackedChart);
    $.ui.AmColumn100StackedChart.getter = ["get_root_url"];
    $.ui.AmColumn100StackedChart.defaults = {
        title: 'You need to specify the TITLE attribute to am_chart()',
        bubble: 'You need to specify the BUBBLE attribute to am_chart()',
        height: '300px'
    };

    var amConversionChart = new AmConversionChart();
    $.widget("ui.AmConversionChart", amConversionChart);
    $.ui.AmConversionChart.getter = ["get_root_url"];
    $.ui.AmConversionChart.defaults = {
        title: 'You need to specify the TITLE attribute to am_chart()',
        bubble: 'You need to specify the BUBBLE attribute to am_chart()',
        height: '300px'
    };

    var tabChart = new TabChart();
    $.widget("ui.TabChart", tabChart);
    $.ui.TabChart.getter = ["get_root_url"];
    $.ui.TabChart.defaults = {
        title: 'You need to specify the TITLE attribute to am_chart()',
        bubble: 'You need to specify the BUBBLE attribute to am_chart()',
        height: '300px'
    };

})(jQuery);

