Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (11.2 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 8d08f18a Kostas Papadimitriou
        initialize: function() {
65 8d08f18a Kostas Papadimitriou
            this.log = new snf.logging.logger("SNF-VIEWS:" + this.view_id);
66 8d08f18a Kostas Papadimitriou
        },
67 122850c5 Kostas Papadimitriou
    
68 8d08f18a Kostas Papadimitriou
        // is the view visible ?
69 8d08f18a Kostas Papadimitriou
        visible: function(){
70 8d08f18a Kostas Papadimitriou
            return $(this.el).is(":visible");
71 8d08f18a Kostas Papadimitriou
        },
72 8d08f18a Kostas Papadimitriou
        
73 8d08f18a Kostas Papadimitriou
        // hide view
74 e673a761 Kostas Papadimitriou
        hide: function(force) {
75 e673a761 Kostas Papadimitriou
            if (!this.visible() && !force) { return this };
76 8d08f18a Kostas Papadimitriou
            return $(this.el).hide();
77 8d08f18a Kostas Papadimitriou
        },
78 8d08f18a Kostas Papadimitriou
        
79 8d08f18a Kostas Papadimitriou
        // show view
80 8d08f18a Kostas Papadimitriou
        show: function() {
81 8d08f18a Kostas Papadimitriou
            if (this.visible()) { return this };
82 8d08f18a Kostas Papadimitriou
            $(this.el).show();
83 8d08f18a Kostas Papadimitriou
            if (this.show_view) { this.show_view.apply(this, arguments)};
84 8d08f18a Kostas Papadimitriou
        },
85 8d08f18a Kostas Papadimitriou
86 8d08f18a Kostas Papadimitriou
        sel: function(id) {
87 8d08f18a Kostas Papadimitriou
            return this.$(this.selectors[id]);
88 8d08f18a Kostas Papadimitriou
        },
89 8d08f18a Kostas Papadimitriou
90 8d08f18a Kostas Papadimitriou
        // animations
91 8d08f18a Kostas Papadimitriou
        fadeIn: function(time, callback) {
92 8d08f18a Kostas Papadimitriou
            $(this.el).fadeIn(time, callback);
93 8d08f18a Kostas Papadimitriou
            return this.show();
94 8d08f18a Kostas Papadimitriou
        },
95 8d08f18a Kostas Papadimitriou
96 8d08f18a Kostas Papadimitriou
        fadeOut: function(time, callback) {
97 8d08f18a Kostas Papadimitriou
            $(this.el).fadeOut(time, callback);
98 8d08f18a Kostas Papadimitriou
            return this.hide();
99 8d08f18a Kostas Papadimitriou
        }
100 8d08f18a Kostas Papadimitriou
    });
101 8d08f18a Kostas Papadimitriou
    
102 8d08f18a Kostas Papadimitriou
    
103 8d08f18a Kostas Papadimitriou
    // overlays registry
104 8d08f18a Kostas Papadimitriou
    views._overlay_index = [];
105 8d08f18a Kostas Papadimitriou
106 8d08f18a Kostas Papadimitriou
    // overlay view helper
