first commit

This commit is contained in:
alazhar
2020-01-02 23:15:16 +07:00
commit eda9661806
3433 changed files with 595883 additions and 0 deletions

View File

@ -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);

View File

@ -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);