Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / ui / web / ui_icon_view.js @ 807a0305

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