
/*
 colorpicker
 */

(function($) {

	$.widget('ui.colorpicker', {
		init: function(){
			var self = this,
				options = this.options,
				selectedColor = (options.selectedColor = this._fixSelectedColor(options.selectedColor)),
				width = options.css.width,
				createButton = options.createButton,
				uiContainer = this.element
					.addClass('ui-colorpicker-header')
					.css({
						width: (options.description==='' && !createButton)?width:'auto'
					})
					.click(function(event) {
						if(options.disabled) return;
						//event.preventDefault();
						//event.stopPropagation();
						return self._show.call(self, event); 
					}),
				height = uiContainer.height() || parseInt(uiContainer.css('height')) || 22,
				uiDesciption = (this.uiDescription = 
					$('<div class="ui-colorpicker-description">' + options.description + '</div>'))
					.appendTo(uiContainer)
					.css({display: (options.description==='')?'none':'block'}),
				uiSample = (this.uiSample = 
					$('<div class="ui-colorpicker-sample"></div'))
					.appendTo(uiContainer)
					.css({
						width: (options.description==='')?width - 10:height - 10,
						height: height - 10,
						backgroundColor: selectedColor,
						borderColor: dynamicBorderColor(selectedColor)
					}).attr('title', selectedColor),
				useHSB = options.useHSB = options.colors.constructor==String,
				showPicker = options.showPicker,
				uiWrapper = (this.uiWrapper = 
					$('<div class="ui-colorpicker-wrapper ui-popup"></div>'))
					.appendTo(document.body)
					.bind('click', function(event){return false;}), 
				uiTitlebar = (this.uiTitlebar = 
					$('<div class="ui-colorpicker-title-bar">' + 
					  	'<div class="ui-colorpicker-hex"><input type="text" maxlength="6" size="6"/></div>' + 
						( (useHSB) ? 
						   ((showPicker) ? 
								'<div class="ui-colorpicker-picker"><img src="/CSS/plugin/images/colorpicker.gif"/></div>' : 
								'<div class="ui-colorpicker-picker2"></div>'):
						   '<div class="ui-colorpicker-tone"></div>') + 
						'<button class="ui-colorpicker-submit">Apply Color</button>' + 
						'<div class="ui-colorpicker-close"><img src="/CSS/plugin/images/Close.gif" /></div>' + 
					'</div>'))
					.appendTo(uiWrapper),
				classPicker = useHSB ? 'ui-colorpicker' : 'ui-colorpicker2', 
				uiPicker = (this.uiPicker = 
					$('<div class="' + classPicker + '">' + 
					  ( (useHSB)?
							'<div class="ui-colorpicker-color"><div><div></div></div></div>' + 
							'<div class="ui-colorpicker-hue"><div></div></div>' 
						:
							'<div class="ui-colorpicker-palette-user">' +
								'<table width="100%" cellspacing="0" cellpadding="0"><tbody>' + 
									'<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>' +
									'<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>' +
									'<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>' +
									'<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>' +
									'<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>' +
									'<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>' +
									'<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>' +
								'</tbody></table>' +
							'</div>'
						) +
							'<div class="ui-colorpicker-new-color"></div>' + 
							'<div class="ui-colorpicker-current-color"></div>' +
							'<div class="ui-colorpicker-palette-recent">' + 
								'<table width="100%" cellspacing="0" cellpadding="0"><tbody>' + 
									'<tr><td></td><td></td><td></td><td></td><td></td></tr>' +
									'<tr><td></td><td></td><td></td><td></td><td></td></tr>' +
									'<tr><td></td><td></td><td></td><td></td><td></td></tr>' +
									'<tr><td></td><td></td><td></td><td></td><td></td></tr>' +
									'<tr><td></td><td></td><td></td><td></td><td></td></tr>' +
								'</tbody></table>' +
							'</div>' +
					  '</div>'))
					.appendTo(uiWrapper),
				uiButton=(this.uiButton=$('<div class="ui-colorpicker-button"><img src="/CSS/common/DropArrow.gif" /></div>'));
				
			if(createButton){
				uiButton.appendTo(uiContainer)
						.click(function(event){
							if(options.disabled) return;
							return self._show.call(self, event); 
				});
			}
			this.uiHex = this.uiTitlebar
							.find(':text')
								.bind('blur', function(event){$(this).parent().removeClass('ui-colorpicker-focus');})
								.bind('focus', function(event){$(this).parent().addClass('ui-colorpicker-focus');})
								.bind('change', function(event){
									var bgcolor = $(this).val();
									if(isValidHexColor(bgcolor)){
										return self._change.call(self, event);
									}else{
										alert('Invalid color!');
										return false;
									}
								});
			this.uiTone = this.uiTitlebar.find('.ui-colorpicker-tone');
			this.uiTitlebar.find('.ui-colorpicker-picker')
								.bind('click', function(event){
									self.element.triggerHandler('onPick', [self.fakeEvent('onPick'), self.ui({})], self.options.onPick);
									return self._hide.call(self, event);
								}).end()
							.find(':button')
								.css({marginLeft: (useHSB?50:15)})
								.bind('click', function(event){
									var bgcolor = $(':text', self.uiTitlebar).val();
									if(isValidHexColor(bgcolor) && self.isAvailableColor(bgcolor)){
										return self._select.call(self, event, {color: bgcolor});
									}else{
										alert('Invalid color or unavailable color!');
										return false;
									}
								}).end()
							.find('.ui-colorpicker-close')
								.bind('click', function(event){
									return self._hide.call(self, event);
								});

			this.uiSelector = this.uiPicker
								.find('div.ui-colorpicker-color')
									.bind('mousedown', function(event){
										return self._downSelector.call(self, event);
									});
			if($.browser.msie) this.uiSelector.bind('click', function(event){return false;});
			
			this.uiSelectorIndicator = this.uiSelector.find('div div');
			this.uiHue = this.uiPicker.find('div.ui-colorpicker-hue div');
			
			this.uiPicker.find('div.ui-colorpicker-hue')
							.bind('mousedown', function(event){
								return self._downHue.call(self, event);
							});
			if($.browser.msie) this.uiPicker.find('div.ui-colorpicker-hue').bind('click', function(event){return false;});
			
			this.uiNewColor = this.uiPicker.find('div.ui-colorpicker-new-color');
			this.uiCurrentColor = this.uiPicker.find('div.ui-colorpicker-current-color');

			this.uiPaletteUser = this.uiPicker.find('div.ui-colorpicker-palette-user td')
									.each(function(i, v){
										var idx = i, color = self.getColor(idx);
										if(color!==''){
											$(v).css({backgroundColor: '#' + color}).attr('BGC', color);
										}
									})
									.bind('click', function(event){
										var bgcolor = $(this).attr('BGC') || '000000';
										if(isValidHexColor(bgcolor)){
											return self._change.call(self, event, this);
										}
									});
			this.uiPaletteRecent = this.uiPicker.find('div.ui-colorpicker-palette-recent td');
			
			if($.browser.msie){
				if(!useHSB) this.uiPaletteUser.css({width:25, height:20}).html('<img style="width:1px; height:1px;" />');
				this.uiPaletteRecent.css({width:24, height:20}).html('<img style="width:1px; height:1px;" />');
			}
			
			if($.browser.safari){
				if(!useHSB) this.uiPaletteUser.css({width:25, height:20, cursor:'pointer'}).html('<img style="width:1px; height:1px;" />');
				this.uiPaletteRecent.css({width:24, height:20, cursor:'pointer'}).html('<img style="width:1px; height:1px;" />');
			}
			
			if($.browser.msie && $.browser.version <= 6){ 
				this.uiPicker.find('div.ui-colorpicker-color > div')
					.css({
						 backgroundImage: 'url(images/blank.gif)',
						 filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(' + 
											'src="/CSS/plugin/images/colorpicker_overlay.png", ' +
											'sizingMethod="crop")'
					});
			}
			
			if($.ui.colorpicker.defaults.dataCache && $.ui.colorpicker.defaults.dataCache.size===0 && !$.ui.colorpicker.defaults.dataCache.loading && options.idvdsession > 0) {
				$.ui.colorpicker.defaults.dataCache.loading = true;
				$.ajax({
					url: '/DS/MetaData.asp',
					data: {
							what: 'sessioncolors', 
							idvdsession: options.idvdsession
					},
					success: function(data){
							$.ui.colorpicker.defaults.dataCache.loading=false;
							var d=eval('(' + data + ')'), cnt=0;
							for(var i=0, l=d.items.length; i<l; i++){
								if(!exists(d.items[i].color.replace('#', ''))){
									$.ui.colorpicker.defaults.dataCache.colors.push({
										color: d.items[i].color.replace('#', ''),
										src: d.items[i].src,
										timex: d.items[i].timex
									});
									cnt++;
								}
							}
							$.ui.colorpicker.defaults.dataCache.size=cnt;
					},
					ajaxName: 'color_picker-get_session_colors'
				});
			}
		},
		
		_show: function(event) {
			var self = this, 
				options = this.options,
				containerOffset = this.element.offset(), 
				containerHeight = this.element.outerHeight(), 
				windowHeight = $(window).height(),
				windowWidth = $(window).width(),
				wrapperHeight = this.uiWrapper.height(),
				wrapperWidth = this.uiWrapper.width();

			event.preventDefault();
			event.stopPropagation();
			
			this.element.triggerHandler('beforeShow', [this.fakeEvent('beforeShow')], this.options.beforeShow);
			
			$('.ui-popup').hide();
			if($.browser.msie && $.browser.version <= 6) $('select').hide();

			this.setColor(options.selectedColor);
			
			this.uiPaletteRecent
				.each(function(i, v){
					var idx = i, color;
					if(options.useHSB){
						if(idx<=12){
							color = getCacheColor(idx);
						}else{
							color = getSpecialColor(idx-13);
						}
					}else{
						color = getCacheColor(idx);
					}
					if(color!=='' && isValidHexColor(color)){
						$(v).css({backgroundColor: '#' + color}).attr('BGC', color);
					}
				})
				.bind('click', function(event){
					event.preventDefault();
					event.stopPropagation();
					var bgcolor = $(this).attr('BGC') || '000000';
					if(isValidHexColor(bgcolor)){
						return self._change.call(self, event, this);
					}
				})
				.bind('dblclick', function(event){
					event.preventDefault();
					event.stopPropagation();
					var bgcolor = $(this).attr('BGC') || '000000';
					if(isValidHexColor(bgcolor)){
						return self._select.call(self, event, {color: bgcolor});
					}
				});
				
			$(document).one('click', function(event) {
				return self._hide.call(self, event);
			});
			
			var left=(containerOffset.left+wrapperWidth<=windowWidth)?containerOffset.left:Math.max(0, containerOffset.left-wrapperWidth), 
				top=containerOffset.top + containerHeight;
			this.uiWrapper.css({
				display: 'block',
				left: left,
				top: top
			});
		},
		_hide: function(event) {
			var self = this;
			self.uiPaletteRecent.unbind('click dblclick');
			if($.browser.msie && $.browser.version <= 6) $('select').show();
			self.uiWrapper.css('display', 'none');
		},
		_select: function(event, dataInfo) {
			dataInfo.color = '#' + dataInfo.color;
			if (isValidHexColor(dataInfo.color) && this.isAvailableColor(dataInfo.color)) {
				updateDataCache(dataInfo.color);
				this.options.selectedColor = dataInfo.color;
				this.uiSample.css({
						backgroundColor: dataInfo.color,
						borderColor: dynamicBorderColor(dataInfo.color)
				}).attr('title', dataInfo.color);
				this.element.triggerHandler('onSelect', [this.fakeEvent('onSelect'), this.ui(dataInfo)], this.options.onSelect);
				return this._hide.call(this, event);
			}
		},

		_fillHex: function(hsb) {
			if(this.useHex){
				this.uiHex.val(this.hex);
			}else{
				this.uiHex.val(this._HSBToHex(hsb));
			}
		},
		_setTone: function(tone) {
			if(!this.options.useHSB) this.uiTone.html(tone);
		},
		_setSelector: function(hsb) {
			if(this.options.useHSB){
				this.uiSelector.css('backgroundColor', '#' + this._HSBToHex({h: hsb.h, s: 100, b: 100}));
				this.uiSelectorIndicator.css({
					left: parseInt(150 * hsb.s/100, 10),
					top: parseInt(150 * (100-hsb.b)/100, 10)
				});
			}
		},
		_setHue: function(hsb) {
			if(this.options.useHSB) this.uiHue.css('top', parseInt(150 - 150 * hsb.h/360, 10));
		},
		_setCurrentColor: function(hsb) {
			if(this.useHex){
				this.uiCurrentColor.css('backgroundColor', '#' + this.hex.replace('#',''));
			}else{
				this.uiCurrentColor.css('backgroundColor', '#' + this._HSBToHex(hsb));
			}
		},
		_setNewColor: function(hsb) {
			if(this.useHex){
				this.uiNewColor.css('backgroundColor', '#' + this.hex.replace('#',''));
			}else{
				this.uiNewColor.css('backgroundColor', '#' + this._HSBToHex(hsb));
			}
		},
		_change: function(event, target) {
			var color;
			target = target || event.target;
			if(target.parentNode.className.indexOf('-hex') > 0){	//input box
				this.hex = target.value;
				this.useHex = true;
				this.color = color = this._HexToHSB(target.value);
			}else if(target.tagName.toUpperCase()==='TD'){			//TD
				this.hex = $(target).attr('BGC') || '000000';
				this.useHex = true;
				this.color = color = this._HexToHSB(this.hex);
				this._fillHex(color);
			}else{
				this.useHex = false;
				this.color = color = this._fixHSB(this.hsb);
				this.hex = this._HSBToHex(color);
				this._fillHex(color);
			}
			this.hsb = color;
			this._setSelector(color);
			this._setHue(color);
			this._setNewColor(color);
			return false;
		},
		_downSelector: function(event) {
			var self = this;
			this.currentSelector = {pos: this.uiSelector.offset()};
			this.hsb.s = parseInt(100*(Math.max(0,Math.min(150,(event.pageX - this.currentSelector.pos.left))))/150, 10);
			this.hsb.b = parseInt(100*(150 - Math.max(0,Math.min(150,(event.pageY - this.currentSelector.pos.top))))/150, 10);
			this._change.call(this, event);
			$(document).bind('mouseup.cpSlider', function(event){return self._upSelector.call(self, event);});
			$(document).bind('mousemove.cpSlider', function(event){return self._moveSelector.call(self, event);});
			return false;
		},
		_moveSelector: function(event) {
			this.hsb.s = parseInt(100*(Math.max(0,Math.min(150,(event.pageX - this.currentSelector.pos.left))))/150, 10);
			this.hsb.b = parseInt(100*(150 - Math.max(0,Math.min(150,(event.pageY - this.currentSelector.pos.top))))/150, 10);
			this._change.call(this, event);
			return false;
		},
		_upSelector: function(event) {
			$(document).unbind('mouseup.cpSlider');
			$(document).unbind('mousemove.cpSlider');
			return false;
		},
		_downHue: function(event) {
			var self = this;
			this.currentHue = {y: this.uiPicker.find('div.ui-colorpicker-hue').offset().top};
			this.hsb.h = parseInt(360*(150 - Math.max(0,Math.min(150,(event.pageY - this.currentHue.y))))/150, 10);
			this._change.call(this, event);
			$(document).bind('mouseup.cpSlider', function(event){return self._upHue.call(self, event);});
			$(document).bind('mousemove.cpSlider', function(event){return self._moveHue.call(self, event);});
			return false;
		},
		_moveHue: function(event) {
			this.hsb.h = parseInt(360*(150 - Math.max(0,Math.min(150,(event.pageY - this.currentHue.y))))/150, 10);
			this._change.call(this, event);
			return false;
		},
		_upHue: function(event) {
			$(document).unbind('mouseup.cpSlider');
			$(document).unbind('mousemove.cpSlider');
			return false;
		},
		
		_fixHSB: function(hsb) {
			return {
				h: Math.min(360, Math.max(0, hsb.h)),
				s: Math.min(100, Math.max(0, hsb.s)),
				b: Math.min(100, Math.max(0, hsb.b))
			};
		},
		_fixRGB: function(rgb) {
			return {
				r: Math.min(255, Math.max(0, rgb.r)),
				g: Math.min(255, Math.max(0, rgb.g)),
				b: Math.min(255, Math.max(0, rgb.b))
			};
		},
		_HexToRGB: function(hex) {
			var hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16);
			return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)};
		},
		_HexToHSB: function(hex) {
			return this._RGBToHSB(this._HexToRGB(hex));
		},
		_RGBToHSB: function(rgb) {
			var hsb = {};
			hsb.b = Math.max(Math.max(rgb.r,rgb.g),rgb.b);
			hsb.s = (hsb.b <= 0) ? 0 : Math.round(100*(hsb.b - Math.min(Math.min(rgb.r,rgb.g),rgb.b))/hsb.b);
			hsb.b = Math.round((hsb.b /255)*100);
			if((rgb.r==rgb.g) && (rgb.g==rgb.b)) hsb.h = 0;
			else if(rgb.r>=rgb.g && rgb.g>=rgb.b) hsb.h = 60*(rgb.g-rgb.b)/(rgb.r-rgb.b);
			else if(rgb.g>=rgb.r && rgb.r>=rgb.b) hsb.h = 60  + 60*(rgb.g-rgb.r)/(rgb.g-rgb.b);
			else if(rgb.g>=rgb.b && rgb.b>=rgb.r) hsb.h = 120 + 60*(rgb.b-rgb.r)/(rgb.g-rgb.r);
			else if(rgb.b>=rgb.g && rgb.g>=rgb.r) hsb.h = 180 + 60*(rgb.b-rgb.g)/(rgb.b-rgb.r);
			else if(rgb.b>=rgb.r && rgb.r>=rgb.g) hsb.h = 240 + 60*(rgb.r-rgb.g)/(rgb.b-rgb.g);
			else if(rgb.r>=rgb.b && rgb.b>=rgb.g) hsb.h = 300 + 60*(rgb.r-rgb.b)/(rgb.r-rgb.g);
			else hsb.h = 0;
			hsb.h = Math.round(hsb.h);
			return hsb;
		},
		_HSBToRGB: function(hsb) {
			var rgb = {};
			var h = Math.round(hsb.h);
			var s = Math.round(hsb.s*255/100);
			var v = Math.round(hsb.b*255/100);
			if(s == 0) {
				rgb.r = rgb.g = rgb.b = v;
			} else {
				var t1 = v;
				var t2 = (255-s)*v/255;
				var t3 = (t1-t2)*(h%60)/60;
				if(h==360) h = 0;
				if(h<60) {rgb.r=t1;	rgb.b=t2; rgb.g=t2+t3;}
				else if(h<120) {rgb.g=t1; rgb.b=t2;	rgb.r=t1-t3;}
				else if(h<180) {rgb.g=t1; rgb.r=t2;	rgb.b=t2+t3;}
				else if(h<240) {rgb.b=t1; rgb.r=t2;	rgb.g=t1-t3;}
				else if(h<300) {rgb.b=t1; rgb.g=t2;	rgb.r=t2+t3;}
				else if(h<360) {rgb.r=t1; rgb.g=t2;	rgb.b=t1-t3;}
				else {rgb.r=0; rgb.g=0;	rgb.b=0;}
			}
			return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)};
		},
		_RGBToHex: function(rgb) {
			var hex = [
				rgb.r.toString(16),
				rgb.g.toString(16),
				rgb.b.toString(16)
			];
			$.each(hex, function (nr, val) {
				if (val.length == 1) {
					hex[nr] = '0' + val;
				}
			});
			return hex.join('').toUpperCase();
		},
		_HSBToHex: function(hsb) {
			return this._RGBToHex(this._HSBToRGB(hsb));
		},
		
		setColor: function(color) {
			if(typeof color == 'string'){
				this.hex = color.replace('#','');
				this.useHex = true;
				color = this._HexToHSB(color);
			}else if(color.r != undefined && color.g != undefined && color.b != undefined) {
				this.hex = this._RGBToHex(color);
				this.useHex = true;
				color = this._RGBToHSB(color);
			}else if(color.h != undefined && color.s != undefined && color.b != undefined) {
				this.hex = this._HSBToHex(color);
				this.useHex = false;
				color = this._fixHSB(color);
			}else{
				return this;
			}

			this.hsb = color;
			this.color = color;
			this.originalColor = color;
			this._fillHex(color);
			this._setHue(color);
			this._setSelector(color);
			this._setCurrentColor(color);
			this._setNewColor(color);
		},
		
		getColor: function(idx) {
			if(!this.options.useHSB){
				return (idx<this.options.colors.length)? this.options.colors[idx] : '';
			}else{
				return '';
			}
		},
		isAvailableColor: function(color) {
			if(this.options.colors.constructor==String){
				return true;
			}else{
				return $.inArray(color.replace('#', ''), this.options.colors)!==-1;
			}
		},
		domElement: function(){
			return this.element[0];
		},
		updateValue: function(value){
			var hex;
			if(typeof value == 'string'){
				hex='#' + value.replace('#', '');
			}else if(value.r != undefined && value.g != undefined && value.b != undefined) {
				hex='#' + this._RGBToHex(value);
			}else{
				hex='';
			}
			if(hex!==''){
				if(isValidHexColor(hex) && this.isAvailableColor(hex)){
					hex=hex;
				}else{
					hex='#000000';
				}
			}else{
				hex='#000000';
			}
			this.options.selectedColor = hex;
			this.uiSample.css({
					backgroundColor: hex,
					borderColor: dynamicBorderColor(hex)
			}).attr('title', hex);
			this.setColor(hex);
		},
		fakeEvent: function(type) {
			return $.event.fix({
				type: type,
				target: this.element[0]
			});
		},
		ui: function(info) {
			return {
				options: this.options,
				dataInfo: info
			};
		},
		destroy: function() {
			this.uiWrapper.remove();
			this.element.unbind('.colorpicker').removeData('colorpicker').empty();
		},
		
		_fixSelectedColor: function(value){
			var hex;
			if(typeof(value)==='string'){
				hex='#' + value.replace('#', '');
			}else if(value.r!=undefined && value.g!=undefined && value.b!=undefined){
				hex='#' + this._RGBToHex(value);
			}else{
				hex='';
			}
			
			if(hex!==''){
				if(isValidHexColor(hex) && this.isAvailableColor(hex)){
					return hex;
				}else{
					return '#000000';
				}
			}else{
				return '#000000';
			}
		}
		
	});
	
	$.ui.colorpicker.getter='domElement, enable, disable, updateValue';
	
	$.extend($.ui.colorpicker, {
		defaults: {
			createButton: false,
			showPicker: true,
			idvdsession: 0,
			dataCache: {
				size: 0,
				loading: false,
				colors: []
			},
			specials: ['000000','333333','666666','999999','CCCCCC','FFFFFF','FF0000','00FF00','0000FF','FFFF00','00FFFF','FF00FF'],
			useHSB: true,
			colors: 'ALL',
			cntPerRow: 10,
			//colors: ['000000','FFFFFF','FF0000','00FF00','0000FF','FFFF00','00FFFF','FF00FF'],
			selectedColor: '#FF0000',
			description: '',
			css: {
				width: 22
			}
		}
	});
	
	function dynamicBorderColor(bg) {
		bg = bg.replace('#','');
		var r = parseInt(bg.substr(0,2),16), g = parseInt(bg.substr(2,2),16), b = parseInt(bg.substr(4,2),16);
		if (r>=204 && g>=204 && b>=204) return '#000000'; else return '#FFFFFF';
	};
	
	function isValidHexColor(color) {
		color = color.replace('#','');
		var isNotHex = (/[^#0-9a-f]/gi).test(color), is6Len = (color.length===6);
		return (!isNotHex && is6Len);
	};
	
	function updateDataCache(color) {
		color = color.replace('#', '');
		var idx = -1;
		for (var i=0; i<$.ui.colorpicker.defaults.dataCache.size; i++) {
			if ($.ui.colorpicker.defaults.dataCache.colors[i].color===color) {
				idx = i;
				break;
			}
		}
		if (idx!==-1) $.ui.colorpicker.defaults.dataCache.colors.splice(idx, 1);
		$.ui.colorpicker.defaults.dataCache.colors.unshift({
			color: color,
			src: 9,
			timex: Date()
		});
		$.ui.colorpicker.defaults.dataCache.size = $.ui.colorpicker.defaults.dataCache.colors.length;
	};
	
	function getCacheColor(idx){
		return (idx<$.ui.colorpicker.defaults.dataCache.size)? $.ui.colorpicker.defaults.dataCache.colors[idx].color : '';
	};
	
	function getSpecialColor(idx){
		return (idx<$.ui.colorpicker.defaults.specials.length)? $.ui.colorpicker.defaults.specials[idx] : '';
	};
	
	function exists(color){
		for(var i=0, l=$.ui.colorpicker.defaults.dataCache.colors.length; i<l; i++){
			if($.ui.colorpicker.defaults.dataCache.colors[i].color===color) return true;
		}
		return false;
	};
	
})(jQuery);

