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 +5422 -2618 0.9.7 → 2.2.2 View file →
@@ -1,2618 +1,5422 @@
1 -
2 -// The active pagelayer element
3 -var pagelayer_active = {};
4 -
5 -// List of pagelayer icons
6 -var pagelayer_icons = {};
7 -
8 -// The inline editor
9 -var pagelayer_editor = {};
10 -
11 -// The active pagelayer element
12 -var pagelayer_active_tab = {};
13 -
14 -// Loads the Data
15 -function pagelayer_data(jEle, clean){
16 -
17 - var ret = new Object();
18 -
19 - // Get the data
20 - ret.tag = pagelayer_tag(jEle);
21 - ret.id = jEle.attr('pagelayer-id');
22 - ret.$ = jEle;
23 -
24 - // Parse the attributes
25 - ret.atts = new Object();
26 - ret.tmp = new Object();
27 -
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 - //console.log(ret.atts);
39 - //console.log(ret.tmp);
40 -
41 - clean = clean || false;
42 -
43 - // Remove values which have 'req'. NOTE : 'show' ones will be allowed
44 - if(clean){
45 -
46 - var tag = ret.tag;
47 -
48 - // Anything to set ?
49 - ret.set = {};
50 -
51 - // All props
52 - var all_props = pagelayer_shortcodes[tag];
53 -
54 - // Loop through all props
55 - for(var i in pagelayer_tabs){
56 -
57 - var tab = pagelayer_tabs[i];
58 -
59 - for(var section in all_props[tab]){
60 -
61 - var props = section in pagelayer_shortcodes[tag] ? pagelayer_shortcodes[tag][section] : pagelayer_styles[section];
62 -
63 - // In case of widgets its possible !
64 - if(pagelayer_empty(props)){
65 - continue;
66 - }
67 -
68 - for(var x in props){
69 -
70 - var prop = props[x];
71 -
72 - // Are we to set this value ?
73 - if(!(x in ret.atts) && 'default' in prop && !pagelayer_empty(prop['default'])){
74 - ret.set[x] = prop['default'];
75 - }
76 -
77 - if(!('req' in prop)){
78 - continue;
79 - }
80 -
81 - //console.log('[pagelayer_data] Cleaning :'+x);
82 -
83 - // List of considerations
84 - var show = prop['req'];
85 -
86 - // We will hide by default
87 - var toShow = true;
88 -
89 - for(var showParam in show){
90 - var reqval = show[showParam];
91 - var except = showParam.substr(0, 1) == '!' ? true : false;
92 - showParam = except ? showParam.substr(1) : showParam;
93 - var val = ret.atts[showParam] || '';
94 -
95 - //console.log('Show '+x+' '+showParam+' '+reqval+' '+val);
96 -
97 - // Is the value not the same, then we can show
98 - if(except){
99 -
100 - if(typeof reqval == 'string' && reqval == val){
101 - toShow = false;
102 - break;
103 - }
104 -
105 - // Its an array and a value is found, then dont show
106 - if(typeof reqval != 'string' && reqval.indexOf(val) > -1){
107 - toShow = false;
108 - break;
109 - }
110 -
111 - // The value must be equal
112 - }else{
113 -
114 - if(typeof reqval == 'string' && reqval != val){
115 - toShow = false;
116 - break;
117 - }
118 -
119 - // Its an array and no value is found, then dont show
120 - if(typeof reqval != 'string' && reqval.indexOf(val) === -1){
121 - toShow = false;
122 - break;
123 - }
124 - }
125 -
126 - }
127 -
128 - // Are we to show ?
129 - if(!toShow){
130 - //console.log('Delete : '+x);
131 - delete ret.atts[x];
132 - delete ret.atts[x+'_tablet'];// Any tablet and mobile values as well
133 - delete ret.atts[x+'_mobile'];
134 - delete ret.set[x];
135 - }
136 - }
137 - }
138 - }
139 -
140 - }
141 -
142 - return ret;
143 -
144 -};
145 -
146 -// Setup the properties
147 -function pagelayer_elpd_setup(){
148 -
149 - // The Dialag box of the element properties
150 - // pagelayer-ELPD - Element Properties Dialog
151 - pagelayer_elpd_html = '<div class="pagelayer-elpd-tabs">'+
152 - '<div class="pagelayer-elpd-tab" pagelayer-elpd-tab="settings" pagelayer-elpd-active-tab=1>Settings</div>'+
153 - //'<div class="pagelayer-elpd-tab" pagelayer-elpd-tab="styles">Style</div>'+
154 - '<div class="pagelayer-elpd-tab" pagelayer-elpd-tab="options">Options</div>'+
155 - '<div class="pagelayer-elpd-options">'+
156 - '<i class="fa fa-clone" />'+
157 - '<i class="fa fa-trash" />'+
158 - '</div>'+
159 - '</div>'+
160 - '<div class="pagelayer-elpd-body"></div>'+
161 - '<div class="pagelayer-elpd-holder"></div>';
162 -
163 - // Create the dialog box
164 - pagelayer.$$('#pagelayer-elpd').append(pagelayer_elpd_html);
165 - pagelayer_elpd = pagelayer.$$('#pagelayer-elpd');
166 -
167 - pagelayer.$$('.pagelayer-elpd-close').on('click', function(){
168 - pagelayer_leftbar_tab('pagelayer-shortcodes');
169 - pagelayer.$$('.pagelayer-elpd-header').hide();
170 - pagelayer.$$('.pagelayer-logo').show();
171 - pagelayer.$$('.pagelayer-elpd-body').removeAttr('pagelayer-element-id').empty();
172 - pagelayer_active = {};
173 - });
174 -
175 - // Copy
176 - pagelayer.$$('.pagelayer-elpd-options>.fa-clone').on('click', function(){
177 - pagelayer_copy_element(pagelayer_active.el.$);
178 - });
179 -
180 - // Delete
181 - pagelayer.$$('.pagelayer-elpd-options>.fa-trash').on('click', function(){
182 - pagelayer_delete_element(pagelayer_active.el.$);
183 - //pagelayer.$$('.pagelayer-elpd-close').click();
184 - });
185 -
186 - // The tabs
187 - pagelayer_elpd.find('.pagelayer-elpd-tab').on('click', function(){
188 - var attr = 'pagelayer-elpd-active-tab';
189 - pagelayer_elpd.find('.pagelayer-elpd-tab').each(function(){
190 - jQuery(this).removeAttr(attr);
191 - });
192 - jQuery(this).attr(attr, 1);
193 -
194 - // Trigger the showing of rows
195 - pagelayer_elpd_show_rows();
196 - });
197 -
198 -};
199 -
200 -// Open the properties
201 -function pagelayer_elpd_open(jEle){
202 -
203 - // Set pagelayer history FALSE
204 - pagelayer.history_action = false;
205 -
206 - // Set the position of the element and show
207 - //pagelayer_elpd.css('left', pagelayer_elpd_pos[0]);
208 - //pagelayer_elpd.css('top', pagelayer_elpd_pos[1]);
209 - pagelayer_leftbar_tab('pagelayer-elpd');
210 - pagelayer.$$('.pagelayer-elpd-header').show();
211 - pagelayer.$$('.pagelayer-logo').hide();
212 -
213 - // The property holder
214 - var holder = pagelayer.$$('.pagelayer-elpd-body');
215 - holder.html(' ');
216 -
217 - var el = pagelayer_elpd_generate(jEle, holder);
218 -
219 - // Set the active element
220 - pagelayer_active.el = el;
221 -
222 - // Set the header
223 - pagelayer.$$('.pagelayer-elpd-title').html('Edit '+pagelayer_shortcodes[el.tag]['name']);
224 -
225 - // Set pagelayer history TRUE
226 - pagelayer.history_action = true;
227 -
228 -};
229 -
230 -// Show the properties window
231 -function pagelayer_elpd_generate(jEle, holder){
232 -
233 - // Get the id, tag, atts, data, etc
234 - var el = pagelayer_data(jEle);
235 - //console.log(el);
236 -
237 - // Is it a valid type ?
238 - if(pagelayer_empty(pagelayer_shortcodes[el.tag])){
239 - pagelayer_error('Could not find this shortcode : '+el.tag);
240 - }
241 -
242 - // Set the holder
243 - holder.attr('pagelayer-element-id', el.id);
244 - //console.log(el.id);
245 -
246 - var all_props = pagelayer_shortcodes[el.tag];
247 -
248 - var sec_open_class = 'pagelayer-elpd-section-open';
249 -
250 - for(var i in pagelayer_tabs){
251 - var tab = pagelayer_tabs[i];
252 - var section_close = false;// First section always open
253 - for(var section in all_props[tab]){
254 - //console.log(tab+' '+section);
255 -
256 - var props = section in pagelayer_shortcodes[el.tag] ? pagelayer_shortcodes[el.tag][section] : pagelayer_styles[section];
257 - //console.log(props);
258 -
259 - var sec = jQuery('<div class="pagelayer-elpd-section" section="'+section+'" pagelayer-show-tab="'+tab+'">'+
260 - '<div class="pagelayer-elpd-section-name '+sec_open_class+'"><i class="fa"></i>'+all_props[tab][section]+'</div>'+
261 - '<div class="pagelayer-elpd-section-rows"></div>'+
262 - '</div>');
263 - holder.append(sec);
264 -
265 - // The row holder
266 - sec = sec.find('.pagelayer-elpd-section-rows');
267 -
268 - // Close all except the first section
269 - if(section_close){
270 - sec.hide().prev().removeClass(sec_open_class);
271 - }
272 - section_close = true;
273 -
274 - if('widget' in all_props && section == 'params'){
275 - pagelayer_elpd_widget_settings(el, sec, true);
276 - continue;
277 - }
278 -
279 - // Reset / Create the cache
280 - for(var x in props){
281 -
282 - props[x]['c'] = new Object();
283 - props[x]['c']['val'] = '';// Blank Val
284 - props[x]['c']['name'] = x;// Add the Name of the row i.e. attribute of the element
285 -
286 - // Set default to value of attribute if any
287 - if(x in el.atts){
288 - props[x]['c']['val'] = el.atts[x];
289 - }
290 -
291 - // Set element
292 - props[x]['el'] = el;
293 -
294 - // Add the row
295 - pagelayer_elpd_row(sec, tab, section, props, x);
296 -
297 - }
298 - }
299 - }
300 -
301 - /*// Set the default values in the PROPERTIES
302 - var fn_load = window['pagelayer_load_elp_'+el.tag];
303 -
304 - if(typeof fn_load == 'function'){
305 - fn_load(el, props);
306 - }*/
307 -
308 - // Section open close
309 - holder.find('>.pagelayer-elpd-section>.pagelayer-elpd-section-name').on('click', function(){
310 - var _sec = jQuery(this);
311 - var par = _sec.parent();
312 -
313 - pagelayer_active_tab.id = el.id;
314 - pagelayer_active_tab.section = par.attr('section');
315 -
316 - // Get the active tab
317 - var active_tab = pagelayer_elpd.find('[pagelayer-elpd-active-tab]').attr('pagelayer-elpd-tab');
318 -
319 - // Close all but dont touch yourself
320 - holder.children().each(function (){
321 - var curSec = jQuery(this);
322 - if(par.is(curSec)) return;// Skip the current option
323 - if(curSec.attr('pagelayer-show-tab') != active_tab) return;// Skip the non active tabs as is
324 - curSec.find('.pagelayer-elpd-section-rows').hide().prev().removeClass(sec_open_class);
325 - });
326 -
327 - // Now toggle your self
328 - par.find('.pagelayer-elpd-section-rows').toggle();
329 -
330 - if(_sec.next().is(':visible')){
331 - _sec.addClass(sec_open_class);
332 - }else{
333 - _sec.removeClass(sec_open_class);
334 - }
335 -
336 - });
337 -
338 - if(!pagelayer_empty(pagelayer_active_tab) && pagelayer_active_tab.id == el.id){
339 - holder.find('>[section='+pagelayer_active_tab.section+']>.pagelayer-elpd-section-name').click();
340 - }
341 -
342 - // Handle the showing of rows
343 - pagelayer_elpd_show_rows();
344 -
345 - return el;
346 -
347 -};
348 -
349 -// Show a row
350 -function pagelayer_elpd_row(holder, tab, section, props, name){
351 -
352 - // The Prop
353 - var prop = props[name];
354 - //console.log(tab+' '+name+' '+prop.el.tag);
355 -
356 - var fn = window['pagelayer_elp_'+prop['type']];
357 -
358 - if(typeof fn == 'function'){
359 -
360 - var row = jQuery('<div class="pagelayer-form-item" pagelayer-elp-name="'+name+'" />');
361 -
362 - // Append the row
363 - holder.append(row);
364 -
365 - var fn_ui = window['pagelayer_elp_'+prop['type']+'_ui'];
366 -
367 - // Is there a UI Handler ?
368 - if(typeof fn_ui == 'function'){
369 -
370 - fn_ui(row, prop);
371 -
372 - // Use the default mechanism
373 - }else{
374 -
375 - // The label
376 - pagelayer_elp_label(row, prop);
377 -
378 - // The main property
379 - fn(row, prop);
380 -
381 - // Is there a description ?
382 - if(!pagelayer_empty(prop['desc'])){
383 - pagelayer_elp_desc(row, prop['desc']);
384 - }
385 -
386 - }
387 -
388 - return row;
389 -
390 - }
391 -
392 -};
393 -
394 -// Show the rows as per the active tab and also handle the rows that are supposed to be shown or not
395 -function pagelayer_elpd_show_rows(){
396 -
397 - //console.log('Called');
398 -
399 - // Get the active tab
400 - var active_tab = pagelayer_elpd.find('[pagelayer-elpd-active-tab]').attr('pagelayer-elpd-tab');
401 -
402 - pagelayer_elpd.find('[pagelayer-show-tab]').each(function(){
403 - var sec = jQuery(this);
404 -
405 - // Is it the active tab ?
406 - if(sec.attr('pagelayer-show-tab') != active_tab){
407 - sec.hide();
408 - }else{
409 - sec.show();
410 - }
411 - });
412 -
413 - // Find all Elements in the Property dialog and loop
414 - pagelayer_elpd.find('[pagelayer-element-id]').each(function(){
415 -
416 - var holder = jQuery(this);
417 - var id = holder.attr('pagelayer-element-id');
418 - var jEle = pagelayer_ele_by_id(id);
419 - var tag = pagelayer_tag(jEle);
420 - //console.log('Main : '+id+' - '+tag);
421 - //console.log(pagelayer_active);
422 -
423 - // All props
424 - var all_props = pagelayer_shortcodes[tag];
425 -
426 - // Loop through all props
427 - for(var i in pagelayer_tabs){
428 -
429 - var tab = pagelayer_tabs[i];
430 -
431 - for(var section in all_props[tab]){
432 -
433 - var props = section in pagelayer_shortcodes[tag] ? pagelayer_shortcodes[tag][section] : pagelayer_styles[section];
434 -
435 - for(var x in props){
436 -
437 - var prop = props[x];
438 -
439 - // If the prop is a group, we continue
440 - if(prop['type'] == 'group'){
441 - continue;
442 - }
443 -
444 - // Find the row
445 - var row = false;
446 -
447 - holder.find('[pagelayer-elp-name='+x+']').each(function(){
448 - var j = jQuery(this);
449 - var _id = j.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
450 - //console.log(_id+' = '+id);
451 -
452 - // Is the parent the same ?
453 - if(_id == id){
454 - row = j;
455 - }
456 - });
457 -
458 - // Do you have a show or hide ?
459 - if(!row){
460 - //console.log('Not Found : '+x+' - '+id);
461 - continue;
462 - }
463 -
464 - // Is the row visible ?
465 - if(row.closest('[pagelayer-show-tab]').attr('pagelayer-show-tab') != active_tab){
466 - row.hide();
467 - continue;
468 - }
469 -
470 - // Now lets show or hide the element
471 - if(!('req' in prop || 'show' in prop)){
472 - row.show();
473 - continue;
474 - }
475 -
476 - // List of considerations
477 - var show = {};
478 -
479 - // We have both req and show, so lets just combine the values and then show
480 - // NOTE : We need to make an array and not just merge the 2 as they are references
481 - if('req' in prop && 'show' in prop){
482 -
483 - // Add the req values
484 - show = JSON.parse(JSON.stringify(prop['req']));
485 -
486 - // Now the show values need to be looped
487 - for(var t in prop['show']){
488 - show[t] = prop['show'][t];
489 - }
490 -
491 - }else{
492 - show = 'req' in prop ? prop['req'] : prop['show'];
493 - }
494 -
495 - // We will hide by default
496 - var toShow = true;
497 -
498 - for(var showParam in show){
499 - var reqval = show[showParam];
500 - var except = showParam.substr(0, 1) == '!' ? true : false;
501 - showParam = except ? showParam.substr(1) : showParam;
502 - var val = pagelayer_get_att(jEle, showParam) || '';
503 -
504 - //console.log('Show '+x+' '+showParam+' '+reqval+' '+val);
505 -
506 - // Is the value not the same, then we can show
507 - if(except){
508 -
509 - if(typeof reqval == 'string' && reqval == val){
510 - toShow = false;
511 - break;
512 - }
513 -
514 - // Its an array and a value is found, then dont show
515 - if(typeof reqval != 'string' && reqval.indexOf(val) > -1){
516 - toShow = false;
517 - break;
518 - }
519 -
520 - // The value must be equal
521 - }else{
522 -
523 - if(typeof reqval == 'string' && reqval != val){
524 - toShow = false;
525 - break;
526 - }
527 -
528 - // Its an array and no value is found, then dont show
529 - if(typeof reqval != 'string' && reqval.indexOf(val) === -1){
530 - toShow = false;
531 - break;
532 - }
533 - }
534 - }
535 -
536 - // Are we to show ?
537 - if(toShow){
538 - row.show();
539 - }else{
540 - row.hide();
541 - }
542 -
543 - }
544 - }
545 - }
546 -
547 - });
548 -
549 -};
550 -
551 -var pagelayer_widget_timer;
552 -var pagelayer_widget_cache = {};
553 -
554 -// Load the widget settings
555 -function pagelayer_elpd_widget_settings(el, sec, onfocus){
556 -
557 - var show_form = function(html){
558 -
559 - sec.html('<form class="pagelayer-widgets-form">'+html+'</form>');
560 -
561 - // Handle on form data change
562 - sec.find('form :input').on('change', function(){
563 - //console.log('Changed !');
564 -
565 - // Clear any previous timeout
566 - clearTimeout(pagelayer_widget_timer);
567 -
568 - // Set a timer for constant change
569 - pagelayer_widget_timer = setTimeout(function(){
570 - pagelayer_elpd_widget_settings(el, sec);
571 - //console.log('Calling');
572 - }, 500);
573 -
574 - });
575 - }
576 -
577 - // Is it onfocus ?
578 - onfocus = onfocus || false;
579 -
580 - // Its an onfocus
581 - if(onfocus && el.id in pagelayer_widget_cache){
582 - show_form(pagelayer_widget_cache[el.id]);
583 - return true;
584 - }
585 -
586 - var post = {};
587 - post['action'] = 'pagelayer_wp_widget';
588 - post['pagelayer_nonce'] = pagelayer_ajax_nonce;
589 - post['tag'] = el.tag;
590 - post['pagelayer-id'] = el.id;
591 -
592 - // Any atts ?
593 - if('widget_data' in el.atts){
594 - post['widget_data'] = el.atts['widget_data'];
595 - }
596 -
597 - // Post any existing data
598 - var form = sec.find('form');
599 - if(form.length > 0){
600 - //console.log(form.serialize());
601 - post['values'] = form.serialize();
602 - }
603 -
604 - jQuery.ajax({
605 - url: pagelayer_ajax_url,
606 - type: 'post',
607 - data: post,
608 - success: function(data) {
609 - //console.log('Widget Data');console.log(data);
610 -
611 - // Show the form
612 - if('form' in data){
613 - show_form(data['form']);
614 -
615 - // Store in cache
616 - pagelayer_widget_cache[el.id] = data['form'];
617 - }
618 -
619 - // Show the content
620 - if('html' in data){
621 - el.$.html(data['html']);
622 - pagelayer_sc_render(el.$);// Re-Render the CSS
623 - }
624 -
625 - // Any set attributes ?
626 - if('widget_data' in data){
627 - pagelayer_set_atts(el.$, 'widget_data', JSON.stringify(data['widget_data']));
628 - }
629 -
630 - },
631 - fail: function(data) {
632 - alert('Some error occured in getting the widget data');
633 - }
634 - });
635 -
636 -}
637 -
638 -// Will set the attribute and also render
639 -function _pagelayer_set_atts(row, val, no_default){
640 - var id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
641 - var jEle = jQuery('[pagelayer-id='+id+']');
642 -
643 - // Is there a unit ?
644 - var uEle = row.find('.pagelayer-elp-units');
645 - if(uEle.length > 0){
646 - var unit = uEle.find('[selected]').html();
647 - if(Array.isArray(val)){
648 - for(var i in val){
649 - if(val[i].length < 1){
650 - continue;
651 - }
652 - val[i] = val[i]+unit;
653 - }
654 - }else{
655 - val = val+unit;
656 - }
657 - }
658 -
659 - // Are we in another mode ?
660 - var mEle = row.find('.pagelayer-elp-screen');
661 - var mode = mEle.length > 0 && pagelayer_get_screen_mode() != 'desktop' ? '_'+pagelayer_get_screen_mode() : '';
662 -
663 - pagelayer_set_atts(jEle, row.attr('pagelayer-elp-name')+mode, val);
664 -
665 - // Are we to skip setting defaults ?
666 - no_default = no_default || false;
667 - if(!no_default){
668 -
669 - // We need to set defaults for dependents
670 - var hasSet = pagelayer_set_default_atts(jEle, 5);
671 -
672 - // We need to reopen the left panel
673 - // Note : If two simultaneous calls are made, then this will cause problems
674 - // Also after this is called, ROW is destroyed and no other row related stuff will work i.e. set_atts in the same calls will fail
675 - if(hasSet){
676 - pagelayer_elpd_open(jEle);
677 - }
678 - }
679 -
680 - // Render
681 - pagelayer_sc_render(jEle);
682 -};
683 -
684 -// Will set the attribute but not render
685 -function _pagelayer_set_tmp_atts(row, suffix, val){
686 - var id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
687 - var jEle = jQuery('[pagelayer-id='+id+']');
688 - pagelayer_set_tmp_atts(jEle, row.attr('pagelayer-elp-name')+'-'+suffix, val);
689 -};
690 -
691 -// Get the tmp att
692 -function _pagelayer_get_tmp_att(row, suffix){
693 - var id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
694 - var jEle = jQuery('[pagelayer-id='+id+']');
695 - return pagelayer_get_tmp_att(jEle, row.attr('pagelayer-elp-name')+'-'+suffix);
696 -};
697 -
698 -// Create the Label
699 -function pagelayer_elp_label(row, prop){
700 - row.append('<div class="pagelayer-elp-label-div"><label class="pagelayer-elp-label">'+prop['label']+'</label></div>');
701 -
702 - var label = row.children('.pagelayer-elp-label-div');
703 -
704 - // Do we have screen ?
705 - if('screen' in prop){
706 - var screen = '<div class="pagelayer-elp-screen">'+
707 - '<i class="fa fa-desktop" />'+
708 - '<i class="fa fa-tablet" />'+
709 - '<i class="fa fa-mobile" />'+
710 - '<i class="pagelayer-prop-screen fa fa-desktop" />'+
711 - '</div>';
712 - label.append(screen);
713 -
714 - // Set screen mode on change
715 - label.find('.fa:not(.pagelayer-prop-screen)').on('click', function(){
716 - var mode = 'desktop';
717 - var jEle = jQuery(this);
718 -
719 - // Tablet ?
720 - if(jEle.hasClass('fa-tablet')){
721 - mode = 'tablet';
722 - }
723 -
724 - // Mobile ?
725 - if(jEle.hasClass('fa-mobile')){
726 - mode = 'mobile';
727 - }
728 -
729 - pagelayer_set_screen_mode(mode);
730 - label.find('.pagelayer-elp-screen .fa').removeClass('open');
731 -
732 - });
733 -
734 - // On change of screen handle the values
735 - label.find('.pagelayer-elp-screen').on('pagelayer-screen-changed', function(e){
736 -
737 - label.find('.pagelayer-elp-screen .fa').removeClass('open');
738 - var mode = pagelayer_get_screen_mode();
739 - var modes = {desktop: '', tablet: '_tablet', mobile: '_mobile'};
740 -
741 - // Get the current current new val
742 - prop.c['val'] = pagelayer_get_att(prop.el.$, prop.c['name']+modes[mode]);
743 -
744 - // Handle the amount
745 - if(pagelayer_empty(prop.c['val'])){
746 - prop.c['val'] = '';
747 - }
748 -
749 - // Remove the siblings
750 - label.siblings().each(function(){
751 - var j = jQuery(this);
752 -
753 - if(j.hasClass('pagelayer-elp-desc')){
754 - return;
755 - }
756 -
757 - j.remove();
758 - });
759 -
760 - // Create the vals again
761 - var fn = window['pagelayer_elp_'+prop['type']];
762 -
763 - // The main property
764 - fn(row, prop);
765 -
766 - });
767 -
768 - label.find('.pagelayer-elp-screen .pagelayer-prop-screen').on('click', function(e){
769 - jQuery(this).siblings().toggleClass('open');
770 - })
771 -
772 - }
773 -
774 - // Do we have units ?
775 - if('units' in prop){
776 -
777 - var units = '';
778 - var tmp_val = prop.c['val'];
779 - var default_unit = 0;
780 -
781 - // Get unit from value
782 - if(!(pagelayer_empty(tmp_val))){
783 -
784 - for(var i in prop['units']){
785 - if(tmp_val.search(prop['units'][i]) != -1){
786 - default_unit = i;
787 - }
788 - }
789 - }
790 -
791 - for(var i in prop['units']){
792 - units += '<span '+(i == default_unit ? 'selected' : '')+'>'+prop['units'][i]+'</span>';
793 - }
794 -
795 - label.append('<div class="pagelayer-elp-units">'+units+'</div>');
796 -
797 - // Set unit on change
798 - label.find('.pagelayer-elp-units span').on('click', function(){
799 -
800 - label.find('.pagelayer-elp-units span').each(function(){
801 - jQuery(this).removeAttr('selected');
802 - });
803 -
804 - jQuery(this).attr('selected', 1);
805 -
806 - });
807 -
808 - }
809 -
810 -};
811 -
812 -// Create the Label
813 -function pagelayer_elp_heading(row, prop){
814 - //row.append('<div class="pagelayer-elp-heading">'+prop['label']+'</div>');
815 -}
816 -
817 -// Create the Label
818 -function pagelayer_elp_heading_ui(row, prop){
819 - row.append('<div class="pagelayer-elp-heading">'+prop['label']+'</div>');
820 -}
821 -
822 -// Create the Description
823 -function pagelayer_elp_desc(row, label){
824 - //row.append('<div class="pagelayer-elp-desc">'+label+'</div>');
825 -};
826 -
827 -// The Text property
828 -function pagelayer_elp_text(row, prop){
829 -
830 - var div = '<div class="pagelayer-elp-text-div">'+
831 - '<input type="text" class="pagelayer-elp-text" name="'+prop.c['name']+'" value="'+prop.c['val']+'"></input>'+
832 - '</div>';
833 -
834 - row.append(div);
835 -
836 - row.find('input').on('input', function(){
837 - _pagelayer_set_atts(row, jQuery(this).val());// Save and Render
838 - });
839 -
840 -};
841 -
842 -// The Select property
843 -function pagelayer_elp_select(row, prop){
844 -
845 - var options = '';
846 - var option = function(val, lang){
847 - var selected = (val != prop.c['val']) ? '' : 'selected="selected"';
848 - return '<option class="pagelayer-elp-select-option" value="'+val+'" '+selected+'>'+lang+'</option>';
849 - }
850 -
851 - for (x in prop['list']){
852 -
853 - // Single item
854 - if(typeof prop['list'][x] == 'string'){
855 - options += option(x, prop['list'][x]);
856 -
857 - // Groups
858 - }else{
859 - options += '<optgroup label="'+x+'">';
860 -
861 - for(var y in prop['list'][x]){
862 - options += option(y, prop['list'][x][y]);
863 - }
864 -
865 - options += '</optgroup>';
866 - }
867 - }
868 -
869 - var div = '<div class="pagelayer-elp-select-div pagelayer-elp-pos-rel">'+
870 - '<select class="pagelayer-elp-select pagelayer-select" name="'+prop.c['name']+'">'+options+'</select>'+
871 - '</div>';
872 -
873 - row.append(div);
874 -
875 - row.find('select').on('change', function(){
876 -
877 - var sEle = jQuery(this);
878 -
879 - if(sEle.attr('name') == "animation"){
880 - _pagelayer_trigger_anim(row, sEle.val());
881 - }
882 -
883 - _pagelayer_set_atts(row, sEle.val());// Save and Render
884 -
885 - });
886 -
887 -}
888 -
889 -// The MultiSelect property
890 -function pagelayer_elp_multiselect(row, prop){
891 -
892 - var selection = [];
893 - if(!pagelayer_empty(prop.c['val'])){
894 - //selection = JSON.parse(prop.c['val']);
895 - selection = prop.c['val'].split(',');
896 - }
897 -
898 - var options = '';
899 - var option = function(val, lang){
900 - var selected = (jQuery.inArray(val,selection) == -1 ? '' : 'selected="selected"');
901 - return '<li class="pagelayer-elp-multiselect-option" data-val="'+val+'" '+selected+'>'+lang+'</li>';
902 - }
903 -
904 - var show_sel = function(val){
905 - var sel_html = '';
906 - jQuery.each(val, function(index, value){
907 - sel_html += '<span class="pagelayer-elp-multiselect-selected">'+prop['list'][value]+'</span>';
908 - });
909 - return sel_html;
910 - }
911 -
912 - for (x in prop['list']){
913 - options += option(x, prop['list'][x]);
914 - }
915 -
916 - var div = '<div class="pagelayer-elp-multiselect-div pagelayer-elp-pos-rel">'+
917 - '<div class="pagelayer-elp-multiselect">'+show_sel(selection)+'</div>'+
918 - '<ul class="pagelayer-elp-multiselect-ul" name="'+prop.c['name']+'">'+options+'</ul>'+
919 - '</div>';
920 -
921 - row.append(div);
922 -
923 - row.find('.pagelayer-elp-multiselect-option').on('click', function(){
924 -
925 - var sVal = jQuery(this).data('val');
926 -
927 - if(jQuery.inArray(sVal,selection) == -1){
928 - selection.push(sVal);
929 - row.find('[data-val="'+sVal+'"]').attr('selected','selected');
930 - }else{
931 - selection.splice(jQuery.inArray(sVal,selection),1);
932 - row.find('[data-val="'+sVal+'"]').removeAttr('selected');
933 - }
934 -
935 - //_pagelayer_set_atts(row,JSON.stringify(selection));// Save and Render
936 - _pagelayer_set_atts(row, selection.join(','));// Save and Render
937 -
938 - row.find('.pagelayer-elp-multiselect').html(show_sel(selection));
939 -
940 - });
941 -
942 - // Open the selector
943 - row.find('.pagelayer-elp-multiselect').on('click', function(){
944 - row.find('.pagelayer-elp-multiselect-ul').slideToggle();
945 - });
946 -
947 -}
948 -
949 -function _pagelayer_trigger_anim(row, anim){
950 - var id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
951 - var classList = $('[pagelayer-id='+id+']').attr('class');
952 - classList = classList.split(/\s+/);
953 - //console.log(classList);
954 - var options = [];
955 - row.find('option').each(function(){
956 - var found = $.inArray( $(this).val(), classList );
957 - if( found != -1){
958 - //var found = $(this).val();
959 - $('[pagelayer-id='+id+']').removeClass($(this).val());
960 - //break;
961 - }
962 - //options.push($(this).val());
963 - });
964 - $('[pagelayer-id='+id+']').removeClass('pagelayer-wow').addClass(anim + ' animated').one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){
965 - $(this).removeClass(anim+ ' animated');
966 - });
967 -}
968 -
969 -// The Checkbox property
970 -function pagelayer_elp_checkbox(row, prop){
971 -
972 - var div = '<div class="pagelayer-elp-checkbox-div">'+
973 - '<input type="checkbox" name="'+prop.c['name']+'" class="pagelayer-elp-checkbox" />'+
974 - '</div>';
975 -
976 - row.append(div);
977 -
978 - if(prop.c['val'].length > 0){
979 - row.find('input').attr('checked', 'checked');
980 - }else{
981 - row.find('input').removeAttr('checked');
982 - }
983 -
984 - // When the change is called
985 - row.find('input').on('change', function(){
986 -
987 - // We set to string true or false
988 - var val = jQuery(this).is(':checked') ? 'true' : '';
989 -
990 - _pagelayer_set_atts(row, val);// Save and Render
991 - });
992 -
993 -}
994 -
995 -// The Radio property
996 -function pagelayer_elp_radio(row, prop){
997 -
998 - var active = 'pagelayer-elp-radio-active';
999 - var div = '<div class="pagelayer-elp-radio-div">';
1000 -
1001 - for(var x in prop.list){
1002 - var addclass = (prop.c['val'] == x) ? active : '';
1003 - div += '<a class="pagelayer-elp-radio '+addclass+'" val="'+x+'">'+prop.list[x]+'</a>';
1004 - }
1005 -
1006 - div += '<div>';
1007 -
1008 - row.append(div);
1009 -
1010 - row.find('.pagelayer-elp-radio').each(function(){
1011 -
1012 - jQuery(this).on('click', function (){
1013 -
1014 - // Remove existing active class
1015 - jQuery(this).parent().find('.'+active).removeClass(active);
1016 -
1017 - // Set active
1018 - jQuery(this).addClass(active);
1019 -
1020 - _pagelayer_set_atts(row, jQuery(this).attr('val'));// Save and Render
1021 -
1022 - });
1023 -
1024 - });
1025 -
1026 -}
1027 -
1028 -// The Image Property
1029 -function pagelayer_elp_image(row, prop){
1030 -
1031 - var style = '';
1032 - var tmp = prop.c['name']+'-url';
1033 - var def = pagelayer.blank_img;
1034 - var src = (tmp in prop.el.tmp) ? prop.el.tmp[tmp] : def;
1035 -
1036 - // Set temp image
1037 - if(!(tmp in prop.el.tmp)){
1038 - _pagelayer_set_tmp_atts(row, 'url', def);
1039 - _pagelayer_set_atts(row, def);
1040 - }
1041 -
1042 - // Do we have a URL set ?
1043 - style = 'style="background-image:url(\''+src+'\')"';
1044 -
1045 - var div = '<div class="pagelayer-elp-image-div">'+
1046 - '<div class="pagelayer-elp-image" '+style+'></div>'+
1047 - '<div class="pagelayer-elp-image-delete"><i class="fa fa-trash" /></div>'+
1048 - '</div>';
1049 -
1050 - row.append(div);
1051 -
1052 - // Set an Image
1053 - row.find('.pagelayer-elp-image').on('click', function(){
1054 -
1055 - var button = jQuery(this);
1056 -
1057 - // Load the frame
1058 - var frame = pagelayer_select_frame('image');
1059 -
1060 - // On select update the stuff
1061 - frame.on({
1062 - 'select': function(){
1063 -
1064 - var state = frame.state();
1065 - var id = url = '';
1066 -
1067 - // External URL
1068 - if('props' in state){
1069 -
1070 - id = url = state.props.attributes.url;
1071 -
1072 - // Internal from gallery
1073 - }else{
1074 -
1075 - var attachment = frame.state().get('selection').first().toJSON();
1076 - //console.log(attachment);
1077 -
1078 - // Set the new ID and URL
1079 - id = attachment.id;
1080 - url = attachment.url;
1081 -
1082 - // Keep a list of all sizes
1083 - for(var x in attachment.sizes){
1084 - _pagelayer_set_tmp_atts(row, x+'-url', attachment.sizes[x].url);
1085 - }
1086 -
1087 - }
1088 -
1089 - // Update thumbnail
1090 - button.css('background-image', 'url(\''+url+'\')');
1091 -
1092 - // Save and render
1093 - _pagelayer_set_tmp_atts(row, 'url', url);
1094 - _pagelayer_set_atts(row, id);
1095 -
1096 - },
1097 - // On open select the appropriate images in the media manager
1098 - 'open': function() {
1099 - var selection = frame.state().get('selection');
1100 - var wp_id = prop.el.$.attr('pagelayer-a-id');
1101 - selection.reset( wp_id ? [ wp.media.attachment( wp_id ) ] : [] );
1102 - }
1103 - });
1104 -
1105 - frame.open(button);
1106 -
1107 - return false;
1108 -
1109 - });
1110 -
1111 - // Delete this
1112 - row.find('.pagelayer-elp-image-delete').on('click', function(){
1113 -
1114 - // Update thumbnail
1115 - row.find('.pagelayer-elp-image').css('background-image', 'url(\''+def+'\')');
1116 -
1117 - // Set to blank and render
1118 - _pagelayer_set_atts(row, '', true);
1119 -
1120 - _pagelayer_set_tmp_atts(row, 'url', def);
1121 - _pagelayer_set_atts(row, def);
1122 -
1123 - });
1124 -
1125 -}
1126 -
1127 -// The Multi Image Property
1128 -function pagelayer_elp_multi_image(row, prop){
1129 -
1130 - var div = '<div class="pagelayer-elp-multi_image-div">'+
1131 - '<center><button class="pagelayer-elp-button">'+pagelayer_l('Add Images')+'</button></center>'+
1132 - '<div class="pagelayer-elp-multi_image-thumbs"></div>'+
1133 - '</div>';
1134 -
1135 - row.append(div);
1136 -
1137 - var tmp = prop.c['name']+'-urls';
1138 - var ids = new Array();
1139 -
1140 - // Any IDs ?
1141 - if(!pagelayer_empty(prop.c['val'])){
1142 - ids = prop.c['val'].split(',');
1143 - //console.log(ids);
1144 - }
1145 -
1146 - // Do we have a URL set ?
1147 - if(ids.length > 0 && tmp in prop.el.tmp){
1148 - var images = JSON.parse(prop.el.tmp[tmp]);
1149 - //console.log(images);
1150 -
1151 - for(var x in ids){
1152 - row.find('.pagelayer-elp-multi_image-thumbs').append('<div class="pagelayer-elp-multi_image-thumb" style="background-image: url(\''+images['i'+ids[x]]+'\');"></div>');
1153 - }
1154 - }
1155 -
1156 - var pagelayer_init_frame = function(state){
1157 -
1158 - var button = row.find('.pagelayer-elp-multi_image-thumbs');
1159 - //console.log(ids);
1160 -
1161 - // Load the frame
1162 - var frame = pagelayer_select_frame('multi_image', 'gallery'+state);
1163 -
1164 - frame.on({
1165 -
1166 - // Set the current selection if any
1167 - 'open': function(){
1168 -
1169 - // Do we have anything
1170 - if(ids.length > 0){
1171 -
1172 - var selection = '';
1173 -
1174 - if(state == '-edit'){
1175 - selection = frame.state().get('library');
1176 - }else{
1177 - selection = frame.state().get('selection');
1178 - }
1179 -
1180 - // Add to current selection
1181 - for(var x in ids){
1182 - attachment = wp.media.attachment(ids[x]);
1183 - attachment.fetch();
1184 - selection.add(attachment ? [ attachment ] : [] );
1185 - }
1186 - }
1187 - },
1188 -
1189 - // When images are selected
1190 - 'update': function(selection){
1191 -
1192 - //console.log(selection);
1193 -
1194 - // Remove thumbnails
1195 - row.find('.pagelayer-elp-multi_image-thumb').remove();
1196 -
1197 - //Fetch selected images
1198 - var attachments = selection.map(function(attachment){
1199 - attachment.toJSON();
1200 - return attachment;
1201 - });
1202 -
1203 - //console.log(attachments);
1204 -
1205 - var img_ids = [];
1206 - var urls = {};
1207 - var img_urls = {};
1208 - var titles = {};
1209 - var links = {};
1210 - var captions = {};
1211 -
1212 - for(var i = 0; i < attachments.length; ++i){
1213 -
1214 - // Add Id and urls to array
1215 - var id = attachments[i].id;
1216 - var _id = 'i'+id;
1217 - img_ids.push(id);
1218 - urls[_id] = attachments[i].attributes.url;
1219 -
1220 - // Create thumbnails
1221 - button.append('<div class="pagelayer-elp-multi_image-thumb" style="background-image: url(\''+attachments[i].attributes.url+'\');"></div>');
1222 -
1223 - //get title
1224 - titles[_id] = attachments[i].attributes.title;
1225 - links[_id] = attachments[i].attributes.link;
1226 - captions[_id] = attachments[i].attributes.caption;
1227 -
1228 - // Create a URL
1229 - img_urls[_id] = {}
1230 -
1231 - for(var x in attachments[i].attributes.sizes){
1232 - img_urls[_id][x] = attachments[i].attributes.sizes[x].url;
1233 - }
1234 -
1235 - }
1236 -
1237 - //console.log(img_urls);
1238 -
1239 - // Save and render
1240 - _pagelayer_set_tmp_atts(row, 'urls', JSON.stringify(urls));
1241 - _pagelayer_set_tmp_atts(row, 'all-urls', JSON.stringify(img_urls));
1242 - _pagelayer_set_tmp_atts(row, 'all-titles', JSON.stringify(titles));
1243 - _pagelayer_set_tmp_atts(row, 'all-links', JSON.stringify(links));
1244 - _pagelayer_set_tmp_atts(row, 'all-captions', JSON.stringify(captions));
1245 - _pagelayer_set_atts(row, img_ids);
1246 -
1247 - // Update the IDs incase the user clicks on it again
1248 - ids = img_ids;
1249 -
1250 - }
1251 -
1252 - });
1253 -
1254 - frame.open(button);
1255 -
1256 - return false;
1257 -
1258 - };
1259 -
1260 - row.find('.pagelayer-elp-multi_image-thumbs').on('click', function(){
1261 - pagelayer_init_frame('-edit');
1262 - });
1263 -
1264 - row.find('.pagelayer-elp-button').on('click', function(){
1265 - pagelayer_init_frame(ids.length > 0 ? '-library' : '');
1266 - });
1267 -
1268 -}
1269 -
1270 -// The Video Property
1271 -function pagelayer_elp_video(row, prop){
1272 -
1273 - var tmp = prop.c['name']+'-url';
1274 - var src = (tmp in prop.el.tmp) ? prop.el.tmp[tmp] : prop.c['val'];
1275 -
1276 - var div = '<div class="pagelayer-elp-video-div pagelayer-elp-input-icon">'+
1277 - '<input class="pagelayer-elp-video" name="'+prop.c['name']+'" type="text" value="'+src+'">'+
1278 - '<i class="fa fa-folder-open" />'+
1279 - '</input></div>';
1280 -
1281 - row.append(div);
1282 -
1283 - row.find('.pagelayer-elp-video-div .fa').on('click', function(){
1284 -
1285 - var button = jQuery(this);
1286 -
1287 - // Load the frame
1288 - var frame = pagelayer_select_frame('video');
1289 -
1290 - // On select update the stuff
1291 - frame.on({
1292 -
1293 - 'select': function(){
1294 -
1295 - var state = frame.state();
1296 - var id = url = '';
1297 -
1298 - // External URL
1299 - if('props' in state){
1300 -
1301 - id = url = state.props.attributes.url;
1302 -
1303 - // Internal from gallery
1304 - }else{
1305 -
1306 - var attachment = frame.state().get('selection').first().toJSON();
1307 - //console.log(attachment);
1308 -
1309 - id = attachment.id;
1310 - url = attachment.url;
1311 -
1312 - }
1313 -
1314 - // Update URL
1315 - button.prev().val(url);
1316 -
1317 - // Save and render
1318 - _pagelayer_set_tmp_atts(row, 'url', url);
1319 - _pagelayer_set_atts(row, id);
1320 -
1321 - }
1322 -
1323 - });
1324 -
1325 - frame.open(button);
1326 -
1327 - return false;
1328 -
1329 - });
1330 -
1331 - // Edited the video URL directly
1332 - row.find('.pagelayer-elp-video').on('change', function(){
1333 -
1334 - var input = jQuery(this);
1335 -
1336 - // Set the new URL
1337 - _pagelayer_set_tmp_atts(row, 'url', input.val());
1338 - _pagelayer_set_atts(row, input.val());
1339 -
1340 - });
1341 -
1342 -}
1343 -
1344 -
1345 -// The Audio Property
1346 -function pagelayer_elp_audio(row, prop){
1347 -
1348 - var tmp = prop.c['name']+'-url';
1349 - var src = (tmp in prop.el.tmp) ? prop.el.tmp[tmp] : prop.c['val'];
1350 -
1351 - var div = '<div class="pagelayer-elp-audio-div pagelayer-elp-input-icon">'+
1352 - '<input class="pagelayer-elp-audio" name="'+prop.c['name']+'" type="text" value="'+src+'" />'+
1353 - '<i class="fa fa-bars" />'+
1354 - '</div>';
1355 -
1356 - row.append(div);
1357 -
1358 - // Choose from media
1359 - row.find('.pagelayer-elp-audio-div .fa').on('click', function(){
1360 -
1361 - var button = jQuery(this);
1362 -
1363 - // Load the frame
1364 - var frame = pagelayer_select_frame('audio');
1365 -
1366 - frame.on({
1367 -
1368 - 'select': function(){
1369 -
1370 - var state = frame.state();
1371 - var id = url = '';
1372 -
1373 - // External URL
1374 - if('props' in state){
1375 -
1376 - id = url = state.props.attributes.url;
1377 -
1378 - // Internal from gallery
1379 - }else{
1380 -
1381 - var attachment = frame.state().get('selection').first().toJSON();
1382 - //console.log(attachment);
1383 -
1384 - id = attachment.id;
1385 - url = attachment.url;
1386 -
1387 - }
1388 -
1389 - // Update URL
1390 - button.prev().val(url);
1391 -
1392 - // Save and render
1393 - _pagelayer_set_tmp_atts(row, 'url', url);
1394 - _pagelayer_set_atts(row, id);
1395 -
1396 - }
1397 -
1398 - });
1399 -
1400 - frame.open(button);
1401 -
1402 - return false;
1403 -
1404 - });
1405 -
1406 - // Edited the media URL directly
1407 - row.find('.pagelayer-elp-audio').on('change', function(){
1408 -
1409 - var input = jQuery(this);
1410 -
1411 - // Set the new URL
1412 - _pagelayer_set_tmp_atts(row, 'url', input.val());
1413 - _pagelayer_set_atts(row, input.val());
1414 -
1415 - });
1416 -
1417 -}
1418 -
1419 -// The Media Property
1420 -function pagelayer_elp_media(row, prop){
1421 -
1422 - var tmp = prop.c['name']+'-url';
1423 - var src = (tmp in prop.el.tmp) ? prop.el.tmp[tmp] : prop.c['val'];
1424 -
1425 - var div = '<div class="pagelayer-elp-media-div pagelayer-elp-input-icon">'+
1426 - '<input class="pagelayer-elp-media" value="'+src+'" type="text" />'+
1427 - '<i class="fa fa-bars" />'+
1428 - '</div>';
1429 -
1430 - row.append(div);
1431 -
1432 - row.find('.pagelayer-elp-media-div .fa-bars').on('click', function(){
1433 -
1434 - var button = jQuery(this);
1435 -
1436 - // Load the frame
1437 - var frame = pagelayer_select_frame('media');
1438 -
1439 - frame.on({
1440 -
1441 - 'select': function(){
1442 -
1443 - var state = frame.state();
1444 - var id = url = '';
1445 -
1446 - // External URL
1447 - if('props' in state){
1448 -
1449 - id = url = state.props.attributes.url;
1450 -
1451 - // Internal from gallery
1452 - }else{
1453 -
1454 - var attachment = frame.state().get('selection').first().toJSON();
1455 - //console.log(attachment);
1456 -
1457 - id = attachment.id;
1458 - url = attachment.url;
1459 -
1460 - }
1461 -
1462 - // Update URL
1463 - button.prev().val(url);
1464 -
1465 - // Save and render
1466 - _pagelayer_set_tmp_atts(row, 'url', url);
1467 - _pagelayer_set_atts(row, id);
1468 -
1469 - }
1470 -
1471 - });
1472 -
1473 - frame.open(button);
1474 -
1475 - return false;
1476 -
1477 - });
1478 -
1479 - // Edited the media URL directly
1480 - row.find('.pagelayer-elp-media').on('change', function(){
1481 -
1482 - var input = jQuery(this);
1483 -
1484 - // Set the new URL
1485 - _pagelayer_set_tmp_atts(row, 'url', input.val());
1486 - _pagelayer_set_atts(row, input.val());
1487 -
1488 - });
1489 -
1490 -}
1491 -
1492 -// The Slider Property
1493 -function pagelayer_elp_slider(row, prop){
1494 -
1495 - var div = '<div class="pagelayer-elp-slider-div">'+
1496 - '<input type="range" class="pagelayer-elp-slider" value="'+prop.c['val']+'" min="'+prop['min']+'" max="'+prop['max']+'" step="'+prop['step']+'"/>'+
1497 - '<input type="number" class="pagelayer-elp-slider-value" value="'+prop.c['val']+'" min="'+prop['min']+'" max="'+prop['max']+'" step="'+prop['step']+'"/>'+
1498 - '</div>'+
1499 - '</div>';
1500 -
1501 - row.append(div);
1502 -
1503 - // Set an value in span
1504 - row.find('.pagelayer-elp-slider-div input').on('input', function(){
1505 -
1506 - row.find('.pagelayer-elp-slider-div input').val(this.value);
1507 -
1508 - _pagelayer_set_atts(row, this.value);// Save and Render
1509 -
1510 - });
1511 -
1512 -}
1513 -
1514 -// The Editor proprety
1515 -function pagelayer_elp_editor(row, prop){
1516 -
1517 - var div = '<div class="pagelayer-elp-editor-div">'+
1518 - '<textarea class="pagelayer-elp-editor">'+prop.c['val']+'</textarea>'+
1519 - '</div>';
1520 -
1521 - row.append(div);
1522 -
1523 - var editor = row.find('.pagelayer-elp-editor');
1524 -
1525 - // No SVG Icons for now
1526 - //jQuery.trumbowyg.svgPath = false;
1527 -
1528 - // Initiate the editor
1529 - editor.trumbowyg({
1530 - autogrow: false,
1531 - btns:[
1532 - ['viewHTML'],
1533 - ['undo', 'redo'], // Only supported in Blink browsers
1534 - ['formatting'],
1535 - ['fontfamily'],
1536 - ['foreColor', 'backColor',],
1537 - ['strong', 'em', 'del'],
1538 - ['superscript', 'subscript'],
1539 - ['link'],
1540 - ['wpmedia'],
1541 - ['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull'],
1542 - ['unorderedList', 'orderedList'],
1543 - ['horizontalRule'],
1544 - ['removeformat'],
1545 - ['fullscreen']
1546 - ],
1547 - imageWidthModalEdit: true,
1548 -
1549 - // Handle the changes made in the editor
1550 - }).on('tbwchange', function(){
1551 - _pagelayer_set_atts(row, editor.trumbowyg('html'));// Save and Render
1552 - });
1553 -
1554 -}
1555 -
1556 -// The Link proprety
1557 -function pagelayer_elp_link(row, prop){
1558 -
1559 - // TODO : Implement pagelayer-elp-link-icon
1560 - var div = '<div class="pagelayer-elp-link-div pagelayer-elp-input-icon">'+
1561 - '<input class="pagelayer-elp-link" type="text" value="'+prop.c['val']+'" />'+
1562 - '<i class="fa fa-link pagelayer-elp-link-icon" />'+
1563 - '</div>';
1564 -
1565 - row.append(div);
1566 -
1567 - // Set a Link
1568 - row.find('.pagelayer-elp-link').on('change', function(){
1569 - _pagelayer_set_atts(row, jQuery(this).val());// Save and Render
1570 - });
1571 -
1572 -}
1573 -
1574 -// The Textarea property
1575 -function pagelayer_elp_textarea(row, prop){
1576 -
1577 - var div = '<div class="pagelayer-elp-textarea-div">'+
1578 - '<textarea class="pagelayer-elp-textarea">'+prop.c['val']+'</textarea>'+
1579 - '</div>';
1580 -
1581 - row.append(div);
1582 -
1583 - // Handle on change
1584 - row.find('.pagelayer-elp-textarea').on('input', function(){
1585 - _pagelayer_set_atts(row, pagelayer_trim(jQuery(this).val()));// Save and Render
1586 - });
1587 -};
1588 -
1589 -// Clear all editable
1590 -function pagelayer_clear_editable(){
1591 -
1592 - // Destroy all
1593 - for(var x in pagelayer_editor){
1594 - pagelayer_editor[x].pen.destroy();
1595 - pagelayer_editor[x].$.removeClass('pagelayer-pen');
1596 - }
1597 -
1598 -};
1599 -
1600 -// Makes a field editable in the DOM
1601 -function pagelayer_make_editable(jEle, e){
1602 -
1603 - // Is it already setup ?
1604 - if(jEle.hasClass('pagelayer-pen')){
1605 - //console.log('HERE');
1606 - return true;
1607 - }
1608 -
1609 - var prop = jEle.attr('pagelayer-editable');
1610 -
1611 - // Destroy the existing pen
1612 - if(!pagelayer_empty(pagelayer_editor[prop])){
1613 - pagelayer_editor[prop].pen.destroy();
1614 - pagelayer_editor[prop].$.removeClass('pagelayer-pen');
1615 - }
1616 -
1617 - // The parent element
1618 - var pEle = jEle.closest('.pagelayer-ele');
1619 -
1620 - var options = {
1621 - class: 'pagelayer-pen',
1622 - editor: jEle[0],
1623 - list: ['bold', 'italic', 'underline', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'strike'],
1624 - stay: false
1625 - }
1626 -
1627 - // Setup the editor
1628 - pagelayer_editor[prop] = {};
1629 - pagelayer_editor[prop].pen = new Pen(options);
1630 - pagelayer_editor[prop].$ = jEle;
1631 -
1632 - // Are we the clicked object, then set the focus
1633 - if(e){
1634 - var target = jQuery(e.target);
1635 - if(target.is(jEle).length || jEle.find(target).length){
1636 - jEle.focus();
1637 - }
1638 - }
1639 -
1640 - // Reverse setup the event
1641 - jEle.on('blur', function(){
1642 - //pagelayer_editor[prop].pen.destroy();
1643 - });
1644 -
1645 - // Reverse setup the event
1646 - jEle.on('focus', function(){
1647 - jQuery('.pagelayer-pen-menu').hide();
1648 - pagelayer_editor[prop].pen.rebuild();
1649 - });
1650 -
1651 - // Reverse setup the event
1652 - jEle.on('input', function(){
1653 -
1654 - var val = pagelayer_trim(jEle.html());
1655 -
1656 - // Set the property as well
1657 - pagelayer_set_atts(pEle, prop, val);
1658 -
1659 - // Update the property
1660 - var input = pagelayer.$$('[pagelayer-elp-name='+prop+']').find('input,textarea,.trumbowyg-editor');
1661 - //console.log(input);
1662 -
1663 - if(input.length > 0){
1664 - if(input.hasClass('trumbowyg-editor')){
1665 - input.html(val);
1666 - }else{
1667 - input.val(val);
1668 - }
1669 - }
1670 -
1671 - });
1672 -
1673 -}
1674 -
1675 -// The Icon Property
1676 -function pagelayer_elp_icon(row, prop){
1677 -
1678 - var $ = jQuery;
1679 -
1680 - // Find the available icons
1681 - if(pagelayer_empty(pagelayer_icons)){
1682 -
1683 - pagelayer_icons = $.map($.map(document.styleSheets, function(s){
1684 -
1685 - if(s.href && s.href.match(/font\-awesome\.min\.css/)){
1686 - return s;
1687 - }
1688 - return null;
1689 -
1690 - })[0].cssRules, function(r) {
1691 -
1692 - if(r.cssText.indexOf('::before { content: ') > 0){
1693 - return r.cssText.substring(4,r.cssText.indexOf('::'));
1694 - }
1695 - return null;
1696 -
1697 - });
1698 -
1699 - }
1700 -
1701 - var icons = pagelayer_icons;
1702 - //console.log(icons);
1703 -
1704 - if('list' in prop && prop.list.length > 0){
1705 - icons = prop.list;
1706 - }
1707 -
1708 - // Icon function
1709 - var icon_html = function(name){
1710 - return '<span class="pagelayer-elp-icon-span">'+
1711 - '<i class="fa fa-'+name+'" icon="fa fa-'+name+'" /> '+name+
1712 - '</span>';
1713 - }
1714 -
1715 - var div = '<div class="pagelayer-elp-icon-div">'+
1716 - '<div class="pagelayer-elp-icon-preview">'+
1717 - '<i class="fa fa-'+prop.c['val']+'"></i>'+
1718 - '<span class="pagelayer-elp-icon-name">'+
1719 - (pagelayer_empty(prop.c['val'])?'Choose icon':prop.c['val'])+
1720 - '</span>'+
1721 - '</div>'+
1722 - '<span class="pagelayer-elp-icon-open">▼</span>'+
1723 - '</div>';
1724 -
1725 - row.append(div);
1726 -
1727 - // Make all icons list
1728 - var html = '<div class="pagelayer-elp-icon-selector">'+
1729 - '<input type="text" class="pagelayer-elp-search-icon" name="search-icon" placeholder="'+pagelayer_l('search')+'">'+
1730 - '<div class="pagelayer-elp-icon-list">';
1731 -
1732 - for(var x in icons){
1733 - html += icon_html(icons[x]);
1734 - }
1735 -
1736 - html += '</div>'+
1737 - '</div>';
1738 -
1739 - row.append(html);
1740 -
1741 - // Open the selector
1742 - row.find('.pagelayer-elp-icon-div').on('click', function(){
1743 - row.find('.pagelayer-elp-icon-selector').slideToggle();
1744 - });
1745 -
1746 - // Handle search of icon
1747 - row.find('.pagelayer-elp-search-icon').on('keyup', function(){
1748 -
1749 - var v = this.value;
1750 - var span ='';
1751 - v = v.toLowerCase();
1752 - v = v.replace(/\s+/g, '-');
1753 -
1754 - for(var x in icons){
1755 - if(icons[x].substring(0, v.length) === v){
1756 - span += icon_html(icons[x]);
1757 - }
1758 - }
1759 -
1760 - row.find('.pagelayer-elp-icon-list').empty().html(span);
1761 -
1762 - });
1763 -
1764 - // Handle click within the icon selector
1765 - row.find('.pagelayer-elp-icon-selector').on('click', function(e){
1766 -
1767 - var jEle = jQuery(e.target);
1768 - var i = jEle.children().attr('icon');
1769 - if(pagelayer_empty(i)){
1770 - return false;
1771 - }
1772 -
1773 - i = i.replace('fa fa-', '');
1774 -
1775 - // Set the icon in this list
1776 - row.find('.pagelayer-elp-icon-preview').html('<i class="fa fa-'+i+'"></i><span class="pagelayer-elp-icon-name">'+i+'</span>');
1777 - row.find('.pagelayer-elp-icon-selector').slideUp();
1778 -
1779 - _pagelayer_set_atts(row, i);// Save and Render
1780 -
1781 - return false;
1782 -
1783 - });
1784 -
1785 -}
1786 -
1787 -// The Color Property
1788 -function pagelayer_elp_color(row, prop){
1789 -
1790 - var div = '<div class="pagelayer-elp-color-div">'+
1791 - '<div class="pagelayer-elp-color-preview"></div>'+
1792 - '</div>';
1793 -
1794 - row.append(div);
1795 -
1796 - row.find('.pagelayer-elp-color-preview').css('background', prop.c['val']);
1797 -
1798 - var picker = new Picker({
1799 - parent : row.find('.pagelayer-elp-color-div')[0],
1800 - popup : 'left',
1801 - color : prop.c['val'],
1802 - doc: window.parent.document
1803 - });
1804 -
1805 - // Handle selected color
1806 - picker.onChange = function(color) {
1807 - row.find('.pagelayer-elp-color-preview').css('background', color.rgbaString);
1808 - _pagelayer_set_atts(row, color.hex);// Save and Render
1809 - };
1810 -
1811 -}
1812 -
1813 -// The Spinner property
1814 -function pagelayer_elp_spinner(row, prop){
1815 -
1816 - var div = '<div class="pagelayer-elp-spinner-div">'+
1817 - '<input type="number" class="pagelayer-elp-spinner" name="'+prop.c['name']+'"'+
1818 - ' min="'+prop['min']+'" max="'+prop['max']+'" step="'+prop['step']+'" value="'+prop.c['val']+'"/>'+
1819 - '</div>';
1820 -
1821 - row.append(div);
1822 -
1823 - row.find('input').on('input', function(){
1824 - _pagelayer_set_atts(row, jQuery(this).val());// Save and Render
1825 - });
1826 -
1827 -}
1828 -
1829 -// The Group Property
1830 -function pagelayer_elp_group(row, prop){
1831 -
1832 - // Remove the pagelayer-show-tab
1833 - row.removeAttr('pagelayer-show-tab');
1834 -
1835 - var div = '<div class="pagelayer-elp-group-div"></div>'+
1836 - '<center><button class="pagelayer-elp-button">'+prop['text']+'</button></center>';
1837 -
1838 - row.append(div);
1839 -
1840 - // Add button
1841 - var add_item = function(row){
1842 -
1843 - var ele_id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id') || '';
1844 - var pEle = jQuery('[pagelayer-id="'+ele_id+'"]');
1845 -
1846 - // First add the element inside the group element
1847 - var id = pagelayer_element_add_child(pEle, prop['sc']);
1848 - //pagelayer_element_setup('[pagelayer-id='+id+']', true);
1849 -
1850 - show_item(id);
1851 -
1852 - };
1853 -
1854 - // Show the properties of the existing things
1855 - var show_item = function(id, sel){
1856 -
1857 - // To append after an existing item
1858 - sel = sel || false;
1859 -
1860 - // If pagelayer id empty then return
1861 - if(pagelayer_empty(id)){
1862 - return false;
1863 - }
1864 -
1865 - // Since the element is added very fast, we reselect via jQuery for it to re-access the dom
1866 - jEle = jQuery('[pagelayer-id="'+id+'"]');
1867 -
1868 - var label_param = prop['item_label']['param'] || '';
1869 - var title = pagelayer_get_att(jEle, label_param) || prop['item_label']['default'];
1870 -
1871 - // We need to get the correct value for select based params which are the label
1872 - var child_props = pagelayer_shortcodes[prop.sc];
1873 - for(var section in child_props){
1874 - for(var _param in child_props[section]){
1875 - if(child_props[section][_param]['type'] == 'select'){
1876 - if(title in child_props[section][_param]['list']){
1877 - title = child_props[section][_param]['list'][title];
1878 - }
1879 - }
1880 - }
1881 - }
1882 -
1883 - // Create the HTML
1884 - var holder = jQuery('<div class="pagelayer-elp-group-item" pagelayer-group-item-id="'+id+'">'+
1885 - '<div class="pagelayer-elp-group-item-head">'+
1886 - '<span class="pagelayer-elp-group-item-drag"><i class="fa fa-bars" /></span>'+
1887 - '<span class="pagelayer-elp-group-item-title">'+title+'</span>'+
1888 - '<span class="pagelayer-elp-group-item-clone"><i class="fa fa-clone" /></span>'+
1889 - '<span class="pagelayer-elp-group-item-del"><i class="fa fa-trash" /></span>'+
1890 - '</div>'+
1891 - '<div class="pagelayer-elp-group-item-body"></div>'+
1892 - '</div>');
1893 -
1894 - // Append to the row
1895 - if(sel){
1896 - row.find(sel).after(holder);
1897 - }else{
1898 - row.find('.pagelayer-elp-group-div').first().append(holder);
1899 - }
1900 -
1901 - // Setup the toggle
1902 - holder.find('.pagelayer-elp-group-item-title').first().on('click', function(){
1903 - var rEle = holder.find('.pagelayer-elp-group-item-body').first();
1904 - var r_id = holder.attr('pagelayer-group-item-id');
1905 -
1906 - // If the props are not already setup
1907 - if(rEle.html().length < 1){
1908 -
1909 - pagelayer_elpd_generate(jQuery('[pagelayer-id="'+r_id+'"]'), rEle);
1910 -
1911 - // Change the group item title
1912 - var tmp_title = holder.find('[pagelayer-elp-name="'+label_param+'"] [name="'+label_param+'"]');
1913 -
1914 - if(tmp_title.length > 0){
1915 - jQuery(tmp_title).on('input', function(){
1916 - holder.find('.pagelayer-elp-group-item-title').html(tmp_title.val());
1917 - });
1918 - }
1919 -
1920 - }
1921 -
1922 - rEle.toggle('slow');
1923 - });
1924 -
1925 - // Clone the item
1926 - holder.find('.pagelayer-elp-group-item-head .fa-clone').on('click', function(){
1927 -
1928 - // If the element have any parent
1929 - var jEle = jQuery('[pagelayer-id="'+id+'"]');
1930 - var par = pagelayer_get_parent(jEle);
1931 - var clone_ele = pagelayer_copy_element(jEle);
1932 - //console.log(clone_ele);console.log('[pagelayer-group-item-id="'+id+'"]');
1933 - show_item(clone_ele, '[pagelayer-group-item-id="'+id+'"]');
1934 -
1935 - if(par){
1936 - pagelayer_sc_render(pagelayer_ele_by_id(par));
1937 - }
1938 - });
1939 -
1940 - // Delete the item
1941 - holder.find('.pagelayer-elp-group-item-head .fa-trash').on('click', function(){
1942 -
1943 - // If the element have any parent
1944 - var jEle = jQuery('[pagelayer-id="'+id+'"]');
1945 - var par = pagelayer_get_parent(jEle);
1946 - holder.remove();
1947 - pagelayer_delete_element(jEle);
1948 -
1949 - if(par){
1950 - pagelayer_sc_render(pagelayer_ele_by_id(par));
1951 - }
1952 - });
1953 -
1954 - };
1955 -
1956 - // Handle click of the group
1957 - row.find('.pagelayer-elp-button').on('click', function(){
1958 - add_item(row);
1959 - });
1960 -
1961 - // Find the existing items
1962 - prop.el.$.find('[pagelayer-tag='+prop['sc']+']').each(function(){
1963 - var jEle = jQuery(this);
1964 - var id = pagelayer_assign_id(jEle);
1965 - show_item(id);
1966 - });
1967 -};
1968 -
1969 -// The Datetime Property
1970 -function pagelayer_elp_datetime(row, prop){
1971 -
1972 - var div = '<div class="pagelayer-elp-datetime-div pagelayer-elp-input-icon">'+
1973 - '<input type="date" class="pagelayer-elp-datetime" name="'+prop.c['name']+'" value="'+prop.c['val']+'" />'+
1974 - '</div>';
1975 -
1976 - row.append(div);
1977 -
1978 - row.find('.pagelayer-elp-datetime').on('change', function(){
1979 - _pagelayer_set_atts(row, jQuery(this).val());// Save and Render
1980 - });
1981 -
1982 -};
1983 -
1984 -// The padding property
1985 -function pagelayer_elp_padding(row, prop){
1986 - var val = ['', '', '', ''];
1987 -
1988 - if(prop.c['val'].length > 0){
1989 - val = prop.c['val'].split(',');
1990 - //console.log(val)
1991 - }
1992 -
1993 - var div = '<div class="pagelayer-elp-padding-div">'+
1994 - '<input type="number" class="pagelayer-elp-padding" value="'+parseInt(val[0])+'"></input>'+
1995 - '<input type="number" class="pagelayer-elp-padding" value="'+parseInt(val[1])+'"></input>'+
1996 - '<input type="number" class="pagelayer-elp-padding" value="'+parseInt(val[2])+'"></input>'+
1997 - '<input type="number" class="pagelayer-elp-padding" value="'+parseInt(val[3])+'"></input>'+
1998 - '<i class="fa fa-link" />'+
1999 - '</div>';
2000 -
2001 - row.append(div);
2002 -
2003 - // Is the value linked ?
2004 - var link = row.find('.pagelayer-elp-padding-div .fa');
2005 - var isLinked = 1;
2006 - //isLinked = isLinked == 2 ? false : true;
2007 - //console.log(isLinked);
2008 - var tmp_val = val[0];
2009 -
2010 - for(var p_val in val){
2011 -
2012 - // Check if unlinked
2013 - if(tmp_val != val[p_val] ){
2014 - isLinked = 0;
2015 - }
2016 - tmp_val = val[p_val];
2017 - }
2018 -
2019 - if(isLinked){
2020 - link.addClass('pagelayer-elp-padding-linked');
2021 - }else{
2022 - link.removeClass('pagelayer-elp-padding-linked');
2023 - }
2024 -
2025 - // Handle link on click
2026 - link.on('click', function(){
2027 -
2028 - var linked = link.hasClass('pagelayer-elp-padding-linked');
2029 -
2030 - if(linked){
2031 - link.removeClass('pagelayer-elp-padding-linked');
2032 - }else{
2033 - link.addClass('pagelayer-elp-padding-linked');
2034 - }
2035 -
2036 - });
2037 -
2038 - row.find('input').on('input', function(){
2039 -
2040 - // Are the values linked
2041 - var linked = row.find('.pagelayer-elp-padding-div .fa').hasClass('pagelayer-elp-padding-linked');
2042 -
2043 - if(linked){
2044 - var val = jQuery(this).val();
2045 - row.find('input').each(function(){
2046 - jQuery(this).val(val);
2047 - });
2048 - }
2049 -
2050 - var vals = [];
2051 -
2052 - // Get all values
2053 - row.find('input').each(function(){
2054 - var val = jQuery(this).val();
2055 - vals.push(val ? val : 0);
2056 - });
2057 -
2058 - _pagelayer_set_atts(row, vals);// Save and Render
2059 - });
2060 -
2061 -};
2062 -
2063 -// The shadow property
2064 -function pagelayer_elp_shadow(row, prop){
2065 -
2066 - var val =['','','',''];
2067 -
2068 - // Do we have a val ?
2069 - if(!pagelayer_empty(prop.c['val'])){
2070 - val = prop.c['val'].split(',');
2071 - }
2072 -
2073 - //var val = {color: '', blur: '', horizontal: '', vertical: ''};
2074 -
2075 - var div = '<span class="pagelayer-prop-edit"><i class="fa fa-pencil"></i></span>'+
2076 - '<div class="pagelayer-elp-shadow-div">'+
2077 - '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-horizontal">'+
2078 - '<label class="pagelayer-elp-label">Horizontal</label>'+
2079 - '<input class="pagelayer-elp-shadow-input" type="number" max="100" min="-100" step="1" class="pagelayer-elp-shadow-blur" value="'+val[0]+'"></input>'+
2080 - '</div>'+
2081 - '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-vertical">'+
2082 - '<label class="pagelayer-elp-label">Vertical</label>'+
2083 - '<input class="pagelayer-elp-shadow-input" type="number" max="100" min="-100" step="1" class="pagelayer-elp-shadow-blur" value="'+val[1]+'"></input>'+
2084 - '</div>'+
2085 - '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-blur">'+
2086 - '<label class="pagelayer-elp-label">Blur</label>'+
2087 - '<input class="pagelayer-elp-shadow-input" type="number" max="100" min="0" step="1" class="pagelayer-elp-shadow-blur" value="'+val[2]+'"></input>'+
2088 - '</div>'+
2089 - '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-color">'+
2090 - '<label class="pagelayer-elp-label">color</label>'+
2091 - '<div class="pagelayer-elp-color-div">'+
2092 - '<div class="pagelayer-elp-color-preview"></div>'+
2093 - '</div>'+
2094 - '</div>'+
2095 - '</div>';
2096 -
2097 - row.append(div);
2098 -
2099 - row.find('.pagelayer-prop-edit').on('click', function(){
2100 - row.find('.pagelayer-elp-shadow-div').toggleClass('pagelayer-prop-show');
2101 - });
2102 -
2103 - row.find('.pagelayer-elp-color-preview').css('background', val[3]);
2104 -
2105 - var picker = new Picker({
2106 - parent : row.find('.pagelayer-elp-color-div')[0],
2107 - popup : 'left',
2108 - doc: window.parent.document
2109 - });
2110 -
2111 - // Handle selected color
2112 - picker.onChange = function(color) {
2113 - row.find('.pagelayer-elp-color-preview').css('background', color.rgbaString);
2114 - val[3] = (color.hex ? color.hex : '');
2115 - _pagelayer_set_atts(row, val);
2116 - };
2117 -
2118 - row.find('input').on('input', function(){
2119 - var i = 0;
2120 - row.find('.pagelayer-elp-shadow-input').each(function(){
2121 - var value = jQuery(this).val();
2122 - val[i] = (value ? value : '');
2123 - i++;
2124 - });
2125 - _pagelayer_set_atts(row, val);
2126 - });
2127 -
2128 -}
2129 -
2130 -// The filter property
2131 -function pagelayer_elp_filter(row, prop){
2132 -
2133 - var val =['','','','','','',''];
2134 -
2135 - // Do we have a val ?
2136 - if(!pagelayer_empty(prop.c['val'])){
2137 - val = prop.c['val'].split(',');
2138 - }
2139 -
2140 - var filters = [['blur','10','0.1'],['brightness','200','1'],['contrast','200','1'],['grayscale','200','1'],['hue','360','1'],['opacity','100','1'],['saturate','200','1']];
2141 -
2142 - var div = '<span class="pagelayer-prop-edit"><i class="fa fa-pencil"></i></span>'+
2143 - '<div class="pagelayer-elp-filter-div">';
2144 -
2145 - jQuery.each(val,function(key, value){
2146 - div += '<div class="pagelayer-elp-prop-grp pagelayer-elp-filter-'+filters[key][0]+'">'+
2147 - '<label class="pagelayer-elp-label">'+filters[key][0]+'</label>'+
2148 - '<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>'+
2149 - '<span class="pagelayer-elp-filter-val">'+value+'</span>'+
2150 - '</div>';
2151 - });
2152 -
2153 - div += '</div>';
2154 -
2155 - row.append(div);
2156 -
2157 - row.find('.pagelayer-prop-edit').on('click', function(){
2158 - row.find('.pagelayer-elp-filter-div').toggleClass('pagelayer-prop-show');
2159 - });
2160 -
2161 - row.find('input').on('input', function(){
2162 - var val = [];
2163 - jQuery(this).parent().find('span').html(this.value);
2164 - row.find('.pagelayer-elp-filter-input').each(function(){
2165 - var value = jQuery(this).val();
2166 - val.push(value ? value : 'none');
2167 - });
2168 - _pagelayer_set_atts(row, val);
2169 - });
2170 -
2171 -}
2172 -
2173 -// The gradient property
2174 -function pagelayer_elp_gradient(row, prop){
2175 -
2176 - var val =['','','','','','',''];
2177 -
2178 - // Do we have a val ?
2179 - if(!pagelayer_empty(prop.c['val'])){
2180 - val = prop.c['val'].split(',');
2181 - }
2182 -
2183 - //var val = {color: '', blur: '', horizontal: '', vertical: ''};
2184 -
2185 - var div = '<div class="pagelayer-elp-gradient-div">'+
2186 - '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-angle">'+
2187 - '<label class="pagelayer-elp-label">Angle</label>'+
2188 - '<input class="pagelayer-elp-gradient-input" type="number" max="360" min="0" step="1" class="pagelayer-elp-gradient-angle" value="'+val[0]+'"></input>'+
2189 - '</div>'+
2190 - '<div class="pagelayer-elp-prop-grp">'+
2191 - '<label class="pagelayer-elp-label">color 1</label>'+
2192 - '<div class="pagelayer-elp-color-div">'+
2193 - '<div class="pagelayer-elp-gradient-color1 pagelayer-elp-color-preview"></div>'+
2194 - '</div>'+
2195 - '</div>'+
2196 - '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-per1">'+
2197 - '<label class="pagelayer-elp-label">Percentage 1</label>'+
2198 - '<input class="pagelayer-elp-gradient-input" type="number" max="100" min="-100" step="1" class="pagelayer-elp-gradient-per1" value="'+val[2]+'"></input>'+
2199 - '</div>'+
2200 - '<div class="pagelayer-elp-prop-grp">'+
2201 - '<label class="pagelayer-elp-label">color 2</label>'+
2202 - '<div class="pagelayer-elp-color-div">'+
2203 - '<div class="pagelayer-elp-gradient-color2 pagelayer-elp-color-preview"></div>'+
2204 - '</div>'+
2205 - '</div>'+
2206 - '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-per2">'+
2207 - '<label class="pagelayer-elp-label">Percentage 2</label>'+
2208 - '<input class="pagelayer-elp-gradient-input" type="number" max="100" min="0" step="1" class="pagelayer-elp-gradient-per2" value="'+val[4]+'"></input>'+
2209 - '</div>'+
2210 - '<div class="pagelayer-elp-prop-grp">'+
2211 - '<label class="pagelayer-elp-label">color 3</label>'+
2212 - '<div class="pagelayer-elp-color-div">'+
2213 - '<div class="pagelayer-elp-gradient-color3 pagelayer-elp-color-preview"></div>'+
2214 - '</div>'+
2215 - '</div>'+
2216 - '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-per3">'+
2217 - '<label class="pagelayer-elp-label">Percentage 3</label>'+
2218 - '<input class="pagelayer-elp-gradient-input" type="number" max="100" min="0" step="1" class="pagelayer-elp-gradient-per3" value="'+val[6]+'"></input>'+
2219 - '</div>'+
2220 - '</div>';
2221 -
2222 - row.append(div);
2223 - var i = 1;
2224 - row.find('.pagelayer-elp-color-preview').each(function(){
2225 - jQuery(this).css('background', val[i]);
2226 - i = i+2;
2227 - });
2228 -
2229 - var picker1 = new Picker({
2230 - parent : row.find('.pagelayer-elp-gradient-color1')[0],
2231 - popup : 'left',
2232 - doc: window.parent.document
2233 - });
2234 -
2235 - // Handle selected color
2236 - picker1.onChange = function(color) {
2237 - row.find('.pagelayer-elp-gradient-color1').css('background', color.rgbaString);
2238 - val[1] = (color.hex ? color.hex : '');
2239 - _pagelayer_set_atts(row, val);
2240 - };
2241 -
2242 - var picker2 = new Picker({
2243 - parent : row.find('.pagelayer-elp-gradient-color2')[0],
2244 - popup : 'left',
2245 - doc: window.parent.document
2246 - });
2247 -
2248 - // Handle selected color
2249 - picker2.onChange = function(color) {
2250 - row.find('.pagelayer-elp-gradient-color2').css('background', color.rgbaString);
2251 - val[3] = (color.hex ? color.hex : '');
2252 - _pagelayer_set_atts(row, val);
2253 - };
2254 -
2255 - var picker3 = new Picker({
2256 - parent : row.find('.pagelayer-elp-gradient-color3')[0],
2257 - popup : 'left',
2258 - doc: window.parent.document
2259 - });
2260 -
2261 - // Handle selected color
2262 - picker3.onChange = function(color) {
2263 - row.find('.pagelayer-elp-gradient-color3').css('background', color.rgbaString);
2264 - val[5] = (color.hex ? color.hex : '');
2265 - _pagelayer_set_atts(row, val);
2266 - };
2267 -
2268 - row.find('input').on('input', function(){
2269 - var i = 0;
2270 - row.find('.pagelayer-elp-gradient-input').each(function(){
2271 - var value = jQuery(this).val();
2272 - val[i] = (value ? value : '');
2273 - i = i+2;
2274 - });
2275 - _pagelayer_set_atts(row, val);
2276 - });
2277 -
2278 -}
2279 -
2280 -// The typography property
2281 -function pagelayer_elp_typography(row, prop){
2282 -
2283 - var val =['','','','','','','','','',''];
2284 -
2285 - // Do we have a val ?
2286 - if(!pagelayer_empty(prop.c['val'])){
2287 - val = prop.c['val'].split(',');
2288 - }
2289 -
2290 - var select = { 'style' : ['', 'Normal', 'Italic', 'Oblique'],
2291 - 'weight' : ['', '100', '200', '300', '400', '500', '600', '700', '800', '900'],
2292 - 'variant' : ['', 'Normal', 'Small-caps'],
2293 - 'deco-line' : ['', 'None', 'Overline', 'Line-through', 'Underline', 'Underline Overline'],
2294 - 'deco-style' : ['Solid', 'Double', 'Dotted', 'Dashed', 'Wavy'],
2295 - 'transform' : ['', 'Capitalize', 'Uppercase', 'Lowercase'],
2296 - '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']
2297 - }
2298 -
2299 - var option = function(val, setVal){
2300 - var selected = (val != setVal) ? '' : 'selected="selected"';
2301 - var lang = pagelayer_empty(val) ? 'Default' : val;
2302 - return '<option value="'+val+'" '+selected+'>'+ lang +'</option>';
2303 - }
2304 -
2305 - var font_option = function(val, setVal){
2306 - var selected = (val != setVal) ? '' : 'selected="selected"';
2307 - var lang = pagelayer_empty(val) ? 'Default' : val;
2308 - return '<option style="font-family:'+lang+'" value="'+val+'" '+selected+'>'+ lang +'</option>';
2309 - }
2310 -
2311 - var div = '<span class="pagelayer-prop-edit"><i class="fa fa-pencil"></i></span>'+
2312 - '<div class="pagelayer-elp-typo-div">'+
2313 - '<div class="pagelayer-elp-typo pagelayer-elp-typo-fonts">'+
2314 - '<label class="pagelayer-elp-label">Font-Family</label>'+
2315 - '<select class="pagelayer-elp-typo-input">';
2316 -
2317 - jQuery.each(select['fonts'],function(key, value){
2318 - div += font_option(value, val[0]);
2319 - });
2320 - div +='</select>'+
2321 - '</div>'+
2322 - '<div class="pagelayer-elp-typo pagelayer-elp-typo-size">'+
2323 - '<label class="pagelayer-elp-label">Font-Size</label>'+
2324 - '<input class="pagelayer-elp-typo-input" type="number" max="200" min="0" step="1" value="'+val[1]+'"></input>'+
2325 - '</div>'+
2326 - '<div class="pagelayer-elp-typo pagelayer-elp-typo-style">'+
2327 - '<label class="pagelayer-elp-label">Font-Style</label>'+
2328 - '<select class="pagelayer-elp-typo-input">';
2329 -
2330 - jQuery.each(select['style'],function(key, value){
2331 - div += option(value, val[2]);
2332 - });
2333 - div +='</select>'+
2334 - '</div>'+
2335 - '<div class="pagelayer-elp-typo pagelayer-elp-typo-weight">'+
2336 - '<label class="pagelayer-elp-label">Font-Weight</label>'+
2337 - '<select class="pagelayer-elp-typo-input">';
2338 - jQuery.each(select['weight'],function(key, value){
2339 - div += option(value, val[3]);
2340 - });
2341 -
2342 - div += '</select>'+
2343 - '</div>'+
2344 - '<div class="pagelayer-elp-typo pagelayer-elp-typo-variant">'+
2345 - '<label class="pagelayer-elp-label">Font-variant</label>'+
2346 - '<select class="pagelayer-elp-typo-input">';
2347 - jQuery.each(select['variant'],function(key, value){
2348 - div += option(value, val[4]);
2349 - });
2350 -
2351 - div += '</select>'+
2352 - '</div>'+
2353 - '<div class="pagelayer-elp-typo pagelayer-elp-typo-deco-line">'+
2354 - '<label class="pagelayer-elp-label">Decoration Line</label>'+
2355 - '<select class="pagelayer-elp-typo-input">';
2356 - jQuery.each(select['deco-line'],function(key, value){
2357 - div += option(value, val[5]);
2358 - });
2359 -
2360 - div += '</select>'+
2361 - '</div>'+
2362 - '<div class="pagelayer-elp-typo pagelayer-elp-typo-deco-style">'+
2363 - '<label class="pagelayer-elp-label">Decoration Style</label>'+
2364 - '<select class="pagelayer-elp-typo-input">';
2365 - jQuery.each(select['deco-style'],function(key, value){
2366 - div += option(value, val[6]);
2367 - });
2368 -
2369 - div += '</select>'+
2370 - '</div>'+
2371 - '<div class="pagelayer-elp-typo pagelayer-elp-typo-height">'+
2372 - '<label class="pagelayer-elp-label">Line Height</label>'+
2373 - '<input class="pagelayer-elp-typo-input" type="number" max="15" min="0" step="0.1" value="'+val[7]+'"></input>'+
2374 - '</div>'+
2375 - '<div class="pagelayer-elp-typo pagelayer-elp-typo-transform">'+
2376 - '<label class="pagelayer-elp-label">Text Transform</label>'+
2377 - '<select class="pagelayer-elp-typo-input">';
2378 - jQuery.each(select['transform'],function(key, value){
2379 - div += option(value, val[8]);
2380 - });
2381 -
2382 - div += '</select>'+
2383 - '</div>'+
2384 - '<div class="pagelayer-elp-typo pagelayer-elp-typo-lspacing">'+
2385 - '<label class="pagelayer-elp-label">Letter Spacing</label>'+
2386 - '<input class="pagelayer-elp-typo-input" type="number" max="10" min="-10" step="0.1" value="'+val[9]+'"></input>'+
2387 - '</div>'+
2388 - '<div class="pagelayer-elp-typo pagelayer-elp-typo-wspacing">'+
2389 - '<label class="pagelayer-elp-label">Word Spacing</label>'+
2390 - '<input class="pagelayer-elp-typo-input" type="number" max="50" min="0" step="1" value="'+val[10]+'"></input>'+
2391 - '</div>'+
2392 - '</div>';
2393 -
2394 - row.append(div);
2395 -
2396 - if(pagelayer_empty(val[5]) || val[5]=='none'){
2397 - row.find('.pagelayer-elp-typo-deco-style').hide();
2398 - }
2399 -
2400 - row.find('.pagelayer-prop-edit').on('click', function(){
2401 - row.find('.pagelayer-elp-typo-div').toggleClass('pagelayer-prop-show');
2402 - });
2403 -
2404 -
2405 - row.find('.pagelayer-elp-typo-input').on('change', function(){
2406 - val = [];
2407 - row.find('.pagelayer-elp-typo-input').each(function(){
2408 - var value = jQuery(this).val();
2409 - val.push(value ? value : '');
2410 - });
2411 - _pagelayer_set_atts(row, val);
2412 - });
2413 -
2414 - row.find('.pagelayer-elp-typo-fonts select').on('change', function(){
2415 -
2416 - var value = jQuery(this).val();
2417 - value = value.replace(' ', '+');
2418 -
2419 - if(jQuery('#pagelayer-google-fonts').length == 0){
2420 -
2421 - 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">');
2422 -
2423 - }else{
2424 -
2425 - var url = jQuery('#pagelayer-google-fonts').attr('href');
2426 - if(url.indexOf(value) == -1){
2427 - url = url+'|'+value+':100,100i,200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i';
2428 - jQuery('#pagelayer-google-fonts').attr('href', url);
2429 - }
2430 -
2431 - }
2432 -
2433 - });
2434 -
2435 - row.find('.pagelayer-elp-typo-deco-line select').on('change', function(){
2436 - var value = jQuery(this).val();
2437 - if(pagelayer_empty(value) || value=='none'){
2438 - row.find('.pagelayer-elp-typo-deco-style').hide();
2439 - }else{
2440 - row.find('.pagelayer-elp-typo-deco-style').show();
2441 - }
2442 - });
2443 -
2444 -}
2445 -
2446 -// The dimension property
2447 -function pagelayer_elp_dimension(row, prop){
2448 -
2449 - var val = ['', ''];
2450 -
2451 - if(prop.c['val'].length > 0){
2452 - val = prop.c['val'].split(',');
2453 - //console.log(val)
2454 - }
2455 -
2456 - var div = '<div class="pagelayer-elp-dimension-div">'+
2457 - '<input type="number" class="pagelayer-elp-dimension" value="'+parseInt(val[0])+'"></input>'+
2458 - '<input type="number" class="pagelayer-elp-dimension" value="'+parseInt(val[1])+'"></input>'+
2459 - '<i class="fa fa-link" />'+
2460 - '</div>';
2461 -
2462 - row.append(div);
2463 -
2464 - // Is the value linked ?
2465 - var link = row.find('.pagelayer-elp-dimension-div .fa');
2466 - var isLinked = 1;
2467 - var tmp_val = val[0];
2468 -
2469 - for(var p_val in val){
2470 -
2471 - // Check if unlinked
2472 - if(tmp_val != val[p_val] ){
2473 - isLinked = 0;
2474 - }
2475 - tmp_val = val[p_val];
2476 - }
2477 -
2478 - if(isLinked){
2479 - link.addClass('pagelayer-elp-dimension-linked');
2480 - }else{
2481 - link.removeClass('pagelayer-elp-dimension-linked');
2482 - }
2483 -
2484 - // Handle link on click
2485 - link.on('click', function(){
2486 -
2487 - var linked = link.hasClass('pagelayer-elp-dimension-linked');
2488 -
2489 - if(linked){
2490 - link.removeClass('pagelayer-elp-dimension-linked');
2491 - }else{
2492 - link.addClass('pagelayer-elp-dimension-linked');
2493 - }
2494 -
2495 - });
2496 -
2497 - row.find('input').on('input', function(){
2498 -
2499 - // Are the values linked
2500 - var linked = row.find('.pagelayer-elp-dimension-div .fa').hasClass('pagelayer-elp-dimension-linked');
2501 -
2502 - if(linked){
2503 - var val = jQuery(this).val();
2504 - row.find('input').each(function(){
2505 - jQuery(this).val(val);
2506 - });
2507 - }
2508 -
2509 - var vals = [];
2510 -
2511 - // Get all values
2512 - row.find('input').each(function(){
2513 - var val = jQuery(this).val();
2514 - vals.push(val ? val : 0);
2515 - });
2516 -
2517 - _pagelayer_set_atts(row, vals);// Save and Render
2518 - });
2519 -
2520 -};
2521 -
2522 -// Select frame to upload media
2523 -function pagelayer_select_frame(tag, state){
2524 -
2525 - var state = state || '';
2526 - //console.log(state);
2527 -
2528 - var frame;
2529 -
2530 - switch(tag){
2531 -
2532 - // Multi image selection frame
2533 - case 'multi_image':
2534 -
2535 - frame = wp.media({
2536 -
2537 - id: 'pagelayer-wp-multi-image-library',
2538 - frame: 'post',
2539 - state: state,
2540 - title: pagelayer_l('frame_'+tag),
2541 - multiple: true,
2542 - library: wp.media.query({type: 'image'}),
2543 - button: {
2544 - text: pagelayer_l('insert')
2545 - },
2546 -
2547 - });
2548 -
2549 - break;
2550 -
2551 - // Media selection frame
2552 - case 'media':
2553 -
2554 - frame = wp.media({
2555 -
2556 - id: 'pagelayer-wp-media-library',
2557 - frame: 'post',
2558 - state: 'pagelayer-media',
2559 - title: pagelayer_l('frame_'+tag),
2560 - multiple: false,
2561 - states: [
2562 - new wp.media.controller.Library({
2563 - id: 'pagelayer-media',
2564 - title: pagelayer_l('frame_'+tag),
2565 - multiple: false,
2566 - date: true
2567 - })
2568 - ],
2569 - button: {
2570 - text: pagelayer_l('insert')
2571 - },
2572 -
2573 - });
2574 -
2575 - break;
2576 -
2577 - //Default frame(for image, video, audio)
2578 - default:
2579 -
2580 - frame = wp.media({
2581 -
2582 - id: 'pagelayer-wp-'+tag+'-library',
2583 - frame: 'post',
2584 - state: 'pagelayer-'+tag,
2585 - title: pagelayer_l('frame_'+tag),
2586 - multiple: false,
2587 - library: wp.media.query({type: tag}),
2588 - states: [
2589 - new wp.media.controller.Library({
2590 - id: 'pagelayer-'+tag,
2591 - title: pagelayer_l('frame_'+tag),
2592 - library: wp.media.query( { type: tag } ),
2593 - multiple: false,
2594 - date: true
2595 - })
2596 - ],
2597 - button: {
2598 - text: pagelayer_l('insert')
2599 - },
2600 -
2601 - });
2602 -
2603 - break;
2604 - }
2605 -
2606 - frame.on({
2607 - 'menu:render:default': function(view){
2608 - view.unset('insert');
2609 - view.unset('gallery');
2610 - view.unset('featured-image');
2611 - view.unset('playlist');
2612 - view.unset('video-playlist');
2613 - },
2614 - }, this);
2615 -
2616 - return frame;
2617 -
2618 -}
1 +
2 +// The active pagelayer element
3 +var pagelayer_active = {};
4 +
5 +// List of pagelayer icons
6 +var pagelayer_icons = {};
7 +
8 +// The inline editor
9 +var pagelayer_editor = {};
10 +
11 +// The active pagelayer element
12 +var pagelayer_active_tab = {};
13 +
14 +// The menu items refrence
15 +var pagelayer_menus_items_ref = {};
16 +
17 +// Loads the Data
18 +function pagelayer_data(jEle, clean){
19 +
20 + var ret = new Object();
21 +
22 + // Get the data
23 + ret.tag = pagelayer_tag(jEle);
24 + ret.id = pagelayer_id(jEle);
25 + ret.$ = jEle;
26 +
27 + var ref_data = pagelayer_el_data_ref(jEle);
28 +
29 + // Parse the attributes
30 + ret.atts = JSON.parse(JSON.stringify(ref_data['attr']));
31 + ret.tmp = JSON.parse(JSON.stringify(ref_data['tmp']));
32 +
33 + //console.log(ret.atts);
34 + //console.log(ret.tmp);
35 +
36 + clean = clean || false;
37 +
38 + // Remove values which have 'req'. NOTE : 'show' ones will be allowed
39 + if(clean){
40 +
41 + var tag = ret.tag;
42 +
43 + // Anything to set ?
44 + ret.set = {};
45 +
46 + // Function to clear any att data
47 + var pagelayer_delete_atts = function(x){
48 + delete ret.atts[x];
49 + delete ret.atts[x+'_tablet'];// Any tablet and mobile values as well
50 + delete ret.atts[x+'_mobile'];
51 + delete ret.set[x];
52 + }
53 +
54 + // All props
55 + var all_props = pagelayer_shortcodes[tag];
56 +
57 + // Loop through all props
58 + for(var i in pagelayer_tabs){
59 +
60 + var tab = pagelayer_tabs[i];
61 +
62 + section_loop1:
63 + for(var section in all_props[tab]){
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 +
74 + var props = section in pagelayer_shortcodes[tag] ? pagelayer_shortcodes[tag][section] : pagelayer_styles[section];
75 +
76 + // In case of widgets its possible !
77 + if(pagelayer_empty(props)){
78 + continue;
79 + }
80 +
81 + for(var x in props){
82 +
83 + var prop = props[x];
84 +
85 + // Any prop to skip ?
86 + if(!pagelayer_empty(all_props['skip_props']) && jQuery.inArray(x, all_props['skip_props']) > -1){
87 + pagelayer_delete_atts(x);
88 + continue;
89 + }
90 +
91 + // Are we to set this value ?
92 + if(!(x in ret.atts) && 'default' in prop && !pagelayer_empty(prop['default'])){
93 +
94 + // We need to make sure its not a PRO value
95 + if(!('pro' in prop && pagelayer_empty(pagelayer_pro))){
96 +
97 + var tmp_val = prop['default'];
98 +
99 + // If there is a unit and there is no unit suffix in atts value
100 + if('units' in prop){
101 + if(jQuery.isNumeric(tmp_val)){
102 + tmp_val = tmp_val+prop['units'][0];
103 + }else{
104 + var sep = 'sep' in prop ? prop['sep'] : ',';
105 + var tmp2 = tmp_val.split(sep);
106 + for(var k in tmp2){
107 + if(jQuery.isNumeric(tmp2[k])){
108 + tmp2[k] = tmp2[k]+prop['units'][0];
109 + }
110 + }
111 + tmp_val = tmp2.join(sep);
112 + }
113 + }
114 +
115 + //console.log(x+' - '+tmp_val);
116 + ret.set[x] = tmp_val;
117 +
118 + }
119 + }
120 +
121 + if(!('req' in prop)){
122 + continue;
123 + }
124 +
125 + //console.log('[pagelayer_data] Cleaning :'+x);
126 +
127 + // List of considerations
128 + var show = prop['req'];
129 +
130 + // We will hide by default
131 + var toShow = true;
132 +
133 + for(var showParam in show){
134 + var reqval = show[showParam];
135 + var except = showParam.substr(0, 1) == '!' ? true : false;
136 + showParam = except ? showParam.substr(1) : showParam;
137 + var val = ret.atts[showParam] || '';
138 +
139 + //console.log('Show '+x+' '+showParam+' '+reqval+' '+val);
140 +
141 + // Is the value not the same, then we can show
142 + if(except){
143 +
144 + if(typeof reqval == 'string' && reqval == val){
145 + toShow = false;
146 + break;
147 + }
148 +
149 + // Its an array and a value is found, then dont show
150 + if(typeof reqval != 'string' && reqval.indexOf(val) > -1){
151 + toShow = false;
152 + break;
153 + }
154 +
155 + // The value must be equal
156 + }else{
157 +
158 + if(typeof reqval == 'string' && reqval != val){
159 + toShow = false;
160 + break;
161 + }
162 +
163 + // Its an array and no value is found, then dont show
164 + if(typeof reqval != 'string' && reqval.indexOf(val) === -1){
165 + toShow = false;
166 + break;
167 + }
168 + }
169 +
170 + }
171 +
172 + // Are we to show ?
173 + if(!toShow){
174 + //console.log('Delete : '+x);
175 + pagelayer_delete_atts(x);
176 + }
177 + }
178 + }
179 + }
180 +
181 + }
182 +
183 + return ret;
184 +
185 +};
186 +
187 +// Setup the properties
188 +function pagelayer_elpd_setup(){
189 +
190 + // The Dialag box of the element properties
191 + // pagelayer-ELPD - Element Properties Dialog
192 + pagelayer_elpd_html = '<div class="pagelayer-elpd-tabs">'+
193 + '<div class="pagelayer-elpd-tab" pagelayer-elpd-tab="settings" pagelayer-elpd-active-tab=1>Settings</div>'+
194 + //'<div class="pagelayer-elpd-tab" pagelayer-elpd-tab="styles">Style</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>'+
197 + '<div class="pagelayer-elpd-options">'+
198 + '<i class="pli pli-clone" ></i>'+
199 + '<i class="pli pli-trashcan" ></i>'+
200 + '</div>'+
201 + '</div>'+
202 + '<div class="pagelayer-elpd-body"></div>'+
203 + '<div class="pagelayer-elpd-holder"></div>';
204 +
205 + // Create the dialog box
206 + pagelayer.$$('#pagelayer-elpd').append(pagelayer_elpd_html);
207 + pagelayer_elpd = pagelayer.$$('#pagelayer-elpd');
208 +
209 + pagelayer.$$('.pagelayer-elpd-close').on('click', function(){
210 + pagelayer_leftbar_tab('pagelayer-shortcodes');
211 + pagelayer.$$('[pagelayer-widget-tab="widgets"]').click();
212 + pagelayer.$$('.pagelayer-elpd-header').hide();
213 + pagelayer.$$('.pagelayer-logo').show();
214 + pagelayer.$$('.pagelayer-elpd-body').removeAttr('pagelayer-element-id').empty();
215 + pagelayer_active = {};
216 + });
217 +
218 + // Copy
219 + pagelayer.$$('.pagelayer-elpd-options>.pli-clone').on('click', function(){
220 + pagelayer_copy_element(pagelayer_active.el.$);
221 + });
222 +
223 + // Delete
224 + pagelayer.$$('.pagelayer-elpd-options>.pli-trashcan').on('click', function(){
225 + pagelayer_delete_element(pagelayer_active.el.$);
226 + //pagelayer.$$('.pagelayer-elpd-close').click();
227 + });
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 +
247 + // The tabs
248 + pagelayer_elpd.find('.pagelayer-elpd-tab').on('click', function(){
249 +
250 + var jEle = jQuery(this);
251 + var attr = 'pagelayer-elpd-active-tab';
252 + var tab = jEle.attr('pagelayer-elpd-tab');
253 +
254 + if(tab == 'advanced'){
255 + return;
256 + }
257 +
258 + pagelayer_elpd.find('.pagelayer-elpd-tab').each(function(){
259 + jQuery(this).removeAttr(attr);
260 + });
261 +
262 + jEle.attr(attr, 1);
263 +
264 + // Trigger the showing of rows
265 + pagelayer_elpd_show_rows();
266 + });
267 +
268 +};
269 +
270 +// Open the properties
271 +function pagelayer_elpd_open(jEle){
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 +
277 + // Set pagelayer history FALSE
278 + pagelayer.history_action = false;
279 +
280 + // Set the position of the element and show
281 + //pagelayer_elpd.css('left', pagelayer_elpd_pos[0]);
282 + //pagelayer_elpd.css('top', pagelayer_elpd_pos[1]);
283 + pagelayer_leftbar_tab('pagelayer-elpd');
284 + pagelayer.$$('[pagelayer-elpd-tab=settings]').show();
285 + pagelayer.$$('.pagelayer-elpd-header').show();
286 + pagelayer.$$('.pagelayer-logo').hide();
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 +
296 + // The property holder
297 + var holder = pagelayer.$$('.pagelayer-elpd-body');
298 + holder.html(' ');
299 +
300 + var el = pagelayer_elpd_generate(jEle, holder);
301 +
302 + // Set the active element
303 + pagelayer_active.el = el;
304 +
305 + // Set the header
306 + pagelayer.$$('.pagelayer-elpd-title').html('Edit '+pagelayer_shortcodes[el.tag]['name']);
307 +
308 + // Set pagelayer history TRUE
309 + pagelayer.history_action = true;
310 +
311 + // Render tooltips for the ELPD
312 + pagelayer_tooltip_setup();
313 +
314 + // Setup instant properties search
315 + if (typeof pagelayer_setup_properties_search === 'function') {
316 + pagelayer_setup_properties_search();
317 + }
318 +};
319 +
320 +// Show the properties window
321 +function pagelayer_elpd_generate(jEle, holder){
322 +
323 + // Get the id, tag, atts, data, etc
324 + var el = pagelayer_data(jEle);
325 + //console.log(el);
326 +
327 + // Is it a valid type ?
328 + if(pagelayer_empty(pagelayer_shortcodes[el.tag])){
329 + pagelayer_error('Could not find this shortcode : '+el.tag);
330 + return;
331 + }
332 +
333 + // Set the holder
334 + holder.attr('pagelayer-element-id', el.id);
335 + //console.log(el.id);
336 +
337 + var all_props = pagelayer_shortcodes[el.tag];
338 +
339 + var sec_open_class = 'pagelayer-elpd-section-open';
340 +
341 + for(var i in pagelayer_tabs){
342 + var tab = pagelayer_tabs[i];
343 + var section_close = false;// First section always open
344 +
345 + section_loop2:
346 + for(var section in all_props[tab]){
347 + //console.log(tab+' '+section);
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 +
358 + var props = section in pagelayer_shortcodes[el.tag] ? pagelayer_shortcodes[el.tag][section] : pagelayer_styles[section];
359 + //console.log(props);
360 +
361 + var sec = jQuery('<div class="pagelayer-elpd-section" section="'+section+'" pagelayer-show-tab="'+tab+'">'+
362 + '<div class="pagelayer-elpd-section-name '+sec_open_class+'"><i class="pli"></i>'+all_props[tab][section]+'</div>'+
363 + '<div class="pagelayer-elpd-section-rows"></div>'+
364 + '</div>');
365 + holder.append(sec);
366 +
367 + // The row holder
368 + sec = sec.find('.pagelayer-elpd-section-rows');
369 +
370 + // Close all except the first section
371 + if(section_close){
372 + sec.hide().prev().removeClass(sec_open_class);
373 + }
374 + section_close = true;
375 +
376 + if('widget' in all_props && section == 'params'){
377 + pagelayer_elpd_widget_settings(el, sec, true);
378 + continue;
379 + }
380 +
381 + var mode = pagelayer_get_screen_mode();
382 +
383 + // Reset / Create the cache
384 + for(var x in props){
385 +
386 + props[x]['c'] = new Object();
387 + props[x]['c']['val'] = '';// Blank Val
388 + props[x]['c']['name'] = x;// Add the Name of the row i.e. attribute of the element
389 + var prop_name = x;
390 +
391 + // Do we have screen ?
392 + if('screen' in props[x] && mode != 'desktop'){
393 + prop_name = x +'_'+mode;
394 + }
395 +
396 + // Set default to value of attribute if any
397 + if(prop_name in el.atts){
398 + props[x]['c']['val'] = el.atts[prop_name];
399 + }
400 +
401 + // Set element
402 + props[x]['el'] = el;
403 +
404 + // Any prop to skip ?
405 + if(!pagelayer_empty(all_props['skip_props']) && jQuery.inArray(x, all_props['skip_props']) > -1){
406 + continue;
407 + }
408 +
409 + // Add the row
410 + pagelayer_elpd_row(sec, tab, section, props, x);
411 +
412 + }
413 +
414 + // Hide empty sections
415 + if(sec.html().length < 1){
416 + //console.log(section+' - '+sec.html().length);
417 + sec.parent().remove();
418 + }
419 + }
420 + }
421 +
422 + /*// Set the default values in the PROPERTIES
423 + var fn_load = window['pagelayer_load_elp_'+el.tag];
424 +
425 + if(typeof fn_load == 'function'){
426 + fn_load(el, props);
427 + }*/
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 +
443 + // Section open close
444 + holder.find('>.pagelayer-elpd-section>.pagelayer-elpd-section-name').on('click', function(){
445 + var _sec = jQuery(this);
446 + var par = _sec.parent();
447 +
448 + pagelayer_active_tab.id = el.id;
449 + pagelayer_active_tab.section = par.attr('section');
450 +
451 + // Get the active tab
452 + var active_tab = pagelayer_elpd.find('[pagelayer-elpd-active-tab]').attr('pagelayer-elpd-tab');
453 +
454 + // Close all but dont touch yourself
455 + holder.children().each(function (){
456 + var curSec = jQuery(this);
457 + if(par.is(curSec)) return;// Skip the current option
458 + if(curSec.attr('pagelayer-show-tab') != active_tab) return;// Skip the non active tabs as is
459 + curSec.find('.pagelayer-elpd-section-rows').hide().prev().removeClass(sec_open_class);
460 + });
461 +
462 + // Now toggle your self
463 + par.find('.pagelayer-elpd-section-rows').toggle();
464 +
465 + if(_sec.next().is(':visible')){
466 + _sec.addClass(sec_open_class);
467 + }else{
468 + _sec.removeClass(sec_open_class);
469 + }
470 +
471 + });
472 +
473 + if(!pagelayer_empty(pagelayer_active_tab) && pagelayer_active_tab.id == el.id){
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 + }
478 + }
479 +
480 + // Handle the showing of rows
481 + pagelayer_elpd_show_rows();
482 +
483 + return el;
484 +
485 +};
486 +
487 +// Show a row
488 +function pagelayer_elpd_row(holder, tab, section, props, name){
489 +
490 + // The Prop
491 + var prop = props[name];
492 + //console.log(tab+' '+name+' '+prop.el.tag);
493 +
494 + var fn = window['pagelayer_elp_'+prop['type']];
495 +
496 + if(typeof fn == 'function'){
497 +
498 + var row = jQuery('<div class="pagelayer-form-item" pagelayer-elp-name="'+name+'" />');
499 +
500 + // Append the row
501 + holder.append(row);
502 +
503 + return pagelayer_elpd_render_row(row, prop);
504 +
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{
527 +
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']);
537 + }
538 +
539 + // Is there a description ?
540 + if(!pagelayer_empty(prop['desc'])){
541 + pagelayer_elp_desc(row, prop['desc']);
542 + }
543 +
544 + }
545 +
546 + if('script' in prop){
547 + row.append('<script>'+prop.script+'</script>');
548 + }
549 +
550 + return row;
551 +}
552 +
553 +// Show the rows as per the active tab and also handle the rows that are supposed to be shown or not
554 +function pagelayer_elpd_show_rows(){
555 +
556 + //console.log('Called');
557 +
558 + // Get the active tab
559 + var active_tab = pagelayer_elpd.find('[pagelayer-elpd-active-tab]').attr('pagelayer-elpd-tab');
560 +
561 + pagelayer_elpd.find('[pagelayer-show-tab]').each(function(){
562 + var sec = jQuery(this);
563 +
564 + // Is it the active tab ?
565 + if(sec.attr('pagelayer-show-tab') != active_tab){
566 + sec.hide();
567 + }else{
568 + sec.show();
569 + }
570 + });
571 +
572 + // Find all Elements in the Property dialog and loop
573 + pagelayer_elpd.find('[pagelayer-element-id]').each(function(){
574 +
575 + var holder = jQuery(this);
576 + var id = holder.attr('pagelayer-element-id');
577 + var jEle = pagelayer_ele_by_id(id);
578 + var tag = pagelayer_tag(jEle);
579 + //console.log('Main : '+id+' - '+tag);
580 + //console.log(pagelayer_active);
581 +
582 + // All props
583 + var all_props = pagelayer_shortcodes[tag];
584 +
585 + // Loop through all props
586 + for(var i in pagelayer_tabs){
587 +
588 + var tab = pagelayer_tabs[i];
589 +
590 + for(var section in all_props[tab]){
591 +
592 + var props = section in pagelayer_shortcodes[tag] ? pagelayer_shortcodes[tag][section] : pagelayer_styles[section];
593 +
594 + for(var x in props){
595 +
596 + var prop = props[x];
597 +
598 + // If the prop is a group, we continue
599 + if(prop['type'] == 'group'){
600 + continue;
601 + }
602 +
603 + // Find the row
604 + var row = false;
605 +
606 + holder.find('[pagelayer-elp-name="'+x+'"]').each(function(){
607 + var j = jQuery(this);
608 + var _id = j.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
609 + //console.log(_id+' = '+id);
610 +
611 + // Is the parent the same ?
612 + if(_id == id){
613 + row = j;
614 + }
615 + });
616 +
617 + // Do you have a show or hide ?
618 + if(!row){
619 + //console.log('Not Found : '+x+' - '+id);
620 + continue;
621 + }
622 +
623 + // Is the row visible ?
624 + if(row.closest('[pagelayer-show-tab]').attr('pagelayer-show-tab') != active_tab){
625 + row.hide();
626 + continue;
627 + }
628 +
629 + // Now lets show or hide the element
630 + if(!('req' in prop || 'show' in prop)){
631 + row.show();
632 + continue;
633 + }
634 +
635 + // List of considerations
636 + var show = {};
637 +
638 + // We have both req and show, so lets just combine the values and then show
639 + // NOTE : We need to make an array and not just merge the 2 as they are references
640 + if('req' in prop && 'show' in prop){
641 +
642 + // Add the req values
643 + show = JSON.parse(JSON.stringify(prop['req']));
644 +
645 + // Now the show values need to be looped
646 + for(var t in prop['show']){
647 + show[t] = prop['show'][t];
648 + }
649 +
650 + }else{
651 + show = 'req' in prop ? prop['req'] : prop['show'];
652 + }
653 +
654 + // We will hide by default
655 + var toShow = true;
656 +
657 + for(var showParam in show){
658 + var reqval = show[showParam];
659 + var except = showParam.substr(0, 1) == '!' ? true : false;
660 + showParam = except ? showParam.substr(1) : showParam;
661 + var val = pagelayer_get_att(jEle, showParam) || '';
662 +
663 + //console.log('Show '+x+' '+showParam+' '+reqval+' '+val);
664 +
665 + // Is the value not the same, then we can show
666 + if(except){
667 +
668 + if(typeof reqval == 'string' && reqval == val){
669 + toShow = false;
670 + break;
671 + }
672 +
673 + // Its an array and a value is found, then dont show
674 + if(typeof reqval != 'string' && reqval.indexOf(val) > -1){
675 + toShow = false;
676 + break;
677 + }
678 +
679 + // The value must be equal
680 + }else{
681 +
682 + if(typeof reqval == 'string' && reqval != val){
683 + toShow = false;
684 + break;
685 + }
686 +
687 + // Its an array and no value is found, then dont show
688 + if(typeof reqval != 'string' && reqval.indexOf(val) === -1){
689 + toShow = false;
690 + break;
691 + }
692 + }
693 + }
694 +
695 + // Are we to show ?
696 + if(toShow){
697 + row.show();
698 + }else{
699 + row.hide();
700 + }
701 +
702 + }
703 +
704 + }
705 + }
706 +
707 + });
708 +
709 +};
710 +
711 +var pagelayer_widget_timer;
712 +var pagelayer_widget_cache = {};
713 +
714 +// Load the widget settings
715 +function pagelayer_elpd_widget_settings(el, sec, onfocus){
716 +
717 + var show_form = function(html){
718 +
719 + sec.html('<form class="pagelayer-widgets-form">'+html+'</form>');
720 +
721 + // Handle on form data change
722 + sec.find('form :input').on('change', function(){
723 + //console.log('Changed !');
724 +
725 + // Clear any previous timeout
726 + clearTimeout(pagelayer_widget_timer);
727 +
728 + // Set a timer for constant change
729 + pagelayer_widget_timer = setTimeout(function(){
730 + pagelayer_elpd_widget_settings(el, sec);
731 + //console.log('Calling');
732 + }, 500);
733 +
734 + });
735 + }
736 +
737 + // Is it onfocus ?
738 + onfocus = onfocus || false;
739 +
740 + // Its an onfocus
741 + if(onfocus && el.id in pagelayer_widget_cache){
742 + show_form(pagelayer_widget_cache[el.id]);
743 + return true;
744 + }
745 +
746 + var post = {};
747 + post['action'] = 'pagelayer_wp_widget';
748 + post['pagelayer_nonce'] = pagelayer_ajax_nonce;
749 + post['tag'] = el.tag;
750 + post['pagelayer-id'] = el.id;
751 +
752 + // Any atts ?
753 + if('widget_data' in el.atts){
754 + post['widget_data'] = el.atts['widget_data'];
755 + }
756 +
757 + // Post any existing data
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 +
767 + if(form.length > 0){
768 + //console.log(form.serialize());
769 + post['values'] = form.serialize();
770 + }
771 +
772 + jQuery.ajax({
773 + url: pagelayer_ajax_url,
774 + type: 'post',
775 + data: post,
776 + success: function(data) {
777 + //console.log('Widget Data');console.log(data);
778 +
779 + // Show the form
780 + if('form' in data){
781 + show_form(data['form']);
782 +
783 + // Store in cache
784 + pagelayer_widget_cache[el.id] = data['form'];
785 + }
786 +
787 + // Show the content
788 + if('html' in data){
789 + el.$.html(data['html']);
790 + pagelayer_sc_render(el.$);// Re-Render the CSS
791 + }
792 +
793 + // Any set attributes ?
794 + if('widget_data' in data){
795 + pagelayer_set_atts(el.$, 'widget_data', JSON.stringify(data['widget_data']));
796 + }
797 +
798 + },
799 + fail: function(data) {
800 + pagelayer_show_msg('Some error occured in getting the widget data', 'error');
801 + }
802 + });
803 +
804 +}
805 +
806 +// Will set the attribute and also render
807 +function _pagelayer_set_atts(row, val, no_default){
808 + var id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
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];
813 +
814 + // Is there a unit ?
815 + var uEle = row.find('.pagelayer-elp-units');
816 + if(uEle.length > 0 && !pagelayer_empty(val)){
817 + var unit = uEle.find('[selected]').html();
818 + if(Array.isArray(val)){
819 + for(var i in val){
820 + if(val[i].length < 1){
821 + continue;
822 + }
823 + val[i] = val[i]+unit;
824 + }
825 + }else{
826 + val = val+unit;
827 + }
828 + }
829 +
830 + // Are we in another mode ?
831 + var mode = ('screen' in prop && pagelayer_get_screen_mode() != 'desktop') ? '_'+pagelayer_get_screen_mode() : '';
832 +
833 + pagelayer_set_atts(jEle, prop_name+mode, val);
834 +
835 + // Are we to skip setting defaults ?
836 + no_default = no_default || false;
837 + if(!no_default){
838 +
839 + // We need to set defaults for dependents
840 + var hasSet = pagelayer_set_default_atts(jEle, 5);
841 +
842 + // We need to reopen the left panel
843 + // Note : If two simultaneous calls are made, then this will cause problems
844 + // Also after this is called, ROW is destroyed and no other row related stuff will work i.e. set_atts in the same calls will fail
845 + if(hasSet){
846 + pagelayer_elpd_open(jEle);
847 + }
848 + }
849 + //console.trace();console.log('Setting Attr');
850 +
851 + // Render
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 + }
865 +};
866 +
867 +// Will set the attribute but not render
868 +function _pagelayer_set_tmp_atts(row, suffix, val){
869 + var id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
870 + var jEle = jQuery('[pagelayer-id='+id+']');
871 + pagelayer_set_tmp_atts(jEle, row.attr('pagelayer-elp-name')+(suffix.length > 0 ? '-'+suffix : ''), val);
872 +};
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 +
888 +// Get the tmp att
889 +function _pagelayer_get_tmp_att(row, suffix){
890 + var id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
891 + var jEle = jQuery('[pagelayer-id='+id+']');
892 + return pagelayer_get_tmp_att(jEle, row.attr('pagelayer-elp-name')+'-'+suffix);
893 +};
894 +
895 +// Create the Label
896 +function pagelayer_elp_label(row, prop){
897 + row.append('<div class="pagelayer-elp-label-div" type="'+prop['type']+'"><label class="pagelayer-elp-label">'+prop['label']+'</label></div>');
898 +
899 + var label = row.children('.pagelayer-elp-label-div');
900 +
901 + // Do we have screen ?
902 + if('screen' in prop){
903 + var mode = pagelayer_get_screen_mode();
904 + var screen = '<div class="pagelayer-elp-screen">'+
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>'+
909 + '</div>';
910 + label.append(screen);
911 +
912 + // Set screen mode on change
913 + label.find('.pli:not(.pagelayer-prop-screen)').on('click', function(){
914 + var mode = 'desktop';
915 + var jEle = jQuery(this);
916 +
917 + // Tablet ?
918 + if(jEle.hasClass('pli-tablet')){
919 + mode = 'tablet';
920 + }
921 +
922 + // Mobile ?
923 + if(jEle.hasClass('pli-mobile')){
924 + mode = 'mobile';
925 + }
926 +
927 + pagelayer_set_screen_mode(mode);
928 + label.find('.pagelayer-elp-screen .pli').removeClass('open');
929 +
930 + });
931 +
932 + // On change of screen handle the values
933 + label.find('.pagelayer-elp-screen').on('pagelayer-screen-changed', function(e){
934 +
935 + label.find('.pagelayer-elp-screen .pli').removeClass('open');
936 + var mode = pagelayer_get_screen_mode();
937 + var modes = {desktop: '', tablet: '_tablet', mobile: '_mobile'};
938 +
939 + // Get the current current new val
940 + prop.c['val'] = pagelayer_get_att(prop.el.$, prop.c['name']+modes[mode]);
941 +
942 + // Handle the amount
943 + if(pagelayer_empty(prop.c['val'])){
944 + prop.c['val'] = '';
945 + }
946 +
947 + // Remove the siblings
948 + label.siblings().each(function(){
949 + var j = jQuery(this);
950 +
951 + if(j.hasClass('pagelayer-elp-desc')){
952 + return;
953 + }
954 +
955 + j.remove();
956 + });
957 +
958 + // Create the vals again
959 + var fn = window['pagelayer_elp_'+prop['type']];
960 +
961 + // The main property
962 + fn(row, prop);
963 +
964 + });
965 +
966 + label.find('.pagelayer-elp-screen .pagelayer-prop-screen').on('click', function(e){
967 + jQuery(this).siblings().toggleClass('open');
968 + })
969 +
970 + }
971 +
972 + // Do we have pro version requirement ?
973 + if('pro' in prop && pagelayer_empty(pagelayer_pro)){
974 + var txt = prop['pro'].length > 1 ? prop['pro'] : pagelayer.pro_txt;
975 + var pro = jQuery('<div class="pagelayer-pro-req">Pro</div>');
976 + pro.attr('data-tlite', txt);
977 + label.append(pro);
978 + }
979 +
980 + // Do we have units ?
981 + if('units' in prop){
982 +
983 + var units = '';
984 + var tmp_val = prop.c['val'];
985 + var default_unit = 0;
986 +
987 + // Get unit from value
988 + if(!(pagelayer_empty(tmp_val))){
989 +
990 + for(var i in prop['units']){
991 + if(pagelayer_is_string(tmp_val) && tmp_val.search(prop['units'][i]) != -1){
992 + default_unit = i;
993 + }else if(tmp_val[0].search(prop['units'][i]) != -1 ){
994 + default_unit = i;
995 + }
996 + }
997 + }
998 +
999 + for(var i in prop['units']){
1000 + units += '<span '+(i == default_unit ? 'selected' : '')+'>'+prop['units'][i]+'</span>';
1001 + }
1002 +
1003 + label.append('<div class="pagelayer-elp-units">'+units+'</div>');
1004 +
1005 + // Set unit on change
1006 + label.find('.pagelayer-elp-units span').on('click', function(){
1007 +
1008 + label.find('.pagelayer-elp-units span').each(function(){
1009 + jQuery(this).removeAttr('selected');
1010 + });
1011 +
1012 + jQuery(this).attr('selected', 1);
1013 +
1014 + });
1015 +
1016 + }
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 + }
1039 +};
1040 +
1041 +// Create the Description
1042 +function pagelayer_elp_desc(row, label){
1043 + row.append('<div class="pagelayer-elp-desc">'+label+'</div>');
1044 +};
1045 +
1046 +// The Text property
1047 +function pagelayer_elp_text(row, prop){
1048 +
1049 + var div = '<div class="pagelayer-elp-text-div">'+
1050 + '<input type="text" class="pagelayer-elp-text" name="'+prop.c['name']+'" value="'+pagelayer_htmlEntities(prop.c['val'])+'"></input>'+
1051 + '</div>';
1052 +
1053 + row.append(div);
1054 +
1055 + row.find('input').on('input', function(){
1056 + _pagelayer_set_atts(row, jQuery(this).val());// Save and Render
1057 + });
1058 +
1059 +};
1060 +
1061 +// The Select property
1062 +function pagelayer_elp_select(row, prop){
1063 +
1064 + var options = '';
1065 + var option = function(val, lang){
1066 + var selected = (val != prop.c['val']) ? '' : 'selected="selected"';
1067 + return '<option class="pagelayer-elp-select-option" value="'+val+'" '+selected+'>'+lang+'</option>';
1068 + }
1069 +
1070 + for (x in prop['list']){
1071 +
1072 + // Single item
1073 + if(typeof prop['list'][x] == 'string'){
1074 + options += option(x, prop['list'][x]);
1075 +
1076 + // Groups
1077 + }else{
1078 + options += '<optgroup label="'+x+'">';
1079 +
1080 + for(var y in prop['list'][x]){
1081 + options += option(y, prop['list'][x][y]);
1082 + }
1083 +
1084 + options += '</optgroup>';
1085 + }
1086 + }
1087 +
1088 + var div = '<div class="pagelayer-elp-select-div pagelayer-elp-pos-rel">'+
1089 + '<select class="pagelayer-elp-select pagelayer-select" name="'+prop.c['name']+'">'+options+'</select>'+
1090 + '</div>';
1091 +
1092 + row.append(div);
1093 +
1094 + row.find('select').on('change', function(){
1095 +
1096 + var sEle = jQuery(this);
1097 +
1098 + if(sEle.attr('name') == "animation"){
1099 + _pagelayer_trigger_anim(row, sEle.val());
1100 + }
1101 +
1102 + _pagelayer_set_atts(row, sEle.val());// Save and Render
1103 +
1104 + });
1105 +
1106 +}
1107 +
1108 +// The MultiSelect property
1109 +function pagelayer_elp_multiselect(row, prop){
1110 +
1111 + var selection = [];
1112 + if(!pagelayer_empty(prop.c['val'])){
1113 + //selection = JSON.parse(prop.c['val']);
1114 + selection = prop.c['val'].split(',');
1115 + }
1116 +
1117 + var options = '';
1118 + var option = function(val, lang){
1119 + var selected = (jQuery.inArray(val,selection) == -1 ? '' : 'selected="selected"');
1120 + return '<li class="pagelayer-elp-multiselect-option" data-val="'+val+'" '+selected+'>'+lang+'</li>';
1121 + }
1122 +
1123 + var show_sel = function(val){
1124 + var sel_html = '';
1125 + jQuery.each(val, function(index, value){
1126 + sel_html += '<span class="pagelayer-elp-multiselect-selected" data-val="'+value+'">'+prop['list'][value]+' <span class="pagelayer-elp-multiselect-remove">x</span></span>';
1127 + });
1128 + return sel_html;
1129 + }
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 +
1138 + for (x in prop['list']){
1139 + options += option(x, prop['list'][x]);
1140 + }
1141 +
1142 + var div = '<div class="pagelayer-elp-multiselect-div pagelayer-elp-pos-rel">'+
1143 + '<div class="pagelayer-elp-multiselect">'+show_sel(selection)+'</div>'+
1144 + '<ul class="pagelayer-elp-multiselect-ul" name="'+prop.c['name']+'">'+options+'</ul>'+
1145 + '</div>';
1146 +
1147 + row.append(div);
1148 + setup_remove();
1149 +
1150 + row.find('.pagelayer-elp-multiselect-option').on('click', function(){
1151 +
1152 + var sVal = jQuery(this).attr('data-val');
1153 +
1154 + if(jQuery.inArray(sVal,selection) == -1){
1155 + selection.push(sVal);
1156 + row.find('[data-val="'+sVal+'"]').attr('selected','selected');
1157 + }else{
1158 + selection.splice(jQuery.inArray(sVal,selection),1);
1159 + row.find('[data-val="'+sVal+'"]').removeAttr('selected');
1160 + }
1161 +
1162 + //_pagelayer_set_atts(row,JSON.stringify(selection));// Save and Render
1163 + _pagelayer_set_atts(row, selection.join(','));// Save and Render
1164 +
1165 + row.find('.pagelayer-elp-multiselect').html(show_sel(selection));
1166 + setup_remove();
1167 +
1168 + });
1169 +
1170 + // Open the selector
1171 + row.find('.pagelayer-elp-multiselect').on('click', function(){
1172 + row.find('.pagelayer-elp-multiselect-ul').slideToggle(100);
1173 + });
1174 +
1175 +}
1176 +
1177 +function _pagelayer_trigger_anim(row, anim){
1178 + var id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id');
1179 + var classList = jQuery('[pagelayer-id='+id+']').attr('class');
1180 + classList = classList.split(/\s+/);
1181 + //console.log(classList);
1182 + var options = [];
1183 + row.find('option').each(function(){
1184 + var found = jQuery.inArray( jQuery(this).val(), classList );
1185 + if( found != -1){
1186 + //var found = jQuery(this).val();
1187 + jQuery('[pagelayer-id='+id+']').removeClass(jQuery(this).val());
1188 + //break;
1189 + }
1190 + //options.push(jQuery(this).val());
1191 + });
1192 + jQuery('[pagelayer-id='+id+']').removeClass('pagelayer-wow').addClass(anim + ' animated').one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){
1193 + jQuery(this).removeClass(anim+ ' animated');
1194 + });
1195 +}
1196 +
1197 +// The Checkbox property
1198 +function pagelayer_elp_checkbox(row, prop){
1199 +
1200 + var div = '<div class="pagelayer-elp-checkbox-div">'+
1201 + '<input type="checkbox" name="'+prop.c['name']+'" class="pagelayer-elp-checkbox" />'+
1202 + '</div>';
1203 +
1204 + row.append(div);
1205 +
1206 + if(prop.c['val'].length > 0){
1207 + row.find('input').attr('checked', 'checked');
1208 + }else{
1209 + row.find('input').removeAttr('checked');
1210 + }
1211 +
1212 + // When the change is called
1213 + row.find('input').on('change', function(){
1214 +
1215 + // We set to string true or false
1216 + var val = jQuery(this).is(':checked') ? 'true' : '';
1217 +
1218 + _pagelayer_set_atts(row, val);// Save and Render
1219 + });
1220 +
1221 +}
1222 +
1223 +// The Radio property
1224 +function pagelayer_elp_radio(row, prop){
1225 +
1226 + var active = 'pagelayer-elp-radio-active';
1227 + var div = '<div class="pagelayer-elp-radio-div">';
1228 +
1229 + for(var x in prop.list){
1230 + var addclass = (prop.c['val'] == x) ? active : '';
1231 + div += '<a class="pagelayer-elp-radio '+addclass+'" val="'+x+'">'+prop.list[x]+'</a>';
1232 + }
1233 +
1234 + div += '</div>';
1235 +
1236 + row.append(div);
1237 +
1238 + row.find('.pagelayer-elp-radio').each(function(){
1239 +
1240 + jQuery(this).on('click', function (){
1241 +
1242 + // Remove existing active class
1243 + jQuery(this).parent().find('.'+active).removeClass(active);
1244 +
1245 + // Set active
1246 + jQuery(this).addClass(active);
1247 +
1248 + _pagelayer_set_atts(row, jQuery(this).attr('val'));// Save and Render
1249 +
1250 + });
1251 +
1252 + });
1253 +
1254 +}
1255 +
1256 +// The Image Property
1257 +function pagelayer_elp_image(row, prop){
1258 +
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 +
1269 + var tmp = prop.c['name']+'-url';
1270 + var def = pagelayer.blank_img;
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 );
1274 +
1275 + // Do we have a URL set ?
1276 + var style = 'style="background-image:url(\''+src+'\')"';
1277 +
1278 + var div = '<div class="pagelayer-elp-image-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 );
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 +
1359 + row.append(div);
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 +
1402 + // Set an Image
1403 + row.find('.pagelayer-elp-image').on('click', function(){
1404 +
1405 + var button = jQuery(this);
1406 + var inRetina = button.hasClass('pagelayer-retina');
1407 + var inRetinaM = button.hasClass('pagelayer-retina-mobile');
1408 +
1409 + // Load the frame
1410 + var frame = pagelayer_select_frame('image');
1411 +
1412 + // On select update the stuff
1413 + frame.on({
1414 + 'select': function(){
1415 +
1416 + var state = frame.state();
1417 + var id = url = '';
1418 +
1419 + // External URL
1420 + if('props' in state){
1421 +
1422 + id = url = pagelayer_parse_theme_vars(state.props.attributes.url);
1423 +
1424 + // Internal from gallery
1425 + }else{
1426 +
1427 + var attachment = frame.state().get('selection').first().toJSON();
1428 +
1429 + // Set the new ID and URL
1430 + id = attachment.id;
1431 + url = attachment.url;
1432 + var old = _pagelayer_img_tmp_atts(row);
1433 +
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 + }
1497 + }
1498 +
1499 + // Update thumbnail
1500 + button.css('background-image', 'url(\''+url+'\')');
1501 +
1502 + // Save and render
1503 + _pagelayer_set_tmp_atts(row, 'no-image-set', '');
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 +
1518 + },
1519 + // On open select the appropriate images in the media manager
1520 + 'open': function() {
1521 + var selection = frame.state().get('selection');
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 +
1534 + selection.reset( wp_id ? [ wp.media.attachment( wp_id ) ] : [] );
1535 + }
1536 + });
1537 +
1538 + frame.open(button);
1539 +
1540 + return false;
1541 +
1542 + });
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 +
1582 + // Delete this
1583 + row.find('.pagelayer-elp-image-delete').on('click', function(){
1584 +
1585 + // Update thumbnail
1586 + jQuery(this).parent().find('.pagelayer-elp-image').css('background-image', 'url(\''+def+'\')');
1587 +
1588 + // Set to blank and render
1589 + _pagelayer_set_atts(row, '', true);
1590 +
1591 + imgObj['img'] = def;
1592 +
1593 + _pagelayer_set_tmp_atts(row, 'no-image-set', 1);
1594 + _pagelayer_set_tmp_atts(row, 'url', 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));
1605 +
1606 + });
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 + });
1619 +}
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 +
1735 +// The Multi Image Property
1736 +function pagelayer_elp_multi_image(row, prop){
1737 +
1738 + var div = '<div class="pagelayer-elp-multi_image-div">'+
1739 + '<center><button class="pagelayer-elp-button">'+pagelayer_l('Add Images')+'</button></center>'+
1740 + '<div class="pagelayer-elp-multi_image-thumbs"></div>'+
1741 + '</div>';
1742 +
1743 + row.append(div);
1744 +
1745 + var tmp = prop.c['name']+'-urls';
1746 + var ids = new Array();
1747 +
1748 + // Any IDs ?
1749 + if(!pagelayer_empty(prop.c['val'])){
1750 + ids = prop.c['val']
1751 + if(pagelayer_is_string(ids)){
1752 + ids = prop.c['val'].split(',');
1753 + }
1754 + //console.log(ids);
1755 + }
1756 +
1757 + // Do we have a URL set ?
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 + });
1778 + }
1779 + }
1780 +
1781 + var pagelayer_init_frame = function(state){
1782 +
1783 + var button = row.find('.pagelayer-elp-multi_image-thumbs');
1784 + //console.log(ids);
1785 +
1786 + // Load the frame
1787 + var frame = pagelayer_select_frame('multi_image', state);
1788 +
1789 + frame.on({
1790 +
1791 + 'select': function(){
1792 +
1793 + var state = frame.state();
1794 + var id = url = '';
1795 + var urls = {};
1796 +
1797 + // External URL
1798 + if('props' in state){
1799 + //console.log(state);
1800 + var urls_str = state.props.attributes.url;
1801 +
1802 + var urls_arr = urls_str.split(',');
1803 + //console.log(urls_arr);
1804 +
1805 + button.empty();
1806 +
1807 + // Add to current selection
1808 + for(var i = 0; i < urls_arr.length; i++){
1809 + var single_url = pagelayer_parse_theme_vars(urls_arr[i]);
1810 + urls['i'+i] = single_url;
1811 +
1812 + // Create thumbnails
1813 + button.append('<div class="pagelayer-elp-multi_image-thumb" style="background-image: url(\''+single_url+'\');"></div>');
1814 + }
1815 + urls_arr = Object.values(urls);
1816 +
1817 + _pagelayer_set_tmp_atts(row, 'urls', JSON.stringify(urls));
1818 + _pagelayer_set_atts(row, urls_arr.join());
1819 +
1820 + }
1821 + },
1822 +
1823 + // Set the current selection if any
1824 + 'open': function(){
1825 +
1826 + // Do we have anything
1827 + if(!pagelayer_empty(ids)){
1828 +
1829 + var selection = '';
1830 +
1831 + if(state == 'gallery-edit'){
1832 + selection = frame.state().get('library');
1833 + }else if(state == 'gallery-library'){
1834 + selection = frame.state().get('selection');
1835 + }
1836 +
1837 + // Add to current selection
1838 + if(!pagelayer_empty(selection)){
1839 + for(var x in ids){
1840 + attachment = wp.media.attachment(ids[x]);
1841 + attachment.fetch();
1842 + selection.add(attachment ? [ attachment ] : [] );
1843 + }
1844 + }
1845 + }
1846 + },
1847 +
1848 + // When images are selected
1849 + 'update': function(selection){
1850 +
1851 + //console.log(selection);
1852 +
1853 + // Remove thumbnails
1854 + row.find('.pagelayer-elp-multi_image-thumb').remove();
1855 +
1856 + //Fetch selected images
1857 + var attachments = selection.map(function(attachment){
1858 + attachment.toJSON();
1859 + return attachment;
1860 + });
1861 +
1862 + //console.log(attachments);
1863 +
1864 + var img_ids = [];
1865 + var urls = {};
1866 + var img_urls = {};
1867 + var titles = {};
1868 + var links = {};
1869 + var captions = {};
1870 +
1871 + for(var i = 0; i < attachments.length; ++i){
1872 +
1873 + // Add Id and urls to array
1874 + var id = attachments[i].id;
1875 + var _id = 'i'+id;
1876 + img_ids.push(id);
1877 + urls[_id] = attachments[i].attributes.url;
1878 +
1879 + // Create thumbnails
1880 + button.append('<div class="pagelayer-elp-multi_image-thumb" style="background-image: url(\''+attachments[i].attributes.url+'\');"></div>');
1881 +
1882 + //get title
1883 + titles[_id] = attachments[i].attributes.title;
1884 + links[_id] = attachments[i].attributes.link;
1885 + captions[_id] = attachments[i].attributes.caption;
1886 +
1887 + // Create a URL
1888 + img_urls[_id] = {}
1889 +
1890 + for(var x in attachments[i].attributes.sizes){
1891 + img_urls[_id][x] = attachments[i].attributes.sizes[x].url;
1892 + }
1893 +
1894 + }
1895 +
1896 + //console.log(img_urls);
1897 +
1898 + // Save and render
1899 + _pagelayer_set_tmp_atts(row, 'urls', JSON.stringify(urls));
1900 + _pagelayer_set_tmp_atts(row, 'all-urls', JSON.stringify(img_urls));
1901 + _pagelayer_set_tmp_atts(row, 'all-titles', JSON.stringify(titles));
1902 + _pagelayer_set_tmp_atts(row, 'all-links', JSON.stringify(links));
1903 + _pagelayer_set_tmp_atts(row, 'all-captions', JSON.stringify(captions));
1904 + _pagelayer_set_atts(row, img_ids);
1905 +
1906 + // Update the IDs incase the user clicks on it again
1907 + ids = img_ids;
1908 +
1909 + }
1910 +
1911 + });
1912 +
1913 + frame.open(button);
1914 +
1915 + return false;
1916 +
1917 + };
1918 +
1919 + row.find('.pagelayer-elp-multi_image-thumbs').on('click', function(){
1920 + pagelayer_init_frame('gallery-edit');
1921 + });
1922 +
1923 + row.find('.pagelayer-elp-button').on('click', function(){
1924 +
1925 + if(!pagelayer_empty(ids)){
1926 + if(isNaN(ids[0])){
1927 + pagelayer_init_frame('embed');
1928 + }else{
1929 + pagelayer_init_frame('gallery-library');
1930 + }
1931 + }else{
1932 + pagelayer_init_frame('gallery');
1933 + }
1934 + });
1935 +
1936 +}
1937 +
1938 +// The Video Property
1939 +function pagelayer_elp_video(row, prop){
1940 +
1941 + var tmp = prop.c['name']+'-url';
1942 + var src = (tmp in prop.el.tmp) ? prop.el.tmp[tmp] : prop.c['val'];
1943 +
1944 + var div = '<div class="pagelayer-elp-video-div pagelayer-elp-input-icon">'+
1945 + '<input class="pagelayer-elp-video" name="'+prop.c['name']+'" type="text" value="'+src+'">'+
1946 + '<i class="pli pli-folder-open" ></i>'+
1947 + '</input></div>';
1948 +
1949 + row.append(div);
1950 +
1951 + row.find('.pagelayer-elp-video-div .pli').on('click', function(){
1952 +
1953 + var button = jQuery(this);
1954 +
1955 + // Load the frame
1956 + var frame = pagelayer_select_frame('video');
1957 +
1958 + // On select update the stuff
1959 + frame.on({
1960 +
1961 + 'select': function(){
1962 +
1963 + var state = frame.state();
1964 + var id = url = '';
1965 +
1966 + // External URL
1967 + if('props' in state){
1968 +
1969 + id = url = pagelayer_parse_theme_vars(state.props.attributes.url);
1970 +
1971 + // Internal from gallery
1972 + }else{
1973 +
1974 + var attachment = frame.state().get('selection').first().toJSON();
1975 + //console.log(attachment);
1976 +
1977 + id = attachment.id;
1978 + url = attachment.url;
1979 +
1980 + }
1981 +
1982 + // Update URL
1983 + button.prev().val(url);
1984 +
1985 + // Save and render
1986 + _pagelayer_set_tmp_atts(row, 'url', url);
1987 + _pagelayer_set_atts(row, id);
1988 +
1989 + }
1990 +
1991 + });
1992 +
1993 + frame.open(button);
1994 +
1995 + return false;
1996 +
1997 + });
1998 +
1999 + // Edited the video URL directly
2000 + row.find('.pagelayer-elp-video').on('change', function(){
2001 +
2002 + var input = jQuery(this);
2003 +
2004 + // Set the new URL
2005 + _pagelayer_set_tmp_atts(row, 'url', input.val());
2006 + _pagelayer_set_atts(row, input.val());
2007 +
2008 + });
2009 +
2010 +}
2011 +
2012 +
2013 +// The Audio Property
2014 +function pagelayer_elp_audio(row, prop){
2015 +
2016 + var tmp = prop.c['name']+'-url';
2017 + var src = (tmp in prop.el.tmp) ? prop.el.tmp[tmp] : prop.c['val'];
2018 +
2019 + var div = '<div class="pagelayer-elp-audio-div pagelayer-elp-input-icon">'+
2020 + '<input class="pagelayer-elp-audio" name="'+prop.c['name']+'" type="text" value="'+src+'" />'+
2021 + '<i class="pli pli-menu" ></i>'+
2022 + '</div>';
2023 +
2024 + row.append(div);
2025 +
2026 + // Choose from media
2027 + row.find('.pagelayer-elp-audio-div .pli').on('click', function(){
2028 +
2029 + var button = jQuery(this);
2030 +
2031 + // Load the frame
2032 + var frame = pagelayer_select_frame('audio');
2033 +
2034 + frame.on({
2035 +
2036 + 'select': function(){
2037 +
2038 + var state = frame.state();
2039 + var id = url = '';
2040 +
2041 + // External URL
2042 + if('props' in state){
2043 +
2044 + id = url = pagelayer_parse_theme_vars(state.props.attributes.url);
2045 +
2046 + // Internal from gallery
2047 + }else{
2048 +
2049 + var attachment = frame.state().get('selection').first().toJSON();
2050 + //console.log(attachment);
2051 +
2052 + id = attachment.id;
2053 + url = attachment.url;
2054 +
2055 + }
2056 +
2057 + // Update URL
2058 + button.prev().val(url);
2059 +
2060 + // Save and render
2061 + _pagelayer_set_tmp_atts(row, 'url', url);
2062 + _pagelayer_set_atts(row, id);
2063 +
2064 + }
2065 +
2066 + });
2067 +
2068 + frame.open(button);
2069 +
2070 + return false;
2071 +
2072 + });
2073 +
2074 + // Edited the media URL directly
2075 + row.find('.pagelayer-elp-audio').on('change', function(){
2076 +
2077 + var input = jQuery(this);
2078 +
2079 + // Set the new URL
2080 + _pagelayer_set_tmp_atts(row, 'url', input.val());
2081 + _pagelayer_set_atts(row, input.val());
2082 +
2083 + });
2084 +
2085 +}
2086 +
2087 +// The Media Property
2088 +function pagelayer_elp_media(row, prop){
2089 +
2090 + var tmp = prop.c['name']+'-url';
2091 + var src = (tmp in prop.el.tmp) ? prop.el.tmp[tmp] : prop.c['val'];
2092 +
2093 + var div = '<div class="pagelayer-elp-media-div pagelayer-elp-input-icon">'+
2094 + '<input class="pagelayer-elp-media" value="'+src+'" type="text" />'+
2095 + '<i class="pli pli-menu" ></i>'+
2096 + '</div>';
2097 +
2098 + row.append(div);
2099 +
2100 + row.find('.pagelayer-elp-media-div .pli-menu').on('click', function(){
2101 +
2102 + var button = jQuery(this);
2103 +
2104 + // Load the frame
2105 + var frame = pagelayer_select_frame('media');
2106 +
2107 + frame.on({
2108 +
2109 + 'select': function(){
2110 +
2111 + var state = frame.state();
2112 + var id = url = '';
2113 +
2114 + // External URL
2115 + if('props' in state){
2116 +
2117 + id = url = pagelayer_parse_theme_vars(state.props.attributes.url);
2118 +
2119 + // Internal from gallery
2120 + }else{
2121 +
2122 + var attachment = frame.state().get('selection').first().toJSON();
2123 + //console.log(attachment);
2124 +
2125 + id = attachment.id;
2126 + url = attachment.url;
2127 +
2128 + }
2129 +
2130 + // Update URL
2131 + button.prev().val(url);
2132 +
2133 + // Save and render
2134 + _pagelayer_set_tmp_atts(row, 'url', url);
2135 + _pagelayer_set_atts(row, id);
2136 +
2137 + }
2138 +
2139 + });
2140 +
2141 + frame.open(button);
2142 +
2143 + return false;
2144 +
2145 + });
2146 +
2147 + // Edited the media URL directly
2148 + row.find('.pagelayer-elp-media').on('change', function(){
2149 +
2150 + var input = jQuery(this);
2151 +
2152 + // Set the new URL
2153 + _pagelayer_set_tmp_atts(row, 'url', input.val());
2154 + _pagelayer_set_atts(row, input.val());
2155 +
2156 + });
2157 +
2158 +}
2159 +
2160 +// The Slider Property
2161 +function pagelayer_elp_slider(row, prop){
2162 +
2163 + var div = '<div class="pagelayer-elp-slider-div">'+
2164 + '<input type="range" class="pagelayer-elp-slider" value="'+parseFloat(prop.c['val'])+'" min="'+prop['min']+'" max="'+prop['max']+'" step="'+prop['step']+'"/>'+
2165 + '<input type="number" class="pagelayer-elp-slider-value" value="'+parseFloat(prop.c['val'])+'" min="'+prop['min']+'" max="'+prop['max']+'" step="'+prop['step']+'"/>'+
2166 + '</div>'+
2167 + '</div>';
2168 +
2169 + row.append(div);
2170 +
2171 + // Set an value in span
2172 + row.find('.pagelayer-elp-slider-div input').on('input', function(){
2173 + var value = parseFloat(this.value);
2174 + var max = parseFloat(this.max);
2175 +
2176 + if(!pagelayer_empty(max) && value > max){
2177 + value = max;
2178 + }
2179 + row.find('.pagelayer-elp-slider-div input').val(value);
2180 +
2181 + _pagelayer_set_atts(row, value);// Save and Render
2182 +
2183 + });
2184 +
2185 +}
2186 +
2187 +// The Editor proprety
2188 +function pagelayer_elp_editor(row, prop){
2189 +
2190 + var rows = prop.rows ? prop.rows : '8';
2191 +
2192 + var div = '<div class="pagelayer-elp-editor-div">'+
2193 + '<textarea rows="'+rows+'" class="pagelayer-elp-editor" ></textarea>'+
2194 + '</div>';
2195 +
2196 + row.append(div);
2197 +
2198 + var editor = row.find('.pagelayer-elp-editor');
2199 + editor.val(pagelayer_trim(prop.c['val']));
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;
2207 + // No SVG Icons for now
2208 + jQuery.trumbowyg.svgPath = false;
2209 +
2210 + // Initiate the editor
2211 + editor.trumbowyg({
2212 + autogrow: false,
2213 + hideButtonTexts: true,
2214 + btns:[
2215 + ['viewHTML'],
2216 + ['wpmedia'],
2217 + ['fontfamily'],
2218 + ['formatting'],
2219 + ['undo', 'redo'], // Only supported in Blink browsers
2220 + ['fontsize'],
2221 + ['lineheight'],
2222 + ['foreColor', 'backColor',],
2223 + ['strong', 'em', 'del'],
2224 + ['horizontalRule'],
2225 + ['superscript', 'subscript'],
2226 + ['link'],
2227 + ['unorderedList', 'orderedList'],
2228 + ['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull'],
2229 + ['removeformat'],
2230 + ['fullscreen']
2231 + ],
2232 + plugins: {
2233 + fontsize: {
2234 + sizeList: ['12px','13px','14px','15px','16px','17px','18px','19px','20px','21px','22px','23px','24px','25px']
2235 + }
2236 + },
2237 + imageWidthModalEdit: true,
2238 +
2239 + // Handle the changes made in the editor
2240 + }).on('tbwchange', function(){
2241 + _pagelayer_set_atts(row, editor.trumbowyg('html'));// Save and Render
2242 + });
2243 +
2244 +}
2245 +
2246 +// The Link proprety
2247 +function pagelayer_elp_link(row, prop){
2248 +
2249 + var values = {};
2250 + var settingOpt = false;
2251 +
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>'+
2301 + '</div>';
2302 + }
2303 +
2304 + div += '</div>';
2305 +
2306 + row.append(div);
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 +
2346 + // Set a Link
2347 + row.find('.pagelayer-elp-link').on('change', function(){
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 +
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(){
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 +
2498 +}
2499 +
2500 +// The Textarea property
2501 +function pagelayer_elp_textarea(row, prop){
2502 +
2503 + var rows = prop.rows ? 'rows="'+prop.rows+' "' : '';
2504 +
2505 + var div = '<div class="pagelayer-elp-textarea-div">'+
2506 + '<textarea '+rows+'class="pagelayer-elp-textarea"></textarea>'+
2507 + '</div>';
2508 +
2509 + row.append(div);
2510 + row.find('.pagelayer-elp-textarea').val(pagelayer_trim(prop.c['val']));
2511 +
2512 + // Handle on change
2513 + row.find('.pagelayer-elp-textarea').on('input', function(){
2514 + _pagelayer_set_atts(row, pagelayer_trim(jQuery(this).val()));// Save and Render
2515 + });
2516 +};
2517 +
2518 +// Clear all editable
2519 +function pagelayer_clear_editable(dontDestroy){
2520 +
2521 + // Destroy all
2522 + for(var x in pagelayer_editor){
2523 + if(dontDestroy == x){
2524 + console.log('Skipping '+dontDestroy);
2525 + continue;
2526 + }
2527 + pagelayer_editor[x].pen.destroy();
2528 + }
2529 +
2530 +};
2531 +
2532 +// Makes a field editable in the DOM
2533 +function pagelayer_make_editable(jEle, e){
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 +
2547 + // Is it already setup ?
2548 + if(jEle.hasClass('pagelayer-pen')){
2549 + //console.log('Already Penned');
2550 + //pagelayer_focus_editable(jEle, e, eId);
2551 + return true;
2552 + }
2553 +
2554 + var tag = pagelayer_tag(pEle);
2555 + var all_props = pagelayer_shortcodes[tag];
2556 + var edit_opts;
2557 + var fullEdit = false;
2558 +
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 + }
2577 + }
2578 +
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 + };
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 +
2648 + var options = {
2649 + class: 'pagelayer-pen',
2650 + editor: jEle,
2651 + toolbar: toolbar_options
2652 + }
2653 +
2654 + // Setup the editor
2655 + pagelayer_editor[eId] = {};
2656 + pagelayer_editor[eId].pen = new PagelayerPen(jEle, options);
2657 + pagelayer_editor[eId].$ = jEle;
2658 +
2659 + // Are we the clicked object, then set the focus
2660 + if(e){
2661 + var target = jQuery(e.target);
2662 + if(target.is(jEle) || jEle.find(target).length > 0){
2663 + jEle.focus();
2664 + }
2665 + }
2666 +
2667 + // Reverse setup the event
2668 + jEle.on('blur', function(){
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 +
2699 + });
2700 +
2701 + /*// Reverse setup the event
2702 + jEle.on('focus', function(){
2703 + //pagelayer_clear_editable(eId);
2704 + });*/
2705 +
2706 + // Reverse setup the event
2707 + jEle.on('input', function(){
2708 +
2709 + var val = pagelayer_trim(jEle.html());
2710 +
2711 + // Set the property as well
2712 + pagelayer_set_atts(pEle, prop, val);
2713 +
2714 + // Update the property
2715 + var input = pagelayer.$$('[pagelayer-element-id='+pagelayer_id(pEle)+']').find('[pagelayer-elp-name='+prop+']').find('input,textarea,.trumbowyg-editor');
2716 + //console.log(input);
2717 +
2718 + if(input.length > 0){
2719 + if(input.hasClass('trumbowyg-editor')){
2720 + input.html(val);
2721 + }else{
2722 + input.val(val);
2723 + }
2724 + }
2725 +
2726 + });
2727 +
2728 +}
2729 +
2730 +// The Icon Property
2731 +function pagelayer_elp_icon(row, prop){
2732 +
2733 + var $ = jQuery;
2734 + var sets_html = '';
2735 +
2736 + pagelayer_loaded_icons.forEach(function(item){
2737 + sets_html += '<option name="'+item+'" value="'+item+'">'+item+'</option>';
2738 + });
2739 +
2740 + var icons = {};
2741 + var cur_icon_set = pagelayer_loaded_icons[0];
2742 + var sel_icon = prop.c['val'];
2743 + var sel_name = prop.c['val'];
2744 + var icon_type = '';
2745 + var sorted_icons = {};
2746 +
2747 + // Handle the icon name
2748 + var icon_name = sel_icon.split(' fa-');
2749 + sel_name = icon_name[1];
2750 +
2751 + // Is there a specific list
2752 + if('list' in prop && prop.list.length > 0){
2753 +
2754 + for(var i in pagelayer_icons){
2755 +
2756 + icons[i] = {};
2757 +
2758 + for(var j in pagelayer_icons[i]){
2759 +
2760 + icons[i][j] = {};
2761 + var list_icons = [];
2762 + prop.list.forEach(function(item){
2763 + if(pagelayer_icons[i][j]['icons'].includes(item)){
2764 + list_icons.push(item);
2765 + }
2766 +
2767 + });
2768 + icons[i][j]['icons'] = list_icons;
2769 + icons[i][j]['pre'] = j;
2770 + }
2771 +
2772 + }
2773 +
2774 + }else{
2775 + icons = pagelayer_icons;
2776 + }
2777 +
2778 + // Icon function
2779 + var icon_html = function(name, cat){
2780 + return '<span class="pagelayer-elp-icon-span">'+
2781 + '<i class="'+cat+' fa-'+name+'" icon="'+name+'" ></i> '+name+
2782 + '</span>';
2783 + }
2784 +
2785 + var div = '<div class="pagelayer-elp-icon-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>';
2795 +
2796 + row.append(div);
2797 +
2798 + // Make all icons list
2799 + var html = '<div class="pagelayer-elp-icon-selector">';
2800 +
2801 + if(pagelayer_loaded_icons.length > 1){
2802 + html += '<select class="pagelayer-elp-icon-sets">'+sets_html+'</select>';
2803 + }
2804 +
2805 + html += '<span class="pagelayer-elp-icon-type">'+
2806 + '<p data-tab="fas" class="active">'+pagelayer_l('Solid')+'</p>'+
2807 + '<p data-tab="far">'+pagelayer_l('Regular')+'</p>'+
2808 + '<p data-tab="fab">'+pagelayer_l('Brand')+'</p>'+
2809 + '</span>'+
2810 + '<input type="text" class="pagelayer-elp-search-icon" name="search-icon" placeholder="'+pagelayer_l('search')+'">'+
2811 + '<div class="pagelayer-elp-icon-list">';
2812 +
2813 + for(var y in icons[cur_icon_set]){
2814 + //console.log(icons[x][y])
2815 + for(var z in icons[cur_icon_set][y]['icons']){
2816 + html += icon_html(icons[cur_icon_set][y]['icons'][z], y);
2817 + }
2818 + }
2819 +
2820 + html += '</div>'+
2821 + '</div>';
2822 +
2823 + row.append(html);
2824 +
2825 + // Open the selector
2826 + row.find('.pagelayer-elp-icon-div').on('click', function(){
2827 + row.find('.pagelayer-elp-icon-selector').slideToggle();
2828 + });
2829 +
2830 + /*// When the set changes
2831 + row.find('.pagelayer-elp-icon-sets').on('change', function(){
2832 + var v = cur_icon_set = jQuery(this).val();
2833 + var span = '';
2834 +
2835 + for(var x in icons[v]){
2836 +
2837 + for(var z in icons[v][x]['icons']){
2838 + span += icon_html(icons[v][x]['icons'][z], x);
2839 + }
2840 +
2841 + }
2842 +
2843 + if(cur_icon_set == 'font-awesome5'){
2844 + row.find('.pagelayer-elp-icon-type').show();
2845 + sorted_icons = icons[cur_icon_set]['fas'];
2846 + row.find('.pagelayer-elp-icon-type [data-tab="fas"]').click();
2847 + }else{
2848 + row.find('.pagelayer-elp-icon-type').hide();
2849 + }
2850 +
2851 + row.find('.pagelayer-elp-icon-list').empty().html(span);
2852 +
2853 + if(row.find('.pagelayer-elp-search-icon').val() != ''){
2854 + row.find('.pagelayer-elp-search-icon').keyup();
2855 + }
2856 +
2857 + });*/
2858 +
2859 + // Handle type of icon
2860 + row.find('.pagelayer-elp-icon-type p').on('click', function(){
2861 + jQuery(this).toggleClass('active');
2862 + row.find('.pagelayer-elp-search-icon').keyup();
2863 + });
2864 +
2865 + // Handle search of icon
2866 + row.find('.pagelayer-elp-search-icon').on('keyup', function(){
2867 +
2868 + var v = this.value;
2869 + var span = '';
2870 + v = v.toLowerCase();
2871 + v = v.replace(/\s+/g, '-');
2872 + //console.log(sorted_icons);
2873 +
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 + }
2884 + }
2885 + });
2886 +
2887 + row.find('.pagelayer-elp-icon-list').empty().html(span);
2888 +
2889 + });
2890 +
2891 + // Handle click within the icon selector
2892 + row.find('.pagelayer-elp-icon-list').on('click', function(e){
2893 +
2894 + var jEle = jQuery(e.target);
2895 + var i = jEle.children().attr('class');
2896 + var name = jEle.children().attr('icon');
2897 +
2898 + if(pagelayer_empty(name)){
2899 + return false;
2900 + }
2901 +
2902 + // Set the icon in this list
2903 + row.find('.pagelayer-elp-icon-preview').html('<i class="'+i+'"></i><span class="pagelayer-elp-icon-name">'+name+'</span>');
2904 + row.find('.pagelayer-elp-icon-selector').slideUp();
2905 +
2906 + _pagelayer_set_atts(row, i);// Save and Render
2907 +
2908 + row.find('.pagelayer-elp-icon-close').show();
2909 + return false;
2910 +
2911 + });
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 +
2925 +}
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 +
3015 +// The Color Property
3016 +function pagelayer_elp_color(row, prop){
3017 +
3018 + var val = prop.c['val'];
3019 + var is_global = pagelayer_is_global_color(val);
3020 + var global_active = '';
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 +
3056 + row.append(div);
3057 +
3058 + row.find('.pagelayer-elp-color-preview').css('background', val);
3059 +
3060 + var picker = new pagelayer_Picker({
3061 + parent : row.find('.pagelayer-elp-color-div')[0],
3062 + popup : 'left',
3063 + color : val,
3064 + doc: window.parent.document
3065 + });
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 +
3084 + // Handle selected 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
3089 +
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();
3094 + };
3095 +
3096 + picker.onOpen = picker.onChange;
3097 +
3098 + row.find('.pagelayer-elp-remove-color').on('click', function(event){
3099 + event.stopPropagation();
3100 + picker.setColor(prop.default, true);
3101 + preview.addClass('pagelayer-blank-preview');
3102 + handle_white('');
3103 + _pagelayer_set_atts(row, ' ');// Save and Render
3104 + });
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 + });
3140 +}
3141 +
3142 +// The Spinner property
3143 +function pagelayer_elp_spinner(row, prop){
3144 +
3145 + var div = '<div class="pagelayer-elp-spinner-div">'+
3146 + '<input type="number" class="pagelayer-elp-spinner" name="'+prop.c['name']+'"'+
3147 + ' min="'+prop['min']+'" max="'+prop['max']+'" step="'+prop['step']+'" value="'+parseFloat(prop.c['val'])+'"/>'+
3148 + '</div>';
3149 +
3150 + row.append(div);
3151 +
3152 + row.find('input').on('input', function(){
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
3160 + });
3161 +
3162 +}
3163 +
3164 +// The Group Property
3165 +function pagelayer_elp_group(row, prop){
3166 +
3167 + var btnHidden = '';
3168 +
3169 + // Hide button, clone and delete
3170 + if(!pagelayer_empty(prop['hide'])){
3171 + btnHidden = 'pagelayer-hidden';
3172 + }
3173 +
3174 + // Remove the pagelayer-show-tab
3175 + row.removeAttr('pagelayer-show-tab');
3176 +
3177 + var div = '<div class="pagelayer-elp-group-div"></div>'+
3178 + '<center><button class="pagelayer-elp-button '+btnHidden+'">'+prop['text']+'</button></center>';
3179 +
3180 + row.append(div);
3181 +
3182 + // Add button
3183 + var add_item = function(row){
3184 +
3185 + var ele_id = row.closest('[pagelayer-element-id]').attr('pagelayer-element-id') || '';
3186 + var pEle = jQuery('[pagelayer-id="'+ele_id+'"]');
3187 +
3188 + // First add the element inside the group element
3189 + var id = pagelayer_element_add_child(pEle, prop['sc'], prop);
3190 + //pagelayer_element_setup('[pagelayer-id='+id+']', true);
3191 +
3192 + show_item(id);
3193 +
3194 + };
3195 +
3196 + // Show the properties of the existing things
3197 + var show_item = function(id, sel){
3198 +
3199 + // To append after an existing item
3200 + sel = sel || false;
3201 +
3202 + // If pagelayer id empty then return
3203 + if(pagelayer_empty(id)){
3204 + return false;
3205 + }
3206 +
3207 + // Since the element is added very fast, we reselect via jQuery for it to re-access the dom
3208 + jEle = jQuery('[pagelayer-id="'+id+'"]');
3209 +
3210 + var label_param = prop['item_label']['param'] || '';
3211 + var title = pagelayer_get_att(jEle, label_param) || prop['item_label']['default'];
3212 +
3213 + // We need to get the correct value for select based params which are the label
3214 + var child_props = pagelayer_shortcodes[prop.sc];
3215 + for(var section in child_props){
3216 + for(var _param in child_props[section]){
3217 + if(child_props[section][_param]['type'] == 'select'){
3218 + if(title in child_props[section][_param]['list']){
3219 + title = child_props[section][_param]['list'][title];
3220 + }
3221 + }
3222 + }
3223 + }
3224 +
3225 + // Create the HTML
3226 + var holder = jQuery('<div class="pagelayer-elp-group-item" pagelayer-group-item-id="'+id+'">'+
3227 + '<div class="pagelayer-elp-group-item-head">'+
3228 + '<span class="pagelayer-elp-group-item-drag"><i class="pli pli-menu" ></i></span>'+
3229 + '<span class="pagelayer-elp-group-item-title">'+title+'</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>'+
3232 + '</div>'+
3233 + '<div class="pagelayer-elp-group-item-body"></div>'+
3234 + '</div>');
3235 +
3236 + // Append to the row
3237 + if(sel){
3238 + row.find(sel).after(holder);
3239 + }else{
3240 + row.find('.pagelayer-elp-group-div').first().append(holder);
3241 + }
3242 +
3243 + // Setup the toggle
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 + }
3248 + var rEle = holder.find('.pagelayer-elp-group-item-body').first();
3249 + var r_id = holder.attr('pagelayer-group-item-id');
3250 +
3251 + // If the props are not already setup
3252 + if(rEle.html().length < 1){
3253 +
3254 + pagelayer_elpd_generate(jQuery('[pagelayer-id="'+r_id+'"]'), rEle);
3255 +
3256 + // Change the group item title
3257 + var tmp_title = holder.find('[pagelayer-elp-name="'+label_param+'"] [name="'+label_param+'"]');
3258 +
3259 + if(tmp_title.length > 0){
3260 + jQuery(tmp_title).on('input', function(){
3261 + holder.find('.pagelayer-elp-group-item-title').html(tmp_title.val());
3262 + });
3263 + }
3264 +
3265 + }
3266 +
3267 + rEle.toggle();
3268 + });
3269 +
3270 + // Clone the item
3271 + holder.find('.pagelayer-elp-group-item-head .pli-clone').on('click', function(){
3272 +
3273 + // If the element have any parent
3274 + var jEle = jQuery('[pagelayer-id="'+id+'"]');
3275 + var par = pagelayer_get_parent(jEle);
3276 + var clone_ele = pagelayer_copy_element(jEle);
3277 + //console.log(clone_ele);console.log('[pagelayer-group-item-id="'+id+'"]');
3278 + show_item(clone_ele, '[pagelayer-group-item-id="'+id+'"]');
3279 +
3280 + if(par){
3281 + pagelayer_sc_render(pagelayer_ele_by_id(par));
3282 + }
3283 + });
3284 +
3285 + // Delete the item
3286 + holder.find('.pagelayer-elp-group-item-head .pli-trashcan').on('click', function(){
3287 +
3288 + // If the element have any parent
3289 + var jEle = jQuery('[pagelayer-id="'+id+'"]');
3290 + var par = pagelayer_get_parent(jEle);
3291 + holder.remove();
3292 + pagelayer_delete_element(jEle);
3293 +
3294 + if(par){
3295 + pagelayer_sc_render(pagelayer_ele_by_id(par));
3296 + }
3297 + });
3298 +
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 + });
3323 +
3324 + // Handle click of the group
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 + }
3330 + add_item(row);
3331 + });
3332 +
3333 + // Find the existing items
3334 + prop.el.$.find('[pagelayer-parent="'+prop.el['id']+'"]').each(function(){
3335 + var jEle = jQuery(this);
3336 + var id = pagelayer_assign_id(jEle);
3337 + show_item(id);
3338 + });
3339 +};
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 +
3379 +// The Datetime Property
3380 +function pagelayer_elp_datetime(row, prop){
3381 +
3382 + var div = '<div class="pagelayer-elp-datetime-div">'+
3383 + '<input type="date" class="pagelayer-elp-datetime" name="'+prop.c['name']+'" value="'+prop.c['val']+'" />'+
3384 + '</div>';
3385 +
3386 + row.append(div);
3387 +
3388 + row.find('.pagelayer-elp-datetime').on('change', function(){
3389 + _pagelayer_set_atts(row, jQuery(this).val());// Save and Render
3390 + });
3391 +
3392 +};
3393 +
3394 +// The padding property
3395 +function pagelayer_elp_padding(row, prop){
3396 + var val = ['', '', '', ''];
3397 +
3398 + if(!pagelayer_empty(prop.c['val'])){
3399 + val = prop.c['val'];
3400 + if(pagelayer_is_string(val)){
3401 + val = val.split(',');
3402 + }
3403 + }
3404 +
3405 + var div = '<div class="pagelayer-elp-padding-div">'+
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>'+
3411 + '</div>';
3412 +
3413 + row.append(div);
3414 +
3415 + // Is the value linked ?
3416 + var link = row.find('.pagelayer-elp-padding-div i');
3417 + var isLinked = 1;
3418 + //isLinked = isLinked == 2 ? false : true;
3419 + //console.log(isLinked);
3420 + var tmp_val = val[0];
3421 +
3422 + for(var p_val in val){
3423 +
3424 + // Check if unlinked
3425 + if(tmp_val != val[p_val] ){
3426 + isLinked = 0;
3427 + }
3428 + tmp_val = val[p_val];
3429 + }
3430 +
3431 + if(isLinked){
3432 + link.addClass('pagelayer-elp-padding-linked');
3433 + }else{
3434 + link.removeClass('pagelayer-elp-padding-linked');
3435 + }
3436 +
3437 + // Handle link on click
3438 + link.on('click', function(){
3439 +
3440 + var linked = link.hasClass('pagelayer-elp-padding-linked');
3441 +
3442 + if(linked){
3443 + link.removeClass('pagelayer-elp-padding-linked');
3444 + }else{
3445 + link.addClass('pagelayer-elp-padding-linked');
3446 + }
3447 +
3448 + });
3449 +
3450 + row.find('input').on('input', function(){
3451 +
3452 + // Are the values linked
3453 + var linked = row.find('.pagelayer-elp-padding-div .pli').hasClass('pagelayer-elp-padding-linked');
3454 +
3455 + if(linked){
3456 + var val = jQuery(this).val();
3457 + row.find('input').each(function(){
3458 + jQuery(this).val(val);
3459 + });
3460 + }
3461 +
3462 + var vals = [];
3463 +
3464 + // Get all values
3465 + row.find('input').each(function(){
3466 + var val = jQuery(this).val();
3467 + vals.push(val ? val : 0);
3468 + });
3469 +
3470 + _pagelayer_set_atts(row, vals);// Save and Render
3471 + });
3472 +
3473 +};
3474 +
3475 +// The shadow property
3476 +function pagelayer_elp_shadow(row, prop){
3477 +
3478 + var val =['','','',''];
3479 +
3480 + // Do we have a val ?
3481 + if(!pagelayer_empty(prop.c['val'])){
3482 + val = prop.c['val'];
3483 + if(pagelayer_is_string(val)){
3484 + val = val.split(',');
3485 + }
3486 + }
3487 +
3488 + //var val = {color: '', blur: '', horizontal: '', vertical: ''};
3489 +
3490 + var div = '<span class="pagelayer-prop-edit"><i class="pli pli-pencil"></i></span>'+
3491 + '<div class="pagelayer-elp-shadow-div">'+
3492 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-horizontal">'+
3493 + '<label class="pagelayer-elp-label">Horizontal</label>'+
3494 + '<input class="pagelayer-elp-shadow-input" type="number" max="100" min="-100" step="1" class="pagelayer-elp-shadow-blur" value="'+val[0]+'"></input>'+
3495 + '</div>'+
3496 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-vertical">'+
3497 + '<label class="pagelayer-elp-label">Vertical</label>'+
3498 + '<input class="pagelayer-elp-shadow-input" type="number" max="100" min="-100" step="1" class="pagelayer-elp-shadow-blur" value="'+val[1]+'"></input>'+
3499 + '</div>'+
3500 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-blur">'+
3501 + '<label class="pagelayer-elp-label">Blur</label>'+
3502 + '<input class="pagelayer-elp-shadow-input" type="number" max="100" min="0" step="1" class="pagelayer-elp-shadow-blur" value="'+val[2]+'"></input>'+
3503 + '</div>'+
3504 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-color">'+
3505 + '<label class="pagelayer-elp-label">Color</label>'+
3506 + '<div class="pagelayer-elp-color-div">'+
3507 + '<div class="pagelayer-elp-color-preview"></div>'+
3508 + '<span class="pagelayer-elp-remove-color"><i class="pli pli-cross" ></i></span>'+
3509 + '</div>'+
3510 + '</div>'+
3511 + '</div>';
3512 +
3513 + row.append(div);
3514 +
3515 + row.find('.pagelayer-prop-edit').on('click', function(){
3516 + row.find('.pagelayer-elp-shadow-div').toggleClass('pagelayer-prop-show');
3517 + });
3518 +
3519 + var preview = row.find('.pagelayer-elp-color-preview');
3520 + preview.css('background', val[3]);
3521 +
3522 + var picker = new pagelayer_Picker({
3523 + parent : row.find('.pagelayer-elp-color-div')[0],
3524 + popup : 'left',
3525 + color : val[3],
3526 + doc: window.parent.document
3527 + });
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 +
3544 + // Handle selected color
3545 + picker.onChange = function(color) {
3546 + preview.removeClass('pagelayer-blank-preview').css('background', color.rgbaString);
3547 + handle_white(color.hex);
3548 + val[3] = (color.hex ? color.hex : '');
3549 + _pagelayer_set_atts(row, val);
3550 + };
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 +
3562 + row.find('input').on('input', function(){
3563 + var i = 0;
3564 + row.find('.pagelayer-elp-shadow-input').each(function(){
3565 + var value = jQuery(this).val();
3566 + val[i] = (value ? value : '');
3567 + i++;
3568 + });
3569 + _pagelayer_set_atts(row, val);
3570 + });
3571 +
3572 +}
3573 +
3574 +// The box shadow property
3575 +function pagelayer_elp_box_shadow(row, prop){
3576 +
3577 + var val = ['','','','','',''];
3578 +
3579 + // Do we have a val ?
3580 + if(!pagelayer_empty(prop.c['val'])){
3581 + val = prop.c['val'];
3582 + if(pagelayer_is_string(val)){
3583 + val = val.split(',');
3584 + }
3585 + }
3586 +
3587 + var val_pos = ['horizontal','vertical','blur','color','spread','inset'];
3588 +
3589 + var div = '<span class="pagelayer-prop-edit"><i class="pli pli-pencil"></i></span>'+
3590 + '<div class="pagelayer-elp-shadow-div">'+
3591 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-horizontal">'+
3592 + '<label class="pagelayer-elp-label">Horizontal</label>'+
3593 + '<input class="pagelayer-elp-shadow-input" type="number" max="100" min="-100" step="1" class="pagelayer-elp-shadow-blur" name="horizontal" value="'+val[0]+'"></input>'+
3594 + '</div>'+
3595 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-vertical">'+
3596 + '<label class="pagelayer-elp-label">Vertical</label>'+
3597 + '<input class="pagelayer-elp-shadow-input" type="number" max="100" min="-100" step="1" class="pagelayer-elp-shadow-blur" name="vertical" value="'+val[1]+'"></input>'+
3598 + '</div>'+
3599 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-blur">'+
3600 + '<label class="pagelayer-elp-label">Blur</label>'+
3601 + '<input class="pagelayer-elp-shadow-input" type="number" max="100" min="0" step="1" class="pagelayer-elp-shadow-blur" name="blur" value="'+val[2]+'"></input>'+
3602 + '</div>'+
3603 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-spread">'+
3604 + '<label class="pagelayer-elp-label">Spread</label>'+
3605 + '<input class="pagelayer-elp-shadow-input" type="number" max="100" min="0" step="1" class="pagelayer-elp-shadow-spread" name="spread" value="'+(val[4] ? val[4] : 0 )+'"></input>'+
3606 + '</div>'+
3607 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-color">'+
3608 + '<label class="pagelayer-elp-label">Color</label>'+
3609 + '<div class="pagelayer-elp-color-div">'+
3610 + '<div class="pagelayer-elp-color-preview"></div>'+
3611 + '<span class="pagelayer-elp-remove-color"><i class="pli pli-cross" ></i></span>'+
3612 + '</div>'+
3613 + '</div>'+
3614 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-shadow-inset">'+
3615 + '<label class="pagelayer-elp-label">Shadow</label>'+
3616 + '<select class="pagelayer-elp-shadow-input pagelayer-elp-select" name="inset" type="checkbox" class="pagelayer-elp-shadow-inset">'+
3617 + '<option value="">Outset</option>'+
3618 + '<option value="inset"'+(pagelayer_empty(val[5]) ? '' : ' selected' )+'>Inset</option>'+
3619 + '</select>'+
3620 + '</div>'+
3621 + '</div>';
3622 +
3623 + row.append(div);
3624 +
3625 + row.find('.pagelayer-prop-edit').on('click', function(){
3626 + row.find('.pagelayer-elp-shadow-div').toggleClass('pagelayer-prop-show');
3627 + });
3628 +
3629 + var preview = row.find('.pagelayer-elp-color-preview');
3630 + preview.css('background', val[3]);
3631 +
3632 + var picker = new pagelayer_Picker({
3633 + parent : row.find('.pagelayer-elp-color-div')[0],
3634 + popup : 'left',
3635 + color : val[3],
3636 + doc: window.parent.document
3637 + });
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 +
3654 + // Handle selected color
3655 + picker.onChange = function(color) {
3656 + row.find('.pagelayer-elp-color-preview').removeClass('pagelayer-blank-preview').css('background', color.rgbaString);
3657 + handle_white(color.hex);
3658 + val[3] = (color.hex ? color.hex : '');
3659 + _pagelayer_set_atts(row, val);
3660 + };
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
3673 + row.find('.pagelayer-elp-shadow-input').on('input change', function(){
3674 + //var i = 0;
3675 + row.find('.pagelayer-elp-shadow-input').each(function(){
3676 + var value = jQuery(this).val();
3677 + var name = jQuery(this).attr('name');
3678 + val[val_pos.indexOf(name)] = (value ? value : '');
3679 + //i++;
3680 + });
3681 + _pagelayer_set_atts(row, val);
3682 + });
3683 +
3684 +}
3685 +
3686 +// The filter property
3687 +function pagelayer_elp_filter(row, prop){
3688 +
3689 + var val = [0,100,100,0,0,100,100];
3690 +
3691 + // Do we have a val ?
3692 + if(!pagelayer_empty(prop.c['val'])){
3693 + val = prop.c['val'];
3694 + if(pagelayer_is_string(val)){
3695 + val = val.split(',');
3696 + }
3697 + }
3698 +
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']];
3700 +
3701 + var div = '<span class="pagelayer-prop-edit"><i class="pli pli-pencil"></i></span>'+
3702 + '<div class="pagelayer-elp-filter-div">';
3703 +
3704 + jQuery.each(val,function(key, value){
3705 + div += '<div class="pagelayer-elp-prop-grp pagelayer-elp-filter-'+filters[key][0]+'">'+
3706 + '<label class="pagelayer-elp-label">'+filters[key][0]+'</label>'+
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>'+
3708 + '<span class="pagelayer-elp-filter-val">'+value+'</span>'+
3709 + '</div>';
3710 + });
3711 +
3712 + div += '</div>';
3713 +
3714 + row.append(div);
3715 +
3716 + row.find('.pagelayer-prop-edit').on('click', function(){
3717 + row.find('.pagelayer-elp-filter-div').toggleClass('pagelayer-prop-show');
3718 + });
3719 +
3720 + row.find('input').on('input', function(){
3721 + var val = [];
3722 + jQuery(this).parent().find('span').html(this.value);
3723 + row.find('.pagelayer-elp-filter-input').each(function(){
3724 + var value = jQuery(this).val();
3725 + val.push(value ? value : 'none');
3726 + });
3727 + _pagelayer_set_atts(row, val);
3728 + });
3729 +
3730 +}
3731 +
3732 +// The gradient property
3733 +function pagelayer_elp_gradient(row, prop){
3734 +
3735 + var val = ['','','','','','',''];
3736 +
3737 + // Do we have a val ?
3738 + if(!pagelayer_empty(prop.c['val'])){
3739 + val = prop.c['val'];
3740 + if(pagelayer_is_string(val)){
3741 + val = val.split(',');
3742 + }
3743 + }
3744 +
3745 + var setColor = [val[1], val[3], val[5]];
3746 +
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 + }
3780 +
3781 + var div = '<div class="pagelayer-elp-gradient-div">'+
3782 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-angle">'+
3783 + '<label class="pagelayer-elp-label">Angle</label>'+
3784 + '<input class="pagelayer-elp-gradient-input" type="number" max="360" min="0" step="1" class="pagelayer-elp-gradient-angle" value="'+val[0]+'"></input>'+
3785 + '</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)+
3794 + '</div>'+
3795 + '</div>'+
3796 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-per1">'+
3797 + '<label class="pagelayer-elp-label">Percentage 1</label>'+
3798 + '<input class="pagelayer-elp-gradient-input" type="number" max="100" min="-100" step="1" class="pagelayer-elp-gradient-per1" value="'+val[2]+'"></input>'+
3799 + '</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)+
3808 + '</div>'+
3809 + '</div>'+
3810 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-per2">'+
3811 + '<label class="pagelayer-elp-label">Percentage 2</label>'+
3812 + '<input class="pagelayer-elp-gradient-input" type="number" max="100" min="0" step="1" class="pagelayer-elp-gradient-per2" value="'+val[4]+'"></input>'+
3813 + '</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)+
3822 + '</div>'+
3823 + '</div>'+
3824 + '<div class="pagelayer-elp-prop-grp pagelayer-elp-gradient-per3">'+
3825 + '<label class="pagelayer-elp-label">Percentage 3</label>'+
3826 + '<input class="pagelayer-elp-gradient-input" type="number" max="100" min="0" step="1" class="pagelayer-elp-gradient-per3" value="'+val[6]+'"></input>'+
3827 + '</div>'+
3828 + '</div>';
3829 +
3830 + row.append(div);
3831 + var i = 0;
3832 + row.find('.pagelayer-elp-color-preview').each(function(){
3833 + jQuery(this).css('background', setColor[i]);
3834 + i++;
3835 + });
3836 +
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({
3845 + parent : row.find('.pagelayer-elp-gradient-color1')[0],
3846 + popup : 'left',
3847 + color : setColor[0],
3848 + doc: window.parent.document
3849 + });
3850 +
3851 + // Handle selected color
3852 + picker1.onChange = function(color) {
3853 + var cPreview = row.find('.pagelayer-elp-gradient-color1')
3854 + cPreview.css('background', color.rgbaString);
3855 + val[1] = (color.hex ? color.hex : '');
3856 + _pagelayer_set_atts(row, val);
3857 +
3858 + removeGlobal(cPreview.closest('.pagelayer-elp-color-div-holder'));
3859 + };
3860 +
3861 + var picker2 = new pagelayer_Picker({
3862 + parent : row.find('.pagelayer-elp-gradient-color2')[0],
3863 + popup : 'left',
3864 + color : setColor[1],
3865 + doc: window.parent.document
3866 + });
3867 +
3868 + // Handle selected color
3869 + picker2.onChange = function(color) {
3870 + var cPreview = row.find('.pagelayer-elp-gradient-color2');
3871 + cPreview.css('background', color.rgbaString);
3872 + val[3] = (color.hex ? color.hex : '');
3873 + _pagelayer_set_atts(row, val);
3874 +
3875 + removeGlobal(cPreview.closest('.pagelayer-elp-color-div-holder'));
3876 + };
3877 +
3878 + var picker3 = new pagelayer_Picker({
3879 + parent : row.find('.pagelayer-elp-gradient-color3')[0],
3880 + popup : 'left',
3881 + color : setColor[2],
3882 + doc: window.parent.document
3883 + });
3884 +
3885 + // Handle selected color
3886 + picker3.onChange = function(color) {
3887 + var cPreview = row.find('.pagelayer-elp-gradient-color3');
3888 + cPreview.css('background', color.rgbaString);
3889 + val[5] = (color.hex ? color.hex : '');
3890 + _pagelayer_set_atts(row, val);
3891 +
3892 + removeGlobal(cPreview.closest('.pagelayer-elp-color-div-holder'));
3893 + };
3894 +
3895 + row.find('input').on('input', function(){
3896 + var i = 0;
3897 + row.find('.pagelayer-elp-gradient-input').each(function(){
3898 + var value = jQuery(this).val();
3899 + val[i] = (value ? value : '');
3900 + i = i+2;
3901 + });
3902 + _pagelayer_set_atts(row, val);
3903 + });
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 +
3958 +}
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 +
3995 +// The typography property
3996 +function pagelayer_elp_typography(row, prop){
3997 +
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 = {};
4002 +
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';
4014 + }
4015 +
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,
4024 + }
4025 +
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;
4030 + return '<option value="'+val+'" '+selected+'>'+ lang +'</option>';
4031 + }
4032 +
4033 + var font_options = '';
4034 + var font_option = function(val, lang, type, setVal){
4035 + var selected = (val != setVal) ? '' : 'selected="selected"';
4036 + var lang = pagelayer_empty(lang) ? 'Default' : lang;
4037 + return '<option class="pagelayer-elp-typo-sele-op" value="'+val+'" type="'+type+'" '+selected+'>'+lang+'</option>';
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 + }
4048 +
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>';
4057 +
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>'+
4091 + '</div>'+
4092 + '<div class="pagelayer-elp-typo pagelayer-elp-typo-style">'+
4093 + '<label class="pagelayer-elp-label">'+pagelayer_l('font_style')+'</label>'+
4094 + '<select name="font-style" class="pagelayer-elp-typo-input pagelayer-elp-select">';
4095 +
4096 + jQuery.each(select['style'],function(key, value){
4097 + div += option(key, value, val[2]);
4098 + });
4099 + div +='</select>'+
4100 + '</div>'+
4101 + '<div class="pagelayer-elp-typo pagelayer-elp-typo-weight">'+
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">';
4104 + jQuery.each(select['weight'],function(key, value){
4105 + div += option(key, value, val[3]);
4106 + });
4107 +
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>'+
4121 + '</div>'+
4122 + '<div class="pagelayer-elp-typo pagelayer-elp-typo-variant">'+
4123 + '<label class="pagelayer-elp-label">'+pagelayer_l('font_variant')+'</label>'+
4124 + '<select name="font-variant" class="pagelayer-elp-typo-input pagelayer-elp-select">';
4125 + jQuery.each(select['variant'],function(key, value){
4126 + div += option(key, value, val[4]);
4127 + });
4128 +
4129 + div += '</select>'+
4130 + '</div>'+
4131 + '<div class="pagelayer-elp-typo pagelayer-elp-typo-deco-line">'+
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">';
4134 + jQuery.each(select['deco-line'],function(key, value){
4135 + div += option(key, value, val[5]);
4136 + });
4137 +
4138 + div += '</select>'+
4139 + '</div>'+
4140 + '<div class="pagelayer-elp-typo pagelayer-elp-typo-deco-style">'+
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">';
4143 + jQuery.each(select['deco-style'],function(key, value){
4144 + div += option(key, value, val[6]);
4145 + });
4146 +
4147 + div += '</select>'+
4148 + '</div>'+
4149 + '<div class="pagelayer-elp-typo pagelayer-elp-typo-height">'+
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>'+
4154 + '</div>'+
4155 + '<div class="pagelayer-elp-typo pagelayer-elp-typo-transform">'+
4156 + '<label class="pagelayer-elp-label">'+pagelayer_l('text_transform')+'</label>'+
4157 + '<select name="text-transform" class="pagelayer-elp-typo-input pagelayer-elp-select">';
4158 + jQuery.each(select['transform'],function(key, value){
4159 + div += option(key, value, val[8]);
4160 + });
4161 +
4162 + div += '</select>'+
4163 + '</div>'+
4164 + '<div class="pagelayer-elp-typo pagelayer-elp-typo-lspacing">'+
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>'+
4169 + '</div>'+
4170 + '<div class="pagelayer-elp-typo pagelayer-elp-typo-wspacing">'+
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>'+
4175 + '</div>'+
4176 + '</div>'+
4177 + '</div>';
4178 +
4179 + row.append(div);
4180 +
4181 + if(pagelayer_empty(val[5]) || val[5]=='none'){
4182 + row.find('.pagelayer-elp-typo-deco-style').hide();
4183 + }
4184 +
4185 + row.find('.pagelayer-elp-typo-edit-div .pli-pencil').on('click', function(){
4186 + row.find('.pagelayer-elp-typo-div').toggleClass('pagelayer-prop-show');
4187 + });
4188 +
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 + }
4230 +
4231 + row.find('.pagelayer-elp-typo-input').on('change', function(e){
4232 +
4233 + var jEle = jQuery(e.target);
4234 +
4235 + pagelayer_link_font_family(jEle);
4236 + jEle.closest('[pagelayer-set-global]').removeAttr('pagelayer-set-global');
4237 +
4238 + // Save value
4239 + save_typography();
4240 + });
4241 +
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 + });
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 +
4256 + });
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 + });
4262 +
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 + });
4318 + });
4319 +
4320 + // Handle for global font
4321 + row.find('.pagelayer-global-font-list-item').on('click', function(e){
4322 + e.stopPropagation();
4323 +
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');
4333 +
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();
4366 +
4367 + if(pagelayer_empty(val)){
4368 + return true;
4369 + }
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';
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 + });
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);
4399 + });
4400 +
4401 + row.find('.pagelayer-elp-screen .pagelayer-prop-screen').on('click', function(e){
4402 + jQuery(this).siblings().toggleClass('open');
4403 + });
4404 +
4405 +}
4406 +
4407 +// The dimension property
4408 +function pagelayer_elp_dimension(row, prop){
4409 +
4410 + var val = ['', ''];
4411 +
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 +
4420 + }
4421 +
4422 + var div = '<div class="pagelayer-elp-dimension-div">'+
4423 + '<input type="number" class="pagelayer-elp-dimension" value="'+parseFloat(val[0])+'"></input>'+
4424 + '<input type="number" class="pagelayer-elp-dimension" value="'+parseFloat(val[1])+'"></input>'+
4425 + '<i class="pli pli-link" ></i>'+
4426 + '</div>';
4427 +
4428 + row.append(div);
4429 +
4430 + // Is the value linked ?
4431 + var link = row.find('.pagelayer-elp-dimension-div .pli');
4432 + var isLinked = 1;
4433 + var tmp_val = val[0];
4434 +
4435 + for(var p_val in val){
4436 +
4437 + // Check if unlinked
4438 + if(tmp_val != val[p_val] ){
4439 + isLinked = 0;
4440 + }
4441 + tmp_val = val[p_val];
4442 + }
4443 +
4444 + if(isLinked){
4445 + link.addClass('pagelayer-elp-dimension-linked');
4446 + }else{
4447 + link.removeClass('pagelayer-elp-dimension-linked');
4448 + }
4449 +
4450 + // Handle link on click
4451 + link.on('click', function(){
4452 +
4453 + var linked = link.hasClass('pagelayer-elp-dimension-linked');
4454 +
4455 + if(linked){
4456 + link.removeClass('pagelayer-elp-dimension-linked');
4457 + }else{
4458 + link.addClass('pagelayer-elp-dimension-linked');
4459 + }
4460 +
4461 + });
4462 +
4463 + row.find('input').on('input', function(){
4464 +
4465 + // Are the values linked
4466 + var linked = row.find('.pagelayer-elp-dimension-div .pli').hasClass('pagelayer-elp-dimension-linked');
4467 +
4468 + if(linked){
4469 + var val = jQuery(this).val();
4470 + row.find('input').each(function(){
4471 + jQuery(this).val(val);
4472 + });
4473 + }
4474 +
4475 + var vals = [];
4476 +
4477 + // Get all values
4478 + row.find('input').each(function(){
4479 + var val = jQuery(this).val();
4480 + vals.push(val ? val : 0);
4481 + });
4482 +
4483 + _pagelayer_set_atts(row, vals);// Save and Render
4484 + });
4485 +
4486 +};
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 +
5242 +// Select frame to upload media
5243 +function pagelayer_select_frame(tag, state){
5244 +
5245 + var state = state || '';
5246 + //console.log(state);
5247 +
5248 + var frame;
5249 +
5250 + switch(tag){
5251 +
5252 + // Multi image selection frame
5253 + case 'multi_image':
5254 +
5255 + frame = wp.media({
5256 +
5257 + id: 'pagelayer-wp-multi-image-library',
5258 + frame: 'post',
5259 + state: state,
5260 + title: pagelayer_l('frame_multi_image'),
5261 + multiple: true,
5262 + library: wp.media.query({type: 'image'}),
5263 + button: {
5264 + text: pagelayer_l('insert')
5265 + },
5266 +
5267 + });
5268 +
5269 + break;
5270 +
5271 + // Media selection frame
5272 + case 'media':
5273 +
5274 + frame = wp.media({
5275 +
5276 + id: 'pagelayer-wp-media-library',
5277 + frame: 'post',
5278 + state: 'pagelayer-media',
5279 + title: pagelayer_l('frame_media'),
5280 + multiple: false,
5281 + states: [
5282 + new wp.media.controller.Library({
5283 + id: 'pagelayer-media',
5284 + title: pagelayer_l('frame_media'),
5285 + multiple: false,
5286 + date: true
5287 + })
5288 + ],
5289 + button: {
5290 + text: pagelayer_l('insert')
5291 + },
5292 +
5293 + });
5294 +
5295 + break;
5296 +
5297 + //Default frame(for image, video, audio)
5298 + default:
5299 +
5300 + frame = wp.media({
5301 +
5302 + id: 'pagelayer-wp-'+tag+'-library',
5303 + frame: 'post',
5304 + state: 'pagelayer-'+tag,
5305 + title: pagelayer_l('frame_media'),
5306 + multiple: false,
5307 + library: wp.media.query({type: tag}),
5308 + states: [
5309 + new wp.media.controller.Library({
5310 + id: 'pagelayer-'+tag,
5311 + title: pagelayer_l('frame_media'),
5312 + library: wp.media.query( { type: tag } ),
5313 + multiple: false,
5314 + date: true
5315 + })
5316 + ],
5317 + button: {
5318 + text: pagelayer_l('insert')
5319 + },
5320 +
5321 + });
5322 +
5323 + break;
5324 + }
5325 +
5326 + frame.on({
5327 + 'menu:render:default': function(view){
5328 + view.unset('insert');
5329 + view.unset('gallery');
5330 + view.unset('featured-image');
5331 + view.unset('playlist');
5332 + view.unset('video-playlist');
5333 + },
5334 + }, this);
5335 +
5336 + return frame;
5337 +
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 +}