/**
* Kendo UI v2016.1.112 (http://www.telerik.com/kendo-ui)
* Copyright 2016 Telerik AD. All rights reserved.
*
* Kendo UI commercial licenses may be obtained at
* http://www.telerik.com/purchase/license-agreement/kendo-ui-complete
* If you do not own a commercial license, this file shall be governed by the trial license terms.
*/
(function (f, define) {
define('kendo.colorpicker', [
'kendo.core',
'kendo.color',
'kendo.popup',
'kendo.slider',
'kendo.userevents'
], f);
}(function () {
var __meta__ = {
id: 'colorpicker',
name: 'Color tools',
category: 'web',
description: 'Color selection widgets',
depends: [
'core',
'color',
'popup',
'slider',
'userevents'
]
};
(function ($, parseInt, undefined) {
var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, parseColor = kendo.parseColor, Color = kendo.Color, KEYS = kendo.keys, BACKGROUNDCOLOR = 'background-color', ITEMSELECTEDCLASS = 'k-state-selected', SIMPLEPALETTE = '000000,7f7f7f,880015,ed1c24,ff7f27,fff200,22b14c,00a2e8,3f48cc,a349a4,ffffff,c3c3c3,b97a57,ffaec9,ffc90e,efe4b0,b5e61d,99d9ea,7092be,c8bfe7', WEBPALETTE = 'FFFFFF,FFCCFF,FF99FF,FF66FF,FF33FF,FF00FF,CCFFFF,CCCCFF,CC99FF,CC66FF,CC33FF,CC00FF,99FFFF,99CCFF,9999FF,9966FF,9933FF,9900FF,FFFFCC,FFCCCC,FF99CC,FF66CC,FF33CC,FF00CC,CCFFCC,CCCCCC,CC99CC,CC66CC,CC33CC,CC00CC,99FFCC,99CCCC,9999CC,9966CC,9933CC,9900CC,FFFF99,FFCC99,FF9999,FF6699,FF3399,FF0099,CCFF99,CCCC99,CC9999,CC6699,CC3399,CC0099,99FF99,99CC99,999999,996699,993399,990099,FFFF66,FFCC66,FF9966,FF6666,FF3366,FF0066,CCFF66,CCCC66,CC9966,CC6666,CC3366,CC0066,99FF66,99CC66,999966,996666,993366,990066,FFFF33,FFCC33,FF9933,FF6633,FF3333,FF0033,CCFF33,CCCC33,CC9933,CC6633,CC3333,CC0033,99FF33,99CC33,999933,996633,993333,990033,FFFF00,FFCC00,FF9900,FF6600,FF3300,FF0000,CCFF00,CCCC00,CC9900,CC6600,CC3300,CC0000,99FF00,99CC00,999900,996600,993300,990000,66FFFF,66CCFF,6699FF,6666FF,6633FF,6600FF,33FFFF,33CCFF,3399FF,3366FF,3333FF,3300FF,00FFFF,00CCFF,0099FF,0066FF,0033FF,0000FF,66FFCC,66CCCC,6699CC,6666CC,6633CC,6600CC,33FFCC,33CCCC,3399CC,3366CC,3333CC,3300CC,00FFCC,00CCCC,0099CC,0066CC,0033CC,0000CC,66FF99,66CC99,669999,666699,663399,660099,33FF99,33CC99,339999,336699,333399,330099,00FF99,00CC99,009999,006699,003399,000099,66FF66,66CC66,669966,666666,663366,660066,33FF66,33CC66,339966,336666,333366,330066,00FF66,00CC66,009966,006666,003366,000066,66FF33,66CC33,669933,666633,663333,660033,33FF33,33CC33,339933,336633,333333,330033,00FF33,00CC33,009933,006633,003333,000033,66FF00,66CC00,669900,666600,663300,660000,33FF00,33CC00,339900,336600,333300,330000,00FF00,00CC00,009900,006600,003300,000000', APPLY_CANCEL = {
apply: 'Apply',
cancel: 'Cancel'
}, NS = '.kendoColorTools', CLICK_NS = 'click' + NS, KEYDOWN_NS = 'keydown' + NS, browser = kendo.support.browser, isIE8 = browser.msie && browser.version < 9;
var ColorSelector = Widget.extend({
init: function (element, options) {
var that = this, ariaId;
Widget.fn.init.call(that, element, options);
element = that.element;
options = that.options;
that._value = options.value = parseColor(options.value);
that._tabIndex = element.attr('tabIndex') || 0;
ariaId = that._ariaId = options.ariaId;
if (ariaId) {
element.attr('aria-labelledby', ariaId);
}
if (options._standalone) {
that._triggerSelect = that._triggerChange;
}
},
options: {
name: 'ColorSelector',
value: null,
_standalone: true
},
events: [
'change',
'select',
'cancel'
],
color: function (value) {
if (value !== undefined) {
this._value = parseColor(value);
this._updateUI(this._value);
}
return this._value;
},
value: function (color) {
color = this.color(color);
if (color) {
if (this.options.opacity) {
color = color.toCssRgba();
} else {
color = color.toCss();
}
}
return color || null;
},
enable: function (enable) {
if (arguments.length === 0) {
enable = true;
}
$('.k-disabled-overlay', this.wrapper).remove();
if (!enable) {
this.wrapper.append('
');
}
this._onEnable(enable);
},
_select: function (color, nohooks) {
var prev = this._value;
color = this.color(color);
if (!nohooks) {
this.element.trigger('change');
if (!color.equals(prev)) {
this.trigger('change', { value: this.value() });
} else if (!this._standalone) {
this.trigger('cancel');
}
}
},
_triggerSelect: function (color) {
triggerEvent(this, 'select', color);
},
_triggerChange: function (color) {
triggerEvent(this, 'change', color);
},
destroy: function () {
if (this.element) {
this.element.off(NS);
}
if (this.wrapper) {
this.wrapper.off(NS).find('*').off(NS);
}
this.wrapper = null;
Widget.fn.destroy.call(this);
},
_updateUI: $.noop,
_selectOnHide: function () {
return null;
},
_cancel: function () {
this.trigger('cancel');
}
});
function triggerEvent(self, type, color) {
color = parseColor(color);
if (color && !color.equals(self.color())) {
if (type == 'change') {
self._value = color;
}
if (color.a != 1) {
color = color.toCssRgba();
} else {
color = color.toCss();
}
self.trigger(type, { value: color });
}
}
var ColorPalette = ColorSelector.extend({
init: function (element, options) {
var that = this;
ColorSelector.fn.init.call(that, element, options);
element = that.wrapper = that.element;
options = that.options;
var colors = options.palette;
if (colors == 'websafe') {
colors = WEBPALETTE;
options.columns = 18;
} else if (colors == 'basic') {
colors = SIMPLEPALETTE;
}
if (typeof colors == 'string') {
colors = colors.split(',');
}
if ($.isArray(colors)) {
colors = $.map(colors, function (x) {
return parseColor(x);
});
}
that._selectedID = (options.ariaId || kendo.guid()) + '_selected';
element.addClass('k-widget k-colorpalette').attr('role', 'grid').attr('aria-readonly', 'true').append($(that._template({
colors: colors,
columns: options.columns,
tileSize: options.tileSize,
value: that._value,
id: options.ariaId
}))).on(CLICK_NS, '.k-item', function (ev) {
that._select($(ev.currentTarget).css(BACKGROUNDCOLOR));
}).attr('tabIndex', that._tabIndex).on(KEYDOWN_NS, bind(that._keydown, that));
var tileSize = options.tileSize, width, height;
if (tileSize) {
if (/number|string/.test(typeof tileSize)) {
width = height = parseFloat(tileSize);
} else if (typeof tileSize == 'object') {
width = parseFloat(tileSize.width);
height = parseFloat(tileSize.height);
} else {
throw new Error('Unsupported value for the \'tileSize\' argument');
}
element.find('.k-item').css({
width: width,
height: height
});
}
},
focus: function () {
this.wrapper.focus();
},
options: {
name: 'ColorPalette',
columns: 10,
tileSize: null,
palette: 'basic'
},
_onEnable: function (enable) {
if (enable) {
this.wrapper.attr('tabIndex', this._tabIndex);
} else {
this.wrapper.removeAttr('tabIndex');
}
},
_keydown: function (e) {
var selected, wrapper = this.wrapper, items = wrapper.find('.k-item'), current = items.filter('.' + ITEMSELECTEDCLASS).get(0), keyCode = e.keyCode;
if (keyCode == KEYS.LEFT) {
selected = relative(items, current, -1);
} else if (keyCode == KEYS.RIGHT) {
selected = relative(items, current, 1);
} else if (keyCode == KEYS.DOWN) {
selected = relative(items, current, this.options.columns);
} else if (keyCode == KEYS.UP) {
selected = relative(items, current, -this.options.columns);
} else if (keyCode == KEYS.ENTER) {
preventDefault(e);
if (current) {
this._select($(current).css(BACKGROUNDCOLOR));
}
} else if (keyCode == KEYS.ESC) {
this._cancel();
}
if (selected) {
preventDefault(e);
this._current(selected);
try {
var color = parseColor(selected.css(BACKGROUNDCOLOR));
this._triggerSelect(color);
} catch (ex) {
}
}
},
_current: function (item) {
this.wrapper.find('.' + ITEMSELECTEDCLASS).removeClass(ITEMSELECTEDCLASS).attr('aria-selected', false).removeAttr('id');
$(item).addClass(ITEMSELECTEDCLASS).attr('aria-selected', true).attr('id', this._selectedID);
this.element.removeAttr('aria-activedescendant').attr('aria-activedescendant', this._selectedID);
},
_updateUI: function (color) {
var item = null;
this.wrapper.find('.k-item').each(function () {
var c = parseColor($(this).css(BACKGROUNDCOLOR));
if (c && c.equals(color)) {
item = this;
return false;
}
});
this._current(item);
},
_template: kendo.template('' + '# for (var i = 0; i < colors.length; ++i) { #' + '# var selected = colors[i].equals(value); #' + '# if (i && i % columns == 0) { #
# } #' + ' | ' + '# } #' + '
')
});
var FlatColorPicker = ColorSelector.extend({
init: function (element, options) {
var that = this;
ColorSelector.fn.init.call(that, element, options);
options = that.options;
element = that.element;
that.wrapper = element.addClass('k-widget k-flatcolorpicker').append(that._template(options));
that._hueElements = $('.k-hsv-rectangle, .k-transparency-slider .k-slider-track', element);
that._selectedColor = $('.k-selected-color-display', element);
that._colorAsText = $('input.k-color-value', element);
that._sliders();
that._hsvArea();
that._updateUI(that._value || parseColor('#f00'));
element.find('input.k-color-value').on(KEYDOWN_NS, function (ev) {
var input = this;
if (ev.keyCode == KEYS.ENTER) {
try {
var color = parseColor(input.value);
var val = that.color();
that._select(color, color.equals(val));
} catch (ex) {
$(input).addClass('k-state-error');
}
} else if (that.options.autoupdate) {
setTimeout(function () {
var color = parseColor(input.value, true);
if (color) {
that._updateUI(color, true);
}
}, 10);
}
}).end().on(CLICK_NS, '.k-controls button.apply', function () {
that._select(that._getHSV());
}).on(CLICK_NS, '.k-controls button.cancel', function () {
that._updateUI(that.color());
that._cancel();
});
if (isIE8) {
that._applyIEFilter();
}
},
destroy: function () {
this._hueSlider.destroy();
if (this._opacitySlider) {
this._opacitySlider.destroy();
}
this._hueSlider = this._opacitySlider = this._hsvRect = this._hsvHandle = this._hueElements = this._selectedColor = this._colorAsText = null;
ColorSelector.fn.destroy.call(this);
},
options: {
name: 'FlatColorPicker',
opacity: false,
buttons: false,
input: true,
preview: true,
autoupdate: true,
messages: APPLY_CANCEL
},
_applyIEFilter: function () {
var track = this.element.find('.k-hue-slider .k-slider-track')[0], url = track.currentStyle.backgroundImage;
url = url.replace(/^url\([\'\"]?|[\'\"]?\)$/g, '');
track.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + url + '\', sizingMethod=\'scale\')';
},
_sliders: function () {
var that = this, element = that.element;
function hueChange(e) {
that._updateUI(that._getHSV(e.value, null, null, null));
}
that._hueSlider = element.find('.k-hue-slider').kendoSlider({
min: 0,
max: 359,
tickPlacement: 'none',
showButtons: false,
slide: hueChange,
change: hueChange
}).data('kendoSlider');
function opacityChange(e) {
that._updateUI(that._getHSV(null, null, null, e.value / 100));
}
that._opacitySlider = element.find('.k-transparency-slider').kendoSlider({
min: 0,
max: 100,
tickPlacement: 'none',
showButtons: false,
slide: opacityChange,
change: opacityChange
}).data('kendoSlider');
},
_hsvArea: function () {
var that = this, element = that.element, hsvRect = element.find('.k-hsv-rectangle'), hsvHandle = hsvRect.find('.k-draghandle').attr('tabIndex', 0).on(KEYDOWN_NS, bind(that._keydown, that));
function update(x, y) {
var offset = this.offset, dx = x - offset.left, dy = y - offset.top, rw = this.width, rh = this.height;
dx = dx < 0 ? 0 : dx > rw ? rw : dx;
dy = dy < 0 ? 0 : dy > rh ? rh : dy;
that._svChange(dx / rw, 1 - dy / rh);
}
that._hsvEvents = new kendo.UserEvents(hsvRect, {
global: true,
press: function (e) {
this.offset = kendo.getOffset(hsvRect);
this.width = hsvRect.width();
this.height = hsvRect.height();
hsvHandle.focus();
update.call(this, e.x.location, e.y.location);
},
start: function () {
hsvRect.addClass('k-dragging');
hsvHandle.focus();
},
move: function (e) {
e.preventDefault();
update.call(this, e.x.location, e.y.location);
},
end: function () {
hsvRect.removeClass('k-dragging');
}
});
that._hsvRect = hsvRect;
that._hsvHandle = hsvHandle;
},
_onEnable: function (enable) {
this._hueSlider.enable(enable);
if (this._opacitySlider) {
this._opacitySlider.enable(enable);
}
this.wrapper.find('input').attr('disabled', !enable);
var handle = this._hsvRect.find('.k-draghandle');
if (enable) {
handle.attr('tabIndex', this._tabIndex);
} else {
handle.removeAttr('tabIndex');
}
},
_keydown: function (ev) {
var that = this;
function move(prop, d) {
var c = that._getHSV();
c[prop] += d * (ev.shiftKey ? 0.01 : 0.05);
if (c[prop] < 0) {
c[prop] = 0;
}
if (c[prop] > 1) {
c[prop] = 1;
}
that._updateUI(c);
preventDefault(ev);
}
function hue(d) {
var c = that._getHSV();
c.h += d * (ev.shiftKey ? 1 : 5);
if (c.h < 0) {
c.h = 0;
}
if (c.h > 359) {
c.h = 359;
}
that._updateUI(c);
preventDefault(ev);
}
switch (ev.keyCode) {
case KEYS.LEFT:
if (ev.ctrlKey) {
hue(-1);
} else {
move('s', -1);
}
break;
case KEYS.RIGHT:
if (ev.ctrlKey) {
hue(1);
} else {
move('s', 1);
}
break;
case KEYS.UP:
move(ev.ctrlKey && that._opacitySlider ? 'a' : 'v', 1);
break;
case KEYS.DOWN:
move(ev.ctrlKey && that._opacitySlider ? 'a' : 'v', -1);
break;
case KEYS.ENTER:
that._select(that._getHSV());
break;
case KEYS.F2:
that.wrapper.find('input.k-color-value').focus().select();
break;
case KEYS.ESC:
that._cancel();
break;
}
},
focus: function () {
this._hsvHandle.focus();
},
_getHSV: function (h, s, v, a) {
var rect = this._hsvRect, width = rect.width(), height = rect.height(), handlePosition = this._hsvHandle.position();
if (h == null) {
h = this._hueSlider.value();
}
if (s == null) {
s = handlePosition.left / width;
}
if (v == null) {
v = 1 - handlePosition.top / height;
}
if (a == null) {
a = this._opacitySlider ? this._opacitySlider.value() / 100 : 1;
}
return Color.fromHSV(h, s, v, a);
},
_svChange: function (s, v) {
var color = this._getHSV(null, s, v, null);
this._updateUI(color);
},
_updateUI: function (color, dontChangeInput) {
var that = this, rect = that._hsvRect;
if (!color) {
return;
}
this._colorAsText.removeClass('k-state-error');
that._selectedColor.css(BACKGROUNDCOLOR, color.toDisplay());
if (!dontChangeInput) {
that._colorAsText.val(that._opacitySlider ? color.toCssRgba() : color.toCss());
}
that._triggerSelect(color);
color = color.toHSV();
that._hsvHandle.css({
left: color.s * rect.width() + 'px',
top: (1 - color.v) * rect.height() + 'px'
});
that._hueElements.css(BACKGROUNDCOLOR, Color.fromHSV(color.h, 1, 1, 1).toCss());
that._hueSlider.value(color.h);
if (that._opacitySlider) {
that._opacitySlider.value(100 * color.a);
}
},
_selectOnHide: function () {
return this.options.buttons ? null : this._getHSV();
},
_template: kendo.template('# if (preview) { #' + '' + '# } #' + '' + '' + '# if (opacity) { #' + '' + '# } #' + '# if (buttons) { #' + '
' + '# } #')
});
function relative(array, element, delta) {
array = Array.prototype.slice.call(array);
var n = array.length;
var pos = array.indexOf(element);
if (pos < 0) {
return delta < 0 ? array[n - 1] : array[0];
}
pos += delta;
if (pos < 0) {
pos += n;
} else {
pos %= n;
}
return array[pos];
}
var ColorPicker = Widget.extend({
init: function (element, options) {
var that = this;
Widget.fn.init.call(that, element, options);
options = that.options;
element = that.element;
var value = element.attr('value') || element.val();
if (value) {
value = parseColor(value, true);
} else {
value = parseColor(options.value, true);
}
that._value = options.value = value;
var content = that.wrapper = $(that._template(options));
element.hide().after(content);
if (element.is('input')) {
element.appendTo(content);
var label = element.closest('label');
var id = element.attr('id');
if (id) {
label = label.add('label[for="' + id + '"]');
}
label.click(function (ev) {
that.open();
ev.preventDefault();
});
}
that._tabIndex = element.attr('tabIndex') || 0;
that.enable(!element.attr('disabled'));
var accesskey = element.attr('accesskey');
if (accesskey) {
element.attr('accesskey', null);
content.attr('accesskey', accesskey);
}
that.bind('activate', function (ev) {
if (!ev.isDefaultPrevented()) {
that.toggle();
}
});
that._updateUI(value);
},
destroy: function () {
this.wrapper.off(NS).find('*').off(NS);
if (this._popup) {
this._selector.destroy();
this._popup.destroy();
}
this._selector = this._popup = this.wrapper = null;
Widget.fn.destroy.call(this);
},
enable: function (enable) {
var that = this, wrapper = that.wrapper, innerWrapper = wrapper.children('.k-picker-wrap'), icon = innerWrapper.find('.k-select');
if (arguments.length === 0) {
enable = true;
}
that.element.attr('disabled', !enable);
wrapper.attr('aria-disabled', !enable);
icon.off(NS).on('mousedown' + NS, preventDefault);
wrapper.addClass('k-state-disabled').removeAttr('tabIndex').add('*', wrapper).off(NS);
if (enable) {
wrapper.removeClass('k-state-disabled').attr('tabIndex', that._tabIndex).on('mouseenter' + NS, function () {
innerWrapper.addClass('k-state-hover');
}).on('mouseleave' + NS, function () {
innerWrapper.removeClass('k-state-hover');
}).on('focus' + NS, function () {
innerWrapper.addClass('k-state-focused');
}).on('blur' + NS, function () {
innerWrapper.removeClass('k-state-focused');
}).on(KEYDOWN_NS, bind(that._keydown, that)).on(CLICK_NS, '.k-select', bind(that.toggle, that)).on(CLICK_NS, that.options.toolIcon ? '.k-tool-icon' : '.k-selected-color', function () {
that.trigger('activate');
});
}
},
_template: kendo.template(''),
options: {
name: 'ColorPicker',
palette: null,
columns: 10,
toolIcon: null,
value: null,
messages: APPLY_CANCEL,
opacity: false,
buttons: true,
preview: true,
ARIATemplate: 'Current selected color is #=data || ""#'
},
events: [
'activate',
'change',
'select',
'open',
'close'
],
open: function () {
this._getPopup().open();
},
close: function () {
this._getPopup().close();
},
toggle: function () {
this._getPopup().toggle();
},
color: ColorSelector.fn.color,
value: ColorSelector.fn.value,
_select: ColorSelector.fn._select,
_triggerSelect: ColorSelector.fn._triggerSelect,
_isInputTypeColor: function () {
var el = this.element[0];
return /^input$/i.test(el.tagName) && /^color$/i.test(el.type);
},
_updateUI: function (value) {
var formattedValue = '';
if (value) {
if (this._isInputTypeColor() || value.a == 1) {
formattedValue = value.toCss();
} else {
formattedValue = value.toCssRgba();
}
this.element.val(formattedValue);
}
if (!this._ariaTemplate) {
this._ariaTemplate = kendo.template(this.options.ARIATemplate);
}
this.wrapper.attr('aria-label', this._ariaTemplate(formattedValue));
this._triggerSelect(value);
this.wrapper.find('.k-selected-color').css(BACKGROUNDCOLOR, value ? value.toDisplay() : 'transparent');
},
_keydown: function (ev) {
var key = ev.keyCode;
if (this._getPopup().visible()) {
if (key == KEYS.ESC) {
this._selector._cancel();
} else {
this._selector._keydown(ev);
}
preventDefault(ev);
} else if (key == KEYS.ENTER || key == KEYS.DOWN) {
this.open();
preventDefault(ev);
}
},
_getPopup: function () {
var that = this, popup = that._popup;
if (!popup) {
var options = that.options;
var selectorType;
if (options.palette) {
selectorType = ColorPalette;
} else {
selectorType = FlatColorPicker;
}
options._standalone = false;
delete options.select;
delete options.change;
delete options.cancel;
var id = kendo.guid();
var selector = that._selector = new selectorType($('').appendTo(document.body), options);
that.wrapper.attr('aria-owns', id);
that._popup = popup = selector.wrapper.kendoPopup({
anchor: that.wrapper,
adjustSize: {
width: 5,
height: 0
}
}).data('kendoPopup');
selector.bind({
select: function (ev) {
that._updateUI(parseColor(ev.value));
},
change: function () {
that._select(selector.color());
that.close();
},
cancel: function () {
that.close();
}
});
popup.bind({
close: function (ev) {
if (that.trigger('close')) {
ev.preventDefault();
return;
}
that.wrapper.children('.k-picker-wrap').removeClass('k-state-focused');
var color = selector._selectOnHide();
if (!color) {
that.wrapper.focus();
that._updateUI(that.color());
} else {
that._select(color);
}
},
open: function (ev) {
if (that.trigger('open')) {
ev.preventDefault();
} else {
that.wrapper.children('.k-picker-wrap').addClass('k-state-focused');
}
},
activate: function () {
selector._select(that.color(), true);
selector.focus();
that.wrapper.children('.k-picker-wrap').addClass('k-state-focused');
}
});
}
return popup;
}
});
function preventDefault(ev) {
ev.preventDefault();
}
function bind(callback, obj) {
return function () {
return callback.apply(obj, arguments);
};
}
ui.plugin(ColorPalette);
ui.plugin(FlatColorPicker);
ui.plugin(ColorPicker);
}(jQuery, parseInt));
return window.kendo;
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));