Вход Регистрация
Файл: static/plugins/base/js/component_drag_and_drop.js
Строк: 854
<?php
componentDragAndDrop 
= function( prototypeObject ) {

    for ( var 
prop in prototypeObject ) {

        if ( 
this[prop] !== undefined ) {
            
this['parent_' + prop] = this[prop];
        }

        
this[prop] = prototypeObject[prop];
    }

}


componentDragAndDrop.prototype = {

    
prepare: function()
        {
            
PEEP.WidgetPanel = this;
        var 
self = this;

        
this.sectionSelector = '.place_section';
        
this.$panel = $('#place_components');
        
this.$sections = $(this.sectionSelector);
        
this.$clonablePanel = $('#clonable_components');
        
this.transfered = false;

        
this.defaultSettings = {

            
placeholder: 'hidden-placeholder',
            
connectWith: this.sectionSelector,

            
helper: function(e, ui) {
                return 
self.getHelper(this, e, ui);
            },

            
start: function(e, ui) {
                return 
self.handlStart(this, e, ui);
            },

            
stop: function(e, ui) {
                
self.handleStop(this, e, ui);
                
self.complete();
            },

            
beforeStop: function(e, ui) {
                if (
ui.item.parent().hasClass('peep_dnd_locked_section'))
                {
                    $(
this).sortable('cancel');
                    
self.handleStop(this, e, ui);
                }
            }
        };

        
this.events = {
                
complete: [],
                
update: [],
                clone: [],
                
remove: [],
                
loadSettings: [],
                
saveSettings: [],
                
saveScheme: [],
                
moveToPanel: [],
                
reload: [],
                
cloneComplete: [],
                        
move: []
        };
    },

    
initialize: function() {
        
this.initializePanel();
        
this.initializeSections();
        
this.initializeActions();
        
this.initializeClonablePnael();
        
this.initializeScheme();
    },

    
setHandler: function(handler) {

        
this.bind('update', function(section, state) {
            
handler.changeState(section, state);
        });

        
this.bind('complete', function(successFunction) {
            
handler.complete(successFunction);
        });

        
this.bind('clone', function(section, stack, id, success) {
            
handler.clone(section, stack, id, success);
        });

        
this.bind('remove', function(id) {
            
handler.remove(id);
        });

        
this.bind('loadSettings', function(id, successFunction) {
            
handler.loadSettings(id, successFunction);
        });

        
this.bind('saveSettings', function(id, settings, successFunction) {
            
handler.saveSettings(id, settings, successFunction);
        });

        
this.bind('saveScheme', function(scheme) {
            
handler.saveScheme(scheme);
        });

        
this.bind('moveToPanel', function(cmpId) {
            
handler.moveToPanel(cmpId);
        });

            
this.bind('reload', function(cmpId, renderView, successFunction)
            {
                
handler.reload(cmpId, renderView, successFunction);
            });
    },

    
initializePanel: function() {

        var 
self = this;
        var 
panelSettings = this.extendSettings({
            
stop: function(e, ui) {
                if ( !
self.transfered ) {
                    $(
this).sortable('cancel');
                    
self.handleStop(this, e, ui);
                    return;
                }
                
self.handleStop(this, e, ui);
                
self.complete();
                
self.actionComplete();
            },

            
over: function(e, ui) {
                
ui.placeholder.removeClass('peep_dnd_placeholder');
                
ui.placeholder.addClass('placeholder-hidden');
            }
        });

        
this.$panel.sortable(panelSettings).disableSelection();
    },

    
initializeSections: function() {
        var 
self = this;
        var 
sectionSettings = this.extendSettings({
            
cancel: '.peep_dnd_freezed',
            
items: '.component:not(.peep_dnd_freezed)',
            
receive: function(e, ui){
                if (
ui.placeholder.hasClass('peep_dnd_placeholder')) {
                    
self.transfered = true;
                }
            },

            
over: function(e, ui){
                
ui.placeholder.removeClass('placeholder-hidden');
                
ui.placeholder.addClass('peep_dnd_placeholder');
            },

            
change: function(e, ui) {
               
self.handleSectionChange(this, e, ui);
            },

            
update: function(e, ui) {
                if (
ui.item.cloning && self.transfered) {
                    
ui.item.clone = self.clone(this, ui.item);
                } else {
                    
self.update(this);
                }

            }

        });

        
this.$sections.sortable(sectionSettings).disableSelection();
    },


    
initializeClonablePnael: function() {
        var 
self = this;
        var 
settings = this.extendSettings({

            
stop: function(e, ui) {
                if (
self.transfered) {
                    
self.handleClone(this, e, ui);
                    
ui.item.cloning = false;
                    
self.complete();
                }

                $(
this).sortable('cancel');
                
//self.handleStop(this, e, ui);
                
self.actionComplete();
            },

            
start: function(e, ui){
                 
self.handlStart(this, e, ui);
                 $(
ui.item).css('opacity', '1');
                 
ui.item.cloning = true;
            },

            
over: function(e, ui) {
                
ui.placeholder.removeClass('peep_dnd_placeholder');
                
ui.placeholder.addClass('placeholder-hidden');
            }

        });

        
this.$clonablePanel.sortable(settings).disableSelection();
    },


    
initializeActions: function() {
        var 
self = this;

        var 
$allContainers = this.$sections.add(this.$panel);

        
$allContainers.find('.component').hover(function(){
            $(
this).find('.action').show();
        }, function(){
            $(
this).find('.action').hide();
        });

        
this.$sections.find('.dd_delete').unbind().click(function() {
           var 
$component = $(this).parents('.component:eq(0)');
           
self.deleteFromSection($component);
        });

        
this.$panel.find('.dd_edit').unbind().click(function() {
           var 
$component = $(this).parents('.component:eq(0)');

           
self.showSettings($component);

           return 
false;
        });

        
this.$sections.find('.dd_edit').unbind().click(function() {
           var 
$component = $(this).parents('.component:eq(0)');

           
self.showSettings($component);

           return 
false;
        });

        
this.$panel.find('.dd_delete').unbind().click(function() {
           if ( !
confirm( PEEP.getLanguageText('base', 'widgets_delete_component_confirm') ) ) {
               return 
false;
           }

           var 
$component = $(this).parents('.component:eq(0)');
           if (!
$component.hasClass('clone')) {
               return 
false;
           }
           
self.deleteFromPanel($component.attr('id'));
           
self.handleRemoveFromPanel($component);
        });
    },

    
initializeScheme: function() {
        var 
$sliderNode = $('.peep_dnd_slider');
        if (!
$sliderNode.length) {
            return;
        }
        var 
self = this;
        var 
$left = $('.left_section', '#place_sections');
        var 
$right = $('.right_section', '#place_sections');

        
$sliderNode.schemeSwitcher({
            
change: function(event){

                
$left.removeClass( $(event.lastMarker).attr('dd_leftclass') )
                    .
addClass( $(event.marker).attr('dd_leftclass') );
                
$right.removeClass( $(event.lastMarker).attr('dd_rightclass') )
                .
addClass( $(event.marker).attr('dd_rightclass') );

            },

            
update: function(event){
                var 
schemeId = $(event.marker).attr('peep_scheme');
                
self.changeScheme(schemeId);
            }
        });
    },

    
changeScheme: function( schemeId ) {
        
this.trigger('saveScheme', [schemeId]);
    },

    
actionComplete: function() {
        
this.enableSections($('.place_section', '#place_sections '));
        
this.initializeActions();
    },

    
/* Animation */

    
getHelper: function(sortable, e, ui) {
        var 
itemWidth = ui.outerWidth();

        if (
itemWidth > 160)
        {
            var 
k = 160 / ui.outerWidth();
            var 
offsetWindow = ui.offset();
            var 
offset = k * (e.pageX - offsetWindow.left);

            $(
sortable).sortable( 'option', 'cursorAt', {left: offset } );
        }

        return $(
'<div class="peep_dnd_helper" style="width: 160px; height: 30px"></div>');
    },

    
handlStart: function(sortable, e, ui) {
        
this.transfered = false;
        $(
ui.item).show().css('opacity', '0.3');

        var 
within = $(ui.item).attr('peep_avaliable_sections');
        if (
typeof within == 'undefined') {
            return;
        }

        var 
withinItmes = within.split(',');
        var 
lockSelectors = [];

        $.
each(withinItmes, function (i, item){
            var 
str = '.' + item + '_section';
            
lockSelectors.push(str);
        });
        var 
selector = lockSelectors.join(',');

        
this.disableSections($('.place_section:not(' + selector + ')', '#place_sections '));
    },

    
handleStop: function(sortable, e, ui)
    {
        var 
$item = $(ui.item);
        
this.enableSections($('.place_section', '#place_sections '));
        
$item.show().css('opacity', '1');

        var 
event = {};
        var 
toSection = $item.parents(this.sectionSelector);
        var 
fromSection = $(sortable);

        
event.widgetName = $item.attr('id');
        
event.widget = $item;
        
event.to = {
            
section: toSection,
            
sectionName: toSection.attr('peep_place_section')
        };
        
event.from = {
            
section: fromSection,
            
sectionName: fromSection.attr('peep_place_section')
        };
        
event.ui = ui;
        
event.originalEvent = e;

        
this.trigger('move', [event]);
    },

    
handleClone: function(sortable, e, ui) {
        
ui.item.after(ui.item.clone);
        $(
ui.item.clone).show().css('opacity', '1');
        $(
sortable).sortable('cancel');
        
this.handleStop(sortable, e, ui);
    },

    
handleSectionChange: function(sortable, e, ui)
    {
        var 
id = $(ui.item).attr('id');
        var 
$ph = $(ui.placeholder);

        if ( 
$ph.next().is('#' + id) || $ph.prev().is('#' + id)    ) {
                
$ph.removeClass('peep_dnd_placeholder');
                
$ph.addClass('hidden-placeholder');
        }
        else {
                
$ph.removeClass('hidden-placeholder');
                
$ph.addClass('peep_dnd_placeholder');
        }
    },

    
handleRemoveFromSection: function($item, completeFnc) {
        var 
self = this;
        
$item.find('.action').hide();
        
$item.removeClass('peep_dnd_freezed');
        
$item.fadeOut('fast', function(){
            
$item.appendTo(self.$panel);
            
self.actionComplete();
            
$item.fadeIn('fast', completeFnc);
        });

    },

    
handleRemoveFromPanel: function($item) {
        
$item.fadeOut('fast');
    },

    
disableSections: function($sections) {
        $.
each($sections, function(i, item) {
            $(
item).addClass('peep_dnd_locked_section');
        });
    },

    
enableSections: function($sections) {
        $.
each($sections, function(i, item){
            $(
item).removeClass('peep_dnd_locked_section');
        });
    },

    
/* / Animation */

    
deleteFromSection: function($item) {
         var 
self = this;
         var 
sortable = $item.parents(this.sectionSelector).get(0);
         
this.handleRemoveFromSection($item, function(){
            
self.update(sortable);
            
self.trigger('moveToPanel', [$item.attr('id')]);
            
self.complete();
         });

    },

    clone: function(
sortable, $cloningItem) {

        var 
self = this;
        var 
sourceId = $cloningItem.attr('id');
        var 
stack = $(sortable).sortable('toArray');
        var 
section = $(sortable).attr('peep_place_section');
        var 
$destItem = $cloningItem.clone().removeAttr('id').addClass('clone');

        
self.trigger('clone', [section, stack, sourceId, function(id){
            
$destItem.attr('id', id);
            
self.trigger('cloneComplete', [id]);
        }]);
        return 
$destItem;
    },

    
deleteFromPanel: function(id) {
        
this.trigger('remove', [id]);
    },

    
update: function(sortable) {

        var 
$selfNode = $(sortable);
        var 
section = $selfNode.attr('peep_place_section');
        var 
stack = [];
        
$selfNode.find('.component').each(function(){
            
stack.push(this.id);
        });

        
this.changeState(section, stack);
    },

    
changeState: function(sectionName, itemStack) {
        
this.trigger('update', [
            
sectionName,
            
itemStack
        
]);
    },

    
complete: function(successFunction) {
            
this.trigger('complete', [successFunction]);
    },

    
showSettings: function($component)
    {
        var 
self = this;
        var 
$title = $('.settings_title', '#fb_settings');
        var 
$content = $('.settings_content', '#fb_settings').addClass('peep_preloader_content');

        var 
$controls = $('.settings_controls', '#fb_settings');
        
$controls.find('input.dd_save').unbind();

        
this.settingBox = new PEEP_FloatBox({
            
$title: $title,
            
$contents: $content,
            
$controls: $controls,
            
width: 500
        
});

        
this.settingBox.bind('close', function(){
            
$content.empty();
        });
        var 
cmpId = $component.attr('id');
        
this.trigger('loadSettings', [cmpId, function(settingMarkup){
                
$content.empty();
                
$content.removeClass('peep_preloader_content');
                var 
$settingMarkup = $('<form class="settings_form">' + settingMarkup.content + '</form>');
                
$content.html($settingMarkup);

                if (
settingMarkup.styleSheets) {
                    $.
each(settingMarkup.styleSheets, function(i, o){
                        
PEEP.addCssFile(o);
                    });
                }

                if (
settingMarkup.styleDeclarations) {
                    
PEEP.addCss(settingMarkup.styleDeclarations)
                }

                if (
settingMarkup.scriptFiles) {
                    
PEEP.addScriptFiles(settingMarkup.scriptFiles, function(){
                        if (
settingMarkup.onloadScript) {
                            
PEEP.addScript(settingMarkup.onloadScript);
                        }
                    });
                }
                else
                {
                    if (
settingMarkup.onloadScript) {
                        
PEEP.addScript(settingMarkup.onloadScript);
                    }
                }

                var 
$submitControl = $controls.show().find('input.dd_save');
                var 
$form = $content.find('.settings_form').submit(function(){
                    
self.saveSettings(cmpId, this, $submitControl.get(0));
                    return 
false;
                });

                
$submitControl.click(function(){
                    
$form.submit();
                });

        }]);
    },

    
saveSettings: function(cmpId, form, submitControl) {
        var 
self = this;
        var 
formState = this.formToArray(form);
        var 
renderComponent = this.isComponentRenderable(cmpId);
        
PEEP.inProgressNode(submitControl);
        $(
form).find('.setting_error').empty();
        var 
error = function(message, fieldName) {
            if (
fieldName) {
                $(
'#error_' + fieldName ).html(message);
            } else {
                
PEEP.error(message);
            }
        };

        
this.trigger('saveSettings', [cmpId, formState, function( result, sharedData ) {
            if ( 
result.error ) {
                
error(result.error.message, result.error.field);
                
sharedData.stop = true;

                return;
            }
            
self.applyComponentSettings(cmpId, result.settingList);
        }]);

        
this.trigger('reload', [cmpId, renderComponent, function( markup, sharedData ){
            if (
markup && !sharedData.stop) {
                
self.drawComponent(cmpId, markup);
            }
        }]);

        
this.complete(function(r, sharedData) {
            
PEEP.activateNode(submitControl);
            
            if ( !
sharedData.stop ) {
                
self.settingBox.close();
            }
        });
    },

    
reloadWidget: function(cmpId, callBack, render)
    {
        var 
self = this;

        
render = render === false ? false : true;

        
this.trigger('reload', [cmpId, render, function( markup, sharedData )
        {
            var 
callBackResult = true;

            if ($.
isFunction(callBack))
            {
                
callBackResult = callBack.call(this, markup, sharedData);
            }

            if (
callBackResult !== false && markup)
            {
                
self.drawComponent(cmpId, markup);
            }
        }]);

        
this.trigger('complete');
    },

    
drawComponent: function(cmpId, markup) {
        var 
$component = $('#' + cmpId);
        var 
$newComponent = $(markup.content);
        try {
            
$component.replaceWith($newComponent);
        } catch(
e) {}

        if (
markup.styleSheets) {
               $.
each(markup.styleSheets, function(i, o){
                   
PEEP.addCssFile(o);
            });
        }

        if (
markup.styleDeclarations) {
            
PEEP.addCss(markup.styleDeclarations)
        }

        if (
markup.scriptFiles) {
            
PEEP.addScriptFiles(markup.scriptFiles, function(){
                if (
markup.onloadScript) {
                        
PEEP.addScript(markup.onloadScript);
                }
            });
        }
        else
        {
            if (
markup.onloadScript) {
                
PEEP.addScript(markup.onloadScript);
            }
        }

        
this.actionComplete();
    },

    
applyComponentSettings: function(cmpId, settings) {

        var 
$component = $('#' + cmpId);
        var 
$section = $component.parents('.place_section:eq(0)');

        if (
settings.freeze > 0) {
            
$component.addClass('peep_dnd_freezed');
            
this.arrangeFreezed($section);
        }
    },

    
arrangeFreezed: function(section) {
        var 
$section = $(section);

        
/*var components = $section.find('.component').sort(function(a, b){
            var x = $(a).is('.peep_dnd_freezed') ? 0 : 1;
            var y = $(b).is('.peep_dnd_freezed') ? 0 : 1;

            return x - y;
        });*/
        
var iteration = function(){
            
$section.append(this);
        };
        var 
components = [];
        
$section.find('.peep_dnd_freezed').each(iteration);
        
$section.find('.component:not(.peep_dnd_freezed)').each(iteration);


        
/*$.each(components, function(){
            $section.append(this);
        });*/
    
},

    
isComponentInSection: function(id) {
        return $(
'#' + id).is('#place_sections .component');
    },

    
isComponentRenderable: function(id) {
        return 
false;
    },

    
formToArray: function(form) {

            var 
nameRegex = /^([w-]+)([([^]]+)?])?/i;

        var 
state = {};
        $.
each(form.elements, function(i, item){
            if ( !$.
trim(item.name).length ) return;

            var 
$item = $(item);
                var 
beforeValue = $item.attr('beforevalue');
                var 
nameParts = nameRegex.exec(item.name);
                var 
name = nameParts[1];
                var 
isMultiple = !!nameParts[2];
                var 
arrayKey = !!nameParts[3];
                var 
value;

                if (
$item.is('input:checkbox, input:radio')) {
                    
value = $item.attr('checked') ? true : false;
                } else {
                    
value = $item.val();
                }

                if (  
beforeValue && beforeValue == value )
                {
                    return;
                }

                if ( 
isMultiple ) {
                    
state[name] = state[name] || (arrayKey ? {} : []);

                    if ( 
arrayKey ) {
                        
state[name][arrayKey] = value;
                    }
                    else if (
value) {
                        
state[name].push($item.attr('value') || true);
                    }
                }
                else {
                    
state[name] = value;
                }

        });

        return 
state;
    },

    
bind: function(type, func) {
        if (
this.events[type] == undefined) {
            throw 
'undefined form event type "'+type+'"';
        }

        
this.events[type].push(func);
    },

    
unbind: function(type) {
        if (
this.events[type] == undefined) {
            throw 
'undefined form event type "'+type+'"';
        }

        
this.events[type] = [];
    },

    
trigger: function(type, params) {

        if (
this.events[type] == undefined) {
            throw 
'undefined form event type "'+type+'"';
        }

        
params = params || [];

        for (var 
i = 0, func; func = this.events[type][i]; i++) {
            if (
func.apply(this, params) === false) {
                return 
false;
            }
        }

        return 
true;
    },

    
extendSettings: function(obj) {
        $.
each(this.defaultSettings, function(prop, value) {
            if (
obj[prop] === undefined) {
                
obj[prop] = value;
            }
        });
        return 
obj;
    }

}
?>
Онлайн: 0
Реклама