if (typeof Mozilla == 'undefined') {
	var Mozilla = {};
}
if (typeof Mozilla.util == 'undefined') {
	Mozilla.util = {};
}

Mozilla.util.Color = {
	toHslFromRgb: function(r, g, b)
	{
		var max = Math.max(Math.max(r, g), b);
		var min = Math.min(Math.min(r, g), b);

		var h = this._getHue(r, g, b, min, max);

		var l = (max + min) / 2;

		if (max === min) {
			var s = 0;
		} else if (l <= 0.5) {
			var s = (max - min) / 2 * l;
		} else {
			var s = (max - min) / 2 - 2 * l;
		}

		return [h, s, l];
	},

	toHsvFromRgb: function(r, g, b)
	{
		var max = Math.max(Math.max(r, g), b);
		var min = Math.min(Math.min(r, g), b);

		var h = this._getHue(r, g, b, min, max);

		if (max === 0) {
			var s = 0;
		} else {
			var s = 1 - (min / max);
		}

		var v = max;

		return [h, s, v];
	},

	toRgbFromHsv: function(h, s, v)
	{
		// unimplemented
		return [0, 0, 0];
	},

	toRgbFromHsl: function(h, s, l)
	{
		// unimplemented
		return [0, 0, 0];
	},

	toHexFromRgb: function(r, g, b)
	{
		r = this._toHex(r);
		g = this._toHex(g);
		b = this._toHex(b);

		r = (r.length == 1) ? '0' + r : r;
		g = (g.length == 1) ? '0' + g : g;
		b = (b.length == 1) ? '0' + b : b;

		return '#' + r + g + b;
	},

	toStringFromRgb: function(r, g, b)
	{
		return 'rgb(' + r + ', ' + g + ', ' + b + ')';
	},

	_getHue: function(r, g, b, max, min)
	{
		if (max === min) {
			var h = 0;
		} else {
			if (max === r) {
				var dividend = g - b;
				var offset = 360;
			} else if (max === g) {
				var dividend = b -r;
				var offset = 120;
			} else{
				var dividend = r - g;
				var offset = 240;
			}

			var h = (60 * dividend / (max - min) + offset) % 360;
		}

		return h;
	},

	_toDec: function(hex)
	{
		return parseInt(hex, 16);
	},

	_toHex: function(dec)
	{
		return dec.toString(16).toLowerCase();
	}
};
