/*
	Copyright (c) 2004-2006, The Dojo Foundation
	All Rights Reserved.

	Licensed under the Academic Free License version 2.1 or above OR the
	modified BSD license. For more information on Dojo licensing, see:

		http://dojotoolkit.org/community/licensing.shtml
*/

dojo.provide("dojo.gfx.color.hsv");
dojo.require("dojo.lang.array");
dojo.require("dojo.math");
dojo.lang.extend(dojo.gfx.color.Color, {toHsv:function () {
	return dojo.gfx.color.rgb2hsv(this.toRgb());
}});
dojo.gfx.color.rgb2hsv = function (r, g, b, options) {
	if (dojo.lang.isArray(r)) {
		if (g) {
			options = g;
		}
		b = r[2] || 0;
		g = r[1] || 0;
		r = r[0] || 0;
	}
	var opt = {inputRange:(options && options.inputRange) ? options.inputRange : 255, outputRange:(options && options.outputRange) ? options.outputRange : [255, 255, 255]};
	var h = null;
	var s = null;
	var v = null;
	switch (opt.inputRange) {
	  case 1:
		r = (r * 255);
		g = (g * 255);
		b = (b * 255);
		break;
	  case 100:
		r = (r / 100) * 255;
		g = (g / 100) * 255;
		b = (b / 100) * 255;
		break;
	  default:
		break;
	}
	var min = Math.min(r, g, b);
	v = Math.max(r, g, b);
	var delta = v - min;
	s = (v == 0) ? 0 : delta / v;
	if (s == 0) {
		h = 0;
	} else {
		if (r == v) {
			h = 60 * (g - b) / delta;
		} else {
			if (g == v) {
				h = 120 + 60 * (b - r) / delta;
			} else {
				if (b == v) {
					h = 240 + 60 * (r - g) / delta;
				}
			}
		}
		if (h <= 0) {
			h += 360;
		}
	}
	switch (opt.outputRange[0]) {
	  case 360:
		break;
	  case 100:
		h = (h / 360) * 100;
		break;
	  case 1:
		h = (h / 360);
		break;
	  default:
		h = (h / 360) * 255;
		break;
	}
	switch (opt.outputRange[1]) {
	  case 100:
		s = s * 100;
	  case 1:
		break;
	  default:
		s = s * 255;
		break;
	}
	switch (opt.outputRange[2]) {
	  case 100:
		v = (v / 255) * 100;
		break;
	  case 1:
		v = (v / 255);
		break;
	  default:
		break;
	}
	h = dojo.math.round(h);
	s = dojo.math.round(s);
	v = dojo.math.round(v);
	return [h, s, v];
};
dojo.gfx.color.hsv2rgb = function (h, s, v, options) {
	if (dojo.lang.isArray(h)) {
		if (s) {
			options = s;
		}
		v = h[2] || 0;
		s = h[1] || 0;
		h = h[0] || 0;
	}
	var opt = {inputRange:(options && options.inputRange) ? options.inputRange : [255, 255, 255], outputRange:(options && options.outputRange) ? options.outputRange : 255};
	switch (opt.inputRange[0]) {
	  case 1:
		h = h * 360;
		break;
	  case 100:
		h = (h / 100) * 360;
		break;
	  case 360:
		h = h;
		break;
	  default:
		h = (h / 255) * 360;
	}
	if (h == 360) {
		h = 0;
	}
	switch (opt.inputRange[1]) {
	  case 100:
		s /= 100;
		break;
	  case 255:
		s /= 255;
	}
	switch (opt.inputRange[2]) {
	  case 100:
		v /= 100;
		break;
	  case 255:
		v /= 255;
	}
	var r = null;
	var g = null;
	var b = null;
	if (s == 0) {
		r = v;
		g = v;
		b = v;
	} else {
		var hTemp = h / 60;
		var i = Math.floor(hTemp);
		var f = hTemp - i;
		var p = v * (1 - s);
		var q = v * (1 - (s * f));
		var t = v * (1 - (s * (1 - f)));
		switch (i) {
		  case 0:
			r = v;
			g = t;
			b = p;
			break;
		  case 1:
			r = q;
			g = v;
			b = p;
			break;
		  case 2:
			r = p;
			g = v;
			b = t;
			break;
		  case 3:
			r = p;
			g = q;
			b = v;
			break;
		  case 4:
			r = t;
			g = p;
			b = v;
			break;
		  case 5:
			r = v;
			g = p;
			b = q;
			break;
		}
	}
	switch (opt.outputRange) {
	  case 1:
		r = dojo.math.round(r, 2);
		g = dojo.math.round(g, 2);
		b = dojo.math.round(b, 2);
		break;
	  case 100:
		r = Math.round(r * 100);
		g = Math.round(g * 100);
		b = Math.round(b * 100);
		break;
	  default:
		r = Math.round(r * 255);
		g = Math.round(g * 255);
		b = Math.round(b * 255);
	}
	return [r, g, b];
};

