/* * Custom code goes here. * A template should always ship with an empty custom.js */ /*! * JavaScript Cookie v2.1.4 * https://github.com/js-cookie/js-cookie * * Copyright 2006, 2015 Klaus Hartl & Fagner Brack * Released under the MIT license */ //** Cookie **// ;(function (factory) { var registeredInModuleLoader = false; if (typeof define === 'function' && define.amd) { define(factory); registeredInModuleLoader = true; } if (typeof exports === 'object') { module.exports = factory(); registeredInModuleLoader = true; } if (!registeredInModuleLoader) { var OldCookies = window.Cookies; var api = window.Cookies = factory(); api.noConflict = function () { window.Cookies = OldCookies; return api; }; } }(function () { function extend () { var i = 0; var result = {}; for (; i < arguments.length; i++) { var attributes = arguments[ i ]; for (var key in attributes) { result[key] = attributes[key]; } } return result; } function init (converter) { function api (key, value, attributes) { var result; if (typeof document === 'undefined') { return; } // Write if (arguments.length > 1) { attributes = extend({ path: '/' }, api.defaults, attributes); if (typeof attributes.expires === 'number') { var expires = new Date(); expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5); attributes.expires = expires; } // We're using "expires" because "max-age" is not supported by IE attributes.expires = attributes.expires ? attributes.expires.toUTCString() : ''; try { result = JSON.stringify(value); if (/^[\{\[]/.test(result)) { value = result; } } catch (e) {} if (!converter.write) { value = encodeURIComponent(String(value)) .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent); } else { value = converter.write(value, key); } key = encodeURIComponent(String(key)); key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent); key = key.replace(/[\(\)]/g, escape); var stringifiedAttributes = ''; for (var attributeName in attributes) { if (!attributes[attributeName]) { continue; } stringifiedAttributes += '; ' + attributeName; if (attributes[attributeName] === true) { continue; } stringifiedAttributes += '=' + attributes[attributeName]; } return (document.cookie = key + '=' + value + stringifiedAttributes); } // Read if (!key) { result = {}; } // To prevent the for loop in the first place assign an empty array // in case there are no cookies at all. Also prevents odd result when // calling "get()" var cookies = document.cookie ? document.cookie.split('; ') : []; var rdecode = /(%[0-9A-Z]{2})+/g; var i = 0; for (; i < cookies.length; i++) { var parts = cookies[i].split('='); var cookie = parts.slice(1).join('='); if (cookie.charAt(0) === '"') { cookie = cookie.slice(1, -1); } try { var name = parts[0].replace(rdecode, decodeURIComponent); cookie = converter.read ? converter.read(cookie, name) : converter(cookie, name) || cookie.replace(rdecode, decodeURIComponent); if (this.json) { try { cookie = JSON.parse(cookie); } catch (e) {} } if (key === name) { result = cookie; break; } if (!key) { result[name] = cookie; } } catch (e) {} } return result; } api.set = api; api.get = function (key) { return api.call(api, key); }; api.getJSON = function () { return api.apply({ json: true }, [].slice.call(arguments)); }; api.defaults = {}; api.remove = function (key, attributes) { api(key, '', extend(attributes, { expires: -1 })); }; api.withConverter = init; return api; } return init(function () {}); })); //Function to convert hex format to a rgb color function rgb2hex(orig){ var rgb = orig.replace(/\s/g,'').match(/^rgba?\((\d+),(\d+),(\d+)/i); return (rgb && rgb.length === 4) ? "#" + ("0" + parseInt(rgb[1],10).toString(16)).slice(-2) + ("0" + parseInt(rgb[2],10).toString(16)).slice(-2) + ("0" + parseInt(rgb[3],10).toString(16)).slice(-2) : orig; } //** Theme Configuration Live demo **// //Columns var prevCol = belvg_column_value_hp; function applyColumn(newCol) { $('.theme-configurator .column').each(function(i, item){ $(item).removeClass('active'); $(item).find('span').removeClass('active'); if ($(item).attr('data-column') == newCol) { $(item).addClass('active'); $(item).find('span').addClass('active'); $('.product-miniature') .removeClass('col-' + prevCol) .addClass('col-' + newCol); } }); prevCol = newCol; } function applyColumnGrid(newCol) { $('.belvg_themeconfigurator__grid-switch span').each(function(i, item){ if ($(item).attr('data-grid') == newCol) { $(item).siblings().removeClass('current'); $(item).addClass('current'); $('.product-miniature') .removeClass('col-' + prevCol) .addClass('col-' + newCol); } }); prevCol = newCol; } function applyColumnDemo(newCol) { $('.theme-configurator .column').each(function(i, item){ $(item).removeClass('active'); $(item).find('span').removeClass('active'); if ($(item).attr('data-column') == newCol) { $(item).addClass('active'); $(item).find('span').addClass('active'); } }); prevCol = newCol; } /* if (Cookies.get('column')) { applyColumn(Cookies.get('column')); } */ if (Cookies.get('column')) { applyColumnGrid(Cookies.get('column')); } $('.column-value-input').attr('value' , belvg_column_value_hp); for (i = 0; i<=$('.theme-configurator .column').length -1; i++){ var columnVal = $('.theme-configurator .column').eq(i).attr('data-column'); if (columnVal == belvg_column_value_hp) { $('.theme-configurator .column').eq(i).addClass('active'); } } function defineSlideItems(belvg_column_value_hp){ $('.homepage-products-slider').owlCarousel({ loop:false, margin:10, navigation:true, pagination:false, items: belvg_column_value_hp, itemsCustom: [[0, 1], [420, 2], [960, belvg_column_value_hp]] }); var prevArr = ''; var nextArr = ''; function insertArrows(o, v){ o.html(v); } insertArrows($('.homepage-products-slider .owl-prev'), prevArr); insertArrows($('.homepage-products-slider .owl-next'), nextArr); } defineSlideItems(belvg_column_value_hp); $('#index .theme-configurator .column').click(function(){ var newCol = $(this).attr('data-column'); applyColumnDemo(newCol); // Cookies.set('column', newCol); var columnVal = $(this).attr('data-column'); $('.column-value-input').attr('value' , columnVal); $('.homepage-products-slider').data('owlCarousel').destroy(); defineSlideItems(newCol); }); $('#category .theme-configurator .column').click(function(){ var newCol = $(this).attr('data-column'); applyColumn(newCol); // Cookies.set('column', newCol); var columnVal = $(this).attr('data-column'); $('.column-value-input').attr('value' , columnVal); }); $('.belvg_themeconfigurator__grid-switch span').click(function(){ $(this).siblings().removeClass('current'); $(this).addClass('current'); var newCol = $(this).attr('data-grid'); applyColumnGrid(newCol); Cookies.set('column', newCol); }); /* $('#index .theme-configurator .column').click(function(){ var columnVal = $(this).attr('data-column'); $('.column-value-input').attr('value' , columnVal); $('.column-value-input-cp').attr('value' , 3); }); $('#category .theme-configurator .column').click(function(){ var columnVal = $(this).attr('data-column'); $('.column-value-input').attr('value' , 3); $('.column-value-input-cp').attr('value' , columnVal); }); */ //Set Colors (Module) $('.btn').not('.slider-btn').css({ 'background': belvg_color_value_btn, 'border-color': belvg_color_value_btn, 'color': belvg_color_value_btn_txt } ); // $('.block-social li a').css('color', belvg_color_left_social); //Links Hover function primaryColor(belvg_color_value_theme, belvg_color_left_footer, belvg_color_left_copy){ // $('#wrapper .breadcrumb li').eq(1).find('a').css('color', belvg_color_value_btn); $('.block-category .back-to i').css('color', belvg_color_value_theme); // $('.pagination .current a').css('color', belvg_color_value_btn); $('#checkout .card-block a').css('color', belvg_color_value_theme); $('#checkout .step-number').css('color', belvg_color_value_theme); $('#checkout .step-title i').css('color', belvg_color_value_theme); $('#checkout #content a').css('color', belvg_color_value_theme); $('#order-confirmation .card-block a').css('color', belvg_color_value_theme); $('body#checkout section.checkout-step .address-item.selected').css('border-color', belvg_color_value_theme); $('.custom-radio input[type="radio"]:checked + span').css('background-color', belvg_color_value_theme); $('.page-my-account #content .links a i').css('color', belvg_color_value_theme); $('.active_filters .clear-filters i').css('color', belvg_color_value_theme); $('#show-contacts svg').css('fill', belvg_color_value_theme); // $('#product .nav-link.active').css('color', belvg_color_value_btn); $('.group-span-filestyle .btn-default').css('background', belvg_color_value_theme); $('.contact-form .input-group-btn').css('border-color', belvg_color_value_theme); $('.contact-rich i').css('color', belvg_color_value_theme); $('.contact-rich a').css('color', belvg_color_value_theme); $('.table-labeled a').css('color', belvg_color_value_theme); $('.table-labeled .thead-default th').css('background', belvg_color_value_theme); /* $('#product .nav-link').click(function(){ $('#product .nav-link').removeAttr('style'); $(this).css('color', belvg_color_value_btn + 'important'); }); */ $('.btn').not('.slider-btn').not('.btn-touchspin').css({ 'background': belvg_color_value_btn, 'border-color': belvg_color_value_btn_border }); $('.btn').not('.slider-btn').not('.btn-touchspin').on('mouseover', function(){ $(this).css({ 'background': belvg_color_value_btn_hover, 'border-color': belvg_color_value_btn_hover, 'color': belvg_color_value_btn_txt_hover }); }); $('.btn').not('.slider-btn').not('.btn-touchspin').on('mouseout', function(){ $(this).css({ 'background': belvg_color_value_btn, 'border-color': belvg_color_value_btn_border, 'color': belvg_color_value_btn_txt }); }); /* $('.category-miniature').on('mouseover', function(){ $(this).find('a').css('color', belvg_color_value_btn); }); $('.category-miniature').on('mouseout', function(){ $(this).find('a').css('color', 'black'); }); */ /* $('.pagination li').not('current').find('a').on('mouseover', function(){ $(this).css('color', belvg_color_value_btn); }); $('.pagination li').not('current').find('a').on('mouseout', function(){ $(this).css('color', 'black'); }); */ /* $('.menu a').on('mouseover', function(){ $(this).css('color', belvg_color_value_btn); }); $('.menu a').on('mouseout', function(){ $(this).css('color', belvg_color_left_menu); }); */ /* $('#header .right-nav a').on('mouseover', function(){ $(this).css('color', belvg_color_value_btn); }); $('#header .right-nav a').on('mouseout', function(){ $(this).css('color', belvg_color_left_local); }); */ /* $('.block-social li a').on('mouseover', function(){ $(this).css('color', belvg_color_value_btn); }); $('.block-social li a').on('mouseout', function(){ $(this).css('color', belvg_color_left_social); }); */ /* $('.social-sharing li a').on('mouseover', function(){ $(this).css('color', belvg_color_value_btn); }); $('.social-sharing li a').on('mouseout', function(){ $(this).css('color', '#a3a3a3'); }); */ /* $('#cart a.label').on('mouseover', function(){ $(this).css('color', belvg_color_value_btn); }); $('#cart a.label').on('mouseout', function(){ $(this).css('color', '#505050'); }); */ /* $('.page-footer a').not('.btn').on('mouseover', function(){ $(this).css('color', belvg_color_value_btn); }); $('.page-footer a').not('.btn').on('mouseout', function(){ $(this).css('color', '#505050'); }); */ $('.address-footer a').on('mouseover', function(){ $(this).css('color', belvg_color_value_theme); }); $('.address-footer a').on('mouseout', function(){ $(this).css('color', '#121212'); }); $('.active_filters .clear-filters').on('mouseover', function(){ $(this).css('color', belvg_color_value_theme); }); $('.active_filters .clear-filters ').on('mouseout', function(){ $(this).css('color', '#1d1d1d'); }); } primaryColor(belvg_color_value_theme, belvg_color_left_footer, belvg_color_left_copy); //Demo, Module Config Functions function setDemo(item, value){ if($('.color-reset').hasClass('jscolor')) { $(item).removeAttr('style'); $(item).css('background-color', value); } else { $(item).val(value); } } function change_Demo(item_demo, item_change, prop){ $(item_demo).on('change', function(){ var val = $(this).val(); if ($(this).hasClass('jscolor')){ var val = '#' + val; } $(item_change).css(prop, val); }); } function setConfig(item, prop, value){ $(item).css(prop, value); } function set_hover_Config(item, action, value){ $(item).on(action, function(){ $(this).css('color', value); }); } function resetButton(itemsColor, itemsBg, itemsFill, demo){ for (var key in itemsColor) { setConfig(key, 'color', itemsColor[key]); } for (var key in itemsBg) { setConfig(key, 'background', itemsBg[key]); } for (var key in itemsFill) { setConfig(key, 'fill', itemsFill[key]); } for (var key in demo) { setDemo(key, demo[key]); } } function setDemoItems(itemsMap, demo){ for (var key in itemsMap.color){ change_Demo(key, itemsMap.color[key], 'color'); } for (var key in itemsMap.background){ change_Demo(key, itemsMap.background[key], 'background'); } for (var key in itemsMap.fill){ change_Demo(key, itemsMap.fill[key], 'fill'); } for (var key in demo) { setDemo(key, demo[key]); } } //THEME STYLE $('#color-bg').on('change', function(){ var val = $(this).val(); if ($(this).hasClass('jscolor')){ var val = '#' + val; } $('body').css('background', val); }); $('#color-btn').on('change', function(){ var newval = $(this).val(); if ($(this).hasClass('jscolor')){ var newval = '#' + newval; } var socicon = $('#color-left-social').val(); if ($('#color-left-social').hasClass('jscolor')){ var socicon = '#' + socicon; } var leftMenu = $('#color-left-menu').val(); if ($('#color-left-menu').hasClass('jscolor')){ var leftMenu = '#' + leftMenu; } var footerVal = $('#color-left-footer').val(); if ($('#color-left-footer').hasClass('jscolor')){ var footerVal = '#' + footerVal; } var copyVal = $('#color-left-copy').val(); if ($('#color-left-copy').hasClass('jscolor')){ var copyVal = '#' + copyVal; } // primaryColor(newval, footerVal, socicon, copyVal); /* $('#product .nav-link.active').css('color', newval + 'important'); $('#product .nav-link').click(function(){ $('#product .nav-link').removeAttr('style'); $(this).css('color', newval + 'important'); }); */ /* $('.block-social li a').on('mouseover', function(){ $(this).attr('style', ' '); $(this).css('color', newval); }); $('.block-social li a').on('mouseout', function(){ $(this).css('color', socicon); }); */ /* $('.social-sharing li a').on('mouseover', function(){ $(this).attr('style', ' '); $(this).css('color', newval); }); $('.social-sharing li a').on('mouseout', function(){ $(this).css('color', '#a3a3a3'); }); */ /* $('.menu a').on('mouseover', function(){ $(this).css('color', newval); }); $('.menu a').on('mouseout', function(){ $(this).css('color', leftMenu); }); */ /* $('.footer-container .links a').on('mouseover', function(){ $(this).css('color', newval); }); $('.footer-container .links a').on('mouseout', function(){ $(this).css('color', footerVal); }); $('.footer-container ._blank').on('mouseover', function(){ $(this).css('color', newval); }); $('.footer-container ._blank').on('mouseout', function(){ $(this).css('color', copyVal); }); */ }); $('#color-theme').on('change', function(){ var val = $(this).val(); if ($(this).hasClass('jscolor')){ var val = '#' + val; } primaryColor(val, belvg_color_left_footer, belvg_color_left_copy); }); var themeItems = { background:{ 'body': belvg_color_value_bg, '.products .thumbnail-container': belvg_color_value_bg }, color: { '.btn': belvg_color_value_btn_txt } } var themeItems_demo = { '#color-theme': belvg_color_value_theme, '#color-bg': belvg_color_value_bg, '#color-btn': belvg_color_value_btn, '#color-btn-border': belvg_color_value_btn_border, '#color-btn-hover': belvg_color_value_btn_hover, '#color-btn-txt': belvg_color_value_btn_txt, '#color-btn-txt-hover': belvg_color_value_btn_txt_hover } var themeItems_map = { background: { '#color-bg': 'body', '#color-bg': '.products .thumbnail-container', '#color-btn': '.btn', '#color-btn-hover': '.btn' }, color: { '#color-btn-txt': '.btn' } } //Set setDemoItems(themeItems_map, themeItems_demo); $('#color-btn').on('change', function(){ var newval = $(this).val(); var borderColor = $('#color-btn-border').val(); var currentval = $('#color-btn-hover').val(); $('.btn').not('.slider-btn').not('.btn-touchspin').on('mouseover', function(){ $(this).css({ 'background': currentval, 'border-color': currentval }); }); $('.btn').not('.slider-btn').not('.btn-touchspin').on('mouseout', function(){ $(this).css({ 'background': newval, 'border-color': borderColor }); }); $('#color-btn-hover').on('change', function(){ var newval = $(this).val(); var currentval = $('#color-btn').val(); var textval = $('#color-btn-txt').val(); var borderColor = $('#color-btn-border').val(); $('.btn').css('background', currentval); $('.btn').not('.slider-btn').not('.btn-touchspin').on('mouseover', function(){ $(this).css({ 'color': textval, 'background': newval, 'border-color': newval }); }); $('.btn').not('.slider-btn').not('.btn-touchspin').on('mouseout', function(){ $(this).css({ 'color': textval, 'background': currentval, 'border-color': borderColor }); }); }); }); $('#color-btn-txt').on('change', function(){ var textval = $(this).val(); var textvalHover = $('#color-btn-txt-hover').val(); if ($(this).hasClass('jscolor')){ var textval = '#' + textval; } if ($('#color-btn-txt-hover').hasClass('jscolor')){ var textvalHover = '#' + textvalHover; } $('.btn').not('.slider-btn').not('.btn-touchspin').on('mouseover', function(){ $(this).css({ 'color': textvalHover }); }); $('.btn').not('.slider-btn').not('.btn-touchspin').on('mouseout', function(){ $(this).css({ 'color': textval }); }); }); $('#color-btn-hover').on('change', function(){ var newval = $(this).val(); var currentval = $('#color-btn').val(); var textval = $('#color-btn-txt').val(); var textvalHover = $('#color-btn-txt-hover').val(); var borderColor = $('#color-btn-border').val(); if ($(this).hasClass('jscolor')){ var newval = '#' + newval; } if ($('#color-btn').hasClass('jscolor')){ var currentval = '#' + currentval; } if ($('#color-btn-txt').hasClass('jscolor')){ var textval = '#' + textval; } if ($('#color-btn-txt-hover').hasClass('jscolor')){ var textvalHover = '#' + textvalHover; } if ($('#color-btn-border').hasClass('jscolor')){ var borderColor = '#' + borderColor; } $('.btn').css('background', belvg_color_value_btn); $('.btn').not('.slider-btn').not('.btn-touchspin').on('mouseover', function(){ $(this).css({ 'color': textvalHover, 'background': newval, 'border-color': newval }); }); $('.btn').not('.slider-btn').not('.btn-touchspin').on('mouseout', function(){ $(this).css({ 'color': textval, 'background': belvg_color_value_btn, 'border-color': borderColor }); }); }); $('#color-btn-border').on('change', function(){ var val = $(this).val(); if ($(this).hasClass('jscolor')){ var val = '#' + val; } var hoverval = $('#color-btn-hover').val(); if ($('#color-btn-hover').hasClass('jscolor')){ var hoverval = '#' + hoverval; } /* var hovercolor = $('#color-btn-txt-hover').val(); var colorval = $('#color-btn-txt').val(); if ($('#color-btn-txt-hover').hasClass('jscolor')){ var hovercolor = '#' + hovercolor; } if ($('#color-btn-txt').hasClass('jscolor')){ var colorval = '#' + colorval; } */ $('.btn').not('.slider-btn').not('.btn-touchspin').css('border-color', val); $('.btn').not('.slider-btn').not('.btn-touchspin').on('mouseover', function(){ $(this).css({ // 'background': currentval, // 'color': hovercolor, 'border-color': hoverval }); }); $('.btn').not('.slider-btn').not('.btn-touchspin').on('mouseout', function(){ $(this).css({ // 'background': newval, // 'color': colorval, 'border-color': val }); }); }); $('#color-btn-txt-hover').on('change', function(){ var val = $(this).val(); var normalval = $('#color-btn-txt').val(); if ($(this).hasClass('jscolor')){ var val = '#' + val; } if ($('#color-btn-txt').hasClass('jscolor')){ var normalval = '#' + normalval; } $('.btn').not('.slider-btn').not('.btn-touchspin').css('color', normalval); $('.btn').not('.slider-btn').not('.btn-touchspin').on('mouseover', function(){ $(this).css({ // 'background': currentval, 'color': val }); }); $('.btn').not('.slider-btn').not('.btn-touchspin').on('mouseout', function(){ $(this).css({ // 'background': newval, 'color': normalval }); }); }); //Reset $('.theme-configurator .theme-style .color-reset').click(function(){ resetButton(themeItems.color, themeItems.background, '', themeItems_demo); primaryColor(belvg_color_value_theme, belvg_color_left_footer, belvg_color_left_copy); }); //Set Menu Colors (Module) var menuModuleItems = { mouseover: { '.menu a': belvg_color_left_menu_hover // '.footer-container a': belvg_color_left_footer_hover, // '#header .right-nav a': belvg_color_left_local_hover }, mouseout: { '.menu a': belvg_color_left_menu, '.footer-container a': belvg_color_left_footer // '#header .right-nav a': belvg_color_left_local } } //SLIDER /* var sliderItems = { background:{ // '#carousel': belvg_color_value_bg_slider, '.slider-btn': belvg_color_value_btn_slider }, color: { '.caption h1': belvg_color_value_txt_slider, '.slider-btn': belvg_color_value_btn_txt_slider } } */ /* var sliderItems_demo = { // '#color-bg-slider': belvg_color_value_bg_slider, '#color-desc-slider': belvg_color_value_txt_slider, '#color-btn-slider': belvg_color_value_btn_slider, '#color-btn-txt-slider': belvg_color_value_btn_txt_slider } var sliderItems_map = { background: { // '#color-bg-slider': '#carousel', '#color-btn-slider': '.slider-btn' }, color: { '#color-desc-slider': '.caption h1', '#color-btn-txt-slider': '.slider-btn' } } */ //Set // setDemoItems(sliderItems_map, sliderItems_demo); //Reset $('.theme-configurator .slider .color-reset').click(function(){ resetButton(sliderItems.color, sliderItems.background, '', sliderItems_demo); }); //FOOTER var footerItems = { color:{ '.footer-container .links li a': belvg_color_left_footer, '.footer-container .links h3': belvg_color_left_footer_title, '.footer-container .block-contact i': belvg_color_left_footer_icons, '.footer-container ._blank': belvg_color_left_copy }, background: { '.footer-container': belvg_color_left_footer_bg } } var footerItems_demo = { '#color-left-footer-bg': belvg_color_left_footer_bg, '#color-left-footer': belvg_color_left_footer, '#color-left-footer-title': belvg_color_left_footer_title, '#color-left-footer-icons': belvg_color_left_footer_icons, '#color-left-copy': belvg_color_left_copy } var footerItems_map = { color: { '#color-left-footer': '.footer-container .links li a', '#color-left-footer-title': '.footer-container .links h3', '#color-left-footer-icons': '.footer-container .block-contact i', '#color-left-copy': '.footer-container ._blank' }, background: { '#color-left-footer-bg':'.footer-container' } } //Set setDemoItems(footerItems_map, footerItems_demo); //LEFT PANEL var leftPanelItems = { color:{ // '.menu > a': belvg_color_left_menu, '.menu>.top-menu>li>a': belvg_color_left_menu, /* '.footer-container li a': belvg_color_left_footer, '.footer-container .links h3': belvg_color_left_footer_title, */ // '#header .right-nav a': belvg_color_left_local, // '#header .right-nav .expand-more': belvg_color_left_local, // '.footer-container ._blank': belvg_color_left_copy, // '.footer-container .block-social li a': belvg_color_left_social '.cart-products-count': belvg_color_left_icons }, fill: { '#header .header-top .position-static svg': belvg_color_left_icons // '#header .header-top .position-static svg': belvg_color_left_icons_hover }, background: { '#header': belvg_color_left_bg, '#_desktop_top_menu': belvg_color_left_nav_bg, // '.footer-container': belvg_color_left_footer_bg } } var leftPanelItems_demo = { '#color-left-bg': belvg_color_left_bg, '#color-left-nav-bg': belvg_color_left_nav_bg, '#color-left-icon': belvg_color_left_icons, // '#color-left-icon-hover': belvg_color_left_icons_hover, '#color-left-menu': belvg_color_left_menu, '#color-left-menu-hover': belvg_color_left_menu_hover, '#color-left-menu-bg-hover': belvg_color_left_menu_bg_hover, /* '#color-left-footer-bg': belvg_color_left_footer_bg, '#color-left-footer': belvg_color_left_footer, */ // '#color-left-social': belvg_color_left_social, // '#color-left-footer-title': belvg_color_left_footer_title, /* '#color-left-copy': belvg_color_left_copy, '#color-left-footer-icons': belvg_color_left_footer_icons */ } var leftPanelItems_map = { color: { '#color-left-menu': '.menu>.top-menu>li>a', // '#color-left-menu': '.menu a .add', // '#color-left-menu-hover': '.menu>.top-menu>.category>a', // '#color-left-footer': '.footer-container li a', // '#color-left-footer-title': '.footer-container .links h3', /* '#color-left-social': '.footer-container .block-social li a', '#color-left-local': '#header .right-nav a', */ '#color-left-local': '#header .right-nav .expand-more', '#color-left-local-hover': '#header .right-nav a', /* '#color-left-copy': '.footer-container ._blank', '#color-left-footer-icons': '.footer-container .block-contact i' */ }, fill: { '#color-left-icon': '#header .header-top .position-static svg' // '#color-left-icon-hover': '#header .header-top .position-static svg' }, background: { '#color-left-bg': '#header', '#color-left-nav-bg': '#_desktop_top_menu' // '#color-left-footer-bg':'.footer-container' } } //Set setDemoItems(leftPanelItems_map, leftPanelItems_demo); $('.footer-container .links h3').css('color', belvg_color_left_footer_title); $('.footer-container .links a').css('color', belvg_color_left_footer); $('.footer-container .block-contact span').css('color', belvg_color_left_footer); $('.footer-container ._blank').css('color', belvg_color_left_copy); // $('#header .header-top .position-static svg').css('fill', belvg_color_left_icons); $('#_mobile_cart>.cart-preview').css('background', belvg_color_left_bg); $('.menu>.top-menu>li.current>a').css({ 'color': belvg_color_left_menu_hover, 'background': belvg_color_left_menu_bg_hover }); $('.menu>.top-menu>li.current>a').on('mouseover', function(){ $(this).css({ 'color': belvg_color_left_menu_hover, 'background': belvg_color_left_menu_bg_hover }); }); $('.menu>.top-menu>li.current>a').on('mouseout', function(){ $(this).css({ 'color': belvg_color_left_menu_hover, 'background': belvg_color_left_menu_bg_hover }); }); var menuItem = $('#_desktop_top_menu>.top-menu>li'); var menuHoverBg = $('#color-left-menu-bg-hover').val(); var menuHoverColor = $('#color-left-menu-hover').val(); var menuColor = $('#color-left-menu').val(); var menuHoverLink = function(menuHoverBg, menuHoverColor, menuColor){ menuItem.on('mouseover', function(){ $(this).css( 'background', menuHoverBg ); $(this).find('>a').css('color', menuHoverColor); }); menuItem.on('mouseout', function(){ $(this).css('background', 'transparent'); $(this).find('>a').css( 'color', menuColor ); if ($(this).hasClass('current') == true){ $(this).find('>a').css( 'color', menuHoverColor ); } }); } menuHoverLink(menuHoverBg, menuHoverColor, menuColor); //Reset $('.theme-configurator .left-panel .color-reset').click(function(){ resetButton(leftPanelItems.color, leftPanelItems.background, leftPanelItems.fill, leftPanelItems_demo); $('#_desktop_top_menu>.top-menu>li').on('mouseout', function(){ $(this).find('>a').css({ 'color': belvg_color_left_menu, 'background': 'transparent' }); }); $('#_desktop_top_menu>.top-menu>li').on('mouseover', function(){ $(this).css('background', 'transparent'); $(this).find('>a').css({ 'color': belvg_color_left_menu_hover, 'background': belvg_color_left_menu_bg_hover }); }); $('.search-widget input').css('border-color', belvg_color_left_icons); function resize1(){ if ($(window).width() > 1024) { $('#header .header-top .position-static .row').css('background', 'transparent'); } else { $('#header .header-top .position-static .row').css('background', belvg_color_left_bg); } } resize1(); $(window).resize(resize1); }); $('#color-left-menu-bg-hover').on('change', function(){ var val = $(this).val(); if ($(this).hasClass('jscolor')){ var val = '#' + val; } var colorVal = $('#color-left-menu').val(); if ($(this).hasClass('jscolor')){ var colorVal = '#' + colorVal; } var hoverVal = $('#color-left-menu-hover').val(); if ($(this).hasClass('jscolor')){ var hoverVal = '#' + hoverVal; } $('.menu>.top-menu>li>a').on('mouseover', function(){ $(this).css({ 'color': hoverVal, 'background': val }); }); $('.menu>.top-menu>li>a').on('mouseout', function(){ $(this).css({ 'color': colorVal, 'background': 'transparent' }); }); $('.menu>.top-menu>li.current>a').css({ 'color': hoverVal, 'background': val }); $('.menu>.top-menu>li.current>a').on('mouseover', function(){ $(this).css({ 'color': hoverVal, 'background': val }); }); $('.menu>.top-menu>li.current>a').on('mouseout', function(){ $(this).css({ 'color': hoverVal, 'background': val }); }); menuHoverLink(val, hoverVal, colorVal); }); $('#color-left-menu-hover').on('change', function(){ var val = $(this).val(); if ($(this).hasClass('jscolor')){ var val = '#' + val; } var nothoverVal = $('#color-left-menu').val(); if ($('#color-left-menu').hasClass('jscolor')){ var hoverVal = '#' + nothoverVal; } var hoverval = $('#color-left-menu-bg-hover').val(); if ($('#color-left-menu-bg-hover').hasClass('jscolor')){ var hoverval = '#' + hoverval; } $('.menu>.top-menu>li.current>a').css('color', val); $('.menu>.top-menu>li>a').on('mouseover', function(){ $(this).css('color', val); }); $('.menu>.top-menu>li>a').on('mouseout', function(){ $(this).css('color', nothoverVal); }); menuHoverLink(hoverval, val, nothoverVal); /* $('.menu>.top-menu>li.current>a') $(this).css({ 'color': val }); */ }); $('#color-left-footer-icons').on('change', function(){ var val = $(this).val(); if ($(this).hasClass('jscolor')){ var val = '#' + val; } $('.footer-container .block-contact i').css('color', val); $('.footer-container .block-social li a').css('color', val); }); $('#color-left-footer').on('change', function(){ var val = $(this).val(); if($(this).hasClass('jscolor')){ var val = '#' + val; } var hoverVal = $('#btn-color').val(); if($('#btn-color').hasClass('jscolor')){ var hoverVal = '#' + hoverVal; } $('.footer-container .block-contact span').css('color', val); $('.footer-container .links a').css('color', val); /* $('.footer-container .links a').on('mouseover', function(){ $(this).css('color', hoverVal); }); $('.footer-container .links a').on('mouseout', function(){ $(this).css('color', val); }); */ }); $('#color-left-copy').on('change', function(){ var val = $(this).val(); if($(this).hasClass('jscolor')){ var val = '#' + val; } /* var hoverVal = $('#btn-color').val(); if($('#btn-color').hasClass('jscolor')){ var hoverVal = '#' + hoverVal; } */ $('.footer-container ._blank').css('color', val); /* $('.footer-container ._blank').on('mouseover', function(){ $(this).css('color', hoverVal); }); $('.footer-container ._blank').on('mouseout', function(){ $(this).css('color', val); }); */ }); $('#header .right-nav a').css('background', belvg_color_left_bg); $('#_mobile_top_menu').css('background', belvg_color_left_nav_bg); /* $('#color-left-icon').on('change', function(){ var newval = $(this).val(); if ($(this).hasClass('jscolor')){ var newval = '#' + newval; } var currentval = $('#color-left-icon-hover').val(); if ($(this).hasClass('jscolor')){ var currentval = '#' + currentval; } $('#header .header-top .position-static svg').on('mouseover', function(){ $(this).css('fill', currentval); }); $('#header .header-top .position-static #_desktop_cart').on('mouseover', function(){ $(this).find('svg').css('fill', currentval); }); $('#header .header-top .position-static svg').on('mouseout', function(){ $(this).css('fill', newval); }); $('#header .header-top .position-static #_desktop_cart').on('mouseout', function(){ $(this).find('svg').css('fill', newval); }); }); */ $('#color-left-icon').on('change', function(){ var val = $(this).val(); if ($(this).hasClass('jscolor')){ var val = '#' + val; } $('.cart-products-count').css('color', val); $('.header-top .search-widget form input[type=text]').css('border-color', val); $('.search-toggle svg').css('color', val); }); $('#color-left-bg').on('change', function(){ var bgval = $(this).val(); if ($(this).hasClass('jscolor')){ var bgval = '#' + bgval; } $('#header .right-nav a').css('background', bgval); }); $('#color-left-menu').on('change', function(){ var menuHover = $('#color-left-menu-hover').val(); var menuHoverBg = $('#color-left-menu-bg-hover').val(); var val = $(this).val(); if($(this).hasClass('jscolor')){ var val = '#' + val; } if($('#color-left-menu-hover').hasClass('jscolor')){ var menuHover = '#' + menuHover; } if($('#color-left-menu-bg-hover').hasClass('jscolor')){ var menuHoverBg = '#' + menuHoverBg; } $('.menu>.top-menu>li>a').on('mouseover', function(){ $(this).css('color', menuHover); }); $('.menu>.top-menu>li>a').on('mouseout', function(){ $(this).css('color', val); }); menuHoverLink(menuHoverBg, menuHover, val); }); $('#color-left-copy').on('change', function(){ $('.footer-container ._blank').css('color', $(this).val()); }); //Resize $('#color-left-bg').on('change', function(){ var newval = $(this).val(); if ($(this).hasClass('jscolor')){ var newval = '#' + newval; } $('#header .header-top .position-static .row').css('background', newval); // $('.footer-container').css('background', newval); function resize1(){ if ($(window).width() > 1024) { $('#header .header-top .position-static .row').css('background', 'transparent'); // $('.footer-container').css('background', 'transparent'); } else { $('#header .header-top .position-static .row').css('background', newval); // $('.footer-container').css('background', newval); } } resize1(); $(window).resize(resize1); }); function leftPanelConfigReset(p){ for (var key in leftPanelItems.p) { leftPanelConfig(key, p, leftPanelItems.p[key]); } } function footerConfigReset(p){ for (var key in footerItems.p) { footerConfig(key, p, footerItems.p[key]); } } //Reset $('.theme-configurator .footer .color-reset').click(function(){ resetButton(footerItems.color, footerItems.background, '', footerItems_demo); $('.footer-container .block-contact span').css('color', belvg_color_left_footer); $('.footer-container .block-social a').css('color', belvg_color_left_footer_icons); }); //HOMEPAGE TABS var hometabsItems_demo = { // '#color-tabs-bg': belvg_color_value_tabs_bg, '#color-tabs-txt': belvg_color_value_tabs_color, // '#color-tabs-active-bg': belvg_color_value_tabs_active_bg, '#color-tabs-active-color': belvg_color_value_tabs_active_color } var hometabsItems = { /* background: { '#homepage-tabs': belvg_color_value_tabs_bg, '#homepage-tabs .nav-item .active': belvg_color_value_tabs_active_bg }, */ color: { '#homepage-tabs .nav-item .nav-link': belvg_color_value_tabs_color, '#homepage-tabs .nav-item .active': belvg_color_value_tabs_active_color } } var hometabsItems_map = { /* background: { '#color-tabs-bg': '#homepage-tabs', '#color-tabs-active-bg': '#homepage-tabs .nav-item .active' }, */ color: { '#color-tabs-txt': '#homepage-tabs .nav-item .nav-link', '#color-tabs-active-color': '#homepage-tabs .nav-item .active' } } $('#homepage-tabs .nav-link').css({ 'color': belvg_color_value_tabs_color, 'border-color': 'transparent' }); $('#homepage-tabs .nav-link.active').css({ 'color': belvg_color_value_tabs_active_color, 'border-color': belvg_color_value_tabs_active_color }); //Set Active Tab if Live Demo enabled // if (live_demo == 1){ $(document).ready(function(){ $('#homepage-tabs .nav-link.active').css({ // 'background': belvg_color_value_tabs_active_bg, 'color': belvg_color_value_tabs_active_color, 'border-color': belvg_color_value_tabs_active_color }); $('#homepage-tabs .nav-link').click(function(){ $('#homepage-tabs .nav-link').removeClass('active').css({ // 'background': $('#color-tabs-bg').val(), 'color': belvg_color_value_tabs_color, 'border-color': 'transparent' }); $(this).addClass('active').css({ // 'background': belvg_color_value_tabs_active_bg, 'color': belvg_color_value_tabs_active_color, 'border-color': belvg_color_value_tabs_active_color }); }); }); // } /* if (skin_color == 1) { $('#color-left-bg').val('#333333'); } if (skin_color == 0) { $('#color-left-bg').val('#ffffff'); } */ /* $('#color-tabs-bg').on('change', function(){ var val = $(this).val(); if ($(this).hasClass('jscolor')){ val = '#' + val; } $('#homepage-tabs .nav-item .nav-link').not('.active').css('background', val); }); */ $(document).ready(function(){ $('#color-tabs-txt').on('change', function(){ var val = $(this).val(); if ($(this).hasClass('jscolor')){ val = '#' + val; } $('#homepage-tabs .nav-item .nav-link').not('.active').css('color', val); var tabcolorA = $('#color-tabs-active-color').val(); if ($('#color-tabs-active-color').hasClass('jscolor')){ tabcolorA = '#' + tabcolorA; } var tabcolor = $('#color-tabs-txt').val(); if ($('#color-tabs-txt').hasClass('jscolor')){ tabcolor = '#' + tabcolor; } var tabbgA = $('#color-tabs-active-bg').val(); if ($('#color-tabs-active-bg').hasClass('jscolor')){ tabbgA = '#' + tabbgA; } $('#homepage-tabs .nav-item .nav-link.active').css({ 'color': tabcolorA, 'border-color': tabcolorA }); $('#homepage-tabs .nav-item .nav-link').click(function(){ $('#homepage-tabs .nav-item .nav-link').removeAttr('style').css({ // 'background': 'transparent', 'color': tabcolor, 'border-color': 'transparent' }); $('#homepage-tabs .nav-item .nav-link').removeClass('active'); $(this).css({ // 'background': tabbgA, 'color': tabcolorA, 'border-color': tabcolorA }); }); }); }); $('#color-tabs-active-color').on('change', function(){ var val = $(this).val(); if ($(this).hasClass('jscolor')){ val = '#' + val; } /* var tabbgA = $('#color-tabs-active-bg').val(); if ($('#color-tabs-active-bg').hasClass('jscolor')){ tabbgA = '#' + tabbgA; } */ $('#homepage-tabs .nav-item .nav-link.active').css('border-color', val); $('#homepage-tabs .nav-item .nav-link').click(function(){ $(this).css({ // 'background': tabbgA, 'color': val, 'border-color': val }); }); }); /* $('#color-tabs-active-bg').on('change', function(){ var val = $(this).val(); if ($(this).hasClass('jscolor')){ val = '#' + val; } var tabcolorA = $('#color-tabs-active-color').val(); if ($('#color-tabs-active-color').hasClass('jscolor')){ tabcolorA = '#' + tabcolorA; } var tabcolor = $('#color-tabs-txt').val(); if ($('#color-tabs-txt').hasClass('jscolor')){ tabcolor = '#' + tabcolor; } $('#homepage-tabs .nav-item .nav-link').click(function(){ $('#homepage-tabs .nav-item .nav-link').removeAttr('style').css({ 'color': tabcolor, 'border-color': 'transparent' }); $('#homepage-tabs .nav-item .nav-link').removeClass('active'); $(this).css({ 'color': tabcolorA, 'border-color': 'transparent' }); }); }); */ //Set setDemoItems(hometabsItems_map, hometabsItems_demo); //Reset $('.theme-configurator .hp-tabs .color-reset').click(function(){ resetButton(hometabsItems.color, hometabsItems.background, '', hometabsItems_demo); if ($('.black-skin').hasClass('active')) { $('#color-left-bg').val('#333333'); } else { $('#color-left-bg').val('#ffffff'); } $('#homepage-tabs .nav-item .nav-link').not('.active').css('background', 'transparent'); $('#homepage-tabs .nav-item .nav-link').click(function(){ $('#homepage-tabs .nav-item .nav-link').not('.active').css('color', belvg_color_value_tabs_color); $(this).css({ // 'background':belvg_color_value_tabs_active_bg, 'color': belvg_color_value_tabs_active_color, 'border-color': belvg_color_value_tabs_active_color }); }); }); //PRODUCT LIST var productList_demo = { '#color-pl-name': belvg_color_value_pl_name, '#color-pl-price': belvg_color_value_pl_price } var productList_items = { color: { '.products .product-title a': belvg_color_value_pl_name, '.products .product-price-and-shipping .price': belvg_color_value_pl_price } } var productList_map = { color: { '#color-pl-name': '.products .product-title a', '#color-pl-price': '.products .product-price-and-shipping .price', } } $('#color-pl-name').on('change', function(){ var colorval = $('#color-pl-name').val(); if ($(this).hasClass('jscolor')){ var colorval = '#' + colorval; } $('.products .product-title a').css('color', colorval); }); $('#color-pl-price').on('change', function(){ var colorval = $('#color-pl-price').val(); if ($(this).hasClass('jscolor')){ var colorval = '#' + colorval; } $('.products .product-price-and-shipping .price').css('color', colorval); }); for (var key in productList_map.color){ change_Demo(key, productList_map.color[key], 'color'); } for (var key in productList_demo) { setDemo(key, productList_demo[key]); } $('.theme-configurator .product-hover .color-reset').click(function(){ resetButton(productList_items.color, '', '', productList_demo); }); //Toggler $('.theme-configurator .settings-toggler').click(function(){ $(this).toggleClass('move'); $(this).parent().toggleClass('hide'); }); //Skins $('.theme-configurator .js-skin').click(function(){ $(this).addClass('active'); $(this).siblings().removeClass('active'); }); if ($('.check-skin').length == 1) { $('.theme-configurator .black-skin').addClass('active'); $('.theme-configurator .white-skin').removeClass('active'); if (belvg_color_left_bg == 'transparent') { $('#color-left-bg').val('#333333'); } else { $('#color-left-bg').val(belvg_color_left_bg); } } else { if (belvg_color_left_bg == 'transparent') { $('#color-left-bg').val('#ffffff'); } else { $('#color-left-bg').val(belvg_color_left_bg); } } /* if (belvg_color_left_bg !== 'transparent') { $('.theme-skin').hide(); } */ $('.demo-title').click(function(){ $(this).toggleClass('active'); $(this).next().slideToggle(200); }); /* $('#index .columns-wrap .column').click(function(){ $('html, body').animate({ scrollTop: $("#home-page-tabs").offset().top }, 1000); }); */ $('.theme-colors_block.slider .theme-bg').click(function(){ $('html, body').animate({ scrollTop: $("#carousel").offset().top }, 1000); }); $('.theme-colors_block.product-hover .theme-bg').click(function(){ $('html, body').animate({ scrollTop: $("#homepage-tabs").offset().top }, 1000); }); /** * jscolor - JavaScript Color Picker * * @link http://jscolor.com * @license For open source use: GPLv3 * For commercial use: JSColor Commercial License * @author Jan Odvarko * @version 2.0.4 * * See usage examples at http://jscolor.com/examples/ */ "use strict"; if (!window.jscolor) { window.jscolor = (function () { var jsc = { register : function () { jsc.attachDOMReadyEvent(jsc.init); jsc.attachEvent(document, 'mousedown', jsc.onDocumentMouseDown); jsc.attachEvent(document, 'touchstart', jsc.onDocumentTouchStart); jsc.attachEvent(window, 'resize', jsc.onWindowResize); }, init : function () { if (jsc.jscolor.lookupClass) { jsc.jscolor.installByClassName(jsc.jscolor.lookupClass); } }, tryInstallOnElements : function (elms, className) { var matchClass = new RegExp('(^|\\s)(' + className + ')(\\s*(\\{[^}]*\\})|\\s|$)', 'i'); for (var i = 0; i < elms.length; i += 1) { if (elms[i].type !== undefined && elms[i].type.toLowerCase() == 'color') { if (jsc.isColorAttrSupported) { // skip inputs of type 'color' if supported by the browser continue; } } var m; if (!elms[i].jscolor && elms[i].className && (m = elms[i].className.match(matchClass))) { var targetElm = elms[i]; var optsStr = null; var dataOptions = jsc.getDataAttr(targetElm, 'jscolor'); if (dataOptions !== null) { optsStr = dataOptions; } else if (m[4]) { optsStr = m[4]; } var opts = {}; if (optsStr) { try { opts = (new Function ('return (' + optsStr + ')'))(); } catch(eParseError) { jsc.warn('Error parsing jscolor options: ' + eParseError + ':\n' + optsStr); } } targetElm.jscolor = new jsc.jscolor(targetElm, opts); } } }, isColorAttrSupported : (function () { var elm = document.createElement('input'); if (elm.setAttribute) { elm.setAttribute('type', 'color'); if (elm.type.toLowerCase() == 'color') { return true; } } return false; })(), isCanvasSupported : (function () { var elm = document.createElement('canvas'); return !!(elm.getContext && elm.getContext('2d')); })(), fetchElement : function (mixed) { return typeof mixed === 'string' ? document.getElementById(mixed) : mixed; }, isElementType : function (elm, type) { return elm.nodeName.toLowerCase() === type.toLowerCase(); }, getDataAttr : function (el, name) { var attrName = 'data-' + name; var attrValue = el.getAttribute(attrName); if (attrValue !== null) { return attrValue; } return null; }, attachEvent : function (el, evnt, func) { if (el.addEventListener) { el.addEventListener(evnt, func, false); } else if (el.attachEvent) { el.attachEvent('on' + evnt, func); } }, detachEvent : function (el, evnt, func) { if (el.removeEventListener) { el.removeEventListener(evnt, func, false); } else if (el.detachEvent) { el.detachEvent('on' + evnt, func); } }, _attachedGroupEvents : {}, attachGroupEvent : function (groupName, el, evnt, func) { if (!jsc._attachedGroupEvents.hasOwnProperty(groupName)) { jsc._attachedGroupEvents[groupName] = []; } jsc._attachedGroupEvents[groupName].push([el, evnt, func]); jsc.attachEvent(el, evnt, func); }, detachGroupEvents : function (groupName) { if (jsc._attachedGroupEvents.hasOwnProperty(groupName)) { for (var i = 0; i < jsc._attachedGroupEvents[groupName].length; i += 1) { var evt = jsc._attachedGroupEvents[groupName][i]; jsc.detachEvent(evt[0], evt[1], evt[2]); } delete jsc._attachedGroupEvents[groupName]; } }, attachDOMReadyEvent : function (func) { var fired = false; var fireOnce = function () { if (!fired) { fired = true; func(); } }; if (document.readyState === 'complete') { setTimeout(fireOnce, 1); // async return; } if (document.addEventListener) { document.addEventListener('DOMContentLoaded', fireOnce, false); // Fallback window.addEventListener('load', fireOnce, false); } else if (document.attachEvent) { // IE document.attachEvent('onreadystatechange', function () { if (document.readyState === 'complete') { document.detachEvent('onreadystatechange', arguments.callee); fireOnce(); } }) // Fallback window.attachEvent('onload', fireOnce); // IE7/8 if (document.documentElement.doScroll && window == window.top) { var tryScroll = function () { if (!document.body) { return; } try { document.documentElement.doScroll('left'); fireOnce(); } catch (e) { setTimeout(tryScroll, 1); } }; tryScroll(); } } }, warn : function (msg) { if (window.console && window.console.warn) { window.console.warn(msg); } }, preventDefault : function (e) { if (e.preventDefault) { e.preventDefault(); } e.returnValue = false; }, captureTarget : function (target) { // IE if (target.setCapture) { jsc._capturedTarget = target; jsc._capturedTarget.setCapture(); } }, releaseTarget : function () { // IE if (jsc._capturedTarget) { jsc._capturedTarget.releaseCapture(); jsc._capturedTarget = null; } }, fireEvent : function (el, evnt) { if (!el) { return; } if (document.createEvent) { var ev = document.createEvent('HTMLEvents'); ev.initEvent(evnt, true, true); el.dispatchEvent(ev); } else if (document.createEventObject) { var ev = document.createEventObject(); el.fireEvent('on' + evnt, ev); } else if (el['on' + evnt]) { // alternatively use the traditional event model el['on' + evnt](); } }, classNameToList : function (className) { return className.replace(/^\s+|\s+$/g, '').split(/\s+/); }, // The className parameter (str) can only contain a single class name hasClass : function (elm, className) { if (!className) { return false; } return -1 != (' ' + elm.className.replace(/\s+/g, ' ') + ' ').indexOf(' ' + className + ' '); }, // The className parameter (str) can contain multiple class names separated by whitespace setClass : function (elm, className) { var classList = jsc.classNameToList(className); for (var i = 0; i < classList.length; i += 1) { if (!jsc.hasClass(elm, classList[i])) { elm.className += (elm.className ? ' ' : '') + classList[i]; } } }, // The className parameter (str) can contain multiple class names separated by whitespace unsetClass : function (elm, className) { var classList = jsc.classNameToList(className); for (var i = 0; i < classList.length; i += 1) { var repl = new RegExp( '^\\s*' + classList[i] + '\\s*|' + '\\s*' + classList[i] + '\\s*$|' + '\\s+' + classList[i] + '(\\s+)', 'g' ); elm.className = elm.className.replace(repl, '$1'); } }, getStyle : function (elm) { return window.getComputedStyle ? window.getComputedStyle(elm) : elm.currentStyle; }, setStyle : (function () { var helper = document.createElement('div'); var getSupportedProp = function (names) { for (var i = 0; i < names.length; i += 1) { if (names[i] in helper.style) { return names[i]; } } }; var props = { borderRadius: getSupportedProp(['borderRadius', 'MozBorderRadius', 'webkitBorderRadius']), boxShadow: getSupportedProp(['boxShadow', 'MozBoxShadow', 'webkitBoxShadow']) }; return function (elm, prop, value) { switch (prop.toLowerCase()) { case 'opacity': var alphaOpacity = Math.round(parseFloat(value) * 100); elm.style.opacity = value; elm.style.filter = 'alpha(opacity=' + alphaOpacity + ')'; break; default: elm.style[props[prop]] = value; break; } }; })(), setBorderRadius : function (elm, value) { jsc.setStyle(elm, 'borderRadius', value || '0'); }, setBoxShadow : function (elm, value) { jsc.setStyle(elm, 'boxShadow', value || 'none'); }, getElementPos : function (e, relativeToViewport) { var x=0, y=0; var rect = e.getBoundingClientRect(); x = rect.left; y = rect.top; if (!relativeToViewport) { var viewPos = jsc.getViewPos(); x += viewPos[0]; y += viewPos[1]; } return [x, y]; }, getElementSize : function (e) { return [e.offsetWidth, e.offsetHeight]; }, // get pointer's X/Y coordinates relative to viewport getAbsPointerPos : function (e) { if (!e) { e = window.event; } var x = 0, y = 0; if (typeof e.changedTouches !== 'undefined' && e.changedTouches.length) { // touch devices x = e.changedTouches[0].clientX; y = e.changedTouches[0].clientY; } else if (typeof e.clientX === 'number') { x = e.clientX; y = e.clientY; } return { x: x, y: y }; }, // get pointer's X/Y coordinates relative to target element getRelPointerPos : function (e) { if (!e) { e = window.event; } var target = e.target || e.srcElement; var targetRect = target.getBoundingClientRect(); var x = 0, y = 0; var clientX = 0, clientY = 0; if (typeof e.changedTouches !== 'undefined' && e.changedTouches.length) { // touch devices clientX = e.changedTouches[0].clientX; clientY = e.changedTouches[0].clientY; } else if (typeof e.clientX === 'number') { clientX = e.clientX; clientY = e.clientY; } x = clientX - targetRect.left; y = clientY - targetRect.top; return { x: x, y: y }; }, getViewPos : function () { var doc = document.documentElement; return [ (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0), (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0) ]; }, getViewSize : function () { var doc = document.documentElement; return [ (window.innerWidth || doc.clientWidth), (window.innerHeight || doc.clientHeight), ]; }, redrawPosition : function () { if (jsc.picker && jsc.picker.owner) { var thisObj = jsc.picker.owner; var tp, vp; if (thisObj.fixed) { // Fixed elements are positioned relative to viewport, // therefore we can ignore the scroll offset tp = jsc.getElementPos(thisObj.targetElement, true); // target pos vp = [0, 0]; // view pos } else { tp = jsc.getElementPos(thisObj.targetElement); // target pos vp = jsc.getViewPos(); // view pos } var ts = jsc.getElementSize(thisObj.targetElement); // target size var vs = jsc.getViewSize(); // view size var ps = jsc.getPickerOuterDims(thisObj); // picker size var a, b, c; switch (thisObj.position.toLowerCase()) { case 'left': a=1; b=0; c=-1; break; case 'right':a=1; b=0; c=1; break; case 'top': a=0; b=1; c=-1; break; default: a=0; b=1; c=1; break; } var l = (ts[b]+ps[b])/2; // compute picker position if (!thisObj.smartPosition) { var pp = [ tp[a], tp[b]+ts[b]-l+l*c ]; } else { var pp = [ -vp[a]+tp[a]+ps[a] > vs[a] ? (-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) : tp[a], -vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ? (-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) : (tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c) ]; } var x = pp[a]; var y = pp[b]; var positionValue = thisObj.fixed ? 'fixed' : 'absolute'; var contractShadow = (pp[0] + ps[0] > tp[0] || pp[0] < tp[0] + ts[0]) && (pp[1] + ps[1] < tp[1] + ts[1]); jsc._drawPosition(thisObj, x, y, positionValue, contractShadow); } }, _drawPosition : function (thisObj, x, y, positionValue, contractShadow) { var vShadow = contractShadow ? 0 : thisObj.shadowBlur; // px jsc.picker.wrap.style.position = positionValue; jsc.picker.wrap.style.left = x + 'px'; jsc.picker.wrap.style.top = y + 'px'; jsc.setBoxShadow( jsc.picker.boxS, thisObj.shadow ? new jsc.BoxShadow(0, vShadow, thisObj.shadowBlur, 0, thisObj.shadowColor) : null); }, getPickerDims : function (thisObj) { var displaySlider = !!jsc.getSliderComponent(thisObj); var dims = [ 2 * thisObj.insetWidth + 2 * thisObj.padding + thisObj.width + (displaySlider ? 2 * thisObj.insetWidth + jsc.getPadToSliderPadding(thisObj) + thisObj.sliderSize : 0), 2 * thisObj.insetWidth + 2 * thisObj.padding + thisObj.height + (thisObj.closable ? 2 * thisObj.insetWidth + thisObj.padding + thisObj.buttonHeight : 0) ]; return dims; }, getPickerOuterDims : function (thisObj) { var dims = jsc.getPickerDims(thisObj); return [ dims[0] + 2 * thisObj.borderWidth, dims[1] + 2 * thisObj.borderWidth ]; }, getPadToSliderPadding : function (thisObj) { return Math.max(thisObj.padding, 1.5 * (2 * thisObj.pointerBorderWidth + thisObj.pointerThickness)); }, getPadYComponent : function (thisObj) { switch (thisObj.mode.charAt(1).toLowerCase()) { case 'v': return 'v'; break; } return 's'; }, getSliderComponent : function (thisObj) { if (thisObj.mode.length > 2) { switch (thisObj.mode.charAt(2).toLowerCase()) { case 's': return 's'; break; case 'v': return 'v'; break; } } return null; }, onDocumentMouseDown : function (e) { if (!e) { e = window.event; } var target = e.target || e.srcElement; if (target._jscLinkedInstance) { if (target._jscLinkedInstance.showOnClick) { target._jscLinkedInstance.show(); } } else if (target._jscControlName) { jsc.onControlPointerStart(e, target, target._jscControlName, 'mouse'); } else { // Mouse is outside the picker controls -> hide the color picker! if (jsc.picker && jsc.picker.owner) { jsc.picker.owner.hide(); } } }, onDocumentTouchStart : function (e) { if (!e) { e = window.event; } var target = e.target || e.srcElement; if (target._jscLinkedInstance) { if (target._jscLinkedInstance.showOnClick) { target._jscLinkedInstance.show(); } } else if (target._jscControlName) { jsc.onControlPointerStart(e, target, target._jscControlName, 'touch'); } else { if (jsc.picker && jsc.picker.owner) { jsc.picker.owner.hide(); } } }, onWindowResize : function (e) { jsc.redrawPosition(); }, onParentScroll : function (e) { // hide the picker when one of the parent elements is scrolled if (jsc.picker && jsc.picker.owner) { jsc.picker.owner.hide(); } }, _pointerMoveEvent : { mouse: 'mousemove', touch: 'touchmove' }, _pointerEndEvent : { mouse: 'mouseup', touch: 'touchend' }, _pointerOrigin : null, _capturedTarget : null, onControlPointerStart : function (e, target, controlName, pointerType) { var thisObj = target._jscInstance; jsc.preventDefault(e); jsc.captureTarget(target); var registerDragEvents = function (doc, offset) { jsc.attachGroupEvent('drag', doc, jsc._pointerMoveEvent[pointerType], jsc.onDocumentPointerMove(e, target, controlName, pointerType, offset)); jsc.attachGroupEvent('drag', doc, jsc._pointerEndEvent[pointerType], jsc.onDocumentPointerEnd(e, target, controlName, pointerType)); }; registerDragEvents(document, [0, 0]); if (window.parent && window.frameElement) { var rect = window.frameElement.getBoundingClientRect(); var ofs = [-rect.left, -rect.top]; registerDragEvents(window.parent.window.document, ofs); } var abs = jsc.getAbsPointerPos(e); var rel = jsc.getRelPointerPos(e); jsc._pointerOrigin = { x: abs.x - rel.x, y: abs.y - rel.y }; switch (controlName) { case 'pad': // if the slider is at the bottom, move it up switch (jsc.getSliderComponent(thisObj)) { case 's': if (thisObj.hsv[1] === 0) { thisObj.fromHSV(null, 100, null); }; break; case 'v': if (thisObj.hsv[2] === 0) { thisObj.fromHSV(null, null, 100); }; break; } jsc.setPad(thisObj, e, 0, 0); break; case 'sld': jsc.setSld(thisObj, e, 0); break; } jsc.dispatchFineChange(thisObj); }, onDocumentPointerMove : function (e, target, controlName, pointerType, offset) { return function (e) { var thisObj = target._jscInstance; switch (controlName) { case 'pad': if (!e) { e = window.event; } jsc.setPad(thisObj, e, offset[0], offset[1]); jsc.dispatchFineChange(thisObj); break; case 'sld': if (!e) { e = window.event; } jsc.setSld(thisObj, e, offset[1]); jsc.dispatchFineChange(thisObj); break; } } }, onDocumentPointerEnd : function (e, target, controlName, pointerType) { return function (e) { var thisObj = target._jscInstance; jsc.detachGroupEvents('drag'); jsc.releaseTarget(); // Always dispatch changes after detaching outstanding mouse handlers, // in case some user interaction will occur in user's onchange callback // that would intrude with current mouse events jsc.dispatchChange(thisObj); }; }, dispatchChange : function (thisObj) { if (thisObj.valueElement) { if (jsc.isElementType(thisObj.valueElement, 'input')) { jsc.fireEvent(thisObj.valueElement, 'change'); } } }, dispatchFineChange : function (thisObj) { if (thisObj.onFineChange) { var callback; if (typeof thisObj.onFineChange === 'string') { callback = new Function (thisObj.onFineChange); } else { callback = thisObj.onFineChange; } callback.call(thisObj); } }, setPad : function (thisObj, e, ofsX, ofsY) { var pointerAbs = jsc.getAbsPointerPos(e); var x = ofsX + pointerAbs.x - jsc._pointerOrigin.x - thisObj.padding - thisObj.insetWidth; var y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.insetWidth; var xVal = x * (360 / (thisObj.width - 1)); var yVal = 100 - (y * (100 / (thisObj.height - 1))); switch (jsc.getPadYComponent(thisObj)) { case 's': thisObj.fromHSV(xVal, yVal, null, jsc.leaveSld); break; case 'v': thisObj.fromHSV(xVal, null, yVal, jsc.leaveSld); break; } }, setSld : function (thisObj, e, ofsY) { var pointerAbs = jsc.getAbsPointerPos(e); var y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.insetWidth; var yVal = 100 - (y * (100 / (thisObj.height - 1))); switch (jsc.getSliderComponent(thisObj)) { case 's': thisObj.fromHSV(null, yVal, null, jsc.leavePad); break; case 'v': thisObj.fromHSV(null, null, yVal, jsc.leavePad); break; } }, _vmlNS : 'jsc_vml_', _vmlCSS : 'jsc_vml_css_', _vmlReady : false, initVML : function () { if (!jsc._vmlReady) { // init VML namespace var doc = document; if (!doc.namespaces[jsc._vmlNS]) { doc.namespaces.add(jsc._vmlNS, 'urn:schemas-microsoft-com:vml'); } if (!doc.styleSheets[jsc._vmlCSS]) { var tags = ['shape', 'shapetype', 'group', 'background', 'path', 'formulas', 'handles', 'fill', 'stroke', 'shadow', 'textbox', 'textpath', 'imagedata', 'line', 'polyline', 'curve', 'rect', 'roundrect', 'oval', 'arc', 'image']; var ss = doc.createStyleSheet(); ss.owningElement.id = jsc._vmlCSS; for (var i = 0; i < tags.length; i += 1) { ss.addRule(jsc._vmlNS + '\\:' + tags[i], 'behavior:url(#default#VML);'); } } jsc._vmlReady = true; } }, createPalette : function () { var paletteObj = { elm: null, draw: null }; if (jsc.isCanvasSupported) { // Canvas implementation for modern browsers var canvas = document.createElement('canvas'); var ctx = canvas.getContext('2d'); var drawFunc = function (width, height, type) { canvas.width = width; canvas.height = height; ctx.clearRect(0, 0, canvas.width, canvas.height); var hGrad = ctx.createLinearGradient(0, 0, canvas.width, 0); hGrad.addColorStop(0 / 6, '#F00'); hGrad.addColorStop(1 / 6, '#FF0'); hGrad.addColorStop(2 / 6, '#0F0'); hGrad.addColorStop(3 / 6, '#0FF'); hGrad.addColorStop(4 / 6, '#00F'); hGrad.addColorStop(5 / 6, '#F0F'); hGrad.addColorStop(6 / 6, '#F00'); ctx.fillStyle = hGrad; ctx.fillRect(0, 0, canvas.width, canvas.height); var vGrad = ctx.createLinearGradient(0, 0, 0, canvas.height); switch (type.toLowerCase()) { case 's': vGrad.addColorStop(0, 'rgba(255,255,255,0)'); vGrad.addColorStop(1, 'rgba(255,255,255,1)'); break; case 'v': vGrad.addColorStop(0, 'rgba(0,0,0,0)'); vGrad.addColorStop(1, 'rgba(0,0,0,1)'); break; } ctx.fillStyle = vGrad; ctx.fillRect(0, 0, canvas.width, canvas.height); }; paletteObj.elm = canvas; paletteObj.draw = drawFunc; } else { // VML fallback for IE 7 and 8 jsc.initVML(); var vmlContainer = document.createElement('div'); vmlContainer.style.position = 'relative'; vmlContainer.style.overflow = 'hidden'; var hGrad = document.createElement(jsc._vmlNS + ':fill'); hGrad.type = 'gradient'; hGrad.method = 'linear'; hGrad.angle = '90'; hGrad.colors = '16.67% #F0F, 33.33% #00F, 50% #0FF, 66.67% #0F0, 83.33% #FF0' var hRect = document.createElement(jsc._vmlNS + ':rect'); hRect.style.position = 'absolute'; hRect.style.left = -1 + 'px'; hRect.style.top = -1 + 'px'; hRect.stroked = false; hRect.appendChild(hGrad); vmlContainer.appendChild(hRect); var vGrad = document.createElement(jsc._vmlNS + ':fill'); vGrad.type = 'gradient'; vGrad.method = 'linear'; vGrad.angle = '180'; vGrad.opacity = '0'; var vRect = document.createElement(jsc._vmlNS + ':rect'); vRect.style.position = 'absolute'; vRect.style.left = -1 + 'px'; vRect.style.top = -1 + 'px'; vRect.stroked = false; vRect.appendChild(vGrad); vmlContainer.appendChild(vRect); var drawFunc = function (width, height, type) { vmlContainer.style.width = width + 'px'; vmlContainer.style.height = height + 'px'; hRect.style.width = vRect.style.width = (width + 1) + 'px'; hRect.style.height = vRect.style.height = (height + 1) + 'px'; // Colors must be specified during every redraw, otherwise IE won't display // a full gradient during a subsequential redraw hGrad.color = '#F00'; hGrad.color2 = '#F00'; switch (type.toLowerCase()) { case 's': vGrad.color = vGrad.color2 = '#FFF'; break; case 'v': vGrad.color = vGrad.color2 = '#000'; break; } }; paletteObj.elm = vmlContainer; paletteObj.draw = drawFunc; } return paletteObj; }, createSliderGradient : function () { var sliderObj = { elm: null, draw: null }; if (jsc.isCanvasSupported) { // Canvas implementation for modern browsers var canvas = document.createElement('canvas'); var ctx = canvas.getContext('2d'); var drawFunc = function (width, height, color1, color2) { canvas.width = width; canvas.height = height; ctx.clearRect(0, 0, canvas.width, canvas.height); var grad = ctx.createLinearGradient(0, 0, 0, canvas.height); grad.addColorStop(0, color1); grad.addColorStop(1, color2); ctx.fillStyle = grad; ctx.fillRect(0, 0, canvas.width, canvas.height); }; sliderObj.elm = canvas; sliderObj.draw = drawFunc; } else { // VML fallback for IE 7 and 8 jsc.initVML(); var vmlContainer = document.createElement('div'); vmlContainer.style.position = 'relative'; vmlContainer.style.overflow = 'hidden'; var grad = document.createElement(jsc._vmlNS + ':fill'); grad.type = 'gradient'; grad.method = 'linear'; grad.angle = '180'; var rect = document.createElement(jsc._vmlNS + ':rect'); rect.style.position = 'absolute'; rect.style.left = -1 + 'px'; rect.style.top = -1 + 'px'; rect.stroked = false; rect.appendChild(grad); vmlContainer.appendChild(rect); var drawFunc = function (width, height, color1, color2) { vmlContainer.style.width = width + 'px'; vmlContainer.style.height = height + 'px'; rect.style.width = (width + 1) + 'px'; rect.style.height = (height + 1) + 'px'; grad.color = color1; grad.color2 = color2; }; sliderObj.elm = vmlContainer; sliderObj.draw = drawFunc; } return sliderObj; }, leaveValue : 1<<0, leaveStyle : 1<<1, leavePad : 1<<2, leaveSld : 1<<3, BoxShadow : (function () { var BoxShadow = function (hShadow, vShadow, blur, spread, color, inset) { this.hShadow = hShadow; this.vShadow = vShadow; this.blur = blur; this.spread = spread; this.color = color; this.inset = !!inset; }; BoxShadow.prototype.toString = function () { var vals = [ Math.round(this.hShadow) + 'px', Math.round(this.vShadow) + 'px', Math.round(this.blur) + 'px', Math.round(this.spread) + 'px', this.color ]; if (this.inset) { vals.push('inset'); } return vals.join(' '); }; return BoxShadow; })(), // // Usage: // var myColor = new jscolor( [, ]) // jscolor : function (targetElement, options) { // General options // this.value = null; // initial HEX color. To change it later, use methods fromString(), fromHSV() and fromRGB() this.valueElement = targetElement; // element that will be used to display and input the color code this.styleElement = targetElement; // element that will preview the picked color using CSS backgroundColor this.required = true; // whether the associated text can be left empty this.refine = true; // whether to refine the entered color code (e.g. uppercase it and remove whitespace) this.hash = false; // whether to prefix the HEX color code with # symbol this.uppercase = true; // whether to uppercase the color code this.onFineChange = null; // called instantly every time the color changes (value can be either a function or a string with javascript code) this.activeClass = 'jscolor-active'; // class to be set to the target element when a picker window is open on it this.minS = 0; // min allowed saturation (0 - 100) this.maxS = 100; // max allowed saturation (0 - 100) this.minV = 0; // min allowed value (brightness) (0 - 100) this.maxV = 100; // max allowed value (brightness) (0 - 100) // Accessing the picked color // this.hsv = [0, 0, 100]; // read-only [0-360, 0-100, 0-100] this.rgb = [255, 255, 255]; // read-only [0-255, 0-255, 0-255] // Color Picker options // this.width = 181; // width of color palette (in px) this.height = 101; // height of color palette (in px) this.showOnClick = true; // whether to display the color picker when user clicks on its target element this.mode = 'HSV'; // HSV | HVS | HS | HV - layout of the color picker controls this.position = 'bottom'; // left | right | top | bottom - position relative to the target element this.smartPosition = true; // automatically change picker position when there is not enough space for it this.sliderSize = 16; // px this.crossSize = 8; // px this.closable = false; // whether to display the Close button this.closeText = 'Close'; this.buttonColor = '#000000'; // CSS color this.buttonHeight = 18; // px this.padding = 12; // px this.backgroundColor = '#FFFFFF'; // CSS color this.borderWidth = 1; // px this.borderColor = '#BBBBBB'; // CSS color this.borderRadius = 8; // px this.insetWidth = 1; // px this.insetColor = '#BBBBBB'; // CSS color this.shadow = true; // whether to display shadow this.shadowBlur = 15; // px this.shadowColor = 'rgba(0,0,0,0.2)'; // CSS color this.pointerColor = '#4C4C4C'; // px this.pointerBorderColor = '#FFFFFF'; // px this.pointerBorderWidth = 1; // px this.pointerThickness = 2; // px this.zIndex = 1000; this.container = null; // where to append the color picker (BODY element by default) for (var opt in options) { if (options.hasOwnProperty(opt)) { this[opt] = options[opt]; } } this.hide = function () { if (isPickerOwner()) { detachPicker(); } }; this.show = function () { drawPicker(); }; this.redraw = function () { if (isPickerOwner()) { drawPicker(); } }; this.importColor = function () { if (!this.valueElement) { this.exportColor(); } else { if (jsc.isElementType(this.valueElement, 'input')) { if (!this.refine) { if (!this.fromString(this.valueElement.value, jsc.leaveValue)) { if (this.styleElement) { this.styleElement.style.backgroundImage = this.styleElement._jscOrigStyle.backgroundImage; this.styleElement.style.backgroundColor = this.styleElement._jscOrigStyle.backgroundColor; this.styleElement.style.color = this.styleElement._jscOrigStyle.color; } this.exportColor(jsc.leaveValue | jsc.leaveStyle); } } else if (!this.required && /^\s*$/.test(this.valueElement.value)) { this.valueElement.value = ''; if (this.styleElement) { this.styleElement.style.backgroundImage = this.styleElement._jscOrigStyle.backgroundImage; this.styleElement.style.backgroundColor = this.styleElement._jscOrigStyle.backgroundColor; this.styleElement.style.color = this.styleElement._jscOrigStyle.color; } this.exportColor(jsc.leaveValue | jsc.leaveStyle); } else if (this.fromString(this.valueElement.value)) { // managed to import color successfully from the value -> OK, don't do anything } else { this.exportColor(); } } else { // not an input element -> doesn't have any value this.exportColor(); } } }; this.exportColor = function (flags) { if (!(flags & jsc.leaveValue) && this.valueElement) { var value = this.toString(); if (this.uppercase) { value = value.toUpperCase(); } if (this.hash) { value = '#' + value; } if (jsc.isElementType(this.valueElement, 'input')) { this.valueElement.value = value; } else { this.valueElement.innerHTML = value; } } if (!(flags & jsc.leaveStyle)) { if (this.styleElement) { this.styleElement.style.backgroundImage = 'none'; this.styleElement.style.backgroundColor = '#' + this.toString(); this.styleElement.style.color = this.isLight() ? '#000' : '#FFF'; } } if (!(flags & jsc.leavePad) && isPickerOwner()) { redrawPad(); } if (!(flags & jsc.leaveSld) && isPickerOwner()) { redrawSld(); } }; // h: 0-360 // s: 0-100 // v: 0-100 // this.fromHSV = function (h, s, v, flags) { // null = don't change if (h !== null) { if (isNaN(h)) { return false; } h = Math.max(0, Math.min(360, h)); } if (s !== null) { if (isNaN(s)) { return false; } s = Math.max(0, Math.min(100, this.maxS, s), this.minS); } if (v !== null) { if (isNaN(v)) { return false; } v = Math.max(0, Math.min(100, this.maxV, v), this.minV); } this.rgb = HSV_RGB( h===null ? this.hsv[0] : (this.hsv[0]=h), s===null ? this.hsv[1] : (this.hsv[1]=s), v===null ? this.hsv[2] : (this.hsv[2]=v) ); this.exportColor(flags); }; // r: 0-255 // g: 0-255 // b: 0-255 // this.fromRGB = function (r, g, b, flags) { // null = don't change if (r !== null) { if (isNaN(r)) { return false; } r = Math.max(0, Math.min(255, r)); } if (g !== null) { if (isNaN(g)) { return false; } g = Math.max(0, Math.min(255, g)); } if (b !== null) { if (isNaN(b)) { return false; } b = Math.max(0, Math.min(255, b)); } var hsv = RGB_HSV( r===null ? this.rgb[0] : r, g===null ? this.rgb[1] : g, b===null ? this.rgb[2] : b ); if (hsv[0] !== null) { this.hsv[0] = Math.max(0, Math.min(360, hsv[0])); } if (hsv[2] !== 0) { this.hsv[1] = hsv[1]===null ? null : Math.max(0, this.minS, Math.min(100, this.maxS, hsv[1])); } this.hsv[2] = hsv[2]===null ? null : Math.max(0, this.minV, Math.min(100, this.maxV, hsv[2])); // update RGB according to final HSV, as some values might be trimmed var rgb = HSV_RGB(this.hsv[0], this.hsv[1], this.hsv[2]); this.rgb[0] = rgb[0]; this.rgb[1] = rgb[1]; this.rgb[2] = rgb[2]; this.exportColor(flags); }; this.fromString = function (str, flags) { var m; if (m = str.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i)) { // HEX notation // if (m[1].length === 6) { // 6-char notation this.fromRGB( parseInt(m[1].substr(0,2),16), parseInt(m[1].substr(2,2),16), parseInt(m[1].substr(4,2),16), flags ); } else { // 3-char notation this.fromRGB( parseInt(m[1].charAt(0) + m[1].charAt(0),16), parseInt(m[1].charAt(1) + m[1].charAt(1),16), parseInt(m[1].charAt(2) + m[1].charAt(2),16), flags ); } return true; } else if (m = str.match(/^\W*rgba?\(([^)]*)\)\W*$/i)) { var params = m[1].split(','); var re = /^\s*(\d*)(\.\d+)?\s*$/; var mR, mG, mB; if ( params.length >= 3 && (mR = params[0].match(re)) && (mG = params[1].match(re)) && (mB = params[2].match(re)) ) { var r = parseFloat((mR[1] || '0') + (mR[2] || '')); var g = parseFloat((mG[1] || '0') + (mG[2] || '')); var b = parseFloat((mB[1] || '0') + (mB[2] || '')); this.fromRGB(r, g, b, flags); return true; } } return false; }; this.toString = function () { return ( (0x100 | Math.round(this.rgb[0])).toString(16).substr(1) + (0x100 | Math.round(this.rgb[1])).toString(16).substr(1) + (0x100 | Math.round(this.rgb[2])).toString(16).substr(1) ); }; this.toHEXString = function () { return '#' + this.toString().toUpperCase(); }; this.toRGBString = function () { return ('rgb(' + Math.round(this.rgb[0]) + ',' + Math.round(this.rgb[1]) + ',' + Math.round(this.rgb[2]) + ')' ); }; this.isLight = function () { return ( 0.213 * this.rgb[0] + 0.715 * this.rgb[1] + 0.072 * this.rgb[2] > 255 / 2 ); }; this._processParentElementsInDOM = function () { if (this._linkedElementsProcessed) { return; } this._linkedElementsProcessed = true; var elm = this.targetElement; do { // If the target element or one of its parent nodes has fixed position, // then use fixed positioning instead // // Note: In Firefox, getComputedStyle returns null in a hidden iframe, // that's why we need to check if the returned style object is non-empty var currStyle = jsc.getStyle(elm); if (currStyle && currStyle.position.toLowerCase() === 'fixed') { this.fixed = true; } if (elm !== this.targetElement) { // Ensure to attach onParentScroll only once to each parent element // (multiple targetElements can share the same parent nodes) // // Note: It's not just offsetParents that can be scrollable, // that's why we loop through all parent nodes if (!elm._jscEventsAttached) { jsc.attachEvent(elm, 'scroll', jsc.onParentScroll); elm._jscEventsAttached = true; } } } while ((elm = elm.parentNode) && !jsc.isElementType(elm, 'body')); }; // r: 0-255 // g: 0-255 // b: 0-255 // // returns: [ 0-360, 0-100, 0-100 ] // function RGB_HSV (r, g, b) { r /= 255; g /= 255; b /= 255; var n = Math.min(Math.min(r,g),b); var v = Math.max(Math.max(r,g),b); var m = v - n; if (m === 0) { return [ null, 0, 100 * v ]; } var h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m); return [ 60 * (h===6?0:h), 100 * (m/v), 100 * v ]; } // h: 0-360 // s: 0-100 // v: 0-100 // // returns: [ 0-255, 0-255, 0-255 ] // function HSV_RGB (h, s, v) { var u = 255 * (v / 100); if (h === null) { return [ u, u, u ]; } h /= 60; s /= 100; var i = Math.floor(h); var f = i%2 ? h-i : 1-(h-i); var m = u * (1 - s); var n = u * (1 - s * f); switch (i) { case 6: case 0: return [u,n,m]; case 1: return [n,u,m]; case 2: return [m,u,n]; case 3: return [m,n,u]; case 4: return [n,m,u]; case 5: return [u,m,n]; } } function detachPicker () { jsc.unsetClass(THIS.targetElement, THIS.activeClass); jsc.picker.wrap.parentNode.removeChild(jsc.picker.wrap); delete jsc.picker.owner; } function drawPicker () { // At this point, when drawing the picker, we know what the parent elements are // and we can do all related DOM operations, such as registering events on them // or checking their positioning THIS._processParentElementsInDOM(); if (!jsc.picker) { jsc.picker = { owner: null, wrap : document.createElement('div'), box : document.createElement('div'), boxS : document.createElement('div'), // shadow area boxB : document.createElement('div'), // border pad : document.createElement('div'), padB : document.createElement('div'), // border padM : document.createElement('div'), // mouse/touch area padPal : jsc.createPalette(), cross : document.createElement('div'), crossBY : document.createElement('div'), // border Y crossBX : document.createElement('div'), // border X crossLY : document.createElement('div'), // line Y crossLX : document.createElement('div'), // line X sld : document.createElement('div'), sldB : document.createElement('div'), // border sldM : document.createElement('div'), // mouse/touch area sldGrad : jsc.createSliderGradient(), sldPtrS : document.createElement('div'), // slider pointer spacer sldPtrIB : document.createElement('div'), // slider pointer inner border sldPtrMB : document.createElement('div'), // slider pointer middle border sldPtrOB : document.createElement('div'), // slider pointer outer border btn : document.createElement('div'), btnT : document.createElement('span') // text }; jsc.picker.pad.appendChild(jsc.picker.padPal.elm); jsc.picker.padB.appendChild(jsc.picker.pad); jsc.picker.cross.appendChild(jsc.picker.crossBY); jsc.picker.cross.appendChild(jsc.picker.crossBX); jsc.picker.cross.appendChild(jsc.picker.crossLY); jsc.picker.cross.appendChild(jsc.picker.crossLX); jsc.picker.padB.appendChild(jsc.picker.cross); jsc.picker.box.appendChild(jsc.picker.padB); jsc.picker.box.appendChild(jsc.picker.padM); jsc.picker.sld.appendChild(jsc.picker.sldGrad.elm); jsc.picker.sldB.appendChild(jsc.picker.sld); jsc.picker.sldB.appendChild(jsc.picker.sldPtrOB); jsc.picker.sldPtrOB.appendChild(jsc.picker.sldPtrMB); jsc.picker.sldPtrMB.appendChild(jsc.picker.sldPtrIB); jsc.picker.sldPtrIB.appendChild(jsc.picker.sldPtrS); jsc.picker.box.appendChild(jsc.picker.sldB); jsc.picker.box.appendChild(jsc.picker.sldM); jsc.picker.btn.appendChild(jsc.picker.btnT); jsc.picker.box.appendChild(jsc.picker.btn); jsc.picker.boxB.appendChild(jsc.picker.box); jsc.picker.wrap.appendChild(jsc.picker.boxS); jsc.picker.wrap.appendChild(jsc.picker.boxB); } var p = jsc.picker; var displaySlider = !!jsc.getSliderComponent(THIS); var dims = jsc.getPickerDims(THIS); var crossOuterSize = (2 * THIS.pointerBorderWidth + THIS.pointerThickness + 2 * THIS.crossSize); var padToSliderPadding = jsc.getPadToSliderPadding(THIS); var borderRadius = Math.min( THIS.borderRadius, Math.round(THIS.padding * Math.PI)); // px var padCursor = 'crosshair'; // wrap p.wrap.style.clear = 'both'; p.wrap.style.width = (dims[0] + 2 * THIS.borderWidth) + 'px'; p.wrap.style.height = (dims[1] + 2 * THIS.borderWidth) + 'px'; p.wrap.style.zIndex = THIS.zIndex; // picker p.box.style.width = dims[0] + 'px'; p.box.style.height = dims[1] + 'px'; p.boxS.style.position = 'absolute'; p.boxS.style.left = '0'; p.boxS.style.top = '0'; p.boxS.style.width = '100%'; p.boxS.style.height = '100%'; jsc.setBorderRadius(p.boxS, borderRadius + 'px'); // picker border p.boxB.style.position = 'relative'; p.boxB.style.border = THIS.borderWidth + 'px solid'; p.boxB.style.borderColor = THIS.borderColor; p.boxB.style.background = THIS.backgroundColor; jsc.setBorderRadius(p.boxB, borderRadius + 'px'); // IE hack: // If the element is transparent, IE will trigger the event on the elements under it, // e.g. on Canvas or on elements with border p.padM.style.background = p.sldM.style.background = '#FFF'; jsc.setStyle(p.padM, 'opacity', '0'); jsc.setStyle(p.sldM, 'opacity', '0'); // pad p.pad.style.position = 'relative'; p.pad.style.width = THIS.width + 'px'; p.pad.style.height = THIS.height + 'px'; // pad palettes (HSV and HVS) p.padPal.draw(THIS.width, THIS.height, jsc.getPadYComponent(THIS)); // pad border p.padB.style.position = 'absolute'; p.padB.style.left = THIS.padding + 'px'; p.padB.style.top = THIS.padding + 'px'; p.padB.style.border = THIS.insetWidth + 'px solid'; p.padB.style.borderColor = THIS.insetColor; // pad mouse area p.padM._jscInstance = THIS; p.padM._jscControlName = 'pad'; p.padM.style.position = 'absolute'; p.padM.style.left = '0'; p.padM.style.top = '0'; p.padM.style.width = (THIS.padding + 2 * THIS.insetWidth + THIS.width + padToSliderPadding / 2) + 'px'; p.padM.style.height = dims[1] + 'px'; p.padM.style.cursor = padCursor; // pad cross p.cross.style.position = 'absolute'; p.cross.style.left = p.cross.style.top = '0'; p.cross.style.width = p.cross.style.height = crossOuterSize + 'px'; // pad cross border Y and X p.crossBY.style.position = p.crossBX.style.position = 'absolute'; p.crossBY.style.background = p.crossBX.style.background = THIS.pointerBorderColor; p.crossBY.style.width = p.crossBX.style.height = (2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px'; p.crossBY.style.height = p.crossBX.style.width = crossOuterSize + 'px'; p.crossBY.style.left = p.crossBX.style.top = (Math.floor(crossOuterSize / 2) - Math.floor(THIS.pointerThickness / 2) - THIS.pointerBorderWidth) + 'px'; p.crossBY.style.top = p.crossBX.style.left = '0'; // pad cross line Y and X p.crossLY.style.position = p.crossLX.style.position = 'absolute'; p.crossLY.style.background = p.crossLX.style.background = THIS.pointerColor; p.crossLY.style.height = p.crossLX.style.width = (crossOuterSize - 2 * THIS.pointerBorderWidth) + 'px'; p.crossLY.style.width = p.crossLX.style.height = THIS.pointerThickness + 'px'; p.crossLY.style.left = p.crossLX.style.top = (Math.floor(crossOuterSize / 2) - Math.floor(THIS.pointerThickness / 2)) + 'px'; p.crossLY.style.top = p.crossLX.style.left = THIS.pointerBorderWidth + 'px'; // slider p.sld.style.overflow = 'hidden'; p.sld.style.width = THIS.sliderSize + 'px'; p.sld.style.height = THIS.height + 'px'; // slider gradient p.sldGrad.draw(THIS.sliderSize, THIS.height, '#000', '#000'); // slider border p.sldB.style.display = displaySlider ? 'block' : 'none'; p.sldB.style.position = 'absolute'; p.sldB.style.right = THIS.padding + 'px'; p.sldB.style.top = THIS.padding + 'px'; p.sldB.style.border = THIS.insetWidth + 'px solid'; p.sldB.style.borderColor = THIS.insetColor; // slider mouse area p.sldM._jscInstance = THIS; p.sldM._jscControlName = 'sld'; p.sldM.style.display = displaySlider ? 'block' : 'none'; p.sldM.style.position = 'absolute'; p.sldM.style.right = '0'; p.sldM.style.top = '0'; p.sldM.style.width = (THIS.sliderSize + padToSliderPadding / 2 + THIS.padding + 2 * THIS.insetWidth) + 'px'; p.sldM.style.height = dims[1] + 'px'; p.sldM.style.cursor = 'default'; // slider pointer inner and outer border p.sldPtrIB.style.border = p.sldPtrOB.style.border = THIS.pointerBorderWidth + 'px solid ' + THIS.pointerBorderColor; // slider pointer outer border p.sldPtrOB.style.position = 'absolute'; p.sldPtrOB.style.left = -(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px'; p.sldPtrOB.style.top = '0'; // slider pointer middle border p.sldPtrMB.style.border = THIS.pointerThickness + 'px solid ' + THIS.pointerColor; // slider pointer spacer p.sldPtrS.style.width = THIS.sliderSize + 'px'; p.sldPtrS.style.height = sliderPtrSpace + 'px'; // the Close button function setBtnBorder () { var insetColors = THIS.insetColor.split(/\s+/); var outsetColor = insetColors.length < 2 ? insetColors[0] : insetColors[1] + ' ' + insetColors[0] + ' ' + insetColors[0] + ' ' + insetColors[1]; p.btn.style.borderColor = outsetColor; } p.btn.style.display = THIS.closable ? 'block' : 'none'; p.btn.style.position = 'absolute'; p.btn.style.left = THIS.padding + 'px'; p.btn.style.bottom = THIS.padding + 'px'; p.btn.style.padding = '0 15px'; p.btn.style.height = THIS.buttonHeight + 'px'; p.btn.style.border = THIS.insetWidth + 'px solid'; setBtnBorder(); p.btn.style.color = THIS.buttonColor; p.btn.style.font = '12px sans-serif'; p.btn.style.textAlign = 'center'; try { p.btn.style.cursor = 'pointer'; } catch(eOldIE) { p.btn.style.cursor = 'hand'; } p.btn.onmousedown = function () { THIS.hide(); }; p.btnT.style.lineHeight = THIS.buttonHeight + 'px'; p.btnT.innerHTML = ''; p.btnT.appendChild(document.createTextNode(THIS.closeText)); // place pointers redrawPad(); redrawSld(); // If we are changing the owner without first closing the picker, // make sure to first deal with the old owner if (jsc.picker.owner && jsc.picker.owner !== THIS) { jsc.unsetClass(jsc.picker.owner.targetElement, THIS.activeClass); } // Set the new picker owner jsc.picker.owner = THIS; // The redrawPosition() method needs picker.owner to be set, that's why we call it here, // after setting the owner if (jsc.isElementType(container, 'body')) { jsc.redrawPosition(); } else { jsc._drawPosition(THIS, 0, 0, 'relative', false); } if (p.wrap.parentNode != container) { container.appendChild(p.wrap); } jsc.setClass(THIS.targetElement, THIS.activeClass); } function redrawPad () { // redraw the pad pointer switch (jsc.getPadYComponent(THIS)) { case 's': var yComponent = 1; break; case 'v': var yComponent = 2; break; } var x = Math.round((THIS.hsv[0] / 360) * (THIS.width - 1)); var y = Math.round((1 - THIS.hsv[yComponent] / 100) * (THIS.height - 1)); var crossOuterSize = (2 * THIS.pointerBorderWidth + THIS.pointerThickness + 2 * THIS.crossSize); var ofs = -Math.floor(crossOuterSize / 2); jsc.picker.cross.style.left = (x + ofs) + 'px'; jsc.picker.cross.style.top = (y + ofs) + 'px'; // redraw the slider switch (jsc.getSliderComponent(THIS)) { case 's': var rgb1 = HSV_RGB(THIS.hsv[0], 100, THIS.hsv[2]); var rgb2 = HSV_RGB(THIS.hsv[0], 0, THIS.hsv[2]); var color1 = 'rgb(' + Math.round(rgb1[0]) + ',' + Math.round(rgb1[1]) + ',' + Math.round(rgb1[2]) + ')'; var color2 = 'rgb(' + Math.round(rgb2[0]) + ',' + Math.round(rgb2[1]) + ',' + Math.round(rgb2[2]) + ')'; jsc.picker.sldGrad.draw(THIS.sliderSize, THIS.height, color1, color2); break; case 'v': var rgb = HSV_RGB(THIS.hsv[0], THIS.hsv[1], 100); var color1 = 'rgb(' + Math.round(rgb[0]) + ',' + Math.round(rgb[1]) + ',' + Math.round(rgb[2]) + ')'; var color2 = '#000'; jsc.picker.sldGrad.draw(THIS.sliderSize, THIS.height, color1, color2); break; } } function redrawSld () { var sldComponent = jsc.getSliderComponent(THIS); if (sldComponent) { // redraw the slider pointer switch (sldComponent) { case 's': var yComponent = 1; break; case 'v': var yComponent = 2; break; } var y = Math.round((1 - THIS.hsv[yComponent] / 100) * (THIS.height - 1)); jsc.picker.sldPtrOB.style.top = (y - (2 * THIS.pointerBorderWidth + THIS.pointerThickness) - Math.floor(sliderPtrSpace / 2)) + 'px'; } } function isPickerOwner () { return jsc.picker && jsc.picker.owner === THIS; } function blurValue () { THIS.importColor(); } // Find the target element if (typeof targetElement === 'string') { var id = targetElement; var elm = document.getElementById(id); if (elm) { this.targetElement = elm; } else { jsc.warn('Could not find target element with ID \'' + id + '\''); } } else if (targetElement) { this.targetElement = targetElement; } else { jsc.warn('Invalid target element: \'' + targetElement + '\''); } if (this.targetElement._jscLinkedInstance) { jsc.warn('Cannot link jscolor twice to the same element. Skipping.'); return; } this.targetElement._jscLinkedInstance = this; // Find the value element this.valueElement = jsc.fetchElement(this.valueElement); // Find the style element this.styleElement = jsc.fetchElement(this.styleElement); var THIS = this; var container = this.container ? jsc.fetchElement(this.container) : document.getElementsByTagName('body')[0]; var sliderPtrSpace = 3; // px // For BUTTON elements it's important to stop them from sending the form when clicked // (e.g. in Safari) if (jsc.isElementType(this.targetElement, 'button')) { if (this.targetElement.onclick) { var origCallback = this.targetElement.onclick; this.targetElement.onclick = function (evt) { origCallback.call(this, evt); return false; }; } else { this.targetElement.onclick = function () { return false; }; } } /* var elm = this.targetElement; do { // If the target element or one of its offsetParents has fixed position, // then use fixed positioning instead // // Note: In Firefox, getComputedStyle returns null in a hidden iframe, // that's why we need to check if the returned style object is non-empty var currStyle = jsc.getStyle(elm); if (currStyle && currStyle.position.toLowerCase() === 'fixed') { this.fixed = true; } if (elm !== this.targetElement) { // attach onParentScroll so that we can recompute the picker position // when one of the offsetParents is scrolled if (!elm._jscEventsAttached) { jsc.attachEvent(elm, 'scroll', jsc.onParentScroll); elm._jscEventsAttached = true; } } } while ((elm = elm.offsetParent) && !jsc.isElementType(elm, 'body')); */ // valueElement if (this.valueElement) { if (jsc.isElementType(this.valueElement, 'input')) { var updateField = function () { THIS.fromString(THIS.valueElement.value, jsc.leaveValue); jsc.dispatchFineChange(THIS); }; jsc.attachEvent(this.valueElement, 'keyup', updateField); jsc.attachEvent(this.valueElement, 'input', updateField); jsc.attachEvent(this.valueElement, 'blur', blurValue); this.valueElement.setAttribute('autocomplete', 'off'); } } // styleElement if (this.styleElement) { this.styleElement._jscOrigStyle = { backgroundImage : this.styleElement.style.backgroundImage, backgroundColor : this.styleElement.style.backgroundColor, color : this.styleElement.style.color }; } if (this.value) { // Try to set the color from the .value option and if unsuccessful, // export the current color this.fromString(this.value) || this.exportColor(); } else { this.importColor(); } } }; //================================ // Public properties and methods //================================ // By default, search for all elements with class="jscolor" and install a color picker on them. // // You can change what class name will be looked for by setting the property jscolor.lookupClass // anywhere in your HTML document. To completely disable the automatic lookup, set it to null. // jsc.jscolor.lookupClass = 'jscolor'; jsc.jscolor.installByClassName = function (className) { var inputElms = document.getElementsByTagName('input'); var buttonElms = document.getElementsByTagName('button'); jsc.tryInstallOnElements(inputElms, className); jsc.tryInstallOnElements(buttonElms, className); }; jsc.register(); return jsc.jscolor; })(); } if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1) { $('.theme-colors .theme-colors-input').addClass('jscolor').removeAttr('type'); $('.color-reset').addClass('jscolor'); $('.theme-configurator button').hide(); }