Statistics
| Branch: | Tag: | Revision:

root / ui / static / snf / js / ui / web / ui_icon_view.js @ b042eb04

History | View | Annotate | Download (27.2 kB)

1 8d08f18a Kostas Papadimitriou
;(function(root){
2 8d08f18a Kostas Papadimitriou
3 8d08f18a Kostas Papadimitriou
    // root
4 8d08f18a Kostas Papadimitriou
    var root = root;
5 8d08f18a Kostas Papadimitriou
    
6 8d08f18a Kostas Papadimitriou
    // setup namepsaces
7 8d08f18a Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
8 8d08f18a Kostas Papadimitriou
    var models = snf.models = snf.models || {}
9 8d08f18a Kostas Papadimitriou
    var storage = snf.storage = snf.storage || {};
10 8d08f18a Kostas Papadimitriou
    var ui = snf.ui = snf.ui || {};
11 8d08f18a Kostas Papadimitriou
    var util = snf.util = snf.util || {};
12 8d08f18a Kostas Papadimitriou
13 8d08f18a Kostas Papadimitriou
    var views = snf.views = snf.views || {}
14 8d08f18a Kostas Papadimitriou
15 8d08f18a Kostas Papadimitriou
    // shortcuts
16 8d08f18a Kostas Papadimitriou
    var bb = root.Backbone;
17 8d08f18a Kostas Papadimitriou
    
18 8d08f18a Kostas Papadimitriou
    // handle extended info toggler
19 6a3a5bf7 Kostas Papadimitriou
    views.VMActionErrorView = views.View.extend({
20 6a3a5bf7 Kostas Papadimitriou
    
21 6a3a5bf7 Kostas Papadimitriou
        initialize: function (vm, view) {
22 6a3a5bf7 Kostas Papadimitriou
            this.vm = vm;
23 6a3a5bf7 Kostas Papadimitriou
            this.view = view;
24 6a3a5bf7 Kostas Papadimitriou
            this.vm_view = this.view.vm(vm);
25 6a3a5bf7 Kostas Papadimitriou
26 6a3a5bf7 Kostas Papadimitriou
            this.has_error = false;
27 6a3a5bf7 Kostas Papadimitriou
            
28 6a3a5bf7 Kostas Papadimitriou
            this.error = this.vm_view.find(".action-error");
29 6a3a5bf7 Kostas Papadimitriou
            this.close = this.vm_view.find(".close-action-error");
30 6a3a5bf7 Kostas Papadimitriou
            this.show_btn = this.vm_view.find(".show-action-error");
31 6a3a5bf7 Kostas Papadimitriou
32 6a3a5bf7 Kostas Papadimitriou
            this.init_handlers();
33 6a3a5bf7 Kostas Papadimitriou
            this.update_layout();
34 6a3a5bf7 Kostas Papadimitriou
        },
35 6a3a5bf7 Kostas Papadimitriou
36 6a3a5bf7 Kostas Papadimitriou
        init_handlers: function() {
37 6a3a5bf7 Kostas Papadimitriou
            // action call failed notify the user
38 6a3a5bf7 Kostas Papadimitriou
            this.vm.bind("action:fail", _.bind(function(args){
39 6a3a5bf7 Kostas Papadimitriou
                if (this.vm.action_error) {
40 6a3a5bf7 Kostas Papadimitriou
                    this.has_error = true;
41 06bea1ee Kostas Papadimitriou
                    var action = "undefined";
42 06bea1ee Kostas Papadimitriou
                    try {
43 9ce969a7 Kostas Papadimitriou
                        action = _.last(args).error_params.extra_details['Action'];
44 06bea1ee Kostas Papadimitriou
                    } catch (err) {console.log(err)};
45 06bea1ee Kostas Papadimitriou
                    
46 6a3a5bf7 Kostas Papadimitriou
                    this.error.find(".action").text(action);
47 6a3a5bf7 Kostas Papadimitriou
                    this.error.show();
48 6a3a5bf7 Kostas Papadimitriou
                }
49 6a3a5bf7 Kostas Papadimitriou
            }, this));
50 6a3a5bf7 Kostas Papadimitriou
            
51 6a3a5bf7 Kostas Papadimitriou
            // show error overlay
52 6a3a5bf7 Kostas Papadimitriou
            this.show_btn.click(_.bind(function() {
53 9ce969a7 Kostas Papadimitriou
                if (this.vm.action_error) {
54 9ce969a7 Kostas Papadimitriou
                    this.show_error_overlay(this.vm.action_error);
55 9ce969a7 Kostas Papadimitriou
                }
56 6a3a5bf7 Kostas Papadimitriou
                this.vm.reset_action_error();
57 6a3a5bf7 Kostas Papadimitriou
            }, this));
58 6a3a5bf7 Kostas Papadimitriou
            
59 6a3a5bf7 Kostas Papadimitriou
            // user requests to forget about the error
60 6a3a5bf7 Kostas Papadimitriou
            this.close.click(_.bind(_.bind(function() {
61 6a3a5bf7 Kostas Papadimitriou
                this.error.hide();
62 6a3a5bf7 Kostas Papadimitriou
                this.vm.reset_action_error();
63 6a3a5bf7 Kostas Papadimitriou
            }, this)));
64 6a3a5bf7 Kostas Papadimitriou
            
65 6a3a5bf7 Kostas Papadimitriou
            // hide error message if action fail get reset
66 6a3a5bf7 Kostas Papadimitriou
            this.vm.bind("action:fail:reset", _.bind(function(){
67 6a3a5bf7 Kostas Papadimitriou
                this.error.hide();
68 6a3a5bf7 Kostas Papadimitriou
            }, this));
69 6a3a5bf7 Kostas Papadimitriou
        },
70 6a3a5bf7 Kostas Papadimitriou
71 9ce969a7 Kostas Papadimitriou
        show_error_overlay: function(args) {
72 9ce969a7 Kostas Papadimitriou
            var args = util.parse_api_error.apply(util, args);
73 6a3a5bf7 Kostas Papadimitriou
            
74 6a3a5bf7 Kostas Papadimitriou
            // force logout if UNAUTHORIZED request arrives
75 6a3a5bf7 Kostas Papadimitriou
            if (args.code == 401) { snf.ui.logout(); return };
76 9ce969a7 Kostas Papadimitriou
            
77 6a3a5bf7 Kostas Papadimitriou
            var error_entry = [args.ns, args.code, args.message, args.type, args.details, args];
78 6a3a5bf7 Kostas Papadimitriou
            ui.main.error_view.show_error.apply(ui.main.error_view, error_entry);
79 6a3a5bf7 Kostas Papadimitriou
        },
80 6a3a5bf7 Kostas Papadimitriou
81 6a3a5bf7 Kostas Papadimitriou
        update_layout: function() {
82 6a3a5bf7 Kostas Papadimitriou
            if (this.vm.action_error) {
83 6a3a5bf7 Kostas Papadimitriou
                this.error.show();
84 6a3a5bf7 Kostas Papadimitriou
            }
85 6a3a5bf7 Kostas Papadimitriou
        }
86 6a3a5bf7 Kostas Papadimitriou
    });
87 6a3a5bf7 Kostas Papadimitriou
88 6a3a5bf7 Kostas Papadimitriou
    // handle extended info toggler
89 8d08f18a Kostas Papadimitriou
    views.IconInfoView = views.View.extend({
90 8d08f18a Kostas Papadimitriou
    
91 8d08f18a Kostas Papadimitriou
        initialize: function (vm, view) {
92 8d08f18a Kostas Papadimitriou
            this.vm = vm;
93 8d08f18a Kostas Papadimitriou
            this.view = view;
94 8d08f18a Kostas Papadimitriou
            this.vm_view = this.view.vm(vm);
95 8d08f18a Kostas Papadimitriou
            
96 8d08f18a Kostas Papadimitriou
            this.info_link = $(".toggler", this.vm_view);
97 8d08f18a Kostas Papadimitriou
            this.el = $("div.info-content", this.vm_view);
98 8d08f18a Kostas Papadimitriou
            this.toggler = $(".toggler", this.vm_view);
99 8d08f18a Kostas Papadimitriou
            this.label = $(".label", this.vm_view);
100 8d08f18a Kostas Papadimitriou
101 8d08f18a Kostas Papadimitriou
            this.set_handlers();
102 8d08f18a Kostas Papadimitriou
        },
103 8d08f18a Kostas Papadimitriou
104 8d08f18a Kostas Papadimitriou
        set_handlers: function() {
105 8d08f18a Kostas Papadimitriou
            this.info_link.click(_.bind(function(){
106 8d08f18a Kostas Papadimitriou
                this.el.slideToggle();
107 8d08f18a Kostas Papadimitriou
                this.view.vm(this.vm).toggleClass("light-background");
108 8d08f18a Kostas Papadimitriou
109 8d08f18a Kostas Papadimitriou
                if (this.toggler.hasClass("open")) {
110 8d08f18a Kostas Papadimitriou
                    this.toggler.removeClass("open");
111 2c9bfad1 Kostas Papadimitriou
                    this.vm.stop_stats_update();
112 8d08f18a Kostas Papadimitriou
                } else {
113 8d08f18a Kostas Papadimitriou
                    this.toggler.addClass("open");
114 44660f58 Kostas Papadimitriou
                    this.view.details_views[this.vm.id].update_layout();
115 44660f58 Kostas Papadimitriou
                    this.view.tags_views[this.vm.id].update_layout();
116 44660f58 Kostas Papadimitriou
                    this.view.stats_views[this.vm.id].update_layout();
117 8d08f18a Kostas Papadimitriou
                }
118 8d08f18a Kostas Papadimitriou
                
119 8d08f18a Kostas Papadimitriou
                var self = this;
120 8d08f18a Kostas Papadimitriou
                window.setTimeout(function() {$(self.view).trigger("resize")}, 300);
121 8d08f18a Kostas Papadimitriou
            }, this));
122 8d08f18a Kostas Papadimitriou
123 8d08f18a Kostas Papadimitriou
            this.$(".stats-report").click(_.bind(function(){
124 8d08f18a Kostas Papadimitriou
                snf.ui.main.show_vm_details(this.vm);
125 8d08f18a Kostas Papadimitriou
            }, this))
126 8d08f18a Kostas Papadimitriou
        }
127 8d08f18a Kostas Papadimitriou
    
128 8d08f18a Kostas Papadimitriou
    })
129 8d08f18a Kostas Papadimitriou
130 8d08f18a Kostas Papadimitriou
    // rename handler view
131 8d08f18a Kostas Papadimitriou
    // only icon view contains rename capability
132 8d08f18a Kostas Papadimitriou
    views.IconRenameView = views.View.extend({
133 8d08f18a Kostas Papadimitriou
        
134 8d08f18a Kostas Papadimitriou
        initialize: function(vm, view) {
135 8d08f18a Kostas Papadimitriou
            this.vm = vm;
136 8d08f18a Kostas Papadimitriou
            this.view = view;
137 8d08f18a Kostas Papadimitriou
            // name container
138 23a3bb8e Kostas Papadimitriou
            this.el = $('div#' + this.view.id_tpl + vm.id + " div.name").get(0);
139 8d08f18a Kostas Papadimitriou
            // name inline element
140 8d08f18a Kostas Papadimitriou
            this.name = this.$('span.name');
141 8d08f18a Kostas Papadimitriou
            // rename button
142 8d08f18a Kostas Papadimitriou
            this.rename = this.$('span.rename');
143 8d08f18a Kostas Papadimitriou
            // save button
144 8d08f18a Kostas Papadimitriou
            this.save = this.$('.save');
145 8d08f18a Kostas Papadimitriou
            // cancel rename button
146 8d08f18a Kostas Papadimitriou
            this.cancel = this.$('.cancel');
147 8d08f18a Kostas Papadimitriou
            // where to place the input field
148 8d08f18a Kostas Papadimitriou
            this.edit_cont = this.$(".namecontainer");
149 8d08f18a Kostas Papadimitriou
            // buttons container
150 8d08f18a Kostas Papadimitriou
            this.buttons = this.$(".editbuttons");
151 8d08f18a Kostas Papadimitriou
            // current state
152 8d08f18a Kostas Papadimitriou
            this.renaming = false;
153 8d08f18a Kostas Papadimitriou
            // init event handlers
154 8d08f18a Kostas Papadimitriou
            this.set_handlers();
155 8d08f18a Kostas Papadimitriou
            // paint
156 8d08f18a Kostas Papadimitriou
            this.update_layout();
157 8d08f18a Kostas Papadimitriou
            views.IconRenameView.__super__.initialize.call(this);
158 8d08f18a Kostas Papadimitriou
        },
159 8d08f18a Kostas Papadimitriou
        
160 8d08f18a Kostas Papadimitriou
        // update elements visibility/state
161 8d08f18a Kostas Papadimitriou
        update_layout: function() {
162 8d08f18a Kostas Papadimitriou
            // if in renaming state
163 8d08f18a Kostas Papadimitriou
            if (this.renaming) {
164 8d08f18a Kostas Papadimitriou
                // if name is hidden we are already in renaming state
165 8d08f18a Kostas Papadimitriou
                // dont do nothing
166 8d08f18a Kostas Papadimitriou
                if (this.name.is(":hidden")){return}
167 8d08f18a Kostas Papadimitriou
                
168 8d08f18a Kostas Papadimitriou
                // hide name element to make space for the 
169 8d08f18a Kostas Papadimitriou
                // text input
170 8d08f18a Kostas Papadimitriou
                this.name.hide();
171 8d08f18a Kostas Papadimitriou
                this.rename.hide();
172 8d08f18a Kostas Papadimitriou
                // show confirm/cancel buttons
173 8d08f18a Kostas Papadimitriou
                this.buttons.show();
174 8d08f18a Kostas Papadimitriou
                // create text element
175 8d08f18a Kostas Papadimitriou
                this.create_input();
176 8d08f18a Kostas Papadimitriou
            } else {
177 8d08f18a Kostas Papadimitriou
                // name is visible not in edit mode
178 8d08f18a Kostas Papadimitriou
                if (this.name.is(":visible")){return}
179 8d08f18a Kostas Papadimitriou
180 8d08f18a Kostas Papadimitriou
                this.name.show();
181 8d08f18a Kostas Papadimitriou
                this.rename.show();
182 8d08f18a Kostas Papadimitriou
                this.buttons.hide();
183 8d08f18a Kostas Papadimitriou
                this.remove_input();
184 8d08f18a Kostas Papadimitriou
            }
185 8d08f18a Kostas Papadimitriou
        },
186 8d08f18a Kostas Papadimitriou
        
187 8d08f18a Kostas Papadimitriou
        // create rename input field and set appropriate 
188 8d08f18a Kostas Papadimitriou
        // event handlers
189 8d08f18a Kostas Papadimitriou
        create_input: function() {
190 8d08f18a Kostas Papadimitriou
            var self = this;
191 8d08f18a Kostas Papadimitriou
            this.edit_cont.append('<input class="vm-rename nametextbox" type="text" />');
192 8d08f18a Kostas Papadimitriou
            this.$('input').val(this.vm.get('name'));
193 8d08f18a Kostas Papadimitriou
            // give edit focus
194 8d08f18a Kostas Papadimitriou
            this.$('input').focus();
195 8d08f18a Kostas Papadimitriou
            // handle enter press
196 8d08f18a Kostas Papadimitriou
            this.$('input').keypress(function(ev){
197 8d08f18a Kostas Papadimitriou
                if (ev.charCode == 13) {
198 8d08f18a Kostas Papadimitriou
                    self.submit();
199 8d08f18a Kostas Papadimitriou
                }
200 8d08f18a Kostas Papadimitriou
            })
201 8d08f18a Kostas Papadimitriou
        },
202 8d08f18a Kostas Papadimitriou
        
203 8d08f18a Kostas Papadimitriou
        // remove input element
204 8d08f18a Kostas Papadimitriou
        remove_input: function() {
205 8d08f18a Kostas Papadimitriou
            this.$('input').remove();
206 8d08f18a Kostas Papadimitriou
        },
207 8d08f18a Kostas Papadimitriou
        
208 8d08f18a Kostas Papadimitriou
        // initialize event handlers
209 8d08f18a Kostas Papadimitriou
        set_handlers: function() {
210 8d08f18a Kostas Papadimitriou
            var self = this;
211 8d08f18a Kostas Papadimitriou
            // start rename when rename button is pressed
212 8d08f18a Kostas Papadimitriou
            this.rename.click(function() {
213 8d08f18a Kostas Papadimitriou
                self.renaming = true;
214 8d08f18a Kostas Papadimitriou
                self.update_layout();
215 8d08f18a Kostas Papadimitriou
            });
216 8d08f18a Kostas Papadimitriou
            
217 8d08f18a Kostas Papadimitriou
            // double click on name
218 8d08f18a Kostas Papadimitriou
            $(this.el).dblclick(function() {
219 8d08f18a Kostas Papadimitriou
                self.renaming = true;
220 8d08f18a Kostas Papadimitriou
                self.update_layout();
221 8d08f18a Kostas Papadimitriou
            });
222 8d08f18a Kostas Papadimitriou
223 8d08f18a Kostas Papadimitriou
            // cancel rename
224 8d08f18a Kostas Papadimitriou
            this.cancel.click(function() {
225 8d08f18a Kostas Papadimitriou
                self.renaming = false;
226 8d08f18a Kostas Papadimitriou
                self.update_layout();
227 8d08f18a Kostas Papadimitriou
            })
228 8d08f18a Kostas Papadimitriou
            
229 8d08f18a Kostas Papadimitriou
            // apply the rename
230 8d08f18a Kostas Papadimitriou
            // TODO: check if name is equal than the previous value
231 8d08f18a Kostas Papadimitriou
            this.save.click(function() {
232 8d08f18a Kostas Papadimitriou
                self.submit();
233 8d08f18a Kostas Papadimitriou
            })
234 8d08f18a Kostas Papadimitriou
        },
235 8d08f18a Kostas Papadimitriou
236 8d08f18a Kostas Papadimitriou
        submit: function() {
237 8d08f18a Kostas Papadimitriou
            var value = _(self.$('input').val()).trim();
238 8d08f18a Kostas Papadimitriou
            if (value == "") { return };
239 8d08f18a Kostas Papadimitriou
            this.renaming = false;
240 8d08f18a Kostas Papadimitriou
            this.vm.rename(self.$('input').val());
241 8d08f18a Kostas Papadimitriou
            this.update_layout();
242 8d08f18a Kostas Papadimitriou
        }
243 8d08f18a Kostas Papadimitriou
    });
244 8d08f18a Kostas Papadimitriou
    
245 8d08f18a Kostas Papadimitriou
    // VM connect interaction view
246 550d9733 Kostas Papadimitriou
    views.IconVMConnectView = views.View.extend({
247 8d08f18a Kostas Papadimitriou
        
248 8d08f18a Kostas Papadimitriou
        initialize: function(vm, view) {
249 8d08f18a Kostas Papadimitriou
            // parent view (single, icon, list)
250 8d08f18a Kostas Papadimitriou
            this.parent = view;
251 8d08f18a Kostas Papadimitriou
            this.vm = vm;
252 8d08f18a Kostas Papadimitriou
            this.el = view.vm(vm);
253 8d08f18a Kostas Papadimitriou
            this.set_handlers();
254 550d9733 Kostas Papadimitriou
            views.IconVMConnectView.__super__.initialize.call(this);
255 8d08f18a Kostas Papadimitriou
        },
256 8d08f18a Kostas Papadimitriou
        
257 8d08f18a Kostas Papadimitriou
        // set the appropriate handlers
258 8d08f18a Kostas Papadimitriou
        set_handlers: function() {
259 8d08f18a Kostas Papadimitriou
            // setup connect handler on vm icon interaction
260 8d08f18a Kostas Papadimitriou
            var el = this.el;
261 8d08f18a Kostas Papadimitriou
            var vm = this.vm;
262 8d08f18a Kostas Papadimitriou
263 8d08f18a Kostas Papadimitriou
            // element that triggers the connect handler
264 8d08f18a Kostas Papadimitriou
            var connect = el.find("div.connect-arrow, .logo");
265 8d08f18a Kostas Papadimitriou
            // connect status handler
266 550d9733 Kostas Papadimitriou
            var handler = _.bind(this.connect_handler, {vm:vm, el:el, view:this.parent});
267 8d08f18a Kostas Papadimitriou
            $(connect).bind({'mouseover': handler, 'mouseleave': handler, 
268 550d9733 Kostas Papadimitriou
                            'mousedown': handler, 'mouseup': handler,
269 550d9733 Kostas Papadimitriou
                            'click': handler });
270 8d08f18a Kostas Papadimitriou
            
271 8d08f18a Kostas Papadimitriou
            // setup connect arrow display handlers 
272 8d08f18a Kostas Papadimitriou
            // while hovering vm container
273 8d08f18a Kostas Papadimitriou
            el.bind("mouseover", function(){
274 8d08f18a Kostas Papadimitriou
                if (vm.is_connectable()) {
275 8d08f18a Kostas Papadimitriou
                    el.find(".connect-border").show();
276 8d08f18a Kostas Papadimitriou
                    el.find(".connect-arrow").show();
277 8d08f18a Kostas Papadimitriou
                    el.find(".logo").css({cursor:"pointer"});
278 8d08f18a Kostas Papadimitriou
                } else {
279 8d08f18a Kostas Papadimitriou
                    el.find(".connect-border").hide();
280 8d08f18a Kostas Papadimitriou
                    el.find(".connect-arrow").hide();
281 8d08f18a Kostas Papadimitriou
                    el.find(".logo").css({cursor: "default"});
282 8d08f18a Kostas Papadimitriou
                }
283 8d08f18a Kostas Papadimitriou
            }).bind("mouseleave", function(){
284 8d08f18a Kostas Papadimitriou
                el.find(".connect-border").hide();
285 8d08f18a Kostas Papadimitriou
                el.find(".connect-arrow").hide();
286 8d08f18a Kostas Papadimitriou
            });
287 8d08f18a Kostas Papadimitriou
        },
288 8d08f18a Kostas Papadimitriou
        
289 8d08f18a Kostas Papadimitriou
        // connect arrow interaction handlers
290 8d08f18a Kostas Papadimitriou
        // BEWARE, this function has different context
291 8d08f18a Kostas Papadimitriou
        // than the View object itself, see set_vm_handlers
292 8d08f18a Kostas Papadimitriou
        connect_handler: function(event) {
293 8d08f18a Kostas Papadimitriou
            // nothing to do if we cannot connect to the vm
294 8d08f18a Kostas Papadimitriou
            if (!this.vm.is_connectable()) {return}
295 8d08f18a Kostas Papadimitriou
            
296 8d08f18a Kostas Papadimitriou
            var logo = this.el.find(".logo");
297 8d08f18a Kostas Papadimitriou
            var arrow = this.el.find(".connect-arrow");
298 8d08f18a Kostas Papadimitriou
            var border = this.el.find(".connect-border");
299 8d08f18a Kostas Papadimitriou
            
300 8d08f18a Kostas Papadimitriou
            // clear icon states
301 8d08f18a Kostas Papadimitriou
            logo.removeClass('single-image-state1 single-image-state2 single-image-state3 single-image-state4');
302 8d08f18a Kostas Papadimitriou
            
303 8d08f18a Kostas Papadimitriou
            // append the appropriate state class
304 8d08f18a Kostas Papadimitriou
            switch (event.type) {
305 8d08f18a Kostas Papadimitriou
                case "mouseover":       
306 8d08f18a Kostas Papadimitriou
                    logo.addClass('single-image-state4');
307 8d08f18a Kostas Papadimitriou
                    arrow.addClass('border-hover');
308 8d08f18a Kostas Papadimitriou
                    break;
309 8d08f18a Kostas Papadimitriou
                
310 8d08f18a Kostas Papadimitriou
                case "mouseleave":
311 8d08f18a Kostas Papadimitriou
                    logo.addClass('single-image-state1');
312 8d08f18a Kostas Papadimitriou
                    arrow.removeClass('border-hover');
313 8d08f18a Kostas Papadimitriou
                    break;
314 8d08f18a Kostas Papadimitriou
315 8d08f18a Kostas Papadimitriou
                case "mouseup":
316 8d08f18a Kostas Papadimitriou
                    logo.addClass('single-image-state4');
317 06bea1ee Kostas Papadimitriou
                    this.view.connect_overlay.show(this.vm);
318 8d08f18a Kostas Papadimitriou
                    break;
319 8d08f18a Kostas Papadimitriou
320 8d08f18a Kostas Papadimitriou
                case "mousedown":
321 8d08f18a Kostas Papadimitriou
                    logo.addClass('single-image-state2');
322 8d08f18a Kostas Papadimitriou
                    break;
323 8d08f18a Kostas Papadimitriou
324 550d9733 Kostas Papadimitriou
                case "click":
325 550d9733 Kostas Papadimitriou
                    //logo.addCLass('single-image-state4');
326 1c922789 Kostas Papadimitriou
                    //this.view.connect_to_console(vm);
327 1c922789 Kostas Papadimitriou
                    this.view.connect_overlay.show(this.vm);
328 8d08f18a Kostas Papadimitriou
                    break;
329 8d08f18a Kostas Papadimitriou
330 8d08f18a Kostas Papadimitriou
                default:
331 8d08f18a Kostas Papadimitriou
                    ;
332 8d08f18a Kostas Papadimitriou
            }
333 8d08f18a Kostas Papadimitriou
        },
334 8d08f18a Kostas Papadimitriou
        
335 8d08f18a Kostas Papadimitriou
        update_layout: function() {
336 8d08f18a Kostas Papadimitriou
        }
337 8d08f18a Kostas Papadimitriou
338 8d08f18a Kostas Papadimitriou
    });
339 8d08f18a Kostas Papadimitriou
    
340 8d08f18a Kostas Papadimitriou
    // vm metadata subview for icon and single view
341 8d08f18a Kostas Papadimitriou
    views.VMTagsView = views.View.extend({
342 8d08f18a Kostas Papadimitriou
        view_id: 'vm_tags',
343 8d08f18a Kostas Papadimitriou
        // metadata container selector
344 8d08f18a Kostas Papadimitriou
        el_sel: '.vm-metadata',
345 8d08f18a Kostas Papadimitriou
        // metadata row template
346 8d08f18a Kostas Papadimitriou
        tag_tpl: '<span class="tag-item"><span class="key">{0}</span><span class="value">{1}</span></span>',
347 8d08f18a Kostas Papadimitriou
        // how many tags to show
348 8d08f18a Kostas Papadimitriou
        tag_limit: 4,
349 8d08f18a Kostas Papadimitriou
        // truncate options (because container has different size on icon/single views)
350 8d08f18a Kostas Papadimitriou
        tag_key_truncate: 7,
351 8d08f18a Kostas Papadimitriou
        tag_value_truncate: 15,
352 8d08f18a Kostas Papadimitriou
353 8d08f18a Kostas Papadimitriou
        initialize: function(vm, view, toggle, limit, tag_key_truncate, tag_value_truncate) {
354 8d08f18a Kostas Papadimitriou
            this.tag_limit = limit || this.tag_limit;
355 8d08f18a Kostas Papadimitriou
356 8d08f18a Kostas Papadimitriou
            this.tag_key_truncate = tag_key_truncate || this.tag_key_truncate;
357 8d08f18a Kostas Papadimitriou
            this.tag_value_truncate = tag_value_truncate || this.tag_value_truncate;
358 8d08f18a Kostas Papadimitriou
359 8d08f18a Kostas Papadimitriou
            // does the view toggles the metadata container (single view)
360 8d08f18a Kostas Papadimitriou
            this.toggle = toggle || false;
361 8d08f18a Kostas Papadimitriou
            // parent view
362 8d08f18a Kostas Papadimitriou
            this.parent = view;
363 8d08f18a Kostas Papadimitriou
            this.vm = vm;
364 8d08f18a Kostas Papadimitriou
            this.el = this.parent.vm(vm);
365 8d08f18a Kostas Papadimitriou
            this.view_id = this.view_id + "_" + vm.id;
366 8d08f18a Kostas Papadimitriou
367 8d08f18a Kostas Papadimitriou
            // link to raise the metadata manager overlay
368 8d08f18a Kostas Papadimitriou
            this.link = this.$('a.manage-metadata');
369 8d08f18a Kostas Papadimitriou
370 8d08f18a Kostas Papadimitriou
            views.VMTagsView.__super__.initialize.call(this);
371 8d08f18a Kostas Papadimitriou
            this.set_handlers();
372 8d08f18a Kostas Papadimitriou
            this.update_layout();
373 8d08f18a Kostas Papadimitriou
        },
374 8d08f18a Kostas Papadimitriou
        
375 8d08f18a Kostas Papadimitriou
        // set the appropriate handlers
376 8d08f18a Kostas Papadimitriou
        set_handlers: function() {
377 8d08f18a Kostas Papadimitriou
            var self = this;
378 8d08f18a Kostas Papadimitriou
            // show the metadata editor overlay
379 8d08f18a Kostas Papadimitriou
            this.link.click(_.bind(function(ev) {
380 8d08f18a Kostas Papadimitriou
                ev.preventDefault();
381 8d08f18a Kostas Papadimitriou
                this.parent.metadata_view.show(this.vm);
382 8d08f18a Kostas Papadimitriou
            }, this));
383 8d08f18a Kostas Papadimitriou
384 8d08f18a Kostas Papadimitriou
            // tags have show/hide control ? bind events for them
385 8d08f18a Kostas Papadimitriou
            var self = this;
386 8d08f18a Kostas Papadimitriou
            if (this.toggle) {
387 8d08f18a Kostas Papadimitriou
                $(this.el).find(".tags-header").click(_.bind(function(){
388 8d08f18a Kostas Papadimitriou
                    $(self.el).find(".tags-content").slideToggle(600);
389 8d08f18a Kostas Papadimitriou
                    var toggler = $(this.el).find(".tags-header .cont-toggler");
390 8d08f18a Kostas Papadimitriou
                    
391 8d08f18a Kostas Papadimitriou
                    if (toggler.hasClass("open")) {
392 8d08f18a Kostas Papadimitriou
                        toggler.removeClass("open");
393 8d08f18a Kostas Papadimitriou
                    } else {
394 8d08f18a Kostas Papadimitriou
                        toggler.addClass("open");
395 8d08f18a Kostas Papadimitriou
                    }
396 8d08f18a Kostas Papadimitriou
                }, this));
397 8d08f18a Kostas Papadimitriou
                $(self.el).find(".tags-content").hide();
398 8d08f18a Kostas Papadimitriou
            }
399 8d08f18a Kostas Papadimitriou
        },
400 8d08f18a Kostas Papadimitriou
        
401 8d08f18a Kostas Papadimitriou
        // update metadata container and data
402 8d08f18a Kostas Papadimitriou
        update_layout: function() {
403 8d08f18a Kostas Papadimitriou
404 8d08f18a Kostas Papadimitriou
            // api metadata object
405 8d08f18a Kostas Papadimitriou
            var meta =  this.vm.get_meta();
406 8d08f18a Kostas Papadimitriou
407 8d08f18a Kostas Papadimitriou
            var i = 0;
408 8d08f18a Kostas Papadimitriou
            var cont = $(this.el).find(".items");
409 8d08f18a Kostas Papadimitriou
410 8d08f18a Kostas Papadimitriou
            // clear existing items
411 8d08f18a Kostas Papadimitriou
            cont.find(".tag-item").remove();
412 8d08f18a Kostas Papadimitriou
            
413 8d08f18a Kostas Papadimitriou
            // create tag elements
414 8d08f18a Kostas Papadimitriou
            _.each(meta, function(value, key){
415 8d08f18a Kostas Papadimitriou
                // respect the limit
416 8d08f18a Kostas Papadimitriou
                if (i > this.tag_limit) {
417 8d08f18a Kostas Papadimitriou
                    return;
418 8d08f18a Kostas Papadimitriou
                }
419 8d08f18a Kostas Papadimitriou
                
420 8d08f18a Kostas Papadimitriou
                // create element
421 8d08f18a Kostas Papadimitriou
                var new_el = $(this.tag_tpl.format(util.truncate(key, this.tag_key_truncate), 
422 8d08f18a Kostas Papadimitriou
                                                 util.truncate(": " + value, this.tag_value_truncate)));
423 8d08f18a Kostas Papadimitriou
424 8d08f18a Kostas Papadimitriou
                // add title attributes, improve accesibility
425 8d08f18a Kostas Papadimitriou
                // truncated values
426 8d08f18a Kostas Papadimitriou
                new_el.find("span.key").attr("title", key);
427 8d08f18a Kostas Papadimitriou
                new_el.find("span.value").attr("title", value);
428 8d08f18a Kostas Papadimitriou
429 8d08f18a Kostas Papadimitriou
                cont.append(new_el);
430 8d08f18a Kostas Papadimitriou
            }, this);
431 8d08f18a Kostas Papadimitriou
        }
432 8d08f18a Kostas Papadimitriou
    });
433 8d08f18a Kostas Papadimitriou
    
434 8d08f18a Kostas Papadimitriou
435 8d08f18a Kostas Papadimitriou
    // stats subview for single/icon views
436 8d08f18a Kostas Papadimitriou
    views.VMStatsView = views.View.extend({
437 8d08f18a Kostas Papadimitriou
438 8d08f18a Kostas Papadimitriou
        initialize: function(vm, view, options) {
439 8d08f18a Kostas Papadimitriou
            if (!options) {options = {}};
440 8d08f18a Kostas Papadimitriou
            this.vm = vm;
441 8d08f18a Kostas Papadimitriou
            this.parent = view;
442 8d08f18a Kostas Papadimitriou
            this.sel = options.el || this.el_sel || ".lower";
443 8d08f18a Kostas Papadimitriou
            this.el = this.parent.vm(vm).find(this.sel);
444 8d08f18a Kostas Papadimitriou
            
445 8d08f18a Kostas Papadimitriou
            // elements shortcuts
446 8d08f18a Kostas Papadimitriou
            this.cpu_loading = this.el.find(".cpu-graph .stat-busy");
447 8d08f18a Kostas Papadimitriou
            this.cpu_error = this.el.find(".cpu-graph .stat-error");
448 8d08f18a Kostas Papadimitriou
            this.cpu_img = this.el.find(".cpu-graph .stat-img");
449 8d08f18a Kostas Papadimitriou
            this.net_loading = this.el.find(".network-graph .stat-busy");
450 8d08f18a Kostas Papadimitriou
            this.net_error = this.el.find(".network-graph .stat-error");
451 8d08f18a Kostas Papadimitriou
            this.net_img = this.el.find(".network-graph .stat-img");
452 96d725ac Kostas Papadimitriou
453 96d725ac Kostas Papadimitriou
            this.loading = this.el.find(".stat-busy");
454 96d725ac Kostas Papadimitriou
            this.error = this.el.find(".stat-error");
455 96d725ac Kostas Papadimitriou
            this.img = this.el.find(".stat-img");
456 8d08f18a Kostas Papadimitriou
            
457 8d08f18a Kostas Papadimitriou
            // initial state paremeters
458 8d08f18a Kostas Papadimitriou
            this.stats = this.vm.get("stats");
459 8d08f18a Kostas Papadimitriou
460 8d08f18a Kostas Papadimitriou
            // timeseries or bar images ?
461 8d08f18a Kostas Papadimitriou
            this.stats_type = options.stats_type || "bar";
462 8d08f18a Kostas Papadimitriou
463 8d08f18a Kostas Papadimitriou
            views.VMStatsView.__super__.initialize.apply(this, arguments);
464 8d08f18a Kostas Papadimitriou
            this.set_handlers();
465 8d08f18a Kostas Papadimitriou
            this.update_layout();
466 96d725ac Kostas Papadimitriou
467 96d725ac Kostas Papadimitriou
            this.net_loading.show();
468 96d725ac Kostas Papadimitriou
            this.net_error.hide();
469 96d725ac Kostas Papadimitriou
            this.cpu_loading.show();
470 96d725ac Kostas Papadimitriou
            this.cpu_error.hide();
471 96d725ac Kostas Papadimitriou
472 96d725ac Kostas Papadimitriou
            this.net_img.hide();
473 96d725ac Kostas Papadimitriou
            this.cpu_img.hide();
474 8d08f18a Kostas Papadimitriou
        },
475 8d08f18a Kostas Papadimitriou
476 8d08f18a Kostas Papadimitriou
        
477 8d08f18a Kostas Papadimitriou
        set_handlers: function() {
478 8d08f18a Kostas Papadimitriou
            // update view state when vm stats update gets triggered
479 8d08f18a Kostas Papadimitriou
            this.vm.bind("stats:update", _.bind(function(){
480 8d08f18a Kostas Papadimitriou
                // update the layout
481 8d08f18a Kostas Papadimitriou
                this.update_layout();
482 8d08f18a Kostas Papadimitriou
            }, this));
483 8d08f18a Kostas Papadimitriou
        },
484 8d08f18a Kostas Papadimitriou
        
485 8d08f18a Kostas Papadimitriou
        get_images: function (type) {
486 8d08f18a Kostas Papadimitriou
            if (type == "bar") {
487 8d08f18a Kostas Papadimitriou
                return {'cpu': this.stats.cpuBar, 'net': this.stats.netBar };
488 8d08f18a Kostas Papadimitriou
            } else {
489 8d08f18a Kostas Papadimitriou
                return {'cpu': this.stats.cpuTimeSeries, 'net': this.stats.netTimeSeries };
490 8d08f18a Kostas Papadimitriou
            }
491 8d08f18a Kostas Papadimitriou
        },
492 8d08f18a Kostas Papadimitriou
493 8d08f18a Kostas Papadimitriou
        update_layout: function() {
494 96d725ac Kostas Papadimitriou
            if (!this.vm.stats_available) {
495 96d725ac Kostas Papadimitriou
                this.loading.show();
496 96d725ac Kostas Papadimitriou
                this.img.hide();
497 96d725ac Kostas Papadimitriou
                this.error.hide();
498 96d725ac Kostas Papadimitriou
            } else {
499 96d725ac Kostas Papadimitriou
                this.loading.hide();
500 96d725ac Kostas Papadimitriou
                this.stats = this.vm.get("stats");
501 96d725ac Kostas Papadimitriou
                var images = this.get_images(this.stats_type);
502 8d08f18a Kostas Papadimitriou
503 96d725ac Kostas Papadimitriou
                if (images.cpu) {
504 96d725ac Kostas Papadimitriou
                    this.cpu_img.attr({src:images.cpu}).show();
505 96d725ac Kostas Papadimitriou
                    this.cpu_error.hide();
506 96d725ac Kostas Papadimitriou
                } else {
507 96d725ac Kostas Papadimitriou
                    this.cpu_img.hide();
508 96d725ac Kostas Papadimitriou
                    this.cpu_error.show();
509 96d725ac Kostas Papadimitriou
                }
510 8d08f18a Kostas Papadimitriou
511 96d725ac Kostas Papadimitriou
                if (images.net) {
512 96d725ac Kostas Papadimitriou
                    this.net_img.attr({src:images.net}).show();
513 96d725ac Kostas Papadimitriou
                    this.net_error.hide();
514 96d725ac Kostas Papadimitriou
                } else {
515 96d725ac Kostas Papadimitriou
                    this.net_img.hide();
516 96d725ac Kostas Papadimitriou
                    this.net_error.show();
517 96d725ac Kostas Papadimitriou
                }
518 96d725ac Kostas Papadimitriou
            }
519 96d725ac Kostas Papadimitriou
            $(window).trigger("resize");
520 8d08f18a Kostas Papadimitriou
        }
521 8d08f18a Kostas Papadimitriou
    });
522 8d08f18a Kostas Papadimitriou
523 8d08f18a Kostas Papadimitriou
    views.VMDetailsView = views.View.extend({
524 8d08f18a Kostas Papadimitriou
        view_id: "vm_details",
525 8d08f18a Kostas Papadimitriou
        el_sel: '.vm-details',
526 8d08f18a Kostas Papadimitriou
        
527 8d08f18a Kostas Papadimitriou
528 8d08f18a Kostas Papadimitriou
        selectors: {
529 8d08f18a Kostas Papadimitriou
            'cpu': '.cpu-data',
530 8d08f18a Kostas Papadimitriou
            'ram': '.ram-data',
531 8d08f18a Kostas Papadimitriou
            'disk': '.disk-data',
532 8d08f18a Kostas Papadimitriou
            'image_name': '.image-data',
533 8d08f18a Kostas Papadimitriou
            'image_size': '.image-size-data'
534 8d08f18a Kostas Papadimitriou
        },
535 8d08f18a Kostas Papadimitriou
536 8d08f18a Kostas Papadimitriou
        initialize: function(vm, view) {
537 8d08f18a Kostas Papadimitriou
            this.parent = view;
538 8d08f18a Kostas Papadimitriou
            this.vm = vm;
539 8d08f18a Kostas Papadimitriou
            this.el = $(this.parent.vm(vm)).find(this.el_sel).get(0);
540 8d08f18a Kostas Papadimitriou
            this.view_id = "vm_{0}_details".format(vm.id);
541 8d08f18a Kostas Papadimitriou
542 8d08f18a Kostas Papadimitriou
            views.VMDetailsView.__super__.initialize.call(this);
543 8d08f18a Kostas Papadimitriou
            this.update_layout();
544 8d08f18a Kostas Papadimitriou
        },
545 8d08f18a Kostas Papadimitriou
546 8d08f18a Kostas Papadimitriou
        update_layout: function() {
547 44660f58 Kostas Papadimitriou
            if (!this.visible() && this.parent.details_hidden) { return };
548 44660f58 Kostas Papadimitriou
549 8d08f18a Kostas Papadimitriou
            var image = this.vm.get_image();
550 8d08f18a Kostas Papadimitriou
            var flavor = this.vm.get_flavor();
551 8d08f18a Kostas Papadimitriou
            if (!flavor || !image) {
552 8d08f18a Kostas Papadimitriou
                return;
553 8d08f18a Kostas Papadimitriou
            }
554 8d08f18a Kostas Papadimitriou
555 1300b465 Kostas Papadimitriou
            this.sel('image_name').text(util.truncate(image.get('name'), 13)).attr("title", image.get('name'));
556 1300b465 Kostas Papadimitriou
            this.sel('image_size').text(image.get('metadata').values.size).attr('title', image.get('metadata').values.size);
557 8d08f18a Kostas Papadimitriou
558 8d08f18a Kostas Papadimitriou
            this.sel('cpu').text(flavor.get('cpu'));
559 8d08f18a Kostas Papadimitriou
            this.sel('ram').text(flavor.get('ram'));
560 8d08f18a Kostas Papadimitriou
            this.sel('disk').text(flavor.get('disk'));
561 44660f58 Kostas Papadimitriou
562 44660f58 Kostas Papadimitriou
            this.parent.tags_views[this.vm.id].update_layout();
563 44660f58 Kostas Papadimitriou
            this.parent.stats_views[this.vm.id].update_layout();
564 2c9bfad1 Kostas Papadimitriou
            
565 2c9bfad1 Kostas Papadimitriou
            if (this.parent.details_hidden) {
566 2c9bfad1 Kostas Papadimitriou
                this.vm.start_stats_update();
567 2c9bfad1 Kostas Papadimitriou
            }
568 8d08f18a Kostas Papadimitriou
        }
569 8d08f18a Kostas Papadimitriou
    });
570 8d08f18a Kostas Papadimitriou
    
571 8d08f18a Kostas Papadimitriou
    // VMs icon view
572 8d08f18a Kostas Papadimitriou
    views.IconView = views.VMListView.extend({
573 8d08f18a Kostas Papadimitriou
        
574 8d08f18a Kostas Papadimitriou
        // view id (this could be used to identify 
575 8d08f18a Kostas Papadimitriou
        // the view object from global context
576 8d08f18a Kostas Papadimitriou
        view_id: 'vm_icon',
577 44660f58 Kostas Papadimitriou
        
578 44660f58 Kostas Papadimitriou
        details_hidden: true,
579 8d08f18a Kostas Papadimitriou
580 8d08f18a Kostas Papadimitriou
        el: '#machinesview-icon',
581 23a3bb8e Kostas Papadimitriou
        id_tpl: 'icon-vm-',
582 8d08f18a Kostas Papadimitriou
583 8d08f18a Kostas Papadimitriou
        selectors: {
584 8d08f18a Kostas Papadimitriou
            'vms': '.machine-container',
585 44660f58 Kostas Papadimitriou
            'vm': '#icon-vm-',
586 8d08f18a Kostas Papadimitriou
            'view': '#machinesview-icon',
587 8d08f18a Kostas Papadimitriou
            'tpl': '#machinesview-icon.standard #machine-container-template',
588 8d08f18a Kostas Papadimitriou
            'spinner': '.large-spinner',
589 8d08f18a Kostas Papadimitriou
            'vm_spinner': '.machine-container#icon-vm-{0} .state .spinner',
590 8d08f18a Kostas Papadimitriou
            'vm_wave': '.machine-container#icon-vm-{0} .wave',
591 8d08f18a Kostas Papadimitriou
            'vm_cont_active': '#machinesview-icon.standard .running',
592 8d08f18a Kostas Papadimitriou
            'vm_cont_terminated': '#machinesview-icon.standard .terminated'
593 8d08f18a Kostas Papadimitriou
        },
594 122850c5 Kostas Papadimitriou
            
595 122850c5 Kostas Papadimitriou
        reset: function() {},
596 8d08f18a Kostas Papadimitriou
        // overload show function
597 8d08f18a Kostas Papadimitriou
        show_view: function() {
598 8d08f18a Kostas Papadimitriou
            $(this.el).show();
599 8d08f18a Kostas Papadimitriou
            this.__update_layout();
600 8d08f18a Kostas Papadimitriou
        },
601 8d08f18a Kostas Papadimitriou
602 8d08f18a Kostas Papadimitriou
        post_update_vm: function(vm) {
603 8d08f18a Kostas Papadimitriou
        },
604 8d08f18a Kostas Papadimitriou
605 8d08f18a Kostas Papadimitriou
        // identify vm model instance id based on DOM element
606 8d08f18a Kostas Papadimitriou
        vm_id_for_element: function(el) {
607 8d08f18a Kostas Papadimitriou
            return el.attr('id').replace("icon-vm-","");
608 8d08f18a Kostas Papadimitriou
        },
609 8d08f18a Kostas Papadimitriou
        
610 8d08f18a Kostas Papadimitriou
        // set generic view handlers
611 8d08f18a Kostas Papadimitriou
        set_handlers: function() {
612 8d08f18a Kostas Papadimitriou
        },  
613 8d08f18a Kostas Papadimitriou
        
614 8d08f18a Kostas Papadimitriou
        // stuff to do when a new vm has been created.
615 8d08f18a Kostas Papadimitriou
        // - create vm subviews
616 8d08f18a Kostas Papadimitriou
        post_add: function(vm) {
617 8d08f18a Kostas Papadimitriou
            // rename views index
618 8d08f18a Kostas Papadimitriou
            this.rename_views = this.rename_views || {};
619 8d08f18a Kostas Papadimitriou
            this.stats_views = this.stats_views || {};
620 8d08f18a Kostas Papadimitriou
            this.connect_views = this.connect_views || {};
621 8d08f18a Kostas Papadimitriou
            this.tags_views = this.tags_views || {};
622 8d08f18a Kostas Papadimitriou
            this.details_views = this.details_views || {};
623 8d08f18a Kostas Papadimitriou
            this.info_views = this.info_views || {};
624 6a3a5bf7 Kostas Papadimitriou
            this.action_error_views = this.action_error_views || {};
625 8d08f18a Kostas Papadimitriou
            this.action_views = this.action_views || {};
626 8d08f18a Kostas Papadimitriou
627 8d08f18a Kostas Papadimitriou
            this.action_views[vm.id] = new views.VMActionsView(vm, this, this.vm(vm), this.hide_actions);
628 8d08f18a Kostas Papadimitriou
            this.rename_views[vm.id] = new views.IconRenameView(vm, this);
629 8d08f18a Kostas Papadimitriou
            this.stats_views[vm.id] = new views.VMStatsView(vm, this, {el:'.vm-stats'});
630 550d9733 Kostas Papadimitriou
            this.connect_views[vm.id] = new views.IconVMConnectView(vm, this);
631 8d08f18a Kostas Papadimitriou
            this.tags_views[vm.id] = new views.VMTagsView(vm, this);
632 8d08f18a Kostas Papadimitriou
            this.details_views[vm.id] = new views.VMDetailsView(vm, this);
633 8d08f18a Kostas Papadimitriou
            this.info_views[vm.id] = new views.IconInfoView(vm, this);
634 6a3a5bf7 Kostas Papadimitriou
            this.action_error_views[vm.id] = new views.VMActionErrorView(vm, this);
635 8d08f18a Kostas Papadimitriou
        },
636 8d08f18a Kostas Papadimitriou
        
637 8d08f18a Kostas Papadimitriou
        // vm specific event handlers
638 8d08f18a Kostas Papadimitriou
        set_vm_handlers: function(vm) {
639 8d08f18a Kostas Papadimitriou
            var el = this.vm(vm);
640 8d08f18a Kostas Papadimitriou
641 8d08f18a Kostas Papadimitriou
        },
642 8d08f18a Kostas Papadimitriou
643 8d08f18a Kostas Papadimitriou
        check_terminated_is_empty: function() {
644 8d08f18a Kostas Papadimitriou
            // hide/show terminated container
645 8d08f18a Kostas Papadimitriou
            if (this.$(".terminated .machine-container").length == 0) {
646 8d08f18a Kostas Papadimitriou
                this.$(".terminated").hide()
647 8d08f18a Kostas Papadimitriou
            } else {
648 8d08f18a Kostas Papadimitriou
                this.$(".terminated").show()
649 8d08f18a Kostas Papadimitriou
            }
650 8d08f18a Kostas Papadimitriou
651 8d08f18a Kostas Papadimitriou
            $(window).trigger("resize");
652 8d08f18a Kostas Papadimitriou
        },
653 8d08f18a Kostas Papadimitriou
        
654 8d08f18a Kostas Papadimitriou
        // generic stuff to do on each view update
655 8d08f18a Kostas Papadimitriou
        // called once after each vm has been updated
656 8d08f18a Kostas Papadimitriou
        update_layout: function() {
657 8d08f18a Kostas Papadimitriou
            // TODO: why do we do this ??
658 8d08f18a Kostas Papadimitriou
            if (storage.vms.models.length > 0) {
659 8d08f18a Kostas Papadimitriou
                this.$(".running").removeClass("disabled");
660 8d08f18a Kostas Papadimitriou
            } else {
661 8d08f18a Kostas Papadimitriou
                this.$(".running").addClass("disabled");
662 8d08f18a Kostas Papadimitriou
            }
663 8d08f18a Kostas Papadimitriou
            
664 8d08f18a Kostas Papadimitriou
            this.check_terminated_is_empty();
665 8d08f18a Kostas Papadimitriou
    
666 8d08f18a Kostas Papadimitriou
            // FIXME: code from old js api
667 8d08f18a Kostas Papadimitriou
            this.$("div.separator").show();
668 8d08f18a Kostas Papadimitriou
            this.$("div.machine-container:last-child").find("div.separator").hide();
669 8d08f18a Kostas Papadimitriou
            fix_v6_addresses();
670 8d08f18a Kostas Papadimitriou
        },
671 8d08f18a Kostas Papadimitriou
672 8d08f18a Kostas Papadimitriou
        // update vm details
673 8d08f18a Kostas Papadimitriou
        update_details: function(vm) {
674 8d08f18a Kostas Papadimitriou
            var el = this.vm(vm);
675 8d08f18a Kostas Papadimitriou
            // truncate name
676 8d08f18a Kostas Papadimitriou
            el.find("span.name").text(util.truncate(vm.get("name"), 40));
677 8d08f18a Kostas Papadimitriou
            // set ips
678 29074c9d Kostas Papadimitriou
            el.find("span.ipv4-text").text(vm.get_addresses().ip4 || "not set");
679 8d08f18a Kostas Papadimitriou
            // TODO: fix ipv6 truncates and tooltip handler
680 29074c9d Kostas Papadimitriou
            el.find("span.ipv6-text").text(vm.get_addresses().ip6 || "not set");
681 8d08f18a Kostas Papadimitriou
            // set the state (i18n ??)
682 44660f58 Kostas Papadimitriou
            el.find("div.status").text(STATE_TEXTS[vm.state()]);
683 8d08f18a Kostas Papadimitriou
            // set state class
684 44660f58 Kostas Papadimitriou
            el.find("div.state").removeClass().addClass(views.IconView.STATE_CLASSES[vm.state()].join(" "));
685 8d08f18a Kostas Papadimitriou
            // os icon
686 44660f58 Kostas Papadimitriou
            el.find("div.logo").css({'background-image': "url(" + this.get_vm_icon_path(vm, "medium") + ")"});
687 8d08f18a Kostas Papadimitriou
            
688 8d08f18a Kostas Papadimitriou
            el.removeClass("connectable");
689 8d08f18a Kostas Papadimitriou
            if (vm.is_connectable()) {
690 8d08f18a Kostas Papadimitriou
                el.addClass("connectable");
691 8d08f18a Kostas Papadimitriou
            }
692 8d08f18a Kostas Papadimitriou
            
693 44660f58 Kostas Papadimitriou
            var status = vm.get("status");
694 44660f58 Kostas Papadimitriou
            var state = vm.get("state");
695 44660f58 Kostas Papadimitriou
696 44660f58 Kostas Papadimitriou
            if (status == 'BUILD') {
697 8d08f18a Kostas Papadimitriou
                // update bulding progress
698 44660f58 Kostas Papadimitriou
                el.find("div.machine-ips").hide();
699 44660f58 Kostas Papadimitriou
                el.find("div.build-progress").show().text(vm.get('progress_message'));
700 8d08f18a Kostas Papadimitriou
            } else {
701 8d08f18a Kostas Papadimitriou
                // hide building progress
702 44660f58 Kostas Papadimitriou
                el.find("div.machine-ips").show()
703 44660f58 Kostas Papadimitriou
                el.find("div.build-progress").hide();
704 8d08f18a Kostas Papadimitriou
            }
705 8d08f18a Kostas Papadimitriou
706 44660f58 Kostas Papadimitriou
            if (state == "DESTROY") {
707 44660f58 Kostas Papadimitriou
                el.find("div.machine-ips").hide();
708 44660f58 Kostas Papadimitriou
                el.find("div.build-progress").show().text("Terminating...");
709 8d08f18a Kostas Papadimitriou
            }
710 8d08f18a Kostas Papadimitriou
711 8d08f18a Kostas Papadimitriou
            icon_state = vm.is_active() ? "on" : "off";
712 8d08f18a Kostas Papadimitriou
            set_machine_os_image(el, "icon", icon_state, this.get_vm_icon_os(vm));
713 8d08f18a Kostas Papadimitriou
            
714 8d08f18a Kostas Papadimitriou
            // update subviews
715 8d08f18a Kostas Papadimitriou
            this.rename_views[vm.id].update_layout();
716 8d08f18a Kostas Papadimitriou
            this.connect_views[vm.id].update_layout();
717 8d08f18a Kostas Papadimitriou
            this.details_views[vm.id].update_layout();
718 8d08f18a Kostas Papadimitriou
        },
719 8d08f18a Kostas Papadimitriou
720 8d08f18a Kostas Papadimitriou
        post_remove_vm: function(vm) {
721 8d08f18a Kostas Papadimitriou
            this.check_terminated_is_empty();
722 8d08f18a Kostas Papadimitriou
            $(window).trigger("resize");
723 8d08f18a Kostas Papadimitriou
        },
724 8d08f18a Kostas Papadimitriou
            
725 8d08f18a Kostas Papadimitriou
        get_vm_icon_os: function(vm) {
726 8d08f18a Kostas Papadimitriou
            var os = vm.get_os();
727 8d08f18a Kostas Papadimitriou
            var icons = window.os_icons || views.IconView.VM_OS_ICONS;
728 8d08f18a Kostas Papadimitriou
729 8d08f18a Kostas Papadimitriou
            if (icons.indexOf(os) == -1) {
730 8d08f18a Kostas Papadimitriou
                os = "unknown";
731 8d08f18a Kostas Papadimitriou
            }
732 8d08f18a Kostas Papadimitriou
733 8d08f18a Kostas Papadimitriou
            return os;
734 8d08f18a Kostas Papadimitriou
        },
735 8d08f18a Kostas Papadimitriou
736 8d08f18a Kostas Papadimitriou
        // TODO: move to views.utils (the method and the VM_OS_ICON vars)
737 8d08f18a Kostas Papadimitriou
        get_vm_icon_path: function(vm, icon_type) {
738 8d08f18a Kostas Papadimitriou
            var os = vm.get_os();
739 8d08f18a Kostas Papadimitriou
            var icons = window.os_icons || views.IconView.VM_OS_ICONS;
740 8d08f18a Kostas Papadimitriou
741 8d08f18a Kostas Papadimitriou
            if (icons.indexOf(os) == -1) {
742 8d08f18a Kostas Papadimitriou
                os = "unknown";
743 8d08f18a Kostas Papadimitriou
            }
744 8d08f18a Kostas Papadimitriou
745 8d08f18a Kostas Papadimitriou
            return views.IconView.VM_OS_ICON_TPLS[icon_type].format(os);
746 8d08f18a Kostas Papadimitriou
        }
747 8d08f18a Kostas Papadimitriou
    })
748 8d08f18a Kostas Papadimitriou
749 8d08f18a Kostas Papadimitriou
    views.IconView.VM_OS_ICON_TPLS = {
750 8d08f18a Kostas Papadimitriou
        "medium": "/static/icons/machines/medium/{0}-sprite.png"
751 8d08f18a Kostas Papadimitriou
    }
752 8d08f18a Kostas Papadimitriou
753 8d08f18a Kostas Papadimitriou
    views.IconView.VM_OS_ICONS = window.os_icons || [];
754 8d08f18a Kostas Papadimitriou
755 8d08f18a Kostas Papadimitriou
    views.IconView.STATE_CLASSES = {
756 8d08f18a Kostas Papadimitriou
        'UNKNOWN':          ['state', 'error-state'],
757 8d08f18a Kostas Papadimitriou
        'BUILD':            ['state', 'build-state'],
758 8d08f18a Kostas Papadimitriou
        'REBOOT':           ['state', 'rebooting-state'],
759 8d08f18a Kostas Papadimitriou
        'STOPPED':          ['state', 'terminated-state'],
760 8d08f18a Kostas Papadimitriou
        'ACTIVE':           ['state', 'running-state'],
761 8d08f18a Kostas Papadimitriou
        'ERROR':            ['state', 'error-state'],
762 643de8c0 Kostas Papadimitriou
        'DELETED':           ['state', 'destroying-state'],
763 8d08f18a Kostas Papadimitriou
        'DESTROY':          ['state', 'destroying-state'],
764 8d08f18a Kostas Papadimitriou
        'BUILD_INIT':       ['state', 'build-state'], 
765 8d08f18a Kostas Papadimitriou
        'BUILD_COPY':       ['state', 'build-state'],
766 8d08f18a Kostas Papadimitriou
        'BUILD_FINAL':      ['state', 'build-state'],
767 8d08f18a Kostas Papadimitriou
        'SHUTDOWN':         ['state', 'shutting-state'],
768 8d08f18a Kostas Papadimitriou
        'START':            ['state', 'starting-state'],
769 8d08f18a Kostas Papadimitriou
        'CONNECT':          ['state', 'connecting-state'],
770 8d08f18a Kostas Papadimitriou
        'DISCONNECT':       ['state', 'disconnecting-state']
771 8d08f18a Kostas Papadimitriou
    };
772 8d08f18a Kostas Papadimitriou
773 8d08f18a Kostas Papadimitriou
})(this);