function baseConverter(number, ob, nb) {
	number = number+"";
	number = number.toUpperCase();
	var list = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var dec = 0;
	for (var i = 0; i <= number.length; i++) {
		dec += (list.indexOf(number.charAt(i)))*(Math.pow(ob, (number.length-i-1)));
	}
	number = "";
	var magnitude = Math.floor((Math.log(dec))/(Math.log(nb)));
	for (var i = magnitude; i >= 0; i--) {
		var amount = Math.floor(dec/Math.pow(nb, i));
		number = number+list.charAt(amount);
		dec -= amount*(Math.pow(nb, i));
	}
	if (number.length == 0) {
		number = 0;
	}
	return number;
}

// Converts a RGB color to HSV
function toHSV(rgbColor) {
	rgbColor = rgbColor.replace('#', '');

	red = baseConverter(rgbColor.substr(0, 2), 16, 10);
	green = baseConverter(rgbColor.substr(2, 2), 16, 10);
	blue = baseConverter(rgbColor.substr(4, 2), 16, 10);
	if (red.length == 0) {
		red = 0;
	}
	if (green.length == 0) {
		green = 0;
	}
	if (blue.length == 0) {
		blue = 0;
	}
	red = red/255;
	green = green/255;
	blue = blue/255;

	maxValue = Math.max(red, green, blue);
	minValue = Math.min(red, green, blue);

	var hue = 0;

	if (maxValue == minValue) {
		hue = 0;
		saturation = 0;
	} else {
		if (red == maxValue) {
			hue = (green-blue)/(maxValue-minValue)/1;
		} else if (green == maxValue) {
			hue = 2+(blue-red)/1/(maxValue-minValue)/1;
		} else if (blue == maxValue) {
			hue = 4+(red-green)/(maxValue-minValue)/1;
		}
		saturation = (maxValue-minValue)/maxValue;
	}
	hue = hue*60;
	valueBrightness = maxValue;

	if (valueBrightness/1 < 0.5) {
		//saturation = (maxValue - minValue) / (maxValue + minValue);
	}
	if (valueBrightness/1 >= 0.5) {
		//saturation = (maxValue - minValue) / (2 - maxValue - minValue);
	}

	returnArray = [hue, saturation, valueBrightness];
	return returnArray;
}

function toRgb(hue, saturation, valueBrightness) {
	Hi = Math.floor(hue/60);
	if (hue == 360) {
		Hi = 0;
	}
	f = hue/60-Hi;
	p = (valueBrightness*(1-saturation)).toPrecision(2);
	q = (valueBrightness*(1-(f*saturation))).toPrecision(2);
	t = (valueBrightness*(1-((1-f)*saturation))).toPrecision(2);

	switch (Hi) {
		case 0:
			red = valueBrightness;
			green = t;
			blue = p;
			break;
		case 1:
			red = q;
			green = valueBrightness;
			blue = p;
			break;
		case 2:
			red = q;
			green = valueBrightness;
			blue = t;
			break;
		case 3:
			red = p;
			green = q;
			;
			blue = valueBrightness;
			break;
		case 4:
			red = t;
			green = p;
			blue = valueBrightness;
			break;
		case 5:
			red = valueBrightness;
			green = p;
			blue = q;
			break;
	}

	if (saturation == 0) {
		red = valueBrightness;
		green = valueBrightness;
		blue = valueBrightness;
	}

	red *= 255;
	green *= 255;
	blue *= 255;

	red = Math.round(red);
	green = Math.round(green);
	blue = Math.round(blue);

	red = baseConverter(red, 10, 16);
	green = baseConverter(green, 10, 16);
	blue = baseConverter(blue, 10, 16);

	red = red+"";
	green = green+"";
	blue = blue+"";

	while (red.length < 2) {
		red = "0"+red;
	}
	while (green.length < 2) {
		green = "0"+green;
	}
	while (blue.length < 2) {
		blue = "0"+""+blue;
	}
	rgbColor = "#"+red+""+green+""+blue;
	return rgbColor.toUpperCase();
}

function findColorByDegrees(rgbColor, degrees) {
	rgbColor = rgbColor.replace('#', '');
	myArray = toHSV(rgbColor);
	myArray[0] += degrees;
	if (myArray[0] >= 360) {
		myArray[0] -= 360;
	}
	if (myArray[0] < 0) {
		myArray[0] += 360;
	}
	return toRgb(myArray[0], myArray[1], myArray[2]);
}

function findColorByBrightness(rgbColor, brightness) {

	rgbColor = rgbColor.replace('#', '');
	myArray = toHSV(rgbColor);

	myArray[2] += brightness/100;
	if (myArray[2] > 1) {
		myArray[2] = 1;
	}
	if (myArray[2] < 0) {
		myArray[2] = 0;
	}

	myArray[1] += brightness/100;
	if (myArray[1] > 1) {
		myArray[1] = 1;
	}
	if (myArray[1] < 0) {
		myArray[1] = 0;
	}

	return toRgb(myArray[0], myArray[1], myArray[2]);

}
