├── images ├── select.png ├── select2.png ├── colorpicker_hex.png ├── colorpicker_hsb_b.png ├── colorpicker_hsb_h.png ├── colorpicker_hsb_s.png ├── colorpicker_indic.gif ├── colorpicker_rgb_b.png ├── colorpicker_rgb_g.png ├── colorpicker_rgb_r.png ├── colorpicker_overlay.png ├── colorpicker_select.gif ├── colorpicker_submit.png └── colorpicker_background.png ├── demo ├── images │ ├── forkme.png │ ├── pattern.png │ ├── select.png │ ├── select2.png │ ├── colorpicker_hex.png │ ├── colorpicker_hsb_b.png │ ├── colorpicker_hsb_h.png │ ├── colorpicker_hsb_s.png │ ├── colorpicker_indic.gif │ ├── colorpicker_rgb_b.png │ ├── colorpicker_rgb_g.png │ ├── colorpicker_rgb_r.png │ ├── colorpicker_overlay.png │ ├── colorpicker_select.gif │ ├── colorpicker_submit.png │ └── colorpicker_background.png ├── css │ ├── page.css │ └── colorpicker.css ├── index.html └── js │ └── colorpicker.js ├── LICENSE ├── css ├── colorpicker.min.css └── colorpicker.css ├── README.md ├── colorpicker.min.js └── colorpicker.js /images/select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/images/select.png -------------------------------------------------------------------------------- /images/select2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/images/select2.png -------------------------------------------------------------------------------- /demo/images/forkme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/forkme.png -------------------------------------------------------------------------------- /demo/images/pattern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/pattern.png -------------------------------------------------------------------------------- /demo/images/select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/select.png -------------------------------------------------------------------------------- /demo/images/select2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/select2.png -------------------------------------------------------------------------------- /images/colorpicker_hex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/images/colorpicker_hex.png -------------------------------------------------------------------------------- /images/colorpicker_hsb_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/images/colorpicker_hsb_b.png -------------------------------------------------------------------------------- /images/colorpicker_hsb_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/images/colorpicker_hsb_h.png -------------------------------------------------------------------------------- /images/colorpicker_hsb_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/images/colorpicker_hsb_s.png -------------------------------------------------------------------------------- /images/colorpicker_indic.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/images/colorpicker_indic.gif -------------------------------------------------------------------------------- /images/colorpicker_rgb_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/images/colorpicker_rgb_b.png -------------------------------------------------------------------------------- /images/colorpicker_rgb_g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/images/colorpicker_rgb_g.png -------------------------------------------------------------------------------- /images/colorpicker_rgb_r.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/images/colorpicker_rgb_r.png -------------------------------------------------------------------------------- /demo/images/colorpicker_hex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/colorpicker_hex.png -------------------------------------------------------------------------------- /images/colorpicker_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/images/colorpicker_overlay.png -------------------------------------------------------------------------------- /images/colorpicker_select.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/images/colorpicker_select.gif -------------------------------------------------------------------------------- /images/colorpicker_submit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/images/colorpicker_submit.png -------------------------------------------------------------------------------- /demo/images/colorpicker_hsb_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/colorpicker_hsb_b.png -------------------------------------------------------------------------------- /demo/images/colorpicker_hsb_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/colorpicker_hsb_h.png -------------------------------------------------------------------------------- /demo/images/colorpicker_hsb_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/colorpicker_hsb_s.png -------------------------------------------------------------------------------- /demo/images/colorpicker_indic.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/colorpicker_indic.gif -------------------------------------------------------------------------------- /demo/images/colorpicker_rgb_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/colorpicker_rgb_b.png -------------------------------------------------------------------------------- /demo/images/colorpicker_rgb_g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/colorpicker_rgb_g.png -------------------------------------------------------------------------------- /demo/images/colorpicker_rgb_r.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/colorpicker_rgb_r.png -------------------------------------------------------------------------------- /images/colorpicker_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/images/colorpicker_background.png -------------------------------------------------------------------------------- /demo/images/colorpicker_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/colorpicker_overlay.png -------------------------------------------------------------------------------- /demo/images/colorpicker_select.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/colorpicker_select.gif -------------------------------------------------------------------------------- /demo/images/colorpicker_submit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/colorpicker_submit.png -------------------------------------------------------------------------------- /demo/images/colorpicker_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cviebrock/jQuery-ColorPicker/master/demo/images/colorpicker_background.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | # Annotator licensing terms 2 | 3 | Annotator is free software, and you may use it under the terms of either the 4 | MIT or the GNU GPL licenses: 5 | 6 | ## GNU GPLv3 7 | 8 | You can redistribute this program and/or modify it under the terms of the 9 | GNU General Public License as published by the Free Software Foundation, 10 | either version 3 of the License, or (at your option) any later version. 11 | 12 | This program is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU General Public License for more details. 16 | 17 | You should have received a copy of the GNU General Public License 18 | along with this program. See LICENSE-GPL, or, if this file is missing, 19 | . 20 | 21 | ## MIT 22 | 23 | You may use the software under the terms of the MIT license, which can be 24 | found in LICENSE-MIT, or, if this file is missing, 25 | . -------------------------------------------------------------------------------- /demo/css/page.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | background-image: url('../images/pattern.png'); 5 | font-family: Calibri, Verdana, Ariel, sans-serif; 6 | } 7 | #wrapper { 8 | width: 900px; 9 | margin: 0 auto; 10 | padding: 20px 0; 11 | 12 | } 13 | #wrapper > h1 { 14 | text-align: center; 15 | text-transform: uppercase; 16 | font-size: 3em; 17 | margin: 0px 0px 15px 0px; 18 | padding: 0; 19 | font-family: 'Lilita One', cursive; 20 | color: #fff; 21 | text-decoration: none; 22 | font-weight: bold; 23 | text-shadow: 24 | 1px 1px 0 #dd0000, 25 | 2px 2px 0 #dd0000, 26 | 3px 3px 0 #dd0000, 27 | 4px 4px 0 #fe6230, 28 | 6px 5px 0 #fe6230, 29 | 7px 7px 0 #fe6230, 30 | 8px 8px 0 #fef600, 31 | 9px 9px 0 #fef600, 32 | 10px 10px 0 #fef600, 33 | 11px 11px 0 #00bc00, 34 | 12px 12px 0 #00bc00, 35 | 13px 13px 0 #00bc00, 36 | 14px 14px 0 #009bfe, 37 | 15px 15px 0 #009bfe, 38 | 16px 16px 0 #009bfe, 39 | 17px 17px 0 #000083, 40 | 18px 18px 0 #000083, 41 | 19px 19px 0 #000083, 42 | 20px 20px 0 #30009b, 43 | 21px 21px 0 #30009b, 44 | 22px 22px 0 #30009b; 45 | } 46 | #wrapper > article { 47 | width: 700px; 48 | background: #fbfbfb; 49 | -moz-border-radius: 4px; 50 | border-radius: 4px; 51 | padding: 2em 1.5em; 52 | color: rgba(0,0,0, .8); 53 | text-shadow: 0 1px 0 #fff; 54 | line-height: 1.5; 55 | margin: 60px auto; 56 | -webkit-box-shadow: 0 15px 10px rgba(0,0,0, .7); 57 | -moz-box-shadow: 0 15px 10px rgba(0, 0, 0, 0.7); 58 | box-shadow: 0 15px 10px rgba(0, 0, 0, 0.7); 59 | } 60 | #colorselector { 61 | position: absolute; 62 | top: 0; 63 | left: 0; 64 | width: 36px; 65 | height: 36px; 66 | background: url(../images/select2.png); 67 | } 68 | #colorselector div { 69 | position: absolute; 70 | top: 4px; 71 | left: 4px; 72 | width: 28px; 73 | height: 28px; 74 | background: url(../images/select2.png) center; 75 | } 76 | #colorpickerholder2 { 77 | top: 32px; 78 | left: 0; 79 | width: 356px; 80 | height: 0; 81 | overflow: hidden; 82 | position: absolute; 83 | } 84 | #colorpickerholder2 .colorpicker input { 85 | color: #778398; 86 | } 87 | #customWidget { 88 | position: relative; 89 | height: 36px; 90 | } 91 | 92 | #colorselector2 { 93 | position: relative; 94 | width: 36px; 95 | height: 36px; 96 | background: url(../images/select.png); 97 | } 98 | #colorselector2 div { 99 | position: absolute; 100 | top: 3px; 101 | left: 3px; 102 | width: 30px; 103 | height: 30px; 104 | background: url(../images/select.png) center; 105 | } -------------------------------------------------------------------------------- /css/colorpicker.min.css: -------------------------------------------------------------------------------- 1 | .colorpicker{width:356px;height:176px;overflow:hidden;position:absolute;background:url(../images/colorpicker_background.png);font-family:Arial,Helvetica,sans-serif;display:none;z-index:999}.colorpicker_color{width:150px;height:150px;left:14px;top:13px;position:absolute;background:#f00;overflow:hidden;cursor:crosshair}.colorpicker_color div{position:absolute;top:0;left:0;width:150px;height:150px;background:url(../images/colorpicker_overlay.png)}.colorpicker_color div div{position:absolute;top:0;left:0;width:11px;height:11px;overflow:hidden;background:url(../images/colorpicker_select.gif);margin:-5px 0 0 -5px}.colorpicker_hue{position:absolute;top:13px;left:171px;width:35px;height:150px;cursor:n-resize}.colorpicker_hue div{position:absolute;width:35px;height:9px;overflow:hidden;background:url(../images/colorpicker_indic.gif) left top;margin:-4px 0 0 0;left:0}.colorpicker_new_color{position:absolute;width:60px;height:30px;left:213px;top:13px;background:#f00}.colorpicker_current_color{position:absolute;width:60px;height:30px;left:283px;top:13px;background:#f00}.colorpicker input{background-color:transparent;border:1px solid transparent;position:absolute;font-size:10px;font-family:Arial,Helvetica,sans-serif;color:#898989;top:4px;right:11px;text-align:right;margin:0;padding:0;height:11px}.colorpicker_hex{position:absolute;width:72px;height:22px;background:url(../images/colorpicker_hex.png) top;left:212px;top:142px}.colorpicker_hex input{right:6px}.colorpicker_field{height:22px;width:62px;background-position:top;position:absolute}.colorpicker_field span{position:absolute;width:12px;height:22px;overflow:hidden;top:0;right:0;cursor:n-resize}.colorpicker_rgb_r{background-image:url(../images/colorpicker_rgb_r.png);top:52px;left:212px}.colorpicker_rgb_g{background-image:url(../images/colorpicker_rgb_g.png);top:82px;left:212px}.colorpicker_rgb_b{background-image:url(../images/colorpicker_rgb_b.png);top:112px;left:212px}.colorpicker_hsb_h{background-image:url(../images/colorpicker_hsb_h.png);top:52px;left:282px}.colorpicker_hsb_s{background-image:url(../images/colorpicker_hsb_s.png);top:82px;left:282px}.colorpicker_hsb_b{background-image:url(../images/colorpicker_hsb_b.png);top:112px;left:282px}.colorpicker_submit{position:absolute;width:22px;height:22px;background:url(../images/colorpicker_submit.png) top;left:322px;top:142px;overflow:hidden}.colorpicker_focus{background-position:center}.colorpicker_hex.colorpicker_focus{background-position:bottom}.colorpicker_submit.colorpicker_focus{background-position:bottom}.colorpicker_slider{background-position:bottom}.colorSelector{position:relative;width:36px;height:36px;left:35%;margin-top:5px;margin-bottom:5px;background:url(../images/select.png)}.colorSelector div{position:absolute;top:3px;left:3px;width:30px;height:30px;background:url(../images/select.png) center} -------------------------------------------------------------------------------- /css/colorpicker.css: -------------------------------------------------------------------------------- 1 | .colorpicker { 2 | width: 356px; 3 | height: 176px; 4 | overflow: hidden; 5 | position: absolute; 6 | background: url(../images/colorpicker_background.png); 7 | font-family: Arial, Helvetica, sans-serif; 8 | display: none; 9 | z-index: 999; 10 | } 11 | .colorpicker_color { 12 | width: 150px; 13 | height: 150px; 14 | left: 14px; 15 | top: 13px; 16 | position: absolute; 17 | background: #f00; 18 | overflow: hidden; 19 | cursor: crosshair; 20 | } 21 | .colorpicker_color div { 22 | position: absolute; 23 | top: 0; 24 | left: 0; 25 | width: 150px; 26 | height: 150px; 27 | background: url(../images/colorpicker_overlay.png); 28 | } 29 | .colorpicker_color div div { 30 | position: absolute; 31 | top: 0; 32 | left: 0; 33 | width: 11px; 34 | height: 11px; 35 | overflow: hidden; 36 | background: url(../images/colorpicker_select.gif); 37 | margin: -5px 0 0 -5px; 38 | } 39 | .colorpicker_hue { 40 | position: absolute; 41 | top: 13px; 42 | left: 171px; 43 | width: 35px; 44 | height: 150px; 45 | cursor: n-resize; 46 | } 47 | .colorpicker_hue div { 48 | position: absolute; 49 | width: 35px; 50 | height: 9px; 51 | overflow: hidden; 52 | background: url(../images/colorpicker_indic.gif) left top; 53 | margin: -4px 0 0 0; 54 | left: 0px; 55 | } 56 | .colorpicker_new_color { 57 | position: absolute; 58 | width: 60px; 59 | height: 30px; 60 | left: 213px; 61 | top: 13px; 62 | background: #f00; 63 | } 64 | .colorpicker_current_color { 65 | position: absolute; 66 | width: 60px; 67 | height: 30px; 68 | left: 283px; 69 | top: 13px; 70 | background: #f00; 71 | } 72 | .colorpicker input { 73 | background-color: transparent; 74 | border: 1px solid transparent; 75 | position: absolute; 76 | font-size: 10px; 77 | font-family: Arial, Helvetica, sans-serif; 78 | color: #898989; 79 | top: 4px; 80 | right: 11px; 81 | text-align: right; 82 | margin: 0; 83 | padding: 0; 84 | height: 11px; 85 | } 86 | .colorpicker_hex { 87 | position: absolute; 88 | width: 72px; 89 | height: 22px; 90 | background: url(../images/colorpicker_hex.png) top; 91 | left: 212px; 92 | top: 142px; 93 | } 94 | .colorpicker_hex input { 95 | right: 6px; 96 | } 97 | .colorpicker_field { 98 | height: 22px; 99 | width: 62px; 100 | background-position: top; 101 | position: absolute; 102 | } 103 | .colorpicker_field span { 104 | position: absolute; 105 | width: 12px; 106 | height: 22px; 107 | overflow: hidden; 108 | top: 0; 109 | right: 0; 110 | cursor: n-resize; 111 | } 112 | .colorpicker_rgb_r { 113 | background-image: url(../images/colorpicker_rgb_r.png); 114 | top: 52px; 115 | left: 212px; 116 | } 117 | .colorpicker_rgb_g { 118 | background-image: url(../images/colorpicker_rgb_g.png); 119 | top: 82px; 120 | left: 212px; 121 | } 122 | .colorpicker_rgb_b { 123 | background-image: url(../images/colorpicker_rgb_b.png); 124 | top: 112px; 125 | left: 212px; 126 | } 127 | .colorpicker_hsb_h { 128 | background-image: url(../images/colorpicker_hsb_h.png); 129 | top: 52px; 130 | left: 282px; 131 | } 132 | .colorpicker_hsb_s { 133 | background-image: url(../images/colorpicker_hsb_s.png); 134 | top: 82px; 135 | left: 282px; 136 | } 137 | .colorpicker_hsb_b { 138 | background-image: url(../images/colorpicker_hsb_b.png); 139 | top: 112px; 140 | left: 282px; 141 | } 142 | .colorpicker_submit { 143 | position: absolute; 144 | width: 22px; 145 | height: 22px; 146 | background: url(../images/colorpicker_submit.png) top; 147 | left: 322px; 148 | top: 142px; 149 | overflow: hidden; 150 | } 151 | .colorpicker_focus { 152 | background-position: center; 153 | } 154 | .colorpicker_hex.colorpicker_focus { 155 | background-position: bottom; 156 | } 157 | .colorpicker_submit.colorpicker_focus { 158 | background-position: bottom; 159 | } 160 | .colorpicker_slider { 161 | background-position: bottom; 162 | } 163 | .colorSelector { 164 | position: relative; 165 | width: 36px; 166 | height: 36px; 167 | left: 35%; 168 | margin-top: 5px; 169 | margin-bottom: 5px; 170 | background: url(../images/select.png); 171 | } 172 | .colorSelector div { 173 | position: absolute; 174 | top: 3px; 175 | left: 3px; 176 | width: 30px; 177 | height: 30px; 178 | background: url(../images/select.png) center; 179 | } -------------------------------------------------------------------------------- /demo/css/colorpicker.css: -------------------------------------------------------------------------------- 1 | .colorpicker { 2 | width: 356px; 3 | height: 176px; 4 | overflow: hidden; 5 | position: absolute; 6 | background: url(../images/colorpicker_background.png); 7 | font-family: Arial, Helvetica, sans-serif; 8 | display: none; 9 | z-index: 999; 10 | } 11 | .colorpicker_color { 12 | width: 150px; 13 | height: 150px; 14 | left: 14px; 15 | top: 13px; 16 | position: absolute; 17 | background: #f00; 18 | overflow: hidden; 19 | cursor: crosshair; 20 | } 21 | .colorpicker_color div { 22 | position: absolute; 23 | top: 0; 24 | left: 0; 25 | width: 150px; 26 | height: 150px; 27 | background: url(../images/colorpicker_overlay.png); 28 | } 29 | .colorpicker_color div div { 30 | position: absolute; 31 | top: 0; 32 | left: 0; 33 | width: 11px; 34 | height: 11px; 35 | overflow: hidden; 36 | background: url(../images/colorpicker_select.gif); 37 | margin: -5px 0 0 -5px; 38 | } 39 | .colorpicker_hue { 40 | position: absolute; 41 | top: 13px; 42 | left: 171px; 43 | width: 35px; 44 | height: 150px; 45 | cursor: n-resize; 46 | } 47 | .colorpicker_hue div { 48 | position: absolute; 49 | width: 35px; 50 | height: 9px; 51 | overflow: hidden; 52 | background: url(../images/colorpicker_indic.gif) left top; 53 | margin: -4px 0 0 0; 54 | left: 0px; 55 | } 56 | .colorpicker_new_color { 57 | position: absolute; 58 | width: 60px; 59 | height: 30px; 60 | left: 213px; 61 | top: 13px; 62 | background: #f00; 63 | } 64 | .colorpicker_current_color { 65 | position: absolute; 66 | width: 60px; 67 | height: 30px; 68 | left: 283px; 69 | top: 13px; 70 | background: #f00; 71 | } 72 | .colorpicker input { 73 | background-color: transparent; 74 | border: 1px solid transparent; 75 | position: absolute; 76 | font-size: 10px; 77 | font-family: Arial, Helvetica, sans-serif; 78 | color: #898989; 79 | top: 4px; 80 | right: 11px; 81 | text-align: right; 82 | margin: 0; 83 | padding: 0; 84 | height: 11px; 85 | } 86 | .colorpicker_hex { 87 | position: absolute; 88 | width: 72px; 89 | height: 22px; 90 | background: url(../images/colorpicker_hex.png) top; 91 | left: 212px; 92 | top: 142px; 93 | } 94 | .colorpicker_hex input { 95 | right: 6px; 96 | } 97 | .colorpicker_field { 98 | height: 22px; 99 | width: 62px; 100 | background-position: top; 101 | position: absolute; 102 | } 103 | .colorpicker_field span { 104 | position: absolute; 105 | width: 12px; 106 | height: 22px; 107 | overflow: hidden; 108 | top: 0; 109 | right: 0; 110 | cursor: n-resize; 111 | } 112 | .colorpicker_rgb_r { 113 | background-image: url(../images/colorpicker_rgb_r.png); 114 | top: 52px; 115 | left: 212px; 116 | } 117 | .colorpicker_rgb_g { 118 | background-image: url(../images/colorpicker_rgb_g.png); 119 | top: 82px; 120 | left: 212px; 121 | } 122 | .colorpicker_rgb_b { 123 | background-image: url(../images/colorpicker_rgb_b.png); 124 | top: 112px; 125 | left: 212px; 126 | } 127 | .colorpicker_hsb_h { 128 | background-image: url(../images/colorpicker_hsb_h.png); 129 | top: 52px; 130 | left: 282px; 131 | } 132 | .colorpicker_hsb_s { 133 | background-image: url(../images/colorpicker_hsb_s.png); 134 | top: 82px; 135 | left: 282px; 136 | } 137 | .colorpicker_hsb_b { 138 | background-image: url(../images/colorpicker_hsb_b.png); 139 | top: 112px; 140 | left: 282px; 141 | } 142 | .colorpicker_submit { 143 | position: absolute; 144 | width: 22px; 145 | height: 22px; 146 | background: url(../images/colorpicker_submit.png) top; 147 | left: 322px; 148 | top: 142px; 149 | overflow: hidden; 150 | } 151 | .colorpicker_focus { 152 | background-position: center; 153 | } 154 | .colorpicker_hex.colorpicker_focus { 155 | background-position: bottom; 156 | } 157 | .colorpicker_submit.colorpicker_focus { 158 | background-position: bottom; 159 | } 160 | .colorpicker_slider { 161 | background-position: bottom; 162 | } 163 | .colorSelector { 164 | position: relative; 165 | width: 36px; 166 | height: 36px; 167 | left: 35%; 168 | margin-top: 5px; 169 | margin-bottom: 5px; 170 | background: url(../images/select.png); 171 | } 172 | .colorSelector div { 173 | position: absolute; 174 | top: 3px; 175 | left: 3px; 176 | width: 30px; 177 | height: 30px; 178 | background: url(../images/select.png) center; 179 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #ColorPicker 2 | 3 | This is **yet another colorpicker** plugin for jQuery since most of them are not on GitHub nor being mantained at the moment. 4 | 5 | The plugin is a fork of the one developed by Stefan Petre who seems not to be interested in it anymore. I needed a powerfull colorpicker for one of my projects so I updated it and then thought it would be nice if it would were freely available. 6 | 7 | You can see the [demo][] now. 8 | 9 | ##Features 10 | 11 | - Flat model - as element in page, attached to an input and custom widget. 12 | - Powerful controls for color selection 13 | - Easy to customize the look by changing some images 14 | - Fits into the viewport 15 | - Powerful callback system to totally control the way it works 16 | 17 | ##License 18 | 19 | The plugin is currently dual licensed under the MIT and GPL licenses. 20 | 21 | ##Implement 22 | 23 | Attach the Javascript and CSS files to your document. Edit CSS file and fix the paths to images and change colors to fit your site theme. 24 | 25 | 26 | 27 | 28 | ##How to use 29 | 30 | All you have to do, is to select the elements in a jQuery way and call the plugin over them. 31 | 32 | $('input').ColorPicker(options); 33 | 34 | ##Options 35 | An object containing parameters. Please, note that all parameters are optional. 36 | 37 | > **eventName** (*string*): This is the desired event to trigger the colorpicker. Default: 'click' 38 | 39 | > **color** (*string* or *object*): The default color. String for hex color or hash for RGB and HSB ({r:255, r:0, b:0}) . Default: 'ff0000' 40 | 41 | > **flat** (*boolean*): Whether if the color picker is appended to the element or triggered by an event. Default false 42 | 43 | > **livePreview** (*boolean*): Whether if the color values are filled in the fields while changing values on selector or a field. If false it may improve speed. Default true 44 | 45 | > **onShow** (*function*): Callback function triggered when the colorpicker is shown 46 | 47 | > **onBeforeShow** (*function*) Callback function triggered before the colorpicker is shown 48 | 49 | > **onHide** (*function*): Callback function triggered when the colorpicker is hidden 50 | 51 | > **onChange** (*function*): Callback function triggered when the color is changed 52 | 53 | > **onSubmit** (*function*): Callback function triggered when the color is chosen 54 | 55 | ##Methods 56 | 57 | If you want to set a new color. 58 | 59 | $('input').ColorPickerSetColor(color); 60 | 61 | The 'color' argument is the same format as the option color, string for hex color or object for RGB and HSB ({r:255, r:0, b:0}). 62 | 63 | ##Examples 64 | 65 | ###Flat mode 66 | 67 | $('#colorpickerholder').ColorPicker({flat: true}); 68 | 69 | Custom skin and using flat mode to display the color picker in a custom widget. 70 | 71 | $('#colorpickerholder2').ColorPicker({ 72 | flat: true, 73 | color: '#EFEFEF', 74 | onSubmit: function(hsb, hex, rgb) { 75 | $('#colorselector div').css('backgroundColor', '#' + hex); 76 | } 77 | }); 78 | 79 | 80 | Attached to a text field and using callback functions to update the color with field's value and set the value back in the field by submiting the color. 81 | 82 | $('#colorpickerfield').ColorPicker({ 83 | onSubmit: function(hsb, hex, rgb, el, parent) { 84 | $(el).val(hex); 85 | $(el).ColorPickerHide(); 86 | }, 87 | onBeforeShow: function () { 88 | $(this).ColorPickerSetColor(this.value); 89 | } 90 | }) 91 | .bind('keyup', function(){ 92 | $(this).ColorPickerSetColor(this.value); 93 | }); 94 | 95 | Attached to DOM and using callbacks to live preview the color and adding animation. 96 | 97 | $('#colorselector2').ColorPicker({ 98 | color: '#EFEFEF', 99 | onShow: function (colpkr) { 100 | $(colpkr).fadeIn(500); 101 | return false; 102 | }, 103 | onHide: function (colpkr) { 104 | $(colpkr).fadeOut(500); 105 | return false; 106 | }, 107 | onChange: function (hsb, hex, rgb) { 108 | $('#colorselector2 div').css('backgroundColor', '#' + hex); 109 | } 110 | }); 111 | [demo]: http://belelros.github.com/jQuery-ColorPicker/ "View the demo now!" -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | jQuery ColorPicker - Yet another jQuery ColorPicker 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Fork me on GitHub 13 | 14 |
15 |

