/**
 * amcharts - handle the creation and updating of amcharts flash object 
 * 
 * @author: Chanel Munezero <chanel.munezero@escapemg.com>
 */
(function(){
    if(!window.gs) {
        return;
    }
    
    var amcharts = window.gs.amcharts = {
        // default options/settings
        minFlashVersion: "9.0.0",
        chartSrc: {
            'column': 'amcolumn.swf',
            'line': 'amline.swf',
            'map': 'ammap.swf',
            'bar': 'ambar.swf',
            'pie': 'ampie.swf'
        },
        defaults: {
            width: '100%',
            height: '350',
            type: 'all',
            // graph view 
            grouping: 'day',
            view: 'column',
            // date params
            start: '',
            end: '',

            // swfobject, containerId
            replaceId: '',

            // location of data file
            data_file: '/analytics/artistPerformance.xml',

            // amcharts settings
            path:'',
            settings_file: '',
            preloader_color: '#cccccc',
            bgcolor: '#ffffff',
            quality: 'hight',

            empty: null
        },
        options: {},
        chart: null,
        charts: [],
        lastDate: '',

        empty: null
    };

    amcharts.init = function() {
        $('.chart').each(function(i) {
            this.id = 'chart'+i;
            if(!$(this).children().length) {
                $(this).append('<div id="'+this.id+'replace"></div>');
            }
            var replaceId = this.id+'replace';
            var form = $(this).siblings('form');
            debug('another chart',this, form);
            var newChart = amcharts.getChart(amcharts.getFormOptions(form, replaceId));
            amcharts.charts.push(newChart);
        });
        if(amcharts.charts[0]) {
            amcharts.chart = amcharts.charts[0];
        }

        // setup amchart default functions
        amcharts.setAmchartDefaultFunctions();
    };

    //  use form to get default option params
    amcharts.getFormOptions = function(form, replaceId) {
        form = form || '';
        var newType = $('.type',form).val()||amcharts.defaults.type;
        var newGroup = $('.grouping',form).val()||amcharts.defaults.grouping;
        var newDatafile = $('.data_file',form).val()||amcharts.defaults.data_file;
        newDatafile += escape('&type='+newType+'&group='+newGroup);
        // extra options: create input with value and give it same class name as default value (set above)
        var options = {
            replaceId: replaceId,
            data_file: newDatafile,
            width: $('.width',form).val()||amcharts.defaults.width,
            height: $('.height',form).val()||amcharts.defaults.height,
            start: $('.start',form).val(),
            end: $('.end',form).val(),
            path: $('.path',form).val(),
            type: newType,
            grouping: newGroup,
            view: $('.view',form).val()||amcharts.defaults.view,
            settings_file: $('.settings_file',form).val()||amcharts.defaults.settings_file,
            preloader_color: $('.preloader',form).val()||amcharts.defaults.preloader_color
        }
        return options;
    };
    
    amcharts.getChart = function(options)
    {
        options = $.extend({}, amcharts.defaults, options);
        if(options.data_file && options.replaceId) {
            // they have required info to  display flash file
            // first create swf object, then return object
            amcharts.embedSwf(options);
            return {
                chart: $('#'+options.replaceId).get(0),
                defaults: amcharts.defaults,
                options: options,
                minFlashVersion: amcharts.minFlashVersion,
                chartSrc: amcharts.chartSrc,

                // functions
                update: amcharts.update,
                remove: function() { gs.amcharts.remove(this.chart); }, 

                empty: null
            }
        }
        // required info not given
        return false;
    };

    amcharts.embedSwf = function(options)
    {
        var swfUrl = amcharts.chartSrc[options.view]
        swfUrl = swfUrl || amcharts.chartSrc.bar;
        swfUrl = gs.staticPath + 'flash/amcharts/'+swfUrl;
        //var dataParams = encodeURI('&type='+options.type+'&group='+options.grouping);
        var dataParams = escape('&type='+options.type+'&group='+options.grouping);
        var vars = {
            data_file: options.data_file + dataParams,
            path: options.path,
            settings_file: options.settings_file,
            preloader_color: options.preloader_color
        }
        var params = {
            wmode: 'transparent'
        }
        var attributes = {
            name: options.replaceId,
            quality: 'high'
        }
        debug('options', options, amcharts.chartSrc);
        debug('swf object embed:',swfUrl, options.replaceId, options.width, options.height, options.data_file, options.settings_file,
                        amcharts.minFlashVersion, vars, params, attributes);
        swfobject.embedSWF(swfUrl, options.replaceId, options.width, options.height, 
                        amcharts.minFlashVersion, null, vars, params, attributes);
        debug('new chart', $('#'+options.replaceId).get(0));
    }

    /*
     * update chart and set options
     */
    amcharts.update = function(options) {
        this.options = $.extend({}, this.options, options);
        debug('amcharts update',this, this.options.replaceId);
        if(this.chart) {
            debug('we have a chart:', this.chart, this.options);
            amcharts.embedSwf(this.options);
        } else {
            debug('no this.chart,', this, this.chart);
        }
    };

    amcharts.remove = function(chart) {
        chart = $(chart).remove();
        if(this.chart){
            this.chart = chart;
        }
    };

    amcharts.updateView = function(view, obj) {
        // send update request
        amcharts.chart.update({view:view});
        // change what's currently highlighted
        $(obj).addClass('active').parent().siblings().children().removeClass('active');
        return false;
    };

    amcharts.updateGrouping = function(view, obj) {
        // send update request
        amcharts.chart.update({grouping:view});
        // change what's currently highlighted
        $(obj).addClass('active').parent().siblings().children().removeClass('active');
        return false;
    };
    
    amcharts.getDateString = function(date) {
        if(!date.getUTCDate) {
            //NOT real date
            debug('not real date', date);
            date = new Date();
        }
        var dateString = date.getYear()+'-'+date.getMonth()+'-'+date.getDate();
        debug('final date string:'+dateString, date);
        return dateString;
    };

    amcharts.initDatepicker = function(container, songContainer, endpoint) {
        // Date Pickers
        var container = container || '#dateContainer';
        var songContainer = songContainer || '#songContainer';
        var today = new Date();
        var year = today.getFullYear();
        var month = today.getMonth();
        var day = today.getDate();
        var cleanupDates = function(arrDate) {
            for(i=0; i<arrDate.length; i++) {
                arrDate[i] = (arrDate[i].match(/^0/)) ? parseInt(arrDate[i].substring(1)) : parseInt(arrDate[i]);
            }
            return arrDate;
        }
        $(container).datepicker({
            maxDate: new Date(),
            showOn: 'both',
            changeMonth: false,
            changeYear: false,
            rangeSelect: true,
            numberOfMonths: [1,2],
            showOtherMonths: true, // why show if user can't select
            onSelect: function(date) {
                //debug('datepicker onselect',date);
                var dates = date.split(' - ');
                //debug(dates);
                var start, newStart, end, newEnd;
                if(dates[0]) {
                    start = cleanupDates(dates[0].split('/'));
                    newStart = $.datepicker.formatDate('M d, yy', (new Date(parseInt(start[2]),parseInt(start[0])-1,parseInt(start[1]))));
                }
                if(dates[1]) {
                    end = cleanupDates(dates[1].split('/'));
                    newEnd = $.datepicker.formatDate('M d, yy', (new Date(parseInt(end[2]),parseInt(end[0])-1,parseInt(end[1]))));
                }
                /*
                debug('new form', start, newStart, end, newEnd);
                debug('start indepth', parseInt(start[2]),parseInt(start[0])-1,parseInt(start[1]));
                debug('end indepth', parseInt(end[2]),parseInt(end[0])-1,parseInt(end[1]));
                debug('new date', new Date(parseInt(end[2]),parseInt(end[0])-1,parseInt(end[1])).toString());
                */
                // format: Oct 20, 2008 - Nov. 20, 2008
                $('#dateView').html(newStart+' - '+newEnd);
            },
            altFormat: 'M d, yy',
            altField: '#dateView'
        });

        // add formatting to calendar
        $(container).append('<div class="clear"></div>');
        $(container).append($(container).children('.options').remove());
        $(container).prepend('<div class="header"></div>').append('<div class="footer"></div><div class="clear"></div>');

        // add slide up/down to datepicker button click
        $('button.submit',container).click(function(){
            window.location = endpoint+'&grouping='+amcharts.chart.options.grouping+"&dateRange="+$('#dateView').html();
            return false;
        });
        $('button.datePicker').click(function(){
            $(container).slideToggle();
            return false;
        });
        $(container + ' button.cancel').click(function(){
            $(container).slideToggle();
            return false;
        });

        /* Drop down for songs */
        $('button.songTypes').click(function(){
            $(songContainer).slideToggle();
            return false;
        });
        $('button.cancel', songContainer).click(function(){
            $(songContainer).slideToggle();
            return false;
        });
        $('button.submit', songContainer).click(function(){
            var value;
            $('input.type', songContainer).each(function() {
                if(this.checked) {
                    value = this.value;
                }
            });
            var locs = '';
            $('select.location', songContainer).each(function() {
                if(!this.disabled && this.value) {
                    locs += '&' + this.name + '=' + this.value;
                }
            });
            debug('song type submit', value);
            debug('loc submit', locs);
            if(value) {
                var tt = endpoint + ((value) ? "&type="+value : "");
                if(gs.amcharts.chart) {
                    window.location = tt+'&grouping='+gs.amcharts.chart.options.grouping;
                } else {
                    window.location = tt;
                }
            }
            if(locs) {
                var tt = endpoint + ((locs) ? locs : "");
                if(gs.amcharts.chart) {
                    window.location = tt+'&grouping='+gs.amcharts.chart.options.grouping;
                } else {
                    window.location = tt;
                }
            }
            //$(songContainer).slideToggle();
            return false;
        });
    }

    amcharts.toggleDateRange = function(input) {
        if(!input) { return false; }
        debug('toggle date range', input, input.checked);
        var dateContainer = $(input).siblings('.dateRange');
        var button = dateContainer.children('button');
        if(input.checked) {
            dateContainer.css('opacity', 1);
            button.removeAttr('disabled');
            $('#dateView').text(amcharts.lastDate);
        } else {
            dateContainer.css('opacity', 0.5);
            button.attr('disabled', 'disabled');
            amcharts.lastDate = $('#dateView').text();
            $('#dateView').text("");
        }
    }

    amcharts.countrySelectChange = function(select) {
        if(!select.value) { return false; }
        debug('country sel change', select, select.value);
        $('#viewLocation .selectLabel').text(select.value);
        if($('#'+select.value+'regions').length) {
            $('#'+select.value+'regions').show().siblings('div').hide();
            $('#'+select.value+'regions').find('select').removeAttr('disabled');
            $('#songContainer .cities').hide();
            return false;
        }
        var params = {country:select.value};
        $.getJSON('/analytics/localities.json', params, function(json) {
            debug('locals country json return', json);
            var regions = '';
            for(var i=0; i<json.length; i++) {
                regions += '<option value="'+json[i]+'">'+json[i]+'</option>';
            }
            var newRegion = $('#songContainer .regions .template').clone(true).show();
            newRegion.attr('class','').attr('id',select.value+'regions').find('select').html(regions).removeAttr('disabled');
            if(regions.length==0) { newRegion.find('select').replaceWith('No Regions'); }
            $('#songContainer .regions').append(newRegion);
            newRegion.show().siblings('div').hide().find('select').attr('disabled',true);
            $('#songContainer .cities').hide();
        });
    }
    amcharts.regionSelectChange = function(select) {
        if(!select.value) { return false; }
        debug('region sel change', select, select.value, $('#songContainer select.country').val());
        var country = $('#songContainer select.country').val();
        $('#viewLocation .selectLabel').text(select.value +', '+ country);
        if($('#'+country+select.value+'cities').length) {
            $('#'+country+select.value+'cities').show().siblings('div').hide().find('select').removeAttr('disabled');
            $('#'+country+select.value+'cities').show().find('select').removeAttr('disabled');
            return false;
        }
        var params = {region:select.value, country:country};
        $.getJSON('/analytics/localities.json', params, function(json) {
            debug('locals regions json return', json);
            var cities = '';
            for(var i=0; i<json.length; i++) {
                cities += '<option value="'+json[i]+'">'+json[i]+'</option>';
            }
            var newCity = $('#songContainer .cities .template').clone(true).show();
            newCity.attr('class','').attr('id',select.value+'cities').find('select').html(cities).removeAttr('disabled');
            if(cities.length==0) { newCity.find('select').replaceWith('No Cities'); }
            $('#songContainer .cities').append(newCity);
            newCity.show().siblings('div').hide().find('select').attr('disabled',true);
            $('#songContainer .cities').show();
        });
    }
    amcharts.citySelectChange = function(select) {
        var country = $('#songContainer select.country').val();
        var region = $('#songContainer select.region').val();
        $('#viewLocation .selectLabel').text(select.value +', '+ region +', '+ country);
    }
    
    amcharts.regionRemove = function(div) {
        $(div).parent().parent().hide().find('select').attr('disabled',true);
        $('#songContainer .cities').hide().find('select').attr('disabled',true);
        var country = $('#songContainer select.country').val();
        $('#viewLocation .selectLabel').text(country);
    }
    amcharts.cityRemove = function(div) {
        $(div).parent().parent().hide().find('select').attr('disabled',true);
        var country = $('#songContainer select.country').val();
        var region = $('#songContainer select.region').change().val();
        $('#viewLocation .selectLabel').text(region +', '+ country);
    }

    /*
     * Default Amcharts functions
     * http://amcharts.com/docs/v.1/bundle/javascript/function_list
     * http://amcharts.com/docs/v.1/bundle/javascript/line_area_custom_functions
     */
    amcharts.setAmchartDefaultFunctions = function() {
    debug('set def funct');
        window.amChartInited = amcharts.amChartInited;
        window.amReturnData = amcharts.amReturnData;
        window.amReturnSettings = amcharts.amReturnSettings;
        window.amReturnImageData = amcharts.amReturnImageData;
        window.amReturnParam = amcharts.amReturnParam;
        window.amError = amcharts.amError;
        window.amProcessCompleted = amcharts.amProcessCompleted;
    }
    // This function is called when the chart is fully loaded and initialized. 
    amcharts.amChartInited = function(chartId) {
        debug('amcharts callback- amChartInited: '+chartId);
    }
    // This function is called when you request data from a chart by calling the flashMove.getData() function. 
    amcharts.amReturnData = function(chartId, data) {
        debug('amcharts callback- amReturnData: '+chartId, data);
    }
    // This function is called when you request settings from a chart by calling the flashMove.getSettings() function. 
    amcharts.amReturnSettings = function(chartId, settings) {
        debug('amcharts callback- amReturnSettings: '+chartId, settings);
    }
    // When exporting chart as an image, the chart passes image data to this function. 
    amcharts.amReturnImageData = function(chartId, data) {
        debug('amcharts callback- amReturnImageData: '+chartId, data);
    }
    // This function is called when you request a setting from a chart by calling the flashMovie.getParam(param) function.  
    amcharts.amReturnParam = function(chartId, param) {
        debug('amcharts callback- amReturnParam: '+chartId, param);
    }
    // This function is called when an error occurs, such as no data, or file not found. 
    amcharts.amError = function(chartId, error) {
        debug('amcharts callback- amError: '+chartId, error);
    }
    // This function is called when the chart finishes doing some task triggered by another JavaScript function. 
    amcharts.amProcessCompleted = function(chartId, processName) {
        debug('amcharts callback- amProcessCompleted: '+chartId, processName);
    }
})();

