/**
 * ColorUtil
 * 
 * @author Kazuyuki Nishijima
 */

var ColorUtil = Class.create();
ColorUtil.rgbToHsv = function(r, g, b) {
	r = r / 255;
	g = g / 255;
	b = b / 255;
	
	var max = Math.max(Math.max(r, g), b);
	var min = Math.min(Math.min(r, g), b);
	var sum = max - min;
	
	var h = 0;
	var s = 0;
	if (sum > 0) {
		if (max == r) {
			h = 60 * (g - b) / sum;
		} else if (max == g) {
			h = 60 * (b - r) / sum + 120;
		} else if (max == b) {
			h = 60 * (r - g) / sum + 240;
		}
		
		s = sum / max
	}
	
	var v = max;
	
	return Array(h, s, v);
};

ColorUtil.hsvToRgb = function(h, s, v) {
	h = h % 360;
	v = v * 255;
	
	var hi = parseInt(h / 60) % 6;
	var f = h / 60 - hi;
	var p = parseInt(v * (1 - s));
	var q = parseInt(v * (1 - f * s));
	var t = parseInt(v * (1 - (1 - f) * s));
	
	switch (hi) {
	case 0:
		return Array(v, t, p);
	case 1:
		return Array(q, v, p);
	case 2:
		return Array(p, v, t);
	case 3:
		return Array(p, q, v);
	case 4:
		return Array(t, p, v);
	case 5:
		return Array(v, p, q);
	}
};

ColorUtil.rgbToString = function(r, g, b) {
	return "#" + ColorUtil.numberToHex(r) + ColorUtil.numberToHex(g) + ColorUtil.numberToHex(b);
};

ColorUtil.numberToHex = function(number) {
	nubmer = parseInt(number);
	var hex = nubmer.toString(16);
	if (number < 16) {
		hex = "0" + hex;
	}
	return hex;
};

ColorUtil.stringToRgb = function(value) {
	if (!value) {
		return null;
	}
	
	var reg = new RegExp("^#?(([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])|([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2}))$");
	if (reg.exec(value) == false) {
		return null;
	}
	
	var r, g, b;
	if (RegExp.$2.length > 0) {
		r = parseInt("0x" + RegExp.$2);
		g = parseInt("0x" + RegExp.$3);
		b = parseInt("0x" + RegExp.$4);
	} else if (RegExp.$5.length > 0) {
		r = parseInt("0x" + RegExp.$5);
		g = parseInt("0x" + RegExp.$6);
		b = parseInt("0x" + RegExp.$7);
	} else {
		return null;
	}
	return Array(r, g, b);
};

