Вход Регистрация
Файл: js/jscolor.js
Строк: 1799
<?php
/**
 * jscolor - JavaScript Color Picker
 *
 * @link    http://jscolor.com
 * @license For open source use: GPLv3
 *          For commercial use: JSColor Commercial License
 * @author  Jan Odvarko
 * @version 2.0.4
 *
 * See usage examples at http://jscolor.com/examples/
 */


"use strict";


if (!
window.jscolor) { window.jscolor = (function () {


var 
jsc = {


    
register : function () {
        
jsc.attachDOMReadyEvent(jsc.init);
        
jsc.attachEvent(document'mousedown'jsc.onDocumentMouseDown);
        
jsc.attachEvent(document'touchstart'jsc.onDocumentTouchStart);
        
jsc.attachEvent(window'resize'jsc.onWindowResize);
    },


    
init : function () {
        if (
jsc.jscolor.lookupClass) {
            
jsc.jscolor.installByClassName(jsc.jscolor.lookupClass);
        }
    },


    
tryInstallOnElements : function (elmsclassName) {
        var 
matchClass = new RegExp('(^|\s)(' className ')(\s*(\{[^}]*\})|\s|$)''i');

        for (var 
0elms.length+= 1) {
            if (
elms[i].type !== undefined && elms[i].type.toLowerCase() == 'color') {
                if (
jsc.isColorAttrSupported) {
                    
// skip inputs of type 'color' if supported by the browser
                    
continue;
                }
            }
            var 
m;
            if (!
elms[i].jscolor && elms[i].className && (elms[i].className.match(matchClass))) {
                var 
targetElm elms[i];
                var 
optsStr null;

                var 
dataOptions jsc.getDataAttr(targetElm'jscolor');
                if (
dataOptions !== null) {
                    
optsStr dataOptions;
                } else if (
m[4]) {
                    
optsStr m[4];
                }

                var 
opts = {};
                if (
optsStr) {
                    try {
                        
opts = (new Function ('return (' optsStr ')'))();
                    } catch(
eParseError) {
                        
jsc.warn('Error parsing jscolor options: ' eParseError ':n' optsStr);
                    }
                }
                
targetElm.jscolor = new jsc.jscolor(targetElmopts);
            }
        }
    },


    
isColorAttrSupported : (function () {
        var 
elm document.createElement('input');
        if (
elm.setAttribute) {
            
elm.setAttribute('type''color');
            if (
elm.type.toLowerCase() == 'color') {
                return 
true;
            }
        }
        return 
false;
    })(),


    
isCanvasSupported : (function () {
        var 
elm document.createElement('canvas');
        return !!(
elm.getContext && elm.getContext('2d'));
    })(),


    
fetchElement : function (mixed) {
        return 
typeof mixed === 'string' document.getElementById(mixed) : mixed;
    },


    
isElementType : function (elmtype) {
        return 
elm.nodeName.toLowerCase() === type.toLowerCase();
    },


    
getDataAttr : function (elname) {
        var 
attrName 'data-' name;
        var 
attrValue el.getAttribute(attrName);
        if (
attrValue !== null) {
            return 
attrValue;
        }
        return 
null;
    },


    
attachEvent : function (elevntfunc) {
        if (
el.addEventListener) {
            
el.addEventListener(evntfuncfalse);
        } else if (
el.attachEvent) {
            
el.attachEvent('on' evntfunc);
        }
    },


    
detachEvent : function (elevntfunc) {
        if (
el.removeEventListener) {
            
el.removeEventListener(evntfuncfalse);
        } else if (
el.detachEvent) {
            
el.detachEvent('on' evntfunc);
        }
    },


    
_attachedGroupEvents : {},


    
attachGroupEvent : function (groupNameelevntfunc) {
        if (!
jsc._attachedGroupEvents.hasOwnProperty(groupName)) {
            
jsc._attachedGroupEvents[groupName] = [];
        }
        
jsc._attachedGroupEvents[groupName].push([elevntfunc]);
        
jsc.attachEvent(elevntfunc);
    },


    
detachGroupEvents : function (groupName) {
        if (
jsc._attachedGroupEvents.hasOwnProperty(groupName)) {
            for (var 
0jsc._attachedGroupEvents[groupName].length+= 1) {
                var 
evt jsc._attachedGroupEvents[groupName][i];
                
jsc.detachEvent(evt[0], evt[1], evt[2]);
            }
            
delete jsc._attachedGroupEvents[groupName];
        }
    },


    
attachDOMReadyEvent : function (func) {
        var 
fired false;
        var 
fireOnce = function () {
            if (!
fired) {
                
fired true;
                
func();
            }
        };

        if (
document.readyState === 'complete') {
            
setTimeout(fireOnce1); // async
            
return;
        }

        if (
document.addEventListener) {
            
document.addEventListener('DOMContentLoaded'fireOncefalse);

            
// Fallback
            
window.addEventListener('load'fireOncefalse);

        } else if (
document.attachEvent) {
            
// IE
            
document.attachEvent('onreadystatechange', function () {
                if (
document.readyState === 'complete') {
                    
document.detachEvent('onreadystatechange'arguments.callee);
                    
fireOnce();
                }
            })

            
// Fallback
            
window.attachEvent('onload'fireOnce);

            
// IE7/8
            
if (document.documentElement.doScroll && window == window.top) {
                var 
tryScroll = function () {
                    if (!
document.body) { return; }
                    try {
                        
document.documentElement.doScroll('left');
                        
fireOnce();
                    } catch (
e) {
                        
setTimeout(tryScroll1);
                    }
                };
                
tryScroll();
            }
        }
    },


    
warn : function (msg) {
        if (
window.console && window.console.warn) {
            
window.console.warn(msg);
        }
    },


    
preventDefault : function (e) {
        if (
e.preventDefault) { e.preventDefault(); }
        
e.returnValue false;
    },


    
captureTarget : function (target) {
        
// IE
        
if (target.setCapture) {
            
jsc._capturedTarget target;
            
jsc._capturedTarget.setCapture();
        }
    },


    
releaseTarget : function () {
        
// IE
        
if (jsc._capturedTarget) {
            
jsc._capturedTarget.releaseCapture();
            
jsc._capturedTarget null;
        }
    },


    
fireEvent : function (elevnt) {
        if (!
el) {
            return;
        }
        if (
document.createEvent) {
            var 
ev document.createEvent('HTMLEvents');
            
ev.initEvent(evnttruetrue);
            
el.dispatchEvent(ev);
        } else if (
document.createEventObject) {
            var 
ev document.createEventObject();
            
el.fireEvent('on' evntev);
        } else if (
el['on' evnt]) { // alternatively use the traditional event model
            
el['on' evnt]();
        }
    },


    
classNameToList : function (className) {
        return 
className.replace(/^s+|s+$/g'').split(/s+/);
    },


    
// The className parameter (str) can only contain a single class name
    
hasClass : function (elmclassName) {
        if (!
className) {
            return 
false;
        }
        return -
!= (' ' elm.className.replace(/s+/g' ') + ' ').indexOf(' ' className ' ');
    },


    
// The className parameter (str) can contain multiple class names separated by whitespace
    
setClass : function (elmclassName) {
        var 
classList jsc.classNameToList(className);
        for (var 
0classList.length+= 1) {
            if (!
jsc.hasClass(elmclassList[i])) {
                
elm.className += (elm.className ' ' '') + classList[i];
            }
        }
    },


    
// The className parameter (str) can contain multiple class names separated by whitespace
    
unsetClass : function (elmclassName) {
        var 
classList jsc.classNameToList(className);
        for (var 
0classList.length+= 1) {
            var 
repl = new RegExp(
                
'^\s*' classList[i] + '\s*|' +
                
'\s*' classList[i] + '\s*$|' +
                
'\s+' classList[i] + '(\s+)',
                
'g'
            
);
            
elm.className elm.className.replace(repl'$1');
        }
    },


    
getStyle : function (elm) {
        return 
window.getComputedStyle window.getComputedStyle(elm) : elm.currentStyle;
    },


    
setStyle : (function () {
        var 
helper document.createElement('div');
        var 
getSupportedProp = function (names) {
            for (var 
0names.length+= 1) {
                if (
names[iin helper.style) {
                    return 
names[i];
                }
            }
        };
        var 
props = {
            
borderRadiusgetSupportedProp(['borderRadius''MozBorderRadius''webkitBorderRadius']),
            
boxShadowgetSupportedProp(['boxShadow''MozBoxShadow''webkitBoxShadow'])
        };
        return function (
elmpropvalue) {
            switch (
prop.toLowerCase()) {
            case 
'opacity':
                var 
alphaOpacity Math.round(parseFloat(value) * 100);
                
elm.style.opacity value;
                
elm.style.filter 'alpha(opacity=' alphaOpacity ')';
                break;
            default:
                
elm.style[props[prop]] = value;
                break;
            }
        };
    })(),


    
setBorderRadius : function (elmvalue) {
        
jsc.setStyle(elm'borderRadius'value || '0');
    },


    
setBoxShadow : function (elmvalue) {
        
jsc.setStyle(elm'boxShadow'value || 'none');
    },


    
getElementPos : function (erelativeToViewport) {
        var 
x=0y=0;
        var 
rect e.getBoundingClientRect();
        
rect.left;
        
rect.top;
        if (!
relativeToViewport) {
            var 
viewPos jsc.getViewPos();
            
+= viewPos[0];
            
+= viewPos[1];
        }
        return [
xy];
    },


    
getElementSize : function (e) {
        return [
e.offsetWidthe.offsetHeight];
    },


    
// get pointer's X/Y coordinates relative to viewport
    
getAbsPointerPos : function (e) {
        if (!
e) { window.event; }
        var 
00;
        if (
typeof e.changedTouches !== 'undefined' && e.changedTouches.length) {
            
// touch devices
            
e.changedTouches[0].clientX;
            
e.changedTouches[0].clientY;
        } else if (
typeof e.clientX === 'number') {
            
e.clientX;
            
e.clientY;
        }
        return { 
xxy};
    },


    
// get pointer's X/Y coordinates relative to target element
    
getRelPointerPos : function (e) {
        if (!
e) { window.event; }
        var 
target e.target || e.srcElement;
        var 
targetRect target.getBoundingClientRect();

        var 
00;

        var 
clientX 0clientY 0;
        if (
typeof e.changedTouches !== 'undefined' && e.changedTouches.length) {
            
// touch devices
            
clientX e.changedTouches[0].clientX;
            
clientY e.changedTouches[0].clientY;
        } else if (
typeof e.clientX === 'number') {
            
clientX e.clientX;
            
clientY e.clientY;
        }

        
clientX targetRect.left;
        
clientY targetRect.top;
        return { 
xxy};
    },


    
getViewPos : function () {
        var 
doc document.documentElement;
        return [
            (
window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0),
            (
window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0)
        ];
    },


    
getViewSize : function () {
        var 
doc document.documentElement;
        return [
            (
window.innerWidth || doc.clientWidth),
            (
window.innerHeight || doc.clientHeight),
        ];
    },


    
redrawPosition : function () {

        if (
jsc.picker && jsc.picker.owner) {
            var 
thisObj jsc.picker.owner;

            var 
tpvp;

            if (
thisObj.fixed) {
                
// Fixed elements are positioned relative to viewport,
                // therefore we can ignore the scroll offset
                
tp jsc.getElementPos(thisObj.targetElementtrue); // target pos
                
vp = [00]; // view pos
            
} else {
                
tp jsc.getElementPos(thisObj.targetElement); // target pos
                
vp jsc.getViewPos(); // view pos
            
}

            var 
ts jsc.getElementSize(thisObj.targetElement); // target size
            
var vs jsc.getViewSize(); // view size
            
var ps jsc.getPickerOuterDims(thisObj); // picker size
            
var abc;
            switch (
thisObj.position.toLowerCase()) {
                case 
'left'a=1b=0c=-1; break;
                case 
'right':a=1b=0c=1; break;
                case 
'top':  a=0b=1c=-1; break;
                default:     
a=0b=1c=1; break;
            }
            var 
= (ts[b]+ps[b])/2;

            
// compute picker position
            
if (!thisObj.smartPosition) {
                var 
pp = [
                    
tp[a],
                    
tp[b]+ts[b]-l+l*c
                
];
            } else {
                var 
pp = [
                    -
vp[a]+tp[a]+ps[a] > vs[a] ?
                        (-
vp[a]+tp[a]+ts[a]/vs[a]/&& tp[a]+ts[a]-ps[a] >= tp[a]+ts[a]-ps[a] : tp[a]) :
                        
tp[a],
                    -
vp[b]+tp[b]+ts[b]+ps[b]-l+l*vs[b] ?
                        (-
vp[b]+tp[b]+ts[b]/vs[b]/&& tp[b]+ts[b]-l-l*>= tp[b]+ts[b]-l-l*tp[b]+ts[b]-l+l*c) :
                        (
tp[b]+ts[b]-l+l*>= tp[b]+ts[b]-l+l*tp[b]+ts[b]-l-l*c)
                ];
            }

            var 
pp[a];
            var 
pp[b];
            var 
positionValue thisObj.fixed 'fixed' 'absolute';
            var 
contractShadow =
                (
pp[0] + ps[0] > tp[0] || pp[0] < tp[0] + ts[0]) &&
                (
pp[1] + ps[1] < tp[1] + ts[1]);

            
jsc._drawPosition(thisObjxypositionValuecontractShadow);
        }
    },


    
_drawPosition : function (thisObjxypositionValuecontractShadow) {
        var 
vShadow contractShadow thisObj.shadowBlur// px

        
jsc.picker.wrap.style.position positionValue;
        
jsc.picker.wrap.style.left 'px';
        
jsc.picker.wrap.style.top 'px';

        
jsc.setBoxShadow(
            
jsc.picker.boxS,
            
thisObj.shadow ?
                new 
jsc.BoxShadow(0vShadowthisObj.shadowBlur0thisObj.shadowColor) :
                
null);
    },


    
getPickerDims : function (thisObj) {
        var 
displaySlider = !!jsc.getSliderComponent(thisObj);
        var 
dims = [
            
thisObj.insetWidth thisObj.padding thisObj.width +
                (
displaySlider thisObj.insetWidth jsc.getPadToSliderPadding(thisObj) + thisObj.sliderSize 0),
            
thisObj.insetWidth thisObj.padding thisObj.height +
                (
thisObj.closable thisObj.insetWidth thisObj.padding thisObj.buttonHeight 0)
        ];
        return 
dims;
    },


    
getPickerOuterDims : function (thisObj) {
        var 
dims jsc.getPickerDims(thisObj);
        return [
            
dims[0] + thisObj.borderWidth,
            
dims[1] + thisObj.borderWidth
        
];
    },


    
getPadToSliderPadding : function (thisObj) {
        return 
Math.max(thisObj.padding1.5 * (thisObj.pointerBorderWidth thisObj.pointerThickness));
    },


    
getPadYComponent : function (thisObj) {
        switch (
thisObj.mode.charAt(1).toLowerCase()) {
            case 
'v': return 'v'; break;
        }
        return 
's';
    },


    
getSliderComponent : function (thisObj) {
        if (
thisObj.mode.length 2) {
            switch (
thisObj.mode.charAt(2).toLowerCase()) {
                case 
's': return 's'; break;
                case 
'v': return 'v'; break;
            }
        }
        return 
null;
    },


    
onDocumentMouseDown : function (e) {
        if (!
e) { window.event; }
        var 
target e.target || e.srcElement;

        if (
target._jscLinkedInstance) {
            if (
target._jscLinkedInstance.showOnClick) {
                
target._jscLinkedInstance.show();
            }
        } else if (
target._jscControlName) {
            
jsc.onControlPointerStart(etargettarget._jscControlName'mouse');
        } else {
            
// Mouse is outside the picker controls -> hide the color picker!
            
if (jsc.picker && jsc.picker.owner) {
                
jsc.picker.owner.hide();
            }
        }
    },


    
onDocumentTouchStart : function (e) {
        if (!
e) { window.event; }
        var 
target e.target || e.srcElement;

        if (
target._jscLinkedInstance) {
            if (
target._jscLinkedInstance.showOnClick) {
                
target._jscLinkedInstance.show();
            }
        } else if (
target._jscControlName) {
            
jsc.onControlPointerStart(etargettarget._jscControlName'touch');
        } else {
            if (
jsc.picker && jsc.picker.owner) {
                
jsc.picker.owner.hide();
            }
        }
    },


    
onWindowResize : function (e) {
        
jsc.redrawPosition();
    },


    
onParentScroll : function (e) {
        
// hide the picker when one of the parent elements is scrolled
        
if (jsc.picker && jsc.picker.owner) {
            
jsc.picker.owner.hide();
        }
    },


    
_pointerMoveEvent : {
        
mouse'mousemove',
        
touch'touchmove'
    
},
    
_pointerEndEvent : {
        
mouse'mouseup',
        
touch'touchend'
    
},


    
_pointerOrigin null,
    
_capturedTarget null,


    
onControlPointerStart : function (etargetcontrolNamepointerType) {
        var 
thisObj target._jscInstance;

        
jsc.preventDefault(e);
        
jsc.captureTarget(target);

        var 
registerDragEvents = function (docoffset) {
            
jsc.attachGroupEvent('drag'docjsc._pointerMoveEvent[pointerType],
                
jsc.onDocumentPointerMove(etargetcontrolNamepointerTypeoffset));
            
jsc.attachGroupEvent('drag'docjsc._pointerEndEvent[pointerType],
                
jsc.onDocumentPointerEnd(etargetcontrolNamepointerType));
        };

        
registerDragEvents(document, [00]);

        if (
window.parent && window.frameElement) {
            var 
rect window.frameElement.getBoundingClientRect();
            var 
ofs = [-rect.left, -rect.top];
            
registerDragEvents(window.parent.window.documentofs);
        }

        var 
abs jsc.getAbsPointerPos(e);
        var 
rel jsc.getRelPointerPos(e);
        
jsc._pointerOrigin = {
            
xabs.rel.x,
            
yabs.rel.y
        
};

        switch (
controlName) {
        case 
'pad':
            
// if the slider is at the bottom, move it up
            
switch (jsc.getSliderComponent(thisObj)) {
            case 
's': if (thisObj.hsv[1] === 0) { thisObj.fromHSV(null100null); }; break;
            case 
'v': if (thisObj.hsv[2] === 0) { thisObj.fromHSV(nullnull100); }; break;
            }
            
jsc.setPad(thisObje00);
            break;

        case 
'sld':
            
jsc.setSld(thisObje0);
            break;
        }

        
jsc.dispatchFineChange(thisObj);
    },


    
onDocumentPointerMove : function (etargetcontrolNamepointerTypeoffset) {
        return function (
e) {
            var 
thisObj target._jscInstance;
            switch (
controlName) {
            case 
'pad':
                if (!
e) { window.event; }
                
jsc.setPad(thisObjeoffset[0], offset[1]);
                
jsc.dispatchFineChange(thisObj);
                break;

            case 
'sld':
                if (!
e) { window.event; }
                
jsc.setSld(thisObjeoffset[1]);
                
jsc.dispatchFineChange(thisObj);
                break;
            }
        }
    },


    
onDocumentPointerEnd : function (etargetcontrolNamepointerType) {
        return function (
e) {
            var 
thisObj target._jscInstance;
            
jsc.detachGroupEvents('drag');
            
jsc.releaseTarget();
            
// Always dispatch changes after detaching outstanding mouse handlers,
            // in case some user interaction will occur in user's onchange callback
            // that would intrude with current mouse events
            
jsc.dispatchChange(thisObj);
        };
    },


    
dispatchChange : function (thisObj) {
        if (
thisObj.valueElement) {
            if (
jsc.isElementType(thisObj.valueElement'input')) {
                
jsc.fireEvent(thisObj.valueElement'change');
            }
        }
    },


    
dispatchFineChange : function (thisObj) {
        if (
thisObj.onFineChange) {
            var 
callback;
            if (
typeof thisObj.onFineChange === 'string') {
                
callback = new Function (thisObj.onFineChange);
            } else {
                
callback thisObj.onFineChange;
            }
            
callback.call(thisObj);
        }
    },


    
setPad : function (thisObjeofsXofsY) {
        var 
pointerAbs jsc.getAbsPointerPos(e);
        var 
ofsX pointerAbs.jsc._pointerOrigin.thisObj.padding thisObj.insetWidth;
        var 
ofsY pointerAbs.jsc._pointerOrigin.thisObj.padding thisObj.insetWidth;

        var 
xVal * (360 / (thisObj.width 1));
        var 
yVal 100 - (* (100 / (thisObj.height 1)));

        switch (
jsc.getPadYComponent(thisObj)) {
        case 
's'thisObj.fromHSV(xValyValnulljsc.leaveSld); break;
        case 
'v'thisObj.fromHSV(xValnullyValjsc.leaveSld); break;
        }
    },


    
setSld : function (thisObjeofsY) {
        var 
pointerAbs jsc.getAbsPointerPos(e);
        var 
ofsY pointerAbs.jsc._pointerOrigin.thisObj.padding thisObj.insetWidth;

        var 
yVal 100 - (* (100 / (thisObj.height 1)));

        switch (
jsc.getSliderComponent(thisObj)) {
        case 
's'thisObj.fromHSV(nullyValnulljsc.leavePad); break;
        case 
'v'thisObj.fromHSV(nullnullyValjsc.leavePad); break;
        }
    },


    
_vmlNS 'jsc_vml_',
    
_vmlCSS 'jsc_vml_css_',
    
_vmlReady false,


    
initVML : function () {
        if (!
jsc._vmlReady) {
            
// init VML namespace
            
var doc document;
            if (!
doc.namespaces[jsc._vmlNS]) {
                
doc.namespaces.add(jsc._vmlNS'urn:schemas-microsoft-com:vml');
            }
            if (!
doc.styleSheets[jsc._vmlCSS]) {
                var 
tags = ['shape''shapetype''group''background''path''formulas''handles''fill''stroke''shadow''textbox''textpath''imagedata''line''polyline''curve''rect''roundrect''oval''arc''image'];
                var 
ss doc.createStyleSheet();
                
ss.owningElement.id jsc._vmlCSS;
                for (var 
0tags.length+= 1) {
                    
ss.addRule(jsc._vmlNS '\:' tags[i], 'behavior:url(#default#VML);');
                }
            }
            
jsc._vmlReady true;
        }
    },


    
createPalette : function () {

        var 
paletteObj = {
            
elmnull,
            
drawnull
        
};

        if (
jsc.isCanvasSupported) {
            
// Canvas implementation for modern browsers

            
var canvas document.createElement('canvas');
            var 
ctx canvas.getContext('2d');

            var 
drawFunc = function (widthheighttype) {
                
canvas.width width;
                
canvas.height height;

                
ctx.clearRect(00canvas.widthcanvas.height);

                var 
hGrad ctx.createLinearGradient(00canvas.width0);
                
hGrad.addColorStop(6'#F00');
                
hGrad.addColorStop(6'#FF0');
                
hGrad.addColorStop(6'#0F0');
                
hGrad.addColorStop(6'#0FF');
                
hGrad.addColorStop(6'#00F');
                
hGrad.addColorStop(6'#F0F');
                
hGrad.addColorStop(6'#F00');

                
ctx.fillStyle hGrad;
                
ctx.fillRect(00canvas.widthcanvas.height);

                var 
vGrad ctx.createLinearGradient(000canvas.height);
                switch (
type.toLowerCase()) {
                case 
's':
                    
vGrad.addColorStop(0'rgba(255,255,255,0)');
                    
vGrad.addColorStop(1'rgba(255,255,255,1)');
                    break;
                case 
'v':
                    
vGrad.addColorStop(0'rgba(100,100,100,0)');
                    
vGrad.addColorStop(1'rgba(100,100,100,1)');
                    break;
                }
                
ctx.fillStyle vGrad;
                
ctx.fillRect(00canvas.widthcanvas.height);
            };

            
paletteObj.elm canvas;
            
paletteObj.draw drawFunc;

        } else {
            
// VML fallback for IE 7 and 8

            
jsc.initVML();

            var 
vmlContainer document.createElement('div');
            
vmlContainer.style.position 'relative';
            
vmlContainer.style.overflow 'hidden';

            var 
hGrad document.createElement(jsc._vmlNS ':fill');
            
hGrad.type 'gradient';
            
hGrad.method 'linear';
            
hGrad.angle '90';
            
hGrad.colors '16.67% #F0F, 33.33% #00F, 50% #0FF, 66.67% #0F0, 83.33% #FF0'

            
var hRect document.createElement(jsc._vmlNS ':rect');
            
hRect.style.position 'absolute';
            
hRect.style.left = -'px';
            
hRect.style.top = -'px';
            
hRect.stroked false;
            
hRect.appendChild(hGrad);
            
vmlContainer.appendChild(hRect);

            var 
vGrad document.createElement(jsc._vmlNS ':fill');
            
vGrad.type 'gradient';
            
vGrad.method 'linear';
            
vGrad.angle '180';
            
vGrad.opacity '0';

            var 
vRect document.createElement(jsc._vmlNS ':rect');
            
vRect.style.position 'absolute';
            
vRect.style.left = -'px';
            
vRect.style.top = -'px';
            
vRect.stroked false;
            
vRect.appendChild(vGrad);
            
vmlContainer.appendChild(vRect);

            var 
drawFunc = function (widthheighttype) {
                
vmlContainer.style.width width 'px';
                
vmlContainer.style.height height 'px';

                
hRect.style.width =
                
vRect.style.width =
                    (
width 1) + 'px';
                
hRect.style.height =
                
vRect.style.height =
                    (
height 1) + 'px';

                
// Colors must be specified during every redraw, otherwise IE won't display
                // a full gradient during a subsequential redraw
                
hGrad.color '#F00';
                
hGrad.color2 '#F00';

                switch (
type.toLowerCase()) {
                case 
's':
                    
vGrad.color vGrad.color2 '#FFF';
                    break;
                case 
'v':
                    
vGrad.color vGrad.color2 '#000';
                    break;
                }
            };
            
            
paletteObj.elm vmlContainer;
            
paletteObj.draw drawFunc;
        }

        return 
paletteObj;
    },


    
createSliderGradient : function () {

        var 
sliderObj = {
            
elmnull,
            
drawnull
        
};

        if (
jsc.isCanvasSupported) {
            
// Canvas implementation for modern browsers

            
var canvas document.createElement('canvas');
            var 
ctx canvas.getContext('2d');

            var 
drawFunc = function (widthheightcolor1color2) {
                
canvas.width width;
                
canvas.height height;

                
ctx.clearRect(00canvas.widthcanvas.height);

                var 
grad ctx.createLinearGradient(000canvas.height);
                
grad.addColorStop(0color1);
                
grad.addColorStop(1color2);

                
ctx.fillStyle grad;
                
ctx.fillRect(00canvas.widthcanvas.height);
            };

            
sliderObj.elm canvas;
            
sliderObj.draw drawFunc;

        } else {
            
// VML fallback for IE 7 and 8

            
jsc.initVML();

            var 
vmlContainer document.createElement('div');
            
vmlContainer.style.position 'relative';
            
vmlContainer.style.overflow 'hidden';

            var 
grad document.createElement(jsc._vmlNS ':fill');
            
grad.type 'gradient';
            
grad.method 'linear';
            
grad.angle '180';

            var 
rect document.createElement(jsc._vmlNS ':rect');
            
rect.style.position 'absolute';
            
rect.style.left = -'px';
            
rect.style.top = -'px';
            
rect.stroked false;
            
rect.appendChild(grad);
            
vmlContainer.appendChild(rect);

            var 
drawFunc = function (widthheightcolor1color2) {
                
vmlContainer.style.width width 'px';
                
vmlContainer.style.height height 'px';

                
rect.style.width = (width 1) + 'px';
                
rect.style.height = (height 1) + 'px';

                
grad.color color1;
                
grad.color2 color2;
            };
            
            
sliderObj.elm vmlContainer;
            
sliderObj.draw drawFunc;
        }

        return 
sliderObj;
    },


    
leaveValue 1<<0,
    
leaveStyle 1<<1,
    
leavePad 1<<2,
    
leaveSld 1<<3,


    
BoxShadow : (function () {
        var 
BoxShadow = function (hShadowvShadowblurspreadcolorinset) {
            
this.hShadow hShadow;
            
this.vShadow vShadow;
            
this.blur blur;
            
this.spread spread;
            
this.color color;
            
this.inset = !!inset;
        };

        
BoxShadow.prototype.toString = function () {
            var 
vals = [
                
Math.round(this.hShadow) + 'px',
                
Math.round(this.vShadow) + 'px',
                
Math.round(this.blur) + 'px',
                
Math.round(this.spread) + 'px',
                
this.color
            
];
            if (
this.inset) {
                
vals.push('inset');
            }
            return 
vals.join(' ');
        };

        return 
BoxShadow;
    })(),


    
//
    // Usage:
    // var myColor = new jscolor(<targetElement> [, <options>])
    //

    
jscolor : function (targetElementoptions) {

        
// General options
        //
        
this.value null// initial HEX color. To change it later, use methods fromString(), fromHSV() and fromRGB()
        
this.valueElement targetElement// element that will be used to display and input the color code
        
this.styleElement targetElement// element that will preview the picked color using CSS backgroundColor
        
this.required true// whether the associated text <input> can be left empty
        
this.refine true// whether to refine the entered color code (e.g. uppercase it and remove whitespace)
        
this.hash false// whether to prefix the HEX color code with # symbol
        
this.uppercase true// whether to uppercase the color code
        
this.onFineChange null// called instantly every time the color changes (value can be either a function or a string with javascript code)
        
this.activeClass 'jscolor-active'// class to be set to the target element when a picker window is open on it
        
this.minS 0// min allowed saturation (0 - 100)
        
this.maxS 100// max allowed saturation (0 - 100)
        
this.minV 0// min allowed value (brightness) (0 - 100)
        
this.maxV 100// max allowed value (brightness) (0 - 100)

        // Accessing the picked color
        //
        
this.hsv = [00100]; // read-only  [0-360, 0-100, 0-100]
        
this.rgb = [255255255]; // read-only  [0-255, 0-255, 0-255]

        // Color Picker options
        //
        
this.width 181// width of color palette (in px)
        
this.height 101// height of color palette (in px)
        
this.showOnClick true// whether to display the color picker when user clicks on its target element
        
this.mode 'HSV'// HSV | HVS | HS | HV - layout of the color picker controls
        
this.position 'bottom'// left | right | top | bottom - position relative to the target element
        
this.smartPosition true// automatically change picker position when there is not enough space for it
        
this.sliderSize 16// px
        
this.crossSize 8// px
        
this.closable false// whether to display the Close button
        
this.closeText 'Close';
        
this.buttonColor '#000000'// CSS color
        
this.buttonHeight 18// px
        
this.padding 12// px
        
this.backgroundColor '#FFFFFF'// CSS color
        
this.borderWidth 1// px
        
this.borderColor '#BBBBBB'// CSS color
        
this.borderRadius 8// px
        
this.insetWidth 1// px
        
this.insetColor '#BBBBBB'// CSS color
        
this.shadow true// whether to display shadow
        
this.shadowBlur 15// px
        
this.shadowColor 'rgba(0,0,0,0.2)'// CSS color
        
this.pointerColor '#4C4C4C'// px
        
this.pointerBorderColor '#FFFFFF'// px
        
this.pointerBorderWidth 1// px
        
this.pointerThickness 2// px
        
this.zIndex 1000;
        
this.container null// where to append the color picker (BODY element by default)


        
for (var opt in options) {
            if (
options.hasOwnProperty(opt)) {
                
this[opt] = options[opt];
            }
        }


        
this.hide = function () {
            if (
isPickerOwner()) {
                
detachPicker();
            }
        };


        
this.show = function () {
            
drawPicker();
        };


        
this.redraw = function () {
            if (
isPickerOwner()) {
                
drawPicker();
            }
        };


        
this.importColor = function () {
            if (!
this.valueElement) {
                
this.exportColor();
            } else {
                if (
jsc.isElementType(this.valueElement'input')) {
                    if (!
this.refine) {
                        if (!
this.fromString(this.valueElement.valuejsc.leaveValue)) {
                            if (
this.styleElement) {
                                
this.styleElement.style.backgroundImage this.styleElement._jscOrigStyle.backgroundImage;
                                
this.styleElement.style.backgroundColor this.styleElement._jscOrigStyle.backgroundColor;
                                
this.styleElement.style.color this.styleElement._jscOrigStyle.color;
                            }
                            
this.exportColor(jsc.leaveValue jsc.leaveStyle);
                        }
                    } else if (!
this.required && /^s*$/.test(this.valueElement.value)) {
                        
this.valueElement.value '';
                        if (
this.styleElement) {
                            
this.styleElement.style.backgroundImage this.styleElement._jscOrigStyle.backgroundImage;
                            
this.styleElement.style.backgroundColor this.styleElement._jscOrigStyle.backgroundColor;
                            
this.styleElement.style.color this.styleElement._jscOrigStyle.color;
                        }
                        
this.exportColor(jsc.leaveValue jsc.leaveStyle);

                    } else if (
this.fromString(this.valueElement.value)) {
                        
// managed to import color successfully from the value -> OK, don't do anything
                    
} else {
                        
this.exportColor();
                    }
                } else {
                    
// not an input element -> doesn't have any value
                    
this.exportColor();
                }
            }
        };


        
this.exportColor = function (flags) {
            if (!(
flags jsc.leaveValue) && this.valueElement) {
                var 
value this.toString();
                if (
this.uppercase) { value value.toUpperCase(); }
                if (
this.hash) { value '#' value; }

                if (
jsc.isElementType(this.valueElement'input')) {
                    
this.valueElement.value value;
                } else {
                    
this.valueElement.innerHTML value;
                }
            }
            if (!(
flags jsc.leaveStyle)) {
                if (
this.styleElement) {
                    
this.styleElement.style.backgroundImage 'none';
                    
this.styleElement.style.backgroundColor '#' this.toString();
                    
this.styleElement.style.color this.isLight() ? '#000' '#FFF';
                }
            }
            if (!(
flags jsc.leavePad) && isPickerOwner()) {
                
redrawPad();
            }
            if (!(
flags jsc.leaveSld) && isPickerOwner()) {
                
redrawSld();
            }
        };


        
// h: 0-360
        // s: 0-100
        // v: 0-100
        //
        
this.fromHSV = function (hsvflags) { // null = don't change
            
if (!== null) {
                if (
isNaN(h)) { return false; }
                
Math.max(0Math.min(360h));
            }
            if (
!== null) {
                if (
isNaN(s)) { return false; }
                
Math.max(0Math.min(100this.maxSs), this.minS);
            }
            if (
!== null) {
                if (
isNaN(v)) { return false; }
                
Math.max(0Math.min(100this.maxVv), this.minV);
            }

            
this.rgb HSV_RGB(
                
h===null this.hsv[0] : (this.hsv[0]=h),
                
s===null this.hsv[1] : (this.hsv[1]=s),
                
v===null this.hsv[2] : (this.hsv[2]=v)
            );

            
this.exportColor(flags);
        };


        
// r: 0-255
        // g: 0-255
        // b: 0-255
        //
        
this.fromRGB = function (rgbflags) { // null = don't change
            
if (!== null) {
                if (
isNaN(r)) { return false; }
                
Math.max(0Math.min(255r));
            }
            if (
!== null) {
                if (
isNaN(g)) { return false; }
                
Math.max(0Math.min(255g));
            }
            if (
!== null) {
                if (
isNaN(b)) { return false; }
                
Math.max(0Math.min(255b));
            }

            var 
hsv RGB_HSV(
                
r===null this.rgb[0] : r,
                
g===null this.rgb[1] : g,
                
b===null this.rgb[2] : b
            
);
            if (
hsv[0] !== null) {
                
this.hsv[0] = Math.max(0Math.min(360hsv[0]));
            }
            if (
hsv[2] !== 0) {
                
this.hsv[1] = hsv[1]===null null Math.max(0this.minSMath.min(100this.maxShsv[1]));
            }
            
this.hsv[2] = hsv[2]===null null Math.max(0this.minVMath.min(100this.maxVhsv[2]));

            
// update RGB according to final HSV, as some values might be trimmed
            
var rgb HSV_RGB(this.hsv[0], this.hsv[1], this.hsv[2]);
            
this.rgb[0] = rgb[0];
            
this.rgb[1] = rgb[1];
            
this.rgb[2] = rgb[2];

            
this.exportColor(flags);
        };


        
this.fromString = function (strflags) {
            var 
m;
            if (
str.match(/^W*([0-9A-F]{3}([0-9A-F]{3})?)W*$/i)) {
                
// HEX notation
                //

                
if (m[1].length === 6) {
                    
// 6-char notation
                    
this.fromRGB(
                        
parseInt(m[1].substr(0,2),16),
                        
parseInt(m[1].substr(2,2),16),
                        
parseInt(m[1].substr(4,2),16),
                        
flags
                    
);
                } else {
                    
// 3-char notation
                    
this.fromRGB(
                        
parseInt(m[1].charAt(0) + m[1].charAt(0),16),
                        
parseInt(m[1].charAt(1) + m[1].charAt(1),16),
                        
parseInt(m[1].charAt(2) + m[1].charAt(2),16),
                        
flags
                    
);
                }
                return 
true;

            } else if (
str.match(/^W*rgba?(([^)]*))W*$/i)) {
                var 
params m[1].split(',');
                var 
re = /^s*(d*)(.d+)?s*$/;
                var 
mRmGmB;
                if (
                    
params.length >= &&
                    (
mR params[0].match(re)) &&
                    (
mG params[1].match(re)) &&
                    (
mB params[2].match(re))
                ) {
                    var 
parseFloat((mR[1] || '0') + (mR[2] || ''));
                    var 
parseFloat((mG[1] || '0') + (mG[2] || ''));
                    var 
parseFloat((mB[1] || '0') + (mB[2] || ''));
                    
this.fromRGB(rgbflags);
                    return 
true;
                }
            }
            return 
false;
        };


        
this.toString = function () {
            return (
                (
0x100 Math.round(this.rgb[0])).toString(16).substr(1) +
                (
0x100 Math.round(this.rgb[1])).toString(16).substr(1) +
                (
0x100 Math.round(this.rgb[2])).toString(16).substr(1)
            );
        };


        
this.toHEXString = function () {
            return 
'#' this.toString().toUpperCase();
        };


        
this.toRGBString = function () {
            return (
'rgb(' +
                
Math.round(this.rgb[0]) + ',' +
                
Math.round(this.rgb[1]) + ',' +
                
Math.round(this.rgb[2]) + ')'
            
);
        };


        
this.isLight = function () {
            return (
                
0.213 this.rgb[0] +
                
0.715 this.rgb[1] +
                
0.072 this.rgb[2] >
                
255 2
            
);
        };


        
this._processParentElementsInDOM = function () {
            if (
this._linkedElementsProcessed) { return; }
            
this._linkedElementsProcessed true;

            var 
elm this.targetElement;
            do {
                
// If the target element or one of its parent nodes has fixed position,
                // then use fixed positioning instead
                //
                // Note: In Firefox, getComputedStyle returns null in a hidden iframe,
                // that's why we need to check if the returned style object is non-empty
                
var currStyle jsc.getStyle(elm);
                if (
currStyle && currStyle.position.toLowerCase() === 'fixed') {
                    
this.fixed true;
                }

                if (
elm !== this.targetElement) {
                    
// Ensure to attach onParentScroll only once to each parent element
                    // (multiple targetElements can share the same parent nodes)
                    //
                    // Note: It's not just offsetParents that can be scrollable,
                    // that's why we loop through all parent nodes
                    
if (!elm._jscEventsAttached) {
                        
jsc.attachEvent(elm'scroll'jsc.onParentScroll);
                        
elm._jscEventsAttached true;
                    }
                }
            } while ((
elm elm.parentNode) && !jsc.isElementType(elm'body'));
        };


        
// r: 0-255
        // g: 0-255
        // b: 0-255
        //
        // returns: [ 0-360, 0-100, 0-100 ]
        //
        
function RGB_HSV (rgb) {
            
/= 255;
            
/= 255;
            
/= 255;
            var 
Math.min(Math.min(r,g),b);
            var 
Math.max(Math.max(r,g),b);
            var 
n;
            if (
=== 0) { return [ null0100 ]; }
            var 
r===3+(b-g)/: (g===5+(r-b)/1+(g-r)/m);
            return [
                
60 * (h===6?0:h),
                
100 * (m/v),
                
100 v
            
];
        }


        
// h: 0-360
        // s: 0-100
        // v: 0-100
        //
        // returns: [ 0-255, 0-255, 0-255 ]
        //
        
function HSV_RGB (hsv) {
            var 
255 * (100);

            if (
=== null) {
                return [ 
uu];
            }

            
/= 60;
            
/= 100;

            var 
Math.floor(h);
            var 
i%h-1-(h-i);
            var 
* (s);
            var 
* (f);
            switch (
i) {
                case 
6:
                case 
0: return [u,n,m];
                case 
1: return [n,u,m];
                case 
2: return [m,u,n];
                case 
3: return [m,n,u];
                case 
4: return [n,m,u];
                case 
5: return [u,m,n];
            }
        }


        function 
detachPicker () {
            
jsc.unsetClass(THIS.targetElementTHIS.activeClass);
            
jsc.picker.wrap.parentNode.removeChild(jsc.picker.wrap);
            
delete jsc.picker.owner;
        }


        function 
drawPicker () {

            
// At this point, when drawing the picker, we know what the parent elements are
            // and we can do all related DOM operations, such as registering events on them
            // or checking their positioning
            
THIS._processParentElementsInDOM();

            if (!
jsc.picker) {
                
jsc.picker = {
                    
ownernull,
                    
wrap document.createElement('div'),
                    
box document.createElement('div'),
                    
boxS document.createElement('div'), // shadow area
                    
boxB document.createElement('div'), // border
                    
pad document.createElement('div'),
                    
padB document.createElement('div'), // border
                    
padM document.createElement('div'), // mouse/touch area
                    
padPal jsc.createPalette(),
                    
cross document.createElement('div'),
                    
crossBY document.createElement('div'), // border Y
                    
crossBX document.createElement('div'), // border X
                    
crossLY document.createElement('div'), // line Y
                    
crossLX document.createElement('div'), // line X
                    
sld document.createElement('div'),
                    
sldB document.createElement('div'), // border
                    
sldM document.createElement('div'), // mouse/touch area
                    
sldGrad jsc.createSliderGradient(),
                    
sldPtrS document.createElement('div'), // slider pointer spacer
                    
sldPtrIB document.createElement('div'), // slider pointer inner border
                    
sldPtrMB document.createElement('div'), // slider pointer middle border
                    
sldPtrOB document.createElement('div'), // slider pointer outer border
                    
btn document.createElement('div'),
                    
btnT document.createElement('span'// text
                
};

                
jsc.picker.pad.appendChild(jsc.picker.padPal.elm);
                
jsc.picker.padB.appendChild(jsc.picker.pad);
                
jsc.picker.cross.appendChild(jsc.picker.crossBY);
                
jsc.picker.cross.appendChild(jsc.picker.crossBX);
                
jsc.picker.cross.appendChild(jsc.picker.crossLY);
                
jsc.picker.cross.appendChild(jsc.picker.crossLX);
                
jsc.picker.padB.appendChild(jsc.picker.cross);
                
jsc.picker.box.appendChild(jsc.picker.padB);
                
jsc.picker.box.appendChild(jsc.picker.padM);

                
jsc.picker.sld.appendChild(jsc.picker.sldGrad.elm);
                
jsc.picker.sldB.appendChild(jsc.picker.sld);
                
jsc.picker.sldB.appendChild(jsc.picker.sldPtrOB);
                
jsc.picker.sldPtrOB.appendChild(jsc.picker.sldPtrMB);
                
jsc.picker.sldPtrMB.appendChild(jsc.picker.sldPtrIB);
                
jsc.picker.sldPtrIB.appendChild(jsc.picker.sldPtrS);
                
jsc.picker.box.appendChild(jsc.picker.sldB);
                
jsc.picker.box.appendChild(jsc.picker.sldM);

                
jsc.picker.btn.appendChild(jsc.picker.btnT);
                
jsc.picker.box.appendChild(jsc.picker.btn);

                
jsc.picker.boxB.appendChild(jsc.picker.box);
                
jsc.picker.wrap.appendChild(jsc.picker.boxS);
                
jsc.picker.wrap.appendChild(jsc.picker.boxB);
            }

            var 
jsc.picker;

            var 
displaySlider = !!jsc.getSliderComponent(THIS);
            var 
dims jsc.getPickerDims(THIS);
            var 
crossOuterSize = (THIS.pointerBorderWidth THIS.pointerThickness THIS.crossSize);
            var 
padToSliderPadding jsc.getPadToSliderPadding(THIS);
            var 
borderRadius Math.min(
                
THIS.borderRadius,
                
Math.round(THIS.padding Math.PI)); // px
            
var padCursor 'crosshair';

            
// wrap
            
p.wrap.style.clear 'both';
            
p.wrap.style.width = (dims[0] + THIS.borderWidth) + 'px';
            
p.wrap.style.height = (dims[1] + THIS.borderWidth) + 'px';
            
p.wrap.style.zIndex THIS.zIndex;

            
// picker
            
p.box.style.width dims[0] + 'px';
            
p.box.style.height dims[1] + 'px';

            
p.boxS.style.position 'absolute';
            
p.boxS.style.left '0';
            
p.boxS.style.top '0';
            
p.boxS.style.width '100%';
            
p.boxS.style.height '100%';
            
jsc.setBorderRadius(p.boxSborderRadius 'px');

            
// picker border
            
p.boxB.style.position 'relative';
            
p.boxB.style.border THIS.borderWidth 'px solid';
            
p.boxB.style.borderColor THIS.borderColor;
            
p.boxB.style.background THIS.backgroundColor;
            
jsc.setBorderRadius(p.boxBborderRadius 'px');

            
// IE hack:
            // If the element is transparent, IE will trigger the event on the elements under it,
            // e.g. on Canvas or on elements with border
            
p.padM.style.background =
            
p.sldM.style.background =
                
'#FFF';
            
jsc.setStyle(p.padM'opacity''0');
            
jsc.setStyle(p.sldM'opacity''0');

            
// pad
            
p.pad.style.position 'relative';
            
p.pad.style.width THIS.width 'px';
            
p.pad.style.height THIS.height 'px';

            
// pad palettes (HSV and HVS)
            
p.padPal.draw(THIS.widthTHIS.heightjsc.getPadYComponent(THIS));

            
// pad border
            
p.padB.style.position 'absolute';
            
p.padB.style.left THIS.padding 'px';
            
p.padB.style.top THIS.padding 'px';
            
p.padB.style.border THIS.insetWidth 'px solid';
            
p.padB.style.borderColor THIS.insetColor;

            
// pad mouse area
            
p.padM._jscInstance THIS;
            
p.padM._jscControlName 'pad';
            
p.padM.style.position 'absolute';
            
p.padM.style.left '0';
            
p.padM.style.top '0';
            
p.padM.style.width = (THIS.padding THIS.insetWidth THIS.width padToSliderPadding 2) + 'px';
            
p.padM.style.height dims[1] + 'px';
            
p.padM.style.cursor padCursor;

            
// pad cross
            
p.cross.style.position 'absolute';
            
p.cross.style.left =
            
p.cross.style.top =
                
'0';
            
p.cross.style.width =
            
p.cross.style.height =
                
crossOuterSize 'px';

            
// pad cross border Y and X
            
p.crossBY.style.position =
            
p.crossBX.style.position =
                
'absolute';
            
p.crossBY.style.background =
            
p.crossBX.style.background =
                
THIS.pointerBorderColor;
            
p.crossBY.style.width =
            
p.crossBX.style.height =
                (
THIS.pointerBorderWidth THIS.pointerThickness) + 'px';
            
p.crossBY.style.height =
            
p.crossBX.style.width =
                
crossOuterSize 'px';
            
p.crossBY.style.left =
            
p.crossBX.style.top =
                (
Math.floor(crossOuterSize 2) - Math.floor(THIS.pointerThickness 2) - THIS.pointerBorderWidth) + 'px';
            
p.crossBY.style.top =
            
p.crossBX.style.left =
                
'0';

            
// pad cross line Y and X
            
p.crossLY.style.position =
            
p.crossLX.style.position =
                
'absolute';
            
p.crossLY.style.background =
            
p.crossLX.style.background =
                
THIS.pointerColor;
            
p.crossLY.style.height =
            
p.crossLX.style.width =
                (
crossOuterSize THIS.pointerBorderWidth) + 'px';
            
p.crossLY.style.width =
            
p.crossLX.style.height =
                
THIS.pointerThickness 'px';
            
p.crossLY.style.left =
            
p.crossLX.style.top =
                (
Math.floor(crossOuterSize 2) - Math.floor(THIS.pointerThickness 2)) + 'px';
            
p.crossLY.style.top =
            
p.crossLX.style.left =
                
THIS.pointerBorderWidth 'px';

            
// slider
            
p.sld.style.overflow 'hidden';
            
p.sld.style.width THIS.sliderSize 'px';
            
p.sld.style.height THIS.height 'px';

            
// slider gradient
            
p.sldGrad.draw(THIS.sliderSizeTHIS.height'#000''#000');

            
// slider border
            
p.sldB.style.display displaySlider 'block' 'none';
            
p.sldB.style.position 'absolute';
            
p.sldB.style.right THIS.padding 'px';
            
p.sldB.style.top THIS.padding 'px';
            
p.sldB.style.border THIS.insetWidth 'px solid';
            
p.sldB.style.borderColor THIS.insetColor;

            
// slider mouse area
            
p.sldM._jscInstance THIS;
            
p.sldM._jscControlName 'sld';
            
p.sldM.style.display displaySlider 'block' 'none';
            
p.sldM.style.position 'absolute';
            
p.sldM.style.right '0';
            
p.sldM.style.top '0';
            
p.sldM.style.width = (THIS.sliderSize padToSliderPadding THIS.padding THIS.insetWidth) + 'px';
            
p.sldM.style.height dims[1] + 'px';
            
p.sldM.style.cursor 'default';

            
// slider pointer inner and outer border
            
p.sldPtrIB.style.border =
            
p.sldPtrOB.style.border =
                
THIS.pointerBorderWidth 'px solid ' THIS.pointerBorderColor;

            
// slider pointer outer border
            
p.sldPtrOB.style.position 'absolute';
            
p.sldPtrOB.style.left = -(THIS.pointerBorderWidth THIS.pointerThickness) + 'px';
            
p.sldPtrOB.style.top '0';

            
// slider pointer middle border
            
p.sldPtrMB.style.border THIS.pointerThickness 'px solid ' THIS.pointerColor;

            
// slider pointer spacer
            
p.sldPtrS.style.width THIS.sliderSize 'px';
            
p.sldPtrS.style.height sliderPtrSpace 'px';

            
// the Close button
            
function setBtnBorder () {
                var 
insetColors THIS.insetColor.split(/s+/);
                var 
outsetColor insetColors.length insetColors[0] : insetColors[1] + ' ' insetColors[0] + ' ' insetColors[0] + ' ' insetColors[1];
                
p.btn.style.borderColor outsetColor;
            }
            
p.btn.style.display THIS.closable 'block' 'none';
            
p.btn.style.position 'absolute';
            
p.btn.style.left THIS.padding 'px';
            
p.btn.style.bottom THIS.padding 'px';
            
p.btn.style.padding '0 15px';
            
p.btn.style.height THIS.buttonHeight 'px';
            
p.btn.style.border THIS.insetWidth 'px solid';
            
setBtnBorder();
            
p.btn.style.color THIS.buttonColor;
            
p.btn.style.font '12px sans-serif';
            
p.btn.style.textAlign 'center';
            try {
                
p.btn.style.cursor 'pointer';
            } catch(
eOldIE) {
                
p.btn.style.cursor 'hand';
            }
            
p.btn.onmousedown = function () {
                
THIS.hide();
            };
            
p.btnT.style.lineHeight THIS.buttonHeight 'px';
            
p.btnT.innerHTML '';
            
p.btnT.appendChild(document.createTextNode(THIS.closeText));

            
// place pointers
            
redrawPad();
            
redrawSld();

            
// If we are changing the owner without first closing the picker,
            // make sure to first deal with the old owner
            
if (jsc.picker.owner && jsc.picker.owner !== THIS) {
                
jsc.unsetClass(jsc.picker.owner.targetElementTHIS.activeClass);
            }

            
// Set the new picker owner
            
jsc.picker.owner THIS;

            
// The redrawPosition() method needs picker.owner to be set, that's why we call it here,
            // after setting the owner
            
if (jsc.isElementType(container'body')) {
                
jsc.redrawPosition();
            } else {
                
jsc._drawPosition(THIS00'relative'false);
            }

            if (
p.wrap.parentNode != container) {
                
container.appendChild(p.wrap);
            }

            
jsc.setClass(THIS.targetElementTHIS.activeClass);
        }


        function 
redrawPad () {
            
// redraw the pad pointer
            
switch (jsc.getPadYComponent(THIS)) {
            case 
's': var yComponent 1; break;
            case 
'v': var yComponent 2; break;
            }
            var 
Math.round((THIS.hsv[0] / 360) * (THIS.width 1));
            var 
Math.round((THIS.hsv[yComponent] / 100) * (THIS.height 1));
            var 
crossOuterSize = (THIS.pointerBorderWidth THIS.pointerThickness THIS.crossSize);
            var 
ofs = -Math.floor(crossOuterSize 2);
            
jsc.picker.cross.style.left = (ofs) + 'px';
            
jsc.picker.cross.style.top = (ofs) + 'px';

            
// redraw the slider
            
switch (jsc.getSliderComponent(THIS)) {
            case 
's':
                var 
rgb1 HSV_RGB(THIS.hsv[0], 100THIS.hsv[2]);
                var 
rgb2 HSV_RGB(THIS.hsv[0], 0THIS.hsv[2]);
                var 
color1 'rgb(' +
                    
Math.round(rgb1[0]) + ',' +
                    
Math.round(rgb1[1]) + ',' +
                    
Math.round(rgb1[2]) + ')';
                var 
color2 'rgb(' +
                    
Math.round(rgb2[0]) + ',' +
                    
Math.round(rgb2[1]) + ',' +
                    
Math.round(rgb2[2]) + ')';
                
jsc.picker.sldGrad.draw(THIS.sliderSizeTHIS.heightcolor1color2);
                break;
            case 
'v':
                var 
rgb HSV_RGB(THIS.hsv[0], THIS.hsv[1], 100);
                var 
color1 'rgb(' +
                    
Math.round(rgb[0]) + ',' +
                    
Math.round(rgb[1]) + ',' +
                    
Math.round(rgb[2]) + ')';
                var 
color2 '#000';
                
jsc.picker.sldGrad.draw(THIS.sliderSizeTHIS.heightcolor1color2);
                break;
            }
        }


        function 
redrawSld () {
            var 
sldComponent jsc.getSliderComponent(THIS);
            if (
sldComponent) {
                
// redraw the slider pointer
                
switch (sldComponent) {
                case 
's': var yComponent 1; break;
                case 
'v': var yComponent 2; break;
                }
                var 
Math.round((THIS.hsv[yComponent] / 100) * (THIS.height 1));
                
jsc.picker.sldPtrOB.style.top = (- (THIS.pointerBorderWidth THIS.pointerThickness) - Math.floor(sliderPtrSpace 2)) + 'px';
            }
        }


        function 
isPickerOwner () {
            return 
jsc.picker && jsc.picker.owner === THIS;
        }


        function 
blurValue () {
            
THIS.importColor();
        }


        
// Find the target element
        
if (typeof targetElement === 'string') {
            var 
id targetElement;
            var 
elm document.getElementById(id);
            if (
elm) {
                
this.targetElement elm;
            } else {
                
jsc.warn('Could not find target element with ID '' + id + ''');
            }
        } else if (
targetElement) {
            
this.targetElement targetElement;
        } else {
            
jsc.warn('Invalid target element: '' + targetElement + ''');
        }

        if (
this.targetElement._jscLinkedInstance) {
            
jsc.warn('Cannot link jscolor twice to the same element. Skipping.');
            return;
        }
        
this.targetElement._jscLinkedInstance this;

        
// Find the value element
        
this.valueElement jsc.fetchElement(this.valueElement);
        
// Find the style element
        
this.styleElement jsc.fetchElement(this.styleElement);

        var 
THIS this;
        var 
container =
            
this.container ?
            
jsc.fetchElement(this.container) :
            
document.getElementsByTagName('body')[0];
        var 
sliderPtrSpace 3// px

        // For BUTTON elements it's important to stop them from sending the form when clicked
        // (e.g. in Safari)
        
if (jsc.isElementType(this.targetElement'button')) {
            if (
this.targetElement.onclick) {
                var 
origCallback this.targetElement.onclick;
                
this.targetElement.onclick = function (evt) {
                    
origCallback.call(thisevt);
                    return 
false;
                };
            } else {
                
this.targetElement.onclick = function () { return false; };
            }
        }

        
/*
        var elm = this.targetElement;
        do {
            // If the target element or one of its offsetParents has fixed position,
            // then use fixed positioning instead
            //
            // Note: In Firefox, getComputedStyle returns null in a hidden iframe,
            // that's why we need to check if the returned style object is non-empty
            var currStyle = jsc.getStyle(elm);
            if (currStyle && currStyle.position.toLowerCase() === 'fixed') {
                this.fixed = true;
            }

            if (elm !== this.targetElement) {
                // attach onParentScroll so that we can recompute the picker position
                // when one of the offsetParents is scrolled
                if (!elm._jscEventsAttached) {
                    jsc.attachEvent(elm, 'scroll', jsc.onParentScroll);
                    elm._jscEventsAttached = true;
                }
            }
        } while ((elm = elm.offsetParent) && !jsc.isElementType(elm, 'body'));
        */

        // valueElement
        
if (this.valueElement) {
            if (
jsc.isElementType(this.valueElement'input')) {
                var 
updateField = function () {
                    
THIS.fromString(THIS.valueElement.valuejsc.leaveValue);
                    
jsc.dispatchFineChange(THIS);
                };
                
jsc.attachEvent(this.valueElement'keyup'updateField);
                
jsc.attachEvent(this.valueElement'input'updateField);
                
jsc.attachEvent(this.valueElement'blur'blurValue);
                
this.valueElement.setAttribute('autocomplete''off');
            }
        }

        
// styleElement
        
if (this.styleElement) {
            
this.styleElement._jscOrigStyle = {
                
backgroundImage this.styleElement.style.backgroundImage,
                
backgroundColor this.styleElement.style.backgroundColor,
                
color this.styleElement.style.color
            
};
        }

        if (
this.value) {
            
// Try to set the color from the .value option and if unsuccessful,
            // export the current color
            
this.fromString(this.value) || this.exportColor();
        } else {
            
this.importColor();
        }
    }

};


//================================
// Public properties and methods
//================================


// By default, search for all elements with class="jscolor" and install a color picker on them.
//
// You can change what class name will be looked for by setting the property jscolor.lookupClass
// anywhere in your HTML document. To completely disable the automatic lookup, set it to null.
//
jsc.jscolor.lookupClass 'jscolor';


jsc.jscolor.installByClassName = function (className) {
    var 
inputElms document.getElementsByTagName('input');
    var 
buttonElms document.getElementsByTagName('button');

    
jsc.tryInstallOnElements(inputElmsclassName);
    
jsc.tryInstallOnElements(buttonElmsclassName);
};


jsc.register();


return 
jsc.jscolor;


})(); }
?>
Онлайн: 0
Реклама