Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / views.js @ f9f43e09

History | View | Annotate | Download (11.6 kB)

1 00469232 Kostas Papadimitriou
// Copyright 2011 GRNET S.A. All rights reserved.
2 00469232 Kostas Papadimitriou
// 
3 00469232 Kostas Papadimitriou
// Redistribution and use in source and binary forms, with or
4 00469232 Kostas Papadimitriou
// without modification, are permitted provided that the following
5 00469232 Kostas Papadimitriou
// conditions are met:
6 00469232 Kostas Papadimitriou
// 
7 00469232 Kostas Papadimitriou
//   1. Redistributions of source code must retain the above
8 00469232 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
9 00469232 Kostas Papadimitriou
//      disclaimer.
10 00469232 Kostas Papadimitriou
// 
11 00469232 Kostas Papadimitriou
//   2. Redistributions in binary form must reproduce the above
12 00469232 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
13 00469232 Kostas Papadimitriou
//      disclaimer in the documentation and/or other materials
14 00469232 Kostas Papadimitriou
//      provided with the distribution.
15 00469232 Kostas Papadimitriou
// 
16 00469232 Kostas Papadimitriou
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 00469232 Kostas Papadimitriou
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 00469232 Kostas Papadimitriou
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 00469232 Kostas Papadimitriou
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 00469232 Kostas Papadimitriou
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 00469232 Kostas Papadimitriou
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 00469232 Kostas Papadimitriou
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 00469232 Kostas Papadimitriou
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 00469232 Kostas Papadimitriou
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 00469232 Kostas Papadimitriou
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 00469232 Kostas Papadimitriou
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 00469232 Kostas Papadimitriou
// POSSIBILITY OF SUCH DAMAGE.
28 00469232 Kostas Papadimitriou
// 
29 00469232 Kostas Papadimitriou
// The views and conclusions contained in the software and
30 00469232 Kostas Papadimitriou
// documentation are those of the authors and should not be
31 00469232 Kostas Papadimitriou
// interpreted as representing official policies, either expressed
32 00469232 Kostas Papadimitriou
// or implied, of GRNET S.A.
33 00469232 Kostas Papadimitriou
// 
34 00469232 Kostas Papadimitriou
35 8d08f18a Kostas Papadimitriou
;(function(root){
36 8d08f18a Kostas Papadimitriou
    
37 8d08f18a Kostas Papadimitriou
    // root
38 8d08f18a Kostas Papadimitriou
    var root = root;
39 8d08f18a Kostas Papadimitriou
    
40 8d08f18a Kostas Papadimitriou
    // setup namepsaces
41 8d08f18a Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
42 8d08f18a Kostas Papadimitriou
    var models = snf.models = snf.models || {}
43 8d08f18a Kostas Papadimitriou
    var storage = snf.storage = snf.storage || {};
44 8d08f18a Kostas Papadimitriou
    var views = snf.views = snf.views || {}
45 8d08f18a Kostas Papadimitriou
    var util = snf.util = snf.util || {}
46 8d08f18a Kostas Papadimitriou
47 8d08f18a Kostas Papadimitriou
    // shortcuts
48 8d08f18a Kostas Papadimitriou
    var bb = root.Backbone;
49 8d08f18a Kostas Papadimitriou
    
50 8d08f18a Kostas Papadimitriou
    // logging
51 8d08f18a Kostas Papadimitriou
    var logger = new snf.logging.logger("SNF-VIEWS");
52 8d08f18a Kostas Papadimitriou
    var debug = _.bind(logger.debug, logger);
53 8d08f18a Kostas Papadimitriou
    
54 8d08f18a Kostas Papadimitriou
    // Base view object
55 8d08f18a Kostas Papadimitriou
    views.View = bb.View.extend({
56 8d08f18a Kostas Papadimitriou
        // the main element of the view
57 8d08f18a Kostas Papadimitriou
        // view delegates show, visible, hide etc to this element
58 8d08f18a Kostas Papadimitriou
        view_id: false,
59 8d08f18a Kostas Papadimitriou
60 23a3bb8e Kostas Papadimitriou
        el: '#app',
61 8d08f18a Kostas Papadimitriou
        data_from: false,
62 8d08f18a Kostas Papadimitriou
        selectors: {},
63 8d08f18a Kostas Papadimitriou
        
64 cf4c9298 Kostas Papadimitriou
        pre_show: function() {},
65 cf4c9298 Kostas Papadimitriou
        post_show: function() {},
66 cf4c9298 Kostas Papadimitriou
        pre_hide: function() {},
67 cf4c9298 Kostas Papadimitriou
        post_hide: function() {},
68 cf4c9298 Kostas Papadimitriou
69 cf4c9298 Kostas Papadimitriou
        initialize: function(options) {
70 f9f43e09 Kostas Papadimitriou
            views.View.__super__.initialize.apply(this, [options]);
71 8d08f18a Kostas Papadimitriou
            this.log = new snf.logging.logger("SNF-VIEWS:" + this.view_id);
72 cf4c9298 Kostas Papadimitriou
            this.parent_view = options && options.parent_view;
73 8d08f18a Kostas Papadimitriou
        },
74 cf4c9298 Kostas Papadimitriou
75 8d08f18a Kostas Papadimitriou
        // is the view visible ?
76 8d08f18a Kostas Papadimitriou
        visible: function(){
77 8d08f18a Kostas Papadimitriou
            return $(this.el).is(":visible");
78 8d08f18a Kostas Papadimitriou
        },
79 8d08f18a Kostas Papadimitriou
        
80 8d08f18a Kostas Papadimitriou
        // hide view
81 e673a761 Kostas Papadimitriou
        hide: function(force) {
82 e673a761 Kostas Papadimitriou
            if (!this.visible() && !force) { return this };
83 cf4c9298 Kostas Papadimitriou
            this.pre_hide();
84 cf4c9298 Kostas Papadimitriou
            var ret = $(this.el).hide();
85 cf4c9298 Kostas Papadimitriou
            this.post_hide();
86 cf4c9298 Kostas Papadimitriou
            return ret;
87 8d08f18a Kostas Papadimitriou
        },
88 8d08f18a Kostas Papadimitriou
        
89 8d08f18a Kostas Papadimitriou
        // show view
90 cf4c9298 Kostas Papadimitriou
        show: function(force) {
91 cf4c9298 Kostas Papadimitriou
            if (this.visible() && !force) { return this };
92 cf4c9298 Kostas Papadimitriou
            this.pre_show();
93 8d08f18a Kostas Papadimitriou
            $(this.el).show();
94 8d08f18a Kostas Papadimitriou
            if (this.show_view) { this.show_view.apply(this, arguments)};
95 cf4c9298 Kostas Papadimitriou
            this.post_show();
96 8d08f18a Kostas Papadimitriou
        },
97 8d08f18a Kostas Papadimitriou
98 8d08f18a Kostas Papadimitriou
        sel: function(id) {
99 8d08f18a Kostas Papadimitriou
            return this.$(this.selectors[id]);
100 8d08f18a Kostas Papadimitriou
        },
101 8d08f18a Kostas Papadimitriou
102 8d08f18a Kostas Papadimitriou
        // animations
103 8d08f18a Kostas Papadimitriou
        fadeIn: function(time, callback) {
104 8d08f18a Kostas Papadimitriou
            $(this.el).fadeIn(time, callback);
105 8d08f18a Kostas Papadimitriou
            return this.show();
106 8d08f18a Kostas Papadimitriou
        },
107 8d08f18a Kostas Papadimitriou
108 8d08f18a Kostas Papadimitriou
        fadeOut: function(time, callback) {
109 8d08f18a Kostas Papadimitriou
            $(this.el).fadeOut(time, callback);
110 8d08f18a Kostas Papadimitriou
            return this.hide();
111 8d08f18a Kostas Papadimitriou
        }
112 8d08f18a Kostas Papadimitriou
    });
113 8d08f18a Kostas Papadimitriou
    
114 8d08f18a Kostas Papadimitriou
    
115 8d08f18a Kostas Papadimitriou
    // overlays registry
116 8d08f18a Kostas Papadimitriou
    views._overlay_index = [];
117 8d08f18a Kostas Papadimitriou
118 8d08f18a Kostas Papadimitriou
    // overlay view helper
119 8d08f18a Kostas Papadimitriou
    views.Overlay = views.View.extend({
120 8d08f18a Kostas Papadimitriou
        view_id: 'overlay',
121 8d08f18a Kostas Papadimitriou
        tpl_selector: '#generic-overlay-tpl',
122 8d08f18a Kostas Papadimitriou
        css_class: 'overlay',
123 8d08f18a Kostas Papadimitriou
        oneInstance: true,
124 8d08f18a Kostas Papadimitriou
        fixed: false,
125 8d08f18a Kostas Papadimitriou
126 8d08f18a Kostas Papadimitriou
        initialize: function(options, selector) {
127 8d08f18a Kostas Papadimitriou
            this.defaults = {
128 8d08f18a Kostas Papadimitriou
                load: false,
129 8d08f18a Kostas Papadimitriou
                closeOnClick: false,
130 9ce969a7 Kostas Papadimitriou
                closeOnEsc: false,
131 8d08f18a Kostas Papadimitriou
                mask: {
132 8d08f18a Kostas Papadimitriou
                    color: "#444",
133 2506f741 Kostas Papadimitriou
                    loadSpeed: snf.config.overlay_speed || 0,
134 8d08f18a Kostas Papadimitriou
                    opacity: 0.7
135 2506f741 Kostas Papadimitriou
                },
136 2506f741 Kostas Papadimitriou
                speed: snf.config.overlay_speed || 200
137 8d08f18a Kostas Papadimitriou
            }
138 8d08f18a Kostas Papadimitriou
            
139 8d08f18a Kostas Papadimitriou
            this.tpl_selector = selector || this.tpl_selector;
140 8d08f18a Kostas Papadimitriou
            views.Overlay.__super__.initialize.apply(this);
141 8d08f18a Kostas Papadimitriou
            views._overlay_index.push(this);
142 8d08f18a Kostas Papadimitriou
143 8d08f18a Kostas Papadimitriou
            this.options = _.extend(this.defaults, options);
144 a1481c1d Kostas Papadimitriou
            this.options.clone = this.options.clone == undefined ? true : this.options.clone;
145 8d08f18a Kostas Papadimitriou
            this.options.fixed = this.fixed;
146 8d08f18a Kostas Papadimitriou
147 8d08f18a Kostas Papadimitriou
            this.options.onOpen = this.options.onOpen || function() {};
148 8d08f18a Kostas Papadimitriou
            this.options.onClose = this.options.onClose || function() {};
149 8d08f18a Kostas Papadimitriou
            this.options.beforeOpen = this.options.beforeOpen || function() {};
150 8d08f18a Kostas Papadimitriou
            this.options.beforeClose = this.options.beforeClose || function() {};
151 8d08f18a Kostas Papadimitriou
            this.el = this.create_element();
152 8d08f18a Kostas Papadimitriou
            this.el.hide();
153 8d08f18a Kostas Papadimitriou
        
154 8d08f18a Kostas Papadimitriou
            var ajax_params = _.clone(this.options);
155 8d08f18a Kostas Papadimitriou
156 8d08f18a Kostas Papadimitriou
            ajax_params.onBeforeLoad = _.bind(this._beforeOpen, this);
157 8d08f18a Kostas Papadimitriou
            ajax_params.onLoad = _.bind(this._onOpen, this);
158 8d08f18a Kostas Papadimitriou
            ajax_params.onBeforeClose = _.bind(this._beforeClose, this);
159 8d08f18a Kostas Papadimitriou
            ajax_params.onClose = _.bind(this._onClose, this);
160 8d08f18a Kostas Papadimitriou
            ajax_params.oneInstance = this.oneInstance;
161 8d08f18a Kostas Papadimitriou
            // create overlay
162 8d08f18a Kostas Papadimitriou
            // TODO: does this return overlay object ?? (to avoid the next code line)
163 8d08f18a Kostas Papadimitriou
            $(this.el).overlay(ajax_params);
164 8d08f18a Kostas Papadimitriou
165 8d08f18a Kostas Papadimitriou
            this.overlay = $(this.el).overlay();
166 8d08f18a Kostas Papadimitriou
            this.append_css = this.options ? this.options.css_class ? this.options.css_class : "" : "";
167 9ffd10ce Kostas Papadimitriou
168 9ffd10ce Kostas Papadimitriou
            this.is_visible = false;
169 8d08f18a Kostas Papadimitriou
            return this;
170 8d08f18a Kostas Papadimitriou
        },
171 8d08f18a Kostas Papadimitriou
172 8d08f18a Kostas Papadimitriou
        create_element: function() {
173 8d08f18a Kostas Papadimitriou
            var el = undefined;
174 8d08f18a Kostas Papadimitriou
            if (this.options.clone) {
175 8d08f18a Kostas Papadimitriou
                el = $(this.tpl_selector).clone();
176 8d08f18a Kostas Papadimitriou
            } else {
177 8d08f18a Kostas Papadimitriou
                el = $(this.tpl_selector);
178 8d08f18a Kostas Papadimitriou
            }
179 8d08f18a Kostas Papadimitriou
            
180 8d08f18a Kostas Papadimitriou
            // append content
181 8d08f18a Kostas Papadimitriou
            if (this.content_selector) {
182 8d08f18a Kostas Papadimitriou
                var content = $(this.content_selector).clone();
183 8d08f18a Kostas Papadimitriou
                content.addClass("content");
184 8d08f18a Kostas Papadimitriou
                
185 8d08f18a Kostas Papadimitriou
                if ($(el).find(".content").length) {
186 8d08f18a Kostas Papadimitriou
                    $(el).find(".content").replaceWith(content);
187 8d08f18a Kostas Papadimitriou
                }
188 8d08f18a Kostas Papadimitriou
                content.removeClass("hidden");
189 8d08f18a Kostas Papadimitriou
            }
190 8d08f18a Kostas Papadimitriou
191 8d08f18a Kostas Papadimitriou
            if (this.overlay_id) {
192 8d08f18a Kostas Papadimitriou
            }
193 8d08f18a Kostas Papadimitriou
194 8d08f18a Kostas Papadimitriou
            $(el).addClass("overlay");
195 8d08f18a Kostas Papadimitriou
            if (this.css_class) {
196 8d08f18a Kostas Papadimitriou
                $(el).addClass(this.css_class);
197 8d08f18a Kostas Papadimitriou
            }
198 8d08f18a Kostas Papadimitriou
            
199 8d08f18a Kostas Papadimitriou
            if (this.options.clone) {
200 8d08f18a Kostas Papadimitriou
                $("body").append(el);
201 8d08f18a Kostas Papadimitriou
            }
202 8d08f18a Kostas Papadimitriou
203 8d08f18a Kostas Papadimitriou
            return el;
204 8d08f18a Kostas Papadimitriou
        },
205 8d08f18a Kostas Papadimitriou
206 8d08f18a Kostas Papadimitriou
        set_title: function(title) {
207 8d08f18a Kostas Papadimitriou
            if (title || this.title) {
208 9ee7d495 Kostas Papadimitriou
                $(this.el).find(".overlay-header .title").html(title || this.title)
209 8d08f18a Kostas Papadimitriou
            }
210 8d08f18a Kostas Papadimitriou
        },
211 8d08f18a Kostas Papadimitriou
212 8d08f18a Kostas Papadimitriou
        set_subtitle: function(subtitle) {
213 8d08f18a Kostas Papadimitriou
            if (subtitle || this.subtitle) {
214 9ee7d495 Kostas Papadimitriou
                $(this.el).find(".overlay-header .subtitle").html(subtitle || this.subtitle)
215 8d08f18a Kostas Papadimitriou
            }
216 8d08f18a Kostas Papadimitriou
        },
217 8d08f18a Kostas Papadimitriou
218 8d08f18a Kostas Papadimitriou
        _beforeOpen: function() {
219 9ffd10ce Kostas Papadimitriou
            this.is_visible = true;
220 8d08f18a Kostas Papadimitriou
            if (this.append_css) {
221 8d08f18a Kostas Papadimitriou
                $(this.el).addClass(this.append_css);
222 8d08f18a Kostas Papadimitriou
            }
223 8d08f18a Kostas Papadimitriou
224 8d08f18a Kostas Papadimitriou
            this.set_title();
225 8d08f18a Kostas Papadimitriou
            this.set_subtitle();
226 8d08f18a Kostas Papadimitriou
            
227 8d08f18a Kostas Papadimitriou
            this.beforeOpen.apply(this, arguments);
228 8d08f18a Kostas Papadimitriou
            this.options.beforeOpen.apply(this, arguments);
229 8d08f18a Kostas Papadimitriou
        },
230 8d08f18a Kostas Papadimitriou
231 8d08f18a Kostas Papadimitriou
        _onOpen: function() {
232 9ce969a7 Kostas Papadimitriou
            // clear previously bound click events
233 9ce969a7 Kostas Papadimitriou
            $(this.el).find(".closeme").unbind("click");
234 9ce969a7 Kostas Papadimitriou
235 8d08f18a Kostas Papadimitriou
            if ($(this.el).find(".closeme").length) {
236 8d08f18a Kostas Papadimitriou
                $(this.el).find(".closeme").click(_.bind(function(){
237 8d08f18a Kostas Papadimitriou
                    this.hide();
238 8d08f18a Kostas Papadimitriou
                }, this))
239 8d08f18a Kostas Papadimitriou
            }
240 8d08f18a Kostas Papadimitriou
            this.onOpen.apply(this, arguments);
241 8d08f18a Kostas Papadimitriou
            this.options.onOpen.apply(this, arguments);
242 8d08f18a Kostas Papadimitriou
        },
243 8d08f18a Kostas Papadimitriou
244 8d08f18a Kostas Papadimitriou
        _beforeClose: function() {
245 9ffd10ce Kostas Papadimitriou
            this.is_visible = false;
246 8d08f18a Kostas Papadimitriou
            this.beforeClose.apply(this, arguments);
247 8d08f18a Kostas Papadimitriou
            this.options.beforeClose.apply(this, arguments);
248 8d08f18a Kostas Papadimitriou
        },
249 8d08f18a Kostas Papadimitriou
250 8d08f18a Kostas Papadimitriou
        _onClose: function() {
251 8d08f18a Kostas Papadimitriou
            if (this.append_css) {
252 8d08f18a Kostas Papadimitriou
                $(this.el).removeClass(this.append_css);
253 8d08f18a Kostas Papadimitriou
            }
254 8d08f18a Kostas Papadimitriou
            this.onClose.apply(this, arguments);
255 8d08f18a Kostas Papadimitriou
            this.options.onClose.apply(this, arguments);
256 8d08f18a Kostas Papadimitriou
        },
257 8d08f18a Kostas Papadimitriou
258 8d08f18a Kostas Papadimitriou
        beforeOpen: function () {},
259 8d08f18a Kostas Papadimitriou
        onOpen: function () {},
260 8d08f18a Kostas Papadimitriou
        beforeClose: function () {},
261 8d08f18a Kostas Papadimitriou
        onClose: function () {},
262 8d08f18a Kostas Papadimitriou
263 8d08f18a Kostas Papadimitriou
        show: function() {
264 96d725ac Kostas Papadimitriou
            // close opened overlays
265 8d08f18a Kostas Papadimitriou
            var hidden = false;
266 8d08f18a Kostas Papadimitriou
            _.each(views._overlay_index, function(ovr){
267 8d08f18a Kostas Papadimitriou
                if (ovr == this) { return };
268 8d08f18a Kostas Papadimitriou
                if (ovr.visible()) {
269 8d08f18a Kostas Papadimitriou
                    hidden = true;
270 8d08f18a Kostas Papadimitriou
                    ovr.hide();
271 8d08f18a Kostas Papadimitriou
                }
272 8d08f18a Kostas Papadimitriou
            })
273 8d08f18a Kostas Papadimitriou
274 96d725ac Kostas Papadimitriou
            // do we need to wait for other overlays to close ???
275 96d725ac Kostas Papadimitriou
            if (hidden) { delay = 300; } else { delay = 0; }
276 9ffd10ce Kostas Papadimitriou
277 9ffd10ce Kostas Papadimitriou
            this.is_visible = true;
278 7253330c Kostas Papadimitriou
            window.setTimeout(_.bind(function(){ this.overlay.load(); this.trigger('show') }, this), delay)
279 8d08f18a Kostas Papadimitriou
            return this;
280 8d08f18a Kostas Papadimitriou
        },
281 8d08f18a Kostas Papadimitriou
282 8d08f18a Kostas Papadimitriou
        hide: function() {
283 550d9733 Kostas Papadimitriou
            if (!this.overlay.isOpened()) {
284 550d9733 Kostas Papadimitriou
                // if its not opened events wont trigger
285 550d9733 Kostas Papadimitriou
                this._onClose()
286 550d9733 Kostas Papadimitriou
            } else {
287 550d9733 Kostas Papadimitriou
                this.overlay.close();
288 550d9733 Kostas Papadimitriou
            }
289 8d08f18a Kostas Papadimitriou
            return this;
290 8d08f18a Kostas Papadimitriou
        }
291 8d08f18a Kostas Papadimitriou
    });
292 8d08f18a Kostas Papadimitriou
293 550d9733 Kostas Papadimitriou
    
294 550d9733 Kostas Papadimitriou
    // overlay view helper
295 550d9733 Kostas Papadimitriou
    views.VMOverlay = views.Overlay.extend({
296 550d9733 Kostas Papadimitriou
297 550d9733 Kostas Papadimitriou
        initialize: function() {
298 550d9733 Kostas Papadimitriou
            views.VMOverlay.__super__.initialize.apply(this);
299 550d9733 Kostas Papadimitriou
            this.vm = undefined;
300 550d9733 Kostas Papadimitriou
            this.view_id_tpl = this.view_id;
301 550d9733 Kostas Papadimitriou
302 f0532b59 Kostas Papadimitriou
            _.bindAll(this, "_handle_vm_change", "_handle_vm_remove");
303 550d9733 Kostas Papadimitriou
        },
304 550d9733 Kostas Papadimitriou
305 550d9733 Kostas Papadimitriou
        set_vm: function(vm) {
306 550d9733 Kostas Papadimitriou
            if (this.vm) { this.unbind_vm_handlers };
307 550d9733 Kostas Papadimitriou
            this.vm = vm;
308 550d9733 Kostas Papadimitriou
            this.view_id = this.view_id + "_" + vm.id;
309 550d9733 Kostas Papadimitriou
            this.bind_vm_handlers();
310 550d9733 Kostas Papadimitriou
        },
311 550d9733 Kostas Papadimitriou
312 550d9733 Kostas Papadimitriou
        bind_vm_handlers: function() {
313 550d9733 Kostas Papadimitriou
            this.log.debug("binding handlers");
314 f0532b59 Kostas Papadimitriou
            this.vm.bind("change", this._handle_vm_change);
315 f0532b59 Kostas Papadimitriou
            storage.vms.bind("remove", this._handle_vm_remove);
316 550d9733 Kostas Papadimitriou
        },
317 550d9733 Kostas Papadimitriou
        
318 550d9733 Kostas Papadimitriou
        unbind_vm_handlers: function() {
319 550d9733 Kostas Papadimitriou
            this.log.debug("unbinding handlers", this.vm);
320 550d9733 Kostas Papadimitriou
            if (!this.vm) { return };
321 f0532b59 Kostas Papadimitriou
            this.vm.unbind("change", this._handle_vm_change);
322 f0532b59 Kostas Papadimitriou
            storage.vms.unbind("remove", this._handle_vm_remove);
323 550d9733 Kostas Papadimitriou
        },
324 550d9733 Kostas Papadimitriou
        
325 550d9733 Kostas Papadimitriou
        _update_vm_details: function() { 
326 550d9733 Kostas Papadimitriou
            if (!this.vm) { console.error("invalid view state"); return }
327 df251d55 Kostas Papadimitriou
            this.set_subtitle(this.vm.escape("name") + snf.ui.helpers.vm_icon_tag(this.vm, "small"));
328 550d9733 Kostas Papadimitriou
            this.update_vm_details() 
329 550d9733 Kostas Papadimitriou
        },
330 550d9733 Kostas Papadimitriou
331 550d9733 Kostas Papadimitriou
        update_vm_details: function() {},
332 f0532b59 Kostas Papadimitriou
        handle_vm_remove: function() {},
333 f0532b59 Kostas Papadimitriou
        handle_vm_change: function () {},
334 f0532b59 Kostas Papadimitriou
        
335 f0532b59 Kostas Papadimitriou
        _handle_vm_remove: function(vm, collection) {
336 550d9733 Kostas Papadimitriou
            if (this.vm && vm.id == this.vm.id) {
337 550d9733 Kostas Papadimitriou
                this.hide();
338 550d9733 Kostas Papadimitriou
            }
339 f0532b59 Kostas Papadimitriou
            this.handle_vm_remove();
340 550d9733 Kostas Papadimitriou
        },
341 f0532b59 Kostas Papadimitriou
        
342 f0532b59 Kostas Papadimitriou
        _handle_vm_change: function(vm) {
343 550d9733 Kostas Papadimitriou
            this._update_vm_details();
344 f0532b59 Kostas Papadimitriou
            this.handle_vm_change(vm);
345 550d9733 Kostas Papadimitriou
        },
346 550d9733 Kostas Papadimitriou
        
347 550d9733 Kostas Papadimitriou
        beforeClose: function() {
348 550d9733 Kostas Papadimitriou
            this.unbind_vm_handlers();
349 550d9733 Kostas Papadimitriou
            this.vm = undefined;
350 550d9733 Kostas Papadimitriou
        },
351 550d9733 Kostas Papadimitriou
352 550d9733 Kostas Papadimitriou
        show: function(vm) {
353 550d9733 Kostas Papadimitriou
            this.set_vm(vm);
354 550d9733 Kostas Papadimitriou
            views.VMOverlay.__super__.show.apply(this, arguments);
355 550d9733 Kostas Papadimitriou
            this._update_vm_details();
356 550d9733 Kostas Papadimitriou
        }
357 550d9733 Kostas Papadimitriou
358 550d9733 Kostas Papadimitriou
    });
359 550d9733 Kostas Papadimitriou
360 5dad72ea Kostas Papadimitriou
    snf.config.update_hidden_views = true;
361 5dad72ea Kostas Papadimitriou
362 8d08f18a Kostas Papadimitriou
})(this);