Plugin Directory

Changeset 648996


Ignore:
Timestamp:
01/07/2013 06:43:40 AM (13 years ago)
Author:
olarmarius
Message:

eliminate unused files and optimise other files

Location:
vasaio-qr-code
Files:
12 deleted
14 edited

Legend:

Unmodified
Added
Removed
  • vasaio-qr-code/tags/1.0/vasaio-qr-code-encoder/jscolor/jscolor.js

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

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

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

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

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

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

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

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