var parseInputDate = function (inputDate) {
    return moment(inputDate);
};
(function($scope) {
    // The short URL whose stats are displayed.
    $scope.short_url = '';
    // Callbacks for Jaxon requests
    $scope.requestCallbacks = {
        timers: [],
        onRequest: function() {
            $('#stats-buttons .btn-refresh-stats').prepend('<i class="fa fa-spinner fa-spin" />');
        },
        onFailure: function() {
            $('#stats-buttons .btn-refresh-stats i').remove();
        },
        onSuccess: function() {
            $('#stats-buttons .btn-refresh-stats i').remove();
        }
    };
    $scope.populateEmptyDayData = function () {
        // Populate empty days in $scope.dayData with zeroes
        // Number of days in range
        var numDays = moment(datePickerRightBound).diff(moment(datePickerLeftBound), 'days');
        var i = moment(datePickerLeftBound);
        var daysWithData = {};
        // Generate hash map to keep track of dates with data
        _.each($scope.dayData, function (point) {
            var dayDate = point.x;
            daysWithData[dayDate] = true;
        });
        // Push zeroes for days without data
        _.each(_.range(0, numDays), function () {
            var formattedDate = i.format('YYYY-MM-DD');
            if (!(formattedDate in daysWithData)) {
                // If day does not have data, fill in with 0
                $scope.dayData.push({
                    x: formattedDate,
                    y: 0
                })
            }
            i.add(1, 'day');
        });
        // Sort dayData from least to most recent
        // to ensure Chart.js displays the data correctly
        $scope.dayData = _.sortBy($scope.dayData, ['x'])
    }
    $scope.initDayChart = function () {
        var ctx = $("#dayChart");
        // Populate empty days in dayData
        $scope.populateEmptyDayData();
        $scope.dayChart = new Chart(ctx, {
            type: 'line',
            data: {
                datasets: [{
                    label: 'Clicks',
                    data: $scope.dayData,
                    pointHoverBackgroundColor: "rgba(75,192,192,1)",
                    pointHoverBorderColor: "rgba(220,220,220,1)",
                    backgroundColor: "rgba(75,192,192,0.4)",
                    borderColor: "rgba(75,192,192,1)",
                }]
            },
            options: {
                scales: {
                    xAxes: [{
                        type: 'time',
                        time: {
                            unit: 'day'
                        }
                    }],
                    yAxes: [{
                        ticks: {
                            min: 0
                        }
                    }]
                }
            }
        });
    };
    $scope.initRefererChart = function () {
        // Traffic sources
        var ctx = $("#refererChart");
        var srcLabels = [];
        // var bgColors = [];
        var bgColors = [ '#003559', '#162955', '#2E4272', '#4F628E', '#7887AB', '#b9d6f2'];
        var srcData = [];
        _.each($scope.refererData, function (item) {
            if (srcLabels.length > 6) {
                // If more than 6 referers are listed, push the seventh and
                // beyond into "other"
                srcLabels[6] = 'Other';
                srcData[6] += item.clicks;
                bgColors[6] = 'brown';
                return;
            }
            srcLabels.push(item.label);
            srcData.push(item.clicks);
        });
        $scope.refererChart = new Chart(ctx, {
            type: 'pie',
            data: {
                labels: srcLabels,
                datasets: [{
                    data: srcData,
                    backgroundColor: bgColors
                }]
            }
        });
        $('#refererTable').DataTable();
    };
    $scope.initCountryChart = function () {
        var parsedCountryData = {};
        _.each($scope.countryData, function(country) {
            parsedCountryData[country.label] = country.clicks;
        });
        $('#mapChart').vectorMap({
            map: 'world_mill',
            series: {
                regions: [{
                    values: parsedCountryData,
                    scale: ['#C8EEFF', '#0071A4'],
                    normalizeFunction: 'polynomial'
                }]
            },
            onRegionTipShow: function(e, el, code) {
                el.html(el.html()+' (' + (parsedCountryData[code] || 0) + ')');
            }
        });
    };
    $scope.initDatePickers = function () {
        var $leftPicker = $('#left-bound-picker');
        var $rightPicker = $('#right-bound-picker');
        var datePickerOptions = {
            showTodayButton: true,
            format: 'YYYY-MM-DD HH:mm'
        }
        $leftPicker.datetimepicker(datePickerOptions);
        $rightPicker.datetimepicker(datePickerOptions);
        $leftPicker.data("DateTimePicker").parseInputDate(parseInputDate);
        $rightPicker.data("DateTimePicker").parseInputDate(parseInputDate);
        $leftPicker.data("DateTimePicker").date(datePickerLeftBound, Date, moment, null);
        $rightPicker.data("DateTimePicker").date(datePickerRightBound, Date, moment, null);
    }
    $scope.initData = function (day, referer, country, leftBound, rightBound) {
        // Stats data
        dayData = day;
        refererData = referer;
        countryData = country;
        // Datepicker dates
        datePickerLeftBound = leftBound;
        datePickerRightBound = rightBound;
    };
    $scope.initCharts = function () {
        $scope.dayChart = null;
        $scope.refererChart = null;
        $scope.countryChart = null;
        $scope.dayData = dayData;
        $scope.refererData = refererData;
        $scope.countryData = countryData;
        $scope.initDayChart();
        $scope.initRefererChart();
        $scope.initCountryChart();
    };
    $scope.init = function () {
        $scope.initCharts();
        $scope.initDatePickers();
    };
    // $scope.init();
})(polr.stats);
 
  |