107 8d08f18a Kostas Papadimitriou
    views.Overlay = views.View.extend({
108 8d08f18a Kostas Papadimitriou
        view_id: 'overlay',
109 8d08f18a Kostas Papadimitriou
        tpl_selector: '#generic-overlay-tpl',
110 8d08f18a Kostas Papadimitriou
        css_class: 'overlay',
111 8d08f18a Kostas Papadimitriou
        oneInstance: true,
112 8d08f18a Kostas Papadimitriou
        fixed: false,
113 8d08f18a Kostas Papadimitriou
114 8d08f18a Kostas Papadimitriou
        initialize: function(options, selector) {
115 8d08f18a Kostas Papadimitriou
            this.defaults = {
116 8d08f18a Kostas Papadimitriou
                load: false,
117 8d08f18a Kostas Papadimitriou
                closeOnClick: false,
118 9ce969a7 Kostas Papadimitriou
                closeOnEsc: false,
119 8d08f18a Kostas Papadimitriou
                mask: {
120 8d08f18a Kostas Papadimitriou
                    color: "#444",
121 2506f741 Kostas Papadimitriou
                    loadSpeed: snf.config.overlay_speed || 0,
122 8d08f18a Kostas Papadimitriou
                    opacity: 0.7
123 2506f741 Kostas Papadimitriou
                },
124 2506f741 Kostas Papadimitriou
                speed: snf.config.overlay_speed || 200
125 8d08f18a Kostas Papadimitriou
            }
126 8d08f18a Kostas Papadimitriou
            
127 8d08f18a Kostas Papadimitriou
            this.tpl_selector = selector || this.tpl_selector;
128 8d08f18a Kostas Papadimitriou
            views.Overlay.__super__.initialize.apply(this);
129 8d08f18a Kostas Papadimitriou
            views._overlay_index.push(this);
130 8d08f18a Kostas Papadimitriou
131 8d08f18a Kostas Papadimitriou
            this.options = _.extend(this.defaults, options);
132 a1481c1d Kostas Papadimitriou
            this.options.clone = this.options.clone == undefined ? true : this.options.clone;
133 8d08f18a Kostas Papadimitriou
            this.options.fixed = this.fixed;
134 8d08f18a Kostas Papadimitriou
135 8d08f18a Kostas Papadimitriou
            this.options.onOpen = this.options.onOpen || function() {};
136 8d08f18a Kostas Papadimitriou
            this.options.onClose = this.options.onClose || function() {};
137 8d08f18a Kostas Papadimitriou
            this.options.beforeOpen = this.options.beforeOpen || function() {};
138 8d08f18a Kostas Papadimitriou
            this.options.beforeClose = this.options.beforeClose || function() {};
139 8d08f18a Kostas Papadimitriou
            this.el = this.create_element();
140 8d08f18a Kostas Papadimitriou
            this.el.hide();
141 8d08f18a Kostas Papadimitriou
        
142 8d08f18a Kostas Papadimitriou
            var ajax_params = _.clone(this.options);
143 8d08f18a Kostas Papadimitriou
144 8d08f18a Kostas Papadimitriou
            ajax_params.onBeforeLoad = _.bind(this._beforeOpen, this);
145 8d08f18a Kostas Papadimitriou
            ajax_params.onLoad = _.bind(this._onOpen, this);
146 8d08f18a Kostas Papadimitriou
            ajax_params.onBeforeClose = _.bind(this._beforeClose, this);
147 8d08f18a Kostas Papadimitriou
            ajax_params.onClose = _.bind(this._onClose, this);
148 8d08f18a Kostas Papadimitriou
            ajax_params.oneInstance = this.oneInstance;
149 8d08f18a Kostas Papadimitriou
            // create overlay
150 8d08f18a Kostas Papadimitriou
            // TODO: does this return overlay object ?? (to avoid the next code line)
151 8d08f18a Kostas Papadimitriou
            $(this.el).overlay(ajax_params);
152 8d08f18a Kostas Papadimitriou
153 8d08f18a Kostas Papadimitriou
            this.overlay = $(this.el).overlay();
154 8d08f18a Kostas Papadimitriou
            this.append_css = this.options ? this.options.css_class ? this.options.css_class : "" : "";
155 9ffd10ce Kostas Papadimitriou
156 9ffd10ce Kostas Papadimitriou
            this.is_visible = false;
157 8d08f18a Kostas Papadimitriou
            return this;
158 8d08f18a Kostas Papadimitriou
        },
159 8d08f18a Kostas Papadimitriou
160 8d08f18a Kostas Papadimitriou
        create_element: function() {
161 8d08f18a Kostas Papadimitriou
            var el = undefined;
162 8d08f18a Kostas Papadimitriou
            if (this.options.clone) {
163 8d08f18a Kostas Papadimitriou
                el = $(this.tpl_selector).clone();
164 8d08f18a Kostas Papadimitriou
            } else {
165 8d08f18a Kostas Papadimitriou
                el = $(this.tpl_selector);
166 8d08f18a Kostas Papadimitriou
            }
167 8d08f18a Kostas Papadimitriou
            
168 8d08f18a Kostas Papadimitriou
            // append content
169 8d08f18a Kostas Papadimitriou
            if (this.content_selector) {
170 8d08f18a Kostas Papadimitriou
                var content = $(this.content_selector).clone();
171 8d08f18a Kostas Papadimitriou
                content.addClass("content");
172 8d08f18a Kostas Papadimitriou
                
173 8d08f18a Kostas Papadimitriou
                if ($(el).find(".content").length) {
174 8d08f18a Kostas Papadimitriou
                    $(el).find(".content").replaceWith(content);
175 8d08f18a Kostas Papadimitriou
                }
176 8d08f18a Kostas Papadimitriou
                content.removeClass("hidden");
177 8d08f18a Kostas Papadimitriou
            }
178 8d08f18a Kostas Papadimitriou
179 8d08f18a Kostas Papadimitriou
            if (this.overlay_id) {
180 8d08f18a Kostas Papadimitriou
            }
181 8d08f18a Kostas Papadimitriou
182 8d08f18a Kostas Papadimitriou
            $(el).addClass("overlay");
183 8d08f18a Kostas Papadimitriou
            if (this.css_class) {
184 8d08f18a Kostas Papadimitriou
                $(el).addClass(this.css_class);
185 8d08f18a Kostas Papadimitriou
            }
186 8d08f18a Kostas Papadimitriou
            
187 8d08f18a Kostas Papadimitriou
            if (this.options.clone) {
188 8d08f18a Kostas Papadimitriou
                $("body").append(el);
189 8d08f18a Kostas Papadimitriou
            }
190 8d08f18a Kostas Papadimitriou
191 8d08f18a Kostas Papadimitriou
            return el;
192 8d08f18a Kostas Papadimitriou
        },
193 8d08f18a Kostas Papadimitriou
194 8d08f18a Kostas Papadimitriou
        set_title: function(title) {
195 8d08f18a Kostas Papadimitriou
            if (title || this.title) {
196 9ee7d495 Kostas Papadimitriou
                $(this.el).find(".overlay-header .title").html(title || this.title)
197 8d08f18a Kostas Papadimitriou
            }
198 8d08f18a Kostas Papadimitriou
        },
199 8d08f18a Kostas Papadimitriou
200 8d08f18a Kostas Papadimitriou
        set_subtitle: function(subtitle) {
201 8d08f18a Kostas Papadimitriou
            if (subtitle || this.subtitle) {
202 9ee7d495 Kostas Papadimitriou
                $(this.el).find(".overlay-header .subtitle").html(subtitle || this.subtitle)
203 8d08f18a Kostas Papadimitriou
            }
204 8d08f18a Kostas Papadimitriou
        },
205 8d08f18a Kostas Papadimitriou
206 8d08f18a Kostas Papadimitriou
        _beforeOpen: function() {
207 9ffd10ce Kostas Papadimitriou
            this.is_visible = true;
208 8d08f18a Kostas Papadimitriou
            if (this.append_css) {
209 8d08f18a Kostas Papadimitriou
                $(this.el).addClass(this.append_css);
210 8d08f18a Kostas Papadimitriou
            }
211 8d08f18a Kostas Papadimitriou
212 8d08f18a Kostas Papadimitriou
            this.set_title();
213 8d08f18a Kostas Papadimitriou
            this.set_subtitle();
214 8d08f18a Kostas Papadimitriou
            
215 8d08f18a Kostas Papadimitriou
            this.beforeOpen.apply(this, arguments);
216 8d08f18a Kostas Papadimitriou
            this.options.beforeOpen.apply(this, arguments);
217 8d08f18a Kostas Papadimitriou
        },
218 8d08f18a Kostas Papadimitriou
219 8d08f18a Kostas Papadimitriou
        _onOpen: function() {
220 9ce969a7 Kostas Papadimitriou
            // clear previously bound click events
221 9ce969a7 Kostas Papadimitriou
            $(this.el).find(".closeme").unbind("click");
222 9ce969a7 Kostas Papadimitriou
223 8d08f18a Kostas Papadimitriou
            if ($(this.el).find(".closeme").length) {
224 8d08f18a Kostas Papadimitriou
                $(this.el).find(".closeme").click(_.bind(function(){
225 8d08f18a Kostas Papadimitriou
                    this.hide();
226 8d08f18a Kostas Papadimitriou
                }, this))
227 8d08f18a Kostas Papadimitriou
            }
228 8d08f18a Kostas Papadimitriou
            this.onOpen.apply(this, arguments);
229 8d08f18a Kostas Papadimitriou
            this.options.onOpen.apply(this, arguments);
230 8d08f18a Kostas Papadimitriou
        },
231 8d08f18a Kostas Papadimitriou
232 8d08f18a Kostas Papadimitriou
        _beforeClose: function() {
233 9ffd10ce Kostas Papadimitriou
            this.is_visible = false;
234 8d08f18a Kostas Papadimitriou
            this.beforeClose.apply(this, arguments);
235 8d08f18a Kostas Papadimitriou
            this.options.beforeClose.apply(this, arguments);
236 8d08f18a Kostas Papadimitriou
        },
237 8d08f18a Kostas Papadimitriou
238 8d08f18a Kostas Papadimitriou
        _onClose: function() {
239 8d08f18a Kostas Papadimitriou
            if (this.append_css) {
240 8d08f18a Kostas Papadimitriou
                $(this.el).removeClass(this.append_css);
241 8d08f18a Kostas Papadimitriou
            }
242 8d08f18a Kostas Papadimitriou
            this.onClose.apply(this, arguments);
243 8d08f18a Kostas Papadimitriou
            this.options.onClose.apply(this, arguments);
244 8d08f18a Kostas Papadimitriou
        },
245 8d08f18a Kostas Papadimitriou
246 8d08f18a Kostas Papadimitriou
        beforeOpen: function () {},
247 8d08f18a Kostas Papadimitriou
        onOpen: function () {},
248 8d08f18a Kostas Papadimitriou
        beforeClose: function () {},
249 8d08f18a Kostas Papadimitriou
        onClose: function () {},
250 8d08f18a Kostas Papadimitriou
251 8d08f18a Kostas Papadimitriou
        show: function() {
252 96d725ac Kostas Papadimitriou
            // close opened overlays
253 8d08f18a Kostas Papadimitriou
            var hidden = false;
254 8d08f18a Kostas Papadimitriou
            _.each(views._overlay_index, function(ovr){
255 8d08f18a Kostas Papadimitriou
                if (ovr == this) { return };
256 8d08f18a Kostas Papadimitriou
                if (ovr.visible()) {
257 8d08f18a Kostas Papadimitriou
                    hidden = true;
258 8d08f18a Kostas Papadimitriou
                    ovr.hide();
259 8d08f18a Kostas Papadimitriou
                }
260 8d08f18a Kostas Papadimitriou
            })
261 8d08f18a Kostas Papadimitriou
262 96d725ac Kostas Papadimitriou
            // do we need to wait for other overlays to close ???
263 96d725ac Kostas Papadimitriou
            if (hidden) { delay = 300; } else { delay = 0; }
264 9ffd10ce Kostas Papadimitriou
265 9ffd10ce Kostas Papadimitriou
            this.is_visible = true;
266 8d08f18a Kostas Papadimitriou
            window.setTimeout(_.bind(function(){ this.overlay.load() }, this), delay)
267 8d08f18a Kostas Papadimitriou
            return this;
268 8d08f18a Kostas Papadimitriou
        },
269 8d08f18a Kostas Papadimitriou
270 8d08f18a Kostas Papadimitriou
        hide: function() {
271 550d9733 Kostas Papadimitriou
            if (!this.overlay.isOpened()) {
272 550d9733 Kostas Papadimitriou
                // if its not opened events wont trigger
273 550d9733 Kostas Papadimitriou
                this._onClose()
274 550d9733 Kostas Papadimitriou
            } else {
275 550d9733 Kostas Papadimitriou
                this.overlay.close();
276 550d9733 Kostas Papadimitriou
            }
277 8d08f18a Kostas Papadimitriou
            return this;
278 8d08f18a Kostas Papadimitriou
        }
279 8d08f18a Kostas Papadimitriou
    });
