+ $(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(hookName) {
+ if(this.hooks && this.hooks[hookName])
+ {
+// arguments.shift();
+ $.log('calling hook: ', hookName, 'with args: ', arguments);
+ return this.hooks[hookName].apply(this, arguments);
+ }
+}
+
+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);
+ }
+ });
+}
+
+Panel.prototype.unload = function(event, data) {
+ $.log('got unload signal', this, ' target: ', data);
+
+ if( data == this ) {
+ $.log('unloading', this);
+ $(this.contentDiv).html('');
+ this.callHook('unload');
+ this.hooks = null; // flush the hooks
+ return false;
+ };
+}
+
+Panel.prototype.refresh = function(event, data) {
+ $('.change-notification', this.wrap).fadeOut();
+ $.log('refreshing view for panel ', this.current_url);
+ this.load(this.current_url);
+// if( this.callHook('refresh') )
+}
+
+Panel.prototype.otherPanelChanged = function(other) {
+ $.log('panel ', other, ' changed.');
+ $('.change-notification', this.wrap).fadeIn();
+ this.callHook('dirty');
+}
+
+Panel.prototype.markChanged = function () {
+ if(!this.wrap.hasClass('changed') ) // TODO: is this needed ?
+ 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', saveInfo);
+ return saveInfo;
+}
+
+
+function Editor() {
+ // editor initialization
+ // this is probably a good place to set config
+}
+
+Editor.prototype.setupUI = function() {
+ // set up the UI visually and attach callbacks
+ var self = this;
+ var panelRoot = $('#panels');
+ self.rootDiv = panelRoot;