PluginProbe
Page Builder: Pagelayer – Drag and Drop website builder / 0.9.2
Page Builder: Pagelayer – Drag and Drop website builder v0.9.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 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.2, at js/pagelayer-editor.js

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