From 0907ae6916205cdfef5ad4aaf826a5f1be703335 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Mischler=20=28aka=20skarab=29?=
 <skarab@bluewin.ch>
Date: Mon, 21 Mar 2016 09:22:42 +0100
Subject: [PATCH] add bootstrap colorpicker

---
 .../css/bootstrap-colorpicker.css             |  261 ++++
 .../css/bootstrap-colorpicker.min.css         |    9 +
 .../alpha-horizontal.png                      |  Bin 0 -> 3635 bytes
 .../img/bootstrap-colorpicker/alpha.png       |  Bin 0 -> 3271 bytes
 .../bootstrap-colorpicker/hue-horizontal.png  |  Bin 0 -> 2837 bytes
 .../img/bootstrap-colorpicker/hue.png         |  Bin 0 -> 2972 bytes
 .../img/bootstrap-colorpicker/saturation.png  |  Bin 0 -> 8817 bytes
 .../js/bootstrap-colorpicker.js               | 1087 +++++++++++++++++
 .../js/bootstrap-colorpicker.min.js           |    1 +
 9 files changed, 1358 insertions(+)
 create mode 100644 vendor/bootstrap-colorpicker/css/bootstrap-colorpicker.css
 create mode 100644 vendor/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css
 create mode 100644 vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/alpha-horizontal.png
 create mode 100644 vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/alpha.png
 create mode 100644 vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/hue-horizontal.png
 create mode 100644 vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/hue.png
 create mode 100644 vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/saturation.png
 create mode 100644 vendor/bootstrap-colorpicker/js/bootstrap-colorpicker.js
 create mode 100644 vendor/bootstrap-colorpicker/js/bootstrap-colorpicker.min.js

