PageSourceSearch

http://www.karizmatic.fr/wp-content/plugins/facebook-activity-feed…/jscolor/jscolor.js?ver=2.9.2

js karizmatic.fr collected 2026-10-04 03:34:31 UTC 24,261 bytes, 860 lines download raw bytes

1/**
2 * jscolor, JavaScript Color Picker
3 *
4 * @version 1.3.1
5 * @license GNU Lesser General Public License, http://www.gnu.org/copyleft/lesser.html
6 * @author  Jan Odvarko, http://odvarko.cz
7 * @created 2008-06-15
8 * @updated 2010-01-23
9 * @link    http://jscolor.com
10 * @used by facebook-activity-feed-widget-for-wordpress v0.2+
11 */
12
13var jscolor = {
14
15	dir : '', // location of jscolor directory (leave empty to autodetect)
16	bindClass : 'fbact_color_picker', // class name
17	binding : true, // automatic binding via <input class="...">
18	preloading : true, // use image preloading?
19
20	install : function() {
21		jscolor.addEvent(window, 'load', jscolor.init);
22	},
23
24	init : function() {
25		if(jscolor.binding) {
26			jscolor.bind();
27		}
28		if(jscolor.preloading) {
29			jscolor.preload();
30		}
31	},
32
33
34	getDir : function() {
35		if(!jscolor.dir) {
36			var detected = jscolor.detectDir();
37			jscolor.dir = detected!==false ? detected : 'jscolor/';
38		}
39		return jscolor.dir;
40	},
41
42
43	detectDir : function() {
44		var base = location.href;
45
46		var e = document.getElementsByTagName('base');
47		for(var i=0; i<e.length; i+=1) {
48			if(e[i].href) { base = e[i].href; }
49		}
50
51		var e = document.getElementsByTagName('script');
52		for(var i=0; i<e.length; i+=1) {
53			if(e[i].src && /(^|\/)jscolor\.js([?#].*)?$/i.test(e[i].src)) {
54				var src = new jscolor.URI(e[i].src);
55				var srcAbs = src.toAbsolute(base);
56				srcAbs.path = srcAbs.path.replace(/[^\/]+$/, ''); // remove filename
57				srcAbs.query = null;
58				srcAbs.fragment = null;
59				return srcAbs.toString();
60			}
61		}
62		return false;
63	},
64
65
66	bind : function() {
67		var matchClass = new RegExp('(^|\\s)('+jscolor.bindClass+')\\s*(\\{[^}]*\\})?', 'i');
68		var e = document.getElementsByTagName('input');
69		for(var i=0; i<e.length; i+=1) {
70			var m;
71			if(!e[i].color && e[i].className && (m = e[i].className.match(matchClass))) {
72				var prop = {};
73				if(m[3]) {
74					try {
75						eval('prop='+m[3]);
76					} catch(eInvalidProp) {}
77				}
78				e[i].color = new jscolor.color(e[i], prop);
79			}
80		}
81	},
82
83
84	preload : function() {
85		for(var fn in jscolor.imgRequire) {
86			if(jscolor.imgRequire.hasOwnProperty(fn)) {
87				jscolor.loadImage(fn);
88			}
89		}
90	},
91
92
93	images : {
94		pad : [ 181, 101 ],
95		sld : [ 16, 101 ],
96		cross : [ 15, 15 ],
97		arrow : [ 7, 11 ]
98	},
99
100
101	imgRequire : {},
102	imgLoaded : {},
103
104
105	requireImage : function(filename) {
106		jscolor.imgRequire[filename] = true;
107	},
108
109
110	loadImage : function(filename) {
111		if(!jscolor.imgLoaded[filename]) {
112			jscolor.imgLoaded[filename] = new Image();
113			jscolor.imgLoaded[filename].src = jscolor.getDir()+filename;
114		}
115	},
116
117
118	fetchElement : function(mixed) {
119		return typeof mixed === 'string' ? document.getElementById(mixed) : mixed;
120	},
121
122
123	addEvent : function(el, evnt, func) {
124		if(el.addEventListener) {
125			el.addEventListener(evnt, func, false);
126		} else if(el.attachEvent) {
127			el.attachEvent('on'+evnt, func);
128		}
129	},
130
131
132	fireEvent : function(el, evnt) {
133		if(!el) {
134			return;
135		}
136		if(document.createEventObject) {
137			var ev = document.createEventObject();
138			el.fireEvent('on'+evnt, ev);
139		} else if(document.createEvent) {
140			var ev = document.createEvent('HTMLEvents');
141			ev.initEvent(evnt, true, true);
142			el.dispatchEvent(ev);
143		} else if(el['on'+evnt]) { // alternatively use the traditional event model (IE5)
144			el['on'+evnt]();
145		}
146	},
147
148
149	getElementPos : function(e) {
150		var e1=e, e2=e;
151		var x=0, y=0;
152		if(e1.offsetParent) {
153			do {
154				x += e1.offsetLeft;
155				y += e1.offsetTop;
156			} while(e1 = e1.offsetParent);
157		}
158		while((e2 = e2.parentNode) && e2.nodeName.toUpperCase() !== 'BODY') {
159			x -= e2.scrollLeft;
160			y -= e2.scrollTop;
161		}
162		return [x, y];
163	},
164
165
166	getElementSize : function(e) {
167		return [e.offsetWidth, e.offsetHeight];
168	},
169
170
171	getMousePos : function(e) {
172		if(!e) { e = window.event; }
173		if(typeof e.pageX === 'number') {
174			return [e.pageX, e.pageY];
175		} else if(typeof e.clientX === 'number') {
176			return [
177				e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft,
178				e.clientY + document.body.scrollTop + document.documentElement.scrollTop
179			];
180		}
181	},
182
183
184	getViewPos : function() {
185		if(typeof window.pageYOffset === 'number') {
186			return [window.pageXOffset, window.pageYOffset];
187		} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {
188			return [document.body.scrollLeft, document.body.scrollTop];
189		} else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
190			return [document.documentElement.scrollLeft, document.documentElement.scrollTop];
191		} else {
192			return [0, 0];
193		}
194	},
195
196
197	getViewSize : function() {
198		if(typeof window.innerWidth === 'number') {
199			return [window.innerWidth, window.innerHeight];
200		} else if(document.body && (document.body.clientWidth || document.body.clientHeight)) {
201			return [document.body.clientWidth, document.body.clientHeight];
202		} else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
203			return [document.documentElement.clientWidth, document.documentElement.clientHeight];
204		} else {
205			return [0, 0];
206		}
207	},
208
209
210	URI : function(uri) { // See RFC3986
211
212		this.scheme = null;
213		this.authority = null;
214		this.path = '';
215		this.query = null;
216		this.fragment = null;
217
218		this.parse = function(uri) {
219			var m = uri.match(/^(([A-Za-z][0-9A-Za-z+.-]*)(:))?((\/\/)([^\/?#]*))?([^?#]*)((\?)([^#]*))?((#)(.*))?/);
220			this.scheme = m[3] ? m[2] : null;
221			this.authority = m[5] ? m[6] : null;
222			this.path = m[7];
223			this.query = m[9] ? m[10] : null;
224			this.fragment = m[12] ? m[13] : null;
225			return this;
226		};
227
228		this.toString = function() {
229			var result = '';
230			if(this.scheme !== null) { result = result + this.scheme + ':'; }
231			if(this.authority !== null) { result = result + '//' + this.authority; }
232			if(this.path !== null) { result = result + this.path; }
233			if(this.query !== null) { result = result + '?' + this.query; }
234			if(this.fragment !== null) { result = result + '#' + this.fragment; }
235			return result;
236		};
237
238		this.toAbsolute = function(base) {
239			var base = new jscolor.URI(base);
240			var r = this;
241			var t = new jscolor.URI;
242
243			if(base.scheme === null) { return false; }
244
245			if(r.scheme !== null && r.scheme.toLowerCase() === base.scheme.toLowerCase()) {
246				r.scheme = null;
247			}
248
249			if(r.scheme !== null) {
250				t.scheme = r.scheme;
251				t.authority = r.authority;
252				t.path = removeDotSegments(r.path);
253				t.query = r.query;
254			} else {
255				if(r.authority !== null) {
256					t.authority = r.authority;
257					t.path = removeDotSegments(r.path);
258					t.query = r.query;
259				} else {
260					if(r.path === '') { // TODO: == or === ?
261						t.path = base.path;
262						if(r.query !== null) {
263							t.query = r.query;
264						} else {
265							t.query = base.query;
266						}
267					} else {
268						if(r.path.substr(0,1) === '/') {
269							t.path = removeDotSegments(r.path);
270						} else {
271							if(base.authority !== null && base.path === '') { // TODO: == or === ?
272								t.path = '/'+r.path;
273							} else {
274								t.path = base.path.replace(/[^\/]+$/,'')+r.path;
275							}
276							t.path = removeDotSegments(t.path);
277						}
278						t.query = r.query;
279					}
280					t.authority = base.authority;
281				}
282				t.scheme = base.scheme;
283			}
284			t.fragment = r.fragment;
285
286			return t;
287		};
288
289		function removeDotSegments(path) {
290			var out = '';
291			while(path) {
292				if(path.substr(0,3)==='../' || path.substr(0,2)==='./') {
293					path = path.replace(/^\.+/,'').substr(1);
294				} else if(path.substr(0,3)==='/./' || path==='/.') {
295					path = '/'+path.substr(3);
296				} else if(path.substr(0,4)==='/../' || path==='/..') {
297					path = '/'+path.substr(4);
298					out = out.replace(/\/?[^\/]*$/, '');
299				} else if(path==='.' || path==='..') {
300					path = '';
301				} else {
302					var rm = path.match(/^\/?[^\/]*/)[0];
303					path = path.substr(rm.length);
304					out = out + rm;
305				}
306			}
307			return out;
308		}
309
310		if(uri) {
311			this.parse(uri);
312		}
313
314	},
315
316
317	/*
318	 * Usage example:
319	 * var myColor = new jscolor.color(myInputElement)
320	 */
321
322	color : function(target, prop) {
323
324
325		this.required = true; // refuse empty values?
326		this.adjust = true; // adjust value to uniform notation?
327		this.hash = false; // prefix color with # symbol?
328		this.caps = true; // uppercase?
329		this.valueElement = target; // value holder
330		this.styleElement = target; // where to reflect current color
331		this.hsv = [0, 0, 1]; // read-only  0-6, 0-1, 0-1
332		this.rgb = [1, 1, 1]; // read-only  0-1, 0-1, 0-1
333
334		this.pickerOnfocus = true; // display picker on focus?
335		this.pickerMode = 'HSV'; // HSV | HVS
336		this.pickerPosition = 'bottom'; // left | right | top | bottom
337		this.pickerFace = 10; // px
338		this.pickerFaceColor = 'ThreeDFace'; // CSS color
339		this.pickerBorder = 1; // px
340		this.pickerBorderColor = 'ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight'; // CSS color
341		this.pickerInset = 1; // px
342		this.pickerInsetColor = 'ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow'; // CSS color
343		this.pickerZIndex = 10000;
344
345
346		for(var p in prop) {
347			if(prop.hasOwnProperty(p)) {
348				this[p] = prop[p];
349			}
350		}
351
352
353		this.hidePicker = function() {
354			if(isPickerOwner()) {
355				removePicker();
356			}
357		};
358
359
360		this.showPicker = function() {
361			if(!isPickerOwner()) {
362				var tp = jscolor.getElementPos(target); // target pos
363				var ts = jscolor.getElementSize(target); // target size
364				var vp = jscolor.getViewPos(); // view pos
365				var vs = jscolor.getViewSize(); // view size
366				var ps = [ // picker size
367					2*this.pickerBorder + 4*this.pickerInset + 2*this.pickerFace + jscolor.images.pad[0] + 2*jscolor.images.arrow[0] + jscolor.images.sld[0],
368					2*this.pickerBorder + 2*this.pickerInset + 2*this.pickerFace + jscolor.images.pad[1]
369				];
370				var a, b, c;
371				switch(this.pickerPosition.toLowerCase()) {
372					case 'left': a=1; b=0; c=-1; break;
373					case 'right':a=1; b=0; c=1; break;
374					case 'top':  a=0; b=1; c=-1; break;
375					default:     a=0; b=1; c=1; break;
376				}
377				var l = (ts[b]+ps[b])/2;
378				var pp = [ // picker pos
379					-vp[a]+tp[a]+ps[a] > vs[a] ?
380						(-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >
380= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) :
381						tp[a],
382					-vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ?
383						(-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) :
384						(tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c)
385				];
386				drawPicker(pp[a], pp[b]);
387			}
388		};
389
390
391		this.importColor = function() {
392			if(!valueElement) {
393				this.exportColor();
394			} else {
395				if(!this.adjust) {
396					if(!this.fromString(valueElement.value, leaveValue)) {
397						styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;
398						styleElement.style.color = styleElement.jscStyle.color;
399						this.exportColor(leaveValue | leaveStyle);
400					}
401				} else if(!this.required && /^\s*$/.test(valueElement.value)) {
402					valueElement.value = '';
403					styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;
404					styleElement.style.color = styleElement.jscStyle.color;
405					this.exportColor(leaveValue | leaveStyle);
406
407				} else if(this.fromString(valueElement.value)) {
408					// OK
409				} else {
410					this.exportColor();
411				}
412			}
413		};
414
415
416		this.exportColor = function(flags) {
417			if(!(flags & leaveValue) && valueElement) {
418				var value = this.toString();
419				if(this.caps) { value = value.toUpperCase(); }
420				if(this.hash) { value = '#'+value; }
421				valueElement.value = value;
422			}
423			if(!(flags & leaveStyle) && styleElement) {
424				styleElement.style.backgroundColor =
425					'#'+this.toString();
426				styleElement.style.color =
427					0.213 * this.rgb[0] +
428					0.715 * this.rgb[1] +
429					0.072 * this.rgb[2]
430					< 0.5 ? '#FFF' : '#000';
431			}
432			if(!(flags & leavePad) && isPickerOwner()) {
433				redrawPad();
434			}
435			if(!(flags & leaveSld) && isPickerOwner()) {
436				redrawSld();
437			}
438		};
439
440
441		this.fromHSV = function(h, s, v, flags) { // null = don't change
442			h<0 && (h=0) || h>6 && (h=6);
443			s<0 && (s=0) || s>1 && (s=1);
444			v<0 && (v=0) || v>1 && (v=1);
445			this.rgb = HSV_RGB(
446				h===null ? this.hsv[0] : (this.hsv[0]=h),
447				s===null ? this.hsv[1] : (this.hsv[1]=s),
448				v===null ? this.hsv[2] : (this.hsv[2]=v)
449			);
450			this.exportColor(flags);
451		};
452
453
454		this.fromRGB = function(r, g, b, flags) { // null = don't change
455			r<0 && (r=0) || r>1 && (r=1);
456			g<0 && (g=0) || g>1 && (g=1);
457			b<0 && (b=0) || b>1 && (b=1);
458			var hsv = RGB_HSV(
459				r===null ? this.rgb[0] : (this.rgb[0]=r),
460				g===null ? this.rgb[1] : (this.rgb[1]=g),
461				b===null ? this.rgb[2] : (this.rgb[2]=b)
462			);
463			if(hsv[0] !== null) {
464				this.hsv[0] = hsv[0];
465			}
466			if(hsv[2] !== 0) {
467				this.hsv[1] = hsv[1];
468			}
469			this.hsv[2] = hsv[2];
470			this.exportColor(flags);
471		};
472
473
474		this.fromString = function(hex, flags) {
475			var m = hex.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i);
476			if(!m) {
477				return false;
478			} else {
479				if(m[1].length === 6) { // 6-char notation
480					this.fromRGB(
481						parseInt(m[1].substr(0,2),16) / 255,
482						parseInt(m[1].substr(2,2),16) / 255,
483						parseInt(m[1].substr(4,2),16) / 255,
484						flags
485					);
486				} else { // 3-char notation
487					this.fromRGB(
488						parseInt(m[1].charAt(0)+m[1].charAt(0),16) / 255,
489						parseInt(m[1].charAt(1)+m[1].charAt(1),16) / 255,
490						parseInt(m[1].charAt(2)+m[1].charAt(2),16) / 255,
491						flags
492					);
493				}
494				return true;
495			}
496		};
497
498
499		this.toString = function() {
500			return (
501				(0x100 | Math.round(255*this.rgb[0])).toString(16).substr(1) +
502				(0x100 | Math.round(255*this.rgb[1])).toString(16).substr(1) +
503				(0x100 | Math.round(255*this.rgb[2])).toString(16).substr(1)
504			);
505		};
506
507
508		function RGB_HSV(r, g, b) {
509			var n = Math.min(Math.min(r,g),b);
510			var v = Math.max(Math.max(r,g),b);
511			var m = v - n;
512			if(m === 0) { return [ null, 0, v ]; }
513			var h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m);
514			return [ h===6?0:h, m/v, v ];
515		}
516
517
518		function HSV_RGB(h, s, v) {
519			if(h === null) { return [ v, v, v ]; }
520			var i = Math.floor(h);
521			var f = i%2 ? h-i : 1-(h-i);
522			var m = v * (1 - s);
523			var n = v * (1 - s*f);
524			switch(i) {
525				case 6:
526				case 0: return [v,n,m];
527				case 1: return [n,v,m];
528				case 2: return [m,v,n];
529				case 3: return [m,n,v];
530				case 4: return [n,m,v];
531				case 5: return [v,m,n];
532			}
533		}
534
535
536		function removePicker() {
537			delete jscolor.picker.owner;
538			document.getElementsByTagName('body')[0].removeChild(jscolor.picker.boxB);
539		}
540
541
542		function drawPicker(x, y) {
543			if(!jscolor.picker) {
544				jscolor.picker = {
545					box : document.createElement('div'),
546					boxB : document.createElement('div'),
547					pad : document.createElement('div'),
548					padB : document.createElement('div'),
549					padM : document.createElement('div'),
550					sld : document.createElement('div'),
551					sldB : document.createElement('div'),
552					sldM : document.createElement('div')
553				};
554				for(var i=0,segSize=4; i<jscolor.images.sld[1]; i+=segSize) {
555					var seg = document.createElement('div');
556					seg.style.height = segSize+'px';
557					seg.style.fontSize = '1px';
558					seg.style.lineHeight = '0';
559					jscolor.picker.sld.appendChild(seg);
560				}
561				jscolor.picker.sldB.appendChild(jscolor.picker.sld);
562				jscolor.picker.box.appendChild(jscolor.picker.sldB);
563				jscolor.picker.box.appendChild(jscolor.picker.sldM);
564				jscolor.picker.padB.appendChild(jscolor.picker.pad);
565				jscolor.picker.box.appendChild(jscolor.picker.padB);
566				jscolor.picker.box.appendChild(jscolor.picker.padM);
567				jscolor.picker.boxB.appendChild(jscolor.picker.box);
568			}
569
570			var p = jscolor.picker;
571
572			// recompute controls positions
573			posPad = [
574				x+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset,
575				y+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset ];
576			posSld = [
577				null,
578				y+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset ];
579
580			// controls interaction
581			p.box.onmouseup =
582			p.box.onmouseout = function() { target.focus(); };
583			p.box.onmousedown = function() { abortBlur=true; };
584			p.box.onmousemove = function(e) { holdPad && setPad(e); holdSld && setSld(e); };
585			p.padM.onmouseup =
586			p.padM.onmouseout = function() { if(holdPad) { holdPad=false; jscolor.fireEvent(valueElement,'change'); } };
587			p.padM.onmousedown = function(e) { holdPad=true; setPad(e); };
588			p.sldM.onmouseup =
589			p.sldM.onmouseout = function() { if(holdSld) { holdSld=false; jscolor.fireEvent(valueElement,'change'); } };
590			p.sldM.onmousedown = function(e) { holdSld=true; setSld(e); };
591
592			// picker
593			p.box.style.width = 4*THIS.pickerInset + 2*THIS.pickerFace + jscolor.images.pad[0] + 2*jscolor.images.arrow[0] + jscolor.images.sld[0] + 'px';
594			p.box.style.height = 2*THIS.pickerInset + 2*THIS.pickerFace + jscolor.images.pad[1] + 'px';
595
596			// picker border
597			p.boxB.style.position = 'absolute';
598			p.boxB.style.clear = 'both';
599			p.boxB.style.left = x+'px';
600			p.boxB.style.top = y+'px';
601			p.boxB.style.zIndex = THIS.pickerZIndex;
602			p.boxB.style.border = THIS.pickerBorder+'px solid';
603			p.boxB.style.borderColor = THIS.pickerBorderColor;
604			p.boxB.style.background = THIS.pickerFaceColor;
605
606			// pad image
607			p.pad.style.width = jscolor.images.pad[0]+'px';
608			p.pad.style.height = jscolor.images.pad[1]+'px';
609
610			// pad border
611			p.padB.style.position = 'absolute';
612			p.padB.style.left = THIS.pickerFace+'px';
613			p.padB.style.top = THIS.pickerFace+'px';
614			p.padB.style.border = THIS.pickerInset+'px solid';
615			p.padB.style.borderColor = THIS.pickerInsetColor;
616
617			// pad mouse area
618			p.padM.style.position = 'absolute';
619			p.padM.style.left = '0';
620			p.padM.style.top = '0';
621			p.padM.style.width = THIS.pickerFace + 2*THIS.pickerInset + jscolor.images.pad[0] + jscolor.images.arrow[0] + 'px';
622			p.padM.style.height = p.box.style.height;
623			p.padM.style.cursor = 'crosshair';
624
625			// slider image
626			p.sld.style.overflow = 'hidden';
627			p.sld.style.width = jscolor.images.sld[0]+'px';
628			p.sld.style.height = jscolor.images.sld[1]+'px';
629
630			// slider border
631			p.sldB.style.position = 'absolute';
632			p.sldB.style.right = THIS.pickerFace+'px';
633			p.sldB.style.top = THIS.pickerFace+'px';
634			p.sldB.style.border = THIS.pickerInset+'px solid';
635			p.sldB.style.borderColor = THIS.pickerInsetColor;
636
637			// slider mouse area
638			p.sldM.style.position = 'absolute';
639			p.sldM.style.right = '0';
640			p.sldM.style.top = '0';
641			p.sldM.style.width = jscolor.images.sld[0] + jscolor.images.arrow[0] + THIS.pickerFace + 2*THIS.pickerInset + 'px';
642			p.sldM.style.height = p.box.style.height;
643			try {
644				p.sldM.style.cursor = 'pointer';
645			} catch(eOldIE) {
646				p.sldM.style.cursor = 'hand';
647			}
648
649			// load images in optimal order
650			switch(modeID) {
651				case 0: var padImg = 'hs.png'; break;
652				case 1: var padImg = 'hv.png'; break;
653			}
654			p.padM.style.background = "url('"+jscolor.getDir()+"cross.gif') no-repeat";
655			p.sldM.style.background = "url('"+jscolor.getDir()+"arrow.gif') no-repeat";
656			p.pad.style.background = "url('"+jscolor.getDir()+padImg+"') 0 0 no-repeat";
657
658			// place pointers
659			redrawPad();
660			redrawSld();
661
662			jscolor.picker.owner = THIS;
663			document.getElementsByTagName('body')[0].appendChild(p.boxB);
664		}
665
666
667		function redrawPad() {
668			// redraw the pad pointer
669			switch(modeID) {
670				case 0: var yComponent = 1; break;
671				case 1: var yComponent = 2; break;
672			}
673			var x = Math.round((THIS.hsv[0]/6) * (jscolor.images.pad[0]-1));
674			var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.pad[1]-1));
675			jscolor.picker.padM.style.backgroundPosition =
676				(THIS.pickerFace+THIS.pickerInset+x - Math.floor(jscolor.images.cross[0]/2)) + 'px ' +
677				(THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.cross[1]/2)) + 'px';
678
679			// redraw the slider image
680			var seg = jscolor.picker.sld.childNodes;
681
682			switch(modeID) {
683				case 0:
684					var rgb = HSV_RGB(THIS.hsv[0], THIS.hsv[1], 1);
685					for(var i=0; i<seg.length; i+=1) {
686						seg[i].style.backgroundColor = 'rgb('+
687							(rgb[0]*(1-i/seg.length)*100)+'%,'+
688							(rgb[1]*(1-i/seg.length)*100)+'%,'+
689							(rgb[2]*(1-i/seg.length)*100)+'%)';
690					}
691					break;
692				case 1:
693					var rgb, s, c = [ THIS.hsv[2], 0, 0 ];
694					var i = Math.floor(THIS.hsv[0]);
695					var f = i%2 ? THIS.hsv[0]-i : 1-(THIS.hsv[0]-i);
696					switch(i) {
697						case 6:
698						case 0: rgb=[0,1,2]; break;
699						case 1: rgb=[1,0,2]; break;
700						case 2: rgb=[2,0,1]; break;
701						case 3: rgb=[2,1,0]; break;
702						case 4: rgb=[1,2,0]; break;
703						case 5: rgb=[0,2,1]; break;
704					}
705					for(var i=0; i<seg.length; i+=1) {
706						s = 1 - 1/(seg.length-1)*i;
707						c[1] = c[0] * (1 - s*f);
708						c[2] = c[0] * (1 - s);
709						seg[i].style.backgroundColor = 'rgb('+
710							(c[rgb[0]]*100)+'%,'+
711							(c[rgb[1]]*100)+'%,'+
712							(c[rgb[2]]*100)+'%)';
713					}
714					break;
715			}
716		}
717
718
719		function redrawSld() {
720			// redraw the slider pointer
721			switch(modeID) {
722				case 0: var yComponent = 2; break;
723				case 1: var yComponent = 1; break;
724			}
725			var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.sld[1]-1));
726			jscolor.picker.sldM.style.backgroundPosition =
727				'0 ' + (THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.arrow[1]/2)) + 'px';
728		}
729
730
731		function isPickerOwner() {
732			return jscolor.picker && jscolor.picker.owner === THIS;
733		}
734
735
736		function blurTarget() {
737			if(valueElement === target) {
738				THIS.importColor();
739			}
740			if(THIS.pickerOnfocus) {
741				THIS.hidePicker();
742			}
743		}
744
745
746		function blurValue() {
747			if(valueElement !== target) {
748				THIS.importColor();
749			}
750		}
751
752
753		function setPad(e) {
754			var posM = jscolor.getMousePos(e);
755			var x = posM[0]-posPad[0];
756			var y = posM[1]-posPad[1];
757			switch(modeID) {
758				case 0: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), 1 - y/(jscolor.images.pad[1]-1), null, leaveSld); break;
759				case 1: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), null, 1 - y/(jscolor.images.pad[1]-1), leaveSld); break;
760			}
761		}
762
763
764		function setSld(e) {
765			var posM = jscolor.getMousePos(e);
766			var y = posM[1]-posPad[1];
767			switch(modeID) {
768				case 0: THIS.fromHSV(null, null, 1 - y/(jscolor.images.sld[1]-1), leavePad); break;
769				case 1: THIS.fromHSV(null, 1 - y/(jscolor.images.sld[1]-1), null, leavePad); break;
770			}
771		}
772
773
774		var THIS = this;
775		var modeID = this.pickerMode.toLowerCase()==='hvs' ? 1 : 0;
776		var abortBlur = false;
777		var
778			valueElement = jscolor.fetchElement(this.valueElement),
779			styleElement = jscolor.fetchElement(this.styleElement);
780		var
781			holdPad = false,
782			holdSld = false;
783		var
784			posPad,
785			posSld;
786		var
787			leaveValue = 1<<0,
788			leaveStyle = 1<<1,
789			leavePad = 1<<2,
790			leaveSld = 1<<3;
791
792		// target
793		jscolor.addEvent(target, 'focus', function() {
794			if(THIS.pickerOnfocus) { THIS.showPicker(); }
795		});
796		jscolor.addEvent(target, 'blur', function() {
797			if(!abortBlur) {
798				window.setTimeout(function(){ abortBlur || blurTarget(); abortBlur=false; }, 0);
799			} else {
800				abortBlur = false;
801			}
802		});
803
804		// valueElement
805		if(valueElement) {
806			var updateField = function() {
807				THIS.fromString(valueElement.value, leaveValue);
808			};
809			jscolor.addEvent(valueElement, 'keyup', updateField);
810			jscolor.addEvent(valueElement, 'input', updateField);
811			jscolor.addEvent(valueElement, 'blur', blurValue);
812			valueElement.setAttribute('autocomplete', 'off');
813		}
814
815		// styleElement
816		if(styleElement) {
817			styleElement.jscStyle = {
818				backgroundColor : styleElement.style.backgroundColor,
819				color : styleElement.style.color
820			};
821		}
822
823		// require images
824		switch(modeID) {
825			case 0: jscolor.requireImage('hs.png'); break;
826			case 1: jscolor.requireImage('hv.png'); break;
827		}
828		jscolor.requireImage('cross.gif');
829		jscolor.requireImage('arrow.gif');
830
831		this.importColor();
832	}
833
834};
835jscolor.install();
836
837/* 
838 * do it manually
839 *
840 * for example:
841 * 		var myPicker = new jscolor.color(document.getElementById('<?php echo $this->get_field_id('bordercolor'); ?>'), {hash:true,required:false,pickerPosition:'top'})
842*/
843
844jQuery(document).ready(function() {
845
846	jscolor.init();
847	var colorPickerArray = [];
848
849	jQuery('input.fbact_color_picker').each(function(index) {
850
851		var oldID = document.getElementById(jQuery(this).attr('id'));
852		var myCol = jQuery(this).val();
853		colorPickerArray[index] = new  jscolor.color(oldID, {hash:true,required:false,pickerPosition:'top'});
854		colorPickerArray[index].fromString((myCol) ? myCol : "#CCCCCF");
855	});
856
857
858/* */
859});
860

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.