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";

  if(process != "showAll")
    document.getElementById(flashobj_id).showAll();
}

// 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 = {};
var reload_url_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];
  var url_str = reload_url_assoc_array[plugin_id];

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

  if(url_str != undefined)
  {
    document.getElementById(flashobj_id).reloadData(escape(url_str));
    delete reload_url_assoc_array[plugin_id];
  }
}

(function($) {
   var DEBUG = false;

   function KtDebug(debug_stuff)
   {
     if(DEBUG && window.console && window.console.firebug)
       console.log(debug_stuff);
   }

   /////////////////////// AbstractAmChartHandler ///////////////////////
   function AbstractAmChartHandler(element, options){
     this._element = element;
     this._options = options;
     this._so = null;
     this._applied_multi_filters = null;
     this._applied_multi_filter_names = null;
     this._tab               = null;
     this._page              = null;
     this._chart_index       = null;


     //
     // This should really be changed to accept arbitrary parameters from pages.py that are converted to xml
     //
     var color_scheme = '';
     this.prefix = '';
     this.suffix = '';
     if (options != undefined) {
	KtDebug(options);
	if (options['color_scheme'] != undefined) {color_scheme = options['color_scheme'];}  else {color_scheme = '';}
	if (options['prefix'] != undefined) {this.prefix = options['prefix'];}  else {this.prefix = '';}
	if (options['suffix'] != undefined) {this.suffix = options['suffix'];}  else {this.suffix = '';}
     }

     switch(color_scheme)
     {
       case "money":  // The "Money" Palette
         this._color_lst = ['#078600', '#057D9F', '#FFBD16', '#FF7400', '#FF0000', '#00CCCC', '#33FF00', '#CC00CC', '#000066', '#990000'];
         break;
       case "gender":     // The "Gender" Palette
         //this._color_lst = ['#E997FF','#72AFFF','#CCCCCC'];
	 this._color_lst = ['#72AFFF','#E997FF','#CCCCCC'];
       break;
       case "std_shifted":
         // The Standard Palette
         this._color_lst = ['#078600', '#FFBD16', '#FF7400', '#FF0000', '#00CCCC', '#33FF00', '#CC00CC', '#000066', '#990000', '#057D9F'];
	 break;
       default:
         // The Standard Palette
         this._color_lst = ['#057D9F', '#078600', '#FFBD16', '#FF7400', '#FF0000', '#00CCCC', '#33FF00', '#CC00CC', '#000066', '#990000'];

     }

     // Should generate the XML all dyanmically
     this._color_hover = '#99FF00';
     this._line_width = 2;
     balloon_text_xml_start = '<balloon_text><![CDATA[ {title}: ';
     balloon_text_xml_middle = '{value}';
     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;

     this._selected_index = 0;

     // _last_ajax_get_data_url is obviously used to keep track of the last url that is used for fetching data.
     // amchart's reload shouldn't be called again when the url doesn't change; otherwise, some charts (ex, piechart)
     // will get loaded twice.
     this._last_ajax_get_data_url = null;
   };


   AbstractAmChartHandler.prototype = {

     get_root_url : function()
     {
       return this._root_url;
     },

     _get_legend_url : function()
     {
       var key = 'get_legend_url';
       if( this._options[key] == undefined)
	 return undefined;
       else
       {
	 return this._options[key](this);
       }
     },

     _get_parent_id : function()
     {
       var tmp_lst = this._id.split("_");
       var parent_id = null;
       if (tmp_lst[tmp_lst.length-1] == 'tab')
	 parent_id = tmp_lst[0];
       return parent_id;
     },

     _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]);
       }
     },

     _get_dropdownId: function()
     {
       return this._id + "_dropdown";
     },

     _get_dropdownSelVal: function()
     {
       var sel_id = this._get_dropdownId();
       var sel_val = $("#"+sel_id+ " option:selected").val();
       return sel_val;
     },

     // 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;
     },

     _gen_legend_list_from_filter_names: function(filter_names, legend)
     {
       var legend_lst = [];
       for(var i = 0; i < filter_names.length; i++)
       {
	 legend_lst[i] = filter_names[i] + " " + legend;
       }
       // no filter_names...
       if(legend_lst.length == 0)
       {
	 legend_lst[0] = legend;
       }
       return legend_lst;
     },

     _get_curr_url: function()
     {
       var curr_url = escape(window.location.href);
       return curr_url;
     },

     // possible urls:
     // singular
     // multi
     // singular tab
     // multi tab

     //doesn't cache _last_ajax_get_data_url
     _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
     _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
     _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
     _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
     _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
     _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
     _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
     _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;
     },

     _reload_url_cache_helper : function(new_url)
     {
       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
	 {
	   document.getElementById(flashobj_id).reloadData(escape(new_url));
	 //this._so.addVariable("data_file", escape(new_url));
	 }
	 catch(err)
	 {
	   reload_url_assoc_array[this._id] = new_url;
	 }
	 this._last_ajax_get_data_url = new_url;
       }
     },

     _reload_singular_chart_url : function()
     {
       var flashobj_id = this._id + "_flashobj";
       var new_url = this._get_singular_chart_url_impl();
       this._reload_url_cache_helper(new_url);
     },

     _reload_dropdown_chart_url : function(dropdown_v)
     {
       var flashobj_id = this._id + "_flashobj";
       var new_url = this._get_dropdown_chart_url_impl(dropdown_v);
       this._reload_url_cache_helper(new_url);
     },

     _reload_multi_dropdown_chart_url : function(saved_filters, dropdown_v)
     {
       var flashobj_id = this._id + "_flashobj";
       var new_url = this._get_multi_dropdown_chart_url_impl(saved_filters, dropdown_v);
       this._reload_url_cache_helper(new_url);
     },

     _reload_multi_chart_url : function(saved_filters)
     {
       var flashobj_id = this._id + "_flashobj";
       var new_url = this._get_multi_chart_url_impl(saved_filters);
       this._reload_url_cache_helper(new_url);
     },

     // default functions are for the old ui framework. see query_conf.py
     _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;
     },

     _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;
     },

     _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;
     },

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

     _get_additional_tab_chart_settings_str : function(legend_list, tab_index)
     {
       alert("_get_additional_tab_chart_settings_str not defined");
     },

     _get_additional_multi_tab_chart_settings_str : function(legend_list, saved_filter_names, tab_index)
     {
       alert("_get_additional_multi_tab_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 am_chart_obj = this;
       var flashobj_id = this._id + "_flashobj";
       var legend = am_chart_obj._options['legend'];

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

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

			  var filter_type_dict = func();
			  var chart_type = am_chart_obj._options['type'];
			  var legend = am_chart_obj._options['legend'];

 			  // SINGLE FILTER (NON SAVED FILTER)
			  if(filter_type_dict['type'] == 'singular_filter')
			  {
			    KtDebug('singular_filter');//xxx
			    am_chart_obj._clear_applied_multi_filter();
			    if(chart_type == 'simple')
			    {
			      KtDebug('simple');//xxx
			      so.addVariable("additional_chart_settings", escape(am_chart_obj._get_additional_simple_chart_settings_str(legend)));
//			      am_chart_obj._setSwfSettings(am_chart_obj._get_additional_simple_chart_settings_str(legend));
			      so.addVariable("data_file", escape(am_chart_obj._get_singular_chart_url()));
			    }
			    else if(chart_type == 'dropdown')
			    {
			      var sel_val = am_chart_obj._get_dropdownSelVal();
			      so.addVariable("additional_chart_settings", escape(am_chart_obj._get_additional_simple_chart_settings_str(legend)));
			      so.addVariable("data_file", escape(am_chart_obj._get_dropdown_chart_url(sel_val)));
			    }
			  }
			  // SAVED FILTER(S)
			  else if(filter_type_dict['type'] == 'multiple_filter')
			  {
			    am_chart_obj._save_applied_multi_filters(filter_type_dict['saved_filters'],
								     filter_type_dict['saved_filter_names']);
			    if(chart_type == 'simple')
			    {
			      if(legend.length == 1)
			      {
				var legend_lst = am_chart_obj._gen_legend_list_from_filter_names(filter_type_dict['saved_filter_names'],
												  legend);
				so.addVariable("additional_chart_settings", escape(am_chart_obj._get_additional_simple_chart_settings_str(legend_lst)));
			      }
			      else
			      {
				// natually has got more than one data set
				so.addVariable("additional_chart_settings", escape(am_chart_obj._get_additional_simple_chart_settings_str(legend)));
			      }
			      so.addVariable("data_file", escape(am_chart_obj._get_multi_chart_url( filter_type_dict['saved_filters'] )));
			    }
			    else if(chart_type == 'dropdown')
			    {
			      //multi dropdown
			      var legend_lst = am_chart_obj._gen_legend_list_from_filter_names(am_chart_obj._applied_multi_filter_names,
											       am_chart_obj._options['legend']);
			      var sel_val = am_chart_obj._get_dropdownSelVal();
			      so.addVariable("additional_chart_settings", escape(am_chart_obj._get_additional_simple_chart_settings_str(legend_lst)));
			      so.addVariable("data_file", escape( am_chart_obj._get_multi_dropdown_chart_url( filter_type_dict['saved_filters'] , sel_val)));
			      //am_chart_obj._reload_multi_dropdown_chart_url(am_chart_obj._applied_multi_filters, event.dropdown_v);
			    }
			  }
			  KtDebug(am_chart_obj._id);//xxx

			  if(chart_type != 'tab_refactored')
			    so.write('so_' + am_chart_obj._id);
			}
		       );

       // When a simple filter is applied
       $(document).bind('load_all_chart',
			function(event, msg)
			{
			  am_chart_obj._clear_applied_multi_filter();
			  var chart_type = am_chart_obj._options['type'];
			  if(chart_type == 'simple')
			  {
			    KtDebug("\t chart_type is simple");//xxx
			    //document.getElementById(flashobj_id).setSettings(am_chart_obj._get_additional_simple_chart_settings_str(legend));
			    am_chart_obj._setSwfSettings(am_chart_obj._get_additional_simple_chart_settings_str(legend));
//			    am_chart_obj._setSwfSettings(am_chart_obj._get_additional_simple_chart_settings_str(legend));
			    am_chart_obj._reload_singular_chart_url();
			  }
			  else if(chart_type == 'dropdown')
			  {
			    KtDebug(">>dropdown");//xxx
			    var sel_val = am_chart_obj._get_dropdownSelVal();
			    //document.getElementById(flashobj_id).setSettings(am_chart_obj._get_additional_simple_chart_settings_str(legend));
			    am_chart_obj._setSwfSettings(am_chart_obj._get_additional_simple_chart_settings_str(legend));
			    am_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 = am_chart_obj._options['filter_type_func'];
			  var chart_type = am_chart_obj._options['type'];
			  var filter_type_dict = func();
			  KtDebug("calling save_applied_multi_filters from here.");//xxx
			  KtDebug(filter_type_dict);
			  KtDebug(event);
			  am_chart_obj._save_applied_multi_filters(event.saved_filters,
								   event.saved_filter_names);
			  if(legend != undefined && legend.length == 1)
			  {
			    // CHART WITH ONLY ONE DATA SET.
			    KtDebug('legend.length == 1 !!!!!!!!!!!!!!!!!!!1!');//xxx
			    var legend_lst = am_chart_obj._gen_legend_list_from_filter_names(event.saved_filter_names,
											     legend);
			    am_chart_obj._setSwfSettings(am_chart_obj._get_additional_simple_chart_settings_str(legend_lst));

			    if(chart_type == 'dropdown')
			    {
			      var sel_val = am_chart_obj._get_dropdownSelVal();
			      am_chart_obj._reload_multi_dropdown_chart_url(event.saved_filters, sel_val);
			    }
			    else
			    {
			      am_chart_obj._reload_multi_chart_url(event.saved_filters);
			    }
			  }
			  else
			  {
			    KtDebug('legend.length > 1');//xxx
			    if(chart_type == 'simple')
			    {
			      // natually has got more than one data set
//			      document.getElementById(flashobj_id).setSettings(am_chart_obj._get_additional_simple_chart_settings_str(legend));
			      am_chart_obj._setSwfSettings(am_chart_obj._get_additional_simple_chart_settings_str(legend));
			      am_chart_obj._reload_multi_chart_url(event.saved_filters);
			    }
			  }
			}//function(event,msg)
		       );


       $(document).bind('line_chart_dropdown_selected' ,
			function(event, msg)
			{
			  KtDebug('handling line_chart_dropdown_selected'); //xxx
			  KtDebug(msg); //xxxx
			  KtDebug(am_chart_obj._id); //xxx
			  if(msg == am_chart_obj._id)
			  {
			    KtDebug(am_chart_obj._applied_multi_filter_names);//xxx

			    if(am_chart_obj._applied_multi_filters == null)
			    {
			      var legend = am_chart_obj._options['legend'];
			      //			      document.getElementById(flashobj_id).setSettings(am_chart_obj._get_additional_simple_chart_settings_str(legend));
			      am_chart_obj._setSwfSettings(am_chart_obj._get_additional_simple_chart_settings_str(legend));
			      am_chart_obj._reload_dropdown_chart_url(event.dropdown_v);
			    }
			    else
			    {
			      //multi
			      var legend_lst = am_chart_obj._gen_legend_list_from_filter_names(am_chart_obj._applied_multi_filter_names,
											       am_chart_obj._options['legend']);
//			      so.addVariable("additional_chart_settings", am_chart_obj._get_additional_simple_chart_settings_str(legend_lst));
			      am_chart_obj._setSwfSettings(am_chart_obj._get_additional_simple_chart_settings_str(legend_lst));
			      am_chart_obj._reload_multi_dropdown_chart_url(am_chart_obj._applied_multi_filters, event.dropdown_v);
			    }
			  }
			}//function
		       );



     },

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

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

     _get_simple_header : function()
     {
       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> \
	                           <a href="#" class="help" index="[=chart_index]" title="[=bubble_text]">help</a> \
	                           <a href="#" class="export" id="[=data_export_id]">Export</a> \
	                         </div> \
			      </div> \
			      <div class="k-box-body" id="so_[=id]" style="height:[=height]"></div>\
			    </div>';
       }
       else
       {
         var template_str = '<div id="so_[=id]" style="height:[=height]"></div>';
       }
       return template_str;
     },

     init_impl:function()
     {
       var chart_id = $(this._element).attr('id');
       this._id = chart_id;
       this._root_url          = this._options['root_url'];
       this._tab               = this._options['tab'];
       this._page              = this._options['page'];
       this._chart_index       = this._options['chart_index'];
       if(this._options['disable_data_export'] == true)
	 this._enable_data_export = false;
       else
	 this._enable_data_export = true;


       this._height = this._options['height'];
       var media_url = this._options['media_url'];

       var chart_type = this._options['type'];
       KtDebug("chart_type: " + chart_type);//xxx
       var $this = $(this);
       var data_export_id = "data_export_"+ this._id;
       var data_export_anchor ="";
       if(this._enable_data_export)
	 data_export_anchor = '<a href = "#" id="' + data_export_id + '" class="export">Export</a>';


       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 : 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']))
       }
       else if (chart_type == 'dropdown')
       {
	 var dropdown_chart_id = chart_id + "_dropdown";
	 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>'+ data_export_anchor +'<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></div></div><div class="k-box-body">';
	 header_html_str += '<ul>&nbsp;&nbsp;&nbsp;&nbsp;<select id="'+ dropdown_chart_id +'">';

	 var dropDownList = this._options['dropdown'];
	 var dropDownListCount = this._options['dropdown'].length;
	 for(var i = 0; i < dropDownListCount; i++)
	 {
	   var dropDownValue = i+1;
	   var dropDownString = dropDownList[i];
	   header_html_str += '<option chart_id="'+ chart_id +'" value="'+ dropDownValue +'" >' + dropDownString+ '</option>';
	 }

	 header_html_str += '</select></ul>';
	 header_html_str += '<div class="box-chart-info" id="so_'+ this._id +'" style="height:'+ this._height +'"></div>';
	 header_html_str += '</div></div>';
	 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_id]);
	   }
	 );
       }
       else if (chart_type == 'tab_refactored')
       {
	 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>'+ data_export_anchor +'<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></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></li>';
	 }
	 header_html_str += '</ul></div> </div>';
	 $(this._element).append(header_html_str);

	 //TODO: setup event
       }


       if(this._enable_data_export)
       {
	 // bind data export link
	 var am_chart_obj = this;
	 $("#" + data_export_id).click(
	   function(){
	     //$("#" + data_export_launch_id).trigger('click');
	     var original_url = am_chart_obj._last_ajax_get_data_url;
	     if(original_url.search('np_ajax_multi') > -1)
	     {
	       var data_export_url = original_url.replace('np_ajax_multi', 'np_data_export');
	     }
	     else if(original_url.search('np_ajax') > -1)
	     {
	       var data_export_url = original_url.replace('np_ajax', 'np_data_export');
	     }
	     else if(original_url.search('custom_dashboard_ajax') > -1)
 	     {
 	       var data_export_url = original_url.replace('custom_dashboard_ajax', 'custom_dashboard_export');
 	     }
	     document.location = data_export_url;
	     return false;
	   }
	 );
       }

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

       this.bind_events();
     }
   };
   /////////////////////// 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)
	 if(this._options['show_frame'] == false)
	   show_chart_frame = false;
       return show_chart_frame;
     },

     _get_simple_header : function()
     {
        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) / 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()
   {
       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"));
     so.addParam("wmode", "opaque");
     this._so = so;
   };

   AmLineChartHandler.prototype._get_legend_list_if_necessary = function(legend_list)
   {
     if(legend_list == undefined || legend_list.length == 0)
     {
       var legend_url = this._get_legend_url();
       if(legend_url != undefined)
       {
	 $.ajax(
	   {
	     async: false,
	     type: "GET",
	     url :	legend_url,
	     data : {},
	     dataType: 'json',
	     success: function(msg){
	       legend_list = msg;
	     }
	   }
	 ); //$.ajax
       }
     }
     return legend_list;
   },

   AmLineChartHandler.prototype._get_additional_simple_chart_settings_str = function(legend_list)
   {
     legend_list = this._get_legend_list_if_necessary(legend_list);
     var len = legend_list.length;
     var xml_str = undefined;

     xml_str = "<settings><preloader_on_reload>true</preloader_on_reload>";

     var has_y_axi_setting =  (this._options['y_max_value'] != undefined ||
			       this._options['prefix'] != undefined ||
			       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'] != undefined)
	 xml_str += "<unit><![CDATA["+ this._options['prefix'] + "]]></unit><unit_position>left</unit_position>";
       else if(this._options['suffix'] != undefined)
       {
	 var suffix_text = this._options['suffix'];
	 // 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.
	 /*if(this._last_ajax_get_data_url == null)
	 {
	   suffix_text = escape(suffix_text);
	 }
	 xml_str += "<unit><![CDATA["+ suffix_text + "]]></unit><unit_position>right</unit_position>";*/
	 xml_str += "<unit><![CDATA["+ this._options['suffix'] + "]]></unit><unit_position>right</unit_position>";
       }
       xml_str +="</y_left></values>";
     }

     xml_str += "<graphs>";
     var multi_fill = this._options['multi_fill'];
     var series_prefix = this._options['series_prefix'];
     var series_suffix = this._options['series_suffix'];

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

     for(var i = 0; i < len; i++)
     {
        xml_str += "<graph gid ='" + i + "'><axis>";
        if (axes && axes.length > i) {
            xml_str += axes[i];

        } else {
            xml_str += "left";
        }
        xml_str += "</axis>";
        if(len == 1 || multi_fill == true)
            xml_str += "<fill_alpha>20</fill_alpha>";
        else
	        xml_str += "<fill_alpha>0</fill_alpha>";
        var a_prefix = this.prefix;
        var a_suffix = this.suffix;
        if (series_prefix) {
            a_prefix = series_prefix[i];
	    }
	    if (series_suffix) {
	        a_suffix = series_suffix[i];
	    }
        xml_str += "<title>" + legend_list[i] + "</title><color>" +this._color_lst[i] +"</color><line_width>"+ this._line_width+ "</line_width>" + this._get_graph_format_xml(a_prefix,a_suffix) + "</graph>";
     }
     xml_str +="</graphs></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 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");