diff --git a/vendor/bootstrap-colorpicker/css/bootstrap-colorpicker.css b/vendor/bootstrap-colorpicker/css/bootstrap-colorpicker.css
new file mode 100644
index 0000000..3f8ba1c
--- /dev/null
+++ b/vendor/bootstrap-colorpicker/css/bootstrap-colorpicker.css
@@ -0,0 +1,261 @@
+/*!
+ * Bootstrap Colorpicker
+ * http://mjolnic.github.io/bootstrap-colorpicker/
+ *
+ * Originally written by (c) 2012 Stefan Petre
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0.txt
+ *
+ */
+
+.colorpicker-saturation {
+  float: left;
+  width: 100px;
+  height: 100px;
+  cursor: crosshair;
+  background-image: url("../img/bootstrap-colorpicker/saturation.png");
+}
+
+.colorpicker-saturation i {
+  position: absolute;
+  top: 0;
+  left: 0;
+  display: block;
+  width: 5px;
+  height: 5px;
+  margin: -4px 0 0 -4px;
+  border: 1px solid #000;
+  -webkit-border-radius: 5px;
+     -moz-border-radius: 5px;
+          border-radius: 5px;
+}
+
+.colorpicker-saturation i b {
+  display: block;
+  width: 5px;
+  height: 5px;
+  border: 1px solid #fff;
+  -webkit-border-radius: 5px;
+     -moz-border-radius: 5px;
+          border-radius: 5px;
+}
+
+.colorpicker-hue,
+.colorpicker-alpha {
+  float: left;
+  width: 15px;
+  height: 100px;
+  margin-bottom: 4px;
+  margin-left: 4px;
+  cursor: row-resize;
+}
+
+.colorpicker-hue i,
+.colorpicker-alpha i {
+  position: absolute;
+  top: 0;
+  left: 0;
+  display: block;
+  width: 100%;
+  height: 1px;
+  margin-top: -1px;
+  background: #000;
+  border-top: 1px solid #fff;
+}
+
+.colorpicker-hue {
+  background-image: url("../img/bootstrap-colorpicker/hue.png");
+}
+
+.colorpicker-alpha {
+  display: none;
+  background-image: url("../img/bootstrap-colorpicker/alpha.png");
+}
+
+.colorpicker-saturation,
+.colorpicker-hue,
+.colorpicker-alpha {
+  background-size: contain;
+}
+
+.colorpicker {
+  top: 0;
+  left: 0;
+  z-index: 2500;
+  min-width: 130px;
+  padding: 4px;
+  margin-top: 1px;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  *zoom: 1;
+}
+
+.colorpicker:before,
+.colorpicker:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.colorpicker:after {
+  clear: both;
+}
+
+.colorpicker:before {
+  position: absolute;
+  top: -7px;
+  left: 6px;
+  display: inline-block;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-left: 7px solid transparent;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  content: '';
+}
+
+.colorpicker:after {
+  position: absolute;
+  top: -6px;
+  left: 7px;
+  display: inline-block;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  border-left: 6px solid transparent;
+  content: '';
+}
+
+.colorpicker div {
+  position: relative;
+}
+
+.colorpicker.colorpicker-with-alpha {
+  min-width: 140px;
+}
+
+.colorpicker.colorpicker-with-alpha .colorpicker-alpha {
+  display: block;
+}
+
+.colorpicker-color {
+  height: 10px;
+  margin-top: 5px;
+  clear: both;
+  background-image: url("../img/bootstrap-colorpicker/alpha.png");
+  background-position: 0 100%;
+}
+
+.colorpicker-color div {
+  height: 10px;
+}
+
+.colorpicker-selectors {
+  display: none;
+  height: 10px;
+  margin-top: 5px;
+  clear: both;
+}
+
+.colorpicker-selectors i {
+  float: left;
+  width: 10px;
+  height: 10px;
+  cursor: pointer;
+}
+
+.colorpicker-selectors i + i {
+  margin-left: 3px;
+}
+
+.colorpicker-element .input-group-addon i,
+.colorpicker-element .add-on i {
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  vertical-align: text-top;
+  cursor: pointer;
+}
+
+.colorpicker.colorpicker-inline {
+  position: relative;
+  z-index: auto;
+  display: inline-block;
+  float: none;
+}
+
+.colorpicker.colorpicker-horizontal {
+  width: 110px;
+  height: auto;
+  min-width: 110px;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-saturation {
+  margin-bottom: 4px;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-color {
+  width: 100px;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-hue,
+.colorpicker.colorpicker-horizontal .colorpicker-alpha {
+  float: left;
+  width: 100px;
+  height: 15px;
+  margin-bottom: 4px;
+  margin-left: 0;
+  cursor: col-resize;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-hue i,
+.colorpicker.colorpicker-horizontal .colorpicker-alpha i {
+  position: absolute;
+  top: 0;
+  left: 0;
+  display: block;
+  width: 1px;
+  height: 15px;
+  margin-top: 0;
+  background: #ffffff;
+  border: none;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-hue {
+  background-image: url("../img/bootstrap-colorpicker/hue-horizontal.png");
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-alpha {
+  background-image: url("../img/bootstrap-colorpicker/alpha-horizontal.png");
+}
+
+.colorpicker.colorpicker-hidden {
+  display: none;
+}
+
+.colorpicker.colorpicker-visible {
+  display: block;
+}
+
+.colorpicker-inline.colorpicker-visible {
+  display: inline-block;
+}
+
+.colorpicker-right:before {
+  right: 6px;
+  left: auto;
+}
+
+.colorpicker-right:after {
+  right: 7px;
+  left: auto;
+}
+
+.colorpicker-no-arrow:before {
+  border-right: 0;
+  border-left: 0;
+}
+
+.colorpicker-no-arrow:after {
+  border-right: 0;
+  border-left: 0;
+}
\ No newline at end of file
diff --git a/vendor/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css b/vendor/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css
new file mode 100644
index 0000000..28a8718
--- /dev/null
+++ b/vendor/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Colorpicker
+ * http://mjolnic.github.io/bootstrap-colorpicker/
+ *
+ * Originally written by (c) 2012 Stefan Petre
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0.txt
+ *
+ */.colorpicker-saturation{float:left;width:100px;height:100px;cursor:crosshair;background-image:url("../img/bootstrap-colorpicker/saturation.png")}.colorpicker-saturation i{position:absolute;top:0;left:0;display:block;width:5px;height:5px;margin:-4px 0 0 -4px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-saturation i b{display:block;width:5px;height:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-hue,.colorpicker-alpha{float:left;width:15px;height:100px;margin-bottom:4px;margin-left:4px;cursor:row-resize}.colorpicker-hue i,.colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:100%;height:1px;margin-top:-1px;background:#000;border-top:1px solid #fff}.colorpicker-hue{background-image:url("../img/bootstrap-colorpicker/hue.png")}.colorpicker-alpha{display:none;background-image:url("../img/bootstrap-colorpicker/alpha.png")}.colorpicker-saturation,.colorpicker-hue,.colorpicker-alpha{background-size:contain}.colorpicker{top:0;left:0;z-index:2500;min-width:130px;padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1}.colorpicker:before,.colorpicker:after{display:table;line-height:0;content:""}.colorpicker:after{clear:both}.colorpicker:before{position:absolute;top:-7px;left:6px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.colorpicker:after{position:absolute;top:-6px;left:7px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-image:url("../img/bootstrap-colorpicker/alpha.png");background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-selectors{display:none;height:10px;margin-top:5px;clear:both}.colorpicker-selectors i{float:left;width:10px;height:10px;cursor:pointer}.colorpicker-selectors i+i{margin-left:3px}.colorpicker-element .input-group-addon i,.colorpicker-element .add-on i{display:inline-block;width:16px;height:16px;vertical-align:text-top;cursor:pointer}.colorpicker.colorpicker-inline{position:relative;z-index:auto;display:inline-block;float:none}.colorpicker.colorpicker-horizontal{width:110px;height:auto;min-width:110px}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-hue,.colorpicker.colorpicker-horizontal .colorpicker-alpha{float:left;width:100px;height:15px;margin-bottom:4px;margin-left:0;cursor:col-resize}.colorpicker.colorpicker-horizontal .colorpicker-hue i,.colorpicker.colorpicker-horizontal .colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:1px;height:15px;margin-top:0;background:#fff;border:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url("../img/bootstrap-colorpicker/hue-horizontal.png")}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url("../img/bootstrap-colorpicker/alpha-horizontal.png")}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block}.colorpicker-right:before{right:6px;left:auto}.colorpicker-right:after{right:7px;left:auto}.colorpicker-no-arrow:before{border-right:0;border-left:0}.colorpicker-no-arrow:after{border-right:0;border-left:0}
\ No newline at end of file
diff --git a/vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/alpha-horizontal.png b/vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/alpha-horizontal.png
new file mode 100644
index 0000000000000000000000000000000000000000..d0a65c08b0ed34d969cb0e93165a2e8b0ef9dbd7
GIT binary patch
diff --git a/vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/alpha.png b/vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/alpha.png
new file mode 100644
index 0000000000000000000000000000000000000000..38043f1c85f20fe8ce37ad380bebe2d42d14fb29
GIT binary patch
diff --git a/vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/hue-horizontal.png b/vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/hue-horizontal.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0d9add8e7b12c40e3aef1a095e3ae15ac2e4969
GIT binary patch
diff --git a/vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/hue.png b/vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/hue.png
new file mode 100644
index 0000000000000000000000000000000000000000..d89560e999f86c349ddc78c298b0328293f13e1e
GIT binary patch
diff --git a/vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/saturation.png b/vendor/bootstrap-colorpicker/img/bootstrap-colorpicker/saturation.png
new file mode 100644
index 0000000000000000000000000000000000000000..594ae50ed77608cf6373d6b39e5cacb9f63b7bbe
GIT binary patch
diff --git a/vendor/bootstrap-colorpicker/js/bootstrap-colorpicker.js b/vendor/bootstrap-colorpicker/js/bootstrap-colorpicker.js
new file mode 100644
index 0000000..f02bd43
--- /dev/null
+++ b/vendor/bootstrap-colorpicker/js/bootstrap-colorpicker.js
@@ -0,0 +1,1087 @@
+/*!
+ * Bootstrap Colorpicker
+ * http://mjolnic.github.io/bootstrap-colorpicker/
+ *
+ * Originally written by (c) 2012 Stefan Petre
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0.txt
+ *
+ * @todo Update DOCS
+ */
+
+(function(factory) {
+    "use strict";
+    if (typeof exports === 'object') {
+      module.exports = factory(window.jQuery);
+    } else if (typeof define === 'function' && define.amd) {
+      define(['jquery'], factory);
+    } else if (window.jQuery && !window.jQuery.fn.colorpicker) {
+      factory(window.jQuery);
+    }
+  }
+  (function($) {
+    'use strict';
+
+    // Color object
+    var Color = function(val, customColors) {
+      this.value = {
+        h: 0,
+        s: 0,
+        b: 0,
+        a: 1
+      };
+      this.origFormat = null; // original string format
+      if (customColors) {
+        $.extend(this.colors, customColors);
+      }
+      if (val) {
+        if (val.toLowerCase !== undefined) {
+          // cast to string
+          val = val + '';
+          this.setColor(val);
+        } else if (val.h !== undefined) {
+          this.value = val;
+        }
+      }
+    };
+
+    Color.prototype = {
+      constructor: Color,
+      // 140 predefined colors from the HTML Colors spec
+      colors: {
+        "aliceblue": "#f0f8ff",
+        "antiquewhite": "#faebd7",
+        "aqua": "#00ffff",
+        "aquamarine": "#7fffd4",
+        "azure": "#f0ffff",
+        "beige": "#f5f5dc",
+        "bisque": "#ffe4c4",
+        "black": "#000000",
+        "blanchedalmond": "#ffebcd",
+        "blue": "#0000ff",
+        "blueviolet": "#8a2be2",
+        "brown": "#a52a2a",
+        "burlywood": "#deb887",
+        "cadetblue": "#5f9ea0",
+        "chartreuse": "#7fff00",
+        "chocolate": "#d2691e",
+        "coral": "#ff7f50",
+        "cornflowerblue": "#6495ed",
+        "cornsilk": "#fff8dc",
+        "crimson": "#dc143c",
+        "cyan": "#00ffff",
+        "darkblue": "#00008b",
+        "darkcyan": "#008b8b",
+        "darkgoldenrod": "#b8860b",
+        "darkgray": "#a9a9a9",
+        "darkgreen": "#006400",
+        "darkkhaki": "#bdb76b",
+        "darkmagenta": "#8b008b",
+        "darkolivegreen": "#556b2f",
+        "darkorange": "#ff8c00",
+        "darkorchid": "#9932cc",
+        "darkred": "#8b0000",
+        "darksalmon": "#e9967a",
+        "darkseagreen": "#8fbc8f",
+        "darkslateblue": "#483d8b",
+        "darkslategray": "#2f4f4f",
+        "darkturquoise": "#00ced1",
+        "darkviolet": "#9400d3",
+        "deeppink": "#ff1493",
+        "deepskyblue": "#00bfff",
+        "dimgray": "#696969",
+        "dodgerblue": "#1e90ff",
+        "firebrick": "#b22222",
+        "floralwhite": "#fffaf0",
+        "forestgreen": "#228b22",
+        "fuchsia": "#ff00ff",
+        "gainsboro": "#dcdcdc",
+        "ghostwhite": "#f8f8ff",
+        "gold": "#ffd700",
+        "goldenrod": "#daa520",
+        "gray": "#808080",
+        "green": "#008000",
+        "greenyellow": "#adff2f",
+        "honeydew": "#f0fff0",
+        "hotpink": "#ff69b4",
+        "indianred": "#cd5c5c",
+        "indigo": "#4b0082",
+        "ivory": "#fffff0",
+        "khaki": "#f0e68c",
+        "lavender": "#e6e6fa",
+        "lavenderblush": "#fff0f5",
+        "lawngreen": "#7cfc00",
+        "lemonchiffon": "#fffacd",
+        "lightblue": "#add8e6",
+        "lightcoral": "#f08080",
+        "lightcyan": "#e0ffff",
+        "lightgoldenrodyellow": "#fafad2",
+        "lightgrey": "#d3d3d3",
+        "lightgreen": "#90ee90",
+        "lightpink": "#ffb6c1",
+        "lightsalmon": "#ffa07a",
+        "lightseagreen": "#20b2aa",
+        "lightskyblue": "#87cefa",
+        "lightslategray": "#778899",
+        "lightsteelblue": "#b0c4de",
+        "lightyellow": "#ffffe0",
+        "lime": "#00ff00",
+        "limegreen": "#32cd32",
+        "linen": "#faf0e6",
+        "magenta": "#ff00ff",
+        "maroon": "#800000",
+        "mediumaquamarine": "#66cdaa",
+        "mediumblue": "#0000cd",
+        "mediumorchid": "#ba55d3",
+        "mediumpurple": "#9370d8",
+        "mediumseagreen": "#3cb371",
+        "mediumslateblue": "#7b68ee",
+        "mediumspringgreen": "#00fa9a",
+        "mediumturquoise": "#48d1cc",
+        "mediumvioletred": "#c71585",
+        "midnightblue": "#191970",
+        "mintcream": "#f5fffa",
+        "mistyrose": "#ffe4e1",
+        "moccasin": "#ffe4b5",
+        "navajowhite": "#ffdead",
+        "navy": "#000080",
+        "oldlace": "#fdf5e6",
+        "olive": "#808000",
+        "olivedrab": "#6b8e23",
+        "orange": "#ffa500",
+        "orangered": "#ff4500",
+        "orchid": "#da70d6",
+        "palegoldenrod": "#eee8aa",
+        "palegreen": "#98fb98",
+        "paleturquoise": "#afeeee",
+        "palevioletred": "#d87093",
+        "papayawhip": "#ffefd5",
+        "peachpuff": "#ffdab9",
+        "peru": "#cd853f",
+        "pink": "#ffc0cb",
+        "plum": "#dda0dd",
+        "powderblue": "#b0e0e6",
+        "purple": "#800080",
+        "red": "#ff0000",
+        "rosybrown": "#bc8f8f",
+        "royalblue": "#4169e1",
+        "saddlebrown": "#8b4513",
+        "salmon": "#fa8072",
+        "sandybrown": "#f4a460",
+        "seagreen": "#2e8b57",
+        "seashell": "#fff5ee",
+        "sienna": "#a0522d",
+        "silver": "#c0c0c0",
+        "skyblue": "#87ceeb",
+        "slateblue": "#6a5acd",
+        "slategray": "#708090",
+        "snow": "#fffafa",
+        "springgreen": "#00ff7f",
+        "steelblue": "#4682b4",
+        "tan": "#d2b48c",
+        "teal": "#008080",
+        "thistle": "#d8bfd8",
+        "tomato": "#ff6347",
+        "turquoise": "#40e0d0",
+        "violet": "#ee82ee",
+        "wheat": "#f5deb3",
+        "white": "#ffffff",
+        "whitesmoke": "#f5f5f5",
+        "yellow": "#ffff00",
+        "yellowgreen": "#9acd32",
+        "transparent": "transparent"
+      },
+      _sanitizeNumber: function(val) {
+        if (typeof val === 'number') {
+          return val;
+        }
+        if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) {
+          return 1;
+        }
+        if (val.toLowerCase !== undefined) {
+          return parseFloat(val);
+        }
+        return 1;
+      },
+      isTransparent: function(strVal) {
+        if (!strVal) {
+          return false;
+        }
+        strVal = strVal.toLowerCase().trim();
+        return (strVal === 'transparent') || (strVal.match(/#?00000000/)) || (strVal.match(/(rgba|hsla)\(0,0,0,0?\.?0\)/));
+      },
+      rgbaIsTransparent: function(rgba) {
+        return ((rgba.r === 0) && (rgba.g === 0) && (rgba.b === 0) && (rgba.a === 0));
+      },
+      //parse a string to HSB
+      setColor: function(strVal) {
+        strVal = strVal.toLowerCase().trim();
+        if (strVal) {
+          if (this.isTransparent(strVal)) {
+            this.value = {
+              h: 0,
+              s: 0,
+              b: 0,
+              a: 0
+            };
+          } else {
+            this.value = this.stringToHSB(strVal) || {
+              h: 0,
+              s: 0,
+              b: 0,
+              a: 1
+            }; // if parser fails, defaults to black
+          }
+        }
+      },
+      stringToHSB: function(strVal) {
+        strVal = strVal.toLowerCase();
+        var alias;
+        if (typeof this.colors[strVal] !== 'undefined') {
+          strVal = this.colors[strVal];
+          alias = 'alias';
+        }
+        var that = this,
+          result = false;
+        $.each(this.stringParsers, function(i, parser) {
+          var match = parser.re.exec(strVal),
+            values = match && parser.parse.apply(that, [match]),
+            format = alias || parser.format || 'rgba';
+          if (values) {
+            if (format.match(/hsla?/)) {
+              result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values));
+            } else {
+              result = that.RGBtoHSB.apply(that, values);
+            }
+            that.origFormat = format;
+            return false;
+          }
+          return true;
+        });
+        return result;
+      },
+      setHue: function(h) {
+        this.value.h = 1 - h;
+      },
+      setSaturation: function(s) {
+        this.value.s = s;
+      },
+      setBrightness: function(b) {
+        this.value.b = 1 - b;
+      },
+      setAlpha: function(a) {
+        this.value.a = parseInt((1 - a) * 100, 10) / 100;
+      },
+      toRGB: function(h, s, b, a) {
+        if (!h) {
+          h = this.value.h;
+          s = this.value.s;
+          b = this.value.b;
+        }
+        h *= 360;
+        var R, G, B, X, C;
+        h = (h % 360) / 60;
+        C = b * s;
+        X = C * (1 - Math.abs(h % 2 - 1));
+        R = G = B = b - C;
+
+        h = ~~h;
+        R += [C, X, 0, 0, X, C][h];
+        G += [X, C, C, X, 0, 0][h];
+        B += [0, 0, X, C, C, X][h];
+        return {
+          r: Math.round(R * 255),
+          g: Math.round(G * 255),
+          b: Math.round(B * 255),
+          a: a || this.value.a
+        };
+      },
+      toHex: function(h, s, b, a) {
+        var rgb = this.toRGB(h, s, b, a);
+        if (this.rgbaIsTransparent(rgb)) {
+          return 'transparent';
+        }
+        return '#' + ((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1);
+      },
+      toHSL: function(h, s, b, a) {
+        h = h || this.value.h;
+        s = s || this.value.s;
+        b = b || this.value.b;
+        a = a || this.value.a;
+
+        var H = h,
+          L = (2 - s) * b,
+          S = s * b;
+        if (L > 0 && L <= 1) {
+          S /= L;
+        } else {
+          S /= 2 - L;
+        }
+        L /= 2;
+        if (S > 1) {
+          S = 1;
+        }
+        return {
+          h: isNaN(H) ? 0 : H,
+          s: isNaN(S) ? 0 : S,
+          l: isNaN(L) ? 0 : L,
+          a: isNaN(a) ? 0 : a
+        };
+      },
+      toAlias: function(r, g, b, a) {
+        var rgb = this.toHex(r, g, b, a);
+        for (var alias in this.colors) {
+          if (this.colors[alias] === rgb) {
+            return alias;
+          }
+        }
+        return false;
+      },
+      RGBtoHSB: function(r, g, b, a) {
+        r /= 255;
+        g /= 255;
+        b /= 255;
+
+        var H, S, V, C;
+        V = Math.max(r, g, b);
+        C = V - Math.min(r, g, b);
+        H = (C === 0 ? null :
+          V === r ? (g - b) / C :
+          V === g ? (b - r) / C + 2 :
+          (r - g) / C + 4
+        );
+        H = ((H + 360) % 6) * 60 / 360;
+        S = C === 0 ? 0 : C / V;
+        return {
+          h: this._sanitizeNumber(H),
+          s: S,
+          b: V,
+          a: this._sanitizeNumber(a)
+        };
+      },
+      HueToRGB: function(p, q, h) {
+        if (h < 0) {
+          h += 1;
+        } else if (h > 1) {
+          h -= 1;
+        }
+        if ((h * 6) < 1) {
+          return p + (q - p) * h * 6;
+        } else if ((h * 2) < 1) {
+          return q;
+        } else if ((h * 3) < 2) {
+          return p + (q - p) * ((2 / 3) - h) * 6;
+        } else {
+          return p;
+        }
+      },
+      HSLtoRGB: function(h, s, l, a) {
+        if (s < 0) {
+          s = 0;
+        }
+        var q;
+        if (l <= 0.5) {
+          q = l * (1 + s);
+        } else {
+          q = l + s - (l * s);
+        }
+
+        var p = 2 * l - q;
+
+        var tr = h + (1 / 3);
+        var tg = h;
+        var tb = h - (1 / 3);
+
+        var r = Math.round(this.HueToRGB(p, q, tr) * 255);
+        var g = Math.round(this.HueToRGB(p, q, tg) * 255);
+        var b = Math.round(this.HueToRGB(p, q, tb) * 255);
+        return [r, g, b, this._sanitizeNumber(a)];
+      },
+      toString: function(format) {
+        format = format || 'rgba';
+        var c = false;
+        switch (format) {
+          case 'rgb':
+            {
+              c = this.toRGB();
+              if (this.rgbaIsTransparent(c)) {
+                return 'transparent';
+              }
+              return 'rgb(' + c.r + ',' + c.g + ',' + c.b + ')';
+            }
+            break;
+          case 'rgba':
+            {
+              c = this.toRGB();
+              return 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + c.a + ')';
+            }
+            break;
+          case 'hsl':
+            {
+              c = this.toHSL();
+              return 'hsl(' + Math.round(c.h * 360) + ',' + Math.round(c.s * 100) + '%,' + Math.round(c.l * 100) + '%)';
+            }
+            break;
+          case 'hsla':
+            {
+              c = this.toHSL();
+              return 'hsla(' + Math.round(c.h * 360) + ',' + Math.round(c.s * 100) + '%,' + Math.round(c.l * 100) + '%,' + c.a + ')';
+            }
+            break;
+          case 'hex':
+            {
+              return this.toHex();
+            }
+            break;
+          case 'alias':
+            return this.toAlias() || this.toHex();
+          default:
+            {
+              return c;
+            }
+            break;
+        }
+      },
+      // a set of RE's that can match strings and generate color tuples.
+      // from John Resig color plugin
+      // https://github.com/jquery/jquery-color/
+      stringParsers: [{
+        re: /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/,
+        format: 'rgb',
+        parse: function(execResult) {
+          return [
+            execResult[1],
+            execResult[2],
+            execResult[3],
+            1
+          ];
+        }
+      }, {
+        re: /rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,
+        format: 'rgb',
+        parse: function(execResult) {
+          return [
+            2.55 * execResult[1],
+            2.55 * execResult[2],
+            2.55 * execResult[3],
+            1
+          ];
+        }
+      }, {
+        re: /rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+        format: 'rgba',
+        parse: function(execResult) {
+          return [
+            execResult[1],
+            execResult[2],
+            execResult[3],
+            execResult[4]
+          ];
+        }
+      }, {
+        re: /rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+        format: 'rgba',
+        parse: function(execResult) {
+          return [
+            2.55 * execResult[1],
+            2.55 * execResult[2],
+            2.55 * execResult[3],
+            execResult[4]
+          ];
+        }
+      }, {
+        re: /hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,
+        format: 'hsl',
+        parse: function(execResult) {
+          return [
+            execResult[1] / 360,
+            execResult[2] / 100,
+            execResult[3] / 100,
+            execResult[4]
+          ];
+        }
+      }, {
+        re: /hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+        format: 'hsla',
+        parse: function(execResult) {
+          return [
+            execResult[1] / 360,
+            execResult[2] / 100,
+            execResult[3] / 100,
+            execResult[4]
+          ];
+        }
+      }, {
+        re: /#?([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,
+        format: 'hex',
+        parse: function(execResult) {
+          return [
+            parseInt(execResult[1], 16),
+            parseInt(execResult[2], 16),
+            parseInt(execResult[3], 16),
+            1
+          ];
+        }
+      }, {
+        re: /#?([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,
+        format: 'hex',
+        parse: function(execResult) {
+          return [
+            parseInt(execResult[1] + execResult[1], 16),
+            parseInt(execResult[2] + execResult[2], 16),
+            parseInt(execResult[3] + execResult[3], 16),
+            1
+          ];
+        }
+      }],
+      colorNameToHex: function(name) {
+        if (typeof this.colors[name.toLowerCase()] !== 'undefined') {
+          return this.colors[name.toLowerCase()];
+        }
+        return false;
+      }
+    };
+
+
+    var defaults = {
+      horizontal: false, // horizontal mode layout ?
+      inline: false, //forces to show the colorpicker as an inline element
+      color: false, //forces a color
+      format: false, //forces a format
+      input: 'input', // children input selector
+      container: false, // container selector
+      component: '.add-on, .input-group-addon', // children component selector
+      sliders: {
+        saturation: {
+          maxLeft: 100,
+          maxTop: 100,
+          callLeft: 'setSaturation',
+          callTop: 'setBrightness'
+        },
+        hue: {
+          maxLeft: 0,
+          maxTop: 100,
+          callLeft: false,
+          callTop: 'setHue'
+        },
+        alpha: {
+          maxLeft: 0,
+          maxTop: 100,
+          callLeft: false,
+          callTop: 'setAlpha'
+        }
+      },
+      slidersHorz: {
+        saturation: {
+          maxLeft: 100,
+          maxTop: 100,
+          callLeft: 'setSaturation',
+          callTop: 'setBrightness'
+        },
+        hue: {
+          maxLeft: 100,
+          maxTop: 0,
+          callLeft: 'setHue',
+          callTop: false
+        },
+        alpha: {
+          maxLeft: 100,
+          maxTop: 0,
+          callLeft: 'setAlpha',
+          callTop: false
+        }
+      },
+      template: '<div class="colorpicker dropdown-menu">' +
+        '<div class="colorpicker-saturation"><i><b></b></i></div>' +
+        '<div class="colorpicker-hue"><i></i></div>' +
+        '<div class="colorpicker-alpha"><i></i></div>' +
+        '<div class="colorpicker-color"><div /></div>' +
+        '<div class="colorpicker-selectors"></div>' +
+        '</div>',
+      align: 'right',
+      customClass: null,
+      colorSelectors: null
+    };
+
+    var Colorpicker = function(element, options) {
+      this.element = $(element).addClass('colorpicker-element');
+      this.options = $.extend(true, {}, defaults, this.element.data(), options);
+      this.component = this.options.component;
+      this.component = (this.component !== false) ? this.element.find(this.component) : false;
+      if (this.component && (this.component.length === 0)) {
+        this.component = false;
+      }
+      this.container = (this.options.container === true) ? this.element : this.options.container;
+      this.container = (this.container !== false) ? $(this.container) : false;
+
+      // Is the element an input? Should we search inside for any input?
+      this.input = this.element.is('input') ? this.element : (this.options.input ?
+        this.element.find(this.options.input) : false);
+      if (this.input && (this.input.length === 0)) {
+        this.input = false;
+      }
+      // Set HSB color
+      this.color = new Color(this.options.color !== false ? this.options.color : this.getValue(), this.options.colorSelectors);
+      this.format = this.options.format !== false ? this.options.format : this.color.origFormat;
+
+      if (this.options.color !== false) {
+        this.updateInput(this.color);
+        this.updateData(this.color);
+      }
+
+      // Setup picker
+      this.picker = $(this.options.template);
+      if (this.options.customClass) {
+        this.picker.addClass(this.options.customClass);
+      }
+      if (this.options.inline) {
+        this.picker.addClass('colorpicker-inline colorpicker-visible');
+      } else {
+        this.picker.addClass('colorpicker-hidden');
+      }
+      if (this.options.horizontal) {
+        this.picker.addClass('colorpicker-horizontal');
+      }
+      if (this.format === 'rgba' || this.format === 'hsla' || this.options.format === false) {
+        this.picker.addClass('colorpicker-with-alpha');
+      }
+      if (this.options.align === 'right') {
+        this.picker.addClass('colorpicker-right');
+      }
+      if (this.options.inline === true) {
+        this.picker.addClass('colorpicker-no-arrow');
+      }
+      if (this.options.colorSelectors) {
+        var colorpicker = this;
+        $.each(this.options.colorSelectors, function(name, color) {
+          var $btn = $('<i />').css('background-color', color).data('class', name);
+          $btn.click(function() {
+            colorpicker.setValue($(this).css('background-color'));
+          });
+          colorpicker.picker.find('.colorpicker-selectors').append($btn);
+        });
+        this.picker.find('.colorpicker-selectors').show();
+      }
+      this.picker.on('mousedown.colorpicker touchstart.colorpicker', $.proxy(this.mousedown, this));
+      this.picker.appendTo(this.container ? this.container : $('body'));
+
+      // Bind events
+      if (this.input !== false) {
+        this.input.on({
+          'keyup.colorpicker': $.proxy(this.keyup, this)
+        });
+        this.input.on({
+          'change.colorpicker': $.proxy(this.change, this)
+        });
+        if (this.component === false) {
+          this.element.on({
+            'focus.colorpicker': $.proxy(this.show, this)
+          });
+        }
+        if (this.options.inline === false) {
+          this.element.on({
+            'focusout.colorpicker': $.proxy(this.hide, this)
+          });
+        }
+      }
+
+      if (this.component !== false) {
+        this.component.on({
+          'click.colorpicker': $.proxy(this.show, this)
+        });
+      }
+
+      if ((this.input === false) && (this.component === false)) {
+        this.element.on({
+          'click.colorpicker': $.proxy(this.show, this)
+        });
+      }
+
+      // for HTML5 input[type='color']
+      if ((this.input !== false) && (this.component !== false) && (this.input.attr('type') === 'color')) {
+
+        this.input.on({
+          'click.colorpicker': $.proxy(this.show, this),
+          'focus.colorpicker': $.proxy(this.show, this)
+        });
+      }
+      this.update();
+
+      $($.proxy(function() {
+        this.element.trigger('create');
+      }, this));
+    };
+
+    Colorpicker.Color = Color;
+
+    Colorpicker.prototype = {
+      constructor: Colorpicker,
+      destroy: function() {
+        this.picker.remove();
+        this.element.removeData('colorpicker').off('.colorpicker');
+        if (this.input !== false) {
+          this.input.off('.colorpicker');
+        }
+        if (this.component !== false) {
+          this.component.off('.colorpicker');
+        }
+        this.element.removeClass('colorpicker-element');
+        this.element.trigger({
+          type: 'destroy'
+        });
+      },
+      reposition: function() {
+        if (this.options.inline !== false || this.options.container) {
+          return false;
+        }
+        var type = this.container && this.container[0] !== document.body ? 'position' : 'offset';
+        var element = this.component || this.element;
+        var offset = element[type]();
+        if (this.options.align === 'right') {
+          offset.left -= this.picker.outerWidth() - element.outerWidth();
+        }
+        this.picker.css({
+          top: offset.top + element.outerHeight(),
+          left: offset.left
+        });
+      },
+      show: function(e) {
+        if (this.isDisabled()) {
+          return false;
+        }
+        this.picker.addClass('colorpicker-visible').removeClass('colorpicker-hidden');
+        this.reposition();
+        $(window).on('resize.colorpicker', $.proxy(this.reposition, this));
+        if (e && (!this.hasInput() || this.input.attr('type') === 'color')) {
+          if (e.stopPropagation && e.preventDefault) {
+            e.stopPropagation();
+            e.preventDefault();
+          }
+        }
+        if (this.options.inline === false) {
+          $(window.document).on({
+            'mousedown.colorpicker': $.proxy(this.hide, this)
+          });
+        }
+        this.element.trigger({
+          type: 'showPicker',
+          color: this.color
+        });
+      },
+      hide: function() {
+        this.picker.addClass('colorpicker-hidden').removeClass('colorpicker-visible');
+        $(window).off('resize.colorpicker', this.reposition);
+        $(document).off({
+          'mousedown.colorpicker': this.hide
+        });
+        this.update();
+        this.element.trigger({
+          type: 'hidePicker',
+          color: this.color
+        });
+      },
+      updateData: function(val) {
+        val = val || this.color.toString(this.format);
+        this.element.data('color', val);
+        return val;
+      },
+      updateInput: function(val) {
+        val = val || this.color.toString(this.format);
+        if (this.input !== false) {
+          if (this.options.colorSelectors) {
+            var color = new Color(val, this.options.colorSelectors);
+            var alias = color.toAlias();
+            if (typeof this.options.colorSelectors[alias] !== 'undefined') {
+              val = alias;
+            }
+          }
+          this.input.prop('value', val);
+        }
+        return val;
+      },
+      updatePicker: function(val) {
+        if (val !== undefined) {
+          this.color = new Color(val, this.options.colorSelectors);
+        }
+        var sl = (this.options.horizontal === false) ? this.options.sliders : this.options.slidersHorz;
+        var icns = this.picker.find('i');
+        if (icns.length === 0) {
+          return;
+        }
+        if (this.options.horizontal === false) {
+          sl = this.options.sliders;
+          icns.eq(1).css('top', sl.hue.maxTop * (1 - this.color.value.h)).end()
+            .eq(2).css('top', sl.alpha.maxTop * (1 - this.color.value.a));
+        } else {
+          sl = this.options.slidersHorz;
+          icns.eq(1).css('left', sl.hue.maxLeft * (1 - this.color.value.h)).end()
+            .eq(2).css('left', sl.alpha.maxLeft * (1 - this.color.value.a));
+        }
+        icns.eq(0).css({
+          'top': sl.saturation.maxTop - this.color.value.b * sl.saturation.maxTop,
+          'left': this.color.value.s * sl.saturation.maxLeft
+        });
+        this.picker.find('.colorpicker-saturation').css('backgroundColor', this.color.toHex(this.color.value.h, 1, 1, 1));
+        this.picker.find('.colorpicker-alpha').css('backgroundColor', this.color.toHex());
+        this.picker.find('.colorpicker-color, .colorpicker-color div').css('backgroundColor', this.color.toString(this.format));
+        return val;
+      },
+      updateComponent: function(val) {
+        val = val || this.color.toString(this.format);
+        if (this.component !== false) {
+          var icn = this.component.find('i').eq(0);
+          if (icn.length > 0) {
+            icn.css({
+              'backgroundColor': val
+            });
+          } else {
+            this.component.css({
+              'backgroundColor': val
+            });
+          }
+        }
+        return val;
+      },
+      update: function(force) {
+        var val;
+        if ((this.getValue(false) !== false) || (force === true)) {
+          // Update input/data only if the current value is not empty
+          val = this.updateComponent();
+          this.updateInput(val);
+          this.updateData(val);
+          this.updatePicker(); // only update picker if value is not empty
+        }
+        return val;
+
+      },
+      setValue: function(val) { // set color manually
+        this.color = new Color(val, this.options.colorSelectors);
+        this.update(true);
+        this.element.trigger({
+          type: 'changeColor',
+          color: this.color,
+          value: val
+        });
+      },
+      getValue: function(defaultValue) {
+        defaultValue = (defaultValue === undefined) ? '#000000' : defaultValue;
+        var val;
+        if (this.hasInput()) {
+          val = this.input.val();
+        } else {
+          val = this.element.data('color');
+        }
+        if ((val === undefined) || (val === '') || (val === null)) {
+          // if not defined or empty, return default
+          val = defaultValue;
+        }
+        return val;
+      },
+      hasInput: function() {
+        return (this.input !== false);
+      },
+      isDisabled: function() {
+        if (this.hasInput()) {
+          return (this.input.prop('disabled') === true);
+        }
+        return false;
+      },
+      disable: function() {
+        if (this.hasInput()) {
+          this.input.prop('disabled', true);
+          this.element.trigger({
+            type: 'disable',
+            color: this.color,
+            value: this.getValue()
+          });
+          return true;
+        }
+        return false;
+      },
+      enable: function() {
+        if (this.hasInput()) {
+          this.input.prop('disabled', false);
+          this.element.trigger({
+            type: 'enable',
+            color: this.color,
+            value: this.getValue()
+          });
+          return true;
+        }
+        return false;
+      },
+      currentSlider: null,
+      mousePointer: {
+        left: 0,
+        top: 0
+      },
+      mousedown: function(e) {
+        if (!e.pageX && !e.pageY && e.originalEvent) {
+          e.pageX = e.originalEvent.touches[0].pageX;
+          e.pageY = e.originalEvent.touches[0].pageY;
+        }
+        e.stopPropagation();
+        e.preventDefault();
+
+        var target = $(e.target);
+
+        //detect the slider and set the limits and callbacks
+        var zone = target.closest('div');
+        var sl = this.options.horizontal ? this.options.slidersHorz : this.options.sliders;
+        if (!zone.is('.colorpicker')) {
+          if (zone.is('.colorpicker-saturation')) {
+            this.currentSlider = $.extend({}, sl.saturation);
+          } else if (zone.is('.colorpicker-hue')) {
+            this.currentSlider = $.extend({}, sl.hue);
+          } else if (zone.is('.colorpicker-alpha')) {
+            this.currentSlider = $.extend({}, sl.alpha);
+          } else {
+            return false;
+          }
+          var offset = zone.offset();
+          //reference to guide's style
+          this.currentSlider.guide = zone.find('i')[0].style;
+          this.currentSlider.left = e.pageX - offset.left;
+          this.currentSlider.top = e.pageY - offset.top;
+          this.mousePointer = {
+            left: e.pageX,
+            top: e.pageY
+          };
+          //trigger mousemove to move the guide to the current position
+          $(document).on({
+            'mousemove.colorpicker': $.proxy(this.mousemove, this),
+            'touchmove.colorpicker': $.proxy(this.mousemove, this),
+            'mouseup.colorpicker': $.proxy(this.mouseup, this),
+            'touchend.colorpicker': $.proxy(this.mouseup, this)
+          }).trigger('mousemove');
+        }
+        return false;
+      },
+      mousemove: function(e) {
+        if (!e.pageX && !e.pageY && e.originalEvent) {
+          e.pageX = e.originalEvent.touches[0].pageX;
+          e.pageY = e.originalEvent.touches[0].pageY;
+        }
+        e.stopPropagation();
+        e.preventDefault();
+        var left = Math.max(
+          0,
+          Math.min(
+            this.currentSlider.maxLeft,
+            this.currentSlider.left + ((e.pageX || this.mousePointer.left) - this.mousePointer.left)
+          )
+        );
+        var top = Math.max(
+          0,
+          Math.min(
+            this.currentSlider.maxTop,
+            this.currentSlider.top + ((e.pageY || this.mousePointer.top) - this.mousePointer.top)
+          )
+        );
+        this.currentSlider.guide.left = left + 'px';
+        this.currentSlider.guide.top = top + 'px';
+        if (this.currentSlider.callLeft) {
+          this.color[this.currentSlider.callLeft].call(this.color, left / this.currentSlider.maxLeft);
+        }
+        if (this.currentSlider.callTop) {
+          this.color[this.currentSlider.callTop].call(this.color, top / this.currentSlider.maxTop);
+        }
+        // Change format dynamically
+        // Only occurs if user choose the dynamic format by
+        // setting option format to false
+        if (this.currentSlider.callTop === 'setAlpha' && this.options.format === false) {
+
+          // Converting from hex / rgb to rgba
+          if (this.color.value.a !== 1) {
+            this.format = 'rgba';
+            this.color.origFormat = 'rgba';
+          }
+
+          // Converting from rgba to hex
+          else {
+            this.format = 'hex';
+            this.color.origFormat = 'hex';
+          }
+        }
+        this.update(true);
+
+        this.element.trigger({
+          type: 'changeColor',
+          color: this.color
+        });
+        return false;
+      },
+      mouseup: function(e) {
+        e.stopPropagation();
+        e.preventDefault();
+        $(document).off({
+          'mousemove.colorpicker': this.mousemove,
+          'touchmove.colorpicker': this.mousemove,
+          'mouseup.colorpicker': this.mouseup,
+          'touchend.colorpicker': this.mouseup
+        });
+        return false;
+      },
+      change: function(e) {
+        this.keyup(e);
+      },
+      keyup: function(e) {
+        if ((e.keyCode === 38)) {
+          if (this.color.value.a < 1) {
+            this.color.value.a = Math.round((this.color.value.a + 0.01) * 100) / 100;
+          }
+          this.update(true);
+        } else if ((e.keyCode === 40)) {
+          if (this.color.value.a > 0) {
+            this.color.value.a = Math.round((this.color.value.a - 0.01) * 100) / 100;
+          }
+          this.update(true);
+        } else {
+          this.color = new Color(this.input.val(), this.options.colorSelectors);
+          // Change format dynamically
+          // Only occurs if user choose the dynamic format by
+          // setting option format to false
+          if (this.color.origFormat && this.options.format === false) {
+            this.format = this.color.origFormat;
+          }
+          if (this.getValue(false) !== false) {
+            this.updateData();
+            this.updateComponent();
+            this.updatePicker();
+          }
+        }
+        this.element.trigger({
+          type: 'changeColor',
+          color: this.color,
+          value: this.input.val()
+        });
+      }
+    };
+
+    $.colorpicker = Colorpicker;
+
+    $.fn.colorpicker = function(option) {
+      var pickerArgs = arguments,
+        rv;
+
+      var $returnValue = this.each(function() {
+        var $this = $(this),
+          inst = $this.data('colorpicker'),
+          options = ((typeof option === 'object') ? option : {});
+        if ((!inst) && (typeof option !== 'string')) {
+          $this.data('colorpicker', new Colorpicker(this, options));
+        } else {
+          if (typeof option === 'string') {
+            rv = inst[option].apply(inst, Array.prototype.slice.call(pickerArgs, 1));
+          }
+        }
+      });
+      if (option === 'getValue') {
+        return rv;
+      }
+      return $returnValue;
+    };
+
+    $.fn.colorpicker.constructor = Colorpicker;
+
+  }));
diff --git a/vendor/bootstrap-colorpicker/js/bootstrap-colorpicker.min.js b/vendor/bootstrap-colorpicker/js/bootstrap-colorpicker.min.js
new file mode 100644
index 0000000..667e965
--- /dev/null
+++ b/vendor/bootstrap-colorpicker/js/bootstrap-colorpicker.min.js
@@ -0,0 +1 @@
+!function(a){"use strict";"object"==typeof exports?module.exports=a(window.jQuery):"function"==typeof define&&define.amd?define(["jquery"],a):window.jQuery&&!window.jQuery.fn.colorpicker&&a(window.jQuery)}(function(a){"use strict";var b=function(b,c){this.value={h:0,s:0,b:0,a:1},this.origFormat=null,c&&a.extend(this.colors,c),b&&(void 0!==b.toLowerCase?(b+="",this.setColor(b)):void 0!==b.h&&(this.value=b))};b.prototype={constructor:b,colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",transparent:"transparent"},_sanitizeNumber:function(a){return"number"==typeof a?a:isNaN(a)||null===a||""===a||void 0===a?1:void 0!==a.toLowerCase?parseFloat(a):1},isTransparent:function(a){return a?(a=a.toLowerCase().trim(),"transparent"===a||a.match(/#?00000000/)||a.match(/(rgba|hsla)\(0,0,0,0?\.?0\)/)):!1},rgbaIsTransparent:function(a){return 0===a.r&&0===a.g&&0===a.b&&0===a.a},setColor:function(a){a=a.toLowerCase().trim(),a&&(this.isTransparent(a)?this.value={h:0,s:0,b:0,a:0}:this.value=this.stringToHSB(a)||{h:0,s:0,b:0,a:1})},stringToHSB:function(b){b=b.toLowerCase();var c;"undefined"!=typeof this.colors[b]&&(b=this.colors[b],c="alias");var d=this,e=!1;return a.each(this.stringParsers,function(a,f){var g=f.re.exec(b),h=g&&f.parse.apply(d,[g]),i=c||f.format||"rgba";return h?(e=i.match(/hsla?/)?d.RGBtoHSB.apply(d,d.HSLtoRGB.apply(d,h)):d.RGBtoHSB.apply(d,h),d.origFormat=i,!1):!0}),e},setHue:function(a){this.value.h=1-a},setSaturation:function(a){this.value.s=a},setBrightness:function(a){this.value.b=1-a},setAlpha:function(a){this.value.a=parseInt(100*(1-a),10)/100},toRGB:function(a,b,c,d){a||(a=this.value.h,b=this.value.s,c=this.value.b),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-Math.abs(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],{r:Math.round(255*e),g:Math.round(255*f),b:Math.round(255*g),a:d||this.value.a}},toHex:function(a,b,c,d){var e=this.toRGB(a,b,c,d);return this.rgbaIsTransparent(e)?"transparent":"#"+(1<<24|parseInt(e.r)<<16|parseInt(e.g)<<8|parseInt(e.b)).toString(16).substr(1)},toHSL:function(a,b,c,d){a=a||this.value.h,b=b||this.value.s,c=c||this.value.b,d=d||this.value.a;var e=a,f=(2-b)*c,g=b*c;return g/=f>0&&1>=f?f:2-f,f/=2,g>1&&(g=1),{h:isNaN(e)?0:e,s:isNaN(g)?0:g,l:isNaN(f)?0:f,a:isNaN(d)?0:d}},toAlias:function(a,b,c,d){var e=this.toHex(a,b,c,d);for(var f in this.colors)if(this.colors[f]===e)return f;return!1},RGBtoHSB:function(a,b,c,d){a/=255,b/=255,c/=255;var e,f,g,h;return g=Math.max(a,b,c),h=g-Math.min(a,b,c),e=0===h?null:g===a?(b-c)/h:g===b?(c-a)/h+2:(a-b)/h+4,e=(e+360)%6*60/360,f=0===h?0:h/g,{h:this._sanitizeNumber(e),s:f,b:g,a:this._sanitizeNumber(d)}},HueToRGB:function(a,b,c){return 0>c?c+=1:c>1&&(c-=1),1>6*c?a+(b-a)*c*6:1>2*c?b:2>3*c?a+(b-a)*(2/3-c)*6:a},HSLtoRGB:function(a,b,c,d){0>b&&(b=0);var e;e=.5>=c?c*(1+b):c+b-c*b;var f=2*c-e,g=a+1/3,h=a,i=a-1/3,j=Math.round(255*this.HueToRGB(f,e,g)),k=Math.round(255*this.HueToRGB(f,e,h)),l=Math.round(255*this.HueToRGB(f,e,i));return[j,k,l,this._sanitizeNumber(d)]},toString:function(a){a=a||"rgba";var b=!1;switch(a){case"rgb":return b=this.toRGB(),this.rgbaIsTransparent(b)?"transparent":"rgb("+b.r+","+b.g+","+b.b+")";case"rgba":return b=this.toRGB(),"rgba("+b.r+","+b.g+","+b.b+","+b.a+")";case"hsl":return b=this.toHSL(),"hsl("+Math.round(360*b.h)+","+Math.round(100*b.s)+"%,"+Math.round(100*b.l)+"%)";case"hsla":return b=this.toHSL(),"hsla("+Math.round(360*b.h)+","+Math.round(100*b.s)+"%,"+Math.round(100*b.l)+"%,"+b.a+")";case"hex":return this.toHex();case"alias":return this.toAlias()||this.toHex();default:return b}},stringParsers:[{re:/rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/,format:"rgb",parse:function(a){return[a[1],a[2],a[3],1]}},{re:/rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,format:"rgb",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],1]}},{re:/rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[a[1],a[2],a[3],a[4]]}},{re:/rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],a[4]]}},{re:/hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,format:"hsl",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,format:"hsla",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/#?([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,format:"hex",parse:function(a){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16),1]}},{re:/#?([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,format:"hex",parse:function(a){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16),1]}}],colorNameToHex:function(a){return"undefined"!=typeof this.colors[a.toLowerCase()]?this.colors[a.toLowerCase()]:!1}};var c={horizontal:!1,inline:!1,color:!1,format:!1,input:"input",container:!1,component:".add-on, .input-group-addon",sliders:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setHue"},alpha:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setAlpha"}},slidersHorz:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:100,maxTop:0,callLeft:"setHue",callTop:!1},alpha:{maxLeft:100,maxTop:0,callLeft:"setAlpha",callTop:!1}},template:'<div class="colorpicker dropdown-menu"><div class="colorpicker-saturation"><i><b></b></i></div><div class="colorpicker-hue"><i></i></div><div class="colorpicker-alpha"><i></i></div><div class="colorpicker-color"><div /></div><div class="colorpicker-selectors"></div></div>',align:"right",customClass:null,colorSelectors:null},d=function(d,e){if(this.element=a(d).addClass("colorpicker-element"),this.options=a.extend(!0,{},c,this.element.data(),e),this.component=this.options.component,this.component=this.component!==!1?this.element.find(this.component):!1,this.component&&0===this.component.length&&(this.component=!1),this.container=this.options.container===!0?this.element:this.options.container,this.container=this.container!==!1?a(this.container):!1,this.input=this.element.is("input")?this.element:this.options.input?this.element.find(this.options.input):!1,this.input&&0===this.input.length&&(this.input=!1),this.color=new b(this.options.color!==!1?this.options.color:this.getValue(),this.options.colorSelectors),this.format=this.options.format!==!1?this.options.format:this.color.origFormat,this.options.color!==!1&&(this.updateInput(this.color),this.updateData(this.color)),this.picker=a(this.options.template),this.options.customClass&&this.picker.addClass(this.options.customClass),this.options.inline?this.picker.addClass("colorpicker-inline colorpicker-visible"):this.picker.addClass("colorpicker-hidden"),this.options.horizontal&&this.picker.addClass("colorpicker-horizontal"),("rgba"===this.format||"hsla"===this.format||this.options.format===!1)&&this.picker.addClass("colorpicker-with-alpha"),"right"===this.options.align&&this.picker.addClass("colorpicker-right"),this.options.inline===!0&&this.picker.addClass("colorpicker-no-arrow"),this.options.colorSelectors){var f=this;a.each(this.options.colorSelectors,function(b,c){var d=a("<i />").css("background-color",c).data("class",b);d.click(function(){f.setValue(a(this).css("background-color"))}),f.picker.find(".colorpicker-selectors").append(d)}),this.picker.find(".colorpicker-selectors").show()}this.picker.on("mousedown.colorpicker touchstart.colorpicker",a.proxy(this.mousedown,this)),this.picker.appendTo(this.container?this.container:a("body")),this.input!==!1&&(this.input.on({"keyup.colorpicker":a.proxy(this.keyup,this)}),this.input.on({"change.colorpicker":a.proxy(this.change,this)}),this.component===!1&&this.element.on({"focus.colorpicker":a.proxy(this.show,this)}),this.options.inline===!1&&this.element.on({"focusout.colorpicker":a.proxy(this.hide,this)})),this.component!==!1&&this.component.on({"click.colorpicker":a.proxy(this.show,this)}),this.input===!1&&this.component===!1&&this.element.on({"click.colorpicker":a.proxy(this.show,this)}),this.input!==!1&&this.component!==!1&&"color"===this.input.attr("type")&&this.input.on({"click.colorpicker":a.proxy(this.show,this),"focus.colorpicker":a.proxy(this.show,this)}),this.update(),a(a.proxy(function(){this.element.trigger("create")},this))};d.Color=b,d.prototype={constructor:d,destroy:function(){this.picker.remove(),this.element.removeData("colorpicker").off(".colorpicker"),this.input!==!1&&this.input.off(".colorpicker"),this.component!==!1&&this.component.off(".colorpicker"),this.element.removeClass("colorpicker-element"),this.element.trigger({type:"destroy"})},reposition:function(){if(this.options.inline!==!1||this.options.container)return!1;var a=this.container&&this.container[0]!==document.body?"position":"offset",b=this.component||this.element,c=b[a]();"right"===this.options.align&&(c.left-=this.picker.outerWidth()-b.outerWidth()),this.picker.css({top:c.top+b.outerHeight(),left:c.left})},show:function(b){return this.isDisabled()?!1:(this.picker.addClass("colorpicker-visible").removeClass("colorpicker-hidden"),this.reposition(),a(window).on("resize.colorpicker",a.proxy(this.reposition,this)),!b||this.hasInput()&&"color"!==this.input.attr("type")||b.stopPropagation&&b.preventDefault&&(b.stopPropagation(),b.preventDefault()),this.options.inline===!1&&a(window.document).on({"mousedown.colorpicker":a.proxy(this.hide,this)}),void this.element.trigger({type:"showPicker",color:this.color}))},hide:function(){this.picker.addClass("colorpicker-hidden").removeClass("colorpicker-visible"),a(window).off("resize.colorpicker",this.reposition),a(document).off({"mousedown.colorpicker":this.hide}),this.update(),this.element.trigger({type:"hidePicker",color:this.color})},updateData:function(a){return a=a||this.color.toString(this.format),this.element.data("color",a),a},updateInput:function(a){if(a=a||this.color.toString(this.format),this.input!==!1){if(this.options.colorSelectors){var c=new b(a,this.options.colorSelectors),d=c.toAlias();"undefined"!=typeof this.options.colorSelectors[d]&&(a=d)}this.input.prop("value",a)}return a},updatePicker:function(a){void 0!==a&&(this.color=new b(a,this.options.colorSelectors));var c=this.options.horizontal===!1?this.options.sliders:this.options.slidersHorz,d=this.picker.find("i");return 0!==d.length?(this.options.horizontal===!1?(c=this.options.sliders,d.eq(1).css("top",c.hue.maxTop*(1-this.color.value.h)).end().eq(2).css("top",c.alpha.maxTop*(1-this.color.value.a))):(c=this.options.slidersHorz,d.eq(1).css("left",c.hue.maxLeft*(1-this.color.value.h)).end().eq(2).css("left",c.alpha.maxLeft*(1-this.color.value.a))),d.eq(0).css({top:c.saturation.maxTop-this.color.value.b*c.saturation.maxTop,left:this.color.value.s*c.saturation.maxLeft}),this.picker.find(".colorpicker-saturation").css("backgroundColor",this.color.toHex(this.color.value.h,1,1,1)),this.picker.find(".colorpicker-alpha").css("backgroundColor",this.color.toHex()),this.picker.find(".colorpicker-color, .colorpicker-color div").css("backgroundColor",this.color.toString(this.format)),a):void 0},updateComponent:function(a){if(a=a||this.color.toString(this.format),this.component!==!1){var b=this.component.find("i").eq(0);b.length>0?b.css({backgroundColor:a}):this.component.css({backgroundColor:a})}return a},update:function(a){var b;return(this.getValue(!1)!==!1||a===!0)&&(b=this.updateComponent(),this.updateInput(b),this.updateData(b),this.updatePicker()),b},setValue:function(a){this.color=new b(a,this.options.colorSelectors),this.update(!0),this.element.trigger({type:"changeColor",color:this.color,value:a})},getValue:function(a){a=void 0===a?"#000000":a;var b;return b=this.hasInput()?this.input.val():this.element.data("color"),(void 0===b||""===b||null===b)&&(b=a),b},hasInput:function(){return this.input!==!1},isDisabled:function(){return this.hasInput()?this.input.prop("disabled")===!0:!1},disable:function(){return this.hasInput()?(this.input.prop("disabled",!0),this.element.trigger({type:"disable",color:this.color,value:this.getValue()}),!0):!1},enable:function(){return this.hasInput()?(this.input.prop("disabled",!1),this.element.trigger({type:"enable",color:this.color,value:this.getValue()}),!0):!1},currentSlider:null,mousePointer:{left:0,top:0},mousedown:function(b){b.pageX||b.pageY||!b.originalEvent||(b.pageX=b.originalEvent.touches[0].pageX,b.pageY=b.originalEvent.touches[0].pageY),b.stopPropagation(),b.preventDefault();var c=a(b.target),d=c.closest("div"),e=this.options.horizontal?this.options.slidersHorz:this.options.sliders;if(!d.is(".colorpicker")){if(d.is(".colorpicker-saturation"))this.currentSlider=a.extend({},e.saturation);else if(d.is(".colorpicker-hue"))this.currentSlider=a.extend({},e.hue);else{if(!d.is(".colorpicker-alpha"))return!1;this.currentSlider=a.extend({},e.alpha)}var f=d.offset();this.currentSlider.guide=d.find("i")[0].style,this.currentSlider.left=b.pageX-f.left,this.currentSlider.top=b.pageY-f.top,this.mousePointer={left:b.pageX,top:b.pageY},a(document).on({"mousemove.colorpicker":a.proxy(this.mousemove,this),"touchmove.colorpicker":a.proxy(this.mousemove,this),"mouseup.colorpicker":a.proxy(this.mouseup,this),"touchend.colorpicker":a.proxy(this.mouseup,this)}).trigger("mousemove")}return!1},mousemove:function(a){a.pageX||a.pageY||!a.originalEvent||(a.pageX=a.originalEvent.touches[0].pageX,a.pageY=a.originalEvent.touches[0].pageY),a.stopPropagation(),a.preventDefault();var b=Math.max(0,Math.min(this.currentSlider.maxLeft,this.currentSlider.left+((a.pageX||this.mousePointer.left)-this.mousePointer.left))),c=Math.max(0,Math.min(this.currentSlider.maxTop,this.currentSlider.top+((a.pageY||this.mousePointer.top)-this.mousePointer.top)));return this.currentSlider.guide.left=b+"px",this.currentSlider.guide.top=c+"px",this.currentSlider.callLeft&&this.color[this.currentSlider.callLeft].call(this.color,b/this.currentSlider.maxLeft),this.currentSlider.callTop&&this.color[this.currentSlider.callTop].call(this.color,c/this.currentSlider.maxTop),"setAlpha"===this.currentSlider.callTop&&this.options.format===!1&&(1!==this.color.value.a?(this.format="rgba",this.color.origFormat="rgba"):(this.format="hex",this.color.origFormat="hex")),this.update(!0),this.element.trigger({type:"changeColor",color:this.color}),!1},mouseup:function(b){return b.stopPropagation(),b.preventDefault(),a(document).off({"mousemove.colorpicker":this.mousemove,"touchmove.colorpicker":this.mousemove,"mouseup.colorpicker":this.mouseup,"touchend.colorpicker":this.mouseup}),!1},change:function(a){this.keyup(a)},keyup:function(a){38===a.keyCode?(this.color.value.a<1&&(this.color.value.a=Math.round(100*(this.color.value.a+.01))/100),this.update(!0)):40===a.keyCode?(this.color.value.a>0&&(this.color.value.a=Math.round(100*(this.color.value.a-.01))/100),this.update(!0)):(this.color=new b(this.input.val(),this.options.colorSelectors),this.color.origFormat&&this.options.format===!1&&(this.format=this.color.origFormat),this.getValue(!1)!==!1&&(this.updateData(),this.updateComponent(),this.updatePicker())),this.element.trigger({type:"changeColor",color:this.color,value:this.input.val()})}},a.colorpicker=d,a.fn.colorpicker=function(b){var c,e=arguments,f=this.each(function(){var f=a(this),g=f.data("colorpicker"),h="object"==typeof b?b:{};g||"string"==typeof b?"string"==typeof b&&(c=g[b].apply(g,Array.prototype.slice.call(e,1))):f.data("colorpicker",new d(this,h))});return"getValue"===b?c:f},a.fn.colorpicker.constructor=d});
\ No newline at end of file
