| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484 | 
							- /**
 -  *
 -  * Color picker
 -  * Author: Stefan Petre www.eyecon.ro
 -  * 
 -  * Dual licensed under the MIT and GPL licenses
 -  * 
 -  */
 - (function ($) {
 - 	var ColorPicker = function () {
 - 		var
 - 			ids = {},
 - 			inAction,
 - 			charMin = 65,
 - 			visible,
 - 			tpl = '<div class="colorpicker"><div class="colorpicker_color"><div><div></div></div></div><div class="colorpicker_hue"><div></div></div><div class="colorpicker_new_color"></div><div class="colorpicker_current_color"></div><div class="colorpicker_hex"><input type="text" maxlength="6" size="6" /></div><div class="colorpicker_rgb_r colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_g colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_h colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_s colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_submit"></div></div>',
 - 			defaults = {
 - 				eventName: 'click',
 - 				onShow: function () {},
 - 				onBeforeShow: function(){},
 - 				onHide: function () {},
 - 				onChange: function () {},
 - 				onSubmit: function () {},
 - 				color: 'ff0000',
 - 				livePreview: true,
 - 				flat: false
 - 			},
 - 			fillRGBFields = function  (hsb, cal) {
 - 				var rgb = HSBToRGB(hsb);
 - 				$(cal).data('colorpicker').fields
 - 					.eq(1).val(rgb.r).end()
 - 					.eq(2).val(rgb.g).end()
 - 					.eq(3).val(rgb.b).end();
 - 			},
 - 			fillHSBFields = function  (hsb, cal) {
 - 				$(cal).data('colorpicker').fields
 - 					.eq(4).val(hsb.h).end()
 - 					.eq(5).val(hsb.s).end()
 - 					.eq(6).val(hsb.b).end();
 - 			},
 - 			fillHexFields = function (hsb, cal) {
 - 				$(cal).data('colorpicker').fields
 - 					.eq(0).val(HSBToHex(hsb)).end();
 - 			},
 - 			setSelector = function (hsb, cal) {
 - 				$(cal).data('colorpicker').selector.css('backgroundColor', '#' + HSBToHex({h: hsb.h, s: 100, b: 100}));
 - 				$(cal).data('colorpicker').selectorIndic.css({
 - 					left: parseInt(150 * hsb.s/100, 10),
 - 					top: parseInt(150 * (100-hsb.b)/100, 10)
 - 				});
 - 			},
 - 			setHue = function (hsb, cal) {
 - 				$(cal).data('colorpicker').hue.css('top', parseInt(150 - 150 * hsb.h/360, 10));
 - 			},
 - 			setCurrentColor = function (hsb, cal) {
 - 				$(cal).data('colorpicker').currentColor.css('backgroundColor', '#' + HSBToHex(hsb));
 - 			},
 - 			setNewColor = function (hsb, cal) {
 - 				$(cal).data('colorpicker').newColor.css('backgroundColor', '#' + HSBToHex(hsb));
 - 			},
 - 			keyDown = function (ev) {
 - 				var pressedKey = ev.charCode || ev.keyCode || -1;
 - 				if ((pressedKey > charMin && pressedKey <= 90) || pressedKey == 32) {
 - 					return false;
 - 				}
 - 				var cal = $(this).parent().parent();
 - 				if (cal.data('colorpicker').livePreview === true) {
 - 					change.apply(this);
 - 				}
 - 			},
 - 			change = function (ev) {
 - 				var cal = $(this).parent().parent(), col;
 - 				if (this.parentNode.className.indexOf('_hex') > 0) {
 - 					cal.data('colorpicker').color = col = HexToHSB(fixHex(this.value));
 - 				} else if (this.parentNode.className.indexOf('_hsb') > 0) {
 - 					cal.data('colorpicker').color = col = fixHSB({
 - 						h: parseInt(cal.data('colorpicker').fields.eq(4).val(), 10),
 - 						s: parseInt(cal.data('colorpicker').fields.eq(5).val(), 10),
 - 						b: parseInt(cal.data('colorpicker').fields.eq(6).val(), 10)
 - 					});
 - 				} else {
 - 					cal.data('colorpicker').color = col = RGBToHSB(fixRGB({
 - 						r: parseInt(cal.data('colorpicker').fields.eq(1).val(), 10),
 - 						g: parseInt(cal.data('colorpicker').fields.eq(2).val(), 10),
 - 						b: parseInt(cal.data('colorpicker').fields.eq(3).val(), 10)
 - 					}));
 - 				}
 - 				if (ev) {
 - 					fillRGBFields(col, cal.get(0));
 - 					fillHexFields(col, cal.get(0));
 - 					fillHSBFields(col, cal.get(0));
 - 				}
 - 				setSelector(col, cal.get(0));
 - 				setHue(col, cal.get(0));
 - 				setNewColor(col, cal.get(0));
 - 				cal.data('colorpicker').onChange.apply(cal, [col, HSBToHex(col), HSBToRGB(col)]);
 - 			},
 - 			blur = function (ev) {
 - 				var cal = $(this).parent().parent();
 - 				cal.data('colorpicker').fields.parent().removeClass('colorpicker_focus');
 - 			},
 - 			focus = function () {
 - 				charMin = this.parentNode.className.indexOf('_hex') > 0 ? 70 : 65;
 - 				$(this).parent().parent().data('colorpicker').fields.parent().removeClass('colorpicker_focus');
 - 				$(this).parent().addClass('colorpicker_focus');
 - 			},
 - 			downIncrement = function (ev) {
 - 				var field = $(this).parent().find('input').focus();
 - 				var current = {
 - 					el: $(this).parent().addClass('colorpicker_slider'),
 - 					max: this.parentNode.className.indexOf('_hsb_h') > 0 ? 360 : (this.parentNode.className.indexOf('_hsb') > 0 ? 100 : 255),
 - 					y: ev.pageY,
 - 					field: field,
 - 					val: parseInt(field.val(), 10),
 - 					preview: $(this).parent().parent().data('colorpicker').livePreview					
 - 				};
 - 				$(document).bind('mouseup', current, upIncrement);
 - 				$(document).bind('mousemove', current, moveIncrement);
 - 			},
 - 			moveIncrement = function (ev) {
 - 				ev.data.field.val(Math.max(0, Math.min(ev.data.max, parseInt(ev.data.val + ev.pageY - ev.data.y, 10))));
 - 				if (ev.data.preview) {
 - 					change.apply(ev.data.field.get(0), [true]);
 - 				}
 - 				return false;
 - 			},
 - 			upIncrement = function (ev) {
 - 				change.apply(ev.data.field.get(0), [true]);
 - 				ev.data.el.removeClass('colorpicker_slider').find('input').focus();
 - 				$(document).unbind('mouseup', upIncrement);
 - 				$(document).unbind('mousemove', moveIncrement);
 - 				return false;
 - 			},
 - 			downHue = function (ev) {
 - 				var current = {
 - 					cal: $(this).parent(),
 - 					y: $(this).offset().top
 - 				};
 - 				current.preview = current.cal.data('colorpicker').livePreview;
 - 				$(document).bind('mouseup', current, upHue);
 - 				$(document).bind('mousemove', current, moveHue);
 - 			},
 - 			moveHue = function (ev) {
 - 				change.apply(
 - 					ev.data.cal.data('colorpicker')
 - 						.fields
 - 						.eq(4)
 - 						.val(parseInt(360*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.y))))/150, 10))
 - 						.get(0),
 - 					[ev.data.preview]
 - 				);
 - 				return false;
 - 			},
 - 			upHue = function (ev) {
 - 				fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
 - 				fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
 - 				$(document).unbind('mouseup', upHue);
 - 				$(document).unbind('mousemove', moveHue);
 - 				return false;
 - 			},
 - 			downSelector = function (ev) {
 - 				var current = {
 - 					cal: $(this).parent(),
 - 					pos: $(this).offset()
 - 				};
 - 				current.preview = current.cal.data('colorpicker').livePreview;
 - 				$(document).bind('mouseup', current, upSelector);
 - 				$(document).bind('mousemove', current, moveSelector);
 - 			},
 - 			moveSelector = function (ev) {
 - 				change.apply(
 - 					ev.data.cal.data('colorpicker')
 - 						.fields
 - 						.eq(6)
 - 						.val(parseInt(100*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.pos.top))))/150, 10))
 - 						.end()
 - 						.eq(5)
 - 						.val(parseInt(100*(Math.max(0,Math.min(150,(ev.pageX - ev.data.pos.left))))/150, 10))
 - 						.get(0),
 - 					[ev.data.preview]
 - 				);
 - 				return false;
 - 			},
 - 			upSelector = function (ev) {
 - 				fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
 - 				fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
 - 				$(document).unbind('mouseup', upSelector);
 - 				$(document).unbind('mousemove', moveSelector);
 - 				return false;
 - 			},
 - 			enterSubmit = function (ev) {
 - 				$(this).addClass('colorpicker_focus');
 - 			},
 - 			leaveSubmit = function (ev) {
 - 				$(this).removeClass('colorpicker_focus');
 - 			},
 - 			clickSubmit = function (ev) {
 - 				var cal = $(this).parent();
 - 				var col = cal.data('colorpicker').color;
 - 				cal.data('colorpicker').origColor = col;
 - 				setCurrentColor(col, cal.get(0));
 - 				cal.data('colorpicker').onSubmit(col, HSBToHex(col), HSBToRGB(col), cal.data('colorpicker').el);
 - 			},
 - 			show = function (ev) {
 - 				var cal = $('#' + $(this).data('colorpickerId'));
 - 				cal.data('colorpicker').onBeforeShow.apply(this, [cal.get(0)]);
 - 				var pos = $(this).offset();
 - 				var viewPort = getViewport();
 - 				var top = pos.top + this.offsetHeight;
 - 				var left = pos.left;
 - 				if (top + 176 > viewPort.t + viewPort.h) {
 - 					top -= this.offsetHeight + 176;
 - 				}
 - 				if (left + 356 > viewPort.l + viewPort.w) {
 - 					left -= 356;
 - 				}
 - 				cal.css({left: left + 'px', top: top + 'px'});
 - 				if (cal.data('colorpicker').onShow.apply(this, [cal.get(0)]) != false) {
 - 					cal.show();
 - 				}
 - 				$(document).bind('mousedown', {cal: cal}, hide);
 - 				return false;
 - 			},
 - 			hide = function (ev) {
 - 				if (!isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) {
 - 					if (ev.data.cal.data('colorpicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) {
 - 						ev.data.cal.hide();
 - 					}
 - 					$(document).unbind('mousedown', hide);
 - 				}
 - 			},
 - 			isChildOf = function(parentEl, el, container) {
 - 				if (parentEl == el) {
 - 					return true;
 - 				}
 - 				if (parentEl.contains) {
 - 					return parentEl.contains(el);
 - 				}
 - 				if ( parentEl.compareDocumentPosition ) {
 - 					return !!(parentEl.compareDocumentPosition(el) & 16);
 - 				}
 - 				var prEl = el.parentNode;
 - 				while(prEl && prEl != container) {
 - 					if (prEl == parentEl)
 - 						return true;
 - 					prEl = prEl.parentNode;
 - 				}
 - 				return false;
 - 			},
 - 			getViewport = function () {
 - 				var m = document.compatMode == 'CSS1Compat';
 - 				return {
 - 					l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),
 - 					t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop),
 - 					w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth),
 - 					h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight)
 - 				};
 - 			},
 - 			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))
 - 				};
 - 			},
 - 			fixHex = function (hex) {
 - 				var len = 6 - hex.length;
 - 				if (len > 0) {
 - 					var o = [];
 - 					for (var i=0; i<len; i++) {
 - 						o.push('0');
 - 					}
 - 					o.push(hex);
 - 					hex = o.join('');
 - 				}
 - 				return hex;
 - 			}, 
 - 			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 RGBToHSB(HexToRGB(hex));
 - 			},
 - 			RGBToHSB = function (rgb) {
 - 				var hsb = {
 - 					h: 0,
 - 					s: 0,
 - 					b: 0
 - 				};
 - 				var min = Math.min(rgb.r, rgb.g, rgb.b);
 - 				var max = Math.max(rgb.r, rgb.g, rgb.b);
 - 				var delta = max - min;
 - 				hsb.b = max;
 - 				if (max != 0) {
 - 					
 - 				}
 - 				hsb.s = max != 0 ? 255 * delta / max : 0;
 - 				if (hsb.s != 0) {
 - 					if (rgb.r == max) {
 - 						hsb.h = (rgb.g - rgb.b) / delta;
 - 					} else if (rgb.g == max) {
 - 						hsb.h = 2 + (rgb.b - rgb.r) / delta;
 - 					} else {
 - 						hsb.h = 4 + (rgb.r - rgb.g) / delta;
 - 					}
 - 				} else {
 - 					hsb.h = -1;
 - 				}
 - 				hsb.h *= 60;
 - 				if (hsb.h < 0) {
 - 					hsb.h += 360;
 - 				}
 - 				hsb.s *= 100/255;
 - 				hsb.b *= 100/255;
 - 				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('');
 - 			},
 - 			HSBToHex = function (hsb) {
 - 				return RGBToHex(HSBToRGB(hsb));
 - 			},
 - 			restoreOriginal = function () {
 - 				var cal = $(this).parent();
 - 				var col = cal.data('colorpicker').origColor;
 - 				cal.data('colorpicker').color = col;
 - 				fillRGBFields(col, cal.get(0));
 - 				fillHexFields(col, cal.get(0));
 - 				fillHSBFields(col, cal.get(0));
 - 				setSelector(col, cal.get(0));
 - 				setHue(col, cal.get(0));
 - 				setNewColor(col, cal.get(0));
 - 			};
 - 		return {
 - 			init: function (opt) {
 - 				opt = $.extend({}, defaults, opt||{});
 - 				if (typeof opt.color == 'string') {
 - 					opt.color = HexToHSB(opt.color);
 - 				} else if (opt.color.r != undefined && opt.color.g != undefined && opt.color.b != undefined) {
 - 					opt.color = RGBToHSB(opt.color);
 - 				} else if (opt.color.h != undefined && opt.color.s != undefined && opt.color.b != undefined) {
 - 					opt.color = fixHSB(opt.color);
 - 				} else {
 - 					return this;
 - 				}
 - 				return this.each(function () {
 - 					if (!$(this).data('colorpickerId')) {
 - 						var options = $.extend({}, opt);
 - 						options.origColor = opt.color;
 - 						var id = 'collorpicker_' + parseInt(Math.random() * 1000);
 - 						$(this).data('colorpickerId', id);
 - 						var cal = $(tpl).attr('id', id);
 - 						if (options.flat) {
 - 							cal.appendTo(this).show();
 - 						} else {
 - 							cal.appendTo(document.body);
 - 						}
 - 						options.fields = cal
 - 											.find('input')
 - 												.bind('keyup', keyDown)
 - 												.bind('change', change)
 - 												.bind('blur', blur)
 - 												.bind('focus', focus);
 - 						cal
 - 							.find('span').bind('mousedown', downIncrement).end()
 - 							.find('>div.colorpicker_current_color').bind('click', restoreOriginal);
 - 						options.selector = cal.find('div.colorpicker_color').bind('mousedown', downSelector);
 - 						options.selectorIndic = options.selector.find('div div');
 - 						options.el = this;
 - 						options.hue = cal.find('div.colorpicker_hue div');
 - 						cal.find('div.colorpicker_hue').bind('mousedown', downHue);
 - 						options.newColor = cal.find('div.colorpicker_new_color');
 - 						options.currentColor = cal.find('div.colorpicker_current_color');
 - 						cal.data('colorpicker', options);
 - 						cal.find('div.colorpicker_submit')
 - 							.bind('mouseenter', enterSubmit)
 - 							.bind('mouseleave', leaveSubmit)
 - 							.bind('click', clickSubmit);
 - 						fillRGBFields(options.color, cal.get(0));
 - 						fillHSBFields(options.color, cal.get(0));
 - 						fillHexFields(options.color, cal.get(0));
 - 						setHue(options.color, cal.get(0));
 - 						setSelector(options.color, cal.get(0));
 - 						setCurrentColor(options.color, cal.get(0));
 - 						setNewColor(options.color, cal.get(0));
 - 						if (options.flat) {
 - 							cal.css({
 - 								position: 'relative',
 - 								display: 'block'
 - 							});
 - 						} else {
 - 							$(this).bind(options.eventName, show);
 - 						}
 - 					}
 - 				});
 - 			},
 - 			showPicker: function() {
 - 				return this.each( function () {
 - 					if ($(this).data('colorpickerId')) {
 - 						show.apply(this);
 - 					}
 - 				});
 - 			},
 - 			hidePicker: function() {
 - 				return this.each( function () {
 - 					if ($(this).data('colorpickerId')) {
 - 						$('#' + $(this).data('colorpickerId')).hide();
 - 					}
 - 				});
 - 			},
 - 			setColor: function(col) {
 - 				if (typeof col == 'string') {
 - 					col = HexToHSB(col);
 - 				} else if (col.r != undefined && col.g != undefined && col.b != undefined) {
 - 					col = RGBToHSB(col);
 - 				} else if (col.h != undefined && col.s != undefined && col.b != undefined) {
 - 					col = fixHSB(col);
 - 				} else {
 - 					return this;
 - 				}
 - 				return this.each(function(){
 - 					if ($(this).data('colorpickerId')) {
 - 						var cal = $('#' + $(this).data('colorpickerId'));
 - 						cal.data('colorpicker').color = col;
 - 						cal.data('colorpicker').origColor = col;
 - 						fillRGBFields(col, cal.get(0));
 - 						fillHSBFields(col, cal.get(0));
 - 						fillHexFields(col, cal.get(0));
 - 						setHue(col, cal.get(0));
 - 						setSelector(col, cal.get(0));
 - 						setCurrentColor(col, cal.get(0));
 - 						setNewColor(col, cal.get(0));
 - 					}
 - 				});
 - 			}
 - 		};
 - 	}();
 - 	$.fn.extend({
 - 		ColorPicker: ColorPicker.init,
 - 		ColorPickerHide: ColorPicker.hidePicker,
 - 		ColorPickerShow: ColorPicker.showPicker,
 - 		ColorPickerSetColor: ColorPicker.setColor
 - 	});
 - })(jQuery)
 
 
  |