PluginProbe
Page Builder: Pagelayer – Drag and Drop website builder / 0.9.5
Page Builder: Pagelayer – Drag and Drop website builder v0.9.5
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 1.0.5 All 129 releases
pagelayer / js / pagelayer-editor.js

pagelayer-editor.js in Page Builder: Pagelayer – Drag and Drop website builder 0.9.5, at js/pagelayer-editor.js

3,049 lines 74.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*
2 PAGELAYER
3 http://pagelayer.com/
4 (c) Pagelayer Team
5 */
6
7 pagelayer = {
8 $: jQuery,
9 $$ : function(select){
10 return jQuery(select, window.parent.document);
11 },
12 p : this,
13 copy_selected: '',
14 mouse: {x: -1, y: -1},
15 history_action : true,
16 }
17
18 var pagelayer_history_obj = {}, pagelayer_revision_obj = {};
19
20 // Lets start
21 jQuery(document).ready(function(){
22
23 pagelayer_shortcodes['pl_inner_row'] = JSON.parse(JSON.stringify(pagelayer_shortcodes['pl_row']));
24 pagelayer_shortcodes['pl_inner_row']['name'] = 'Inner Row';
25 pagelayer_groups['grid'].push('pl_inner_row');
26
27 // Make the Topbar
28 pagelayer_bottombar();
29
30 // Make the Leftbar
31 pagelayer_leftbar();
32
33 // Add widget section
34 pagelayer_add_widget();
35
36 // Setup the ELPD
37 pagelayer_elpd_setup();
38
39 // Setup the properties of the elements
40 pagelayer_element_setup();
41
42 // An image to show for drag
43 jQuery('body').append('<img src="'+pagelayer_url+'/images/drag-ghost.png" class="pagelayer-drag-show" />');
44
45 // Setup the grid drag
46 pagelayer_setup_drag();
47
48 // Set to desktop
49 pagelayer_set_screen_mode('desktop');
50
51 // Set up right click
52 pagelayer_left_click();
53 pagelayer_right_click();
54
55 // Setup pagelayer history
56 pagelayer_history_obj['action_data'] = [];
57 pagelayer_history_setup(true);
58
59 });
60
61 // The jQuery Object of the ELPD
62 var pagelayer_elpd;
63
64 function pagelayer_closest_corner(jEle){
65 var corners = [];
66 var w = jEle.outerWidth();
67 var h = jEle.outerHeight();
68 var topleft = jEle.offset();
69
70 // 0 - Top Left
71 corners.push(topleft);
72
73 // 1 - Top Right
74 corners.push({top: topleft.top, left: topleft.left+w});
75
76 // 2 - Bottom Right
77 corners.push({top: topleft.top+h, left: topleft.left+w});
78
79 // 3 - Bottom Left
80 corners.push({top: topleft.top+h, left: topleft.left});
81
82 //console.log(corners);
83
84 // Calculate the closest to the mouse
85 var distances = {};
86 for(var c in corners){
87 var dist = Math.hypot(pagelayer.mouse.x - corners[c].left, pagelayer.mouse.y - corners[c].top);
88 distances[c] = dist;
89 }
90 //console.log(distances);
91
92 var corner = Object.keys(distances).sort(function(a,b){return distances[a]-distances[b]})[0];
93 //console.log(corner);
94
95 return corner;
96
97 };
98
99 // Make rows and cols draggable
100 function pagelayer_setup_drag(){
101
102 // The object to show as drag
103 var shower = jQuery('.pagelayer-drag-show');
104
105 // Delete any prospect
106 var clear_prospect = function(){
107 jQuery('.pagelayer-drag-prospect').remove();
108
109 // Shows the wrap as active
110 jQuery('.pagelayer-drag-ele-hover').removeClass('pagelayer-drag-ele-hover');
111 }
112
113 // Reset the complete drag stuff
114 var reset_dragging = function(){
115 pagelayer.dragging = false;
116 pagelayer.drag_is_new = false;
117 pagelayer.drag_mouse = {x: 0, y: 0};
118 reset_on_drag();
119 }
120
121 // Reset the element on you were last
122 var reset_on_drag = function(){
123 pagelayer.drag_closest = false;
124 pagelayer.drag_closest_corner = null;
125 }
126
127 // Scroll by
128 var scrollPx = 7;
129 var scrollDist = 30;
130
131 // If we are too close too the window edge, then scroll
132 var handle_scroll = function(e){
133
134 var windowHeight = jQuery(window).height();
135 var windowWidth = jQuery(window).width();
136
137 // Are we to close to the top or bottom
138 if(e.clientY < scrollDist){
139 window.scrollBy(0, -scrollPx);
140 }else if((windowHeight - e.clientY) < scrollDist){
141 window.scrollBy(0, scrollPx);
142 }
143
144 // Are we to close to the top or bottom
145 if(e.clientX < scrollDist){
146 window.scrollBy(-scrollPx, 0);
147 }else if((windowWidth - e.clientX) < scrollDist){
148 window.scrollBy(scrollPx, 0);
149 }
150
151 }
152
153 // SET the values
154 reset_dragging();
155
156 var ondragover = function(e) {
157 //console.log(e);
158
159 pagelayer.mouse.x = parseInt(e.pageX);
160 pagelayer.mouse.y = parseInt(e.pageY);
161 //console.log(pagelayer.mouse);
162
163 // Are we dragging ?
164 if(pagelayer.dragging){
165
166 //console.log(e);
167
168 e.preventDefault();
169 //e.stopPropagation();
170
171 // The wrap of the element being dragged
172 var wrap = pagelayer.dragging;
173
174 // New addition
175 var is_new = pagelayer.drag_is_new;
176 var ele;
177 var tag = pagelayer_tag(wrap);
178 var id = pagelayer_id(wrap);
179
180 // If existing element then add we are dragging
181 if(!is_new){
182
183 // Start Dragging
184 if(!wrap.hasClass('pagelayer-is-dragging')){
185 wrap.addClass('pagelayer-is-dragging');
186 }
187
188 //shower.hide();
189
190 ele = document.elementFromPoint(e.clientX, e.clientY);
191 //console.log(ele);
192
193 // Drag the show object
194 //shower.show();
195 //var offset = {top: (e.pageY-10)+'px', left: (e.pageX-10)+'px'}
196 //shower.css(offset);
197
198 }else{
199 ele = document.elementFromPoint(e.clientX, e.clientY);
200 }
201 //console.log(e);
202
203 // Have we moved more than 5px;
204 var dist = Math.hypot(pagelayer.mouse.x - pagelayer.drag_mouse.x, pagelayer.mouse.y - pagelayer.drag_mouse.y);
205 //console.log(dist);
206 /*if(dist && dist < 5){
207 return false;
208 }*/
209
210 // Handle the scroll
211 handle_scroll(e);
212
213 // Find the closest wrap
214 var onWrap;
215
216 // If we are a column, we can be over another column or row
217 if(tag == 'pl_col'){
218 onWrap = jQuery(ele).closest('.pagelayer-wrap-col,.pagelayer-wrap-row,.pagelayer-wrap-inner-row');
219 //console.log(pagelayer_id(onWrap));
220
221 // If we are a row, we can be over another row or a column
222 }else if(tag == 'pl_row'){
223 onWrap = jQuery(ele).closest('.pagelayer-wrap-row');
224 //console.log(pagelayer_id(onWrap));
225
226 // For inner row we restrict to 1 level only
227 }else if(tag == 'pl_inner_row'){
228 var ele_wrap = jQuery(ele).parents('.pagelayer-wrap-col')
229 if(ele_wrap.length == 1){
230 onWrap = jQuery(ele).closest('.pagelayer-wrap-ele,.pagelayer-wrap-col');
231 }else{
232 onWrap = jQuery(ele).closest('.pagelayer-wrap-ele,.pagelayer-wrap-inner-row');
233 }
234 // For every other element, we can be over a col or ele
235 }else{
236 onWrap = jQuery(ele).closest('.pagelayer-wrap-ele,.pagelayer-wrap-col');
237 }
238 //console.log(onWrap);
239
240 // If we find nothing
241 if(pagelayer_empty(onWrap) || onWrap.length < 1){
242 clear_prospect();// Clear existing prospects
243 reset_on_drag();// Also reset the last on item
244 return false;
245 }
246
247 // Get the ID
248 var onId = onWrap.attr('pagelayer-wrap-id');
249 var onEle = onWrap.children('.pagelayer-ele');
250
251 // Do we have a parent ?
252 var pOnId = pagelayer_get_parent(onEle);
253
254 if(pOnId){
255 onId = pOnId;
256 onEle = pagelayer_ele_by_id(onId);
257 onWrap = pagelayer_wrap_by_id(onId);
258 }
259
260 var changed = false;
261
262 // Was it the same ID like the one we were on before
263 if(pagelayer.drag_closest != onId){
264 pagelayer.drag_closest = onId;
265 changed = true;
266 }
267 //console.log(onId+' '+pagelayer.drag_closest)
268
269 var req_corners = {0: 'top', 1: 'top', 2: 'bottom', 3: 'bottom'};
270
271 // For columns we redefine the top and bottom
272 if(tag == 'pl_col'){
273 req_corners[1] = 'bottom';
274 req_corners[3] = 'top';
275 }
276
277 // Determine the previous and next
278 var next = wrap.next('.pagelayer-ele-wrap');
279 var prev = wrap.prev('.pagelayer-ele-wrap');
280
281 if(next.length == 1 && pagelayer_id(next) == onId){
282 req_corners = {0: 'bottom', 1: 'bottom', 2: 'bottom', 3: 'bottom'};
283 }
284
285 if(prev.length == 1 && pagelayer_id(prev) == onId){
286 req_corners = {0: 'top', 1: 'top', 2: 'top', 3: 'top'};
287 }
288
289 // Which corner are we closest to ?
290 var corner_num = pagelayer_closest_corner(onWrap);
291 var corner = req_corners[corner_num];
292
293 //console.log(corner+' != '+pagelayer.drag_closest_corner)
294 if(corner != pagelayer.drag_closest_corner){
295 pagelayer.drag_closest_corner = corner;
296 changed = true;
297 }
298
299 //console.log(changed);
300
301 // If we are on our self then clear return false
302 if(onId == id){
303 clear_prospect();// Clear existing prospects
304 reset_on_drag();// Also reset the last on item
305 return false;
306 }
307
308 // Then lets start showing
309 if(changed){
310
311 // Record the mouse points
312 pagelayer.drag_mouse.x = parseInt(e.pageX);
313 pagelayer.drag_mouse.y = parseInt(e.pageY);
314
315 // Clear any existing prospect
316 clear_prospect();
317
318 // Add new prospect
319 var prospect = '<div class="pagelayer-drag-prospect" pagelayer-corner="'+corner+'"></div>';
320
321 if(corner == 'bottom'){
322 onWrap.append(prospect);
323 }else if(corner == 'top'){
324 onWrap.prepend(prospect);
325 }
326
327 prospect = jQuery('.pagelayer-drag-prospect')
328 var animate_props = {height: '5px'};
329
330 // For column add a special class
331 if(tag == 'pl_col'){
332 prospect.addClass('pagelayer-drag-prospect-col');
333 animate_props['width'] = '5px';
334
335 // Adjust the left and right
336 var css = {};
337 css[(corner == 'bottom' ? 'right' : 'left')] = '0px';
338 prospect.css(css);
339 }
340
341 // Animate the prospect
342 prospect.animate(animate_props, 200);
343
344 // Highlight the wrap via overlay
345 onWrap.children('.pagelayer-ele-overlay').addClass('pagelayer-drag-ele-hover');
346
347 }
348
349 }
350 }
351
352 // When mouse is pressed down
353 var ondragstart = function(e){
354
355 //console.log(e);
356
357 // Target
358 var tEle = jQuery(e.target);
359 var wrap = tEle.closest('.pagelayer-ele-wrap');
360 //console.log(jEle[0]);
361
362 // Is it an existing element ?
363 if(wrap.length < 1){
364 return false;
365 }
366
367 // Do we have a parent ?
368 var id = pagelayer_id(wrap);
369 var jEle = pagelayer_ele_by_id(id);
370 var pId = pagelayer_get_parent(jEle);
371
372 if(pId){
373 wrap = pagelayer_wrap_by_id(pId);
374 }
375
376 //e.preventDefault();
377
378 var tag = pagelayer_tag(wrap);
379
380 e.originalEvent.dataTransfer.setData('Text', 1);
381 var img = document.createElement('img');
382 img.src = shower.attr('src');
383 e.originalEvent.dataTransfer.setDragImage(img, 32, 32);
384
385 pagelayer.dragging = wrap;
386
387 }
388
389 // When mouse is pressed down
390 var ondrop = function(e){
391
392 //console.log(e);
393
394 // Stop dragging ?
395 if(pagelayer.dragging){
396
397 e.preventDefault();
398
399 var wrap = pagelayer.dragging;
400 var tag = pagelayer_tag(wrap);
401 var fromEl = wrap.parent();
402 var id;
403 wrap.removeClass('pagelayer-is-dragging');
404
405 // Find any prospect
406 var prospect = jQuery('.pagelayer-drag-prospect');
407 //console.log(prospect[0]);
408
409 // It should be exactly 1
410 if(prospect.length == 1){
411
412 var onWrap = prospect.parent();
413 var onId = pagelayer_id(onWrap);
414 var onTag = pagelayer_tag(onWrap);
415 var dropped;
416 var corner = prospect.attr('pagelayer-corner');
417 var method = (corner == 'top') ? 'before' : 'after';
418
419 // Create the element if it needs to be created
420 if(pagelayer.drag_is_new){
421 dropped = jQuery('<div pagelayer-tag="'+tag+'"></div>');
422
423 // Move the object
424 }else{
425 dropped = wrap;
426 dropped.detach();
427 }
428
429 // If I am a column or row, then I go only before or after my same type !
430 if((onTag == 'pl_col' || onTag == 'pl_row') && onTag == tag){
431
432 // If I am a column and I am on a row
433 // OR I am a normal element and I am on column
434 }else if((tag == 'pl_col' && (onTag == 'pl_row' || onTag == 'pl_inner_row')) || onTag == 'pl_col'){
435 // We need to find the holder and add the prospect there
436 var holder = pagelayer_shortcodes[onTag]['holder'];
437 onWrap = onWrap.children('.pagelayer-ele').children(holder);
438 method = (corner == 'top') ? 'prepend' : 'append';
439 }
440
441 // Attach or shift the element
442 onWrap[method](dropped);
443 //console.log(dropped);
444
445 // Trigger the onadd
446 if(pagelayer.drag_is_new){
447 id = pagelayer_onadd(dropped);
448
449 // Existing elements
450 }else{
451 id = pagelayer_id(wrap);
452 }
453
454 // Defining the variables as needed
455 var jEle = pagelayer_ele_by_id(id);
456 wrap = pagelayer_wrap_by_id(id);
457 var toEl = wrap.parent();
458
459 // Column number handle
460 if(tag == 'pl_col'){
461
462 var row_holder = jEle.parent().closest('.pagelayer-row-holder');
463
464 // Renumber the col where you are going
465 pagelayer_renumber_col(row_holder);
466
467 // Renumber the old columns as well
468 if(!pagelayer.drag_is_new){
469 var from_row = fromEl.closest('.pagelayer-row-holder');
470 pagelayer_renumber_col(from_row);
471 }
472 }
473
474 // Handle the empty col
475 if(tag != 'pl_col'){
476
477 pagelayer_empty_col(toEl.closest('.pagelayer-col-holder'));
478
479 if(!pagelayer.drag_is_new){
480 pagelayer_empty_col(fromEl.closest('.pagelayer-col-holder'));
481 }
482
483 }
484
485 }
486
487 // Clear prospect
488 clear_prospect();
489 }
490
491 reset_dragging();
492
493 }
494
495 // Add the events for inner content - as we are using the drag API
496 jQuery(document).on('dragstart', ondragstart);
497 jQuery(document).on('dragover', ondragover);
498 jQuery(document).on('drop', ondrop);
499
500 // For addition of new elements
501 pagelayer.$$('[pagelayer-tag]').on('dragstart', function(e){
502 //console.log(e);
503
504 var tEle = jQuery(e.target);
505 var jEle = tEle.closest('.pagelayer-shortcode-drag');
506
507 // Is it an existing element ?
508 if(jEle.length < 1){
509 return false;
510 }
511
512 e.originalEvent.dataTransfer.setData('tag', pagelayer_tag(jEle));
513
514 pagelayer.dragging = jEle;
515 pagelayer.drag_is_new = true;
516
517 });
518
519 };
520
521 // Handle empty col
522 // selector should be col holder
523 function pagelayer_empty_col(selector){
524
525 // Loop through
526 jQuery(selector).each(function(){
527
528 var jEle = jQuery(this);// jEle is the COL HOLDER
529
530 // Are we a col ?
531 if(!jEle.hasClass('pagelayer-col-holder')){
532 return;
533 }
534
535 // Column is becoming blank, so show add ele
536 if(jEle.children().length < 1){
537 //from.addClass('pagelayer-empty-col');
538 jEle.append('<div class="pagelayer-add-ele pagelayer-ele-wrap"><i class="fa fa-plus"><br>Empty column please add something</div>');
539 var h = jEle.parent().parent().children('.pagelayer-ele-overlay').height();
540 jEle.children('.pagelayer-add-ele').height(h);
541
542 // Any add ele sign with non-empty columns here ?
543 }else if(jEle.children('.pagelayer-add-ele').length > 0){
544 jEle.children('.pagelayer-add-ele').remove();
545 }
546
547 });
548
549 };
550
551 // Reset the column widths
552 // The selector should be a ROW HOLDER
553 function pagelayer_renumber_col(selector){
554
555 var pEle = jQuery(selector);
556 var children = pEle.children('.pagelayer-ele-wrap');
557 var cols = Math.floor(12 / (children.length));
558 var obj = {col: cols};
559
560 // Find out the number of cols of other cols
561 children.each(function(){
562
563 // This is the wrapper
564 var jEle = jQuery(this);
565
566 // The real element
567 var Ele = jEle.find('>.pagelayer-ele');
568
569 for(var x=1; x<=12; x++){
570 if(jEle.hasClass('pagelayer-col-'+x)){
571 jEle.removeClass('pagelayer-col-'+x);
572 Ele.removeClass('pagelayer-col-'+x);
573 break;
574 }
575 }
576 jEle.addClass('pagelayer-col-'+cols);
577 Ele.addClass('pagelayer-col-'+cols);
578
579 // Set the att
580 pagelayer_set_atts(Ele, obj);
581 });
582 }
583
584 // Handle addition of elements from the left
585 // NOTE : At this point the addition is FINALIZED
586 // The add element cannot be prevented !
587 function pagelayer_onadd(jEle, toClick){
588
589 toClick = arguments.length == 2 ? toClick : true;
590
591 //console.log(jEle);
592 var id = pagelayer_element_added(jEle);
593 var jEle = jQuery("[pagelayer-id="+id+"]");
594
595 if(toClick){
596 //console.log('here');
597 jEle.click();
598 }
599
600 return id;
601
602 };
603
604 // Add an element into the POST
605 function pagelayer_element_added(jEle){
606
607 var sc = jEle.attr('pagelayer-tag');
608 var id, par_id;
609
610 // Set Pagelayer History FALSE to prevent saving attributes in action history
611 pagelayer.history_action = false;
612
613 // Generate the HTML
614 html = pagelayer_create_sc(sc);
615 id = pagelayer_assign_id(html);
616 par_id = id;
617
618 // Insert the HTML
619 jEle[0].outerHTML = html[0].outerHTML;
620
621 // Setup the properties of the elements
622 pagelayer_element_setup("[pagelayer-id="+par_id+"], [pagelayer-id="+par_id+"] .pagelayer-ele", true);
623
624 // Any children to add ?
625 if(!('widget' in pagelayer_shortcodes[sc])){
626
627 // The element props
628 var props = pagelayer_shortcodes[sc];
629
630 // Do we have to create children ?
631 if('has_group' in props){
632
633 var has_group = props['has_group'];
634 var gProp = props[has_group['section']][has_group['prop']];
635
636 for(var i=0; i < gProp['count']; i++){
637 var cid = pagelayer_element_add_child(jQuery("[pagelayer-id="+id+"]"), gProp['sc']);
638 //pagelayer_element_setup('[pagelayer-id='+cid+']', true);
639 }
640
641 }
642
643 }
644
645 // Save in action history
646 var cEle = pagelayer_near_by_ele(id, sc);
647
648 pagelayer_history_action_push({
649 'title' : pagelayer_shortcodes[sc]['name'],
650 'action' : 'Added',
651 'pl_id' : id,
652 'html' : html[0].outerHTML,
653 'cEle' : cEle
654 });
655
656 // Set pagelayer history TRUE
657 pagelayer.history_action = true;
658
659 return id;
660
661 };
662
663 // Add an element
664 function pagelayer_element_add_child(pEle, sc){
665 var child = pagelayer_create_sc(sc);
666 var cid = pagelayer_assign_id(child);
667 pagelayer_set_parent(child, pagelayer_assign_id(pEle));
668
669 // Does the parent have a holder ?
670 var tag = pagelayer_tag(pEle);
671
672 // There is a holder
673 if('holder' in pagelayer_shortcodes[tag]){
674
675 pEle.find(pagelayer_shortcodes[tag]['holder']).append(child);
676
677 // No holder, just append
678 }else{
679 pEle.append(child);
680 }
681
682 pagelayer_element_setup('[pagelayer-id='+cid+']', true);
683
684 // Do we have to create children ?
685 if('has_group' in pagelayer_shortcodes[sc]){
686
687 var has_group = pagelayer_shortcodes[sc]['has_group'];
688 var gProp = pagelayer_shortcodes[sc][has_group['section']][has_group['prop']];
689
690 for(var i=0; i < gProp['count']; i++){
691 var in_cid = pagelayer_element_add_child(jQuery("[pagelayer-id="+cid+"]"), gProp['sc']);
692 }
693
694 }
695
696 return cid;
697 };
698
699 // Return an element by ID
700 function pagelayer_ele_by_id(id){
701 return jQuery('[pagelayer-id='+id+']');
702 };
703
704 // Return the wrap by ID
705 function pagelayer_wrap_by_id(id){
706 return jQuery('[pagelayer-wrap-id='+id+']');
707 };
708
709 // Give the Pagelayer ID
710 function pagelayer_id(jEle){
711
712 var id = jEle.attr('pagelayer-wrap-id');
713 if(id){
714 return id;
715 }
716
717 id = jEle.attr('pagelayer-id');
718
719 return id;
720
721 }
722
723 // Assign the jQuery object an ID
724 function pagelayer_assign_id(jEle){
725
726 // Do you have the pagelayer id
727 var id = jEle.attr("pagelayer-id");
728 if(!id || id.length < 1){
729 id = pagelayer_randstr(16);
730 jEle.attr("pagelayer-id", id);
731 }
732
733 return id;
734
735 }
736
737 // Show the edit options
738 function pagelayer_element_clicked(selector, e){
739
740 var jEle = jQuery(selector);
741 e = e || false;
742
743 // You must be a element atleast
744 if(!jEle.hasClass('pagelayer-ele')){
745 return false;
746 }
747
748 // Get the parent
749 var pId = pagelayer_get_parent(jEle);
750
751 // If we found a parent
752 if(pId){
753 jEle = pagelayer_ele_by_id(pId);
754 }
755
756 // Lets not rebuild everything to make it faster
757 if(pagelayer_is_active(jEle)){
758 return false;
759 }
760
761 // Make the editable fields active
762 pagelayer_clear_editable();// First clear
763 jEle.find('[pagelayer-editable]').each(function (){
764 pagelayer_make_editable(jQuery(this), e);
765 });
766
767 // Set this as the active element
768 pagelayer_set_active(jEle);
769
770 // Show the properties
771 pagelayer_elpd_open(jEle);
772
773 }
774
775 // The edit option
776 function pagelayer_edit_element(selector){
777 pagelayer_element_clicked(selector);
778 }
779
780 // Setup the properties on a single click
781 function pagelayer_element_setup(selector, render){
782
783 var selector = selector || ".pagelayer-ele";
784 render = render || false;
785
786 // Loop through
787 jQuery(selector).each(function(){
788
789 var jEle = jQuery(this);
790
791 // Assign an ID if not there
792 var id = pagelayer_assign_id(jEle);
793 var pId = pagelayer_get_parent(jEle) || '';// Options to show on hover
794 var selector = '[pagelayer-id='+id+']';
795
796 if(render){
797 pagelayer_sc_render(jEle);
798 }
799
800 // Get the tag
801 var tag = pagelayer_tag(jEle);
802
803 // Lets check if we are the child of a parent i.e. element of a group
804 if(pagelayer_empty(pId)){
805
806 // Get the parent
807 var pEle = jEle.parent().closest('.pagelayer-ele');
808
809 // If we found a parent
810 if(pEle.length > 0){
811
812 var pTag = pagelayer_tag(pEle);
813
814 // Is the parent a group of this child ?
815 if(!pagelayer_empty(pagelayer_shortcodes[pTag]) && pagelayer_is_group(pTag)){
816
817 var has_group = pagelayer_shortcodes[pTag]['has_group'];
818 var child_type = pagelayer_shortcodes[pTag][has_group['section']][has_group['prop']]['sc'];
819
820 // If the type is the same as jEle
821 if(child_type == pagelayer_tag(jEle)){
822 pId = pagelayer_assign_id(pEle);
823 pagelayer_set_parent(jEle, pId);
824 }
825 }
826
827 }
828
829 }
830
831 // Make the wraps
832 jEle.wrap('<div class="pagelayer-ele-wrap" pagelayer-wrap-id="'+id+'"></div>');
833 var wrap = jEle.parent();
834
835 // For column we have to do some kidas !
836 if(tag == 'pl_col'){
837
838 var col;
839 for(var x=1; x<=12; x++){
840 if(jEle.hasClass('pagelayer-col-'+x)){
841 col = 'pagelayer-col-'+x;
842 break;
843 }
844 }
845
846 var is_custom_width = pagelayer_get_att(jEle, 'col');
847 var col_width = pagelayer_get_att(jEle, 'col_width');
848 if(pagelayer_empty(is_custom_width) && col_width){
849 wrap.css('width', col_width+'%');
850 }
851
852 wrap.addClass('pagelayer-col '+col);
853 //jEle.removeClass('pagelayer-col '+col);
854 wrap.addClass('pagelayer-wrap-col');
855
856 }else if(tag == 'pl_row'){
857 wrap.addClass('pagelayer-wrap-row');
858 }else if(tag == 'pl_inner_row'){
859 wrap.addClass('pagelayer-wrap-inner-row');
860 }else{
861 wrap.addClass('pagelayer-wrap-ele');
862 }
863
864 // Create the overlay
865 wrap.prepend('<div class="pagelayer-ele-overlay"></div>');
866
867 var overlay = wrap.children('.pagelayer-ele-overlay');
868 var html;
869
870 if(tag == 'pl_row' || tag == 'pl_inner_row'){
871
872 overlay.addClass('pagelayer-row-hover');
873
874 if(jEle.hasClass('pagelayer-row-stretch-full')){
875 pagelayer_sc_render(jEle);
876 }
877
878 html = '<div class="pagelayer-row-option" pagelayer-option-edit pagelayer-option-id="'+id+'">'+
879 '<i class="fa fa-clone pagelayer-eoi" onclick="pagelayer_copy_element(\''+selector+'\')" />'+
880 '<i class="fa fa-trash pagelayer-eoi" onclick="pagelayer_delete_element(\''+selector+'\')" />'+
881 '<i class="fa fa-pencil pagelayer-eoi" onclick="pagelayer_edit_element(\''+selector+'\', event)" />'+
882 '</div>';
883
884 }else if(tag == 'pl_col'){
885
886 overlay.addClass('pagelayer-col-hover');
887
888 html = '<div class="pagelayer-col-option" pagelayer-option-edit pagelayer-option-id="'+id+'">'+
889 '<i class="fa fa-columns pagelayer-eoi" onclick="pagelayer_edit_element(\''+selector+'\', event)" />'+
890 '</div>';
891
892 // Is it an empty col ?
893 pagelayer_empty_col(jEle.children('.pagelayer-col-holder'));
894
895 }else{
896
897 html = '<div class="pagelayer-ele-option" pagelayer-option-edit pagelayer-option-id="'+id+'">'+
898 '<i class="fa fa-clone pagelayer-eoi" onclick="pagelayer_copy_element(\''+selector+'\')" />'+
899 '<i class="fa fa-trash pagelayer-eoi" onclick="pagelayer_delete_element(\''+selector+'\')" />'+
900 '<i class="fa fa-pencil pagelayer-eoi" onclick="pagelayer_edit_element(\''+selector+'\', event)" />'+
901 '</div>';
902
903 }
904
905 // Append to the child
906 overlay.append(html);
907 jQuery('[pagelayer-option-id='+id+']').hide();
908
909 // Setup the HOVER events ABD create WRAPS IF we dont have a parent
910 if(pId.length > 0){
911 return;
912 }
913
914 // Make the wrap draggable, but only of independent or parent elements
915 wrap.attr('draggable', 'true');
916
917 wrap.hover(function(){
918
919 // Is there an element option shower ?
920 var opts = jQuery('[pagelayer-option-id='+id+']');
921
922 // Give the overlay the hover class
923 opts.parent().addClass('pagelayer-ele-hover');
924
925 // Show them
926 opts.show();
927
928 }, function(){
929
930 // Is there an element option shower ?
931 var opts = jQuery('[pagelayer-option-id='+id+']');
932
933 // Remove hover class
934 opts.parent().removeClass('pagelayer-ele-hover');
935
936 // Hide opts
937 opts.hide();
938
939 });
940
941 });
942 }
943
944 // Left Click
945 function pagelayer_left_click(){
946
947 jQuery('.entry-content').on('click', function(e){
948
949 e.preventDefault();// Added by Jivan in Actions / Revisions version
950
951 // Hide the context menu
952 jQuery('.pagelayer-right-click-options').hide();
953
954 // Target
955 var tEle = jQuery(e.target);
956
957 // If its an edit option click
958 if(tEle.hasClass('pagelayer-eoi')){
959 return false;
960 }
961
962 pagelayer_element_clicked(tEle.closest('.pagelayer-ele'), e);
963
964 return false;
965
966 });
967 };
968
969 // Right Click Menu
970 function pagelayer_right_click(){
971
972 var html = '<div class="pagelayer-right-click-options" style="display:none;">'+
973 '<ul>'+
974 '<li><a class="pagelayer-right-edit">Edit</a></li>'+
975 '<li><a class="pagelayer-right-duplicate">Duplicate</a></li>'+
976 '<li><a class="pagelayer-right-copy">Copy</a></li>'+
977 '<li><a class="pagelayer-right-paste">Paste</a></li>'+
978 '<li><a class="pagelayer-right-delete">Delete</a></li>'+
979 '</ul>'+
980 '</div>';
981
982 jQuery('body').append(html);
983
984 var $contextMenu = jQuery('.pagelayer-right-click-options');
985
986 jQuery('.entry-content').on('contextmenu', function(e){
987
988 var tEle = jQuery(e.target);
989 var jEle = tEle.closest('.pagelayer-ele-wrap').children('.pagelayer-ele');
990
991 // Get the parent
992 var pId = pagelayer_get_parent(jEle);
993
994 // If we found a parent
995 if(pId){
996 jEle = pagelayer_ele_by_id(pId);
997 }
998
999 // The basics
1000 var id = pagelayer_assign_id(jEle);
1001 var tag = pagelayer_tag(jEle);
1002
1003 $contextMenu.find('.pagelayer-right-edit').attr('onclick', 'pagelayer_edit_element("[pagelayer-id='+id+']")').html('Edit '+pagelayer_shortcodes[tag]['name']);
1004 $contextMenu.find('.pagelayer-right-duplicate').attr('onclick', 'pagelayer_copy_element("[pagelayer-id='+id+']")');
1005 $contextMenu.find('.pagelayer-right-copy').attr('onclick', 'pagelayer_copy_select("[pagelayer-id='+id+']")');
1006 $contextMenu.find('.pagelayer-right-paste').attr('onclick', 'pagelayer_paste_element("[pagelayer-id='+id+']")');
1007 $contextMenu.find('.pagelayer-right-delete').attr('onclick', 'pagelayer_delete_element("[pagelayer-id='+id+']")');
1008
1009 // Are we to hide the paste ?
1010 if(!pagelayer_empty(pagelayer.copy_selected) && pagelayer_can_copy_to(jEle)){
1011 //console.log(pagelayer_can_copy_to(jEle));
1012 $contextMenu.find('.pagelayer-right-paste').parent().show();
1013 }else{
1014 $contextMenu.find('.pagelayer-right-paste').parent().hide();
1015 }
1016
1017 $contextMenu.css({
1018 display: "block",
1019 left: e.pageX,
1020 top: e.pageY
1021 });
1022
1023 return false;
1024
1025 });
1026
1027 jQuery('html').on('click', function(e){
1028 $contextMenu.hide();
1029 });
1030 }
1031
1032 // Set the parent for the group
1033 function pagelayer_set_parent(jEle, id){
1034 jEle.attr('pagelayer-parent', id);
1035 };
1036
1037 // Set the parent for the group
1038 function pagelayer_get_parent(jEle){
1039 return jEle.attr('pagelayer-parent');
1040 };
1041
1042 // Sets the screen mode
1043 function pagelayer_set_screen_mode(mode){
1044 var modes = ['desktop', 'tablet', 'mobile'];
1045 var body = pagelayer.$$('.pagelayer-iframe-holder iframe');
1046 var current = '';
1047
1048 for(var x in modes){
1049
1050 if(body.hasClass('pagelayer-screen-'+modes[x]) && modes[x] != mode){
1051 current = modes[x];
1052 body.removeClass('pagelayer-screen-'+modes[x]);
1053 }
1054 }
1055
1056 // Add the class
1057 body.addClass('pagelayer-screen-'+mode);
1058
1059 // Add the class to the button
1060 pagelayer.$$('.pagelayer-mode-button').removeClass('fa-'+current).addClass('fa-'+mode);
1061
1062 // Trigger screen change if any
1063 pagelayer.$$('.pagelayer-elp-screen').trigger('pagelayer-screen-changed');
1064
1065 };
1066
1067 // Get the current screen mode
1068 function pagelayer_get_screen_mode(){
1069 var modes = ['desktop', 'tablet', 'mobile'];
1070 var body = pagelayer.$$('.pagelayer-iframe-holder iframe');
1071
1072 for(var x in modes){
1073 if(body.hasClass('pagelayer-screen-'+modes[x])){
1074 return modes[x];
1075 }
1076 }
1077 }
1078
1079 // Handle key press events
1080 jQuery(document).keydown(function(event){
1081 //alert(String.fromCharCode(event.which));
1082
1083 // Delete
1084 if(event.keyCode == 46){
1085 pagelayer_delete_element('[pagelayer-active]');
1086 }
1087
1088 // ctrl+z handle
1089 if(event.keyCode == 90 && event.ctrlKey){
1090 pagelayer_do_history('undo');
1091 }
1092
1093 // ctrl+y handle
1094 if(event.keyCode == 89 && event.ctrlKey){
1095 pagelayer_do_history('redo');
1096 }
1097
1098 // ctrl+c handle
1099 if(event.keyCode == 67 && event.ctrlKey){
1100
1101 // Check the active element
1102 if(pagelayer_active.el && pagelayer_active.el.id){
1103 pagelayer_copy_select("[pagelayer-id='"+pagelayer_active.el.id+"']");
1104 }
1105
1106 }
1107
1108 // ctrl+v handle
1109 if(event.keyCode == 86 && event.ctrlKey){
1110
1111 // Check the active element
1112 if(pagelayer_active.el && pagelayer_active.el.id){
1113
1114 var jEle = jQuery("[pagelayer-id='"+pagelayer_active.el.id+"']");
1115
1116 // Check if the any element is copied
1117 if(!pagelayer_empty(pagelayer.copy_selected) && pagelayer_can_copy_to(jEle)){
1118 pagelayer_paste_element("[pagelayer-id='"+pagelayer_active.el.id+"']");
1119 }
1120
1121 }
1122 }
1123 });
1124
1125 // Delete an element as per the selector
1126 function pagelayer_delete_element(selector){
1127 var jEle = jQuery(selector);
1128
1129 // Anything found ?
1130 if(jEle.length > 0){
1131
1132 var id = pagelayer_assign_id(jEle);
1133 var sc = pagelayer_tag(jEle);
1134
1135 // Is there a wrap
1136 var wrap = jQuery('[pagelayer-wrap-id="'+id+'"]');
1137
1138 var par = wrap.parent();
1139
1140 // Save this element in history action
1141 if(pagelayer.history_action){
1142 var cEle = pagelayer_near_by_ele(id, sc);
1143
1144 // To save in history, we need to save only element not the wraps as we call setup if we redo or undo
1145 jEle.find('style').remove();
1146 jEle.find('.pagelayer-ele-overlay').remove();
1147
1148 // Unwrap the wraps
1149 jEle.find('.pagelayer-ele').each(function (){
1150 var ele = jQuery(this);
1151 if(ele.parent().is('.pagelayer-ele-wrap')){
1152 ele.unwrap();
1153 }
1154 });
1155
1156 pagelayer_history_action_push({
1157 'title' : pagelayer_shortcodes[sc]['name'],
1158 'action' : 'Deleted',
1159 'pl_id' : id,
1160 'html' : jEle,
1161 'cEle' : cEle
1162 });
1163 }
1164
1165 wrap.remove();
1166
1167 pagelayer_empty_col(par);
1168
1169 if(pagelayer_active.el && pagelayer_active.el.id == id){
1170 pagelayer.$$('.pagelayer-elpd-close').click();
1171 }
1172
1173 }
1174
1175 pagelayer_isDirty = true;
1176 };
1177
1178 // Select an element
1179 function pagelayer_copy_select(selector){
1180 pagelayer.copy_selected = selector;
1181 }
1182
1183 function pagelayer_can_copy_to(to){
1184 var jEle = jQuery(pagelayer.copy_selected);
1185 var tEle = jQuery(to);
1186
1187 var eTag = pagelayer_tag(jEle);
1188 var tTag = pagelayer_tag(tEle);
1189 //console.log(eTag+' - '+tTag);
1190 // Final to
1191 var fTo;
1192
1193 // Selected element is a Row, can go only after a row
1194 if(eTag == 'pl_row'){
1195 fTo = tEle.closest('.pagelayer-ele.pagelayer-row');
1196 if(fTo.length != 1) return false;
1197 return fTo;
1198 }
1199
1200 // Selected element is a Column, can go only after a col
1201 if(eTag == 'pl_col'){
1202 fTo = tEle.closest('.pagelayer-ele.pagelayer-col');
1203 if(fTo.length != 1) return false;
1204 return fTo;
1205 }
1206
1207 // Is the TARGET a row or column when the selected item is a element
1208 if(tTag == 'pl_row' || tTag == 'pl_col'){
1209 return false;
1210 }
1211
1212 return tEle;
1213
1214 }
1215
1216 // Select an element
1217 function pagelayer_paste_element(to){
1218
1219 var fTo = pagelayer_can_copy_to(to);
1220
1221 // Is it a valid to
1222 if(!fTo){
1223 return false;
1224 }
1225
1226 pagelayer_copy_element(pagelayer.copy_selected, fTo);
1227 }
1228
1229 // Copy an element
1230 // Note : insertAfter should always be an pagelayer-ele
1231 function pagelayer_copy_element(selector, insertAfter){
1232 var src = jQuery(selector);
1233 var html = src[0].outerHTML;
1234 var tag = pagelayer_tag(src);
1235 insertAfter = insertAfter || src;
1236 insertAfter = insertAfter.parent();
1237
1238 var jEle = jQuery(html);
1239 jEle.removeAttr('pagelayer-id');
1240 jEle.find('[pagelayer-id]').removeAttr('pagelayer-id');
1241 jEle.find('[pagelayer-parent]').removeAttr('pagelayer-parent');// Remove the parent attribute as it will be reset during pagelayer_element_setup
1242 jEle.find('style').remove();
1243 jEle.find('.pagelayer-ele-overlay').remove();
1244
1245 // Unwrap the wraps
1246 jEle.find('.pagelayer-ele').each(function (){
1247 var ele = jQuery(this);
1248 if(ele.parent().is('.pagelayer-ele-wrap')){
1249 ele.unwrap();
1250 }
1251 });
1252
1253 // Give it an ID
1254 var id = pagelayer_assign_id(jEle);
1255
1256 jQuery(insertAfter).after(jEle);
1257
1258 pagelayer_element_setup('[pagelayer-id='+id+'], [pagelayer-id='+id+'] .pagelayer-ele', true);
1259
1260 // Save this element in history action
1261 if(pagelayer.history_action){
1262 var cEle = pagelayer_near_by_ele(id, tag);
1263 pagelayer_history_action_push({
1264 'title' : pagelayer_shortcodes[tag]['name'],
1265 'action' : 'Copied',
1266 'pl_id' : id,
1267 'html' : jEle,
1268 'cEle' : cEle
1269 });
1270 }
1271
1272 //If column then renumber columns
1273 if(tag == 'pl_col'){
1274 var row = src.parent().closest('.pagelayer-row');
1275 pagelayer_renumber_col(row);
1276 }
1277
1278 pagelayer_isDirty = true;
1279
1280 return id;
1281 };
1282
1283 // Language key
1284 function pagelayer_l(k){
1285 return k;
1286 }
1287
1288 // Set the given jELE as active
1289 function pagelayer_set_active(jEle){
1290
1291 // Make all other element as inactive
1292 jQuery('[pagelayer-active]').each(function(){
1293 var $j = jQuery(this);
1294 $j.removeAttr('pagelayer-active');
1295 });
1296
1297 jEle.attr('pagelayer-active', 1);
1298
1299 // Add and remove the class
1300 jQuery('.pagelayer-active').removeClass('pagelayer-active');
1301
1302 jEle.parent().children('.pagelayer-ele-overlay').addClass('pagelayer-active');
1303
1304 }
1305
1306 function pagelayer_sc(sc){
1307 return sc.replace('pl_', '');
1308 };
1309
1310 // Create a HTML dom element of the Short code
1311 // Return the jEle
1312 function pagelayer_create_sc(sc){
1313
1314 var html;
1315 var _sc = pagelayer_sc(sc);
1316 var func = window['pagelayer_sc_'+sc];
1317
1318 // Generate the HTML
1319 if(typeof func == 'function'){
1320 html = window['pagelayer_sc_'+sc]();
1321 }else{
1322 html = '<div '+pagelayer_sc_atts('pagelayer-'+_sc)+'></div>';
1323 }
1324
1325 html = jQuery(html);
1326
1327 // Add the tag
1328 html.attr('pagelayer-tag', sc);
1329
1330 // Give it an ID
1331 id = pagelayer_assign_id(html);
1332
1333 // Try to set the default values over 5 loops
1334 pagelayer_set_default_atts(html, 5);
1335
1336 return html;
1337
1338 };
1339
1340 // Returns a list of default attributes to set as per the current selection
1341 function pagelayer_set_default_atts(jEle, set){
1342
1343 set = set || 0;
1344 var hasSet = false;
1345
1346 for(var i = 1; i <= set;i++){
1347
1348 //console.log('[pagelayer_set_default_atts] Loop :'+i);
1349 //console.log(jEle);
1350
1351 // Get existing data
1352 var el = pagelayer_data(jEle, true);
1353
1354 // If it is the last loop and we are greater than 1
1355 if(i > 1 && i == set){
1356 console.log('[pagelayer_default_atts] Still vars to set. Please check your shortcode params !');
1357 }
1358
1359 // We are supposed to set !
1360 if('set' in el && !pagelayer_empty(el.set)){
1361 pagelayer_set_atts(jEle, el.set);
1362 hasSet = true;
1363 }else{
1364 break;
1365 }
1366 }
1367
1368 return hasSet;
1369 }
1370
1371 // Returns the tag
1372 function pagelayer_tag(jEle){
1373
1374 // It could be the wrap
1375 if(jEle.hasClass('pagelayer-ele-wrap')){
1376 return jEle.children('.pagelayer-ele').attr('pagelayer-tag');
1377 }
1378
1379 // It could be the row or col holder
1380 if(jEle.hasClass('pagelayer-row-holder') || jEle.hasClass('pagelayer-col-holder')){
1381 return jEle.parent().attr('pagelayer-tag');
1382 }
1383
1384 return jEle.attr('pagelayer-tag');
1385 }
1386
1387 // Gets a single attribute value
1388 function pagelayer_get_att(jEle, att){
1389 return jEle.attr('pagelayer-a-'+att);
1390 };
1391
1392 // Gets a single attribute value
1393 function pagelayer_get_tmp_att(jEle, att){
1394 return jEle.attr('pagelayer-tmp-'+att);
1395 };
1396
1397 // This function will just set atts and not do anything else
1398 // Atts can be string or object. If its string, then val is needed
1399 function pagelayer_set_atts(jEle, atts, val){
1400
1401 if(typeof atts == 'string'){
1402 var tmp = {};
1403 tmp[atts] = val;
1404 atts = tmp;
1405 }
1406
1407 if(typeof atts != 'object'){
1408 return false;
1409 }
1410
1411 var tag = pagelayer_tag(jEle);
1412 var trigger_onchange = 0;
1413
1414 if(pagelayer_empty(tag)){
1415 console.log('Set atts found no tag');
1416 console.log(jEle);
1417 return;
1418 }
1419
1420 // All props
1421 var all_props = pagelayer_shortcodes[tag];//console.log(tag);console.log(jEle);
1422 var trigger_props = {};
1423 var no_val = {};
1424 var defaults = {};
1425
1426 // Loop through all props
1427 for(var i in pagelayer_tabs){
1428
1429 var tab = pagelayer_tabs[i];
1430
1431 for(var section in all_props[tab]){
1432
1433 var props = section in pagelayer_shortcodes[tag] ? pagelayer_shortcodes[tag][section] : pagelayer_styles[section];
1434
1435 for(var x in props){
1436
1437 if('default' in props[x]){
1438 defaults[x] = 1;
1439 }
1440
1441 // Dont set any val, but we set temp value
1442 if('no_val' in props[x]){
1443 no_val[x] = 1;
1444 }
1445
1446 if('req' in props[x] || 'show' in props[x]){
1447 var show = 'req' in props[x] ? props[x]['req'] : props[x]['show'];
1448 for(var showParam in show){
1449 var val = show[showParam];
1450 var except = showParam.substr(0, 1) == '!' ? true : false;
1451 showParam = except ? showParam.substr(1) : showParam;
1452 trigger_props[showParam] = 1;
1453 }
1454
1455 }
1456
1457 }
1458
1459 }
1460
1461 }
1462
1463 for(var x in atts){
1464
1465 // Are we to trigger change
1466 if(x in trigger_props){
1467 trigger_onchange = 1;
1468 }
1469
1470 //console.log(x+'-'+atts[x]);
1471
1472 if(x in no_val){
1473 pagelayer_set_tmp_atts(jEle, x, atts[x]);
1474 continue;
1475 }
1476
1477 // Record History
1478 if(pagelayer.history_action){
1479 var attr_label = '';
1480 for(var section in all_props){
1481 for(var props in all_props[section]){
1482 if(props == x){
1483 attr_label = all_props[section][props]['label'];
1484 }
1485 }
1486
1487 }
1488
1489 var old_val = pagelayer_get_att(jEle, x) || '';
1490 pagelayer_history_action_push({
1491 'title' : all_props['name'],
1492 'subTitle' : attr_label,
1493 'action' : 'Edited',
1494 'attrType' : 'a_attr',
1495 'pl_id' : pagelayer_id(jEle),
1496 'atts' : x,
1497 'oldVal' : old_val,
1498 'newVal' : atts[x]
1499 });
1500 }
1501
1502 // Remove the attribute if its BLANK and there is no default for it
1503 // If there is a default, we set it to blank to keep record of the current val
1504 if(atts[x].length < 1){
1505
1506 // Dont remove the value as there is a default
1507 if(!(x in defaults)){
1508 jEle.removeAttr('pagelayer-a-'+x);
1509 // Otherwise blank it
1510 }else{
1511 jEle.attr('pagelayer-a-'+x, atts[x]);
1512 }
1513
1514 // Remove the tmp atts anyway
1515 var to_del = new Array();
1516 var regexp = new RegExp('pagelayer\-tmp\-'+x, 'gi');
1517
1518 jQuery.each(jEle[0].attributes, function(index, att){
1519 if(!att) return;
1520 if(att.name.match(regexp)){
1521 to_del.push(att.name);
1522 }
1523 });
1524
1525 //console.log(to_del);
1526 for(var n in to_del){
1527 jEle.removeAttr(to_del[n]);
1528 }
1529
1530 // Set the value
1531 }else{
1532 jEle.attr('pagelayer-a-'+x, atts[x]);
1533 }
1534
1535 // Are you the active element
1536 if(pagelayer_is_active(jEle)){
1537
1538 // TODO : Record Undo and Redo
1539
1540 }
1541
1542 }
1543
1544 // Trigger the change of the parameter and show the required properties
1545 if(trigger_onchange){
1546 pagelayer_elpd_show_rows();
1547 }
1548
1549 pagelayer_isDirty = true;
1550 };
1551
1552 // This function will just set atts and not do anything else
1553 // Atts can be string or object. If its string, then val is needed
1554 function pagelayer_set_tmp_atts(jEle, atts, val){
1555
1556 if(typeof atts == 'string'){
1557 var tmp = {};
1558 tmp[atts] = val;
1559 atts = tmp;
1560 }
1561
1562 if(typeof atts != 'object'){
1563 return false;
1564 }
1565
1566 for(var x in atts){
1567
1568 // Record history
1569 if(pagelayer.history_action){
1570
1571 var old_val = pagelayer_get_tmp_att(jEle, x) || '';
1572 pagelayer_history_action_push({
1573 'title' : pagelayer_shortcodes[pagelayer_tag(jEle)]['name'],
1574 'subTitle' : x,
1575 'action' : 'Edited',
1576 'attrType' : 'tmp_attr',
1577 'pl_id' : pagelayer_id(jEle),
1578 'atts' : x,
1579 'oldVal' : old_val,
1580 'newVal' : atts[x]
1581 });
1582
1583 }
1584
1585 jEle.attr('pagelayer-tmp-'+x, atts[x]);
1586 }
1587
1588 };
1589
1590 // Set the att and classes of an HTML which is not yet created
1591 function pagelayer_sc_atts(classes, atts){
1592
1593 if(typeof atts != 'object'){
1594 atts = new Object();
1595 }
1596
1597 var r = new Array();
1598
1599 for(var x in atts){
1600 r.push('pagelayer-a-'+x+'="'+atts[x]+'"');
1601 }
1602
1603 return 'class="'+classes+' pagelayer-ele" '+r.join(' ');
1604 }
1605
1606 // Is the jEle the active element ?
1607 function pagelayer_is_active(jEle){
1608
1609 // Is this the active Element ?
1610 if(pagelayer_empty(pagelayer_active.el) || jEle.attr('pagelayer-id') != pagelayer_active.el.id){
1611 return false;
1612 }
1613
1614 return true;
1615
1616 };
1617
1618 // Removes {{}} from the variable name
1619 function pagelayer_var(val){
1620 return val.substring(2, (val.length - 2));
1621 }
1622
1623 // Take care of the CSS
1624 function pagelayer_css_render(css, val, seperator){
1625 //console.log('CSS '+css+' | '+val);
1626
1627 // Seperator
1628 seperator = seperator || ',';
1629
1630 // Replace the val
1631 css = css.split('{{val}}').join(val);
1632
1633 // If there is an array
1634 if(css.match(/val\[\d/)){
1635 val = val.split(seperator);
1636 for(var i in val){
1637 css = css.split('{{val['+i+']}}').join(val[i]);
1638 }
1639 }
1640
1641 //console.log('Final CSS '+css);
1642
1643 return css;
1644
1645 };
1646
1647 // Replace the variables
1648 function pagelayer_parse_vars(str, el){
1649
1650 for(var x in el.tmp){
1651 str = str.split('{{{'+x+'}}}').join(el.tmp[x]);
1652 }
1653
1654 for(var x in el.atts){
1655 str = str.split('{{'+x+'}}').join(el.atts[x]);
1656 }
1657
1658 return str;
1659 };
1660
1661 // Render the Element
1662 function pagelayer_sc_render(jEle){
1663
1664 // We render only the active element
1665 if(!pagelayer_is_active(jEle)){
1666 //return false;
1667 }
1668
1669 // Handle the CSS part
1670 // Get the id, tag, atts, data, etc
1671 var el = pagelayer_data(jEle, true);
1672 var all_props = pagelayer_shortcodes[el.tag];
1673 var elCSS = {
1674 classes: [],
1675 remove_classes: [],
1676 attr: [],
1677 remove_attr: [],
1678 css: [],
1679 edit: [],
1680 sel: '[pagelayer-id="'+el.id+'"]'
1681 };
1682
1683 // Create a reference
1684 el.CSS = elCSS;
1685
1686 //console.log(el.atts);
1687
1688 for(var i in pagelayer_tabs){
1689 var tab = pagelayer_tabs[i];
1690 for(var section in all_props[tab]){ //console.log(tab+' '+section);
1691
1692 var props = section in pagelayer_shortcodes[el.tag] ? pagelayer_shortcodes[el.tag][section] : pagelayer_styles[section];//console.log(props);
1693
1694 // Loop the props
1695 for(var x in props){
1696
1697 // pagelayer_data will return attributes even if they are BLANK e.g. attr=""
1698 // Render doesnt consider BLANK values as values, and we are unsetting them now
1699 // If in any situation you need to consider blank values, please handle in the JS / PHP function of the Shortcode
1700 if(x in el.atts && el.atts[x].length < 1){
1701 delete el.atts[x];
1702 }
1703
1704 // Any editor ?
1705 if('edit' in props[x]){
1706 elCSS.edit.push({prop: x, sel: props[x]['edit']});
1707 }
1708
1709 // Do we have a addClass ?
1710 // We are checking before the element has a value so that we can add or remove the class
1711 if('addClass' in props[x]){
1712
1713 var addClasses;
1714
1715 // Convert the string to an array
1716 if(typeof props[x]['addClass'] === 'string'){
1717 addClasses = [props[x]['addClass']];
1718 }else{
1719 addClasses = props[x]['addClass'];
1720 }
1721
1722 for(var c in addClasses){
1723
1724 // The selector
1725 var tSel = jQuery.isNumeric(c) ? '' : c;
1726
1727 // If there is a VAL
1728 // NOTE : Only val is allowed when there is a list
1729 if(addClasses[c].match(/\{\{val\}\}/) && 'list' in props[x]){
1730
1731 for(var l in props[x]['list']){
1732
1733 var tmp = {'sel': tSel, 'val': addClasses[c].replace('{{val}}', l)};
1734
1735 if(el.atts[x] == l){
1736 elCSS['classes'].push(tmp);
1737 }else{
1738 elCSS['remove_classes'].push(tmp);
1739 }
1740
1741 }
1742
1743 }else{
1744
1745 var tmp = {'sel': tSel, 'val': addClasses[c]};
1746
1747 // If the value is there
1748 if(x in el.atts){
1749 elCSS['classes'].push(tmp);
1750 }else{
1751 elCSS['remove_classes'].push(tmp);
1752 }
1753
1754 }
1755 }
1756 }
1757
1758 // Do we have a addAttr ?
1759 // We are checking before the element has a value so that we can add or remove the attr
1760 if('addAttr' in props[x]){
1761
1762 var addAttr;
1763
1764 // Convert the string to an array
1765 if(typeof props[x]['addAttr'] === 'string'){
1766 addAttr = [props[x]['addAttr']];
1767 }else{
1768 addAttr = props[x]['addAttr'];
1769 }
1770
1771 for(var c in addAttr){
1772
1773 // The selector
1774 var tSel = jQuery.isNumeric(c) ? '' : c;
1775 var tmp = {'sel': tSel, 'val': addAttr[c]};
1776
1777 // If the value is there
1778 if(x in el.atts){
1779 elCSS['attr'].push(tmp);
1780 }else{
1781 elCSS['remove_attr'].push(tmp);
1782 }
1783 }
1784 }
1785
1786 // Do we have a CSS ?
1787 if('css' in props[x]){
1788
1789 var css;
1790
1791 // Convert the string to an array
1792 if(typeof props[x]['css'] === 'string'){
1793 css = [props[x]['css']];
1794 }else{
1795 css = props[x]['css'];
1796 }
1797
1798 // Screen modes
1799 var modes = {desktop: '', tablet: '_tablet', mobile: '_mobile'};
1800
1801 for(var m in modes){
1802
1803 var xm = x+modes[m];
1804
1805 // If the value is there
1806 if(!(xm in el.atts)){
1807 continue;
1808 }
1809
1810 for(var c in css){
1811
1812 // The selector
1813 var tSel = jQuery.isNumeric(c) ? '{{element}}' : c;
1814 var tmp = {
1815 sel: tSel,
1816 val: pagelayer_css_render(css[c], el.atts[xm], (props[x].sep || ',')),
1817 };
1818
1819 // Is this a tablet
1820 if(m == 'tablet'){
1821 tmp.sel = '@media (max-width: 768px) and (min-width: 361px){'+tmp.sel;
1822 tmp.val = tmp.val+'}';
1823 }
1824
1825 // Is this a mobile mode ?
1826 if(m == 'mobile'){
1827 tmp.sel = '@media (max-width: 360px){'+tmp.sel;
1828 tmp.val = tmp.val+'}';
1829 }
1830
1831 // Push to store
1832 elCSS.css.push(tmp);
1833 }
1834
1835 }
1836
1837 }
1838
1839 }
1840
1841 }
1842
1843 }
1844
1845 // If there is an HTML, then process it
1846 if('html' in pagelayer_shortcodes[el.tag]){
1847
1848 el.iHTML = jQuery('<div>'+pagelayer_shortcodes[el.tag]['html']+'</div>');
1849
1850 // Lets process the 'if-ext'
1851 el.iHTML.find('[if-ext]').each(function (){
1852 var $j = jQuery(this);
1853 var reqvar = pagelayer_var($j.attr('if-ext'));
1854 $j.removeAttr('if-ext');
1855
1856 // Is the element there ?
1857 if(!(reqvar in el.atts && !pagelayer_empty(el.atts[reqvar]))){
1858 //console.log('HERE');
1859 $j[0].outerHTML = $j.html();
1860 }
1861
1862 });
1863
1864 // Lets process the 'if'
1865 el.iHTML.find('[if]').each(function (){
1866 var $j = jQuery(this);
1867 var reqvar = pagelayer_var($j.attr('if'));
1868 $j.removeAttr('if');
1869
1870 // Is the element there ?
1871 if(!(reqvar in el.atts && !pagelayer_empty(el.atts[reqvar]))){
1872 //console.log('HERE');
1873 $j.remove();
1874 }
1875
1876 });
1877
1878 // Is there a function to render ?
1879 var fn = window['pagelayer_render_'+jEle.attr('pagelayer-tag')];
1880
1881 if(typeof fn == 'function'){
1882 fn(el);
1883 }
1884
1885 //console.log(el.atts);
1886
1887 // Parse the variables
1888 var new_html = pagelayer_parse_vars(el.iHTML.html(), el);
1889 el.iHTML.html(new_html);
1890
1891 // Do we have to wrap the innerHTML ?
1892 if('holder' in pagelayer_shortcodes[el.tag]){
1893
1894 var hSel = pagelayer_shortcodes[el.tag]['holder'];
1895 var holder = jEle.find(hSel).first();
1896
1897 // Detach the holder
1898 holder.detach();
1899
1900 // Add the new HTML
1901 el.$.html(el.iHTML.html());
1902
1903 // reAttach the children only
1904 el.$.find(hSel).html(holder.children());
1905
1906 // No holder
1907 }else{
1908
1909 //console.log(el.iHTML.html());
1910 el.$.html(el.iHTML.html());
1911
1912 }
1913
1914 // Rows, Cols and Groups
1915 }else{
1916
1917 // Is there a function to render ?
1918 var fn = window['pagelayer_sc_render_'+jEle.attr('pagelayer-tag')];
1919
1920 if(typeof fn == 'function'){
1921 fn(el);
1922 }
1923
1924 }
1925
1926 // Is there a function to render after HTML insertion but before CSS and attr ?
1927 var post = window['pagelayer_render_html_'+jEle.attr('pagelayer-tag')];
1928
1929 if(typeof post == 'function'){
1930 post(el);
1931 }
1932
1933 ////////////////////////////
1934 // Are there any edit fields ?
1935 ////////////////////////////
1936
1937 if(elCSS.edit.length > 0){
1938
1939 for(var c in elCSS.edit){
1940 var prop = elCSS.edit[c]['prop'];
1941 var tSel = elCSS.edit[c]['sel'];
1942 var node = tSel.length < 1 ? jEle : jEle.find(tSel);
1943 node.attr('pagelayer-editable', prop);
1944 }
1945
1946 }
1947
1948 ////////////////////////////
1949 // Are there any addClass ?
1950 ////////////////////////////
1951
1952 // If we have any classes to add
1953 if(elCSS.classes.length > 0){
1954 //console.log(elCSS.classes);
1955
1956 for(var c in elCSS.classes){
1957 var tSel = elCSS.classes[c]['sel'];
1958 var node = tSel.length < 1 ? jEle : jEle.find(tSel);
1959 if(!node.hasClass(elCSS.classes[c]['val'])){
1960 node.addClass(elCSS.classes[c]['val']);
1961 }
1962 }
1963 }
1964
1965 // If we have any classes to remove
1966 if(elCSS.remove_classes.length > 0){
1967 //console.log(elCSS.remove_classes);
1968
1969 for(var c in elCSS.remove_classes){
1970 var tSel = elCSS.remove_classes[c]['sel'];
1971 var node = tSel.length < 1 ? jEle : jEle.find(tSel);
1972 if(node.hasClass(elCSS.remove_classes[c]['val'])){
1973 node.removeClass(elCSS.remove_classes[c]['val']);
1974 }
1975 }
1976 }
1977
1978 ////////////////////////////
1979 // Are there any addAttr ?
1980 ////////////////////////////
1981
1982 // If we have any attributes to add
1983 if(elCSS.attr.length > 0){
1984 //console.log(elCSS.attr);
1985
1986 for(var c in elCSS.attr){
1987 var tSel = elCSS.attr[c]['sel'].replace('{{element}}', '');
1988 var node = tSel.length < 1 ? jEle : jEle.find(tSel);
1989 var att = elCSS.attr[c]['val'].split('=');
1990 att[1] = pagelayer_parse_vars(att[1], el);
1991 att[1] = pagelayer_trim(att[1], '"');
1992
1993 // Is it the same val ?
1994 if(!node.attr(att[0]) != att[1]){
1995 node.attr(att[0], att[1]);
1996 }
1997 }
1998 }
1999
2000 // If we have any attributes to add
2001 if(elCSS.remove_attr.length > 0){
2002 //console.log(elCSS.remove_attr);
2003
2004 for(var c in elCSS.remove_attr){
2005 var tSel = elCSS.remove_attr[c]['sel'].replace('{{element}}', '');
2006 var node = tSel.length < 1 ? jEle : jEle.find(tSel);
2007 var att = elCSS.remove_attr[c]['val'].split('=');
2008
2009 if(node.is('['+att[0]+']')){
2010 node.removeAttr(att[0]);
2011 }
2012 }
2013 }
2014
2015 // The style element
2016 var style = pagelayer.$('[pagelayer-style-id='+el.id+']');
2017
2018 // If we have any RULES CSS, then handle it
2019 if(elCSS.css.length > 0){
2020
2021 // Did we find it ?
2022 if(style.length < 1){
2023 jEle.prepend('<style pagelayer-style-id="'+el.id+'"></style>');
2024 }
2025
2026 // Get it again
2027 style = pagelayer.$('[pagelayer-style-id='+el.id+']');
2028
2029 // Make the rules
2030 var rules = [];
2031
2032 // Loop
2033 for(var c in elCSS.css){
2034 var tSel = elCSS.css[c]['sel'].replace('{{element}}', elCSS.sel);
2035 var rule = pagelayer_parse_vars(elCSS.css[c]['val'], el);
2036 rules.push(tSel+'{'+rule+'}');
2037 }
2038
2039 // Set the style
2040 style.html(rules.join("\n"));
2041 //console.log(style);
2042 }else{
2043 style.remove();
2044 }
2045
2046 // Is there a function to render at the end ?
2047 var end = window['pagelayer_render_end_'+jEle.attr('pagelayer-tag')];
2048
2049 if(typeof end == 'function'){
2050 end(el);
2051 }
2052
2053 // If the element have any parent
2054 var par = pagelayer_get_parent(jEle);
2055 if(par){
2056 pagelayer_sc_render(pagelayer_ele_by_id(par));
2057 }
2058
2059 };
2060
2061 // Is the given tag a group
2062 function pagelayer_is_group(tag){
2063
2064 if('has_group' in pagelayer_shortcodes[tag] && !pagelayer_empty(pagelayer_shortcodes[tag]['has_group'])){
2065 return true;
2066 }
2067
2068 return false;
2069
2070 }
2071
2072 // Save the post
2073 function pagelayer_save(){
2074
2075 var post = pagelayer_generate_sc(".entry-content");//alert(post);return;
2076 var pagelayerajaxurl = pagelayer_ajax_url+'&action=pagelayer_save_content&postID='+pagelayer_postID;
2077 jQuery.ajax({
2078 type: "POST",
2079 url: pagelayerajaxurl,
2080 data: {
2081 pagelayer_update_content : post,
2082 nonce: pagelayer_ajax_nonce
2083 },
2084 success: function(response, status, xhr){
2085 //alert(data);
2086 var obj = jQuery.parseJSON(response);
2087 //alert(obj);
2088 if(obj['error']){
2089 alert(obj['error']);
2090 }else{
2091 pagelayer_isDirty = false;
2092 alert(obj['success']);
2093 pagelayer_get_revision();
2094 }
2095 },
2096 error: function(errorThrown){
2097 console.log(errorThrown);
2098 }
2099 });
2100
2101 };
2102
2103 //Close the Editor
2104 function pagelayer_close(){
2105 if(pagelayer_isDirty == true){
2106 var r = confirm('Your Data has not been Saved yet! \n Press OK to stay on the Page.'+
2107 '\n Press Cancel to Close Editor. ');
2108 if(r == false){
2109 window.top.location.href = pagelayer_returnURL;
2110 }
2111 }else{
2112 window.top.location.href = pagelayer_returnURL;
2113 }
2114 };
2115
2116 // Generate Shortcode Post to save
2117 function pagelayer_generate_sc(selector){
2118
2119 var txt = '';
2120
2121 jQuery(selector).children(".pagelayer-ele-wrap").each(function(){
2122
2123 var jEle = jQuery(this).children('.pagelayer-ele');
2124
2125 // The ID
2126 var id = jEle.attr('pagelayer-id');
2127
2128 // If there is an Add element wrapper
2129 if(pagelayer_empty(id)){
2130 return;
2131 }
2132
2133 // Find the type of tag
2134 var tag = jEle.attr('pagelayer-tag');
2135 var final_tag = tag;
2136
2137 // Define inner row and inner column
2138 if(tag == 'pl_row' && jQuery(this).closest('.pagelayer-col-holder').length > 0){
2139 final_tag = 'pl_inner_row';
2140 }
2141 if(tag == 'pl_col' && jQuery(this).closest('.pagelayer-col-holder').length > 0){
2142 final_tag = 'pl_inner_col';
2143 }
2144 //console.log(tag);
2145
2146 // Is there an innerHTML ele
2147 var inner = '';
2148 if('innerHTML' in pagelayer_shortcodes[tag]){
2149 inner = pagelayer_shortcodes[tag]['innerHTML'];
2150 }
2151
2152 // Create the tag
2153 var data = '['+final_tag;
2154
2155 // Get the attributes to store
2156 jQuery.each(jEle[0].attributes, function(i, attrib){
2157 var res = attrib.name.match(/^pagelayer-a-(.+)/i);
2158 if(res && res[1] != inner){
2159 //console.log(attrib.name+' '+res[1]);
2160 data += ' '+res[1]+'="'+pagelayer_escapeHTML(attrib.value)+'"';
2161 }
2162 });
2163
2164 data = data+']';
2165
2166 // Add to the text
2167 txt = txt+data+"\n";
2168
2169 // Any internal function to handle the save ?
2170 var func = window['pagelayer_tag_'+tag];
2171 if(typeof func == 'function'){
2172
2173 var content = '';
2174 content = func(jEle);
2175
2176 if(content.length > 0){
2177 txt = txt+content;
2178 }
2179
2180 // If its a Row or Column or Group then it will have children
2181 }else if(jEle.hasClass('pagelayer-row') || jEle.hasClass('pagelayer-col') || jEle.hasClass('pagelayer-inner_row') || pagelayer_is_group(tag)){
2182
2183 var sel = "[pagelayer-id="+id+"]";
2184
2185 // Any holder which holds children ?
2186 if('holder' in pagelayer_shortcodes[tag]){
2187 sel = sel+' '+pagelayer_shortcodes[tag]['holder'];
2188 }
2189
2190 var childrens = pagelayer_generate_sc(jQuery(sel).first());
2191 if(childrens.length > 0){
2192 txt = txt+childrens;
2193 }
2194
2195 // Its a normal element so we might need to handle the content
2196 }else{
2197
2198 var content = '';
2199 if(inner.length > 0){
2200 content = jEle.attr('pagelayer-a-'+inner);
2201 if(!content){
2202 content = '';
2203 }
2204 }else{
2205 content = '';//jEle.html();
2206 }
2207
2208 if(content.length > 0){
2209 txt = txt+content;
2210 }
2211
2212 }
2213
2214 // Close the tag
2215 txt = txt+"[/"+final_tag+"]\n";
2216
2217 });
2218
2219 return txt;
2220
2221 };
2222
2223 // Escape charaters in attributes
2224 var pagelayer_escapeChars = {
2225 '\\]' : '#93',
2226 '\\[' : '#91',
2227 //'=' : '#61',
2228 '<' : 'lt',
2229 '>' : 'gt',
2230 '"' : 'quot',
2231 //'&' : 'amp',
2232 '\'' : '#39'
2233 };
2234
2235 // To unescape
2236 var pagelayer_unescapeChars = {
2237 '#93' : ']',
2238 '#91' : '[',
2239 //'#61' : '=',
2240 'lt' : '<',
2241 'gt' : '>',
2242 'quot' : '"',
2243 //'amp' : '&',
2244 '#39' : '\''
2245 };
2246
2247 var pagelayer_escaperegex_S = '[';
2248 for(var key in pagelayer_escapeChars) {
2249 pagelayer_escaperegex_S += key;
2250 }
2251 pagelayer_escaperegex_S += ']';
2252
2253 var pagelayer_escaperegex = new RegExp( pagelayer_escaperegex_S, 'g');
2254
2255 // The function which escapes everything
2256 function pagelayer_escapeHTML(str) {
2257 return str.replace(pagelayer_escaperegex, function(m) {
2258 if(m == '[' || m == ']') m = '\\'+m;
2259 return '&' + pagelayer_escapeChars[m] + ';';
2260 });
2261 };
2262
2263 // This will unescape everything
2264 function pagelayer_unescapeHTML(str){
2265 return str.replace(/\&([^;]+);/g, function (entity, entityCode) {
2266 if(entityCode in pagelayer_unescapeChars){
2267 return pagelayer_unescapeChars[entityCode];
2268 }else{
2269 return entity;
2270 }
2271 });
2272 };
2273
2274 // Sets up the leftbar
2275 function pagelayer_leftbar(){
2276
2277 // Toggle the holder
2278 pagelayer.$$('.pagelayer-leftbar-toggle').on('click', function(){
2279 pagelayer.$$('.pagelayer-leftbar-table').toggle();
2280 });
2281
2282 var html = '<div class="pagelayer-leftbar">'+
2283 '<div class="pagelayer-leftbar-scroll">'+
2284 '<div class="pagelayer-shortcodes">'+
2285 '<div class="pagelayer-leftbar-search">'+
2286 '<input class="pagelayer-search-field" />'+
2287 '</div>';
2288
2289 for(var x in pagelayer_groups){
2290
2291 // Title
2292 html += '<div class="pagelayer-leftbar-group"><h5>'+x+'</h5>';
2293
2294 // Indivdual icon
2295 for(var y in pagelayer_groups[x]){
2296
2297 var sc = pagelayer_groups[x][y];
2298
2299 if('not_visible' in pagelayer_shortcodes[sc]){
2300 continue;
2301 }
2302
2303 html += '<div class="pagelayer-shortcode-drag" draggable="true" pagelayer-tag="'+sc+'">'+
2304 '<div class="pagelayer-sc">'+
2305 '<center class="pagelayer-shortcode-inner">';
2306
2307 if('icon' in pagelayer_shortcodes[sc]){
2308 html += '<i class="pagelayer-shortcode fa fa-'+pagelayer_shortcodes[sc]['icon']+'"></i>';
2309 }else{
2310 html += '<i class="pagelayer-shortcode pagelayer-'+sc+'"></i>';
2311 }
2312
2313 html += '</center>'+
2314 '<span class="pagelayer-shortcode-text">'+pagelayer_shortcodes[sc]['name']+'</span>'+
2315 '</div>'+
2316 '</div>';
2317
2318 }
2319
2320 html += '</div>';
2321
2322 }
2323
2324 html += '</div>'+
2325 '<div id="pagelayer-elpd" class="pagelayer-elpd"></div>'+
2326 '<div id="pagelayer-history" class="pagelayer-history"></div>'+
2327 '</div>'+
2328 '</div>';
2329
2330 pagelayer.$$('.pagelayer-leftbar-holder').prepend(html);
2331
2332 pagelayer.$$('.pagelayer-leftbar-scroll').slimScroll({
2333 height: '100%',
2334 railVisible: false,
2335 alwaysVisible: true,
2336 color: '#000',
2337 size: '5px',
2338 });
2339
2340 // Hide the ones which are not supposed to be shown
2341 pagelayer.$$('.pagelayer-search-field').on('input', function(){
2342
2343 var val = jQuery(this).val();
2344 var re = new RegExp(val, 'i');
2345
2346 // Show only the required tags
2347 pagelayer.$$('.pagelayer-leftbar-group').each(function(){
2348
2349 var group = jQuery(this);
2350 var res = group.find('[pagelayer-tag]');
2351 var hidden = 0;
2352
2353 res.each(function(){
2354
2355 var tEle = jQuery(this);
2356 if(tEle.find('.pagelayer-shortcode-text').html().match(re)){
2357 tEle.show();
2358 }else{
2359 hidden += 1;
2360 tEle.hide();
2361 }
2362
2363 });
2364
2365 // Hide the whole group
2366 if(hidden == res.length){
2367 group.hide();
2368 }else{
2369 group.show();
2370 }
2371
2372 });
2373 });
2374
2375 };
2376
2377 // Get the closest element and method
2378 function pagelayer_near_by_ele(id, sc){
2379
2380 // Get the previous element of the id element
2381 var prevEle_id = jQuery('[pagelayer-wrap-id="'+id+'"]').prev().attr('pagelayer-wrap-id') || '';
2382 var method, cEle, args = {};
2383
2384 if(prevEle_id.length > 0){
2385
2386 // If have previous element of the id element
2387 // Set the method and previous element selector
2388 args = {'method' : 'after', 'cEle' : '[pagelayer-wrap-id="'+prevEle_id+'"]'};
2389
2390 }else{
2391
2392 // If don't have previous element of the id element then get parent element
2393 if(sc == "pl_row"){
2394 args = {'method' : 'prepend', 'cEle' : '.entry-content'};
2395 }else{
2396
2397 // Get the parent element
2398 var pEle_id = pagelayer_id(jQuery('[pagelayer-wrap-id="'+id+'"]').closest('.pagelayer-ele'));
2399
2400 // Get the parent element tag
2401 var pEle_tag = pagelayer_tag(jQuery('[pagelayer-id="'+pEle_id+'"]'));
2402 var holder = pagelayer_shortcodes[pEle_tag]['holder'] || '';
2403 args = {'method' : 'prepend', 'cEle' : '[pagelayer-id="'+pEle_id+'"] '+ holder+' '};
2404
2405 }
2406
2407 }
2408
2409 return args;
2410
2411 };
2412
2413 // Push the action data in the pagelayer_history_obj object
2414 function pagelayer_history_action_push(args){
2415
2416 var history_obj_len = pagelayer_history_obj['action_data'].length;
2417
2418 // If the history_obj_len is less then 1 then set the data in array 0 position
2419 if(history_obj_len < 1){
2420 pagelayer_history_obj['action_data'][0] = {'title' : 'Start Editing', 'action' : 'Start' };
2421 pagelayer_history_obj['current_active_item_id'] = 0;
2422 }
2423
2424 // Remove the second array element if the history_obj_len greater then 100
2425 if(history_obj_len > 100){
2426 pagelayer_history_obj['action_data'].splice(1, 1);
2427 }
2428
2429 // Get current active history action id
2430 var action_id = parseInt(pagelayer_history_obj['current_active_item_id']) || '';
2431
2432 // Remove the all array element after the active array element
2433 var del_ele = history_obj_len - action_id - 1;
2434 pagelayer_history_obj['action_data'].splice(action_id + 1, del_ele);
2435
2436 // Check if the same attr set as current active history
2437 if(args.action == "Edited" && history_obj_len > 1){
2438 var atts = pagelayer_history_obj['action_data'][action_id] || '';
2439 if(atts['atts'] == args['atts']){
2440 args['oldVal'] = atts['oldVal'];
2441 pagelayer_history_obj['action_data'][action_id] = args;
2442 pagelayer_history_setup();
2443 return true;
2444 }
2445 }
2446
2447 pagelayer_history_obj['action_data'].push(args);
2448 pagelayer_history_obj['current_active_item_id'] ++;
2449 pagelayer_history_setup();
2450 }
2451
2452 // Setup pagelayer history
2453 function pagelayer_history_setup(force){
2454
2455 var force = force || false;
2456
2457 // If the history tab is visible, only then setup
2458 if(!pagelayer.$$('.pagelayer-history').is(':visible') && !force){
2459 return;
2460 }
2461
2462 // pagelayer-HISTORY - Element Properties Dialog
2463 var pagelayer_history_html = '<div class="pagelayer-history-tabs">'+
2464 '<div class="pagelayer-history-tab" pagelayer-history-tab="actions" pagelayer-history-active-tab="1">Actions</div>'+
2465 '<div class="pagelayer-history-tab" pagelayer-history-tab="revisions">Revisions</div>'+
2466 '</div>'+
2467 '<div class="pagelayer-history-body">'+
2468 '<div class="pagelayer-history-section active" pagelayer-show-tab="actions">';
2469
2470 // Any actions
2471 if(pagelayer_history_obj['action_data'].length > 0){
2472
2473 var current_active = pagelayer_history_obj['action_data'].length - 1 || '';
2474
2475 for(var x in pagelayer_history_obj['action_data']){
2476
2477 if(pagelayer_empty(pagelayer_history_obj['action_data'][x])){continue;}
2478
2479 var title = pagelayer_history_obj['action_data'][x]['title'] || '';
2480 var subTitle = pagelayer_history_obj['action_data'][x]['subTitle'] || '';
2481 var action = pagelayer_history_obj['action_data'][x]['action'] || '';
2482 var tmp_attr = pagelayer_history_obj['action_data'][x]['attrType'] || '';
2483 var eAttr = '';
2484
2485 if(!pagelayer_empty(tmp_attr) && tmp_attr == "tmp_attr"){
2486 eAttr = "pagelayer-history-hidden";
2487 }
2488
2489 pagelayer_history_html += '<div class="pagelayer-history-holder '+((current_active == x) ? 'current_active_item' : '' )+' '+eAttr+'" history-action-id="'+x+'" >'+
2490 '<div class="pagelayer-history-detail-holder">'+
2491 '<span class="pagelayer-history-title"><b> '+title+' </b></span>'+
2492 '<span class="pagelayer-history-subtitle"> '+subTitle+' </span>'+
2493 '<span class="pagelayer-history-action"><i> '+action+' </i></span>'+
2494 '</div>'+
2495 '<div class="pagelayer-history-icon">'+
2496 '<span class="pagelayer-history-check fa fa-check" aria-hidden="true"></span>'+
2497 '</div>'+
2498 '</div>';
2499 }
2500
2501 }else{
2502 pagelayer_history_html += 'No Actions history available yet';
2503 }
2504
2505 pagelayer_history_html += '</div>'+
2506 '<div class="pagelayer-history-section" pagelayer-show-tab="revisions">';
2507
2508 // Any revisions ?
2509 if(pagelayer_revision_obj){
2510 for(var x in pagelayer_revision_obj){
2511 pagelayer_history_html += '<div class="pagelayer-revision-holder" revision-id="'+pagelayer_revision_obj[x]['ID']+'">'+
2512 '<div class="pagelayer-revision-img-holder">'+
2513 '<img src="'+pagelayer_revision_obj[x]['post_author_url']+'" />'+
2514 '</div>'+
2515 '<div class="pagelayer-revision-detail-holder">'+
2516 '<div class="pagelayer-revision-date">'+
2517 pagelayer_revision_obj[x]['post_date_ago']+
2518 '('+pagelayer_revision_obj[x]['post_date']+')'+
2519 '</div>'+
2520 '<div class="pagelayer-revision-author">'+
2521 pagelayer_revision_obj[x]['post_type'] +' by '+
2522 pagelayer_revision_obj[x]['post_author_name']+
2523 '</div>'+
2524 '</div>'+
2525 '<div class="pagelayer-revision-icon-holder">'+
2526 '<i class="pagelayer-revision-delete fa fa-times"></i>'+
2527 '</div>'+
2528 '</div>';
2529 }
2530
2531 }else{
2532 pagelayer_history_html += 'No Revisions history available';
2533 }
2534
2535 pagelayer_history_html += '</div>'+
2536 '</div>';
2537
2538 // Create the dialog box
2539 pagelayer.$$('#pagelayer-history').html(pagelayer_history_html);
2540 var holder = pagelayer.$$('#pagelayer-history');
2541
2542 // Set active history holder
2543 holder.find('.pagelayer-history-holder').on('click', function(){
2544 var hEle = jQuery(this);
2545 var prev_item_id = pagelayer_history_obj['current_active_item_id'];
2546 hEle.parent().children().removeClass('current_active_item');
2547 hEle.addClass('current_active_item');
2548 pagelayer_history_obj['current_active_item_id'] = hEle.attr('history-action-id');
2549 pagelayer_history_action_setup(hEle, prev_item_id);
2550 });
2551
2552 // Apply revision
2553 holder.find('.pagelayer-revision-holder').on('click', function(){
2554 var revision_id = jQuery(this).attr('revision-id');
2555
2556 jQuery.ajax({
2557 url: pagelayer_ajax_url+'&action=pagelayer_apply_revision&revisionID='+revision_id,
2558 type: 'post',
2559 data: {
2560 nonce: pagelayer_ajax_nonce,
2561 'pagelayer-live' : 1,
2562 },
2563 success: function(response, status, xhr){
2564
2565 var obj = jQuery.parseJSON(response);
2566 if(obj['error']){
2567 alert(obj['error']);
2568 }else{
2569 jQuery('.entry-content').html(obj['content']);
2570 alert(obj['success']);
2571 pagelayer_element_setup();
2572 pagelayer_add_widget();
2573 }
2574 }
2575 });
2576 });
2577
2578 // Delete the revision
2579 holder.find('.pagelayer-revision-delete').click(function(e){
2580
2581 e.stopPropagation();
2582 var rEle = jQuery(this).closest('.pagelayer-revision-holder');
2583 var revision_id = rEle.attr('revision-id');
2584
2585 if(confirm("Are you sure you want to delete the revision ?")){
2586 jQuery.ajax({
2587 url: pagelayer_ajax_url+'&action=pagelayer_delete_revision&revisionID='+revision_id,
2588 type: 'post',
2589 data: {nonce: pagelayer_ajax_nonce},
2590 success: function(response, status, xhr){
2591
2592 var obj = jQuery.parseJSON(response);
2593 if(obj['error']){
2594 alert(obj['error']);
2595 }else{
2596 alert(obj['success']);
2597 rEle.hide();
2598 }
2599
2600 }
2601 });
2602 }
2603
2604 });
2605
2606 // The tabs
2607 holder.find('.pagelayer-history-tab').on('click', function(){
2608 var attr = 'pagelayer-history-active-tab';
2609 holder.find('.pagelayer-history-tab').each(function(){
2610 jQuery(this).removeAttr(attr);
2611 });
2612 jQuery(this).attr(attr, 1);
2613
2614 // Get the active tab
2615 var active_tab = holder.find('[pagelayer-history-active-tab]').attr('pagelayer-history-tab');
2616
2617 // Trigger the showing of rows
2618 holder.find('[pagelayer-show-tab]').each(function(){
2619 var sec = jQuery(this);
2620
2621 // Is it the active tab ?
2622 if(sec.attr('pagelayer-show-tab') != active_tab){
2623 sec.hide();
2624 }else{
2625 sec.show();
2626 }
2627 });
2628 });
2629 }
2630
2631 // Get evisions Handler
2632 function pagelayer_get_revision(){
2633
2634 jQuery.ajax({
2635 url: pagelayer_ajax_url+'&action=pagelayer_get_revision&postID='+pagelayer_postID,
2636 type: 'post',
2637 data: {
2638 nonce: pagelayer_ajax_nonce,
2639 },
2640 //async:false,
2641 success: function(response, status, xhr){
2642 var obj = jQuery.parseJSON(response);
2643
2644 if(!pagelayer_empty(obj['error'])){
2645 alert(obj['error']);
2646 }else{
2647 pagelayer_revision_obj = obj;
2648 pagelayer_history_setup(true);
2649 }
2650 }
2651 });
2652 };
2653
2654 // Do the history action - use for ctrl-z and ctrl-y
2655 function pagelayer_do_history(action){
2656
2657 var actions_section = pagelayer.$$('#pagelayer-history [pagelayer-show-tab="actions"]');
2658 var current_item = actions_section.find('.pagelayer-history-holder.current_active_item');
2659
2660 if(action == 'undo'){
2661 current_item = jQuery(current_item).prevAll(":not(.pagelayer-history-hidden)").first();
2662 }else if(action == 'redo'){
2663 current_item = jQuery(current_item).nextAll(":not(.pagelayer-history-hidden)").first();
2664 }
2665
2666 current_item.click();
2667
2668 };
2669
2670 // Action setup handle on ctrl-z and ctrl-y
2671 function pagelayer_history_action_setup(now_active, prev_item_id){
2672 var current_item_id = parseInt(now_active.attr('history-action-id'));
2673
2674 // Delete the element
2675 var delete_ele = function(id){
2676
2677 // Set Pagelayer History FALSE to prevent saving delete action in action history
2678 pagelayer.history_action = false;
2679
2680 pagelayer_delete_element('[pagelayer-id='+id+']');
2681
2682 // Set Pagelayer History TRUE
2683 pagelayer.history_action = true;
2684
2685 };
2686
2687 // Re-setup the element
2688 var resetup_ele = function(history_array){
2689 jQuery(history_array.cEle.cEle)[history_array.cEle.method](history_array.html);
2690 pagelayer_element_setup('[pagelayer-id='+history_array.pl_id+'], [pagelayer-id='+history_array.pl_id+'] .pagelayer-ele', true);
2691 pagelayer_empty_col(jQuery('[pagelayer-id="'+history_array.pl_id+'"]').closest('.pagelayer-col-holder'));
2692 };
2693
2694 // Re-setup the element attr
2695 var reset_ele_attr = function(hEle, atts, val, attrType){
2696
2697 // Set Pagelayer History FALSE to prevent saving attributes in action history
2698 pagelayer.history_action = false;
2699 if(attrType == "tmp_attr"){
2700 pagelayer_set_tmp_atts(hEle, atts, val);
2701 }else{
2702 pagelayer_set_atts(hEle, atts, val);
2703 }
2704
2705 // The property holder
2706 var holder = pagelayer.$$('.pagelayer-elpd-body');
2707 holder.html(' ');
2708 pagelayer_sc_render(hEle);
2709 pagelayer_elpd_generate(hEle, holder);
2710 pagelayer.history_action = true;
2711
2712 };
2713
2714 if(prev_item_id > current_item_id){
2715
2716 // All Actions for undo here
2717 var i = parseInt(prev_item_id);
2718
2719 for(i; i > current_item_id; i--){
2720
2721 var history_array = pagelayer_history_obj['action_data'][i];
2722 var action = history_array.action;
2723 var id = history_array.pl_id;
2724
2725 if(action == "Edited"){
2726 hEle = jQuery('[pagelayer-id="'+id+'"]');
2727 reset_ele_attr(hEle, history_array.atts, history_array.oldVal, history_array.attrType);
2728 }else if(action == "Added"){
2729 delete_ele(id);
2730 }else if(action == "Deleted"){
2731 resetup_ele(history_array);
2732 }else if(action == "Copied"){
2733 delete_ele(id);
2734 }
2735
2736 }
2737
2738 }else{
2739
2740 // All Actions for redo here
2741 var i = parseInt(prev_item_id)+1;
2742
2743 for(i; i <= current_item_id; i++){
2744
2745 var history_array = pagelayer_history_obj['action_data'][i];
2746 var action = history_array.action;
2747 var id = history_array.pl_id;
2748
2749 if(action == "Edited"){
2750 hEle = jQuery('[pagelayer-id="'+id+'"]');
2751 reset_ele_attr(hEle, history_array.atts, history_array.newVal, history_array.attrType);
2752 }else if(action == "Added"){
2753 resetup_ele(history_array);
2754
2755 if(history_array.tag != "pl_row" && history_array.tag != "pl_col" ){
2756 // Ensure the column is not empty
2757 pagelayer_empty_col(history_array.cEle.cEle);
2758 }
2759 }else if(action == "Deleted"){
2760 delete_ele(id);
2761 }else if(action == "Copied"){
2762 resetup_ele(history_array);
2763 }
2764
2765 }
2766 }
2767
2768 };
2769
2770 // Report an error
2771 function pagelayer_error(error, func){
2772 var prefix = func || '';
2773 alert(prefix+error);
2774 };
2775
2776 function pagelayer_bottombar(){
2777 var holder = pagelayer.$$('.pagelayer-bottombar-holder');
2778 var html = '<div class="pagelayer-bottombar">'+
2779 '<div class="pagelayer-bottombar-rightbuttons">'+
2780 '<button class="pagelayer-update-button">Update</button>'+
2781 '<button class="pagelayer-close-button">Close</button>'+
2782 '<div class="pagelayer-mode-wrapper">'+
2783 '<i class="pagelayer-mode-button fa fa-desktop"></i>'+
2784 '<div class="pagelayer-mode-buttons-wrapper">'+
2785 '<i class="screen-mode fa fa-desktop" pagelayer-mode-data="desktop"></i>'+
2786 '<i class="screen-mode fa fa-tablet" pagelayer-mode-data="tablet"></i>'+
2787 '<i class="screen-mode fa fa-mobile" pagelayer-mode-data="mobile"></i>'+
2788 '</div>'+
2789 '</div>'+
2790 '<i class="pagelayer-history-icon fa fa-history"></i>'+
2791 '</div>'+
2792 '</div>';
2793
2794 holder.html(html);
2795 holder.find('.pagelayer-update-button').on('click', function(){
2796 pagelayer_save();
2797 pagelayer_history_setup();// Setup history tab after update
2798 });
2799
2800 holder.find('.pagelayer-close-button').on('click', function(){
2801 pagelayer_close();
2802 });
2803 holder.find('.screen-mode').on('click', function(){
2804 var screen_mode = jQuery(this).attr('pagelayer-mode-data');
2805 pagelayer_set_screen_mode(screen_mode);
2806 holder.find('.pagelayer-mode-buttons-wrapper').toggle();
2807 });
2808
2809 holder.find('.pagelayer-mode-button').on('click', function(){
2810 holder.find('.pagelayer-mode-buttons-wrapper').toggle();
2811 });
2812
2813 holder.find('.pagelayer-history-icon').click(function(){
2814 pagelayer.$$('.pagelayer-elpd-header').show().find('.pagelayer-elpd-title').text('Pagelayer History');
2815 pagelayer.$$('.pagelayer-elpd').hide();
2816 pagelayer.$$('.pagelayer-logo').hide();
2817 pagelayer.$$('.pagelayer-shortcodes').hide();
2818 pagelayer.$$('.pagelayer-history').show();
2819 pagelayer_active = {};
2820 pagelayer_history_setup();
2821 });
2822 };
2823
2824
2825 ///////////////////////////////
2826 // Miscellaneuos Functions
2827 ///////////////////////////////
2828
2829 // Generates a random string of "n" characters
2830 function pagelayer_randstr(n, special){
2831 var text = '';
2832 var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
2833
2834 special = special || 0;
2835 if(special){
2836 possible = possible + '&#$%@';
2837 }
2838
2839 for(var i=0; i < n; i++){
2840 text += possible.charAt(Math.floor(Math.random() * possible.length));
2841 }
2842
2843 return text;
2844 };
2845
2846 function pagelayer_update_site_title(val){
2847 if(!pagelayer_empty(val)){
2848 var site_name = jQuery('.pagelayer-wp-title').attr('pagelayer-a-site_name');
2849 if(!pagelayer_empty(site_name)){
2850 var site_title = jQuery.ajax({
2851 url: pagelayer_ajax_url+'&action=pagelayer_fetch_site_title',
2852 type: 'post',
2853 async: false
2854 }).responseText;
2855
2856 if(site_title != site_name){
2857 var site_title = jQuery.ajax({
2858 url: pagelayer_ajax_url+'&action=pagelayer_update_site_title',
2859 type: 'post',
2860 data: {'site_title': site_name},
2861 async: false
2862 }).responseText;
2863 }
2864 }
2865 }
2866 }
2867
2868 function pagelayer_trim(str, charlist){
2869 // discuss at: http://locutus.io/php/trim/
2870
2871 if(typeof str != 'string'){
2872 return str;
2873 }
2874
2875 var whitespace = [' ', '\n', '\r', '\t', '\f', '\x0b', '\xa0', '\u2000', '\u2001', '\u2002', '\u2003', '\u2004', '\u2005', '\u2006', '\u2007', '\u2008', '\u2009', '\u200a', '\u200b', '\u2028', '\u2029', '\u3000' ].join('')
2876 var l = 0
2877 var i = 0
2878 str += ''
2879
2880 if (charlist) {
2881 whitespace = (charlist + '').replace(/([[\]().?/*{}+$^:])/g, '$1')
2882 }
2883
2884 l = str.length
2885 for (i = 0; i < l; i++) {
2886 if (whitespace.indexOf(str.charAt(i)) === -1) {
2887 str = str.substring(i)
2888 break
2889 }
2890 }
2891
2892 l = str.length
2893 for (i = l - 1; i >= 0; i--) {
2894 if (whitespace.indexOf(str.charAt(i)) === -1) {
2895 str = str.substring(0, i + 1)
2896 break
2897 }
2898 }
2899
2900 return whitespace.indexOf(str.charAt(0)) === -1 ? str : ''
2901 };
2902
2903 // Convert the regular URL of a Video to a Embed URL
2904 function pagelayer_video_url(src){
2905
2906 var youtubeRegExp = /youtube\.com|youtu\.be/;
2907 var vimeoRegExp = /vimeo\.com/;
2908 var match = '';
2909 var videoId = '';
2910
2911 if (youtubeRegExp.exec(src)) {
2912 match = 'youtube';
2913 } else if (vimeoRegExp.exec(src)) {
2914 match = 'vimeo';
2915 }
2916
2917 switch(match){
2918 case 'youtube':
2919
2920 var youtubeRegExp1 = /youtube\.com/;
2921 var youtubewatch = /watch/;
2922 var youtubeembed = /embed/;
2923 var youtube = /youtu\.be/;
2924
2925 if (youtubeRegExp1.exec(src)) {
2926
2927 if (youtubewatch.exec(src)) {
2928 videoId = src.split('?v=');
2929
2930 } else if (youtubewatch.exec(src)) {
2931 videoId = src.split('embed/');
2932 }
2933
2934 } else if (youtube.exec(src)) {
2935 videoId = src.split('.be/');
2936 }
2937
2938 return '//youtube.com/embed/'+videoId[1];
2939
2940 break;
2941
2942 case 'vimeo':
2943
2944 var vimeoplayer = /player\.vimeo\.com/;
2945 var vimeovideo = /video/;
2946
2947 if (vimeoplayer.exec(src) && vimeovideo.exec(src)) {
2948 videoId = src.split('video/');
2949 } else if (vimeoRegExp.exec(src)) {
2950 videoId = src.split('.com/');
2951 }
2952
2953 return '//player.vimeo.com/video/'+videoId[1];
2954
2955 break;
2956 default:
2957 return src;
2958 }
2959 };
2960
2961 // Add widget section
2962 function pagelayer_add_widget(){
2963
2964 html='<div class="pagelayer-add-widget-area">'+
2965 '<i class="pagelayer-add-row fa fa-plus-circle"></i>'+
2966 '<p>Click here to add new row OR drag widgets</p>'+
2967 '</div>';
2968
2969 jQuery('.entry-content').append(html);
2970
2971 var add_area = jQuery('.pagelayer-add-widget-area');
2972
2973 // Add a code before this
2974 var add_sc = function(tag){
2975
2976 // Create Row
2977 var row = jQuery('<div pagelayer-tag="pl_row"></div>');
2978 add_area.before(row);
2979 var row_id = pagelayer_onadd(row, false);
2980 var rEle = pagelayer_ele_by_id(row_id);
2981
2982 if(tag == 'pl_row'){
2983 rEle.click();
2984 return row_id;
2985 }
2986
2987 // Create Column
2988 var col = jQuery('<div pagelayer-tag="pl_col"></div>');
2989 rEle.find('.pagelayer-row-holder').append(col);
2990 var col_id = pagelayer_onadd(col, false);
2991 var cEle = pagelayer_ele_by_id(col_id);
2992
2993 if(tag == 'pl_col'){
2994 cEle.click();
2995 return col_id;
2996 }
2997
2998 // Create element
2999 var ele = jQuery('<div pagelayer-tag="'+tag+'"></div>');
3000 cEle.find('.pagelayer-col-holder').append(ele);
3001 var id = pagelayer_onadd(ele);
3002
3003 // Ensure the column is not empty
3004 pagelayer_empty_col(cEle.find('.pagelayer-col-holder'));
3005
3006 return id;
3007
3008 }
3009
3010 // Handle Click
3011 add_area.on('click', function(){
3012 add_sc('pl_col');
3013 });
3014
3015 // Handle Drag over
3016 add_area.on('dragover', function(e){
3017 //console.log(e)
3018 add_area.addClass('pagelayer-add-widget-drag');
3019 });
3020
3021 // Handle Drag Leave
3022 add_area.on('dragleave', function(e){
3023 //console.log(e)
3024 add_area.removeClass('pagelayer-add-widget-drag');
3025 });
3026
3027 // Handle On Drop
3028 add_area.on('drop', function(e){
3029
3030 //console.log(e);
3031 //console.log(e.originalEvent.dataTransfer.getData('tag'));
3032 add_area.removeClass('pagelayer-add-widget-drag');
3033 jQuery('.pagelayer-is-dragging').removeClass('pagelayer-is-dragging');
3034
3035 var tag = e.originalEvent.dataTransfer.getData('tag');
3036
3037 // Is it an existing element ?
3038 if(tag.length < 1){
3039 return false;
3040 }
3041
3042 e.preventDefault();
3043
3044 //console.log(tag);
3045
3046 add_sc(tag);
3047 });
3048 }
3049