Вход Регистрация
Файл: concrete5.7.5.6/concrete/js/build/core/layouts.js
Строк: 782
<?php
/**
 * Free-Form Layouts
 */
(function (global, jQuery) {

    
// plugins
    
jQuery.fn.concreteLayout = function (options) {
        return 
this.each(function () {
            var 
$obj = $(this);
            var 
data $obj.data('concreteLayout');
            if (!
data) {
                
$obj.data('concreteLayout', (data = new ConcreteLayout(thisoptions)));
            }
        });
    };

    
// initialization
    
var ConcreteLayout = function (elementoptions) {
        
this.options = $.extend({
            
'toolbar''#ccm-layouts-toolbar',
            
'btnsave''#ccm-layouts-save-button',
            
'btncancel''#ccm-layouts-cancel-button',
            
'editing'false,
            
'supportsgrid'false,
            
'gridrowtmpid''ccm-theme-grid-temp',
            
'additionalGridColumnClasses'''
        
}, options);

        
this.$element = $(element);
        
this.$toolbar = $(this.options.toolbar);

        
this._setupDOM();
        
//this._activatePresets();
        
this._setupToolbarView();
        
this._setupFormSaveAndCancel();
        
this._setupFormEvents();

        
this._updateChooseTypeForm();
    };

    
// private methods
    
ConcreteLayout.prototype._setupDOM = function () {
        
// form list items
        
this.$formviews this.$toolbar.find('li[data-grid-form-view]');
        
this.$formviewcustom this.$toolbar.find('li[data-grid-form-view=custom]');
        
this.$formviewthemegrid this.$toolbar.find('li[data-grid-form-view=themegrid]');

        
// choosetype option
        
this.$selectgridtype this.$toolbar.find('select[name=gridType]');

        
// choosetype + custom
        
this.$selectcolumnscustom this.$toolbar.find('input[type=text][name=columns]');
        
this.$customspacing this.$toolbar.find('input[name=spacing]');
        
this.$customautomatedfrm this.$toolbar.find('input[name=isautomated]');
        
this.$customautomated this.$toolbar.find('[data-layout-button=toggleautomated]');

        
// choosetype + themegrid
        
this.$selectgridcolumns this.$toolbar.find('input[type=text][name=themeGridColumns]');

        
// all
        
this.$savebtn this.$toolbar.find(this.options.btnsave);
        
this.$cancelbtn this.$toolbar.find(this.options.btncancel);
        
this.$slider false;
    };

    
ConcreteLayout.prototype._setupFormSaveAndCancel = function () {
        var 
obj this;
        
this.$cancelbtn.unbind().on('click', function () {
            
obj.$toolbar.remove();
            
ConcreteEvent.unsubscribe('EditModeExitInlineComplete.layouts');
            
ConcreteEvent.on('EditModeExitInlineComplete.layouts', function (edata) {
                
obj._rescanAreasInPage(edata);
            });
            
ConcreteEvent.fire('EditModeExitInline');
        });
        
this.$savebtn.unbind().on('click', function () {
            
Concrete.event.fire('EditModeExitInlineSaved');

            
// move the toolbar back into the form so it submits. so great.
            
obj.$toolbar.hide().prependTo('#ccm-block-form');
            $(
'#ccm-block-form').submit();
            
ConcreteEvent.unsubscribe('EditModeExitInlineComplete.layouts');
            
ConcreteEvent.on('EditModeExitInlineComplete.layouts', function (edata) {
                
obj._rescanAreasInPage(edata);
            });
        });
    };

    
ConcreteLayout.prototype._rescanAreasInPage = function (edata) {
        var 
editor Concrete.getEditMode();
        
editor.reset();
        
editor.scanBlocks();
    };

    
ConcreteLayout.prototype._setupToolbarView = function () {
        var 
obj this;
        
this.$formviews.each(function (i) {
            if ($(
this).attr('data-grid-form-view') != obj.options.formview) {
                $(
this).hide();
            }
        });
    };

    
ConcreteLayout.prototype._updateChooseTypeForm = function () {
        var 
typeval this.$selectgridtype.find('option:selected').val();
        var 
obj this;
        if (
obj.options.editing) {
            
obj.$selectgridtype.prop('disabled'true);
        }
        switch (
typeval) {
            case 
'FF':
                
this.$formviewthemegrid.hide();
                
this.$formviewcustom.show();
                
this._updateCustomView();
                break;
            case 
'TG':
                
this.$formviewcustom.hide();
                
this.$formviewthemegrid.show();
                
this._updateThemeGridView();
                break;
            default: 
// a preset
                
if (this.options.editing) {
                    return;
                }
                var 
arLayoutPresetID typeval;
                
this._resetSlider();
                
jQuery.fn.dialog.showLoader();
                var 
url CCM_DISPATCHER_FILENAME '/ccm/system/dialogs/area/layout/presets/get/' CCM_CID '/' arLayoutPresetID;
                $.
getJSON(url, function (r) {
                    
obj.$formviewthemegrid.hide();
                    
obj.$formviewcustom.hide();
                    
obj.$element.html(r.html);

                    
obj.$element.append($('<input />', {
                        
'name''arLayoutPresetID',
                        
'type''hidden',
                        
'value'arLayoutPresetID
                    
}));

                    
jQuery.fn.dialog.hideLoader();
                });
                break;
        }
    };


    
ConcreteLayout.prototype._setupFormEvents = function () {
        var 
obj this;
        
this.$selectcolumnscustom.on('keyup', function () {
            
obj._updateCustomView();
        });
        
this.$customspacing.on('keyup', function () {
            
obj._updateCustomView();
        });
        
this.$customautomatedfrm.on('change', function () {
            
obj._updateCustomView();
        });
        
this.$customautomated.on('click', function () {
            if ($(
this).parent().hasClass('ccm-inline-toolbar-icon-selected')) {
                $(
this).parent().removeClass('ccm-inline-toolbar-icon-selected');
                
obj.$customautomatedfrm.val(0);
            } else {
                $(
this).parent().addClass('ccm-inline-toolbar-icon-selected');
                
obj.$customautomatedfrm.val(1);
            }
            
obj.$customautomatedfrm.trigger("change");
            return 
false;
        });
        
this.$selectgridcolumns.on('keyup', function () {
            
obj._updateThemeGridView();
        });
        
this.$selectgridtype.on('change', function () {
            
obj._updateChooseTypeForm();
        });
    };

    
ConcreteLayout.prototype.buildThemeGridGrid = function () {
        
this.$element.html('');

        var 
row this.options.rowstart;
        
row += '<div id="ccm-theme-grid-edit-mode-row-wrapper">';

        var 
columnSpans this._getThemeGridColumnSpan(this.columns);
        $.
each(columnSpans, function (ispanInfo) {
            
// get the class at the starting rowspan
            
var columnHTML '<div id="ccm-edit-layout-column-' '" class="' spanInfo.cssClass ' ccm-theme-grid-column" data-offset="0" data-span="' spanInfo.value '"><div class="ccm-layout-column-highlight"><input type="hidden" id="ccm-edit-layout-column-offset-' '" name="offset[' ']" value="0" /><input type="hidden" id="ccm-edit-layout-column-span-' '" name="span[' ']" value="' spanInfo.value '" /></div></div>';
            
// now, sometimes we might need to set the next column to a smaller amount
            
row += columnHTML;
        });

        
row += '</div>';
        
row += this.options.rowend;
        
this.$element.append(row);
    };

    
ConcreteLayout.prototype._updateThemeGridView = function (presetLoad) {

        if (!
presetLoad) {
            
this.$selectgridtype.find('option[value=TG]').prop('selected'true);
        }

        
// load the current elements from forms
        
this.columns parseInt(this.$selectgridcolumns.val());
        
this.maxcolumns parseInt(this.$selectgridcolumns.attr('data-maximum'));

        if (!
this.options.editing) {
            
this.buildThemeGridGrid();
        } else {
            
this.$selectgridcolumns.prop('disabled'true);
        }

        
this._resetSlider();

        if (
this.columns 1) {
            
this._showThemeGridSlider();
        }
    };

    
ConcreteLayout.prototype._buildThemeGridGridFromPresetColumns = function (arLayoutColumns) {
        
this.$element.html('');
        var 
obj this;
        var 
row this.options.rowstart;
        
row += '<div id="ccm-theme-grid-edit-mode-row-wrapper">';
        $.
each(arLayoutColumns, function (icolumn) {
            var 
columnHTML '<div id="ccm-edit-layout-column-' '" class="ccm-theme-grid-column" ' +
                
'data-offset="' column.arLayoutColumnOffset '" data-span="' column.arLayoutColumnSpan '"><div class="ccm-layout-column-highlight">' +
                
'<input type="hidden" id="ccm-edit-layout-column-offset-' '" name="offset[' ']" value="' column.arLayoutColumnOffset +
                
'" /><input type="hidden" id="ccm-edit-layout-column-span-' '" name="span[' ']" value="' column.arLayoutColumnSpan +
                
'" /></div></div>';

            
// now, sometimes we might need to set the next column to a smaller amount
            
row += columnHTML;
        });
        
row += '</div>';
        
row += this.options.rowend;
        
this.$element.append(row);

        
this.columns arLayoutColumns.length;
        
this.maxcolumns parseInt(this.$selectgridcolumns.attr('data-maximum'));

        
this._resetSlider();
        
this._redrawThemeGrid();
        
this._showThemeGridSlider();
    };

    
// This actually takes care of drawing the grid.
    
ConcreteLayout.prototype._updateCustomView = function (presetLoad) {
        
// if it's presetLoad, that means we're updating the view from the first time
        // after loading a preset. In which case we don't switch away from presets in the gridtype dropdown
        // Otherwise, we DO switch away to show that we're not going to use that preset.
        
if (!presetLoad) {
            
this.$selectgridtype.find('option[value=FF]').prop('selected'true);
        }

        
// load custom view settings
        
this.columns parseInt(this.$selectcolumnscustom.val());
        
this.customspacing this.$customspacing.val();
        
this.automatedcustomlayout this.$customautomatedfrm.val() == 1;
        
this.columnwidths = [];

        
// set relevant forms based on the settings
        /*
         if (this.columns < 2) {
         this.$customspacing.prop('disabled', true);
         this.$customautomated.prop('disabled', true);
         } else {
         this.$customspacing.prop('disabled', false);
         this.$customautomated.prop('disabled', false);
         }
         */
        
if (this.options.editing) {
            
this.$selectcolumnscustom.prop('disabled'true);
        }

        
// redraw the content view.
        
if (!this.options.editing) {
            
this.$element.html('');
        }
        for (
0this.columnsi++) {
            if (
this.options.editing) {
                if ($(
'#ccm-edit-layout-column-' i).length 0) {
                    continue;
                }
            }
            var 
$column = $('<div />').attr('class''ccm-layout-column');
            
$column.attr('id''ccm-edit-layout-column-' i);
            var 
$highlight = $('<div />').attr('class''ccm-layout-column-highlight');
            
$highlight.append($('<input />', {
                
'name''width[' ']',
                
'type''hidden',
                
'id''ccm-edit-layout-column-width-' i
            
}));
            
$column.append($highlight);
            
this.$element.append($column);
        }

        
// now we remove unused columns
        
var $columns this.$element.find('.ccm-layout-column');
        if (
this.columns $columns.length) {
            for (
columns$columns.lengthi++) {
                $(
'#ccm-edit-layout-column-' i).remove();
            }
        }

        
// now we handle spacing
        
for (0this.columnsi++) {
            
$highlight = $('#ccm-edit-layout-column-' ' .ccm-layout-column-highlight');
            if (
0) {
                
$highlight.css('margin-left', (this.customspacing 2) + 'px');
            }
            if ((
1) < this.columns) {
                
$highlight.css('margin-right', (this.customspacing 2) + 'px');
            }
            
$column = $('#ccm-edit-layout-column-' i);
            if (
$column.attr('data-width')) {
                var 
width $column.attr('data-width') + 'px';
                
this.columnwidths.push(parseInt($column.attr('data-width')));
            } else {
                var 
width = (100 this.columns) + '%';
            }
            
$column.css('width'width);
        }

        
this._resetSlider();

        if ((!
this.automatedcustomlayout) && this.columns 1) {
            
this._showCustomSlider();
        }
    };

    
ConcreteLayout.prototype._resetSlider = function () {
        if (
this.$slider) {
            
this.$slider.slider('destroy');
            
this.$slider false;
        }

        if ($(
"#ccm-area-layout-active-control-bar").hasClass('ccm-area-layout-control-bar-add')) {
            $(
'#ccm-area-layout-active-control-bar').css('height''0px');
        }
    };

    
ConcreteLayout.prototype._getThemeGridColumnSpan = function (totalColumns) {
        var 
rowspan Math.ceil(this.maxcolumns totalColumns);
        
// create the starting array
        
var spanArray = [], i;
        for (
0totalColumnsi++) {
            
spanArray[i] = rowspan;
        }
        var 
rowspantotal rowspan totalColumns;
        for (
0< (rowspantotal this.maxcolumns); i++) {
            var 
index spanArray.length 1;
            
spanArray[index]--;
        }

        var 
cssclasses = [];
        for (
0spanArray.lengthi++) {
            
cssclasses[i] = {};
            
cssclasses[i].cssClass this.options.gridColumnClasses[spanArray[i] - 1];
            if (
this.options.additionalGridColumnClasses) {
                
cssclasses[i].cssClass cssclasses[i].cssClass ' ' this.options.additionalGridColumnClasses;
            }
            
cssclasses[i].value spanArray[i];
        }
        return 
cssclasses;
    };

    
ConcreteLayout.prototype._getThemeGridNearestValue = function (valuevalues) {
        var 
nearest null;
        var 
diff null;
        $.
each(values, function () {
            if (
nearest == null || Math.abs(this value) < Math.abs(nearest value)) {
                
nearest this;
            }
        });

        return 
nearest;
    };

    
ConcreteLayout.prototype._showThemeGridSlider = function () {

        var 
obj this;

        
obj.$slider = $('#ccm-area-layout-active-control-bar');
        
obj.$slider.css('height''6px');

        
// set the breakpoints
        
var breaks = [];
        for (
0obj.columnsi++) {
            
$column = $('#ccm-edit-layout-column-' i);
            if (
== 0) {
                
// this is the first column so we only get the end
                
breaks.push(Math.floor($column.width()));
            } else if ((
1) == obj.columns) {
                
breaks.push(Math.floor($column.position().left));
            } else {
                
breaks.push(Math.floor($column.position().left));
                
breaks.push(Math.floor($column.width()) + Math.floor($column.position().left));
            }

        }

        
// set the valid widths
        
var tw = $('#ccm-area-layout-active-control-bar').width();
        var 
sw 0;
        var 
validStartPoints = [];
        var 
validEndPoints = [];

        var 
maxColumns obj.options.maxcolumns;
        var 
minColumnClass obj.options.gridColumnClasses[0];

        var 
test_container = $('#ccm-theme-grid-edit-mode-row-wrapper').closest('.ccm-block-edit-layout, .ccm-layouts-edit-mode-add');
        if (!
test_container.length) {
            
test_container = $('#ccm-theme-grid-edit-mode-row-wrapper');
        }

        var 
test_container_div = $('<div />', {'id'obj.options.gridrowtmpid}).appendTo(test_container);
        var 
columnHTML '';
        for (
1<= maxColumnsi++) {
            if (
obj.options.additionalGridColumnClasses) {
                
columnHTML += '<div class="' minColumnClass ' ' obj.options.additionalGridColumnClasses '"><br><br></div>'
            
} else {
                
columnHTML += '<div class="' minColumnClass '"><br><br></div>'
            
}
        }


        var 
grid_elem obj.options.rowstart
            
columnHTML
            
obj.options.rowend;

        
test_container_div.append(
            $(
grid_elem)
        );
        var 
marginModifier 0;
        for (var 
0maxColumnsi++) {
            var 
$column test_container_div.find('.' minColumnClass).eq(i);
            if (
== 0) {
                var 
pl $column.position().left;
                if (
pl 0) {
                    
marginModifier Math.abs(pl); // handle stupid grids that have negative margin starters
                
}
            }
            
// handle the START of every column
            
validStartPoints.push(Math.floor($column.position().left marginModifier));

            
// handle the END of every column
            
validEndPoints.push(Math.floor(Math.floor($column.width()) + Math.floor($column.position().left) + marginModifier));
        }
        
test_container_div.remove();

        
obj.$slider.slider({
            
min0,
            
maxtw,
            
step1,
            
valuesbreaks,

            
slide: function (eui) {

                if (
obj.$selectgridtype.val() != 'TG') {
                    
obj.$selectgridtype.find('option[value=TG]').prop('selected'true);
                }

                var 
index = $(ui.handle).index();
                var 
pointsToCheck;

                if ((
index 2) == 0) {
                    
pointsToCheck validEndPoints;
                } else {
                    
pointsToCheck validStartPoints;
                }

                
// now we normalize the pointsToCheck – we go through each value in the breaks
                // array and we ensure that the corresponding value in the pointsToCheck array
                // actually matches exactly.
                
for (var 0breaks.lengthx++) {
                    for (var 
0pointsToCheck.lengthy++) {
                        var 
diff Math.abs(breaks[x] - pointsToCheck[y]);
                        if (
diff <= 2) {
                            
pointsToCheck[y] = breaks[x];
                        }
                    }
                }

                var 
oldValue obj.$slider.slider('values'index);
                var 
newValue obj._getThemeGridNearestValue(ui.valuepointsToCheck);

                
// now we determine whether we CAN go there or is it going to encroach upon another point.
                
var proceed true;
                $.
each(ui.values, function (ivalue) {
                    if (
newValue >= value && index i) {
                        
proceed false;
                    } else if (
newValue <= value && index i) {
                        
proceed false;
                    }
                });

                
// now we only proceed if proceed is set to true and the values don't match
                
if (proceed && oldValue == newValue) {
                    
proceed false;
                }

                if (
proceed) {
                    
obj.$slider.slider('values'indexnewValue);
                    if ((
index 2) == 0) {
                        
Math.floor(index 2);
                        
// we are a righthand handle
                        
$innercolumn = $('#ccm-edit-layout-column-' i);
                        var 
span parseInt($innercolumn.attr('data-span'));
                        var 
$offsetcolumn $innercolumn.nextAll('.ccm-theme-grid-column:first');
                        var 
offset $offsetcolumn.attr('data-offset');
                        if (
offset) {
                            
offset parseInt(offset);
                        } else {
                            
offset 0;
                        }
                        if (
newValue oldValue) { // we are making the column bigger
                            
span++;
                            
offset--;
                        } else {
                            
span--;
                            
offset++;
                        }
                    } else {
                        
// we are a righthand handle
                        
var Math.ceil(index 2);
                        
$innercolumn = $('#ccm-edit-layout-column-' i);
                        var 
span parseInt($innercolumn.attr('data-span'));
                        var 
$offsetcolumn $innercolumn;
                        var 
offset $offsetcolumn.attr('data-offset');
                        if (
offset) {
                            
offset parseInt(offset);
                        } else {
                            
offset 0;
                        }
                        if (
newValue oldValue) { // we are making the column bigger
                            
span++;
                            
offset--;
                        } else {
                            
span--;
                            
offset++;
                        }
                    }
                    
$offsetcolumn.attr('data-offset'offset);
                    
$innercolumn.attr('data-span'span);
                    
obj._redrawThemeGrid();
                }
                return 
false;

            }
        });
    };

    
ConcreteLayout.prototype._redrawThemeGrid = function () {
        var 
obj this;
        
obj.$element.find('.ccm-theme-grid-offset-column').remove();
        $.
each(obj.$element.find('.ccm-theme-grid-column'), function (icol) {
            var 
$col = $(col);
            
$col.removeClass();
            if (
$col.attr('data-span')) {
                var 
spandex parseInt($col.attr('data-span')) - 1;
                
$col.addClass(obj.options.gridColumnClasses[spandex]);
                if (
obj.options.additionalGridColumnClasses) {
                    
$col.addClass(obj.options.additionalGridColumnClasses);
                }
                
// change the span value inside
            
}
            if (
parseInt($col.attr('data-offset')) > 0) {
                var 
offdex parseInt($col.attr('data-offset')) - 1;
                var 
offsetColumnClass obj.options.gridColumnClasses[offdex] + ' ccm-theme-grid-offset-column';
                if (
obj.options.additionalGridColumnOffsetClasses) {
                    
offsetColumnClass offsetColumnClass ' ' obj.options.additionalGridColumnOffsetClasses;
                }
                $(
'<div />', {'data-offset-column'true}).html('&nbsp;').addClass(offsetColumnClass).insertBefore($col);
            }
            $(
'#ccm-edit-layout-column-offset-' i).val(parseInt($col.attr('data-offset')));
            $(
'#ccm-edit-layout-column-span-' i).val(parseInt($col.attr('data-span')));
            
$col.addClass('ccm-theme-grid-column');
            if (
obj.options.editing) {
                
$col.addClass('ccm-theme-grid-column-edit-mode');
            }
        });
    };

    
ConcreteLayout.prototype._showCustomSlider = function () {

        
this.$slider = $('#ccm-area-layout-active-control-bar');
        
this.$slider.css('height''6px');

        var 
breaks = [],
            
sw 0,
            
tw Math.floor(this.$slider.width()),
            
$columns this.$element.find('.ccm-layout-column'),
            
i;

        if (
this.columnwidths.length 0) {
            
// we have custom column widths
            
for (0< (this.columnwidths.length 1); i++) {
                
sw += this.columnwidths[i];
                
breaks.push(sw);
            }
        } else {
            var 
cw tw this.columns;
            for (
1this.columnsi++) {
                
sw += cw;
                
breaks.push(sw);
            }
        }

        var 
obj this;

        
this.$slider.slider({
            
min0,
            
maxtw,
            
step1,
            
valuesbreaks,
            
create: function (eui) {
                var 
createoffset 0;
                var 
breakwidths = [];

                $.
each($columns, function (icol) {
                    var 
bw breaks[i], value;
                    if ((
1) == $columns.length) {
                        
// last column
                        
value tw createoffset;
                    } else {
                        
value bw createoffset;
                    }
                    
value Math.floor(value);
                    $(
col).find('#ccm-edit-layout-column-width-' i).val(value);
                    
createoffset bw;
                });
            },

            
slide: function (eui) {

                if (
obj.$selectgridtype.val() != 'FF') {
                    
obj.$selectgridtype.find('option[value=FF]').prop('selected'true);
                }

                var 
lastvalue 0,
                    
proceed true;

                $.
each(ui.values, function (ivalue) {
                    if (
value lastvalue) {
                        
proceed false;
                    }
                    
lastvalue value;
                });

                if (
proceed) {
                    
lastvalue 0;
                    $.
each($columns, function (icol) {
                        var 
value;

                        if ((
1) == $columns.length) {
                            
// last column
                            
value tw lastvalue;
                        } else {
                            
value ui.values[i] - lastvalue;
                        }
                        
value Math.floor(value);
                        $(
col).find('#ccm-edit-layout-column-width-' i).val(value);
                        $(
col).css('width'value 'px');
                        
lastvalue ui.values[i];
                    });
                } else {
                    return 
false;
                }
            }
        });

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