jQuery ColorPicker

16 |
17 |

ColorPicker

18 | 19 |

This is yet another colorpicker plugin for jQuery since most of them are not on GitHub nor being mantained at the moment.

20 | 21 |

The plugin is a fork of the one developed by Stefan Petre who seems not to be interested in it anymore. I needed a powerfull colorpicker for one of my projects so I updated it and then thought it would be nice if it would were freely available.

22 | 23 |

Features

24 | 25 |
    26 |
  • Flat model - as element in page, attached to an input and custom widget.
  • 27 |
  • Powerful controls for color selection
  • 28 |
  • Easy to customize the look by changing some images
  • 29 |
  • Fits into the viewport
  • 30 |
  • Powerful callback system to totally control the way it works
  • 31 |
32 | 33 |

License

34 | 35 |

The plugin is currently dual licensed under the MIT and GPL licenses.

36 | 37 |

Implement

38 | 39 |

Attach the Javascript and CSS files to your document. Edit CSS file and fix the paths to images and change colors to fit your site theme.

40 | 41 |
 42 |     <link rel="stylesheet" media="screen" type="text/css" href="css/colorpicker.css" />
 43 |     <script src="js/colorpicker.js"></script>
 44 |             
45 | 46 |

How to use

47 | 48 |

All you have to do, is to select the elements in a jQuery way and call the plugin over them.

