function Colour(r, g, b) {
	this.r = 0;
	this.g = 0;
	this.b = 0;

	////////////////////////////
	this.get = function(what) {
		var arr = this.toArray();
		if (typeof what == 'number') {
			return arr[what];
		} else {
			switch(what) {
				case "r" : return arr[0];
				case "g" : return arr[1];
				case "b" : return arr[2];
			}
		}
	};

	this.add = function(arr) {
		this.r += arr[0];
		this.g += arr[1];
		this.b += arr[2];
	};

	this.fromHex = function(hex) {
		this.fromNumber(this.hexdec(hex));
	};
	this.fromNumber = function (num) {
		this.fromArray(
			[(num & (0xFF << 16)) >> 16,
			(num & (0xFF << 8)) >> 8,
			num & 0xFF]
		);
	};

	this.fromRGB = function (r,g,b) {
		this.r = r;
		this.g = g;
		this.b = b;
	};
	this.fromArray = function (arr) {
		this.fromRGB(arr[0], arr[1], arr[2]);
	};

	this.toArray = function() {
		return [this.r, this.g, this.b];
	};

	this.toHTML = function() {
		return "#" + this.toHex();
	};
	this.toHex = function() {
		var parts = [
			Math.round(Math.max(0, Math.min(255, this.r))).toString(16),
			Math.round(Math.max(0, Math.min(255, this.g))).toString(16),
			Math.round(Math.max(0, Math.min(255, this.b))).toString(16)
		];
		var ret = "";
		for (var i = 0; i < 3; i++) {
			if (parts[i].length == 1) ret += "0";
			ret += parts[i];
		}
		return ret;
	};

	function hexdec(hexString) {
		while (hexString.length && (hexString[0] == "#" || hexString[0] == "0")) {
			hexString = hexString.substr(1);
		}
		return parseInt(hexString, 16);
	};

	// CONSTRUCTOR ////////////
	if (g == undefined && b == undefined) {
		if (typeof(r) == 'string') {
			this.fromHex(r);
		} else if (typeof(r) == 'number') {
			this.fromNumber(r);
		} else if (typeof(r) == 'object') { // array
			this.fromArray(r);
		}
	} else {
		this.fromRGB(r,g,b);
	}

}