//  nice numbers attempts to come up with a nice-looking set of numbers for a colorbar
//  based on the min and max and the max number of ticks. 

function nice_numbers(min, max, max_ticks, incl_min, incl_max) {
	var good_dens = new Array(.001,.01,.02,.1, .2, .25, .5, 1, 2, 2.5, 3, 4, 5, 6, 7,10, 15, 20, 25, 30);
	var nice_min, nice_max,count;
	var range = max-min;
	for (var i = 0; i< good_dens.length; i++) {
		var den = good_dens[i];
		if (range /den <= max_ticks) {
			 nice_min = calc_ceil_or_floor(incl_min, 0, min/den) * den;
			 nice_max = calc_ceil_or_floor(incl_max, 1, max/den) * den;
			if (((nice_max - nice_min) / den > max_ticks) &&
					i < good_dens.length-1) {
				den = good_dens[i+ 1];
				nice_min = calc_ceil_or_floor(incl_min, 0, min/den) * den;
				nice_max = calc_ceil_or_floor(incl_max, 1, max/den) * den;
			}
			count = Math.ceil((nice_max-nice_min) / den); 
			return [nice_min, den, count];
		}
	}

}

function calc_ceil_or_floor(inc, max, val) {
	return (xor(inc, max)) ? Math.floor(val) : Math.ceil(val);
}

function xor (a,b) {
	return (a || b) && !(a && b) ;
}
