Tick Positioner Test

by bakhshi

HTML

<script src="http://code.highcharts.com/3.0.5/highcharts.js"></script>
<script src="http://code.highcharts.com/modules/exporting.js"></script>
<div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div>

JavaScript

Date.prototype.addHours = function (hours) {
    this.setHour(this.getHour() + hours);
}
Date.prototype.addDays = function (days) {
    this.setDate(this.getDate() + days);
}
Date.prototype.addMonths = function (months) {
    this.setMonth(this.getMonth() + months);
}
Date.prototype.addYears = function (years) {
    this.setFullYear(this.getFullYear() + years);
}

var dateRangeHour = 1000 * 3600,
    dateRangeDay = dateRangeHour * 24,
    dateRangeWeek = dateRangeDay * 7,
    dateRangeMonth = dateRangeDay * 30,
    dateRangeQuarter = dateRangeDay * 90,
    dateRangeYear = dateRangeDay * 365,
    dateIncrementer = {};

dateIncrementer[dateRangeHour] = function (date) {
    date.addHours(1);
}
dateIncrementer[dateRangeDay] = function (date) {
    date.addDays(1);
}
dateIncrementer[dateRangeWeek] = function (date) {
    date.addDays(7);
}
dateIncrementer[dateRangeMonth] = function (date) {
    date.addMonths(1);
}
dateIncrementer[dateRangeQuarter] = function (date) {
    date.addMonths(3);
}
dateIncrementer[dateRangeYear] = function (date) {
    date.addYears(1);
}


function decideRange(interval) {
    if (interval > dateRangeYear || dateRangeYear - interval <= dateRangeYear / 2) return dateRangeYear;
    if (interval > dateRangeQuarter || dateRangeQuarter - interval <= dateRangeQuarter / 2) return dateRangeQuarter;
    if (interval > dateRangeMonth || dateRangeMonth - interval <= dateRangeMonth / 2) return dateRangeMonth;
    if (interval > dateRangeWeek || dateRangeWeek - interval <= dateRangeWeek / 2) return dateRangeWeek;
    if (interval > dateRangeDay || dateRangeDay - interval <= dateRangeDay / 2) return dateRangeDay;
    return dateRangeHour;
}

function tickPositioner() {
    var positions = [];

    var min = new Date(this.min),
        max = new Date(this.max);

    var interval = decideRange(this.tickInterval);
    var incrementer = dateIncrementer[interval];
    for (var current = new Date(min.getTime()); current < max; incrementer(current))
   ...