(function($, undefined) {
function round(value, precision) {
var power = Math.pow(10, precision || 0);
return Math.round(value * power) / power;
}
var ui = kendo.ui,
Widget = ui.Widget,
support = kendo.support,
click = support.touch ? "touchend" : "click",
proxy = $.proxy,
extend = $.extend,
HSLPicker = Widget.extend({
init: function (element, options) {
var that = this;
Widget.fn.init.call(that, element, options);
element = that.element;
options = that.options;
if (!options.filter) {
element.addClass("k-color-sampler");
}
that.popup = new ui.Popup("
", {
anchor: element,
origin: "bottom center",
position: "top center"
});
if (!options.filter) {
$(document.body)
.on(click, ".k-color-sampler", function(e) {
if (e.currentTarget == element[0]) {
e.preventDefault();
that._toggle();
}
});
} else {
$(element)
.on(click, options.filter, function(e) {
if (support.matchesSelector.call(e.currentTarget, options.filter)) {
e.preventDefault();
that.target = $(e.currentTarget);
that.popup.options.anchor = that.target;
that._toggle();
}
});
}
that.color = new Color(element.css("background-color"));
that.colorElement = $('').appendTo(that.popup.element);
that.colorValue = $('').appendTo(that.colorElement);
that.colorValue
.on("input", proxy(that._change, that))
.keydown(proxy(that._keyDown, that));
var popupElement = that.popup.element.addClass("k-list-container"),
hueElement = $('').appendTo(popupElement).find("input"),
hueValue = $('').appendTo(popupElement).after('
'),
saturationElement = $('').appendTo(popupElement).find("input"),
saturationValue = $('').appendTo(popupElement).after('
'),
lightnessElement = $('').appendTo(popupElement).find("input"),
lightnessValue = $('').appendTo(popupElement).after('
'),
alphaElement = $('').appendTo(popupElement).find("input"),
alphaValue = $('').appendTo(popupElement),
changeProxy = proxy(that._onChange, that),
slideProxy = proxy(that._onSlide, that);
popupElement.children("[type=text]").keydown(proxy(that._keyDown, that));
popupElement.children("[type=text]").bind("input", proxy(that._changeValue, that));
that.hueSlider = extend(hueElement.kendoColorSlider({ max: 359, slide: slideProxy, change: changeProxy }).data("kendoColorSlider"), { type: "hue", valueElement: hueValue });
that.saturationSlider = extend(saturationElement.kendoColorSlider({ slide: slideProxy, change: changeProxy }).data("kendoColorSlider"), { type: "saturation", valueElement: saturationValue });
that.lightnessSlider = extend(lightnessElement.kendoColorSlider({ slide: slideProxy, change: changeProxy }).data("kendoColorSlider"), { type: "lightness", valueElement: lightnessValue });
that.alphaSlider = extend(alphaElement.kendoColorSlider({ max: 1, precision: 2, slide: slideProxy, change: changeProxy }).data("kendoColorSlider"), { type: "alpha", valueElement: alphaValue });
kendo.notify(that);
},
events: [
"pick",
"change"
],
options: {
name: "HSLPicker",
filter: null,
toggleTarget: null
},
open: function (target) {
if (typeof target != "undefined") {
this.target = target;
}
this._toggle(true);
},
close: function () {
this._toggle(false);
},
_updateValues: function (updateAttr) {
var that = this,
color = that.color.get(),
readable = that.color.readable();
if (updateAttr) {
that.colorValue.attr("value", color);
}
that.colorValue.css({
color: readable,
borderColor: readable
});
that.colorElement.css("background-color", color);
},
_update: function (updateAttr, trigger) {
var that = this,
target = !that.options.filter ? that.element : that.target,
color = that.color.get();
if (color) {
target
.css("background-color", color)
.attr("data-color", color == "rgba(0,0,0,0)" ? "none" : color);
that._updateValues(updateAttr);
that.hueSlider.value(that.color.hue());
that.saturationSlider.value(that.color.saturation());
that.lightnessSlider.value(that.color.lightness());
that.alphaSlider.value(that.color.alpha());
that.hueSlider.valueElement.val(that.color.hue());
that.saturationSlider.valueElement.val(that.color.saturation());
that.lightnessSlider.valueElement.val(that.color.lightness());
that.alphaSlider.valueElement.val(that.color.alpha());
if (trigger) {
that.trigger("pick", { color: that.color, target: target });
}
}
},
_change: function (e) {
var that = this;
that.color.set(e.target.value);
that._update(false, true);
},
_changeValue: function (e) {
var that = this,
target = e.target,
value = target.value,
title = $(target).attr("title");
if (value == parseFloat(value) && value[value.length-1] != ".") {
that.color[title](value);
that._update(true, true);
}
},
_keyDown: function (e) {
var that = this,
target = e.target,
title = $(target).attr("title"),
slider = that[title + "Slider"];
if (e.which == 38 || e.which == 40) {
if (title) {
target.value = round(target.value*1 + (e.which == 38 ? 1 : -1) / slider.precisionFactor, 2);
that.color[title](target.value);
} else {
that.color[e.which == 38 ? "tint" : "shade"]();
}
that._update(true, true);
}
},
_toggle: function(open) {
var that = this, color, target, options = that.options;
if (options.filter) {
that.target = that.target || that.element.find(options.filter);
}
target = !options.filter ? that.element : that.target;
open = open !== undefined? open : that.options.filter ? true : !that.popup.visible();
if (open) {
that.color.set(target.css("background-color"));
that._update(true);
}
that.popup[open ? "open" : "close"]();
},
_onChange: function(e) {
var that = this,
color = this._onSlide(e),
target = !that.options.filter ? that.element : that.target;
that.trigger("change", { color: color, target: target });
},
_onSlide: function(e) {
var that = this,
textColor = that.color.set(that.color[e.sender.type](e.value).get()).get(),
target = !that.options.filter ? that.element : that.target;
target
.css("background-color", textColor)
.attr("data-color", textColor)
.removeClass("k-none");
that._updateValues(true);
e.sender.valueElement.val(e.value);
that.trigger("pick", { color: that.color, target: target });
return that.color;
}
});
kendo.ui.plugin(HSLPicker);
})(jQuery);