/*
* KingComposer Page Builder
*
* (c) Copyright king-theme.com
*
*
* kc.tools.js
*
*/
( function($){
if( typeof( kc ) == 'undefined' )
window.kc = {};
$().extend( kc.tools, {
esc_slug : function (str){
if( str === undefined )
return 'king-composer';
str = str.replace(/^\s+|\s+$/g, '');
str = str.toLowerCase();
var from = "àáäâèéëêìíïîòóöôùúüûñç·/,:;";
var to = "aaaaeeeeiiiioooouuuunc-----";
for (var i=0, l=from.length ; i/g, ':gt:')
.replace(/\[/g, ':lsqb:')
.replace(/\]/g, ':rsqb:')
.replace(/"/g, ':quot:')
.replace(/'/g, ':apos:');
},
unesc_attr : function( str ) {
if( !str ){
return '';
}
return str.toString()
.replace(/:lt:/g, '<')
.replace(/:gt:/g, '>')
.replace(/:lsqb:/g, '[')
.replace(/:rsqb:/g, ']')
.replace(/:quot:/g, '"')
.replace(/:apos:/g, '\'');
},
esc : function( str ) {
if( !str ){
return '';
}
return str.toString().replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
},
unesc : function(str) {
if( str == undefined ){
return '';
}
return str.toString().replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, '\'');
},
rawdecode : function( input ){
return decodeURIComponent( input+'' );
},
rawencode : function( input ){
input = (input+'').toString();
return encodeURIComponent( input ).
replace(/!/g,'%21').
replace(/'/g,'%27').
replace(/\(/g,'%28').
replace(/\)/g,'%29').
replace(/\*/g,'%2A');
},
decode_css : function( css ){
var css_code = '';
css = css.replace( /\s+/g, ' ' )
.replace(/\/\*[^\/\*]+\*\//g,'')
.replace(/\"/g, "'")
.replace(/[^a-zA-Z0-9\-\_\. \:\(\)\%\+\~\;\#\'\!\{\}\@\/]+/g,'')
.trim().split( '{' );
for( var n in css ){
if( css[n].indexOf('}') > -1 )
{
css[n] = css[n].split('}');
css[n][0] = css[n][0].split(';');
for( var m in css[n][0] )
{
if( css[n][0][m].trim() != '' )
css_code += " "+css[n][0][m]+";\n";
}
if( css[n][1].trim() != '' )
css_code += "}\n"+css[n][1]+"{\n";
else
css_code += "}\n";
if( css[n][2] != undefined )
css_code += "}\n";
}
else if( css[n].trim() != '' )
{
css_code += css[n]+"{\n"
}
}
return css_code;
},
encode_css : function( css ){
if( css == undefined )
css = '';
css = css.replace(/\/\*[^\/\*]+\*\//g,'')
.replace( /\ \ /g, '' )
.replace(/[^a-zA-Z0-9\-\_\. \:\(\)\%\+\~\;\!\#\'\{\}\@\/]+/g,'').trim();
return css;
},
nfloat : function( n, m ){
n = n.toString();
if( m === undefined )
m = 2;
if( n.indexOf('.') > -1 ){
return parseFloat( n.substr( 0, n.indexOf('.')+m+1 ) );
}else return parseFloat( n );
},
getFormData : function( pop ){
/*
* correct data type before export
*/
var form = pop.find('form.fields-edit-form').get(0),
encodes = [],
unindexed = pop.find('form.fields-edit-form .kc-param').serializeArray();
pop.find('form.fields-edit-form [data-encode="base64"]').each(function(){
encodes.push( this.name );
});
return this.reIndexForm( unindexed, encodes );
},
reIndexForm : function( unindexed, encodes ){
var indexed = {}, avoidRepeat = {}, name, obs, j, k;
$.map( unindexed, function( n, i ){
if( encodes.indexOf( n['name'] ) > -1 )
n['value'] = kc.tools.base64.encode(n['value']);
if( n['name'].indexOf('[') == -1 ){
if( n['value'] != '' ){
if( indexed[ n['name'] ] == undefined || indexed[ n['name'] ] == '__empty__' )
indexed[ n['name'] ] = n['value'];
else
indexed[ n['name'] ] += ','+n['value'];
}else if( indexed[ n['name'] ] === undefined ){
indexed[ n['name'] ] = '';
}
}else{
n['name'] = "["+n['name'].replace('[','][');
name = n['name'].replace( /\[/g, "['" ).replace( /\]/g, "']" );
obs = [];
[].forEach.call( n['name'].split(']['), function( sp ){
sp = sp.replace( /\[/g, '' ).replace( /\]/g, '' ).trim();
obs[ obs.length ] = sp;
});
if( obs.length > 0 ){
k = '';
for( j=0; j 800 )
pop.find('.m-p-body').css({ 'max-height': (wh - 250)+'px' });
var pop_rect = pop.get(0).getBoundingClientRect();
if( atts.top > wheight && atts.bottom === 0 ){
if( pop_rect.height < wh - 50 ){
kc.ui.scrollAssistive( atts.top - ((wh-pop_rect.height)/2) , true );
}else kc.ui.scrollAssistive( (atts.top - 50), true );
}else if( pop_rect.top < 0 )
kc.ui.scrollAssistive( (wsct+pop_rect.top) - 50, true );
}, 1, this.el, atts );
}
return this.el;
},
coordinates : function( el, pop_width, keepCurrent ){
var grids;
if( $(el).closest('#kc-container').get(0) )
grids = document.getElementById('kc-container').getBoundingClientRect();
else if( document.getElementById('wpbody-content') !== null )
grids = document.getElementById('wpbody-content').getBoundingClientRect();
else if( document.getElementById('content') !== null )
grids = document.getElementById('content').getBoundingClientRect();
else grids = document.getElementsByTagName('body')[0].getBoundingClientRect();
if( el === undefined )
return [0,0,0,0];
var coor = el.getBoundingClientRect(),
swidth = (grids.width/3),
sleft = coor.left-grids.left,
top = coor.top+$(window).scrollTop()+coor.height-this.margin_top,
bottom = 0,
left = coor.left+$(window).scrollLeft()+(coor.width/2),
tip = 0,
pos = '',
wheight = $(document).height(),
wwidth = $(document).width();
if( sleft < swidth ){
pos = 'left';
left -= 63;
}else if( sleft > swidth && sleft < swidth*2 ){
pos = 'center';
left -= (pop_width/2);
}else if( sleft > swidth*2 && sleft < swidth*3 ){
pos = 'right';
left -= (pop_width-63);
}
if( wheight - top < 200 && $(window).scrollTop() > 0 ){
bottom = wheight-top+(coor.height/2);
$('html').height( wheight - parseInt( $('html').css('padding-top') ) );
}else if( keepCurrent !== true ){
$('html').height('');
}
if( left < 50 ){
tip = left - 50;
left = 50;
}
if( left+swidth > wwidth ){
left -= ( (left+swidth) - wwidth ) + 50;
}
return [ top, left, pos, bottom, tip ];
},
events : {
'.m-p-controls>li>.cancel,.m-p-header .sl-close:click' : 'cancel',
'.m-p-header .m-p-toggle:click' : 'toggle',
'.m-p-controls>li>.save,.m-p-header .sl-check:click' : 'save'
},
cancel : function( e ){
$('html').css({'overflow': ''});
kc.do_action( 'before_cancel_popup', this );
// We will dont close the popup when in instant saving
if( $('#kc-preload').length > 0 || kc.tools.popup.no_close === true ){
kc.tools.popup.no_close = false;
return;
}
if( e.target.tagName == 'INPUT' )
return;
var el = $(this).closest('.kc-params-popup'),
keepCurrent = el.data('keepCurrentPopups'),
beforecalb, calb, aftercalb, i, prevent = false;
if( typeof el.data('before_cancel') !== undefined ){
beforecalb = el.data('before_cancel');
if( typeof beforecalb == 'function' ){
if( beforecalb( el, e ) == 'prevent' )
prevent = true;
}else if( beforecalb !== undefined && beforecalb.length > 0 ){
for( i = 0; i< beforecalb.length; i++ ){
if( typeof beforecalb[i] == 'function' ){
if( beforecalb[i]( el, e ) == 'prevent' )
prevent = true;
}
}
}
}
if( prevent === true )
return;
if( typeof el.data('cancel') !== undefined ){
calb = el.data('cancel');
if( typeof calb == 'function' ){
calb( el );
}else if( calb !== undefined && calb.length > 0 ){
for( i = 0; i< calb.length; i++ ){
if( typeof calb[i] == 'function' && calb[i]( el ) == 'prevent' )
prevent = true;
}
}
}
if( prevent === true )
return;
if( typeof el.data('after_cancel') !== undefined ){
aftercalb = el.data('after_cancel');
if( typeof aftercalb == 'function' ){
aftercalb( el );
}else if( aftercalb !== undefined && aftercalb.length > 0 ){
for( i = 0; i< aftercalb.length; i++ ){
if( typeof aftercalb[i] == 'function' && aftercalb[i]( el ) == 'prevent' )
prevent = true;
}
}
}
if( prevent === true )
return;
if( el.data('scrolltop') != undefined )
e.data.scrollback( el.data('scrolltop'), el.data('button') );
if( el.data('keepCurrentPopups') !== true )
$('html').height('');
el.remove();
$('.sys-colorPicker').remove();
// remove date picker
$('.pika-single').remove();
if( keepCurrent == false )
$('.kc-params-popup .sl-close.sl-func').trigger('click');
kc.do_action( 'after_cancel_popup', this );
},
save : function( e ){
kc.do_action( 'before_save_popup', this );
var el = $(this).closest('.kc-params-popup'),
keepCurrent = el.data('keepCurrentPopups'),
beforecalb, calb, aftercalb, i;
e.data.el = el;
if( typeof el.data('before_callback') !== undefined ){
beforecalb = el.data('before_callback');
if( typeof beforecalb == 'function' ){
beforecalb( el );
}else if( beforecalb !== undefined && beforecalb.length > 0 ){
for( i = 0; i< beforecalb.length; i++ ){
if( typeof beforecalb[i] == 'function' )
beforecalb[i]( el );
}
}
}
if( typeof el.data('callback') !== undefined ){
calb = el.data('callback');
if( typeof calb == 'function' ){
calb( el );
}else if( calb !== undefined && calb.length > 0 ){
for( i = 0; i< calb.length; i++ ){
if( typeof calb[i] == 'function' )
calb[i]( el );
}
}
}
if( typeof el.data('after_callback') !== undefined ){
aftercalb = el.data('after_callback');
if( typeof aftercalb == 'function' ){
aftercalb( el );
}else if( aftercalb !== undefined && aftercalb.length > 0 ){
for( i = 0; i< aftercalb.length; i++ ){
if( typeof aftercalb[i] == 'function' )
aftercalb[i]( el );
}
}
}
// We will dont close the popup when in instant saving
if( $('#kc-preload').length > 0 || kc.tools.popup.no_close === true ){
kc.tools.popup.no_close = false;
return;
}
if( el.data('scrolltop') != undefined )
e.data.scrollback( el.data('scrolltop'), el.data('button') );
//el.remove();
el.find('.sl-close.sl-func').trigger('click');
if( keepCurrent == false ){
$('.kc-params-popup .sl-close.sl-func').trigger('click');
$('html').height('');
}
kc.do_action( 'after_save_popup', this );
},
toggle : function( e ){
var pop = $(this).closest('.kc-params-popup');
if( pop.hasClass('kc-popup-collapse') )
pop.removeClass('kc-popup-collapse')
else pop.addClass('kc-popup-collapse')
},
scrollback : function( sctop, btn ){
var now = $(window).scrollTop();
if( Math.abs( sctop - now ) > 200 ){
kc.ui.scrollAssistive( sctop );
}
},
add_tab : function( pop, args ){
args = $().extend( { title: '', class: '', cfg: '', callback: function(){} }, args );
var ul = pop.find('.m-p-wrap ul.kc-pop-tabs'),
slug = 'kc-tab-'+Math.abs(parseInt(Math.random()*1000)),
li = $(''+args.title+'');
if( !ul.get(0) ){
/* if this is first tab be added */
ul = $('');
if( pop.find('.fields-edit-form').length > 0 ){
var fli = $(' General');
ul.append( fli );
fli.on( 'click', function( e ){
var wrp = $(this).closest('.m-p-wrap');
wrp.find('>.kc-pop-tabs li').removeClass('active');
$(this).addClass('active');
wrp.find('.m-p-body>.kc-pop-tab').removeClass('form-active');
wrp.find('.m-p-body>.fields-edit-form').addClass('form-active');
if( e.originalEvent !== undefined )
$(this).closest('.kc-params-popup').
data({ tab_active: $(this).parent().find('>li').index( this ) });
kc.do_action('popup_tab_switch', this );
});
}
pop.find('.m-p-header').after( ul );
}
ul.append( li );
/* Add event for new tab which just be created */
li.on( 'click', args.callback, function(e){
var slug = $(this).data('tab'), wrp = $(this).closest('.m-p-wrap').find('>.m-p-body');
$(this).closest('.m-p-wrap').find('>.kc-pop-tabs li').removeClass('active');
$(this).addClass('active');
wrp.find('>.kc-pop-tab').removeClass('form-active');
var tab = wrp.find('>.'+slug), click_actived = false, this_index = $(this).parent().find('>li').index( this );
if( $(this).closest('.kc-params-popup').data('tab_active') == this_index )
click_actived = true;
if( e.originalEvent !== undefined )
$(this).closest('.kc-params-popup').data({ tab_active: this_index });
kc.do_action('popup_tab_switch', this );
if( tab.get(0) ){
tab.addClass('form-active');
/*
* If the tab is actived and click on it
* We don't need to run callback
*/
if( click_actived === true )
return;
var callback = $(this).data('callback');
if( typeof callback == 'function' )
callback( this, tab );
return;
}
tab = $('');
wrp.append( tab );
tab.on( 'submit', function(){
$(this).closest('.kc-params-popup').find('.m-p-footer .save').trigger('click');
return false;
});
if( typeof e.data == 'function' )
tab.append( e.data( this , tab ) );
var callback = $(this).data('callback');
if( typeof callback == 'function' )
callback( this, tab );
});
return li;
},
callback : function( pop, args, unique ){
// prevent adding the same callback twice
if( unique !== undefined ){
var list_uniques = pop.data( 'callback_uniques' );
if( list_uniques === undefined )
list_uniques = [];
else if( list_uniques.indexOf( unique ) > -1 )
return;
list_uniques.push( unique );
pop.data({ 'callback_uniques': list_uniques });
}
var calls;
for( var st in args ){
calls = [];
if( pop.data( st ) !== undefined ){
if( typeof pop.data( st ) == 'function' )
calls.push( pop.data( st ) );
else if( typeof pop.data( st ) == 'object' )
calls = pop.data( st );
}
calls.push( args[st] );
pop.data( st, calls );
}
},
close_all : function() {
$('.kc-params-popup .sl-close.sl-func').trigger('click');
}
}),
editor : {
insert : function( id, html ){
var editor,
hasTinymce = typeof tinymce !== 'undefined',
hasQuicktags = typeof QTags !== 'undefined';
wpActiveEditor = id;
if ( hasTinymce ) {
editor = tinymce.get( wpActiveEditor );
}
if ( editor && ! editor.isHidden() ) {
editor.execCommand( 'mceInsertContent', false, html );
} else if ( hasQuicktags ) {
QTags.insertContent( html );
} else {
document.getElementById( wpActiveEditor ).value = html;
}
},
init : function ( textarea ) {
if ( $( '#wp-link' ).parent().hasClass( 'wp-dialog' ) ) {
$( '#wp-link' ).wpdialog( 'destroy' );
}
textarea.val( switchEditors.wpautop( textarea.val() ) );
var eid = textarea.attr( "id" ), tmi = window.tinyMCEPreInit, tmic = tmi.mceInit, tmiq = tmi.qtInit;
try {
if ( _.isUndefined( tinyMCEPreInit.qtInit[ eid ] ) ) {
tmiq[ eid ] = _.extend( {}, tmiq[ window.wpActiveEditor ], { id: eid } );
}
if ( tmi && tmic[ window.wpActiveEditor ] ) {
tmic[ eid ] = _.extend(
{},
tmic[ window.wpActiveEditor ],
{
resize: 'vertical',
height: 250,
id: eid,
setup: function ( e ) {
if ( typeof(e.on) != 'undefined' ) {
e.on( 'init', function ( e ) {
e.target.focus();
window.wpActiveEditor = eid;
});
} else {
e.onInit.add( function ( e ) {
e.focus();
window.wpActiveEditor = eid;
});
}
}
}
);
tmic[ eid ].wp_autoresize_on = false;
window.wpActiveEditor = eid;
}
quicktags( tmic[ eid ] );
QTags._buttonsInit();
if ( window.tinymce ) {
window.switchEditors && window.switchEditors.go( eid, 'tmce' );
if ( tinymce.majorVersion === "4" ) {
tinymce.execCommand( 'mceAddEditor', true, eid );
var textarea = $('#'+eid);
if( tinyMCE.get( eid ) !== null ){
tinyMCE.get( eid ).on('keyup mouseup change', function(e) {
textarea.val( tinyMCE.activeEditor.getContent({format : 'raw'}) ).change();
});
}
textarea.on('keyup mouseup', function(){textarea.change();});
}
}
} catch ( e ) {
$( '#wp-' + eid + '-wrap' ).html('Tinymce Error!');
if ( console && console.error ) {
console.error( e );
}
}
}
},
get_icons : function(){
if( kc.icons != undefined )
return kc.icons;
function css_text(x) { return x.cssText; }
var files = document.querySelectorAll('*[id^="kc-sys-icon-"]'), html = '', css;
if( !files || files.length === 0 )
return '';
for( var i=0; i < files.length; i++ ){
css = Array.prototype.map.call( files[i].sheet.cssRules, css_text ).join('\n');
css = css.split('::before');
css.forEach(function( i ){
i = i.split('.')[1];
if( i !== undefined && i.indexOf('/') == -1 )
html += '';
});
}
kc.icons = html;
return html;
},
filter_images : function(str) {
var m, str, regxx = new RegExp('\%SITE\_URL\%(.+?)(\'|\"|\\)|\ )', 'g');
while (m = regxx.exec( str ) ) {
if( m[0].indexOf( 'kc_get_thumbn' ) === -1 ){
str = str.replace( m[0], kc_ajax_url+'?action=kc_get_thumbn&type=filter_url&id='+encodeURIComponent(m[1])+m[2]);
}else{
str = str.replace( m[0], kc_site_url + m[1]+m[2]);
}
}
return str;
},
reverse : function(s) {
var o = [];
for (var i = 0, len = s.length; i <= len; i++)
o.push(s.charAt(len - i));
return o.join('');
}
} );
} )( jQuery );