/**
* 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