//     alert(escape(media_url+"/amchart/ampie/ampie_settings.xml"));
     so.addVariable("settings_file", escape(media_url+"/amchart/ampie/ampie_settings.xml"));
     so.addParam("wmode", "opaque");
     this._so = so;
   };

   AmPieChartHandler.prototype._get_additional_simple_chart_settings_str = function(label_str)
   {
     KtDebug(label_str == 'undefined');
     KtDebug(label_str == undefined);
     // KtDebug(c_lst.slice(1,c_lst.length).toString())  //shift the array and output it

     if(label_str!=undefined)
     {
       var xml_str = "<settings><preloader_on_reload>true</preloader_on_reload><pie><colors>" + this._color_lst.toString() + "</colors><alpha>70</alpha></pie><labels>";
       xml_str += "<label lid ='0'><x>0</x><y>10</y><rotate>false</rotate><width></width><align>center</align><text_color></text_color><text_size>12</text_size><text>";
       xml_str += "<![CDATA[";
       xml_str +=	label_str;
       xml_str += "]]>";
       xml_str += "</text></label>";
       xml_str +="</labels></settings>";
       return xml_str;
     }
     return '';
   };

   AmPieChartHandler.prototype._get_additional_tab_chart_settings_str = function(legend_list, tab_index)
   {

   };

   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"));
     so.addParam("wmode", "opaque");
     this._so = so;
   };

   AmColumnChartHandler.prototype._get_additional_simple_chart_settings_str = function(legend_list)
   {
     legend_list = this._get_legend_list_if_necessary(legend_list);
     var len = legend_list.length;
     var xml_str = "<settings><preloader_on_reload>true</preloader_on_reload><graphs>";
     var multi_fill = this._options['multi_fill'];
     for(var i = 0; i < len; i++)
     {
       xml_str += "<graph gid = '" + i + "'>";
       xml_str += "<alpha>60</alpha>";
       xml_str += "<title>" + legend_list[i] + "</title><color>" + this._color_lst[i] + "</color><balloon_text><![CDATA[ {title}: {value} ]]></balloon_text></graph>";
     }
     xml_str +="</graphs></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();
     };
   }

   /////////////////////// 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"));
     so.addParam("wmode", "opaque");
     this._so = so;
   };

   AmBarChartHandler.prototype._get_additional_simple_chart_settings_str = function(legend_list)
   {
     legend_list = this._get_legend_list_if_necessary(legend_list);
     var len = legend_list.length;
     var xml_str = "<settings><preloader_on_reload>true</preloader_on_reload><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><graphs>";
     var multi_fill = this._options['multi_fill'];
     for(var i = 0; i < len; i++)
     {
       xml_str += "<graph gid = '" + i + "'>";
       xml_str += "<alpha>60</alpha>";
       xml_str += "<title>" + legend_list[i] + "</title><color>" + this._color_lst[i] + "</color><balloon_text><![CDATA[ {title} {value}"+this.suffix+"]]></balloon_text></graph>";
     }
     xml_str +="</graphs></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"));
     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(legend_list)
   {
     legend_list = this._get_legend_list_if_necessary(legend_list);
     var len = legend_list.length;
     var xml_str = "<settings><preloader_on_reload>true</preloader_on_reload><graphs>";
     var multi_fill = this._options['multi_fill'];
     for(var i = 0; i < len; i++)
     {
       xml_str += "<graph gid = '" + i + "'>";
       xml_str += "<alpha>60</alpha>";
       xml_str += "<title>" + legend_list[i] + "</title><color>" + this._color_lst[i] + "</color>"+ this._get_graph_format_xml()+"</graph>";
     }
     xml_str +="</graphs></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"));
     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();
     };
   }

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

   TabChartHandler.prototype = new AbstractAmChartHandler();

   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
     {
       $($("#"+ this._id + " a[id='"+tab_id+"']")[0]).addClass('active');
       index += tab_id;
     }
     this._sel_index = index;
     this._last_ajax_get_data_url = this._tab_last_ajax_url_dict[index];
   };

   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'];
	   if(sub_tab_index == $(this).attr('id'))
	   {
	     _this_obj._highlight_selected_tab(sub_tab_index);
	     $("#c"+sub_tab_index).show();
	   }
	   else
	   {
	     _this_obj._unhighlight_selected_tab(sub_tab_index);
	     $("#c"+sub_tab_index).hide();
	   }
	 }
	 return false;
       }
     );

     this._highlight_selected_tab();
   };

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

   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 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 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);