49 | 50 |
    $('input').ColorPicker(options); 
51 | 52 |

Options

53 | 54 |

An object containing parameters. Please, note that all parameters are optional.

55 | 56 |
57 |

eventName (string): This is the desired event to trigger the colorpicker. Default: 'click'

58 | 59 |

color (string or object): The default color. String for hex color or hash for RGB and HSB ({r:255, r:0, b:0}) . Default: 'ff0000'

60 | 61 |

flat (boolean): Whether if the color picker is appended to the element or triggered by an event. Default false

62 | 63 |

livePreview (boolean): Whether if the color values are filled in the fields while changing values on selector or a field. If false it may improve speed. Default true

64 | 65 |

onShow (function): Callback function triggered when the colorpicker is shown

66 | 67 |

onBeforeShow (function) Callback function triggered before the colorpicker is shown

68 | 69 |

onHide (function): Callback function triggered when the colorpicker is hidden

70 | 71 |

onChange (function): Callback function triggered when the color is changed

72 | 73 |

onSubmit (function): Callback function triggered when the color is chosen

74 |
75 | 76 |

Methods

77 | 78 |

If you want to set a new color.

79 | 80 |
    $('input').ColorPickerSetColor(color);
 81 |             
82 | 83 |

The 'color' argument is the same format as the option color, string for hex color or object for RGB and HSB ({r:255, r:0, b:0}). 84 |

85 |

Examples

86 | 87 |

Flat mode

88 | 89 |
   $('#colorpickerholder').ColorPicker({flat: true}); 
90 |
91 |

Custom skin and using flat mode to display the color picker in a custom widget.

92 | 93 |
 94 |     $('#colorpickerholder2').ColorPicker({
 95 |         flat: true,
 96 |         color: '#EFEFEF',
 97 |         onSubmit: function(hsb, hex, rgb) {
 98 |             $('#colorselector div').css('backgroundColor', '#' + hex);
 99 |         }
100 |     });
101 |             
102 |
103 |
104 |
105 |
106 |
107 |

Attached to a text field and using callback functions to update the color with field's value and set the value back in the field by submiting the color.

108 | 109 |
110 |     $('#colorpickerfield').ColorPicker({
111 |         onSubmit: function(hsb, hex, rgb, el, parent) {
112 |             $(el).val(hex);
113 |             $(el).ColorPickerHide();
114 |         },
115 |         onBeforeShow: function () {
116 |             $(this).ColorPickerSetColor(this.value);
117 |         }
118 |     })
119 |     .bind('keyup', function(){
120 |         $(this).ColorPickerSetColor(this.value);
121 |     });
122 |             
123 |

124 |

Attached to DOM and using callbacks to live preview the color and adding animation.

