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

2,457 lines 57.2 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];
607
608 // Do we have to create children ?
609 if('has_group' in props){
610
611 var has_group = props['has_group'];
612 var gProp = props[has_group['section']][has_group['prop']];
613
614 for(var i=0; i < gProp['count']; i++){
615 var cid = pagelayer_element_add_child(jQuery("[pagelayer-id="+id+"]"), gProp['sc']);
616 pagelayer_element_setup('[pagelayer-id='+cid+']', true);
617 }
618
619 }
620
621 }
622
623 return id;
624
625 };
626
627 // Add an element
628 function pagelayer_element_add_child(pEle, sc){
629 var child = pagelayer_create_sc(sc);
630 var cid = pagelayer_assign_id(child);
631 pagelayer_set_parent(child, pagelayer_assign_id(pEle));
632
633 // Does the parent have a holder ?
634 var tag = pagelayer_tag(pEle);
635
636 // There is a holder
637 if('holder' in pagelayer_shortcodes[tag]){
638
639 pEle.find(pagelayer_shortcodes[tag]['holder']).append(child);
640
641 // No holder, just append
642 }else{
643 pEle.append(child);
644 }
645
646 return cid;
647 };
648
649 // Return an element by ID
650 function pagelayer_ele_by_id(id){
651 return jQuery('[pagelayer-id='+id+']');
652 };
653
654 // Return the wrap by ID
655 function pagelayer_wrap_by_id(id){
656 return jQuery('[pagelayer-wrap-id='+id+']');
657 };
658
659 // Give the Pagelayer ID
660 function pagelayer_id(jEle){
661
662 var id = jEle.attr('pagelayer-wrap-id');
663 if(id){
664 return id;
665 }
666
667 id = jEle.attr('pagelayer-id');
668
669 return id;
670
671 }
672
673 // Assign the jQuery object an ID
674 function pagelayer_assign_id(jEle){
675
676 // Do you have the pagelayer id
677 var id = jEle.attr("pagelayer-id");
678 if(!id || id.length < 1){
679 id = pagelayer_randstr(16);
680 jEle.attr("pagelayer-id", id);
681 }
682
683 return id;
684
685 }
686
687 // Show the edit options
688 function pagelayer_element_clicked(selector, e){
689
690 var jEle = jQuery(selector);
691 e = e || false;
692
693 // You must be a element atleast
694 if(!jEle.hasClass('pagelayer-ele')){
695 return false;
696 }
697
698 // Get the parent
699 var pId = pagelayer_get_parent(jEle);
700
701 // If we found a parent
702 if(pId){
703 jEle = pagelayer_ele_by_id(pId);
704 }
705
706 // Lets not rebuild everything to make it faster
707 if(pagelayer_is_active(jEle)){
708 return false;
709 }
710
711 // Make the editable fields active
712 pagelayer_clear_editable();// First clear
713 jEle.find('[pagelayer-editable]').each(function (){
714 pagelayer_make_editable(jQuery(this), e);
715 });
716
717 // Set this as the active element
718 pagelayer_set_active(jEle);
719
720 // Show the properties
721 pagelayer_elpd_open(jEle);
722
723 }
724
725 // The edit option
726 function pagelayer_edit_element(selector){
727 pagelayer_element_clicked(selector);
728 }
729
730 // Setup the properties on a single click
731 function pagelayer_element_setup(selector, render){
732
733 var selector = selector || ".pagelayer-ele";
734 render = render || false;
735
736 // Loop through
737 jQuery(selector).each(function(){
738
739 var jEle = jQuery(this);
740
741 // Assign an ID if not there
742 var id = pagelayer_assign_id(jEle);
743 var pId = pagelayer_get_parent(jEle) || '';// Options to show on hover
744 var selector = '[pagelayer-id='+id+']';
745
746 if(render){
747 pagelayer_sc_render(jEle);
748 }
749
750 // Get the tag
751 var tag = pagelayer_tag(jEle);
752
753 // Lets check if we are the child of a parent i.e. element of a group
754 if(pagelayer_empty(pId)){
755
756 // Get the parent
757 var pEle = jEle.parent().closest('.pagelayer-ele');
758
759 // If we found a parent
760 if(pEle.length > 0){
761
762 var pTag = pagelayer_tag(pEle);
763
764 // Is the parent a group of this child ?
765 if(!pagelayer_empty(pagelayer_shortcodes[pTag]) && pagelayer_is_group(pTag)){
766
767 var has_group = pagelayer_shortcodes[pTag]['has_group'];
768 var child_type = pagelayer_shortcodes[pTag][has_group['section']][has_group['prop']]['sc'];
769
770 // If the type is the same as jEle
771 if(child_type == pagelayer_tag(jEle)){
772 pId = pagelayer_assign_id(pEle);
773 pagelayer_set_parent(jEle, pId);
774 }
775 }
776
777 }
778
779 }
780
781 // Make the wraps
782 jEle.wrap('<div class="pagelayer-ele-wrap" pagelayer-wrap-id="'+id+'"></div>');
783 var wrap = jEle.parent();
784
785 // For column we have to do some kidas !
786 if(tag == 'pl_col'){
787
788 var col;
789 for(var x=1; x<=12; x++){
790 if(jEle.hasClass('pagelayer-col-'+x)){
791 col = 'pagelayer-col-'+x;
792 break;
793 }
794 }
795
796 var is_custom_width = pagelayer_get_att(jEle, 'col');
797 var col_width = pagelayer_get_att(jEle, 'col_width');
798 if(pagelayer_empty(is_custom_width) && col_width){
799 wrap.css('width', col_width+'%');
800 }
801
802 wrap.addClass('pagelayer-col '+col);
803 //jEle.removeClass('pagelayer-col '+col);
804 wrap.addClass('pagelayer-wrap-col');
805
806 }else if(tag == 'pl_row'){
807 wrap.addClass('pagelayer-wrap-row');
808 }else{
809 wrap.addClass('pagelayer-wrap-ele');
810 }
811
812 // Create the overlay
813 wrap.prepend('<div class="pagelayer-ele-overlay"></div>');
814
815 var overlay = wrap.children('.pagelayer-ele-overlay');
816 var html;
817
818 if(tag == 'pl_row'){
819
820 overlay.addClass('pagelayer-row-hover');
821
822 if(jEle.hasClass('pagelayer-row-stretch-full')){
823 pagelayer_sc_render(jEle);
824 }
825
826 html = '<div class="pagelayer-row-option" pagelayer-option-edit pagelayer-option-id="'+id+'">'+
827 '<i class="fa fa-clone pagelayer-eoi" onclick="pagelayer_copy_element(\''+selector+'\')" />'+
828 '<i class="fa fa-trash pagelayer-eoi" onclick="pagelayer_delete_element(\''+selector+'\')" />'+
829 '<i class="fa fa-pencil pagelayer-eoi" onclick="pagelayer_edit_element(\''+selector+'\', event)" />'+
830 '</div>';
831
832 }else if(tag == 'pl_col'){
833
834 overlay.addClass('pagelayer-col-hover');
835
836 html = '<div class="pagelayer-col-option" pagelayer-option-edit pagelayer-option-id="'+id+'">'+
837 '<i class="fa fa-columns pagelayer-eoi" onclick="pagelayer_edit_element(\''+selector+'\', event)" />'+
838 '</div>';
839
840 // Is it an empty col ?
841 pagelayer_empty_col(jEle.children('.pagelayer-col-holder'));
842
843 }else{
844
845 html = '<div class="pagelayer-ele-option" pagelayer-option-edit pagelayer-option-id="'+id+'">'+
846 '<i class="fa fa-clone pagelayer-eoi" onclick="pagelayer_copy_element(\''+selector+'\')" />'+
847 '<i class="fa fa-trash pagelayer-eoi" onclick="pagelayer_delete_element(\''+selector+'\')" />'+
848 '<i class="fa fa-pencil pagelayer-eoi" onclick="pagelayer_edit_element(\''+selector+'\', event)" />'+
849 '</div>';
850
851 }
852
853 // Append to the child
854 overlay.append(html);
855 jQuery('[pagelayer-option-id='+id+']').hide();
856
857 // Setup the HOVER events ABD create WRAPS IF we dont have a parent
858 if(pId.length > 0){
859 return;
860 }
861
862 // Make the wrap draggable, but only of independent or parent elements
863 wrap.attr('draggable', 'true');
864
865 wrap.hover(function(){
866
867 // Is there an element option shower ?
868 var opts = jQuery('[pagelayer-option-id='+id+']');
869
870 // Give the overlay the hover class
871 opts.parent().addClass('pagelayer-ele-hover');
872
873 // Show them
874 opts.show();
875
876 }, function(){
877
878 // Is there an element option shower ?
879 var opts = jQuery('[pagelayer-option-id='+id+']');
880
881 // Remove hover class
882 opts.parent().removeClass('pagelayer-ele-hover');
883
884 // Hide opts
885 opts.hide();
886
887 });
888
889 });
890 }
891
892 // Left Click
893 function pagelayer_left_click(){
894
895 jQuery('.entry-content').on('click', function(e){
896
897 // Hide the context menu
898 jQuery('.pagelayer-right-click-options').hide();
899
900 // Target
901 var tEle = jQuery(e.target);
902
903 // If its an edit option click
904 if(tEle.hasClass('pagelayer-eoi')){
905 return false;
906 }
907
908 pagelayer_element_clicked(tEle.closest('.pagelayer-ele'), e);
909
910 return false;
911
912 });
913 };
914
915 // Right Click Menu
916 function pagelayer_right_click(){
917
918 var html = '<div class="pagelayer-right-click-options" style="display:none;">'+
919 '<ul>'+
920 '<li><a class="pagelayer-right-edit">Edit</a></li>'+
921 '<li><a class="pagelayer-right-duplicate">Duplicate</a></li>'+
922 '<li><a class="pagelayer-right-copy">Copy</a></li>'+
923 '<li><a class="pagelayer-right-paste">Paste</a></li>'+
924 '<li><a class="pagelayer-right-delete">Delete</a></li>'+
925 '</ul>'+
926 '</div>';
927
928 jQuery('body').append(html);
929
930 var $contextMenu = jQuery('.pagelayer-right-click-options');
931
932 jQuery('.entry-content').on('contextmenu', function(e){
933
934 var tEle = jQuery(e.target);
935 var jEle = tEle.closest('.pagelayer-ele-wrap').children('.pagelayer-ele');
936
937 // Get the parent
938 var pId = pagelayer_get_parent(jEle);
939
940 // If we found a parent
941 if(pId){
942 jEle = pagelayer_ele_by_id(pId);
943 }
944
945 // The basics
946 var id = pagelayer_assign_id(jEle);
947 var tag = pagelayer_tag(jEle);
948
949 $contextMenu.find('.pagelayer-right-edit').attr('onclick', 'pagelayer_edit_element("[pagelayer-id='+id+']")').html('Edit '+pagelayer_shortcodes[tag]['name']);
950 $contextMenu.find('.pagelayer-right-duplicate').attr('onclick', 'pagelayer_copy_element("[pagelayer-id='+id+']")');
951 $contextMenu.find('.pagelayer-right-copy').attr('onclick', 'pagelayer_copy_select("[pagelayer-id='+id+']")');
952 $contextMenu.find('.pagelayer-right-paste').attr('onclick', 'pagelayer_paste_element("[pagelayer-id='+id+']")');
953 $contextMenu.find('.pagelayer-right-delete').attr('onclick', 'pagelayer_delete_element("[pagelayer-id='+id+']")');
954
955 // Are we to hide the paste ?
956 if(!pagelayer_empty(pagelayer.copy_selected) && pagelayer_can_copy_to(jEle)){
957 //console.log(pagelayer_can_copy_to(jEle));
958 $contextMenu.find('.pagelayer-right-paste').parent().show();
959 }else{
960 $contextMenu.find('.pagelayer-right-paste').parent().hide();
961 }
962
963 $contextMenu.css({
964 display: "block",
965 left: e.pageX,
966 top: e.pageY
967 });
968
969 return false;
970
971 });
972
973 jQuery('html').on('click', function(e){
974 $contextMenu.hide();
975 });
976 }
977
978 // Set the parent for the group
979 function pagelayer_set_parent(jEle, id){
980 jEle.attr('pagelayer-parent', id);
981 };
982
983 // Set the parent for the group
984 function pagelayer_get_parent(jEle){
985 return jEle.attr('pagelayer-parent');
986 };
987
988 // Sets the screen mode
989 function pagelayer_set_screen_mode(mode){
990 var modes = ['desktop', 'tablet', 'mobile'];
991 var body = pagelayer.$$('.pagelayer-iframe-holder iframe');
992 var current = '';
993
994 for(var x in modes){
995
996 if(body.hasClass('pagelayer-screen-'+modes[x]) && modes[x] != mode){
997 current = modes[x];
998 body.removeClass('pagelayer-screen-'+modes[x]);
999 }
1000 }
1001
1002 // Add the class
1003 body.addClass('pagelayer-screen-'+mode);
1004
1005 // Add the class to the button
1006 pagelayer.$$('.pagelayer-mode-button').removeClass('fa-'+current).addClass('fa-'+mode);
1007
1008 // Trigger screen change if any
1009 pagelayer.$$('.pagelayer-elp-screen').trigger('pagelayer-screen-changed');
1010
1011 };
1012
1013 // Get the current screen mode
1014 function pagelayer_get_screen_mode(){
1015 var modes = ['desktop', 'tablet', 'mobile'];
1016 var body = pagelayer.$$('.pagelayer-iframe-holder iframe');
1017
1018 for(var x in modes){
1019 if(body.hasClass('pagelayer-screen-'+modes[x])){
1020 return modes[x];
1021 }
1022 }
1023 }
1024
1025 // Handle key press events
1026 jQuery(document).keydown(function(event){
1027 //alert(String.fromCharCode(event.which));
1028
1029 // Delete
1030 if(event.keyCode == 46){
1031 pagelayer_delete_element('[pagelayer-active]');
1032 }
1033
1034 });
1035
1036 // Delete an element as per the selector
1037 function pagelayer_delete_element(selector){
1038 var jEle = jQuery(selector);
1039
1040 // Anything found ?
1041 if(jEle.length > 0){
1042
1043 var id = pagelayer_assign_id(jEle);
1044
1045 // Is there a wrap
1046 var wrap = jQuery('[pagelayer-wrap-id="'+id+'"]');
1047
1048 var par = wrap.parent();
1049
1050 wrap.remove();
1051
1052 pagelayer_empty_col(par);
1053
1054 if(pagelayer_active.el && pagelayer_active.el.id == id){
1055 pagelayer.$$('.pagelayer-elpd-close').click();
1056 }
1057
1058 }
1059 pagelayer_isDirty = true;
1060 };
1061
1062 // Select an element
1063 function pagelayer_copy_select(selector){
1064 pagelayer.copy_selected = selector;
1065 }
1066
1067 function pagelayer_can_copy_to(to){
1068 var jEle = jQuery(pagelayer.copy_selected);
1069 var tEle = jQuery(to);
1070
1071 var eTag = pagelayer_tag(jEle);
1072 var tTag = pagelayer_tag(tEle);
1073 //console.log(eTag+' - '+tTag);
1074 // Final to
1075 var fTo;
1076
1077 // Selected element is a Row, can go only after a row
1078 if(eTag == 'pl_row'){
1079 fTo = tEle.closest('.pagelayer-ele.pagelayer-row');
1080 if(fTo.length != 1) return false;
1081 return fTo;
1082 }
1083
1084 // Selected element is a Column, can go only after a col
1085 if(eTag == 'pl_col'){
1086 fTo = tEle.closest('.pagelayer-ele.pagelayer-col');
1087 if(fTo.length != 1) return false;
1088 return fTo;
1089 }
1090
1091 // Is the TARGET a row or column when the selected item is a element
1092 if(tTag == 'pl_row' || tTag == 'pl_col'){
1093 return false;
1094 }
1095
1096 return tEle;
1097
1098 }
1099
1100 // Select an element
1101 function pagelayer_paste_element(to){
1102
1103 var fTo = pagelayer_can_copy_to(to);
1104
1105 // Is it a valid to
1106 if(!fTo){
1107 return false;
1108 }
1109
1110 pagelayer_copy_element(pagelayer.copy_selected, fTo);
1111 }
1112
1113 // Copy an element
1114 // Note : insertAfter should always be an pagelayer-ele
1115 function pagelayer_copy_element(selector, insertAfter){
1116 var src = jQuery(selector);
1117 var html = src[0].outerHTML;
1118 var tag = pagelayer_tag(src);
1119 insertAfter = insertAfter || src;
1120 insertAfter = insertAfter.parent();
1121
1122 var jEle = jQuery(html);
1123 jEle.removeAttr('pagelayer-id');
1124 jEle.find('[pagelayer-id]').removeAttr('pagelayer-id');
1125 jEle.find('style').remove();
1126 jEle.find('.pagelayer-ele-overlay').remove();
1127
1128 // Unwrap the wraps
1129 jEle.find('.pagelayer-ele').each(function (){
1130 var ele = jQuery(this);
1131 if(ele.parent().is('.pagelayer-ele-wrap')){
1132 ele.unwrap();
1133 }
1134 });
1135
1136 // Give it an ID
1137 var id = pagelayer_assign_id(jEle);
1138
1139 jQuery(insertAfter).after(jEle);
1140
1141 pagelayer_element_setup('[pagelayer-id='+id+'], [pagelayer-id='+id+'] .pagelayer-ele', true);
1142
1143 //If column then renumber columns
1144 if(tag == 'pl_col'){
1145 var row = src.parent().closest('.pagelayer-row');
1146 pagelayer_renumber_col(row);
1147 }
1148
1149 pagelayer_isDirty = true;
1150 };
1151
1152 // Language key
1153 function pagelayer_l(k){
1154 return k;
1155 }
1156
1157 // Set the given jELE as active
1158 function pagelayer_set_active(jEle){
1159
1160 // Make all other element as inactive
1161 jQuery('[pagelayer-active]').each(function(){
1162 var $j = jQuery(this);
1163 $j.removeAttr('pagelayer-active');
1164 });
1165
1166 jEle.attr('pagelayer-active', 1);
1167
1168 // Add and remove the class
1169 jQuery('.pagelayer-active').removeClass('pagelayer-active');
1170
1171 jEle.parent().children('.pagelayer-ele-overlay').addClass('pagelayer-active');
1172
1173 }
1174
1175 function pagelayer_sc(sc){
1176 return sc.replace('pl_', '');
1177 };
1178
1179 // Create a HTML dom element of the Short code
1180 // Return the jEle
1181 function pagelayer_create_sc(sc){
1182
1183 var html;
1184 var _sc = pagelayer_sc(sc);
1185 var func = window['pagelayer_sc_'+sc];
1186
1187 // Generate the HTML
1188 if(typeof func == 'function'){
1189 html = window['pagelayer_sc_'+sc]();
1190 }else{
1191 html = '<div '+pagelayer_sc_atts('pagelayer-'+_sc)+'></div>';
1192 }
1193
1194 html = jQuery(html);
1195
1196 // Add the tag
1197 html.attr('pagelayer-tag', sc);
1198
1199 // Give it an ID
1200 id = pagelayer_assign_id(html);
1201
1202 // Try to set the default values over 5 loops
1203 pagelayer_set_default_atts(html, 5);
1204
1205 return html;
1206
1207 };
1208
1209 // Returns a list of default attributes to set as per the current selection
1210 function pagelayer_set_default_atts(jEle, set){
1211
1212 set = set || 0;
1213 var hasSet = false;
1214
1215 for(var i = 1; i <= set;i++){
1216
1217 //console.log('[pagelayer_set_default_atts] Loop :'+i);
1218 //console.log(jEle);
1219
1220 // Get existing data
1221 var el = pagelayer_data(jEle, true);
1222
1223 // If it is the last loop and we are greater than 1
1224 if(i > 1 && i == set){
1225 console.log('[pagelayer_default_atts] Still vars to set. Please check your shortcode params !');
1226 }
1227
1228 // We are supposed to set !
1229 if('set' in el && !pagelayer_empty(el.set)){
1230 pagelayer_set_atts(jEle, el.set);
1231 hasSet = true;
1232 }else{
1233 break;
1234 }
1235 }
1236
1237 return hasSet;
1238 }
1239
1240 // Returns the tag
1241 function pagelayer_tag(jEle){
1242
1243 // It could be the wrap
1244 if(jEle.hasClass('pagelayer-ele-wrap')){
1245 return jEle.children('.pagelayer-ele').attr('pagelayer-tag');
1246 }
1247
1248 // It could be the row or col holder
1249 if(jEle.hasClass('pagelayer-row-holder') || jEle.hasClass('pagelayer-col-holder')){
1250 return jEle.parent().attr('pagelayer-tag');
1251 }
1252
1253 return jEle.attr('pagelayer-tag');
1254 }
1255
1256 // Gets a single attribute value
1257 function pagelayer_get_att(jEle, att){
1258 return jEle.attr('pagelayer-a-'+att);
1259 };
1260
1261 // Gets a single attribute value
1262 function pagelayer_get_tmp_att(jEle, att){
1263 return jEle.attr('pagelayer-tmp-'+att);
1264 };
1265
1266 // This function will just set atts and not do anything else
1267 // Atts can be string or object. If its string, then val is needed
1268 function pagelayer_set_atts(jEle, atts, val){
1269
1270 if(typeof atts == 'string'){
1271 var tmp = {};
1272 tmp[atts] = val;
1273 atts = tmp;
1274 }
1275
1276 if(typeof atts != 'object'){
1277 return false;
1278 }
1279
1280 var tag = pagelayer_tag(jEle);
1281 var trigger_onchange = 0;
1282
1283 if(pagelayer_empty(tag)){
1284 console.log('Set atts found no tag');
1285 console.log(jEle);
1286 return;
1287 }
1288
1289 // All props
1290 var all_props = pagelayer_shortcodes[tag];//console.log(tag);console.log(jEle);
1291 var trigger_props = {};
1292 var no_val = {};
1293 var defaults = {};
1294
1295 // Loop through all props
1296 for(var i in pagelayer_tabs){
1297
1298 var tab = pagelayer_tabs[i];
1299
1300 for(var section in all_props[tab]){
1301
1302 var props = section in pagelayer_shortcodes[tag] ? pagelayer_shortcodes[tag][section] : pagelayer_styles[section];
1303
1304 for(var x in props){
1305
1306 if('default' in props[x]){
1307 defaults[x] = 1;
1308 }
1309
1310 // Dont set any val, but we set temp value
1311 if('no_val' in props[x]){
1312 no_val[x] = 1;
1313 }
1314
1315 if('req' in props[x] || 'show' in props[x]){
1316 var show = 'req' in props[x] ? props[x]['req'] : props[x]['show'];
1317 for(var showParam in show){
1318 var val = show[showParam];
1319 var except = showParam.substr(0, 1) == '!' ? true : false;
1320 showParam = except ? showParam.substr(1) : showParam;
1321 trigger_props[showParam] = 1;
1322 }
1323
1324 }
1325
1326 }
1327
1328 }
1329
1330 }
1331
1332 for(var x in atts){
1333
1334 // Are we to trigger change
1335 if(x in trigger_props){
1336 trigger_onchange = 1;
1337 }
1338
1339 //console.log(x+'-'+atts[x]);
1340
1341 if(x in no_val){
1342 pagelayer_set_tmp_atts(jEle, x, atts[x]);
1343 continue;
1344 }
1345
1346 // Remove the attribute if its BLANK and there is no default for it
1347 // If there is a default, we set it to blank to keep record of the current val
1348 if(atts[x].length < 1){
1349
1350 // Dont remove the value as there is a default
1351 if(!(x in defaults)){
1352 jEle.removeAttr('pagelayer-a-'+x);
1353 // Otherwise blank it
1354 }else{
1355 jEle.attr('pagelayer-a-'+x, atts[x]);
1356 }
1357
1358 // Remove the tmp atts anyway
1359 var to_del = new Array();
1360 var regexp = new RegExp('pagelayer\-tmp\-'+x, 'gi');
1361
1362 jQuery.each(jEle[0].attributes, function(index, att){
1363 if(!att) return;
1364 if(att.name.match(regexp)){
1365 to_del.push(att.name);
1366 }
1367 });
1368
1369 //console.log(to_del);
1370 for(var n in to_del){
1371 jEle.removeAttr(to_del[n]);
1372 }
1373
1374 // Set the value
1375 }else{
1376 jEle.attr('pagelayer-a-'+x, atts[x]);
1377 }
1378
1379 // Are you the active element
1380 if(pagelayer_is_active(jEle)){
1381
1382 // TODO : Record Undo and Redo
1383
1384 }
1385
1386 }
1387
1388 // Trigger the change of the parameter and show the required properties
1389 if(trigger_onchange){
1390 pagelayer_elpd_show_rows();
1391 }
1392
1393 pagelayer_isDirty = true;
1394 };
1395
1396 // This function will just set atts and not do anything else
1397 // Atts can be string or object. If its string, then val is needed
1398 function pagelayer_set_tmp_atts(jEle, atts, val){
1399
1400 if(typeof atts == 'string'){
1401 var tmp = {};
1402 tmp[atts] = val;
1403 atts = tmp;
1404 }
1405
1406 if(typeof atts != 'object'){
1407 return false;
1408 }
1409
1410 for(var x in atts){
1411 jEle.attr('pagelayer-tmp-'+x, atts[x]);
1412 }
1413
1414 };
1415
1416 // Set the att and classes of an HTML which is not yet created
1417 function pagelayer_sc_atts(classes, atts){
1418
1419 if(typeof atts != 'object'){
1420 atts = new Object();
1421 }
1422
1423 var r = new Array();
1424
1425 for(var x in atts){
1426 r.push('pagelayer-a-'+x+'="'+atts[x]+'"');
1427 }
1428
1429 return 'class="'+classes+' pagelayer-ele" '+r.join(' ');
1430 }
1431
1432 // Is the jEle the active element ?
1433 function pagelayer_is_active(jEle){
1434
1435 // Is this the active Element ?
1436 if(pagelayer_empty(pagelayer_active.el) || jEle.attr('pagelayer-id') != pagelayer_active.el.id){
1437 return false;
1438 }
1439
1440 return true;
1441
1442 };
1443
1444 // Removes {{}} from the variable name
1445 function pagelayer_var(val){
1446 return val.substring(2, (val.length - 2));
1447 }
1448
1449 // Take care of the CSS
1450 function pagelayer_css_render(css, val, seperator){
1451 //console.log('CSS '+css+' | '+val);
1452
1453 // Seperator
1454 seperator = seperator || ',';
1455
1456 // Replace the val
1457 css = css.split('{{val}}').join(val);
1458
1459 // If there is an array
1460 if(css.match(/val\[\d/)){
1461 val = val.split(seperator);
1462 for(var i in val){
1463 css = css.split('{{val['+i+']}}').join(val[i]);
1464 }
1465 }
1466
1467 //console.log('Final CSS '+css);
1468
1469 return css;
1470
1471 };
1472
1473 // Replace the variables
1474 function pagelayer_parse_vars(str, el){
1475
1476 for(var x in el.tmp){
1477 str = str.split('{{{'+x+'}}}').join(el.tmp[x]);
1478 }
1479
1480 for(var x in el.atts){
1481 str = str.split('{{'+x+'}}').join(el.atts[x]);
1482 }
1483
1484 return str;
1485 };
1486
1487 // Render the Element
1488 function pagelayer_sc_render(jEle){
1489
1490 // We render only the active element
1491 if(!pagelayer_is_active(jEle)){
1492 //return false;
1493 }
1494
1495 // Handle the CSS part
1496 // Get the id, tag, atts, data, etc
1497 var el = pagelayer_data(jEle, true);
1498 var all_props = pagelayer_shortcodes[el.tag];
1499 var elCSS = {
1500 classes: [],
1501 remove_classes: [],
1502 attr: [],
1503 remove_attr: [],
1504 css: [],
1505 edit: [],
1506 sel: '[pagelayer-id="'+el.id+'"]'
1507 };
1508
1509 // Create a reference
1510 el.CSS = elCSS;
1511
1512 //console.log(el.atts);
1513
1514 for(var i in pagelayer_tabs){
1515 var tab = pagelayer_tabs[i];
1516 for(var section in all_props[tab]){ //console.log(tab+' '+section);
1517
1518 var props = section in pagelayer_shortcodes[el.tag] ? pagelayer_shortcodes[el.tag][section] : pagelayer_styles[section];//console.log(props);
1519
1520 // Loop the props
1521 for(var x in props){
1522
1523 // pagelayer_data will return attributes even if they are BLANK e.g. attr=""
1524 // Render doesnt consider BLANK values as values, and we are unsetting them now
1525 // If in any situation you need to consider blank values, please handle in the JS / PHP function of the Shortcode
1526 if(x in el.atts && el.atts[x].length < 1){
1527 delete el.atts[x];
1528 }
1529
1530 // Any editor ?
1531 if('edit' in props[x]){
1532 elCSS.edit.push({prop: x, sel: props[x]['edit']});
1533 }
1534
1535 // Do we have a addClass ?
1536 // We are checking before the element has a value so that we can add or remove the class
1537 if('addClass' in props[x]){
1538
1539 var addClasses;
1540
1541 // Convert the string to an array
1542 if(typeof props[x]['addClass'] === 'string'){
1543 addClasses = [props[x]['addClass']];
1544 }else{
1545 addClasses = props[x]['addClass'];
1546 }
1547
1548 for(var c in addClasses){
1549
1550 // The selector
1551 var tSel = jQuery.isNumeric(c) ? '' : c;
1552
1553 // If there is a VAL
1554 // NOTE : Only val is allowed when there is a list
1555 if(addClasses[c].match(/\{\{val\}\}/) && 'list' in props[x]){
1556
1557 for(var l in props[x]['list']){
1558
1559 var tmp = {'sel': tSel, 'val': addClasses[c].replace('{{val}}', l)};
1560
1561 if(el.atts[x] == l){
1562 elCSS['classes'].push(tmp);
1563 }else{
1564 elCSS['remove_classes'].push(tmp);
1565 }
1566
1567 }
1568
1569 }else{
1570
1571 var tmp = {'sel': tSel, 'val': addClasses[c]};
1572
1573 // If the value is there
1574 if(x in el.atts){
1575 elCSS['classes'].push(tmp);
1576 }else{
1577 elCSS['remove_classes'].push(tmp);
1578 }
1579
1580 }
1581 }
1582 }
1583
1584 // Do we have a addAttr ?
1585 // We are checking before the element has a value so that we can add or remove the attr
1586 if('addAttr' in props[x]){
1587
1588 var addAttr;
1589
1590 // Convert the string to an array
1591 if(typeof props[x]['addAttr'] === 'string'){
1592 addAttr = [props[x]['addAttr']];
1593 }else{
1594 addAttr = props[x]['addAttr'];
1595 }
1596
1597 for(var c in addAttr){
1598
1599 // The selector
1600 var tSel = jQuery.isNumeric(c) ? '' : c;
1601 var tmp = {'sel': tSel, 'val': addAttr[c]};
1602
1603 // If the value is there
1604 if(x in el.atts){
1605 elCSS['attr'].push(tmp);
1606 }else{
1607 elCSS['remove_attr'].push(tmp);
1608 }
1609 }
1610 }
1611
1612 // Do we have a CSS ?
1613 if('css' in props[x]){
1614
1615 var css;
1616
1617 // Convert the string to an array
1618 if(typeof props[x]['css'] === 'string'){
1619 css = [props[x]['css']];
1620 }else{
1621 css = props[x]['css'];
1622 }
1623
1624 // Screen modes
1625 var modes = {desktop: '', tablet: '_tablet', mobile: '_mobile'};
1626
1627 for(var m in modes){
1628
1629 var xm = x+modes[m];
1630
1631 // If the value is there
1632 if(!(xm in el.atts)){
1633 continue;
1634 }
1635
1636 for(var c in css){
1637
1638 // The selector
1639 var tSel = jQuery.isNumeric(c) ? '{{element}}' : c;
1640 var tmp = {
1641 sel: tSel,
1642 val: pagelayer_css_render(css[c], el.atts[xm], (props[x].sep || ',')),
1643 };
1644
1645 // Is this a tablet
1646 if(m == 'tablet'){
1647 tmp.sel = '@media (max-width: 768px) and (min-width: 361px){'+tmp.sel;
1648 tmp.val = tmp.val+'}';
1649 }
1650
1651 // Is this a mobile mode ?
1652 if(m == 'mobile'){
1653 tmp.sel = '@media (max-width: 360px){'+tmp.sel;
1654 tmp.val = tmp.val+'}';
1655 }
1656
1657 // Push to store
1658 elCSS.css.push(tmp);
1659 }
1660
1661 }
1662
1663 }
1664
1665 }
1666
1667 }
1668
1669 }
1670
1671 // If there is an HTML, then process it
1672 if('html' in pagelayer_shortcodes[el.tag]){
1673
1674 el.iHTML = jQuery('<div>'+pagelayer_shortcodes[el.tag]['html']+'</div>');
1675
1676 // Lets process the 'if-ext'
1677 el.iHTML.find('[if-ext]').each(function (){
1678 var $j = jQuery(this);
1679 var reqvar = pagelayer_var($j.attr('if-ext'));
1680 $j.removeAttr('if-ext');
1681
1682 // Is the element there ?
1683 if(!(reqvar in el.atts && !pagelayer_empty(el.atts[reqvar]))){
1684 //console.log('HERE');
1685 $j[0].outerHTML = $j.html();
1686 }
1687
1688 });
1689
1690 // Lets process the 'if'
1691 el.iHTML.find('[if]').each(function (){
1692 var $j = jQuery(this);
1693 var reqvar = pagelayer_var($j.attr('if'));
1694 $j.removeAttr('if');
1695
1696 // Is the element there ?
1697 if(!(reqvar in el.atts && !pagelayer_empty(el.atts[reqvar]))){
1698 //console.log('HERE');
1699 $j.remove();
1700 }
1701
1702 });
1703
1704 // Is there a function to render ?
1705 var fn = window['pagelayer_render_'+jEle.attr('pagelayer-tag')];
1706
1707 if(typeof fn == 'function'){
1708 fn(el);
1709 }
1710
1711 //console.log(el.atts);
1712
1713 // Parse the variables
1714 var new_html = pagelayer_parse_vars(el.iHTML.html(), el);
1715 el.iHTML.html(new_html);
1716
1717 // Do we have to wrap the innerHTML ?
1718 if('holder' in pagelayer_shortcodes[el.tag]){
1719
1720 var hSel = pagelayer_shortcodes[el.tag]['holder'];
1721 var holder = jEle.find(hSel);
1722
1723 // Detach the holder
1724 holder.detach();
1725
1726 // Add the new HTML
1727 el.$.html(el.iHTML.html());
1728
1729 // reAttach the children only
1730 el.$.find(hSel).html(holder.children());
1731
1732 // No holder
1733 }else{
1734
1735 //console.log(el.iHTML.html());
1736 el.$.html(el.iHTML.html());
1737
1738 }
1739
1740 // Rows, Cols and Groups
1741 }else{
1742
1743 // Is there a function to render ?
1744 var fn = window['pagelayer_sc_render_'+jEle.attr('pagelayer-tag')];
1745
1746 if(typeof fn == 'function'){
1747 fn(el);
1748 }
1749
1750 }
1751
1752 // Is there a function to render after HTML insertion but before CSS and attr ?
1753 var post = window['pagelayer_render_html_'+jEle.attr('pagelayer-tag')];
1754
1755 if(typeof post == 'function'){
1756 post(el);
1757 }
1758
1759 ////////////////////////////
1760 // Are there any edit fields ?
1761 ////////////////////////////
1762
1763 if(elCSS.edit.length > 0){
1764
1765 for(var c in elCSS.edit){
1766 var prop = elCSS.edit[c]['prop'];
1767 var tSel = elCSS.edit[c]['sel'];
1768 var node = tSel.length < 1 ? jEle : jEle.find(tSel);
1769 node.attr('pagelayer-editable', prop);
1770 }
1771
1772 }
1773
1774 ////////////////////////////
1775 // Are there any addClass ?
1776 ////////////////////////////
1777
1778 // If we have any classes to add
1779 if(elCSS.classes.length > 0){
1780 //console.log(elCSS.classes);
1781
1782 for(var c in elCSS.classes){
1783 var tSel = elCSS.classes[c]['sel'];
1784 var node = tSel.length < 1 ? jEle : jEle.find(tSel);
1785 if(!node.hasClass(elCSS.classes[c]['val'])){
1786 node.addClass(elCSS.classes[c]['val']);
1787 }
1788 }
1789 }
1790
1791 // If we have any classes to remove
1792 if(elCSS.remove_classes.length > 0){
1793 //console.log(elCSS.remove_classes);
1794
1795 for(var c in elCSS.remove_classes){
1796 var tSel = elCSS.remove_classes[c]['sel'];
1797 var node = tSel.length < 1 ? jEle : jEle.find(tSel);
1798 if(node.hasClass(elCSS.remove_classes[c]['val'])){
1799 node.removeClass(elCSS.remove_classes[c]['val']);
1800 }
1801 }
1802 }
1803
1804 ////////////////////////////
1805 // Are there any addAttr ?
1806 ////////////////////////////
1807
1808 // If we have any attributes to add
1809 if(elCSS.attr.length > 0){
1810 //console.log(elCSS.attr);
1811
1812 for(var c in elCSS.attr){
1813 var tSel = elCSS.attr[c]['sel'].replace('{{element}}', '');
1814 var node = tSel.length < 1 ? jEle : jEle.find(tSel);
1815 var att = elCSS.attr[c]['val'].split('=');
1816 att[1] = pagelayer_parse_vars(att[1], el);
1817 att[1] = pagelayer_trim(att[1], '"');
1818
1819 // Is it the same val ?
1820 if(!node.attr(att[0]) != att[1]){
1821 node.attr(att[0], att[1]);
1822 }
1823 }
1824 }
1825
1826 // If we have any attributes to add
1827 if(elCSS.remove_attr.length > 0){
1828 //console.log(elCSS.remove_attr);
1829
1830 for(var c in elCSS.remove_attr){
1831 var tSel = elCSS.remove_attr[c]['sel'].replace('{{element}}', '');
1832 var node = tSel.length < 1 ? jEle : jEle.find(tSel);
1833 var att = elCSS.remove_attr[c]['val'].split('=');
1834
1835 if(node.is('['+att[0]+']')){
1836 node.removeAttr(att[0]);
1837 }
1838 }
1839 }
1840
1841 // The style element
1842 var style = pagelayer.$('[pagelayer-style-id='+el.id+']');
1843
1844 // If we have any RULES CSS, then handle it
1845 if(elCSS.css.length > 0){
1846
1847 // Did we find it ?
1848 if(style.length < 1){
1849 jEle.prepend('<style pagelayer-style-id="'+el.id+'"></style>');
1850 }
1851
1852 // Get it again
1853 style = pagelayer.$('[pagelayer-style-id='+el.id+']');
1854
1855 // Make the rules
1856 var rules = [];
1857
1858 // Loop
1859 for(var c in elCSS.css){
1860 var tSel = elCSS.css[c]['sel'].replace('{{element}}', elCSS.sel);
1861 var rule = pagelayer_parse_vars(elCSS.css[c]['val'], el);
1862 rules.push(tSel+'{'+rule+'}');
1863 }
1864
1865 // Set the style
1866 style.html(rules.join("\n"));
1867 //console.log(style);
1868 }else{
1869 style.remove();
1870 }
1871
1872 // Is there a function to render at the end ?
1873 var end = window['pagelayer_render_end_'+jEle.attr('pagelayer-tag')];
1874
1875 if(typeof end == 'function'){
1876 end(el);
1877 }
1878
1879 // If the element have any parent
1880 var par = pagelayer_get_parent(jEle);
1881 if(par){
1882 pagelayer_sc_render(pagelayer_ele_by_id(par));
1883 }
1884
1885 };
1886
1887 // Is the given tag a group
1888 function pagelayer_is_group(tag){
1889
1890 if('has_group' in pagelayer_shortcodes[tag] && !pagelayer_empty(pagelayer_shortcodes[tag]['has_group'])){
1891 return true;
1892 }
1893
1894 return false;
1895
1896 }
1897
1898 // Save the post
1899 function pagelayer_save(){
1900
1901 var post = pagelayer_generate_sc(".entry-content");//alert(post);return;
1902 var pagelayerajaxurl = pagelayer_ajax_url+'?action=pagelayer_save_content&postID='+pagelayer_postID;
1903 jQuery.ajax({
1904 type: "POST",
1905 url: pagelayerajaxurl,
1906 data: {
1907 pagelayer_update_content : post,
1908 nonce: pagelayer_ajax_nonce
1909 },
1910 success: function(response, status, xhr){
1911 //alert(data);
1912 var obj = jQuery.parseJSON(response);
1913 //alert(obj);
1914 if(obj['error']){
1915 alert(obj['error']);
1916 }else{
1917 pagelayer_isDirty = false;
1918 alert(obj['success']);
1919 }
1920 },
1921 error: function(errorThrown){
1922 console.log(errorThrown);
1923 }
1924 });
1925
1926 };
1927
1928 //Close the Editor
1929 function pagelayer_close(){
1930 if(pagelayer_isDirty == true){
1931 var r = confirm('Your Data has not been Saved yet! \n Press OK to stay on the Page.'+
1932 '\n Press Cancel to Close Editor. ');
1933 if(r == false){
1934 window.top.location.href = pagelayer_returnURL;
1935 }
1936 }else{
1937 window.top.location.href = pagelayer_returnURL;
1938 }
1939 };
1940
1941 // Generate Shortcode Post to save
1942 function pagelayer_generate_sc(selector){
1943
1944 var txt = '';
1945
1946 jQuery(selector).children(".pagelayer-ele-wrap").each(function(){
1947
1948 var jEle = jQuery(this).children('.pagelayer-ele');
1949
1950 // The ID
1951 var id = jEle.attr('pagelayer-id');
1952
1953 // If there is an Add element wrapper
1954 if(pagelayer_empty(id)){
1955 return;
1956 }
1957
1958 // Find the type of tag
1959 var tag = jEle.attr('pagelayer-tag');
1960
1961 // Is there an innerHTML ele
1962 var inner = '';
1963 if('innerHTML' in pagelayer_shortcodes[tag]){
1964 inner = pagelayer_shortcodes[tag]['innerHTML'];
1965 }
1966
1967 // Create the tag
1968 var data = '['+tag;
1969
1970 // Get the attributes to store
1971 jQuery.each(jEle[0].attributes, function(i, attrib){
1972 var res = attrib.name.match(/^pagelayer-a-(.+)/i);
1973 if(res && res[1] != inner){
1974 //console.log(attrib.name+' '+res[1]);
1975 data += ' '+res[1]+'="'+pagelayer_escapeHTML(attrib.value)+'"';
1976 }
1977 });
1978
1979 data = data+']';
1980
1981 // Add to the text
1982 txt = txt+data+"\n";
1983
1984 // Any internal function to handle the save ?
1985 var func = window['pagelayer_tag_'+tag];
1986 if(typeof func == 'function'){
1987
1988 var content = '';
1989 content = func(jEle);
1990
1991 if(content.length > 0){
1992 txt = txt+content;
1993 }
1994
1995 // If its a Row or Column or Group then it will have children
1996 }else if(jEle.hasClass('pagelayer-row') || jEle.hasClass('pagelayer-col') || pagelayer_is_group(tag)){
1997
1998 var sel = "[pagelayer-id="+id+"]";
1999
2000 // Any holder which holds children ?
2001 if('holder' in pagelayer_shortcodes[tag]){
2002 sel = sel+' '+pagelayer_shortcodes[tag]['holder'];
2003 }
2004
2005 var childrens = pagelayer_generate_sc(sel);
2006 if(childrens.length > 0){
2007 txt = txt+childrens;
2008 }
2009
2010 // Its a normal element so we might need to handle the content
2011 }else{
2012
2013 var content = '';
2014 if(inner.length > 0){
2015 content = jEle.attr('pagelayer-a-'+inner);
2016 if(!content){
2017 content = '';
2018 }
2019 }else{
2020 content = '';//jEle.html();
2021 }
2022
2023 if(content.length > 0){
2024 txt = txt+content;
2025 }
2026
2027 }
2028
2029 // Close the tag
2030 txt = txt+"[/"+tag+"]\n";
2031
2032 });
2033
2034 return txt;
2035
2036 };
2037
2038 // Escape charaters in attributes
2039 var pagelayer_escapeChars = {
2040 '\\]' : '#93',
2041 '\\[' : '#91',
2042 //'=' : '#61',
2043 '<' : 'lt',
2044 '>' : 'gt',
2045 '"' : 'quot',
2046 //'&' : 'amp',
2047 '\'' : '#39'
2048 };
2049
2050 // To unescape
2051 var pagelayer_unescapeChars = {
2052 '#93' : ']',
2053 '#91' : '[',
2054 //'#61' : '=',
2055 'lt' : '<',
2056 'gt' : '>',
2057 'quot' : '"',
2058 //'amp' : '&',
2059 '#39' : '\''
2060 };
2061
2062 var pagelayer_escaperegex_S = '[';
2063 for(var key in pagelayer_escapeChars) {
2064 pagelayer_escaperegex_S += key;
2065 }
2066 pagelayer_escaperegex_S += ']';
2067
2068 var pagelayer_escaperegex = new RegExp( pagelayer_escaperegex_S, 'g');
2069
2070 // The function which escapes everything
2071 function pagelayer_escapeHTML(str) {
2072 return str.replace(pagelayer_escaperegex, function(m) {
2073 if(m == '[' || m == ']') m = '\\'+m;
2074 return '&' + pagelayer_escapeChars[m] + ';';
2075 });
2076 };
2077
2078 // This will unescape everything
2079 function pagelayer_unescapeHTML(str){
2080 return str.replace(/\&([^;]+);/g, function (entity, entityCode) {
2081 if(entityCode in pagelayer_unescapeChars){
2082 return pagelayer_unescapeChars[entityCode];
2083 }else{
2084 return entity;
2085 }
2086 });
2087 };
2088
2089 // Sets up the leftbar
2090 function pagelayer_leftbar(){
2091
2092 // Toggle the holder
2093 pagelayer.$$('.pagelayer-leftbar-toggle').on('click', function(){
2094 pagelayer.$$('.pagelayer-leftbar-table').toggle();
2095 });
2096
2097 var html = '<div class="pagelayer-leftbar">'+
2098 '<div class="pagelayer-leftbar-scroll">'+
2099 '<div class="pagelayer-shortcodes">'+
2100 '<div class="pagelayer-leftbar-search">'+
2101 '<input class="pagelayer-search-field" />'+
2102 '</div>';
2103
2104 for(var x in pagelayer_groups){
2105
2106 // Title
2107 html += '<div class="pagelayer-leftbar-group"><h5>'+x+'</h5>';
2108
2109 // Indivdual icon
2110 for(var y in pagelayer_groups[x]){
2111
2112 var sc = pagelayer_groups[x][y];
2113
2114 if('not_visible' in pagelayer_shortcodes[sc]){
2115 continue;
2116 }
2117
2118 html += '<div class="pagelayer-shortcode-drag" draggable="true" pagelayer-tag="'+sc+'">'+
2119 '<div class="pagelayer-sc">'+
2120 '<center class="pagelayer-shortcode-inner">';
2121
2122 if('icon' in pagelayer_shortcodes[sc]){
2123 html += '<i class="pagelayer-shortcode fa fa-'+pagelayer_shortcodes[sc]['icon']+'"></i>';
2124 }else{
2125 html += '<i class="pagelayer-shortcode pagelayer-'+sc+'"></i>';
2126 }
2127
2128 html += '</center>'+
2129 '<span class="pagelayer-shortcode-text">'+pagelayer_shortcodes[sc]['name']+'</span>'+
2130 '</div>'+
2131 '</div>';
2132
2133 }
2134
2135 html += '</div>';
2136
2137 }
2138
2139 html += '</div>'+
2140 '<div id="pagelayer-elpd" class="pagelayer-elpd"></div>'+
2141 '</div>'+
2142 '</div>';
2143
2144 pagelayer.$$('.pagelayer-leftbar-holder').prepend(html);
2145
2146 pagelayer.$$('.pagelayer-leftbar-scroll').slimScroll({
2147 height: '100%',
2148 railVisible: false,
2149 alwaysVisible: true,
2150 color: '#000',
2151 size: '5px',
2152 });
2153
2154 // Hide the ones which are not supposed to be shown
2155 pagelayer.$$('.pagelayer-search-field').on('input', function(){
2156
2157 var val = jQuery(this).val();
2158 var re = new RegExp(val, 'i');
2159
2160 // Show only the required tags
2161 pagelayer.$$('.pagelayer-leftbar-group').each(function(){
2162
2163 var group = jQuery(this);
2164 var res = group.find('[pagelayer-tag]');
2165 var hidden = 0;
2166
2167 res.each(function(){
2168
2169 var tEle = jQuery(this);
2170 if(tEle.find('.pagelayer-shortcode-text').html().match(re)){
2171 tEle.show();
2172 }else{
2173 hidden += 1;
2174 tEle.hide();
2175 }
2176
2177 });
2178
2179 // Hide the whole group
2180 if(hidden == res.length){
2181 group.hide();
2182 }else{
2183 group.show();
2184 }
2185
2186 });
2187 });
2188
2189 };
2190
2191 // Report an error
2192 function pagelayer_error(error, func){
2193 var prefix = func || '';
2194 alert(prefix+error);
2195 };
2196
2197 function pagelayer_bottombar(){
2198 var holder = pagelayer.$$('.pagelayer-bottombar-holder');
2199 var html = '<div class="pagelayer-bottombar">'+
2200 '<div class="pagelayer-bottombar-rightbuttons">'+
2201 '<button class="pagelayer-update-button">Update</button>'+
2202 '<button class="pagelayer-close-button">Close</button>'+
2203 '<div class="pagelayer-mode-wrapper">'+
2204 '<i class="pagelayer-mode-button fa fa-desktop"></i>'+
2205 '<div class="pagelayer-mode-buttons-wrapper">'+
2206 '<i class="screen-mode fa fa-desktop" pagelayer-mode-data="desktop"></i>'+
2207 '<i class="screen-mode fa fa-tablet" pagelayer-mode-data="tablet"></i>'+
2208 '<i class="screen-mode fa fa-mobile" pagelayer-mode-data="mobile"></i>'+
2209 '</div>'+
2210 '</div>'+
2211 '</div>'+
2212 '</div>';
2213
2214 holder.html(html);
2215 holder.find('.pagelayer-update-button').on('click', function(){
2216 pagelayer_save();
2217 });
2218 holder.find('.pagelayer-close-button').on('click', function(){
2219 pagelayer_close();
2220 });
2221 holder.find('.screen-mode').on('click', function(){
2222 var screen_mode = jQuery(this).attr('pagelayer-mode-data');
2223 pagelayer_set_screen_mode(screen_mode);
2224 holder.find('.pagelayer-mode-buttons-wrapper').toggle();
2225 });
2226
2227 holder.find('.pagelayer-mode-button').on('click', function(){
2228 holder.find('.pagelayer-mode-buttons-wrapper').toggle();
2229 });
2230 }
2231
2232
2233 ///////////////////////////////
2234 // Miscellaneuos Functions
2235 ///////////////////////////////
2236
2237 // Generates a random string of "n" characters
2238 function pagelayer_randstr(n, special){
2239 var text = '';
2240 var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
2241
2242 special = special || 0;
2243 if(special){
2244 possible = possible + '&#$%@';
2245 }
2246
2247 for(var i=0; i < n; i++){
2248 text += possible.charAt(Math.floor(Math.random() * possible.length));
2249 }
2250
2251 return text;
2252 };
2253
2254 function pagelayer_update_site_title(val){
2255 if(!pagelayer_empty(val)){
2256 var site_name = jQuery('.pagelayer-wp-title').attr('pagelayer-a-site_name');
2257 if(!pagelayer_empty(site_name)){
2258 var site_title = jQuery.ajax({
2259 url: pagelayer_ajax_url+'?action=pagelayer_fetch_site_title',
2260 type: 'post',
2261 async: false
2262 }).responseText;
2263
2264 if(site_title != site_name){
2265 var site_title = jQuery.ajax({
2266 url: pagelayer_ajax_url+'?action=pagelayer_update_site_title',
2267 type: 'post',
2268 data: {'site_title': site_name},
2269 async: false
2270 }).responseText;
2271 }
2272 }
2273 }
2274 }
2275
2276 function pagelayer_trim(str, charlist){
2277 // discuss at: http://locutus.io/php/trim/
2278
2279 if(typeof str != 'string'){
2280 return str;
2281 }
2282
2283 var whitespace = [' ', '\n', '\r', '\t', '\f', '\x0b', '\xa0', '\u2000', '\u2001', '\u2002', '\u2003', '\u2004', '\u2005', '\u2006', '\u2007', '\u2008', '\u2009', '\u200a', '\u200b', '\u2028', '\u2029', '\u3000' ].join('')
2284 var l = 0
2285 var i = 0
2286 str += ''
2287
2288 if (charlist) {
2289 whitespace = (charlist + '').replace(/([[\]().?/*{}+$^:])/g, '$1')
2290 }
2291
2292 l = str.length
2293 for (i = 0; i < l; i++) {
2294 if (whitespace.indexOf(str.charAt(i)) === -1) {
2295 str = str.substring(i)
2296 break
2297 }
2298 }
2299
2300 l = str.length
2301 for (i = l - 1; i >= 0; i--) {
2302 if (whitespace.indexOf(str.charAt(i)) === -1) {
2303 str = str.substring(0, i + 1)
2304 break
2305 }
2306 }
2307
2308 return whitespace.indexOf(str.charAt(0)) === -1 ? str : ''
2309 };
2310
2311 // Convert the regular URL of a Video to a Embed URL
2312 function pagelayer_video_url(src){
2313
2314 var youtubeRegExp = /youtube\.com|youtu\.be/;
2315 var vimeoRegExp = /vimeo\.com/;
2316 var match = '';
2317 var videoId = '';
2318
2319 if (youtubeRegExp.exec(src)) {
2320 match = 'youtube';
2321 } else if (vimeoRegExp.exec(src)) {
2322 match = 'vimeo';
2323 }
2324
2325 switch(match){
2326 case 'youtube':
2327
2328 var youtubeRegExp1 = /youtube\.com/;
2329 var youtubewatch = /watch/;
2330 var youtubeembed = /embed/;
2331 var youtube = /youtu\.be/;
2332
2333 if (youtubeRegExp1.exec(src)) {
2334
2335 if (youtubewatch.exec(src)) {
2336 videoId = src.split('?v=');
2337
2338 } else if (youtubewatch.exec(src)) {
2339 videoId = src.split('embed/');
2340 }
2341
2342 } else if (youtube.exec(src)) {
2343 videoId = src.split('.be/');
2344 }
2345
2346 return '//youtube.com/embed/'+videoId[1];
2347
2348 break;
2349
2350 case 'vimeo':
2351
2352 var vimeoplayer = /player\.vimeo\.com/;
2353 var vimeovideo = /video/;
2354
2355 if (vimeoplayer.exec(src) && vimeovideo.exec(src)) {
2356 videoId = src.split('video/');
2357 } else if (vimeoRegExp.exec(src)) {
2358 videoId = src.split('.com/');
2359 }
2360
2361 return '//player.vimeo.com/video/'+videoId[1];
2362
2363 break;
2364 default:
2365 return src;
2366 }
2367 };
2368
2369 // Add widget section
2370 function pagelayer_add_widget(){
2371
2372 html='<div class="pagelayer-add-widget-area">'+
2373 '<i class="pagelayer-add-row fa fa-plus-circle"></i>'+
2374 '<p>Click here to add new row OR drag widgets</p>'+
2375 '</div>';
2376
2377 jQuery('.entry-content').append(html);
2378
2379 var add_area = jQuery('.pagelayer-add-widget-area');
2380
2381 // Add a code before this
2382 var add_sc = function(tag){
2383
2384 // Create Row
2385 var row = jQuery('<div pagelayer-tag="pl_row"></div>');
2386 add_area.before(row);
2387 var row_id = pagelayer_onadd(row, false);
2388 var rEle = pagelayer_ele_by_id(row_id);
2389
2390 if(tag == 'pl_row'){
2391 rEle.click();
2392 return row_id;
2393 }
2394
2395 // Create Column
2396 var col = jQuery('<div pagelayer-tag="pl_col"></div>');
2397 rEle.find('.pagelayer-row-holder').append(col);
2398 var col_id = pagelayer_onadd(col, false);
2399 var cEle = pagelayer_ele_by_id(col_id);
2400
2401 if(tag == 'pl_col'){
2402 cEle.click();
2403 return col_id;
2404 }
2405
2406 // Create element
2407 var ele = jQuery('<div pagelayer-tag="'+tag+'"></div>');
2408 cEle.find('.pagelayer-col-holder').append(ele);
2409 var id = pagelayer_onadd(ele);
2410
2411 // Ensure the column is not empty
2412 pagelayer_empty_col(cEle.find('.pagelayer-col-holder'));
2413
2414 return id;
2415
2416 }
2417
2418 // Handle Click
2419 add_area.on('click', function(){
2420 add_sc('pl_col');
2421 });
2422
2423 // Handle Drag over
2424 add_area.on('dragover', function(e){
2425 //console.log(e)
2426 add_area.addClass('pagelayer-add-widget-drag');
2427 });
2428
2429 // Handle Drag Leave
2430 add_area.on('dragleave', function(e){
2431 //console.log(e)
2432 add_area.removeClass('pagelayer-add-widget-drag');
2433 });
2434
2435 // Handle On Drop
2436 add_area.on('drop', function(e){
2437
2438 //console.log(e);
2439 //console.log(e.originalEvent.dataTransfer.getData('tag'));
2440 add_area.removeClass('pagelayer-add-widget-drag');
2441 jQuery('.pagelayer-is-dragging').removeClass('pagelayer-is-dragging');
2442
2443 var tag = e.originalEvent.dataTransfer.getData('tag');
2444
2445 // Is it an existing element ?
2446 if(tag.length < 1){
2447 return false;
2448 }
2449
2450 e.preventDefault();
2451
2452 //console.log(tag);
2453
2454 add_sc(tag);
2455 });
2456 }
2457