Вход Регистрация
Файл: static/plugins/admin/js/mobile.js
Строк: 407
<?php
MOBILE 
= {};

MOBILE.Navigation = (function() {
   
    var 
_panels = {}, _settings = {};
    var 
_bind, _query, _queryCallBack, _newCounter = 0;
    
   
// System functions
   
    
_bind= function( fnc, obj, args ) {
        
fnc = fnc || function(){};
        
obj = obj || window;
        
args = args || [];

        return function() {
            return 
fnc.apply(obj, args.concat(Array.prototype.slice.call(arguments)));
        };
    };
    
    
_query = function( command, params, callBack ) {
        $.
post(_settings.rsp, {
                
"command": command,
                
"data": JSON.stringify(params),
                
"shared": JSON.stringify(_settings.shared)
            }, function( 
r ) {
                if ( $.
isFunction(callBack) ) {
                    
callBack(r);
                }

                
_queryCallBack(r);
            }, 
"json");
    };
    
    
_queryCallBack = function( r ) {
        if ( !
r ) return;
        
        $.
each(r.items || {}, function(itemKey, itemData) {
            
changeItem(itemKey, itemData);
        });
    };
    

    var 
init, savePanels, changeItem;
    var 
Panel, DefaultDelegate, NewDelegate, HiddenDelegate;

    
Panel = function( panelKey, delegate ) {
        
        
this.key = panelKey;
        
this.node = $(".dnd-section[data-key="" + this.key + ""]");
        
this.alias = this.node.data("alias");
        
        
this.delegate = delegate || new DefaultDelegate();

        
this.options = {
            
cancel: '.peep_dnd_freezed',
            
items: '.component:not(.peep_dnd_freezed)',
            
placeholder: 'peep_dnd_placeholder',
            clone: 
"original",
            
            
start: _bind(this.delegate.start, this.delegate, [this]),
            
sort: _bind(this.delegate.sort, this.delegate, [this]),
            
stop: _bind(this.delegate.stop, this.delegate, [this]),
            
beforeStop: _bind(this.delegate.beforeStop, this.delegate, [this]),
            
receive: _bind(this.delegate.receive, this.delegate, [this]),
            
over: _bind(this.delegate.over, this.delegate, [this]),
            
change: _bind(this.delegate.change, this.delegate, [this]),
            
update: _bind(this.delegate.update, this.delegate, [this]),
            
helper: _bind(this.delegate.helper, this.delegate, [this])
            
        };
        
        
this.connections = {};

        
_bind(this.delegate.beforeInit, this.delegate, [this])();
        
this.init();
        
_bind(this.delegate.afterInit, this.delegate, [this])();
    };

    
Panel.prototype = {
        
init: function() {
            var 
self = this;
            
            
this.node.sortable(this.options).disableSelection();
            
            
this.node.on("click", ".dnd-control", function() {
                var 
item = $(this).parents(".component:eq(0)");
                
_bind(self.delegate.actionClick, self.delegate, [self, item])( $(this).data("action") );
            });
            
            return 
this;
        },
                
        
connect: function( panel ) {
            
this.connections[panel.key] = panel;
            
this.node.sortable("option", "connectWith", this._connectedNodes());
            
            return 
this;
        },
        
        
disconnect: function( panel ) {
            if ( !
this.connections[panel.key] ) {
                return 
this;
            }
            
            
delete this.connections[panel.key];
            
this.node.sortable("option", "connectWith", this._connectedNodes());
            
            return 
this;
        },
                
        
cancel: function() {
            
this.node.sortable("cancel");
        },
                
        
save: function() {
            var 
data = this.node.sortable("toArray", {attribute: "data-key"});
            return 
_bind(this.delegate.save, this.delegate, [this])(data);
        },
                
        
_connectedNodes: function() {
            var 
connections = false;
            
            $.
each(this.connections, function(panelKey, panel) {
                
connections = connections ? connections.add(panel.node) : panel.node;
            });
            
            return 
connections;
        }
    };


    
// Delegates

    
var _delegates = {};

    
_delegates.DefaultDelegate = DefaultDelegate = function() {
        
this.sender = null;
    };
    
    $.
extend(DefaultDelegate.prototype, {
        
        
helper: function(panel, e, item) {
            var 
itemWidth = item.outerWidth();

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

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

            return $(
'<div class="peep_dnd_helper" style="width: 160px; height: 30px"></div>');
        },
        
        
start: function( panel, e, ui ) {
            
ui.item.show().addClass("dnd-item-moving");
            
this.sender = null;
        },
                
        
stop: function( panel, e, ui ) {
            
ui.item.removeClass("dnd-item-moving");
            
savePanels([panel]);
        },
                
        
receive: function( panel, e, ui ) {
            
savePanels([panel]);
        },
        
        
save: function( panel, data ) {
            return 
data;
        },
        
        
actionClick: function( panel, item, action ) {
            
            var 
editFloatBox;
            
            if ( 
action === "delete" ) {
                
item.appendTo(_panels.hidden.node);
                
savePanels([panel, _panels.hidden]);
            }
            
            if ( 
action === "edit" ) {
                
editFloatBox = PEEP.ajaxFloatBox("ADMIN_CMP_MobileNavigationItemSettings", [item.data("key")], {
                    
"title": PEEP.getLanguageText("mobile", "admin_nav_settings_fb_title"),
                    
"scope": {
                        
"callBack": _queryCallBack,
                        
"floatBox": editFloatBox
                    
}
                });
            }
        }
    });
    
    
    
_delegates.NewDelegate = NewDelegate = function() {
        
DefaultDelegate.call(this);
        
        
this.cloning = false;
        
this.clone = null;
    };
    $.
extend(NewDelegate.prototype, DefaultDelegate.prototype, {
        
createItem: function( from ) {
            var 
item = from.clone();
            
item.hide();
            
            return 
changeItem(item, {
                
"key": (_settings.prefix ? _settings.prefix + ':' : '') + "new-item-" + (_newCounter++),
                
"title": PEEP.getLanguageText("mobile", "admin_nav_adding_message"),
                
"locked": true,
                
"parent": from.data("key")
            });
        },
        
        
start: function( panel, e, ui ) {
            
this.cloning = true;
            
ui.item.show();
            
this.clone = this.createItem(ui.item);
        },
                
        
update: function( panel, e, ui ) {
            
this.cloning = false;
            
ui.item.after(this.clone);

            
panel.cancel();
            
this.clone.show();
            
this.clone = null;
        },
                
        
stop: function( panel, e, ui ) {

        },
                
        
save: function( panel, data ) {
            return 
null;
        },
                
        
actionClick: function( panel, item, action ) {
            
// Skip
        
}
    });
    
    
    
_delegates.HiddenDelegate = HiddenDelegate= function() {
        
DefaultDelegate.call(this);
        
    };
    $.
extend(HiddenDelegate.prototype, DefaultDelegate.prototype, {
        
actionClick: function( panel, item, action ) {
            if ( 
action !== "delete" ) {
                
DefaultDelegate.prototype.actionClick.call(this, panel, item, action);
                
                return;
            }
            
            if ( !
item.data("custom") ) {
                return;
            }
            
            if ( 
confirm("Are you sure?") ) {
                
item.remove();
                
                
_query("deleteItem", {
                    
"key": item.data("key")
                });
            }
        }
    });
    
    
    
// Global functions
    
    
savePanels = function( panels ) {
        
        var 
query = {
            
"panels": {},
            
"items": {}
        };
        
        $.
each(panels, function(index, panel) {
            var 
data = panel.save();
            if ( 
data ) {
                $.
each(data, function(i, itemKey){
                    var 
item = $(".component[data-key="" + itemKey + ""]");
                    
query.items[itemKey] = {
                       
"type": item.data("type"),
                       
"parent": item.data("parent"),
                       
"key": item.data("key")
                    };
                });
                
                
query.panels[panel.alias] = data;
            }
        });

        
console.log("savePanels", panels);
        
_query("saveOrder", query);
    };
    
    
changeItem = function( key, options ) {
        var 
item;
        
        if ( $.
type(key) === "string" ) {
            
item = $(".component[data-key="" + key + ""]");
        } else {
           
item = key; 
        }

        if ( 
options.key ) {
            
item.attr("data-key", options.key);
            
item.data("key", options.key);
        }
        
        if ( 
options.type ) {
            
item.attr("data-type", options.type);
        }
        
        if ( 
options.parent ) {
            
item.attr("data-parent", options.parent);
        }
        
        if ( 
options.title ) {
            
item.find(".dnd-title").text(options.title);
        }
        
        if ( 
options.locked ) {
            
item.addClass("dnd-item-locked");
        } else {
            
item.removeClass("dnd-item-locked");
        }
        
        if ( 
options.custom !== undefined ) {
            
item.attr("data-custom", options.custom);
            
item[options.custom ? "addClass" : "removeClass"]("dnd-item-custom");
        }
        
        return 
item;
    };
    
    
init = function( settings ) {
        
_settings = settings;
        var 
sections = $(".dnd-section");
        
        
sections.each(function() {
           var 
s =  $(this);
           
_panels[s.data("key")] = new Panel(s.data("key"), new _delegates[s.data("delegate")]());
        });
        
        
sections.each(function() {
           var 
s =  $(this);
           var 
relation = s.data("relation");
           
           if ( !
relation ) return;
           
           $.
each(relation.split(','), function(i, rel) {
               
_panels[s.data("key")].connect(_panels[$.trim(rel)]);
           });
        });
    };


    
// Public methods
    
return {
        
init: init
    
};
})();
?>
Онлайн: 0
Реклама