280 8d08f18a Kostas Papadimitriou
281 550d9733 Kostas Papadimitriou
    
282 550d9733 Kostas Papadimitriou
    // overlay view helper
283 550d9733 Kostas Papadimitriou
    views.VMOverlay = views.Overlay.extend({
284 550d9733 Kostas Papadimitriou
285 550d9733 Kostas Papadimitriou
        initialize: function() {
286 550d9733 Kostas Papadimitriou
            views.VMOverlay.__super__.initialize.apply(this);
287 550d9733 Kostas Papadimitriou
            this.vm = undefined;
288 550d9733 Kostas Papadimitriou
            this.view_id_tpl = this.view_id;
289 550d9733 Kostas Papadimitriou
290 f0532b59 Kostas Papadimitriou
            _.bindAll(this, "_handle_vm_change", "_handle_vm_remove");
291 550d9733 Kostas Papadimitriou
        },
292 550d9733 Kostas Papadimitriou
293 550d9733 Kostas Papadimitriou
        set_vm: function(vm) {
294 550d9733 Kostas Papadimitriou
            if (this.vm) { this.unbind_vm_handlers };
295 550d9733 Kostas Papadimitriou
            this.vm = vm;
296 550d9733 Kostas Papadimitriou
            this.view_id = this.view_id + "_" + vm.id;
297 550d9733 Kostas Papadimitriou
            this.bind_vm_handlers();
298 550d9733 Kostas Papadimitriou
        },
299 550d9733 Kostas Papadimitriou
300 550d9733 Kostas Papadimitriou
        bind_vm_handlers: function() {
301 550d9733 Kostas Papadimitriou
            this.log.debug("binding handlers");
302 f0532b59 Kostas Papadimitriou
            this.vm.bind("change", this._handle_vm_change);
303 f0532b59 Kostas Papadimitriou
            storage.vms.bind("remove", this._handle_vm_remove);
304 550d9733 Kostas Papadimitriou
        },
305 550d9733 Kostas Papadimitriou
        
306 550d9733 Kostas Papadimitriou
        unbind_vm_handlers: function() {
307 550d9733 Kostas Papadimitriou
            this.log.debug("unbinding handlers", this.vm);
308 550d9733 Kostas Papadimitriou
            if (!this.vm) { return };
309 f0532b59 Kostas Papadimitriou
            this.vm.unbind("change", this._handle_vm_change);
310 f0532b59 Kostas Papadimitriou
            storage.vms.unbind("remove", this._handle_vm_remove);
311 550d9733 Kostas Papadimitriou
        },
312 550d9733 Kostas Papadimitriou
        
313 550d9733 Kostas Papadimitriou
        _update_vm_details: function() { 
314 550d9733 Kostas Papadimitriou
            if (!this.vm) { console.error("invalid view state"); return }
315 df251d55 Kostas Papadimitriou
            this.set_subtitle(this.vm.escape("name") + snf.ui.helpers.vm_icon_tag(this.vm, "small"));
316 550d9733 Kostas Papadimitriou
            this.update_vm_details() 
317 550d9733 Kostas Papadimitriou
        },
318 550d9733 Kostas Papadimitriou
319 550d9733 Kostas Papadimitriou
        update_vm_details: function() {},
320 f0532b59 Kostas Papadimitriou
        handle_vm_remove: function() {},
321 f0532b59 Kostas Papadimitriou
        handle_vm_change: function () {},
322 f0532b59 Kostas Papadimitriou
        
323 f0532b59 Kostas Papadimitriou
        _handle_vm_remove: function(vm, collection) {
324 550d9733 Kostas Papadimitriou
            if (this.vm && vm.id == this.vm.id) {
325 550d9733 Kostas Papadimitriou
                this.hide();
326 550d9733 Kostas Papadimitriou
            }
327 f0532b59 Kostas Papadimitriou
            this.handle_vm_remove();
328 550d9733 Kostas Papadimitriou
        },
329 f0532b59 Kostas Papadimitriou
        
330 f0532b59 Kostas Papadimitriou
        _handle_vm_change: function(vm) {
331 550d9733 Kostas Papadimitriou
            this._update_vm_details();
332 f0532b59 Kostas Papadimitriou
            this.handle_vm_change(vm);
333 550d9733 Kostas Papadimitriou
        },
334 550d9733 Kostas Papadimitriou
        
335 550d9733 Kostas Papadimitriou
        beforeClose: function() {
336 550d9733 Kostas Papadimitriou
            this.unbind_vm_handlers();
337 550d9733 Kostas Papadimitriou
            this.vm = undefined;
338 550d9733 Kostas Papadimitriou
        },
339 550d9733 Kostas Papadimitriou
340 550d9733 Kostas Papadimitriou
        show: function(vm) {
341 550d9733 Kostas Papadimitriou
            this.set_vm(vm);
342 550d9733 Kostas Papadimitriou
            views.VMOverlay.__super__.show.apply(this, arguments);
343 550d9733 Kostas Papadimitriou
            this._update_vm_details();
344 550d9733 Kostas Papadimitriou
        }
345 550d9733 Kostas Papadimitriou
346 550d9733 Kostas Papadimitriou
    });
347 550d9733 Kostas Papadimitriou
348 5dad72ea Kostas Papadimitriou
    snf.config.update_hidden_views = true;
349 5dad72ea Kostas Papadimitriou
350 8d08f18a Kostas Papadimitriou
})(this);