/** * JavaScript Color Picker * * @author Honza Odvarko, http://odvarko.cz * @copyright Honza Odvarko * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License * @version 1.0.8 * @link http://jscolor.com */ jscolor_register() // register jscolor_init() at page load function jscolor_register() { if(typeof window.onload == 'function') { var f = window.onload window.onload = function() { if(f)/* IE7 */ f() jscolor_init() } } else { window.onload = jscolor_init } } function jscolor_init() { // bind elements var bindClass = 'color' // set field's background according selected color? var reflectOnBackground = true // prepend field's color code with # var leadingHash = false // allow an empty value in the field instead of setting it to #000000 var allowEmpty = false // spectrum's width and height var HVSize = [ 180, 101 ] // normal //var HVSize = [ 120, 69 ] // small //var HVSize = [ 102, 61 ] // tiny var padding = 10 var borderWidth = 1 var HVCrossSize = [ 15, 15 ] var SSize = 22 var SArrowSize = [ 7, 11 ] var SSampleSize = 4 var ClientSliderSize = 18 var instanceId = 0 var instance var elements = {} var dir = function() { var base = location.href var e = document.getElementsByTagName('base') for(var i=0; iHVSize[0]-1 ? HVSize[0]-1 : p[0]-instance.posHV[0]) var relY = p[1]HVSize[1]-1 ? HVSize[1]-1 : p[1]-instance.posHV[1]) instance.color.setHSV(6/HVSize[0]*relX, null, 1-1/(HVSize[1]-1)*relY) updateDialogPointers() updateDialogSaturation() updateInput(instance.input, instance.color, null) } elements.hv.onmousedown = function(e) { instance.holdHV = true; setHV(e) } elements.dialog.appendChild(elements.hv) // saturation gradient elements.grad = document.createElement('div') setStyle(elements.grad, { 'position' : 'absolute', 'left' : HVSize[0]+SArrowSize[0]+2*padding+'px', 'top' : padding+'px', 'width' : SSize-SArrowSize[0]+'px' }) // saturation gradient's samples for(var i=0; i+SSampleSize<=HVSize[1]; i+=SSampleSize) { var g = document.createElement('div') g.style.height = SSampleSize+'px' g.style.fontSize = '1px' g.style.lineHeight = '0' elements.grad.appendChild(g) } elements.dialog.appendChild(elements.grad) // saturation slider elements.s = document.createElement('div') setStyle(elements.s, { 'position' : 'absolute', 'left' : HVSize[0]+2*padding+'px', 'top' : '0', 'width' : SSize+padding+'px', 'height' : HVSize[1]+2*padding+'px', 'background' : "url('"+dir+"s.gif') no-repeat" }) // IE 5 fix try { elements.s.style.cursor = 'pointer' } catch(eOldIE) { elements.s.style.cursor = 'hand' } var setS = function(e) { var p = getMousePos(e) var relY = p[1]HVSize[1]-1 ? HVSize[1]-1 : p[1]-instance.posS[1]) instance.color.setHSV(null, 1-1/(HVSize[1]-1)*relY, null) updateDialogPointers() updateInput(instance.input, instance.color, null) } elements.s.onmousedown = function(e) { instance.holdS = true; setS(e) } elements.dialog.appendChild(elements.s) } function showDialog(input) { var is = [ input.offsetWidth, input.offsetHeight ] var ip = getElementPos(input) var sp = getScrollPos() var ws = getWindowSize() var ds = [ HVSize[0]+SSize+3*padding+2*borderWidth, HVSize[1]+2*padding+2*borderWidth ] var dp = [ -sp[0]+ip[0]+ds[0] > ws[0]-ClientSliderSize ? (-sp[0]+ip[0]+is[0]/2 > ws[0]/2 ? ip[0]+is[0]-ds[0] : ip[0]) : ip[0], -sp[1]+ip[1]+is[1]+ds[1] > ws[1]-ClientSliderSize ? (-sp[1]+ip[1]+is[1]/2 > ws[1]/2 ? ip[1]-ds[1] : ip[1]+is[1]) : ip[1]+is[1] ] instanceId++ instance = { input : input, color : new color(input.value), preserve : false, holdHV : false, holdS : false, posHV : [ dp[0]+borderWidth+padding, dp[1]+borderWidth+padding ], posS : [ dp[0]+borderWidth+HVSize[0]+2*padding, dp[1]+borderWidth+padding ] } updateDialogPointers() updateDialogSaturation() elements.dialog.style.left = dp[0]+'px' elements.dialog.style.top = dp[1]+'px' document.getElementsByTagName('body')[0].appendChild(elements.dialog) } function hideDialog() { var b = document.getElementsByTagName('body')[0] b.removeChild(elements.dialog) instance = null } function updateDialogPointers() { // update hue/value cross var x = Math.round(instance.color.hue/6*HVSize[0]) var y = Math.round((1-instance.color.value)*(HVSize[1]-1)) elements.hv.style.backgroundPosition = (padding-Math.floor(HVCrossSize[0]/2)+x)+'px '+ (padding-Math.floor(HVCrossSize[1]/2)+y)+'px' // update saturation arrow var y = Math.round((1-instance.color.saturation)*HVSize[1]) elements.s.style.backgroundPosition = '0 '+(padding-Math.floor(SArrowSize[1]/2)+y)+'px' } function updateDialogSaturation() { // update saturation gradient var r, g, b, s, c = [ instance.color.value, 0, 0 ] var i = Math.floor(instance.color.hue) var f = i%2 ? instance.color.hue-i : 1-(instance.color.hue-i) switch(i) { case 6: case 0: r=0;g=1;b=2; break case 1: r=1;g=0;b=2; break case 2: r=2;g=0;b=1; break case 3: r=2;g=1;b=0; break case 4: r=1;g=2;b=0; break case 5: r=0;g=2;b=1; break } var gr = elements.grad.childNodes for(var i=0; i