;
(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 = "#" title="Export to CSV" id="' + data_export_id + '" class="k-box-icon export_link">&nbsp;</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);

