+ $(document).bind('panel:unload.' + self.instanceId,
+ function(event, data) {
+ self.unload(event, data);
+ });
+
+ $(document).bind('panel:contentChanged', function(event, data) {
+ $.log(self, ' got changed event from: ', data);
+ if(self != data) {
+ self.otherPanelChanged(event.target);
+ } else {
+ self.markChanged();
+ }
+ return false;
+ });
+}
+
+Panel.prototype.callHook = function() {
+ var args = $.makeArray(arguments);
+ var hookName = args.splice(0,1)[0];
+ var noHookAction = args.splice(0,1)[0];
+ var result = false;
+
+ $.log('calling hook: ', hookName, 'with args: ', args);
+ if(this.hooks && this.hooks[hookName]) {
+ result = this.hooks[hookName].apply(this, args);
+ } else if (noHookAction instanceof Function) {
+ result = noHookAction(args);
+ }
+ return result;
+};
+
+Panel.prototype._endload = function () {
+ // this needs to be here, so we
+ this.connectToolbar();
+ this.callHook('toolbarResized');
+};
+
+Panel.prototype.load = function (url) {
+ // $.log('preparing xhr load: ', this.wrap);
+ $(document).trigger('panel:unload', this);
+ var self = this;
+ self.current_url = url;
+
+ $.ajax({
+ url: url,
+ dataType: 'html',
+ success: function(data, tstat) {
+ panel_hooks = null;
+ $(self.contentDiv).html(data);
+ self.hooks = panel_hooks;
+ panel_hooks = null;
+ self.callHook('load');
+ },
+ error: function(request, textStatus, errorThrown) {
+ $.log('ajax', url, this.target, 'error:', textStatus, errorThrown);
+ $(self.contentDiv).html("<p>Wystapił błąd podczas wczytywania panelu.</p>");
+ }
+ });
+};
+
+Panel.prototype.unload = function(event, data) {
+ // $.log('got unload signal', this, ' target: ', data);
+ if( data == this ) {
+ $(this.contentDiv).html('');
+
+ // disconnect the toolbar
+ $('div.panel-toolbar span.panel-toolbar-extra', this.wrap).empty();
+
+ this.callHook('unload');
+ this.hooks = null; // flush the hooks
+ return false;
+ }
+};
+
+Panel.prototype.refresh = function(event, data) {
+ var self = this;
+ var reload = function() {
+ $.log('hard reload for panel ', self.current_url);
+ self.load(self.current_url);
+ return true;
+ };
+
+ if( this.callHook('refresh', reload) ) {
+ $('.change-notification', this.wrap).fadeOut();
+ }
+};
+
+Panel.prototype.otherPanelChanged = function(other) {
+ $.log('Panel ', this, ' is aware that ', other, ' changed.');
+ if(!this.callHook('dirty')) {
+ $('.change-notification', this.wrap).fadeIn();
+ }
+};
+
+Panel.prototype.markChanged = function () {
+ this.wrap.addClass('changed');
+};
+
+Panel.prototype.changed = function () {
+ return this.wrap.hasClass('changed');
+};
+
+Panel.prototype.unmarkChanged = function () {
+ this.wrap.removeClass('changed');
+};
+
+Panel.prototype.saveInfo = function() {
+ var saveInfo = {};
+ this.callHook('saveInfo', null, saveInfo);
+ return saveInfo;
+};
+
+Panel.prototype.connectToolbar = function()
+{
+ var self = this;
+ self.hotkeys = [];
+
+ // check if there is a one
+ var toolbar = $("div.toolbar", this.contentDiv);
+ // $.log('Connecting toolbar', toolbar);
+ if(toolbar.length === 0) return;
+
+ // move the extra
+ var extra_buttons = $('span.panel-toolbar-extra', toolbar);
+ var placeholder = $('div.panel-toolbar span.panel-toolbar-extra', this.wrap);
+ placeholder.replaceWith(extra_buttons);
+ placeholder.hide();
+
+ var action_buttons = $('button', extra_buttons);
+
+ // connect group-switch buttons
+ var group_buttons = $('*.toolbar-tabs-container button', toolbar);
+
+ // $.log('Found groups:', group_buttons);
+
+ group_buttons.each(function() {
+ var group = $(this);
+ var group_name = group.attr('ui:group');
+ // $.log('Connecting group: ' + group_name);
+
+ group.click(function() {
+ // change the active group
+ var active = $("*.toolbar-tabs-container button.active", toolbar);
+ if (active != group) {
+ active.removeClass('active');
+ group.addClass('active');
+ $(".toolbar-button-groups-container p", toolbar).each(function() {
+ if ( $(this).attr('ui:group') != group_name) {
+ $(this).hide();
+ } else {
+ $(this).show();
+ }
+ });
+ self.callHook('toolbarResized');
+ }
+ });
+ });
+
+ // connect action buttons
+ var allbuttons = $.makeArray(action_buttons);
+ $.merge(allbuttons,
+ $.makeArray($('*.toolbar-button-groups-container button', toolbar)) );
+
+ $(allbuttons).each(function() {
+ var button = $(this);
+ var hk = button.attr('ui:hotkey');
+ if(hk) hk = new Hotkey( parseInt(hk) );
+
+ try {
+ var params = $.evalJSON(button.attr('ui:action-params'));
+ } catch(object) {
+ $.log('JSON exception in ', button, ': ', object);
+ button.attr('disabled', 'disabled');
+ return;
+ }
+
+ var callback = function() {
+ editor.callScriptlet(button.attr('ui:action'), self, params);
+ };
+
+ // connect button
+ button.click(callback);
+
+ // connect hotkey
+ if(hk) {
+ self.hotkeys[hk.code] = callback;
+ // $.log('hotkey', hk);
+ }
+
+ // tooltip
+ if (button.attr('ui:tooltip') )
+ {
+ var tooltip = button.attr('ui:tooltip');
+ if(hk) tooltip += ' ['+hk+']';
+
+ button.wTooltip({
+ delay: 1000,
+ style: {
+ border: "1px solid #7F7D67",
+ opacity: 0.9,
+ background: "#FBFBC6",
+ padding: "1px",
+ fontSize: "12px"
+ },
+ content: tooltip
+ });
+ }
+ });
+};
+
+Panel.prototype.hotkeyPressed = function(event)
+{
+ var code = event.keyCode;
+ if(event.altKey) code = code | 0x100;
+ if(event.ctrlKey) code = code | 0x200;
+ if(event.shiftKey) code = code | 0x400;
+
+ var callback = this.hotkeys[code];
+ if(callback) callback();
+};
+
+Panel.prototype.isHotkey = function(event) {
+ var code = event.keyCode;
+ if(event.altKey) code = code | 0x100;
+ if(event.ctrlKey) code = code | 0x200;
+ if(event.shiftKey) code = code | 0x400;