text: dojo.provide("dojo.gfx.color.hsl");
  dojo.require("dojo.lang.array");
  
  dojo.lang.extend(dojo.gfx.color.Color, {
  	toHsl: function() {
  		return dojo.gfx.color.rgb2hsl(this.toRgb());
  	}
  });
  
  dojo.gfx.color.rgb2hsl = function(r, g, b){
  	if (dojo.lang.isArray(r)) {
  		b = r[2] || 0;
  		g = r[1] || 0;
  		r = r[0] || 0;
  	}
  
  	r /= 255;
  	g /= 255;
  	b /= 255;
  
  	//
  	// based on C code from http://astronomy.swin.edu.au/~pbourke/colour/hsl/
  	//
  
  	var h = null;
  	var s = null;
  	var l = null;
  
  	var min = Math.min(r, g, b);
  	var max = Math.max(r, g, b);
  	var delta = max - min;
  
  	l = (min + max) / 2;
  	s = 0;
  
  	if ((l > 0) && (l < 1)){
  		s = delta / ((l < 0.5) ? (2 * l) : (2 - 2 * l));
  	}
  
  	h = 0;
  
  	if (delta > 0) {
  		if ((max == r) && (max != g)){
  			h += (g - b) / delta;
  		}
  		if ((max == g) && (max != b)){
  			h += (2 + (b - r) / delta);
  		}
  		if ((max == b) && (max != r)){
  			h += (4 + (r - g) / delta);
  		}
  		h *= 60;
  	}
  
  	h = (h == 0) ? 360 : Math.ceil((h / 360) * 255);
  	s = Math.ceil(s * 255);
  	l = Math.ceil(l * 255);
  
  	return [h, s, l];
  }
  
  dojo.gfx.color.hsl2rgb = function(h, s, l){
  	if (dojo.lang.isArray(h)) {
  		l = h[2] || 0;
  		s = h[1] || 0;
  		h = h[0] || 0;
  	}
  
  	h = (h / 255) * 360;
  	if (h == 360){ h = 0;}
  	s = s / 255;
  	l = l / 255;
  
  	//
  	// based on C code from http://astronomy.swin.edu.au/~pbourke/colour/hsl/
  	//
  
  
  	while (h < 0){ h += 360; }
  	while (h > 360){ h -= 360; }
  	var r, g, b;
  	if (h < 120){
  		r = (120 - h) / 60;
  		g = h / 60;
  		b = 0;
  	}else if (h < 240){
  		r = 0;
  		g = (240 - h) / 60;
  		b = (h - 120) / 60;
  	}else{
  		r = (h - 240) / 60;
  		g = 0;
  		b = (360 - h) / 60;
  	}
  
  	r = Math.min(r, 1);
  	g = Math.min(g, 1);
  	b = Math.min(b, 1);
  
  	r = 2 * s * r + (1 - s);
  	g = 2 * s * g + (1 - s);
  	b = 2 * s * b + (1 - s);
  
  	if (l < 0.5){
  		r = l * r;
  		g = l * g;
  		b = l * b;
  	}else{
  		r = (1 - l) * r + 2 * l - 1;
  		g = (1 - l) * g + 2 * l - 1;
  		b = (1 - l) * b + 2 * l - 1;
  	}
  
  	r = Math.ceil(r * 255);
  	g = Math.ceil(g * 255);
  	b = Math.ceil(b * 255);
  
  	return [r, g, b];
  }
  
  dojo.gfx.color.hsl2hex = function(h, s, l){
  	var rgb = dojo.gfx.color.hsl2rgb(h, s, l);
  	return dojo.gfx.color.rgb2hex(rgb[0], rgb[1], rgb[2]);
  }
  
  dojo.gfx.color.hex2hsl = function(hex){
  	var rgb = dojo.gfx.color.hex2rgb(hex);
  	return dojo.gfx.color.rgb2hsl(rgb[0], rgb[1], rgb[2]);
  }
  