125 | 126 |
127 |     $('#colorselector2').ColorPicker({
128 |         color: '#EFEFEF',
129 |         onShow: function (colpkr) {
130 |             $(colpkr).fadeIn(500);
131 |             return false;
132 |         },
133 |         onHide: function (colpkr) {
134 |             $(colpkr).fadeOut(500);
135 |             return false;
136 |         },
137 |         onChange: function (hsb, hex, rgb) {
138 |             $('#colorSelector div').css('backgroundColor', '#' + hex);
139 |         }
140 |     });
141 |             
142 |
143 |
144 |
145 | 146 | 147 | 190 | 191 | -------------------------------------------------------------------------------- /colorpicker.min.js: -------------------------------------------------------------------------------- 1 | (function(a){var b=function(){var b={},c,d=65,e,f='
',g={eventName:"click",onShow:function(){},onBeforeShow:function(){},onHide:function(){},onChange:function(){},onSubmit:function(){},color:"ff0000",livePreview:!0,flat:!1},h=function(b,c){var d=O(b);a(c).data("colorpicker").fields.eq(1).val(d.r).end().eq(2).val(d.g).end().eq(3).val(d.b).end()},i=function(b,c){a(c).data("colorpicker").fields.eq(4).val(b.h).end().eq(5).val(b.s).end().eq(6).val(b.b).end()},j=function(b,c){a(c).data("colorpicker").fields.eq(0).val(Q(b)).end()},k=function(b,c){a(c).data("colorpicker").selector.css("backgroundColor","#"+Q({h:b.h,s:100,b:100})),a(c).data("colorpicker").selectorIndic.css({left:parseInt(150*b.s/100,10),top:parseInt(150*(100-b.b)/100,10)})},l=function(b,c){a(c).data("colorpicker").hue.css("top",parseInt(150-150*b.h/360,10))},m=function(b,c){a(c).data("colorpicker").currentColor.css("backgroundColor","#"+Q(b))},n=function(b,c){a(c).data("colorpicker").newColor.css("backgroundColor","#"+Q(b))},o=function(b){var c=b.charCode||b.keyCode||-1;if(c>d&&c<=90||c==32)return!1;var e=a(this).parent().parent();e.data("colorpicker").livePreview===!0&&p.apply(this)},p=function(b){var c=a(this).parent().parent(),d;this.parentNode.className.indexOf("_hex")>0?c.data("colorpicker").color=d=M(K(this.value)):this.parentNode.className.indexOf("_hsb")>0?c.data("colorpicker").color=d=I({h:parseInt(c.data("colorpicker").fields.eq(4).val(),10),s:parseInt(c.data("colorpicker").fields.eq(5).val(),10),b:parseInt(c.data("colorpicker").fields.eq(6).val(),10)}):c.data("colorpicker").color=d=N(J({r:parseInt(c.data("colorpicker").fields.eq(1).val(),10),g:parseInt(c.data("colorpicker").fields.eq(2).val(),10),b:parseInt(c.data("colorpicker").fields.eq(3).val(),10)})),b&&(h(d,c.get(0)),j(d,c.get(0)),i(d,c.get(0))),k(d,c.get(0)),l(d,c.get(0)),n(d,c.get(0)),c.data("colorpicker").onChange.apply(c,[d,Q(d),O(d)])},q=function(b){var c=a(this).parent().parent();c.data("colorpicker").fields.parent().removeClass("colorpicker_focus")},r=function(){d=this.parentNode.className.indexOf("_hex")>0?70:65,a(this).parent().parent().data("colorpicker").fields.parent().removeClass("colorpicker_focus"),a(this).parent().addClass("colorpicker_focus")},s=function(b){var c=a(this).parent().find("input").focus(),d={el:a(this).parent().addClass("colorpicker_slider"),max:this.parentNode.className.indexOf("_hsb_h")>0?360:this.parentNode.className.indexOf("_hsb")>0?100:255,y:b.pageY,field:c,val:parseInt(c.val(),10),preview:a(this).parent().parent().data("colorpicker").livePreview};a(document).bind("mouseup",d,u),a(document).bind("mousemove",d,t)},t=function(a){return a.data.field.val(Math.max(0,Math.min(a.data.max,parseInt(a.data.val+a.pageY-a.data.y,10)))),a.data.preview&&p.apply(a.data.field.get(0),[!0]),!1},u=function(b){return p.apply(b.data.field.get(0),[!0]),b.data.el.removeClass("colorpicker_slider").find("input").focus(),a(document).unbind("mouseup",u),a(document).unbind("mousemove",t),!1},v=function(b){var c={cal:a(this).parent(),y:a(this).offset().top};c.preview=c.cal.data("colorpicker").livePreview,a(document).bind("mouseup",c,x),a(document).bind("mousemove",c,w)},w=function(a){return p.apply(a.data.cal.data("colorpicker").fields.eq(4).val(parseInt(360*(150-Math.max(0,Math.min(150,a.pageY-a.data.y)))/150,10)).get(0),[a.data.preview]),!1},x=function(b){return h(b.data.cal.data("colorpicker").color,b.data.cal.get(0)),j(b.data.cal.data("colorpicker").color,b.data.cal.get(0)),a(document).unbind("mouseup",x),a(document).unbind("mousemove",w),!1},y=function(b){var c={cal:a(this).parent(),pos:a(this).offset()};c.preview=c.cal.data("colorpicker").livePreview,a(document).bind("mouseup",c,A),a(document).bind("mousemove",c,z)},z=function(a){return p.apply(a.data.cal.data("colorpicker").fields.eq(6).val(parseInt(100*(150-Math.max(0,Math.min(150,a.pageY-a.data.pos.top)))/150,10)).end().eq(5).val(parseInt(100*Math.max(0,Math.min(150,a.pageX-a.data.pos.left))/150,10)).get(0),[a.data.preview]),!1},A=function(b){return h(b.data.cal.data("colorpicker").color,b.data.cal.get(0)),j(b.data.cal.data("colorpicker").color,b.data.cal.get(0)),a(document).unbind("mouseup",A),a(document).unbind("mousemove",z),!1},B=function(b){a(this).addClass("colorpicker_focus")},C=function(b){a(this).removeClass("colorpicker_focus")},D=function(b){var c=a(this).parent(),d=c.data("colorpicker").color;c.data("colorpicker").origColor=d,m(d,c.get(0)),c.data("colorpicker").onSubmit(d,Q(d),O(d),c.data("colorpicker").el,c.data("colorpicker").parent)},E=function(b){var c=a("#"+a(this).data("colorpickerId"));c.data("colorpicker").onBeforeShow.apply(this,[c.get(0)]);var d=a(this).offset(),e=H(),f=d.top+this.offsetHeight,g=d.left;return f+176>e.t+e.h&&(f-=this.offsetHeight+176),g+356>e.l+e.w&&(g-=356),c.css({left:g+"px",top:f+"px"}),c.data("colorpicker").onShow.apply(this,[c.get(0)])!=0&&c.show(),a(document).bind("mousedown",{cal:c},F),!1},F=function(b){G(b.data.cal.get(0),b.target,b.data.cal.get(0))||(b.data.cal.data("colorpicker").onHide.apply(this,[b.data.cal.get(0)])!=0&&b.data.cal.hide(),a(document).unbind("mousedown",F))},G=function(a,b,c){if(a==b)return!0;if(a.contains)return a.contains(b);if(a.compareDocumentPosition)return!!(a.compareDocumentPosition(b)&16);var d=b.parentNode;while(d&&d!=c){if(d==a)return!0;d=d.parentNode}return!1},H=function(){var a=document.compatMode=="CSS1Compat";return{l:window.pageXOffset||(a?document.documentElement.scrollLeft:document.body.scrollLeft),t:window.pageYOffset||(a?document.documentElement.scrollTop:document.body.scrollTop),w:window.innerWidth||(a?document.documentElement.clientWidth:document.body.clientWidth),h:window.innerHeight||(a?document.documentElement.clientHeight:document.body.clientHeight)}},I=function(a){return{h:Math.min(360,Math.max(0,a.h)),s:Math.min(100,Math.max(0,a.s)),b:Math.min(100,Math.max(0,a.b))}},J=function(a){return{r:Math.min(255,Math.max(0,a.r)),g:Math.min(255,Math.max(0,a.g)),b:Math.min(255,Math.max(0,a.b))}},K=function(a){var b=6-a.length;if(b>0){var c=[];for(var d=0;d-1?a.substring(1):a,16);return{r:a>>16,g:(a&65280)>>8,b:a&255}},M=function(a){return N(L(a))},N=function(a){var b={h:0,s:0,b:0},c=Math.min(a.r,a.g,a.b),d=Math.max(a.r,a.g,a.b),e=d-c;return b.b=d,d==0,b.s=d!=0?255*e/d:0,b.s!=0?a.r==d?b.h=(a.g-a.b)/e:a.g==d?b.h=2+(a.b-a.r)/e:b.h=4+(a.r-a.g)/e:b.h=-1,b.h*=60,b.h<0&&(b.h+=360),b.s*=100/255,b.b*=100/255,b},O=function(a){var b={},c=Math.round(a.h),d=Math.round(a.s*255/100),e=Math.round(a.b*255/100);if(d==0)b.r=b.g=b.b=e;else{var f=e,g=(255-d)*e/255,h=(f-g)*(c%60)/60;c==360&&(c=0),c<60?(b.r=f,b.b=g,b.g=g+h):c<120?(b.g=f,b.b=g,b.r=f-h):c<180?(b.g=f,b.r=g,b.b=g+h):c<240?(b.b=f,b.r=g,b.g=f-h):c<300?(b.b=f,b.g=g,b.r=g+h):c<360?(b.r=f,b.g=g,b.b=f-h):(b.r=0,b.g=0,b.b=0)}return{r:Math.round(b.r),g:Math.round(b.g),b:Math.round(b.b)}},P=function(b){var c=[b.r.toString(16),b.g.toString(16),b.b.toString(16)];return a.each(c,function(a,b){b.length==1&&(c[a]="0"+b)}),c.join("")},Q=function(a){return P(O(a))},R=function(){var b=a(this).parent(),c=b.data("colorpicker").origColor;b.data("colorpicker").color=c,h(c,b.get(0)),j(c,b.get(0)),i(c,b.get(0)),k(c,b.get(0)),l(c,b.get(0)),n(c,b.get(0))};return{init:function(b){b=a.extend({},g,b||{});if(typeof b.color=="string")b.color=M(b.color);else if(b.color.r!=undefined&&b.color.g!=undefined&&b.color.b!=undefined)b.color=N(b.color);else{if(b.color.h==undefined||b.color.s==undefined||b.color.b==undefined)return this;b.color=I(b.color)}return this.each(function(){if(!a(this).data("colorpickerId")){var c=a.extend({},b);c.origColor=b.color;var d="collorpicker_"+parseInt(Math.random()*1e3);a(this).data("colorpickerId",d),c.parent=a(this);var e=a(f);e.attr("id",d).attr("data-parent",a(this).attr("id")),c.flat?e.appendTo(this).show():e.appendTo(document.body),c.fields=e.find("input").bind("keyup",o).bind("change",p).bind("blur",q).bind("focus",r),e.find("span").bind("mousedown",s).end().find(">div.colorpicker_current_color").bind("click",R),c.selector=e.find("div.colorpicker_color").bind("mousedown",y),c.selectorIndic=c.selector.find("div div"),c.el=this,c.hue=e.find("div.colorpicker_hue div"),e.find("div.colorpicker_hue").bind("mousedown",v),c.newColor=e.find("div.colorpicker_new_color"),c.currentColor=e.find("div.colorpicker_current_color"),e.data("colorpicker",c),e.find("div.colorpicker_submit").bind("mouseenter",B).bind("mouseleave",C).bind("click",D),h(c.color,e.get(0)),i(c.color,e.get(0)),j(c.color,e.get(0)),l(c.color,e.get(0)),k(c.color,e.get(0)),m(c.color,e.get(0)),n(c.color,e.get(0)),c.flat?e.css({position:"relative",display:"block"}):a(this).bind(c.eventName,E)}})},showPicker:function(){return this.each(function(){a(this).data("colorpickerId")&&E.apply(this)})},hidePicker:function(){return this.each(function(){a(this).data("colorpickerId")&&a("#"+a(this).data("colorpickerId")).hide()})},setColor:function(b){if(typeof b=="string")b=M(b);else if(b.r!=undefined&&b.g!=undefined&&b.b!=undefined)b=N(b);else{if(b.h==undefined||b.s==undefined||b.b==undefined)return this;b=I(b)}return this.each(function(){if(a(this).data("colorpickerId")){var c=a("#"+a(this).data("colorpickerId"));c.data("colorpicker").color=b,c.data("colorpicker").origColor=b,h(b,c.get(0)),i(b,c.get(0)),j(b,c.get(0)),l(b,c.get(0)),k(b,c.get(0)),m(b,c.get(0)),n(b,c.get(0))}})}}}();a.fn.extend({ColorPicker:b.init,ColorPickerHide:b.hidePicker,ColorPickerShow:b.showPicker,ColorPickerSetColor:b.setColor})})(jQuery); -------------------------------------------------------------------------------- /colorpicker.js: -------------------------------------------------------------------------------- 1 | (function ($) { 2 | var ColorPicker = function () { 3 | var 4 | ids = {}, 5 | inAction, 6 | charMin = 65, 7 | visible, 8 | tpl = '
', 9 | defaults = { 10 | eventName: 'click', 11 | onShow: function () {}, 12 | onBeforeShow: function(){}, 13 | onHide: function () {}, 14 | onChange: function () {}, 15 | onSubmit: function () {}, 16 | color: 'ff0000', 17 | livePreview: true, 18 | flat: false 19 | }, 20 | fillRGBFields = function (hsb, cal) { 21 | var rgb = HSBToRGB(hsb); 22 | $(cal).data('colorpicker').fields 23 | .eq(1).val(rgb.r).end() 24 | .eq(2).val(rgb.g).end() 25 | .eq(3).val(rgb.b).end(); 26 | }, 27 | fillHSBFields = function (hsb, cal) { 28 | $(cal).data('colorpicker').fields 29 | .eq(4).val(hsb.h).end() 30 | .eq(5).val(hsb.s).end() 31 | .eq(6).val(hsb.b).end(); 32 | }, 33 | fillHexFields = function (hsb, cal) { 34 | $(cal).data('colorpicker').fields 35 | .eq(0).val(HSBToHex(hsb)).end(); 36 | }, 37 | setSelector = function (hsb, cal) { 38 | $(cal).data('colorpicker').selector.css('backgroundColor', '#' + HSBToHex({h: hsb.h, s: 100, b: 100})); 39 | $(cal).data('colorpicker').selectorIndic.css({ 40 | left: parseInt(150 * hsb.s/100, 10), 41 | top: parseInt(150 * (100-hsb.b)/100, 10) 42 | }); 43 | }, 44 | setHue = function (hsb, cal) { 45 | $(cal).data('colorpicker').hue.css('top', parseInt(150 - 150 * hsb.h/360, 10)); 46 | }, 47 | setCurrentColor = function (hsb, cal) { 48 | $(cal).data('colorpicker').currentColor.css('backgroundColor', '#' + HSBToHex(hsb)); 49 | }, 50 | setNewColor = function (hsb, cal) { 51 | $(cal).data('colorpicker').newColor.css('backgroundColor', '#' + HSBToHex(hsb)); 52 | }, 53 | keyDown = function (ev) { 54 | var pressedKey = ev.charCode || ev.keyCode || -1; 55 | if ((pressedKey > charMin && pressedKey <= 90) || pressedKey == 32) { 56 | return false; 57 | } 58 | var cal = $(this).parent().parent(); 59 | if (cal.data('colorpicker').livePreview === true) { 60 | change.apply(this); 61 | } 62 | }, 63 | change = function (ev) { 64 | var cal = $(this).parent().parent(), col; 65 | if (this.parentNode.className.indexOf('_hex') > 0) { 66 | cal.data('colorpicker').color = col = HexToHSB(fixHex(this.value)); 67 | } else if (this.parentNode.className.indexOf('_hsb') > 0) { 68 | cal.data('colorpicker').color = col = fixHSB({ 69 | h: parseInt(cal.data('colorpicker').fields.eq(4).val(), 10), 70 | s: parseInt(cal.data('colorpicker').fields.eq(5).val(), 10), 71 | b: parseInt(cal.data('colorpicker').fields.eq(6).val(), 10) 72 | }); 73 | } else { 74 | cal.data('colorpicker').color = col = RGBToHSB(fixRGB({ 75 | r: parseInt(cal.data('colorpicker').fields.eq(1).val(), 10), 76 | g: parseInt(cal.data('colorpicker').fields.eq(2).val(), 10), 77 | b: parseInt(cal.data('colorpicker').fields.eq(3).val(), 10) 78 | })); 79 | } 80 | if (ev) { 81 | fillRGBFields(col, cal.get(0)); 82 | fillHexFields(col, cal.get(0)); 83 | fillHSBFields(col, cal.get(0)); 84 | } 85 | setSelector(col, cal.get(0)); 86 | setHue(col, cal.get(0)); 87 | setNewColor(col, cal.get(0)); 88 | cal.data('colorpicker').onChange.apply(cal, [col, HSBToHex(col), HSBToRGB(col)]); 89 | }, 90 | blur = function (ev) { 91 | var cal = $(this).parent().parent(); 92 | cal.data('colorpicker').fields.parent().removeClass('colorpicker_focus'); 93 | }, 94 | focus = function () { 95 | charMin = this.parentNode.className.indexOf('_hex') > 0 ? 70 : 65; 96 | $(this).parent().parent().data('colorpicker').fields.parent().removeClass('colorpicker_focus'); 97 | $(this).parent().addClass('colorpicker_focus'); 98 | }, 99 | downIncrement = function (ev) { 100 | var field = $(this).parent().find('input').focus(); 101 | var current = { 102 | el: $(this).parent().addClass('colorpicker_slider'), 103 | max: this.parentNode.className.indexOf('_hsb_h') > 0 ? 360 : (this.parentNode.className.indexOf('_hsb') > 0 ? 100 : 255), 104 | y: ev.pageY, 105 | field: field, 106 | val: parseInt(field.val(), 10), 107 | preview: $(this).parent().parent().data('colorpicker').livePreview 108 | }; 109 | $(document).bind('mouseup', current, upIncrement); 110 | $(document).bind('mousemove', current, moveIncrement); 111 | }, 112 | moveIncrement = function (ev) { 113 | ev.data.field.val(Math.max(0, Math.min(ev.data.max, parseInt(ev.data.val + ev.pageY - ev.data.y, 10)))); 114 | if (ev.data.preview) { 115 | change.apply(ev.data.field.get(0), [true]); 116 | } 117 | return false; 118 | }, 119 | upIncrement = function (ev) { 120 | change.apply(ev.data.field.get(0), [true]); 121 | ev.data.el.removeClass('colorpicker_slider').find('input').focus(); 122 | $(document).unbind('mouseup', upIncrement); 123 | $(document).unbind('mousemove', moveIncrement); 124 | return false; 125 | }, 126 | downHue = function (ev) { 127 | var current = { 128 | cal: $(this).parent(), 129 | y: $(this).offset().top 130 | }; 131 | current.preview = current.cal.data('colorpicker').livePreview; 132 | $(document).bind('mouseup', current, upHue); 133 | $(document).bind('mousemove', current, moveHue); 134 | }, 135 | moveHue = function (ev) { 136 | change.apply( 137 | ev.data.cal.data('colorpicker') 138 | .fields 139 | .eq(4) 140 | .val(parseInt(360*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.y))))/150, 10)) 141 | .get(0), 142 | [ev.data.preview] 143 | ); 144 | return false; 145 | }, 146 | upHue = function (ev) { 147 | fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0)); 148 | fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0)); 149 | $(document).unbind('mouseup', upHue); 150 | $(document).unbind('mousemove', moveHue); 151 | return false; 152 | }, 153 | downSelector = function (ev) { 154 | var current = { 155 | cal: $(this).parent(), 156 | pos: $(this).offset() 157 | }; 158 | current.preview = current.cal.data('colorpicker').livePreview; 159 | $(document).bind('mouseup', current, upSelector); 160 | $(document).bind('mousemove', current, moveSelector); 161 | }, 162 | moveSelector = function (ev) { 163 | change.apply( 164 | ev.data.cal.data('colorpicker') 165 | .fields 166 | .eq(6) 167 | .val(parseInt(100*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.pos.top))))/150, 10)) 168 | .end() 169 | .eq(5) 170 | .val(parseInt(100*(Math.max(0,Math.min(150,(ev.pageX - ev.data.pos.left))))/150, 10)) 171 | .get(0), 172 | [ev.data.preview] 173 | ); 174 | return false; 175 | }, 176 | upSelector = function (ev) { 177 | fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0)); 178 | fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0)); 179 | $(document).unbind('mouseup', upSelector); 180 | $(document).unbind('mousemove', moveSelector); 181 | return false; 182 | }, 183 | enterSubmit = function (ev) { 184 | $(this).addClass('colorpicker_focus'); 185 | }, 186 | leaveSubmit = function (ev) { 187 | $(this).removeClass('colorpicker_focus'); 188 | }, 189 | clickSubmit = function (ev) { 190 | var cal = $(this).parent(); 191 | var col = cal.data('colorpicker').color; 192 | cal.data('colorpicker').origColor = col; 193 | setCurrentColor(col, cal.get(0)); 194 | cal.data('colorpicker').onSubmit(col, HSBToHex(col), HSBToRGB(col), cal.data('colorpicker').el, cal.data('colorpicker').parent); 195 | }, 196 | show = function (ev) { 197 | var cal = $('#' + $(this).data('colorpickerId')); 198 | cal.data('colorpicker').onBeforeShow.apply(this, [cal.get(0)]); 199 | var pos = $(this).offset(); 200 | var viewPort = getViewport(); 201 | var top = pos.top + this.offsetHeight; 202 | var left = pos.left; 203 | if (top + 176 > viewPort.t + viewPort.h) { 204 | top -= this.offsetHeight + 176; 205 | } 206 | if (left + 356 > viewPort.l + viewPort.w) { 207 | left -= 356; 208 | } 209 | cal.css({left: left + 'px', top: top + 'px'}); 210 | if (cal.data('colorpicker').onShow.apply(this, [cal.get(0)]) != false) { 211 | cal.show(); 212 | } 213 | $(document).bind('mousedown', {cal: cal}, hide); 214 | return false; 215 | }, 216 | hide = function (ev) { 217 | if (!isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) { 218 | if (ev.data.cal.data('colorpicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) { 219 | ev.data.cal.hide(); 220 | } 221 | $(document).unbind('mousedown', hide); 222 | } 223 | }, 224 | isChildOf = function(parentEl, el, container) { 225 | if (parentEl == el) { 226 | return true; 227 | } 228 | if (parentEl.contains) { 229 | return parentEl.contains(el); 230 | } 231 | if ( parentEl.compareDocumentPosition ) { 232 | return !!(parentEl.compareDocumentPosition(el) & 16); 233 | } 234 | var prEl = el.parentNode; 235 | while(prEl && prEl != container) { 236 | if (prEl == parentEl) 237 | return true; 238 | prEl = prEl.parentNode; 239 | } 240 | return false; 241 | }, 242 | getViewport = function () { 243 | var m = document.compatMode == 'CSS1Compat'; 244 | return { 245 | l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft), 246 | t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop), 247 | w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth), 248 | h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight) 249 | }; 250 | }, 251 | fixHSB = function (hsb) { 252 | return { 253 | h: Math.min(360, Math.max(0, hsb.h)), 254 | s: Math.min(100, Math.max(0, hsb.s)), 255 | b: Math.min(100, Math.max(0, hsb.b)) 256 | }; 257 | }, 258 | fixRGB = function (rgb) { 259 | return { 260 | r: Math.min(255, Math.max(0, rgb.r)), 261 | g: Math.min(255, Math.max(0, rgb.g)), 262 | b: Math.min(255, Math.max(0, rgb.b)) 263 | }; 264 | }, 265 | fixHex = function (hex) { 266 | var len = 6 - hex.length; 267 | if (len > 0) { 268 | var o = []; 269 | for (var i=0; i -1) ? hex.substring(1) : hex), 16); 279 | return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)}; 280 | }, 281 | HexToHSB = function (hex) { 282 | return RGBToHSB(HexToRGB(hex)); 283 | }, 284 | RGBToHSB = function (rgb) { 285 | var hsb = { 286 | h: 0, 287 | s: 0, 288 | b: 0 289 | }; 290 | var min = Math.min(rgb.r, rgb.g, rgb.b); 291 | var max = Math.max(rgb.r, rgb.g, rgb.b); 292 | var delta = max - min; 293 | hsb.b = max; 294 | if (max != 0) { 295 | 296 | } 297 | hsb.s = max != 0 ? 255 * delta / max : 0; 298 | if (hsb.s != 0) { 299 | if (rgb.r == max) { 300 | hsb.h = (rgb.g - rgb.b) / delta; 301 | } else if (rgb.g == max) { 302 | hsb.h = 2 + (rgb.b - rgb.r) / delta; 303 | } else { 304 | hsb.h = 4 + (rgb.r - rgb.g) / delta; 305 | } 306 | } else { 307 | hsb.h = -1; 308 | } 309 | hsb.h *= 60; 310 | if (hsb.h < 0) { 311 | hsb.h += 360; 312 | } 313 | hsb.s *= 100/255; 314 | hsb.b *= 100/255; 315 | return hsb; 316 | }, 317 | HSBToRGB = function (hsb) { 318 | var rgb = {}; 319 | var h = Math.round(hsb.h); 320 | var s = Math.round(hsb.s*255/100); 321 | var v = Math.round(hsb.b*255/100); 322 | if(s == 0) { 323 | rgb.r = rgb.g = rgb.b = v; 324 | } else { 325 | var t1 = v; 326 | var t2 = (255-s)*v/255; 327 | var t3 = (t1-t2)*(h%60)/60; 328 | if(h==360) h = 0; 329 | if(h<60) {rgb.r=t1; rgb.b=t2; rgb.g=t2+t3} 330 | else if(h<120) {rgb.g=t1; rgb.b=t2; rgb.r=t1-t3} 331 | else if(h<180) {rgb.g=t1; rgb.r=t2; rgb.b=t2+t3} 332 | else if(h<240) {rgb.b=t1; rgb.r=t2; rgb.g=t1-t3} 333 | else if(h<300) {rgb.b=t1; rgb.g=t2; rgb.r=t2+t3} 334 | else if(h<360) {rgb.r=t1; rgb.g=t2; rgb.b=t1-t3} 335 | else {rgb.r=0; rgb.g=0; rgb.b=0} 336 | } 337 | return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)}; 338 | }, 339 | RGBToHex = function (rgb) { 340 | var hex = [ 341 | rgb.r.toString(16), 342 | rgb.g.toString(16), 343 | rgb.b.toString(16) 344 | ]; 345 | $.each(hex, function (nr, val) { 346 | if (val.length == 1) { 347 | hex[nr] = '0' + val; 348 | } 349 | }); 350 | return hex.join(''); 351 | }, 352 | HSBToHex = function (hsb) { 353 | return RGBToHex(HSBToRGB(hsb)); 354 | }, 355 | restoreOriginal = function () { 356 | var cal = $(this).parent(); 357 | var col = cal.data('colorpicker').origColor; 358 | cal.data('colorpicker').color = col; 359 | fillRGBFields(col, cal.get(0)); 360 | fillHexFields(col, cal.get(0)); 361 | fillHSBFields(col, cal.get(0)); 362 | setSelector(col, cal.get(0)); 363 | setHue(col, cal.get(0)); 364 | setNewColor(col, cal.get(0)); 365 | }; 366 | return { 367 | init: function (opt) { 368 | opt = $.extend({}, defaults, opt||{}); 369 | if (typeof opt.color == 'string') { 370 | opt.color = HexToHSB(opt.color); 371 | } else if (opt.color.r != undefined && opt.color.g != undefined && opt.color.b != undefined) { 372 | opt.color = RGBToHSB(opt.color); 373 | } else if (opt.color.h != undefined && opt.color.s != undefined && opt.color.b != undefined) { 374 | opt.color = fixHSB(opt.color); 375 | } else { 376 | return this; 377 | } 378 | return this.each(function () { 379 | if (!$(this).data('colorpickerId')) { 380 | var options = $.extend({}, opt); 381 | options.origColor = opt.color; 382 | var id = 'collorpicker_' + parseInt(Math.random() * 1000); 383 | $(this).data('colorpickerId', id); 384 | options.parent = $(this); 385 | var cal = $(tpl); 386 | cal.attr('id', id).attr('data-parent', $(this).attr('id')); 387 | if (options.flat) { 388 | cal.appendTo(this).show(); 389 | } else { 390 | cal.appendTo(document.body); 391 | } 392 | options.fields = cal 393 | .find('input') 394 | .bind('keyup', keyDown) 395 | .bind('change', change) 396 | .bind('blur', blur) 397 | .bind('focus', focus); 398 | cal 399 | .find('span').bind('mousedown', downIncrement).end() 400 | .find('>div.colorpicker_current_color').bind('click', restoreOriginal); 401 | options.selector = cal.find('div.colorpicker_color').bind('mousedown', downSelector); 402 | options.selectorIndic = options.selector.find('div div'); 403 | options.el = this; 404 | options.hue = cal.find('div.colorpicker_hue div'); 405 | cal.find('div.colorpicker_hue').bind('mousedown', downHue); 406 | options.newColor = cal.find('div.colorpicker_new_color'); 407 | options.currentColor = cal.find('div.colorpicker_current_color'); 408 | cal.data('colorpicker', options); 409 | cal.find('div.colorpicker_submit') 410 | .bind('mouseenter', enterSubmit) 411 | .bind('mouseleave', leaveSubmit) 412 | .bind('click', clickSubmit); 413 | fillRGBFields(options.color, cal.get(0)); 414 | fillHSBFields(options.color, cal.get(0)); 415 | fillHexFields(options.color, cal.get(0)); 416 | setHue(options.color, cal.get(0)); 417 | setSelector(options.color, cal.get(0)); 418 | setCurrentColor(options.color, cal.get(0)); 419 | setNewColor(options.color, cal.get(0)); 420 | if (options.flat) { 421 | cal.css({ 422 | position: 'relative', 423 | display: 'block' 424 | }); 425 | } else { 426 | $(this).bind(options.eventName, show); 427 | } 428 | } 429 | }); 430 | }, 431 | showPicker: function() { 432 | return this.each( function () { 433 | if ($(this).data('colorpickerId')) { 434 | show.apply(this); 435 | } 436 | }); 437 | }, 438 | hidePicker: function() { 439 | return this.each( function () { 440 | if ($(this).data('colorpickerId')) { 441 | $('#' + $(this).data('colorpickerId')).hide(); 442 | } 443 | }); 444 | }, 445 | setColor: function(col) { 446 | if (typeof col == 'string') { 447 | col = HexToHSB(col); 448 | } else if (col.r != undefined && col.g != undefined && col.b != undefined) { 449 | col = RGBToHSB(col); 450 | } else if (col.h != undefined && col.s != undefined && col.b != undefined) { 451 | col = fixHSB(col); 452 | } else { 453 | return this; 454 | } 455 | return this.each(function(){ 456 | if ($(this).data('colorpickerId')) { 457 | var cal = $('#' + $(this).data('colorpickerId')); 458 | cal.data('colorpicker').color = col; 459 | cal.data('colorpicker').origColor = col; 460 | fillRGBFields(col, cal.get(0)); 461 | fillHSBFields(col, cal.get(0)); 462 | fillHexFields(col, cal.get(0)); 463 | setHue(col, cal.get(0)); 464 | setSelector(col, cal.get(0)); 465 | setCurrentColor(col, cal.get(0)); 466 | setNewColor(col, cal.get(0)); 467 | } 468 | }); 469 | } 470 | }; 471 | }(); 472 | $.fn.extend({ 473 | ColorPicker: ColorPicker.init, 474 | ColorPickerHide: ColorPicker.hidePicker, 475 | ColorPickerShow: ColorPicker.showPicker, 476 | ColorPickerSetColor: ColorPicker.setColor 477 | }); 478 | })(jQuery); -------------------------------------------------------------------------------- /demo/js/colorpicker.js: -------------------------------------------------------------------------------- 1 | (function ($) { 2 | var ColorPicker = function () { 3 | var 4 | ids = {}, 5 | inAction, 6 | charMin = 65, 7 | visible, 8 | tpl = '
', 9 | defaults = { 10 | eventName: 'click', 11 | onShow: function () {}, 12 | onBeforeShow: function(){}, 13 | onHide: function () {}, 14 | onChange: function () {}, 15 | onSubmit: function () {}, 16 | color: 'ff0000', 17 | livePreview: true, 18 | flat: false 19 | }, 20 | fillRGBFields = function (hsb, cal) { 21 | var rgb = HSBToRGB(hsb); 22 | $(cal).data('colorpicker').fields 23 | .eq(1).val(rgb.r).end() 24 | .eq(2).val(rgb.g).end() 25 | .eq(3).val(rgb.b).end(); 26 | }, 27 | fillHSBFields = function (hsb, cal) { 28 | $(cal).data('colorpicker').fields 29 | .eq(4).val(hsb.h).end() 30 | .eq(5).val(hsb.s).end() 31 | .eq(6).val(hsb.b).end(); 32 | }, 33 | fillHexFields = function (hsb, cal) { 34 | $(cal).data('colorpicker').fields 35 | .eq(0).val(HSBToHex(hsb)).end(); 36 | }, 37 | setSelector = function (hsb, cal) { 38 | $(cal).data('colorpicker').selector.css('backgroundColor', '#' + HSBToHex({h: hsb.h, s: 100, b: 100})); 39 | $(cal).data('colorpicker').selectorIndic.css({ 40 | left: parseInt(150 * hsb.s/100, 10), 41 | top: parseInt(150 * (100-hsb.b)/100, 10) 42 | }); 43 | }, 44 | setHue = function (hsb, cal) { 45 | $(cal).data('colorpicker').hue.css('top', parseInt(150 - 150 * hsb.h/360, 10)); 46 | }, 47 | setCurrentColor = function (hsb, cal) { 48 | $(cal).data('colorpicker').currentColor.css('backgroundColor', '#' + HSBToHex(hsb)); 49 | }, 50 | setNewColor = function (hsb, cal) { 51 | $(cal).data('colorpicker').newColor.css('backgroundColor', '#' + HSBToHex(hsb)); 52 | }, 53 | keyDown = function (ev) { 54 | var pressedKey = ev.charCode || ev.keyCode || -1; 55 | if ((pressedKey > charMin && pressedKey <= 90) || pressedKey == 32) { 56 | return false; 57 | } 58 | var cal = $(this).parent().parent(); 59 | if (cal.data('colorpicker').livePreview === true) { 60 | change.apply(this); 61 | } 62 | }, 63 | change = function (ev) { 64 | var cal = $(this).parent().parent(), col; 65 | if (this.parentNode.className.indexOf('_hex') > 0) { 66 | cal.data('colorpicker').color = col = HexToHSB(fixHex(this.value)); 67 | } else if (this.parentNode.className.indexOf('_hsb') > 0) { 68 | cal.data('colorpicker').color = col = fixHSB({ 69 | h: parseInt(cal.data('colorpicker').fields.eq(4).val(), 10), 70 | s: parseInt(cal.data('colorpicker').fields.eq(5).val(), 10), 71 | b: parseInt(cal.data('colorpicker').fields.eq(6).val(), 10) 72 | }); 73 | } else { 74 | cal.data('colorpicker').color = col = RGBToHSB(fixRGB({ 75 | r: parseInt(cal.data('colorpicker').fields.eq(1).val(), 10), 76 | g: parseInt(cal.data('colorpicker').fields.eq(2).val(), 10), 77 | b: parseInt(cal.data('colorpicker').fields.eq(3).val(), 10) 78 | })); 79 | } 80 | if (ev) { 81 | fillRGBFields(col, cal.get(0)); 82 | fillHexFields(col, cal.get(0)); 83 | fillHSBFields(col, cal.get(0)); 84 | } 85 | setSelector(col, cal.get(0)); 86 | setHue(col, cal.get(0)); 87 | setNewColor(col, cal.get(0)); 88 | cal.data('colorpicker').onChange.apply(cal, [col, HSBToHex(col), HSBToRGB(col)]); 89 | }, 90 | blur = function (ev) { 91 | var cal = $(this).parent().parent(); 92 | cal.data('colorpicker').fields.parent().removeClass('colorpicker_focus'); 93 | }, 94 | focus = function () { 95 | charMin = this.parentNode.className.indexOf('_hex') > 0 ? 70 : 65; 96 | $(this).parent().parent().data('colorpicker').fields.parent().removeClass('colorpicker_focus'); 97 | $(this).parent().addClass('colorpicker_focus'); 98 | }, 99 | downIncrement = function (ev) { 100 | var field = $(this).parent().find('input').focus(); 101 | var current = { 102 | el: $(this).parent().addClass('colorpicker_slider'), 103 | max: this.parentNode.className.indexOf('_hsb_h') > 0 ? 360 : (this.parentNode.className.indexOf('_hsb') > 0 ? 100 : 255), 104 | y: ev.pageY, 105 | field: field, 106 | val: parseInt(field.val(), 10), 107 | preview: $(this).parent().parent().data('colorpicker').livePreview 108 | }; 109 | $(document).bind('mouseup', current, upIncrement); 110 | $(document).bind('mousemove', current, moveIncrement); 111 | }, 112 | moveIncrement = function (ev) { 113 | ev.data.field.val(Math.max(0, Math.min(ev.data.max, parseInt(ev.data.val + ev.pageY - ev.data.y, 10)))); 114 | if (ev.data.preview) { 115 | change.apply(ev.data.field.get(0), [true]); 116 | } 117 | return false; 118 | }, 119 | upIncrement = function (ev) { 120 | change.apply(ev.data.field.get(0), [true]); 121 | ev.data.el.removeClass('colorpicker_slider').find('input').focus(); 122 | $(document).unbind('mouseup', upIncrement); 123 | $(document).unbind('mousemove', moveIncrement); 124 | return false; 125 | }, 126 | downHue = function (ev) { 127 | var current = { 128 | cal: $(this).parent(), 129 | y: $(this).offset().top 130 | }; 131 | current.preview = current.cal.data('colorpicker').livePreview; 132 | $(document).bind('mouseup', current, upHue); 133 | $(document).bind('mousemove', current, moveHue); 134 | }, 135 | moveHue = function (ev) { 136 | change.apply( 137 | ev.data.cal.data('colorpicker') 138 | .fields 139 | .eq(4) 140 | .val(parseInt(360*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.y))))/150, 10)) 141 | .get(0), 142 | [ev.data.preview] 143 | ); 144 | return false; 145 | }, 146 | upHue = function (ev) { 147 | fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0)); 148 | fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0)); 149 | $(document).unbind('mouseup', upHue); 150 | $(document).unbind('mousemove', moveHue); 151 | return false; 152 | }, 153 | downSelector = function (ev) { 154 | var current = { 155 | cal: $(this).parent(), 156 | pos: $(this).offset() 157 | }; 158 | current.preview = current.cal.data('colorpicker').livePreview; 159 | $(document).bind('mouseup', current, upSelector); 160 | $(document).bind('mousemove', current, moveSelector); 161 | }, 162 | moveSelector = function (ev) { 163 | change.apply( 164 | ev.data.cal.data('colorpicker') 165 | .fields 166 | .eq(6) 167 | .val(parseInt(100*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.pos.top))))/150, 10)) 168 | .end() 169 | .eq(5) 170 | .val(parseInt(100*(Math.max(0,Math.min(150,(ev.pageX - ev.data.pos.left))))/150, 10)) 171 | .get(0), 172 | [ev.data.preview] 173 | ); 174 | return false; 175 | }, 176 | upSelector = function (ev) { 177 | fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0)); 178 | fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0)); 179 | $(document).unbind('mouseup', upSelector); 180 | $(document).unbind('mousemove', moveSelector); 181 | return false; 182 | }, 183 | enterSubmit = function (ev) { 184 | $(this).addClass('colorpicker_focus'); 185 | }, 186 | leaveSubmit = function (ev) { 187 | $(this).removeClass('colorpicker_focus'); 188 | }, 189 | clickSubmit = function (ev) { 190 | var cal = $(this).parent(); 191 | var col = cal.data('colorpicker').color; 192 | cal.data('colorpicker').origColor = col; 193 | setCurrentColor(col, cal.get(0)); 194 | cal.data('colorpicker').onSubmit(col, HSBToHex(col), HSBToRGB(col), cal.data('colorpicker').el, cal.data('colorpicker').parent); 195 | }, 196 | show = function (ev) { 197 | var cal = $('#' + $(this).data('colorpickerId')); 198 | cal.data('colorpicker').onBeforeShow.apply(this, [cal.get(0)]); 199 | var pos = $(this).offset(); 200 | var viewPort = getViewport(); 201 | var top = pos.top + this.offsetHeight; 202 | var left = pos.left; 203 | if (top + 176 > viewPort.t + viewPort.h) { 204 | top -= this.offsetHeight + 176; 205 | } 206 | if (left + 356 > viewPort.l + viewPort.w) { 207 | left -= 356; 208 | } 209 | cal.css({left: left + 'px', top: top + 'px'}); 210 | if (cal.data('colorpicker').onShow.apply(this, [cal.get(0)]) != false) { 211 | cal.show(); 212 | } 213 | $(document).bind('mousedown', {cal: cal}, hide); 214 | return false; 215 | }, 216 | hide = function (ev) { 217 | if (!isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) { 218 | if (ev.data.cal.data('colorpicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) { 219 | ev.data.cal.hide(); 220 | } 221 | $(document).unbind('mousedown', hide); 222 | } 223 | }, 224 | isChildOf = function(parentEl, el, container) { 225 | if (parentEl == el) { 226 | return true; 227 | } 228 | if (parentEl.contains) { 229 | return parentEl.contains(el); 230 | } 231 | if ( parentEl.compareDocumentPosition ) { 232 | return !!(parentEl.compareDocumentPosition(el) & 16); 233 | } 234 | var prEl = el.parentNode; 235 | while(prEl && prEl != container) { 236 | if (prEl == parentEl) 237 | return true; 238 | prEl = prEl.parentNode; 239 | } 240 | return false; 241 | }, 242 | getViewport = function () { 243 | var m = document.compatMode == 'CSS1Compat'; 244 | return { 245 | l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft), 246 | t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop), 247 | w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth), 248 | h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight) 249 | }; 250 | }, 251 | fixHSB = function (hsb) { 252 | return { 253 | h: Math.min(360, Math.max(0, hsb.h)), 254 | s: Math.min(100, Math.max(0, hsb.s)), 255 | b: Math.min(100, Math.max(0, hsb.b)) 256 | }; 257 | }, 258 | fixRGB = function (rgb) { 259 | return { 260 | r: Math.min(255, Math.max(0, rgb.r)), 261 | g: Math.min(255, Math.max(0, rgb.g)), 262 | b: Math.min(255, Math.max(0, rgb.b)) 263 | }; 264 | }, 265 | fixHex = function (hex) { 266 | var len = 6 - hex.length; 267 | if (len > 0) { 268 | var o = []; 269 | for (var i=0; i -1) ? hex.substring(1) : hex), 16); 279 | return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)}; 280 | }, 281 | HexToHSB = function (hex) { 282 | return RGBToHSB(HexToRGB(hex)); 283 | }, 284 | RGBToHSB = function (rgb) { 285 | var hsb = { 286 | h: 0, 287 | s: 0, 288 | b: 0 289 | }; 290 | var min = Math.min(rgb.r, rgb.g, rgb.b); 291 | var max = Math.max(rgb.r, rgb.g, rgb.b); 292 | var delta = max - min; 293 | hsb.b = max; 294 | if (max != 0) { 295 | 296 | } 297 | hsb.s = max != 0 ? 255 * delta / max : 0; 298 | if (hsb.s != 0) { 299 | if (rgb.r == max) { 300 | hsb.h = (rgb.g - rgb.b) / delta; 301 | } else if (rgb.g == max) { 302 | hsb.h = 2 + (rgb.b - rgb.r) / delta; 303 | } else { 304 | hsb.h = 4 + (rgb.r - rgb.g) / delta; 305 | } 306 | } else { 307 | hsb.h = -1; 308 | } 309 | hsb.h *= 60; 310 | if (hsb.h < 0) { 311 | hsb.h += 360; 312 | } 313 | hsb.s *= 100/255; 314 | hsb.b *= 100/255; 315 | return hsb; 316 | }, 317 | HSBToRGB = function (hsb) { 318 | var rgb = {}; 319 | var h = Math.round(hsb.h); 320 | var s = Math.round(hsb.s*255/100); 321 | var v = Math.round(hsb.b*255/100); 322 | if(s == 0) { 323 | rgb.r = rgb.g = rgb.b = v; 324 | } else { 325 | var t1 = v; 326 | var t2 = (255-s)*v/255; 327 | var t3 = (t1-t2)*(h%60)/60; 328 | if(h==360) h = 0; 329 | if(h<60) {rgb.r=t1; rgb.b=t2; rgb.g=t2+t3} 330 | else if(h<120) {rgb.g=t1; rgb.b=t2; rgb.r=t1-t3} 331 | else if(h<180) {rgb.g=t1; rgb.r=t2; rgb.b=t2+t3} 332 | else if(h<240) {rgb.b=t1; rgb.r=t2; rgb.g=t1-t3} 333 | else if(h<300) {rgb.b=t1; rgb.g=t2; rgb.r=t2+t3} 334 | else if(h<360) {rgb.r=t1; rgb.g=t2; rgb.b=t1-t3} 335 | else {rgb.r=0; rgb.g=0; rgb.b=0} 336 | } 337 | return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)}; 338 | }, 339 | RGBToHex = function (rgb) { 340 | var hex = [ 341 | rgb.r.toString(16), 342 | rgb.g.toString(16), 343 | rgb.b.toString(16) 344 | ]; 345 | $.each(hex, function (nr, val) { 346 | if (val.length == 1) { 347 | hex[nr] = '0' + val; 348 | } 349 | }); 350 | return hex.join(''); 351 | }, 352 | HSBToHex = function (hsb) { 353 | return RGBToHex(HSBToRGB(hsb)); 354 | }, 355 | restoreOriginal = function () { 356 | var cal = $(this).parent(); 357 | var col = cal.data('colorpicker').origColor; 358 | cal.data('colorpicker').color = col; 359 | fillRGBFields(col, cal.get(0)); 360 | fillHexFields(col, cal.get(0)); 361 | fillHSBFields(col, cal.get(0)); 362 | setSelector(col, cal.get(0)); 363 | setHue(col, cal.get(0)); 364 | setNewColor(col, cal.get(0)); 365 | }; 366 | return { 367 | init: function (opt) { 368 | opt = $.extend({}, defaults, opt||{}); 369 | if (typeof opt.color == 'string') { 370 | opt.color = HexToHSB(opt.color); 371 | } else if (opt.color.r != undefined && opt.color.g != undefined && opt.color.b != undefined) { 372 | opt.color = RGBToHSB(opt.color); 373 | } else if (opt.color.h != undefined && opt.color.s != undefined && opt.color.b != undefined) { 374 | opt.color = fixHSB(opt.color); 375 | } else { 376 | return this; 377 | } 378 | return this.each(function () { 379 | if (!$(this).data('colorpickerId')) { 380 | var options = $.extend({}, opt); 381 | options.origColor = opt.color; 382 | var id = 'collorpicker_' + parseInt(Math.random() * 1000); 383 | $(this).data('colorpickerId', id); 384 | options.parent = $(this); 385 | var cal = $(tpl); 386 | cal.attr('id', id).attr('data-parent', $(this).attr('id')); 387 | if (options.flat) { 388 | cal.appendTo(this).show(); 389 | } else { 390 | cal.appendTo(document.body); 391 | } 392 | options.fields = cal 393 | .find('input') 394 | .bind('keyup', keyDown) 395 | .bind('change', change) 396 | .bind('blur', blur) 397 | .bind('focus', focus); 398 | cal 399 | .find('span').bind('mousedown', downIncrement).end() 400 | .find('>div.colorpicker_current_color').bind('click', restoreOriginal); 401 | options.selector = cal.find('div.colorpicker_color').bind('mousedown', downSelector); 402 | options.selectorIndic = options.selector.find('div div'); 403 | options.el = this; 404 | options.hue = cal.find('div.colorpicker_hue div'); 405 | cal.find('div.colorpicker_hue').bind('mousedown', downHue); 406 | options.newColor = cal.find('div.colorpicker_new_color'); 407 | options.currentColor = cal.find('div.colorpicker_current_color'); 408 | cal.data('colorpicker', options); 409 | cal.find('div.colorpicker_submit') 410 | .bind('mouseenter', enterSubmit) 411 | .bind('mouseleave', leaveSubmit) 412 | .bind('click', clickSubmit); 413 | fillRGBFields(options.color, cal.get(0)); 414 | fillHSBFields(options.color, cal.get(0)); 415 | fillHexFields(options.color, cal.get(0)); 416 | setHue(options.color, cal.get(0)); 417 | setSelector(options.color, cal.get(0)); 418 | setCurrentColor(options.color, cal.get(0)); 419 | setNewColor(options.color, cal.get(0)); 420 | if (options.flat) { 421 | cal.css({ 422 | position: 'relative', 423 | display: 'block' 424 | }); 425 | } else { 426 | $(this).bind(options.eventName, show); 427 | } 428 | } 429 | }); 430 | }, 431 | showPicker: function() { 432 | return this.each( function () { 433 | if ($(this).data('colorpickerId')) { 434 | show.apply(this); 435 | } 436 | }); 437 | }, 438 | hidePicker: function() { 439 | return this.each( function () { 440 | if ($(this).data('colorpickerId')) { 441 | $('#' + $(this).data('colorpickerId')).hide(); 442 | } 443 | }); 444 | }, 445 | setColor: function(col) { 446 | if (typeof col == 'string') { 447 | col = HexToHSB(col); 448 | } else if (col.r != undefined && col.g != undefined && col.b != undefined) { 449 | col = RGBToHSB(col); 450 | } else if (col.h != undefined && col.s != undefined && col.b != undefined) { 451 | col = fixHSB(col); 452 | } else { 453 | return this; 454 | } 455 | return this.each(function(){ 456 | if ($(this).data('colorpickerId')) { 457 | var cal = $('#' + $(this).data('colorpickerId')); 458 | cal.data('colorpicker').color = col; 459 | cal.data('colorpicker').origColor = col; 460 | fillRGBFields(col, cal.get(0)); 461 | fillHSBFields(col, cal.get(0)); 462 | fillHexFields(col, cal.get(0)); 463 | setHue(col, cal.get(0)); 464 | setSelector(col, cal.get(0)); 465 | setCurrentColor(col, cal.get(0)); 466 | setNewColor(col, cal.get(0)); 467 | } 468 | }); 469 | } 470 | }; 471 | }(); 472 | $.fn.extend({ 473 | ColorPicker: ColorPicker.init, 474 | ColorPickerHide: ColorPicker.hidePicker, 475 | ColorPickerShow: ColorPicker.showPicker, 476 | ColorPickerSetColor: ColorPicker.setColor 477 | }); 478 | })(jQuery); --------------------------------------------------------------------------------