Вход Регистрация
Файл: concrete5.7.5.6/concrete/js/build/core/app/edit-mode/block.js
Строк: 711
<?php
(function (window, $, _Concrete) {
    
'use strict';

    
/**
     * Block's element
     * @param {jQuery}   elem      The blocks HTML element
     * @param {EditMode} edit_mode The EditMode instance
     */
    
var Block Concrete.Block = function Block(elemedit_modepeper) {
        
this.init.apply(this_(arguments).toArray());
    };

    
Block.prototype = {

        
init: function blockInit(elemedit_modepeper) {
            var 
my this;
            
elem.data('Concrete.block'my);

            if (!
elem.children('.ccm-block-cover').length) {
                $(
'<div/>').addClass('ccm-block-cover').appendTo(elem);
            }

            
Concrete.createGetterSetters.call(my, {
                
idelem.data('block-id'),
                
activetrue,
                
handleelem.data('block-type-handle'),
                
areaIdelem.data('area-id'),
                
cIDelem.data('cid'),
                
wraps: !!elem.data('block-type-wraps'),
                
areanull,
                
elemelem,
                
draggernull,
                
draggerOffset: {x0y0},
                
draggerPosition: {x0y0},
                
draggingfalse,
                
rotationDeg0,
                
editModeedit_mode,
                
selectednull,
                
stepIndex0,
                
peperpeper || elem
                    
.children('.ccm-edit-mode-inline-commands, .ccm-custom-style-container')
                    .
find('a[data-inline-command="move-block"]'),
                
pepSettings: {}
            });

            
my.id my.getId();

            
_(my.getPepSettings()).extend({
                
deferPlacementtrue,
                
moveTo: function () {
                    
my.dragPosition(this);
                },
                
initiate: function blockDragInitiate(eventpep) {
                    
my.pepInitiate.call(mythiseventpep);
                },
                
drag: function blockDrag(eventpep) {
                    
my.pepDrag.call(mythiseventpep);
                },
                
start: function blockDragStart(eventpep) {
                    
my.pepStart.call(mythiseventpep);
                },
                
stop: function blockDragStop(eventpep) {
                    
my.pepStop.call(mythiseventpep);
                },
                
placefalse
            
});

            
my.bindEvent('EditModeSelectableContender', function (edata) {
                if (
my.getDragging() && data instanceof Concrete.DragArea) {
                    
my.setSelected(data);
                } else {
                    if (
my.getDragging()) {
                        
my.setSelected(null);
                    }
                }
            });

            
my.getPeper().click(function (e) {
                
e.preventDefault();
                
e.stopPropagation();
                return 
false;
            }).
pep(my.getPepSettings());
        },

        
/**
         * This is fired when the object is destroyed and needs to be unbound.
         */
        
destroy: function blockDestroy() {
            
this.getPeper().unbind();
            $.
pep.unbind(this.getPeper());
            
this.setAttr('active'false);
        },

        
bindEvent: function blockBindEvent(eventhandler) {
            return 
Concrete.EditMode.prototype.bindEvent.apply(this_(arguments).toArray());
        },

        
getContainer: function blockGetActualElement() {
            var 
current this.getElem();
            while (!
current.parent().hasClass('ccm-area-block-list') && !current.parent().is('[data-area-id]')) {
                if (!
current.parent().length) {
                    break;
                }
                
current current.parent();
            }
            return 
current;
        },

        
addToDragArea: function blockAddToDragArea(drag_area) {
            var 
my this,
                
sourceArea my.getArea(),
                
targetArea drag_area.getArea(),
                
selected_blockwrapper;

            
sourceArea.removeBlock(my);

            
my.getContainer().remove();
            if (
my.getWraps()) {
                
wrapper = $(targetArea.getBlockTemplate()());
                
drag_area.getElem().after(wrapper);
                if (
wrapper.children().length) {
                    
wrapper.find('div.block').replaceWith(my.getElem());
                } else {
                    
wrapper.append(my.getElem());
                }
            } else {
                
drag_area.getElem().after(my.getElem());
            }
            
selected_block drag_area.getBlock();
            if (
selected_block) {
                
drag_area.getArea().addBlock(myselected_block);
            } else {
                
drag_area.getArea().addBlockToIndex(my0);
            }
            
my.getPeper().pep(my.getPepSettings());

            
my.getEditMode().scanBlocks();
            
Concrete.event.fire('EditModeBlockMove', {
                
blockmy,
                
sourceAreasourceArea,
                
targetAreatargetArea
            
});
        },

        
handleAddResponse: function blockHandleAddResponse(responseareaafter_blockonComplete) {
            var 
my this,
                
arEnableGridContainer area.getEnableGridContainer() ? 0;

            if (
response.error) {
                return;
            }
            $.
get(CCM_DISPATCHER_FILENAME '/ccm/system/block/render',
                {
                    
arHandleresponse.arHandle,
                    
cIDresponse.cID,
                    
bIDresponse.bID,
                    
arEnableGridContainerarEnableGridContainer
                
}, function (html) {
                    if (
after_block) {
                        
after_block.getContainer().after(html);
                    } else {
                        
area.getBlockContainer().prepend(html);
                    }
                    $.
fn.dialog.hideLoader();
                    
_.defer(function () {
                        
my.getEditMode().scanBlocks();
                        
my.showSuccessfulAdd();
                        
Concrete.forceRefresh();

                        if (
onComplete) {
                            
onComplete();
                        }
                    });
                });
            return 
true;
        },

        
showSuccessfulAdd: function blockShowSuccessfulAdd() {
            
ConcreteAlert.notify({
                
'message'ccmi18n.addBlockMsg,
                
'title'ccmi18n.addBlock
            
});
        },

        
delete: function blockDelete(msg) {
            var 
my thisbID my.getId(),
                
area my.getArea(),
                
block area.getBlockByID(bID),
                
cID my.getCID(),
                
arHandle area.getHandle();

            
ConcreteToolbar.disableDirectExit();
            
area.removeBlock(block);
            
ConcreteAlert.notify({
                
'message'ccmi18n.deleteBlockMsg,
                
'title'ccmi18n.deleteBlock
            
});

            $.
ajax({
                
type'POST',
                
urlCCM_DISPATCHER_FILENAME,
                
data'cID=' cID '&ccm_token=' CCM_SECURITY_TOKEN '&isAjax=true&btask=remove&bID=' bID '&arHandle=' encodeURIComponent(arHandle)
            });
        },

        
/**
         * replaces a block in an area with a new block by ID and content
         */
        
replace: function blockReplace(content) {
            var 
new_block_elem = $(content);

            
this.getContainer().replaceWith(new_block_elem);

            
this.getArea().scanBlocks();
            return 
this.getArea().getBlockByID(this.getId());
        },

        
getMenuElem: function blockGetMenuElem() {
            var 
my this;
            return $(
'div.ccm-edit-mode-block-menu'this.getElem()).first();
        },

        
bindMenu: function blockBindMenu() {
            var 
my this,
                
elem my.getElem(),
                
menuHandle elem.attr('data-block-menu-handle'),
                
$menuElem my.getMenuElem();

            if (
menuHandle !== 'none') {

                var 
menu_config = {
                    
'highlightClassName''ccm-block-highlight',
                    
'menuActiveClass''ccm-block-highlight',
                    
'menu'$menuElem
                
};

                if (
my.getArea() && my.getArea().getElem().hasClass('ccm-global-area')) {
                    
menu_config.menuActiveClass += " ccm-global-area-block-highlight";
                    
menu_config.highlightClassName += " ccm-global-area-block-highlight";
                }

                
my.setAttr('menu', new ConcreteMenu(elemmenu_config));

                
$menuElem.find('a[data-menu-action=edit_inline]').unbind('click.core').on('click.core', function (event) {
                    
Concrete.event.fire('EditModeBlockEditInline', {blockmyeventevent});
                });

                
$menuElem.find('a[data-menu-action=block_scrapbook]').unbind('click.core').on('click.core', function (event) {
                    
Concrete.event.fire('EditModeBlockAddToClipboard', {blockmyeventeventtoken: $(this).data('token')});
                });

                
$menuElem.find('a[data-menu-action=delete_block]').unbind('click.core').on('click.core', function (event) {
                    
Concrete.event.fire('EditModeBlockDelete', {
                        
message: $(this).attr('data-menu-delete-message'),
                        
blockmy,
                        
eventevent
                    
});
                });

                
$menuElem.find('a[data-menu-action=block_design]').unbind('click.core').on('click.core', function (e) {
                    
e.preventDefault();
                    
Concrete.event.fire('EditModeBlockEditInline', {
                        
blockmyeventeactionCCM_DISPATCHER_FILENAME '/ccm/system/dialogs/block/design'
                    
});
                });
            }
        },

        
setArea: function blockSetArea(area) {
            
this.setAttr('area'area);

            var 
my this;
            
my.getElem().find('a[data-menu-action=block_dialog]').each(function () {
                var 
href = $(this).data('menu-href');
                
href += (href.indexOf('?') !== -1) ? '&cID=' my.getCID() : '?cID=' my.getCID();
                
href += '&arHandle=' encodeURIComponent(area.getHandle()) + '&bID=' my.getId();
                $(
this).attr('href'href).dialog();
            });

            
my.bindMenu();
        },

        
/**
         * Custom dragger getter, create dragger if it doesn't exist
         * @return {jQuery} dragger
         */
        
getDragger: function blockgetDragger() {
            var 
my this;

            if (!
my.getAttr('dragger')) {
                var 
dragger = $('<a />')
                        .
html(my.getElem().data('dragging-avatar') || ('<p><img src="/concrete/blocks/content/icon.png"><span>' ccmi18n.content '</span></p>'))
                        .
addClass('ccm-block-edit-drag ccm-panel-add-block-draggable-block-type')
                    ;
                
my.setAttr('dragger'dragger.css({
                    
widthmy.getElem().width(),
                    
heightmy.getElem().height()
                }));
            }
            return 
my.getAttr('dragger');
        },

        
/**
         * Apply cross-browser compatible transformation
         * @param  {[String]} transformation String containing the css matrix
         * @return {Boolean}                 Success, always true
         */
        
transform: function blockTransform(transformationmatrix) {
            var 
my this;
            var 
element my.getDragger().css({
                
'-webkit-transform'transformation,
                
'-moz-transform'transformation,
                
'-ms-transform'transformation,
                
'-o-transform'transformation,
                
'transform'transformation
            
}).get(0);

            
// Modified transformie polyfill
            
if (element.filters && !!element.filters['DXImageTransform.Microsoft.Matrix']) {
                var 
matrix_shim = {
                    
elements_(matrix).groupBy(function(vkey) { return Math.floor(key 3); })
                };
                
element.filters['DXImageTransform.Microsoft.Matrix'].M11 matrix_shim.elements[0][0];
                
element.filters['DXImageTransform.Microsoft.Matrix'].M12 matrix_shim.elements[0][1];
                
element.filters['DXImageTransform.Microsoft.Matrix'].M21 matrix_shim.elements[1][0];
                
element.filters['DXImageTransform.Microsoft.Matrix'].M22 matrix_shim.elements[1][1];
                
element.style.left = -(element.offsetWidth 2) + (element.clientWidth 2) + 'px';
                
element.style.top = -(element.offsetHeight 2) + (element.clientHeight 2) + 'px';
            }
            return 
true;
        },

        
resetTransform: function blockResetTransform() {
            var 
transformation '';
            var 
element this.getDragger().css({
                
top0,
                
left0,
                
'-webkit-transform'transformation,
                
'-moz-transform'transformation,
                
'-ms-transform'transformation,
                
'-o-transform'transformation,
                
'transform'transformation
            
}).get(0);

            if (
element.filters) {
                
element.filters = [];
            }

            
this.setDraggerPosition({x0y0});
            return 
this.renderPosition();
        },

        
/**
         * Quick method to multiplty matrices, modified from a version on RosettaCode
         * @param  {Array}  matrix1 Array containing a matrix
         * @param  {Array}  matrix2 Array containing a matrix
         * @return {Array}          Array containing a matrix
         */
        
multiplyMatrices: function blockMultiplyMatrices(matrix1matrix2) {
            var 
result = [];
            for (var 
0matrix1.lengthi++) {
                
result[i] = [];
                for (var 
0matrix1[0].lengthj++) {
                    var 
sum 0;
                    for (var 
0matrix1[0].lengthk++) {
                        
sum += matrix1[i][k] * matrix2[k][j];
                    }
                    
result[i][j] = sum;
                }
            }
            return 
result;
        },

        
/**
         * Convert matrix to CSS value
         * @param  {Array}  matrix Array containing a matrix
         * @return {String}        CSS string
         */
        
matrixToCss: function blockMatrixToCss(matrix) {
            var 
precision 4multiplier Math.pow(10precision), round = function (number) {
                return 
Math.round(number multiplier) / multiplier;
            };
            
matrix[0] = _(matrix[0]).map(round);
            
matrix[1] = _(matrix[1]).map(round);
            var 
css_arr = [matrix[0][0], matrix[0][1], matrix[1][0], matrix[1][1], matrix[0][2], matrix[1][2]];
            return 
'matrix(' css_arr.join(',') + ')';
        },

        
/**
         * Method to run after dragging stops for 50ms
         * @return {Boolean} Success, always true.
         */
        
endRotation: function blockEndRotation() {
            var 
my this;
            var 
start_rotation my.getRotationDeg();
            
my.getDragger().animate({rotation0}, {
                
duration1step: function () {
                }
            });
            var 
step_index my.setStepIndex(my.getStepIndex() + 1);
            
my.getDragger().animate({rotationmy.getRotationDeg()}, {
                
queuefalseduration150step: function (now) {
                    if (
my.getStepIndex() !== step_index) {
                        return;
                    }
                    
my.setRotationDeg(start_rotation now);
                    
my.renderPosition();
                }
            }, 
'easeOutElastic');
            return 
true;
        },

        
/**
         * Render the dragger in the correct position.
         * @return {Boolean} Success, always true.
         */
        
renderPosition: function blockRenderPosition() {
            var 
my this;

            var 
my.getDraggerPosition().xmy.getDraggerPosition().ymy.getRotationDeg() * (Math.PI 180);

            var 
cos _.bind(Math.cosMath),
                
sin _.bind(Math.sinMath);
            var 
position_matrix = [
                [
10x],
                [
01y],
                [
001]
            ], 
rotation_matrixfinal_matrix;
            if (
a) {
                
rotation_matrix = [
                    [
cos(a), sin(a), 0],
                    [-
sin(a), cos(a), 0],
                    [
001]
                ];
                
final_matrix my.multiplyMatrices(position_matrixrotation_matrix);
            } else {
                
final_matrix position_matrix;
            }
            return 
this.transform(my.matrixToCss(final_matrix), final_matrix);
        },

        
/**
         * Position the dragger
         * @param  {Event}   event The triggering event
         * @param  {Pep}     pep   The pep instance
         * @return {Boolean}       Success, always true
         */
        
dragPosition: function blockDragPosition(pep) {
            var 
my this;

            
my.setRotationDeg(Math.max(-15Math.min(15pep.velocity().15)));
            
my.endRotation();
            var 
position _.last(pep.velocityQueue), offset my.getDraggerOffset();
            if (!
position) {
                
position = {xmy.getDragger().offset().leftymy.getDragger().offset().top};
            }
            var 
position.offset.xposition.offset.y;
            
my.setDraggerPosition({xxyy});
            
my.renderPosition();

            return 
true;
        },

        
pepInitiate: function blockPepInitiate(contexteventpep) {
            var 
my this;
            
my.resetTransform();
            
my.setDragging(true);
            
my.getDragger().hide().appendTo(window.document.body).css(my.getElem().offset());
            
my.setDraggerOffset({
                
xevent.clientX my.getElem().offset().left window.document.body.scrollLeft,
                
yevent.clientY my.getElem().offset().top window.document.body.scrollTop
            
});
            
my.getDragger().fadeIn(250);

            
_.defer(function () {
                
Concrete.event.fire('EditModeBlockDragInitialization', {blockmypeppepeventevent});
            });
        },
        
pepDrag: function blockPepDrag(contexteventpep) {
            var 
my this;
            
_.defer(function () {
                
Concrete.event.fire('EditModeBlockDrag', {blockmypeppepeventevent});
            });
        },
        
pepStart: function blockPepStart(contexteventpep) {
            var 
my this;
            
my.resetTransform();

            var 
elem my.getElem(),
                
mouse_position = {xevent.pageXyevent.pageY},
                
elem_position = {
                    
xelem.offset().left,
                    
yelem.offset().top
                
},
                
mouse_percentage = {
                    
x: (elem_position.mouse_position.x) / elem.width(),
                    
y: (elem_position.mouse_position.y) / elem.height()
                };

            
my.setDraggerPosition({xelem_position.xyelem_position.y});
            
my.renderPosition();

            
my.setDraggerOffset({
                
x: -* (mouse_percentage.elem.width()),
                
y: -* (mouse_percentage.elem.height())
            });

            
my.getDragger().animate({
                
width90,
                
height90
            
}, {
                
duration250,
                
step: function (nowfx) {
                    
my.setDraggerOffset({
                        
x: -* (mouse_percentage.* $(this).width()),
                        
y: -* (mouse_percentage.* $(this).height())
                    });
                    
my.dragPosition(pep);
                }
            });

            
_.defer(function () {
                
Concrete.event.fire('EditModeBlockDragStart', {blockmypeppepeventevent});
            });
        },

        
pepStop: function blockPepStop(contexteventpep) {
            var 
my thisdrag_area;
            
my.getDragger().stop(1);
            
my.getDragger().css({top0left0});
            
my.dragPosition(pep);

            if ((
drag_area my.getSelected())) {
                
my.addToDragArea(drag_area);
            }

            
my.animateToElem();

            
_.defer(function () {
                
Concrete.event.fire('EditModeBlockDragStop', {blockmypeppepeventevent});
            });
        },

        
animateToElem: function blockAnimateToElem(element) {
            var 
my thiselem element || my.getElem(), dragger_start = {
                
xmy.getDraggerPosition().x,
                
ymy.getDragger().offset().top,
                
widthmy.getDragger().width(),
                
heightmy.getDragger().height()
            };
            
my.setDragging(false);
            
my.getDragger().animate({ccm_perc0}, {
                
duration0step: function () {
                }
            }).
animate({
                
ccm_perc1,
                
opacity0
            
}, {
                
duration500,
                
step: function (nowfx) {
                    if (
fx.prop === 'ccm_perc') {
                        var 
end_pos = {
                            
xelem.offset().left,
                            
yelem.offset().top,
                            
widthelem.width(),
                            
heightelem.height()
                        }, 
change = {
                            
x: (end_pos.dragger_start.x) * now,
                            
y: (end_pos.dragger_start.y) * now,
                            
width: (end_pos.width dragger_start.width) * now,
                            
height: (end_pos.height dragger_start.height) * now
                        
};

                        
my.setDraggerPosition({
                            
xdragger_start.change.x,
                            
ydragger_start.change.y
                        
});
                        
my.renderPosition();

                        
my.getDragger().css({
                            
widthdragger_start.width change.width,
                            
heightdragger_start.height change.height
                        
});
                    } else {
                        
my.getDragger().css({
                            
opacitynow
                        
});
                    }
                },
                
complete: function () {
                    
my.getDragger().remove();
                    
my.setAttr('dragger'null);
                }
            });
        }
    };


}(
windowjQuery_Concrete));
?>
Онлайн: 1
Реклама