function Colour(){this.colour=[0,0,0];this.CSS3={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"778899",lightslategrey:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"};this.rgb=function(){switch(arguments.length){case 0:return this.colour;case 1:var a=arguments[0];break;case 3:var a=arguments;break;default:console.error("expected zero, one (array) or three arguments")}this.colour=this.normalizergb(a);return this};this.rgb255=function(){switch(arguments.length){case 0:return[this.to255(this.colour[0]),this.to255(this.colour[1]),this.to255(this.colour[2])];case 1:var a=arguments[0];break;case 3:var a=arguments;break;default:console.error("expected zero, one (array) or three arguments")}return this.rgb(a[0]/255,a[1]/255,a[2]/255)};this.rgb100=function(){switch(arguments.length){case 0:return array_map(array("self","to100"),this.colour);case 1:var a=arguments[0];break;case 3:var a=arguments;break;default:console.error("expected zero, one (array) or three arguments")}return this.rgb(a[0]/100,a[1]/100,a[2]/100)};this.r=function(a){return this.r_g_b(0,a)};this.g=function(a){return this.r_g_b(1,a)};this.b=function(a){return this.r_g_b(2,a)};this.red=function(a){return this.r(a)};this.green=function(a){return this.g(a)};this.blue=function(a){return this.b(a)};this.r_g_b=function(b,a){if(typeof(a)=="undefined"){return this.colour[b]}this.colour[b]=this.normalize01(a);return this};this.hsv=function(){switch(arguments.length){case 0:return this.rgbtohsv(this.colour);case 1:var a=arguments[0];break;case 3:var a=arguments;break;default:console.error("expected zero, one (array) or three arguments")}return this.rgb(this.hsvtorgb(a))};this.hsv100=function(){switch(arguments.length){case 0:var a=this.rgbtohsv(this.colour);return[Math.round(this.normalizehue(a[0])),this.to100(a[1]),this.to100(a[2])];case 1:var a=arguments[0];break;case 3:var a=arguments;break;default:console.error("expected zero, one (array) or three arguments")}return this.hsv(a[0],a[1]/100,a[2]/100)};this.hex=function(){switch(arguments.length){case 0:return this.rgbtohex(this.colour);case 1:if(typeof(arguments[0])=="string"){if(!this.validhex(arguments[0])){console.error("invalid hex string");return}return this.rgb(this.hextorgb(arguments[0]))}return this.rgbtohex(this.colour,arguments[0]);default:console.error("expected zero or one argument")}};this.toString=function(){return this.hex()};this.gr=function(a){if(typeof(a)=="undefined"){a=0.5}a=this.normalize01(a);return this.rgb(a,a,a)};this.grey=function(){return this.gr.apply(this,arguments)};this.gray=function(){return this.gr.apply(this,arguments)};this.h=function(){var a=this.hsv();switch(arguments.length){case 0:return a[0];case 1:var b=arguments[0];var c=true;break;case 2:var b=arguments[0];var c=arguments[1];break;default:console.error("expected zero, one or two arguments")}b=this.normalizehue(b);if(b==a[0]){return c?new Colour(this):this}return c?new Colour().hsv(b,a[1],a[2]):this.hsv(b,a[1],a[2])};this.hue=function(){return this.h.apply(this,arguments)};this.s=function(){var a=this.hsv();switch(arguments.length){case 0:return a[1];case 1:var b=arguments[0];var c=true;break;case 2:var b=arguments[0];var c=arguments[1];break;default:console.error("expected zero, one or two arguments")}if(b==a[1]){return c?new Colour(this):this}return c?new Colour().hsv(a[0],b,a[2]):this.hsv(a[0],b,a[2])};this.saturation=function(){return this.s.apply(this,arguments)};this.desaturate=function(){if(arguments.length>0){return this.s(0,arguments[0])}return this.s(0)};this.v=function(){var b=this.hsv();switch(arguments.length){case 0:return b[1];case 1:var a=arguments[0];var c=true;break;case 2:var a=arguments[0];var c=arguments[1];break;default:console.error("expected zero, one or two arguments")}if(a==b[2]){return c?new Colour(this):this}return c?new Colour().hsv(b[0],b[1],a):this.hsv(b[0],b[1],a)};this.value=function(){return this.v.apply(this,arguments)};this.shade=function(){var a=arguments[0];var d=arguments.length>1?arguments[1]:true;if(typeof(a)!="undefined"&&(a==0||a==1)){return d?new Colour(a):this.grey(a)}var b=this.rgb();var c=(b[0]+b[1]+b[2])/3;if(typeof(a)=="undefined"){return c}if(c==a){return d?new Colour(this):this}var e=a-c;if(e>0){var f=e/(1-c)}else{var f=e/c}return this.shiftshade(f,d)};this.sh=function(){return this.shade.apply(this,arguments)};this.shifthue=function(){var a=this.hsv();if(arguments.length>1){return this.h(a[0]+arguments[0],arguments[1])}return this.h(a[0]+arguments[0])};this.shh=function(){return this.shifthue.apply(this,arguments)};this.shiftsaturation=function(){var d=arguments[0];var c=arguments.length>1?arguments[1]:true;if(d==0){return c?new Colour(this):this}var a=this.hsv();if(d>0){var b=a[1]+(1-a[1])*d}else{var b=a[1]*(d+1)}return c?new Colour().hsv(a[0],b,a[2]):this.hsv(a[0],b,a[2])};this.shs=function(){return this.shiftsaturation.apply(this,arguments)};this.shiftvalue=function(){var d=arguments[0];var c=arguments.length>1?arguments[1]:true;if(d==0){return c?new Colour(this):this}var b=this.hsv();if(d>0){var a=b[2]+(1-b[2])*d}else{var a=b[2]*(d+1)}return c?new Colour().hsv(b[0],b[1],a):this.hsv(b[0],b[1],a)};this.shv=function(){return this.shiftvalue.apply(this,arguments)};this.shiftshade=function(){var b=arguments[0];var a=arguments.length>1?arguments[1]:true;if(b==0){return a?new Colour(this):this}if(b==1||arguments[0]==-1){return a?new Colour(b/2+0.5):this.grey(arguments[0]/2+0.5)}if(b>0){return this.mix(new Colour(1),b,a)}return this.mix(new Colour(0),-b,a)};this.shsh=function(){return this.shiftshade.apply(this,arguments)};this.halfsat=function(){if(arguments.length==2&&typeof(arguments[1])!="boolean"){var c=arguments[0];var a=arguments[1];var d=true}else{var c=this.h();var a=arguments[0];var d=arguments.length==2?arguments[1]:true}var b=[c,0.5-a/2,a];return d?new Colour().hsv(b):this.hsv(b)};this.hs=function(){return this.halfsat.apply(this,arguments)};this.mix=function(){var f=arguments[0].rgb();var d=arguments.length>1?arguments[1]:0.5;var e=arguments.length>2?arguments[2]:true;var b=this.rgb();var a=[b[0]+(f[0]-b[0])*d,b[1]+(f[1]-b[1])*d,b[2]+(f[2]-b[2])*d];return e?new Colour(a):this.rgb(a)};this.xarashade=function(){var b=arguments[0];var a=arguments[1];var c=arguments.length>2?arguments[2]:true;return this.shiftvalue(a/100,c).shiftsaturation(-b/100,false)};this.xs=function(){return this.xarashade.apply(this,arguments)};this.swatch=function(){var c=arguments.length>0?arguments[0]:true;var b=arguments.length>1?arguments[1]:"";var a='<span class="swatch';if(b!=""){a+=" "+b}a+='" style="';if(b==""){a+="font-family: monospace; padding: 0.3em 0.8em; "}a+="background-color: "+this.hex()+"; color: "+(this.shade()>0.5?"black":"white")+'">';a+=c?this.hex():"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";a+="</span>";return a};this.rgburl=function(){var b=arguments.length>0?arguments[0]:false;var a="r="+this.r()+"&g="+this.g()+"&b="+this.b();if(b){return a.replace(/&/g,"&amp;")}return a};this.hsvtorgb=function(){switch(arguments.length){case 1:var k=arguments[0];break;case 3:var k=arguments;break;default:console.error("expected one or three arguments")}k=this.normalizehsv(k);var j=k[0];var w=k[1];var o=k[2];if(j===false||w==0){return[o,o,o]}j/=60;var e=Math.floor(j);var m=j-e;var d=o*(1-w);var c=o*(1-w*m);var u=o*(1-w*(1-m));var a,l,n;switch(e){case 0:a=o;l=u;n=d;break;case 1:a=c;l=o;n=d;break;case 2:a=d;l=o;n=u;break;case 3:a=d;l=c;n=o;break;case 4:a=u;l=d;n=o;break;default:a=o;l=d;n=c;break}return[a,l,n]};this.rgbtohsv=function(){switch(arguments.length){case 1:var f=arguments[0];break;case 3:var f=arguments;break;default:console.error("expected one or three arguments")}f=this.normalizergb(f);var a=f[0];var e=f[1];var i=f[2];var k=a;if(e>k){k=e}if(i>k){k=i}var c=a;if(e<c){c=e}if(i<c){c=i}var j=k-c;if(k==0||j==0){return[null,0,k]}var l=j/k;if(a>=e&&a>=i){var d=(e-i)/j}else{if(e>=a&&e>=i){var d=2+(i-a)/j}else{var d=4+(a-e)/j}}d*=60;d=this.normalizehue(d);return[d,l,k]};this.hextorgb=function(e){if(e[0]=="#"){e=e.substr(1)}if(e.length==3){e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]}var d=parseInt(e.substr(0,2),16);var c=parseInt(e.substr(2,2),16);var a=parseInt(e.substr(4,2),16);return[d/255,c/255,a/255]};this.rgbtohex=function(){switch(arguments.length){case 1:case 2:var a=arguments[0];var b=arguments.length>1?arguments[1]:true;break;case 3:case 4:var a=[arguments[0],arguments[1],arguments[2]];var b=arguments.length==4?arguments[3]:true;break;default:console.error("expected one, two, three or four arguments")}a=this.normalizergb(a);a[0]=this.to255(a[0]).toString(16);a[1]=this.to255(a[1]).toString(16);a[2]=this.to255(a[2]).toString(16);if(a[0].length<2){a[0]="0"+a[0]}if(a[1].length<2){a[1]="0"+a[1]}if(a[2].length<2){a[2]="0"+a[2]}return(b?"#":"")+a[0]+a[1]+a[2]};this.validhex=function(a){return typeof(a)=="string"&&/^#?([0-9a-fA-F]{3}){1,2}$/.test(a)};this.normalizergb=function(a){if(a.length!=3){console.warn("array should have three values -- setting any missing ones to zero")}return[typeof(a[0])!="undefined"?this.normalize01(a[0]):0,typeof(a[1])!="undefined"?this.normalize01(a[1]):0,typeof(a[2])!="undefined"?this.normalize01(a[2]):0]};this.normalizehsv=function(b){if(b.length!=3){console.warn("array should have three values -- setting any missing ones to false (hue) or zero (otherwise)")}var a=[typeof(b[0])!="undefined"?this.normalizehue(b[0]):false,typeof(b[1])!="undefined"?this.normalize01(b[1]):0,typeof(b[2])!="undefined"?this.normalize01(b[2]):0];if(a[1]==0){a[0]=false}return a};this.normalizehue=function(a){if(a===false){return a}while(a<0){a+=360}while(a>=360){a-=360}return a};this.normalize01=function(a){if(a<0||a>1){console.warn("value out of range");if(a<0){a=0}else{a=1}}return a};this.to255=function(a){a=this.normalize01(a);return Math.round(a*255)};this.to100=function(a){a=this.normalize01(a);return Math.round(a*100)};switch(arguments.length){case 0:return this.gr(0);case 1:arg=arguments[0];if(typeof(arg)=="object"&&arg.length==3){return this.rgb(arg)}if(typeof(arg)=="object"&&typeof(arg.CSS3)=="object"){return this.rgb(arg.rgb())}if(typeof(arg)=="number"){return this.gr(arg)}if(this.validhex(arg)){return this.hex(arg)}if(typeof(arg)=="string"&&typeof(this.CSS3[arg.toLowerCase()])!="undefined"&&this.validhex(this.CSS3[arg.toLowerCase()])){return this.hex(this.CSS3[arg.toLowerCase()])}console.warn("unrecognized constructor option");return this.gr(0);default:console.error("expected zero or one argument");return false}};