/*
mColorPicker
Version: 1.0 r38
Copyright (c) 2010 Meta100 LLC.
http://www.meta100.com/
Licensed under the MIT license
http://www.opensource.org/licenses/mit-license.php
*/
// After this script loads set:
// $.fn.mColorPicker.init.replace = '.myclass'
// to have this script apply to input.myclass,
// instead of the default input[type=color]
// To turn of automatic operation and run manually set:
// $.fn.mColorPicker.init.replace = false
// To use manually call like any other jQuery plugin
// $('input.foo').mColorPicker({options})
// options:
// imageFolder - Change to move image location.
// swatches - Initial colors in the swatch, must an array of 10 colors.
// init:
// $.fn.mColorPicker.init.enhancedSwatches - Turn of saving and loading of swatch to cookies.
// $.fn.mColorPicker.init.allowTransparency - Turn off transperancy as a color option.
// $.fn.mColorPicker.init.showLogo - Turn on/off the meta100 logo (You don't really want to turn it off, do you?).
(function($){
var $o, $i, i, $b,
div = '
',
img = '
',
span = '
',
$document = $(document),
$mColorPicker = $(div),
$mColorPickerBg = $(div),
$mColorPickerTest = $(div),
$mColorPickerInput = $(' '),
rRGB = /^rgb[a]?\((\d+),\s*(\d+),\s*(\d+)(,\s*(\d+\.\d+)*)?\)/,
rHEX = /([a-f0-9])([a-f0-9])([a-f0-9])/,
rHEX3 = /#[a-f0-9]{3}/,
rHEX6 = /#[a-f0-9]{6}/;
$.fn.mColorPicker = function(options) {
var swatches = $.fn.mColorPicker.getCookie('swatches');
$o = $.extend($.fn.mColorPicker.defaults, options);
$.fn.mColorPicker.defaults.swatches.concat($o.swatches).slice(-10);
if ($i.enhancedSwatches && swatches) $o.swatches = swatches.split('||').concat($o.swatches).slice(0, 10) || $o.swatches;
if (!$("div#mColorPicker").length) $.fn.mColorPicker.drawPicker();
if (!$('#css_disabled_color_picker').length) $('head').prepend(' ');
$('meta[data-remove-me=true]').remove();
this.each($.fn.mColorPicker.drawPickerTriggers);
return this;
};
$.fn.mColorPicker.init = {
replace: '[type=color]',
index: 0,
enhancedSwatches: true,
allowTransparency: true,
slogan: 'Meta100 - Designing Fun',
showLogo: true
};
$.fn.mColorPicker.defaults = {
currentId: false,
currentInput: false,
currentColor: false,
changeColor: false,
color: false,
imageFolder: '/core/admin/include/images/mColorPicker/',
swatches: [
"#ffffff",
"#ffff00",
"#00ff00",
"#00ffff",
"#0000ff",
"#ff00ff",
"#ff0000",
"#4c2b11",
"#3b3b3b",
"#000000"
]
};
$.fn.mColorPicker.start = function() {
$('input[data-mcolorpicker!="true"]').filter(function() {
return ($i.replace == '[type=color]')? this.getAttribute("type") == 'color': $(this).is($i.replace);
}).mColorPicker();
};
$.fn.mColorPicker.events = function() {
$("#mColorPickerBg").live('click', $.fn.mColorPicker.closePicker);
$('.mColorPicker').live('keyup', function () {
try {
$(this).css({
'background-color': $(this).val()
}).css({
'color': $.fn.mColorPicker.textColor($(this).css('background-color'))
}).trigger('change');
} catch (r) {}
});
$('.mColorPickerTrigger').live('click', $.fn.mColorPicker.colorShow);
$('.mColor, .mPastColor').live('mousemove', function(e) {
if (!$o.changeColor) return false;
var $t = $(this),
offset = $t.offset(),
$e = $o.currentInput,
hex = $e.attr('data-hex') || $e.attr('hex');
$o.color = $t.css("background-color");
if ($t.hasClass('mPastColor')) $o.color = $.fn.mColorPicker.setColor($o.color, hex);
else if ($t.hasClass('mColorTransparent')) $o.color = 'transparent';
else if (!$t.hasClass('mPastColor')) $o.color = $.fn.mColorPicker.whichColor(e.pageX - offset.left, e.pageY - offset.top, hex);
$o.currentInput.mSetInputColor($o.color);
}).live('click', $.fn.mColorPicker.colorPicked);
$('#mColorPickerInput').live('keyup', function (e) {
try {
$o.color = $(this).val();
$o.currentInput.mSetInputColor($o.color);
if (e.which == 13) $.fn.mColorPicker.colorPicked();
} catch (r) {}
}).live('blur', function () {
$o.currentInput.mSetInputColor($o.color);
});
$('#mColorPickerWrapper').live('mouseleave', function () {
if (!$o.changeColor) return false;
$o.currentInput.mSetInputColor($o.currentColor);
});
};
$.fn.mColorPicker.drawPickerTriggers = function () {
var $t = $(this),
id = $t.attr('id') || 'color_' + $i.index++,
hidden = $t.attr('text') == 'hidden' || $t.attr('data-text') == 'hidden'? true: false,
color = $.fn.mColorPicker.setColor($t.val(), ($t.attr('data-hex') || $t.attr('hex'))),
width = $t.width(),
height = $t.height(),
flt = $t.css('float'),
$c = $(span),
$trigger = $(span),
colorPicker = '',
$e;
$c.attr({
'id': 'color_work_area',
'class': 'mColorPickerInput'
}).appendTo($b)
$trigger.attr({
'id': 'mcp_' + id,
'class': 'mColorPickerTrigger'
}).css({
'display': 'inline-block',
'cursor': 'pointer'
}).insertAfter($t)
$(img).attr({
'src': $o.imageFolder + 'color.png'
}).css({
'border': 0,
'margin': '0 0 0 3px',
'vertical-align': 'text-bottom'
}).appendTo($trigger);
$c.append($t);
colorPicker = $c.html().replace(/type="color"/gi, 'type="' + (hidden? 'hidden': 'text') + '"');
$c.html('').remove();
$e = $(colorPicker).attr('id', id).addClass('mColorPicker').val(color).insertBefore($trigger);
if (hidden) $trigger.css({
'border': '1px solid black',
'float': flt,
'width': width,
'height': height
}).addClass($e.attr('class')).html(' ');
$e.mSetInputColor(color);
return $e;
};
$.fn.mColorPicker.drawPicker = function () {
var $s = $(div),
$l = $(''),
$f = $(div),
$w = $(div);
$mColorPickerBg.attr({
'id': 'mColorPickerBg'
}).css({
'display': 'none',
'background':'black',
'opacity': .01,
'position':'absolute',
'top':0,
'right':0,
'bottom':0,
'left':0
}).appendTo($b);
$mColorPicker.attr({
'id': 'mColorPicker',
'data-mcolorpicker': true
}).css({
'position':'absolute',
'border':'1px solid #ccc',
'color':'#fff',
'width':'194px',
'height':'184px',
'font-size':'12px',
'font-family':'times',
'display': 'none'
}).appendTo($b);
$mColorPickerTest.attr({
'id': 'mColorPickerTest'
}).css({
'display': 'none'
}).appendTo($b);
$w.attr({
'id': 'mColorPickerWrapper'
}).css({
'position':'relative',
'border':'solid 1px gray'
}).appendTo($mColorPicker);
$(div).attr({
'id': 'mColorPickerImg',
'class': 'mColor'
}).css({
'height': '136px',
'width': '192px',
'border': 0,
'cursor': 'crosshair',
'background-image': 'url(' + $o.imageFolder + 'picker.png)'
}).appendTo($w);
$s.attr({
'id': 'mColorPickerSwatches'
}).css({
'border-right':'1px solid #000'
}).appendTo($w);
$(div).addClass(
'mClear'
).css({
'clear': 'both'
}).appendTo($s);
for (i = 9; i > -1; i--) {
$(div).attr({
'id': 'cell' + i,
'class': "mPastColor" + ((i > 0)? ' mNoLeftBorder': '')
}).css({
'background-color': $o.swatches[i].toLowerCase(),
'height':'18px',
'width':'18px',
'border':'1px solid #000',
'float':'left'
}).html(
' '
).prependTo($s);
}
$f.attr({
'id': 'mColorPickerFooter'
}).css({
'background-image': 'url(' + $o.imageFolder + 'grid.gif)',
'position': 'relative',
'height': '26px'
}).appendTo($w);
$mColorPickerInput.attr({
'id': 'mColorPickerInput',
'type': 'text'
}).css({
'border': 'solid 1px gray',
'font-size': '10pt',
'margin': '3px',
'width': '80px'
}).appendTo($f);
if ($i.showLogo) $l.attr({
'href': 'http://meta100.com/',
'title': $i.slogan,
'alt': $i.slogan,
'target': '_blank'
}).css({
'float': 'right'
}).appendTo($f);
$('.mNoLeftBorder').css({
'border-left':0
});
};
$.fn.mColorPicker.closePicker = function () {
$mColorPickerBg.hide();
$mColorPicker.fadeOut()
};
$.fn.mColorPicker.colorShow = function () {
var $t = $(this),
id = $t.attr('id').replace('mcp_', ''),
pos = $t.offset(),
$i = $("#" + id),
pickerTop = pos.top + $t.outerHeight(),
pickerLeft = pos.left;
if ($i.attr('disabled')) return false;
$o.currentColor = $i.css('background-color')
$o.changeColor = true;
$o.currentInput = $i;
$o.currentId = id;
// KEEP COLOR PICKER IN VIEWPORT
if (pickerTop + $mColorPicker.height() > $document.height()) pickerTop = pos.top - $mColorPicker.height();
if (pickerLeft + $mColorPicker.width() > $document.width()) pickerLeft = pos.left - $mColorPicker.width() + $t.outerWidth();
$mColorPicker.css({
'top':(pickerTop) + "px",
'left':(pickerLeft) + "px"
}).fadeIn("fast");
$mColorPickerBg.show();
if ($('#' + id).attr('data-text')) $o.color = $t.css('background-color');
else $o.color = $i.css('background-color');
$o.color = $.fn.mColorPicker.setColor($o.color, $i.attr('data-hex') || $i.attr('hex'));
$mColorPickerInput.val($o.color);
};
$.fn.mColorPicker.setInputColor = function (id, color) {
$('#' + id).mSetInputColor(color);
};
$.fn.mSetInputColor = function (color) {
var $t = $(this),
css = {
'background-color': color,
'background-image': (color == 'transparent')? "url('" + $o.imageFolder + "grid.gif')": '',
'color': $.fn.mColorPicker.textColor(color)
};
if ($t.attr('data-text') || $t.attr('text')) $t.next().css(css);
$t.val(color).css(css).trigger('change');
$mColorPickerInput.val(color);
};
$.fn.mColorPicker.textColor = function (val) {
val = $.fn.mColorPicker.RGBtoHex(val);
if (typeof val == 'undefined' || val == 'transparent') return "black";
return (parseInt(val.substr(1, 2), 16) + parseInt(val.substr(3, 2), 16) + parseInt(val.substr(5, 2), 16) < 400)? 'white': 'black';
};
$.fn.mColorPicker.setCookie = function (name, value, days) {
var cookie_string = name + "=" + escape(value),
expires = new Date();
expires.setDate(expires.getDate() + days);
cookie_string += "; expires=" + expires.toGMTString();
document.cookie = cookie_string;
};
$.fn.mColorPicker.getCookie = function (name) {
var results = document.cookie.match ( '(^|;) ?' + name + '=([^;]*)(;|$)' );
if (results) return (unescape(results[2]));
else return null;
};
$.fn.mColorPicker.colorPicked = function () {
$o.changeColor = false;
$.fn.mColorPicker.closePicker();
$.fn.mColorPicker.addToSwatch();
$o.currentInput.trigger('colorpicked');
};
$.fn.mColorPicker.addToSwatch = function (color) {
if (!$i.enhancedSwatches) return false;
var swatch = []
i = 0;
if (typeof color == 'string') $o.color = color.toLowerCase();
if ($o.color != 'transparent') swatch[0] = $o.color.toLowerCase();
$('.mPastColor').each(function() {
var $t = $(this);
$o.color = $t.css('background-color').toLowerCase();
if ($o.color != swatch[0] && $.fn.mColorPicker.RGBtoHex($o.color) != swatch[0] && $.fn.mColorPicker.hexToRGB($o.color) != swatch[0] && swatch.length < 10) swatch[swatch.length] = $o.color;
$(this).css('background-color', swatch[i++])
});
if ($i.enhancedSwatches) $.fn.mColorPicker.setCookie('swatches', swatch.join('||'), 365);
};
$.fn.mColorPicker.whichColor = function (x, y, hex) {
var color = [255, 255, 255];
if (x < 32) {
color[1] = x * 8;
color[2] = 0;
} else if (x < 64) {
color[0] = 256 - (x - 32 ) * 8;
color[2] = 0;
} else if (x < 96) {
color[0] = 0;
color[2] = (x - 64) * 8;
} else if (x < 128) {
color[0] = 0;
color[1] = 256 - (x - 96) * 8;
} else if (x < 160) {
color[0] = (x - 128) * 8;
color[1] = 0;
} else {
color[1] = 0;
color[2] = 256 - (x - 160) * 8;
}
for (var n = 0; n < 3; n++) {
if (y < 64) color[n] += (256 - color[n]) * (64 - y) / 64;
else if (y <= 128) color[n] -= color[n] * (y - 64) / 64;
else if (y > 128) color[n] = 256 - ( x / 192 * 256 );
color[n] = Math.round(Math.min(color[n], 255));
if (hex == 'true') color[n] = $.fn.mColorPicker.decToHex(color[n]);
}
if (hex == 'true') return "#" + color.join('');
return "rgb(" + color.join(', ') + ')';
};
$.fn.mColorPicker.setColor = function (color, hex) {
if (hex == 'true') return $.fn.mColorPicker.RGBtoHex(color);
return $.fn.mColorPicker.hexToRGB(color);
}
$.fn.mColorPicker.colorTest = function (color) {
$mColorPickerTest.css('background-color', color);
return $mColorPickerTest.css('background-color');
}
$.fn.mColorPicker.decToHex = function (color) {
var hex_char = "0123456789ABCDEF";
color = parseInt(color);
return String(hex_char.charAt(Math.floor(color / 16))) + String(hex_char.charAt(color - (Math.floor(color / 16) * 16)));
}
$.fn.mColorPicker.RGBtoHex = function (color) {
var decToHex = "#",
rgb;
color = color? color.toLowerCase(): false;
if (!color) return '';
if (rHEX6.test(color)) return color.substr(0, 7);
if (rHEX3.test(color)) return color.replace(rHEX, "$1$1$2$2$3$3").substr(0, 7);
if (rgb = color.match(rRGB)) {
for (var n = 1; n < 4; n++) decToHex += $.fn.mColorPicker.decToHex(rgb[n]);
return decToHex;
}
return $.fn.mColorPicker.colorTest(color);
};
$.fn.mColorPicker.hexToRGB = function (color) {
color = color? color.toLowerCase(): false;
if (!color) return '';
if (rRGB.test(color)) return color;
if (rHEX3.test(color)) {
if (!rHEX6.test(color)) color = color.replace(rHEX, "$1$1$2$2$3$3");
return 'rgb(' + parseInt(color.substr(1, 2), 16) + ', ' + parseInt(color.substr(3, 2), 16) + ', ' + parseInt(color.substr(5, 2), 16) + ')';
}
return $.fn.mColorPicker.colorTest(color);
};
$i = $.fn.mColorPicker.init;
$document.ready(function () {
$b = $('body');
$.fn.mColorPicker.events();
if ($i.replace) {
$.fn.mColorPicker.start();
if (typeof $.fn.livequery == "function") $($i.replace).livequery($.fn.mColorPicker.start);
else $(document).live('ajaxSuccess.mColorPicker', $.fn.mColorPicker.start);
}
});
})(jQuery);