/*
 * Copyright (c) 2009-2010, J.P.Westerhof
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and/or (associated) documentation
 * from eDesign.nl domains (the "Software"), to deal in the Software
 * without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom
 * the Software is furnished to do so, subject to the following
 * conditions:
 * 
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */

/* 
 * ColorPicker version 1.1
 * Released august 5, 2010 by Jurgen Westerhof
 */
function ColorPicker(elm, config) {
	this._element = elm;
	this._hsb = [0 / 360, 255 / 255, 255 / 255];
	this._rgb = [255, 0, 0];
	this._h = 0;
	
	this._okColor = '#ff8800';
	
	if (elm.value.match(/^[0-9[a-f]{6}$/)) {
                this._element.value = '#' + this._element.value;
        }
	if(elm.value.match(/^\#[0-9a-f]{6}$/)) {
		this._okColor = this._element.value;
	}
        
	this.setConfig(config);
	
	this._trigger = document.createElement('div');
	this._trigger.setAttribute('style', this._config.trigger.style);
	this._arrow = document.createElement('img');
	this._arrow.setAttribute('src', ColorPicker.getArrowImageBase64(this._okColor));
	this._trigger.appendChild(this._arrow);
	this._trigger.onclick = this.showPicker.colorpicker_bind(this);
	this._element.parentNode.insertBefore(this._trigger, this._element);
	
	if(this._element.type == 'hidden') {
		this._trigger.style.width = '2em';
		this._trigger.style.lineHeight = '1em';
		this._trigger.style.height = '1em';
		this._trigger.style.position = 'relative';
	} else if(!this._trigger.style.width) {
		var dims = ColorPicker.getDimensions(this._element);
		
		this._trigger.style.width = dims[0] + 'px';
		this._trigger.style.height = (dims[1] - 1) + 'px';
		this._trigger.style.lineHeight = (dims[1] - 1) + 'px';
	}
	
	var obj = this._element;
    var curleft = curtop = 0;
    if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
            curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
    }
	
	this._trigger.style.left = curleft + 'px';
	this._trigger.style.top = curtop + 'px';
	
	
	this._element.value = this._okColor;
	this.value = this._okColor; //redundant but intuitive naming for external usage
	
	this._element.style.visibility = 'hidden';

	this.createPicker();
	
	for(k in this._config.events) {
		if(this._element.addEventListener) { // FF and others
			this._element.addEventListener(k, this._config.events[k], false);
		} else { //IE
			this._element.attachEvent('on'+k, this._config.events[k]);
		}
	}
	
}

ColorPicker.prototype.setConfig = function(config) {
	if(config == null) {
		config = {};
	}

	this._config = {
		'container': {
			'borderColor': 'black',
			'backgroundColor': '#444444',
			'lineHeight': '18px'
		},
		'trigger': {
			'style':     'background-color: ' + this._okColor + ';'+
		                 'display: inline;'+
                		 'border: 1px solid black;'+
        	        	 'cursor: pointer;'+
		                 'text-align: right;'+
						 'position: absolute'
		},
		'language': {
			'ok': 'OK',
			'cancel': 'Cancel'
		},
		'buttons': {
			'backgroundColor': '#666666',
			'borderColor': 'black'
		},
		'events': {}
	};

	this._config = ColorPicker.mergeArrays(this._config, config);
	
	return this;
}

ColorPicker.prototype.clickok = function() {
	this.setValue();
	this.hidePicker();
	
	this.fireEvent('change');
	
	return this;
}

ColorPicker.prototype.clickcancel = function() {
	this._okColor = this._element.value;
	this.hidePicker();

	return this;
}

ColorPicker.prototype.setValue = function(val) {
	if(val == null) {
		val = this._okColor;
	} else {
		if(typeof(val) == 'string') {
			if (val.match(/^[0-9a-f]{6}$/)) {
				val = '#' + this._element.value;
			}
			if(!val.match(/^\#[0-9a-f]{6}$/)) {
				val = this._okColor;
			}
		} else {
			val = this._okColor;
		}
	}
	
	this._okColor = val;
	this._element.value = this._okColor;
	this.value = this._okColor; //redundant but intuitive naming for external usage
	this._trigger.style.backgroundColor = this._okColor;
	this._arrow.setAttribute('src', ColorPicker.getArrowImageBase64(this._okColor));
	
	this.toValue();

	return this;
}

ColorPicker.prototype.toValue = function() { //from this._element.value
	this._rgb = ColorPicker.HextoRGB(this._okColor);
	
	this._texts[0].value = this._rgb[0];
	this._texts[1].value = this._rgb[1];
	this._texts[2].value = this._rgb[2];
	
	this._hsb = ColorPicker.RGBtoHSB(this._rgb);

	this._texts[3].value = Math.round(this._hsb[0] * 360);
	this._texts[4].value = Math.round(this._hsb[1] * 100);
	this._texts[5].value = Math.round(this._hsb[2] * 100);
	
	this._texts[6].value = this._okColor;
	this._real.style.backgroundColor = this._okColor;

	return this;
}

ColorPicker.prototype.setSB = function(e) {
	//x = saturation
	//y = brightness

	var pos = ColorPicker.getEventMousePosition(e);
	
	var hsb = this._hsb;

	hsb[0] = this._h;
	hsb[1] = pos[0] / ColorPicker.getEventElement(e).width;
	hsb[2] = (ColorPicker.getEventElement(e).height - pos[1]) / ColorPicker.getEventElement(e).height;
	
	var rgb = ColorPicker.HSBtoRGB(hsb);
	
	var hex = ColorPicker.RGBtoHex(rgb);
	this._preview.style.backgroundColor = hex;
	if(ColorPicker.getEventType(e) == 'click') {
		this._okColor = hex;
		this.toValue();
		this.fireEvent('click');
	} else {
		this.fireEvent('mousemove');
	}

	return this;
}

ColorPicker.prototype.setH = function(e) {
	var pos = ColorPicker.getEventMousePosition(e);
	
	var rgb = ColorPicker.HextoRGB(this._okColor);
	var hsb = ColorPicker.RGBtoHSB(rgb);
	if(!ColorPicker.getEventElement(e).width) {
		return;
	}
	hsb[0] = pos[0] / ColorPicker.getEventElement(e).width;
	
	rgb = ColorPicker.HSBtoRGB(hsb);
	var hex = ColorPicker.RGBtoHex(rgb);
	
	this._preview.style.backgroundColor = hex;
	
	var pRgb = ColorPicker.HSBtoRGB([hsb[0], 1, 1]);
	var pHex = ColorPicker.RGBtoHex(pRgb);
	this._sb_div.style.backgroundColor = pHex;
        
	if(ColorPicker.getEventType(e) == 'click') {
		this._h = hsb[0];
        this._okColor = hex;
		this.toValue();
		this.fireEvent('click');
	} else {
		this.fireEvent('mousemove');
	}

	return this;
}

ColorPicker.prototype.setText = function(e) {
	var src = ColorPicker.getEventElement(e).name.replace(/colorpicker_/, '');
	var hex = this._okColor;
	var rgb = ColorPicker.HextoRGB(hex);
	var hsl = ColorPicker.RGBtoHSB(rgb);
	var val = ColorPicker.getEventElement(e).value;
	hsl[0] = this._h;
	
	if('hslrgb'.indexOf(src) > -1) {
		if(isNaN(parseInt(val))) {
        	        return;
	        }
		val = parseInt(val);
		if(val < 0) {
			return;
		}
		
		if('hsl'.indexOf(src) > -1) {
			if(src == 'h') {
				if(val > 360) {
					return;
				}
				val = val / 36;
			} else if(val > 100) {
				return;
			}

			hsl['hsl'.indexOf(src)] = val / 100;
			rgb = ColorPicker.HSBtoRGB(hsl);
			hex = ColorPicker.RGBtoHex(rgb);
			if(src == 'h') {
				this._h = hsl[0];
			}
		} else {
			if(val > 255) {
				return;
			}
			rgb['rgb'.indexOf(src)] = val;
			hex = ColorPicker.RGBtoHex(rgb);
			hsl = ColorPicker.RGBtoHSB(rgb);
			this._h = hsl[0];
		}	
	} else { //hex
		if(!val.match(/#[0-9a-f]{6}/i)) {
			return;
		}
		hex = val;
		rgb = ColorPicker.HextoRGB(hex);
		hsl = ColorPicker.RGBtoHSB(rgb);
		this._h = hsl[0];
	}
	this._okColor = hex;
	this.toValue();
	this.resetPreview();
	this.fireEvent('click');

	return this;
}

ColorPicker.prototype.resetPreview = function() {
	this._preview.style.backgroundColor = this._okColor;

	var pRgb = ColorPicker.HSBtoRGB([this._h, 1, 1]);
    var pHex = ColorPicker.RGBtoHex(pRgb);
	this._sb_div.style.backgroundColor = pHex;
	this.fireEvent('mousemove');

	return this;
}

ColorPicker.prototype.createPicker = function() {
//saturation & brightness
	var rgb = ColorPicker.HextoRGB(this._okColor);
	var hsb = ColorPicker.RGBtoHSB(rgb);
	this._h = hsb[0];
	
	this._sb_img = document.createElement('img');
        this._sb_img.setAttribute('src', ColorPicker.getSLImageBase64()); //'colorpicker_sb.png');
	this._sb_img.setAttribute('style', 'cursor: crosshair;');
	
	this._sb_div = document.createElement('div');
	this._sb_div.setAttribute('style', ''+
		'background-color: '+ this._okColor +';'+
		'float: left;'+
		'width: 256px;'+
		'height: 256px;'+
		'margin: 10px;'
	);
	this._sb_img.onmousemove = this.setSB.colorpicker_bind(this);
	this._sb_img.onclick = this.setSB.colorpicker_bind(this);
	this._sb_img.onmouseout = this.resetPreview.colorpicker_bind(this);
	this._sb_div.appendChild(this._sb_img);
	
//real
	this._real = document.createElement('div');
	this._real.setAttribute('style', ''+
		'height: 30px;'+
		'background-color: '+ this._okColor +';'
	);
//preview
	this._preview = document.createElement('div');
        this._preview.setAttribute('style', ''+
                'height: 30px;'+
                'background-color: '+ this._okColor +';'
        );
//chosencontainer
	var chosen = document.createElement('div');
	chosen.setAttribute('style', ''+
		'width: 85px;'+
		'height: 60px;'+
		'border: 1px solid black;'+
		'margin-bottom: 10px;'
	);
	chosen.appendChild(this._real);
	chosen.appendChild(this._preview);

//textfields
	var textContainer = document.createElement('div');
	textContainer.setAttribute('style', ''+
		'width: 85px;'+
		'text-align: right;'
	);

	var texts = ['R', 'G', 'B', 'H', 'S', 'L'];
	this._texts = new Array();
	for(var i = 0; i < 6; i++) {
		this._texts.push(document.createElement('input'));
		this._texts[i].setAttribute('style', ''+
			'width: 55px;'+
			'border: 1px solid black;'+
			'margin: 2px 0px 2px 5px;'+
			'font-family: "Courier New";'
		);
		this._texts[i].setAttribute('name', 'colorpicker_' + texts[i].toLowerCase() );
		this._texts[i].onkeyup = this.setText.colorpicker_bind(this);
		textContainer.appendChild(document.createTextNode(texts[i]));
		textContainer.appendChild(this._texts[i]);
		
		var clear = document.createElement('div');
		clear.setAttribute('style', 'clear: both;');
		if((i + 1) % 3 == 0) {
			clear.setAttribute('style', 'clear: both; margin-bottom: 9px;');
		}
		textContainer.appendChild(clear);
	}
	
	this._texts.push(document.createElement('input'));
	this._texts[this._texts.length - 1].setAttribute('style', ''+
                        'width: 81px;'+
                        'border: 1px solid black;'+
                        'margin: 2px;'+
                        'font-family: "Courier New";'
                );
	this._texts[this._texts.length - 1].setAttribute('name', 'colorpicker_x');
	this._texts[this._texts.length - 1].onkeyup = this.setText.colorpicker_bind(this);
	textContainer.appendChild(this._texts[this._texts.length - 1]);
	
//control container
	var controlcontainer = document.createElement('div');
	controlcontainer.setAttribute('style', ''+
                'width: 60px;'+
		'margin: 10px;'+
		'float: left;'
	);
        controlcontainer.appendChild(chosen);
        controlcontainer.appendChild(textContainer);

//hue
	this._hueimg = document.createElement('img');
	this._hueimg.setAttribute('src', ColorPicker.getHImageBase64());
	this._hueimg.setAttribute('height', '25');
	this._hueimg.setAttribute('width', '360');
	this._hueimg.setAttribute('style', 'margin: 0;');
	
	this._hue = document.createElement('div');
	this._hue.setAttribute('style', ''+
		'height: 25px;'+
                'float: left;'+
		'margin: 10px;'+
                'border: 1px solid black;'+
		'cursor: crosshair;'
        );
	this._hue.appendChild(this._hueimg);
        this._hueimg.onmousemove = this.setH.colorpicker_bind(this);
        this._hueimg.onclick = this.setH.colorpicker_bind(this);
	this._hueimg.onmouseout = this.resetPreview.colorpicker_bind(this);

//buttons
        var btnOk = document.createElement('div');
        btnOk.appendChild(document.createTextNode(this._config.language.ok));
        btnOk.setAttribute('style', ''+
                'height: 25px;'+
                'float: right;'+
                'width: 100px;'+
                'text-align: center;'+
                'line-height: 25px;'+
                'border: 1px solid '+ this._config.buttons.borderColor +';'+
                'cursor: pointer;'+
				'margin-left: 10px;'+
                'background-color: '+ this._config.buttons.backgroundColor +';'
        );
	btnOk.onclick = this.clickok.colorpicker_bind(this);
	var btnCancel = document.createElement('div');
	btnCancel.appendChild(document.createTextNode(this._config.language.cancel));
	btnCancel.setAttribute('style', ''+
                'height: 25px;'+
                'float: right;'+
		'width: 100px;'+
		'text-align: center;'+
		'line-height: 25px;'+
                'border: 1px solid '+ this._config.buttons.borderColor +';'+
                'cursor: pointer;'+
		'margin-left: 10px;'+
		'background-color: '+ this._config.buttons.backgroundColor +';'
        );
	btnCancel.onclick = this.clickcancel.colorpicker_bind(this);

//button container
        var buttoncontainer = document.createElement('div');
        buttoncontainer.setAttribute('style', ''+
                'margin: 10px;'
        );
        buttoncontainer.appendChild(btnOk);
	buttoncontainer.appendChild(btnCancel);

//container
	this._container = document.createElement('div');
	this._container.setAttribute('style', ''+
		'width: 382px;'+
		'height: 362px;'+ //276px;'+
		'position: absolute;'+
		'z-index: 5000;'+
		'line-height: '+ this._config.container.lineHeight +';'+
		'background-color: '+ this._config.container.backgroundColor +';'+
		'display: none;'+
		'border: 1px solid '+ this._config.container.borderColor +';'
	);
	
	this._container.appendChild(this._sb_div);
	this._container.appendChild(controlcontainer);
	this._container.appendChild(this._hue);
	this._container.appendChild(buttoncontainer);

	//document.body.insertBefore(this._container, document.body.firstChild);
	document.body.appendChild(this._container);

	this.resetPreview();
}

ColorPicker.prototype.showPicker = function() {
	if(ColorPicker.getInstance()) {
		ColorPicker.getInstance().hidePicker();
	}
	ColorPicker.setInstance(this);

	this._container.style.display = 'block';
	
        var obj = this._trigger;
        var curleft = curtop = 0;
        if (obj.offsetParent) {
                do {
                    curleft += obj.offsetLeft;
                	curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
        }
	
	this._container.style.left = curleft + 'px';
	this._container.style.top = (parseInt(this._trigger.style.height) + curtop) + 'px';
	
	var hsl = ColorPicker.RGBtoHSB(ColorPicker.HextoRGB(this._element.value));
	this._h = hsl[0];
	
	this.resetPreview();
	this.toValue();
	this.fireEvent('focus');

	return this;
}
ColorPicker.prototype.hidePicker = function() {
	this.resetPreview();
    this._container.style.display = 'none';
	ColorPicker.setInstance(null);
	this.fireEvent('blur');

	return this;
}

ColorPicker.prototype.fireEvent = function(event){
    if (document.createEventObject){ // dispatch for IE
        var evt = document.createEventObject();
		evt.object = this;
		evt.type = event;
        return this._element.fireEvent('on'+event, evt);
    }
    else{ // dispatch for firefox + others
        var evt = document.createEvent('Events');
        evt.initEvent(event, true, true); // event type,bubbling,cancelable
		evt.object = this;
		evt.type = event;
        return !this._element.dispatchEvent(evt);
    }
}

ColorPicker.HSBtoRGB = function(hsb) { //h, s, l) {
	var h = hsb[0];
	var s = hsb[1];
	var v = hsb[2];
	var rgb = [0, 0, 0];
	
	var c = v * s;
	
	var hd = h / (1/6);
	
	var x = c * (1 - Math.abs((hd % 2) - 1));

	if(hd < 1) {
		rgb = [c, x, 0];
	} else if (hd < 2) {
		rgb = [x, c, 0];
	} else if (hd < 3) {
		rgb = [0, c, x];
	} else if (hd < 4) {
		rgb = [0, x, c];
	} else if (hd < 5) {
		rgb = [x, 0, c];
	} else {
		rgb = [c, 0, x];
	}
	
	var m = v - c;
	
	return [255 * (rgb[0] + m), 255 * (rgb[1] + m), 255 * (rgb[2] + m)];
}

ColorPicker.RGBtoHSB = function(rgb) {
	var max = Math.max(rgb[0], Math.max(rgb[1], rgb[2]));
	var min = Math.min(rgb[0], Math.min(rgb[1], rgb[2]));
	
	var h = 0;
	if(max > 0) {
		if(rgb[0] == max) {
			h = (rgb[1] - rgb[2]) / (max - min);
		} else if(rgb[1] == max) {
			h = 2 + ((rgb[2] - rgb[0]) / (max - min));
		} else {
			h = 4 + ((rgb[0] - rgb[1]) / (max - min));
		}
	}
	
	h = h * (1 / 6);
	h = (h + 2) % 1;
	
	if(isNaN(h)) {
		h = 0;
	}
	
	var s = 0;
	if(max > 0) {
		s = (max - min) / max;
	}

	var v = max / 255;

	return [h, s, v];
}

ColorPicker.RGBtoHex = function(rgb) {
	var ret = '';
	var app = '';
	for(var i = 0; i < rgb.length; i++) {
		app = ColorPicker.Base(rgb[i], '0123456789abcdef');
		if(app.length == 1) {
			ret = ret + '0';
		}
		ret = ret + app;
		app = '';
	}
	return '#' + ret;
}

ColorPicker.HextoRGB = function(hex) {
	var rgb = [];
        if(hex.length == 7) {
                hex = hex.substring(1);
        }
	
	for(var i = 0; i < 6; i = i + 2) {
		rgb.push(ColorPicker.unBase(hex.substring(i, i + 2), '0123456789abcdef'));
	}
	
	return rgb;
}

ColorPicker.Base = function(dec, base) {
	var len = base.length;
	var ret = '';
	while(dec > 0) {
		ret = base.charAt(dec % len) + ret;
		dec = Math.floor(dec / len);
	}
	if(ret == '') {
		return base.charAt(0);
	}
	return ret;
}

ColorPicker.unBase = function(num, base) {
	var len = base.length;
	var ret = 0;
	for(var x=1; num.length > 0; x *= len){
		ret += base.indexOf(num.charAt(num.length - 1)) * x
		num = num.substr(0, num.length - 1);
	}
	return ret;
}

ColorPicker.getEventElement = function (e) {
        if (!e) {
                var e = window.event;
        }

        if (e.target) {
                return e.target;
        } else if (e.srcElement) {
                return e.srcElement;
        }
        if (targ.nodeType == 3) { // defeat Safari bug
                return targ.parentNode;
        }
}

ColorPicker.getEventMousePosition = function(e, relativeToElement) {
        if(relativeToElement == undefined) {
                relativeToElement = true;
        }
        if (!e) {
                var e = window.event;
        }

        var posx = 0;
        var poxy = 0;

        if (e.pageX || e.pageY) {
                posx = e.pageX;
                posy = e.pageY;
        }
        else if (e.clientX || e.clientY) {
                posx = e.clientX + document.body.scrollLeft
                        + document.documentElement.scrollLeft;
                posy = e.clientY + document.body.scrollTop
                        + document.documentElement.scrollTop;
        }

        if(relativeToElement) {
                var obj = ColorPicker.getEventElement(e);
                var curleft = curtop = 0;
                if (obj.offsetParent) {
                        do {
                                curleft += obj.offsetLeft;
                                curtop += obj.offsetTop;
                        } while (obj = obj.offsetParent);
                }
                posx = posx - curleft;
                posy = posy - curtop;
        }

        return [posx, posy];
}

ColorPicker.getEventType = function(e) {
        if (!e) {
                var e = window.event;
        }
        return e.type;
}

ColorPicker.getElementsByClassName = function (classname) {
	var allHTMLTags = document.getElementsByTagName('*');
	var result = new Array();

	for(i = 0; i < allHTMLTags.length; i++) {
		if(allHTMLTags[i].className.match( new RegExp('(^|\\s)'+ classname +'(\\s|$)') )) {
			result.push(allHTMLTags[i]);
		}
	}
	
	return result;
}

ColorPicker.setInstance = function(inst) { //not a real sigleton implementation, just mimic
	this.instance = inst;
}

ColorPicker.getInstance = function() {
	if(this.instance) {
		return this.instance;
	}
	return null;
}

ColorPicker.mergeArrays = function(arr1, arr2) {
        for(attr in arr2) {
                if(typeof(arr2[attr]) == 'object') {
                        if(!arr1[attr]) {
                                arr1[attr] = {};
                        }
                        arr1[attr] = ColorPicker.mergeArrays(arr1[attr], arr2[attr]);
                } else {
                        arr1[attr] = arr2[attr];
                }
        }
        return arr1;
}

ColorPicker.getDimensions = function(Elem) {
	var elem = Elem;
	
	if(typeof(Elem) != 'object') {
		if(document.getElementById) {
			elem = document.getElementById(Elem);
		} else if (document.all){
			elem = document.all[Elem];
		}
	}
	
	if (elem.style.pixelWidth) { 
		return [elem.style.pixelWidth, elem.style.pixelHeight];
	}
	return [elem.offsetWidth, elem.offsetHeight];
}

ColorPicker.init = function(classname, config) {
	if(classname == null) {
		classname = 'colorpicker';
	}
    if(config == null) {
		config = {};
	}
	
	var pickers = [];
	
	var elements = ColorPicker.getElementsByClassName(classname);
    for(var i = 0; i < elements.length; i++) {
		pickers[pickers.length] = new ColorPicker(elements[i], config);
    }
	return pickers;
}

ColorPicker.run = function(config) {
	return ColorPicker.init('colorpicker', config);
}

Function.prototype.colorpicker_bind = function(scope) {
  var _function = this;
  
  return function() {
    return _function.apply(scope, arguments);
  }
}

ColorPicker.getArrowImageBase64 = function(backgroundHex) {
	var l = 1;
	if(backgroundHex) {
		var hsl = ColorPicker.RGBtoHSB(ColorPicker.HextoRGB(backgroundHex));
		l = hsl[2];
	}
	
	if(l > .5) {
		return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAFCAYAAAB8ZH1oAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ\n'+
'bWFnZVJlYWR5ccllPAAAAEJJREFUeNpiYICAmUD8HweeyYAE2ID4GBZFx6ByKEAaiJ8jKXoOFcMK\n'+
'bID4JxTbIEswoyl8BMQfgHgXEK9BlgAIMACe5BZo5EC3PQAAAABJRU5ErkJggg==\n';
	}
	
	return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAFCAYAAAB8ZH1oAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ\n'+
'bWFnZVJlYWR5ccllPAAAAEdJREFUeNpi+P//PwMQz/yPG4DkGBigCtmA+BgWRcegcnCFICwNxM+R\n'+
'FD2HijGgKwRhGyD+CcU2yHKMYNWoIAdKT0EWBAgwAJInjrM3swK6AAAAAElFTkSuQmCC';
}


ColorPicker.getHImageBase64 = function() {
	return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWgAAAABCAYAAADzaTTzAAAABGdBTUEAALGPC/xhBQAAABl0RVh0\n'+
'U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNUmK/OAAAACgSURBVDhPtVRJEoAgDAsuv/Hm+P8XePA9\n'+
'6mA5MFMrRah46AANgdAAzi+zx7YCA+4xinHEtXzAc5iGWzhcq0Un8Q9HQZJ3itDyfutcau3SPUq5\n'+
'mn6PTjEyZ9gfpnxZ02DySQbzIkeTeavhOV5Ljrx4UmOt/hPo2TOMVePVS/Vr5/GbU8st1ZLag+cc\n'+
'6LCPFyzNDXMshsmf4c2oEtygY55wAUe4tnP/51gvAAAAAElFTkSuQmCC';
}

ColorPicker.getSLImageBase64 = function() {
	return 'data:image/png;base64,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\n'+
'QmCC';
}

