;(function(jQuery)
{

  $.fn.ktChart = function(options)
  {
    var opts = $.extend({}, $.fn.ktChart.defaults, options);
    var selected_index = 0;

    var chartFilename = '';
    switch(opts['chartType'])
    {
    case "linechart":
      chartFilename = 'linechart.swf';
      break;
    case "barchart":
      chartFilename = 'barchart.swf';
      break;
    case "piechart":
      chartFilename = 'piechart.swf';
      break;
    case "worldmap":
      chartFilename = 'worldmap_real.swf';
      break;
    case "columnchart":
      chartFilename = 'columnchart.swf';
      break;
    }

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


    function _append_tabs(jQueryObj, jParentDiv, opts){
      _attach_tabs(jQueryObj, jParentDiv, opts, true);
    }

    function _prepend_tabs(jQueryObj, jParentDiv, opts){
      _attach_tabs(jQueryObj, jParentDiv, opts, false);
    }

    //if to_append is true, it appends.
    //o/w it repends
    function _attach_tabs(jChartObj, jParentDiv, opts, to_append){
      if(opts['type'] == 'tab')
      {
 	if(to_append == true)
 	  jParentDiv.append('<ul></ul>');
 	else
 	  jParentDiv.prepend('<ul></ul>');

	var $tab_dom = $(jParentDiv.children()[0]);

	var tabCount = opts['tabs'].length;
	for( var i = 0 ; i < tabCount ; i++ )
	{
	  var tabStr = opts['tabs'][i];
	  var chart_id = jChartObj.attr('id');
	  var tabStrID = jChartObj.attr('id')+tabStr.split(" ").join("_");
	  if(i == 0)
	  {
	    var html_str = '<li class="first"><a sub_tab="true" chartID="'+ chart_id +'" class="active" href="#" id="'+ tabStrID +'" index="'+i+'"><span>'+ tabStr +'</span></a></li>';
	  }
	  else
	  {
	    var html_str = '<li><a sub_tab="true" chartID="'+chart_id+'" href="#" id="'+ tabStrID +'" index="'+i+'"><span>'+ tabStr +'</span></a></li>';
	  }

	  $tab_dom.append(html_str);

	  $("#"+tabStrID).click(
	    function(){
	      selected_index = $(this).attr('index');
	      $("a[sub_tab='true'][class='active'][chartID='"+ chart_id +"']").removeClass("active");
	      $(this).addClass("active");
	      //get data
	      jChartObj.trigger({type:'flex_chart_tab_clicked',
				 tabIndex: $(this).attr('index')}, [chart_id]);
	      //	       jChartObj.trigger('flex_chart_tab_clicked', {'id' : chart_id,
	      //							    'tabIndex': $(this).attr('index')});
	      return false;
	    }
	  );

	}// for
      }// if
    }

    function _append_checkboxes(jChartObj, jParentDiv, opts){
      _attach_checkboxes(jChartObj, jParentDiv, opts, true);
    }

    function _prepend_checkboxes(jChartObj, jParentDiv, opts){
      _attach_checkboxes(jChartObj, jParentDiv, opts, false);
    }

    function _attach_checkboxes(jChartObj, jParentDiv, opts, to_append){
      if(opts['type'] == 'checkbox')
      {
	if(to_append == true)
	  jParentDiv.append('<ul></ul>');
	else
	  jParentDiv.prepend('<ul></ul>');

	var $cb_dom = $(jParentDiv.children()[0]);

	var cbCount = opts['checkboxes'].length;
	for( var i = 0 ; i < cbCount ; i++ )
	{
	  var cbStr = opts['checkboxes'][i];
	  var chart_id = jChartObj.attr('id');
	  var cbStrID = jChartObj.attr('id')+cbStr.split(" ").join("_");
	  cbStrID = cbStrID.split("/").join("_");


	  if(i ==0)
	  {
	    var html_str = '<li class="first"><input sub_tab="true" chartID="'+chart_id+'" id="'+cbStrID+'" type="checkbox" index="'+i+'"/><span style="font-family:Arial,sans-serif;">'+cbStr+'</span></li>';
	  }
	  else
	  {
	    var html_str = '<li><input sub_tab="true" chartID="'+chart_id+'" id="'+cbStrID+'" type="checkbox" index="'+i+'"/><span style="font-family:Arial,sans-serif;">'+cbStr+'</span></li>';
	  }

	  $cb_dom.append(html_str);
	  $("#"+cbStrID).click(
	    function(){
	      var stat_lst = [];
	      $.each($('input[sub_tab="true"][chartID="'+chart_id+'"]:checked'),
		     function(){
		       stat_lst.push($(this).attr('index'));
		     }
		    );
	      jChartObj.trigger({type:'flex_chart_checkbox_clicked',
				 cbList: stat_lst}, [chart_id]);
	      return true;
	    }
	  );

	}// for
      }
    }

    function _append_dropdown(jChartObj, jParentDiv, opts){
      _attach_dropdown(jChartObj, jParentDiv, opts, true);
    }

    function _prepend_dropdown(jChartObj, jParentDiv, opts){
      _attach_dropdown(jChartObj, jParentDiv, opts, false);
    }

    function _attach_dropdown(jChartObj, jParentDiv, opts, to_append){
      if(opts['type'] == 'dropdown')
      {
	var chart_id = jChartObj.attr('id');
	var dropdown_chart_id = chart_id + "_dropdown";
	if(to_append == true)
	  jParentDiv.append('<ul>&nbsp;&nbsp;&nbsp;&nbsp;<select id="'+ dropdown_chart_id +'"></select></ul>');
	else
	  jParentDiv.prepend('<ul>&nbsp;&nbsp;&nbsp;&nbsp;<select id="'+ dropdown_chart_id +'"></select></ul>');

	var $cb_dom = $(jParentDiv.children().children()[0]);

	var cbCount = opts['dropdown'].length;
	for(var i =0; i< cbCount; i++)
	{
	  var cbStr = opts['dropdown'][i];
	  //var cbStrValue = cbStr.split(" ").join("_");
	  var cbValue =	i + 1;
	  var html_str = '<option chart_id="'+ chart_id +'" value="'+ cbValue +'" >' + cbStr+ '</option>';
	  $cb_dom.append(html_str);
	}// for

	$("#"+dropdown_chart_id).change(
	  function(){
	    var sel_id = $(this).attr('id');
	    var sel_v = $("#"+sel_id+ " option:selected").val();
	    jChartObj.trigger({type: 'flex_chart_dropdown_selected',
			       dropdown_v: sel_v},
			      [chart_id]);
	  }
	);
      }
    }

    function _getFlexObj(jChartObj)
    {
      var chart_id = jChartObj.attr('id');
      if(navigator.appName.indexOf("Microsoft") != -1)
      {
	var flexChartObj = window[chart_id + "_object"];
      }
      else
      {
	var flexChartObj = document[chart_id];
      }
      return flexChartObj;
    }

    // iterate each element
    return this.each(
      function(){
	var $this = $(this);
	var chart_id = $this.attr('id');
	$this.attr('root_url', opts['root_url']);
	$this.attr('class', 'k-box');
	$this.prepend('<div class="k-box-body" box_type="chart"></div>');
	var $top_level_div = $($this.children()[0]);
	var last_ajax_get_data_url = undefined;

	var applied_multi_filters = null;

	var swf_width = "100%";
	if(opts['chartType'] == 'worldmap')
	{
	  swf_width = "820px";
	}

	var enable_data_export = false;
	var data_export_id = "data_export_" + chart_id;
	var data_export_anchor = "";
	if( opts['enable_data_export'] == true )
	{
	  enable_data_export = true;
	  data_export_anchor = '<a href = "#" id="' + data_export_id + '" class="export">Export</a>';
	}

	if($.browser.msie){
	  // fuck you, IE.
	  var html_str =   '<div style="height:'+ opts['height']+'; padding: 15px; text-align:center"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="'+chart_id+'_object" width="'+ swf_width +'" height="100%" codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">'+
	    '<param id="'+chart_id+'_param" name="movie" value="'+opts['media_url']+'/swf/'+chartFilename+'" width="'+ swf_width +'" height="100%"/>' +
	    '<param name="wmode" value="transparent" />' +
	    '<param name="FlashVars" value="app_id='+chart_id+'&direction='+opts['direction']+'" />'+
	    '<param name="AllowScriptAccess" value="always"/>' +
	    '<param id="chartVars" name="FlashVars" value="wtf"/>' +
	    '<embed id="'+chart_id+'_embed" name="'+chart_id+'" src="'+opts['media_url']+'/swf/'+chartFilename+'" wmode="transparent" width="'+ swf_width +'" height="100%" FlashVars="app_id='+chart_id+'&direction='+opts['direction']+'"></embed>'+
	    '</object></div>';
	  this.childNodes[0].innerHTML = html_str;
	}
	else{
	  //	   _append_tabs($this, $top_level_div, opts);
	  //	   _append_checkboxes($this, $top_level_div, opts);
	  $top_level_div.append('<div style="height:'+ opts['height']+'; padding: 15px; text-align:center"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="'+chart_id+'_object" width="'+swf_width+'" height="100%" codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab"></object></div>');

	  var $object_dom = $($top_level_div.children()[0]);
	  $object_dom = $($object_dom.children()[0]);
	  /*if(opts['type'] == 'simple')
	   {
	   var $object_dom = $($top_level_div.children()[0]);
	   $object_dom = $($object_dom.children()[0]);
	   }
	   else
	   {
	   var $object_dom = $($top_level_div.children()[1]);
	   $object_dom = $($object_dom.children()[0]);
	   }*/

	  $object_dom.append('<param id="'+chart_id+'_param" name="movie" value="'+opts['media_url']+'/swf/'+chartFilename+'" width="'+swf_width+'" height="100%"/>');
	  $object_dom.append('<param name="wmode" value="transparent" />');
	  $object_dom.append('<param name="FlashVars" value="app_id='+chart_id+'&direction='+opts['direction']+'" />');
	  //	   $object_dom.append('<embed id="'+chart_id+'_embed" name="'+chart_id+'" src="'+opts['media_url']+'/swf/'+chartFilename+'" wmode="transparent" width="100%" height="100%" FlashVars="app_id='+chart_id+'&direction='+opts['direction']+'"></embed>');
	  $object_dom.append('<embed id="'+chart_id+'_embed" name="'+chart_id+'" src="'+opts['media_url']+'/swf/'+chartFilename+'?app_id='+chart_id+'&direction='+opts['direction']+'" wmode="transparent" width="'+swf_width+'" height="100%"></embed>');
	  //$object_dom.append('<embed id="'+chart_id+'_embed" name="'+chart_id+'" src="'+opts['media_url']+'/swf/'+chartFilename+'" wmode="transparent" width="100%" height="100%"></embed>');
	}

	_prepend_tabs($this, $top_level_div, opts);
	_prepend_checkboxes($this, $top_level_div, opts);
	_prepend_dropdown($this, $top_level_div, opts);

	if(navigator.appName.indexOf("Microsoft") != -1)
	{
	  var flexChartObj = window[chart_id + "_object"];
	}
	else
	{
	  var flexChartObj = document[chart_id];
	}

	// handle flex_chart_ready event
	// When the chart is first ready.
	$(document).bind('flex_chart_ready',
			 function(event,msg)
			 {
			   if(msg == chart_id)
			   {
			     var url = "";
			     if(opts['type'] == 'tab')
			     {
			       //tab
			       url = opts['get_chart_data_tab_func']($this, selected_index);
			     }
			     else
			     {
			       //normal
			       url = opts['get_chart_data_func']($this);
			     }
			     url += "&curr_url="+_get_curr_url();
			     flexChartObj.set_url(url);
			     applied_multi_filters = null;
			   }
			   last_ajax_get_data_url = url;
			 }
			);

	// When the filter is applied
	$(document).bind('load_all_chart',
			 function(event, msg)
			 {
			   var url = "";
			   if(opts['type'] == 'tab')
			   {
			     //tab
			     url = opts['get_chart_data_tab_func']($this, selected_index);
			   }
			   else
			   {
			     //normal
			     url = opts['get_chart_data_func']($this);
			   }
			   url += "&curr_url="+_get_curr_url();
			   flexChartObj.set_url(url);
			   applied_multi_filters = null;
			   last_ajax_get_data_url = url;
			 }
			);

	// When the chart's tab is clicked.
	$this.bind('flex_chart_tab_clicked',
		   function(event,msg)
		   {
		     if(msg == chart_id)
		     {
		       if(applied_multi_filters == null)
		       {
			 var url = opts['get_chart_data_tab_func']($this, event.tabIndex);
			 url += "&curr_url=" + _get_curr_url();
			 flexChartObj.set_url(url);
		       }
		       else
		       {
			 //multi
			 var url = opts['get_chart_multi_data_tab_func']($this, event.tabIndex, applied_multi_filters);
			 url+= "&curr_url="+_get_curr_url();
			 flexChartObj.set_url(url);
		       }
		     }
		     last_ajax_get_data_url = url;
		   }
		  );

	// When the chart's checkbox is clicked.
	$this.bind('flex_chart_checkbox_clicked',
		   function(event, msg)
		   {
		     if(msg == chart_id)
		     {
		       if(event.cbList.length == 0)
			 return;
		       var url = opts['get_chart_data_cb_func']($this, event.cbList);
		       url += "&curr_url=" + _get_curr_url();
		       flexChartObj.set_url(url);
		     }
		     last_ajax_get_data_url = url;
		   }
		  );
	// When the chart's dropdown is changed.
	$this.bind('flex_chart_dropdown_selected',
		   function(event, msg)
		   {
		     if(msg == chart_id)
		     {
		       if(applied_multi_filters == null)
		       {
			 var url = opts['get_chart_data_dropdown_func']($this, event.dropdown_v);
			 url += "&curr_url="+_get_curr_url();
			 flexChartObj.set_url(url);
		       }
		       else
		       {
			 //multi
			 var url = opts['get_chart_multi_data_dropdown_func']($this, event.dropdown_v, applied_multi_filters);
			 url+= "&curr_url=" + _get_curr_url();
			 flexChartObj.set_url(url);
		       }
		     }
		     last_ajax_get_data_url = url;
		   }
		  );


	// When the chart is first ready and need to get multi filtered data.
	$(document).bind('flex_multi_chart_ready',
			 function(event,msg)
			 {
			   if(msg == chart_id)
			   {
			     var url = "";
			     if(opts['type'] == 'tab')
			     {
			       //tab
			       url = opts['get_chart_multi_data_tab_func']($this, selected_index, event.saved_filters);
			     }
			     else
			     {
			       //normal
			       url = opts['get_chart_multi_data_func']($this, event.saved_filters);
			     }

			     url+= "&curr_url="+_get_curr_url();
			     applied_multi_filters =  event.saved_filters;
			     flexChartObj.set_url(url);
			   }
			   last_ajax_get_data_url = url;
			 }
			);

	$(document).bind('load_all_charts_multi',
			 function(event,msg)
			 {
			   var url ="";
			   if(opts['type'] == 'tab')
			   {
			     //tab
			     url = opts['get_chart_multi_data_tab_func']($this, selected_index, event.saved_filters);
			   }
			   else
			   {
			     //normal
			     url = opts['get_chart_multi_data_func']($this, event.saved_filters);
			   }
			   url += "&curr_url="+_get_curr_url();
			   applied_multi_filters =  event.saved_filters;
			   flexChartObj.set_url(url);
			   last_ajax_get_data_url = url;
			 }
			);

	//prepend chart's header, bubble, etc.
	var header_html_str = '<div class="k-box-head"><div class="k-box-head-info"><h1>'+ opts['header_txt'] +'</h1><a href="#" class="help" index="'+opts['index']+'" title="'+opts['bubble_txt']+'">help</a>'+ data_export_anchor +'<ul class="icons"><li><a href="#"><img src="'+opts['media_url']+'/images/ico6.jpg" width="19" height="24" alt="" /></a></li><li><a href="#"><img src="'+opts['media_url']+'/images/ico3.jpg" width="19" height="24" alt="" /></a></li><li><a href="#"><img src="'+opts['media_url']+'/images/ico9.jpg" width="16" height="24" alt="" /></a></li></ul></div></div>';
	$this.prepend(header_html_str);

	if(enable_data_export)
	{
	  $("#" + data_export_id).click(
	    function()
	    {
	      var original_url = 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');
	     }
	     data_export_url = data_export_url.replace('t=x', 't=j');
	     document.location = data_export_url;
	     return false;
	    }
	  );
	}
      }
    );
  };

   // default options
   $.fn.ktChart.defaults = {
     media_url : '',
     root_url  : '',
     chartType : 'linechart',
     direction : 'horizontal',
     type      : 'simple', // simple, tab, checkbox, dropdown (Only one tab can be selected at a time, while multi checkboxes can be selected)
     height    : '200px',
     tabs      : [], // for  tab
     checkboxes: [], // for  checkboxes
     dropdown : [], // for  dropdown  //idx starts from 1 instead of zero.

     get_chart_data_func: function(data)
     {
       var id = data.attr('id');
       var root_url = data.attr('root_url');
       var url_str = root_url+"/ajax_get_chart_data/?chart_id="+id;
       return url_str;
     },


     get_chart_data_cb_func: function(data, cbList)
     {
       var id = data.attr('id');
       var root_url = data.attr('root_url');
       var cb_index_array = [];
       $.each(cbList, function(){
		//cb_index_array.push($(this).attr('index'));
		cb_index_array.push(this);
	      });
       var cb_index_str = cb_index_array.join(",");
       var url_str = root_url+"/ajax_get_chart_data/?chart_id="+id+"&cb_list="+cb_index_str;
       return url_str;
     },

     get_chart_data_tab_func: function(data, index)
     {
       var id = data.attr('id');
       var root_url = data.attr('root_url');
       var url_str = root_url+"/ajax_get_chart_data/?chart_id="+id +"&idx="+index;
       return url_str;
     },

     get_chart_data_dropdown_func: function(data, dropdown_v)
     {
       var id = data.attr('id');
       var root_url = data.attr('root_url');
       var url_str = root_url +"/ajax_get_chart_data/?chart_id="+ id +"&dropdown_v=" + dropdown_v;
       return url_str;
     },

     get_chart_multi_data_tab_func: function(data, index, saved_filters)
     {
       var id = data.attr('id');
       var root_url = data.attr('root_url');
       var f_ids = saved_filters.join(",");
       var url_str = root_url+"/ajax_get_chart_data_multi_filter/?chart_id="+id+"&f_ids="+f_ids+"&idx="+index;
       return url_str;
     },

     get_chart_multi_data_dropdown_func: function(data, index, saved_filters)
     {
       var id = data.attr('id');
       var root_url = data.attr('root_url');
       var f_ids = saved_filters.join(",");
       var url_str = root_url+"/ajax_get_chart_data_multi_filter/?chart_id="+id+"&f_ids="+f_ids+"&dropdown_v="+index;
       return url_str;
     },

     get_chart_multi_data_func: function(data, saved_filters)
     {
       var id = data.attr('id');
       var root_url = data.attr('root_url');
       var f_ids = saved_filters.join(",");
       var url_str = root_url+"/ajax_get_chart_data_multi_filter/?chart_id="+id+"&f_ids="+f_ids;
       return url_str;
     }

   };

 }
)(jQuery);

