PluginProbe
Page Builder: Pagelayer – Drag and Drop website builder / 2.2.2
Page Builder: Pagelayer – Drag and Drop website builder v2.2.2
2.2.2 2.2.1 2.2.0 2.1.9 2.1.8 2.1.7 2.1.6 2.1.5 2.1.4 2.1.3 trunk 0.9.0 0.9.1 0.9.2 0.9.3 0.9.4 0.9.5 0.9.6 0.9.7 0.9.8 0.9.9 1.0.0 1.0.2 1.0.3 1.0.4 All 130 releases
← All changes | js/properties.js +2843 -375 1.0.4 → 2.2.2 View file →
@@ -10,8 +10,11 @@
10 10
11 11 // The active pagelayer element
12 12 var pagelayer_active_tab = {};
13 13
14 +// The menu items refrence
15 +var pagelayer_menus_items_ref = {};
16 +
14 17 // Loads the Data
15 18 function pagelayer_data(jEle, clean){
16 19
17 20 var ret = new Object();
@@ -17,25 +20,17 @@
17 20 var ret = new Object();
18 21
19 22 // Get the data
20 23 ret.tag = pagelayer_tag(jEle);
21 - ret.id = jEle.attr('pagelayer-id');
24 + ret.id = pagelayer_id(jEle);
22 25 ret.$ = jEle;
23 26
27 + var ref_data = pagelayer_el_data_ref(jEle);
28 +
24 29 // Parse the attributes
25 - ret.atts = new Object();
26 - ret.tmp = new Object();
30 + ret.atts = JSON.parse(JSON.stringify(ref_data['attr']));
31 + ret.tmp = JSON.parse(JSON.stringify(ref_data['tmp']));
27 32
28 - jQuery.each(jEle[0].attributes, function(index, att){
29 - if(att.name.match(/pagelayer\-a\-/i)){
30 - ret.atts[att.name.substr(12)] = att.value;
31 - }
32 -
33 - if(att.name.match(/pagelayer\-tmp\-/i)){
34 - ret.tmp[att.name.substr(14)] = att.value;
35 - }
36 - });
37 -
38 33 //console.log(ret.atts);
39 34 //console.log(ret.tmp);
40 35
41 36 clean = clean || false;
@@ -62,11 +57,21 @@
62 57 // Loop through all props
63 58 for(var i in pagelayer_tabs){
64 59
65 60 var tab = pagelayer_tabs[i];
66 -
61 +
62 + section_loop1:
67 63 for(var section in all_props[tab]){
68 64
65 + // Any section to skip by post type ?
66 + if(!pagelayer_empty(all_props['post_type_cats'])){
67 + for(var post_type in all_props['post_type_cats']){
68 + if(pagelayer_post.post_type != post_type && jQuery.inArray(section, all_props['post_type_cats'][post_type]) > -1){
69 + continue section_loop1;
70 + }
71 + }
72 + }
73 +
69 74 var props = section in pagelayer_shortcodes[tag] ? pagelayer_shortcodes[tag][section] : pagelayer_styles[section];
70 75
71 76 // In case of widgets its possible !
72 77 if(pagelayer_empty(props)){
@@ -92,15 +97,17 @@
92 97 var tmp_val = prop['default'];
93 98
94 99 // If there is a unit and there is no unit suffix in atts value
95 100 if('units' in prop){
96 - if(jQuery.isNumeric(prop['default'])){
97 - tmp_val = prop['default']+prop['units'][0];
101 + if(jQuery.isNumeric(tmp_val)){
102 + tmp_val = tmp_val+prop['units'][0];
98 103 }else{
99 104 var sep = 'sep' in prop ? prop['sep'] : ',';
100 - var tmp2 = prop['default'].split(sep);
105 + var tmp2 = tmp_val.split(sep);
101 106 for(var k in tmp2){
102 - tmp2[k] = tmp2[k]+prop['units'][0];
107 + if(jQuery.isNumeric(tmp2[k])){
108 + tmp2[k] = tmp2[k]+prop['units'][0];
109 + }
103 110 }
104 111 tmp_val = tmp2.join(sep);
105 112 }
106 113 }
@@ -184,12 +191,13 @@
184 191 // pagelayer-ELPD - Element Properties Dialog
185 192 pagelayer_elpd_html = '<div class="pagelayer-elpd-tabs">'+
186 193 '<div class="pagelayer-elpd-tab" pagelayer-elpd-tab="settings" pagelayer-elpd-active-tab=1>Settings</div>'+
187 194 //'<div class="pagelayer-elpd-tab" pagelayer-elpd-tab="styles">Style</div>'+
188 - '<div class="pagelayer-elpd-tab" pagelayer-elpd-tab="options">Options</div>'+
195 + '<div class="pagelayer-elpd-tab" pagelayer-elpd-tab="options">Style</div>'+
196 + '<div class="pagelayer-advanced-props pagelayer-elpd-tab pagelayer-hidden" pagelayer-elpd-tab="advanced">Advanced</div>'+
189 197 '<div class="pagelayer-elpd-options">'+
190 - '<i class="pli pli-clone" />'+
191 - '<i class="pli pli-trashcan" />'+
198 + '<i class="pli pli-clone" ></i>'+
199 + '<i class="pli pli-trashcan" ></i>'+
192 200 '</div>'+
193 201 '</div>'+
194 202 '<div class="pagelayer-elpd-body"></div>'+
195 203 '<div class="pagelayer-elpd-holder"></div>';
@@ -199,8 +207,9 @@
199 207 pagelayer_elpd = pagelayer.$$('#pagelayer-elpd');
200 208
201 209 pagelayer.$$('.pagelayer-elpd-close').on('click', function(){
202 210 pagelayer_leftbar_tab('pagelayer-shortcodes');
211 + pagelayer.$$('[pagelayer-widget-tab="widgets"]').click();
203 212 pagelayer.$$('.pagelayer-elpd-header').hide();
204 213 pagelayer.$$('.pagelayer-logo').show();
205 214 pagelayer.$$('.pagelayer-elpd-body').removeAttr('pagelayer-element-id').empty();
206 215 pagelayer_active = {};
@@ -216,16 +225,43 @@
216 225 pagelayer_delete_element(pagelayer_active.el.$);
217 226 //pagelayer.$$('.pagelayer-elpd-close').click();
218 227 });
219 228
229 + // The advanced props
230 + pagelayer_elpd.find('.pagelayer-advanced-props').on('click', function(e){
231 + e.preventDefault();
232 + e.stopPropagation();
233 + var propsModal = pagelayer.$$('.pagelayer-props-modal');
234 + if(propsModal.find('.pagelayer-meta-iframe').length < 1){
235 + propsModal.find('.pagelayer-props-wrap').append('<iframe class="pagelayer-meta-iframe" src="'+ pagelayer_post_props +'" style="display:none"></iframe>');
236 + propsModal.find('.pagelayer-meta-iframe').load(function(){
237 + propsModal.find('.pagelayer-props-loading-screen').hide();
238 + propsModal.find('.pagelayer-props-modal-close').css('visibility','visible');
239 + jQuery(this).show();
240 + });
241 + }
242 +
243 + propsModal.show();
244 + pagelayer.$$('.pagelayer-meta-iframe').contents().find('.pagelayer-tab-items[data-tab="post_props"]').click();
245 + });
246 +
220 247 // The tabs
221 - pagelayer_elpd.find('.pagelayer-elpd-tab').on('click', function(){
248 + pagelayer_elpd.find('.pagelayer-elpd-tab').on('click', function(){
249 +
250 + var jEle = jQuery(this);
222 251 var attr = 'pagelayer-elpd-active-tab';
252 + var tab = jEle.attr('pagelayer-elpd-tab');
253 +
254 + if(tab == 'advanced'){
255 + return;
256 + }
257 +
223 258 pagelayer_elpd.find('.pagelayer-elpd-tab').each(function(){
224 259 jQuery(this).removeAttr(attr);
225 260 });
226 - jQuery(this).attr(attr, 1);
227 261
262 + jEle.attr(attr, 1);
263 +
228 264 // Trigger the showing of rows
229 265 pagelayer_elpd_show_rows();
230 266 });
231 267
@@ -233,8 +269,12 @@
233 269
234 270 // Open the properties
235 271 function pagelayer_elpd_open(jEle){
236 272
273 + var el_data = pagelayer_data(jEle);
274 + var is_same = (!pagelayer_empty(pagelayer_active.el) && pagelayer_active.el.id === el_data.id);
275 + var active_tab = pagelayer_elpd.find('[pagelayer-elpd-active-tab]').attr('pagelayer-elpd-tab');
276 +
237 277 // Set pagelayer history FALSE
238 278 pagelayer.history_action = false;
239 279
240 280 // Set the position of the element and show
@@ -240,11 +280,20 @@
240 280 // Set the position of the element and show
241 281 //pagelayer_elpd.css('left', pagelayer_elpd_pos[0]);
242 282 //pagelayer_elpd.css('top', pagelayer_elpd_pos[1]);
243 283 pagelayer_leftbar_tab('pagelayer-elpd');
284 + pagelayer.$$('[pagelayer-elpd-tab=settings]').show();
244 285 pagelayer.$$('.pagelayer-elpd-header').show();
245 286 pagelayer.$$('.pagelayer-logo').hide();
246 287
288 + // Activate settings tab by default or keep active tab if it's the same element
289 + pagelayer_elpd.find('.pagelayer-elpd-tab').removeAttr('pagelayer-elpd-active-tab');
290 + if (is_same && active_tab) {
291 + pagelayer_elpd.find('[pagelayer-elpd-tab="' + active_tab + '"]').attr('pagelayer-elpd-active-tab', 1);
292 + } else {
293 + pagelayer_elpd.find('[pagelayer-elpd-tab="settings"]').attr('pagelayer-elpd-active-tab', 1);
294 + }
295 +
247 296 // The property holder
248 297 var holder = pagelayer.$$('.pagelayer-elpd-body');
249 298 holder.html(' ');
250 299
@@ -261,8 +310,12 @@
261 310
262 311 // Render tooltips for the ELPD
263 312 pagelayer_tooltip_setup();
264 313
314 + // Setup instant properties search
315 + if (typeof pagelayer_setup_properties_search === 'function') {
316 + pagelayer_setup_properties_search();
317 + }
265 318 };
266 319
267 320 // Show the properties window
268 321 function pagelayer_elpd_generate(jEle, holder){
@@ -273,8 +326,9 @@
273 326
274 327 // Is it a valid type ?
275 328 if(pagelayer_empty(pagelayer_shortcodes[el.tag])){
276 329 pagelayer_error('Could not find this shortcode : '+el.tag);
330 + return;
277 331 }
278 332
279 333 // Set the holder
280 334 holder.attr('pagelayer-element-id', el.id);
@@ -286,11 +340,22 @@
286 340
287 341 for(var i in pagelayer_tabs){
288 342 var tab = pagelayer_tabs[i];
289 343 var section_close = false;// First section always open
344 +
345 + section_loop2:
290 346 for(var section in all_props[tab]){
291 347 //console.log(tab+' '+section);
292 -
348 +
349 + // Any section to skip by post type ?
350 + if(!pagelayer_empty(all_props['post_type_cats'])){
351 + for(var post_type in all_props['post_type_cats']){
352 + if(pagelayer_post.post_type != post_type && jQuery.inArray(section, all_props['post_type_cats'][post_type]) > -1){
353 + continue section_loop2;
354 + }
355 + }
356 + }
357 +
293 358 var props = section in pagelayer_shortcodes[el.tag] ? pagelayer_shortcodes[el.tag][section] : pagelayer_styles[section];
294 359 //console.log(props);
295 360
296 361 var sec = jQuery('<div class="pagelayer-elpd-section" section="'+section+'" pagelayer-show-tab="'+tab+'">'+
@@ -360,8 +425,22 @@
360 425 if(typeof fn_load == 'function'){
361 426 fn_load(el, props);
362 427 }*/
363 428
429 + // Hide clone and delete options
430 + if(!pagelayer_empty(all_props['hide_active']) && (pagelayer_empty(pagelayer_active.el) || pagelayer_active.el.id == el.id)){
431 + pagelayer.$$('.pagelayer-elpd-options').addClass('pagelayer-hidden');
432 + }else{
433 + pagelayer.$$('.pagelayer-elpd-options').removeClass('pagelayer-hidden');
434 + }
435 +
436 + // Add Advanced settings options for the props
437 + if(el.tag == 'pl_post_props'){
438 + pagelayer.$$('.pagelayer-elpd-tab[pagelayer-elpd-tab="advanced"]').removeClass('pagelayer-hidden');
439 + }else{
440 + pagelayer.$$('.pagelayer-elpd-tab[pagelayer-elpd-tab="advanced"]').addClass('pagelayer-hidden');
441 + }
442 +
364 443 // Section open close
365 444 holder.find('>.pagelayer-elpd-section>.pagelayer-elpd-section-name').on('click', function(){
366 445 var _sec = jQuery(this);
367 446 var par = _sec.parent();
@@ -391,9 +470,12 @@
391 470
392 471 });
393 472
394 473 if(!pagelayer_empty(pagelayer_active_tab) && pagelayer_active_tab.id == el.id){
395 - holder.find('>[section='+pagelayer_active_tab.section+']>.pagelayer-elpd-section-name').click();
474 + var target_sec = holder.find('>[section='+pagelayer_active_tab.section+']');
475 + if(target_sec.length > 0 && !target_sec.find('.pagelayer-elpd-section-rows').is(':visible')){
476 + target_sec.find('.pagelayer-elpd-section-name').click();
477 + }
396 478 }
397 479
398 480 // Handle the showing of rows
399 481 pagelayer_elpd_show_rows();
@@ -417,36 +499,57 @@
417 499
418 500 // Append the row
419 501 holder.append(row);
420 502
421 - var fn_ui = window['pagelayer_elp_'+prop['type']+'_ui'];
503 + return pagelayer_elpd_render_row(row, prop);
422 504
423 - // Is there a UI Handler ?
424 - if(typeof fn_ui == 'function'){
505 + }
506 +
507 +};
508 +
509 +// Render a row
510 +function pagelayer_elpd_render_row(row, prop){
511 +
512 + var fn = window['pagelayer_elp_'+prop['type']];
513 +
514 + if('group' in prop){
515 + row.attr('pagelayer-access-item', prop.group);
516 + }
517 +
518 + var fn_ui = window['pagelayer_elp_'+prop['type']+'_ui'];
519 +
520 + // Is there a UI Handler ?
521 + if(typeof fn_ui == 'function'){
522 +
523 + fn_ui(row, prop);
524 +
525 + // Use the default mechanism
526 + }else{
425 527
426 - fn_ui(row, prop);
427 -
428 - // Use the default mechanism
429 - }else{
430 -
431 - // The label
432 - pagelayer_elp_label(row, prop);
433 -
434 - // The main property
435 - fn(row, prop);
436 -
437 - // Is there a description ?
438 - if(!pagelayer_empty(prop['desc'])){
439 - pagelayer_elp_desc(row, prop['desc']);
440 - }
441 -
528 + // The label
529 + pagelayer_elp_label(row, prop);
530 +
531 + // The main property
532 + fn(row, prop);
533 +
534 + // Showing default button or not
535 + if(pagelayer_properties_filter(prop['type']) && pagelayer_empty(row.find('.pagelayer-pro-req').length)){
536 + pagelayer_show_default_button(row, prop, prop.c['val']);
442 537 }
443 538
444 - return row;
539 + // Is there a description ?
540 + if(!pagelayer_empty(prop['desc'])){
541 + pagelayer_elp_desc(row, prop['desc']);
542 + }
445 543
446 544 }
447 545
448 -};
546 + if('script' in prop){
547 + row.append('<script>'+prop.script+'</script>');
548 + }
549 +
550 + return row;
551 +}
449 552
450 553 // Show the rows as per the active tab and also handle the rows that are supposed to be shown or not
451 554 function pagelayer_elpd_show_rows(){
452 555
@@ -499,9 +602,9 @@
499 602
500 603 // Find the row
501 604 var row = false;
502 605
503 - holder.find('[pagelayer-elp-name='+x+']').each(function(){
606 + holder.find('[pagelayer-elp-name="'+x+'"]').each(function(){
504 607 var j = jQuery(this);
505 608 var _id = j.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
506 609 //console.log(_id+' = '+id);
507 610
@@ -652,8 +755,16 @@
652 755 }
653 756
654 757 // Post any existing data
655 758 var form = sec.find('form');
759 + // Archive widget checkbox fix
760 + var inputCheckbox = form.find('input[type=checkbox]');
761 + for(var i=0; i<inputCheckbox.length; i++){
762 + if(inputCheckbox[i].value == 'on'){
763 + form.find('input[type=checkbox]')[i].value = 1;
764 + }
765 + }
766 +
656 767 if(form.length > 0){
657 768 //console.log(form.serialize());
658 769 post['values'] = form.serialize();
659 770 }
@@ -685,9 +796,9 @@
685 796 }
686 797
687 798 },
688 799 fail: function(data) {
689 - alert('Some error occured in getting the widget data');
800 + pagelayer_show_msg('Some error occured in getting the widget data', 'error');
690 801 }
691 802 });
692 803
693 804 }
@@ -695,12 +806,15 @@
695 806 // Will set the attribute and also render
696 807 function _pagelayer_set_atts(row, val, no_default){
697 808 var id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
698 809 var jEle = jQuery('[pagelayer-id='+id+']');
810 + var tag = pagelayer_tag(jEle);
811 + var prop_name = row.attr('pagelayer-elp-name');
812 + var prop = pagelayer.props_ref[tag][prop_name];
699 813
700 814 // Is there a unit ?
701 815 var uEle = row.find('.pagelayer-elp-units');
702 - if(uEle.length > 0){
816 + if(uEle.length > 0 && !pagelayer_empty(val)){
703 817 var unit = uEle.find('[selected]').html();
704 818 if(Array.isArray(val)){
705 819 for(var i in val){
706 820 if(val[i].length < 1){
@@ -713,12 +827,11 @@
713 827 }
714 828 }
715 829
716 830 // Are we in another mode ?
717 - var mEle = row.find('.pagelayer-elp-screen');
718 - var mode = mEle.length > 0 && pagelayer_get_screen_mode() != 'desktop' ? '_'+pagelayer_get_screen_mode() : '';
831 + var mode = ('screen' in prop && pagelayer_get_screen_mode() != 'desktop') ? '_'+pagelayer_get_screen_mode() : '';
719 832
720 - pagelayer_set_atts(jEle, row.attr('pagelayer-elp-name')+mode, val);
833 + pagelayer_set_atts(jEle, prop_name+mode, val);
721 834
722 835 // Are we to skip setting defaults ?
723 836 no_default = no_default || false;
724 837 if(!no_default){
@@ -736,8 +849,20 @@
736 849 //console.trace();console.log('Setting Attr');
737 850
738 851 // Render
739 852 pagelayer_sc_render(jEle);
853 +
854 + // Show default button or not
855 + if(pagelayer_properties_filter(prop) && pagelayer_empty(row.find('.pagelayer-pro-req').length)){
856 + pagelayer_show_default_button(row, prop, val);
857 + }
858 +
859 + if('onchange' in prop){
860 + var fn = window[prop['onchange']];
861 + if(typeof fn === 'function'){
862 + fn(jEle, row, val);
863 + }
864 + }
740 865 };
741 866
742 867 // Will set the attribute but not render
743 868 function _pagelayer_set_tmp_atts(row, suffix, val){
@@ -742,11 +867,25 @@
742 867 // Will set the attribute but not render
743 868 function _pagelayer_set_tmp_atts(row, suffix, val){
744 869 var id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
745 870 var jEle = jQuery('[pagelayer-id='+id+']');
746 - pagelayer_set_tmp_atts(jEle, row.attr('pagelayer-elp-name')+'-'+suffix, val);
871 + pagelayer_set_tmp_atts(jEle, row.attr('pagelayer-elp-name')+(suffix.length > 0 ? '-'+suffix : ''), val);
747 872 };
748 873
874 +// Will clear the attribute but not render
875 +function _pagelayer_clear_tmp_atts(row){
876 + var id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
877 + var jEle = jQuery('[pagelayer-id='+id+']');
878 + pagelayer_clear_tmp_atts(jEle, row.attr('pagelayer-elp-name'));
879 +};
880 +
881 +// Get the attribute of images only
882 +function _pagelayer_img_tmp_atts(row){
883 + var id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
884 + var jEle = jQuery('[pagelayer-id='+id+']');
885 + return pagelayer_img_tmp_atts(jEle, row.attr('pagelayer-elp-name'));
886 +};
887 +
749 888 // Get the tmp att
750 889 function _pagelayer_get_tmp_att(row, suffix){
751 890 var id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
752 891 var jEle = jQuery('[pagelayer-id='+id+']');
@@ -754,9 +893,9 @@
754 893 };
755 894
756 895 // Create the Label
757 896 function pagelayer_elp_label(row, prop){
758 - row.append('<div class="pagelayer-elp-label-div"><label class="pagelayer-elp-label">'+prop['label']+'</label></div>');
897 + row.append('<div class="pagelayer-elp-label-div" type="'+prop['type']+'"><label class="pagelayer-elp-label">'+prop['label']+'</label></div>');
759 898
760 899 var label = row.children('.pagelayer-elp-label-div');
761 900
762 901 // Do we have screen ?
@@ -762,12 +901,12 @@
762 901 // Do we have screen ?
763 902 if('screen' in prop){
764 903 var mode = pagelayer_get_screen_mode();
765 904 var screen = '<div class="pagelayer-elp-screen">'+
766 - '<i class="pli pli-desktop" />'+
767 - '<i class="pli pli-tablet" />'+
768 - '<i class="pli pli-mobile" />'+
769 - '<i class="pagelayer-prop-screen pli pli-'+mode+'" />'+
905 + '<i class="pli pli-desktop" ></i>'+
906 + '<i class="pli pli-tablet" ></i>'+
907 + '<i class="pli pli-mobile" ></i>'+
908 + '<i class="pagelayer-prop-screen pli pli-'+mode+'" ></i>'+
770 909 '</div>';
771 910 label.append(screen);
772 911
773 912 // Set screen mode on change
@@ -831,9 +970,9 @@
831 970 }
832 971
833 972 // Do we have pro version requirement ?
834 973 if('pro' in prop && pagelayer_empty(pagelayer_pro)){
835 - var txt = prop['pro'].length > 1 ? prop['pro'] : 'This feature is a part of <a href="'+pagelayer_pro_url+'" target="_blank">Pagelayer Pro</a>. You will need purchase <a href="'+pagelayer_pro_url+'" target="_blank">Pagelayer Pro</a> to use this feature.'
974 + var txt = prop['pro'].length > 1 ? prop['pro'] : pagelayer.pro_txt;
836 975 var pro = jQuery('<div class="pagelayer-pro-req">Pro</div>');
837 976 pro.attr('data-tlite', txt);
838 977 label.append(pro);
839 978 }
@@ -848,10 +987,12 @@
848 987 // Get unit from value
849 988 if(!(pagelayer_empty(tmp_val))){
850 989
851 990 for(var i in prop['units']){
852 - if(tmp_val.search(prop['units'][i]) != -1){
991 + if(pagelayer_is_string(tmp_val) && tmp_val.search(prop['units'][i]) != -1){
853 992 default_unit = i;
993 + }else if(tmp_val[0].search(prop['units'][i]) != -1 ){
994 + default_unit = i;
854 995 }
855 996 }
856 997 }
857 998
@@ -873,23 +1014,34 @@
873 1014 });
874 1015
875 1016 }
876 1017
1018 + // Include default button
1019 + if(pagelayer_properties_filter(prop['type']) && pagelayer_empty(row.find('.pagelayer-pro-req').length)){
1020 +
1021 + var defaultButton = '<span class="pagelayer-elp-default" title="'+pagelayer_l('back_to_default')+'" ><i class="fas fa-undo"></i></span>';
1022 + label.append(defaultButton);
1023 +
1024 + label.find('.pagelayer-elp-default').on('click', function(){
1025 +
1026 + prop.c['val'] = ('default' in prop) ? prop.default : '';
1027 + _pagelayer_set_atts(row, prop.c['val']);
1028 +
1029 + jQuery(this).attr('data_show',false);
1030 +
1031 + // Empty the row
1032 + row.html('');
1033 +
1034 + // Re-render the row
1035 + pagelayer_elpd_render_row(row, prop);
1036 +
1037 + });
1038 + }
877 1039 };
878 1040
879 -// Create the Label
880 -function pagelayer_elp_heading(row, prop){
881 - //row.append('<div class="pagelayer-elp-heading">'+prop['label']+'</div>');
882 -}
883 -
884 -// Create the Label
885 -function pagelayer_elp_heading_ui(row, prop){
886 - row.append('<div class="pagelayer-elp-heading">'+prop['label']+'</div>');
887 -}
888 -
889 1041 // Create the Description
890 1042 function pagelayer_elp_desc(row, label){
891 - //row.append('<div class="pagelayer-elp-desc">'+label+'</div>');
1043 + row.append('<div class="pagelayer-elp-desc">'+label+'</div>');
892 1044 };
893 1045
894 1046 // The Text property
895 1047 function pagelayer_elp_text(row, prop){
@@ -894,9 +1046,9 @@
894 1046 // The Text property
895 1047 function pagelayer_elp_text(row, prop){
896 1048
897 1049 var div = '<div class="pagelayer-elp-text-div">'+
898 - '<input type="text" class="pagelayer-elp-text" name="'+prop.c['name']+'" value="'+prop.c['val']+'"></input>'+
1050 + '<input type="text" class="pagelayer-elp-text" name="'+prop.c['name']+'" value="'+pagelayer_htmlEntities(prop.c['val'])+'"></input>'+
899 1051 '</div>';
900 1052
901 1053 row.append(div);
902 1054
@@ -970,13 +1122,20 @@
970 1122
971 1123 var show_sel = function(val){
972 1124 var sel_html = '';
973 1125 jQuery.each(val, function(index, value){
974 - sel_html += '<span class="pagelayer-elp-multiselect-selected">'+prop['list'][value]+'</span>';
1126 + sel_html += '<span class="pagelayer-elp-multiselect-selected" data-val="'+value+'">'+prop['list'][value]+' <span class="pagelayer-elp-multiselect-remove">x</span></span>';
975 1127 });
976 1128 return sel_html;
977 1129 }
978 1130
1131 + var setup_remove = function(){
1132 + row.find('.pagelayer-elp-multiselect-remove').on('click', function(){
1133 + var sVal = jQuery(this).parent().attr('data-val');
1134 + row.find('.pagelayer-elp-multiselect-option[data-val='+sVal+']').click();
1135 + });
1136 + }
1137 +
979 1138 for (x in prop['list']){
980 1139 options += option(x, prop['list'][x]);
981 1140 }
982 1141
@@ -985,8 +1144,9 @@
985 1144 '<ul class="pagelayer-elp-multiselect-ul" name="'+prop.c['name']+'">'+options+'</ul>'+
986 1145 '</div>';
987 1146
988 1147 row.append(div);
1148 + setup_remove();
989 1149
990 1150 row.find('.pagelayer-elp-multiselect-option').on('click', function(){
991 1151
992 1152 var sVal = jQuery(this).attr('data-val');
@@ -1001,15 +1161,16 @@
1001 1161
1002 1162 //_pagelayer_set_atts(row,JSON.stringify(selection));// Save and Render
1003 1163 _pagelayer_set_atts(row, selection.join(','));// Save and Render
1004 1164
1005 - row.find('.pagelayer-elp-multiselect').html(show_sel(selection));
1165 + row.find('.pagelayer-elp-multiselect').html(show_sel(selection));
1166 + setup_remove();
1006 1167
1007 1168 });
1008 1169
1009 1170 // Open the selector
1010 1171 row.find('.pagelayer-elp-multiselect').on('click', function(){
1011 - row.find('.pagelayer-elp-multiselect-ul').slideToggle();
1172 + row.find('.pagelayer-elp-multiselect-ul').slideToggle(100);
1012 1173 });
1013 1174
1014 1175 }
1015 1176
@@ -1069,9 +1230,9 @@
1069 1230 var addclass = (prop.c['val'] == x) ? active : '';
1070 1231 div += '<a class="pagelayer-elp-radio '+addclass+'" val="'+x+'">'+prop.list[x]+'</a>';
1071 1232 }
1072 1233
1073 - div += '<div>';
1234 + div += '</div>';
1074 1235
1075 1236 row.append(div);
1076 1237
1077 1238 row.find('.pagelayer-elp-radio').each(function(){
@@ -1094,27 +1255,157 @@
1094 1255
1095 1256 // The Image Property
1096 1257 function pagelayer_elp_image(row, prop){
1097 1258
1098 - var style = '';
1259 + var imgObj = {};
1260 + var isRetina = false;
1261 +
1262 + // Previously saved values
1263 + if(typeof prop.c['val'] === 'object'){
1264 + imgObj = prop.c['val'];
1265 + }else{
1266 + imgObj['img'] = prop.c['val'];
1267 + }
1268 +
1099 1269 var tmp = prop.c['name']+'-url';
1100 1270 var def = pagelayer.blank_img;
1101 - var src = (tmp in prop.el.tmp) ? prop.el.tmp[tmp] : def;
1271 +
1272 + // Background image URls
1273 + var src = (tmp in prop.el.tmp) ? prop.el.tmp[tmp] : ((!pagelayer_empty(imgObj['img']) && String(imgObj['img']).search(/http(|s):\/\//i) == 0) ? imgObj['img'] : def );
1102 1274
1103 1275 // Do we have a URL set ?
1104 - style = 'style="background-image:url(\''+src+'\')"';
1276 + var style = 'style="background-image:url(\''+src+'\')"';
1105 1277
1106 1278 var div = '<div class="pagelayer-elp-image-div">'+
1107 - '<div class="pagelayer-elp-image" '+style+'></div>'+
1108 - '<div class="pagelayer-elp-image-delete"><i class="pli pli-trashcan" /></div>'+
1109 - '</div>';
1279 + '<div class="pagelayer-elp-drop-zone">'+
1280 + '<div>'+
1281 + '<i class="fas fa-upload"></i>'+
1282 + '<h4>'+pagelayer_l('drop_file')+'</h4>'+
1283 + '<div class="pagelayer-elp-img-up-progress">'+
1284 + '<div class="pagelayer-elp-img-up-bar"></div>'+
1285 + '</div>'+
1286 + '</div>'+
1287 + '</div>'+
1288 + '<div class="pagelayer-elp-image" '+style+'></div>'+
1289 + '<div class="pagelayer-elp-image-delete"><i class="pli pli-trashcan" ></i></div>';
1290 +
1291 + // Retina image icon
1292 + if(isRetina){
1293 + div += '<div class="pagelayer-elp-image-retina"><i class="pli pli-eye" ></i></div>';
1294 + }
1295 +
1296 + if(!pagelayer_empty(pagelayer.cmode) && ! ('ai' in prop && prop['ai'] == false)){
1297 + var tmp_ai = pagelayer_get_att(prop.el.$, prop.c['name']+'_ai');
1298 + var checked = tmp_ai == false ? 'checked' : '';
1299 +
1300 + div += '<div class="pagelayer-elp-image-ai" data-tlite="If checked, replace by AI will be ignored"><input type="checkbox" '+checked+'/></div>';
1301 + }
1302 +
1303 +
1304 + div +='</div>';
1305 +
1306 + // Add retina images option
1307 + if(isRetina){
1308 +
1309 + var tmp_retina = prop.c['name']+'-retina-url';
1310 + var tmp_retina_mobile = prop.c['name']+'-retina-mobile-url';
1311 +
1312 + var srcRetina = (tmp_retina in prop.el.tmp) ? prop.el.tmp[tmp_retina] : (('retina' in imgObj && !pagelayer_empty(imgObj['retina']) && String(imgObj['retina']).search(/http(|s):\/\//i) == 0) ? imgObj['retina'] : def );
1110 1313
1314 + var srcRetinaMobile = (tmp_retina_mobile in prop.el.tmp) ? prop.el.tmp[tmp_retina_mobile] : (('retina_mobile' in imgObj && !pagelayer_empty(imgObj['retina_mobile']) && String(imgObj['retina_mobile']).search(/http(|s):\/\//i) == 0) ? imgObj['retina_mobile'] : def );
1315 +
1316 + var style_retina = 'style="background-image:url(\''+srcRetina+'\')"';
1317 + var style_retina_mobile = 'style="background-image:url(\''+srcRetinaMobile+'\')"';
1318 +
1319 + div +='<div class="pagelayer-elp-label-div pagelayer-retina-label" type="image" style="display:none;">'+
1320 + '<label class="pagelayer-elp-label">Select Retina Image</label>'+
1321 + '</div>'+
1322 + '<div class="pagelayer-elp-retina-image-div" style="display:none;">'+
1323 + '<div class="pagelayer-elp-drop-zone">'+
1324 + '<div>'+
1325 + '<i class="fas fa-upload"></i>'+
1326 + '<h4>'+pagelayer_l('drop_file')+'</h4>'+
1327 + '<div class="pagelayer-elp-img-up-progress">'+
1328 + '<div class="pagelayer-elp-img-up-bar"></div>'+
1329 + '</div>'+
1330 + '</div>'+
1331 + '</div>'+
1332 + '<div class="pagelayer-elp-image pagelayer-retina" '+style_retina+'></div>'+
1333 + '<div class="pagelayer-elp-retina-delete"><i class="pli pli-trashcan" ></i></div>'+
1334 + '</div>'+
1335 + '<div class="pagelayer-form-item">'+
1336 + '<div class="pagelayer-elp-label-div pagelayer-retina-label" type="image" style="display:none;">'+
1337 + '<label class="pagelayer-elp-label">Select Retina Image For Mobile</label>'+
1338 + '</div>'+
1339 + '<div class="pagelayer-elp-checkbox-div pagelayer-retina-label" style="display:none;">'+
1340 + '<input type="checkbox" name="overlay" class="pagelayer-elp-checkbox pagelayer-retina-checkbox">'+
1341 + '</div>'+
1342 + '</div>'+
1343 +
1344 + '<div class="pagelayer-elp-retina-mobile-image-div" style="display:none;">'+
1345 + '<div class="pagelayer-elp-drop-zone">'+
1346 + '<div>'+
1347 + '<i class="fas fa-upload"></i>'+
1348 + '<h4>'+pagelayer_l('drop_file')+'</h4>'+
1349 + '<div class="pagelayer-elp-img-up-progress">'+
1350 + '<div class="pagelayer-elp-img-up-bar"></div>'+
1351 + '</div>'+
1352 + '</div>'+
1353 + '</div>'+
1354 + '<div class="pagelayer-elp-image pagelayer-retina-mobile" '+style_retina_mobile+'></div>'+
1355 + '<div class="pagelayer-elp-retina-mobile-delete"><i class="pli pli-trashcan" ></i></div>'+
1356 + '</div>';
1357 + }
1358 +
1111 1359 row.append(div);
1112 1360
1361 + if(def == src && jQuery.isNumeric(imgObj['img'])){
1362 + wp.media.attachment(imgObj['img']).fetch().then(function (data){
1363 + var fetch_url = wp.media.attachment(imgObj['img']).get('url')
1364 + row.find('.pagelayer-elp-image-div .pagelayer-elp-image').css('background-image', 'url(\''+fetch_url+'\')');
1365 + _pagelayer_set_tmp_atts(row, 'url', fetch_url);
1366 + }).fail(function(){
1367 + row.find('.pagelayer-elp-image-div .pagelayer-elp-image').css('background-image', 'url(\''+src+'\')')
1368 + });
1369 + }
1370 +
1371 + if(isRetina){
1372 + if(def == srcRetina && 'retina' in imgObj && jQuery.isNumeric(imgObj['retina'])){
1373 + wp.media.attachment(imgObj['retina']).fetch().then(function (data){
1374 + var fetch_url = wp.media.attachment(imgObj['retina']).get('url')
1375 + row.find('.pagelayer-retina').css('background-image', 'url(\''+fetch_url+'\')');
1376 + _pagelayer_set_tmp_atts(row, 'retina-url', fetch_url);
1377 + }).fail(function(){
1378 + row.find('.pagelayer-retina').css('background-image', 'url(\''+srcRetina+'\')')
1379 + });
1380 + }
1381 +
1382 + if(def == srcRetinaMobile && 'retina_mobile' in imgObj && jQuery.isNumeric(imgObj['retina_mobile'])){
1383 + wp.media.attachment(imgObj['retina_mobile']).fetch().then(function (data){
1384 + var fetch_url = wp.media.attachment(imgObj['retina_mobile']).get('url')
1385 + row.find('.pagelayer-retina-mobile').css('background-image', 'url(\''+fetch_url+'\')');
1386 + _pagelayer_set_tmp_atts(row, 'retina-mobile-url', fetch_url);
1387 + }).fail(function(){
1388 + row.find('.pagelayer-retina-mobile').css('background-image', 'url(\''+srcRetinaMobile+'\')')
1389 + });
1390 + }
1391 + }
1392 +
1393 + var getImgVal = function(val){
1394 +
1395 + if(typeof val === 'object' && pagelayer_length(val) == 1 && 'img' in val){
1396 + return val['img'];
1397 + }
1398 +
1399 + return val;
1400 + }
1401 +
1113 1402 // Set an Image
1114 1403 row.find('.pagelayer-elp-image').on('click', function(){
1115 1404
1116 1405 var button = jQuery(this);
1406 + var inRetina = button.hasClass('pagelayer-retina');
1407 + var inRetinaM = button.hasClass('pagelayer-retina-mobile');
1117 1408
1118 1409 // Load the frame
1119 1410 var frame = pagelayer_select_frame('image');
1120 1411
@@ -1133,19 +1424,77 @@
1133 1424 // Internal from gallery
1134 1425 }else{
1135 1426
1136 1427 var attachment = frame.state().get('selection').first().toJSON();
1137 - //console.log(attachment);
1138 1428
1139 1429 // Set the new ID and URL
1140 1430 id = attachment.id;
1141 - url = attachment.url;
1431 + url = attachment.url;
1432 + var old = _pagelayer_img_tmp_atts(row);
1142 1433
1143 - // Keep a list of all sizes
1144 - for(var x in attachment.sizes){
1145 - _pagelayer_set_tmp_atts(row, x+'-url', attachment.sizes[x].url);
1146 - }
1147 -
1434 + //console.log(attachment);
1435 + if(inRetina){
1436 + // To remove past temp attr so that they are not involve in future temp values
1437 + delete old[prop.c['name']+'-retina-url'];
1438 +
1439 + // Keep a list of all sizes
1440 + for(var x in attachment.sizes){
1441 + _pagelayer_set_tmp_atts(row, 'retina-'+x+'-url', attachment.sizes[x].url);
1442 + delete old[prop.c['name']+'-retina-'+x+'-url'];
1443 + }
1444 +
1445 + for(var x in old){
1446 +
1447 + // Skip for retina and with url atts
1448 + if(! x.endsWith('-url') || !x.startsWith(prop.c['name']+'-retina') || x.startsWith(prop.c['name']+'-retina-mobile')){
1449 + continue;
1450 + }
1451 +
1452 + _pagelayer_set_tmp_atts(row, x, '');
1453 + }
1454 +
1455 + }else if(inRetinaM){
1456 +
1457 + // To remove past temp attr so that they are not involve in future temp values
1458 + delete old[prop.c['name']+'-retina-mobile-url'];
1459 +
1460 + // Keep a list of all sizes
1461 + for(var x in attachment.sizes){
1462 + _pagelayer_set_tmp_atts(row, 'retina-mobile-'+x+'-url', attachment.sizes[x].url);
1463 + delete old[prop.c['name']+'-retina-mobile-'+x+'-url'];
1464 + }
1465 +
1466 + for(var x in old){
1467 +
1468 + // Skip for retina and with url atts
1469 + if(! x.endsWith('-url') || ! x.startsWith(prop.c['name']+'-retina-mobile')){
1470 + continue;
1471 + }
1472 +
1473 + _pagelayer_set_tmp_atts(row, x, '');
1474 + }
1475 +
1476 + }else{
1477 +
1478 + // To remove past temp attr so that they are not involve in future temp values
1479 + delete old[prop.c['name']+'-url'];
1480 +
1481 + // Keep a list of all sizes
1482 + for(var x in attachment.sizes){
1483 + _pagelayer_set_tmp_atts(row, x+'-url', attachment.sizes[x].url);
1484 + delete old[prop.c['name']+'-'+x+'-url'];
1485 + }
1486 +
1487 + for(var x in old){
1488 +
1489 + // Skip for retina and with url atts
1490 + if(! x.endsWith('-url') || x.startsWith(prop.c['name']+'-retina')){
1491 + continue;
1492 + }
1493 +
1494 + _pagelayer_set_tmp_atts(row, x, '');
1495 + }
1496 + }
1148 1497 }
1149 1498
1150 1499 // Update thumbnail
1151 1500 button.css('background-image', 'url(\''+url+'\')');
@@ -1150,16 +1499,39 @@
1150 1499 // Update thumbnail
1151 1500 button.css('background-image', 'url(\''+url+'\')');
1152 1501
1153 1502 // Save and render
1154 - _pagelayer_set_tmp_atts(row, 'url', url);
1155 - _pagelayer_set_atts(row, id);
1503 + _pagelayer_set_tmp_atts(row, 'no-image-set', '');
1156 1504
1505 + if(inRetina){
1506 + _pagelayer_set_tmp_atts(row, 'retina-url', url);
1507 + imgObj['retina'] = id;
1508 + }else if(inRetinaM){
1509 + _pagelayer_set_tmp_atts(row, 'retina-mobile-url', url);
1510 + imgObj['retina_mobile'] = id;
1511 + }else{
1512 + _pagelayer_set_tmp_atts(row, 'url', url);
1513 + imgObj['img'] = id;
1514 + }
1515 +
1516 + _pagelayer_set_atts(row, getImgVal(imgObj));
1517 +
1157 1518 },
1158 1519 // On open select the appropriate images in the media manager
1159 1520 'open': function() {
1160 1521 var selection = frame.state().get('selection');
1161 - var wp_id = prop.el.$.attr('pagelayer-a-id');
1522 + var wp_id = pagelayer_get_att(prop.el.$, prop.c['name']);
1523 +
1524 + if(typeof wp_id === 'object'){
1525 + if(inRetina){
1526 + wp_id = ('retina' in wp_id && !pagelayer_empty(wp_id['retina']) ? wp_id['retina'] : 0 );
1527 + }else if(inRetinaM){
1528 + wp_id = ('retina_mobile' in wp_id && !pagelayer_empty(wp_id['retina_mobile']) ? wp_id['retina_mobile'] : 0 );
1529 + }else{
1530 + wp_id = (!pagelayer_empty(wp_id['img']) ? wp_id['img'] : 0 );
1531 + }
1532 + }
1533 +
1162 1534 selection.reset( wp_id ? [ wp.media.attachment( wp_id ) ] : [] );
1163 1535 }
1164 1536 });
1165 1537
@@ -1168,24 +1540,199 @@
1168 1540 return false;
1169 1541
1170 1542 });
1171 1543
1544 + // Finding and assigning values in the variables
1545 + var dropzoneParent = row.find('.pagelayer-elp-image-div');
1546 + var dropZone = row.find('.pagelayer-elp-drop-zone');
1547 +
1548 + // Inserting values in image drag and drop function
1549 + pagelayer_img_dragAndDrop(dropzoneParent, dropZone, '', row);
1550 +
1551 + row.find('.pagelayer-elp-image-retina').click(function(){
1552 + row.find('.pagelayer-retina-label').toggle();
1553 + row.find('.pagelayer-elp-retina-image-div').toggle();
1554 + var checkval = row.find('.pagelayer-retina-checkbox').is(":checked");
1555 +
1556 + if(checkval == true){
1557 + row.find('.pagelayer-retina-checkbox').trigger("click");
1558 + }
1559 + });
1560 +
1561 + // Save temporarily
1562 + row.find('.pagelayer-elp-image-ai input').on('change', function(){
1563 + var aiEle = jQuery(this);
1564 +
1565 + var checkval = aiEle.is(":checked");
1566 + var ref_data = pagelayer_el_data_ref(prop.el.$);
1567 +
1568 + // Save temporarily in atts for comment feature, it is not saved in original content
1569 + if(checkval == true){
1570 + ref_data['attr'][prop.c['name']+'_ai'] = false;
1571 + }else{
1572 + delete ref_data['attr'][prop.c['name']+'_ai'];
1573 + }
1574 + pagelayer_el_dump_data(prop.el.$);
1575 +
1576 + });
1577 +
1578 + row.find('.pagelayer-retina-checkbox').click(function(){
1579 + row.find('.pagelayer-elp-retina-mobile-image-div').toggle();
1580 + });
1581 +
1172 1582 // Delete this
1173 1583 row.find('.pagelayer-elp-image-delete').on('click', function(){
1174 1584
1175 1585 // Update thumbnail
1176 - row.find('.pagelayer-elp-image').css('background-image', 'url(\''+def+'\')');
1586 + jQuery(this).parent().find('.pagelayer-elp-image').css('background-image', 'url(\''+def+'\')');
1177 1587
1178 1588 // Set to blank and render
1179 1589 _pagelayer_set_atts(row, '', true);
1590 +
1591 + imgObj['img'] = def;
1180 1592
1593 + _pagelayer_set_tmp_atts(row, 'no-image-set', 1);
1181 1594 _pagelayer_set_tmp_atts(row, 'url', def);
1182 - _pagelayer_set_atts(row, def);
1595 + _pagelayer_set_atts(row, getImgVal(imgObj));
1596 + });
1597 +
1598 + row.find('.pagelayer-elp-retina-delete').on('click', function(){
1599 + // Update thumbnail
1600 + jQuery(this).parent().find('.pagelayer-elp-image').css('background-image', 'url(\''+def+'\')');
1601 + delete imgObj['retina'];
1602 +
1603 + _pagelayer_set_tmp_atts(row, 'retina-url', def);
1604 + _pagelayer_set_atts(row, getImgVal(imgObj));
1183 1605
1184 1606 });
1185 1607
1608 + row.find('.pagelayer-elp-retina-mobile-delete').on('click', function(){
1609 +
1610 + // Update thumbnail
1611 + jQuery(this).parent().find('.pagelayer-elp-image').css('background-image', 'url(\''+def+'\')');
1612 + delete imgObj['retina_mobile'];
1613 +
1614 + // Set to blank and render
1615 + _pagelayer_set_tmp_atts(row, 'retina-mobile-url', def);
1616 + _pagelayer_set_atts(row, getImgVal(imgObj));
1617 +
1618 + });
1186 1619 }
1187 1620
1621 +// Main image drag and drop function
1622 +function pagelayer_img_dragAndDrop(dropzoneParent, dropZone, jEle, row){
1623 +
1624 + var reset_dragging = false;
1625 +
1626 + dropzoneParent.on('dragover', function(e){
1627 + e.preventDefault();
1628 + // Checking that the dragged element is a file or not
1629 + var dt = e.originalEvent.dataTransfer;
1630 + if(dt.types && (dt.types.indexOf ? dt.types.indexOf('Files') != -1 : dt.types.contains('Files'))){
1631 + if(e.originalEvent.dataTransfer.items[0].type.search('image/')!=-1){
1632 + dropZone.show();
1633 + reset_dragging = true;
1634 + }
1635 + }
1636 + });
1637 +
1638 + dropzoneParent.on('dragleave', function(e){
1639 + var rect = this.getBoundingClientRect();
1640 + // Checking that the cursor is in the drag area or not
1641 + if (e.clientX >= (rect.left + rect.width) || e.clientX <= rect.left || e.clientY >= (rect.top + rect.height) || e.clientY <= rect.top) {
1642 + dropZone.hide();
1643 + reset_dragging = false;
1644 + }
1645 + });
1646 +
1647 + dropzoneParent.on('drop', function(e){
1648 +
1649 + // Is not dropable?
1650 + if(!reset_dragging){
1651 + return;
1652 + }
1653 +
1654 + e.preventDefault();
1655 + var pagelayer_ajax_func = {};
1656 +
1657 + // This function for ajax success call back
1658 + pagelayer_ajax_func['success'] = function(obj){
1659 +
1660 + if(obj['success']){
1661 +
1662 + // Set the new ID and URL
1663 + id = obj['data']['id'];
1664 + url = obj['data']['url'];
1665 +
1666 + if(row == ''){
1667 + // Getting Id of jEle
1668 + var widgetid = jEle.closest('[pagelayer-id]').attr('pagelayer-id');
1669 +
1670 + // Finding widget image setting using id of jEle. Finding image editor setting from all of the other settings.
1671 + row = pagelayer.$$('[pagelayer-element-id='+widgetid+']').find('.pagelayer-elp-image').eq(0).parent().parent();
1672 + }
1673 +
1674 + row.find('.pagelayer-elp-image').css('background-image', 'url(\''+url+'\')');
1675 +
1676 + // To remove past temp attr so that they are not involve in future temp values
1677 + var cname = row.attr('pagelayer-elp-name');
1678 + var old = _pagelayer_img_tmp_atts(row);
1679 + delete old[cname+'-url'];
1680 +
1681 + for(var x in obj['data']['sizes']){
1682 + _pagelayer_set_tmp_atts(row, x+'-url', obj['data']['sizes'][x]['url']);
1683 + delete old[cname+'-'+x+'-url'];
1684 + }
1685 +
1686 + for(var x in old){
1687 + _pagelayer_set_tmp_atts(row, x+'-url', '');
1688 + }
1689 +
1690 + dropZone.find('.pagelayer-elp-img-up-bar').css('width', '3%');
1691 + dropZone.hide();
1692 +
1693 + // Save and render
1694 + _pagelayer_set_tmp_atts(row, 'url', url);
1695 + _pagelayer_set_atts(row, id);
1696 +
1697 + }else{
1698 + alert(obj['data']['message']);
1699 + }
1700 + }
1701 +
1702 + // This function for ajax before send call back
1703 + pagelayer_ajax_func['beforeSend'] = function(xhr){
1704 + // It activate the image widget
1705 + if(row == ''){
1706 + jEle.click();
1707 + }
1708 + }
1709 +
1710 + // This function for how much file is uploaded or for progress bar
1711 + pagelayer_ajax_func['uploadProgress'] = function(xhr){
1712 + xhr.upload.addEventListener("progress", function(evt) {
1713 + if (evt.lengthComputable) {
1714 + var percentComplete = evt.loaded / evt.total;
1715 + percentComplete = parseInt(percentComplete * 100);
1716 +
1717 + if(row == ''){
1718 + dropZone.find('.pagelayer-img-up-bar').css('width', percentComplete+'%');
1719 + }else{
1720 + dropZone.find('.pagelayer-elp-img-up-bar').css('width', percentComplete+'%');
1721 + }
1722 + }
1723 + }, false);
1724 + return xhr;
1725 + }
1726 +
1727 + // Uploading image to the media library
1728 + pagelayer_editable_paste_handler(e.originalEvent.dataTransfer.files[0], pagelayer_ajax_func);
1729 +
1730 + reset_dragging = false;
1731 +
1732 + });
1733 +}
1734 +
1188 1735 // The Multi Image Property
1189 1736 function pagelayer_elp_multi_image(row, prop){
1190 1737
1191 1738 var div = '<div class="pagelayer-elp-multi_image-div">'+
@@ -1199,19 +1746,36 @@
1199 1746 var ids = new Array();
1200 1747
1201 1748 // Any IDs ?
1202 1749 if(!pagelayer_empty(prop.c['val'])){
1203 - ids = prop.c['val'].split(',');
1750 + ids = prop.c['val']
1751 + if(pagelayer_is_string(ids)){
1752 + ids = prop.c['val'].split(',');
1753 + }
1204 1754 //console.log(ids);
1205 1755 }
1206 1756
1207 1757 // Do we have a URL set ?
1208 - if(ids.length > 0 && tmp in prop.el.tmp){
1209 - var images = JSON.parse(prop.el.tmp[tmp]);
1210 - //console.log(images);
1211 -
1212 - for(var x in ids){
1213 - row.find('.pagelayer-elp-multi_image-thumbs').append('<div class="pagelayer-elp-multi_image-thumb" style="background-image: url(\''+images['i'+ids[x]]+'\');"></div>');
1758 + if(!pagelayer_empty(ids)){
1759 + if(tmp in prop.el.tmp){
1760 + var images = JSON.parse(prop.el.tmp[tmp]);
1761 + //console.log(images);
1762 +
1763 + for(var x in ids){
1764 + row.find('.pagelayer-elp-multi_image-thumbs').append('<div class="pagelayer-elp-multi_image-thumb" style="background-image: url(\''+images['i'+ids[x]]+'\');"></div>');
1765 + }
1766 + }else{
1767 + wp.media.query({ post__in: ids }).more().then(function(){
1768 + // You attachments here normally
1769 + // You can safely use any of them here
1770 + // TODO: Set tmp here
1771 + for(var x in ids){
1772 + var fetch_url = wp.media.attachment(ids[x]).get('url');
1773 + if(!pagelayer_empty(fetch_url)){
1774 + row.find('.pagelayer-elp-multi_image-thumbs').append('<div class="pagelayer-elp-multi_image-thumb" style="background-image: url(\''+fetch_url+'\');"></div>');
1775 + }
1776 + }
1777 + });
1214 1778 }
1215 1779 }
1216 1780
1217 1781 var pagelayer_init_frame = function(state){
@@ -1259,9 +1823,9 @@
1259 1823 // Set the current selection if any
1260 1824 'open': function(){
1261 1825
1262 1826 // Do we have anything
1263 - if(ids.length > 0){
1827 + if(!pagelayer_empty(ids)){
1264 1828
1265 1829 var selection = '';
1266 1830
1267 1831 if(state == 'gallery-edit'){
@@ -1356,10 +1920,10 @@
1356 1920 pagelayer_init_frame('gallery-edit');
1357 1921 });
1358 1922
1359 1923 row.find('.pagelayer-elp-button').on('click', function(){
1360 - //console.log(ids.length);
1361 - if(ids.length > 0){
1924 +
1925 + if(!pagelayer_empty(ids)){
1362 1926 if(isNaN(ids[0])){
1363 1927 pagelayer_init_frame('embed');
1364 1928 }else{
1365 1929 pagelayer_init_frame('gallery-library');
@@ -1378,9 +1942,9 @@
1378 1942 var src = (tmp in prop.el.tmp) ? prop.el.tmp[tmp] : prop.c['val'];
1379 1943
1380 1944 var div = '<div class="pagelayer-elp-video-div pagelayer-elp-input-icon">'+
1381 1945 '<input class="pagelayer-elp-video" name="'+prop.c['name']+'" type="text" value="'+src+'">'+
1382 - '<i class="pli pli-folder-open" />'+
1946 + '<i class="pli pli-folder-open" ></i>'+
1383 1947 '</input></div>';
1384 1948
1385 1949 row.append(div);
1386 1950
@@ -1453,9 +2017,9 @@
1453 2017 var src = (tmp in prop.el.tmp) ? prop.el.tmp[tmp] : prop.c['val'];
1454 2018
1455 2019 var div = '<div class="pagelayer-elp-audio-div pagelayer-elp-input-icon">'+
1456 2020 '<input class="pagelayer-elp-audio" name="'+prop.c['name']+'" type="text" value="'+src+'" />'+
1457 - '<i class="pli pli-menu" />'+
2021 + '<i class="pli pli-menu" ></i>'+
1458 2022 '</div>';
1459 2023
1460 2024 row.append(div);
1461 2025
@@ -1527,9 +2091,9 @@
1527 2091 var src = (tmp in prop.el.tmp) ? prop.el.tmp[tmp] : prop.c['val'];
1528 2092
1529 2093 var div = '<div class="pagelayer-elp-media-div pagelayer-elp-input-icon">'+
1530 2094 '<input class="pagelayer-elp-media" value="'+src+'" type="text" />'+
1531 - '<i class="pli pli-menu" />'+
2095 + '<i class="pli pli-menu" ></i>'+
1532 2096 '</div>';
1533 2097
1534 2098 row.append(div);
1535 2099
@@ -1605,12 +2169,17 @@
1605 2169 row.append(div);
1606 2170
1607 2171 // Set an value in span
1608 2172 row.find('.pagelayer-elp-slider-div input').on('input', function(){
2173 + var value = parseFloat(this.value);
2174 + var max = parseFloat(this.max);
1609 2175
1610 - row.find('.pagelayer-elp-slider-div input').val(this.value);
2176 + if(!pagelayer_empty(max) && value > max){
2177 + value = max;
2178 + }
2179 + row.find('.pagelayer-elp-slider-div input').val(value);
1611 2180
1612 - _pagelayer_set_atts(row, this.value);// Save and Render
2181 + _pagelayer_set_atts(row, value);// Save and Render
1613 2182
1614 2183 });
1615 2184
1616 2185 }
@@ -1617,16 +2186,25 @@
1617 2186
1618 2187 // The Editor proprety
1619 2188 function pagelayer_elp_editor(row, prop){
1620 2189
2190 + var rows = prop.rows ? prop.rows : '8';
2191 +
1621 2192 var div = '<div class="pagelayer-elp-editor-div">'+
1622 - '<textarea class="pagelayer-elp-editor">'+prop.c['val']+'</textarea>'+
2193 + '<textarea rows="'+rows+'" class="pagelayer-elp-editor" ></textarea>'+
1623 2194 '</div>';
1624 2195
1625 2196 row.append(div);
1626 2197
1627 2198 var editor = row.find('.pagelayer-elp-editor');
2199 + editor.val(pagelayer_trim(prop.c['val']));
1628 2200
2201 + // Handle on change
2202 + editor.on('input', function(){
2203 + _pagelayer_set_atts(row, pagelayer_trim(jQuery(this).val()));// Save and Render
2204 + });
2205 +
2206 + return;
1629 2207 // No SVG Icons for now
1630 2208 jQuery.trumbowyg.svgPath = false;
1631 2209
1632 2210 // Initiate the editor
@@ -1666,22 +2244,258 @@
1666 2244 }
1667 2245
1668 2246 // The Link proprety
1669 2247 function pagelayer_elp_link(row, prop){
2248 +
2249 + var values = {};
2250 + var settingOpt = false;
1670 2251
1671 - // TODO : Implement pagelayer-elp-link-icon
1672 - var div = '<div class="pagelayer-elp-link-div pagelayer-elp-input-icon">'+
1673 - '<input class="pagelayer-elp-link" type="text" value="'+prop.c['val']+'" />'+
1674 - '<i class="pli pli-link pagelayer-elp-link-icon" />'+
2252 + // Show link options?
2253 + if('selector' in prop){
2254 + settingOpt = true;
2255 + }
2256 +
2257 + // Previously saved values
2258 + if(typeof prop.c['val'] === 'object'){
2259 + values = prop.c['val'];
2260 + }else{
2261 + values['link'] = prop.c['val'];
2262 + }
2263 +
2264 + var tmp = prop.c['name'];
2265 + var link = (tmp in prop.el.tmp) ? prop.el.tmp[tmp] : values['link'];
2266 + var jEle = jQuery('[pagelayer-id='+prop.el.id+']');
2267 +
2268 + var div = '<div class="pagelayer-elp-link-div pagelayer-elp-input-icon '+(settingOpt ? '' : 'pagelayer-elp-link-no-addons')+'">'+
2269 + '<input class="pagelayer-elp-link" type="text" value="'+link+'" />'+
2270 + '<i class="pli pli-service pagelayer-elp-link-icon" title="'+pagelayer_l('link_options')+'" ></i>'+
2271 + '<div class="pagelayer-elp-link-list">'+
2272 + '</div>';
2273 +
2274 + if(settingOpt){
2275 + div += '<div class="pagelayer-elp-link-addons">'+
2276 + '<div class="pagelayer-elp-link-cb-div">'+
2277 + '<div class="pagelayer-elp-link-label-div" type="'+prop['type']+'">'+
2278 + '<label class="pagelayer-elp-link-label">'+pagelayer_l('open_link_in_new_window')+'</label>'+
2279 + '</div>'+
2280 + '<div>'+
2281 + '<input type="checkbox" name="link_new_tab" class="pagelayer-elp-checkbox" '+(!pagelayer_empty(values['target']) ? 'checked="checked"' : '')+' />'+
2282 + '</div>'+
2283 + '</div>'+
2284 + '<div class="pagelayer-elp-link-cb-div" >'+
2285 + '<div class="pagelayer-elp-link-label-div" type="'+prop['type']+'">'+
2286 + '<label class="pagelayer-elp-link-label">'+pagelayer_l('add_nofollow')+'</label>'+
2287 + '</div>'+
2288 + '<div>'+
2289 + '<input type="checkbox" name="link_no_follow" class="pagelayer-elp-checkbox" '+(!pagelayer_empty(values['rel']) ? 'checked="checked"' : '')+'/>'+
2290 + '</div>'+
2291 + '</div>'+
2292 + '<div class="pagelayer-elp-link-ca" >'+
2293 + '<div class="pagelayer-elp-link-label-div" type="'+prop['type']+'">'+
2294 + '<label class="pagelayer-elp-link-label">'+pagelayer_l('custom_attributes')+'</label>'+
2295 + '</div>'+
2296 + '<div>'+
2297 + '<input type="text" class="pagelayer-elp-text" placeholder="key = value" name="'+prop.c['name']+'" value="'+(pagelayer_empty(values['attrs']) ? '' : values['attrs'])+'"/>'+
2298 + '<p class="pagelayer-elp-link-desc">'+pagelayer_l('link_custom_attr_desc')+'</p>'+
2299 + '</div>'+
2300 + '</div>'+
1675 2301 '</div>';
2302 + }
2303 +
2304 + div += '</div>';
1676 2305
1677 2306 row.append(div);
1678 2307
2308 + var listWrap = row.find('.pagelayer-elp-link-list');
2309 + var time = null;
2310 +
2311 + //Add ID
2312 + var addID = function(permaID){
2313 + permaID = permaID || false;
2314 +
2315 + var lDiv = row.closest('[pagelayer-elp-name]').find('.pagelayer-elp-label-div');
2316 + if(permaID){
2317 + lDiv = lDiv.find('.pagelayer-elp-label');
2318 + lDiv.after('<span class="pagelayer-elp-link-id">ID : '+permaID+'</span>');
2319 + }else{
2320 + lDiv.find('.pagelayer-elp-link-id').remove();
2321 + }
2322 + };
2323 +
2324 + if(!isNaN(values['link'])){
2325 + addID(values['link']);
2326 + }
2327 +
2328 + var getLinkVal = function(val){
2329 +
2330 + if(typeof val === 'object' && pagelayer_length(val) == 1 && 'link' in val){
2331 + return val['link'];
2332 + }
2333 +
2334 + return val;
2335 + }
2336 +
2337 + var setTmpEmpty = function(){
2338 +
2339 + if( 'link' in values && !pagelayer_empty(values['link']) ){
2340 + return;
2341 + }
2342 +
2343 + _pagelayer_set_tmp_atts(row, '', '');
2344 + }
2345 +
1679 2346 // Set a Link
1680 2347 row.find('.pagelayer-elp-link').on('change', function(){
1681 - _pagelayer_set_atts(row, jQuery(this).val());// Save and Render
2348 +
2349 + var linkVal = jQuery(this).val();
2350 + values['link'] = linkVal;
2351 +
2352 + // Save and Render
2353 + _pagelayer_set_tmp_atts(row, '', linkVal);
2354 + _pagelayer_set_atts(row, getLinkVal(values));
2355 +
2356 + // Remove ID Holder
2357 + addID();
2358 +
1682 2359 });
2360 +
2361 + // Set a Link
2362 + row.find('.pagelayer-elp-link').on('input click', function(e){
2363 + e.stopPropagation();
2364 +
2365 + if(!listWrap.is(':visible')){
2366 + listWrap.show();
2367 + }
2368 +
2369 + var val = jQuery(this).val();
2370 +
2371 + clearTimeout(time);
2372 + time = setTimeout(function(){
1683 2373
2374 + jQuery.ajax({
2375 + url: pagelayer_ajax_url,
2376 + type: 'post',
2377 + data:{
2378 + 'action' : 'wp-link-ajax',
2379 + '_ajax_linking_nonce' : pagelayer_internal_linking_nonce,
2380 + 'search' : val,
2381 + },
2382 + success: function(response) {
2383 +
2384 + var data = jQuery.parseJSON(response);
2385 + var html = '';
2386 + //console.log('Link Data');console.log(response);
2387 +
2388 + if(pagelayer_empty(data)){
2389 + html = pagelayer_l('custom_url');
2390 + // Remove ID Holder
2391 + addID();
2392 + }else if(typeof data === 'object'){
2393 +
2394 + for(var key in data){
2395 + var vals = data[key];
2396 + html += '<div class="pagelayer-elp-link-item" data-id="'+vals['ID']+'" data-permalink="'+vals['permalink']+'">'+
2397 + '<div class="pagelayer-elp-link-title">'+
2398 + '<span class="pagelayer-elp-link-item-title" title="'+vals['title']+'">'+vals['title']+'</span>'+
2399 + '<span class="pagelayer-elp-link-item-perma" title="'+vals['permalink']+'">'+vals['permalink']+'</span>'+
2400 + '</div>'+
2401 + '<div class="pagelayer-elp-link-info">'+
2402 + '<span title="'+vals['info']+'">'+vals['info']+'</span>'+
2403 + '</div>'+
2404 + '</div>';
2405 + }
2406 + }
2407 +
2408 + listWrap.html(html);
2409 + },
2410 + fail: function(data) {
2411 + listWrap.html('Some error occured in getting the link data');
2412 + }
2413 + });
2414 +
2415 + }, 200);
2416 +
2417 + });
2418 +
2419 + listWrap.on('click', function(e){
2420 + e.stopPropagation();
2421 +
2422 + var lEle = jQuery(e.target).closest('.pagelayer-elp-link-item');
2423 +
2424 + // IF item not found
2425 + if(lEle.length < 1){
2426 + return;
2427 + }
2428 +
2429 + var perma = lEle.attr('data-permalink');
2430 + var ID = lEle.attr('data-id');
2431 + values['link'] = ID;
2432 +
2433 + // Save and Render
2434 + row.find('.pagelayer-elp-link').val(perma);
2435 + _pagelayer_set_tmp_atts(row, '', perma);
2436 + _pagelayer_set_atts(row, getLinkVal(values));
2437 +
2438 + listWrap.hide();
2439 +
2440 + // Show ID
2441 + addID(ID);
2442 + });
2443 +
2444 + pagelayer.gDocument.on('click', function(e){
2445 + listWrap.hide();
2446 + });
2447 +
2448 + row.find('.pagelayer-elp-checkbox').on('change', function(event){
2449 +
2450 + var cEle = jQuery(this);
2451 +
2452 + // Save or delete the value
2453 + var saveVal = function(key){
2454 + if(cEle.is(':checked')){
2455 + values[key] = true;
2456 + return;
2457 + }
2458 +
2459 + delete values[key];
2460 + }
2461 +
2462 + switch(cEle.attr('name')){
2463 + case 'link_new_tab':
2464 + saveVal('target');
2465 + break;
2466 + case 'link_no_follow':
2467 + saveVal('rel');
2468 + break;
2469 + }
2470 +
2471 + setTmpEmpty();
2472 + _pagelayer_set_atts(row, getLinkVal(values));
2473 +
2474 + });
2475 +
2476 + var linkTime = '';
2477 + row.find('.pagelayer-elp-text').on('input', function(event){
2478 + var cEle = jQuery(this);
2479 +
2480 + clearTimeout(linkTime);
2481 + linkTime = setTimeout(function(){
2482 + values['attrs'] = cEle.val();
2483 +
2484 + if(pagelayer_empty(values['attrs'])){
2485 + delete values['attrs'];
2486 + }
2487 +
2488 + setTmpEmpty();
2489 + _pagelayer_set_atts(row, getLinkVal(values));
2490 +
2491 + }, 500);
2492 + });
2493 +
2494 + row.find('.pagelayer-elp-link-icon').on('click', function(){
2495 + row.find('.pagelayer-elp-link-addons').slideToggle('slow');
2496 + });
2497 +
1684 2498 }
1685 2499
1686 2500 // The Textarea property
1687 2501 function pagelayer_elp_textarea(row, prop){
@@ -1688,13 +2502,14 @@
1688 2502
1689 2503 var rows = prop.rows ? 'rows="'+prop.rows+' "' : '';
1690 2504
1691 2505 var div = '<div class="pagelayer-elp-textarea-div">'+
1692 - '<textarea '+rows+'class="pagelayer-elp-textarea">'+prop.c['val']+'</textarea>'+
2506 + '<textarea '+rows+'class="pagelayer-elp-textarea"></textarea>'+
1693 2507 '</div>';
1694 2508
1695 2509 row.append(div);
1696 -
2510 + row.find('.pagelayer-elp-textarea').val(pagelayer_trim(prop.c['val']));
2511 +
1697 2512 // Handle on change
1698 2513 row.find('.pagelayer-elp-textarea').on('input', function(){
1699 2514 _pagelayer_set_atts(row, pagelayer_trim(jQuery(this).val()));// Save and Render
1700 2515 });
@@ -1700,14 +2515,17 @@
1700 2515 });
1701 2516 };
1702 2517
1703 2518 // Clear all editable
1704 -function pagelayer_clear_editable(){
2519 +function pagelayer_clear_editable(dontDestroy){
1705 2520
1706 2521 // Destroy all
1707 2522 for(var x in pagelayer_editor){
2523 + if(dontDestroy == x){
2524 + console.log('Skipping '+dontDestroy);
2525 + continue;
2526 + }
1708 2527 pagelayer_editor[x].pen.destroy();
1709 - pagelayer_editor[x].$.removeClass('pagelayer-pen');
1710 2528 }
1711 2529
1712 2530 };
1713 2531
@@ -1713,41 +2531,136 @@
1713 2531
1714 2532 // Makes a field editable in the DOM
1715 2533 function pagelayer_make_editable(jEle, e){
1716 2534
2535 + // The parent element
2536 + var pEle = jEle.closest('.pagelayer-ele, [pagelayer-ref-id]');
2537 +
2538 + // Mainly for editing table cells as pagelayer-ref-id is used by them
2539 + if(!pEle.hasClass('pagelayer-ele')){
2540 + var refID = pEle.attr('pagelayer-ref-id');
2541 + pEle = jQuery('[pagelayer-id="'+refID+'"]');
2542 + }
2543 +
2544 + var prop = jEle.attr('pagelayer-editable');
2545 + var eId = pagelayer_id(pEle)+'|'+jEle.attr('pagelayer-editable');// Editing ID
2546 +
1717 2547 // Is it already setup ?
1718 2548 if(jEle.hasClass('pagelayer-pen')){
1719 2549 //console.log('Already Penned');
2550 + //pagelayer_focus_editable(jEle, e, eId);
1720 2551 return true;
1721 2552 }
1722 2553
1723 - var prop = jEle.attr('pagelayer-editable');
2554 + var tag = pagelayer_tag(pEle);
2555 + var all_props = pagelayer_shortcodes[tag];
2556 + var edit_opts;
2557 + var fullEdit = false;
1724 2558
1725 - // Destroy the existing pen
1726 - if(!pagelayer_empty(pagelayer_editor[prop])){
1727 - pagelayer_editor[prop].pen.destroy();
1728 - pagelayer_editor[prop].$.removeClass('pagelayer-pen');
2559 + for(var i in pagelayer_tabs){
2560 + var tab = pagelayer_tabs[i];
2561 + for(var section in all_props[tab]){ //console.log(tab+' '+section);
2562 +
2563 + var props = section in pagelayer_shortcodes[tag] ? pagelayer_shortcodes[tag][section] : pagelayer_styles[section];//console.log(props);
2564 +
2565 + // Any editor options?
2566 + if(prop in props){
2567 +
2568 + if('e' in props[prop]){
2569 + edit_opts = props[prop].e;
2570 + }
2571 +
2572 + if(props[prop]['type'] == 'editor'){
2573 + fullEdit = true;
2574 + }
2575 + }
2576 + }
1729 2577 }
1730 2578
1731 - // The parent element
1732 - var pEle = jEle.closest('.pagelayer-ele');
2579 + var pen_tools = {
2580 + 'inline': [ 'viewHTML',
2581 + {'formating' : ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p']},
2582 + 'bold', 'italic', 'underline', 'strike',
2583 + { 'color': [] }, { 'background': [] },
2584 + 'removeformat'
2585 + ],
2586 + 'h': ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
2587 + 'headers': [{'formating' : ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']}],
2588 + 'c': [{ 'color': [] }, { 'background': [] }],
2589 + 'f': ['bold', 'italic', 'underline', 'strike'],
2590 + 'a': [{ 'align': ['left', 'center', 'right', 'justify'] }],
2591 + 'r': ['removeformat'],
2592 + 'v': ['viewHTML'],
2593 + };
1733 2594
2595 + // Create Toolbar Groups
2596 + if(!('pen_tools' in pagelayer_editor)){
2597 + pagelayer_editor['pen_tools'] = {};
2598 + }
2599 +
2600 + pagelayer_editor['pen_tools'] = Object.assign(pagelayer_editor['pen_tools'], pen_tools);
2601 +
2602 + var toolbar_options = [];
2603 +
2604 + if( pagelayer_empty(edit_opts) ){
2605 +
2606 + if(fullEdit){
2607 + toolbar_options = [
2608 + [ 'viewHTML' ],
2609 + [ 'bold', 'italic', 'underline', 'strike' ],
2610 + [ 'sub', 'super' ],
2611 + //[ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'blockquote'],
2612 + [ {'formating' : ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'blockquote']}],
2613 + [ {'align': ['left', 'center', 'right', 'justify']} ],
2614 + [ 'image', 'link'],
2615 + [ 'unorderedlist', 'orderedlist'],
2616 + [ {'size': []}, {'lineheight': []}, {'font': []}],
2617 + [ {'color': [] }, {'background': []}],
2618 + [ 'removeformat' ]
2619 + ];
2620 + }else{
2621 + toolbar_options = pagelayer_editor.pen_tools['inline'];
2622 + }
2623 + }else{
2624 + var options = [];
2625 +
2626 + if(! Array.isArray(edit_opts) ){
2627 + edit_opts = [edit_opts];
2628 + }
2629 +
2630 + for( var tt in edit_opts){
2631 +
2632 + var tool = edit_opts[tt];
2633 +
2634 + if(pagelayer_is_string(tool)){
2635 + if(tool in pagelayer_editor['pen_tools']){
2636 + tool = pagelayer_editor['pen_tools'][tool]
2637 + }else{
2638 + tool = [tool];
2639 + }
2640 + }
2641 +
2642 + options.push(tool);
2643 + }
2644 +
2645 + toolbar_options = options;
2646 + }
2647 +
1734 2648 var options = {
1735 2649 class: 'pagelayer-pen',
1736 - editor: jEle[0],
1737 - list: ['bold', 'italic', 'underline', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'strike'],
1738 - stay: false
2650 + editor: jEle,
2651 + toolbar: toolbar_options
1739 2652 }
1740 2653
1741 2654 // Setup the editor
1742 - pagelayer_editor[prop] = {};
1743 - pagelayer_editor[prop].pen = new Pen(options);
1744 - pagelayer_editor[prop].$ = jEle;
2655 + pagelayer_editor[eId] = {};
2656 + pagelayer_editor[eId].pen = new PagelayerPen(jEle, options);
2657 + pagelayer_editor[eId].$ = jEle;
1745 2658
1746 2659 // Are we the clicked object, then set the focus
1747 2660 if(e){
1748 2661 var target = jQuery(e.target);
1749 - if(target.is(jEle).length || jEle.find(target).length){
2662 + if(target.is(jEle) || jEle.find(target).length > 0){
1750 2663 jEle.focus();
1751 2664 }
1752 2665 }
1753 2666
@@ -1752,16 +2665,44 @@
1752 2665 }
1753 2666
1754 2667 // Reverse setup the event
1755 2668 jEle.on('blur', function(){
1756 - //pagelayer_editor[prop].pen.destroy();
2669 +
2670 + //pagelayer_editor[eId].pen.destroy();
2671 + if(jEle.hasClass('pagelayer-pen-focused')){
2672 + return;
2673 + }
2674 +
2675 + var cEle = pEle;
2676 +
2677 + // Do we have a parent ?
2678 + var have_parent = function(Ele){
2679 + var pId = pagelayer_get_parent(Ele);
2680 +
2681 + if(pagelayer_empty(pId)){
2682 + return;
2683 + }
2684 +
2685 + cEle = pagelayer_ele_by_id(pId);
2686 + have_parent(cEle);
2687 + }
2688 +
2689 + have_parent(cEle);
2690 +
2691 + var is_global = pagelayer_get_global_id(cEle);
2692 +
2693 + if(pagelayer_empty(is_global)){
2694 + return;
2695 + }
2696 +
2697 + pagelayer_sc_render(pEle);
2698 +
1757 2699 });
1758 2700
1759 - // Reverse setup the event
2701 + /*// Reverse setup the event
1760 2702 jEle.on('focus', function(){
1761 - jQuery('.pagelayer-pen-menu').hide();
1762 - pagelayer_editor[prop].pen.rebuild();
1763 - });
2703 + //pagelayer_clear_editable(eId);
2704 + });*/
1764 2705
1765 2706 // Reverse setup the event
1766 2707 jEle.on('input', function(){
1767 2708
@@ -1770,9 +2711,9 @@
1770 2711 // Set the property as well
1771 2712 pagelayer_set_atts(pEle, prop, val);
1772 2713
1773 2714 // Update the property
1774 - var input = pagelayer.$$('[pagelayer-elp-name='+prop+']').find('input,textarea,.trumbowyg-editor');
2715 + var input = pagelayer.$$('[pagelayer-element-id='+pagelayer_id(pEle)+']').find('[pagelayer-elp-name='+prop+']').find('input,textarea,.trumbowyg-editor');
1775 2716 //console.log(input);
1776 2717
1777 2718 if(input.length > 0){
1778 2719 if(input.hasClass('trumbowyg-editor')){
@@ -1836,21 +2777,22 @@
1836 2777
1837 2778 // Icon function
1838 2779 var icon_html = function(name, cat){
1839 2780 return '<span class="pagelayer-elp-icon-span">'+
1840 - '<i class="'+cat+' fa-'+name+'" icon="'+name+'" /> '+name+
2781 + '<i class="'+cat+' fa-'+name+'" icon="'+name+'" ></i> '+name+
1841 2782 '</span>';
1842 2783 }
1843 2784
1844 2785 var div = '<div class="pagelayer-elp-icon-div">'+
1845 - '<div class="pagelayer-elp-icon-preview">'+
1846 - '<i class="'+sel_icon+'"></i>'+
1847 - '<span class="pagelayer-elp-icon-name">'+
1848 - (pagelayer_empty(sel_name)?'Choose icon':sel_name)+
1849 - '</span>'+
1850 - '</div>'+
1851 - '<span class="pagelayer-elp-icon-open">▼</span>'+
1852 - '</div>';
2786 + '<div class="pagelayer-elp-icon-preview">'+
2787 + '<i class="'+sel_icon+'"></i>'+
2788 + '<span class="pagelayer-elp-icon-name">'+
2789 + (pagelayer_empty(sel_name)?'Choose icon':sel_name)+
2790 + '</span>'+
2791 + '</div>'+
2792 + '<span class="pagelayer-elp-icon-open">▼</span>'+
2793 + '<span class="pagelayer-elp-icon-close" '+(pagelayer_empty(sel_name)? 'style="display:none"': '')+'><b>&times;&nbsp;</b></span>'+
2794 + '</div>';
1853 2795
1854 2796 row.append(div);
1855 2797
1856 2798 // Make all icons list
@@ -1858,10 +2800,11 @@
1858 2800
1859 2801 if(pagelayer_loaded_icons.length > 1){
1860 2802 html += '<select class="pagelayer-elp-icon-sets">'+sets_html+'</select>';
1861 2803 }
1862 - html += '<span class="pagelayer-elp-icon-type" style="display:none;">'+
1863 - '<p data-tab="fas">'+pagelayer_l('Solid')+'</p>'+
2804 +
2805 + html += '<span class="pagelayer-elp-icon-type">'+
2806 + '<p data-tab="fas" class="active">'+pagelayer_l('Solid')+'</p>'+
1864 2807 '<p data-tab="far">'+pagelayer_l('Regular')+'</p>'+
1865 2808 '<p data-tab="fab">'+pagelayer_l('Brand')+'</p>'+
1866 2809 '</span>'+
1867 2810 '<input type="text" class="pagelayer-elp-search-icon" name="search-icon" placeholder="'+pagelayer_l('search')+'">'+
@@ -1878,14 +2821,15 @@
1878 2821 '</div>';
1879 2822
1880 2823 row.append(html);
1881 2824
1882 - if(cur_icon_set == 'font-awesome5'){
1883 - row.find('.pagelayer-elp-icon-type').show();
1884 - sorted_icons = icons[cur_icon_set]['fas'];
1885 - }
2825 + // Open the selector
2826 + row.find('.pagelayer-elp-icon-div').on('click', function(){
2827 + row.find('.pagelayer-elp-icon-selector').slideToggle();
2828 + });
1886 2829
1887 - row.find('.pagelayer-elp-icon-sets').on('change',function(){
2830 + /*// When the set changes
2831 + row.find('.pagelayer-elp-icon-sets').on('change', function(){
1888 2832 var v = cur_icon_set = jQuery(this).val();
1889 2833 var span = '';
1890 2834
1891 2835 for(var x in icons[v]){
@@ -1909,43 +2853,14 @@
1909 2853 if(row.find('.pagelayer-elp-search-icon').val() != ''){
1910 2854 row.find('.pagelayer-elp-search-icon').keyup();
1911 2855 }
1912 2856
1913 - });
2857 + });*/
1914 2858
1915 - // Open the selector
1916 - row.find('.pagelayer-elp-icon-div').on('click', function(){
1917 - row.find('.pagelayer-elp-icon-selector').slideToggle();
1918 - });
1919 -
1920 2859 // Handle type of icon
1921 - row.find('.pagelayer-elp-icon-type p').on('click', function(){
1922 -
1923 - if(cur_icon_set == 'font-awesome5'){
1924 -
1925 - var v = jQuery(this).data('tab');
1926 -
1927 - row.find('.pagelayer-elp-icon-type p').removeClass('active');
1928 -
1929 - jQuery(this).addClass('active');
1930 -
1931 - var span ='';
1932 - v = v.toLowerCase();
1933 -
1934 - sorted_icons = icons['font-awesome5'][v];
1935 -
1936 - for(var z in icons['font-awesome5'][v]['icons']){
1937 - span += icon_html(icons['font-awesome5'][v]['icons'][z], v);
1938 - }
1939 -
1940 - row.find('.pagelayer-elp-icon-list').empty().html(span);
1941 -
1942 - if(row.find('.pagelayer-elp-search-icon').val() != ''){
1943 - row.find('.pagelayer-elp-search-icon').keyup();
1944 - }
1945 -
1946 - }
1947 -
2860 + row.find('.pagelayer-elp-icon-type p').on('click', function(){
2861 + jQuery(this).toggleClass('active');
2862 + row.find('.pagelayer-elp-search-icon').keyup();
1948 2863 });
1949 2864
1950 2865 // Handle search of icon
1951 2866 row.find('.pagelayer-elp-search-icon').on('keyup', function(){
@@ -1950,18 +2865,25 @@
1950 2865 // Handle search of icon
1951 2866 row.find('.pagelayer-elp-search-icon').on('keyup', function(){
1952 2867
1953 2868 var v = this.value;
1954 - var span ='';
2869 + var span = '';
1955 2870 v = v.toLowerCase();
1956 2871 v = v.replace(/\s+/g, '-');
1957 2872 //console.log(sorted_icons);
1958 2873
1959 - for(var x in sorted_icons['icons']){
1960 - if(sorted_icons['icons'][x].includes(v)){
1961 - span += icon_html(sorted_icons['icons'][x], sorted_icons['pre']);
2874 + row.find('.pagelayer-elp-icon-type p.active').each(function(){
2875 + var tab = jQuery(this).data('tab');
2876 + tab = tab.toLowerCase();
2877 +
2878 + var cat = icons['font-awesome5'][tab]['icons'];
2879 +
2880 + for(var x in cat){
2881 + if(cat[x].includes(v) || v.length < 1){
2882 + span += icon_html(cat[x], tab);
2883 + }
1962 2884 }
1963 - }
2885 + });
1964 2886
1965 2887 row.find('.pagelayer-elp-icon-list').empty().html(span);
1966 2888
1967 2889 });
@@ -1982,38 +2904,194 @@
1982 2904 row.find('.pagelayer-elp-icon-selector').slideUp();
1983 2905
1984 2906 _pagelayer_set_atts(row, i);// Save and Render
1985 2907
2908 + row.find('.pagelayer-elp-icon-close').show();
1986 2909 return false;
1987 2910
1988 2911 });
1989 2912
2913 + // Delete the icon
2914 + row.find('.pagelayer-elp-icon-close').on('click', function(){
2915 +
2916 + // Set the icon in this list
2917 + row.find('.pagelayer-elp-icon-preview').html('<i class=""></i><span class="pagelayer-elp-icon-name">'+pagelayer_l('choose_icon')+'</span>');
2918 +
2919 + // Save and Render
2920 + _pagelayer_set_atts(row, '');
2921 + jQuery(this).hide();
2922 + return false;
2923 + });
2924 +
1990 2925 }
1991 2926
2927 +// The Access Property
2928 +function pagelayer_elp_access(row, prop){
2929 +
2930 + var div = '<div class="pagelayer-elp-access-div">'+
2931 + '<span class="pagelayer-elp-access"><i class="pli pli-caret-right" ></i></span>'+
2932 + '<div class="pagelayer-elp-access-holder"></div>'+
2933 + '</div>';
2934 +
2935 + row.append(div);
2936 +
2937 + var holder = row.find('.pagelayer-elp-access-holder');
2938 +
2939 + row.find('.pagelayer-elp-access').on('click', function(){
2940 +
2941 + // Setup first
2942 + if(holder.children().length < 1){
2943 + var p = row.parent().find('[pagelayer-access-item='+prop.show_group+']').detach();
2944 + p.appendTo(holder);
2945 + p.addClass('pagelayer-access-item-visible');
2946 + }
2947 +
2948 + // Show and hide
2949 + if(holder.is(':visible')){
2950 + holder.hide();
2951 + row.find('.pli-caret-right').removeClass('pli-caret-open');
2952 + }else{
2953 + holder.show();
2954 + row.find('.pli-caret-right').addClass('pli-caret-open');
2955 + }
2956 + });
2957 +
2958 +};
2959 +
2960 +// The Modal Property
2961 +function pagelayer_elp_modal(row, prop){
2962 +
2963 + var style = pagelayer_empty(prop.width) ? '' : 'style="width:'+prop.width+'"';
2964 +
2965 + var div = '<div class="pagelayer-elp-modal-div">'+
2966 + '<span class="pagelayer-elp-modal"><i class="pli pli-window" ></i></span>'+
2967 + '<div class="pagelayer-elp-modal-wrapper">'+
2968 + '<div class="pagelayer-elp-modal-wrap" '+style+'>'+
2969 + '<div class="pagelayer-elp-modal-header">'+
2970 + prop.label +'<i class="pagelayer-elp-modal-close pli pli-cross" aria-hidden="true"></i>'+
2971 + '</div><hr>'+
2972 + '<div class="pagelayer-elp-modal-holder"></div>'+
2973 + '</div>'+
2974 + '</div>'+
2975 + '</div>';
2976 +
2977 + row.append(div);
2978 +
2979 + var wrapper = row.find('.pagelayer-elp-modal-wrapper');
2980 + var holder = row.find('.pagelayer-elp-modal-holder');
2981 +
2982 + row.find('.pagelayer-elp-modal').on('click', function(){
2983 +
2984 + // Setup first
2985 + if(holder.children().length < 1){
2986 +
2987 + var p = row.parent().find('[pagelayer-access-item='+prop.show_group+']').detach();
2988 + p.appendTo(holder);
2989 + p.addClass('pagelayer-access-item-visible');
2990 + }
2991 +
2992 + // Show and hide
2993 + wrapper.show();
2994 +
2995 + });
2996 +
2997 + // Close Modal Property
2998 + row.find('.pagelayer-elp-modal-close').on('click', function(){
2999 + wrapper.hide();
3000 + });
3001 +
3002 + // On click Pagelayer setting icon
3003 + wrapper.on('click', function(event){
3004 + var target = jQuery(event.target);
3005 +
3006 + if(target.closest('.pagelayer-elp-modal-wrap').length > 0){
3007 + return;
3008 + }
3009 +
3010 + wrapper.hide();
3011 + });
3012 +
3013 +};
3014 +
1992 3015 // The Color Property
1993 3016 function pagelayer_elp_color(row, prop){
1994 3017
1995 - var div = '<div class="pagelayer-elp-color-div">'+
1996 - '<div class="pagelayer-elp-color-preview"></div>'+
1997 - '<span class="pagelayer-elp-remove-color"><i class="pli pli-cross" /></span>'+
1998 - '</div>';
3018 + var val = prop.c['val'];
3019 + var is_global = pagelayer_is_global_color(val);
3020 + var global_active = '';
1999 3021
3022 + // If global color not exist
3023 + if(!pagelayer_empty(is_global)){
3024 + val = pagelayer_global_colors[is_global]['value'];
3025 + global_active = 'pagelayer-active-global';
3026 + }
3027 +
3028 + var div = '<div class="pagelayer-elp-color-div-holder">'+
3029 + '<div class="pagelayer-elp-color-global '+global_active+'"></div>'+
3030 + '<div class="pagelayer-elp-color-div">'+
3031 + '<div class="pagelayer-elp-color-preview"></div>'+
3032 + '<span class="pagelayer-elp-remove-color"><i class="pli pli-cross" ></i></span>'+
3033 + '</div>'+
3034 + '<div class="pagelayer-global-color-list">'+
3035 + '<div class="pagelayer-global-setting-color">'+
3036 + '<b>Global Colors</b><span class="pli pli-service"></span>'+
3037 + '</div>';
3038 +
3039 + for( cid in pagelayer_global_colors ){
3040 +
3041 + var color = pagelayer_global_colors[cid];
3042 + var active_class = '';
3043 +
3044 + if(cid == is_global){
3045 + active_class = 'pagelayer-global-selected';
3046 + }
3047 +
3048 + div += '<div class="pagelayer-global-color-list-item '+ active_class +'" data-global-id="'+ cid +'">'+
3049 + '<span class="pagelayer-global-color-pre" style="background:'+ color['value'] +'"></span>'+
3050 + '<span class="pagelayer-global-color-title">'+ color['title'] +'</span>'+
3051 + '<span class="pagelayer-global-color-code">'+ color['value'] +'</span>'+
3052 + '</div>';
3053 + }
3054 + div += '</div></div>';
3055 +
2000 3056 row.append(div);
2001 3057
2002 - row.find('.pagelayer-elp-color-preview').css('background', prop.c['val']);
3058 + row.find('.pagelayer-elp-color-preview').css('background', val);
2003 3059
2004 - var picker = new Picker({
3060 + var picker = new pagelayer_Picker({
2005 3061 parent : row.find('.pagelayer-elp-color-div')[0],
2006 3062 popup : 'left',
2007 - color : prop.c['val'],
3063 + color : val,
2008 3064 doc: window.parent.document
2009 3065 });
2010 3066
3067 + var preview = row.find('.pagelayer-elp-color-preview');
3068 +
3069 + // If no val, then set blank
3070 + if(pagelayer_empty(val)){
3071 + preview.addClass('pagelayer-blank-preview');
3072 + }
3073 +
3074 + var handle_white = function(col){
3075 + if(col.charAt(1) == 'f'){
3076 + preview.addClass('pagelayer-white-border');
3077 + }else{
3078 + preview.removeClass('pagelayer-white-border');
3079 + }
3080 + }
3081 +
3082 + handle_white(val);
3083 +
2011 3084 // Handle selected color
2012 - picker.onChange = function(color) {
3085 + picker.onChange = function(color) {
3086 + preview.removeClass('pagelayer-blank-preview').css('background', color.rgbaString);
3087 + handle_white(color.hex);
3088 + _pagelayer_set_atts(row, color.hex);// Save and Render
2013 3089
2014 - row.find('.pagelayer-elp-color-preview').removeClass('pagelayer-blank-preview').css('background', color.rgbaString);
2015 - _pagelayer_set_atts(row, color.hex);// Save and Render
3090 + // Remove global
3091 + row.find('.pagelayer-elp-color-global').removeClass('pagelayer-active-global');
3092 + row.find('.pagelayer-global-selected').removeClass('pagelayer-global-selected');
3093 + row.find('.pagelayer-global-color-list').hide();
2016 3094 };
2017 3095
2018 3096 picker.onOpen = picker.onChange;
2019 3097
@@ -2019,12 +3097,47 @@
2019 3097
2020 3098 row.find('.pagelayer-elp-remove-color').on('click', function(event){
2021 3099 event.stopPropagation();
2022 3100 picker.setColor(prop.default, true);
2023 - row.find('.pagelayer-elp-color-preview').addClass('pagelayer-blank-preview');
3101 + preview.addClass('pagelayer-blank-preview');
3102 + handle_white('');
2024 3103 _pagelayer_set_atts(row, ' ');// Save and Render
2025 - })
3104 + });
2026 3105
3106 + // Handle for global color
3107 + row.find('.pagelayer-elp-color-global').on('click', function(e){
3108 + row.find('.pagelayer-global-color-list').slideToggle();
3109 + });
3110 +
3111 + row.find('.pagelayer-global-setting-color').on('click', function(e){
3112 + e.stopPropagation();
3113 +
3114 + if(jQuery(e.target).closest('.pli-service').length < 1){
3115 + return;
3116 + }
3117 + window.open(pagelayer_customizer_url+'&autofocus%5Bsection%5D=pagelayer_global_colors_sec', '_blank');
3118 + });
3119 +
3120 + // Handle for global color
3121 + row.find('.pagelayer-global-color-list-item ').on('click', function(e){
3122 + e.stopPropagation();
3123 +
3124 + var listItem = jQuery(this);
3125 + var globalID = listItem.data('global-id');
3126 + var listHolder = row.find('.pagelayer-global-color-list');
3127 +
3128 + // Remove previous selecttion
3129 + listHolder.find('.pagelayer-global-selected').removeClass('pagelayer-global-selected');
3130 + listItem.addClass('pagelayer-global-selected');
3131 + row.find('.pagelayer-elp-color-global').addClass('pagelayer-active-global');
3132 + listHolder.slideUp();
3133 +
3134 + var color = pagelayer_global_colors[globalID]['value'];
3135 + preview.removeClass('pagelayer-blank-preview').css('background', color);
3136 + handle_white(color);
3137 + _pagelayer_set_atts(row, '$'+globalID);// Save and Render
3138 +
3139 + });
2027 3140 }
2028 3141
2029 3142 // The Spinner property
2030 3143 function pagelayer_elp_spinner(row, prop){
@@ -2036,9 +3149,15 @@
2036 3149
2037 3150 row.append(div);
2038 3151
2039 3152 row.find('input').on('input', function(){
2040 - _pagelayer_set_atts(row, jQuery(this).val());// Save and Render
3153 + var value = parseFloat(this.value);
3154 + var max = parseFloat(this.max);
3155 +
3156 + if(!pagelayer_empty(max) && value > max){
3157 + value = max;
3158 + }
3159 + _pagelayer_set_atts(row, value);// Save and Render
2041 3160 });
2042 3161
2043 3162 }
2044 3163
@@ -2044,13 +3163,20 @@
2044 3163
2045 3164 // The Group Property
2046 3165 function pagelayer_elp_group(row, prop){
2047 3166
3167 + var btnHidden = '';
3168 +
3169 + // Hide button, clone and delete
3170 + if(!pagelayer_empty(prop['hide'])){
3171 + btnHidden = 'pagelayer-hidden';
3172 + }
3173 +
2048 3174 // Remove the pagelayer-show-tab
2049 3175 row.removeAttr('pagelayer-show-tab');
2050 3176
2051 3177 var div = '<div class="pagelayer-elp-group-div"></div>'+
2052 - '<center><button class="pagelayer-elp-button">'+prop['text']+'</button></center>';
3178 + '<center><button class="pagelayer-elp-button '+btnHidden+'">'+prop['text']+'</button></center>';
2053 3179
2054 3180 row.append(div);
2055 3181
2056 3182 // Add button
@@ -2059,9 +3185,9 @@
2059 3185 var ele_id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id') || '';
2060 3186 var pEle = jQuery('[pagelayer-id="'+ele_id+'"]');
2061 3187
2062 3188 // First add the element inside the group element
2063 - var id = pagelayer_element_add_child(pEle, prop['sc']);
3189 + var id = pagelayer_element_add_child(pEle, prop['sc'], prop);
2064 3190 //pagelayer_element_setup('[pagelayer-id='+id+']', true);
2065 3191
2066 3192 show_item(id);
2067 3193
@@ -2098,12 +3224,12 @@
2098 3224
2099 3225 // Create the HTML
2100 3226 var holder = jQuery('<div class="pagelayer-elp-group-item" pagelayer-group-item-id="'+id+'">'+
2101 3227 '<div class="pagelayer-elp-group-item-head">'+
2102 - '<span class="pagelayer-elp-group-item-drag"><i class="pli pli-menu" /></span>'+
3228 + '<span class="pagelayer-elp-group-item-drag"><i class="pli pli-menu" ></i></span>'+
2103 3229 '<span class="pagelayer-elp-group-item-title">'+title+'</span>'+
2104 - '<span class="pagelayer-elp-group-item-clone"><i class="pli pli-clone" /></span>'+
2105 - '<span class="pagelayer-elp-group-item-del"><i class="pli pli-trashcan" /></span>'+
3230 + '<span class="pagelayer-elp-group-item-clone '+btnHidden+'"><i class="pli pli-clone" ></i></span>'+
3231 + '<span class="pagelayer-elp-group-item-del '+btnHidden+'"><i class="pli pli-trashcan" ></i></span>'+
2106 3232 '</div>'+
2107 3233 '<div class="pagelayer-elp-group-item-body"></div>'+
2108 3234 '</div>');
2109 3235
@@ -2114,9 +3240,12 @@
2114 3240 row.find('.pagelayer-elp-group-div').first().append(holder);
2115 3241 }
2116 3242
2117 3243 // Setup the toggle
2118 - holder.find('.pagelayer-elp-group-item-title').first().on('click', function(){
3244 + holder.find('.pagelayer-elp-group-item-head').first().on('click', function(e){
3245 + if(jQuery(e.target).closest('.pagelayer-elp-group-item-clone, .pagelayer-elp-group-item-del, .pagelayer-elp-group-item-drag').length > 0){
3246 + return;
3247 + }
2119 3248 var rEle = holder.find('.pagelayer-elp-group-item-body').first();
2120 3249 var r_id = holder.attr('pagelayer-group-item-id');
2121 3250
2122 3251 // If the props are not already setup
@@ -2134,9 +3263,9 @@
2134 3263 }
2135 3264
2136 3265 }
2137 3266
2138 - rEle.toggle('slow');
3267 + rEle.toggle();
2139 3268 });
2140 3269
2141 3270 // Clone the item
2142 3271 holder.find('.pagelayer-elp-group-item-head .pli-clone').on('click', function(){
@@ -2167,16 +3296,43 @@
2167 3296 }
2168 3297 });
2169 3298
2170 3299 };
3300 +
3301 + // Setup the drag
3302 + pagelayer.$$(".pagelayer-elp-group-div").sortable({
3303 + axis: 'y',
3304 + nested : false,
3305 + vertical : true,
3306 + handle : ".pagelayer-elp-group-item-drag",
3307 + placeholder: "pagelayer-drag-highlight",
3308 + start : function(event, ui) {
3309 + var start_pos = ui.item.index();
3310 + ui.item.data('start_pos', start_pos);
3311 + },
3312 + stop : function(event, ui){
3313 + var end_pos = ui.item.index();
3314 + var id = jQuery(ui.item).closest('[pagelayer-group-item-id]').attr('pagelayer-group-item-id');
3315 + var jEle = jQuery('[pagelayer-id="'+id+'"]');
3316 + pagelayer_moving_element(jEle, ui.item.data('start_pos'), end_pos);
3317 + var par = pagelayer_get_parent(jEle);
3318 + if(par){
3319 + pagelayer_sc_render(pagelayer_ele_by_id(par));
3320 + }
3321 + }
3322 + });
2171 3323
2172 3324 // Handle click of the group
2173 3325 row.find('.pagelayer-elp-button').on('click', function(){
3326 + if('pro' in prop && pagelayer_empty(pagelayer_pro)){
3327 + pagelayer_pro_notice();
3328 + return;
3329 + }
2174 3330 add_item(row);
2175 3331 });
2176 3332
2177 3333 // Find the existing items
2178 - prop.el.$.find('[pagelayer-tag='+prop['sc']+']').each(function(){
3334 + prop.el.$.find('[pagelayer-parent="'+prop.el['id']+'"]').each(function(){
2179 3335 var jEle = jQuery(this);
2180 3336 var id = pagelayer_assign_id(jEle);
2181 3337 show_item(id);
2182 3338 });
@@ -2181,12 +3337,50 @@
2181 3337 show_item(id);
2182 3338 });
2183 3339 };
2184 3340
3341 +function pagelayer_pro_notice(){
3342 + var div = pagelayer.$$('.pagelayer-pro-notice');
3343 +
3344 + div.find('.pagelayer-pro-x').click(function(){
3345 + div.hide();
3346 + });
3347 +
3348 + div.show();
3349 +}
3350 +
3351 +// Moving an element
3352 +function pagelayer_moving_element(jEle, start_pos, end_pos){
3353 + if(start_pos==end_pos){
3354 + return;
3355 + }
3356 +
3357 + var id = pagelayer_assign_id(jEle);
3358 +
3359 + // Is there a wrap
3360 + var wrap = pagelayer_wrap_by_id(id);
3361 +
3362 + var par = wrap.parent();
3363 + var children = par.children("div");
3364 +
3365 + // This is required for Owl Carousel
3366 + if(children.length==1){
3367 + par = par.parent();
3368 + children = par.children("div");
3369 + }
3370 +
3371 + var element = children.eq(start_pos).detach();
3372 + if(end_pos < start_pos){
3373 + children.eq(end_pos).before(element);
3374 + }else{
3375 + children.eq(end_pos).after(element);
3376 + }
3377 +}
3378 +
2185 3379 // The Datetime Property
2186 3380 function pagelayer_elp_datetime(row, prop){
2187 3381
2188 - var div = '<div class="pagelayer-elp-datetime-div pagelayer-elp-input-icon">'+
3382 + var div = '<div class="pagelayer-elp-datetime-div">'+
2189 3383 '<input type="date" class="pagelayer-elp-datetime" name="'+prop.c['name']+'" value="'+prop.c['val']+'" />'+
2190 3384 '</div>';
2191 3385
2192 3386 row.append(div);
@@ -2200,19 +3394,21 @@
2200 3394 // The padding property
2201 3395 function pagelayer_elp_padding(row, prop){
2202 3396 var val = ['', '', '', ''];
2203 3397
2204 - if(prop.c['val'].length > 0){
2205 - val = prop.c['val'].split(',');
2206 - //console.log(val)
3398 + if(!pagelayer_empty(prop.c['val'])){
3399 + val = prop.c['val'];
3400 + if(pagelayer_is_string(val)){
3401 + val = val.split(',');
3402 + }
2207 3403 }
2208 3404
2209 3405 var div = '<div class="pagelayer-elp-padding-div">'+
2210 - '<input type="number" class="pagelayer-elp-padding" value="'+parseFloat(val[0])+'"></input>'+
2211 - '<input type="number" class="pagelayer-elp-padding" value="'+parseFloat(val[1])+'"></input>'+
2212 - '<input type="number" class="pagelayer-elp-padding" value="'+parseFloat(val[2])+'"></input>'+
2213 - '<input type="number" class="pagelayer-elp-padding" value="'+parseFloat(val[3])+'"></input>'+
2214 - '<i class="pli pli-link" />'+
3406 + '<div class="pagelayer-elp-padding-inner"><input type="number" class="pagelayer-elp-padding" value="'+parseFloat(val[0])+'"></input><span class="pagelayer-elp-padding-lbl">Top</span></div>'+
3407 + '<div class="pagelayer-elp-padding-inner"><input type="number" class="pagelayer-elp-padding" value="'+parseFloat(val[1])+'"></input><span class="pagelayer-elp-padding-lbl">Right</span></div>'+
3408 + '<div class="pagelayer-elp-padding-inner"><input type="number" class="pagelayer-elp-padding" value="'+parseFloat(val[2])+'"></input><span class="pagelayer-elp-padding-lbl">Bottom</span></div>'+
3409 + '<div class="pagelayer-elp-padding-inner"><input type="number" class="pagelayer-elp-padding" value="'+parseFloat(val[3])+'"></input><span class="pagelayer-elp-padding-lbl">Left</span></div>'+
3410 + '<i class="pli pli-link" ></i>'+
2215 3411 '</div>';
2216 3412
2217 3413 row.append(div);
2218 3414
@@ -2282,9 +3478,12 @@
2282 3478 var val =['','','',''];
2283 3479
2284 3480 // Do we have a val ?
2285 3481 if(!pagelayer_empty(prop.c['val'])){
2286 - val = prop.c['val'].split(',');
3482 + val = prop.c['val'];
3483 + if(pagelayer_is_string(val)){
3484 + val = val.split(',');
3485 + }
2287 3486 }
2288 3487
2289 3488 //var val = {color: '', blur: '', horizontal: '', vertical: ''};
2290 3489
@@ -2305,8 +3504,9 @@
2305 3504 '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-color">'+
2306 3505 '<label class="pagelayer-elp-label">Color</label>'+
2307 3506 '<div class="pagelayer-elp-color-div">'+
2308 3507 '<div class="pagelayer-elp-color-preview"></div>'+
3508 + '<span class="pagelayer-elp-remove-color"><i class="pli pli-cross" ></i></span>'+
2309 3509 '</div>'+
2310 3510 '</div>'+
2311 3511 '</div>';
2312 3512
@@ -2315,11 +3515,12 @@
2315 3515 row.find('.pagelayer-prop-edit').on('click', function(){
2316 3516 row.find('.pagelayer-elp-shadow-div').toggleClass('pagelayer-prop-show');
2317 3517 });
2318 3518
2319 - row.find('.pagelayer-elp-color-preview').css('background', val[3]);
3519 + var preview = row.find('.pagelayer-elp-color-preview');
3520 + preview.css('background', val[3]);
2320 3521
2321 - var picker = new Picker({
3522 + var picker = new pagelayer_Picker({
2322 3523 parent : row.find('.pagelayer-elp-color-div')[0],
2323 3524 popup : 'left',
2324 3525 color : val[3],
2325 3526 doc: window.parent.document
@@ -2324,15 +3525,41 @@
2324 3525 color : val[3],
2325 3526 doc: window.parent.document
2326 3527 });
2327 3528
3529 + // If no val, then set blank
3530 + if(pagelayer_empty(val[3])){
3531 + preview.addClass('pagelayer-blank-preview');
3532 + }
3533 +
3534 + var handle_white = function(col){
3535 + if(col.charAt(1) == 'f'){
3536 + preview.addClass('pagelayer-white-border');
3537 + }else{
3538 + preview.removeClass('pagelayer-white-border');
3539 + }
3540 + }
3541 +
3542 + handle_white(val[3]);
3543 +
2328 3544 // Handle selected color
2329 3545 picker.onChange = function(color) {
2330 - row.find('.pagelayer-elp-color-preview').css('background', color.rgbaString);
3546 + preview.removeClass('pagelayer-blank-preview').css('background', color.rgbaString);
3547 + handle_white(color.hex);
2331 3548 val[3] = (color.hex ? color.hex : '');
2332 3549 _pagelayer_set_atts(row, val);
2333 3550 };
2334 3551
3552 + // Remove Color
3553 + row.find('.pagelayer-elp-remove-color').on('click', function(event){
3554 + event.stopPropagation();
3555 + picker.setColor(prop.default, true);
3556 + preview.addClass('pagelayer-blank-preview');
3557 + handle_white('');
3558 + val[3] = '';
3559 + _pagelayer_set_atts(row, val);
3560 + });
3561 +
2335 3562 row.find('input').on('input', function(){
2336 3563 var i = 0;
2337 3564 row.find('.pagelayer-elp-shadow-input').each(function(){
2338 3565 var value = jQuery(this).val();
@@ -2350,9 +3577,12 @@
2350 3577 var val = ['','','','','',''];
2351 3578
2352 3579 // Do we have a val ?
2353 3580 if(!pagelayer_empty(prop.c['val'])){
2354 - val = prop.c['val'].split(',');
3581 + val = prop.c['val'];
3582 + if(pagelayer_is_string(val)){
3583 + val = val.split(',');
3584 + }
2355 3585 }
2356 3586
2357 3587 var val_pos = ['horizontal','vertical','blur','color','spread','inset'];
2358 3588
@@ -2377,13 +3607,14 @@
2377 3607 '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-color">'+
2378 3608 '<label class="pagelayer-elp-label">Color</label>'+
2379 3609 '<div class="pagelayer-elp-color-div">'+
2380 3610 '<div class="pagelayer-elp-color-preview"></div>'+
3611 + '<span class="pagelayer-elp-remove-color"><i class="pli pli-cross" ></i></span>'+
2381 3612 '</div>'+
2382 3613 '</div>'+
2383 3614 '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-inset">'+
2384 3615 '<label class="pagelayer-elp-label">Shadow</label>'+
2385 - '<select class="pagelayer-elp-shadow-input" name="inset" type="checkbox" class="pagelayer-elp-shadow-inset">'+
3616 + '<select class="pagelayer-elp-shadow-input pagelayer-elp-select" name="inset" type="checkbox" class="pagelayer-elp-shadow-inset">'+
2386 3617 '<option value="">Outset</option>'+
2387 3618 '<option value="inset"'+(pagelayer_empty(val[5]) ? '' : ' selected' )+'>Inset</option>'+
2388 3619 '</select>'+
2389 3620 '</div>'+
@@ -2394,11 +3625,12 @@
2394 3625 row.find('.pagelayer-prop-edit').on('click', function(){
2395 3626 row.find('.pagelayer-elp-shadow-div').toggleClass('pagelayer-prop-show');
2396 3627 });
2397 3628
2398 - row.find('.pagelayer-elp-color-preview').css('background', val[3]);
3629 + var preview = row.find('.pagelayer-elp-color-preview');
3630 + preview.css('background', val[3]);
2399 3631
2400 - var picker = new Picker({
3632 + var picker = new pagelayer_Picker({
2401 3633 parent : row.find('.pagelayer-elp-color-div')[0],
2402 3634 popup : 'left',
2403 3635 color : val[3],
2404 3636 doc: window.parent.document
@@ -2403,15 +3635,42 @@
2403 3635 color : val[3],
2404 3636 doc: window.parent.document
2405 3637 });
2406 3638
3639 + // If no val, then set blank
3640 + if(pagelayer_empty(val[3])){
3641 + preview.addClass('pagelayer-blank-preview');
3642 + }
3643 +
3644 + var handle_white = function(col){
3645 + if(col.charAt(1) == 'f'){
3646 + preview.addClass('pagelayer-white-border');
3647 + }else{
3648 + preview.removeClass('pagelayer-white-border');
3649 + }
3650 + }
3651 +
3652 + handle_white(val[3]);
3653 +
2407 3654 // Handle selected color
2408 3655 picker.onChange = function(color) {
2409 - row.find('.pagelayer-elp-color-preview').css('background', color.rgbaString);
3656 + row.find('.pagelayer-elp-color-preview').removeClass('pagelayer-blank-preview').css('background', color.rgbaString);
3657 + handle_white(color.hex);
2410 3658 val[3] = (color.hex ? color.hex : '');
2411 3659 _pagelayer_set_atts(row, val);
2412 3660 };
2413 3661
3662 + // Remove Color
3663 + row.find('.pagelayer-elp-remove-color').on('click', function(event){
3664 + event.stopPropagation();
3665 + picker.setColor(prop.default, true);
3666 + preview.addClass('pagelayer-blank-preview');
3667 + handle_white('');
3668 + val[3] = '';
3669 + _pagelayer_set_atts(row, val);
3670 + });
3671 +
3672 + // Onchange set props
2414 3673 row.find('.pagelayer-elp-shadow-input').on('input change', function(){
2415 3674 //var i = 0;
2416 3675 row.find('.pagelayer-elp-shadow-input').each(function(){
2417 3676 var value = jQuery(this).val();
@@ -2430,9 +3689,12 @@
2430 3689 var val = [0,100,100,0,0,100,100];
2431 3690
2432 3691 // Do we have a val ?
2433 3692 if(!pagelayer_empty(prop.c['val'])){
2434 - val = prop.c['val'].split(',');
3693 + val = prop.c['val'];
3694 + if(pagelayer_is_string(val)){
3695 + val = val.split(',');
3696 + }
2435 3697 }
2436 3698
2437 3699 var filters = [['blur','10','0.1'],['brightness','200','1'],['contrast','200','1'],['grayscale','200','1'],['hue','360','1'],['opacity','100','1'],['saturate','200','1']];
2438 3700
@@ -2441,9 +3703,9 @@
2441 3703
2442 3704 jQuery.each(val,function(key, value){
2443 3705 div += '<div class="pagelayer-elp-prop-grp pagelayer-elp-filter-'+filters[key][0]+'">'+
2444 3706 '<label class="pagelayer-elp-label">'+filters[key][0]+'</label>'+
2445 - '<input class="pagelayer-elp-slider pagelayer-elp-filter-input" type="range" max="'+filters[key][1]+'" min="0" step="'+filters[key][2]+'" class="pagelayer-elp-filter-'+filters[key][0]+'" value="'+value+'"></input>'+
3707 + '<input class="pagelayer-elp-slider pagelayer-elp-filter-input pagelayer-elp-filter-'+filters[key][0]+'" type="range" max="'+filters[key][1]+'" min="0" step="'+filters[key][2]+'" value="'+value+'"></input>'+
2446 3708 '<span class="pagelayer-elp-filter-val">'+value+'</span>'+
2447 3709 '</div>';
2448 3710 });
2449 3711
@@ -2469,16 +3731,53 @@
2469 3731
2470 3732 // The gradient property
2471 3733 function pagelayer_elp_gradient(row, prop){
2472 3734
2473 - var val =['','','','','','',''];
3735 + var val = ['','','','','','',''];
2474 3736
2475 3737 // Do we have a val ?
2476 3738 if(!pagelayer_empty(prop.c['val'])){
2477 - val = prop.c['val'].split(',');
3739 + val = prop.c['val'];
3740 + if(pagelayer_is_string(val)){
3741 + val = val.split(',');
3742 + }
2478 3743 }
2479 3744
3745 + var setColor = [val[1], val[3], val[5]];
3746 +
2480 3747 //var val = {color: '', blur: '', horizontal: '', vertical: ''};
3748 + var getColorList = function(num){
3749 +
3750 + var is_global = pagelayer_is_global_color(setColor[num]);
3751 + var global_list = '<div class="pagelayer-global-color-list">'+
3752 + '<div class="pagelayer-global-setting-color">'+
3753 + '<b>Global Colors</b><span class="pli pli-service"></span>'+
3754 + '</div>';
3755 +
3756 + for( cid in pagelayer_global_colors ){
3757 +
3758 + var color = pagelayer_global_colors[cid];
3759 + var active_class = '';
3760 +
3761 + if(cid == is_global){
3762 + active_class = 'pagelayer-global-selected';
3763 + }
3764 +
3765 + // If global color not exist
3766 + if(!pagelayer_empty(is_global)){
3767 + setColor[num] = pagelayer_global_colors[is_global]['value'];
3768 + }
3769 +
3770 + global_list += '<div class="pagelayer-global-color-list-item '+ active_class +'" data-global-id="'+ cid +'">'+
3771 + '<span class="pagelayer-global-color-pre" style="background:'+ color['value'] +'"></span>'+
3772 + '<span class="pagelayer-global-color-title">'+ color['title'] +'</span>'+
3773 + '<span class="pagelayer-global-color-code">'+ color['value'] +'</span>'+
3774 + '</div>';
3775 + }
3776 + global_list += '</div>';
3777 +
3778 + return global_list;
3779 + }
2481 3780
2482 3781 var div = '<div class="pagelayer-elp-gradient-div">'+
2483 3782 '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-angle">'+
2484 3783 '<label class="pagelayer-elp-label">Angle</label>'+
@@ -2483,12 +3782,16 @@
2483 3782 '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-angle">'+
2484 3783 '<label class="pagelayer-elp-label">Angle</label>'+
2485 3784 '<input class="pagelayer-elp-gradient-input" type="number" max="360" min="0" step="1" class="pagelayer-elp-gradient-angle" value="'+val[0]+'"></input>'+
2486 3785 '</div>'+
2487 - '<div class="pagelayer-elp-prop-grp">'+
2488 - '<label class="pagelayer-elp-label">color 1</label>'+
2489 - '<div class="pagelayer-elp-color-div">'+
2490 - '<div class="pagelayer-elp-gradient-color1 pagelayer-elp-color-preview"></div>'+
3786 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-color">'+
3787 + '<label class="pagelayer-elp-label">Color 1</label>'+
3788 + '<div class="pagelayer-elp-color-div-holder">'+
3789 + '<div class="pagelayer-elp-color-global"></div>'+
3790 + '<div class="pagelayer-elp-color-div">'+
3791 + '<div class="pagelayer-elp-gradient-color1 pagelayer-elp-color-preview"></div>'+
3792 + '</div>'+
3793 + getColorList(0)+
2491 3794 '</div>'+
2492 3795 '</div>'+
2493 3796 '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-per1">'+
2494 3797 '<label class="pagelayer-elp-label">Percentage 1</label>'+
@@ -2493,12 +3796,16 @@
2493 3796 '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-per1">'+
2494 3797 '<label class="pagelayer-elp-label">Percentage 1</label>'+
2495 3798 '<input class="pagelayer-elp-gradient-input" type="number" max="100" min="-100" step="1" class="pagelayer-elp-gradient-per1" value="'+val[2]+'"></input>'+
2496 3799 '</div>'+
2497 - '<div class="pagelayer-elp-prop-grp">'+
2498 - '<label class="pagelayer-elp-label">color 2</label>'+
2499 - '<div class="pagelayer-elp-color-div">'+
2500 - '<div class="pagelayer-elp-gradient-color2 pagelayer-elp-color-preview"></div>'+
3800 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-color">'+
3801 + '<label class="pagelayer-elp-label">Color 2</label>'+
3802 + '<div class="pagelayer-elp-color-div-holder">'+
3803 + '<div class="pagelayer-elp-color-global"></div>'+
3804 + '<div class="pagelayer-elp-color-div">'+
3805 + '<div class="pagelayer-elp-gradient-color2 pagelayer-elp-color-preview"></div>'+
3806 + '</div>'+
3807 + getColorList(1)+
2501 3808 '</div>'+
2502 3809 '</div>'+
2503 3810 '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-per2">'+
2504 3811 '<label class="pagelayer-elp-label">Percentage 2</label>'+
@@ -2503,12 +3810,16 @@
2503 3810 '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-per2">'+
2504 3811 '<label class="pagelayer-elp-label">Percentage 2</label>'+
2505 3812 '<input class="pagelayer-elp-gradient-input" type="number" max="100" min="0" step="1" class="pagelayer-elp-gradient-per2" value="'+val[4]+'"></input>'+
2506 3813 '</div>'+
2507 - '<div class="pagelayer-elp-prop-grp">'+
2508 - '<label class="pagelayer-elp-label">color 3</label>'+
2509 - '<div class="pagelayer-elp-color-div">'+
2510 - '<div class="pagelayer-elp-gradient-color3 pagelayer-elp-color-preview"></div>'+
3814 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-color">'+
3815 + '<label class="pagelayer-elp-label">Color 3</label>'+
3816 + '<div class="pagelayer-elp-color-div-holder">'+
3817 + '<div class="pagelayer-elp-color-global"></div>'+
3818 + '<div class="pagelayer-elp-color-div">'+
3819 + '<div class="pagelayer-elp-gradient-color3 pagelayer-elp-color-preview"></div>'+
3820 + '</div>'+
3821 + getColorList(2)+
2511 3822 '</div>'+
2512 3823 '</div>'+
2513 3824 '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-per3">'+
2514 3825 '<label class="pagelayer-elp-label">Percentage 3</label>'+
@@ -2516,54 +3827,70 @@
2516 3827 '</div>'+
2517 3828 '</div>';
2518 3829
2519 3830 row.append(div);
2520 - var i = 1;
3831 + var i = 0;
2521 3832 row.find('.pagelayer-elp-color-preview').each(function(){
2522 - jQuery(this).css('background', val[i]);
2523 - i = i+2;
3833 + jQuery(this).css('background', setColor[i]);
3834 + i++;
2524 3835 });
2525 3836
2526 - var picker1 = new Picker({
3837 + // Remove global
3838 + var removeGlobal = function(holder){
3839 + holder.find('.pagelayer-elp-color-global').removeClass('pagelayer-active-global');
3840 + holder.find('.pagelayer-global-selected').removeClass('pagelayer-global-selected');
3841 + holder.find('.pagelayer-global-color-list').hide();
3842 + }
3843 +
3844 + var picker1 = new pagelayer_Picker({
2527 3845 parent : row.find('.pagelayer-elp-gradient-color1')[0],
2528 3846 popup : 'left',
2529 - color : val[1],
3847 + color : setColor[0],
2530 3848 doc: window.parent.document
2531 3849 });
2532 3850
2533 3851 // Handle selected color
2534 3852 picker1.onChange = function(color) {
2535 - row.find('.pagelayer-elp-gradient-color1').css('background', color.rgbaString);
3853 + var cPreview = row.find('.pagelayer-elp-gradient-color1')
3854 + cPreview.css('background', color.rgbaString);
2536 3855 val[1] = (color.hex ? color.hex : '');
2537 3856 _pagelayer_set_atts(row, val);
3857 +
3858 + removeGlobal(cPreview.closest('.pagelayer-elp-color-div-holder'));
2538 3859 };
2539 3860
2540 - var picker2 = new Picker({
3861 + var picker2 = new pagelayer_Picker({
2541 3862 parent : row.find('.pagelayer-elp-gradient-color2')[0],
2542 3863 popup : 'left',
2543 - color : val[3],
3864 + color : setColor[1],
2544 3865 doc: window.parent.document
2545 3866 });
2546 3867
2547 3868 // Handle selected color
2548 3869 picker2.onChange = function(color) {
2549 - row.find('.pagelayer-elp-gradient-color2').css('background', color.rgbaString);
3870 + var cPreview = row.find('.pagelayer-elp-gradient-color2');
3871 + cPreview.css('background', color.rgbaString);
2550 3872 val[3] = (color.hex ? color.hex : '');
2551 3873 _pagelayer_set_atts(row, val);
3874 +
3875 + removeGlobal(cPreview.closest('.pagelayer-elp-color-div-holder'));
2552 3876 };
2553 3877
2554 - var picker3 = new Picker({
3878 + var picker3 = new pagelayer_Picker({
2555 3879 parent : row.find('.pagelayer-elp-gradient-color3')[0],
2556 3880 popup : 'left',
2557 - color : val[5],
3881 + color : setColor[2],
2558 3882 doc: window.parent.document
2559 3883 });
2560 3884
2561 3885 // Handle selected color
2562 3886 picker3.onChange = function(color) {
2563 - row.find('.pagelayer-elp-gradient-color3').css('background', color.rgbaString);
3887 + var cPreview = row.find('.pagelayer-elp-gradient-color3');
3888 + cPreview.css('background', color.rgbaString);
2564 3889 val[5] = (color.hex ? color.hex : '');
2565 3890 _pagelayer_set_atts(row, val);
3891 +
3892 + removeGlobal(cPreview.closest('.pagelayer-elp-color-div-holder'));
2566 3893 };
2567 3894
2568 3895 row.find('input').on('input', function(){
2569 3896 var i = 0;
@@ -2574,125 +3901,280 @@
2574 3901 });
2575 3902 _pagelayer_set_atts(row, val);
2576 3903 });
2577 3904
3905 + row.find('.pagelayer-global-selected').each(function(){
3906 + jQuery(this).closest('.pagelayer-elp-color-div-holder').find('.pagelayer-elp-color-global').addClass('pagelayer-active-global');
3907 + });
3908 +
3909 + // Handle for global color
3910 + row.find('.pagelayer-elp-color-global').on('click', function(e){
3911 + jQuery(this).closest('.pagelayer-elp-color-div-holder').find('.pagelayer-global-color-list').slideToggle();
3912 + });
3913 +
3914 + row.find('.pagelayer-global-setting-color').on('click', function(e){
3915 + e.stopPropagation();
3916 +
3917 + if(jQuery(e.target).closest('.pli-service').length < 1){
3918 + return;
3919 + }
3920 +
3921 + window.open( pagelayer_customizer_url + '&autofocus%5Bsection%5D=pagelayer_global_colors_sec', '_blank' );
3922 + });
3923 +
3924 + // Handle for global color
3925 + row.find('.pagelayer-global-color-list-item ').on('click', function(e){
3926 + e.stopPropagation();
3927 +
3928 + var listItem = jQuery(this);
3929 + var globalID = listItem.data('global-id');
3930 + var listHolder = listItem.closest('.pagelayer-global-color-list');
3931 + var colorHolder = listItem.closest('.pagelayer-elp-color-div-holder');
3932 + var colorPreview = colorHolder.find('.pagelayer-elp-color-preview');
3933 +
3934 + // Remove previous selecttion
3935 + listHolder.find('.pagelayer-global-selected').removeClass('pagelayer-global-selected');
3936 + listItem.addClass('pagelayer-global-selected');
3937 + colorHolder.find('.pagelayer-elp-color-global').addClass('pagelayer-active-global');
3938 + listHolder.slideUp();
3939 +
3940 + var color = pagelayer_global_colors[globalID]['value'];
3941 + colorPreview.removeClass('pagelayer-blank-preview').css('background', color);
3942 +
3943 + var i = 1;
3944 +
3945 + if(colorPreview.hasClass('pagelayer-elp-gradient-color2')){
3946 + i = 3;
3947 + }
3948 +
3949 + if(colorPreview.hasClass('pagelayer-elp-gradient-color3')){
3950 + i = 5;
3951 + }
3952 +
3953 + val[i] = '$'+globalID;
3954 + _pagelayer_set_atts(row, val);// Save and Render
3955 +
3956 + });
3957 +
2578 3958 }
2579 3959
3960 +function pagelayer_elp_font_family(row, prop){
3961 +
3962 + var options = '';
3963 + var option = function(val, lang, type){
3964 + var selected = (val != prop.c['val']) ? '' : 'selected="selected"';
3965 + var lang = pagelayer_empty(lang) ? 'Default' : lang;
3966 + return '<option class="pagelayer-elp-select-option" value="'+val+'" type="'+type+'" '+selected+'>'+lang+'</option>';
3967 + }
3968 +
3969 + for(y in pagelayer_fonts){
3970 + if(y != 'default'){
3971 + options += '<optgroup label="'+pagelayer_ucwords(y)+'">';
3972 + }
3973 + for (x in pagelayer_fonts[y]){
3974 + options += option((jQuery.isNumeric(x) ? pagelayer_fonts[y][x] : x), pagelayer_fonts[y][x], y);
3975 + }
3976 + }
3977 +
3978 + var div = '<div class="pagelayer-elp-select-div pagelayer-elp-pos-rel">'+
3979 + '<select class="pagelayer-elp-select pagelayer-select" name="'+prop.c['name']+'">'+options+'</select>'+
3980 + '</div>';
3981 +
3982 + row.append(div);
3983 +
3984 + row.find('select').on('change', function(){
3985 +
3986 + var sEle = jQuery(this);
3987 +
3988 + pagelayer_link_font_family(sEle);
3989 + _pagelayer_set_atts(row, sEle.val());// Save and Render
3990 +
3991 + });
3992 +
3993 +}
3994 +
2580 3995 // The typography property
2581 3996 function pagelayer_elp_typography(row, prop){
2582 3997
2583 - var val =['','','','','','','','','',''];
3998 + var val = pagelayer_parse_typo(prop.c['val'], true);
3999 + var is_typo = pagelayer_is_global_typo(prop.c['val']);
4000 + var global_active = '';
4001 + var save_timer = {};
2584 4002
2585 - // Do we have a val ?
2586 - if(!pagelayer_empty(prop.c['val'])){
2587 - val = prop.c['val'].split(',');
4003 + // Load value of tablet and mobile
4004 + var val_tablet = pagelayer_get_att(prop.el.$, prop.c['name']+'_tablet');
4005 + var val_mobile = pagelayer_get_att(prop.el.$, prop.c['name']+'_mobile');
4006 +
4007 + val_tablet = pagelayer_parse_typo(val_tablet);
4008 + val_mobile = pagelayer_parse_typo(val_mobile);
4009 +
4010 +
4011 + // If global color not exist
4012 + if(!pagelayer_empty(is_typo)){
4013 + global_active = 'pagelayer-active-global';
2588 4014 }
2589 4015
2590 - var select = { 'style' : ['', 'Normal', 'Italic', 'Oblique'],
2591 - 'weight' : ['', '100', '200', '300', '400', '500', '600', '700', '800', '900', 'normal', 'lighter', 'bold', 'bolder', 'unset'],
2592 - 'variant' : ['', 'Normal', 'Small-caps'],
2593 - 'deco-line' : ['', 'None', 'Overline', 'Line-through', 'Underline', 'Underline Overline'],
2594 - 'deco-style' : ['Solid', 'Double', 'Dotted', 'Dashed', 'Wavy'],
2595 - 'transform' : ['', 'Capitalize', 'Uppercase', 'Lowercase'],
2596 - 'fonts' : ['', 'ABeeZee', 'Abel', 'Abhaya Libre', 'Abril Fatface', 'Aclonica', 'Acme', 'Actor', 'Adamina', 'Advent Pro', 'Aguafina Script', 'Akronim', 'Aladin', 'Aldrich', 'Alef', 'Alegreya', 'Alegreya SC', 'Alegreya Sans', 'Alegreya Sans SC', 'Aleo', 'Alex Brush', 'Alfa Slab One', 'Alice', 'Alike', 'Alike Angular', 'Allan', 'Allerta', 'Allerta Stencil', 'Allura', 'Almendra', 'Almendra Display', 'Almendra SC', 'Amarante', 'Amaranth', 'Amatic SC', 'Amethysta', 'Amiko', 'Amiri', 'Amita', 'Anaheim', 'Andada', 'Andika', 'Angkor', 'Annie Use Your Telescope', 'Anonymous Pro', 'Antic', 'Antic Didone', 'Antic Slab', 'Anton', 'Arapey', 'Arbutus', 'Arbutus Slab', 'Architects Daughter', 'Archivo', 'Archivo Black', 'Archivo Narrow', 'Aref Ruqaa', 'Arima Madurai', 'Arimo', 'Arizonia', 'Armata', 'Arsenal', 'Artifika', 'Arvo', 'Arya', 'Asap', 'Asap Condensed', 'Asar', 'Asset', 'Assistant', 'Astloch', 'Asul', 'Athiti', 'Atma', 'Atomic Age', 'Aubrey', 'Audiowide', 'Autour One', 'Average', 'Average Sans', 'Averia Gruesa Libre', 'Averia Libre', 'Averia Sans Libre', 'Averia Serif Libre', 'B612', 'B612 Mono', 'Bad Script', 'Bahiana', 'Bai Jamjuree', 'Baloo', 'Baloo Bhai', 'Baloo Bhaijaan', 'Baloo Bhaina', 'Baloo Chettan', 'Baloo Da', 'Baloo Paaji', 'Baloo Tamma', 'Baloo Tammudu', 'Baloo Thambi', 'Balthazar', 'Bangers', 'Barlow', 'Barlow Condensed', 'Barlow Semi Condensed', 'Barrio', 'Basic', 'Battambang', 'Baumans', 'Bayon', 'Belgrano', 'Bellefair', 'Belleza', 'BenchNine', 'Bentham', 'Berkshire Swash', 'Bevan', 'Bigelow Rules', 'Bigshot One', 'Bilbo', 'Bilbo Swash Caps', 'BioRhyme', 'BioRhyme Expanded', 'Biryani', 'Bitter', 'Black And White Picture', 'Black Han Sans', 'Black Ops One', 'Bokor', 'Bonbon', 'Boogaloo', 'Bowlby One', 'Bowlby One SC', 'Brawler', 'Bree Serif', 'Bubblegum Sans', 'Bubbler One', 'Buda', 'Buenard', 'Bungee', 'Bungee Hairline', 'Bungee Inline', 'Bungee Outline', 'Bungee Shade', 'Butcherman', 'Butterfly Kids', 'Cabin', 'Cabin Condensed', 'Cabin Sketch', 'Caesar Dressing', 'Cagliostro', 'Cairo', 'Calligraffitti', 'Cambay', 'Cambo', 'Candal', 'Cantarell', 'Cantata One', 'Cantora One', 'Capriola', 'Cardo', 'Carme', 'Carrois Gothic', 'Carrois Gothic SC', 'Carter One', 'Catamaran', 'Caudex', 'Caveat', 'Caveat Brush', 'Cedarville Cursive', 'Ceviche One', 'Chakra Petch', 'Changa', 'Changa One', 'Chango', 'Charm', 'Charmonman', 'Chathura', 'Chau Philomene One', 'Chela One', 'Chelsea Market', 'Chenla', 'Cherry Cream Soda', 'Cherry Swash', 'Chewy', 'Chicle', 'Chivo', 'Chonburi', 'Cinzel', 'Cinzel Decorative', 'Clicker Script', 'Coda', 'Coda Caption', 'Codystar', 'Coiny', 'Combo', 'Comfortaa', 'Coming Soon', 'Concert One', 'Condiment', 'Content', 'Contrail One', 'Convergence', 'Cookie', 'Copse', 'Corben', 'Cormorant', 'Cormorant Garamond', 'Cormorant Infant', 'Cormorant SC', 'Cormorant Unicase', 'Cormorant Upright', 'Courgette', 'Cousine', 'Coustard', 'Covered By Your Grace', 'Crafty Girls', 'Creepster', 'Crete Round', 'Crimson Text', 'Croissant One', 'Crushed', 'Cuprum', 'Cute Font', 'Cutive', 'Cutive Mono', 'Damion', 'Dancing Script', 'Dangrek', 'David Libre', 'Dawning of a New Day', 'Days One', 'Dekko', 'Delius', 'Delius Swash Caps', 'Delius Unicase', 'Della Respira', 'Denk One', 'Devonshire', 'Dhurjati', 'Didact Gothic', 'Diplomata', 'Diplomata SC', 'Do Hyeon', 'Dokdo', 'Domine', 'Donegal One', 'Doppio One', 'Dorsa', 'Dosis', 'Dr Sugiyama', 'Duru Sans', 'Dynalight', 'EB Garamond', 'Eagle Lake', 'East Sea Dokdo', 'Eater', 'Economica', 'Eczar', 'El Messiri', 'Electrolize', 'Elsie', 'Elsie Swash Caps', 'Emblema One', 'Emilys Candy', 'Encode Sans', 'Encode Sans Condensed', 'Encode Sans Expanded', 'Encode Sans Semi Condensed', 'Encode Sans Semi Expanded', 'Engagement', 'Englebert', 'Enriqueta', 'Erica One', 'Esteban', 'Euphoria Script', 'Ewert', 'Exo', 'Exo 2', 'Expletus Sans', 'Fahkwang', 'Fanwood Text', 'Farsan', 'Fascinate', 'Fascinate Inline', 'Faster One', 'Fasthand', 'Fauna One', 'Faustina', 'Federant', 'Federo', 'Felipa', 'Fenix', 'Finger Paint', 'Fira Mono', 'Fira Sans', 'Fira Sans Condensed', 'Fira Sans Extra Condensed', 'Fjalla One', 'Fjord One', 'Flamenco', 'Flavors', 'Fondamento', 'Fontdiner Swanky', 'Forum', 'Francois One', 'Frank Ruhl Libre', 'Freckle Face', 'Fredericka the Great', 'Fredoka One', 'Freehand', 'Fresca', 'Frijole', 'Fruktur', 'Fugaz One', 'GFS Didot', 'GFS Neohellenic', 'Gabriela', 'Gaegu', 'Gafata', 'Galada', 'Galdeano', 'Galindo', 'Gamja Flower', 'Gentium Basic', 'Gentium Book Basic', 'Geo', 'Geostar', 'Geostar Fill', 'Germania One', 'Gidugu', 'Gilda Display', 'Give You Glory', 'Glass Antiqua', 'Glegoo', 'Gloria Hallelujah', 'Goblin One', 'Gochi Hand', 'Gorditas', 'Gothic A1', 'Goudy Bookletter 1911', 'Graduate', 'Grand Hotel', 'Gravitas One', 'Great Vibes', 'Griffy', 'Gruppo', 'Gudea', 'Gugi', 'Gurajada', 'Habibi', 'Halant', 'Hammersmith One', 'Hanalei', 'Hanalei Fill', 'Handlee', 'Hanuman', 'Happy Monkey', 'Harmattan', 'Headland One', 'Heebo', 'Henny Penny', 'Herr Von Muellerhoff', 'Hi Melody', 'Hind', 'Hind Guntur', 'Hind Madurai', 'Hind Siliguri', 'Hind Vadodara', 'Holtwood One SC', 'Homemade Apple', 'Homenaje', 'IBM Plex Mono', 'IBM Plex Sans', 'IBM Plex Sans Condensed', 'IBM Plex Serif', 'IM Fell DW Pica', 'IM Fell DW Pica SC', 'IM Fell Double Pica', 'IM Fell Double Pica SC', 'IM Fell English', 'IM Fell English SC', 'IM Fell French Canon', 'IM Fell French Canon SC', 'IM Fell Great Primer', 'IM Fell Great Primer SC', 'Iceberg', 'Iceland', 'Imprima', 'Inconsolata', 'Inder', 'Indie Flower', 'Inika', 'Inknut Antiqua', 'Irish Grover', 'Istok Web', 'Italiana', 'Italianno', 'Itim', 'Jacques Francois', 'Jacques Francois Shadow', 'Jaldi', 'Jim Nightshade', 'Jockey One', 'Jolly Lodger', 'Jomhuria', 'Josefin Sans', 'Josefin Slab', 'Joti One', 'Jua', 'Judson', 'Julee', 'Julius Sans One', 'Junge', 'Jura', 'Just Another Hand', 'Just Me Again Down Here', 'K2D', 'Kadwa', 'Kalam', 'Kameron', 'Kanit', 'Kantumruy', 'Karla', 'Karma', 'Katibeh', 'Kaushan Script', 'Kavivanar', 'Kavoon', 'Kdam Thmor', 'Keania One', 'Kelly Slab', 'Kenia', 'Khand', 'Khmer', 'Khula', 'Kirang Haerang', 'Kite One', 'Knewave', 'KoHo', 'Kodchasan', 'Kosugi', 'Kosugi Maru', 'Kotta One', 'Koulen', 'Kranky', 'Kreon', 'Kristi', 'Krona One', 'Krub', 'Kumar One', 'Kumar One Outline', 'Kurale', 'La Belle Aurore', 'Laila', 'Lakki Reddy', 'Lalezar', 'Lancelot', 'Lateef', 'Lato', 'League Script', 'Leckerli One', 'Ledger', 'Lekton', 'Lemon', 'Lemonada', 'Libre Barcode 128', 'Libre Barcode 128 Text', 'Libre Barcode 39', 'Libre Barcode 39 Extended', 'Libre Barcode 39 Extended Text', 'Libre Barcode 39 Text', 'Libre Baskerville', 'Libre Franklin', 'Life Savers', 'Lilita One', 'Lily Script One', 'Limelight', 'Linden Hill', 'Lobster', 'Lobster Two', 'Londrina Outline', 'Londrina Shadow', 'Londrina Sketch', 'Londrina Solid', 'Lora', 'Love Ya Like A Sister', 'Loved by the King', 'Lovers Quarrel', 'Luckiest Guy', 'Lusitana', 'Lustria', 'M PLUS 1p', 'M PLUS Rounded 1c', 'Macondo', 'Macondo Swash Caps', 'Mada', 'Magra', 'Maiden Orange', 'Maitree', 'Major Mono Display', 'Mako', 'Mali', 'Mallanna', 'Mandali', 'Manuale', 'Marcellus', 'Marcellus SC', 'Marck Script', 'Margarine', 'Markazi Text', 'Marko One', 'Marmelad', 'Martel', 'Martel Sans', 'Marvel', 'Mate', 'Mate SC', 'Maven Pro', 'McLaren', 'Meddon', 'MedievalSharp', 'Medula One', 'Meera Inimai', 'Megrim', 'Meie Script', 'Merienda', 'Merienda One', 'Merriweather', 'Merriweather Sans', 'Metal', 'Metal Mania', 'Metamorphous', 'Metrophobic', 'Michroma', 'Milonga', 'Miltonian', 'Miltonian Tattoo', 'Mina', 'Miniver', 'Miriam Libre', 'Mirza', 'Miss Fajardose', 'Mitr', 'Modak', 'Modern Antiqua', 'Mogra', 'Molengo', 'Molle', 'Monda', 'Monofett', 'Monoton', 'Monsieur La Doulaise', 'Montaga', 'Montez', 'Montserrat', 'Montserrat Alternates', 'Montserrat Subrayada', 'Moul', 'Moulpali', 'Mountains of Christmas', 'Mouse Memoirs', 'Mr Bedfort', 'Mr Dafoe', 'Mr De Haviland', 'Mrs Saint Delafield', 'Mrs Sheppards', 'Mukta', 'Mukta Mahee', 'Mukta Malar', 'Mukta Vaani', 'Muli', 'Mystery Quest', 'NTR', 'Nanum Brush Script', 'Nanum Gothic', 'Nanum Gothic Coding', 'Nanum Myeongjo', 'Nanum Pen Script', 'Neucha', 'Neuton', 'New Rocker', 'News Cycle', 'Niconne', 'Niramit', 'Nixie One', 'Nobile', 'Nokora', 'Norican', 'Nosifer', 'Notable', 'Nothing You Could Do', 'Noticia Text', 'Noto Sans', 'Noto Sans JP', 'Noto Sans KR', 'Noto Sans SC', 'Noto Sans TC', 'Noto Serif', 'Noto Serif JP', 'Noto Serif KR', 'Noto Serif SC', 'Noto Serif TC', 'Nova Cut', 'Nova Flat', 'Nova Mono', 'Nova Oval', 'Nova Round', 'Nova Script', 'Nova Slim', 'Nova Square', 'Numans', 'Nunito', 'Nunito Sans', 'Odor Mean Chey', 'Offside', 'Old Standard TT', 'Oldenburg', 'Oleo Script', 'Oleo Script Swash Caps', 'Open Sans', 'Open Sans Condensed', 'Oranienbaum', 'Orbitron', 'Oregano', 'Orienta', 'Original Surfer', 'Oswald', 'Over the Rainbow', 'Overlock', 'Overlock SC', 'Overpass', 'Overpass Mono', 'Ovo', 'Oxygen', 'Oxygen Mono', 'PT Mono', 'PT Sans', 'PT Sans Caption', 'PT Sans Narrow', 'PT Serif', 'PT Serif Caption', 'Pacifico', 'Padauk', 'Palanquin', 'Palanquin Dark', 'Pangolin', 'Paprika', 'Parisienne', 'Passero One', 'Passion One', 'Pathway Gothic One', 'Patrick Hand', 'Patrick Hand SC', 'Pattaya', 'Patua One', 'Pavanam', 'Paytone One', 'Peddana', 'Peralta', 'Permanent Marker', 'Petit Formal Script', 'Petrona', 'Philosopher', 'Piedra', 'Pinyon Script', 'Pirata One', 'Plaster', 'Play', 'Playball', 'Playfair Display', 'Playfair Display SC', 'Podkova', 'Poiret One', 'Poller One', 'Poly', 'Pompiere', 'Pontano Sans', 'Poor Story', 'Poppins', 'Port Lligat Sans', 'Port Lligat Slab', 'Pragati Narrow', 'Prata', 'Preahvihear', 'Press Start 2P', 'Pridi', 'Princess Sofia', 'Prociono', 'Prompt', 'Prosto One', 'Proza Libre', 'Puritan', 'Purple Purse', 'Quando', 'Quantico', 'Quattrocento', 'Quattrocento Sans', 'Questrial', 'Quicksand', 'Quintessential', 'Qwigley', 'Racing Sans One', 'Radley', 'Rajdhani', 'Rakkas', 'Raleway', 'Raleway Dots', 'Ramabhadra', 'Ramaraja', 'Rambla', 'Rammetto One', 'Ranchers', 'Rancho', 'Ranga', 'Rasa', 'Rationale', 'Ravi Prakash', 'Redressed', 'Reem Kufi', 'Reenie Beanie', 'Revalia', 'Rhodium Libre', 'Ribeye', 'Ribeye Marrow', 'Righteous', 'Risque', 'Roboto', 'Roboto Condensed', 'Roboto Mono', 'Roboto Slab', 'Rochester', 'Rock Salt', 'Rokkitt', 'Romanesco', 'Ropa Sans', 'Rosario', 'Rosarivo', 'Rouge Script', 'Rozha One', 'Rubik', 'Rubik Mono One', 'Ruda', 'Rufina', 'Ruge Boogie', 'Ruluko', 'Rum Raisin', 'Ruslan Display', 'Russo One', 'Ruthie', 'Rye', 'Sacramento', 'Sahitya', 'Sail', 'Saira', 'Saira Condensed', 'Saira Extra Condensed', 'Saira Semi Condensed', 'Salsa', 'Sanchez', 'Sancreek', 'Sansita', 'Sarabun', 'Sarala', 'Sarina', 'Sarpanch', 'Satisfy', 'Sawarabi Gothic', 'Sawarabi Mincho', 'Scada', 'Scheherazade', 'Schoolbell', 'Scope One', 'Seaweed Script', 'Secular One', 'Sedgwick Ave', 'Sedgwick Ave Display', 'Sevillana', 'Seymour One', 'Shadows Into Light', 'Shadows Into Light Two', 'Shanti', 'Share', 'Share Tech', 'Share Tech Mono', 'Shojumaru', 'Short Stack', 'Shrikhand', 'Siemreap', 'Sigmar One', 'Signika', 'Signika Negative', 'Simonetta', 'Sintony', 'Sirin Stencil', 'Six Caps', 'Skranji', 'Slabo 13px', 'Slabo 27px', 'Slackey', 'Smokum', 'Smythe', 'Sniglet', 'Snippet', 'Snowburst One', 'Sofadi One', 'Sofia', 'Song Myung', 'Sonsie One', 'Sorts Mill Goudy', 'Source Code Pro', 'Source Sans Pro', 'Source Serif Pro', 'Space Mono', 'Special Elite', 'Spectral', 'Spectral SC', 'Spicy Rice', 'Spinnaker', 'Spirax', 'Squada One', 'Sree Krushnadevaraya', 'Sriracha', 'Srisakdi', 'Staatliches', 'Stalemate', 'Stalinist One', 'Stardos Stencil', 'Stint Ultra Condensed', 'Stint Ultra Expanded', 'Stoke', 'Strait', 'Stylish', 'Sue Ellen Francisco', 'Suez One', 'Sumana', 'Sunflower', 'Sunshiney', 'Supermercado One', 'Sura', 'Suranna', 'Suravaram', 'Suwannaphum', 'Swanky and Moo Moo', 'Syncopate', 'Tajawal', 'Tangerine', 'Taprom', 'Tauri', 'Taviraj', 'Teko', 'Telex', 'Tenali Ramakrishna', 'Tenor Sans', 'Text Me One', 'Thasadith', 'The Girl Next Door', 'Tienne', 'Tillana', 'Timmana', 'Tinos', 'Titan One', 'Titillium Web', 'Trade Winds', 'Trirong', 'Trocchi', 'Trochut', 'Trykker', 'Tulpen One', 'Ubuntu', 'Ubuntu Condensed', 'Ubuntu Mono', 'Ultra', 'Uncial Antiqua', 'Underdog', 'Unica One', 'UnifrakturCook', 'UnifrakturMaguntia', 'Unkempt', 'Unlock', 'Unna', 'VT323', 'Vampiro One', 'Varela', 'Varela Round', 'Vast Shadow', 'Vesper Libre', 'Vibur', 'Vidaloka', 'Viga', 'Voces', 'Volkhov', 'Vollkorn', 'Vollkorn SC', 'Voltaire', 'Waiting for the Sunrise', 'Wallpoet', 'Walter Turncoat', 'Warnes', 'Wellfleet', 'Wendy One', 'Wire One', 'Work Sans', 'Yanone Kaffeesatz', 'Yantramanav', 'Yatra One', 'Yellowtail', 'Yeon Sung', 'Yeseva One', 'Yesteryear', 'Yrsa', 'ZCOOL KuaiLe', 'ZCOOL QingKe HuangYou', 'ZCOOL XiaoWei', 'Zeyada', 'Zilla Slab', 'Zilla Slab Highlight']
4016 + var select = {
4017 + 'style' : {'' : 'Default', 'normal' : 'Normal', 'italic' : 'Italic', 'oblique' : 'Oblique'},
4018 + 'weight' : {'' : 'Default', '100' : '100', '200' : '200', '300' : '300', '400' : '400', '500' : '500', '600' : '600', '700' : '700', '800' : '800', '900' : '900', 'normal' : 'Normal', 'lighter' : 'Lighter', 'bold' : 'Bold', 'bolder' :'Bolder', 'unset' : 'Unset'},
4019 + 'variant' : {'' : 'Default', 'normal' : 'Normal', 'small-caps' : 'Small Caps'},
4020 + 'deco-line' : {'' : 'Default', 'none' : 'None', 'overline' : 'Overline', 'line-through' : 'Line Through', 'underline' : 'Underline', 'underline overline' : 'Underline Overline'},
4021 + 'deco-style' : {'' : 'Default', 'solid' : 'Solid', 'double' : 'Double', 'dotted' : 'Dotted', 'dashed' : 'Dashed', 'wavy' : 'Wavy'},
4022 + 'transform' : {'' : 'Default', 'capitalize' : 'Capitalize', 'uppercase' : 'Uppercase', 'lowercase' : 'Lowercase'},
4023 + 'fonts' : pagelayer_fonts,
2597 4024 }
2598 4025
2599 - var option = function(val, setVal){
2600 - var selected = (val != setVal) ? '' : 'selected="selected"';
2601 - var lang = pagelayer_empty(val) ? 'Default' : val;
4026 + var option = function(val, lang, setVal){
4027 + var selected = (val.toLowerCase() != setVal.toLowerCase()) ? '' : 'selected="selected"';
4028 +
4029 + var lang = pagelayer_empty(lang) ? 'Default' : lang;
2602 4030 return '<option value="'+val+'" '+selected+'>'+ lang +'</option>';
2603 4031 }
2604 4032
2605 - var font_option = function(val, setVal){
4033 + var font_options = '';
4034 + var font_option = function(val, lang, type, setVal){
2606 4035 var selected = (val != setVal) ? '' : 'selected="selected"';
2607 - var lang = pagelayer_empty(val) ? 'Default' : val;
2608 - return '<span style="font-family:'+lang+'" value="'+val+'" '+selected+'>'+ lang +'</span>';
4036 + var lang = pagelayer_empty(lang) ? 'Default' : lang;
4037 + return '<option class="pagelayer-elp-typo-sele-op" value="'+val+'" type="'+type+'" '+selected+'>'+lang+'</option>';
2609 4038 }
4039 +
4040 + for(y in select['fonts']){
4041 + if(y != 'default'){
4042 + font_options += '<optgroup label="'+pagelayer_ucwords(y)+'">';
4043 + }
4044 + for (x in select['fonts'][y]){
4045 + font_options += font_option((jQuery.isNumeric(x) ? select['fonts'][y][x] : x), select['fonts'][y][x], y, val[0]);
4046 + }
4047 + }
2610 4048
2611 - var div = '<span class="pagelayer-prop-edit"><i class="pli pli-pencil"></i></span>'+
2612 - '<div class="pagelayer-elp-typo-div">'+
2613 - '<div class="pagelayer-elp-typo pagelayer-elp-typo-fonts">'+
2614 - '<label class="pagelayer-elp-label">Font-Family</label>'+
2615 - '<div class="pagelayer-elp-typo-sele" data-val="'+val[0]+'">'+val[0]+'</div>'+
2616 - '<div class="pagelayer-ele-type-sec">'+
2617 - '<input class="pagelayer-elp-typo-search" placeholder="Search here..."></input>'+
2618 - '<div class="pagelayer-elp-typo-container">';
4049 + var modes = {desktop: '', tablet: '_tablet', mobile: '_mobile'};
4050 + var mode = pagelayer_get_screen_mode();
4051 + var screen = '<div class="pagelayer-elp-screen">'+
4052 + '<i class="pli pli-desktop" ></i>'+
4053 + '<i class="pli pli-tablet" ></i>'+
4054 + '<i class="pli pli-mobile" ></i>'+
4055 + '<i class="pagelayer-prop-screen pli pli-'+mode+'" ></i>'+
4056 + '</div>';
2619 4057
2620 - jQuery.each(select['fonts'],function(key, value){
2621 - div += font_option(value, val[0]);
2622 - });
2623 - div +='</div></div>'+
4058 + var div = '<span class="pagelayer-elp-typo-edit-div">'+
4059 + '<i class="pli pli-pencil"></i>'+
4060 + '</span>'+
4061 + '<div class="pagelayer-elp-typo-div" pagelayer-screen-mode="'+mode+'">'+
4062 + '<div class="pagelayer-elp-typo-fonts">'+
4063 + '<div class="pagelayer-elp-global-typo">'+
4064 + '<label class="pagelayer-elp-label">'+pagelayer_l('global_fonts')+'</label>'+
4065 + '<span class="pagelayer-elp-typo-icons">'+
4066 + '<span class="pagelayer-elp-global-icon '+global_active+'"></span>'+
4067 + '<span class="pli pli-service"></span>'+
4068 + '</span>'+
4069 + '<div class="pagelayer-global-font-list">';
4070 +
4071 + for( cid in pagelayer_global_fonts ){
4072 +
4073 + var font = pagelayer_global_fonts[cid];
4074 +
4075 + div += '<div class="pagelayer-global-font-list-item" data-global-id="'+ cid +'">'+
4076 + '<span class="pagelayer-global-font-title">'+font['title']+'</span>'+
4077 + '</div>';
4078 + }
4079 + div += '</div>'+
4080 + '</div>'+
4081 + '<div class="pagelayer-elp-typo pagelayer-elp-typo-family">'+
4082 + '<label class="pagelayer-elp-label">'+pagelayer_l('font_family')+'</label>'+
4083 + '<select class="pagelayer-elp-typo-input pagelayer-elp-select" name="font-family">'+font_options+'</select>'+
4084 + '</div>';
4085 +
4086 + div += '<div class="pagelayer-elp-typo pagelayer-elp-typo-size">'+
4087 + '<label class="pagelayer-elp-label">'+pagelayer_l('font_size')+' '+screen+'</label>'+
4088 + '<input name="font-size" pagelayer-show-device="desktop" class="pagelayer-elp-typo-input" type="number" max="200" min="0" step="1" value="'+val[1]+'"></input>'+
4089 + '<input name="font-size_tablet" pagelayer-show-device="tablet" class="pagelayer-elp-typo-input" type="number" max="200" min="0" step="1" value="'+val_tablet[1]+'"></input>'+
4090 + '<input name="font-size_mobile" pagelayer-show-device="mobile" class="pagelayer-elp-typo-input" type="number" max="200" min="0" step="1" value="'+val_mobile[1]+'"></input>'+
2624 4091 '</div>'+
2625 - '<div class="pagelayer-elp-typo pagelayer-elp-typo-size">'+
2626 - '<label class="pagelayer-elp-label">Font-Size</label>'+
2627 - '<input class="pagelayer-elp-typo-input" type="number" max="200" min="0" step="1" value="'+val[1]+'"></input>'+
2628 - '</div>'+
2629 4092 '<div class="pagelayer-elp-typo pagelayer-elp-typo-style">'+
2630 - '<label class="pagelayer-elp-label">Font-Style</label>'+
2631 - '<select class="pagelayer-elp-typo-input">';
4093 + '<label class="pagelayer-elp-label">'+pagelayer_l('font_style')+'</label>'+
4094 + '<select name="font-style" class="pagelayer-elp-typo-input pagelayer-elp-select">';
2632 4095
2633 4096 jQuery.each(select['style'],function(key, value){
2634 - div += option(value, val[2]);
4097 + div += option(key, value, val[2]);
2635 4098 });
2636 4099 div +='</select>'+
2637 4100 '</div>'+
2638 4101 '<div class="pagelayer-elp-typo pagelayer-elp-typo-weight">'+
2639 - '<label class="pagelayer-elp-label">Font-Weight</label>'+
2640 - '<select class="pagelayer-elp-typo-input">';
4102 + '<label class="pagelayer-elp-label">'+pagelayer_l('font_weight')+' '+screen+'</label>'+
4103 + '<select name="font-weight" pagelayer-show-device="desktop" class="pagelayer-elp-typo-input pagelayer-elp-select">';
2641 4104 jQuery.each(select['weight'],function(key, value){
2642 - div += option(value, val[3]);
4105 + div += option(key, value, val[3]);
2643 4106 });
2644 4107
2645 4108 div += '</select>'+
4109 + '<select name="font-weight_tablet" pagelayer-show-device="tablet" class="pagelayer-elp-typo-input pagelayer-elp-select">';
4110 + jQuery.each(select['weight'],function(key, value){
4111 + div += option(key, value, val_tablet[3]);
4112 + });
4113 +
4114 + div += '</select>'+
4115 + '<select name="font-weight_mobile" pagelayer-show-device="mobile" class="pagelayer-elp-typo-input pagelayer-elp-select">';
4116 + jQuery.each(select['weight'],function(key, value){
4117 + div += option(key, value, val_mobile[3]);
4118 + });
4119 +
4120 + div += '</select>'+
2646 4121 '</div>'+
2647 4122 '<div class="pagelayer-elp-typo pagelayer-elp-typo-variant">'+
2648 - '<label class="pagelayer-elp-label">Font-variant</label>'+
2649 - '<select class="pagelayer-elp-typo-input">';
4123 + '<label class="pagelayer-elp-label">'+pagelayer_l('font_variant')+'</label>'+
4124 + '<select name="font-variant" class="pagelayer-elp-typo-input pagelayer-elp-select">';
2650 4125 jQuery.each(select['variant'],function(key, value){
2651 - div += option(value, val[4]);
4126 + div += option(key, value, val[4]);
2652 4127 });
2653 4128
2654 4129 div += '</select>'+
2655 4130 '</div>'+
2656 4131 '<div class="pagelayer-elp-typo pagelayer-elp-typo-deco-line">'+
2657 - '<label class="pagelayer-elp-label">Decoration Line</label>'+
2658 - '<select class="pagelayer-elp-typo-input">';
4132 + '<label class="pagelayer-elp-label">'+pagelayer_l('decoration_line')+'</label>'+
4133 + '<select name="text-decoration-line" class="pagelayer-elp-typo-input pagelayer-elp-select">';
2659 4134 jQuery.each(select['deco-line'],function(key, value){
2660 - div += option(value, val[5]);
4135 + div += option(key, value, val[5]);
2661 4136 });
2662 4137
2663 4138 div += '</select>'+
2664 4139 '</div>'+
2665 4140 '<div class="pagelayer-elp-typo pagelayer-elp-typo-deco-style">'+
2666 - '<label class="pagelayer-elp-label">Decoration Style</label>'+
2667 - '<select class="pagelayer-elp-typo-input">';
4141 + '<label class="pagelayer-elp-label">'+pagelayer_l('decoration_style')+'</label>'+
4142 + '<select name="text-decoration-style" class="pagelayer-elp-typo-input pagelayer-elp-select">';
2668 4143 jQuery.each(select['deco-style'],function(key, value){
2669 - div += option(value, val[6]);
4144 + div += option(key, value, val[6]);
2670 4145 });
2671 4146
2672 4147 div += '</select>'+
2673 4148 '</div>'+
2674 4149 '<div class="pagelayer-elp-typo pagelayer-elp-typo-height">'+
2675 - '<label class="pagelayer-elp-label">Line Height</label>'+
2676 - '<input class="pagelayer-elp-typo-input" type="number" max="15" min="0" step="0.1" value="'+val[7]+'"></input>'+
4150 + '<label class="pagelayer-elp-label">'+pagelayer_l('line_height')+' '+screen+'</label>'+
4151 + '<input name="line-height" class="pagelayer-elp-typo-input" pagelayer-show-device="desktop" type="number" max="15" min="0" step="0.1" value="'+val[7]+'"></input>'+
4152 + '<input name="line-height_tablet" pagelayer-show-device="tablet" class="pagelayer-elp-typo-input" type="number" max="15" min="0" step="0.1" value="'+val_tablet[7]+'"</input>'+
4153 + '<input name="line-height_mobile" class="pagelayer-elp-typo-input" pagelayer-show-device="mobile" type="number" max="15" min="0" step="0.1" value="'+val_mobile[7]+'"></input>'+
2677 4154 '</div>'+
2678 4155 '<div class="pagelayer-elp-typo pagelayer-elp-typo-transform">'+
2679 - '<label class="pagelayer-elp-label">Text Transform</label>'+
2680 - '<select class="pagelayer-elp-typo-input">';
4156 + '<label class="pagelayer-elp-label">'+pagelayer_l('text_transform')+'</label>'+
4157 + '<select name="text-transform" class="pagelayer-elp-typo-input pagelayer-elp-select">';
2681 4158 jQuery.each(select['transform'],function(key, value){
2682 - div += option(value, val[8]);
4159 + div += option(key, value, val[8]);
2683 4160 });
2684 4161
2685 4162 div += '</select>'+
2686 4163 '</div>'+
2687 4164 '<div class="pagelayer-elp-typo pagelayer-elp-typo-lspacing">'+
2688 - '<label class="pagelayer-elp-label">Letter Spacing</label>'+
2689 - '<input class="pagelayer-elp-typo-input" type="number" max="10" min="-10" step="0.1" value="'+val[9]+'"></input>'+
4165 + '<label class="pagelayer-elp-label">'+pagelayer_l('text_spacing')+' '+screen+'</label>'+
4166 + '<input name="letter-spacing" pagelayer-show-device="desktop" class="pagelayer-elp-typo-input" type="number" max="10" min="-10" step="0.1" value="'+val[9]+'"></input>'+
4167 + '<input name="letter-spacing_tablet" pagelayer-show-device="tablet" class="pagelayer-elp-typo-input" type="number" max="10" min="-10" step="0.1" value="'+val_tablet[9]+'"></input>'+
4168 + '<input name="letter-spacing_mobile" pagelayer-show-device="mobile" class="pagelayer-elp-typo-input" type="number" max="10" min="-10" step="0.1" value="'+val_mobile[9]+'"></input>'+
2690 4169 '</div>'+
2691 4170 '<div class="pagelayer-elp-typo pagelayer-elp-typo-wspacing">'+
2692 - '<label class="pagelayer-elp-label">Word Spacing</label>'+
2693 - '<input class="pagelayer-elp-typo-input" type="number" max="50" min="0" step="1" value="'+val[10]+'"></input>'+
4171 + '<label class="pagelayer-elp-label">'+pagelayer_l('word_spacing')+' '+screen+'</label>'+
4172 + '<input name="word-spacing" pagelayer-show-device="desktop" class="pagelayer-elp-typo-input" type="number" max="50" min="0" step="1" value="'+val[10]+'"></input>'+
4173 + '<input name="word-spacing_tablet" pagelayer-show-device="tablet" class="pagelayer-elp-typo-input" type="number" max="50" min="0" step="1" value="'+val_tablet[10]+'"></input>'+
4174 + '<input name="word-spacing_mobile" pagelayer-show-device="mobile" class="pagelayer-elp-typo-input" type="number" max="50" min="0" step="1" value="'+val_mobile[10]+'"></input>'+
2694 4175 '</div>'+
4176 + '</div>'+
2695 4177 '</div>';
2696 4178
2697 4179 row.append(div);
2698 4180
@@ -2699,83 +4181,226 @@
2699 4181 if(pagelayer_empty(val[5]) || val[5]=='none'){
2700 4182 row.find('.pagelayer-elp-typo-deco-style').hide();
2701 4183 }
2702 4184
2703 - row.find('.pagelayer-prop-edit').on('click', function(){
2704 - row.find('.pagelayer-elp-typo-div').toggleClass('pagelayer-prop-show');
4185 + row.find('.pagelayer-elp-typo-edit-div .pli-pencil').on('click', function(){
4186 + row.find('.pagelayer-elp-typo-div').toggleClass('pagelayer-prop-show');
2705 4187 });
2706 4188
2707 - row.find('.pagelayer-elp-typo-sele').on('click', function(){
2708 - row.find('.pagelayer-ele-type-sec').slideToggle();
2709 - });
4189 + var save_typography = function(){
4190 + var globalEle = row.find('.pagelayer-global-selected');
4191 + var atts = {};
4192 +
4193 + atts[prop.c['name']] = {};
4194 + atts[prop.c['name']+'_tablet'] = {};
4195 + atts[prop.c['name']+'_mobile'] = {};
4196 +
4197 + if(globalEle.length > 0){
4198 + atts[prop.c['name']]['global-font'] = globalEle.attr('data-global-id');
4199 + }
4200 +
4201 + row.find('.pagelayer-elp-typo-input').each(function(){
4202 +
4203 + var iEle = jQuery(this);
4204 + var name = iEle.attr('name');
4205 + var value = iEle.val();
4206 + var isGlobal = iEle.closest('[pagelayer-set-global]');
4207 +
4208 + if((value == '' && isGlobal.length < 1 && globalEle.length < 1) || isGlobal.length > 0){
4209 + return;
4210 + }
4211 +
4212 + if(name.indexOf('_tablet') > -1){
4213 + name = name.replace('_tablet', '');
4214 + atts[prop.c['name']+'_tablet'][name] = value;
4215 + return;
4216 + }
4217 +
4218 + if(name.indexOf('_mobile') > -1){
4219 + name = name.replace('_mobile', '');
4220 + atts[prop.c['name']+'_mobile'][name] = value;
4221 + return;
4222 + }
4223 +
4224 + atts[prop.c['name']][name] = value;
4225 + });
4226 +
4227 + pagelayer_set_atts(prop.el.$, atts);
4228 + pagelayer_sc_render(prop.el.$); // Render
4229 + }
2710 4230
2711 - row.find('.pagelayer-elp-typo-container').on('click', function(e){
4231 + row.find('.pagelayer-elp-typo-input').on('change', function(e){
4232 +
2712 4233 var jEle = jQuery(e.target);
2713 - var set_val = jEle.attr('value');
2714 - row.find('.pagelayer-elp-typo-sele').data('val',set_val).html(set_val);
2715 - row.find('.pagelayer-ele-type-sec').slideUp();
2716 - val = [];
2717 - val[0] = set_val;
2718 - row.find('.pagelayer-elp-typo-input').each(function(){
2719 - var value = jQuery(this).val();
2720 - val.push(value ? value : '');
2721 - });
2722 - _pagelayer_set_atts(row, val);
4234 +
4235 + pagelayer_link_font_family(jEle);
4236 + jEle.closest('[pagelayer-set-global]').removeAttr('pagelayer-set-global');
4237 +
4238 + // Save value
4239 + save_typography();
2723 4240 });
2724 4241
2725 - row.find('.pagelayer-elp-typo-search').on('input', function(){
2726 - var val = jQuery(this).val().toLowerCase();
2727 - //console.log(val);
2728 - var html = '';
2729 - jQuery.each(select['fonts'],function(key, value){
2730 - //value = value.toLowerCase();
2731 - if(value.toLowerCase().includes(val)){
2732 - html += font_option(value, val[0]);
2733 - }
2734 - });
2735 - row.find('.pagelayer-elp-typo-container').html(html);
4242 + row.find('.pagelayer-elp-typo-deco-line select').on('change', function(){
4243 + var value = jQuery(this).val();
4244 + if(pagelayer_empty(value) || value=='none'){
4245 + row.find('.pagelayer-elp-typo-deco-style').hide();
4246 + }else{
4247 + row.find('.pagelayer-elp-typo-deco-style').show();
4248 + }
4249 + });
2736 4250
4251 + // Handle for global font
4252 + row.find('.pagelayer-elp-global-typo .pagelayer-elp-global-icon').on('click', function(e){
4253 + e.stopPropagation();
4254 + row.find('.pagelayer-global-font-list').slideToggle();
4255 +
2737 4256 });
2738 4257
4258 + row.find('.pagelayer-elp-global-typo .pli-service').on('click', function(e){
4259 + e.stopPropagation();
4260 + window.open(pagelayer_customizer_url+'&autofocus%5Bsection%5D=pagelayer_global_fonts_sec', '_blank');
4261 + });
2739 4262
2740 - row.find('.pagelayer-elp-typo-input').on('change', function(){
2741 - val = [];
2742 - val[0] = row.find('.pagelayer-elp-typo-sele').data('val');
2743 - row.find('.pagelayer-elp-typo-input').each(function(){
2744 - var value = jQuery(this).val();
2745 - val.push(value ? value : '');
2746 - });
2747 - _pagelayer_set_atts(row, val);
4263 + // Added restore global val
4264 + row.find('.pagelayer-elp-typo > .pagelayer-elp-label').each(function(){
4265 + var label = jQuery(this);
4266 + var defaultButton = '<span class="pagelayer-typo-default" title="'+pagelayer_l('restore_global')+'" ><i class="fas fa-undo"></i></span>';
4267 + label.append(defaultButton);
4268 +
4269 + label.find('.pagelayer-typo-default').on('click', function(e, skip_save){
4270 +
4271 + skip_save = skip_save || false;
4272 +
4273 + var globalID = row.find('.pagelayer-global-selected').data('global-id');
4274 +
4275 + if(pagelayer_empty(globalID) || pagelayer_empty(pagelayer_global_fonts[globalID])){
4276 + return;
4277 + }
4278 +
4279 + var setFonts = pagelayer_global_fonts[globalID]['value'];
4280 + var holder = label.closest('.pagelayer-elp-typo');
4281 + var inputs = holder.find('.pagelayer-elp-typo-input');
4282 + var name = inputs.first().attr('name');
4283 + var val = '';
4284 +
4285 + holder.attr('pagelayer-set-global', 1);
4286 +
4287 + if(name in setFonts){
4288 + val = setFonts[name];
4289 + }
4290 +
4291 + if(typeof val == 'object'){
4292 + for(var mode in modes){
4293 + var _val = '';
4294 + if(mode in val){
4295 + _val = val[mode];
4296 + }
4297 +
4298 + holder.find('.pagelayer-elp-typo-input[name="'+name+modes[mode]+'"]').val(_val);
4299 + }
4300 + }else{
4301 +
4302 + if(inputs.length > 1){
4303 + inputs.val('');
4304 + }
4305 +
4306 + inputs.first().val(val);
4307 + }
4308 +
4309 + if(skip_save){
4310 + return;
4311 + }
4312 +
4313 + // save value
4314 + clearTimeout(save_timer);
4315 + save_timer = setTimeout(save_typography, 200);
4316 +
4317 + });
2748 4318 });
2749 4319
2750 - row.find('.pagelayer-elp-typo-container').on('click', function(e){
2751 - var jEle = jQuery(e.target);
2752 - var value = jEle.attr('value');
2753 - value = value.replace(' ', '+');
4320 + // Handle for global font
4321 + row.find('.pagelayer-global-font-list-item').on('click', function(e){
4322 + e.stopPropagation();
2754 4323
2755 - if(jQuery('#pagelayer-google-fonts').length == 0){
4324 + var listItem = jQuery(this);
4325 + var fontSelect = row.find('.pagelayer-elp-typo-family .pagelayer-elp-typo-input');
4326 +
4327 + // Remove global typo
4328 + if(listItem.hasClass('pagelayer-global-selected')){
4329 + row.find('.pagelayer-global-selected').removeClass('pagelayer-global-selected');
4330 + row.find('.pagelayer-elp-global-icon').removeClass('pagelayer-active-global');
4331 + row.find('[pagelayer-set-global]').removeAttr('pagelayer-set-global');
4332 + row.find('.pagelayer-global-on').removeClass('pagelayer-global-on');
2756 4333
2757 - jQuery('head').append('<link id="pagelayer-google-fonts" href="https://fonts.googleapis.com/css?family='+value+':100,100i,200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i" rel="stylesheet">');
4334 + // To save and render the typo
4335 + fontSelect.trigger('change');
4336 + return;
4337 + }
4338 +
4339 + var globalID = listItem.data('global-id');
4340 + var listHolder = row.find('.pagelayer-global-font-list');
4341 +
4342 + // Remove previous selecttion
4343 + listHolder.find('.pagelayer-global-selected').removeClass('pagelayer-global-selected');
4344 + listItem.addClass('pagelayer-global-selected');
4345 + row.find('.pagelayer-elp-global-icon').addClass('pagelayer-active-global');
4346 + row.find('.pagelayer-elp-typo-fonts').addClass('pagelayer-global-on');
4347 + listHolder.slideUp();
4348 +
4349 + pagelayer_link_font_family(fontSelect); // Apply google fonts
4350 +
4351 + // Set global value to all fields and save
4352 + row.find('.pagelayer-elp-label .pagelayer-typo-default').click();
4353 + });
4354 +
4355 + // Active global typography
4356 + if(!pagelayer_empty(is_typo)){
4357 + row.find('[data-global-id="'+is_typo+'"]').addClass('pagelayer-global-selected');
4358 + row.find('.pagelayer-elp-global-icon').addClass('pagelayer-active-global');
4359 + row.find('.pagelayer-elp-typo-fonts').addClass('pagelayer-global-on');
4360 +
4361 + // Show the global values if is not customize
4362 + row.find('.pagelayer-elp-typo').attr('pagelayer-set-global', 1);
4363 + row.find('.pagelayer-elp-typo').find('select, input').each(function(){
4364 + var sEle = jQuery(this);
4365 + var val = sEle.val();
2758 4366
2759 - }else{
2760 -
2761 - var url = jQuery('#pagelayer-google-fonts').attr('href');
2762 - if(url.indexOf(value) == -1){
2763 - url = url+'|'+value+':100,100i,200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i';
2764 - jQuery('#pagelayer-google-fonts').attr('href', url);
4367 + if(pagelayer_empty(val)){
4368 + return true;
2765 4369 }
2766 4370
4371 + sEle.closest('.pagelayer-elp-typo').removeAttr('pagelayer-set-global');
4372 + });
4373 +
4374 + row.find('[pagelayer-set-global="1"] .pagelayer-typo-default').trigger('click', [true]);
4375 + }
4376 +
4377 + // Set screen mode on change
4378 + row.find('.pagelayer-elp-screen .pli:not(.pagelayer-prop-screen)').on('click', function(){
4379 + var mode = 'desktop';
4380 + var jEle = jQuery(this);
4381 +
4382 + // Tablet ?
4383 + if(jEle.hasClass('pli-tablet')){
4384 + mode = 'tablet';
2767 4385 }
4386 +
4387 + // Mobile ?
4388 + if(jEle.hasClass('pli-mobile')){
4389 + mode = 'mobile';
4390 + }
4391 +
4392 + pagelayer_set_screen_mode(mode);
4393 + row.find('.pagelayer-elp-screen .pli').removeClass('open');
4394 + });
2768 4395
4396 + row.find('.pagelayer-elp-screen').on('pagelayer-screen-changed', function(e){
4397 + var mode = pagelayer_get_screen_mode();
4398 + row.find('[pagelayer-screen-mode]').attr('pagelayer-screen-mode', mode);
2769 4399 });
2770 4400
2771 - row.find('.pagelayer-elp-typo-deco-line select').on('change', function(){
2772 - var value = jQuery(this).val();
2773 - if(pagelayer_empty(value) || value=='none'){
2774 - row.find('.pagelayer-elp-typo-deco-style').hide();
2775 - }else{
2776 - row.find('.pagelayer-elp-typo-deco-style').show();
2777 - }
4401 + row.find('.pagelayer-elp-screen .pagelayer-prop-screen').on('click', function(e){
4402 + jQuery(this).siblings().toggleClass('open');
2778 4403 });
2779 4404
2780 4405 }
2781 4406
@@ -2783,17 +4408,22 @@
2783 4408 function pagelayer_elp_dimension(row, prop){
2784 4409
2785 4410 var val = ['', ''];
2786 4411
2787 - if(prop.c['val'].length > 0){
2788 - val = prop.c['val'].split(',');
2789 - //console.log(val)
4412 + if(!pagelayer_empty(prop.c['val'])){
4413 +
4414 + val = prop.c['val'];
4415 + if(pagelayer_is_string(val)){
4416 + val = val.split(',');
4417 + //console.log(val);
4418 + }
4419 +
2790 4420 }
2791 4421
2792 4422 var div = '<div class="pagelayer-elp-dimension-div">'+
2793 4423 '<input type="number" class="pagelayer-elp-dimension" value="'+parseFloat(val[0])+'"></input>'+
2794 4424 '<input type="number" class="pagelayer-elp-dimension" value="'+parseFloat(val[1])+'"></input>'+
2795 - '<i class="pli pli-link" />'+
4425 + '<i class="pli pli-link" ></i>'+
2796 4426 '</div>';
2797 4427
2798 4428 row.append(div);
2799 4429
@@ -2854,8 +4484,762 @@
2854 4484 });
2855 4485
2856 4486 };
2857 4487
4488 +var first_time_cat = true;
4489 +// Post Category property
4490 +function pagelayer_elp_postCategory(row, prop){
4491 +
4492 + if(pagelayer_empty(pagelayer_post_categories)){
4493 + return;
4494 + }
4495 +
4496 + // Placing the checked categories on the top.
4497 + var checked_on_top = function(with_checkbox){
4498 + var checked_list = '';
4499 + var unchecked_list = '';
4500 +
4501 + jQuery(with_checkbox).children().each(function(){
4502 + var list = this;
4503 + var temp = jQuery(list).find('input[checked=checked]');
4504 +
4505 + if(!pagelayer_empty(temp.length)){
4506 + checked_list += list.outerHTML;
4507 + }else{
4508 + unchecked_list += list.outerHTML;
4509 + }
4510 +
4511 + });
4512 +
4513 + return ('<div class="pagelayer-post-cat-div" ><ul class="pagelayer-post-category" >'+checked_list+unchecked_list+'</ul></div>');
4514 + }
4515 +
4516 + // Getting checked and unchecked categories on opening of page props settings.
4517 + if(first_time_cat == false){
4518 +
4519 + var $div = jQuery('<div>').html(pagelayer_post_categories.with_checkbox);
4520 + $div.find('input[type=checkbox]').attr('checked', false);
4521 +
4522 + if(!pagelayer_empty(prop.c['val'])){
4523 +
4524 + var check_val = prop.c['val'];
4525 + if(pagelayer_is_string(check_val)){
4526 + check_val = check_val.split(',');
4527 + }
4528 +
4529 + for(var no in check_val){
4530 + $div.find('input[type=checkbox][value='+check_val[no]+']').attr('checked', true);
4531 + }
4532 + }
4533 +
4534 + pagelayer_post_categories.with_checkbox = $div.html();
4535 +
4536 + }
4537 +
4538 + first_time_cat = false;
4539 +
4540 + // For making insert new categories functionality.
4541 + row.append(checked_on_top(pagelayer_post_categories.with_checkbox));
4542 +
4543 + var div = '<div class="pagelayer-elp-postCategory">'+
4544 + '<span class="pagelayer-add-cat-btn">Add New Category</span>'+
4545 + '<form style="display:none;">'+
4546 + '<div>'+
4547 + '<label>New Category Name</label>'+
4548 + '<input type="text" name="category_name" required>'+
4549 + '</div>'+
4550 + '<div>'+
4551 + '<label>Parent Category</label>'+
4552 + '<div class="pagelayer-parent-category"></div>'+
4553 + '</div>'+
4554 + '<button type="submit" class="pagelayer-cat-submit" >Add New Category</button>'+
4555 + '</form>'+
4556 + '</div>';
4557 +
4558 + row.append(div);
4559 +
4560 + // For making categories drop down options and adding an empty option.
4561 + if(!pagelayer_empty(pagelayer_post_categories.without_checkbox)){
4562 + var options = pagelayer_post_categories.without_checkbox.replace('>', '><option class="level-0" value="0">--No Parent--</option>');
4563 + var options = jQuery(options);
4564 + row.find('.pagelayer-parent-category').append(options);
4565 + }
4566 +
4567 + // For initiating ajax call when user create new category
4568 + row.find('form').on('submit', function(e){
4569 + e.preventDefault();
4570 + jQuery.ajax({
4571 + type: 'post',
4572 + url: pagelayer_ajax_url+'&action=pagelayer_get_cat_checkboxes',
4573 + dataType: 'json',
4574 + data: {
4575 + pagelayer_nonce: pagelayer_ajax_nonce,
4576 + 'postid': pagelayer_postID,
4577 + 'new_cat': row.find('form').serialize()
4578 + },
4579 + success: function(obj){
4580 +
4581 + if(pagelayer_empty(obj)){
4582 + return;
4583 + }
4584 +
4585 + if('error' in obj){
4586 + alert(obj.error);
4587 + }
4588 +
4589 + if(!pagelayer_empty(obj.new_cat_id)){
4590 + obj.with_checkbox = obj.with_checkbox.replace('value="'+obj.new_cat_id+'"', 'value="'+obj.new_cat_id+'" checked="checked"');
4591 + }
4592 +
4593 + var new_cat_elem = jQuery(obj.with_checkbox).find('input[value='+obj.new_cat_id+']').closest('li');
4594 + var post_cat = row.find('.pagelayer-post-category');
4595 +
4596 + // Does the new element have no parents ? Then prepend the <LI> to the existing list shown
4597 + if(!pagelayer_empty(new_cat_elem.parent('.pagelayer-post-category').length)){
4598 + post_cat.prepend(new_cat_elem);
4599 + }else{
4600 +
4601 + // Siblings are already there ?
4602 + if(!pagelayer_empty(new_cat_elem.siblings().length)){
4603 + post_cat.find('#'+new_cat_elem.parent().parent('li').attr('id')).children('ul').append(new_cat_elem);
4604 + // No siblings, hence append
4605 + }else{
4606 + new_cat_elem = new_cat_elem.parent();
4607 + post_cat.find('#'+new_cat_elem.closest('li').attr('id')).append(new_cat_elem);
4608 + }
4609 +
4610 + post_cat.prepend(new_cat_elem.parentsUntil('.pagelayer-post-category').last());
4611 + }
4612 +
4613 + row.find('#pagelayer_cat_parent').replaceWith(obj.without_checkbox.replace('>', '><option class="level-0" value="0">--No Parent--</option>'));
4614 +
4615 + row.find('input[name="category_name"]').val('');
4616 + row.find('#pagelayer_cat_parent option[value="0"]').attr('selected', true);
4617 + checked_cat(row.find('.pagelayer-post-cat-div'));
4618 + event_function();
4619 + pagelayer_post_categories = obj;
4620 + }
4621 + });
4622 + });
4623 +
4624 + // Show and hide 'Add new Category' button.
4625 + row.find('.pagelayer-add-cat-btn').on('click', function(){
4626 + row.find('form').toggle('fast');
4627 + });
4628 +
4629 + var checked_cat = function(elem){
4630 + var jEle = elem.find('input:checked');
4631 + var cat_array = [];
4632 + for(var checked_input of jEle){
4633 + cat_array.push(jQuery(checked_input).attr('value'));
4634 + }
4635 + _pagelayer_set_atts(row, cat_array);
4636 + };
4637 +
4638 + var event_function = function(){row.find('.pagelayer-post-cat-div').on('change', function(){
4639 + checked_cat(jQuery(this));
4640 + });
4641 + };
4642 + event_function();
4643 +}
4644 +
4645 +var first_time_tag = true;
4646 +// Post tags property
4647 +function pagelayer_elp_postTags(row, prop){
4648 +
4649 + if(pagelayer_empty(pagelayer_post_tags)){
4650 + return;
4651 + }
4652 +
4653 + var div = '<div class="pagelayer-elp-postTags" >'+
4654 + '<div class="pagelayer-post-tags" >'+
4655 + '<input type="text" autocomplete="off" class="pagelayer-elp-postTags-inp" autofocus="autofocus"/>'+
4656 + '<ul class="pagelayer-postTags-list" >'+
4657 + '</ul>'+
4658 + '</div>'+
4659 + '</div>';
4660 +
4661 + row.append(div);
4662 +
4663 + // Single tag html
4664 + var singleTag = function(tags){
4665 + var html = '';
4666 + jQuery.each(tags, function(index, value){
4667 + if(pagelayer_empty(value['term_id'])){
4668 + return;
4669 + }
4670 + html += '<span class="pagelayer-elp-tags-ele" data-val="'+value['term_id']+'"><span class="pagelayer-tags-label" >'+value['name']+'</span><span class="pagelayer-elp-tags-remove"><i class="fas fa-times"></i></span></span>';
4671 + });
4672 + return html;
4673 + }
4674 +
4675 + // Single list item html
4676 + var singleLi= function(tags){
4677 + var html = '';
4678 + jQuery.each(tags, function(index, value){
4679 + html += '<li data-val="'+value['term_id']+'">'+value['name']+'</li>';
4680 + });
4681 + return html;
4682 + }
4683 +
4684 + // For making new tags as well as removing using keyboard inputs.
4685 + var keypresses = function(obj){
4686 + row.find('.pagelayer-elp-postTags-inp').on('keydown', function(e){
4687 + var val = e.target.value.trim();
4688 + var keycode = (event.keyCode ? event.keyCode : event.which);
4689 +
4690 + if(keycode == '13' || keycode == '188'){
4691 +
4692 + for(var tag of obj.allTags){
4693 + if(tag['name']==val){
4694 + insertTags(val, tag['term_id']);
4695 + return false;
4696 + }
4697 + }
4698 +
4699 + jQuery.ajax({
4700 + url: pagelayer_ajax_url+'&action=pagelayer_get_post_tags',
4701 + type: 'post',
4702 + dataType: 'json',
4703 + data: {
4704 + pagelayer_nonce: pagelayer_ajax_nonce,
4705 + 'postid': pagelayer_postID,
4706 + 'new_tag': val
4707 + },
4708 + success: function(resp){
4709 + if(pagelayer_empty(resp)){
4710 + return;
4711 + }
4712 + if('error' in resp){
4713 + alert(resp.error);
4714 + }
4715 + if(!pagelayer_empty(resp.tag_id)){
4716 + insertTags(val, resp.tag_id);
4717 + tagSearching(resp);
4718 + pagelayer_post_tags = resp;
4719 + }
4720 + }
4721 + });
4722 +
4723 + return false;
4724 + }else if(keycode == '8'){
4725 + if(!pagelayer_empty(val)){
4726 + return true;
4727 + }
4728 + row.find('.pagelayer-post-tags').children('span').last().remove();
4729 + selected_tags();
4730 + }
4731 + return true;
4732 + });
4733 + }
4734 +
4735 + // Inserting tags in the Metabox.
4736 + var insertTags = function(name, tag_id){
4737 + var newItem = [];
4738 + newItem[0] = {
4739 + name:name,
4740 + term_id:tag_id
4741 + };
4742 + row.find('.pagelayer-post-tags').children('input').before(singleTag(newItem));
4743 + row.find('.pagelayer-elp-postTags .pagelayer-elp-postTags-inp').val('').focus();
4744 + tag_remove();
4745 + selected_tags();
4746 + }
4747 +
4748 + // Removing tags by clicking on the x button.
4749 + var tag_remove = function(){
4750 + row.find('.pagelayer-elp-tags-remove').each(function(){
4751 + jQuery(this).on('click',function(){
4752 + jQuery(this).parent().remove();
4753 + selected_tags();
4754 + });
4755 + });
4756 + }
4757 +
4758 + // For searching tag name in the list of the fetched tags
4759 + var tagSearching = function(obj){
4760 + row.find('.pagelayer-elp-postTags-inp').off('keyup');
4761 + row.find('.pagelayer-elp-postTags-inp').on("keyup", function() {
4762 + var value = jQuery(this).val().toLowerCase();
4763 +
4764 + var listUl = row.find('.pagelayer-postTags-list');
4765 + listUl.empty();
4766 +
4767 + if(value.length<2){
4768 + return;
4769 + }
4770 +
4771 + var listValues = obj.allTags.filter(function(currentValue){
4772 + if(currentValue.name.indexOf(this)>-1){
4773 + var temp = false;
4774 + var tags = row.find('.pagelayer-post-tags').children('span');
4775 + for(var indi of tags){
4776 + if(jQuery(indi).attr('data-val')==currentValue.term_id){
4777 + temp = true;
4778 + }
4779 + }
4780 + if(temp==false){
4781 + return currentValue;
4782 + }
4783 + }
4784 + }, value);
4785 +
4786 + if(!pagelayer_empty(listValues.length)){
4787 + listUl.append(singleLi(listValues));
4788 + listUl.children().each(function(index, value){
4789 + var ele = jQuery(this);
4790 + ele.off('click');
4791 + ele.on('click', function(){
4792 + insertTags(ele.text(), ele.attr('data-val'));
4793 + listUl.empty();
4794 + });
4795 + });
4796 + }
4797 +
4798 +
4799 + });
4800 + }
4801 +
4802 + var tagsArray = pagelayer_post_tags.postTags;
4803 +
4804 + // Getting tags on opening of page props settings.
4805 + if( first_time_tag == false ){
4806 +
4807 + var i=0;
4808 + var tags_array = [];
4809 +
4810 + // Create array for needed term_id with corresponding to the name.
4811 + if(!pagelayer_empty(prop.c['val'])){
4812 +
4813 + var tags_val = prop.c['val'];
4814 + if(pagelayer_is_string(tags_val)){
4815 + tags_val = tags_val.split(',');
4816 + }
4817 +
4818 + for(var name in tags_val){
4819 + tags_array[i] = pagelayer_post_tags.allTags.find(function(val){return val['name'] == tags_val[name]});
4820 + i++;
4821 + }
4822 + }
4823 +
4824 + tagsArray = tags_array;
4825 + }
4826 +
4827 + row.find('.pagelayer-post-tags').prepend(singleTag(tagsArray));
4828 +
4829 + first_time_tag = false;
4830 +
4831 + tagSearching(pagelayer_post_tags);
4832 +
4833 + keypresses(pagelayer_post_tags);
4834 +
4835 + tag_remove();
4836 +
4837 + var selected_tags = function(){
4838 + var jEle = row.find('.pagelayer-elp-postTags .pagelayer-elp-tags-ele');
4839 + var tag_array = [];
4840 + for(var selec_tag of jEle){
4841 + tag_array.push(jQuery(selec_tag).text());
4842 + }
4843 + _pagelayer_set_atts(row, tag_array);
4844 + };
4845 +}
4846 +
4847 +function pagelayer_elp_permalink(row, prop){
4848 +
4849 + var tmp = '';
4850 + var link = '';
4851 +
4852 + if(!pagelayer_empty(pagelayer_permalink_structure)){
4853 + tmp = pagelayer_post_permalink.replace(/\/$/,'');
4854 + link = tmp.substring(0, tmp.lastIndexOf('/'));
4855 +
4856 + var new_link = link+'/'+prop.c['val'];
4857 + prop.default = pagelayer_post.post_name;
4858 +
4859 + var div = '<div class="pagelayer-elp-text-div">'+
4860 + '<input type="text" class="pagelayer-elp-text" name="'+prop.c['name']+'" value="'+pagelayer_htmlEntities(prop.c['val'])+'"></input>'+
4861 + '<a href="'+pagelayer_post_permalink+'" class="pagelayer-elp-permalink-a" target="_blank" >'+new_link+'</a></p>'+
4862 + '</div>';
4863 + }else{
4864 + var div = '<div class="pagelayer-elp-text-div">'+
4865 + '<a href="'+pagelayer_post.guid+'" class="pagelayer-elp-permalink-a" target="_blank" >'+pagelayer_post.guid+'</a></p>'+
4866 + '</div>';
4867 + }
4868 +
4869 + row.append(div);
4870 +
4871 + setTimeout(function(){
4872 + row.find(".pagelayer-post-type").html(pagelayer_post.post_type);
4873 + }, 1000);
4874 +
4875 + var string_to_slug = function (str){
4876 + str = str.replace(/^\s+|\s+$/g, ''); // trim
4877 + str = str.toLowerCase();
4878 +
4879 + // remove accents, swap ñ for n, etc
4880 + var char_map = {
4881 + // Latin
4882 + 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', 'Ç': 'C',
4883 + 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', 'Î': 'I', 'Ï': 'I',
4884 + 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö': 'O', 'Ő': 'O',
4885 + 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U', 'Ű': 'U', 'Ý': 'Y', 'Þ': 'TH',
4886 + 'ß': 'ss',
4887 + 'à': 'a', 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c',
4888 + 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i',
4889 + 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'ő': 'o',
4890 + 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', 'ű': 'u', 'ý': 'y', 'þ': 'th',
4891 + 'ÿ': 'y',
4892 +
4893 + // Latin symbols
4894 + '©': '(c)',
4895 +
4896 + // Greek
4897 + 'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z', 'Η': 'H', 'Θ': '8',
4898 + 'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M', 'Ν': 'N', 'Ξ': '3', 'Ο': 'O', 'Π': 'P',
4899 + 'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y', 'Φ': 'F', 'Χ': 'X', 'Ψ': 'PS', 'Ω': 'W',
4900 + 'Ά': 'A', 'Έ': 'E', 'Ί': 'I', 'Ό': 'O', 'Ύ': 'Y', 'Ή': 'H', 'Ώ': 'W', 'Ϊ': 'I',
4901 + 'Ϋ': 'Y',
4902 + 'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h', 'θ': '8',
4903 + 'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm', 'ν': 'n', 'ξ': '3', 'ο': 'o', 'π': 'p',
4904 + 'ρ': 'r', 'σ': 's', 'τ': 't', 'υ': 'y', 'φ': 'f', 'χ': 'x', 'ψ': 'ps', 'ω': 'w',
4905 + 'ά': 'a', 'έ': 'e', 'ί': 'i', 'ό': 'o', 'ύ': 'y', 'ή': 'h', 'ώ': 'w', 'ς': 's',
4906 + 'ϊ': 'i', 'ΰ': 'y', 'ϋ': 'y', 'ΐ': 'i',
4907 +
4908 + // Turkish
4909 + 'Ş': 'S', 'İ': 'I', 'Ç': 'C', 'Ü': 'U', 'Ö': 'O', 'Ğ': 'G',
4910 + 'ş': 's', 'ı': 'i', 'ç': 'c', 'ü': 'u', 'ö': 'o', 'ğ': 'g',
4911 +
4912 + // Russian
4913 + 'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'Yo', 'Ж': 'Zh',
4914 + 'З': 'Z', 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M', 'Н': 'N', 'О': 'O',
4915 + 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U', 'Ф': 'F', 'Х': 'H', 'Ц': 'C',
4916 + 'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Sh', 'Ъ': '', 'Ы': 'Y', 'Ь': '', 'Э': 'E', 'Ю': 'Yu',
4917 + 'Я': 'Ya',
4918 + 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo', 'ж': 'zh',
4919 + 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o',
4920 + 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c',
4921 + 'ч': 'ch', 'ш': 'sh', 'щ': 'sh', 'ъ': '', 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu',
4922 + 'я': 'ya',
4923 +
4924 + // Ukrainian
4925 + 'Є': 'Ye', 'І': 'I', 'Ї': 'Yi', 'Ґ': 'G',
4926 + 'є': 'ye', 'і': 'i', 'ї': 'yi', 'ґ': 'g',
4927 +
4928 + // Czech
4929 + 'Č': 'C', 'Ď': 'D', 'Ě': 'E', 'Ň': 'N', 'Ř': 'R', 'Š': 'S', 'Ť': 'T', 'Ů': 'U',
4930 + 'Ž': 'Z',
4931 + 'č': 'c', 'ď': 'd', 'ě': 'e', 'ň': 'n', 'ř': 'r', 'š': 's', 'ť': 't', 'ů': 'u',
4932 + 'ž': 'z',
4933 +
4934 + // Polish
4935 + 'Ą': 'A', 'Ć': 'C', 'Ę': 'e', 'Ł': 'L', 'Ń': 'N', 'Ó': 'o', 'Ś': 'S', 'Ź': 'Z',
4936 + 'Ż': 'Z',
4937 + 'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ó': 'o', 'ś': 's', 'ź': 'z',
4938 + 'ż': 'z',
4939 +
4940 + // Latvian
4941 + 'Ā': 'A', 'Č': 'C', 'Ē': 'E', 'Ģ': 'G', 'Ī': 'i', 'Ķ': 'k', 'Ļ': 'L', 'Ņ': 'N',
4942 + 'Š': 'S', 'Ū': 'u', 'Ž': 'Z',
4943 + 'ā': 'a', 'č': 'c', 'ē': 'e', 'ģ': 'g', 'ī': 'i', 'ķ': 'k', 'ļ': 'l', 'ņ': 'n',
4944 + 'š': 's', 'ū': 'u', 'ž': 'z'
4945 + };
4946 +
4947 + for(var k in char_map) {
4948 + str = str.replace(new RegExp(k, 'g'), char_map[k]);
4949 + }
4950 +
4951 + str = str.replace('.', '-')// replace a dot by a dash
4952 + .replace(/[^a-z0-9 -]/g, '') // remove invalid chars
4953 + .replace(/\s+/g, '-') // collapse whitespace and replace by a dash
4954 + .replace(/-+/g, '-') // collapse dashes
4955 + .replace( /\//g, '' ); // collapse all forward-slashes
4956 +
4957 + return str;
4958 + }
4959 +
4960 + var editSlug = function(jEle, val){
4961 +
4962 + // Convert to slug
4963 + val = string_to_slug(val);
4964 +
4965 + var new_link = link+'/'+val;
4966 + var a = row.find('a');
4967 + a.html(new_link);
4968 + jEle.val(val);
4969 +
4970 + return val;
4971 + }
4972 +
4973 + var input = row.find('input');
4974 +
4975 + if(pagelayer_empty(prop.c['val'])){
4976 + editSlug(input, pagelayer_post.post_title);
4977 +
4978 + input.on('focusin', function(){
4979 + if(!pagelayer_empty(pagelayer_get_att(prop.el.$, prop.c['name']))){
4980 + return;
4981 + }
4982 +
4983 + editSlug(input, pagelayer_get_att(prop.el.$, 'post_title'));
4984 + });
4985 + }
4986 +
4987 + input.on('focusout', function(){
4988 + var val = jQuery(this).val();
4989 + val = editSlug(jQuery(this), val);
4990 +
4991 + if(pagelayer_empty(pagelayer_get_att(prop.el.$, prop.c['name']))){
4992 + return;
4993 + }
4994 + _pagelayer_set_atts(row, val);// Save and Render
4995 + });
4996 +
4997 + input.on('input', function(){
4998 + var new_link = link+'/'+jQuery(this).val();
4999 + var a = row.find('a');
5000 + a.html(new_link);
5001 + _pagelayer_set_atts(row, jQuery(this).val());// Save and Render
5002 + });
5003 +}
5004 +
5005 +// The Datetime Property
5006 +function pagelayer_elp_postDate(row, prop){
5007 +
5008 + var date_array = prop.c['val'].split(" ");
5009 +
5010 + var div = '<div class="pagelayer-elp-postdate-div">'+
5011 + '<input type="date" class="pagelayer-elp-postdate" name="'+prop.c['name']+'" value="'+date_array[0]+'" />'+
5012 + '<input type="time" class="pagelayer-elp-postdate" name="'+prop.c['name']+'" value="'+date_array[1]+'" />'+
5013 + '</div>';
5014 +
5015 + row.append(div);
5016 +
5017 + row.find('.pagelayer-elp-postdate-div').on('change', function(){
5018 + var date_string = jQuery(this).children().eq(0).val() +' '+ jQuery(this).children().eq(1).val();
5019 + _pagelayer_set_atts(row, date_string);// Save and Render
5020 + });
5021 +
5022 +};
5023 +
5024 +// The button Property
5025 +function pagelayer_elp_trashButton(row, prop){
5026 +
5027 + var div = '<div class="pagelayer-elp-trash-button-div">'+
5028 + '<button class="pagelayer-elp-trash-button">Move to trash</button>'+
5029 + '</div>';
5030 +
5031 + row.append(div);
5032 +
5033 + row.find('.pagelayer-elp-trash-button').on('click', function(event){
5034 + event.preventDefault();
5035 + if(!confirm(pagelayer_l('delete_post_conf'))){
5036 + return;
5037 + }
5038 + //console.log(pagelayer_postID);
5039 + jQuery.ajax({
5040 + url: pagelayer_ajax_url+'&action=pagelayer_trash_post',
5041 + type: 'post',
5042 + dataType: 'json',
5043 + data: {
5044 + pagelayer_nonce: pagelayer_ajax_nonce,
5045 + 'postid': pagelayer_postID
5046 + },
5047 + success: function(resp){
5048 +
5049 + if('error' in resp){
5050 + alert(resp.error);
5051 + }
5052 +
5053 + if('url' in resp){
5054 + window.top.location.href = resp.url;
5055 + }
5056 + }
5057 + });
5058 + });
5059 +
5060 +};
5061 +
5062 +// The Menus list property
5063 +function pagelayer_elp_menus(row, prop){
5064 +
5065 + var jEle = prop.el.$;
5066 + var options = '';
5067 + var option = function(val, lang){
5068 + var selected = (val != prop.c['val']) ? '' : 'selected="selected"';
5069 + return '<option class="pagelayer-elp-select-option" value="'+val+'" '+selected+'>'+lang+'</option>';
5070 + }
5071 +
5072 + for(x in prop['list']){
5073 +
5074 + // Single item
5075 + if(typeof prop['list'][x] == 'string'){
5076 + options += option(x, prop['list'][x]);
5077 +
5078 + // Groups
5079 + }else{
5080 + options += '<optgroup label="'+x+'">';
5081 +
5082 + for(var y in prop['list'][x]){
5083 + options += option(y, prop['list'][x][y]);
5084 + }
5085 +
5086 + options += '</optgroup>';
5087 + }
5088 + }
5089 +
5090 + var div = '<div class="pagelayer-elp-select-div pagelayer-elp-pos-rel">'+
5091 + '<select class="pagelayer-elp-select pagelayer-elp-select-menus" name="'+prop.c['name']+'">'+options+'</select>'+
5092 + '</div>'+
5093 + '<div class="pagelayer-elp-menu-items-holder pagelayer-elp-pos-rel"></div>';
5094 +
5095 + row.append(div);
5096 +
5097 + // Show the properties of the existing things
5098 + var show_item = function(item, child_elements, depth){
5099 +
5100 + depth = depth || 0;
5101 +
5102 + var title = item['title'] || '';
5103 +
5104 + // Create the HTML
5105 + var holder = jQuery('<div class="pagelayer-elp-group-item pagelayer-menu-depth-'+depth+'" pagelayer-menu-item="'+item['ID']+'">'+
5106 + '<div class="pagelayer-elp-group-item-head">'+
5107 + '<span class="pagelayer-elp-group-item-drag"><i class="pli pli-menu" ></i></span>'+
5108 + '<span class="pagelayer-elp-group-item-title">'+title+'</span>'+
5109 + '</div>'+
5110 + '<div class="pagelayer-elp-group-item-body"></div>'+
5111 + '<div class="menu-item-transport"></div>'+
5112 + '</div>');
5113 +
5114 + // Append to the row
5115 + row.find('.pagelayer-elp-menu-items-holder').append(holder);
5116 +
5117 + // Setup the toggle
5118 + holder.find('.pagelayer-elp-group-item-head').first().on('click', function(e){
5119 + if(jQuery(e.target).closest('.pagelayer-elp-group-item-clone, .pagelayer-elp-group-item-del, .pagelayer-elp-group-item-drag').length > 0){
5120 + return;
5121 + }
5122 +
5123 + var editArea = jEle.find('.pagelayer-mega-editor-'+item['ID']);
5124 + var child = editArea.find('[pagelayer-tag="pl_nav_menu_item"]');
5125 + var cid;
5126 +
5127 + if(child.length < 1){
5128 +
5129 + // First add the element inside the group element
5130 + var _child = jQuery('<div pagelayer-tag="pl_nav_menu_item"></div>');
5131 +
5132 + editArea.append(_child);
5133 +
5134 + cid = pagelayer_onadd(_child, false);
5135 +
5136 + child = jQuery('[pagelayer-id='+cid+']');
5137 +
5138 + // Set Attributes
5139 + pagelayer_set_atts(child, item);
5140 + }else{
5141 + cid = pagelayer_id(child);
5142 + }
5143 +
5144 + var rEle = holder.find('.pagelayer-elp-group-item-body').first();
5145 +
5146 + holder.attr('pagelayer-group-item-id', cid);
5147 +
5148 + // If the props are not already setup
5149 + if(rEle.html().length < 1){
5150 + pagelayer_elpd_generate(jQuery('[pagelayer-id="'+cid+'"]'), rEle);
5151 +
5152 + // Change the group item title
5153 + var tmp_title = holder.find('[pagelayer-elp-name="'+item['title']+'"] [name="'+item['title']+'"]');
5154 +
5155 + if(tmp_title.length > 0){
5156 + jQuery(tmp_title).on('input', function(){
5157 + holder.find('.pagelayer-elp-group-item-title').html(tmp_title.val());
5158 + });
5159 + }
5160 + }
5161 +
5162 + if(!rEle.is(':visible')){
5163 + jQuery('.pagelayer-active-mega-menu').removeClass('pagelayer-active-mega-menu');
5164 + jEle.find('.pagelayer-mega-menu-item.menu-item-'+item['ID']).addClass('pagelayer-active-mega-menu');
5165 + }
5166 +
5167 + rEle.slideToggle();
5168 + });
5169 +
5170 + // Add child elements
5171 + if(!pagelayer_empty(child_elements[item['ID']])){
5172 +
5173 + depth++;
5174 +
5175 + for(var i in child_elements[item['ID']]){
5176 + show_item(child_elements[item['ID']][i], child_elements, depth);
5177 + }
5178 + }
5179 +
5180 + holder.on('change', 'select[name="menu_type"]', function(){
5181 + var mType = jQuery(this).val();
5182 + var rowGroup = holder.find('[pagelayer-elp-name="element"]');
5183 +
5184 + if(mType != 'mega' || rowGroup.find('.pagelayer-elp-group-div .pagelayer-elp-group-item').length > 0){
5185 + return;
5186 + }
5187 +
5188 + rowGroup.find('.pagelayer-elp-button').click();
5189 +
5190 + });
5191 + };
5192 +
5193 + var createItemsList = function(menuID){
5194 +
5195 + // Remove previous items
5196 + row.find('.pagelayer-elp-menu-items-holder').empty();
5197 +
5198 + if(!(menuID in pagelayer_menus_items_list)){
5199 + return;
5200 + }
5201 +
5202 + var $elements = pagelayer_menus_items_list[menuID];
5203 + var top_level_elements = [];
5204 + var children_elements = [];
5205 +
5206 + for($e in $elements){
5207 +
5208 + // Make a referrer of each menu
5209 + pagelayer_menus_items_ref[$elements[$e]['ID']] = $elements[$e];
5210 +
5211 + if ( pagelayer_empty( $elements[$e]['menu_item_parent'] ) ) {
5212 + top_level_elements.push($elements[$e]);
5213 + } else {
5214 + if(pagelayer_empty(children_elements[ $elements[$e]['menu_item_parent'] ])){
5215 + children_elements[ $elements[$e]['menu_item_parent'] ] = [];
5216 + }
5217 + children_elements[ $elements[$e]['menu_item_parent'] ].push($elements[$e]);
5218 + }
5219 + }
5220 +
5221 + for(var i in top_level_elements){
5222 + show_item(top_level_elements[i], children_elements, 0);
5223 + }
5224 +
5225 + }
5226 +
5227 + createItemsList(prop.c['val']);
5228 +
5229 + row.find('select.pagelayer-elp-select-menus').on('change', function(){
5230 +
5231 + var ID = jQuery(this).val();
5232 +
5233 + // Load Menu list
5234 + createItemsList(ID);
5235 +
5236 + _pagelayer_set_atts(row, ID);// Save and Render
5237 +
5238 + });
5239 +
5240 +}
5241 +
2858 5242 // Select frame to upload media
2859 5243 function pagelayer_select_frame(tag, state){
2860 5244
2861 5245 var state = state || '';
@@ -2951,4 +5335,88 @@
2951 5335
2952 5336 return frame;
2953 5337
2954 5338 }
5339 +
5340 +// function to show default button
5341 +function pagelayer_show_default_button(row, prop, value){
5342 +
5343 + // Default button is visible or not
5344 + if(row.find('.pagelayer-elp-default').attr('data_show')){
5345 + return;
5346 + }
5347 +
5348 + // value is an object or not
5349 + if(typeof value == 'object'){
5350 + // Checking value for NaN, empty and default.
5351 +
5352 + for(var i = 0; i < pagelayer_length(value); i++){
5353 + if(value[i]!= prop.default && value[i] == value[i] && value[i] != ''){
5354 + row.find('.pagelayer-elp-default').attr('data_show',true);
5355 + break;
5356 + }
5357 + }
5358 + }else{
5359 + if('default' in prop && value!=prop.default){
5360 + row.find('.pagelayer-elp-default').attr('data_show',true);
5361 + }else if(value!=prop.default && value==value && value!=''){
5362 + row.find('.pagelayer-elp-default').attr('data_show',true);
5363 + }
5364 + }
5365 +}
5366 +
5367 +// Function which checks the properties to not to show default button
5368 +function pagelayer_properties_filter(property){
5369 + var propTypeDefault = ['image', 'text', 'editor', 'textarea', 'checkbox', 'access', 'modal', 'group', 'radio', 'postCategory', 'postTags', 'postDate', 'gradient'];
5370 +
5371 + return (jQuery.inArray(property, propTypeDefault) == -1)
5372 +}
5373 +
5374 +// Link font family
5375 +function pagelayer_link_font_family(sEle){
5376 +
5377 + var value = sEle.val();
5378 +
5379 + if(sEle.val() == 'Default'){
5380 + return;
5381 + }
5382 +
5383 + value = value.replace(' ', '+');
5384 + var t = sEle.find("option:selected").attr('type');
5385 + switch(t){
5386 + case 'google':
5387 + if(jQuery('#pagelayer-google-fonts').length == 0){
5388 + if(value==''){
5389 + return;
5390 + }
5391 + jQuery('head').append('<link id="pagelayer-google-fonts" href="https://fonts.googleapis.com/css?family='+value+':100,100i,200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i" rel="stylesheet">');
5392 +
5393 + }else{
5394 + var url = jQuery('#pagelayer-google-fonts').attr('href');
5395 + if(url.indexOf(value) == -1){
5396 + url = url+'|'+value+':100,100i,200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i';
5397 + jQuery('#pagelayer-google-fonts').attr('href', url);
5398 + }
5399 + }
5400 + break;
5401 +
5402 + case 'custom':
5403 + if(!pagelayer_empty(jQuery('style[id='+value+'_plf]').length)){
5404 + break;
5405 + }
5406 + jQuery.ajax({
5407 + url: pagelayer_ajax_url+'&action=pagelayer_custom_font',
5408 + type: 'POST',
5409 + dataType: 'json',
5410 + data: {
5411 + 'pagelayer_nonce': pagelayer_ajax_nonce,
5412 + 'font_name': value
5413 + },
5414 + success: function(data) {
5415 + if('style' in data){
5416 + jQuery('body').append(data['style']);
5417 + }
5418 + }
5419 + });
5420 + break;
5421 + }
5422 +}