first commit
This commit is contained in:
@ -0,0 +1,462 @@
|
||||
/**
|
||||
* Option Tree UI
|
||||
*
|
||||
* Dependencies: jQuery, jQuery UI, ColorPicker
|
||||
*
|
||||
* @author Derek Herman (derek@valendesigns.com)
|
||||
*/
|
||||
;(function($) {
|
||||
OT_UI = {
|
||||
processing: false,
|
||||
init: function() {
|
||||
this.init_hide_body();
|
||||
this.init_sortable();
|
||||
this.init_add();
|
||||
this.init_edit();
|
||||
this.init_remove();
|
||||
this.init_edit_title()
|
||||
this.init_edit_id();
|
||||
this.init_activate_layout();
|
||||
this.init_upload();
|
||||
this.init_upload_remove();
|
||||
this.init_tabs();
|
||||
this.init_radio_image_select();
|
||||
this.init_select_wrapper();
|
||||
this.fix_upload_parent();
|
||||
this.fix_colorpicker();
|
||||
this.fix_textarea();
|
||||
this.replicate_ajax();
|
||||
this.reset_settings();
|
||||
},
|
||||
init_hide_body: function(elm,type) {
|
||||
var css = '.option-tree-setting-body';
|
||||
if ( type == 'parent' ) {
|
||||
$(css).not( elm.parent().parent().children(css) ).hide();
|
||||
} else if ( type == 'child' ) {
|
||||
elm.closest('ul').find(css).not( elm.parent().parent().children(css) ).hide();
|
||||
} else if ( type == 'child-add' ) {
|
||||
elm.children().find(css).hide();
|
||||
} else if ( type == 'toggle' ) {
|
||||
elm.parent().parent().children(css).toggle();
|
||||
} else {
|
||||
$(css).hide();
|
||||
}
|
||||
},
|
||||
init_remove_active: function(elm,type) {
|
||||
var css = '.option-tree-setting-edit';
|
||||
if ( type == 'parent' ) {
|
||||
$(css).not(elm).removeClass('active');
|
||||
} else if ( type == 'child' ) {
|
||||
elm.closest('ul').find(css).not(elm).removeClass('active');
|
||||
} else if ( type == 'child-add' ) {
|
||||
elm.children().find(css).removeClass('active');
|
||||
} else {
|
||||
$(css).removeClass('active');
|
||||
}
|
||||
},
|
||||
init_sortable: function() {
|
||||
$('.option-tree-sortable').each( function() {
|
||||
if ( $(this).children('li').length ) {
|
||||
var elm = $(this);
|
||||
elm.show();
|
||||
elm.sortable({
|
||||
items: 'li:not(.ui-state-disabled)',
|
||||
placeholder: 'ui-state-highlight',
|
||||
stop: function(evt, ui) {
|
||||
setTimeout(
|
||||
function(){
|
||||
OT_UI.update_ids(elm);
|
||||
},
|
||||
200
|
||||
)
|
||||
}
|
||||
});
|
||||
elm.children('li').disableSelection();
|
||||
elm.find('.option-tree-setting-body').bind('mousedown.ui-disableSelection selectstart.ui-disableSelection', function(e) {
|
||||
e.stopImmediatePropagation();
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
init_add: function() {
|
||||
$('.option-tree-section-add').live('click', function(e) {
|
||||
e.preventDefault();
|
||||
OT_UI.add(this,'section');
|
||||
});
|
||||
$('.option-tree-setting-add').live('click', function(e) {
|
||||
e.preventDefault();
|
||||
OT_UI.add(this,'setting');
|
||||
});
|
||||
$('.option-tree-help-add').live('click', function(e) {
|
||||
e.preventDefault();
|
||||
OT_UI.add(this,'contextual_help');
|
||||
});
|
||||
$('.option-tree-choice-add').live('click', function(e) {
|
||||
e.preventDefault();
|
||||
OT_UI.add(this,'choice');
|
||||
});
|
||||
$('.option-tree-list-item-add').live('click', function(e) {
|
||||
e.preventDefault();
|
||||
OT_UI.add(this,'list_item');
|
||||
});
|
||||
$('.option-tree-list-item-setting-add').live('click', function(e) {
|
||||
e.preventDefault();
|
||||
if ( $(this).parents('ul').parents('ul').hasClass('ui-sortable') ) {
|
||||
alert(option_tree.setting_limit);
|
||||
return false;
|
||||
}
|
||||
OT_UI.add(this,'list_item_setting');
|
||||
});
|
||||
},
|
||||
init_edit: function() {
|
||||
$('.option-tree-setting-edit').live('click', function(e) {
|
||||
e.preventDefault();
|
||||
if ( $(this).parents().hasClass('option-tree-setting-body') ) {
|
||||
OT_UI.init_remove_active($(this),'child');
|
||||
OT_UI.init_hide_body($(this),'child');
|
||||
} else {
|
||||
OT_UI.init_remove_active($(this),'parent');
|
||||
OT_UI.init_hide_body($(this), 'parent');
|
||||
}
|
||||
$(this).toggleClass('active');
|
||||
OT_UI.init_hide_body($(this), 'toggle');
|
||||
});
|
||||
},
|
||||
init_remove: function() {
|
||||
$('.option-tree-setting-remove').live('click', function(event) {
|
||||
event.preventDefault();
|
||||
if ( $(this).parents('li').hasClass('ui-state-disabled') ) {
|
||||
alert(option_tree.remove_no);
|
||||
return false;
|
||||
}
|
||||
var agree = confirm(option_tree.remove_agree);
|
||||
if (agree) {
|
||||
var list = $(this).parents('ul');
|
||||
OT_UI.remove(this);
|
||||
setTimeout( function() {
|
||||
OT_UI.update_ids(list);
|
||||
}, 200 );
|
||||
}
|
||||
return false;
|
||||
});
|
||||
},
|
||||
init_edit_title: function() {
|
||||
$('.option-tree-setting-title').live('keyup', function() {
|
||||
OT_UI.edit_title(this);
|
||||
});
|
||||
},
|
||||
init_edit_id: function() {
|
||||
$('.section-id').live('keyup', function(){
|
||||
OT_UI.update_id(this);
|
||||
});
|
||||
},
|
||||
init_activate_layout: function() {
|
||||
$('.option-tree-layout-activate').live('click', function() {
|
||||
var active = $(this).parents('.option-tree-setting').find('.open').text();
|
||||
$('.option-tree-layout-activate').removeClass('active');
|
||||
$(this).toggleClass('active');
|
||||
$('.active-layout-input').attr({'value':active});
|
||||
});
|
||||
$('#option-tree-options-layouts-form select').live('change', function() {
|
||||
var agree = confirm(option_tree.activate_layout_agree);
|
||||
if (agree) {
|
||||
$('#option-tree-options-layouts-form').submit();
|
||||
} else {
|
||||
var active = $('#the_current_layout').attr('value');
|
||||
$('#option-tree-options-layouts-form select option[value="' + active + '"]').attr({'selected':'selected'});
|
||||
$('#option-tree-options-layouts-form select').prev('span').replaceWith('<span>' + active + '</span>');
|
||||
}
|
||||
});
|
||||
},
|
||||
add: function(elm,type) {
|
||||
var self = this,
|
||||
list = '',
|
||||
list_class = '',
|
||||
name = '',
|
||||
post_id = 0,
|
||||
get_option = '',
|
||||
settings = '';
|
||||
if ( type == 'contextual_help' ) {
|
||||
list = $(elm).parent().find('ul:last');
|
||||
list_class = 'list-contextual-help';
|
||||
} else if ( type == 'choice' ) {
|
||||
list = $(elm).parent().children('ul');
|
||||
list_class = 'list-choice';
|
||||
} else if ( type == 'list_item' ) {
|
||||
list = $(elm).parent().children('ul');
|
||||
list_class = 'list-sub-setting';
|
||||
} else if ( type == 'list_item_setting' ) {
|
||||
list = $(elm).parent().children('ul');
|
||||
list_class = 'list-sub-setting';
|
||||
} else {
|
||||
list = $(elm).parent().find('ul:first');
|
||||
list_class = ( type == 'section' ) ? 'list-section' : 'list-setting';
|
||||
}
|
||||
name = list.data('name');
|
||||
post_id = list.data('id');
|
||||
get_option = list.data('getOption');
|
||||
settings = $('#'+name+'_settings_array').val();
|
||||
if ( this.processing === false ) {
|
||||
this.processing = true;
|
||||
var count = parseInt(list.children('li').length);
|
||||
$.ajax({
|
||||
url: option_tree.ajax,
|
||||
type: 'post',
|
||||
data: {
|
||||
action: 'add_' + type,
|
||||
count: count,
|
||||
name: name,
|
||||
post_id: post_id,
|
||||
get_option: get_option,
|
||||
settings: settings,
|
||||
type: type
|
||||
},
|
||||
complete: function( data ) {
|
||||
if ( type == 'choice' || type == 'list_item_setting' ) {
|
||||
OT_UI.init_remove_active(list,'child-add');
|
||||
OT_UI.init_hide_body(list,'child-add');
|
||||
} else {
|
||||
OT_UI.init_remove_active();
|
||||
OT_UI.init_hide_body();
|
||||
}
|
||||
list.append('<li class="ui-state-default ' + list_class + '">' + data.responseText + '</li>');
|
||||
list.children().last().find('.option-tree-setting-edit').toggleClass('active');
|
||||
list.children().last().find('.option-tree-setting-body').toggle();
|
||||
list.children().last().find('.option-tree-setting-title').focus();
|
||||
if ( type != 'contextual_help' ) {
|
||||
OT_UI.update_ids(list);
|
||||
}
|
||||
setTimeout( function() {
|
||||
OT_UI.init_sortable();
|
||||
OT_UI.init_select_wrapper();
|
||||
}, 500);
|
||||
self.processing = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
remove: function(e) {
|
||||
$(e).parent().parent().parent('li').remove();
|
||||
},
|
||||
edit_title: function(e) {
|
||||
if ( this.timer ) {
|
||||
clearTimeout(e.timer);
|
||||
}
|
||||
this.timer = setTimeout( function() {
|
||||
$(e).parent().parent().parent().parent().parent().children('.open').text(e.value);
|
||||
}, 100);
|
||||
return true;
|
||||
},
|
||||
update_id: function(e) {
|
||||
if ( this.timer ) {
|
||||
clearTimeout(e.timer);
|
||||
}
|
||||
this.timer = setTimeout( function() {
|
||||
OT_UI.update_ids($(e).parents('ul'));
|
||||
}, 100);
|
||||
return true;
|
||||
},
|
||||
update_ids: function(list) {
|
||||
var last_section, section, list_items = list.children('li');
|
||||
list_items.each(function(index) {
|
||||
if ( $(this).hasClass('list-section') ) {
|
||||
section = $(this).find('.section-id').val().trim().toLowerCase().replace(/[^a-z0-9]/gi,'_');
|
||||
if (!section) {
|
||||
section = $(this).find('.section-title').val().trim().toLowerCase().replace(/[^a-z0-9]/gi,'_');
|
||||
}
|
||||
if (!section) {
|
||||
section = last_section;
|
||||
}
|
||||
}
|
||||
if ($(this).hasClass('list-setting') ) {
|
||||
$(this).find('.hidden-section').attr({'value':section});
|
||||
}
|
||||
last_section = section;
|
||||
});
|
||||
},
|
||||
init_upload: function() {
|
||||
$('.ot_upload_media').live('click', function() {
|
||||
var field_id = $(this).parent('.option-tree-ui-upload-parent').find('input').attr('id'),
|
||||
post_id = $(this).attr('rel'),
|
||||
backup = window.send_to_editor,
|
||||
btnContent = '',
|
||||
intval = window.setInterval(function() {
|
||||
if ( $('#TB_iframeContent').attr('src').indexOf( "&field_id=" ) !== -1 ) {
|
||||
$('#TB_iframeContent').contents().find('#tab-type_url').hide();
|
||||
}
|
||||
$('#TB_iframeContent').contents().find('.savesend .button').val(option_tree.upload_text);
|
||||
}, 50);
|
||||
tb_show('', 'media-upload.php?post_id='+post_id+'&field_id='+field_id+'&type=image&TB_iframe=1');
|
||||
window.send_to_editor = function(html) {
|
||||
var href = $(html).attr('href');
|
||||
var image = /\.(?:jpe?g|png|gif|ico)$/i;
|
||||
if (OT_UI.url_exists(href)) {
|
||||
if (href.match(image)) {
|
||||
btnContent += '<div class="option-tree-ui-image-wrap"><img src="'+href+'" alt="" /></div>';
|
||||
}
|
||||
btnContent += '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button" title="'+option_tree.remove_media_text+'"><span class="icon trash-can">'+option_tree.remove_media_text+'</span></a>';
|
||||
}
|
||||
$('#'+field_id).val(href);
|
||||
$('#'+field_id+'_media').remove();
|
||||
$('#'+field_id).parent().parent('div').append('<div class="option-tree-ui-media-wrap" id="'+field_id+'_media" />');
|
||||
$('#'+field_id+'_media').append(btnContent).slideDown();
|
||||
OT_UI.fix_upload_parent();
|
||||
tb_remove();
|
||||
window.clearInterval(intval);
|
||||
window.send_to_editor = backup;
|
||||
};
|
||||
return false;
|
||||
});
|
||||
},
|
||||
init_upload_remove: function() {
|
||||
$('.option-tree-ui-remove-media').live('click', function(event) {
|
||||
event.preventDefault();
|
||||
var agree = confirm(option_tree.remove_agree);
|
||||
if (agree) {
|
||||
OT_UI.remove_image(this);
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
},
|
||||
init_upload_fix: function(elm) {
|
||||
var id = $(elm).attr('id'),
|
||||
val = $(elm).val(),
|
||||
img = $(elm).parent().next('option-tree-ui-media-wrap').find('img'),
|
||||
src = img.attr('src'),
|
||||
btnContent = '';
|
||||
if ( val != src ) {
|
||||
img.attr('src', val);
|
||||
}
|
||||
if ( val !== '' && ( typeof src == 'undefined' || src == false ) && OT_UI.url_exists(val) ) {
|
||||
var image = /\.(?:jpe?g|png|gif|ico)$/i;
|
||||
if (val.match(image)) {
|
||||
btnContent += '<div class="option-tree-ui-image-wrap"><img src="'+val+'" alt="" /></div>';
|
||||
}
|
||||
btnContent += '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button" title="'+option_tree.remove_media_text+'"><span class="icon trash-can">'+option_tree.remove_media_text+'</span></a>';
|
||||
$('#'+id).val(val);
|
||||
$('#'+id+'_media').remove();
|
||||
$('#'+id).parent().parent('div').append('<div class="option-tree-ui-media-wrap" id="'+id+'_media" />');
|
||||
$('#'+id+'_media').append(btnContent).slideDown();
|
||||
} else if ( val == '' || ! OT_UI.url_exists(val) ) {
|
||||
$(elm).parent().next('.option-tree-ui-media-wrap').remove();
|
||||
}
|
||||
},
|
||||
init_tabs: function() {
|
||||
$(".wrap.settings-wrap .ui-tabs").tabs({
|
||||
fx: {
|
||||
opacity: "toggle",
|
||||
duration: "fast"
|
||||
}
|
||||
}).bind("tabsselect", function(event, ui) {
|
||||
$("input[name=\'_wp_http_referer\']").val(ui.tab);
|
||||
});
|
||||
},
|
||||
init_radio_image_select: function() {
|
||||
$('.option-tree-ui-radio-image').live('click', function() {
|
||||
$('.option-tree-ui-radio-image').removeClass('option-tree-ui-radio-image-selected');
|
||||
$(this).toggleClass('option-tree-ui-radio-image-selected');
|
||||
$(this).parent().find('.option-tree-ui-radio').attr('checked', true);
|
||||
});
|
||||
},
|
||||
init_select_wrapper: function() {
|
||||
$('.option-tree-ui-select').each(function () {
|
||||
if ( ! $(this).parent().hasClass('select-wrapper') ) {
|
||||
$(this).wrap('<div class="select-wrapper" />');
|
||||
$(this).parent('.select-wrapper.').prepend('<span>' + $(this).find('option:selected').text() + '</span>');
|
||||
}
|
||||
});
|
||||
$('.option-tree-ui-select').live('change', function () {
|
||||
$(this).prev('span').replaceWith('<span>' + $(this).find('option:selected').text() + '</span>');
|
||||
});
|
||||
$('.option-tree-ui-select').bind($.browser.msie ? 'click' : 'change', function(event) {
|
||||
$(this).prev('span').replaceWith('<span>' + $(this).find('option:selected').text() + '</span>');
|
||||
});
|
||||
},
|
||||
bind_colorpicker: function(field_id) {
|
||||
$('#'+field_id).ColorPicker({
|
||||
onSubmit: function(hsb, hex, rgb) {
|
||||
$('#'+field_id).val('#'+hex);
|
||||
},
|
||||
onBeforeShow: function () {
|
||||
$(this).ColorPickerSetColor(this.value);
|
||||
return false;
|
||||
},
|
||||
onChange: function (hsb, hex, rgb) {
|
||||
var bc = $.inArray(hex, [ 'FFFFFF', 'FFF', 'ffffff', 'fff' ]) != -1 ? 'ccc' : hex;
|
||||
$('#cp_'+field_id).css({'backgroundColor':'#'+hex,'borderColor':'#'+bc});
|
||||
$('#cp_'+field_id).prev('input').attr('value', '#'+hex);
|
||||
}
|
||||
})
|
||||
.bind('keyup', function(){
|
||||
$(this).ColorPickerSetColor(this.value);
|
||||
});
|
||||
},
|
||||
fix_upload_parent: function() {
|
||||
$('.option-tree-ui-upload-input').live('focus blur', function(){
|
||||
$(this).parent('.option-tree-ui-upload-parent').toggleClass('focus');
|
||||
OT_UI.init_upload_fix(this);
|
||||
});
|
||||
},
|
||||
remove_image: function(e) {
|
||||
$(e).parent().parent().find('.option-tree-ui-upload-input').attr('value','');
|
||||
$(e).parent('.option-tree-ui-media-wrap').remove();
|
||||
},
|
||||
fix_colorpicker: function() {
|
||||
$('.cp_input').live('blur', function() {
|
||||
$('.cp_input').each( function(index, el) {
|
||||
var val = $(el).val();
|
||||
var reg = /^[A-Fa-f0-9]{6}$/;
|
||||
if( reg.test(val) && val != '' ) {
|
||||
$(el).attr('value', '#'+val)
|
||||
} else if ( val == '' ) {
|
||||
$(this).next('.cp_box').css({'background':'#f1f1f1','border-color':'#ccc'});
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
fix_textarea: function() {
|
||||
$('.wp-editor-area').focus( function(){
|
||||
$(this).parent('div').css({borderColor:'#bbb'});
|
||||
}).blur( function(){
|
||||
$(this).parent('div').css({borderColor:'#ccc'});
|
||||
});
|
||||
},
|
||||
replicate_ajax: function() {
|
||||
if (location.href.indexOf("#") != -1) {
|
||||
var url = $("input[name=\'_wp_http_referer\']").val(),
|
||||
hash = location.href.substr(location.href.indexOf("#"));
|
||||
$("input[name=\'_wp_http_referer\']").val( url + hash );
|
||||
this.scroll_to_top();
|
||||
}
|
||||
setTimeout( function() {
|
||||
$(".wrap.settings-wrap .fade").fadeOut("fast");
|
||||
}, 3000 );
|
||||
},
|
||||
reset_settings: function() {
|
||||
$(".reset-settings").live("click", function(event){
|
||||
var agree = confirm(option_tree.reset_agree);
|
||||
if (agree) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
event.preventDefault();
|
||||
});
|
||||
},
|
||||
url_exists: function(url) {
|
||||
var http = new XMLHttpRequest();
|
||||
http.open('HEAD', url, false);
|
||||
http.send();
|
||||
return http.status!=404;
|
||||
},
|
||||
scroll_to_top: function() {
|
||||
setTimeout( function() {
|
||||
$(this).scrollTop(0);
|
||||
}, 50 );
|
||||
}
|
||||
};
|
||||
$(document).ready( function() {
|
||||
OT_UI.init();
|
||||
});
|
||||
})(jQuery);
|
@ -0,0 +1,453 @@
|
||||
/**
|
||||
* Color picker
|
||||
* Author: Stefan Petre www.eyecon.ro
|
||||
*
|
||||
* Dependencies: jQuery
|
||||
*/
|
||||
(function ($) {
|
||||
var ColorPicker = function () {
|
||||
var
|
||||
ids = {},
|
||||
inAction,
|
||||
charMin = 65,
|
||||
visible,
|
||||
tpl = '<div class="colorpicker"><div class="colorpicker_color"><div><div></div></div></div><div class="colorpicker_hue"><div></div></div><div class="colorpicker_new_color"></div><div class="colorpicker_current_color"></div><div class="colorpicker_hex"><input type="text" maxlength="6" size="6" /></div><div class="colorpicker_rgb_r colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_g colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_h colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_s colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_submit"></div></div>',
|
||||
defaults = {
|
||||
eventName: 'click',
|
||||
onShow: function () {},
|
||||
onBeforeShow: function(){},
|
||||
onHide: function () {},
|
||||
onChange: function () {},
|
||||
onSubmit: function () {},
|
||||
color: 'ff0000',
|
||||
livePreview: true,
|
||||
flat: false
|
||||
},
|
||||
fillRGBFields = function (hsb, cal) {
|
||||
var rgb = HSBToRGB(hsb);
|
||||
$(cal).data('colorpicker').fields
|
||||
.eq(1).val(rgb.r).end()
|
||||
.eq(2).val(rgb.g).end()
|
||||
.eq(3).val(rgb.b).end();
|
||||
},
|
||||
fillHSBFields = function (hsb, cal) {
|
||||
$(cal).data('colorpicker').fields
|
||||
.eq(4).val(hsb.h).end()
|
||||
.eq(5).val(hsb.s).end()
|
||||
.eq(6).val(hsb.b).end();
|
||||
},
|
||||
fillHexFields = function (hsb, cal) {
|
||||
$(cal).data('colorpicker').fields
|
||||
.eq(0).val(HSBToHex(hsb)).end();
|
||||
},
|
||||
setSelector = function (hsb, cal) {
|
||||
$(cal).data('colorpicker').selector.css('backgroundColor', '#' + HSBToHex({h: hsb.h, s: 100, b: 100}));
|
||||
$(cal).data('colorpicker').selectorIndic.css({
|
||||
left: parseInt(150 * hsb.s/100, 10),
|
||||
top: parseInt(150 * (100-hsb.b)/100, 10)
|
||||
});
|
||||
},
|
||||
setHue = function (hsb, cal) {
|
||||
$(cal).data('colorpicker').hue.css('top', parseInt(150 - 150 * hsb.h/360, 10));
|
||||
},
|
||||
setCurrentColor = function (hsb, cal) {
|
||||
$(cal).data('colorpicker').currentColor.css('backgroundColor', '#' + HSBToHex(hsb));
|
||||
},
|
||||
setNewColor = function (hsb, cal) {
|
||||
$(cal).data('colorpicker').newColor.css('backgroundColor', '#' + HSBToHex(hsb));
|
||||
},
|
||||
keyDown = function (ev) {
|
||||
var pressedKey = ev.charCode || ev.keyCode || -1;
|
||||
if ((pressedKey > charMin && pressedKey <= 90) || pressedKey == 32) {
|
||||
return false;
|
||||
}
|
||||
var cal = $(this).parent().parent();
|
||||
if (cal.data('colorpicker').livePreview === true) {
|
||||
change.apply(this);
|
||||
}
|
||||
},
|
||||
change = function (ev) {
|
||||
var cal = $(this).parent().parent(), col;
|
||||
if (this.parentNode.className.indexOf('_hex') > 0) {
|
||||
cal.data('colorpicker').color = col = HexToHSB(fixHex(this.value));
|
||||
} else if (this.parentNode.className.indexOf('_hsb') > 0) {
|
||||
cal.data('colorpicker').color = col = fixHSB({
|
||||
h: parseInt(cal.data('colorpicker').fields.eq(4).val(), 10),
|
||||
s: parseInt(cal.data('colorpicker').fields.eq(5).val(), 10),
|
||||
b: parseInt(cal.data('colorpicker').fields.eq(6).val(), 10)
|
||||
});
|
||||
} else {
|
||||
cal.data('colorpicker').color = col = RGBToHSB(fixRGB({
|
||||
r: parseInt(cal.data('colorpicker').fields.eq(1).val(), 10),
|
||||
g: parseInt(cal.data('colorpicker').fields.eq(2).val(), 10),
|
||||
b: parseInt(cal.data('colorpicker').fields.eq(3).val(), 10)
|
||||
}));
|
||||
}
|
||||
if (ev) {
|
||||
fillRGBFields(col, cal.get(0));
|
||||
fillHexFields(col, cal.get(0));
|
||||
fillHSBFields(col, cal.get(0));
|
||||
}
|
||||
setSelector(col, cal.get(0));
|
||||
setHue(col, cal.get(0));
|
||||
setNewColor(col, cal.get(0));
|
||||
cal.data('colorpicker').onChange.apply(cal, [col, HSBToHex(col), HSBToRGB(col)]);
|
||||
},
|
||||
blur = function (ev) {
|
||||
var cal = $(this).parent().parent();
|
||||
cal.data('colorpicker').fields.parent().removeClass('colorpicker_focus')
|
||||
},
|
||||
focus = function () {
|
||||
charMin = this.parentNode.className.indexOf('_hex') > 0 ? 70 : 65;
|
||||
$(this).parent().parent().data('colorpicker').fields.parent().removeClass('colorpicker_focus');
|
||||
$(this).parent().addClass('colorpicker_focus');
|
||||
},
|
||||
downIncrement = function (ev) {
|
||||
var field = $(this).parent().find('input').focus();
|
||||
var current = {
|
||||
el: $(this).parent().addClass('colorpicker_slider'),
|
||||
max: this.parentNode.className.indexOf('_hsb_h') > 0 ? 360 : (this.parentNode.className.indexOf('_hsb') > 0 ? 100 : 255),
|
||||
y: ev.pageY,
|
||||
field: field,
|
||||
val: parseInt(field.val(), 10),
|
||||
preview: $(this).parent().parent().data('colorpicker').livePreview
|
||||
};
|
||||
$(document).bind('mouseup', current, upIncrement);
|
||||
$(document).bind('mousemove', current, moveIncrement);
|
||||
},
|
||||
moveIncrement = function (ev) {
|
||||
ev.data.field.val(Math.max(0, Math.min(ev.data.max, parseInt(ev.data.val + ev.pageY - ev.data.y, 10))));
|
||||
if (ev.data.preview) {
|
||||
change.apply(ev.data.field.get(0), [true]);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
upIncrement = function (ev) {
|
||||
change.apply(ev.data.field.get(0), [true]);
|
||||
ev.data.el.removeClass('colorpicker_slider').find('input').focus();
|
||||
$(document).unbind('mouseup', upIncrement);
|
||||
$(document).unbind('mousemove', moveIncrement);
|
||||
return false;
|
||||
},
|
||||
downHue = function (ev) {
|
||||
var current = {
|
||||
cal: $(this).parent(),
|
||||
y: $(this).offset().top
|
||||
};
|
||||
current.preview = current.cal.data('colorpicker').livePreview;
|
||||
$(document).bind('mouseup', current, upHue);
|
||||
$(document).bind('mousemove', current, moveHue);
|
||||
},
|
||||
moveHue = function (ev) {
|
||||
change.apply(
|
||||
ev.data.cal.data('colorpicker')
|
||||
.fields
|
||||
.eq(4)
|
||||
.val(parseInt(360*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.y))))/150, 10))
|
||||
.get(0),
|
||||
[ev.data.preview]
|
||||
);
|
||||
return false;
|
||||
},
|
||||
upHue = function (ev) {
|
||||
fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
|
||||
fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
|
||||
$(document).unbind('mouseup', upHue);
|
||||
$(document).unbind('mousemove', moveHue);
|
||||
return false;
|
||||
},
|
||||
downSelector = function (ev) {
|
||||
var current = {
|
||||
cal: $(this).parent(),
|
||||
pos: $(this).offset()
|
||||
};
|
||||
current.preview = current.cal.data('colorpicker').livePreview;
|
||||
$(document).bind('mouseup', current, upSelector);
|
||||
$(document).bind('mousemove', current, moveSelector);
|
||||
},
|
||||
moveSelector = function (ev) {
|
||||
change.apply(
|
||||
ev.data.cal.data('colorpicker')
|
||||
.fields
|
||||
.eq(6)
|
||||
.val(parseInt(100*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.pos.top))))/150, 10))
|
||||
.end()
|
||||
.eq(5)
|
||||
.val(parseInt(100*(Math.max(0,Math.min(150,(ev.pageX - ev.data.pos.left))))/150, 10))
|
||||
.get(0),
|
||||
[ev.data.preview]
|
||||
);
|
||||
return false;
|
||||
},
|
||||
upSelector = function (ev) {
|
||||
fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
|
||||
fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
|
||||
$(document).unbind('mouseup', upSelector);
|
||||
$(document).unbind('mousemove', moveSelector);
|
||||
return false;
|
||||
},
|
||||
enterSubmit = function (ev) {
|
||||
$(this).addClass('colorpicker_focus');
|
||||
},
|
||||
leaveSubmit = function (ev) {
|
||||
$(this).removeClass('colorpicker_focus');
|
||||
},
|
||||
clickSubmit = function (ev) {
|
||||
var cal = $(this).parent();
|
||||
var col = cal.data('colorpicker').color;
|
||||
cal.data('colorpicker').origColor = col;
|
||||
setCurrentColor(col, cal.get(0));
|
||||
cal.data('colorpicker').onSubmit(col, HSBToHex(col), HSBToRGB(col));
|
||||
cal.hide();
|
||||
},
|
||||
show = function (ev) {
|
||||
var cal = $('#' + $(this).data('colorpickerId'));
|
||||
cal.data('colorpicker').onBeforeShow.apply(this, [cal.get(0)]);
|
||||
var pos = $(this).offset();
|
||||
var viewPort = getViewport();
|
||||
var top = pos.top + this.offsetHeight;
|
||||
var left = pos.left;
|
||||
if (top + 176 > viewPort.t + viewPort.h) {
|
||||
top -= this.offsetHeight + 176;
|
||||
} else {
|
||||
top += 5;
|
||||
}
|
||||
if (left + 356 > viewPort.l + viewPort.w) {
|
||||
left -= 356;
|
||||
}
|
||||
cal.css({left: left + 'px', top: top + 'px'});
|
||||
if (cal.data('colorpicker').onShow.apply(this, [cal.get(0)]) != false) {
|
||||
cal.show();
|
||||
}
|
||||
$(document).bind('mousedown', {cal: cal}, hide);
|
||||
return false;
|
||||
},
|
||||
hide = function (ev) {
|
||||
if (!isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) {
|
||||
if (ev.data.cal.data('colorpicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) {
|
||||
ev.data.cal.hide();
|
||||
}
|
||||
$(document).unbind('mousedown', hide);
|
||||
}
|
||||
},
|
||||
isChildOf = function(parentEl, el, container) {
|
||||
if (parentEl == el) {
|
||||
return true;
|
||||
}
|
||||
if (parentEl.contains) {
|
||||
return parentEl.contains(el);
|
||||
}
|
||||
if ( parentEl.compareDocumentPosition ) {
|
||||
return !!(parentEl.compareDocumentPosition(el) & 16);
|
||||
}
|
||||
var prEl = el.parentNode;
|
||||
while(prEl && prEl != container) {
|
||||
if (prEl == parentEl)
|
||||
return true;
|
||||
prEl = prEl.parentNode;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
getViewport = function () {
|
||||
var m = document.compatMode == 'CSS1Compat';
|
||||
return {
|
||||
l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),
|
||||
t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop),
|
||||
w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth),
|
||||
h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight)
|
||||
};
|
||||
},
|
||||
fixHSB = function (hsb) {
|
||||
return {
|
||||
h: Math.min(360, Math.max(0, hsb.h)),
|
||||
s: Math.min(100, Math.max(0, hsb.s)),
|
||||
b: Math.min(100, Math.max(0, hsb.b))
|
||||
};
|
||||
},
|
||||
fixRGB = function (rgb) {
|
||||
return {
|
||||
r: Math.min(255, Math.max(0, rgb.r)),
|
||||
g: Math.min(255, Math.max(0, rgb.g)),
|
||||
b: Math.min(255, Math.max(0, rgb.b))
|
||||
};
|
||||
},
|
||||
fixHex = function (hex) {
|
||||
var len = 6 - hex.length;
|
||||
if (len > 0) {
|
||||
var o = [];
|
||||
for (var i=0; i<len; i++) {
|
||||
o.push('0');
|
||||
}
|
||||
o.push(hex);
|
||||
hex = o.join('');
|
||||
}
|
||||
return hex;
|
||||
},
|
||||
HexToRGB = function (hex) {
|
||||
var hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16);
|
||||
return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)};
|
||||
},
|
||||
HexToHSB = function (hex) {
|
||||
return RGBToHSB(HexToRGB(hex));
|
||||
},
|
||||
RGBToHSB = function (rgb) {
|
||||
var hsb = {};
|
||||
hsb.b = Math.max(Math.max(rgb.r,rgb.g),rgb.b);
|
||||
hsb.s = (hsb.b <= 0) ? 0 : Math.round(100*(hsb.b - Math.min(Math.min(rgb.r,rgb.g),rgb.b))/hsb.b);
|
||||
hsb.b = Math.round((hsb.b /255)*100);
|
||||
if((rgb.r==rgb.g) && (rgb.g==rgb.b)) hsb.h = 0;
|
||||
else if(rgb.r>=rgb.g && rgb.g>=rgb.b) hsb.h = 60*(rgb.g-rgb.b)/(rgb.r-rgb.b);
|
||||
else if(rgb.g>=rgb.r && rgb.r>=rgb.b) hsb.h = 60 + 60*(rgb.g-rgb.r)/(rgb.g-rgb.b);
|
||||
else if(rgb.g>=rgb.b && rgb.b>=rgb.r) hsb.h = 120 + 60*(rgb.b-rgb.r)/(rgb.g-rgb.r);
|
||||
else if(rgb.b>=rgb.g && rgb.g>=rgb.r) hsb.h = 180 + 60*(rgb.b-rgb.g)/(rgb.b-rgb.r);
|
||||
else if(rgb.b>=rgb.r && rgb.r>=rgb.g) hsb.h = 240 + 60*(rgb.r-rgb.g)/(rgb.b-rgb.g);
|
||||
else if(rgb.r>=rgb.b && rgb.b>=rgb.g) hsb.h = 300 + 60*(rgb.r-rgb.b)/(rgb.r-rgb.g);
|
||||
else hsb.h = 0;
|
||||
hsb.h = Math.round(hsb.h);
|
||||
return hsb;
|
||||
},
|
||||
HSBToRGB = function (hsb) {
|
||||
var rgb = {};
|
||||
var h = Math.round(hsb.h);
|
||||
var s = Math.round(hsb.s*255/100);
|
||||
var v = Math.round(hsb.b*255/100);
|
||||
if(s == 0) {
|
||||
rgb.r = rgb.g = rgb.b = v;
|
||||
} else {
|
||||
var t1 = v;
|
||||
var t2 = (255-s)*v/255;
|
||||
var t3 = (t1-t2)*(h%60)/60;
|
||||
if(h==360) h = 0;
|
||||
if(h<60) {rgb.r=t1; rgb.b=t2; rgb.g=t2+t3}
|
||||
else if(h<120) {rgb.g=t1; rgb.b=t2; rgb.r=t1-t3}
|
||||
else if(h<180) {rgb.g=t1; rgb.r=t2; rgb.b=t2+t3}
|
||||
else if(h<240) {rgb.b=t1; rgb.r=t2; rgb.g=t1-t3}
|
||||
else if(h<300) {rgb.b=t1; rgb.g=t2; rgb.r=t2+t3}
|
||||
else if(h<360) {rgb.r=t1; rgb.g=t2; rgb.b=t1-t3}
|
||||
else {rgb.r=0; rgb.g=0; rgb.b=0}
|
||||
}
|
||||
return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)};
|
||||
},
|
||||
RGBToHex = function (rgb) {
|
||||
var hex = [
|
||||
rgb.r.toString(16),
|
||||
rgb.g.toString(16),
|
||||
rgb.b.toString(16)
|
||||
];
|
||||
$.each(hex, function (nr, val) {
|
||||
if (val.length == 1) {
|
||||
hex[nr] = '0' + val;
|
||||
}
|
||||
});
|
||||
return hex.join('');
|
||||
},
|
||||
HSBToHex = function (hsb) {
|
||||
return RGBToHex(HSBToRGB(hsb));
|
||||
};
|
||||
return {
|
||||
init: function (options) {
|
||||
options = $.extend({}, defaults, options||{});
|
||||
if (typeof options.color == 'string') {
|
||||
options.color = HexToHSB(options.color);
|
||||
} else if (options.color.r != undefined && options.color.g != undefined && options.color.b != undefined) {
|
||||
options.color = RGBToHSB(options.color);
|
||||
} else if (options.color.h != undefined && options.color.s != undefined && options.color.b != undefined) {
|
||||
options.color = fixHSB(options.color);
|
||||
} else {
|
||||
return this;
|
||||
}
|
||||
options.origColor = options.color;
|
||||
return this.each(function () {
|
||||
if (!$(this).data('colorpickerId')) {
|
||||
var id = 'collorpicker_' + parseInt(Math.random() * 1000);
|
||||
$(this).data('colorpickerId', id);
|
||||
var cal = $(tpl).attr('id', id);
|
||||
if (options.flat) {
|
||||
cal.appendTo(this).show();
|
||||
} else {
|
||||
cal.appendTo(document.body);
|
||||
}
|
||||
options.fields = cal
|
||||
.find('input')
|
||||
.bind('keydown', keyDown)
|
||||
.bind('change', change)
|
||||
.bind('blur', blur)
|
||||
.bind('focus', focus);
|
||||
cal.find('span').bind('mousedown', downIncrement);
|
||||
options.selector = cal.find('div.colorpicker_color').bind('mousedown', downSelector);
|
||||
options.selectorIndic = options.selector.find('div div');
|
||||
options.hue = cal.find('div.colorpicker_hue div');
|
||||
cal.find('div.colorpicker_hue').bind('mousedown', downHue);
|
||||
options.newColor = cal.find('div.colorpicker_new_color');
|
||||
options.currentColor = cal.find('div.colorpicker_current_color');
|
||||
cal.data('colorpicker', options);
|
||||
cal.find('div.colorpicker_submit')
|
||||
.bind('mouseenter', enterSubmit)
|
||||
.bind('mouseleave', leaveSubmit)
|
||||
.bind('click', clickSubmit);
|
||||
fillRGBFields(options.color, cal.get(0));
|
||||
fillHSBFields(options.color, cal.get(0));
|
||||
fillHexFields(options.color, cal.get(0));
|
||||
setHue(options.color, cal.get(0));
|
||||
setSelector(options.color, cal.get(0));
|
||||
setCurrentColor(options.color, cal.get(0));
|
||||
setNewColor(options.color, cal.get(0));
|
||||
if (options.flat) {
|
||||
cal.css({
|
||||
position: 'relative',
|
||||
display: 'block'
|
||||
});
|
||||
} else {
|
||||
$(this).bind(options.eventName, show);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
showPicker: function() {
|
||||
return this.each( function () {
|
||||
if ($(this).data('colorpickerId')) {
|
||||
show.apply(this);
|
||||
}
|
||||
});
|
||||
},
|
||||
hidePicker: function() {
|
||||
return this.each( function () {
|
||||
if ($(this).data('colorpickerId')) {
|
||||
$('#' + $(this).data('colorpickerId')).hide();
|
||||
}
|
||||
});
|
||||
},
|
||||
setColor: function(col) {
|
||||
if (typeof col == 'string') {
|
||||
col = HexToHSB(col);
|
||||
} else if (col.r != undefined && col.g != undefined && col.b != undefined) {
|
||||
col = RGBToHSB(col);
|
||||
} else if (col.h != undefined && col.s != undefined && col.b != undefined) {
|
||||
col = fixHSB(col);
|
||||
} else {
|
||||
return this;
|
||||
}
|
||||
return this.each(function(){
|
||||
if ($(this).data('colorpickerId')) {
|
||||
var cal = $('#' + $(this).data('colorpickerId'));
|
||||
cal.data('colorpicker').color = col;
|
||||
cal.data('colorpicker').origColor = col;
|
||||
fillRGBFields(col, cal.get(0));
|
||||
fillHSBFields(col, cal.get(0));
|
||||
fillHexFields(col, cal.get(0));
|
||||
setHue(col, cal.get(0));
|
||||
setSelector(col, cal.get(0));
|
||||
setCurrentColor(col, cal.get(0));
|
||||
setNewColor(col, cal.get(0));
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
}();
|
||||
$.fn.extend({
|
||||
ColorPicker: ColorPicker.init,
|
||||
ColorPickerHide: ColorPicker.hide,
|
||||
ColorPickerShow: ColorPicker.show,
|
||||
ColorPickerSetColor: ColorPicker.setColor
|
||||
});
|
||||
})(jQuery);
|
Reference in New Issue
Block a user